From 488094651511d2dc672148fdd69df9e0a6ef7be0 Mon Sep 17 00:00:00 2001 From: maddalax Date: Thu, 10 Oct 2024 17:00:20 -0500 Subject: [PATCH] hn clone --- examples/hackernews/.dockerignore | 11 ++ examples/hackernews/.gitignore | 6 + examples/hackernews/Dockerfile | 38 +++++ examples/hackernews/Taskfile.yml | 20 +++ examples/hackernews/assets.go | 13 ++ examples/hackernews/assets/css/input.css | 15 ++ .../assets/public/apple-touch-icon.png | Bin 0 -> 3429 bytes examples/hackernews/assets/public/favicon.ico | Bin 0 -> 5238 bytes .../assets/public/icon-192-maskable.png | Bin 0 -> 3732 bytes .../hackernews/assets/public/icon-192.png | Bin 0 -> 7032 bytes .../assets/public/icon-512-maskable.png | Bin 0 -> 14025 bytes .../hackernews/assets/public/icon-512.png | Bin 0 -> 23888 bytes examples/hackernews/assets_prod.go | 16 ++ examples/hackernews/components/badge.go | 14 ++ examples/hackernews/go.mod | 10 ++ examples/hackernews/go.sum | 18 +++ .../hackernews/internal/batch/parallel.go | 30 ++++ examples/hackernews/internal/embedded/os.go | 17 +++ .../hackernews/internal/httpjson/client.go | 115 +++++++++++++++ examples/hackernews/internal/news/news.go | 137 ++++++++++++++++++ examples/hackernews/internal/random.go | 13 ++ .../hackernews/internal/timeformat/time.go | 39 +++++ examples/hackernews/main.go | 30 ++++ examples/hackernews/pages/index.go | 21 +++ examples/hackernews/pages/root.go | 32 ++++ examples/hackernews/partials/comments.go | 84 +++++++++++ examples/hackernews/partials/sidebar.go | 126 ++++++++++++++++ examples/hackernews/partials/story.go | 79 ++++++++++ examples/hackernews/tailwind.config.js | 7 + framework/assets/dist/htmgo.js | 4 +- framework/assets/js/htmgo.ts | 16 ++ .../js/htmxextensions/trigger-children.ts | 18 ++- templates/starter/pages/root.go | 2 +- 33 files changed, 920 insertions(+), 11 deletions(-) create mode 100644 examples/hackernews/.dockerignore create mode 100644 examples/hackernews/.gitignore create mode 100644 examples/hackernews/Dockerfile create mode 100644 examples/hackernews/Taskfile.yml create mode 100644 examples/hackernews/assets.go create mode 100644 examples/hackernews/assets/css/input.css create mode 100644 examples/hackernews/assets/public/apple-touch-icon.png create mode 100644 examples/hackernews/assets/public/favicon.ico create mode 100644 examples/hackernews/assets/public/icon-192-maskable.png create mode 100644 examples/hackernews/assets/public/icon-192.png create mode 100644 examples/hackernews/assets/public/icon-512-maskable.png create mode 100644 examples/hackernews/assets/public/icon-512.png create mode 100644 examples/hackernews/assets_prod.go create mode 100644 examples/hackernews/components/badge.go create mode 100644 examples/hackernews/go.mod create mode 100644 examples/hackernews/go.sum create mode 100644 examples/hackernews/internal/batch/parallel.go create mode 100644 examples/hackernews/internal/embedded/os.go create mode 100644 examples/hackernews/internal/httpjson/client.go create mode 100644 examples/hackernews/internal/news/news.go create mode 100644 examples/hackernews/internal/random.go create mode 100644 examples/hackernews/internal/timeformat/time.go create mode 100644 examples/hackernews/main.go create mode 100644 examples/hackernews/pages/index.go create mode 100644 examples/hackernews/pages/root.go create mode 100644 examples/hackernews/partials/comments.go create mode 100644 examples/hackernews/partials/sidebar.go create mode 100644 examples/hackernews/partials/story.go create mode 100644 examples/hackernews/tailwind.config.js diff --git a/examples/hackernews/.dockerignore b/examples/hackernews/.dockerignore new file mode 100644 index 0000000..fb47686 --- /dev/null +++ b/examples/hackernews/.dockerignore @@ -0,0 +1,11 @@ +# Project exclude paths +/tmp/ +node_modules/ +dist/ +js/dist +js/node_modules +go.work +go.work.sum +.idea +!framework/assets/dist +__htmgo \ No newline at end of file diff --git a/examples/hackernews/.gitignore b/examples/hackernews/.gitignore new file mode 100644 index 0000000..3d6a979 --- /dev/null +++ b/examples/hackernews/.gitignore @@ -0,0 +1,6 @@ +/assets/dist +tmp +node_modules +.idea +__htmgo +dist \ No newline at end of file diff --git a/examples/hackernews/Dockerfile b/examples/hackernews/Dockerfile new file mode 100644 index 0000000..37c299d --- /dev/null +++ b/examples/hackernews/Dockerfile @@ -0,0 +1,38 @@ +# Stage 1: Build the Go binary +FROM golang:1.23-alpine AS builder + +RUN apk update +RUN apk add git +RUN apk add curl + +# Set the working directory inside the container +WORKDIR /app + +# Copy go.mod and go.sum files +COPY go.mod go.sum ./ + +# Download and cache the Go modules +RUN go mod download + +# Copy the source code into the container +COPY . . + +# Build the Go binary for Linux +RUN GOPRIVATE=github.com/maddalax GOPROXY=direct go run github.com/maddalax/htmgo/cli/htmgo@latest build + + +# Stage 2: Create the smallest possible image +FROM gcr.io/distroless/base-debian11 + +# Set the working directory inside the container +WORKDIR /app + +# Copy the Go binary from the builder stage +COPY --from=builder /app/dist . + +# Expose the necessary port (replace with your server port) +EXPOSE 3000 + + +# Command to run the binary +CMD ["./hackernews"] diff --git a/examples/hackernews/Taskfile.yml b/examples/hackernews/Taskfile.yml new file mode 100644 index 0000000..28f1902 --- /dev/null +++ b/examples/hackernews/Taskfile.yml @@ -0,0 +1,20 @@ +version: '3' + +tasks: + run: + cmds: + - htmgo run + silent: true + + build: + cmds: + - htmgo build + + docker: + cmds: + - docker build . + + watch: + cmds: + - htmgo watch + silent: true diff --git a/examples/hackernews/assets.go b/examples/hackernews/assets.go new file mode 100644 index 0000000..8104b98 --- /dev/null +++ b/examples/hackernews/assets.go @@ -0,0 +1,13 @@ +//go:build !prod +// +build !prod + +package main + +import ( + "hackernews/internal/embedded" + "io/fs" +) + +func GetStaticAssets() fs.FS { + return embedded.NewOsFs() +} diff --git a/examples/hackernews/assets/css/input.css b/examples/hackernews/assets/css/input.css new file mode 100644 index 0000000..404b710 --- /dev/null +++ b/examples/hackernews/assets/css/input.css @@ -0,0 +1,15 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; + +@layer utilities { + /* Chrome, Safari and Opera */ + .no-scrollbar::-webkit-scrollbar { + display: none; + } + + .no-scrollbar { + -ms-overflow-style: none; /* IE and Edge */ + scrollbar-width: none; /* Firefox */ + } +} diff --git a/examples/hackernews/assets/public/apple-touch-icon.png b/examples/hackernews/assets/public/apple-touch-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..d10e9fe56b9576167656a1270d4ab42bec72d659 GIT binary patch literal 3429 zcmeHK*H_cc7X5`#1VIp#UPMI!siJggL5e_t5ITt9M==NyK}w{GfE3|Fnv_VSNEhiK zB%*+H2)!E=A)$m8di~1uHi7E0F!3@00KlTJrwyZW z^&gy}r^Y+I^f##l@`mYZ0U!JL7paA|vz5M!kr5zH&CdX!s7CDY>ns9#*8O`|jMO~iuFIcM`+$DqYyYbERdYs=} zG@Cn2HOG@*am(sCU8YU4lC`n<5GSkiFgm4DCN(<0;*+7cW;6U2dl#+g)$>=`9yCDe z*SxKFdIVPOFVxtohIP8BWJYOV{o+!MCNMy1CZ{@Ue;$H_nO?k1t=WRfOd7$4& z#`VAe$hoRtbV&OP0A7m5vC5j-@BdEyX(8AxEm+*6uhX!=m@5JE9(-Wtf)W?GE@EnD z$6r%hWBQQdTwMAwAFCTbv>M)?rJNrg>6o1SRxkfb)IdijJL?yJqGdL20SuyT9-2+b@-uyScj;)b8vom%KhA>}tfmHQT^{z4g$k z2pn&Fp&(9x+>CYZ54OR2-7trb)RS|t$JaK(Gt}O{yr;vQ+xqe)<}fW@BBw#_+R(|v z0+K^!*CS$B%kV^ibJ|8*%i>R^Y}U`}$iQR5@*vQ z&^j@LY^&2C66f)(3j|1mHIHz6lO^nOP|&E)2FX&eY>%iSEEMIpl9_bZSSm|bb%n7Y z`3Fop{OsXCj!1XWY^2&x{;rOoAV!~5MLG48W`0*g-snQ3Y=0HBs)Htq z`-qlwr@c3Crk9t#;P#gdFmwC&WWGft>;-v^j)`TV!us?B~V9 zXUwLcQN)SU&E3hRH>bG!E_d(R9j+Eg<7kzWf%2Iq`+&L!s+1Q|OLwnjqqE1jS4CCa zDuhEVm_3cKebz9w=d#bHJz^x;%}0l$r?hQT$c}onn2TbhIJ|Qz;+(s0iPX#YkxqW4 zx50SRb7g(glmqe!KSLA;J0K8`5?(3sX5jC)z>ug`zP-gXrEEVfUTibjn(H8nqB_hS z?6+Fzpp_1?rTcaDHa&jwO+;OIA9qFp*<_1qL?~2*$IM5s(br~yM)u=SYaaj*n13K2 zy9F+u?`q^SFLP{X0!X6X`0>18`^f0Ic?(LBv5Gb`{zotCF^Tg(18 zX6nHn)!(yu3E~mN(rmVb5V}SI^LfSKN)TR9+tzhl_EQM1BeK}ft7F%;|3>C7&Hg4N zyT)@iu%K@tr<%bjiI0*@8QuVYcEC}peid!c_TMh9MP>+u?p$(;f@TdsTN+6f`?p;7 z@Rqq*+)dz$Y^bFmnRaeUF8pzdKzL z^7@`_FoIU&IX9VuDEi?bT>0r8|%N1B$=Y?cL?Qn%X3kE|=ul z(d+9`@j2cMT%Pmrvf0wel$qSnFkzQnV!PaZPS%A@;dHUBSRthC?eb1zi|d3>Vj$W~ z=n0H+)bw}>on=^7RtC-ZG{hxdgsVtg;>*a=CWpmH9Km>IWEV!8#TR$e2zHR#tA4FK zHoPut3hNNU_OI>sBPC1g{CPIlElWvMz#%+g>9v3q6LtVQWpQQuomO9V0VSp(X88vb zzRWukPDA2mywGwKi3??Pn`BKw zjz+`+UDUiQV6JIz>*(-;k)qbBK)1qb_vSHW0@XD>aI47Y!tGn~rd3vSzj;{ivlyPQ zOWZVA+xH!WZ&>;=Tkr09e#t&MNpYu)-c%V{0#!$yfBwWb9h{$emRbJGsSKnvWj$#& zQFJZ#u;NB>@fEMax61V2@q!WI1*6|*P*vBf#4g6}8YE!-E?v$jM`2kBicIAq$ziD$?)9^k02kLY4T}&>8nja#e}QpOd3` z*4(QfhVVZ+UeJu#Dr=|`wYLM7`fPlN%B+dTSy+uPsQG7=`=$Kjet@=LmhZUQwqkEeVZBB1ZepQx>oC%NWF zdmo=0@^$&na^HaJYV3|C9v`Sr*q-{Y?$I=W&1L4|UO1qU$)n&eX$oiEt|!5$e%Bc{#~f{N391h{sB|aM6Cb- literal 0 HcmV?d00001 diff --git a/examples/hackernews/assets/public/favicon.ico b/examples/hackernews/assets/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..040cccf58ea179321b86f78b5f0a0817f1ec773a GIT binary patch literal 5238 zcmc&%TTc^F5MGTxz&GO?PsX3&laKxa5?VDrsPP_Skg8Epp+!_s6a+*B?}`GJic-7) zB8Vu0f{KVn1m!020|D?VOqU=FFKnXI9e|XbZK)i!~ZGZTTWi zTSj9-g8rZQtBALpc=W0fo8j(S%O?&OATMu&mKe zdP>qtnj0j7LmFfqw!yZd)Rh>62A?G_s?o4sOTFvGNAbC*3$0Is$VuPwznqMf;^%m` zBKz=0LHWmb;c{Ub?%pm!S4T6d$_kX69w!-R#Sd0pLiv>(lwHh1XL}Qx>Z;K4v6xbM9Jy;a*q_>sNeIh9UtF!AnVWu+_|1-rZ4yRAAQDaYk4Tv{GzEA4G+rkyzxG& z%g-x09iR2t2gPUnrpJEN_)C$Oxf8h=J5Y0{1eMovQJA$`$r=3T7$`o=T`lsd|He6! zcaf7Oe5d*%pJUaRwLtpO?`2~<^a>m*ML<#bnL!)#Fjqw{qI90=JUF4i7m%~ zaW5kKJ?njzwjGY{M41bEt~u13D?gK}8DHP`xybWq{SPrV*XV3>?qu2~_-~v=T}>I? zB}F*x+vdm@!`b3U-po(Fmk0WK0Zb7^o^UvX(zB_yHr2T{i!&y3|2hQy7g2RHAEkMz zXsEr7$%%3Ff9b)A)b(~g=x3^RPMxOpH9o4ulZO?`7T>#kf6Kn5_{@Is|IMqXs1M%4 zub*QW9_$zQv{}p)Z~8n}w$+>-lXKY~j0}Gh_T=3A&Q?rKg;8)K8SG#GmyZjI)T z=H75@bja!Y8J}ZdiyxYtL~r+Ne0bX?*30$9`7i4KE7w27T;Jyp8vCXM| z&C<46{l$i55@WqroXOr9-*#}0H`fO&eVj?(W=`~}HZt>pD{RUhIbQg(KPUXS^&i{= z#k2p4;Pdx}Nq){NZ@T}CcmK^Xi0AhQQkrtwK@C# F{tLVTip2l` literal 0 HcmV?d00001 diff --git a/examples/hackernews/assets/public/icon-192-maskable.png b/examples/hackernews/assets/public/icon-192-maskable.png new file mode 100644 index 0000000000000000000000000000000000000000..d4d6efb61bf6c212e3c466edca6256d9a3000e86 GIT binary patch literal 3732 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 U`U+xTzkh@n(+eiG#@FKh0jyU=3;+NC literal 0 HcmV?d00001 diff --git a/examples/hackernews/assets/public/icon-192.png b/examples/hackernews/assets/public/icon-192.png new file mode 100644 index 0000000000000000000000000000000000000000..f5334355c00b1ff31781f93b97b0efaa0e049d60 GIT binary patch literal 7032 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 x%cimilvfPSdV(Q_^}+tza4QzW{-_?Ogx> literal 0 HcmV?d00001 diff --git a/examples/hackernews/assets/public/icon-512-maskable.png b/examples/hackernews/assets/public/icon-512-maskable.png new file mode 100644 index 0000000000000000000000000000000000000000..db61f3dbc056f541e9b215d4be7ec22a8f436e38 GIT binary patch literal 14025 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 KG(KIojr>11q;Vnu literal 0 HcmV?d00001 diff --git a/examples/hackernews/assets/public/icon-512.png b/examples/hackernews/assets/public/icon-512.png new file mode 100644 index 0000000000000000000000000000000000000000..ba0665d887cf19d3a45122767f0d6609ccb1afbb GIT binary patch literal 23888 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 B&S(Gt literal 0 HcmV?d00001 diff --git a/examples/hackernews/assets_prod.go b/examples/hackernews/assets_prod.go new file mode 100644 index 0000000..f0598e1 --- /dev/null +++ b/examples/hackernews/assets_prod.go @@ -0,0 +1,16 @@ +//go:build prod +// +build prod + +package main + +import ( + "embed" + "io/fs" +) + +//go:embed assets/dist/* +var staticAssets embed.FS + +func GetStaticAssets() fs.FS { + return staticAssets +} diff --git a/examples/hackernews/components/badge.go b/examples/hackernews/components/badge.go new file mode 100644 index 0000000..dd97f60 --- /dev/null +++ b/examples/hackernews/components/badge.go @@ -0,0 +1,14 @@ +package components + +import "github.com/maddalax/htmgo/framework/h" + +func Badge(text string, active bool, children ...h.Ren) *h.Element { + return h.Button( + h.Text(text), + h.ClassX("font-semibold px-3 py-1 rounded-full cursor-pointer h-[32px]", h.ClassMap{ + "bg-rose-500 text-white": active, + "bg-neutral-300": !active, + }), + h.Children(children...), + ) +} diff --git a/examples/hackernews/go.mod b/examples/hackernews/go.mod new file mode 100644 index 0000000..ae1640a --- /dev/null +++ b/examples/hackernews/go.mod @@ -0,0 +1,10 @@ +module hackernews + +go 1.23.0 + +require ( + github.com/go-chi/chi/v5 v5.1.0 + github.com/maddalax/htmgo/framework v0.0.0-20241009153712-95f9b43395b7 +) + +require github.com/google/uuid v1.6.0 // indirect diff --git a/examples/hackernews/go.sum b/examples/hackernews/go.sum new file mode 100644 index 0000000..84d81a5 --- /dev/null +++ b/examples/hackernews/go.sum @@ -0,0 +1,18 @@ +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= +github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/maddalax/htmgo/framework v0.0.0-20241009153712-95f9b43395b7 h1:KzbU4UIVDc+ppklnwEEAAGLXpED16hUoGbbx1qhN7eo= +github.com/maddalax/htmgo/framework v0.0.0-20241009153712-95f9b43395b7/go.mod h1:HYKI49Pb6oyY2opSJdTt145B1vWgfWIDohvlolynv80= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/puzpuzpuz/xsync/v3 v3.4.0 h1:DuVBAdXuGFHv8adVXjWWZ63pJq+NRXOWVXlKDBZ+mJ4= +github.com/puzpuzpuz/xsync/v3 v3.4.0/go.mod h1:VjzYrABPabuM4KyBh1Ftq6u8nhwY5tBPKP9jpmh0nnA= +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= +golang.org/x/net v0.29.0 h1:5ORfpBpCs4HzDYoodCDBbwHzdR5UrLBZ3sOnUJmFoHo= +golang.org/x/net v0.29.0/go.mod h1:gLkgy8jTGERgjzMic6DS9+SP0ajcu6Xu3Orq/SpETg0= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/examples/hackernews/internal/batch/parallel.go b/examples/hackernews/internal/batch/parallel.go new file mode 100644 index 0000000..6f03e5f --- /dev/null +++ b/examples/hackernews/internal/batch/parallel.go @@ -0,0 +1,30 @@ +package batch + +import ( + "sync" +) + +func ParallelProcess[T any, Z any](items []T, concurrency int, cb func(item T) Z) []Z { + if len(items) == 0 { + return []Z{} + } + if len(items) == 1 { + return []Z{cb(items[0])} + } + results := make([]Z, len(items)) + wg := sync.WaitGroup{} + sem := make(chan struct{}, concurrency) + for i, item := range items { + wg.Add(1) + sem <- struct{}{} + go func(item T) { + defer func() { + wg.Done() + <-sem + }() + results[i] = cb(item) + }(item) + } + wg.Wait() + return results +} diff --git a/examples/hackernews/internal/embedded/os.go b/examples/hackernews/internal/embedded/os.go new file mode 100644 index 0000000..ddfd55f --- /dev/null +++ b/examples/hackernews/internal/embedded/os.go @@ -0,0 +1,17 @@ +package embedded + +import ( + "io/fs" + "os" +) + +type OsFs struct { +} + +func (receiver OsFs) Open(name string) (fs.File, error) { + return os.Open(name) +} + +func NewOsFs() OsFs { + return OsFs{} +} diff --git a/examples/hackernews/internal/httpjson/client.go b/examples/hackernews/internal/httpjson/client.go new file mode 100644 index 0000000..4c1e5ce --- /dev/null +++ b/examples/hackernews/internal/httpjson/client.go @@ -0,0 +1,115 @@ +package httpjson + +import ( + "bytes" + "encoding/json" + "fmt" + "io" + "net/http" + "sync" + "time" +) + +var ( + client *http.Client + once sync.Once // Consider allowing configuration parameters for the singleton +) + +func getClient() *http.Client { + once.Do(func() { + client = &http.Client{ + Timeout: 10 * time.Second, + } + }) + return client +} + +func Get[T any](url string) (*T, error) { + client := getClient() + resp, err := client.Get(url) + if err != nil { + return nil, err + } + defer resp.Body.Close() + + if resp.StatusCode != http.StatusOK { + return nil, fmt.Errorf("unexpected status code: %d", resp.StatusCode) + } + + var result T + body, err := io.ReadAll(resp.Body) + if err != nil { + return nil, err + } + + if err := json.Unmarshal(body, &result); err != nil { + return nil, err + } + + return &result, nil +} + +func Post[T any](url string, data T) (*http.Response, error) { + client := getClient() + body, err := json.Marshal(data) + if err != nil { + return nil, err + } + + resp, err := client.Post(url, "application/json", bytes.NewBuffer(body)) + if err != nil { + return nil, err + } + + if resp.StatusCode != http.StatusCreated && resp.StatusCode != http.StatusOK { + return resp, fmt.Errorf("unexpected status code: %d", resp.StatusCode) + } + + return resp, nil +} + +func Patch[T any](url string, data T) error { + client := getClient() + body, err := json.Marshal(data) + if err != nil { + return err + } + + req, err := http.NewRequest(http.MethodPatch, url, bytes.NewBuffer(body)) + if err != nil { + return err + } + req.Header.Set("Content-Type", "application/json") + + resp, err := client.Do(req) + if err != nil { + return err + } + defer resp.Body.Close() + + if resp.StatusCode != http.StatusOK { + return fmt.Errorf("unexpected status code: %d", resp.StatusCode) + } + + return nil +} + +func Delete(url string) error { + client := getClient() + req, err := http.NewRequest(http.MethodDelete, url, nil) + if err != nil { + return err + } + + resp, err := client.Do(req) + if err != nil { + return err + } + defer resp.Body.Close() + + if resp.StatusCode != http.StatusOK { + return fmt.Errorf("unexpected status code: %d", resp.StatusCode) + } + + return nil +} diff --git a/examples/hackernews/internal/news/news.go b/examples/hackernews/internal/news/news.go new file mode 100644 index 0000000..a972e68 --- /dev/null +++ b/examples/hackernews/internal/news/news.go @@ -0,0 +1,137 @@ +package news + +import ( + "fmt" + "github.com/maddalax/htmgo/framework/h" + "hackernews/internal/batch" + "hackernews/internal/httpjson" + "hackernews/internal/timeformat" + "log/slog" + "strconv" + "time" +) + +const baseUrl = "https://hacker-news.firebaseio.com/v0/" + +func url(path string, qs *h.Qs) string { + return baseUrl + path + ".json?" + qs.ToString() +} + +type Category struct { + Name string + Path string +} + +var Categories = []Category{ + {"Top Stories", "topstories"}, + {"Best Stories", "beststories"}, + {"New Stories", "newstories"}, +} + +type Comment struct { + By string `json:"by"` + Text string `json:"text"` + TimeRaw int64 `json:"time"` + Time time.Time `json:"-"` + Type string `json:"type"` + Kids []int `json:"kids"` + Parent int `json:"parent"` + Id int `json:"id"` +} + +type Story struct { + Id int `json:"id"` + By string `json:"by"` + Text string `json:"text"` + Title string `json:"title"` + Type string `json:"type"` + Descendents int `json:"descendants"` + Score int `json:"score"` + Url string + TimeRaw int64 `json:"time"` + Time time.Time `json:"-"` + // comment ids + Kids []int +} + +type GetTopStoriesRequest struct { + Limit int + Page int +} + +func MustItemId(ctx *h.RequestContext) int { + raw := h.GetQueryParam(ctx, "item") + parsed, err := strconv.ParseInt(raw, 10, 64) + if err != nil { + return 0 + } + return int(parsed) +} + +func GetStories(category string, page int, limit int) []Story { + top, err := httpjson.Get[[]int](url(category, h.NewQs())) + if err != nil { + slog.Error("failed to load top stories", slog.String("err", err.Error())) + return make([]Story, 0) + } + ids := *top + start := page * limit + end := start + limit + return batch.ParallelProcess[int, Story]( + ids[start:end], + 50, + func(id int) Story { + story, err := GetStory(id) + if err != nil { + slog.Error("failed to load story", slog.Int("id", id), slog.String("err", err.Error())) + return Story{} + } + return *story + }, + ) +} + +func GetTopStories(page int, limit int) []Story { + return GetStories("topstories", page, limit) +} + +func GetBestStories(page int, limit int) []Story { + return GetStories("beststories", page, limit) +} + +func GetNewStories(page int, limit int) []Story { + return GetStories("newstories", page, limit) +} + +func GetComments(ids []int) []Comment { + return batch.ParallelProcess( + ids, + 50, + func(id int) Comment { + comment, err := GetComment(id) + if err != nil { + slog.Error("failed to load comment", slog.Int("id", id), slog.String("err", err.Error())) + return Comment{} + } + return *comment + }, + ) +} + +func GetComment(id int) (*Comment, error) { + c, err := httpjson.Get[Comment](url(fmt.Sprintf("item/%d", id), h.NewQs())) + if err != nil { + return nil, err + } + c.Time = timeformat.ParseUnix(c.TimeRaw) + return c, nil +} + +func GetStory(id int) (*Story, error) { + s, err := httpjson.Get[Story](url(fmt.Sprintf("item/%d", id), h.NewQs())) + if err != nil { + return nil, err + } + s.Time = timeformat.ParseUnix(s.TimeRaw) + return s, nil +} diff --git a/examples/hackernews/internal/random.go b/examples/hackernews/internal/random.go new file mode 100644 index 0000000..cdd5416 --- /dev/null +++ b/examples/hackernews/internal/random.go @@ -0,0 +1,13 @@ +package internal + +import "math/rand" + +var letters = []rune("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ") + +func RandSeq(n int) string { + b := make([]rune, n) + for i := range b { + b[i] = letters[rand.Intn(len(letters))] + } + return string(b) +} diff --git a/examples/hackernews/internal/timeformat/time.go b/examples/hackernews/internal/timeformat/time.go new file mode 100644 index 0000000..62af620 --- /dev/null +++ b/examples/hackernews/internal/timeformat/time.go @@ -0,0 +1,39 @@ +package timeformat + +import ( + "fmt" + "time" +) + +func ParseUnix(t int64) time.Time { + return time.UnixMilli(t * 1000) +} + +func RelativeTime(t time.Time) string { + now := time.Now() + diff := now.Sub(t) + + var pluralize = func(s string) string { + if s[0] == '1' { + return s[:len(s)-5] + " ago" + } + return s + } + + switch { + case diff < time.Minute: + return "just now" + case diff < time.Hour: + return pluralize(fmt.Sprintf("%d minutes ago", int(diff.Minutes()))) + case diff < time.Hour*24: + return pluralize(fmt.Sprintf("%d hours ago", int(diff.Hours()))) + case diff < time.Hour*24*7: + return pluralize(fmt.Sprintf("%d days ago", int(diff.Hours()/24))) + case diff < time.Hour*24*30: + return pluralize(fmt.Sprintf("%d weeks ago", int(diff.Hours()/(24*7)))) + case diff < time.Hour*24*365: + return pluralize(fmt.Sprintf("%d months ago", int(diff.Hours()/(24*30)))) + default: + return pluralize(fmt.Sprintf("%d years ago", int(diff.Hours()/(24*365)))) + } +} diff --git a/examples/hackernews/main.go b/examples/hackernews/main.go new file mode 100644 index 0000000..575e42c --- /dev/null +++ b/examples/hackernews/main.go @@ -0,0 +1,30 @@ +package main + +import ( + "github.com/maddalax/htmgo/framework/h" + "github.com/maddalax/htmgo/framework/service" + "hackernews/__htmgo" + "io/fs" + "net/http" +) + +func main() { + locator := service.NewLocator() + + h.Start(h.AppOpts{ + ServiceLocator: locator, + LiveReload: true, + Register: func(app *h.App) { + sub, err := fs.Sub(GetStaticAssets(), "assets/dist") + + if err != nil { + panic(err) + } + + http.FileServerFS(sub) + + app.Router.Handle("/public/*", http.StripPrefix("/public", http.FileServerFS(sub))) + __htmgo.Register(app.Router) + }, + }) +} diff --git a/examples/hackernews/pages/index.go b/examples/hackernews/pages/index.go new file mode 100644 index 0000000..b103599 --- /dev/null +++ b/examples/hackernews/pages/index.go @@ -0,0 +1,21 @@ +package pages + +import ( + "github.com/maddalax/htmgo/framework/h" + "hackernews/partials" +) + +func IndexPage(ctx *h.RequestContext) *h.Page { + return h.NewPage( + RootPage( + h.Div( + h.Class("flex gap-2 min-h-screen"), + partials.StorySidebar(ctx), + h.Main( + h.Class("flex justify-center items-start p-6 max-w-3xl min-w-3xl mx-auto"), + partials.Story(ctx), + ), + ), + ), + ) +} diff --git a/examples/hackernews/pages/root.go b/examples/hackernews/pages/root.go new file mode 100644 index 0000000..2c785ec --- /dev/null +++ b/examples/hackernews/pages/root.go @@ -0,0 +1,32 @@ +package pages + +import ( + "github.com/maddalax/htmgo/framework/h" +) + +func RootPage(children ...h.Ren) h.Ren { + return h.Html( + h.HxExtensions(h.BaseExtensions()), + h.Head( + h.Meta("viewport", "width=device-width, initial-scale=1"), + h.Link("/public/favicon.ico", "icon"), + h.Link("/public/apple-touch-icon.png", "apple-touch-icon"), + h.Meta("title", "htmgo template"), + h.Meta("charset", "utf-8"), + h.Meta("author", "htmgo"), + h.Meta("description", "this is a template"), + h.Meta("og:title", "htmgo template"), + h.Meta("og:url", "https://htmgo.dev"), + h.Link("canonical", "https://htmgo.dev"), + h.Meta("og:description", "this is a template"), + h.Link("/public/main.css", "stylesheet"), + h.Script("/public/htmgo.js"), + h.Script("/public/custom.js"), + ), + h.Body( + h.Div( + h.Fragment(children...), + ), + ), + ) +} diff --git a/examples/hackernews/partials/comments.go b/examples/hackernews/partials/comments.go new file mode 100644 index 0000000..14b39bd --- /dev/null +++ b/examples/hackernews/partials/comments.go @@ -0,0 +1,84 @@ +package partials + +import ( + "fmt" + "github.com/maddalax/htmgo/framework/h" + "hackernews/internal/batch" + "hackernews/internal/news" + "hackernews/internal/timeformat" + "strings" + "time" +) + +func StoryComments(ctx *h.RequestContext) *h.Partial { + return h.NewPartial( + h.Div( + h.Class("flex flex-col gap-3 prose max-w-none"), + CachedStoryComments(news.MustItemId(ctx)), + )) +} + +var CachedStoryComments = h.CachedPerKeyT[string, int](time.Minute*3, func(itemId int) (string, h.GetElementFunc) { + return fmt.Sprintf("story-comments-%d", itemId), func() *h.Element { + story, err := news.GetStory(itemId) + + if err != nil { + return h.Div( + h.Text("Failed to load story"), + ) + } + + comments := news.GetComments(story.Kids) + + // parallel process because each comment needs to load its children comments + items := batch.ParallelProcess[news.Comment, *h.Element](comments, 50, func(item news.Comment) *h.Element { + return Comment(item, 0) + }) + + return h.List(items, func(item *h.Element, index int) *h.Element { + return item + }) + } +}) + +func Comment(item news.Comment, nesting int) *h.Element { + if item.Text == "" { + return h.Empty() + } + + children := news.GetComments(item.Kids) + + return h.Div( + h.ClassX("block bg-white pb-2 pt-2", h.ClassMap{ + "border-b border-gray-200": nesting == 0, + "border-l border-gray-200": nesting > 0, + }), + h.If(nesting > 0, h.Attribute("style", fmt.Sprintf("margin-left: %dpx", (nesting-1)*15))), + h.Div( + h.If(nesting > 0, h.Class("pl-4")), + h.Div( + h.Class("flex gap-1 items-center"), + h.Div( + h.Class("font-bold text-rose-500"), + h.UnsafeRaw(item.By), + ), + h.Div( + h.Class("text-sm text-gray-600"), + h.UnsafeRaw("•"), + h.TextF(" %s", timeformat.RelativeTime(item.Time)), + ), + ), + h.Div( + h.Class("text-sm text-gray-600"), + h.UnsafeRaw(strings.TrimSpace(item.Text)), + ), + ), + h.If(len(children) > 0, h.List( + children, func(child news.Comment, index int) *h.Element { + return h.Div( + Comment(child, nesting+1), + ) + }, + )), + ) +} diff --git a/examples/hackernews/partials/sidebar.go b/examples/hackernews/partials/sidebar.go new file mode 100644 index 0000000..e68325b --- /dev/null +++ b/examples/hackernews/partials/sidebar.go @@ -0,0 +1,126 @@ +package partials + +import ( + "fmt" + "github.com/maddalax/htmgo/framework/h" + "github.com/maddalax/htmgo/framework/hx" + "hackernews/components" + "hackernews/internal/news" + "hackernews/internal/timeformat" + "time" +) + +// @lang js +var ScrollJs = ` + const scrollContainer = self; + let isDown = false; + let startX; + let scrollLeft; + + scrollContainer.addEventListener("mousedown", (e) => { + isDown = true; + scrollContainer.classList.add("active"); + startX = e.pageX - scrollContainer.offsetLeft; + scrollLeft = scrollContainer.scrollLeft; + }); + + scrollContainer.addEventListener("mouseleave", () => { + isDown = false; + scrollContainer.classList.remove("active"); + }); + + scrollContainer.addEventListener("mouseup", () => { + isDown = false; + scrollContainer.classList.remove("active"); + }); + + scrollContainer.addEventListener("mousemove", (e) => { + if (!isDown) return; + e.preventDefault(); + const x = e.pageX - scrollContainer.offsetLeft; + const walk = (x - startX) * 3; // Adjust scroll speed here + scrollContainer.scrollLeft = scrollLeft - walk; + }); +` + +func StorySidebar(ctx *h.RequestContext) *h.Partial { + category := h.GetQueryParam(ctx, "category") + if category == "" { + category = "topstories" + } + + body := h.Aside( + h.Id("story-sidebar"), + h.JoinExtensions(h.TriggerChildren()), + h.Class("sticky top-0 h-screen p-1 bg-gray-100 overflow-y-auto max-w-80 min-w-80"), + h.Div( + h.Class("flex flex-col gap-1"), + SidebarTitle(category), + CachedStoryList(category, 0, 50), + ), + ) + + if ctx.IsHxRequest() { + return h.SwapManyPartial(ctx, body) + } + return h.NewPartial(body) +} + +func SidebarTitle(defaultCategory string) *h.Element { + today := time.Now().Format("Mon, 02 Jan 2006") + return h.Div( + h.Class("flex flex-col px-2 pt-4 pb-2"), + h.Div( + h.Class("text-sm text-gray-600"), + h.Text(today), + ), + h.Div( + h.Class("font-bold text-xl"), + h.Text("Hacker News"), + ), + h.Div( + h.OnEvent(hx.LoadDomEvent, h.EvalJs(ScrollJs)), + h.OnEvent(hx.LoadEvent, h.EvalJs(ScrollJs)), + h.Class("scroll-container mt-2 flex gap-1 no-scrollbar overflow-y-hidden whitespace-nowrap overflow-x-auto"), + h.List(news.Categories, func(item news.Category, index int) *h.Element { + return CategoryBadge(defaultCategory, item) + }), + ), + ) +} + +func CategoryBadge(defaultCategory string, category news.Category) *h.Element { + selected := category.Path == defaultCategory + return components.Badge( + category.Name, + selected, + h.Attribute("hx-swap", "none"), + h.If(!selected, h.PostPartialOnClickQs(StorySidebar, h.NewQs("category", category.Path))), + ) +} + +var CachedStoryList = h.CachedPerKeyT3(time.Minute*5, func(category string, page int, limit int) (string, h.GetElementFunc) { + return fmt.Sprintf("%s-stories-%d-%d", category, page, limit), func() *h.Element { + stories := news.GetStories(category, page, limit) + return h.List(stories, func(item news.Story, index int) *h.Element { + return h.Div( + h.Attribute("hx-swap", "none"), + h.PostPartialOnClickQs(Story, h.NewQs("item", fmt.Sprintf("%d", item.Id))), + h.A(h.Href(item.Url)), + h.Class("block p-2 bg-white rounded-md shadow cursor-pointer"), + h.Div( + h.Class("font-bold"), + h.UnsafeRaw(item.Title), + ), + h.Div( + h.Class("text-sm text-gray-600"), + h.Div(h.TextF("%s ", item.By), h.UnsafeRaw("•"), h.TextF(" %s", timeformat.RelativeTime(item.Time))), + ), + h.Div( + h.Class("text-sm text-gray-600"), + h.UnsafeRaw(fmt.Sprintf("%d upvotes • %d comments", item.Score, item.Descendents)), + ), + ) + }) + } +}) diff --git a/examples/hackernews/partials/story.go b/examples/hackernews/partials/story.go new file mode 100644 index 0000000..1c05f1a --- /dev/null +++ b/examples/hackernews/partials/story.go @@ -0,0 +1,79 @@ +package partials + +import ( + "fmt" + "github.com/maddalax/htmgo/framework/h" + "hackernews/internal/news" + "hackernews/internal/timeformat" + "strconv" +) + +func Story(ctx *h.RequestContext) *h.Partial { + storyId, err := strconv.ParseInt(ctx.QueryParam("item"), 10, 64) + + if err != nil { + return h.SwapManyPartial( + ctx, + h.Div( + h.Text("Invalid story id"), + ), + ) + } + + story, err := news.GetStory(int(storyId)) + + if err != nil { + return h.SwapManyPartial( + ctx, + h.Div( + h.Text("Failed to load story"), + ), + ) + } + + if ctx.IsHxRequest() { + return h.SwapManyPartialWithHeaders( + ctx, + h.PushUrlHeader(fmt.Sprintf("/?item=%d", storyId)), + StoryBody(story), + ) + } + + return h.NewPartial( + StoryBody(story), + ) +} + +func StoryBody(story *news.Story) *h.Element { + return h.Div( + h.Id("story-body"), + h.Div( + h.Class("prose prose-2xl bg-white border-b border-gray-200 pb-3 max-w-3xl"), + h.H5( + h.Class("flex gap-2 items-center font-bold"), + h.UnsafeRaw(story.Title), + ), + h.A( + h.Href(story.Url), + h.Class("text-sm text-rose-400 no-underline"), + h.Text(story.Url), + ), + h.Div( + h.Class("text-sm text-gray-600"), + h.UnsafeRaw(story.Text), + ), + h.Div( + h.Class("text-sm text-gray-600 mt-2"), + h.TextF("%d upvotes ", story.Score), + h.UnsafeRaw("•"), + h.TextF(" %s ", story.By), + h.UnsafeRaw("•"), + h.TextF(" %s", timeformat.RelativeTime(story.Time)), + ), + ), + h.Div( + h.Class("mt-2 max-w-3xl"), + h.GetPartial(StoryComments, "load"), + ), + ) +} diff --git a/examples/hackernews/tailwind.config.js b/examples/hackernews/tailwind.config.js new file mode 100644 index 0000000..f1b453a --- /dev/null +++ b/examples/hackernews/tailwind.config.js @@ -0,0 +1,7 @@ +/** @type {import('tailwindcss').Config} */ +module.exports = { + content: ["**/*.go"], + plugins: [ + require('@tailwindcss/typography') + ], +}; diff --git a/framework/assets/dist/htmgo.js b/framework/assets/dist/htmgo.js index fd740d4..a0aadc4 100644 --- a/framework/assets/dist/htmgo.js +++ b/framework/assets/dist/htmgo.js @@ -1,3 +1,3 @@ -var te=function(){let htmx={onLoad:null,process:null,on:null,off:null,trigger:null,ajax:null,find:null,findAll:null,closest:null,values:function(e,t){return getInputValues(e,t||"post").values},remove:null,addClass:null,removeClass:null,toggleClass:null,takeClass:null,swap:null,defineExtension:null,removeExtension:null,logAll:null,logNone:null,logger:null,config:{historyEnabled:!0,historyCacheSize:10,refreshOnHistoryMiss:!1,defaultSwapStyle:"innerHTML",defaultSwapDelay:0,defaultSettleDelay:20,includeIndicatorStyles:!0,indicatorClass:"htmx-indicator",requestClass:"htmx-request",addedClass:"htmx-added",settlingClass:"htmx-settling",swappingClass:"htmx-swapping",allowEval:!0,allowScriptTags:!0,inlineScriptNonce:"",inlineStyleNonce:"",attributesToSettle:["class","style","width","height"],withCredentials:!1,timeout:0,wsReconnectDelay:"full-jitter",wsBinaryType:"blob",disableSelector:"[hx-disable], [data-hx-disable]",scrollBehavior:"instant",defaultFocusScroll:!1,getCacheBusterParam:!1,globalViewTransitions:!1,methodsThatUseUrlParams:["get","delete"],selfRequestsOnly:!0,ignoreTitle:!1,scrollIntoViewOnBoost:!0,triggerSpecsCache:null,disableInheritance:!1,responseHandling:[{code:"204",swap:!1},{code:"[23]..",swap:!0},{code:"[45]..",swap:!1,error:!0}],allowNestedOobSwaps:!0},parseInterval:null,_:null,version:"2.0.2"};htmx.onLoad=onLoadHelper,htmx.process=processNode,htmx.on=addEventListenerImpl,htmx.off=removeEventListenerImpl,htmx.trigger=triggerEvent,htmx.ajax=ajaxHelper,htmx.find=find,htmx.findAll=findAll,htmx.closest=closest,htmx.remove=removeElement,htmx.addClass=addClassToElement,htmx.removeClass=removeClassFromElement,htmx.toggleClass=toggleClassOnElement,htmx.takeClass=takeClassForElement,htmx.swap=swap,htmx.defineExtension=defineExtension,htmx.removeExtension=removeExtension,htmx.logAll=logAll,htmx.logNone=logNone,htmx.parseInterval=parseInterval,htmx._=internalEval;let internalAPI={addTriggerHandler,bodyContains,canAccessLocalStorage,findThisElement,filterValues,swap,hasAttribute,getAttributeValue,getClosestAttributeValue,getClosestMatch,getExpressionVars,getHeaders,getInputValues,getInternalData,getSwapSpecification,getTriggerSpecs,getTarget,makeFragment,mergeObjects,makeSettleInfo,oobSwap,querySelectorExt,settleImmediately,shouldCancel,triggerEvent,triggerErrorEvent,withExtensions},VERBS=["get","post","put","delete","patch"],VERB_SELECTOR=VERBS.map(function(e){return "[hx-"+e+"], [data-hx-"+e+"]"}).join(", "),HEAD_TAG_REGEX=makeTagRegEx("head");function makeTagRegEx(e,t=!1){return new RegExp(`<${e}(\\s[^>]*>|>)([\\s\\S]*?)<\\/${e}>`,t?"gim":"im")}function parseInterval(e){if(e==null)return;let t=NaN;return e.slice(-2)=="ms"?t=parseFloat(e.slice(0,-2)):e.slice(-1)=="s"?t=parseFloat(e.slice(0,-1))*1e3:e.slice(-1)=="m"?t=parseFloat(e.slice(0,-1))*1e3*60:t=parseFloat(e),isNaN(t)?void 0:t}function getRawAttribute(e,t){return e instanceof Element&&e.getAttribute(t)}function hasAttribute(e,t){return !!e.hasAttribute&&(e.hasAttribute(t)||e.hasAttribute("data-"+t))}function getAttributeValue(e,t){return getRawAttribute(e,t)||getRawAttribute(e,"data-"+t)}function parentElt(e){let t=e.parentElement;return !t&&e.parentNode instanceof ShadowRoot?e.parentNode:t}function getDocument(){return document}function getRootNode(e,t){return e.getRootNode?e.getRootNode({composed:t}):getDocument()}function getClosestMatch(e,t){for(;e&&!t(e);)e=parentElt(e);return e||null}function getAttributeValueWithDisinheritance(e,t,n){let r=getAttributeValue(t,n),o=getAttributeValue(t,"hx-disinherit");var i=getAttributeValue(t,"hx-inherit");if(e!==t){if(htmx.config.disableInheritance)return i&&(i==="*"||i.split(" ").indexOf(n)>=0)?r:null;if(o&&(o==="*"||o.split(" ").indexOf(n)>=0))return "unset"}return r}function getClosestAttributeValue(e,t){let n=null;if(getClosestMatch(e,function(r){return !!(n=getAttributeValueWithDisinheritance(e,asElement(r),t))}),n!=="unset")return n}function matches(e,t){let n=e instanceof Element&&(e.matches||e.matchesSelector||e.msMatchesSelector||e.mozMatchesSelector||e.webkitMatchesSelector||e.oMatchesSelector);return !!n&&n.call(e,t)}function getStartTag(e){let n=/<([a-z][^\/\0>\x20\t\r\n\f]*)/i.exec(e);return n?n[1].toLowerCase():""}function parseHTML(e){return new DOMParser().parseFromString(e,"text/html")}function takeChildrenFor(e,t){for(;t.childNodes.length>0;)e.append(t.childNodes[0]);}function duplicateScript(e){let t=getDocument().createElement("script");return forEach(e.attributes,function(n){t.setAttribute(n.name,n.value);}),t.textContent=e.textContent,t.async=!1,htmx.config.inlineScriptNonce&&(t.nonce=htmx.config.inlineScriptNonce),t}function isJavaScriptScriptNode(e){return e.matches("script")&&(e.type==="text/javascript"||e.type==="module"||e.type==="")}function normalizeScriptTags(e){Array.from(e.querySelectorAll("script")).forEach(t=>{if(isJavaScriptScriptNode(t)){let n=duplicateScript(t),r=t.parentNode;try{r.insertBefore(n,t);}catch(o){logError(o);}finally{t.remove();}}});}function makeFragment(e){let t=e.replace(HEAD_TAG_REGEX,""),n=getStartTag(t),r;if(n==="html"){r=new DocumentFragment;let i=parseHTML(e);takeChildrenFor(r,i.body),r.title=i.title;}else if(n==="body"){r=new DocumentFragment;let i=parseHTML(t);takeChildrenFor(r,i.body),r.title=i.title;}else {let i=parseHTML('");r=i.querySelector("template").content,r.title=i.title;var o=r.querySelector("title");o&&o.parentNode===r&&(o.remove(),r.title=o.innerText);}return r&&(htmx.config.allowScriptTags?normalizeScriptTags(r):r.querySelectorAll("script").forEach(i=>i.remove())),r}function maybeCall(e){e&&e();}function isType(e,t){return Object.prototype.toString.call(e)==="[object "+t+"]"}function isFunction(e){return typeof e=="function"}function isRawObject(e){return isType(e,"Object")}function getInternalData(e){let t="htmx-internal-data",n=e[t];return n||(n=e[t]={}),n}function toArray(e){let t=[];if(e)for(let n=0;n=0}function bodyContains(e){let t=e.getRootNode&&e.getRootNode();return t&&t instanceof window.ShadowRoot?getDocument().body.contains(t.host):getDocument().body.contains(e)}function splitOnWhitespace(e){return e.trim().split(/\s+/)}function mergeObjects(e,t){for(let n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);return e}function parseJSON(e){try{return JSON.parse(e)}catch(t){return logError(t),null}}function canAccessLocalStorage(){let e="htmx:localStorageTest";try{return localStorage.setItem(e,e),localStorage.removeItem(e),!0}catch{return !1}}function normalizePath(e){try{let t=new URL(e);return t&&(e=t.pathname+t.search),/^\/$/.test(e)||(e=e.replace(/\/+$/,"")),e}catch{return e}}function internalEval(str){return maybeEval(getDocument().body,function(){return eval(str)})}function onLoadHelper(e){return htmx.on("htmx:load",function(n){e(n.detail.elt);})}function logAll(){htmx.logger=function(e,t,n){console&&console.log(t,e,n);};}function logNone(){htmx.logger=null;}function find(e,t){return typeof e!="string"?e.querySelector(t):find(getDocument(),e)}function findAll(e,t){return typeof e!="string"?e.querySelectorAll(t):findAll(getDocument(),e)}function getWindow(){return window}function removeElement(e,t){e=resolveTarget(e),t?getWindow().setTimeout(function(){removeElement(e),e=null;},t):parentElt(e).removeChild(e);}function asElement(e){return e instanceof Element?e:null}function asHtmlElement(e){return e instanceof HTMLElement?e:null}function asString(e){return typeof e=="string"?e:null}function asParentNode(e){return e instanceof Element||e instanceof Document||e instanceof DocumentFragment?e:null}function addClassToElement(e,t,n){e=asElement(resolveTarget(e)),e&&(n?getWindow().setTimeout(function(){addClassToElement(e,t),e=null;},n):e.classList&&e.classList.add(t));}function removeClassFromElement(e,t,n){let r=asElement(resolveTarget(e));r&&(n?getWindow().setTimeout(function(){removeClassFromElement(r,t),r=null;},n):r.classList&&(r.classList.remove(t),r.classList.length===0&&r.removeAttribute("class")));}function toggleClassOnElement(e,t){e=resolveTarget(e),e.classList.toggle(t);}function takeClassForElement(e,t){e=resolveTarget(e),forEach(e.parentElement.children,function(n){removeClassFromElement(n,t);}),addClassToElement(asElement(e),t);}function closest(e,t){if(e=asElement(resolveTarget(e)),e&&e.closest)return e.closest(t);do if(e==null||matches(e,t))return e;while(e=e&&asElement(parentElt(e)));return null}function startsWith(e,t){return e.substring(0,t.length)===t}function endsWith(e,t){return e.substring(e.length-t.length)===t}function normalizeSelector(e){let t=e.trim();return startsWith(t,"<")&&endsWith(t,"/>")?t.substring(1,t.length-2):t}function querySelectorAllExt(e,t,n){return e=resolveTarget(e),t.indexOf("closest ")===0?[closest(asElement(e),normalizeSelector(t.substr(8)))]:t.indexOf("find ")===0?[find(asParentNode(e),normalizeSelector(t.substr(5)))]:t==="next"?[asElement(e).nextElementSibling]:t.indexOf("next ")===0?[scanForwardQuery(e,normalizeSelector(t.substr(5)),!!n)]:t==="previous"?[asElement(e).previousElementSibling]:t.indexOf("previous ")===0?[scanBackwardsQuery(e,normalizeSelector(t.substr(9)),!!n)]:t==="document"?[document]:t==="window"?[window]:t==="body"?[document.body]:t==="root"?[getRootNode(e,!!n)]:t.indexOf("global ")===0?querySelectorAllExt(e,t.slice(7),!0):toArray(asParentNode(getRootNode(e,!!n)).querySelectorAll(normalizeSelector(t)))}var scanForwardQuery=function(e,t,n){let r=asParentNode(getRootNode(e,n)).querySelectorAll(t);for(let o=0;o=0;o--){let i=r[o];if(i.compareDocumentPosition(e)===Node.DOCUMENT_POSITION_FOLLOWING)return i}};function querySelectorExt(e,t){return typeof e!="string"?querySelectorAllExt(e,t)[0]:querySelectorAllExt(getDocument().body,e)[0]}function resolveTarget(e,t){return typeof e=="string"?find(asParentNode(t)||document,e):e}function processEventArgs(e,t,n){return isFunction(t)?{target:getDocument().body,event:asString(e),listener:t}:{target:resolveTarget(e),event:asString(t),listener:n}}function addEventListenerImpl(e,t,n){return ready(function(){let o=processEventArgs(e,t,n);o.target.addEventListener(o.event,o.listener);}),isFunction(t)?t:n}function removeEventListenerImpl(e,t,n){return ready(function(){let r=processEventArgs(e,t,n);r.target.removeEventListener(r.event,r.listener);}),isFunction(t)?t:n}let DUMMY_ELT=getDocument().createElement("output");function findAttributeTargets(e,t){let n=getClosestAttributeValue(e,t);if(n){if(n==="this")return [findThisElement(e,t)];{let r=querySelectorAllExt(e,n);return r.length===0?(logError('The selector "'+n+'" on '+t+" returned no matches!"),[DUMMY_ELT]):r}}}function findThisElement(e,t){return asElement(getClosestMatch(e,function(n){return getAttributeValue(asElement(n),t)!=null}))}function getTarget(e){let t=getClosestAttributeValue(e,"hx-target");return t?t==="this"?findThisElement(e,"hx-target"):querySelectorExt(e,t):getInternalData(e).boosted?getDocument().body:e}function shouldSettleAttribute(e){let t=htmx.config.attributesToSettle;for(let n=0;n0?(o=e.substr(0,e.indexOf(":")),r=e.substr(e.indexOf(":")+1,e.length)):o=e);let i=getDocument().querySelectorAll(r);return i?(forEach(i,function(s){let l,a=t.cloneNode(!0);l=getDocument().createDocumentFragment(),l.appendChild(a),isInlineSwap(o,s)||(l=asParentNode(a));let u={shouldSwap:!0,target:s,fragment:l};triggerEvent(s,"htmx:oobBeforeSwap",u)&&(s=u.target,u.shouldSwap&&swapWithStyle(o,s,s,l,n),forEach(n.elts,function(d){triggerEvent(d,"htmx:oobAfterSwap",u);}));}),t.parentNode.removeChild(t)):(t.parentNode.removeChild(t),triggerErrorEvent(getDocument().body,"htmx:oobErrorNoTarget",{content:t})),e}function handlePreservedElements(e){forEach(findAll(e,"[hx-preserve], [data-hx-preserve]"),function(t){let n=getAttributeValue(t,"id"),r=getDocument().getElementById(n);r!=null&&t.parentNode.replaceChild(r,t);});}function handleAttributes(e,t,n){forEach(t.querySelectorAll("[id]"),function(r){let o=getRawAttribute(r,"id");if(o&&o.length>0){let i=o.replace("'","\\'"),s=r.tagName.replace(":","\\:"),l=asParentNode(e),a=l&&l.querySelector(s+"[id='"+i+"']");if(a&&a!==l){let u=r.cloneNode();cloneAttributes(r,a),n.tasks.push(function(){cloneAttributes(r,u);});}}});}function makeAjaxLoadTask(e){return function(){removeClassFromElement(e,htmx.config.addedClass),processNode(asElement(e)),processFocus(asParentNode(e)),triggerEvent(e,"htmx:load");}}function processFocus(e){let t="[autofocus]",n=asHtmlElement(matches(e,t)?e:e.querySelector(t));n?.focus();}function insertNodesBefore(e,t,n,r){for(handleAttributes(e,n,r);n.childNodes.length>0;){let o=n.firstChild;addClassToElement(asElement(o),htmx.config.addedClass),e.insertBefore(o,t),o.nodeType!==Node.TEXT_NODE&&o.nodeType!==Node.COMMENT_NODE&&r.tasks.push(makeAjaxLoadTask(o));}}function stringHash(e,t){let n=0;for(;n0}function swap(e,t,n,r){r||(r={}),e=resolveTarget(e);let o=document.activeElement,i={};try{i={elt:o,start:o?o.selectionStart:null,end:o?o.selectionEnd:null};}catch{}let s=makeSettleInfo(e);if(n.swapStyle==="textContent")e.textContent=t;else {let a=makeFragment(t);if(s.title=a.title,r.selectOOB){let u=r.selectOOB.split(",");for(let d=0;d0?getWindow().setTimeout(l,n.settleDelay):l();}function handleTriggerHeader(e,t,n){let r=e.getResponseHeader(t);if(r.indexOf("{")===0){let o=parseJSON(r);for(let i in o)if(o.hasOwnProperty(i)){let s=o[i];isRawObject(s)?n=s.target!==void 0?s.target:n:s={value:s},triggerEvent(n,i,s);}}else {let o=r.split(",");for(let i=0;i0;){let s=t[0];if(s==="]"){if(r--,r===0){i===null&&(o=o+"true"),t.shift(),o+=")})";try{let l=maybeEval(e,function(){return Function(o)()},function(){return !0});return l.source=o,l}catch(l){return triggerErrorEvent(getDocument().body,"htmx:syntax:error",{error:l,source:o}),null}}}else s==="["&&r++;isPossibleRelativeReference(s,i,n)?o+="(("+n+"."+s+") ? ("+n+"."+s+") : (window."+s+"))":o=o+s,i=t.shift();}}}function consumeUntil(e,t){let n="";for(;e.length>0&&!t.test(e[0]);)n+=e.shift();return n}function consumeCSSSelector(e){let t;return e.length>0&&COMBINED_SELECTOR_START.test(e[0])?(e.shift(),t=consumeUntil(e,COMBINED_SELECTOR_END).trim(),e.shift()):t=consumeUntil(e,WHITESPACE_OR_COMMA),t}let INPUT_SELECTOR="input, textarea, select";function parseAndCacheTrigger(e,t,n){let r=[],o=tokenizeString(t);do{consumeUntil(o,NOT_WHITESPACE);let l=o.length,a=consumeUntil(o,/[,\[\s]/);if(a!=="")if(a==="every"){let u={trigger:"every"};consumeUntil(o,NOT_WHITESPACE),u.pollInterval=parseInterval(consumeUntil(o,/[,\[\s]/)),consumeUntil(o,NOT_WHITESPACE);var i=maybeGenerateConditional(e,o,"event");i&&(u.eventFilter=i),r.push(u);}else {let u={trigger:a};var i=maybeGenerateConditional(e,o,"event");for(i&&(u.eventFilter=i);o.length>0&&o[0]!==",";){consumeUntil(o,NOT_WHITESPACE);let c=o.shift();if(c==="changed")u.changed=!0;else if(c==="once")u.once=!0;else if(c==="consume")u.consume=!0;else if(c==="delay"&&o[0]===":")o.shift(),u.delay=parseInterval(consumeUntil(o,WHITESPACE_OR_COMMA));else if(c==="from"&&o[0]===":"){if(o.shift(),COMBINED_SELECTOR_START.test(o[0]))var s=consumeCSSSelector(o);else {var s=consumeUntil(o,WHITESPACE_OR_COMMA);if(s==="closest"||s==="find"||s==="next"||s==="previous"){o.shift();let b=consumeCSSSelector(o);b.length>0&&(s+=" "+b);}}u.from=s;}else c==="target"&&o[0]===":"?(o.shift(),u.target=consumeCSSSelector(o)):c==="throttle"&&o[0]===":"?(o.shift(),u.throttle=parseInterval(consumeUntil(o,WHITESPACE_OR_COMMA))):c==="queue"&&o[0]===":"?(o.shift(),u.queue=consumeUntil(o,WHITESPACE_OR_COMMA)):c==="root"&&o[0]===":"?(o.shift(),u[c]=consumeCSSSelector(o)):c==="threshold"&&o[0]===":"?(o.shift(),u[c]=consumeUntil(o,WHITESPACE_OR_COMMA)):triggerErrorEvent(e,"htmx:syntax:error",{token:o.shift()});}r.push(u);}o.length===l&&triggerErrorEvent(e,"htmx:syntax:error",{token:o.shift()}),consumeUntil(o,NOT_WHITESPACE);}while(o[0]===","&&o.shift());return n&&(n[t]=r),r}function getTriggerSpecs(e){let t=getAttributeValue(e,"hx-trigger"),n=[];if(t){let r=htmx.config.triggerSpecsCache;n=r&&r[t]||parseAndCacheTrigger(e,t,r);}return n.length>0?n:matches(e,"form")?[{trigger:"submit"}]:matches(e,'input[type="button"], input[type="submit"]')?[{trigger:"click"}]:matches(e,INPUT_SELECTOR)?[{trigger:"change"}]:[{trigger:"click"}]}function cancelPolling(e){getInternalData(e).cancelled=!0;}function processPolling(e,t,n){let r=getInternalData(e);r.timeout=getWindow().setTimeout(function(){bodyContains(e)&&r.cancelled!==!0&&(maybeFilterEvent(n,e,makeEvent("hx:poll:trigger",{triggerSpec:n,target:e}))||t(e),processPolling(e,t,n));},n.pollInterval);}function isLocalLink(e){return location.hostname===e.hostname&&getRawAttribute(e,"href")&&getRawAttribute(e,"href").indexOf("#")!==0}function eltIsDisabled(e){return closest(e,htmx.config.disableSelector)}function boostElement(e,t,n){if(e instanceof HTMLAnchorElement&&isLocalLink(e)&&(e.target===""||e.target==="_self")||e.tagName==="FORM"&&String(getRawAttribute(e,"method")).toLowerCase()!=="dialog"){t.boosted=!0;let r,o;if(e.tagName==="A")r="get",o=getRawAttribute(e,"href");else {let i=getRawAttribute(e,"method");r=i?i.toLowerCase():"get",o=getRawAttribute(e,"action");}n.forEach(function(i){addEventListener(e,function(s,l){let a=asElement(s);if(eltIsDisabled(a)){cleanUpElement(a);return}issueAjaxRequest(r,o,a,l);},t,i,!0);});}}function shouldCancel(e,t){let n=asElement(t);return n?!!((e.type==="submit"||e.type==="click")&&(n.tagName==="FORM"||matches(n,'input[type="submit"], button')&&closest(n,"form")!==null||n instanceof HTMLAnchorElement&&n.href&&(n.getAttribute("href")==="#"||n.getAttribute("href").indexOf("#")!==0))):!1}function ignoreBoostedAnchorCtrlClick(e,t){return getInternalData(e).boosted&&e instanceof HTMLAnchorElement&&t.type==="click"&&(t.ctrlKey||t.metaKey)}function maybeFilterEvent(e,t,n){let r=e.eventFilter;if(r)try{return r.call(t,n)!==!0}catch(o){let i=r.source;return triggerErrorEvent(getDocument().body,"htmx:eventFilter:error",{error:o,source:i}),!0}return !1}function addEventListener(e,t,n,r,o){let i=getInternalData(e),s;r.from?s=querySelectorAllExt(e,r.from):s=[e],r.changed&&s.forEach(function(l){let a=getInternalData(l);a.lastValue=l.value;}),forEach(s,function(l){let a=function(u){if(!bodyContains(e)){l.removeEventListener(r.trigger,a);return}if(ignoreBoostedAnchorCtrlClick(e,u)||((o||shouldCancel(u,e))&&u.preventDefault(),maybeFilterEvent(r,e,u)))return;let d=getInternalData(u);if(d.triggerSpec=r,d.handledFor==null&&(d.handledFor=[]),d.handledFor.indexOf(e)<0){if(d.handledFor.push(e),r.consume&&u.stopPropagation(),r.target&&u.target&&!matches(asElement(u.target),r.target))return;if(r.once){if(i.triggeredOnce)return;i.triggeredOnce=!0;}if(r.changed){let c=getInternalData(l),h=l.value;if(c.lastValue===h)return;c.lastValue=h;}if(i.delayed&&clearTimeout(i.delayed),i.throttle)return;r.throttle>0?i.throttle||(triggerEvent(e,"htmx:trigger"),t(e,u),i.throttle=getWindow().setTimeout(function(){i.throttle=null;},r.throttle)):r.delay>0?i.delayed=getWindow().setTimeout(function(){triggerEvent(e,"htmx:trigger"),t(e,u);},r.delay):(triggerEvent(e,"htmx:trigger"),t(e,u));}};n.listenerInfos==null&&(n.listenerInfos=[]),n.listenerInfos.push({trigger:r.trigger,listener:a,on:l}),l.addEventListener(r.trigger,a);});}let windowIsScrolling=!1,scrollHandler=null;function initScrollHandler(){scrollHandler||(scrollHandler=function(){windowIsScrolling=!0;},window.addEventListener("scroll",scrollHandler),setInterval(function(){windowIsScrolling&&(windowIsScrolling=!1,forEach(getDocument().querySelectorAll("[hx-trigger*='revealed'],[data-hx-trigger*='revealed']"),function(e){maybeReveal(e);}));},200));}function maybeReveal(e){!hasAttribute(e,"data-hx-revealed")&&isScrolledIntoView(e)&&(e.setAttribute("data-hx-revealed","true"),getInternalData(e).initHash?triggerEvent(e,"revealed"):e.addEventListener("htmx:afterProcessNode",function(){triggerEvent(e,"revealed");},{once:!0}));}function loadImmediately(e,t,n,r){let o=function(){n.loaded||(n.loaded=!0,t(e));};r>0?getWindow().setTimeout(o,r):o();}function processVerbs(e,t,n){let r=!1;return forEach(VERBS,function(o){if(hasAttribute(e,"hx-"+o)){let i=getAttributeValue(e,"hx-"+o);r=!0,t.path=i,t.verb=o,n.forEach(function(s){addTriggerHandler(e,s,t,function(l,a){let u=asElement(l);if(closest(u,htmx.config.disableSelector)){cleanUpElement(u);return}issueAjaxRequest(o,i,u,a);});});}}),r}function addTriggerHandler(e,t,n,r){if(t.trigger==="revealed")initScrollHandler(),addEventListener(e,r,n,t),maybeReveal(asElement(e));else if(t.trigger==="intersect"){let o={};t.root&&(o.root=querySelectorExt(e,t.root)),t.threshold&&(o.threshold=parseFloat(t.threshold)),new IntersectionObserver(function(s){for(let l=0;l0?(n.polling=!0,processPolling(asElement(e),r,t)):addEventListener(e,r,n,t);}function shouldProcessHxOn(e){let t=asElement(e);if(!t)return !1;let n=t.attributes;for(let r=0;r", "+i).join(""))}else return []}function maybeSetLastButtonClicked(e){let t=closest(asElement(e.target),"button, input[type='submit']"),n=getRelatedFormData(e);n&&(n.lastButtonClicked=t);}function maybeUnsetLastButtonClicked(e){let t=getRelatedFormData(e);t&&(t.lastButtonClicked=null);}function getRelatedFormData(e){let t=closest(asElement(e.target),"button, input[type='submit']");if(!t)return;let n=resolveTarget("#"+getRawAttribute(t,"form"),t.getRootNode())||closest(t,"form");if(n)return getInternalData(n)}function initButtonTracking(e){e.addEventListener("click",maybeSetLastButtonClicked),e.addEventListener("focusin",maybeSetLastButtonClicked),e.addEventListener("focusout",maybeUnsetLastButtonClicked);}function addHxOnEventHandler(e,t,n){let r=getInternalData(e);Array.isArray(r.onHandlers)||(r.onHandlers=[]);let o,i=function(s){maybeEval(e,function(){eltIsDisabled(e)||(o||(o=new Function("event",n)),o.call(e,s));});};e.addEventListener(t,i),r.onHandlers.push({event:t,listener:i});}function processHxOnWildcard(e){deInitOnHandlers(e);for(let t=0;thtmx.config.historyCacheSize;)i.shift();for(;i.length>0;)try{localStorage.setItem("htmx-history-cache",JSON.stringify(i));break}catch(l){triggerErrorEvent(getDocument().body,"htmx:historyCacheError",{cause:l,cache:i}),i.shift();}}function getCachedHistory(e){if(!canAccessLocalStorage())return null;e=normalizePath(e);let t=parseJSON(localStorage.getItem("htmx-history-cache"))||[];for(let n=0;n=200&&this.status<400){triggerEvent(getDocument().body,"htmx:historyCacheMissLoad",n);let r=makeFragment(this.response),o=r.querySelector("[hx-history-elt],[data-hx-history-elt]")||r,i=getHistoryElement(),s=makeSettleInfo(i);handleTitle(r.title),swapInnerHTML(i,o,s),settleImmediately(s.tasks),currentPathForHistory=e,triggerEvent(getDocument().body,"htmx:historyRestore",{path:e,cacheMiss:!0,serverResponse:this.response});}else triggerErrorEvent(getDocument().body,"htmx:historyCacheMissLoadError",n);},t.send();}function restoreHistory(e){saveCurrentPageToHistory(),e=e||location.pathname+location.search;let t=getCachedHistory(e);if(t){let n=makeFragment(t.content),r=getHistoryElement(),o=makeSettleInfo(r);handleTitle(n.title),swapInnerHTML(r,n,o),settleImmediately(o.tasks),getWindow().setTimeout(function(){window.scrollTo(0,t.scroll);},0),currentPathForHistory=e,triggerEvent(getDocument().body,"htmx:historyRestore",{path:e,item:t});}else htmx.config.refreshOnHistoryMiss?window.location.reload(!0):loadHistoryFromServer(e);}function addRequestIndicatorClasses(e){let t=findAttributeTargets(e,"hx-indicator");return t==null&&(t=[e]),forEach(t,function(n){let r=getInternalData(n);r.requestCount=(r.requestCount||0)+1,n.classList.add.call(n.classList,htmx.config.requestClass);}),t}function disableElements(e){let t=findAttributeTargets(e,"hx-disabled-elt");return t==null&&(t=[]),forEach(t,function(n){let r=getInternalData(n);r.requestCount=(r.requestCount||0)+1,n.setAttribute("disabled",""),n.setAttribute("data-disabled-by-htmx","");}),t}function removeRequestIndicators(e,t){forEach(e,function(n){let r=getInternalData(n);r.requestCount=(r.requestCount||0)-1,r.requestCount===0&&n.classList.remove.call(n.classList,htmx.config.requestClass);}),forEach(t,function(n){let r=getInternalData(n);r.requestCount=(r.requestCount||0)-1,r.requestCount===0&&(n.removeAttribute("disabled"),n.removeAttribute("data-disabled-by-htmx"));});}function haveSeenNode(e,t){for(let n=0;nt.indexOf(o)<0):r=r.filter(o=>o!==t),n.delete(e),forEach(r,o=>n.append(e,o));}}function processInputValue(e,t,n,r,o){if(!(r==null||haveSeenNode(e,r))){if(e.push(r),shouldInclude(r)){let i=getRawAttribute(r,"name"),s=r.value;r instanceof HTMLSelectElement&&r.multiple&&(s=toArray(r.querySelectorAll("option:checked")).map(function(l){return l.value})),r instanceof HTMLInputElement&&r.files&&(s=toArray(r.files)),addValueToFormData(i,s,t),o&&validateElement(r,n);}r instanceof HTMLFormElement&&(forEach(r.elements,function(i){e.indexOf(i)>=0?removeValueFromFormData(i.name,i.value,t):e.push(i),o&&validateElement(i,n);}),new FormData(r).forEach(function(i,s){i instanceof File&&i.name===""||addValueToFormData(s,i,t);}));}}function validateElement(e,t){let n=e;n.willValidate&&(triggerEvent(n,"htmx:validation:validate"),n.checkValidity()||(t.push({elt:n,message:n.validationMessage,validity:n.validity}),triggerEvent(n,"htmx:validation:failed",{message:n.validationMessage,validity:n.validity})));}function overrideFormData(e,t){for(let n of t.keys())e.delete(n);return t.forEach(function(n,r){e.append(r,n);}),e}function getInputValues(e,t){let n=[],r=new FormData,o=new FormData,i=[],s=getInternalData(e);s.lastButtonClicked&&!bodyContains(s.lastButtonClicked)&&(s.lastButtonClicked=null);let l=e instanceof HTMLFormElement&&e.noValidate!==!0||getAttributeValue(e,"hx-validate")==="true";if(s.lastButtonClicked&&(l=l&&s.lastButtonClicked.formNoValidate!==!0),t!=="get"&&processInputValue(n,o,i,closest(e,"form"),l),processInputValue(n,r,i,e,l),s.lastButtonClicked||e.tagName==="BUTTON"||e.tagName==="INPUT"&&getRawAttribute(e,"type")==="submit"){let u=s.lastButtonClicked||e,d=getRawAttribute(u,"name");addValueToFormData(d,u.value,o);}let a=findAttributeTargets(e,"hx-include");return forEach(a,function(u){processInputValue(n,r,i,asElement(u),l),matches(u,"form")||forEach(asParentNode(u).querySelectorAll(INPUT_SELECTOR),function(d){processInputValue(n,r,i,d,l);});}),overrideFormData(r,o),{errors:i,formData:r,values:formDataProxy(r)}}function appendParam(e,t,n){e!==""&&(e+="&"),String(n)==="[object Object]"&&(n=JSON.stringify(n));let r=encodeURIComponent(n);return e+=encodeURIComponent(t)+"="+r,e}function urlEncode(e){e=formDataFromObject(e);let t="";return e.forEach(function(n,r){t=appendParam(t,r,n);}),t}function getHeaders(e,t,n){let r={"HX-Request":"true","HX-Trigger":getRawAttribute(e,"id"),"HX-Trigger-Name":getRawAttribute(e,"name"),"HX-Target":getAttributeValue(t,"id"),"HX-Current-URL":getDocument().location.href};return getValuesForElement(e,"hx-headers",!1,r),n!==void 0&&(r["HX-Prompt"]=n),getInternalData(e).boosted&&(r["HX-Boosted"]="true"),r}function filterValues(e,t){let n=getClosestAttributeValue(t,"hx-params");if(n){if(n==="none")return new FormData;if(n==="*")return e;if(n.indexOf("not ")===0)return forEach(n.substr(4).split(","),function(r){r=r.trim(),e.delete(r);}),e;{let r=new FormData;return forEach(n.split(","),function(o){o=o.trim(),e.has(o)&&e.getAll(o).forEach(function(i){r.append(o,i);});}),r}}else return e}function isAnchorLink(e){return !!getRawAttribute(e,"href")&&getRawAttribute(e,"href").indexOf("#")>=0}function getSwapSpecification(e,t){let n=t||getClosestAttributeValue(e,"hx-swap"),r={swapStyle:getInternalData(e).boosted?"innerHTML":htmx.config.defaultSwapStyle,swapDelay:htmx.config.defaultSwapDelay,settleDelay:htmx.config.defaultSettleDelay};if(htmx.config.scrollIntoViewOnBoost&&getInternalData(e).boosted&&!isAnchorLink(e)&&(r.show="top"),n){let s=splitOnWhitespace(n);if(s.length>0)for(let l=0;l0?o.join(":"):null;r.scroll=d,r.scrollTarget=i;}else if(a.indexOf("show:")===0){var o=a.substr(5).split(":");let c=o.pop();var i=o.length>0?o.join(":"):null;r.show=c,r.showTarget=i;}else if(a.indexOf("focus-scroll:")===0){let u=a.substr(13);r.focusScroll=u=="true";}else l==0?r.swapStyle=a:logError("Unknown modifier in hx-swap: "+a);}}return r}function usesFormData(e){return getClosestAttributeValue(e,"hx-encoding")==="multipart/form-data"||matches(e,"form")&&getRawAttribute(e,"enctype")==="multipart/form-data"}function encodeParamsForBody(e,t,n){let r=null;return withExtensions(t,function(o){r==null&&(r=o.encodeParameters(e,n,t));}),r??(usesFormData(t)?overrideFormData(new FormData,formDataFromObject(n)):urlEncode(n))}function makeSettleInfo(e){return {tasks:[],elts:[e]}}function updateScrollState(e,t){let n=e[0],r=e[e.length-1];if(t.scroll){var o=null;t.scrollTarget&&(o=asElement(querySelectorExt(n,t.scrollTarget))),t.scroll==="top"&&(n||o)&&(o=o||n,o.scrollTop=0),t.scroll==="bottom"&&(r||o)&&(o=o||r,o.scrollTop=o.scrollHeight);}if(t.show){var o=null;if(t.showTarget){let s=t.showTarget;t.showTarget==="window"&&(s="body"),o=asElement(querySelectorExt(n,s));}t.show==="top"&&(n||o)&&(o=o||n,o.scrollIntoView({block:"start",behavior:htmx.config.scrollBehavior})),t.show==="bottom"&&(r||o)&&(o=o||r,o.scrollIntoView({block:"end",behavior:htmx.config.scrollBehavior}));}}function getValuesForElement(e,t,n,r){if(r==null&&(r={}),e==null)return r;let o=getAttributeValue(e,t);if(o){let i=o.trim(),s=n;if(i==="unset")return null;i.indexOf("javascript:")===0?(i=i.substr(11),s=!0):i.indexOf("js:")===0&&(i=i.substr(3),s=!0),i.indexOf("{")!==0&&(i="{"+i+"}");let l;s?l=maybeEval(e,function(){return Function("return ("+i+")")()},{}):l=parseJSON(i);for(let a in l)l.hasOwnProperty(a)&&r[a]==null&&(r[a]=l[a]);}return getValuesForElement(asElement(parentElt(e)),t,n,r)}function maybeEval(e,t,n){return htmx.config.allowEval?t():(triggerErrorEvent(e,"htmx:evalDisallowedError"),n)}function getHXVarsForElement(e,t){return getValuesForElement(e,"hx-vars",!0,t)}function getHXValsForElement(e,t){return getValuesForElement(e,"hx-vals",!1,t)}function getExpressionVars(e){return mergeObjects(getHXVarsForElement(e),getHXValsForElement(e))}function safelySetHeaderValue(e,t,n){if(n!==null)try{e.setRequestHeader(t,n);}catch{e.setRequestHeader(t,encodeURIComponent(n)),e.setRequestHeader(t+"-URI-AutoEncoded","true");}}function getPathFromResponse(e){if(e.responseURL&&typeof URL<"u")try{let t=new URL(e.responseURL);return t.pathname+t.search}catch{triggerErrorEvent(getDocument().body,"htmx:badResponseUrl",{url:e.responseURL});}}function hasHeader(e,t){return t.test(e.getAllResponseHeaders())}function ajaxHelper(e,t,n){return e=e.toLowerCase(),n?n instanceof Element||typeof n=="string"?issueAjaxRequest(e,t,null,null,{targetOverride:resolveTarget(n),returnPromise:!0}):issueAjaxRequest(e,t,resolveTarget(n.source),n.event,{handler:n.handler,headers:n.headers,values:n.values,targetOverride:resolveTarget(n.target),swapOverride:n.swap,select:n.select,returnPromise:!0}):issueAjaxRequest(e,t,null,null,{returnPromise:!0})}function hierarchyForElt(e){let t=[];for(;e;)t.push(e),e=e.parentElement;return t}function verifyPath(e,t,n){let r,o;return typeof URL=="function"?(o=new URL(t,document.location.href),r=document.location.origin===o.origin):(o=t,r=startsWith(t,document.location.origin)),htmx.config.selfRequestsOnly&&!r?!1:triggerEvent(e,"htmx:validateUrl",mergeObjects({url:o,sameHost:r},n))}function formDataFromObject(e){if(e instanceof FormData)return e;let t=new FormData;for(let n in e)e.hasOwnProperty(n)&&(typeof e[n].forEach=="function"?e[n].forEach(function(r){t.append(n,r);}):typeof e[n]=="object"&&!(e[n]instanceof Blob)?t.append(n,JSON.stringify(e[n])):t.append(n,e[n]));return t}function formDataArrayProxy(e,t,n){return new Proxy(n,{get:function(r,o){return typeof o=="number"?r[o]:o==="length"?r.length:o==="push"?function(i){r.push(i),e.append(t,i);}:typeof r[o]=="function"?function(){r[o].apply(r,arguments),e.delete(t),r.forEach(function(i){e.append(t,i);});}:r[o]&&r[o].length===1?r[o][0]:r[o]},set:function(r,o,i){return r[o]=i,e.delete(t),r.forEach(function(s){e.append(t,s);}),!0}})}function formDataProxy(e){return new Proxy(e,{get:function(t,n){if(typeof n=="symbol")return Reflect.get(t,n);if(n==="toJSON")return ()=>Object.fromEntries(e);if(n in t)return typeof t[n]=="function"?function(){return e[n].apply(e,arguments)}:t[n];let r=e.getAll(n);if(r.length!==0)return r.length===1?r[0]:formDataArrayProxy(t,n,r)},set:function(t,n,r){return typeof n!="string"?!1:(t.delete(n),typeof r.forEach=="function"?r.forEach(function(o){t.append(n,o);}):typeof r=="object"&&!(r instanceof Blob)?t.append(n,JSON.stringify(r)):t.append(n,r),!0)},deleteProperty:function(t,n){return typeof n=="string"&&t.delete(n),!0},ownKeys:function(t){return Reflect.ownKeys(Object.fromEntries(t))},getOwnPropertyDescriptor:function(t,n){return Reflect.getOwnPropertyDescriptor(Object.fromEntries(t),n)}})}function issueAjaxRequest(e,t,n,r,o,i){let s=null,l=null;if(o=o??{},o.returnPromise&&typeof Promise<"u")var a=new Promise(function(g,E){s=g,l=E;});n==null&&(n=getDocument().body);let u=o.handler||handleAjaxResponse,d=o.select||null;if(!bodyContains(n))return maybeCall(s),a;let c=o.targetOverride||asElement(getTarget(n));if(c==null||c==DUMMY_ELT)return triggerErrorEvent(n,"htmx:targetError",{target:getAttributeValue(n,"hx-target")}),maybeCall(l),a;let h=getInternalData(n),b=h.lastButtonClicked;if(b){let g=getRawAttribute(b,"formaction");g!=null&&(t=g);let E=getRawAttribute(b,"formmethod");E!=null&&E.toLowerCase()!=="dialog"&&(e=E);}let S=getClosestAttributeValue(n,"hx-confirm");if(i===void 0&&triggerEvent(n,"htmx:confirm",{target:c,elt:n,path:t,verb:e,triggeringEvent:r,etc:o,issueRequest:function(O){return issueAjaxRequest(e,t,n,r,o,!!O)},question:S})===!1)return maybeCall(s),a;let A=n,p=getClosestAttributeValue(n,"hx-sync"),x=null,T=!1;if(p){let g=p.split(":"),E=g[0].trim();if(E==="this"?A=findThisElement(n,"hx-sync"):A=asElement(querySelectorExt(n,E)),p=(g[1]||"drop").trim(),h=getInternalData(A),p==="drop"&&h.xhr&&h.abortable!==!0)return maybeCall(s),a;if(p==="abort"){if(h.xhr)return maybeCall(s),a;T=!0;}else p==="replace"?triggerEvent(A,"htmx:abort"):p.indexOf("queue")===0&&(x=(p.split(" ")[1]||"last").trim());}if(h.xhr)if(h.abortable)triggerEvent(A,"htmx:abort");else {if(x==null){if(r){let g=getInternalData(r);g&&g.triggerSpec&&g.triggerSpec.queue&&(x=g.triggerSpec.queue);}x==null&&(x="last");}return h.queuedRequests==null&&(h.queuedRequests=[]),x==="first"&&h.queuedRequests.length===0?h.queuedRequests.push(function(){issueAjaxRequest(e,t,n,r,o);}):x==="all"?h.queuedRequests.push(function(){issueAjaxRequest(e,t,n,r,o);}):x==="last"&&(h.queuedRequests=[],h.queuedRequests.push(function(){issueAjaxRequest(e,t,n,r,o);})),maybeCall(s),a}let m=new XMLHttpRequest;h.xhr=m,h.abortable=T;let H=function(){h.xhr=null,h.abortable=!1,h.queuedRequests!=null&&h.queuedRequests.length>0&&h.queuedRequests.shift()();},N=getClosestAttributeValue(n,"hx-prompt");if(N){var I=prompt(N);if(I===null||!triggerEvent(n,"htmx:prompt",{prompt:I,target:c}))return maybeCall(s),H(),a}if(S&&!i&&!confirm(S))return maybeCall(s),H(),a;let R=getHeaders(n,c,I);e!=="get"&&!usesFormData(n)&&(R["Content-Type"]="application/x-www-form-urlencoded"),o.headers&&(R=mergeObjects(R,o.headers));let v=getInputValues(n,e),q=v.errors,F=v.formData;o.values&&overrideFormData(F,formDataFromObject(o.values));let _=formDataFromObject(getExpressionVars(n)),W=overrideFormData(F,_),L=filterValues(W,n);htmx.config.getCacheBusterParam&&e==="get"&&L.set("org.htmx.cache-buster",getRawAttribute(c,"id")||"true"),(t==null||t==="")&&(t=getDocument().location.href);let X=getValuesForElement(n,"hx-request"),G=getInternalData(n).boosted,M=htmx.config.methodsThatUseUrlParams.indexOf(e)>=0,w={boosted:G,useUrlParams:M,formData:L,parameters:formDataProxy(L),unfilteredFormData:W,unfilteredParameters:formDataProxy(W),headers:R,target:c,verb:e,errors:q,withCredentials:o.credentials||X.credentials||htmx.config.withCredentials,timeout:o.timeout||X.timeout||htmx.config.timeout,path:t,triggeringEvent:r};if(!triggerEvent(n,"htmx:configRequest",w))return maybeCall(s),H(),a;if(t=w.path,e=w.verb,R=w.headers,L=formDataFromObject(w.parameters),q=w.errors,M=w.useUrlParams,q&&q.length>0)return triggerEvent(n,"htmx:validation:halted",w),maybeCall(s),H(),a;let Y=t.split("#"),Z=Y[0],j=Y[1],D=t;if(M&&(D=Z,!L.keys().next().done&&(D.indexOf("?")<0?D+="?":D+="&",D+=urlEncode(L),j&&(D+="#"+j))),!verifyPath(n,D,w))return triggerErrorEvent(n,"htmx:invalidPath",w),maybeCall(l),a;if(m.open(e.toUpperCase(),D,!0),m.overrideMimeType("text/html"),m.withCredentials=w.withCredentials,m.timeout=w.timeout,!X.noHeaders){for(let g in R)if(R.hasOwnProperty(g)){let E=R[g];safelySetHeaderValue(m,g,E);}}let y={xhr:m,target:c,requestConfig:w,etc:o,boosted:G,select:d,pathInfo:{requestPath:t,finalRequestPath:D,responsePath:null,anchor:j}};if(m.onload=function(){try{let g=hierarchyForElt(n);if(y.pathInfo.responsePath=getPathFromResponse(m),u(n,y),y.keepIndicators!==!0&&removeRequestIndicators(V,k),triggerEvent(n,"htmx:afterRequest",y),triggerEvent(n,"htmx:afterOnLoad",y),!bodyContains(n)){let E=null;for(;g.length>0&&E==null;){let O=g.shift();bodyContains(O)&&(E=O);}E&&(triggerEvent(E,"htmx:afterRequest",y),triggerEvent(E,"htmx:afterOnLoad",y));}maybeCall(s),H();}catch(g){throw triggerErrorEvent(n,"htmx:onLoadError",mergeObjects({error:g},y)),g}},m.onerror=function(){removeRequestIndicators(V,k),triggerErrorEvent(n,"htmx:afterRequest",y),triggerErrorEvent(n,"htmx:sendError",y),maybeCall(l),H();},m.onabort=function(){removeRequestIndicators(V,k),triggerErrorEvent(n,"htmx:afterRequest",y),triggerErrorEvent(n,"htmx:sendAbort",y),maybeCall(l),H();},m.ontimeout=function(){removeRequestIndicators(V,k),triggerErrorEvent(n,"htmx:afterRequest",y),triggerErrorEvent(n,"htmx:timeout",y),maybeCall(l),H();},!triggerEvent(n,"htmx:beforeRequest",y))return maybeCall(s),H(),a;var V=addRequestIndicatorClasses(n),k=disableElements(n);forEach(["loadstart","loadend","progress","abort"],function(g){forEach([m,m.upload],function(E){E.addEventListener(g,function(O){triggerEvent(n,"htmx:xhr:"+g,{lengthComputable:O.lengthComputable,loaded:O.loaded,total:O.total});});});}),triggerEvent(n,"htmx:beforeSend",y);let ee=M?null:encodeParamsForBody(m,n,L);return m.send(ee),a}function determineHistoryUpdates(e,t){let n=t.xhr,r=null,o=null;if(hasHeader(n,/HX-Push:/i)?(r=n.getResponseHeader("HX-Push"),o="push"):hasHeader(n,/HX-Push-Url:/i)?(r=n.getResponseHeader("HX-Push-Url"),o="push"):hasHeader(n,/HX-Replace-Url:/i)&&(r=n.getResponseHeader("HX-Replace-Url"),o="replace"),r)return r==="false"?{}:{type:o,path:r};let i=t.pathInfo.finalRequestPath,s=t.pathInfo.responsePath,l=getClosestAttributeValue(e,"hx-push-url"),a=getClosestAttributeValue(e,"hx-replace-url"),u=getInternalData(e).boosted,d=null,c=null;return l?(d="push",c=l):a?(d="replace",c=a):u&&(d="push",c=s||i),c?c==="false"?{}:(c==="true"&&(c=s||i),t.pathInfo.anchor&&c.indexOf("#")===-1&&(c=c+"#"+t.pathInfo.anchor),{type:d,path:c}):{}}function codeMatches(e,t){var n=new RegExp(e.code);return n.test(t.toString(10))}function resolveResponseHandling(e){for(var t=0;t0?getWindow().setTimeout(I,x.swapDelay):I();}c&&triggerErrorEvent(e,"htmx:responseError",mergeObjects({error:"Response Status Error Code "+n.status+" from "+t.pathInfo.requestPath},t));}}let extensions={};function extensionBase(){return {init:function(e){return null},getSelectors:function(){return null},onEvent:function(e,t){return !0},transformResponse:function(e,t,n){return e},isInlineSwap:function(e){return !1},handleSwap:function(e,t,n,r){return !1},encodeParameters:function(e,t,n){return null}}}function defineExtension(e,t){t.init&&t.init(internalAPI),extensions[e]=mergeObjects(extensionBase(),t);}function removeExtension(e){delete extensions[e];}function getExtensions(e,t,n){if(t==null&&(t=[]),e==null)return t;n==null&&(n=[]);let r=getAttributeValue(e,"hx-ext");return r&&forEach(r.split(","),function(o){if(o=o.replace(/ /g,""),o.slice(0,7)=="ignore:"){n.push(o.slice(7));return}if(n.indexOf(o)<0){let i=extensions[o];i&&t.indexOf(i)<0&&t.push(i);}}),getExtensions(asElement(parentElt(e)),t,n)}var isReady=!1;getDocument().addEventListener("DOMContentLoaded",function(){isReady=!0;});function ready(e){isReady||getDocument().readyState==="complete"?e():getDocument().addEventListener("DOMContentLoaded",e);}function insertIndicatorStyles(){if(htmx.config.includeIndicatorStyles!==!1){let e=htmx.config.inlineStyleNonce?` nonce="${htmx.config.inlineStyleNonce}"`:"";getDocument().head.insertAdjacentHTML("beforeend"," ."+htmx.config.indicatorClass+"{opacity:0} ."+htmx.config.requestClass+" ."+htmx.config.indicatorClass+"{opacity:1; transition: opacity 200ms ease-in;} ."+htmx.config.requestClass+"."+htmx.config.indicatorClass+"{opacity:1; transition: opacity 200ms ease-in;} ");}}function getMetaConfig(){let e=getDocument().querySelector('meta[name="htmx-config"]');return e?parseJSON(e.content):null}function mergeMetaConfig(){let e=getMetaConfig();e&&(htmx.config=mergeObjects(htmx.config,e));}return ready(function(){mergeMetaConfig(),insertIndicatorStyles();let e=getDocument().body;processNode(e);let t=getDocument().querySelectorAll("[hx-trigger='restored'],[data-hx-trigger='restored']");e.addEventListener("htmx:abort",function(r){let o=r.target,i=getInternalData(o);i&&i.xhr&&i.xhr.abort();});let n=window.onpopstate?window.onpopstate.bind(window):null;window.onpopstate=function(r){r.state&&r.state.htmx?(restoreHistory(),forEach(t,function(o){triggerEvent(o,"htmx:restored",{document:getDocument(),triggerEvent});})):n&&n(r);},getWindow().setTimeout(function(){triggerEvent(e,"htmx:load",{}),e=null;},0);}),htmx}(),f=te;function ne(e,t){if(e==="ignore")return !1;let n=e.split("/"),r=t.split("/");for(let o=0;o{let s=oe(t).replace("htmx:","hx-on::");if(!r.has(o)){if(o.hasAttribute(s)){let l=se(s.replace("hx-on::","htmx:"),{...n.detail,target:o});l.detail.meta="trigger-children",o.dispatchEvent(l),r.add(o);}o.children&&$(o,t,n,r);}});}f.defineExtension("trigger-children",{onEvent:(e,t)=>{if(!(t instanceof CustomEvent)||t.detail.meta==="trigger-children")return !1;let n=new Set,r=t.target||t.detail.target;return $(r,e,t,n),!0}});f.defineExtension("debug",{onEvent:function(e,t){console.debug?console.debug(e,t):console&&console.log("DEBUG:",e,t);}});var C=f.config,U,ae="hx-target-";function Q(e,t){return e.substring(0,t.length)===t}function le(e,t){if(!e||!t)return null;let n=t.toString(),r=[n,n.substr(0,2)+"*",n.substr(0,2)+"x",n.substr(0,1)+"*",n.substr(0,1)+"x",n.substr(0,1)+"**",n.substr(0,1)+"xx","*","x","***","xxx"];(Q(n,"4")||Q(n,"5"))&&r.push("error");for(let o=0;o{U=e,C.responseTargetUnsetsError===void 0&&(C.responseTargetUnsetsError=!0),C.responseTargetSetsError===void 0&&(C.responseTargetSetsError=!1),C.responseTargetPrefersExisting===void 0&&(C.responseTargetPrefersExisting=!1),C.responseTargetPrefersRetargetHeader===void 0&&(C.responseTargetPrefersRetargetHeader=!0);},onEvent:(e,t)=>{if(!(t instanceof CustomEvent))return !1;if(e==="htmx:beforeSwap"&&t.detail.xhr&&t.detail.xhr.status!==200){if(t.detail.target&&(C.responseTargetPrefersExisting||C.responseTargetPrefersRetargetHeader&&t.detail.xhr.getAllResponseHeaders().match(/HX-Retarget:/i)))return t.detail.shouldSwap=!0,z(t),!0;if(!t.detail.requestConfig)return !0;let n=le(t.detail.requestConfig.elt,t.detail.xhr.status);return n&&(z(t),t.detail.shouldSwap=!0,t.detail.target=n),!0}}});f.defineExtension("mutation-error",{onEvent:(e,t)=>{if(!(t instanceof CustomEvent))return !1;if(e==="htmx:afterRequest"){if(!t.detail||!t.detail.xhr)return;let n=t.detail.xhr.status;n>=400&&f.findAll("[hx-on\\:\\:mutation-error]").forEach(r=>{f.trigger(r,"htmx:mutation-error",{status:n});});}}});var B="";f.defineExtension("livereload",{init:function(){let e=!1;for(let n of Array.from(f.findAll("[hx-ext]")))if(n.getAttribute("hx-ext")?.split(" ").includes("livereload")){e=!0;break}if(!e)return;console.log("livereload extension initialized.");let t=new EventSource("/dev/livereload");t.onmessage=function(n){let r=n.data;B===""&&(B=r),B!==r&&(B=r,ue());},t.onerror=function(n){console.error("EventSource error:",n);};},onEvent:function(e,t){}});function ue(){window.location.reload();}var ce=/__eval_[A-Za-z0-9]+\([a-z]+\)/gm;f.defineExtension("htmgo",{onEvent:function(e,t){e==="htmx:beforeCleanupElement"&&t.target&&J(t.target);}});function J(e){let t=Array.from(e.attributes);for(let n of t){let r=n.value.match(ce)||[];for(let o of r){let i=o.replace("()","").replace("(this)","").replace(";",""),s=document.getElementById(i);s&&s.tagName==="SCRIPT"&&(console.debug("removing associated script with id",i),s.remove());}}}var P=null,K=new Set;f.defineExtension("sse",{init:function(e){P=e;},onEvent:function(e,t){let n=t.target;if(n instanceof HTMLElement&&(e==="htmx:beforeCleanupElement"&&J(n),e==="htmx:beforeProcessNode")){let r=document.querySelectorAll("[sse-connect]");for(let o of Array.from(r)){let i=o.getAttribute("sse-connect");i&&!K.has(i)&&(fe(o,i),K.add(i));}}}});function fe(e,t){if(!t)return;console.info("Connecting to EventSource",t);let n=new EventSource(t);n.addEventListener("close",function(r){f.trigger(e,"htmx:sseClose",{event:r});}),n.onopen=function(r){f.trigger(e,"htmx:sseOpen",{event:r});},n.onerror=function(r){f.trigger(e,"htmx:sseError",{event:r}),n.readyState==EventSource.CLOSED&&f.trigger(e,"htmx:sseClose",{event:r});},n.onmessage=function(r){let o=P.makeSettleInfo(e);f.trigger(e,"htmx:sseBeforeMessage",{event:r});let i=r.data,s=P.makeFragment(i),l=Array.from(s.children);for(let a of l)P.oobSwap(P.getAttributeValue(a,"hx-swap-oob")||"true",a,o),a.tagName==="SCRIPT"&&a.id.startsWith("__eval")&&document.body.appendChild(a);f.trigger(e,"htmx:sseAfterMessage",{event:r});};}window.htmx=f;function de(e){let t=window.location.href;setInterval(()=>{window.location.href!==t&&(e(t,window.location.href),t=window.location.href);},100);}de((e,t)=>{he(t);});function he(e){let t=new URL(e);document.querySelectorAll("[hx-trigger]").forEach(function(n){let r=n.getAttribute("hx-trigger");if(!r)return;if(r.split(", ").find(i=>i==="url"))f.swap(n,"url",{swapStyle:"outerHTML",swapDelay:0,settleDelay:0});else for(let[i,s]of t.searchParams){let l="qs:"+i;if(r.includes(l)){console.log("triggering",l),f.trigger(n,l,null);break}}}),document.querySelectorAll("[hx-match-qp]").forEach(n=>{let r=!1;for(let o of n.getAttributeNames())if(o.startsWith("hx-match-qp-mapping:")){let i=o.replace("hx-match-qp-mapping:","");if(t.searchParams.get(i)){f.swap(n,n.getAttribute(o)??"",{swapStyle:"innerHTML",swapDelay:0,settleDelay:0}),r=!0;break}}if(!r){let o=n.getAttribute("hx-match-qp-default");o&&f.swap(n,n.getAttribute("hx-match-qp-mapping:"+o)??"",{swapStyle:"innerHTML",swapDelay:0,settleDelay:0});}});} +var te=function(){let htmx={onLoad:null,process:null,on:null,off:null,trigger:null,ajax:null,find:null,findAll:null,closest:null,values:function(e,t){return getInputValues(e,t||"post").values},remove:null,addClass:null,removeClass:null,toggleClass:null,takeClass:null,swap:null,defineExtension:null,removeExtension:null,logAll:null,logNone:null,logger:null,config:{historyEnabled:!0,historyCacheSize:10,refreshOnHistoryMiss:!1,defaultSwapStyle:"innerHTML",defaultSwapDelay:0,defaultSettleDelay:20,includeIndicatorStyles:!0,indicatorClass:"htmx-indicator",requestClass:"htmx-request",addedClass:"htmx-added",settlingClass:"htmx-settling",swappingClass:"htmx-swapping",allowEval:!0,allowScriptTags:!0,inlineScriptNonce:"",inlineStyleNonce:"",attributesToSettle:["class","style","width","height"],withCredentials:!1,timeout:0,wsReconnectDelay:"full-jitter",wsBinaryType:"blob",disableSelector:"[hx-disable], [data-hx-disable]",scrollBehavior:"instant",defaultFocusScroll:!1,getCacheBusterParam:!1,globalViewTransitions:!1,methodsThatUseUrlParams:["get","delete"],selfRequestsOnly:!0,ignoreTitle:!1,scrollIntoViewOnBoost:!0,triggerSpecsCache:null,disableInheritance:!1,responseHandling:[{code:"204",swap:!1},{code:"[23]..",swap:!0},{code:"[45]..",swap:!1,error:!0}],allowNestedOobSwaps:!0},parseInterval:null,_:null,version:"2.0.2"};htmx.onLoad=onLoadHelper,htmx.process=processNode,htmx.on=addEventListenerImpl,htmx.off=removeEventListenerImpl,htmx.trigger=triggerEvent,htmx.ajax=ajaxHelper,htmx.find=find,htmx.findAll=findAll,htmx.closest=closest,htmx.remove=removeElement,htmx.addClass=addClassToElement,htmx.removeClass=removeClassFromElement,htmx.toggleClass=toggleClassOnElement,htmx.takeClass=takeClassForElement,htmx.swap=swap,htmx.defineExtension=defineExtension,htmx.removeExtension=removeExtension,htmx.logAll=logAll,htmx.logNone=logNone,htmx.parseInterval=parseInterval,htmx._=internalEval;let internalAPI={addTriggerHandler,bodyContains,canAccessLocalStorage,findThisElement,filterValues,swap,hasAttribute,getAttributeValue,getClosestAttributeValue,getClosestMatch,getExpressionVars,getHeaders,getInputValues,getInternalData,getSwapSpecification,getTriggerSpecs,getTarget,makeFragment,mergeObjects,makeSettleInfo,oobSwap,querySelectorExt,settleImmediately,shouldCancel,triggerEvent,triggerErrorEvent,withExtensions},VERBS=["get","post","put","delete","patch"],VERB_SELECTOR=VERBS.map(function(e){return "[hx-"+e+"], [data-hx-"+e+"]"}).join(", "),HEAD_TAG_REGEX=makeTagRegEx("head");function makeTagRegEx(e,t=!1){return new RegExp(`<${e}(\\s[^>]*>|>)([\\s\\S]*?)<\\/${e}>`,t?"gim":"im")}function parseInterval(e){if(e==null)return;let t=NaN;return e.slice(-2)=="ms"?t=parseFloat(e.slice(0,-2)):e.slice(-1)=="s"?t=parseFloat(e.slice(0,-1))*1e3:e.slice(-1)=="m"?t=parseFloat(e.slice(0,-1))*1e3*60:t=parseFloat(e),isNaN(t)?void 0:t}function getRawAttribute(e,t){return e instanceof Element&&e.getAttribute(t)}function hasAttribute(e,t){return !!e.hasAttribute&&(e.hasAttribute(t)||e.hasAttribute("data-"+t))}function getAttributeValue(e,t){return getRawAttribute(e,t)||getRawAttribute(e,"data-"+t)}function parentElt(e){let t=e.parentElement;return !t&&e.parentNode instanceof ShadowRoot?e.parentNode:t}function getDocument(){return document}function getRootNode(e,t){return e.getRootNode?e.getRootNode({composed:t}):getDocument()}function getClosestMatch(e,t){for(;e&&!t(e);)e=parentElt(e);return e||null}function getAttributeValueWithDisinheritance(e,t,n){let r=getAttributeValue(t,n),o=getAttributeValue(t,"hx-disinherit");var i=getAttributeValue(t,"hx-inherit");if(e!==t){if(htmx.config.disableInheritance)return i&&(i==="*"||i.split(" ").indexOf(n)>=0)?r:null;if(o&&(o==="*"||o.split(" ").indexOf(n)>=0))return "unset"}return r}function getClosestAttributeValue(e,t){let n=null;if(getClosestMatch(e,function(r){return !!(n=getAttributeValueWithDisinheritance(e,asElement(r),t))}),n!=="unset")return n}function matches(e,t){let n=e instanceof Element&&(e.matches||e.matchesSelector||e.msMatchesSelector||e.mozMatchesSelector||e.webkitMatchesSelector||e.oMatchesSelector);return !!n&&n.call(e,t)}function getStartTag(e){let n=/<([a-z][^\/\0>\x20\t\r\n\f]*)/i.exec(e);return n?n[1].toLowerCase():""}function parseHTML(e){return new DOMParser().parseFromString(e,"text/html")}function takeChildrenFor(e,t){for(;t.childNodes.length>0;)e.append(t.childNodes[0]);}function duplicateScript(e){let t=getDocument().createElement("script");return forEach(e.attributes,function(n){t.setAttribute(n.name,n.value);}),t.textContent=e.textContent,t.async=!1,htmx.config.inlineScriptNonce&&(t.nonce=htmx.config.inlineScriptNonce),t}function isJavaScriptScriptNode(e){return e.matches("script")&&(e.type==="text/javascript"||e.type==="module"||e.type==="")}function normalizeScriptTags(e){Array.from(e.querySelectorAll("script")).forEach(t=>{if(isJavaScriptScriptNode(t)){let n=duplicateScript(t),r=t.parentNode;try{r.insertBefore(n,t);}catch(o){logError(o);}finally{t.remove();}}});}function makeFragment(e){let t=e.replace(HEAD_TAG_REGEX,""),n=getStartTag(t),r;if(n==="html"){r=new DocumentFragment;let i=parseHTML(e);takeChildrenFor(r,i.body),r.title=i.title;}else if(n==="body"){r=new DocumentFragment;let i=parseHTML(t);takeChildrenFor(r,i.body),r.title=i.title;}else {let i=parseHTML('");r=i.querySelector("template").content,r.title=i.title;var o=r.querySelector("title");o&&o.parentNode===r&&(o.remove(),r.title=o.innerText);}return r&&(htmx.config.allowScriptTags?normalizeScriptTags(r):r.querySelectorAll("script").forEach(i=>i.remove())),r}function maybeCall(e){e&&e();}function isType(e,t){return Object.prototype.toString.call(e)==="[object "+t+"]"}function isFunction(e){return typeof e=="function"}function isRawObject(e){return isType(e,"Object")}function getInternalData(e){let t="htmx-internal-data",n=e[t];return n||(n=e[t]={}),n}function toArray(e){let t=[];if(e)for(let n=0;n=0}function bodyContains(e){let t=e.getRootNode&&e.getRootNode();return t&&t instanceof window.ShadowRoot?getDocument().body.contains(t.host):getDocument().body.contains(e)}function splitOnWhitespace(e){return e.trim().split(/\s+/)}function mergeObjects(e,t){for(let n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);return e}function parseJSON(e){try{return JSON.parse(e)}catch(t){return logError(t),null}}function canAccessLocalStorage(){let e="htmx:localStorageTest";try{return localStorage.setItem(e,e),localStorage.removeItem(e),!0}catch{return !1}}function normalizePath(e){try{let t=new URL(e);return t&&(e=t.pathname+t.search),/^\/$/.test(e)||(e=e.replace(/\/+$/,"")),e}catch{return e}}function internalEval(str){return maybeEval(getDocument().body,function(){return eval(str)})}function onLoadHelper(e){return htmx.on("htmx:load",function(n){e(n.detail.elt);})}function logAll(){htmx.logger=function(e,t,n){console&&console.log(t,e,n);};}function logNone(){htmx.logger=null;}function find(e,t){return typeof e!="string"?e.querySelector(t):find(getDocument(),e)}function findAll(e,t){return typeof e!="string"?e.querySelectorAll(t):findAll(getDocument(),e)}function getWindow(){return window}function removeElement(e,t){e=resolveTarget(e),t?getWindow().setTimeout(function(){removeElement(e),e=null;},t):parentElt(e).removeChild(e);}function asElement(e){return e instanceof Element?e:null}function asHtmlElement(e){return e instanceof HTMLElement?e:null}function asString(e){return typeof e=="string"?e:null}function asParentNode(e){return e instanceof Element||e instanceof Document||e instanceof DocumentFragment?e:null}function addClassToElement(e,t,n){e=asElement(resolveTarget(e)),e&&(n?getWindow().setTimeout(function(){addClassToElement(e,t),e=null;},n):e.classList&&e.classList.add(t));}function removeClassFromElement(e,t,n){let r=asElement(resolveTarget(e));r&&(n?getWindow().setTimeout(function(){removeClassFromElement(r,t),r=null;},n):r.classList&&(r.classList.remove(t),r.classList.length===0&&r.removeAttribute("class")));}function toggleClassOnElement(e,t){e=resolveTarget(e),e.classList.toggle(t);}function takeClassForElement(e,t){e=resolveTarget(e),forEach(e.parentElement.children,function(n){removeClassFromElement(n,t);}),addClassToElement(asElement(e),t);}function closest(e,t){if(e=asElement(resolveTarget(e)),e&&e.closest)return e.closest(t);do if(e==null||matches(e,t))return e;while(e=e&&asElement(parentElt(e)));return null}function startsWith(e,t){return e.substring(0,t.length)===t}function endsWith(e,t){return e.substring(e.length-t.length)===t}function normalizeSelector(e){let t=e.trim();return startsWith(t,"<")&&endsWith(t,"/>")?t.substring(1,t.length-2):t}function querySelectorAllExt(e,t,n){return e=resolveTarget(e),t.indexOf("closest ")===0?[closest(asElement(e),normalizeSelector(t.substr(8)))]:t.indexOf("find ")===0?[find(asParentNode(e),normalizeSelector(t.substr(5)))]:t==="next"?[asElement(e).nextElementSibling]:t.indexOf("next ")===0?[scanForwardQuery(e,normalizeSelector(t.substr(5)),!!n)]:t==="previous"?[asElement(e).previousElementSibling]:t.indexOf("previous ")===0?[scanBackwardsQuery(e,normalizeSelector(t.substr(9)),!!n)]:t==="document"?[document]:t==="window"?[window]:t==="body"?[document.body]:t==="root"?[getRootNode(e,!!n)]:t.indexOf("global ")===0?querySelectorAllExt(e,t.slice(7),!0):toArray(asParentNode(getRootNode(e,!!n)).querySelectorAll(normalizeSelector(t)))}var scanForwardQuery=function(e,t,n){let r=asParentNode(getRootNode(e,n)).querySelectorAll(t);for(let o=0;o=0;o--){let i=r[o];if(i.compareDocumentPosition(e)===Node.DOCUMENT_POSITION_FOLLOWING)return i}};function querySelectorExt(e,t){return typeof e!="string"?querySelectorAllExt(e,t)[0]:querySelectorAllExt(getDocument().body,e)[0]}function resolveTarget(e,t){return typeof e=="string"?find(asParentNode(t)||document,e):e}function processEventArgs(e,t,n){return isFunction(t)?{target:getDocument().body,event:asString(e),listener:t}:{target:resolveTarget(e),event:asString(t),listener:n}}function addEventListenerImpl(e,t,n){return ready(function(){let o=processEventArgs(e,t,n);o.target.addEventListener(o.event,o.listener);}),isFunction(t)?t:n}function removeEventListenerImpl(e,t,n){return ready(function(){let r=processEventArgs(e,t,n);r.target.removeEventListener(r.event,r.listener);}),isFunction(t)?t:n}let DUMMY_ELT=getDocument().createElement("output");function findAttributeTargets(e,t){let n=getClosestAttributeValue(e,t);if(n){if(n==="this")return [findThisElement(e,t)];{let r=querySelectorAllExt(e,n);return r.length===0?(logError('The selector "'+n+'" on '+t+" returned no matches!"),[DUMMY_ELT]):r}}}function findThisElement(e,t){return asElement(getClosestMatch(e,function(n){return getAttributeValue(asElement(n),t)!=null}))}function getTarget(e){let t=getClosestAttributeValue(e,"hx-target");return t?t==="this"?findThisElement(e,"hx-target"):querySelectorExt(e,t):getInternalData(e).boosted?getDocument().body:e}function shouldSettleAttribute(e){let t=htmx.config.attributesToSettle;for(let n=0;n0?(o=e.substr(0,e.indexOf(":")),r=e.substr(e.indexOf(":")+1,e.length)):o=e);let i=getDocument().querySelectorAll(r);return i?(forEach(i,function(s){let l,a=t.cloneNode(!0);l=getDocument().createDocumentFragment(),l.appendChild(a),isInlineSwap(o,s)||(l=asParentNode(a));let u={shouldSwap:!0,target:s,fragment:l};triggerEvent(s,"htmx:oobBeforeSwap",u)&&(s=u.target,u.shouldSwap&&swapWithStyle(o,s,s,l,n),forEach(n.elts,function(d){triggerEvent(d,"htmx:oobAfterSwap",u);}));}),t.parentNode.removeChild(t)):(t.parentNode.removeChild(t),triggerErrorEvent(getDocument().body,"htmx:oobErrorNoTarget",{content:t})),e}function handlePreservedElements(e){forEach(findAll(e,"[hx-preserve], [data-hx-preserve]"),function(t){let n=getAttributeValue(t,"id"),r=getDocument().getElementById(n);r!=null&&t.parentNode.replaceChild(r,t);});}function handleAttributes(e,t,n){forEach(t.querySelectorAll("[id]"),function(r){let o=getRawAttribute(r,"id");if(o&&o.length>0){let i=o.replace("'","\\'"),s=r.tagName.replace(":","\\:"),l=asParentNode(e),a=l&&l.querySelector(s+"[id='"+i+"']");if(a&&a!==l){let u=r.cloneNode();cloneAttributes(r,a),n.tasks.push(function(){cloneAttributes(r,u);});}}});}function makeAjaxLoadTask(e){return function(){removeClassFromElement(e,htmx.config.addedClass),processNode(asElement(e)),processFocus(asParentNode(e)),triggerEvent(e,"htmx:load");}}function processFocus(e){let t="[autofocus]",n=asHtmlElement(matches(e,t)?e:e.querySelector(t));n?.focus();}function insertNodesBefore(e,t,n,r){for(handleAttributes(e,n,r);n.childNodes.length>0;){let o=n.firstChild;addClassToElement(asElement(o),htmx.config.addedClass),e.insertBefore(o,t),o.nodeType!==Node.TEXT_NODE&&o.nodeType!==Node.COMMENT_NODE&&r.tasks.push(makeAjaxLoadTask(o));}}function stringHash(e,t){let n=0;for(;n0}function swap(e,t,n,r){r||(r={}),e=resolveTarget(e);let o=document.activeElement,i={};try{i={elt:o,start:o?o.selectionStart:null,end:o?o.selectionEnd:null};}catch{}let s=makeSettleInfo(e);if(n.swapStyle==="textContent")e.textContent=t;else {let a=makeFragment(t);if(s.title=a.title,r.selectOOB){let u=r.selectOOB.split(",");for(let d=0;d0?getWindow().setTimeout(l,n.settleDelay):l();}function handleTriggerHeader(e,t,n){let r=e.getResponseHeader(t);if(r.indexOf("{")===0){let o=parseJSON(r);for(let i in o)if(o.hasOwnProperty(i)){let s=o[i];isRawObject(s)?n=s.target!==void 0?s.target:n:s={value:s},triggerEvent(n,i,s);}}else {let o=r.split(",");for(let i=0;i0;){let s=t[0];if(s==="]"){if(r--,r===0){i===null&&(o=o+"true"),t.shift(),o+=")})";try{let l=maybeEval(e,function(){return Function(o)()},function(){return !0});return l.source=o,l}catch(l){return triggerErrorEvent(getDocument().body,"htmx:syntax:error",{error:l,source:o}),null}}}else s==="["&&r++;isPossibleRelativeReference(s,i,n)?o+="(("+n+"."+s+") ? ("+n+"."+s+") : (window."+s+"))":o=o+s,i=t.shift();}}}function consumeUntil(e,t){let n="";for(;e.length>0&&!t.test(e[0]);)n+=e.shift();return n}function consumeCSSSelector(e){let t;return e.length>0&&COMBINED_SELECTOR_START.test(e[0])?(e.shift(),t=consumeUntil(e,COMBINED_SELECTOR_END).trim(),e.shift()):t=consumeUntil(e,WHITESPACE_OR_COMMA),t}let INPUT_SELECTOR="input, textarea, select";function parseAndCacheTrigger(e,t,n){let r=[],o=tokenizeString(t);do{consumeUntil(o,NOT_WHITESPACE);let l=o.length,a=consumeUntil(o,/[,\[\s]/);if(a!=="")if(a==="every"){let u={trigger:"every"};consumeUntil(o,NOT_WHITESPACE),u.pollInterval=parseInterval(consumeUntil(o,/[,\[\s]/)),consumeUntil(o,NOT_WHITESPACE);var i=maybeGenerateConditional(e,o,"event");i&&(u.eventFilter=i),r.push(u);}else {let u={trigger:a};var i=maybeGenerateConditional(e,o,"event");for(i&&(u.eventFilter=i);o.length>0&&o[0]!==",";){consumeUntil(o,NOT_WHITESPACE);let c=o.shift();if(c==="changed")u.changed=!0;else if(c==="once")u.once=!0;else if(c==="consume")u.consume=!0;else if(c==="delay"&&o[0]===":")o.shift(),u.delay=parseInterval(consumeUntil(o,WHITESPACE_OR_COMMA));else if(c==="from"&&o[0]===":"){if(o.shift(),COMBINED_SELECTOR_START.test(o[0]))var s=consumeCSSSelector(o);else {var s=consumeUntil(o,WHITESPACE_OR_COMMA);if(s==="closest"||s==="find"||s==="next"||s==="previous"){o.shift();let b=consumeCSSSelector(o);b.length>0&&(s+=" "+b);}}u.from=s;}else c==="target"&&o[0]===":"?(o.shift(),u.target=consumeCSSSelector(o)):c==="throttle"&&o[0]===":"?(o.shift(),u.throttle=parseInterval(consumeUntil(o,WHITESPACE_OR_COMMA))):c==="queue"&&o[0]===":"?(o.shift(),u.queue=consumeUntil(o,WHITESPACE_OR_COMMA)):c==="root"&&o[0]===":"?(o.shift(),u[c]=consumeCSSSelector(o)):c==="threshold"&&o[0]===":"?(o.shift(),u[c]=consumeUntil(o,WHITESPACE_OR_COMMA)):triggerErrorEvent(e,"htmx:syntax:error",{token:o.shift()});}r.push(u);}o.length===l&&triggerErrorEvent(e,"htmx:syntax:error",{token:o.shift()}),consumeUntil(o,NOT_WHITESPACE);}while(o[0]===","&&o.shift());return n&&(n[t]=r),r}function getTriggerSpecs(e){let t=getAttributeValue(e,"hx-trigger"),n=[];if(t){let r=htmx.config.triggerSpecsCache;n=r&&r[t]||parseAndCacheTrigger(e,t,r);}return n.length>0?n:matches(e,"form")?[{trigger:"submit"}]:matches(e,'input[type="button"], input[type="submit"]')?[{trigger:"click"}]:matches(e,INPUT_SELECTOR)?[{trigger:"change"}]:[{trigger:"click"}]}function cancelPolling(e){getInternalData(e).cancelled=!0;}function processPolling(e,t,n){let r=getInternalData(e);r.timeout=getWindow().setTimeout(function(){bodyContains(e)&&r.cancelled!==!0&&(maybeFilterEvent(n,e,makeEvent("hx:poll:trigger",{triggerSpec:n,target:e}))||t(e),processPolling(e,t,n));},n.pollInterval);}function isLocalLink(e){return location.hostname===e.hostname&&getRawAttribute(e,"href")&&getRawAttribute(e,"href").indexOf("#")!==0}function eltIsDisabled(e){return closest(e,htmx.config.disableSelector)}function boostElement(e,t,n){if(e instanceof HTMLAnchorElement&&isLocalLink(e)&&(e.target===""||e.target==="_self")||e.tagName==="FORM"&&String(getRawAttribute(e,"method")).toLowerCase()!=="dialog"){t.boosted=!0;let r,o;if(e.tagName==="A")r="get",o=getRawAttribute(e,"href");else {let i=getRawAttribute(e,"method");r=i?i.toLowerCase():"get",o=getRawAttribute(e,"action");}n.forEach(function(i){addEventListener(e,function(s,l){let a=asElement(s);if(eltIsDisabled(a)){cleanUpElement(a);return}issueAjaxRequest(r,o,a,l);},t,i,!0);});}}function shouldCancel(e,t){let n=asElement(t);return n?!!((e.type==="submit"||e.type==="click")&&(n.tagName==="FORM"||matches(n,'input[type="submit"], button')&&closest(n,"form")!==null||n instanceof HTMLAnchorElement&&n.href&&(n.getAttribute("href")==="#"||n.getAttribute("href").indexOf("#")!==0))):!1}function ignoreBoostedAnchorCtrlClick(e,t){return getInternalData(e).boosted&&e instanceof HTMLAnchorElement&&t.type==="click"&&(t.ctrlKey||t.metaKey)}function maybeFilterEvent(e,t,n){let r=e.eventFilter;if(r)try{return r.call(t,n)!==!0}catch(o){let i=r.source;return triggerErrorEvent(getDocument().body,"htmx:eventFilter:error",{error:o,source:i}),!0}return !1}function addEventListener(e,t,n,r,o){let i=getInternalData(e),s;r.from?s=querySelectorAllExt(e,r.from):s=[e],r.changed&&s.forEach(function(l){let a=getInternalData(l);a.lastValue=l.value;}),forEach(s,function(l){let a=function(u){if(!bodyContains(e)){l.removeEventListener(r.trigger,a);return}if(ignoreBoostedAnchorCtrlClick(e,u)||((o||shouldCancel(u,e))&&u.preventDefault(),maybeFilterEvent(r,e,u)))return;let d=getInternalData(u);if(d.triggerSpec=r,d.handledFor==null&&(d.handledFor=[]),d.handledFor.indexOf(e)<0){if(d.handledFor.push(e),r.consume&&u.stopPropagation(),r.target&&u.target&&!matches(asElement(u.target),r.target))return;if(r.once){if(i.triggeredOnce)return;i.triggeredOnce=!0;}if(r.changed){let c=getInternalData(l),h=l.value;if(c.lastValue===h)return;c.lastValue=h;}if(i.delayed&&clearTimeout(i.delayed),i.throttle)return;r.throttle>0?i.throttle||(triggerEvent(e,"htmx:trigger"),t(e,u),i.throttle=getWindow().setTimeout(function(){i.throttle=null;},r.throttle)):r.delay>0?i.delayed=getWindow().setTimeout(function(){triggerEvent(e,"htmx:trigger"),t(e,u);},r.delay):(triggerEvent(e,"htmx:trigger"),t(e,u));}};n.listenerInfos==null&&(n.listenerInfos=[]),n.listenerInfos.push({trigger:r.trigger,listener:a,on:l}),l.addEventListener(r.trigger,a);});}let windowIsScrolling=!1,scrollHandler=null;function initScrollHandler(){scrollHandler||(scrollHandler=function(){windowIsScrolling=!0;},window.addEventListener("scroll",scrollHandler),setInterval(function(){windowIsScrolling&&(windowIsScrolling=!1,forEach(getDocument().querySelectorAll("[hx-trigger*='revealed'],[data-hx-trigger*='revealed']"),function(e){maybeReveal(e);}));},200));}function maybeReveal(e){!hasAttribute(e,"data-hx-revealed")&&isScrolledIntoView(e)&&(e.setAttribute("data-hx-revealed","true"),getInternalData(e).initHash?triggerEvent(e,"revealed"):e.addEventListener("htmx:afterProcessNode",function(){triggerEvent(e,"revealed");},{once:!0}));}function loadImmediately(e,t,n,r){let o=function(){n.loaded||(n.loaded=!0,t(e));};r>0?getWindow().setTimeout(o,r):o();}function processVerbs(e,t,n){let r=!1;return forEach(VERBS,function(o){if(hasAttribute(e,"hx-"+o)){let i=getAttributeValue(e,"hx-"+o);r=!0,t.path=i,t.verb=o,n.forEach(function(s){addTriggerHandler(e,s,t,function(l,a){let u=asElement(l);if(closest(u,htmx.config.disableSelector)){cleanUpElement(u);return}issueAjaxRequest(o,i,u,a);});});}}),r}function addTriggerHandler(e,t,n,r){if(t.trigger==="revealed")initScrollHandler(),addEventListener(e,r,n,t),maybeReveal(asElement(e));else if(t.trigger==="intersect"){let o={};t.root&&(o.root=querySelectorExt(e,t.root)),t.threshold&&(o.threshold=parseFloat(t.threshold)),new IntersectionObserver(function(s){for(let l=0;l0?(n.polling=!0,processPolling(asElement(e),r,t)):addEventListener(e,r,n,t);}function shouldProcessHxOn(e){let t=asElement(e);if(!t)return !1;let n=t.attributes;for(let r=0;r", "+i).join(""))}else return []}function maybeSetLastButtonClicked(e){let t=closest(asElement(e.target),"button, input[type='submit']"),n=getRelatedFormData(e);n&&(n.lastButtonClicked=t);}function maybeUnsetLastButtonClicked(e){let t=getRelatedFormData(e);t&&(t.lastButtonClicked=null);}function getRelatedFormData(e){let t=closest(asElement(e.target),"button, input[type='submit']");if(!t)return;let n=resolveTarget("#"+getRawAttribute(t,"form"),t.getRootNode())||closest(t,"form");if(n)return getInternalData(n)}function initButtonTracking(e){e.addEventListener("click",maybeSetLastButtonClicked),e.addEventListener("focusin",maybeSetLastButtonClicked),e.addEventListener("focusout",maybeUnsetLastButtonClicked);}function addHxOnEventHandler(e,t,n){let r=getInternalData(e);Array.isArray(r.onHandlers)||(r.onHandlers=[]);let o,i=function(s){maybeEval(e,function(){eltIsDisabled(e)||(o||(o=new Function("event",n)),o.call(e,s));});};e.addEventListener(t,i),r.onHandlers.push({event:t,listener:i});}function processHxOnWildcard(e){deInitOnHandlers(e);for(let t=0;thtmx.config.historyCacheSize;)i.shift();for(;i.length>0;)try{localStorage.setItem("htmx-history-cache",JSON.stringify(i));break}catch(l){triggerErrorEvent(getDocument().body,"htmx:historyCacheError",{cause:l,cache:i}),i.shift();}}function getCachedHistory(e){if(!canAccessLocalStorage())return null;e=normalizePath(e);let t=parseJSON(localStorage.getItem("htmx-history-cache"))||[];for(let n=0;n=200&&this.status<400){triggerEvent(getDocument().body,"htmx:historyCacheMissLoad",n);let r=makeFragment(this.response),o=r.querySelector("[hx-history-elt],[data-hx-history-elt]")||r,i=getHistoryElement(),s=makeSettleInfo(i);handleTitle(r.title),swapInnerHTML(i,o,s),settleImmediately(s.tasks),currentPathForHistory=e,triggerEvent(getDocument().body,"htmx:historyRestore",{path:e,cacheMiss:!0,serverResponse:this.response});}else triggerErrorEvent(getDocument().body,"htmx:historyCacheMissLoadError",n);},t.send();}function restoreHistory(e){saveCurrentPageToHistory(),e=e||location.pathname+location.search;let t=getCachedHistory(e);if(t){let n=makeFragment(t.content),r=getHistoryElement(),o=makeSettleInfo(r);handleTitle(n.title),swapInnerHTML(r,n,o),settleImmediately(o.tasks),getWindow().setTimeout(function(){window.scrollTo(0,t.scroll);},0),currentPathForHistory=e,triggerEvent(getDocument().body,"htmx:historyRestore",{path:e,item:t});}else htmx.config.refreshOnHistoryMiss?window.location.reload(!0):loadHistoryFromServer(e);}function addRequestIndicatorClasses(e){let t=findAttributeTargets(e,"hx-indicator");return t==null&&(t=[e]),forEach(t,function(n){let r=getInternalData(n);r.requestCount=(r.requestCount||0)+1,n.classList.add.call(n.classList,htmx.config.requestClass);}),t}function disableElements(e){let t=findAttributeTargets(e,"hx-disabled-elt");return t==null&&(t=[]),forEach(t,function(n){let r=getInternalData(n);r.requestCount=(r.requestCount||0)+1,n.setAttribute("disabled",""),n.setAttribute("data-disabled-by-htmx","");}),t}function removeRequestIndicators(e,t){forEach(e,function(n){let r=getInternalData(n);r.requestCount=(r.requestCount||0)-1,r.requestCount===0&&n.classList.remove.call(n.classList,htmx.config.requestClass);}),forEach(t,function(n){let r=getInternalData(n);r.requestCount=(r.requestCount||0)-1,r.requestCount===0&&(n.removeAttribute("disabled"),n.removeAttribute("data-disabled-by-htmx"));});}function haveSeenNode(e,t){for(let n=0;nt.indexOf(o)<0):r=r.filter(o=>o!==t),n.delete(e),forEach(r,o=>n.append(e,o));}}function processInputValue(e,t,n,r,o){if(!(r==null||haveSeenNode(e,r))){if(e.push(r),shouldInclude(r)){let i=getRawAttribute(r,"name"),s=r.value;r instanceof HTMLSelectElement&&r.multiple&&(s=toArray(r.querySelectorAll("option:checked")).map(function(l){return l.value})),r instanceof HTMLInputElement&&r.files&&(s=toArray(r.files)),addValueToFormData(i,s,t),o&&validateElement(r,n);}r instanceof HTMLFormElement&&(forEach(r.elements,function(i){e.indexOf(i)>=0?removeValueFromFormData(i.name,i.value,t):e.push(i),o&&validateElement(i,n);}),new FormData(r).forEach(function(i,s){i instanceof File&&i.name===""||addValueToFormData(s,i,t);}));}}function validateElement(e,t){let n=e;n.willValidate&&(triggerEvent(n,"htmx:validation:validate"),n.checkValidity()||(t.push({elt:n,message:n.validationMessage,validity:n.validity}),triggerEvent(n,"htmx:validation:failed",{message:n.validationMessage,validity:n.validity})));}function overrideFormData(e,t){for(let n of t.keys())e.delete(n);return t.forEach(function(n,r){e.append(r,n);}),e}function getInputValues(e,t){let n=[],r=new FormData,o=new FormData,i=[],s=getInternalData(e);s.lastButtonClicked&&!bodyContains(s.lastButtonClicked)&&(s.lastButtonClicked=null);let l=e instanceof HTMLFormElement&&e.noValidate!==!0||getAttributeValue(e,"hx-validate")==="true";if(s.lastButtonClicked&&(l=l&&s.lastButtonClicked.formNoValidate!==!0),t!=="get"&&processInputValue(n,o,i,closest(e,"form"),l),processInputValue(n,r,i,e,l),s.lastButtonClicked||e.tagName==="BUTTON"||e.tagName==="INPUT"&&getRawAttribute(e,"type")==="submit"){let u=s.lastButtonClicked||e,d=getRawAttribute(u,"name");addValueToFormData(d,u.value,o);}let a=findAttributeTargets(e,"hx-include");return forEach(a,function(u){processInputValue(n,r,i,asElement(u),l),matches(u,"form")||forEach(asParentNode(u).querySelectorAll(INPUT_SELECTOR),function(d){processInputValue(n,r,i,d,l);});}),overrideFormData(r,o),{errors:i,formData:r,values:formDataProxy(r)}}function appendParam(e,t,n){e!==""&&(e+="&"),String(n)==="[object Object]"&&(n=JSON.stringify(n));let r=encodeURIComponent(n);return e+=encodeURIComponent(t)+"="+r,e}function urlEncode(e){e=formDataFromObject(e);let t="";return e.forEach(function(n,r){t=appendParam(t,r,n);}),t}function getHeaders(e,t,n){let r={"HX-Request":"true","HX-Trigger":getRawAttribute(e,"id"),"HX-Trigger-Name":getRawAttribute(e,"name"),"HX-Target":getAttributeValue(t,"id"),"HX-Current-URL":getDocument().location.href};return getValuesForElement(e,"hx-headers",!1,r),n!==void 0&&(r["HX-Prompt"]=n),getInternalData(e).boosted&&(r["HX-Boosted"]="true"),r}function filterValues(e,t){let n=getClosestAttributeValue(t,"hx-params");if(n){if(n==="none")return new FormData;if(n==="*")return e;if(n.indexOf("not ")===0)return forEach(n.substr(4).split(","),function(r){r=r.trim(),e.delete(r);}),e;{let r=new FormData;return forEach(n.split(","),function(o){o=o.trim(),e.has(o)&&e.getAll(o).forEach(function(i){r.append(o,i);});}),r}}else return e}function isAnchorLink(e){return !!getRawAttribute(e,"href")&&getRawAttribute(e,"href").indexOf("#")>=0}function getSwapSpecification(e,t){let n=t||getClosestAttributeValue(e,"hx-swap"),r={swapStyle:getInternalData(e).boosted?"innerHTML":htmx.config.defaultSwapStyle,swapDelay:htmx.config.defaultSwapDelay,settleDelay:htmx.config.defaultSettleDelay};if(htmx.config.scrollIntoViewOnBoost&&getInternalData(e).boosted&&!isAnchorLink(e)&&(r.show="top"),n){let s=splitOnWhitespace(n);if(s.length>0)for(let l=0;l0?o.join(":"):null;r.scroll=d,r.scrollTarget=i;}else if(a.indexOf("show:")===0){var o=a.substr(5).split(":");let c=o.pop();var i=o.length>0?o.join(":"):null;r.show=c,r.showTarget=i;}else if(a.indexOf("focus-scroll:")===0){let u=a.substr(13);r.focusScroll=u=="true";}else l==0?r.swapStyle=a:logError("Unknown modifier in hx-swap: "+a);}}return r}function usesFormData(e){return getClosestAttributeValue(e,"hx-encoding")==="multipart/form-data"||matches(e,"form")&&getRawAttribute(e,"enctype")==="multipart/form-data"}function encodeParamsForBody(e,t,n){let r=null;return withExtensions(t,function(o){r==null&&(r=o.encodeParameters(e,n,t));}),r??(usesFormData(t)?overrideFormData(new FormData,formDataFromObject(n)):urlEncode(n))}function makeSettleInfo(e){return {tasks:[],elts:[e]}}function updateScrollState(e,t){let n=e[0],r=e[e.length-1];if(t.scroll){var o=null;t.scrollTarget&&(o=asElement(querySelectorExt(n,t.scrollTarget))),t.scroll==="top"&&(n||o)&&(o=o||n,o.scrollTop=0),t.scroll==="bottom"&&(r||o)&&(o=o||r,o.scrollTop=o.scrollHeight);}if(t.show){var o=null;if(t.showTarget){let s=t.showTarget;t.showTarget==="window"&&(s="body"),o=asElement(querySelectorExt(n,s));}t.show==="top"&&(n||o)&&(o=o||n,o.scrollIntoView({block:"start",behavior:htmx.config.scrollBehavior})),t.show==="bottom"&&(r||o)&&(o=o||r,o.scrollIntoView({block:"end",behavior:htmx.config.scrollBehavior}));}}function getValuesForElement(e,t,n,r){if(r==null&&(r={}),e==null)return r;let o=getAttributeValue(e,t);if(o){let i=o.trim(),s=n;if(i==="unset")return null;i.indexOf("javascript:")===0?(i=i.substr(11),s=!0):i.indexOf("js:")===0&&(i=i.substr(3),s=!0),i.indexOf("{")!==0&&(i="{"+i+"}");let l;s?l=maybeEval(e,function(){return Function("return ("+i+")")()},{}):l=parseJSON(i);for(let a in l)l.hasOwnProperty(a)&&r[a]==null&&(r[a]=l[a]);}return getValuesForElement(asElement(parentElt(e)),t,n,r)}function maybeEval(e,t,n){return htmx.config.allowEval?t():(triggerErrorEvent(e,"htmx:evalDisallowedError"),n)}function getHXVarsForElement(e,t){return getValuesForElement(e,"hx-vars",!0,t)}function getHXValsForElement(e,t){return getValuesForElement(e,"hx-vals",!1,t)}function getExpressionVars(e){return mergeObjects(getHXVarsForElement(e),getHXValsForElement(e))}function safelySetHeaderValue(e,t,n){if(n!==null)try{e.setRequestHeader(t,n);}catch{e.setRequestHeader(t,encodeURIComponent(n)),e.setRequestHeader(t+"-URI-AutoEncoded","true");}}function getPathFromResponse(e){if(e.responseURL&&typeof URL<"u")try{let t=new URL(e.responseURL);return t.pathname+t.search}catch{triggerErrorEvent(getDocument().body,"htmx:badResponseUrl",{url:e.responseURL});}}function hasHeader(e,t){return t.test(e.getAllResponseHeaders())}function ajaxHelper(e,t,n){return e=e.toLowerCase(),n?n instanceof Element||typeof n=="string"?issueAjaxRequest(e,t,null,null,{targetOverride:resolveTarget(n),returnPromise:!0}):issueAjaxRequest(e,t,resolveTarget(n.source),n.event,{handler:n.handler,headers:n.headers,values:n.values,targetOverride:resolveTarget(n.target),swapOverride:n.swap,select:n.select,returnPromise:!0}):issueAjaxRequest(e,t,null,null,{returnPromise:!0})}function hierarchyForElt(e){let t=[];for(;e;)t.push(e),e=e.parentElement;return t}function verifyPath(e,t,n){let r,o;return typeof URL=="function"?(o=new URL(t,document.location.href),r=document.location.origin===o.origin):(o=t,r=startsWith(t,document.location.origin)),htmx.config.selfRequestsOnly&&!r?!1:triggerEvent(e,"htmx:validateUrl",mergeObjects({url:o,sameHost:r},n))}function formDataFromObject(e){if(e instanceof FormData)return e;let t=new FormData;for(let n in e)e.hasOwnProperty(n)&&(typeof e[n].forEach=="function"?e[n].forEach(function(r){t.append(n,r);}):typeof e[n]=="object"&&!(e[n]instanceof Blob)?t.append(n,JSON.stringify(e[n])):t.append(n,e[n]));return t}function formDataArrayProxy(e,t,n){return new Proxy(n,{get:function(r,o){return typeof o=="number"?r[o]:o==="length"?r.length:o==="push"?function(i){r.push(i),e.append(t,i);}:typeof r[o]=="function"?function(){r[o].apply(r,arguments),e.delete(t),r.forEach(function(i){e.append(t,i);});}:r[o]&&r[o].length===1?r[o][0]:r[o]},set:function(r,o,i){return r[o]=i,e.delete(t),r.forEach(function(s){e.append(t,s);}),!0}})}function formDataProxy(e){return new Proxy(e,{get:function(t,n){if(typeof n=="symbol")return Reflect.get(t,n);if(n==="toJSON")return ()=>Object.fromEntries(e);if(n in t)return typeof t[n]=="function"?function(){return e[n].apply(e,arguments)}:t[n];let r=e.getAll(n);if(r.length!==0)return r.length===1?r[0]:formDataArrayProxy(t,n,r)},set:function(t,n,r){return typeof n!="string"?!1:(t.delete(n),typeof r.forEach=="function"?r.forEach(function(o){t.append(n,o);}):typeof r=="object"&&!(r instanceof Blob)?t.append(n,JSON.stringify(r)):t.append(n,r),!0)},deleteProperty:function(t,n){return typeof n=="string"&&t.delete(n),!0},ownKeys:function(t){return Reflect.ownKeys(Object.fromEntries(t))},getOwnPropertyDescriptor:function(t,n){return Reflect.getOwnPropertyDescriptor(Object.fromEntries(t),n)}})}function issueAjaxRequest(e,t,n,r,o,i){let s=null,l=null;if(o=o??{},o.returnPromise&&typeof Promise<"u")var a=new Promise(function(g,E){s=g,l=E;});n==null&&(n=getDocument().body);let u=o.handler||handleAjaxResponse,d=o.select||null;if(!bodyContains(n))return maybeCall(s),a;let c=o.targetOverride||asElement(getTarget(n));if(c==null||c==DUMMY_ELT)return triggerErrorEvent(n,"htmx:targetError",{target:getAttributeValue(n,"hx-target")}),maybeCall(l),a;let h=getInternalData(n),b=h.lastButtonClicked;if(b){let g=getRawAttribute(b,"formaction");g!=null&&(t=g);let E=getRawAttribute(b,"formmethod");E!=null&&E.toLowerCase()!=="dialog"&&(e=E);}let S=getClosestAttributeValue(n,"hx-confirm");if(i===void 0&&triggerEvent(n,"htmx:confirm",{target:c,elt:n,path:t,verb:e,triggeringEvent:r,etc:o,issueRequest:function(O){return issueAjaxRequest(e,t,n,r,o,!!O)},question:S})===!1)return maybeCall(s),a;let A=n,p=getClosestAttributeValue(n,"hx-sync"),x=null,T=!1;if(p){let g=p.split(":"),E=g[0].trim();if(E==="this"?A=findThisElement(n,"hx-sync"):A=asElement(querySelectorExt(n,E)),p=(g[1]||"drop").trim(),h=getInternalData(A),p==="drop"&&h.xhr&&h.abortable!==!0)return maybeCall(s),a;if(p==="abort"){if(h.xhr)return maybeCall(s),a;T=!0;}else p==="replace"?triggerEvent(A,"htmx:abort"):p.indexOf("queue")===0&&(x=(p.split(" ")[1]||"last").trim());}if(h.xhr)if(h.abortable)triggerEvent(A,"htmx:abort");else {if(x==null){if(r){let g=getInternalData(r);g&&g.triggerSpec&&g.triggerSpec.queue&&(x=g.triggerSpec.queue);}x==null&&(x="last");}return h.queuedRequests==null&&(h.queuedRequests=[]),x==="first"&&h.queuedRequests.length===0?h.queuedRequests.push(function(){issueAjaxRequest(e,t,n,r,o);}):x==="all"?h.queuedRequests.push(function(){issueAjaxRequest(e,t,n,r,o);}):x==="last"&&(h.queuedRequests=[],h.queuedRequests.push(function(){issueAjaxRequest(e,t,n,r,o);})),maybeCall(s),a}let m=new XMLHttpRequest;h.xhr=m,h.abortable=T;let H=function(){h.xhr=null,h.abortable=!1,h.queuedRequests!=null&&h.queuedRequests.length>0&&h.queuedRequests.shift()();},N=getClosestAttributeValue(n,"hx-prompt");if(N){var I=prompt(N);if(I===null||!triggerEvent(n,"htmx:prompt",{prompt:I,target:c}))return maybeCall(s),H(),a}if(S&&!i&&!confirm(S))return maybeCall(s),H(),a;let R=getHeaders(n,c,I);e!=="get"&&!usesFormData(n)&&(R["Content-Type"]="application/x-www-form-urlencoded"),o.headers&&(R=mergeObjects(R,o.headers));let v=getInputValues(n,e),q=v.errors,F=v.formData;o.values&&overrideFormData(F,formDataFromObject(o.values));let _=formDataFromObject(getExpressionVars(n)),W=overrideFormData(F,_),L=filterValues(W,n);htmx.config.getCacheBusterParam&&e==="get"&&L.set("org.htmx.cache-buster",getRawAttribute(c,"id")||"true"),(t==null||t==="")&&(t=getDocument().location.href);let X=getValuesForElement(n,"hx-request"),Y=getInternalData(n).boosted,M=htmx.config.methodsThatUseUrlParams.indexOf(e)>=0,w={boosted:Y,useUrlParams:M,formData:L,parameters:formDataProxy(L),unfilteredFormData:W,unfilteredParameters:formDataProxy(W),headers:R,target:c,verb:e,errors:q,withCredentials:o.credentials||X.credentials||htmx.config.withCredentials,timeout:o.timeout||X.timeout||htmx.config.timeout,path:t,triggeringEvent:r};if(!triggerEvent(n,"htmx:configRequest",w))return maybeCall(s),H(),a;if(t=w.path,e=w.verb,R=w.headers,L=formDataFromObject(w.parameters),q=w.errors,M=w.useUrlParams,q&&q.length>0)return triggerEvent(n,"htmx:validation:halted",w),maybeCall(s),H(),a;let G=t.split("#"),Z=G[0],j=G[1],D=t;if(M&&(D=Z,!L.keys().next().done&&(D.indexOf("?")<0?D+="?":D+="&",D+=urlEncode(L),j&&(D+="#"+j))),!verifyPath(n,D,w))return triggerErrorEvent(n,"htmx:invalidPath",w),maybeCall(l),a;if(m.open(e.toUpperCase(),D,!0),m.overrideMimeType("text/html"),m.withCredentials=w.withCredentials,m.timeout=w.timeout,!X.noHeaders){for(let g in R)if(R.hasOwnProperty(g)){let E=R[g];safelySetHeaderValue(m,g,E);}}let y={xhr:m,target:c,requestConfig:w,etc:o,boosted:Y,select:d,pathInfo:{requestPath:t,finalRequestPath:D,responsePath:null,anchor:j}};if(m.onload=function(){try{let g=hierarchyForElt(n);if(y.pathInfo.responsePath=getPathFromResponse(m),u(n,y),y.keepIndicators!==!0&&removeRequestIndicators(V,k),triggerEvent(n,"htmx:afterRequest",y),triggerEvent(n,"htmx:afterOnLoad",y),!bodyContains(n)){let E=null;for(;g.length>0&&E==null;){let O=g.shift();bodyContains(O)&&(E=O);}E&&(triggerEvent(E,"htmx:afterRequest",y),triggerEvent(E,"htmx:afterOnLoad",y));}maybeCall(s),H();}catch(g){throw triggerErrorEvent(n,"htmx:onLoadError",mergeObjects({error:g},y)),g}},m.onerror=function(){removeRequestIndicators(V,k),triggerErrorEvent(n,"htmx:afterRequest",y),triggerErrorEvent(n,"htmx:sendError",y),maybeCall(l),H();},m.onabort=function(){removeRequestIndicators(V,k),triggerErrorEvent(n,"htmx:afterRequest",y),triggerErrorEvent(n,"htmx:sendAbort",y),maybeCall(l),H();},m.ontimeout=function(){removeRequestIndicators(V,k),triggerErrorEvent(n,"htmx:afterRequest",y),triggerErrorEvent(n,"htmx:timeout",y),maybeCall(l),H();},!triggerEvent(n,"htmx:beforeRequest",y))return maybeCall(s),H(),a;var V=addRequestIndicatorClasses(n),k=disableElements(n);forEach(["loadstart","loadend","progress","abort"],function(g){forEach([m,m.upload],function(E){E.addEventListener(g,function(O){triggerEvent(n,"htmx:xhr:"+g,{lengthComputable:O.lengthComputable,loaded:O.loaded,total:O.total});});});}),triggerEvent(n,"htmx:beforeSend",y);let ee=M?null:encodeParamsForBody(m,n,L);return m.send(ee),a}function determineHistoryUpdates(e,t){let n=t.xhr,r=null,o=null;if(hasHeader(n,/HX-Push:/i)?(r=n.getResponseHeader("HX-Push"),o="push"):hasHeader(n,/HX-Push-Url:/i)?(r=n.getResponseHeader("HX-Push-Url"),o="push"):hasHeader(n,/HX-Replace-Url:/i)&&(r=n.getResponseHeader("HX-Replace-Url"),o="replace"),r)return r==="false"?{}:{type:o,path:r};let i=t.pathInfo.finalRequestPath,s=t.pathInfo.responsePath,l=getClosestAttributeValue(e,"hx-push-url"),a=getClosestAttributeValue(e,"hx-replace-url"),u=getInternalData(e).boosted,d=null,c=null;return l?(d="push",c=l):a?(d="replace",c=a):u&&(d="push",c=s||i),c?c==="false"?{}:(c==="true"&&(c=s||i),t.pathInfo.anchor&&c.indexOf("#")===-1&&(c=c+"#"+t.pathInfo.anchor),{type:d,path:c}):{}}function codeMatches(e,t){var n=new RegExp(e.code);return n.test(t.toString(10))}function resolveResponseHandling(e){for(var t=0;t0?getWindow().setTimeout(I,x.swapDelay):I();}c&&triggerErrorEvent(e,"htmx:responseError",mergeObjects({error:"Response Status Error Code "+n.status+" from "+t.pathInfo.requestPath},t));}}let extensions={};function extensionBase(){return {init:function(e){return null},getSelectors:function(){return null},onEvent:function(e,t){return !0},transformResponse:function(e,t,n){return e},isInlineSwap:function(e){return !1},handleSwap:function(e,t,n,r){return !1},encodeParameters:function(e,t,n){return null}}}function defineExtension(e,t){t.init&&t.init(internalAPI),extensions[e]=mergeObjects(extensionBase(),t);}function removeExtension(e){delete extensions[e];}function getExtensions(e,t,n){if(t==null&&(t=[]),e==null)return t;n==null&&(n=[]);let r=getAttributeValue(e,"hx-ext");return r&&forEach(r.split(","),function(o){if(o=o.replace(/ /g,""),o.slice(0,7)=="ignore:"){n.push(o.slice(7));return}if(n.indexOf(o)<0){let i=extensions[o];i&&t.indexOf(i)<0&&t.push(i);}}),getExtensions(asElement(parentElt(e)),t,n)}var isReady=!1;getDocument().addEventListener("DOMContentLoaded",function(){isReady=!0;});function ready(e){isReady||getDocument().readyState==="complete"?e():getDocument().addEventListener("DOMContentLoaded",e);}function insertIndicatorStyles(){if(htmx.config.includeIndicatorStyles!==!1){let e=htmx.config.inlineStyleNonce?` nonce="${htmx.config.inlineStyleNonce}"`:"";getDocument().head.insertAdjacentHTML("beforeend"," ."+htmx.config.indicatorClass+"{opacity:0} ."+htmx.config.requestClass+" ."+htmx.config.indicatorClass+"{opacity:1; transition: opacity 200ms ease-in;} ."+htmx.config.requestClass+"."+htmx.config.indicatorClass+"{opacity:1; transition: opacity 200ms ease-in;} ");}}function getMetaConfig(){let e=getDocument().querySelector('meta[name="htmx-config"]');return e?parseJSON(e.content):null}function mergeMetaConfig(){let e=getMetaConfig();e&&(htmx.config=mergeObjects(htmx.config,e));}return ready(function(){mergeMetaConfig(),insertIndicatorStyles();let e=getDocument().body;processNode(e);let t=getDocument().querySelectorAll("[hx-trigger='restored'],[data-hx-trigger='restored']");e.addEventListener("htmx:abort",function(r){let o=r.target,i=getInternalData(o);i&&i.xhr&&i.xhr.abort();});let n=window.onpopstate?window.onpopstate.bind(window):null;window.onpopstate=function(r){r.state&&r.state.htmx?(restoreHistory(),forEach(t,function(o){triggerEvent(o,"htmx:restored",{document:getDocument(),triggerEvent});})):n&&n(r);},getWindow().setTimeout(function(){triggerEvent(e,"htmx:load",{}),e=null;},0);}),htmx}(),f=te;function ne(e,t){if(e==="ignore")return !1;let n=e.split("/"),r=t.split("/");for(let o=0;o{let s=oe(t).replace("htmx:","hx-on::");r.has(o)||(o.hasAttribute(s)&&setTimeout(()=>{let l=se(s.replace("hx-on::","htmx:"),{...n.detail,target:o});l.detail.meta="trigger-children",o.dispatchEvent(l),r.add(o);},1),o.children&&$(o,t,n,r));});}f.defineExtension("trigger-children",{onEvent:(e,t)=>{if(!(t instanceof CustomEvent)||t.detail.meta==="trigger-children")return !1;let n=new Set,r=t.target||t.detail.target;return $(r,e,t,n),!0}});f.defineExtension("debug",{onEvent:function(e,t){console.debug?console.debug(e,t):console&&console.log("DEBUG:",e,t);}});var C=f.config,B,ae="hx-target-";function Q(e,t){return e.substring(0,t.length)===t}function le(e,t){if(!e||!t)return null;let n=t.toString(),r=[n,n.substr(0,2)+"*",n.substr(0,2)+"x",n.substr(0,1)+"*",n.substr(0,1)+"x",n.substr(0,1)+"**",n.substr(0,1)+"xx","*","x","***","xxx"];(Q(n,"4")||Q(n,"5"))&&r.push("error");for(let o=0;o{B=e,C.responseTargetUnsetsError===void 0&&(C.responseTargetUnsetsError=!0),C.responseTargetSetsError===void 0&&(C.responseTargetSetsError=!1),C.responseTargetPrefersExisting===void 0&&(C.responseTargetPrefersExisting=!1),C.responseTargetPrefersRetargetHeader===void 0&&(C.responseTargetPrefersRetargetHeader=!0);},onEvent:(e,t)=>{if(!(t instanceof CustomEvent))return !1;if(e==="htmx:beforeSwap"&&t.detail.xhr&&t.detail.xhr.status!==200){if(t.detail.target&&(C.responseTargetPrefersExisting||C.responseTargetPrefersRetargetHeader&&t.detail.xhr.getAllResponseHeaders().match(/HX-Retarget:/i)))return t.detail.shouldSwap=!0,z(t),!0;if(!t.detail.requestConfig)return !0;let n=le(t.detail.requestConfig.elt,t.detail.xhr.status);return n&&(z(t),t.detail.shouldSwap=!0,t.detail.target=n),!0}}});f.defineExtension("mutation-error",{onEvent:(e,t)=>{if(!(t instanceof CustomEvent))return !1;if(e==="htmx:afterRequest"){if(!t.detail||!t.detail.xhr)return;let n=t.detail.xhr.status;n>=400&&f.findAll("[hx-on\\:\\:mutation-error]").forEach(r=>{f.trigger(r,"htmx:mutation-error",{status:n});});}}});var U="";f.defineExtension("livereload",{init:function(){let e=!1;for(let n of Array.from(f.findAll("[hx-ext]")))if(n.getAttribute("hx-ext")?.split(" ").includes("livereload")){e=!0;break}if(!e)return;console.log("livereload extension initialized.");let t=new EventSource("/dev/livereload");t.onmessage=function(n){let r=n.data;U===""&&(U=r),U!==r&&(U=r,ue());},t.onerror=function(n){console.error("EventSource error:",n);};},onEvent:function(e,t){}});function ue(){window.location.reload();}var ce=/__eval_[A-Za-z0-9]+\([a-z]+\)/gm;f.defineExtension("htmgo",{onEvent:function(e,t){e==="htmx:beforeCleanupElement"&&t.target&&J(t.target);}});function J(e){let t=Array.from(e.attributes);for(let n of t){let r=n.value.match(ce)||[];for(let o of r){let i=o.replace("()","").replace("(this)","").replace(";",""),s=document.getElementById(i);s&&s.tagName==="SCRIPT"&&(console.debug("removing associated script with id",i),s.remove());}}}var P=null,K=new Set;f.defineExtension("sse",{init:function(e){P=e;},onEvent:function(e,t){let n=t.target;if(n instanceof HTMLElement&&(e==="htmx:beforeCleanupElement"&&J(n),e==="htmx:beforeProcessNode")){let r=document.querySelectorAll("[sse-connect]");for(let o of Array.from(r)){let i=o.getAttribute("sse-connect");i&&!K.has(i)&&(fe(o,i),K.add(i));}}}});function fe(e,t){if(!t)return;console.info("Connecting to EventSource",t);let n=new EventSource(t);n.addEventListener("close",function(r){f.trigger(e,"htmx:sseClose",{event:r});}),n.onopen=function(r){f.trigger(e,"htmx:sseOpen",{event:r});},n.onerror=function(r){f.trigger(e,"htmx:sseError",{event:r}),n.readyState==EventSource.CLOSED&&f.trigger(e,"htmx:sseClose",{event:r});},n.onmessage=function(r){let o=P.makeSettleInfo(e);f.trigger(e,"htmx:sseBeforeMessage",{event:r});let i=r.data,s=P.makeFragment(i),l=Array.from(s.children);for(let a of l)P.oobSwap(P.getAttributeValue(a,"hx-swap-oob")||"true",a,o),a.tagName==="SCRIPT"&&a.id.startsWith("__eval")&&document.body.appendChild(a);f.trigger(e,"htmx:sseAfterMessage",{event:r});};}window.onload=function(){let e=["SCRIPT","LINK","STYLE","META","BASE","TITLE","HEAD","HTML","BODY"];for(let t of Array.from(document.querySelectorAll("[onload]")))if(t!=null&&t instanceof HTMLElement){if(e.includes(t.tagName))continue;t.onload(new Event("load"));}};window.htmx=f;function de(e){let t=window.location.href;setInterval(()=>{window.location.href!==t&&(e(t,window.location.href),t=window.location.href);},100);}de((e,t)=>{he(t);});function he(e){let t=new URL(e);document.querySelectorAll("[hx-trigger]").forEach(function(n){let r=n.getAttribute("hx-trigger");if(!r)return;if(r.split(", ").find(i=>i==="url"))f.swap(n,"url",{swapStyle:"outerHTML",swapDelay:0,settleDelay:0});else for(let[i,s]of t.searchParams){let l="qs:"+i;if(r.includes(l)){console.log("triggering",l),f.trigger(n,l,null);break}}}),document.querySelectorAll("[hx-match-qp]").forEach(n=>{let r=!1;for(let o of n.getAttributeNames())if(o.startsWith("hx-match-qp-mapping:")){let i=o.replace("hx-match-qp-mapping:","");if(t.searchParams.get(i)){f.swap(n,n.getAttribute(o)??"",{swapStyle:"innerHTML",swapDelay:0,settleDelay:0}),r=!0;break}}if(!r){let o=n.getAttribute("hx-match-qp-default");o&&f.swap(n,n.getAttribute("hx-match-qp-mapping:"+o)??"",{swapStyle:"innerHTML",swapDelay:0,settleDelay:0});}});} //# sourceMappingURL=htmgo.js.map -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL2pzL25vZGVfbW9kdWxlcy9odG14Lm9yZy9kaXN0L2h0bXguZXNtLmpzIiwiLi4vanMvaHRteGV4dGVuc2lvbnMvcGF0aGRlcHMudHMiLCIuLi9qcy9odG14ZXh0ZW5zaW9ucy90cmlnZ2VyLWNoaWxkcmVuLnRzIiwiLi4vanMvaHRteGV4dGVuc2lvbnMvZGVidWcudHMiLCIuLi9qcy9odG14ZXh0ZW5zaW9ucy9yZXNwb25zZS10YXJnZXRzLnRzIiwiLi4vanMvaHRteGV4dGVuc2lvbnMvbXV0YXRpb24tZXJyb3IudHMiLCIuLi9qcy9odG14ZXh0ZW5zaW9ucy9saXZlcmVsb2FkLnRzIiwiLi4vanMvaHRteGV4dGVuc2lvbnMvaHRtZ28udHMiLCIuLi9qcy9odG14ZXh0ZW5zaW9ucy9zc2UudHMiLCIuLi9qcy9odG1nby50cyJdLCJuYW1lcyI6WyJodG14IiwiZWx0IiwidHlwZSIsInZlcmIiLCJ0YWciLCJnbG9iYWwiLCJzdHIiLCJpbnRlcnZhbCIsIm5hbWUiLCJxdWFsaWZpZWROYW1lIiwicGFyZW50IiwiY29uZGl0aW9uIiwiaW5pdGlhbEVsZW1lbnQiLCJhbmNlc3RvciIsImF0dHJpYnV0ZU5hbWUiLCJhdHRyaWJ1dGVWYWx1ZSIsImRpc2luaGVyaXQiLCJpbmhlcml0IiwiY2xvc2VzdEF0dHIiLCJlIiwic2VsZWN0b3IiLCJtYXRjaGVzRnVuY3Rpb24iLCJtYXRjaCIsInJlc3AiLCJmcmFnbWVudCIsInNjcmlwdCIsIm5ld1NjcmlwdCIsImF0dHIiLCJyZXNwb25zZSIsInJlc3BvbnNlV2l0aE5vSGVhZCIsInN0YXJ0VGFnIiwiZG9jIiwidGl0bGVFbGVtZW50IiwiZnVuYyIsIm8iLCJkYXRhUHJvcCIsImRhdGEiLCJhcnIiLCJyZXR1cm5BcnIiLCJpIiwiZWwiLCJyZWN0IiwiZWxlbVRvcCIsImVsZW1Cb3R0b20iLCJyb290Tm9kZSIsInRyaWdnZXIiLCJvYmoxIiwib2JqMiIsImtleSIsImpTdHJpbmciLCJlcnJvciIsInRlc3QiLCJwYXRoIiwidXJsIiwiY2FsbGJhY2siLCJldnQiLCJldmVudCIsImVsdE9yU2VsZWN0b3IiLCJkZWxheSIsInZhbHVlIiwiY2xhenoiLCJub2RlIiwiY2hpbGQiLCJwcmVmaXgiLCJzdWZmaXgiLCJ0cmltbWVkU2VsZWN0b3IiLCJzdGFydCIsInJlc3VsdHMiLCJjb250ZXh0IiwiYXJnMSIsImFyZzIiLCJhcmczIiwiZXZlbnRBcmdzIiwiYXR0ck5hbWUiLCJhdHRyVGFyZ2V0IiwicmVzdWx0IiwiYXR0cmlidXRlIiwidGFyZ2V0U3RyIiwiYXR0cmlidXRlc1RvU2V0dGxlIiwibWVyZ2VUbyIsIm1lcmdlRnJvbSIsInN3YXBTdHlsZSIsInRhcmdldCIsImV4dGVuc2lvbnMiLCJleHRlbnNpb24iLCJvb2JWYWx1ZSIsIm9vYkVsZW1lbnQiLCJzZXR0bGVJbmZvIiwidGFyZ2V0cyIsIm9vYkVsZW1lbnRDbG9uZSIsImJlZm9yZVN3YXBEZXRhaWxzIiwicHJlc2VydmVkRWx0IiwiaWQiLCJvbGRFbHQiLCJwYXJlbnROb2RlIiwibmV3Tm9kZSIsIm5vcm1hbGl6ZWRJZCIsIm5vcm1hbGl6ZWRUYWciLCJwYXJlbnRFbHQiLCJvbGROb2RlIiwibmV3QXR0cmlidXRlcyIsImF1dG9mb2N1cyIsImF1dG9Gb2N1c2VkRWx0IiwiaW5zZXJ0QmVmb3JlIiwic3RyaW5nIiwiaGFzaCIsImNoYXIiLCJpbnRlcm5hbERhdGEiLCJoYW5kbGVySW5mbyIsImVsZW1lbnQiLCJpbmZvIiwibmV3RWx0IiwiZWx0QmVmb3JlTmV3Q29udGVudCIsImZpcnN0Q2hpbGQiLCJleHQiLCJuZXdFbGVtZW50cyIsImoiLCJvb2JFbHRzIiwiY29udGVudCIsInN3YXBTcGVjIiwic3dhcE9wdGlvbnMiLCJhY3RpdmVFbHQiLCJzZWxlY3Rpb25JbmZvIiwib29iU2VsZWN0VmFsdWVzIiwib29iU2VsZWN0VmFsdWUiLCJ0ZW1wbGF0ZSIsIm5ld0ZyYWdtZW50IiwibmV3QWN0aXZlRWx0IiwiZm9jdXNPcHRpb25zIiwiZG9TZXR0bGUiLCJ0YXNrIiwiYW5jaG9yVGFyZ2V0IiwieGhyIiwiaGVhZGVyIiwidHJpZ2dlckJvZHkiLCJ0cmlnZ2VycyIsImV2ZW50TmFtZSIsImRldGFpbCIsImV2ZW50TmFtZXMiLCJ0b2tlbnMiLCJwb3NpdGlvbiIsInN0YXJ0UG9zaXRpb24iLCJzdGFydENoYXIiLCJzeW1ib2wiLCJ0b2tlbiIsImxhc3QiLCJwYXJhbU5hbWUiLCJicmFja2V0Q291bnQiLCJjb25kaXRpb25hbFNvdXJjZSIsImNvbmRpdGlvbkZ1bmN0aW9uIiwiZXhwbGljaXRUcmlnZ2VyIiwiY2FjaGUiLCJ0cmlnZ2VyU3BlY3MiLCJpbml0aWFsTGVuZ3RoIiwiZXZlcnkiLCJldmVudEZpbHRlciIsInRyaWdnZXJTcGVjIiwiZnJvbV9hcmciLCJoYW5kbGVyIiwic3BlYyIsIm5vZGVEYXRhIiwicmF3QXR0cmlidXRlIiwic291cmNlIiwiZXhwbGljaXRDYW5jZWwiLCJlbGVtZW50RGF0YSIsImVsdHNUb0xpc3Rlbk9uIiwiZWx0VG9MaXN0ZW5PbiIsImVsdFRvTGlzdGVuT25EYXRhIiwiZXZlbnRMaXN0ZW5lciIsImV2ZW50RGF0YSIsImxvYWQiLCJleHBsaWNpdEFjdGlvbiIsIm9ic2VydmVyT3B0aW9ucyIsImVudHJpZXMiLCJhdHRyaWJ1dGVzIiwiZWxlbWVudHMiLCJpdGVyIiwiYm9vc3RlZFNlbGVjdG9yIiwiZXh0ZW5zaW9uU2VsZWN0b3JzIiwic2VsZWN0b3JzIiwicyIsImZvcm0iLCJjb2RlIiwibGlzdGVuZXIiLCJhZnRlck9uUG9zaXRpb24iLCJuZXh0Q2hhciIsInRvRG8iLCJtc2ciLCJldmVudFJlc3VsdCIsImtlYmFiTmFtZSIsImtlYmFiZWRFdmVudCIsInJvb3RFbHQiLCJpbm5lckhUTUwiLCJ0aXRsZSIsInNjcm9sbCIsImhpc3RvcnlDYWNoZSIsIm5ld0hpc3RvcnlJdGVtIiwiY2xhc3NOYW1lIiwiY2xvbmUiLCJkaXNhYmxlSGlzdG9yeUNhY2hlIiwidGFza3MiLCJyZXF1ZXN0IiwiZGV0YWlscyIsImhpc3RvcnlFbGVtZW50IiwiY2FjaGVkIiwiaW5kaWNhdG9ycyIsImljIiwiZGlzYWJsZWRFbHRzIiwiZGlzYWJsZWRFbGVtZW50IiwiZGlzYWJsZWQiLCJwcm9jZXNzZWQiLCJmb3JtRGF0YSIsInYiLCJ2YWx1ZXMiLCJlcnJvcnMiLCJ2YWxpZGF0ZSIsImlucHV0IiwicmVjZWl2ZXIiLCJkb25vciIsInByaW9yaXR5Rm9ybURhdGEiLCJidXR0b24iLCJpbmNsdWRlcyIsImRlc2NlbmRhbnQiLCJyZXR1cm5TdHIiLCJyZWFsVmFsdWUiLCJwcm9tcHQiLCJoZWFkZXJzIiwiaW5wdXRWYWx1ZXMiLCJwYXJhbXNWYWx1ZSIsIm5ld1ZhbHVlcyIsInN3YXBJbmZvT3ZlcnJpZGUiLCJzd2FwSW5mbyIsInNwbGl0Iiwic3BsaXRTcGVjIiwic2Nyb2xsVmFsIiwic2VsZWN0b3JWYWwiLCJzaG93VmFsIiwiZm9jdXNTY3JvbGxWYWwiLCJmaWx0ZXJlZFBhcmFtZXRlcnMiLCJlbmNvZGVkUGFyYW1ldGVycyIsImZpcnN0IiwiZXZhbEFzRGVmYXVsdCIsImV2YWx1YXRlVmFsdWUiLCJ2YXJzVmFsdWVzIiwidG9FdmFsIiwiZGVmYXVsdFZhbCIsImV4cHJlc3Npb25WYXJzIiwiaGVhZGVyVmFsdWUiLCJyZWdleHAiLCJyZXF1ZXN0Q29uZmlnIiwic2FtZUhvc3QiLCJvYmoiLCJhcnJheSIsImluZGV4IiwicHJvcCIsImV0YyIsImNvbmZpcm1lZCIsInJlc29sdmUiLCJyZWplY3QiLCJwcm9taXNlIiwiX3Jlc29sdmUiLCJfcmVqZWN0IiwicmVzcG9uc2VIYW5kbGVyIiwic2VsZWN0IiwiZWx0RGF0YSIsInN1Ym1pdHRlciIsImJ1dHRvblBhdGgiLCJidXR0b25WZXJiIiwiY29uZmlybVF1ZXN0aW9uIiwic2tpcENvbmZpcm1hdGlvbiIsInN5bmNFbHQiLCJzeW5jU3RyYXRlZ3kiLCJxdWV1ZVN0cmF0ZWd5IiwiYWJvcnRhYmxlIiwic3luY1N0cmluZ3MiLCJlbmRSZXF1ZXN0TG9jayIsInByb21wdFF1ZXN0aW9uIiwicHJvbXB0UmVzcG9uc2UiLCJyYXdGb3JtRGF0YSIsImFsbEZvcm1EYXRhIiwiZmlsdGVyZWRGb3JtRGF0YSIsInJlcXVlc3RBdHRyVmFsdWVzIiwiZWx0SXNCb29zdGVkIiwidXNlVXJsUGFyYW1zIiwic3BsaXRQYXRoIiwicGF0aE5vQW5jaG9yIiwiYW5jaG9yIiwiZmluYWxQYXRoIiwicmVzcG9uc2VJbmZvIiwiaGllcmFyY2h5IiwiZGlzYWJsZUVsdHMiLCJzZWNvbmRhcnlUcmlnZ2VyRWx0IiwicGFyZW50RWx0SW5IaWVyYXJjaHkiLCJwYXJhbXMiLCJwYXRoRnJvbUhlYWRlcnMiLCJ0eXBlRnJvbUhlYWRlcnMiLCJyZXF1ZXN0UGF0aCIsInJlc3BvbnNlUGF0aCIsInB1c2hVcmwiLCJyZXBsYWNlVXJsIiwiZWxlbWVudElzQm9vc3RlZCIsInNhdmVUeXBlIiwicmVzcG9uc2VIYW5kbGluZ0NvbmZpZyIsInN0YXR1cyIsInJlZ0V4cCIsInJlc3BvbnNlSGFuZGxpbmdFbGVtZW50IiwidGl0bGVFbHQiLCJyZXNwb25zZUluZm9TZWxlY3QiLCJyZWRpcmVjdFBhdGgiLCJyZWRpcmVjdFN3YXBTcGVjIiwic2hvdWxkUmVmcmVzaCIsImhpc3RvcnlVcGRhdGUiLCJyZXNwb25zZUhhbmRsaW5nIiwic2hvdWxkU3dhcCIsImlzRXJyb3IiLCJpZ25vcmVUaXRsZSIsInNlbGVjdE92ZXJyaWRlIiwic3dhcE92ZXJyaWRlIiwic2VydmVyUmVzcG9uc2UiLCJzZXR0bGVSZXNvbHZlIiwic2V0dGxlUmVqZWN0Iiwic2VsZWN0T09CIiwiZG9Td2FwIiwiZmluYWxFbHQiLCJzaG91bGRUcmFuc2l0aW9uIiwic2V0dGxlUHJvbWlzZSIsImlubmVyRG9Td2FwIiwiYXBpIiwidGV4dCIsInBhcmFtZXRlcnMiLCJleHRlbnNpb25zVG9SZXR1cm4iLCJleHRlbnNpb25zVG9JZ25vcmUiLCJleHRlbnNpb25zRm9yRWxlbWVudCIsImV4dGVuc2lvbk5hbWUiLCJmbiIsIm5vbmNlQXR0cmlidXRlIiwibWV0YUNvbmZpZyIsImJvZHkiLCJyZXN0b3JlZEVsdHMiLCJvcmlnaW5hbFBvcHN0YXRlIiwiaHRteF9lc21fZGVmYXVsdCIsImRlcGVuZHNPbiIsInBhdGhTcGVjIiwiZGVwZW5kZW5jeVBhdGgiLCJ1cmxQYXRoIiwiZGVwZW5kZW5jeUVsZW1lbnQiLCJwYXRoRWxlbWVudCIsInJlZnJlc2hQYXRoIiwiZWx0c1dpdGhEZXBzIiwiY29uZmlnIiwia2ViYWJFdmVudE5hbWUiLCJpZ25vcmVkRXZlbnRzIiwibWFrZUV2ZW50IiwidHJpZ2dlckNoaWxkcmVuIiwidHJpZ2dlcmVkIiwibmV3RXZlbnQiLCJhdHRyUHJlZml4Iiwic3RhcnRzV2l0aCIsImdldFJlc3BDb2RlVGFyZ2V0IiwicmVzcENvZGVOdW1iZXIiLCJyZXNwQ29kZSIsImF0dHJQb3NzaWJpbGl0aWVzIiwiYXR0clZhbHVlIiwiaGFuZGxlRXJyb3JGbGFnIiwiYXBpUmVmIiwibGFzdFZlcnNpb24iLCJlbmFibGVkIiwiZXZlbnRTb3VyY2UiLCJtZXNzYWdlIiwicmVsb2FkIiwiZXZhbEZ1bmNSZWdleCIsInJlbW92ZUFzc29jaWF0ZWRTY3JpcHRzIiwibWF0Y2hlcyIsImVsZSIsImNvbm5lY3RFdmVudFNvdXJjZSIsImNoaWxkcmVuIiwid2F0Y2hVcmwiLCJsYXN0VXJsIiwiXyIsIm5ld1VybCIsIm9uVXJsQ2hhbmdlIiwiaGFzTWF0Y2giLCJkZWZhdWx0S2V5Il0sIm1hcHBpbmdzIjoiQUFBQSxJQUFJQSxFQUFBQSxDQUFRLFVBQVcsQ0FJckIsSUFBTSxJQUFPLENBQUEsQ0FJWCxPQUFRLElBRVIsQ0FBQSxPQUFBLENBQVMsS0FFVCxFQUFJLENBQUEsSUFBQSxDQUVKLElBQUssSUFFTCxDQUFBLE9BQUEsQ0FBUyxLQUVULElBQU0sQ0FBQSxJQUFBLENBR04sS0FBTSxJQUVOLENBQUEsT0FBQSxDQUFTLEtBRVQsT0FBUyxDQUFBLElBQUEsQ0FVVCxPQUFRLFNBQVNDLENBQUFBLENBQUtDLEVBQU0sQ0FFMUIsT0FEb0IsZUFBZUQsQ0FBS0MsQ0FBQUEsQ0FBQUEsRUFBUSxNQUFNLENBQ25D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cUJBQXFCLENBQ2xEc1YsQ0FBQUEsQ0FBQUEsRUFDRjFDLEVBQUssSUFDSDVTLENBQUFBLENBQUFBLENBQ0FBLEVBQUcsWUFBYSxDQUFBLHNCQUFBLENBQXlCc1YsQ0FBVSxDQUFLLEVBQUEsRUFBQSxDQUN4RCxDQUFFLFNBQVcsQ0FBQSxXQUFBLENBQWEsVUFBVyxDQUFHLENBQUEsV0FBQSxDQUFhLENBQUUsQ0FDekQsRUFFSixDQUNGLENBQUMsRUFDSCIsImZpbGUiOiJodG1nby5qcyIsInNvdXJjZXNDb250ZW50IjpbInZhciBodG14ID0gKGZ1bmN0aW9uKCkge1xuICAndXNlIHN0cmljdCdcblxuICAvLyBQdWJsaWMgQVBJXG4gIGNvbnN0IGh0bXggPSB7XG4gICAgLy8gVHNjIG1hZG5lc3MgaGVyZSwgYXNzaWduaW5nIHRoZSBmdW5jdGlvbnMgZGlyZWN0bHkgcmVzdWx0cyBpbiBhbiBpbnZhbGlkIFR5cGVTY3JpcHQgb3V0cHV0LCBidXQgcmVhc3NpZ25pbmcgaXMgZmluZVxuICAgIC8qIEV2ZW50IHByb2Nlc3NpbmcgKi9cbiAgICAvKiogQHR5cGUge3R5cGVvZiBvbkxvYWRIZWxwZXJ9ICovXG4gICAgb25Mb2FkOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIHByb2Nlc3NOb2RlfSAqL1xuICAgIHByb2Nlc3M6IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgYWRkRXZlbnRMaXN0ZW5lckltcGx9ICovXG4gICAgb246IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgcmVtb3ZlRXZlbnRMaXN0ZW5lckltcGx9ICovXG4gICAgb2ZmOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIHRyaWdnZXJFdmVudH0gKi9cbiAgICB0cmlnZ2VyOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIGFqYXhIZWxwZXJ9ICovXG4gICAgYWpheDogbnVsbCxcbiAgICAvKiBET00gcXVlcnlpbmcgaGVscGVycyAqL1xuICAgIC8qKiBAdHlwZSB7dHlwZW9mIGZpbmR9ICovXG4gICAgZmluZDogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiBmaW5kQWxsfSAqL1xuICAgIGZpbmRBbGw6IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgY2xvc2VzdH0gKi9cbiAgICBjbG9zZXN0OiBudWxsLFxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGlucHV0IHZhbHVlcyB0aGF0IHdvdWxkIHJlc29sdmUgZm9yIGEgZ2l2ZW4gZWxlbWVudCB2aWEgdGhlIGh0bXggdmFsdWUgcmVzb2x1dGlvbiBtZWNoYW5pc21cbiAgICAgKlxuICAgICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI3ZhbHVlc1xuICAgICAqXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBlbHQgdGhlIGVsZW1lbnQgdG8gcmVzb2x2ZSB2YWx1ZXMgb25cbiAgICAgKiBAcGFyYW0ge0h0dHBWZXJifSB0eXBlIHRoZSByZXF1ZXN0IHR5cGUgKGUuZy4gKipnZXQqKiBvciAqKnBvc3QqKikgbm9uLUdFVCdzIHdpbGwgaW5jbHVkZSB0aGUgZW5jbG9zaW5nIGZvcm0gb2YgdGhlIGVsZW1lbnQuIERlZmF1bHRzIHRvICoqcG9zdCoqXG4gICAgICogQHJldHVybnMge09iamVjdH1cbiAgICAgKi9cbiAgICB2YWx1ZXM6IGZ1bmN0aW9uKGVsdCwgdHlwZSkge1xuICAgICAgY29uc3QgaW5wdXRWYWx1ZXMgPSBnZXRJbnB1dFZhbHVlcyhlbHQsIHR5cGUgfHwgJ3Bvc3QnKVxuICAgICAgcmV0dXJuIGlucHV0VmFsdWVzLnZhbHVlc1xuICAgIH0sXG4gICAgLyogRE9NIG1hbmlwdWxhdGlvbiBoZWxwZXJzICovXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgcmVtb3ZlRWxlbWVudH0gKi9cbiAgICByZW1vdmU6IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgYWRkQ2xhc3NUb0VsZW1lbnR9ICovXG4gICAgYWRkQ2xhc3M6IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgcmVtb3ZlQ2xhc3NGcm9tRWxlbWVudH0gKi9cbiAgICByZW1vdmVDbGFzczogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiB0b2dnbGVDbGFzc09uRWxlbWVudH0gKi9cbiAgICB0b2dnbGVDbGFzczogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiB0YWtlQ2xhc3NGb3JFbGVtZW50fSAqL1xuICAgIHRha2VDbGFzczogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiBzd2FwfSAqL1xuICAgIHN3YXA6IG51bGwsXG4gICAgLyogRXh0ZW5zaW9uIGVudHJ5cG9pbnRzICovXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgZGVmaW5lRXh0ZW5zaW9ufSAqL1xuICAgIGRlZmluZUV4dGVuc2lvbjogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiByZW1vdmVFeHRlbnNpb259ICovXG4gICAgcmVtb3ZlRXh0ZW5zaW9uOiBudWxsLFxuICAgIC8qIERlYnVnZ2luZyAqL1xuICAgIC8qKiBAdHlwZSB7dHlwZW9mIGxvZ0FsbH0gKi9cbiAgICBsb2dBbGw6IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgbG9nTm9uZX0gKi9cbiAgICBsb2dOb25lOiBudWxsLFxuICAgIC8qIERlYnVnZ2luZyAqL1xuICAgIC8qKlxuICAgICAqIFRoZSBsb2dnZXIgaHRteCB1c2VzIHRvIGxvZyB3aXRoXG4gICAgICpcbiAgICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNsb2dnZXJcbiAgICAgKi9cbiAgICBsb2dnZXI6IG51bGwsXG4gICAgLyoqXG4gICAgICogQSBwcm9wZXJ0eSBob2xkaW5nIHRoZSBjb25maWd1cmF0aW9uIGh0bXggdXNlcyBhdCBydW50aW1lLlxuICAgICAqXG4gICAgICogTm90ZSB0aGF0IHVzaW5nIGEgW21ldGEgdGFnXShodHRwczovL2h0bXgub3JnL2RvY3MvI2NvbmZpZykgaXMgdGhlIHByZWZlcnJlZCBtZWNoYW5pc20gZm9yIHNldHRpbmcgdGhlc2UgcHJvcGVydGllcy5cbiAgICAgKlxuICAgICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI2NvbmZpZ1xuICAgICAqL1xuICAgIGNvbmZpZzoge1xuICAgICAgLyoqXG4gICAgICAgKiBXaGV0aGVyIHRvIHVzZSBoaXN0b3J5LlxuICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICogQGRlZmF1bHQgdHJ1ZVxuICAgICAgICovXG4gICAgICBoaXN0b3J5RW5hYmxlZDogdHJ1ZSxcbiAgICAgIC8qKlxuICAgICAgICogVGhlIG51bWJlciBvZiBwYWdlcyB0byBrZWVwIGluICoqbG9jYWxTdG9yYWdlKiogZm9yIGhpc3Rvcnkgc3VwcG9ydC5cbiAgICAgICAqIEB0eXBlIG51bWJlclxuICAgICAgICogQGRlZmF1bHQgMTBcbiAgICAgICAqL1xuICAgICAgaGlzdG9yeUNhY2hlU2l6ZTogMTAsXG4gICAgICAvKipcbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICAgKi9cbiAgICAgIHJlZnJlc2hPbkhpc3RvcnlNaXNzOiBmYWxzZSxcbiAgICAgIC8qKlxuICAgICAgICogVGhlIGRlZmF1bHQgc3dhcCBzdHlsZSB0byB1c2UgaWYgKipbaHgtc3dhcF0oaHR0cHM6Ly9odG14Lm9yZy9hdHRyaWJ1dGVzL2h4LXN3YXApKiogaXMgb21pdHRlZC5cbiAgICAgICAqIEB0eXBlIEh0bXhTd2FwU3R5bGVcbiAgICAgICAqIEBkZWZhdWx0ICdpbm5lckhUTUwnXG4gICAgICAgKi9cbiAgICAgIGRlZmF1bHRTd2FwU3R5bGU6ICdpbm5lckhUTUwnLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgZGVmYXVsdCBkZWxheSBiZXR3ZWVuIHJlY2VpdmluZyBhIHJlc3BvbnNlIGZyb20gdGhlIHNlcnZlciBhbmQgZG9pbmcgdGhlIHN3YXAuXG4gICAgICAgKiBAdHlwZSBudW1iZXJcbiAgICAgICAqIEBkZWZhdWx0IDBcbiAgICAgICAqL1xuICAgICAgZGVmYXVsdFN3YXBEZWxheTogMCxcbiAgICAgIC8qKlxuICAgICAgICogVGhlIGRlZmF1bHQgZGVsYXkgYmV0d2VlbiBjb21wbGV0aW5nIHRoZSBjb250ZW50IHN3YXAgYW5kIHNldHRsaW5nIGF0dHJpYnV0ZXMuXG4gICAgICAgKiBAdHlwZSBudW1iZXJcbiAgICAgICAqIEBkZWZhdWx0IDIwXG4gICAgICAgKi9cbiAgICAgIGRlZmF1bHRTZXR0bGVEZWxheTogMjAsXG4gICAgICAvKipcbiAgICAgICAqIElmIHRydWUsIGh0bXggd2lsbCBpbmplY3QgYSBzbWFsbCBhbW91bnQgb2YgQ1NTIGludG8gdGhlIHBhZ2UgdG8gbWFrZSBpbmRpY2F0b3JzIGludmlzaWJsZSB1bmxlc3MgdGhlICoqaHRteC1pbmRpY2F0b3IqKiBjbGFzcyBpcyBwcmVzZW50LlxuICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICogQGRlZmF1bHQgdHJ1ZVxuICAgICAgICovXG4gICAgICBpbmNsdWRlSW5kaWNhdG9yU3R5bGVzOiB0cnVlLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgY2xhc3MgdG8gcGxhY2Ugb24gaW5kaWNhdG9ycyB3aGVuIGEgcmVxdWVzdCBpcyBpbiBmbGlnaHQuXG4gICAgICAgKiBAdHlwZSBzdHJpbmdcbiAgICAgICAqIEBkZWZhdWx0ICdodG14LWluZGljYXRvcidcbiAgICAgICAqL1xuICAgICAgaW5kaWNhdG9yQ2xhc3M6ICdodG14LWluZGljYXRvcicsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBjbGFzcyB0byBwbGFjZSBvbiB0cmlnZ2VyaW5nIGVsZW1lbnRzIHdoZW4gYSByZXF1ZXN0IGlzIGluIGZsaWdodC5cbiAgICAgICAqIEB0eXBlIHN0cmluZ1xuICAgICAgICogQGRlZmF1bHQgJ2h0bXgtcmVxdWVzdCdcbiAgICAgICAqL1xuICAgICAgcmVxdWVzdENsYXNzOiAnaHRteC1yZXF1ZXN0JyxcbiAgICAgIC8qKlxuICAgICAgICogVGhlIGNsYXNzIHRvIHRlbXBvcmFyaWx5IHBsYWNlIG9uIGVsZW1lbnRzIHRoYXQgaHRteCBoYXMgYWRkZWQgdG8gdGhlIERPTS5cbiAgICAgICAqIEB0eXBlIHN0cmluZ1xuICAgICAgICogQGRlZmF1bHQgJ2h0bXgtYWRkZWQnXG4gICAgICAgKi9cbiAgICAgIGFkZGVkQ2xhc3M6ICdodG14LWFkZGVkJyxcbiAgICAgIC8qKlxuICAgICAgICogVGhlIGNsYXNzIHRvIHBsYWNlIG9uIHRhcmdldCBlbGVtZW50cyB3aGVuIGh0bXggaXMgaW4gdGhlIHNldHRsaW5nIHBoYXNlLlxuICAgICAgICogQHR5cGUgc3RyaW5nXG4gICAgICAgKiBAZGVmYXVsdCAnaHRteC1zZXR0bGluZydcbiAgICAgICAqL1xuICAgICAgc2V0dGxpbmdDbGFzczogJ2h0bXgtc2V0dGxpbmcnLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgY2xhc3MgdG8gcGxhY2Ugb24gdGFyZ2V0IGVsZW1lbnRzIHdoZW4gaHRteCBpcyBpbiB0aGUgc3dhcHBpbmcgcGhhc2UuXG4gICAgICAgKiBAdHlwZSBzdHJpbmdcbiAgICAgICAqIEBkZWZhdWx0ICdodG14LXN3YXBwaW5nJ1xuICAgICAgICovXG4gICAgICBzd2FwcGluZ0NsYXNzOiAnaHRteC1zd2FwcGluZycsXG4gICAgICAvKipcbiAgICAgICAqIEFsbG93cyB0aGUgdXNlIG9mIGV2YWwtbGlrZSBmdW5jdGlvbmFsaXR5IGluIGh0bXgsIHRvIGVuYWJsZSAqKmh4LXZhcnMqKiwgdHJpZ2dlciBjb25kaXRpb25zICYgc2NyaXB0IHRhZyBldmFsdWF0aW9uLiBDYW4gYmUgc2V0IHRvICoqZmFsc2UqKiBmb3IgQ1NQIGNvbXBhdGliaWxpdHkuXG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCB0cnVlXG4gICAgICAgKi9cbiAgICAgIGFsbG93RXZhbDogdHJ1ZSxcbiAgICAgIC8qKlxuICAgICAgICogSWYgc2V0IHRvIGZhbHNlLCBkaXNhYmxlcyB0aGUgaW50ZXJwcmV0YXRpb24gb2Ygc2NyaXB0IHRhZ3MuXG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCB0cnVlXG4gICAgICAgKi9cbiAgICAgIGFsbG93U2NyaXB0VGFnczogdHJ1ZSxcbiAgICAgIC8qKlxuICAgICAgICogSWYgc2V0LCB0aGUgbm9uY2Ugd2lsbCBiZSBhZGRlZCB0byBpbmxpbmUgc2NyaXB0cy5cbiAgICAgICAqIEB0eXBlIHN0cmluZ1xuICAgICAgICogQGRlZmF1bHQgJydcbiAgICAgICAqL1xuICAgICAgaW5saW5lU2NyaXB0Tm9uY2U6ICcnLFxuICAgICAgLyoqXG4gICAgICAgKiBJZiBzZXQsIHRoZSBub25jZSB3aWxsIGJlIGFkZGVkIHRvIGlubGluZSBzdHlsZXMuXG4gICAgICAgKiBAdHlwZSBzdHJpbmdcbiAgICAgICAqIEBkZWZhdWx0ICcnXG4gICAgICAgKi9cbiAgICAgIGlubGluZVN0eWxlTm9uY2U6ICcnLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgYXR0cmlidXRlcyB0byBzZXR0bGUgZHVyaW5nIHRoZSBzZXR0bGluZyBwaGFzZS5cbiAgICAgICAqIEB0eXBlIHN0cmluZ1tdXG4gICAgICAgKiBAZGVmYXVsdCBbJ2NsYXNzJywgJ3N0eWxlJywgJ3dpZHRoJywgJ2hlaWdodCddXG4gICAgICAgKi9cbiAgICAgIGF0dHJpYnV0ZXNUb1NldHRsZTogWydjbGFzcycsICdzdHlsZScsICd3aWR0aCcsICdoZWlnaHQnXSxcbiAgICAgIC8qKlxuICAgICAgICogQWxsb3cgY3Jvc3Mtc2l0ZSBBY2Nlc3MtQ29udHJvbCByZXF1ZXN0cyB1c2luZyBjcmVkZW50aWFscyBzdWNoIGFzIGNvb2tpZXMsIGF1dGhvcml6YXRpb24gaGVhZGVycyBvciBUTFMgY2xpZW50IGNlcnRpZmljYXRlcy5cbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICAgKi9cbiAgICAgIHdpdGhDcmVkZW50aWFsczogZmFsc2UsXG4gICAgICAvKipcbiAgICAgICAqIEB0eXBlIG51bWJlclxuICAgICAgICogQGRlZmF1bHQgMFxuICAgICAgICovXG4gICAgICB0aW1lb3V0OiAwLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiAqKmdldFdlYlNvY2tldFJlY29ubmVjdERlbGF5KiogZm9yIHJlY29ubmVjdGluZyBhZnRlciB1bmV4cGVjdGVkIGNvbm5lY3Rpb24gbG9zcyBieSB0aGUgZXZlbnQgY29kZSAqKkFibm9ybWFsIENsb3N1cmUqKiwgKipTZXJ2aWNlIFJlc3RhcnQqKiBvciAqKlRyeSBBZ2FpbiBMYXRlcioqLlxuICAgICAgICogQHR5cGUgeydmdWxsLWppdHRlcicgfCAoKHJldHJ5Q291bnQ6bnVtYmVyKSA9PiBudW1iZXIpfVxuICAgICAgICogQGRlZmF1bHQgXCJmdWxsLWppdHRlclwiXG4gICAgICAgKi9cbiAgICAgIHdzUmVjb25uZWN0RGVsYXk6ICdmdWxsLWppdHRlcicsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSB0eXBlIG9mIGJpbmFyeSBkYXRhIGJlaW5nIHJlY2VpdmVkIG92ZXIgdGhlIFdlYlNvY2tldCBjb25uZWN0aW9uXG4gICAgICAgKiBAdHlwZSBCaW5hcnlUeXBlXG4gICAgICAgKiBAZGVmYXVsdCAnYmxvYidcbiAgICAgICAqL1xuICAgICAgd3NCaW5hcnlUeXBlOiAnYmxvYicsXG4gICAgICAvKipcbiAgICAgICAqIEB0eXBlIHN0cmluZ1xuICAgICAgICogQGRlZmF1bHQgJ1toeC1kaXNhYmxlXSwgW2RhdGEtaHgtZGlzYWJsZV0nXG4gICAgICAgKi9cbiAgICAgIGRpc2FibGVTZWxlY3RvcjogJ1toeC1kaXNhYmxlXSwgW2RhdGEtaHgtZGlzYWJsZV0nLFxuICAgICAgLyoqXG4gICAgICAgKiBAdHlwZSB7J2F1dG8nIHwgJ2luc3RhbnQnIHwgJ3Ntb290aCd9XG4gICAgICAgKiBAZGVmYXVsdCAnaW5zdGFudCdcbiAgICAgICAqL1xuICAgICAgc2Nyb2xsQmVoYXZpb3I6ICdpbnN0YW50JyxcbiAgICAgIC8qKlxuICAgICAgICogSWYgdGhlIGZvY3VzZWQgZWxlbWVudCBzaG91bGQgYmUgc2Nyb2xsZWQgaW50byB2aWV3LlxuICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgICAqL1xuICAgICAgZGVmYXVsdEZvY3VzU2Nyb2xsOiBmYWxzZSxcbiAgICAgIC8qKlxuICAgICAgICogSWYgc2V0IHRvIHRydWUgaHRteCB3aWxsIGluY2x1ZGUgYSBjYWNoZS1idXN0aW5nIHBhcmFtZXRlciBpbiBHRVQgcmVxdWVzdHMgdG8gYXZvaWQgY2FjaGluZyBwYXJ0aWFsIHJlc3BvbnNlcyBieSB0aGUgYnJvd3NlclxuICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgICAqL1xuICAgICAgZ2V0Q2FjaGVCdXN0ZXJQYXJhbTogZmFsc2UsXG4gICAgICAvKipcbiAgICAgICAqIElmIHNldCB0byB0cnVlLCBodG14IHdpbGwgdXNlIHRoZSBWaWV3IFRyYW5zaXRpb24gQVBJIHdoZW4gc3dhcHBpbmcgaW4gbmV3IGNvbnRlbnQuXG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAgICovXG4gICAgICBnbG9iYWxWaWV3VHJhbnNpdGlvbnM6IGZhbHNlLFxuICAgICAgLyoqXG4gICAgICAgKiBodG14IHdpbGwgZm9ybWF0IHJlcXVlc3RzIHdpdGggdGhlc2UgbWV0aG9kcyBieSBlbmNvZGluZyB0aGVpciBwYXJhbWV0ZXJzIGluIHRoZSBVUkwsIG5vdCB0aGUgcmVxdWVzdCBib2R5XG4gICAgICAgKiBAdHlwZSB7KEh0dHBWZXJiKVtdfVxuICAgICAgICogQGRlZmF1bHQgWydnZXQnLCAnZGVsZXRlJ11cbiAgICAgICAqL1xuICAgICAgbWV0aG9kc1RoYXRVc2VVcmxQYXJhbXM6IFsnZ2V0JywgJ2RlbGV0ZSddLFxuICAgICAgLyoqXG4gICAgICAgKiBJZiBzZXQgdG8gdHJ1ZSwgZGlzYWJsZXMgaHRteC1iYXNlZCByZXF1ZXN0cyB0byBub24tb3JpZ2luIGhvc3RzLlxuICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgICAqL1xuICAgICAgc2VsZlJlcXVlc3RzT25seTogdHJ1ZSxcbiAgICAgIC8qKlxuICAgICAgICogSWYgc2V0IHRvIHRydWUgaHRteCB3aWxsIG5vdCB1cGRhdGUgdGhlIHRpdGxlIG9mIHRoZSBkb2N1bWVudCB3aGVuIGEgdGl0bGUgdGFnIGlzIGZvdW5kIGluIG5ldyBjb250ZW50XG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAgICovXG4gICAgICBpZ25vcmVUaXRsZTogZmFsc2UsXG4gICAgICAvKipcbiAgICAgICAqIFdoZXRoZXIgdGhlIHRhcmdldCBvZiBhIGJvb3N0ZWQgZWxlbWVudCBpcyBzY3JvbGxlZCBpbnRvIHRoZSB2aWV3cG9ydC5cbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IHRydWVcbiAgICAgICAqL1xuICAgICAgc2Nyb2xsSW50b1ZpZXdPbkJvb3N0OiB0cnVlLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgY2FjaGUgdG8gc3RvcmUgZXZhbHVhdGVkIHRyaWdnZXIgc3BlY2lmaWNhdGlvbnMgaW50by5cbiAgICAgICAqIFlvdSBtYXkgZGVmaW5lIGEgc2ltcGxlIG9iamVjdCB0byB1c2UgYSBuZXZlci1jbGVhcmluZyBjYWNoZSwgb3IgaW1wbGVtZW50IHlvdXIgb3duIHN5c3RlbSB1c2luZyBhIFtwcm94eSBvYmplY3RdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL1Byb3h5KVxuICAgICAgICogQHR5cGUge09iamVjdHxudWxsfVxuICAgICAgICogQGRlZmF1bHQgbnVsbFxuICAgICAgICovXG4gICAgICB0cmlnZ2VyU3BlY3NDYWNoZTogbnVsbCxcbiAgICAgIC8qKiBAdHlwZSBib29sZWFuICovXG4gICAgICBkaXNhYmxlSW5oZXJpdGFuY2U6IGZhbHNlLFxuICAgICAgLyoqIEB0eXBlIEh0bXhSZXNwb25zZUhhbmRsaW5nQ29uZmlnW10gKi9cbiAgICAgIHJlc3BvbnNlSGFuZGxpbmc6IFtcbiAgICAgICAgeyBjb2RlOiAnMjA0Jywgc3dhcDogZmFsc2UgfSxcbiAgICAgICAgeyBjb2RlOiAnWzIzXS4uJywgc3dhcDogdHJ1ZSB9LFxuICAgICAgICB7IGNvZGU6ICdbNDVdLi4nLCBzd2FwOiBmYWxzZSwgZXJyb3I6IHRydWUgfVxuICAgICAgXSxcbiAgICAgIC8qKlxuICAgICAgICogV2hldGhlciB0byBwcm9jZXNzIE9PQiBzd2FwcyBvbiBlbGVtZW50cyB0aGF0IGFyZSBuZXN0ZWQgd2l0aGluIHRoZSBtYWluIHJlc3BvbnNlIGVsZW1lbnQuXG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCB0cnVlXG4gICAgICAgKi9cbiAgICAgIGFsbG93TmVzdGVkT29iU3dhcHM6IHRydWVcbiAgICB9LFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIHBhcnNlSW50ZXJ2YWx9ICovXG4gICAgcGFyc2VJbnRlcnZhbDogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiBpbnRlcm5hbEV2YWx9ICovXG4gICAgXzogbnVsbCxcbiAgICB2ZXJzaW9uOiAnMi4wLjInXG4gIH1cbiAgLy8gVHNjIG1hZG5lc3MgcGFydCAyXG4gIGh0bXgub25Mb2FkID0gb25Mb2FkSGVscGVyXG4gIGh0bXgucHJvY2VzcyA9IHByb2Nlc3NOb2RlXG4gIGh0bXgub24gPSBhZGRFdmVudExpc3RlbmVySW1wbFxuICBodG14Lm9mZiA9IHJlbW92ZUV2ZW50TGlzdGVuZXJJbXBsXG4gIGh0bXgudHJpZ2dlciA9IHRyaWdnZXJFdmVudFxuICBodG14LmFqYXggPSBhamF4SGVscGVyXG4gIGh0bXguZmluZCA9IGZpbmRcbiAgaHRteC5maW5kQWxsID0gZmluZEFsbFxuICBodG14LmNsb3Nlc3QgPSBjbG9zZXN0XG4gIGh0bXgucmVtb3ZlID0gcmVtb3ZlRWxlbWVudFxuICBodG14LmFkZENsYXNzID0gYWRkQ2xhc3NUb0VsZW1lbnRcbiAgaHRteC5yZW1vdmVDbGFzcyA9IHJlbW92ZUNsYXNzRnJvbUVsZW1lbnRcbiAgaHRteC50b2dnbGVDbGFzcyA9IHRvZ2dsZUNsYXNzT25FbGVtZW50XG4gIGh0bXgudGFrZUNsYXNzID0gdGFrZUNsYXNzRm9yRWxlbWVudFxuICBodG14LnN3YXAgPSBzd2FwXG4gIGh0bXguZGVmaW5lRXh0ZW5zaW9uID0gZGVmaW5lRXh0ZW5zaW9uXG4gIGh0bXgucmVtb3ZlRXh0ZW5zaW9uID0gcmVtb3ZlRXh0ZW5zaW9uXG4gIGh0bXgubG9nQWxsID0gbG9nQWxsXG4gIGh0bXgubG9nTm9uZSA9IGxvZ05vbmVcbiAgaHRteC5wYXJzZUludGVydmFsID0gcGFyc2VJbnRlcnZhbFxuICBodG14Ll8gPSBpbnRlcm5hbEV2YWxcblxuICBjb25zdCBpbnRlcm5hbEFQSSA9IHtcbiAgICBhZGRUcmlnZ2VySGFuZGxlcixcbiAgICBib2R5Q29udGFpbnMsXG4gICAgY2FuQWNjZXNzTG9jYWxTdG9yYWdlLFxuICAgIGZpbmRUaGlzRWxlbWVudCxcbiAgICBmaWx0ZXJWYWx1ZXMsXG4gICAgc3dhcCxcbiAgICBoYXNBdHRyaWJ1dGUsXG4gICAgZ2V0QXR0cmlidXRlVmFsdWUsXG4gICAgZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlLFxuICAgIGdldENsb3Nlc3RNYXRjaCxcbiAgICBnZXRFeHByZXNzaW9uVmFycyxcbiAgICBnZXRIZWFkZXJzLFxuICAgIGdldElucHV0VmFsdWVzLFxuICAgIGdldEludGVybmFsRGF0YSxcbiAgICBnZXRTd2FwU3BlY2lmaWNhdGlvbixcbiAgICBnZXRUcmlnZ2VyU3BlY3MsXG4gICAgZ2V0VGFyZ2V0LFxuICAgIG1ha2VGcmFnbWVudCxcbiAgICBtZXJnZU9iamVjdHMsXG4gICAgbWFrZVNldHRsZUluZm8sXG4gICAgb29iU3dhcCxcbiAgICBxdWVyeVNlbGVjdG9yRXh0LFxuICAgIHNldHRsZUltbWVkaWF0ZWx5LFxuICAgIHNob3VsZENhbmNlbCxcbiAgICB0cmlnZ2VyRXZlbnQsXG4gICAgdHJpZ2dlckVycm9yRXZlbnQsXG4gICAgd2l0aEV4dGVuc2lvbnNcbiAgfVxuXG4gIGNvbnN0IFZFUkJTID0gWydnZXQnLCAncG9zdCcsICdwdXQnLCAnZGVsZXRlJywgJ3BhdGNoJ11cbiAgY29uc3QgVkVSQl9TRUxFQ1RPUiA9IFZFUkJTLm1hcChmdW5jdGlvbih2ZXJiKSB7XG4gICAgcmV0dXJuICdbaHgtJyArIHZlcmIgKyAnXSwgW2RhdGEtaHgtJyArIHZlcmIgKyAnXSdcbiAgfSkuam9pbignLCAnKVxuXG4gIGNvbnN0IEhFQURfVEFHX1JFR0VYID0gbWFrZVRhZ1JlZ0V4KCdoZWFkJylcblxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBVdGlsaXRpZXNcbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhZ1xuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGdsb2JhbFxuICAgKiBAcmV0dXJucyB7UmVnRXhwfVxuICAgKi9cbiAgZnVuY3Rpb24gbWFrZVRhZ1JlZ0V4KHRhZywgZ2xvYmFsID0gZmFsc2UpIHtcbiAgICByZXR1cm4gbmV3IFJlZ0V4cChgPCR7dGFnfShcXFxcc1tePl0qPnw+KShbXFxcXHNcXFxcU10qPyk8XFxcXC8ke3RhZ30+YCxcbiAgICAgIGdsb2JhbCA/ICdnaW0nIDogJ2ltJylcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXJzZXMgYW4gaW50ZXJ2YWwgc3RyaW5nIGNvbnNpc3RlbnQgd2l0aCB0aGUgd2F5IGh0bXggZG9lcy4gVXNlZnVsIGZvciBwbHVnaW5zIHRoYXQgaGF2ZSB0aW1pbmctcmVsYXRlZCBhdHRyaWJ1dGVzLlxuICAgKlxuICAgKiBDYXV0aW9uOiBBY2NlcHRzIGFuIGludCBmb2xsb3dlZCBieSBlaXRoZXIgKipzKiogb3IgKiptcyoqLiBBbGwgb3RoZXIgdmFsdWVzIHVzZSAqKnBhcnNlRmxvYXQqKlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNwYXJzZUludGVydmFsXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHIgdGltaW5nIHN0cmluZ1xuICAgKiBAcmV0dXJucyB7bnVtYmVyfHVuZGVmaW5lZH1cbiAgICovXG4gIGZ1bmN0aW9uIHBhcnNlSW50ZXJ2YWwoc3RyKSB7XG4gICAgaWYgKHN0ciA9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWRcbiAgICB9XG5cbiAgICBsZXQgaW50ZXJ2YWwgPSBOYU5cbiAgICBpZiAoc3RyLnNsaWNlKC0yKSA9PSAnbXMnKSB7XG4gICAgICBpbnRlcnZhbCA9IHBhcnNlRmxvYXQoc3RyLnNsaWNlKDAsIC0yKSlcbiAgICB9IGVsc2UgaWYgKHN0ci5zbGljZSgtMSkgPT0gJ3MnKSB7XG4gICAgICBpbnRlcnZhbCA9IHBhcnNlRmxvYXQoc3RyLnNsaWNlKDAsIC0xKSkgKiAxMDAwXG4gICAgfSBlbHNlIGlmIChzdHIuc2xpY2UoLTEpID09ICdtJykge1xuICAgICAgaW50ZXJ2YWwgPSBwYXJzZUZsb2F0KHN0ci5zbGljZSgwLCAtMSkpICogMTAwMCAqIDYwXG4gICAgfSBlbHNlIHtcbiAgICAgIGludGVydmFsID0gcGFyc2VGbG9hdChzdHIpXG4gICAgfVxuICAgIHJldHVybiBpc05hTihpbnRlcnZhbCkgPyB1bmRlZmluZWQgOiBpbnRlcnZhbFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAqIEByZXR1cm5zIHsoc3RyaW5nIHwgbnVsbCl9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRSYXdBdHRyaWJ1dGUoZWx0LCBuYW1lKSB7XG4gICAgcmV0dXJuIGVsdCBpbnN0YW5jZW9mIEVsZW1lbnQgJiYgZWx0LmdldEF0dHJpYnV0ZShuYW1lKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBxdWFsaWZpZWROYW1lXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgLy8gcmVzb2x2ZSB3aXRoIGJvdGggaHggYW5kIGRhdGEtaHggcHJlZml4ZXNcbiAgZnVuY3Rpb24gaGFzQXR0cmlidXRlKGVsdCwgcXVhbGlmaWVkTmFtZSkge1xuICAgIHJldHVybiAhIWVsdC5oYXNBdHRyaWJ1dGUgJiYgKGVsdC5oYXNBdHRyaWJ1dGUocXVhbGlmaWVkTmFtZSkgfHxcbiAgICAgIGVsdC5oYXNBdHRyaWJ1dGUoJ2RhdGEtJyArIHF1YWxpZmllZE5hbWUpKVxuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBxdWFsaWZpZWROYW1lXG4gICAqIEByZXR1cm5zIHsoc3RyaW5nIHwgbnVsbCl9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRBdHRyaWJ1dGVWYWx1ZShlbHQsIHF1YWxpZmllZE5hbWUpIHtcbiAgICByZXR1cm4gZ2V0UmF3QXR0cmlidXRlKGVsdCwgcXVhbGlmaWVkTmFtZSkgfHwgZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ2RhdGEtJyArIHF1YWxpZmllZE5hbWUpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHJldHVybnMge05vZGUgfCBudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gcGFyZW50RWx0KGVsdCkge1xuICAgIGNvbnN0IHBhcmVudCA9IGVsdC5wYXJlbnRFbGVtZW50XG4gICAgaWYgKCFwYXJlbnQgJiYgZWx0LnBhcmVudE5vZGUgaW5zdGFuY2VvZiBTaGFkb3dSb290KSByZXR1cm4gZWx0LnBhcmVudE5vZGVcbiAgICByZXR1cm4gcGFyZW50XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMge0RvY3VtZW50fVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0RG9jdW1lbnQoKSB7XG4gICAgcmV0dXJuIGRvY3VtZW50XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHBhcmFtIHtib29sZWFufSBnbG9iYWxcbiAgICogQHJldHVybnMge05vZGV8RG9jdW1lbnR9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRSb290Tm9kZShlbHQsIGdsb2JhbCkge1xuICAgIHJldHVybiBlbHQuZ2V0Um9vdE5vZGUgPyBlbHQuZ2V0Um9vdE5vZGUoeyBjb21wb3NlZDogZ2xvYmFsIH0pIDogZ2V0RG9jdW1lbnQoKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqIEBwYXJhbSB7KGU6Tm9kZSkgPT4gYm9vbGVhbn0gY29uZGl0aW9uXG4gICAqIEByZXR1cm5zIHtOb2RlIHwgbnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIGdldENsb3Nlc3RNYXRjaChlbHQsIGNvbmRpdGlvbikge1xuICAgIHdoaWxlIChlbHQgJiYgIWNvbmRpdGlvbihlbHQpKSB7XG4gICAgICBlbHQgPSBwYXJlbnRFbHQoZWx0KVxuICAgIH1cblxuICAgIHJldHVybiBlbHQgfHwgbnVsbFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gaW5pdGlhbEVsZW1lbnRcbiAgICogQHBhcmFtIHtFbGVtZW50fSBhbmNlc3RvclxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXR0cmlidXRlTmFtZVxuICAgKiBAcmV0dXJucyB7c3RyaW5nfG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRBdHRyaWJ1dGVWYWx1ZVdpdGhEaXNpbmhlcml0YW5jZShpbml0aWFsRWxlbWVudCwgYW5jZXN0b3IsIGF0dHJpYnV0ZU5hbWUpIHtcbiAgICBjb25zdCBhdHRyaWJ1dGVWYWx1ZSA9IGdldEF0dHJpYnV0ZVZhbHVlKGFuY2VzdG9yLCBhdHRyaWJ1dGVOYW1lKVxuICAgIGNvbnN0IGRpc2luaGVyaXQgPSBnZXRBdHRyaWJ1dGVWYWx1ZShhbmNlc3RvciwgJ2h4LWRpc2luaGVyaXQnKVxuICAgIHZhciBpbmhlcml0ID0gZ2V0QXR0cmlidXRlVmFsdWUoYW5jZXN0b3IsICdoeC1pbmhlcml0JylcbiAgICBpZiAoaW5pdGlhbEVsZW1lbnQgIT09IGFuY2VzdG9yKSB7XG4gICAgICBpZiAoaHRteC5jb25maWcuZGlzYWJsZUluaGVyaXRhbmNlKSB7XG4gICAgICAgIGlmIChpbmhlcml0ICYmIChpbmhlcml0ID09PSAnKicgfHwgaW5oZXJpdC5zcGxpdCgnICcpLmluZGV4T2YoYXR0cmlidXRlTmFtZSkgPj0gMCkpIHtcbiAgICAgICAgICByZXR1cm4gYXR0cmlidXRlVmFsdWVcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoZGlzaW5oZXJpdCAmJiAoZGlzaW5oZXJpdCA9PT0gJyonIHx8IGRpc2luaGVyaXQuc3BsaXQoJyAnKS5pbmRleE9mKGF0dHJpYnV0ZU5hbWUpID49IDApKSB7XG4gICAgICAgIHJldHVybiAndW5zZXQnXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBhdHRyaWJ1dGVWYWx1ZVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhdHRyaWJ1dGVOYW1lXG4gICAqIEByZXR1cm5zIHtzdHJpbmcgfCBudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgYXR0cmlidXRlTmFtZSkge1xuICAgIGxldCBjbG9zZXN0QXR0ciA9IG51bGxcbiAgICBnZXRDbG9zZXN0TWF0Y2goZWx0LCBmdW5jdGlvbihlKSB7XG4gICAgICByZXR1cm4gISEoY2xvc2VzdEF0dHIgPSBnZXRBdHRyaWJ1dGVWYWx1ZVdpdGhEaXNpbmhlcml0YW5jZShlbHQsIGFzRWxlbWVudChlKSwgYXR0cmlidXRlTmFtZSkpXG4gICAgfSlcbiAgICBpZiAoY2xvc2VzdEF0dHIgIT09ICd1bnNldCcpIHtcbiAgICAgIHJldHVybiBjbG9zZXN0QXR0clxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3JcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBtYXRjaGVzKGVsdCwgc2VsZWN0b3IpIHtcbiAgICAvLyBAdHMtaWdub3JlOiBub24tc3RhbmRhcmQgcHJvcGVydGllcyBmb3IgYnJvd3NlciBjb21wYXRpYmlsaXR5XG4gICAgLy8gbm9pbnNwZWN0aW9uIEpTVW5yZXNvbHZlZFZhcmlhYmxlXG4gICAgY29uc3QgbWF0Y2hlc0Z1bmN0aW9uID0gZWx0IGluc3RhbmNlb2YgRWxlbWVudCAmJiAoZWx0Lm1hdGNoZXMgfHwgZWx0Lm1hdGNoZXNTZWxlY3RvciB8fCBlbHQubXNNYXRjaGVzU2VsZWN0b3IgfHwgZWx0Lm1vek1hdGNoZXNTZWxlY3RvciB8fCBlbHQud2Via2l0TWF0Y2hlc1NlbGVjdG9yIHx8IGVsdC5vTWF0Y2hlc1NlbGVjdG9yKVxuICAgIHJldHVybiAhIW1hdGNoZXNGdW5jdGlvbiAmJiBtYXRjaGVzRnVuY3Rpb24uY2FsbChlbHQsIHNlbGVjdG9yKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGZ1bmN0aW9uIGdldFN0YXJ0VGFnKHN0cikge1xuICAgIGNvbnN0IHRhZ01hdGNoZXIgPSAvPChbYS16XVteXFwvXFwwPlxceDIwXFx0XFxyXFxuXFxmXSopL2lcbiAgICBjb25zdCBtYXRjaCA9IHRhZ01hdGNoZXIuZXhlYyhzdHIpXG4gICAgaWYgKG1hdGNoKSB7XG4gICAgICByZXR1cm4gbWF0Y2hbMV0udG9Mb3dlckNhc2UoKVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gJydcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHJlc3BcbiAgICogQHJldHVybnMge0RvY3VtZW50fVxuICAgKi9cbiAgZnVuY3Rpb24gcGFyc2VIVE1MKHJlc3ApIHtcbiAgICBjb25zdCBwYXJzZXIgPSBuZXcgRE9NUGFyc2VyKClcbiAgICByZXR1cm4gcGFyc2VyLnBhcnNlRnJvbVN0cmluZyhyZXNwLCAndGV4dC9odG1sJylcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0RvY3VtZW50RnJhZ21lbnR9IGZyYWdtZW50XG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqL1xuICBmdW5jdGlvbiB0YWtlQ2hpbGRyZW5Gb3IoZnJhZ21lbnQsIGVsdCkge1xuICAgIHdoaWxlIChlbHQuY2hpbGROb2Rlcy5sZW5ndGggPiAwKSB7XG4gICAgICBmcmFnbWVudC5hcHBlbmQoZWx0LmNoaWxkTm9kZXNbMF0pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7SFRNTFNjcmlwdEVsZW1lbnR9IHNjcmlwdFxuICAgKiBAcmV0dXJucyB7SFRNTFNjcmlwdEVsZW1lbnR9XG4gICAqL1xuICBmdW5jdGlvbiBkdXBsaWNhdGVTY3JpcHQoc2NyaXB0KSB7XG4gICAgY29uc3QgbmV3U2NyaXB0ID0gZ2V0RG9jdW1lbnQoKS5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKVxuICAgIGZvckVhY2goc2NyaXB0LmF0dHJpYnV0ZXMsIGZ1bmN0aW9uKGF0dHIpIHtcbiAgICAgIG5ld1NjcmlwdC5zZXRBdHRyaWJ1dGUoYXR0ci5uYW1lLCBhdHRyLnZhbHVlKVxuICAgIH0pXG4gICAgbmV3U2NyaXB0LnRleHRDb250ZW50ID0gc2NyaXB0LnRleHRDb250ZW50XG4gICAgbmV3U2NyaXB0LmFzeW5jID0gZmFsc2VcbiAgICBpZiAoaHRteC5jb25maWcuaW5saW5lU2NyaXB0Tm9uY2UpIHtcbiAgICAgIG5ld1NjcmlwdC5ub25jZSA9IGh0bXguY29uZmlnLmlubGluZVNjcmlwdE5vbmNlXG4gICAgfVxuICAgIHJldHVybiBuZXdTY3JpcHRcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0hUTUxTY3JpcHRFbGVtZW50fSBzY3JpcHRcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBpc0phdmFTY3JpcHRTY3JpcHROb2RlKHNjcmlwdCkge1xuICAgIHJldHVybiBzY3JpcHQubWF0Y2hlcygnc2NyaXB0JykgJiYgKHNjcmlwdC50eXBlID09PSAndGV4dC9qYXZhc2NyaXB0JyB8fCBzY3JpcHQudHlwZSA9PT0gJ21vZHVsZScgfHwgc2NyaXB0LnR5cGUgPT09ICcnKVxuICB9XG5cbiAgLyoqXG4gICAqIHdlIGhhdmUgdG8gbWFrZSBuZXcgY29waWVzIG9mIHNjcmlwdCB0YWdzIHRoYXQgd2UgYXJlIGdvaW5nIHRvIGluc2VydCBiZWNhdXNlXG4gICAqIFNPTUUgYnJvd3NlcnMgKG5vdCBzYXlpbmcgd2hvLCBidXQgaXQgaW52b2x2ZXMgYW4gZWxlbWVudCBhbmQgYW4gYW5pbWFsKSBkb24ndFxuICAgKiBleGVjdXRlIHNjcmlwdHMgY3JlYXRlZCBpbiA8dGVtcGxhdGU+IHRhZ3Mgd2hlbiB0aGV5IGFyZSBpbnNlcnRlZCBpbnRvIHRoZSBET01cbiAgICogYW5kIGFsbCB0aGUgb3RoZXJzIGRvIGxtYW9cbiAgICogQHBhcmFtIHtEb2N1bWVudEZyYWdtZW50fSBmcmFnbWVudFxuICAgKi9cbiAgZnVuY3Rpb24gbm9ybWFsaXplU2NyaXB0VGFncyhmcmFnbWVudCkge1xuICAgIEFycmF5LmZyb20oZnJhZ21lbnQucXVlcnlTZWxlY3RvckFsbCgnc2NyaXB0JykpLmZvckVhY2goLyoqIEBwYXJhbSB7SFRNTFNjcmlwdEVsZW1lbnR9IHNjcmlwdCAqLyAoc2NyaXB0KSA9PiB7XG4gICAgICBpZiAoaXNKYXZhU2NyaXB0U2NyaXB0Tm9kZShzY3JpcHQpKSB7XG4gICAgICAgIGNvbnN0IG5ld1NjcmlwdCA9IGR1cGxpY2F0ZVNjcmlwdChzY3JpcHQpXG4gICAgICAgIGNvbnN0IHBhcmVudCA9IHNjcmlwdC5wYXJlbnROb2RlXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcGFyZW50Lmluc2VydEJlZm9yZShuZXdTY3JpcHQsIHNjcmlwdClcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGxvZ0Vycm9yKGUpXG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgc2NyaXB0LnJlbW92ZSgpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEB0eXBlZGVmIHtEb2N1bWVudEZyYWdtZW50ICYge3RpdGxlPzogc3RyaW5nfX0gRG9jdW1lbnRGcmFnbWVudFdpdGhUaXRsZVxuICAgKiBAZGVzY3JpcHRpb24gIGEgZG9jdW1lbnQgZnJhZ21lbnQgcmVwcmVzZW50aW5nIHRoZSByZXNwb25zZSBIVE1MLCBpbmNsdWRpbmdcbiAgICogYSBgdGl0bGVgIHByb3BlcnR5IGZvciBhbnkgdGl0bGUgaW5mb3JtYXRpb24gZm91bmRcbiAgICovXG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSByZXNwb25zZSBIVE1MXG4gICAqIEByZXR1cm5zIHtEb2N1bWVudEZyYWdtZW50V2l0aFRpdGxlfVxuICAgKi9cbiAgZnVuY3Rpb24gbWFrZUZyYWdtZW50KHJlc3BvbnNlKSB7XG4gICAgLy8gc3RyaXAgaGVhZCB0YWcgdG8gZGV0ZXJtaW5lIHNoYXBlIG9mIHJlc3BvbnNlIHdlIGFyZSBkZWFsaW5nIHdpdGhcbiAgICBjb25zdCByZXNwb25zZVdpdGhOb0hlYWQgPSByZXNwb25zZS5yZXBsYWNlKEhFQURfVEFHX1JFR0VYLCAnJylcbiAgICBjb25zdCBzdGFydFRhZyA9IGdldFN0YXJ0VGFnKHJlc3BvbnNlV2l0aE5vSGVhZClcbiAgICAvKiogQHR5cGUgRG9jdW1lbnRGcmFnbWVudFdpdGhUaXRsZSAqL1xuICAgIGxldCBmcmFnbWVudFxuICAgIGlmIChzdGFydFRhZyA9PT0gJ2h0bWwnKSB7XG4gICAgICAvLyBpZiBpdCBpcyBhIGZ1bGwgZG9jdW1lbnQsIHBhcnNlIGl0IGFuZCByZXR1cm4gdGhlIGJvZHlcbiAgICAgIGZyYWdtZW50ID0gLyoqIEB0eXBlIERvY3VtZW50RnJhZ21lbnRXaXRoVGl0bGUgKi8gKG5ldyBEb2N1bWVudEZyYWdtZW50KCkpXG4gICAgICBjb25zdCBkb2MgPSBwYXJzZUhUTUwocmVzcG9uc2UpXG4gICAgICB0YWtlQ2hpbGRyZW5Gb3IoZnJhZ21lbnQsIGRvYy5ib2R5KVxuICAgICAgZnJhZ21lbnQudGl0bGUgPSBkb2MudGl0bGVcbiAgICB9IGVsc2UgaWYgKHN0YXJ0VGFnID09PSAnYm9keScpIHtcbiAgICAgIC8vIHBhcnNlIGJvZHkgdy9vIHdyYXBwaW5nIGluIHRlbXBsYXRlXG4gICAgICBmcmFnbWVudCA9IC8qKiBAdHlwZSBEb2N1bWVudEZyYWdtZW50V2l0aFRpdGxlICovIChuZXcgRG9jdW1lbnRGcmFnbWVudCgpKVxuICAgICAgY29uc3QgZG9jID0gcGFyc2VIVE1MKHJlc3BvbnNlV2l0aE5vSGVhZClcbiAgICAgIHRha2VDaGlsZHJlbkZvcihmcmFnbWVudCwgZG9jLmJvZHkpXG4gICAgICBmcmFnbWVudC50aXRsZSA9IGRvYy50aXRsZVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBvdGhlcndpc2Ugd2UgaGF2ZSBub24tYm9keSBwYXJ0aWFsIEhUTUwgY29udGVudCwgc28gd3JhcCBpdCBpbiBhIHRlbXBsYXRlIHRvIG1heGltaXplIHBhcnNpbmcgZmxleGliaWxpdHlcbiAgICAgIGNvbnN0IGRvYyA9IHBhcnNlSFRNTCgnPGJvZHk+PHRlbXBsYXRlIGNsYXNzPVwiaW50ZXJuYWwtaHRteC13cmFwcGVyXCI+JyArIHJlc3BvbnNlV2l0aE5vSGVhZCArICc8L3RlbXBsYXRlPjwvYm9keT4nKVxuICAgICAgZnJhZ21lbnQgPSAvKiogQHR5cGUgRG9jdW1lbnRGcmFnbWVudFdpdGhUaXRsZSAqLyAoZG9jLnF1ZXJ5U2VsZWN0b3IoJ3RlbXBsYXRlJykuY29udGVudClcbiAgICAgIC8vIGV4dHJhY3QgdGl0bGUgaW50byBmcmFnbWVudCBmb3IgbGF0ZXIgcHJvY2Vzc2luZ1xuICAgICAgZnJhZ21lbnQudGl0bGUgPSBkb2MudGl0bGVcblxuICAgICAgLy8gZm9yIGxlZ2FjeSByZWFzb25zIHdlIHN1cHBvcnQgYSB0aXRsZSB0YWcgYXQgdGhlIHJvb3QgbGV2ZWwgb2Ygbm9uLWJvZHkgcmVzcG9uc2VzLCBzbyB3ZSBuZWVkIHRvIGhhbmRsZSBpdFxuICAgICAgdmFyIHRpdGxlRWxlbWVudCA9IGZyYWdtZW50LnF1ZXJ5U2VsZWN0b3IoJ3RpdGxlJylcbiAgICAgIGlmICh0aXRsZUVsZW1lbnQgJiYgdGl0bGVFbGVtZW50LnBhcmVudE5vZGUgPT09IGZyYWdtZW50KSB7XG4gICAgICAgIHRpdGxlRWxlbWVudC5yZW1vdmUoKVxuICAgICAgICBmcmFnbWVudC50aXRsZSA9IHRpdGxlRWxlbWVudC5pbm5lclRleHRcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGZyYWdtZW50KSB7XG4gICAgICBpZiAoaHRteC5jb25maWcuYWxsb3dTY3JpcHRUYWdzKSB7XG4gICAgICAgIG5vcm1hbGl6ZVNjcmlwdFRhZ3MoZnJhZ21lbnQpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyByZW1vdmUgYWxsIHNjcmlwdCB0YWdzIGlmIHNjcmlwdHMgYXJlIGRpc2FibGVkXG4gICAgICAgIGZyYWdtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ3NjcmlwdCcpLmZvckVhY2goKHNjcmlwdCkgPT4gc2NyaXB0LnJlbW92ZSgpKVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZnJhZ21lbnRcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jXG4gICAqL1xuICBmdW5jdGlvbiBtYXliZUNhbGwoZnVuYykge1xuICAgIGlmIChmdW5jKSB7XG4gICAgICBmdW5jKClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHthbnl9IG9cbiAgICogQHBhcmFtIHtzdHJpbmd9IHR5cGVcbiAgICogQHJldHVybnNcbiAgICovXG4gIGZ1bmN0aW9uIGlzVHlwZShvLCB0eXBlKSB7XG4gICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKSA9PT0gJ1tvYmplY3QgJyArIHR5cGUgKyAnXSdcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0geyp9IG9cbiAgICogQHJldHVybnMge28gaXMgRnVuY3Rpb259XG4gICAqL1xuICBmdW5jdGlvbiBpc0Z1bmN0aW9uKG8pIHtcbiAgICByZXR1cm4gdHlwZW9mIG8gPT09ICdmdW5jdGlvbidcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0geyp9IG9cbiAgICogQHJldHVybnMge28gaXMgT2JqZWN0fVxuICAgKi9cbiAgZnVuY3Rpb24gaXNSYXdPYmplY3Qobykge1xuICAgIHJldHVybiBpc1R5cGUobywgJ09iamVjdCcpXG4gIH1cblxuICAvKipcbiAgICogQHR5cGVkZWYge09iamVjdH0gT25IYW5kbGVyXG4gICAqIEBwcm9wZXJ0eSB7KGtleW9mIEhUTUxFbGVtZW50RXZlbnRNYXApfHN0cmluZ30gZXZlbnRcbiAgICogQHByb3BlcnR5IHtFdmVudExpc3RlbmVyfSBsaXN0ZW5lclxuICAgKi9cblxuICAvKipcbiAgICogQHR5cGVkZWYge09iamVjdH0gTGlzdGVuZXJJbmZvXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB0cmlnZ2VyXG4gICAqIEBwcm9wZXJ0eSB7RXZlbnRMaXN0ZW5lcn0gbGlzdGVuZXJcbiAgICogQHByb3BlcnR5IHtFdmVudFRhcmdldH0gb25cbiAgICovXG5cbiAgLyoqXG4gICAqIEB0eXBlZGVmIHtPYmplY3R9IEh0bXhOb2RlSW50ZXJuYWxEYXRhXG4gICAqIEVsZW1lbnQgZGF0YVxuICAgKiBAcHJvcGVydHkge251bWJlcn0gW2luaXRIYXNoXVxuICAgKiBAcHJvcGVydHkge2Jvb2xlYW59IFtib29zdGVkXVxuICAgKiBAcHJvcGVydHkge09uSGFuZGxlcltdfSBbb25IYW5kbGVyc11cbiAgICogQHByb3BlcnR5IHtudW1iZXJ9IFt0aW1lb3V0XVxuICAgKiBAcHJvcGVydHkge0xpc3RlbmVySW5mb1tdfSBbbGlzdGVuZXJJbmZvc11cbiAgICogQHByb3BlcnR5IHtib29sZWFufSBbY2FuY2VsbGVkXVxuICAgKiBAcHJvcGVydHkge2Jvb2xlYW59IFt0cmlnZ2VyZWRPbmNlXVxuICAgKiBAcHJvcGVydHkge251bWJlcn0gW2RlbGF5ZWRdXG4gICAqIEBwcm9wZXJ0eSB7bnVtYmVyfG51bGx9IFt0aHJvdHRsZV1cbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IFtsYXN0VmFsdWVdXG4gICAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2xvYWRlZF1cbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IFtwYXRoXVxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gW3ZlcmJdXG4gICAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW3BvbGxpbmddXG4gICAqIEBwcm9wZXJ0eSB7SFRNTEJ1dHRvbkVsZW1lbnR8SFRNTElucHV0RWxlbWVudHxudWxsfSBbbGFzdEJ1dHRvbkNsaWNrZWRdXG4gICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbcmVxdWVzdENvdW50XVxuICAgKiBAcHJvcGVydHkge1hNTEh0dHBSZXF1ZXN0fSBbeGhyXVxuICAgKiBAcHJvcGVydHkgeygoKSA9PiB2b2lkKVtdfSBbcXVldWVkUmVxdWVzdHNdXG4gICAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2Fib3J0YWJsZV1cbiAgICpcbiAgICogRXZlbnQgZGF0YVxuICAgKiBAcHJvcGVydHkge0h0bXhUcmlnZ2VyU3BlY2lmaWNhdGlvbn0gW3RyaWdnZXJTcGVjXVxuICAgKiBAcHJvcGVydHkge0V2ZW50VGFyZ2V0W119IFtoYW5kbGVkRm9yXVxuICAgKi9cblxuICAvKipcbiAgICogZ2V0SW50ZXJuYWxEYXRhIHJldHJpZXZlcyBcInByaXZhdGVcIiBkYXRhIHN0b3JlZCBieSBodG14IHdpdGhpbiBhbiBlbGVtZW50XG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR8RXZlbnR9IGVsdFxuICAgKiBAcmV0dXJucyB7SHRteE5vZGVJbnRlcm5hbERhdGF9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRJbnRlcm5hbERhdGEoZWx0KSB7XG4gICAgY29uc3QgZGF0YVByb3AgPSAnaHRteC1pbnRlcm5hbC1kYXRhJ1xuICAgIGxldCBkYXRhID0gZWx0W2RhdGFQcm9wXVxuICAgIGlmICghZGF0YSkge1xuICAgICAgZGF0YSA9IGVsdFtkYXRhUHJvcF0gPSB7fVxuICAgIH1cbiAgICByZXR1cm4gZGF0YVxuICB9XG5cbiAgLyoqXG4gICAqIHRvQXJyYXkgY29udmVydHMgYW4gQXJyYXlMaWtlIG9iamVjdCBpbnRvIGEgcmVhbCBhcnJheS5cbiAgICogQHRlbXBsYXRlIFRcbiAgICogQHBhcmFtIHtBcnJheUxpa2U8VD59IGFyclxuICAgKiBAcmV0dXJucyB7VFtdfVxuICAgKi9cbiAgZnVuY3Rpb24gdG9BcnJheShhcnIpIHtcbiAgICBjb25zdCByZXR1cm5BcnIgPSBbXVxuICAgIGlmIChhcnIpIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHJldHVybkFyci5wdXNoKGFycltpXSlcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJldHVybkFyclxuICB9XG5cbiAgLyoqXG4gICAqIEB0ZW1wbGF0ZSBUXG4gICAqIEBwYXJhbSB7VFtdfE5hbWVkTm9kZU1hcHxIVE1MQ29sbGVjdGlvbnxIVE1MRm9ybUNvbnRyb2xzQ29sbGVjdGlvbnxBcnJheUxpa2U8VD59IGFyclxuICAgKiBAcGFyYW0geyhUKSA9PiB2b2lkfSBmdW5jXG4gICAqL1xuICBmdW5jdGlvbiBmb3JFYWNoKGFyciwgZnVuYykge1xuICAgIGlmIChhcnIpIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGZ1bmMoYXJyW2ldKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gaXNTY3JvbGxlZEludG9WaWV3KGVsKSB7XG4gICAgY29uc3QgcmVjdCA9IGVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpXG4gICAgY29uc3QgZWxlbVRvcCA9IHJlY3QudG9wXG4gICAgY29uc3QgZWxlbUJvdHRvbSA9IHJlY3QuYm90dG9tXG4gICAgcmV0dXJuIGVsZW1Ub3AgPCB3aW5kb3cuaW5uZXJIZWlnaHQgJiYgZWxlbUJvdHRvbSA+PSAwXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBib2R5Q29udGFpbnMoZWx0KSB7XG4gICAgLy8gSUUgRml4XG4gICAgY29uc3Qgcm9vdE5vZGUgPSBlbHQuZ2V0Um9vdE5vZGUgJiYgZWx0LmdldFJvb3ROb2RlKClcbiAgICBpZiAocm9vdE5vZGUgJiYgcm9vdE5vZGUgaW5zdGFuY2VvZiB3aW5kb3cuU2hhZG93Um9vdCkge1xuICAgICAgcmV0dXJuIGdldERvY3VtZW50KCkuYm9keS5jb250YWlucyhyb290Tm9kZS5ob3N0KVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZ2V0RG9jdW1lbnQoKS5ib2R5LmNvbnRhaW5zKGVsdClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRyaWdnZXJcbiAgICogQHJldHVybnMge3N0cmluZ1tdfVxuICAgKi9cbiAgZnVuY3Rpb24gc3BsaXRPbldoaXRlc3BhY2UodHJpZ2dlcikge1xuICAgIHJldHVybiB0cmlnZ2VyLnRyaW0oKS5zcGxpdCgvXFxzKy8pXG4gIH1cblxuICAvKipcbiAgICogbWVyZ2VPYmplY3RzIHRha2VzIGFsbCB0aGUga2V5cyBmcm9tXG4gICAqIG9iajIgYW5kIGR1cGxpY2F0ZXMgdGhlbSBpbnRvIG9iajFcbiAgICogQHRlbXBsYXRlIFQxXG4gICAqIEB0ZW1wbGF0ZSBUMlxuICAgKiBAcGFyYW0ge1QxfSBvYmoxXG4gICAqIEBwYXJhbSB7VDJ9IG9iajJcbiAgICogQHJldHVybnMge1QxICYgVDJ9XG4gICAqL1xuICBmdW5jdGlvbiBtZXJnZU9iamVjdHMob2JqMSwgb2JqMikge1xuICAgIGZvciAoY29uc3Qga2V5IGluIG9iajIpIHtcbiAgICAgIGlmIChvYmoyLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZSB0c2MgZG9lc24ndCBzZWVtIHRvIHByb3Blcmx5IGhhbmRsZSB0eXBlcyBtZXJnaW5nXG4gICAgICAgIG9iajFba2V5XSA9IG9iajJba2V5XVxuICAgICAgfVxuICAgIH1cbiAgICAvLyBAdHMtaWdub3JlIHRzYyBkb2Vzbid0IHNlZW0gdG8gcHJvcGVybHkgaGFuZGxlIHR5cGVzIG1lcmdpbmdcbiAgICByZXR1cm4gb2JqMVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBqU3RyaW5nXG4gICAqIEByZXR1cm5zIHthbnl8bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIHBhcnNlSlNPTihqU3RyaW5nKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBKU09OLnBhcnNlKGpTdHJpbmcpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ0Vycm9yKGVycm9yKVxuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBjYW5BY2Nlc3NMb2NhbFN0b3JhZ2UoKSB7XG4gICAgY29uc3QgdGVzdCA9ICdodG14OmxvY2FsU3RvcmFnZVRlc3QnXG4gICAgdHJ5IHtcbiAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKHRlc3QsIHRlc3QpXG4gICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSh0ZXN0KVxuICAgICAgcmV0dXJuIHRydWVcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGZ1bmN0aW9uIG5vcm1hbGl6ZVBhdGgocGF0aCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB1cmwgPSBuZXcgVVJMKHBhdGgpXG4gICAgICBpZiAodXJsKSB7XG4gICAgICAgIHBhdGggPSB1cmwucGF0aG5hbWUgKyB1cmwuc2VhcmNoXG4gICAgICB9XG4gICAgICAvLyByZW1vdmUgdHJhaWxpbmcgc2xhc2gsIHVubGVzcyBpbmRleCBwYWdlXG4gICAgICBpZiAoISgvXlxcLyQvLnRlc3QocGF0aCkpKSB7XG4gICAgICAgIHBhdGggPSBwYXRoLnJlcGxhY2UoL1xcLyskLywgJycpXG4gICAgICB9XG4gICAgICByZXR1cm4gcGF0aFxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIGJlIGtpbmQgdG8gSUUxMSwgd2hpY2ggZG9lc24ndCBzdXBwb3J0IFVSTCgpXG4gICAgICByZXR1cm4gcGF0aFxuICAgIH1cbiAgfVxuXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBwdWJsaWMgQVBJXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gICAqIEByZXR1cm5zIHthbnl9XG4gICAqL1xuICBmdW5jdGlvbiBpbnRlcm5hbEV2YWwoc3RyKSB7XG4gICAgcmV0dXJuIG1heWJlRXZhbChnZXREb2N1bWVudCgpLmJvZHksIGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIGV2YWwoc3RyKVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIGNhbGxiYWNrIGZvciB0aGUgKipodG14OmxvYWQqKiBldmVudC4gVGhpcyBjYW4gYmUgdXNlZCB0byBwcm9jZXNzIG5ldyBjb250ZW50LCBmb3IgZXhhbXBsZSBpbml0aWFsaXppbmcgdGhlIGNvbnRlbnQgd2l0aCBhIGphdmFzY3JpcHQgbGlicmFyeVxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNvbkxvYWRcbiAgICpcbiAgICogQHBhcmFtIHsoZWx0OiBOb2RlKSA9PiB2b2lkfSBjYWxsYmFjayB0aGUgY2FsbGJhY2sgdG8gY2FsbCBvbiBuZXdseSBsb2FkZWQgY29udGVudFxuICAgKiBAcmV0dXJucyB7RXZlbnRMaXN0ZW5lcn1cbiAgICovXG4gIGZ1bmN0aW9uIG9uTG9hZEhlbHBlcihjYWxsYmFjaykge1xuICAgIGNvbnN0IHZhbHVlID0gaHRteC5vbignaHRteDpsb2FkJywgLyoqIEBwYXJhbSB7Q3VzdG9tRXZlbnR9IGV2dCAqLyBmdW5jdGlvbihldnQpIHtcbiAgICAgIGNhbGxiYWNrKGV2dC5kZXRhaWwuZWx0KVxuICAgIH0pXG4gICAgcmV0dXJuIHZhbHVlXG4gIH1cblxuICAvKipcbiAgICogTG9nIGFsbCBodG14IGV2ZW50cywgdXNlZnVsIGZvciBkZWJ1Z2dpbmcuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI2xvZ0FsbFxuICAgKi9cbiAgZnVuY3Rpb24gbG9nQWxsKCkge1xuICAgIGh0bXgubG9nZ2VyID0gZnVuY3Rpb24oZWx0LCBldmVudCwgZGF0YSkge1xuICAgICAgaWYgKGNvbnNvbGUpIHtcbiAgICAgICAgY29uc29sZS5sb2coZXZlbnQsIGVsdCwgZGF0YSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBsb2dOb25lKCkge1xuICAgIGh0bXgubG9nZ2VyID0gbnVsbFxuICB9XG5cbiAgLyoqXG4gICAqIEZpbmRzIGFuIGVsZW1lbnQgbWF0Y2hpbmcgdGhlIHNlbGVjdG9yXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI2ZpbmRcbiAgICpcbiAgICogQHBhcmFtIHtQYXJlbnROb2RlfHN0cmluZ30gZWx0T3JTZWxlY3RvciAgdGhlIHJvb3QgZWxlbWVudCB0byBmaW5kIHRoZSBtYXRjaGluZyBlbGVtZW50IGluLCBpbmNsdXNpdmUgfCB0aGUgc2VsZWN0b3IgdG8gbWF0Y2hcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtzZWxlY3Rvcl0gdGhlIHNlbGVjdG9yIHRvIG1hdGNoXG4gICAqIEByZXR1cm5zIHtFbGVtZW50fG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBmaW5kKGVsdE9yU2VsZWN0b3IsIHNlbGVjdG9yKSB7XG4gICAgaWYgKHR5cGVvZiBlbHRPclNlbGVjdG9yICE9PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIGVsdE9yU2VsZWN0b3IucXVlcnlTZWxlY3RvcihzZWxlY3RvcilcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZpbmQoZ2V0RG9jdW1lbnQoKSwgZWx0T3JTZWxlY3RvcilcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRmluZHMgYWxsIGVsZW1lbnRzIG1hdGNoaW5nIHRoZSBzZWxlY3RvclxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNmaW5kQWxsXG4gICAqXG4gICAqIEBwYXJhbSB7UGFyZW50Tm9kZXxzdHJpbmd9IGVsdE9yU2VsZWN0b3IgdGhlIHJvb3QgZWxlbWVudCB0byBmaW5kIHRoZSBtYXRjaGluZyBlbGVtZW50cyBpbiwgaW5jbHVzaXZlIHwgdGhlIHNlbGVjdG9yIHRvIG1hdGNoXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbc2VsZWN0b3JdIHRoZSBzZWxlY3RvciB0byBtYXRjaFxuICAgKiBAcmV0dXJucyB7Tm9kZUxpc3RPZjxFbGVtZW50Pn1cbiAgICovXG4gIGZ1bmN0aW9uIGZpbmRBbGwoZWx0T3JTZWxlY3Rvciwgc2VsZWN0b3IpIHtcbiAgICBpZiAodHlwZW9mIGVsdE9yU2VsZWN0b3IgIT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gZWx0T3JTZWxlY3Rvci5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZmluZEFsbChnZXREb2N1bWVudCgpLCBlbHRPclNlbGVjdG9yKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyBXaW5kb3dcbiAgICovXG4gIGZ1bmN0aW9uIGdldFdpbmRvdygpIHtcbiAgICByZXR1cm4gd2luZG93XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyBhbiBlbGVtZW50IGZyb20gdGhlIERPTVxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNyZW1vdmVcbiAgICpcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtkZWxheV1cbiAgICovXG4gIGZ1bmN0aW9uIHJlbW92ZUVsZW1lbnQoZWx0LCBkZWxheSkge1xuICAgIGVsdCA9IHJlc29sdmVUYXJnZXQoZWx0KVxuICAgIGlmIChkZWxheSkge1xuICAgICAgZ2V0V2luZG93KCkuc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgcmVtb3ZlRWxlbWVudChlbHQpXG4gICAgICAgIGVsdCA9IG51bGxcbiAgICAgIH0sIGRlbGF5KVxuICAgIH0gZWxzZSB7XG4gICAgICBwYXJlbnRFbHQoZWx0KS5yZW1vdmVDaGlsZChlbHQpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7YW55fSBlbHRcbiAgICogQHJldHVybiB7RWxlbWVudHxudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gYXNFbGVtZW50KGVsdCkge1xuICAgIHJldHVybiBlbHQgaW5zdGFuY2VvZiBFbGVtZW50ID8gZWx0IDogbnVsbFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7YW55fSBlbHRcbiAgICogQHJldHVybiB7SFRNTEVsZW1lbnR8bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIGFzSHRtbEVsZW1lbnQoZWx0KSB7XG4gICAgcmV0dXJuIGVsdCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50ID8gZWx0IDogbnVsbFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7YW55fSB2YWx1ZVxuICAgKiBAcmV0dXJuIHtzdHJpbmd8bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIGFzU3RyaW5nKHZhbHVlKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgPyB2YWx1ZSA6IG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fSBlbHRcbiAgICogQHJldHVybiB7UGFyZW50Tm9kZXxudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gYXNQYXJlbnROb2RlKGVsdCkge1xuICAgIHJldHVybiBlbHQgaW5zdGFuY2VvZiBFbGVtZW50IHx8IGVsdCBpbnN0YW5jZW9mIERvY3VtZW50IHx8IGVsdCBpbnN0YW5jZW9mIERvY3VtZW50RnJhZ21lbnQgPyBlbHQgOiBudWxsXG4gIH1cblxuICAvKipcbiAgICogVGhpcyBtZXRob2QgYWRkcyBhIGNsYXNzIHRvIHRoZSBnaXZlbiBlbGVtZW50LlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNhZGRDbGFzc1xuICAgKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR8c3RyaW5nfSBlbHQgdGhlIGVsZW1lbnQgdG8gYWRkIHRoZSBjbGFzcyB0b1xuICAgKiBAcGFyYW0ge3N0cmluZ30gY2xhenogdGhlIGNsYXNzIHRvIGFkZFxuICAgKiBAcGFyYW0ge251bWJlcn0gW2RlbGF5XSB0aGUgZGVsYXkgKGluIG1pbGxpc2Vjb25kcykgYmVmb3JlIGNsYXNzIGlzIGFkZGVkXG4gICAqL1xuICBmdW5jdGlvbiBhZGRDbGFzc1RvRWxlbWVudChlbHQsIGNsYXp6LCBkZWxheSkge1xuICAgIGVsdCA9IGFzRWxlbWVudChyZXNvbHZlVGFyZ2V0KGVsdCkpXG4gICAgaWYgKCFlbHQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBpZiAoZGVsYXkpIHtcbiAgICAgIGdldFdpbmRvdygpLnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgIGFkZENsYXNzVG9FbGVtZW50KGVsdCwgY2xhenopXG4gICAgICAgIGVsdCA9IG51bGxcbiAgICAgIH0sIGRlbGF5KVxuICAgIH0gZWxzZSB7XG4gICAgICBlbHQuY2xhc3NMaXN0ICYmIGVsdC5jbGFzc0xpc3QuYWRkKGNsYXp6KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGEgY2xhc3MgZnJvbSB0aGUgZ2l2ZW4gZWxlbWVudFxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNyZW1vdmVDbGFzc1xuICAgKlxuICAgKiBAcGFyYW0ge05vZGV8c3RyaW5nfSBub2RlIGVsZW1lbnQgdG8gcmVtb3ZlIHRoZSBjbGFzcyBmcm9tXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjbGF6eiB0aGUgY2xhc3MgdG8gcmVtb3ZlXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbZGVsYXldIHRoZSBkZWxheSAoaW4gbWlsbGlzZWNvbmRzIGJlZm9yZSBjbGFzcyBpcyByZW1vdmVkKVxuICAgKi9cbiAgZnVuY3Rpb24gcmVtb3ZlQ2xhc3NGcm9tRWxlbWVudChub2RlLCBjbGF6eiwgZGVsYXkpIHtcbiAgICBsZXQgZWx0ID0gYXNFbGVtZW50KHJlc29sdmVUYXJnZXQobm9kZSkpXG4gICAgaWYgKCFlbHQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBpZiAoZGVsYXkpIHtcbiAgICAgIGdldFdpbmRvdygpLnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgIHJlbW92ZUNsYXNzRnJvbUVsZW1lbnQoZWx0LCBjbGF6eilcbiAgICAgICAgZWx0ID0gbnVsbFxuICAgICAgfSwgZGVsYXkpXG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChlbHQuY2xhc3NMaXN0KSB7XG4gICAgICAgIGVsdC5jbGFzc0xpc3QucmVtb3ZlKGNsYXp6KVxuICAgICAgICAvLyBpZiB0aGVyZSBhcmUgbm8gY2xhc3NlcyBsZWZ0LCByZW1vdmUgdGhlIGNsYXNzIGF0dHJpYnV0ZVxuICAgICAgICBpZiAoZWx0LmNsYXNzTGlzdC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICBlbHQucmVtb3ZlQXR0cmlidXRlKCdjbGFzcycpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVG9nZ2xlcyB0aGUgZ2l2ZW4gY2xhc3Mgb24gYW4gZWxlbWVudFxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyN0b2dnbGVDbGFzc1xuICAgKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR8c3RyaW5nfSBlbHQgdGhlIGVsZW1lbnQgdG8gdG9nZ2xlIHRoZSBjbGFzcyBvblxuICAgKiBAcGFyYW0ge3N0cmluZ30gY2xhenogdGhlIGNsYXNzIHRvIHRvZ2dsZVxuICAgKi9cbiAgZnVuY3Rpb24gdG9nZ2xlQ2xhc3NPbkVsZW1lbnQoZWx0LCBjbGF6eikge1xuICAgIGVsdCA9IHJlc29sdmVUYXJnZXQoZWx0KVxuICAgIGVsdC5jbGFzc0xpc3QudG9nZ2xlKGNsYXp6KVxuICB9XG5cbiAgLyoqXG4gICAqIFRha2VzIHRoZSBnaXZlbiBjbGFzcyBmcm9tIGl0cyBzaWJsaW5ncywgc28gdGhhdCBhbW9uZyBpdHMgc2libGluZ3MsIG9ubHkgdGhlIGdpdmVuIGVsZW1lbnQgd2lsbCBoYXZlIHRoZSBjbGFzcy5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jdGFrZUNsYXNzXG4gICAqXG4gICAqIEBwYXJhbSB7Tm9kZXxzdHJpbmd9IGVsdCB0aGUgZWxlbWVudCB0aGF0IHdpbGwgdGFrZSB0aGUgY2xhc3NcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNsYXp6IHRoZSBjbGFzcyB0byB0YWtlXG4gICAqL1xuICBmdW5jdGlvbiB0YWtlQ2xhc3NGb3JFbGVtZW50KGVsdCwgY2xhenopIHtcbiAgICBlbHQgPSByZXNvbHZlVGFyZ2V0KGVsdClcbiAgICBmb3JFYWNoKGVsdC5wYXJlbnRFbGVtZW50LmNoaWxkcmVuLCBmdW5jdGlvbihjaGlsZCkge1xuICAgICAgcmVtb3ZlQ2xhc3NGcm9tRWxlbWVudChjaGlsZCwgY2xhenopXG4gICAgfSlcbiAgICBhZGRDbGFzc1RvRWxlbWVudChhc0VsZW1lbnQoZWx0KSwgY2xhenopXG4gIH1cblxuICAvKipcbiAgICogRmluZHMgdGhlIGNsb3Nlc3QgbWF0Y2hpbmcgZWxlbWVudCBpbiB0aGUgZ2l2ZW4gZWxlbWVudHMgcGFyZW50YWdlLCBpbmNsdXNpdmUgb2YgdGhlIGVsZW1lbnRcbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jY2xvc2VzdFxuICAgKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR8c3RyaW5nfSBlbHQgdGhlIGVsZW1lbnQgdG8gZmluZCB0aGUgc2VsZWN0b3IgZnJvbVxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3IgdGhlIHNlbGVjdG9yIHRvIGZpbmRcbiAgICogQHJldHVybnMge0VsZW1lbnR8bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIGNsb3Nlc3QoZWx0LCBzZWxlY3Rvcikge1xuICAgIGVsdCA9IGFzRWxlbWVudChyZXNvbHZlVGFyZ2V0KGVsdCkpXG4gICAgaWYgKGVsdCAmJiBlbHQuY2xvc2VzdCkge1xuICAgICAgcmV0dXJuIGVsdC5jbG9zZXN0KHNlbGVjdG9yKVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBUT0RPIHJlbW92ZSB3aGVuIElFIGdvZXMgYXdheVxuICAgICAgZG8ge1xuICAgICAgICBpZiAoZWx0ID09IG51bGwgfHwgbWF0Y2hlcyhlbHQsIHNlbGVjdG9yKSkge1xuICAgICAgICAgIHJldHVybiBlbHRcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgd2hpbGUgKGVsdCA9IGVsdCAmJiBhc0VsZW1lbnQocGFyZW50RWx0KGVsdCkpKVxuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICAgKiBAcGFyYW0ge3N0cmluZ30gcHJlZml4XG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gc3RhcnRzV2l0aChzdHIsIHByZWZpeCkge1xuICAgIHJldHVybiBzdHIuc3Vic3RyaW5nKDAsIHByZWZpeC5sZW5ndGgpID09PSBwcmVmaXhcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdWZmaXhcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBlbmRzV2l0aChzdHIsIHN1ZmZpeCkge1xuICAgIHJldHVybiBzdHIuc3Vic3RyaW5nKHN0ci5sZW5ndGggLSBzdWZmaXgubGVuZ3RoKSA9PT0gc3VmZml4XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBmdW5jdGlvbiBub3JtYWxpemVTZWxlY3RvcihzZWxlY3Rvcikge1xuICAgIGNvbnN0IHRyaW1tZWRTZWxlY3RvciA9IHNlbGVjdG9yLnRyaW0oKVxuICAgIGlmIChzdGFydHNXaXRoKHRyaW1tZWRTZWxlY3RvciwgJzwnKSAmJiBlbmRzV2l0aCh0cmltbWVkU2VsZWN0b3IsICcvPicpKSB7XG4gICAgICByZXR1cm4gdHJpbW1lZFNlbGVjdG9yLnN1YnN0cmluZygxLCB0cmltbWVkU2VsZWN0b3IubGVuZ3RoIC0gMilcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRyaW1tZWRTZWxlY3RvclxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV8RWxlbWVudHxEb2N1bWVudHxzdHJpbmd9IGVsdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3JcbiAgICogQHBhcmFtIHtib29sZWFuPX0gZ2xvYmFsXG4gICAqIEByZXR1cm5zIHsoTm9kZXxXaW5kb3cpW119XG4gICAqL1xuICBmdW5jdGlvbiBxdWVyeVNlbGVjdG9yQWxsRXh0KGVsdCwgc2VsZWN0b3IsIGdsb2JhbCkge1xuICAgIGVsdCA9IHJlc29sdmVUYXJnZXQoZWx0KVxuICAgIGlmIChzZWxlY3Rvci5pbmRleE9mKCdjbG9zZXN0ICcpID09PSAwKSB7XG4gICAgICByZXR1cm4gW2Nsb3Nlc3QoYXNFbGVtZW50KGVsdCksIG5vcm1hbGl6ZVNlbGVjdG9yKHNlbGVjdG9yLnN1YnN0cig4KSkpXVxuICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IuaW5kZXhPZignZmluZCAnKSA9PT0gMCkge1xuICAgICAgcmV0dXJuIFtmaW5kKGFzUGFyZW50Tm9kZShlbHQpLCBub3JtYWxpemVTZWxlY3RvcihzZWxlY3Rvci5zdWJzdHIoNSkpKV1cbiAgICB9IGVsc2UgaWYgKHNlbGVjdG9yID09PSAnbmV4dCcpIHtcbiAgICAgIHJldHVybiBbYXNFbGVtZW50KGVsdCkubmV4dEVsZW1lbnRTaWJsaW5nXVxuICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IuaW5kZXhPZignbmV4dCAnKSA9PT0gMCkge1xuICAgICAgcmV0dXJuIFtzY2FuRm9yd2FyZFF1ZXJ5KGVsdCwgbm9ybWFsaXplU2VsZWN0b3Ioc2VsZWN0b3Iuc3Vic3RyKDUpKSwgISFnbG9iYWwpXVxuICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IgPT09ICdwcmV2aW91cycpIHtcbiAgICAgIHJldHVybiBbYXNFbGVtZW50KGVsdCkucHJldmlvdXNFbGVtZW50U2libGluZ11cbiAgICB9IGVsc2UgaWYgKHNlbGVjdG9yLmluZGV4T2YoJ3ByZXZpb3VzICcpID09PSAwKSB7XG4gICAgICByZXR1cm4gW3NjYW5CYWNrd2FyZHNRdWVyeShlbHQsIG5vcm1hbGl6ZVNlbGVjdG9yKHNlbGVjdG9yLnN1YnN0cig5KSksICEhZ2xvYmFsKV1cbiAgICB9IGVsc2UgaWYgKHNlbGVjdG9yID09PSAnZG9jdW1lbnQnKSB7XG4gICAgICByZXR1cm4gW2RvY3VtZW50XVxuICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IgPT09ICd3aW5kb3cnKSB7XG4gICAgICByZXR1cm4gW3dpbmRvd11cbiAgICB9IGVsc2UgaWYgKHNlbGVjdG9yID09PSAnYm9keScpIHtcbiAgICAgIHJldHVybiBbZG9jdW1lbnQuYm9keV1cbiAgICB9IGVsc2UgaWYgKHNlbGVjdG9yID09PSAncm9vdCcpIHtcbiAgICAgIHJldHVybiBbZ2V0Um9vdE5vZGUoZWx0LCAhIWdsb2JhbCldXG4gICAgfSBlbHNlIGlmIChzZWxlY3Rvci5pbmRleE9mKCdnbG9iYWwgJykgPT09IDApIHtcbiAgICAgIHJldHVybiBxdWVyeVNlbGVjdG9yQWxsRXh0KGVsdCwgc2VsZWN0b3Iuc2xpY2UoNyksIHRydWUpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0b0FycmF5KGFzUGFyZW50Tm9kZShnZXRSb290Tm9kZShlbHQsICEhZ2xvYmFsKSkucXVlcnlTZWxlY3RvckFsbChub3JtYWxpemVTZWxlY3RvcihzZWxlY3RvcikpKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IHN0YXJ0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtYXRjaFxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGdsb2JhbFxuICAgKiBAcmV0dXJucyB7RWxlbWVudH1cbiAgICovXG4gIHZhciBzY2FuRm9yd2FyZFF1ZXJ5ID0gZnVuY3Rpb24oc3RhcnQsIG1hdGNoLCBnbG9iYWwpIHtcbiAgICBjb25zdCByZXN1bHRzID0gYXNQYXJlbnROb2RlKGdldFJvb3ROb2RlKHN0YXJ0LCBnbG9iYWwpKS5xdWVyeVNlbGVjdG9yQWxsKG1hdGNoKVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVzdWx0cy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgZWx0ID0gcmVzdWx0c1tpXVxuICAgICAgaWYgKGVsdC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihzdGFydCkgPT09IE5vZGUuRE9DVU1FTlRfUE9TSVRJT05fUFJFQ0VESU5HKSB7XG4gICAgICAgIHJldHVybiBlbHRcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBzdGFydFxuICAgKiBAcGFyYW0ge3N0cmluZ30gbWF0Y2hcbiAgICogQHBhcmFtIHtib29sZWFufSBnbG9iYWxcbiAgICogQHJldHVybnMge0VsZW1lbnR9XG4gICAqL1xuICB2YXIgc2NhbkJhY2t3YXJkc1F1ZXJ5ID0gZnVuY3Rpb24oc3RhcnQsIG1hdGNoLCBnbG9iYWwpIHtcbiAgICBjb25zdCByZXN1bHRzID0gYXNQYXJlbnROb2RlKGdldFJvb3ROb2RlKHN0YXJ0LCBnbG9iYWwpKS5xdWVyeVNlbGVjdG9yQWxsKG1hdGNoKVxuICAgIGZvciAobGV0IGkgPSByZXN1bHRzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICBjb25zdCBlbHQgPSByZXN1bHRzW2ldXG4gICAgICBpZiAoZWx0LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKHN0YXJ0KSA9PT0gTm9kZS5ET0NVTUVOVF9QT1NJVElPTl9GT0xMT1dJTkcpIHtcbiAgICAgICAgcmV0dXJuIGVsdFxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV8c3RyaW5nfSBlbHRPclNlbGVjdG9yXG4gICAqIEBwYXJhbSB7c3RyaW5nPX0gc2VsZWN0b3JcbiAgICogQHJldHVybnMge05vZGV8V2luZG93fVxuICAgKi9cbiAgZnVuY3Rpb24gcXVlcnlTZWxlY3RvckV4dChlbHRPclNlbGVjdG9yLCBzZWxlY3Rvcikge1xuICAgIGlmICh0eXBlb2YgZWx0T3JTZWxlY3RvciAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiBxdWVyeVNlbGVjdG9yQWxsRXh0KGVsdE9yU2VsZWN0b3IsIHNlbGVjdG9yKVswXVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gcXVlcnlTZWxlY3RvckFsbEV4dChnZXREb2N1bWVudCgpLmJvZHksIGVsdE9yU2VsZWN0b3IpWzBdXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEB0ZW1wbGF0ZSB7RXZlbnRUYXJnZXR9IFRcbiAgICogQHBhcmFtIHtUfHN0cmluZ30gZWx0T3JTZWxlY3RvclxuICAgKiBAcGFyYW0ge1R9IFtjb250ZXh0XVxuICAgKiBAcmV0dXJucyB7RWxlbWVudHxUfG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiByZXNvbHZlVGFyZ2V0KGVsdE9yU2VsZWN0b3IsIGNvbnRleHQpIHtcbiAgICBpZiAodHlwZW9mIGVsdE9yU2VsZWN0b3IgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gZmluZChhc1BhcmVudE5vZGUoY29udGV4dCkgfHwgZG9jdW1lbnQsIGVsdE9yU2VsZWN0b3IpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBlbHRPclNlbGVjdG9yXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEB0eXBlZGVmIHtrZXlvZiBIVE1MRWxlbWVudEV2ZW50TWFwfHN0cmluZ30gQW55RXZlbnROYW1lXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAdHlwZWRlZiB7T2JqZWN0fSBFdmVudEFyZ3NcbiAgICogQHByb3BlcnR5IHtFdmVudFRhcmdldH0gdGFyZ2V0XG4gICAqIEBwcm9wZXJ0eSB7QW55RXZlbnROYW1lfSBldmVudFxuICAgKiBAcHJvcGVydHkge0V2ZW50TGlzdGVuZXJ9IGxpc3RlbmVyXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fEFueUV2ZW50TmFtZX0gYXJnMVxuICAgKiBAcGFyYW0ge0FueUV2ZW50TmFtZXxFdmVudExpc3RlbmVyfSBhcmcyXG4gICAqIEBwYXJhbSB7RXZlbnRMaXN0ZW5lcn0gW2FyZzNdXG4gICAqIEByZXR1cm5zIHtFdmVudEFyZ3N9XG4gICAqL1xuICBmdW5jdGlvbiBwcm9jZXNzRXZlbnRBcmdzKGFyZzEsIGFyZzIsIGFyZzMpIHtcbiAgICBpZiAoaXNGdW5jdGlvbihhcmcyKSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdGFyZ2V0OiBnZXREb2N1bWVudCgpLmJvZHksXG4gICAgICAgIGV2ZW50OiBhc1N0cmluZyhhcmcxKSxcbiAgICAgICAgbGlzdGVuZXI6IGFyZzJcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdGFyZ2V0OiByZXNvbHZlVGFyZ2V0KGFyZzEpLFxuICAgICAgICBldmVudDogYXNTdHJpbmcoYXJnMiksXG4gICAgICAgIGxpc3RlbmVyOiBhcmczXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYW4gZXZlbnQgbGlzdGVuZXIgdG8gYW4gZWxlbWVudFxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNvblxuICAgKlxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fHN0cmluZ30gYXJnMSB0aGUgZWxlbWVudCB0byBhZGQgdGhlIGxpc3RlbmVyIHRvIHwgdGhlIGV2ZW50IG5hbWUgdG8gYWRkIHRoZSBsaXN0ZW5lciBmb3JcbiAgICogQHBhcmFtIHtzdHJpbmd8RXZlbnRMaXN0ZW5lcn0gYXJnMiB0aGUgZXZlbnQgbmFtZSB0byBhZGQgdGhlIGxpc3RlbmVyIGZvciB8IHRoZSBsaXN0ZW5lciB0byBhZGRcbiAgICogQHBhcmFtIHtFdmVudExpc3RlbmVyfSBbYXJnM10gdGhlIGxpc3RlbmVyIHRvIGFkZFxuICAgKiBAcmV0dXJucyB7RXZlbnRMaXN0ZW5lcn1cbiAgICovXG4gIGZ1bmN0aW9uIGFkZEV2ZW50TGlzdGVuZXJJbXBsKGFyZzEsIGFyZzIsIGFyZzMpIHtcbiAgICByZWFkeShmdW5jdGlvbigpIHtcbiAgICAgIGNvbnN0IGV2ZW50QXJncyA9IHByb2Nlc3NFdmVudEFyZ3MoYXJnMSwgYXJnMiwgYXJnMylcbiAgICAgIGV2ZW50QXJncy50YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcihldmVudEFyZ3MuZXZlbnQsIGV2ZW50QXJncy5saXN0ZW5lcilcbiAgICB9KVxuICAgIGNvbnN0IGIgPSBpc0Z1bmN0aW9uKGFyZzIpXG4gICAgcmV0dXJuIGIgPyBhcmcyIDogYXJnM1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgYW4gZXZlbnQgbGlzdGVuZXIgZnJvbSBhbiBlbGVtZW50XG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI29mZlxuICAgKlxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fHN0cmluZ30gYXJnMSB0aGUgZWxlbWVudCB0byByZW1vdmUgdGhlIGxpc3RlbmVyIGZyb20gfCB0aGUgZXZlbnQgbmFtZSB0byByZW1vdmUgdGhlIGxpc3RlbmVyIGZyb21cbiAgICogQHBhcmFtIHtzdHJpbmd8RXZlbnRMaXN0ZW5lcn0gYXJnMiB0aGUgZXZlbnQgbmFtZSB0byByZW1vdmUgdGhlIGxpc3RlbmVyIGZyb20gfCB0aGUgbGlzdGVuZXIgdG8gcmVtb3ZlXG4gICAqIEBwYXJhbSB7RXZlbnRMaXN0ZW5lcn0gW2FyZzNdIHRoZSBsaXN0ZW5lciB0byByZW1vdmVcbiAgICogQHJldHVybnMge0V2ZW50TGlzdGVuZXJ9XG4gICAqL1xuICBmdW5jdGlvbiByZW1vdmVFdmVudExpc3RlbmVySW1wbChhcmcxLCBhcmcyLCBhcmczKSB7XG4gICAgcmVhZHkoZnVuY3Rpb24oKSB7XG4gICAgICBjb25zdCBldmVudEFyZ3MgPSBwcm9jZXNzRXZlbnRBcmdzKGFyZzEsIGFyZzIsIGFyZzMpXG4gICAgICBldmVudEFyZ3MudGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnRBcmdzLmV2ZW50LCBldmVudEFyZ3MubGlzdGVuZXIpXG4gICAgfSlcbiAgICByZXR1cm4gaXNGdW5jdGlvbihhcmcyKSA/IGFyZzIgOiBhcmczXG4gIH1cblxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBOb2RlIHByb2Nlc3NpbmdcbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICBjb25zdCBEVU1NWV9FTFQgPSBnZXREb2N1bWVudCgpLmNyZWF0ZUVsZW1lbnQoJ291dHB1dCcpIC8vIGR1bW15IGVsZW1lbnQgZm9yIGJhZCBzZWxlY3RvcnNcbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhdHRyTmFtZVxuICAgKiBAcmV0dXJucyB7KE5vZGV8V2luZG93KVtdfVxuICAgKi9cbiAgZnVuY3Rpb24gZmluZEF0dHJpYnV0ZVRhcmdldHMoZWx0LCBhdHRyTmFtZSkge1xuICAgIGNvbnN0IGF0dHJUYXJnZXQgPSBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCBhdHRyTmFtZSlcbiAgICBpZiAoYXR0clRhcmdldCkge1xuICAgICAgaWYgKGF0dHJUYXJnZXQgPT09ICd0aGlzJykge1xuICAgICAgICByZXR1cm4gW2ZpbmRUaGlzRWxlbWVudChlbHQsIGF0dHJOYW1lKV1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHF1ZXJ5U2VsZWN0b3JBbGxFeHQoZWx0LCBhdHRyVGFyZ2V0KVxuICAgICAgICBpZiAocmVzdWx0Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIGxvZ0Vycm9yKCdUaGUgc2VsZWN0b3IgXCInICsgYXR0clRhcmdldCArICdcIiBvbiAnICsgYXR0ck5hbWUgKyAnIHJldHVybmVkIG5vIG1hdGNoZXMhJylcbiAgICAgICAgICByZXR1cm4gW0RVTU1ZX0VMVF1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGF0dHJpYnV0ZVxuICAgKiBAcmV0dXJucyB7RWxlbWVudHxudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gZmluZFRoaXNFbGVtZW50KGVsdCwgYXR0cmlidXRlKSB7XG4gICAgcmV0dXJuIGFzRWxlbWVudChnZXRDbG9zZXN0TWF0Y2goZWx0LCBmdW5jdGlvbihlbHQpIHtcbiAgICAgIHJldHVybiBnZXRBdHRyaWJ1dGVWYWx1ZShhc0VsZW1lbnQoZWx0KSwgYXR0cmlidXRlKSAhPSBudWxsXG4gICAgfSkpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHJldHVybnMge05vZGV8V2luZG93fG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRUYXJnZXQoZWx0KSB7XG4gICAgY29uc3QgdGFyZ2V0U3RyID0gZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LXRhcmdldCcpXG4gICAgaWYgKHRhcmdldFN0cikge1xuICAgICAgaWYgKHRhcmdldFN0ciA9PT0gJ3RoaXMnKSB7XG4gICAgICAgIHJldHVybiBmaW5kVGhpc0VsZW1lbnQoZWx0LCAnaHgtdGFyZ2V0JylcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBxdWVyeVNlbGVjdG9yRXh0KGVsdCwgdGFyZ2V0U3RyKVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBkYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGVsdClcbiAgICAgIGlmIChkYXRhLmJvb3N0ZWQpIHtcbiAgICAgICAgcmV0dXJuIGdldERvY3VtZW50KCkuYm9keVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGVsdFxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIHNob3VsZFNldHRsZUF0dHJpYnV0ZShuYW1lKSB7XG4gICAgY29uc3QgYXR0cmlidXRlc1RvU2V0dGxlID0gaHRteC5jb25maWcuYXR0cmlidXRlc1RvU2V0dGxlXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhdHRyaWJ1dGVzVG9TZXR0bGUubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChuYW1lID09PSBhdHRyaWJ1dGVzVG9TZXR0bGVbaV0pIHtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBtZXJnZVRvXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gbWVyZ2VGcm9tXG4gICAqL1xuICBmdW5jdGlvbiBjbG9uZUF0dHJpYnV0ZXMobWVyZ2VUbywgbWVyZ2VGcm9tKSB7XG4gICAgZm9yRWFjaChtZXJnZVRvLmF0dHJpYnV0ZXMsIGZ1bmN0aW9uKGF0dHIpIHtcbiAgICAgIGlmICghbWVyZ2VGcm9tLmhhc0F0dHJpYnV0ZShhdHRyLm5hbWUpICYmIHNob3VsZFNldHRsZUF0dHJpYnV0ZShhdHRyLm5hbWUpKSB7XG4gICAgICAgIG1lcmdlVG8ucmVtb3ZlQXR0cmlidXRlKGF0dHIubmFtZSlcbiAgICAgIH1cbiAgICB9KVxuICAgIGZvckVhY2gobWVyZ2VGcm9tLmF0dHJpYnV0ZXMsIGZ1bmN0aW9uKGF0dHIpIHtcbiAgICAgIGlmIChzaG91bGRTZXR0bGVBdHRyaWJ1dGUoYXR0ci5uYW1lKSkge1xuICAgICAgICBtZXJnZVRvLnNldEF0dHJpYnV0ZShhdHRyLm5hbWUsIGF0dHIudmFsdWUpXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0h0bXhTd2FwU3R5bGV9IHN3YXBTdHlsZVxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IHRhcmdldFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGlzSW5saW5lU3dhcChzd2FwU3R5bGUsIHRhcmdldCkge1xuICAgIGNvbnN0IGV4dGVuc2lvbnMgPSBnZXRFeHRlbnNpb25zKHRhcmdldClcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGV4dGVuc2lvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGV4dGVuc2lvbiA9IGV4dGVuc2lvbnNbaV1cbiAgICAgIHRyeSB7XG4gICAgICAgIGlmIChleHRlbnNpb24uaXNJbmxpbmVTd2FwKHN3YXBTdHlsZSkpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGxvZ0Vycm9yKGUpXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzd2FwU3R5bGUgPT09ICdvdXRlckhUTUwnXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IG9vYlZhbHVlXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gb29iRWxlbWVudFxuICAgKiBAcGFyYW0ge0h0bXhTZXR0bGVJbmZvfSBzZXR0bGVJbmZvXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBmdW5jdGlvbiBvb2JTd2FwKG9vYlZhbHVlLCBvb2JFbGVtZW50LCBzZXR0bGVJbmZvKSB7XG4gICAgbGV0IHNlbGVjdG9yID0gJyMnICsgZ2V0UmF3QXR0cmlidXRlKG9vYkVsZW1lbnQsICdpZCcpXG4gICAgLyoqIEB0eXBlIEh0bXhTd2FwU3R5bGUgKi9cbiAgICBsZXQgc3dhcFN0eWxlID0gJ291dGVySFRNTCdcbiAgICBpZiAob29iVmFsdWUgPT09ICd0cnVlJykge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH0gZWxzZSBpZiAob29iVmFsdWUuaW5kZXhPZignOicpID4gMCkge1xuICAgICAgc3dhcFN0eWxlID0gb29iVmFsdWUuc3Vic3RyKDAsIG9vYlZhbHVlLmluZGV4T2YoJzonKSlcbiAgICAgIHNlbGVjdG9yID0gb29iVmFsdWUuc3Vic3RyKG9vYlZhbHVlLmluZGV4T2YoJzonKSArIDEsIG9vYlZhbHVlLmxlbmd0aClcbiAgICB9IGVsc2Uge1xuICAgICAgc3dhcFN0eWxlID0gb29iVmFsdWVcbiAgICB9XG5cbiAgICBjb25zdCB0YXJnZXRzID0gZ2V0RG9jdW1lbnQoKS5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKVxuICAgIGlmICh0YXJnZXRzKSB7XG4gICAgICBmb3JFYWNoKFxuICAgICAgICB0YXJnZXRzLFxuICAgICAgICBmdW5jdGlvbih0YXJnZXQpIHtcbiAgICAgICAgICBsZXQgZnJhZ21lbnRcbiAgICAgICAgICBjb25zdCBvb2JFbGVtZW50Q2xvbmUgPSBvb2JFbGVtZW50LmNsb25lTm9kZSh0cnVlKVxuICAgICAgICAgIGZyYWdtZW50ID0gZ2V0RG9jdW1lbnQoKS5jcmVhdGVEb2N1bWVudEZyYWdtZW50KClcbiAgICAgICAgICBmcmFnbWVudC5hcHBlbmRDaGlsZChvb2JFbGVtZW50Q2xvbmUpXG4gICAgICAgICAgaWYgKCFpc0lubGluZVN3YXAoc3dhcFN0eWxlLCB0YXJnZXQpKSB7XG4gICAgICAgICAgICBmcmFnbWVudCA9IGFzUGFyZW50Tm9kZShvb2JFbGVtZW50Q2xvbmUpIC8vIGlmIHRoaXMgaXMgbm90IGFuIGlubGluZSBzd2FwLCB3ZSB1c2UgdGhlIGNvbnRlbnQgb2YgdGhlIG5vZGUsIG5vdCB0aGUgbm9kZSBpdHNlbGZcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBiZWZvcmVTd2FwRGV0YWlscyA9IHsgc2hvdWxkU3dhcDogdHJ1ZSwgdGFyZ2V0LCBmcmFnbWVudCB9XG4gICAgICAgICAgaWYgKCF0cmlnZ2VyRXZlbnQodGFyZ2V0LCAnaHRteDpvb2JCZWZvcmVTd2FwJywgYmVmb3JlU3dhcERldGFpbHMpKSByZXR1cm5cblxuICAgICAgICAgIHRhcmdldCA9IGJlZm9yZVN3YXBEZXRhaWxzLnRhcmdldCAvLyBhbGxvdyByZS10YXJnZXRpbmdcbiAgICAgICAgICBpZiAoYmVmb3JlU3dhcERldGFpbHMuc2hvdWxkU3dhcCkge1xuICAgICAgICAgICAgc3dhcFdpdGhTdHlsZShzd2FwU3R5bGUsIHRhcmdldCwgdGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICAgICAgICB9XG4gICAgICAgICAgZm9yRWFjaChzZXR0bGVJbmZvLmVsdHMsIGZ1bmN0aW9uKGVsdCkge1xuICAgICAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6b29iQWZ0ZXJTd2FwJywgYmVmb3JlU3dhcERldGFpbHMpXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgKVxuICAgICAgb29iRWxlbWVudC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG9vYkVsZW1lbnQpXG4gICAgfSBlbHNlIHtcbiAgICAgIG9vYkVsZW1lbnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChvb2JFbGVtZW50KVxuICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpvb2JFcnJvck5vVGFyZ2V0JywgeyBjb250ZW50OiBvb2JFbGVtZW50IH0pXG4gICAgfVxuICAgIHJldHVybiBvb2JWYWx1ZVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RG9jdW1lbnRGcmFnbWVudH0gZnJhZ21lbnRcbiAgICovXG4gIGZ1bmN0aW9uIGhhbmRsZVByZXNlcnZlZEVsZW1lbnRzKGZyYWdtZW50KSB7XG4gICAgZm9yRWFjaChmaW5kQWxsKGZyYWdtZW50LCAnW2h4LXByZXNlcnZlXSwgW2RhdGEtaHgtcHJlc2VydmVdJyksIGZ1bmN0aW9uKHByZXNlcnZlZEVsdCkge1xuICAgICAgY29uc3QgaWQgPSBnZXRBdHRyaWJ1dGVWYWx1ZShwcmVzZXJ2ZWRFbHQsICdpZCcpXG4gICAgICBjb25zdCBvbGRFbHQgPSBnZXREb2N1bWVudCgpLmdldEVsZW1lbnRCeUlkKGlkKVxuICAgICAgaWYgKG9sZEVsdCAhPSBudWxsKSB7XG4gICAgICAgIHByZXNlcnZlZEVsdC5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChvbGRFbHQsIHByZXNlcnZlZEVsdClcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gcGFyZW50Tm9kZVxuICAgKiBAcGFyYW0ge1BhcmVudE5vZGV9IGZyYWdtZW50XG4gICAqIEBwYXJhbSB7SHRteFNldHRsZUluZm99IHNldHRsZUluZm9cbiAgICovXG4gIGZ1bmN0aW9uIGhhbmRsZUF0dHJpYnV0ZXMocGFyZW50Tm9kZSwgZnJhZ21lbnQsIHNldHRsZUluZm8pIHtcbiAgICBmb3JFYWNoKGZyYWdtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tpZF0nKSwgZnVuY3Rpb24obmV3Tm9kZSkge1xuICAgICAgY29uc3QgaWQgPSBnZXRSYXdBdHRyaWJ1dGUobmV3Tm9kZSwgJ2lkJylcbiAgICAgIGlmIChpZCAmJiBpZC5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRJZCA9IGlkLnJlcGxhY2UoXCInXCIsIFwiXFxcXCdcIilcbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZFRhZyA9IG5ld05vZGUudGFnTmFtZS5yZXBsYWNlKCc6JywgJ1xcXFw6JylcbiAgICAgICAgY29uc3QgcGFyZW50RWx0ID0gYXNQYXJlbnROb2RlKHBhcmVudE5vZGUpXG4gICAgICAgIGNvbnN0IG9sZE5vZGUgPSBwYXJlbnRFbHQgJiYgcGFyZW50RWx0LnF1ZXJ5U2VsZWN0b3Iobm9ybWFsaXplZFRhZyArIFwiW2lkPSdcIiArIG5vcm1hbGl6ZWRJZCArIFwiJ11cIilcbiAgICAgICAgaWYgKG9sZE5vZGUgJiYgb2xkTm9kZSAhPT0gcGFyZW50RWx0KSB7XG4gICAgICAgICAgY29uc3QgbmV3QXR0cmlidXRlcyA9IG5ld05vZGUuY2xvbmVOb2RlKClcbiAgICAgICAgICBjbG9uZUF0dHJpYnV0ZXMobmV3Tm9kZSwgb2xkTm9kZSlcbiAgICAgICAgICBzZXR0bGVJbmZvLnRhc2tzLnB1c2goZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBjbG9uZUF0dHJpYnV0ZXMobmV3Tm9kZSwgbmV3QXR0cmlidXRlcylcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IGNoaWxkXG4gICAqIEByZXR1cm5zIHtIdG14U2V0dGxlVGFza31cbiAgICovXG4gIGZ1bmN0aW9uIG1ha2VBamF4TG9hZFRhc2soY2hpbGQpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICByZW1vdmVDbGFzc0Zyb21FbGVtZW50KGNoaWxkLCBodG14LmNvbmZpZy5hZGRlZENsYXNzKVxuICAgICAgcHJvY2Vzc05vZGUoYXNFbGVtZW50KGNoaWxkKSlcbiAgICAgIHByb2Nlc3NGb2N1cyhhc1BhcmVudE5vZGUoY2hpbGQpKVxuICAgICAgdHJpZ2dlckV2ZW50KGNoaWxkLCAnaHRteDpsb2FkJylcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtQYXJlbnROb2RlfSBjaGlsZFxuICAgKi9cbiAgZnVuY3Rpb24gcHJvY2Vzc0ZvY3VzKGNoaWxkKSB7XG4gICAgY29uc3QgYXV0b2ZvY3VzID0gJ1thdXRvZm9jdXNdJ1xuICAgIGNvbnN0IGF1dG9Gb2N1c2VkRWx0ID0gYXNIdG1sRWxlbWVudChtYXRjaGVzKGNoaWxkLCBhdXRvZm9jdXMpID8gY2hpbGQgOiBjaGlsZC5xdWVyeVNlbGVjdG9yKGF1dG9mb2N1cykpXG4gICAgaWYgKGF1dG9Gb2N1c2VkRWx0ICE9IG51bGwpIHtcbiAgICAgIGF1dG9Gb2N1c2VkRWx0LmZvY3VzKClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBwYXJlbnROb2RlXG4gICAqIEBwYXJhbSB7Tm9kZX0gaW5zZXJ0QmVmb3JlXG4gICAqIEBwYXJhbSB7UGFyZW50Tm9kZX0gZnJhZ21lbnRcbiAgICogQHBhcmFtIHtIdG14U2V0dGxlSW5mb30gc2V0dGxlSW5mb1xuICAgKi9cbiAgZnVuY3Rpb24gaW5zZXJ0Tm9kZXNCZWZvcmUocGFyZW50Tm9kZSwgaW5zZXJ0QmVmb3JlLCBmcmFnbWVudCwgc2V0dGxlSW5mbykge1xuICAgIGhhbmRsZUF0dHJpYnV0ZXMocGFyZW50Tm9kZSwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgd2hpbGUgKGZyYWdtZW50LmNoaWxkTm9kZXMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgY2hpbGQgPSBmcmFnbWVudC5maXJzdENoaWxkXG4gICAgICBhZGRDbGFzc1RvRWxlbWVudChhc0VsZW1lbnQoY2hpbGQpLCBodG14LmNvbmZpZy5hZGRlZENsYXNzKVxuICAgICAgcGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoY2hpbGQsIGluc2VydEJlZm9yZSlcbiAgICAgIGlmIChjaGlsZC5ub2RlVHlwZSAhPT0gTm9kZS5URVhUX05PREUgJiYgY2hpbGQubm9kZVR5cGUgIT09IE5vZGUuQ09NTUVOVF9OT0RFKSB7XG4gICAgICAgIHNldHRsZUluZm8udGFza3MucHVzaChtYWtlQWpheExvYWRUYXNrKGNoaWxkKSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogYmFzZWQgb24gaHR0cHM6Ly9naXN0LmdpdGh1Yi5jb20vaHlhbWFtb3RvL2ZkNDM1NTA1ZDI5ZWJmYTNkOTcxNmZkMmJlOGQ0MmYwLFxuICAgKiBkZXJpdmVkIGZyb20gSmF2YSdzIHN0cmluZyBoYXNoY29kZSBpbXBsZW1lbnRhdGlvblxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBoYXNoXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9XG4gICAqL1xuICBmdW5jdGlvbiBzdHJpbmdIYXNoKHN0cmluZywgaGFzaCkge1xuICAgIGxldCBjaGFyID0gMFxuICAgIHdoaWxlIChjaGFyIDwgc3RyaW5nLmxlbmd0aCkge1xuICAgICAgaGFzaCA9IChoYXNoIDw8IDUpIC0gaGFzaCArIHN0cmluZy5jaGFyQ29kZUF0KGNoYXIrKykgfCAwIC8vIGJpdHdpc2Ugb3IgZW5zdXJlcyB3ZSBoYXZlIGEgMzItYml0IGludFxuICAgIH1cbiAgICByZXR1cm4gaGFzaFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEByZXR1cm5zIHtudW1iZXJ9XG4gICAqL1xuICBmdW5jdGlvbiBhdHRyaWJ1dGVIYXNoKGVsdCkge1xuICAgIGxldCBoYXNoID0gMFxuICAgIC8vIElFIGZpeFxuICAgIGlmIChlbHQuYXR0cmlidXRlcykge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBlbHQuYXR0cmlidXRlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBhdHRyaWJ1dGUgPSBlbHQuYXR0cmlidXRlc1tpXVxuICAgICAgICBpZiAoYXR0cmlidXRlLnZhbHVlKSB7IC8vIG9ubHkgaW5jbHVkZSBhdHRyaWJ1dGVzIHcvIGFjdHVhbCB2YWx1ZXMgKGVtcHR5IGlzIHNhbWUgYXMgbm9uLWV4aXN0ZW50KVxuICAgICAgICAgIGhhc2ggPSBzdHJpbmdIYXNoKGF0dHJpYnV0ZS5uYW1lLCBoYXNoKVxuICAgICAgICAgIGhhc2ggPSBzdHJpbmdIYXNoKGF0dHJpYnV0ZS52YWx1ZSwgaGFzaClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gaGFzaFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR9IGVsdFxuICAgKi9cbiAgZnVuY3Rpb24gZGVJbml0T25IYW5kbGVycyhlbHQpIHtcbiAgICBjb25zdCBpbnRlcm5hbERhdGEgPSBnZXRJbnRlcm5hbERhdGEoZWx0KVxuICAgIGlmIChpbnRlcm5hbERhdGEub25IYW5kbGVycykge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbnRlcm5hbERhdGEub25IYW5kbGVycy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBoYW5kbGVySW5mbyA9IGludGVybmFsRGF0YS5vbkhhbmRsZXJzW2ldXG4gICAgICAgIHJlbW92ZUV2ZW50TGlzdGVuZXJJbXBsKGVsdCwgaGFuZGxlckluZm8uZXZlbnQsIGhhbmRsZXJJbmZvLmxpc3RlbmVyKVxuICAgICAgfVxuICAgICAgZGVsZXRlIGludGVybmFsRGF0YS5vbkhhbmRsZXJzXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWxlbWVudFxuICAgKi9cbiAgZnVuY3Rpb24gZGVJbml0Tm9kZShlbGVtZW50KSB7XG4gICAgY29uc3QgaW50ZXJuYWxEYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGVsZW1lbnQpXG4gICAgaWYgKGludGVybmFsRGF0YS50aW1lb3V0KSB7XG4gICAgICBjbGVhclRpbWVvdXQoaW50ZXJuYWxEYXRhLnRpbWVvdXQpXG4gICAgfVxuICAgIGlmIChpbnRlcm5hbERhdGEubGlzdGVuZXJJbmZvcykge1xuICAgICAgZm9yRWFjaChpbnRlcm5hbERhdGEubGlzdGVuZXJJbmZvcywgZnVuY3Rpb24oaW5mbykge1xuICAgICAgICBpZiAoaW5mby5vbikge1xuICAgICAgICAgIHJlbW92ZUV2ZW50TGlzdGVuZXJJbXBsKGluZm8ub24sIGluZm8udHJpZ2dlciwgaW5mby5saXN0ZW5lcilcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9XG4gICAgZGVJbml0T25IYW5kbGVycyhlbGVtZW50KVxuICAgIGZvckVhY2goT2JqZWN0LmtleXMoaW50ZXJuYWxEYXRhKSwgZnVuY3Rpb24oa2V5KSB7IGRlbGV0ZSBpbnRlcm5hbERhdGFba2V5XSB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWxlbWVudFxuICAgKi9cbiAgZnVuY3Rpb24gY2xlYW5VcEVsZW1lbnQoZWxlbWVudCkge1xuICAgIHRyaWdnZXJFdmVudChlbGVtZW50LCAnaHRteDpiZWZvcmVDbGVhbnVwRWxlbWVudCcpXG4gICAgZGVJbml0Tm9kZShlbGVtZW50KVxuICAgIC8vIEB0cy1pZ25vcmUgSUUxMSBjb2RlXG4gICAgLy8gbm9pbnNwZWN0aW9uIEpTVW5yZXNvbHZlZFJlZmVyZW5jZVxuICAgIGlmIChlbGVtZW50LmNoaWxkcmVuKSB7IC8vIElFXG4gICAgICAvLyBAdHMtaWdub3JlXG4gICAgICBmb3JFYWNoKGVsZW1lbnQuY2hpbGRyZW4sIGZ1bmN0aW9uKGNoaWxkKSB7IGNsZWFuVXBFbGVtZW50KGNoaWxkKSB9KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IHRhcmdldFxuICAgKiBAcGFyYW0ge1BhcmVudE5vZGV9IGZyYWdtZW50XG4gICAqIEBwYXJhbSB7SHRteFNldHRsZUluZm99IHNldHRsZUluZm9cbiAgICovXG4gIGZ1bmN0aW9uIHN3YXBPdXRlckhUTUwodGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbykge1xuICAgIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBFbGVtZW50ICYmIHRhcmdldC50YWdOYW1lID09PSAnQk9EWScpIHsgLy8gc3BlY2lhbCBjYXNlIHRoZSBib2R5IHRvIGlubmVySFRNTCBiZWNhdXNlIERvY3VtZW50RnJhZ21lbnRzIGNhbid0IGNvbnRhaW4gYSBib2R5IGVsdCB1bmZvcnR1bmF0ZWx5XG4gICAgICByZXR1cm4gc3dhcElubmVySFRNTCh0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgIH1cbiAgICAvKiogQHR5cGUge05vZGV9ICovXG4gICAgbGV0IG5ld0VsdFxuICAgIGNvbnN0IGVsdEJlZm9yZU5ld0NvbnRlbnQgPSB0YXJnZXQucHJldmlvdXNTaWJsaW5nXG4gICAgaW5zZXJ0Tm9kZXNCZWZvcmUocGFyZW50RWx0KHRhcmdldCksIHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgaWYgKGVsdEJlZm9yZU5ld0NvbnRlbnQgPT0gbnVsbCkge1xuICAgICAgbmV3RWx0ID0gcGFyZW50RWx0KHRhcmdldCkuZmlyc3RDaGlsZFxuICAgIH0gZWxzZSB7XG4gICAgICBuZXdFbHQgPSBlbHRCZWZvcmVOZXdDb250ZW50Lm5leHRTaWJsaW5nXG4gICAgfVxuICAgIHNldHRsZUluZm8uZWx0cyA9IHNldHRsZUluZm8uZWx0cy5maWx0ZXIoZnVuY3Rpb24oZSkgeyByZXR1cm4gZSAhPT0gdGFyZ2V0IH0pXG4gICAgLy8gc2NhbiB0aHJvdWdoIGFsbCBuZXdseSBhZGRlZCBjb250ZW50IGFuZCBhZGQgYWxsIGVsZW1lbnRzIHRvIHRoZSBzZXR0bGUgaW5mbyBzbyB3ZSB0cmlnZ2VyXG4gICAgLy8gZXZlbnRzIHByb3Blcmx5IG9uIHRoZW1cbiAgICB3aGlsZSAobmV3RWx0ICYmIG5ld0VsdCAhPT0gdGFyZ2V0KSB7XG4gICAgICBpZiAobmV3RWx0IGluc3RhbmNlb2YgRWxlbWVudCkge1xuICAgICAgICBzZXR0bGVJbmZvLmVsdHMucHVzaChuZXdFbHQpXG4gICAgICB9XG4gICAgICBuZXdFbHQgPSBuZXdFbHQubmV4dFNpYmxpbmdcbiAgICB9XG4gICAgY2xlYW5VcEVsZW1lbnQodGFyZ2V0KVxuICAgIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBFbGVtZW50KSB7XG4gICAgICB0YXJnZXQucmVtb3ZlKClcbiAgICB9IGVsc2Uge1xuICAgICAgdGFyZ2V0LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGFyZ2V0KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IHRhcmdldFxuICAgKiBAcGFyYW0ge1BhcmVudE5vZGV9IGZyYWdtZW50XG4gICAqIEBwYXJhbSB7SHRteFNldHRsZUluZm99IHNldHRsZUluZm9cbiAgICovXG4gIGZ1bmN0aW9uIHN3YXBBZnRlckJlZ2luKHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pIHtcbiAgICByZXR1cm4gaW5zZXJ0Tm9kZXNCZWZvcmUodGFyZ2V0LCB0YXJnZXQuZmlyc3RDaGlsZCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSB0YXJnZXRcbiAgICogQHBhcmFtIHtQYXJlbnROb2RlfSBmcmFnbWVudFxuICAgKiBAcGFyYW0ge0h0bXhTZXR0bGVJbmZvfSBzZXR0bGVJbmZvXG4gICAqL1xuICBmdW5jdGlvbiBzd2FwQmVmb3JlQmVnaW4odGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbykge1xuICAgIHJldHVybiBpbnNlcnROb2Rlc0JlZm9yZShwYXJlbnRFbHQodGFyZ2V0KSwgdGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IHRhcmdldFxuICAgKiBAcGFyYW0ge1BhcmVudE5vZGV9IGZyYWdtZW50XG4gICAqIEBwYXJhbSB7SHRteFNldHRsZUluZm99IHNldHRsZUluZm9cbiAgICovXG4gIGZ1bmN0aW9uIHN3YXBCZWZvcmVFbmQodGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbykge1xuICAgIHJldHVybiBpbnNlcnROb2Rlc0JlZm9yZSh0YXJnZXQsIG51bGwsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gdGFyZ2V0XG4gICAqIEBwYXJhbSB7UGFyZW50Tm9kZX0gZnJhZ21lbnRcbiAgICogQHBhcmFtIHtIdG14U2V0dGxlSW5mb30gc2V0dGxlSW5mb1xuICAgKi9cbiAgZnVuY3Rpb24gc3dhcEFmdGVyRW5kKHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pIHtcbiAgICByZXR1cm4gaW5zZXJ0Tm9kZXNCZWZvcmUocGFyZW50RWx0KHRhcmdldCksIHRhcmdldC5uZXh0U2libGluZywgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSB0YXJnZXRcbiAgICovXG4gIGZ1bmN0aW9uIHN3YXBEZWxldGUodGFyZ2V0KSB7XG4gICAgY2xlYW5VcEVsZW1lbnQodGFyZ2V0KVxuICAgIHJldHVybiBwYXJlbnRFbHQodGFyZ2V0KS5yZW1vdmVDaGlsZCh0YXJnZXQpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSB0YXJnZXRcbiAgICogQHBhcmFtIHtQYXJlbnROb2RlfSBmcmFnbWVudFxuICAgKiBAcGFyYW0ge0h0bXhTZXR0bGVJbmZvfSBzZXR0bGVJbmZvXG4gICAqL1xuICBmdW5jdGlvbiBzd2FwSW5uZXJIVE1MKHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pIHtcbiAgICBjb25zdCBmaXJzdENoaWxkID0gdGFyZ2V0LmZpcnN0Q2hpbGRcbiAgICBpbnNlcnROb2Rlc0JlZm9yZSh0YXJnZXQsIGZpcnN0Q2hpbGQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgIGlmIChmaXJzdENoaWxkKSB7XG4gICAgICB3aGlsZSAoZmlyc3RDaGlsZC5uZXh0U2libGluZykge1xuICAgICAgICBjbGVhblVwRWxlbWVudChmaXJzdENoaWxkLm5leHRTaWJsaW5nKVxuICAgICAgICB0YXJnZXQucmVtb3ZlQ2hpbGQoZmlyc3RDaGlsZC5uZXh0U2libGluZylcbiAgICAgIH1cbiAgICAgIGNsZWFuVXBFbGVtZW50KGZpcnN0Q2hpbGQpXG4gICAgICB0YXJnZXQucmVtb3ZlQ2hpbGQoZmlyc3RDaGlsZClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtIdG14U3dhcFN0eWxlfSBzd2FwU3R5bGVcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtOb2RlfSB0YXJnZXRcbiAgICogQHBhcmFtIHtQYXJlbnROb2RlfSBmcmFnbWVudFxuICAgKiBAcGFyYW0ge0h0bXhTZXR0bGVJbmZvfSBzZXR0bGVJbmZvXG4gICAqL1xuICBmdW5jdGlvbiBzd2FwV2l0aFN0eWxlKHN3YXBTdHlsZSwgZWx0LCB0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKSB7XG4gICAgc3dpdGNoIChzd2FwU3R5bGUpIHtcbiAgICAgIGNhc2UgJ25vbmUnOlxuICAgICAgICByZXR1cm5cbiAgICAgIGNhc2UgJ291dGVySFRNTCc6XG4gICAgICAgIHN3YXBPdXRlckhUTUwodGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICAgICAgcmV0dXJuXG4gICAgICBjYXNlICdhZnRlcmJlZ2luJzpcbiAgICAgICAgc3dhcEFmdGVyQmVnaW4odGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICAgICAgcmV0dXJuXG4gICAgICBjYXNlICdiZWZvcmViZWdpbic6XG4gICAgICAgIHN3YXBCZWZvcmVCZWdpbih0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgICByZXR1cm5cbiAgICAgIGNhc2UgJ2JlZm9yZWVuZCc6XG4gICAgICAgIHN3YXBCZWZvcmVFbmQodGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICAgICAgcmV0dXJuXG4gICAgICBjYXNlICdhZnRlcmVuZCc6XG4gICAgICAgIHN3YXBBZnRlckVuZCh0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgICByZXR1cm5cbiAgICAgIGNhc2UgJ2RlbGV0ZSc6XG4gICAgICAgIHN3YXBEZWxldGUodGFyZ2V0KVxuICAgICAgICByZXR1cm5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHZhciBleHRlbnNpb25zID0gZ2V0RXh0ZW5zaW9ucyhlbHQpXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNvbnN0IGV4dCA9IGV4dGVuc2lvbnNbaV1cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgbmV3RWxlbWVudHMgPSBleHQuaGFuZGxlU3dhcChzd2FwU3R5bGUsIHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgICAgICAgICBpZiAobmV3RWxlbWVudHMpIHtcbiAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkobmV3RWxlbWVudHMpKSB7XG4gICAgICAgICAgICAgICAgLy8gaWYgaGFuZGxlU3dhcCByZXR1cm5zIGFuIGFycmF5IChsaWtlKSBvZiBlbGVtZW50cywgd2UgaGFuZGxlIHRoZW1cbiAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IG5ld0VsZW1lbnRzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBjaGlsZCA9IG5ld0VsZW1lbnRzW2pdXG4gICAgICAgICAgICAgICAgICBpZiAoY2hpbGQubm9kZVR5cGUgIT09IE5vZGUuVEVYVF9OT0RFICYmIGNoaWxkLm5vZGVUeXBlICE9PSBOb2RlLkNPTU1FTlRfTk9ERSkge1xuICAgICAgICAgICAgICAgICAgICBzZXR0bGVJbmZvLnRhc2tzLnB1c2gobWFrZUFqYXhMb2FkVGFzayhjaGlsZCkpXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGxvZ0Vycm9yKGUpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChzd2FwU3R5bGUgPT09ICdpbm5lckhUTUwnKSB7XG4gICAgICAgICAgc3dhcElubmVySFRNTCh0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHN3YXBXaXRoU3R5bGUoaHRteC5jb25maWcuZGVmYXVsdFN3YXBTdHlsZSwgZWx0LCB0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RG9jdW1lbnRGcmFnbWVudH0gZnJhZ21lbnRcbiAgICogQHBhcmFtIHtIdG14U2V0dGxlSW5mb30gc2V0dGxlSW5mb1xuICAgKi9cbiAgZnVuY3Rpb24gZmluZEFuZFN3YXBPb2JFbGVtZW50cyhmcmFnbWVudCwgc2V0dGxlSW5mbykge1xuICAgIHZhciBvb2JFbHRzID0gZmluZEFsbChmcmFnbWVudCwgJ1toeC1zd2FwLW9vYl0sIFtkYXRhLWh4LXN3YXAtb29iXScpXG4gICAgZm9yRWFjaChvb2JFbHRzLCBmdW5jdGlvbihvb2JFbGVtZW50KSB7XG4gICAgICBpZiAoaHRteC5jb25maWcuYWxsb3dOZXN0ZWRPb2JTd2FwcyB8fCBvb2JFbGVtZW50LnBhcmVudEVsZW1lbnQgPT09IG51bGwpIHtcbiAgICAgICAgY29uc3Qgb29iVmFsdWUgPSBnZXRBdHRyaWJ1dGVWYWx1ZShvb2JFbGVtZW50LCAnaHgtc3dhcC1vb2InKVxuICAgICAgICBpZiAob29iVmFsdWUgIT0gbnVsbCkge1xuICAgICAgICAgIG9vYlN3YXAob29iVmFsdWUsIG9vYkVsZW1lbnQsIHNldHRsZUluZm8pXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG9vYkVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCdoeC1zd2FwLW9vYicpXG4gICAgICAgIG9vYkVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCdkYXRhLWh4LXN3YXAtb29iJylcbiAgICAgIH1cbiAgICB9KVxuICAgIHJldHVybiBvb2JFbHRzLmxlbmd0aCA+IDBcbiAgfVxuXG4gIC8qKlxuICAgKiBJbXBsZW1lbnRzIGNvbXBsZXRlIHN3YXBwaW5nIHBpcGVsaW5lLCBpbmNsdWRpbmc6IGZvY3VzIGFuZCBzZWxlY3Rpb24gcHJlc2VydmF0aW9uLFxuICAgKiB0aXRsZSB1cGRhdGVzLCBzY3JvbGwsIE9PQiBzd2FwcGluZywgbm9ybWFsIHN3YXBwaW5nIGFuZCBzZXR0bGluZ1xuICAgKiBAcGFyYW0ge3N0cmluZ3xFbGVtZW50fSB0YXJnZXRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNvbnRlbnRcbiAgICogQHBhcmFtIHtIdG14U3dhcFNwZWNpZmljYXRpb259IHN3YXBTcGVjXG4gICAqIEBwYXJhbSB7U3dhcE9wdGlvbnN9IFtzd2FwT3B0aW9uc11cbiAgICovXG4gIGZ1bmN0aW9uIHN3YXAodGFyZ2V0LCBjb250ZW50LCBzd2FwU3BlYywgc3dhcE9wdGlvbnMpIHtcbiAgICBpZiAoIXN3YXBPcHRpb25zKSB7XG4gICAgICBzd2FwT3B0aW9ucyA9IHt9XG4gICAgfVxuXG4gICAgdGFyZ2V0ID0gcmVzb2x2ZVRhcmdldCh0YXJnZXQpXG5cbiAgICAvLyBwcmVzZXJ2ZSBmb2N1cyBhbmQgc2VsZWN0aW9uXG4gICAgY29uc3QgYWN0aXZlRWx0ID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudFxuICAgIGxldCBzZWxlY3Rpb25JbmZvID0ge31cbiAgICB0cnkge1xuICAgICAgc2VsZWN0aW9uSW5mbyA9IHtcbiAgICAgICAgZWx0OiBhY3RpdmVFbHQsXG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgc3RhcnQ6IGFjdGl2ZUVsdCA/IGFjdGl2ZUVsdC5zZWxlY3Rpb25TdGFydCA6IG51bGwsXG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgZW5kOiBhY3RpdmVFbHQgPyBhY3RpdmVFbHQuc2VsZWN0aW9uRW5kIDogbnVsbFxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIHNhZmFyaSBpc3N1ZSAtIHNlZSBodHRwczovL2dpdGh1Yi5jb20vbWljcm9zb2Z0L3BsYXl3cmlnaHQvaXNzdWVzLzU4OTRcbiAgICB9XG4gICAgY29uc3Qgc2V0dGxlSW5mbyA9IG1ha2VTZXR0bGVJbmZvKHRhcmdldClcblxuICAgIC8vIEZvciB0ZXh0IGNvbnRlbnQgc3dhcHMsIGRvbid0IHBhcnNlIHRoZSByZXNwb25zZSBhcyBIVE1MLCBqdXN0IGluc2VydCBpdFxuICAgIGlmIChzd2FwU3BlYy5zd2FwU3R5bGUgPT09ICd0ZXh0Q29udGVudCcpIHtcbiAgICAgIHRhcmdldC50ZXh0Q29udGVudCA9IGNvbnRlbnRcbiAgICAvLyBPdGhlcndpc2UsIG1ha2UgdGhlIGZyYWdtZW50IGFuZCBwcm9jZXNzIGl0XG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCBmcmFnbWVudCA9IG1ha2VGcmFnbWVudChjb250ZW50KVxuXG4gICAgICBzZXR0bGVJbmZvLnRpdGxlID0gZnJhZ21lbnQudGl0bGVcblxuICAgICAgLy8gc2VsZWN0LW9vYiBzd2Fwc1xuICAgICAgaWYgKHN3YXBPcHRpb25zLnNlbGVjdE9PQikge1xuICAgICAgICBjb25zdCBvb2JTZWxlY3RWYWx1ZXMgPSBzd2FwT3B0aW9ucy5zZWxlY3RPT0Iuc3BsaXQoJywnKVxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG9vYlNlbGVjdFZhbHVlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNvbnN0IG9vYlNlbGVjdFZhbHVlID0gb29iU2VsZWN0VmFsdWVzW2ldLnNwbGl0KCc6JywgMilcbiAgICAgICAgICBsZXQgaWQgPSBvb2JTZWxlY3RWYWx1ZVswXS50cmltKClcbiAgICAgICAgICBpZiAoaWQuaW5kZXhPZignIycpID09PSAwKSB7XG4gICAgICAgICAgICBpZCA9IGlkLnN1YnN0cmluZygxKVxuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBvb2JWYWx1ZSA9IG9vYlNlbGVjdFZhbHVlWzFdIHx8ICd0cnVlJ1xuICAgICAgICAgIGNvbnN0IG9vYkVsZW1lbnQgPSBmcmFnbWVudC5xdWVyeVNlbGVjdG9yKCcjJyArIGlkKVxuICAgICAgICAgIGlmIChvb2JFbGVtZW50KSB7XG4gICAgICAgICAgICBvb2JTd2FwKG9vYlZhbHVlLCBvb2JFbGVtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gb29iIHN3YXBzXG4gICAgICBmaW5kQW5kU3dhcE9vYkVsZW1lbnRzKGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgZm9yRWFjaChmaW5kQWxsKGZyYWdtZW50LCAndGVtcGxhdGUnKSwgLyoqIEBwYXJhbSB7SFRNTFRlbXBsYXRlRWxlbWVudH0gdGVtcGxhdGUgKi9mdW5jdGlvbih0ZW1wbGF0ZSkge1xuICAgICAgICBpZiAoZmluZEFuZFN3YXBPb2JFbGVtZW50cyh0ZW1wbGF0ZS5jb250ZW50LCBzZXR0bGVJbmZvKSkge1xuICAgICAgICAgIC8vIEF2b2lkIHBvbGx1dGluZyB0aGUgRE9NIHdpdGggZW1wdHkgdGVtcGxhdGVzIHRoYXQgd2VyZSBvbmx5IHVzZWQgdG8gZW5jYXBzdWxhdGUgb29iIHN3YXBcbiAgICAgICAgICB0ZW1wbGF0ZS5yZW1vdmUoKVxuICAgICAgICB9XG4gICAgICB9KVxuXG4gICAgICAvLyBub3JtYWwgc3dhcFxuICAgICAgaWYgKHN3YXBPcHRpb25zLnNlbGVjdCkge1xuICAgICAgICBjb25zdCBuZXdGcmFnbWVudCA9IGdldERvY3VtZW50KCkuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpXG4gICAgICAgIGZvckVhY2goZnJhZ21lbnQucXVlcnlTZWxlY3RvckFsbChzd2FwT3B0aW9ucy5zZWxlY3QpLCBmdW5jdGlvbihub2RlKSB7XG4gICAgICAgICAgbmV3RnJhZ21lbnQuYXBwZW5kQ2hpbGQobm9kZSlcbiAgICAgICAgfSlcbiAgICAgICAgZnJhZ21lbnQgPSBuZXdGcmFnbWVudFxuICAgICAgfVxuICAgICAgaGFuZGxlUHJlc2VydmVkRWxlbWVudHMoZnJhZ21lbnQpXG4gICAgICBzd2FwV2l0aFN0eWxlKHN3YXBTcGVjLnN3YXBTdHlsZSwgc3dhcE9wdGlvbnMuY29udGV4dEVsZW1lbnQsIHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgfVxuXG4gICAgLy8gYXBwbHkgc2F2ZWQgZm9jdXMgYW5kIHNlbGVjdGlvbiBpbmZvcm1hdGlvbiB0byBzd2FwcGVkIGNvbnRlbnRcbiAgICBpZiAoc2VsZWN0aW9uSW5mby5lbHQgJiZcbiAgICAgICFib2R5Q29udGFpbnMoc2VsZWN0aW9uSW5mby5lbHQpICYmXG4gICAgICBnZXRSYXdBdHRyaWJ1dGUoc2VsZWN0aW9uSW5mby5lbHQsICdpZCcpKSB7XG4gICAgICBjb25zdCBuZXdBY3RpdmVFbHQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChnZXRSYXdBdHRyaWJ1dGUoc2VsZWN0aW9uSW5mby5lbHQsICdpZCcpKVxuICAgICAgY29uc3QgZm9jdXNPcHRpb25zID0geyBwcmV2ZW50U2Nyb2xsOiBzd2FwU3BlYy5mb2N1c1Njcm9sbCAhPT0gdW5kZWZpbmVkID8gIXN3YXBTcGVjLmZvY3VzU2Nyb2xsIDogIWh0bXguY29uZmlnLmRlZmF1bHRGb2N1c1Njcm9sbCB9XG4gICAgICBpZiAobmV3QWN0aXZlRWx0KSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgaWYgKHNlbGVjdGlvbkluZm8uc3RhcnQgJiYgbmV3QWN0aXZlRWx0LnNldFNlbGVjdGlvblJhbmdlKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIG5ld0FjdGl2ZUVsdC5zZXRTZWxlY3Rpb25SYW5nZShzZWxlY3Rpb25JbmZvLnN0YXJ0LCBzZWxlY3Rpb25JbmZvLmVuZClcbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAvLyB0aGUgc2V0U2VsZWN0aW9uUmFuZ2UgbWV0aG9kIGlzIHByZXNlbnQgb24gZmllbGRzIHRoYXQgZG9uJ3Qgc3VwcG9ydCBpdCwgc28ganVzdCBsZXQgdGhpcyBmYWlsXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIG5ld0FjdGl2ZUVsdC5mb2N1cyhmb2N1c09wdGlvbnMpXG4gICAgICB9XG4gICAgfVxuXG4gICAgdGFyZ2V0LmNsYXNzTGlzdC5yZW1vdmUoaHRteC5jb25maWcuc3dhcHBpbmdDbGFzcylcbiAgICBmb3JFYWNoKHNldHRsZUluZm8uZWx0cywgZnVuY3Rpb24oZWx0KSB7XG4gICAgICBpZiAoZWx0LmNsYXNzTGlzdCkge1xuICAgICAgICBlbHQuY2xhc3NMaXN0LmFkZChodG14LmNvbmZpZy5zZXR0bGluZ0NsYXNzKVxuICAgICAgfVxuICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6YWZ0ZXJTd2FwJywgc3dhcE9wdGlvbnMuZXZlbnRJbmZvKVxuICAgIH0pXG4gICAgaWYgKHN3YXBPcHRpb25zLmFmdGVyU3dhcENhbGxiYWNrKSB7XG4gICAgICBzd2FwT3B0aW9ucy5hZnRlclN3YXBDYWxsYmFjaygpXG4gICAgfVxuXG4gICAgLy8gbWVyZ2UgaW4gbmV3IHRpdGxlIGFmdGVyIHN3YXAgYnV0IGJlZm9yZSBzZXR0bGVcbiAgICBpZiAoIXN3YXBTcGVjLmlnbm9yZVRpdGxlKSB7XG4gICAgICBoYW5kbGVUaXRsZShzZXR0bGVJbmZvLnRpdGxlKVxuICAgIH1cblxuICAgIC8vIHNldHRsZVxuICAgIGNvbnN0IGRvU2V0dGxlID0gZnVuY3Rpb24oKSB7XG4gICAgICBmb3JFYWNoKHNldHRsZUluZm8udGFza3MsIGZ1bmN0aW9uKHRhc2spIHtcbiAgICAgICAgdGFzay5jYWxsKClcbiAgICAgIH0pXG4gICAgICBmb3JFYWNoKHNldHRsZUluZm8uZWx0cywgZnVuY3Rpb24oZWx0KSB7XG4gICAgICAgIGlmIChlbHQuY2xhc3NMaXN0KSB7XG4gICAgICAgICAgZWx0LmNsYXNzTGlzdC5yZW1vdmUoaHRteC5jb25maWcuc2V0dGxpbmdDbGFzcylcbiAgICAgICAgfVxuICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDphZnRlclNldHRsZScsIHN3YXBPcHRpb25zLmV2ZW50SW5mbylcbiAgICAgIH0pXG5cbiAgICAgIGlmIChzd2FwT3B0aW9ucy5hbmNob3IpIHtcbiAgICAgICAgY29uc3QgYW5jaG9yVGFyZ2V0ID0gYXNFbGVtZW50KHJlc29sdmVUYXJnZXQoJyMnICsgc3dhcE9wdGlvbnMuYW5jaG9yKSlcbiAgICAgICAgaWYgKGFuY2hvclRhcmdldCkge1xuICAgICAgICAgIGFuY2hvclRhcmdldC5zY3JvbGxJbnRvVmlldyh7IGJsb2NrOiAnc3RhcnQnLCBiZWhhdmlvcjogJ2F1dG8nIH0pXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdXBkYXRlU2Nyb2xsU3RhdGUoc2V0dGxlSW5mby5lbHRzLCBzd2FwU3BlYylcbiAgICAgIGlmIChzd2FwT3B0aW9ucy5hZnRlclNldHRsZUNhbGxiYWNrKSB7XG4gICAgICAgIHN3YXBPcHRpb25zLmFmdGVyU2V0dGxlQ2FsbGJhY2soKVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChzd2FwU3BlYy5zZXR0bGVEZWxheSA+IDApIHtcbiAgICAgIGdldFdpbmRvdygpLnNldFRpbWVvdXQoZG9TZXR0bGUsIHN3YXBTcGVjLnNldHRsZURlbGF5KVxuICAgIH0gZWxzZSB7XG4gICAgICBkb1NldHRsZSgpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7WE1MSHR0cFJlcXVlc3R9IHhoclxuICAgKiBAcGFyYW0ge3N0cmluZ30gaGVhZGVyXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR9IGVsdFxuICAgKi9cbiAgZnVuY3Rpb24gaGFuZGxlVHJpZ2dlckhlYWRlcih4aHIsIGhlYWRlciwgZWx0KSB7XG4gICAgY29uc3QgdHJpZ2dlckJvZHkgPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoaGVhZGVyKVxuICAgIGlmICh0cmlnZ2VyQm9keS5pbmRleE9mKCd7JykgPT09IDApIHtcbiAgICAgIGNvbnN0IHRyaWdnZXJzID0gcGFyc2VKU09OKHRyaWdnZXJCb2R5KVxuICAgICAgZm9yIChjb25zdCBldmVudE5hbWUgaW4gdHJpZ2dlcnMpIHtcbiAgICAgICAgaWYgKHRyaWdnZXJzLmhhc093blByb3BlcnR5KGV2ZW50TmFtZSkpIHtcbiAgICAgICAgICBsZXQgZGV0YWlsID0gdHJpZ2dlcnNbZXZlbnROYW1lXVxuICAgICAgICAgIGlmIChpc1Jhd09iamVjdChkZXRhaWwpKSB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBlbHQgPSBkZXRhaWwudGFyZ2V0ICE9PSB1bmRlZmluZWQgPyBkZXRhaWwudGFyZ2V0IDogZWx0XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGRldGFpbCA9IHsgdmFsdWU6IGRldGFpbCB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHRyaWdnZXJFdmVudChlbHQsIGV2ZW50TmFtZSwgZGV0YWlsKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGV2ZW50TmFtZXMgPSB0cmlnZ2VyQm9keS5zcGxpdCgnLCcpXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGV2ZW50TmFtZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgZXZlbnROYW1lc1tpXS50cmltKCksIFtdKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IFdISVRFU1BBQ0UgPSAvXFxzL1xuICBjb25zdCBXSElURVNQQUNFX09SX0NPTU1BID0gL1tcXHMsXS9cbiAgY29uc3QgU1lNQk9MX1NUQVJUID0gL1tfJGEtekEtWl0vXG4gIGNvbnN0IFNZTUJPTF9DT05UID0gL1tfJGEtekEtWjAtOV0vXG4gIGNvbnN0IFNUUklOR0lTSF9TVEFSVCA9IFsnXCInLCBcIidcIiwgJy8nXVxuICBjb25zdCBOT1RfV0hJVEVTUEFDRSA9IC9bXlxcc10vXG4gIGNvbnN0IENPTUJJTkVEX1NFTEVDVE9SX1NUQVJUID0gL1t7KF0vXG4gIGNvbnN0IENPTUJJTkVEX1NFTEVDVE9SX0VORCA9IC9bfSldL1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gICAqIEByZXR1cm5zIHtzdHJpbmdbXX1cbiAgICovXG4gIGZ1bmN0aW9uIHRva2VuaXplU3RyaW5nKHN0cikge1xuICAgIC8qKiBAdHlwZSBzdHJpbmdbXSAqL1xuICAgIGNvbnN0IHRva2VucyA9IFtdXG4gICAgbGV0IHBvc2l0aW9uID0gMFxuICAgIHdoaWxlIChwb3NpdGlvbiA8IHN0ci5sZW5ndGgpIHtcbiAgICAgIGlmIChTWU1CT0xfU1RBUlQuZXhlYyhzdHIuY2hhckF0KHBvc2l0aW9uKSkpIHtcbiAgICAgICAgdmFyIHN0YXJ0UG9zaXRpb24gPSBwb3NpdGlvblxuICAgICAgICB3aGlsZSAoU1lNQk9MX0NPTlQuZXhlYyhzdHIuY2hhckF0KHBvc2l0aW9uICsgMSkpKSB7XG4gICAgICAgICAgcG9zaXRpb24rK1xuICAgICAgICB9XG4gICAgICAgIHRva2Vucy5wdXNoKHN0ci5zdWJzdHIoc3RhcnRQb3NpdGlvbiwgcG9zaXRpb24gLSBzdGFydFBvc2l0aW9uICsgMSkpXG4gICAgICB9IGVsc2UgaWYgKFNUUklOR0lTSF9TVEFSVC5pbmRleE9mKHN0ci5jaGFyQXQocG9zaXRpb24pKSAhPT0gLTEpIHtcbiAgICAgICAgY29uc3Qgc3RhcnRDaGFyID0gc3RyLmNoYXJBdChwb3NpdGlvbilcbiAgICAgICAgdmFyIHN0YXJ0UG9zaXRpb24gPSBwb3NpdGlvblxuICAgICAgICBwb3NpdGlvbisrXG4gICAgICAgIHdoaWxlIChwb3NpdGlvbiA8IHN0ci5sZW5ndGggJiYgc3RyLmNoYXJBdChwb3NpdGlvbikgIT09IHN0YXJ0Q2hhcikge1xuICAgICAgICAgIGlmIChzdHIuY2hhckF0KHBvc2l0aW9uKSA9PT0gJ1xcXFwnKSB7XG4gICAgICAgICAgICBwb3NpdGlvbisrXG4gICAgICAgICAgfVxuICAgICAgICAgIHBvc2l0aW9uKytcbiAgICAgICAgfVxuICAgICAgICB0b2tlbnMucHVzaChzdHIuc3Vic3RyKHN0YXJ0UG9zaXRpb24sIHBvc2l0aW9uIC0gc3RhcnRQb3NpdGlvbiArIDEpKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3Qgc3ltYm9sID0gc3RyLmNoYXJBdChwb3NpdGlvbilcbiAgICAgICAgdG9rZW5zLnB1c2goc3ltYm9sKVxuICAgICAgfVxuICAgICAgcG9zaXRpb24rK1xuICAgIH1cbiAgICByZXR1cm4gdG9rZW5zXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRva2VuXG4gICAqIEBwYXJhbSB7c3RyaW5nfG51bGx9IGxhc3RcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhcmFtTmFtZVxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGlzUG9zc2libGVSZWxhdGl2ZVJlZmVyZW5jZSh0b2tlbiwgbGFzdCwgcGFyYW1OYW1lKSB7XG4gICAgcmV0dXJuIFNZTUJPTF9TVEFSVC5leGVjKHRva2VuLmNoYXJBdCgwKSkgJiZcbiAgICAgIHRva2VuICE9PSAndHJ1ZScgJiZcbiAgICAgIHRva2VuICE9PSAnZmFsc2UnICYmXG4gICAgICB0b2tlbiAhPT0gJ3RoaXMnICYmXG4gICAgICB0b2tlbiAhPT0gcGFyYW1OYW1lICYmXG4gICAgICBsYXN0ICE9PSAnLidcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fHN0cmluZ30gZWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nW119IHRva2Vuc1xuICAgKiBAcGFyYW0ge3N0cmluZ30gcGFyYW1OYW1lXG4gICAqIEByZXR1cm5zIHtDb25kaXRpb25hbEZ1bmN0aW9ufG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBtYXliZUdlbmVyYXRlQ29uZGl0aW9uYWwoZWx0LCB0b2tlbnMsIHBhcmFtTmFtZSkge1xuICAgIGlmICh0b2tlbnNbMF0gPT09ICdbJykge1xuICAgICAgdG9rZW5zLnNoaWZ0KClcbiAgICAgIGxldCBicmFja2V0Q291bnQgPSAxXG4gICAgICBsZXQgY29uZGl0aW9uYWxTb3VyY2UgPSAnIHJldHVybiAoZnVuY3Rpb24oJyArIHBhcmFtTmFtZSArICcpeyByZXR1cm4gKCdcbiAgICAgIGxldCBsYXN0ID0gbnVsbFxuICAgICAgd2hpbGUgKHRva2Vucy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IHRva2VuID0gdG9rZW5zWzBdXG4gICAgICAgIC8vIEB0cy1pZ25vcmUgRm9yIHNvbWUgcmVhc29uIHRzYyBkb2Vzbid0IHVuZGVyc3RhbmQgdGhlIHNoaWZ0IGNhbGwsIGFuZCB0aGlua3Mgd2UncmUgY29tcGFyaW5nIHRoZSBzYW1lIHZhbHVlIGhlcmUsIGkuZS4gJ1snIHZzICddJ1xuICAgICAgICBpZiAodG9rZW4gPT09ICddJykge1xuICAgICAgICAgIGJyYWNrZXRDb3VudC0tXG4gICAgICAgICAgaWYgKGJyYWNrZXRDb3VudCA9PT0gMCkge1xuICAgICAgICAgICAgaWYgKGxhc3QgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgY29uZGl0aW9uYWxTb3VyY2UgPSBjb25kaXRpb25hbFNvdXJjZSArICd0cnVlJ1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdG9rZW5zLnNoaWZ0KClcbiAgICAgICAgICAgIGNvbmRpdGlvbmFsU291cmNlICs9ICcpfSknXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBjb25zdCBjb25kaXRpb25GdW5jdGlvbiA9IG1heWJlRXZhbChlbHQsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBGdW5jdGlvbihjb25kaXRpb25hbFNvdXJjZSkoKVxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBmdW5jdGlvbigpIHsgcmV0dXJuIHRydWUgfSlcbiAgICAgICAgICAgICAgY29uZGl0aW9uRnVuY3Rpb24uc291cmNlID0gY29uZGl0aW9uYWxTb3VyY2VcbiAgICAgICAgICAgICAgcmV0dXJuIGNvbmRpdGlvbkZ1bmN0aW9uXG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6c3ludGF4OmVycm9yJywgeyBlcnJvcjogZSwgc291cmNlOiBjb25kaXRpb25hbFNvdXJjZSB9KVxuICAgICAgICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICh0b2tlbiA9PT0gJ1snKSB7XG4gICAgICAgICAgYnJhY2tldENvdW50KytcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNQb3NzaWJsZVJlbGF0aXZlUmVmZXJlbmNlKHRva2VuLCBsYXN0LCBwYXJhbU5hbWUpKSB7XG4gICAgICAgICAgY29uZGl0aW9uYWxTb3VyY2UgKz0gJygoJyArIHBhcmFtTmFtZSArICcuJyArIHRva2VuICsgJykgPyAoJyArIHBhcmFtTmFtZSArICcuJyArIHRva2VuICsgJykgOiAod2luZG93LicgKyB0b2tlbiArICcpKSdcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25kaXRpb25hbFNvdXJjZSA9IGNvbmRpdGlvbmFsU291cmNlICsgdG9rZW5cbiAgICAgICAgfVxuICAgICAgICBsYXN0ID0gdG9rZW5zLnNoaWZ0KClcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gdG9rZW5zXG4gICAqIEBwYXJhbSB7UmVnRXhwfSBtYXRjaFxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgZnVuY3Rpb24gY29uc3VtZVVudGlsKHRva2VucywgbWF0Y2gpIHtcbiAgICBsZXQgcmVzdWx0ID0gJydcbiAgICB3aGlsZSAodG9rZW5zLmxlbmd0aCA+IDAgJiYgIW1hdGNoLnRlc3QodG9rZW5zWzBdKSkge1xuICAgICAgcmVzdWx0ICs9IHRva2Vucy5zaGlmdCgpXG4gICAgfVxuICAgIHJldHVybiByZXN1bHRcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSB0b2tlbnNcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGZ1bmN0aW9uIGNvbnN1bWVDU1NTZWxlY3Rvcih0b2tlbnMpIHtcbiAgICBsZXQgcmVzdWx0XG4gICAgaWYgKHRva2Vucy5sZW5ndGggPiAwICYmIENPTUJJTkVEX1NFTEVDVE9SX1NUQVJULnRlc3QodG9rZW5zWzBdKSkge1xuICAgICAgdG9rZW5zLnNoaWZ0KClcbiAgICAgIHJlc3VsdCA9IGNvbnN1bWVVbnRpbCh0b2tlbnMsIENPTUJJTkVEX1NFTEVDVE9SX0VORCkudHJpbSgpXG4gICAgICB0b2tlbnMuc2hpZnQoKVxuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHQgPSBjb25zdW1lVW50aWwodG9rZW5zLCBXSElURVNQQUNFX09SX0NPTU1BKVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0XG4gIH1cblxuICBjb25zdCBJTlBVVF9TRUxFQ1RPUiA9ICdpbnB1dCwgdGV4dGFyZWEsIHNlbGVjdCdcblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGV4cGxpY2l0VHJpZ2dlclxuICAgKiBAcGFyYW0ge09iamVjdH0gY2FjaGUgZm9yIHRyaWdnZXIgc3BlY3NcbiAgICogQHJldHVybnMge0h0bXhUcmlnZ2VyU3BlY2lmaWNhdGlvbltdfVxuICAgKi9cbiAgZnVuY3Rpb24gcGFyc2VBbmRDYWNoZVRyaWdnZXIoZWx0LCBleHBsaWNpdFRyaWdnZXIsIGNhY2hlKSB7XG4gICAgLyoqIEB0eXBlIEh0bXhUcmlnZ2VyU3BlY2lmaWNhdGlvbltdICovXG4gICAgY29uc3QgdHJpZ2dlclNwZWNzID0gW11cbiAgICBjb25zdCB0b2tlbnMgPSB0b2tlbml6ZVN0cmluZyhleHBsaWNpdFRyaWdnZXIpXG4gICAgZG8ge1xuICAgICAgY29uc3VtZVVudGlsKHRva2VucywgTk9UX1dISVRFU1BBQ0UpXG4gICAgICBjb25zdCBpbml0aWFsTGVuZ3RoID0gdG9rZW5zLmxlbmd0aFxuICAgICAgY29uc3QgdHJpZ2dlciA9IGNvbnN1bWVVbnRpbCh0b2tlbnMsIC9bLFxcW1xcc10vKVxuICAgICAgaWYgKHRyaWdnZXIgIT09ICcnKSB7XG4gICAgICAgIGlmICh0cmlnZ2VyID09PSAnZXZlcnknKSB7XG4gICAgICAgICAgLyoqIEB0eXBlIEh0bXhUcmlnZ2VyU3BlY2lmaWNhdGlvbiAqL1xuICAgICAgICAgIGNvbnN0IGV2ZXJ5ID0geyB0cmlnZ2VyOiAnZXZlcnknIH1cbiAgICAgICAgICBjb25zdW1lVW50aWwodG9rZW5zLCBOT1RfV0hJVEVTUEFDRSlcbiAgICAgICAgICBldmVyeS5wb2xsSW50ZXJ2YWwgPSBwYXJzZUludGVydmFsKGNvbnN1bWVVbnRpbCh0b2tlbnMsIC9bLFxcW1xcc10vKSlcbiAgICAgICAgICBjb25zdW1lVW50aWwodG9rZW5zLCBOT1RfV0hJVEVTUEFDRSlcbiAgICAgICAgICB2YXIgZXZlbnRGaWx0ZXIgPSBtYXliZUdlbmVyYXRlQ29uZGl0aW9uYWwoZWx0LCB0b2tlbnMsICdldmVudCcpXG4gICAgICAgICAgaWYgKGV2ZW50RmlsdGVyKSB7XG4gICAgICAgICAgICBldmVyeS5ldmVudEZpbHRlciA9IGV2ZW50RmlsdGVyXG4gICAgICAgICAgfVxuICAgICAgICAgIHRyaWdnZXJTcGVjcy5wdXNoKGV2ZXJ5KVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8qKiBAdHlwZSBIdG14VHJpZ2dlclNwZWNpZmljYXRpb24gKi9cbiAgICAgICAgICBjb25zdCB0cmlnZ2VyU3BlYyA9IHsgdHJpZ2dlciB9XG4gICAgICAgICAgdmFyIGV2ZW50RmlsdGVyID0gbWF5YmVHZW5lcmF0ZUNvbmRpdGlvbmFsKGVsdCwgdG9rZW5zLCAnZXZlbnQnKVxuICAgICAgICAgIGlmIChldmVudEZpbHRlcikge1xuICAgICAgICAgICAgdHJpZ2dlclNwZWMuZXZlbnRGaWx0ZXIgPSBldmVudEZpbHRlclxuICAgICAgICAgIH1cbiAgICAgICAgICB3aGlsZSAodG9rZW5zLmxlbmd0aCA+IDAgJiYgdG9rZW5zWzBdICE9PSAnLCcpIHtcbiAgICAgICAgICAgIGNvbnN1bWVVbnRpbCh0b2tlbnMsIE5PVF9XSElURVNQQUNFKVxuICAgICAgICAgICAgY29uc3QgdG9rZW4gPSB0b2tlbnMuc2hpZnQoKVxuICAgICAgICAgICAgaWYgKHRva2VuID09PSAnY2hhbmdlZCcpIHtcbiAgICAgICAgICAgICAgdHJpZ2dlclNwZWMuY2hhbmdlZCA9IHRydWVcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rZW4gPT09ICdvbmNlJykge1xuICAgICAgICAgICAgICB0cmlnZ2VyU3BlYy5vbmNlID0gdHJ1ZVxuICAgICAgICAgICAgfSBlbHNlIGlmICh0b2tlbiA9PT0gJ2NvbnN1bWUnKSB7XG4gICAgICAgICAgICAgIHRyaWdnZXJTcGVjLmNvbnN1bWUgPSB0cnVlXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRva2VuID09PSAnZGVsYXknICYmIHRva2Vuc1swXSA9PT0gJzonKSB7XG4gICAgICAgICAgICAgIHRva2Vucy5zaGlmdCgpXG4gICAgICAgICAgICAgIHRyaWdnZXJTcGVjLmRlbGF5ID0gcGFyc2VJbnRlcnZhbChjb25zdW1lVW50aWwodG9rZW5zLCBXSElURVNQQUNFX09SX0NPTU1BKSlcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rZW4gPT09ICdmcm9tJyAmJiB0b2tlbnNbMF0gPT09ICc6Jykge1xuICAgICAgICAgICAgICB0b2tlbnMuc2hpZnQoKVxuICAgICAgICAgICAgICBpZiAoQ09NQklORURfU0VMRUNUT1JfU1RBUlQudGVzdCh0b2tlbnNbMF0pKSB7XG4gICAgICAgICAgICAgICAgdmFyIGZyb21fYXJnID0gY29uc3VtZUNTU1NlbGVjdG9yKHRva2VucylcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB2YXIgZnJvbV9hcmcgPSBjb25zdW1lVW50aWwodG9rZW5zLCBXSElURVNQQUNFX09SX0NPTU1BKVxuICAgICAgICAgICAgICAgIGlmIChmcm9tX2FyZyA9PT0gJ2Nsb3Nlc3QnIHx8IGZyb21fYXJnID09PSAnZmluZCcgfHwgZnJvbV9hcmcgPT09ICduZXh0JyB8fCBmcm9tX2FyZyA9PT0gJ3ByZXZpb3VzJykge1xuICAgICAgICAgICAgICAgICAgdG9rZW5zLnNoaWZ0KClcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHNlbGVjdG9yID0gY29uc3VtZUNTU1NlbGVjdG9yKHRva2VucylcbiAgICAgICAgICAgICAgICAgIC8vIGBuZXh0YCBhbmQgYHByZXZpb3VzYCBhbGxvdyBhIHNlbGVjdG9yLWxlc3Mgc3ludGF4XG4gICAgICAgICAgICAgICAgICBpZiAoc2VsZWN0b3IubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBmcm9tX2FyZyArPSAnICcgKyBzZWxlY3RvclxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB0cmlnZ2VyU3BlYy5mcm9tID0gZnJvbV9hcmdcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rZW4gPT09ICd0YXJnZXQnICYmIHRva2Vuc1swXSA9PT0gJzonKSB7XG4gICAgICAgICAgICAgIHRva2Vucy5zaGlmdCgpXG4gICAgICAgICAgICAgIHRyaWdnZXJTcGVjLnRhcmdldCA9IGNvbnN1bWVDU1NTZWxlY3Rvcih0b2tlbnMpXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRva2VuID09PSAndGhyb3R0bGUnICYmIHRva2Vuc1swXSA9PT0gJzonKSB7XG4gICAgICAgICAgICAgIHRva2Vucy5zaGlmdCgpXG4gICAgICAgICAgICAgIHRyaWdnZXJTcGVjLnRocm90dGxlID0gcGFyc2VJbnRlcnZhbChjb25zdW1lVW50aWwodG9rZW5zLCBXSElURVNQQUNFX09SX0NPTU1BKSlcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rZW4gPT09ICdxdWV1ZScgJiYgdG9rZW5zWzBdID09PSAnOicpIHtcbiAgICAgICAgICAgICAgdG9rZW5zLnNoaWZ0KClcbiAgICAgICAgICAgICAgdHJpZ2dlclNwZWMucXVldWUgPSBjb25zdW1lVW50aWwodG9rZW5zLCBXSElURVNQQUNFX09SX0NPTU1BKVxuICAgICAgICAgICAgfSBlbHNlIGlmICh0b2tlbiA9PT0gJ3Jvb3QnICYmIHRva2Vuc1swXSA9PT0gJzonKSB7XG4gICAgICAgICAgICAgIHRva2Vucy5zaGlmdCgpXG4gICAgICAgICAgICAgIHRyaWdnZXJTcGVjW3Rva2VuXSA9IGNvbnN1bWVDU1NTZWxlY3Rvcih0b2tlbnMpXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRva2VuID09PSAndGhyZXNob2xkJyAmJiB0b2tlbnNbMF0gPT09ICc6Jykge1xuICAgICAgICAgICAgICB0b2tlbnMuc2hpZnQoKVxuICAgICAgICAgICAgICB0cmlnZ2VyU3BlY1t0b2tlbl0gPSBjb25zdW1lVW50aWwodG9rZW5zLCBXSElURVNQQUNFX09SX0NPTU1BKVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDpzeW50YXg6ZXJyb3InLCB7IHRva2VuOiB0b2tlbnMuc2hpZnQoKSB9KVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICB0cmlnZ2VyU3BlY3MucHVzaCh0cmlnZ2VyU3BlYylcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHRva2Vucy5sZW5ndGggPT09IGluaXRpYWxMZW5ndGgpIHtcbiAgICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDpzeW50YXg6ZXJyb3InLCB7IHRva2VuOiB0b2tlbnMuc2hpZnQoKSB9KVxuICAgICAgfVxuICAgICAgY29uc3VtZVVudGlsKHRva2VucywgTk9UX1dISVRFU1BBQ0UpXG4gICAgfSB3aGlsZSAodG9rZW5zWzBdID09PSAnLCcgJiYgdG9rZW5zLnNoaWZ0KCkpXG4gICAgaWYgKGNhY2hlKSB7XG4gICAgICBjYWNoZVtleHBsaWNpdFRyaWdnZXJdID0gdHJpZ2dlclNwZWNzXG4gICAgfVxuICAgIHJldHVybiB0cmlnZ2VyU3BlY3NcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJucyB7SHRteFRyaWdnZXJTcGVjaWZpY2F0aW9uW119XG4gICAqL1xuICBmdW5jdGlvbiBnZXRUcmlnZ2VyU3BlY3MoZWx0KSB7XG4gICAgY29uc3QgZXhwbGljaXRUcmlnZ2VyID0gZ2V0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtdHJpZ2dlcicpXG4gICAgbGV0IHRyaWdnZXJTcGVjcyA9IFtdXG4gICAgaWYgKGV4cGxpY2l0VHJpZ2dlcikge1xuICAgICAgY29uc3QgY2FjaGUgPSBodG14LmNvbmZpZy50cmlnZ2VyU3BlY3NDYWNoZVxuICAgICAgdHJpZ2dlclNwZWNzID0gKGNhY2hlICYmIGNhY2hlW2V4cGxpY2l0VHJpZ2dlcl0pIHx8IHBhcnNlQW5kQ2FjaGVUcmlnZ2VyKGVsdCwgZXhwbGljaXRUcmlnZ2VyLCBjYWNoZSlcbiAgICB9XG5cbiAgICBpZiAodHJpZ2dlclNwZWNzLmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybiB0cmlnZ2VyU3BlY3NcbiAgICB9IGVsc2UgaWYgKG1hdGNoZXMoZWx0LCAnZm9ybScpKSB7XG4gICAgICByZXR1cm4gW3sgdHJpZ2dlcjogJ3N1Ym1pdCcgfV1cbiAgICB9IGVsc2UgaWYgKG1hdGNoZXMoZWx0LCAnaW5wdXRbdHlwZT1cImJ1dHRvblwiXSwgaW5wdXRbdHlwZT1cInN1Ym1pdFwiXScpKSB7XG4gICAgICByZXR1cm4gW3sgdHJpZ2dlcjogJ2NsaWNrJyB9XVxuICAgIH0gZWxzZSBpZiAobWF0Y2hlcyhlbHQsIElOUFVUX1NFTEVDVE9SKSkge1xuICAgICAgcmV0dXJuIFt7IHRyaWdnZXI6ICdjaGFuZ2UnIH1dXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBbeyB0cmlnZ2VyOiAnY2xpY2snIH1dXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqL1xuICBmdW5jdGlvbiBjYW5jZWxQb2xsaW5nKGVsdCkge1xuICAgIGdldEludGVybmFsRGF0YShlbHQpLmNhbmNlbGxlZCA9IHRydWVcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge1RyaWdnZXJIYW5kbGVyfSBoYW5kbGVyXG4gICAqIEBwYXJhbSB7SHRteFRyaWdnZXJTcGVjaWZpY2F0aW9ufSBzcGVjXG4gICAqL1xuICBmdW5jdGlvbiBwcm9jZXNzUG9sbGluZyhlbHQsIGhhbmRsZXIsIHNwZWMpIHtcbiAgICBjb25zdCBub2RlRGF0YSA9IGdldEludGVybmFsRGF0YShlbHQpXG4gICAgbm9kZURhdGEudGltZW91dCA9IGdldFdpbmRvdygpLnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICBpZiAoYm9keUNvbnRhaW5zKGVsdCkgJiYgbm9kZURhdGEuY2FuY2VsbGVkICE9PSB0cnVlKSB7XG4gICAgICAgIGlmICghbWF5YmVGaWx0ZXJFdmVudChzcGVjLCBlbHQsIG1ha2VFdmVudCgnaHg6cG9sbDp0cmlnZ2VyJywge1xuICAgICAgICAgIHRyaWdnZXJTcGVjOiBzcGVjLFxuICAgICAgICAgIHRhcmdldDogZWx0XG4gICAgICAgIH0pKSkge1xuICAgICAgICAgIGhhbmRsZXIoZWx0KVxuICAgICAgICB9XG4gICAgICAgIHByb2Nlc3NQb2xsaW5nKGVsdCwgaGFuZGxlciwgc3BlYylcbiAgICAgIH1cbiAgICB9LCBzcGVjLnBvbGxJbnRlcnZhbClcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0hUTUxBbmNob3JFbGVtZW50fSBlbHRcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBpc0xvY2FsTGluayhlbHQpIHtcbiAgICByZXR1cm4gbG9jYXRpb24uaG9zdG5hbWUgPT09IGVsdC5ob3N0bmFtZSAmJlxuICAgICAgZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ2hyZWYnKSAmJlxuICAgICAgZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ2hyZWYnKS5pbmRleE9mKCcjJykgIT09IDBcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKi9cbiAgZnVuY3Rpb24gZWx0SXNEaXNhYmxlZChlbHQpIHtcbiAgICByZXR1cm4gY2xvc2VzdChlbHQsIGh0bXguY29uZmlnLmRpc2FibGVTZWxlY3RvcilcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge0h0bXhOb2RlSW50ZXJuYWxEYXRhfSBub2RlRGF0YVxuICAgKiBAcGFyYW0ge0h0bXhUcmlnZ2VyU3BlY2lmaWNhdGlvbltdfSB0cmlnZ2VyU3BlY3NcbiAgICovXG4gIGZ1bmN0aW9uIGJvb3N0RWxlbWVudChlbHQsIG5vZGVEYXRhLCB0cmlnZ2VyU3BlY3MpIHtcbiAgICBpZiAoKGVsdCBpbnN0YW5jZW9mIEhUTUxBbmNob3JFbGVtZW50ICYmIGlzTG9jYWxMaW5rKGVsdCkgJiYgKGVsdC50YXJnZXQgPT09ICcnIHx8IGVsdC50YXJnZXQgPT09ICdfc2VsZicpKSB8fCAoZWx0LnRhZ05hbWUgPT09ICdGT1JNJyAmJiBTdHJpbmcoZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ21ldGhvZCcpKS50b0xvd2VyQ2FzZSgpICE9PSAnZGlhbG9nJykpIHtcbiAgICAgIG5vZGVEYXRhLmJvb3N0ZWQgPSB0cnVlXG4gICAgICBsZXQgdmVyYiwgcGF0aFxuICAgICAgaWYgKGVsdC50YWdOYW1lID09PSAnQScpIHtcbiAgICAgICAgdmVyYiA9ICdnZXQnXG4gICAgICAgIHBhdGggPSBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnaHJlZicpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCByYXdBdHRyaWJ1dGUgPSBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnbWV0aG9kJylcbiAgICAgICAgdmVyYiA9IHJhd0F0dHJpYnV0ZSA/IHJhd0F0dHJpYnV0ZS50b0xvd2VyQ2FzZSgpIDogJ2dldCdcbiAgICAgICAgaWYgKHZlcmIgPT09ICdnZXQnKSB7XG4gICAgICAgIH1cbiAgICAgICAgcGF0aCA9IGdldFJhd0F0dHJpYnV0ZShlbHQsICdhY3Rpb24nKVxuICAgICAgfVxuICAgICAgdHJpZ2dlclNwZWNzLmZvckVhY2goZnVuY3Rpb24odHJpZ2dlclNwZWMpIHtcbiAgICAgICAgYWRkRXZlbnRMaXN0ZW5lcihlbHQsIGZ1bmN0aW9uKG5vZGUsIGV2dCkge1xuICAgICAgICAgIGNvbnN0IGVsdCA9IGFzRWxlbWVudChub2RlKVxuICAgICAgICAgIGlmIChlbHRJc0Rpc2FibGVkKGVsdCkpIHtcbiAgICAgICAgICAgIGNsZWFuVXBFbGVtZW50KGVsdClcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgIH1cbiAgICAgICAgICBpc3N1ZUFqYXhSZXF1ZXN0KHZlcmIsIHBhdGgsIGVsdCwgZXZ0KVxuICAgICAgICB9LCBub2RlRGF0YSwgdHJpZ2dlclNwZWMsIHRydWUpXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0V2ZW50fSBldnRcbiAgICogQHBhcmFtIHtOb2RlfSBub2RlXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gc2hvdWxkQ2FuY2VsKGV2dCwgbm9kZSkge1xuICAgIGNvbnN0IGVsdCA9IGFzRWxlbWVudChub2RlKVxuICAgIGlmICghZWx0KSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gICAgaWYgKGV2dC50eXBlID09PSAnc3VibWl0JyB8fCBldnQudHlwZSA9PT0gJ2NsaWNrJykge1xuICAgICAgaWYgKGVsdC50YWdOYW1lID09PSAnRk9STScpIHtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICAgIGlmIChtYXRjaGVzKGVsdCwgJ2lucHV0W3R5cGU9XCJzdWJtaXRcIl0sIGJ1dHRvbicpICYmIGNsb3Nlc3QoZWx0LCAnZm9ybScpICE9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgICBpZiAoZWx0IGluc3RhbmNlb2YgSFRNTEFuY2hvckVsZW1lbnQgJiYgZWx0LmhyZWYgJiZcbiAgICAgICAgKGVsdC5nZXRBdHRyaWJ1dGUoJ2hyZWYnKSA9PT0gJyMnIHx8IGVsdC5nZXRBdHRyaWJ1dGUoJ2hyZWYnKS5pbmRleE9mKCcjJykgIT09IDApKSB7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqIEBwYXJhbSB7RXZlbnR8TW91c2VFdmVudHxLZXlib2FyZEV2ZW50fFRvdWNoRXZlbnR9IGV2dFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGlnbm9yZUJvb3N0ZWRBbmNob3JDdHJsQ2xpY2soZWx0LCBldnQpIHtcbiAgICByZXR1cm4gZ2V0SW50ZXJuYWxEYXRhKGVsdCkuYm9vc3RlZCAmJiBlbHQgaW5zdGFuY2VvZiBIVE1MQW5jaG9yRWxlbWVudCAmJiBldnQudHlwZSA9PT0gJ2NsaWNrJyAmJlxuICAgICAgLy8gQHRzLWlnbm9yZSB0aGlzIHdpbGwgcmVzb2x2ZSB0byB1bmRlZmluZWQgZm9yIGV2ZW50cyB0aGF0IGRvbid0IGRlZmluZSB0aG9zZSBwcm9wZXJ0aWVzLCB3aGljaCBpcyBmaW5lXG4gICAgICAoZXZ0LmN0cmxLZXkgfHwgZXZ0Lm1ldGFLZXkpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtIdG14VHJpZ2dlclNwZWNpZmljYXRpb259IHRyaWdnZXJTcGVjXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqIEBwYXJhbSB7RXZlbnR9IGV2dFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIG1heWJlRmlsdGVyRXZlbnQodHJpZ2dlclNwZWMsIGVsdCwgZXZ0KSB7XG4gICAgY29uc3QgZXZlbnRGaWx0ZXIgPSB0cmlnZ2VyU3BlYy5ldmVudEZpbHRlclxuICAgIGlmIChldmVudEZpbHRlcikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGV2ZW50RmlsdGVyLmNhbGwoZWx0LCBldnQpICE9PSB0cnVlXG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNvbnN0IHNvdXJjZSA9IGV2ZW50RmlsdGVyLnNvdXJjZVxuICAgICAgICB0cmlnZ2VyRXJyb3JFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14OmV2ZW50RmlsdGVyOmVycm9yJywgeyBlcnJvcjogZSwgc291cmNlIH0pXG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqIEBwYXJhbSB7VHJpZ2dlckhhbmRsZXJ9IGhhbmRsZXJcbiAgICogQHBhcmFtIHtIdG14Tm9kZUludGVybmFsRGF0YX0gbm9kZURhdGFcbiAgICogQHBhcmFtIHtIdG14VHJpZ2dlclNwZWNpZmljYXRpb259IHRyaWdnZXJTcGVjXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2V4cGxpY2l0Q2FuY2VsXVxuICAgKi9cbiAgZnVuY3Rpb24gYWRkRXZlbnRMaXN0ZW5lcihlbHQsIGhhbmRsZXIsIG5vZGVEYXRhLCB0cmlnZ2VyU3BlYywgZXhwbGljaXRDYW5jZWwpIHtcbiAgICBjb25zdCBlbGVtZW50RGF0YSA9IGdldEludGVybmFsRGF0YShlbHQpXG4gICAgLyoqIEB0eXBlIHsoTm9kZXxXaW5kb3cpW119ICovXG4gICAgbGV0IGVsdHNUb0xpc3Rlbk9uXG4gICAgaWYgKHRyaWdnZXJTcGVjLmZyb20pIHtcbiAgICAgIGVsdHNUb0xpc3Rlbk9uID0gcXVlcnlTZWxlY3RvckFsbEV4dChlbHQsIHRyaWdnZXJTcGVjLmZyb20pXG4gICAgfSBlbHNlIHtcbiAgICAgIGVsdHNUb0xpc3Rlbk9uID0gW2VsdF1cbiAgICB9XG4gICAgLy8gc3RvcmUgdGhlIGluaXRpYWwgdmFsdWVzIG9mIHRoZSBlbGVtZW50cywgc28gd2UgY2FuIHRlbGwgaWYgdGhleSBjaGFuZ2VcbiAgICBpZiAodHJpZ2dlclNwZWMuY2hhbmdlZCkge1xuICAgICAgZWx0c1RvTGlzdGVuT24uZm9yRWFjaChmdW5jdGlvbihlbHRUb0xpc3Rlbk9uKSB7XG4gICAgICAgIGNvbnN0IGVsdFRvTGlzdGVuT25EYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGVsdFRvTGlzdGVuT24pXG4gICAgICAgIC8vIEB0cy1pZ25vcmUgdmFsdWUgd2lsbCBiZSB1bmRlZmluZWQgZm9yIG5vbi1pbnB1dCBlbGVtZW50cywgd2hpY2ggaXMgZmluZVxuICAgICAgICBlbHRUb0xpc3Rlbk9uRGF0YS5sYXN0VmFsdWUgPSBlbHRUb0xpc3Rlbk9uLnZhbHVlXG4gICAgICB9KVxuICAgIH1cbiAgICBmb3JFYWNoKGVsdHNUb0xpc3Rlbk9uLCBmdW5jdGlvbihlbHRUb0xpc3Rlbk9uKSB7XG4gICAgICAvKiogQHR5cGUgRXZlbnRMaXN0ZW5lciAqL1xuICAgICAgY29uc3QgZXZlbnRMaXN0ZW5lciA9IGZ1bmN0aW9uKGV2dCkge1xuICAgICAgICBpZiAoIWJvZHlDb250YWlucyhlbHQpKSB7XG4gICAgICAgICAgZWx0VG9MaXN0ZW5Pbi5yZW1vdmVFdmVudExpc3RlbmVyKHRyaWdnZXJTcGVjLnRyaWdnZXIsIGV2ZW50TGlzdGVuZXIpXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlnbm9yZUJvb3N0ZWRBbmNob3JDdHJsQ2xpY2soZWx0LCBldnQpKSB7XG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGV4cGxpY2l0Q2FuY2VsIHx8IHNob3VsZENhbmNlbChldnQsIGVsdCkpIHtcbiAgICAgICAgICBldnQucHJldmVudERlZmF1bHQoKVxuICAgICAgICB9XG4gICAgICAgIGlmIChtYXliZUZpbHRlckV2ZW50KHRyaWdnZXJTcGVjLCBlbHQsIGV2dCkpIHtcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBldmVudERhdGEgPSBnZXRJbnRlcm5hbERhdGEoZXZ0KVxuICAgICAgICBldmVudERhdGEudHJpZ2dlclNwZWMgPSB0cmlnZ2VyU3BlY1xuICAgICAgICBpZiAoZXZlbnREYXRhLmhhbmRsZWRGb3IgPT0gbnVsbCkge1xuICAgICAgICAgIGV2ZW50RGF0YS5oYW5kbGVkRm9yID0gW11cbiAgICAgICAgfVxuICAgICAgICBpZiAoZXZlbnREYXRhLmhhbmRsZWRGb3IuaW5kZXhPZihlbHQpIDwgMCkge1xuICAgICAgICAgIGV2ZW50RGF0YS5oYW5kbGVkRm9yLnB1c2goZWx0KVxuICAgICAgICAgIGlmICh0cmlnZ2VyU3BlYy5jb25zdW1lKSB7XG4gICAgICAgICAgICBldnQuc3RvcFByb3BhZ2F0aW9uKClcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHRyaWdnZXJTcGVjLnRhcmdldCAmJiBldnQudGFyZ2V0KSB7XG4gICAgICAgICAgICBpZiAoIW1hdGNoZXMoYXNFbGVtZW50KGV2dC50YXJnZXQpLCB0cmlnZ2VyU3BlYy50YXJnZXQpKSB7XG4gICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodHJpZ2dlclNwZWMub25jZSkge1xuICAgICAgICAgICAgaWYgKGVsZW1lbnREYXRhLnRyaWdnZXJlZE9uY2UpIHtcbiAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBlbGVtZW50RGF0YS50cmlnZ2VyZWRPbmNlID0gdHJ1ZVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodHJpZ2dlclNwZWMuY2hhbmdlZCkge1xuICAgICAgICAgICAgY29uc3QgZWx0VG9MaXN0ZW5PbkRhdGEgPSBnZXRJbnRlcm5hbERhdGEoZWx0VG9MaXN0ZW5PbilcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmUgdmFsdWUgd2lsbCBiZSB1bmRlZmluZWQgZm9yIG5vbi1pbnB1dCBlbGVtZW50cywgd2hpY2ggaXMgZmluZVxuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBlbHRUb0xpc3Rlbk9uLnZhbHVlXG4gICAgICAgICAgICBpZiAoZWx0VG9MaXN0ZW5PbkRhdGEubGFzdFZhbHVlID09PSB2YWx1ZSkge1xuICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsdFRvTGlzdGVuT25EYXRhLmxhc3RWYWx1ZSA9IHZhbHVlXG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChlbGVtZW50RGF0YS5kZWxheWVkKSB7XG4gICAgICAgICAgICBjbGVhclRpbWVvdXQoZWxlbWVudERhdGEuZGVsYXllZClcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGVsZW1lbnREYXRhLnRocm90dGxlKSB7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAodHJpZ2dlclNwZWMudGhyb3R0bGUgPiAwKSB7XG4gICAgICAgICAgICBpZiAoIWVsZW1lbnREYXRhLnRocm90dGxlKSB7XG4gICAgICAgICAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OnRyaWdnZXInKVxuICAgICAgICAgICAgICBoYW5kbGVyKGVsdCwgZXZ0KVxuICAgICAgICAgICAgICBlbGVtZW50RGF0YS50aHJvdHRsZSA9IGdldFdpbmRvdygpLnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgZWxlbWVudERhdGEudGhyb3R0bGUgPSBudWxsXG4gICAgICAgICAgICAgIH0sIHRyaWdnZXJTcGVjLnRocm90dGxlKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAodHJpZ2dlclNwZWMuZGVsYXkgPiAwKSB7XG4gICAgICAgICAgICBlbGVtZW50RGF0YS5kZWxheWVkID0gZ2V0V2luZG93KCkuc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6dHJpZ2dlcicpXG4gICAgICAgICAgICAgIGhhbmRsZXIoZWx0LCBldnQpXG4gICAgICAgICAgICB9LCB0cmlnZ2VyU3BlYy5kZWxheSlcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6dHJpZ2dlcicpXG4gICAgICAgICAgICBoYW5kbGVyKGVsdCwgZXZ0KVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKG5vZGVEYXRhLmxpc3RlbmVySW5mb3MgPT0gbnVsbCkge1xuICAgICAgICBub2RlRGF0YS5saXN0ZW5lckluZm9zID0gW11cbiAgICAgIH1cbiAgICAgIG5vZGVEYXRhLmxpc3RlbmVySW5mb3MucHVzaCh7XG4gICAgICAgIHRyaWdnZXI6IHRyaWdnZXJTcGVjLnRyaWdnZXIsXG4gICAgICAgIGxpc3RlbmVyOiBldmVudExpc3RlbmVyLFxuICAgICAgICBvbjogZWx0VG9MaXN0ZW5PblxuICAgICAgfSlcbiAgICAgIGVsdFRvTGlzdGVuT24uYWRkRXZlbnRMaXN0ZW5lcih0cmlnZ2VyU3BlYy50cmlnZ2VyLCBldmVudExpc3RlbmVyKVxuICAgIH0pXG4gIH1cblxuICBsZXQgd2luZG93SXNTY3JvbGxpbmcgPSBmYWxzZSAvLyB1c2VkIGJ5IGluaXRTY3JvbGxIYW5kbGVyXG4gIGxldCBzY3JvbGxIYW5kbGVyID0gbnVsbFxuICBmdW5jdGlvbiBpbml0U2Nyb2xsSGFuZGxlcigpIHtcbiAgICBpZiAoIXNjcm9sbEhhbmRsZXIpIHtcbiAgICAgIHNjcm9sbEhhbmRsZXIgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgd2luZG93SXNTY3JvbGxpbmcgPSB0cnVlXG4gICAgICB9XG4gICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgc2Nyb2xsSGFuZGxlcilcbiAgICAgIHNldEludGVydmFsKGZ1bmN0aW9uKCkge1xuICAgICAgICBpZiAod2luZG93SXNTY3JvbGxpbmcpIHtcbiAgICAgICAgICB3aW5kb3dJc1Njcm9sbGluZyA9IGZhbHNlXG4gICAgICAgICAgZm9yRWFjaChnZXREb2N1bWVudCgpLnF1ZXJ5U2VsZWN0b3JBbGwoXCJbaHgtdHJpZ2dlcio9J3JldmVhbGVkJ10sW2RhdGEtaHgtdHJpZ2dlcio9J3JldmVhbGVkJ11cIiksIGZ1bmN0aW9uKGVsdCkge1xuICAgICAgICAgICAgbWF5YmVSZXZlYWwoZWx0KVxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH0sIDIwMClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICovXG4gIGZ1bmN0aW9uIG1heWJlUmV2ZWFsKGVsdCkge1xuICAgIGlmICghaGFzQXR0cmlidXRlKGVsdCwgJ2RhdGEtaHgtcmV2ZWFsZWQnKSAmJiBpc1Njcm9sbGVkSW50b1ZpZXcoZWx0KSkge1xuICAgICAgZWx0LnNldEF0dHJpYnV0ZSgnZGF0YS1oeC1yZXZlYWxlZCcsICd0cnVlJylcbiAgICAgIGNvbnN0IG5vZGVEYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGVsdClcbiAgICAgIGlmIChub2RlRGF0YS5pbml0SGFzaCkge1xuICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAncmV2ZWFsZWQnKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gaWYgdGhlIG5vZGUgaXNuJ3QgaW5pdGlhbGl6ZWQsIHdhaXQgZm9yIGl0IGJlZm9yZSB0cmlnZ2VyaW5nIHRoZSByZXF1ZXN0XG4gICAgICAgIGVsdC5hZGRFdmVudExpc3RlbmVyKCdodG14OmFmdGVyUHJvY2Vzc05vZGUnLCBmdW5jdGlvbigpIHsgdHJpZ2dlckV2ZW50KGVsdCwgJ3JldmVhbGVkJykgfSwgeyBvbmNlOiB0cnVlIH0pXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtUcmlnZ2VySGFuZGxlcn0gaGFuZGxlclxuICAgKiBAcGFyYW0ge0h0bXhOb2RlSW50ZXJuYWxEYXRhfSBub2RlRGF0YVxuICAgKiBAcGFyYW0ge251bWJlcn0gZGVsYXlcbiAgICovXG4gIGZ1bmN0aW9uIGxvYWRJbW1lZGlhdGVseShlbHQsIGhhbmRsZXIsIG5vZGVEYXRhLCBkZWxheSkge1xuICAgIGNvbnN0IGxvYWQgPSBmdW5jdGlvbigpIHtcbiAgICAgIGlmICghbm9kZURhdGEubG9hZGVkKSB7XG4gICAgICAgIG5vZGVEYXRhLmxvYWRlZCA9IHRydWVcbiAgICAgICAgaGFuZGxlcihlbHQpXG4gICAgICB9XG4gICAgfVxuICAgIGlmIChkZWxheSA+IDApIHtcbiAgICAgIGdldFdpbmRvdygpLnNldFRpbWVvdXQobG9hZCwgZGVsYXkpXG4gICAgfSBlbHNlIHtcbiAgICAgIGxvYWQoKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge0h0bXhOb2RlSW50ZXJuYWxEYXRhfSBub2RlRGF0YVxuICAgKiBAcGFyYW0ge0h0bXhUcmlnZ2VyU3BlY2lmaWNhdGlvbltdfSB0cmlnZ2VyU3BlY3NcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBwcm9jZXNzVmVyYnMoZWx0LCBub2RlRGF0YSwgdHJpZ2dlclNwZWNzKSB7XG4gICAgbGV0IGV4cGxpY2l0QWN0aW9uID0gZmFsc2VcbiAgICBmb3JFYWNoKFZFUkJTLCBmdW5jdGlvbih2ZXJiKSB7XG4gICAgICBpZiAoaGFzQXR0cmlidXRlKGVsdCwgJ2h4LScgKyB2ZXJiKSkge1xuICAgICAgICBjb25zdCBwYXRoID0gZ2V0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtJyArIHZlcmIpXG4gICAgICAgIGV4cGxpY2l0QWN0aW9uID0gdHJ1ZVxuICAgICAgICBub2RlRGF0YS5wYXRoID0gcGF0aFxuICAgICAgICBub2RlRGF0YS52ZXJiID0gdmVyYlxuICAgICAgICB0cmlnZ2VyU3BlY3MuZm9yRWFjaChmdW5jdGlvbih0cmlnZ2VyU3BlYykge1xuICAgICAgICAgIGFkZFRyaWdnZXJIYW5kbGVyKGVsdCwgdHJpZ2dlclNwZWMsIG5vZGVEYXRhLCBmdW5jdGlvbihub2RlLCBldnQpIHtcbiAgICAgICAgICAgIGNvbnN0IGVsdCA9IGFzRWxlbWVudChub2RlKVxuICAgICAgICAgICAgaWYgKGNsb3Nlc3QoZWx0LCBodG14LmNvbmZpZy5kaXNhYmxlU2VsZWN0b3IpKSB7XG4gICAgICAgICAgICAgIGNsZWFuVXBFbGVtZW50KGVsdClcbiAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpc3N1ZUFqYXhSZXF1ZXN0KHZlcmIsIHBhdGgsIGVsdCwgZXZ0KVxuICAgICAgICAgIH0pXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfSlcbiAgICByZXR1cm4gZXhwbGljaXRBY3Rpb25cbiAgfVxuXG4gIC8qKlxuICAgKiBAY2FsbGJhY2sgVHJpZ2dlckhhbmRsZXJcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHBhcmFtIHtFdmVudH0gW2V2dF1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqIEBwYXJhbSB7SHRteFRyaWdnZXJTcGVjaWZpY2F0aW9ufSB0cmlnZ2VyU3BlY1xuICAgKiBAcGFyYW0ge0h0bXhOb2RlSW50ZXJuYWxEYXRhfSBub2RlRGF0YVxuICAgKiBAcGFyYW0ge1RyaWdnZXJIYW5kbGVyfSBoYW5kbGVyXG4gICAqL1xuICBmdW5jdGlvbiBhZGRUcmlnZ2VySGFuZGxlcihlbHQsIHRyaWdnZXJTcGVjLCBub2RlRGF0YSwgaGFuZGxlcikge1xuICAgIGlmICh0cmlnZ2VyU3BlYy50cmlnZ2VyID09PSAncmV2ZWFsZWQnKSB7XG4gICAgICBpbml0U2Nyb2xsSGFuZGxlcigpXG4gICAgICBhZGRFdmVudExpc3RlbmVyKGVsdCwgaGFuZGxlciwgbm9kZURhdGEsIHRyaWdnZXJTcGVjKVxuICAgICAgbWF5YmVSZXZlYWwoYXNFbGVtZW50KGVsdCkpXG4gICAgfSBlbHNlIGlmICh0cmlnZ2VyU3BlYy50cmlnZ2VyID09PSAnaW50ZXJzZWN0Jykge1xuICAgICAgY29uc3Qgb2JzZXJ2ZXJPcHRpb25zID0ge31cbiAgICAgIGlmICh0cmlnZ2VyU3BlYy5yb290KSB7XG4gICAgICAgIG9ic2VydmVyT3B0aW9ucy5yb290ID0gcXVlcnlTZWxlY3RvckV4dChlbHQsIHRyaWdnZXJTcGVjLnJvb3QpXG4gICAgICB9XG4gICAgICBpZiAodHJpZ2dlclNwZWMudGhyZXNob2xkKSB7XG4gICAgICAgIG9ic2VydmVyT3B0aW9ucy50aHJlc2hvbGQgPSBwYXJzZUZsb2F0KHRyaWdnZXJTcGVjLnRocmVzaG9sZClcbiAgICAgIH1cbiAgICAgIGNvbnN0IG9ic2VydmVyID0gbmV3IEludGVyc2VjdGlvbk9ic2VydmVyKGZ1bmN0aW9uKGVudHJpZXMpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBlbnRyaWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgZW50cnkgPSBlbnRyaWVzW2ldXG4gICAgICAgICAgaWYgKGVudHJ5LmlzSW50ZXJzZWN0aW5nKSB7XG4gICAgICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaW50ZXJzZWN0JylcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LCBvYnNlcnZlck9wdGlvbnMpXG4gICAgICBvYnNlcnZlci5vYnNlcnZlKGFzRWxlbWVudChlbHQpKVxuICAgICAgYWRkRXZlbnRMaXN0ZW5lcihhc0VsZW1lbnQoZWx0KSwgaGFuZGxlciwgbm9kZURhdGEsIHRyaWdnZXJTcGVjKVxuICAgIH0gZWxzZSBpZiAodHJpZ2dlclNwZWMudHJpZ2dlciA9PT0gJ2xvYWQnKSB7XG4gICAgICBpZiAoIW1heWJlRmlsdGVyRXZlbnQodHJpZ2dlclNwZWMsIGVsdCwgbWFrZUV2ZW50KCdsb2FkJywgeyBlbHQgfSkpKSB7XG4gICAgICAgIGxvYWRJbW1lZGlhdGVseShhc0VsZW1lbnQoZWx0KSwgaGFuZGxlciwgbm9kZURhdGEsIHRyaWdnZXJTcGVjLmRlbGF5KVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodHJpZ2dlclNwZWMucG9sbEludGVydmFsID4gMCkge1xuICAgICAgbm9kZURhdGEucG9sbGluZyA9IHRydWVcbiAgICAgIHByb2Nlc3NQb2xsaW5nKGFzRWxlbWVudChlbHQpLCBoYW5kbGVyLCB0cmlnZ2VyU3BlYylcbiAgICB9IGVsc2Uge1xuICAgICAgYWRkRXZlbnRMaXN0ZW5lcihlbHQsIGhhbmRsZXIsIG5vZGVEYXRhLCB0cmlnZ2VyU3BlYylcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBub2RlXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gc2hvdWxkUHJvY2Vzc0h4T24obm9kZSkge1xuICAgIGNvbnN0IGVsdCA9IGFzRWxlbWVudChub2RlKVxuICAgIGlmICghZWx0KSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gICAgY29uc3QgYXR0cmlidXRlcyA9IGVsdC5hdHRyaWJ1dGVzXG4gICAgZm9yIChsZXQgaiA9IDA7IGogPCBhdHRyaWJ1dGVzLmxlbmd0aDsgaisrKSB7XG4gICAgICBjb25zdCBhdHRyTmFtZSA9IGF0dHJpYnV0ZXNbal0ubmFtZVxuICAgICAgaWYgKHN0YXJ0c1dpdGgoYXR0ck5hbWUsICdoeC1vbjonKSB8fCBzdGFydHNXaXRoKGF0dHJOYW1lLCAnZGF0YS1oeC1vbjonKSB8fFxuICAgICAgICBzdGFydHNXaXRoKGF0dHJOYW1lLCAnaHgtb24tJykgfHwgc3RhcnRzV2l0aChhdHRyTmFtZSwgJ2RhdGEtaHgtb24tJykpIHtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHJldHVybnMge0VsZW1lbnRbXX1cbiAgICovXG4gIGNvbnN0IEhYX09OX1FVRVJZID0gbmV3IFhQYXRoRXZhbHVhdG9yKClcbiAgICAuY3JlYXRlRXhwcmVzc2lvbignLi8vKltAKlsgc3RhcnRzLXdpdGgobmFtZSgpLCBcImh4LW9uOlwiKSBvciBzdGFydHMtd2l0aChuYW1lKCksIFwiZGF0YS1oeC1vbjpcIikgb3InICtcbiAgICAgICcgc3RhcnRzLXdpdGgobmFtZSgpLCBcImh4LW9uLVwiKSBvciBzdGFydHMtd2l0aChuYW1lKCksIFwiZGF0YS1oeC1vbi1cIikgXV0nKVxuXG4gIGZ1bmN0aW9uIHByb2Nlc3NIWE9uUm9vdChlbHQsIGVsZW1lbnRzKSB7XG4gICAgaWYgKHNob3VsZFByb2Nlc3NIeE9uKGVsdCkpIHtcbiAgICAgIGVsZW1lbnRzLnB1c2goYXNFbGVtZW50KGVsdCkpXG4gICAgfVxuICAgIGNvbnN0IGl0ZXIgPSBIWF9PTl9RVUVSWS5ldmFsdWF0ZShlbHQpXG4gICAgbGV0IG5vZGUgPSBudWxsXG4gICAgd2hpbGUgKG5vZGUgPSBpdGVyLml0ZXJhdGVOZXh0KCkpIGVsZW1lbnRzLnB1c2goYXNFbGVtZW50KG5vZGUpKVxuICB9XG5cbiAgZnVuY3Rpb24gZmluZEh4T25XaWxkY2FyZEVsZW1lbnRzKGVsdCkge1xuICAgIC8qKiBAdHlwZSB7RWxlbWVudFtdfSAqL1xuICAgIGNvbnN0IGVsZW1lbnRzID0gW11cbiAgICBpZiAoZWx0IGluc3RhbmNlb2YgRG9jdW1lbnRGcmFnbWVudCkge1xuICAgICAgZm9yIChjb25zdCBjaGlsZCBvZiBlbHQuY2hpbGROb2Rlcykge1xuICAgICAgICBwcm9jZXNzSFhPblJvb3QoY2hpbGQsIGVsZW1lbnRzKVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBwcm9jZXNzSFhPblJvb3QoZWx0LCBlbGVtZW50cylcbiAgICB9XG4gICAgcmV0dXJuIGVsZW1lbnRzXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHJldHVybnMge05vZGVMaXN0T2Y8RWxlbWVudD58W119XG4gICAqL1xuICBmdW5jdGlvbiBmaW5kRWxlbWVudHNUb1Byb2Nlc3MoZWx0KSB7XG4gICAgaWYgKGVsdC5xdWVyeVNlbGVjdG9yQWxsKSB7XG4gICAgICBjb25zdCBib29zdGVkU2VsZWN0b3IgPSAnLCBbaHgtYm9vc3RdIGEsIFtkYXRhLWh4LWJvb3N0XSBhLCBhW2h4LWJvb3N0XSwgYVtkYXRhLWh4LWJvb3N0XSdcblxuICAgICAgY29uc3QgZXh0ZW5zaW9uU2VsZWN0b3JzID0gW11cbiAgICAgIGZvciAoY29uc3QgZSBpbiBleHRlbnNpb25zKSB7XG4gICAgICAgIGNvbnN0IGV4dGVuc2lvbiA9IGV4dGVuc2lvbnNbZV1cbiAgICAgICAgaWYgKGV4dGVuc2lvbi5nZXRTZWxlY3RvcnMpIHtcbiAgICAgICAgICB2YXIgc2VsZWN0b3JzID0gZXh0ZW5zaW9uLmdldFNlbGVjdG9ycygpXG4gICAgICAgICAgaWYgKHNlbGVjdG9ycykge1xuICAgICAgICAgICAgZXh0ZW5zaW9uU2VsZWN0b3JzLnB1c2goc2VsZWN0b3JzKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCByZXN1bHRzID0gZWx0LnF1ZXJ5U2VsZWN0b3JBbGwoVkVSQl9TRUxFQ1RPUiArIGJvb3N0ZWRTZWxlY3RvciArIFwiLCBmb3JtLCBbdHlwZT0nc3VibWl0J10sXCIgK1xuICAgICAgICAnIFtoeC1leHRdLCBbZGF0YS1oeC1leHRdLCBbaHgtdHJpZ2dlcl0sIFtkYXRhLWh4LXRyaWdnZXJdJyArIGV4dGVuc2lvblNlbGVjdG9ycy5mbGF0KCkubWFwKHMgPT4gJywgJyArIHMpLmpvaW4oJycpKVxuXG4gICAgICByZXR1cm4gcmVzdWx0c1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gW11cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIHN1Ym1pdCBidXR0b25zL2lucHV0cyB0aGF0IGhhdmUgdGhlIGZvcm0gYXR0cmlidXRlIHNldFxuICAgKiBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZG9jcy9XZWIvSFRNTC9FbGVtZW50L2J1dHRvblxuICAgKiBAcGFyYW0ge0V2ZW50fSBldnRcbiAgICovXG4gIGZ1bmN0aW9uIG1heWJlU2V0TGFzdEJ1dHRvbkNsaWNrZWQoZXZ0KSB7XG4gICAgY29uc3QgZWx0ID0gLyoqIEB0eXBlIHtIVE1MQnV0dG9uRWxlbWVudHxIVE1MSW5wdXRFbGVtZW50fSAqLyAoY2xvc2VzdChhc0VsZW1lbnQoZXZ0LnRhcmdldCksIFwiYnV0dG9uLCBpbnB1dFt0eXBlPSdzdWJtaXQnXVwiKSlcbiAgICBjb25zdCBpbnRlcm5hbERhdGEgPSBnZXRSZWxhdGVkRm9ybURhdGEoZXZ0KVxuICAgIGlmIChpbnRlcm5hbERhdGEpIHtcbiAgICAgIGludGVybmFsRGF0YS5sYXN0QnV0dG9uQ2xpY2tlZCA9IGVsdFxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0V2ZW50fSBldnRcbiAgICovXG4gIGZ1bmN0aW9uIG1heWJlVW5zZXRMYXN0QnV0dG9uQ2xpY2tlZChldnQpIHtcbiAgICBjb25zdCBpbnRlcm5hbERhdGEgPSBnZXRSZWxhdGVkRm9ybURhdGEoZXZ0KVxuICAgIGlmIChpbnRlcm5hbERhdGEpIHtcbiAgICAgIGludGVybmFsRGF0YS5sYXN0QnV0dG9uQ2xpY2tlZCA9IG51bGxcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFdmVudH0gZXZ0XG4gICAqIEByZXR1cm5zIHtIdG14Tm9kZUludGVybmFsRGF0YXx1bmRlZmluZWR9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRSZWxhdGVkRm9ybURhdGEoZXZ0KSB7XG4gICAgY29uc3QgZWx0ID0gY2xvc2VzdChhc0VsZW1lbnQoZXZ0LnRhcmdldCksIFwiYnV0dG9uLCBpbnB1dFt0eXBlPSdzdWJtaXQnXVwiKVxuICAgIGlmICghZWx0KSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgY29uc3QgZm9ybSA9IHJlc29sdmVUYXJnZXQoJyMnICsgZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ2Zvcm0nKSwgZWx0LmdldFJvb3ROb2RlKCkpIHx8IGNsb3Nlc3QoZWx0LCAnZm9ybScpXG4gICAgaWYgKCFmb3JtKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgcmV0dXJuIGdldEludGVybmFsRGF0YShmb3JtKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR9IGVsdFxuICAgKi9cbiAgZnVuY3Rpb24gaW5pdEJ1dHRvblRyYWNraW5nKGVsdCkge1xuICAgIC8vIG5lZWQgdG8gaGFuZGxlIGJvdGggY2xpY2sgYW5kIGZvY3VzIGluOlxuICAgIC8vICAgZm9jdXNpbiAtIGluIGNhc2Ugc29tZW9uZSB0YWJzIGluIHRvIGEgYnV0dG9uIGFuZCBoaXRzIHRoZSBzcGFjZSBiYXJcbiAgICAvLyAgIGNsaWNrIC0gb24gT1NYIGJ1dHRvbnMgZG8gbm90IGZvY3VzIG9uIGNsaWNrIHNlZSBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTM3MjRcbiAgICBlbHQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBtYXliZVNldExhc3RCdXR0b25DbGlja2VkKVxuICAgIGVsdC5hZGRFdmVudExpc3RlbmVyKCdmb2N1c2luJywgbWF5YmVTZXRMYXN0QnV0dG9uQ2xpY2tlZClcbiAgICBlbHQuYWRkRXZlbnRMaXN0ZW5lcignZm9jdXNvdXQnLCBtYXliZVVuc2V0TGFzdEJ1dHRvbkNsaWNrZWQpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gY29kZVxuICAgKi9cbiAgZnVuY3Rpb24gYWRkSHhPbkV2ZW50SGFuZGxlcihlbHQsIGV2ZW50TmFtZSwgY29kZSkge1xuICAgIGNvbnN0IG5vZGVEYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGVsdClcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkobm9kZURhdGEub25IYW5kbGVycykpIHtcbiAgICAgIG5vZGVEYXRhLm9uSGFuZGxlcnMgPSBbXVxuICAgIH1cbiAgICBsZXQgZnVuY1xuICAgIC8qKiBAdHlwZSBFdmVudExpc3RlbmVyICovXG4gICAgY29uc3QgbGlzdGVuZXIgPSBmdW5jdGlvbihlKSB7XG4gICAgICBtYXliZUV2YWwoZWx0LCBmdW5jdGlvbigpIHtcbiAgICAgICAgaWYgKGVsdElzRGlzYWJsZWQoZWx0KSkge1xuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIGlmICghZnVuYykge1xuICAgICAgICAgIGZ1bmMgPSBuZXcgRnVuY3Rpb24oJ2V2ZW50JywgY29kZSlcbiAgICAgICAgfVxuICAgICAgICBmdW5jLmNhbGwoZWx0LCBlKVxuICAgICAgfSlcbiAgICB9XG4gICAgZWx0LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBsaXN0ZW5lcilcbiAgICBub2RlRGF0YS5vbkhhbmRsZXJzLnB1c2goeyBldmVudDogZXZlbnROYW1lLCBsaXN0ZW5lciB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqL1xuICBmdW5jdGlvbiBwcm9jZXNzSHhPbldpbGRjYXJkKGVsdCkge1xuICAgIC8vIHdpcGUgYW55IHByZXZpb3VzIG9uIGhhbmRsZXJzIHNvIHRoYXQgdGhpcyBmdW5jdGlvbiB0YWtlcyBwcmVjZWRlbmNlXG4gICAgZGVJbml0T25IYW5kbGVycyhlbHQpXG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVsdC5hdHRyaWJ1dGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBuYW1lID0gZWx0LmF0dHJpYnV0ZXNbaV0ubmFtZVxuICAgICAgY29uc3QgdmFsdWUgPSBlbHQuYXR0cmlidXRlc1tpXS52YWx1ZVxuICAgICAgaWYgKHN0YXJ0c1dpdGgobmFtZSwgJ2h4LW9uJykgfHwgc3RhcnRzV2l0aChuYW1lLCAnZGF0YS1oeC1vbicpKSB7XG4gICAgICAgIGNvbnN0IGFmdGVyT25Qb3NpdGlvbiA9IG5hbWUuaW5kZXhPZignLW9uJykgKyAzXG4gICAgICAgIGNvbnN0IG5leHRDaGFyID0gbmFtZS5zbGljZShhZnRlck9uUG9zaXRpb24sIGFmdGVyT25Qb3NpdGlvbiArIDEpXG4gICAgICAgIGlmIChuZXh0Q2hhciA9PT0gJy0nIHx8IG5leHRDaGFyID09PSAnOicpIHtcbiAgICAgICAgICBsZXQgZXZlbnROYW1lID0gbmFtZS5zbGljZShhZnRlck9uUG9zaXRpb24gKyAxKVxuICAgICAgICAgIC8vIGlmIHRoZSBldmVudE5hbWUgc3RhcnRzIHdpdGggYSBjb2xvbiBvciBkYXNoLCBwcmVwZW5kIFwiaHRteFwiIGZvciBzaG9ydGhhbmQgc3VwcG9ydFxuICAgICAgICAgIGlmIChzdGFydHNXaXRoKGV2ZW50TmFtZSwgJzonKSkge1xuICAgICAgICAgICAgZXZlbnROYW1lID0gJ2h0bXgnICsgZXZlbnROYW1lXG4gICAgICAgICAgfSBlbHNlIGlmIChzdGFydHNXaXRoKGV2ZW50TmFtZSwgJy0nKSkge1xuICAgICAgICAgICAgZXZlbnROYW1lID0gJ2h0bXg6JyArIGV2ZW50TmFtZS5zbGljZSgxKVxuICAgICAgICAgIH0gZWxzZSBpZiAoc3RhcnRzV2l0aChldmVudE5hbWUsICdodG14LScpKSB7XG4gICAgICAgICAgICBldmVudE5hbWUgPSAnaHRteDonICsgZXZlbnROYW1lLnNsaWNlKDUpXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYWRkSHhPbkV2ZW50SGFuZGxlcihlbHQsIGV2ZW50TmFtZSwgdmFsdWUpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fEhUTUxJbnB1dEVsZW1lbnR9IGVsdFxuICAgKi9cbiAgZnVuY3Rpb24gaW5pdE5vZGUoZWx0KSB7XG4gICAgaWYgKGNsb3Nlc3QoZWx0LCBodG14LmNvbmZpZy5kaXNhYmxlU2VsZWN0b3IpKSB7XG4gICAgICBjbGVhblVwRWxlbWVudChlbHQpXG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgY29uc3Qgbm9kZURhdGEgPSBnZXRJbnRlcm5hbERhdGEoZWx0KVxuICAgIGlmIChub2RlRGF0YS5pbml0SGFzaCAhPT0gYXR0cmlidXRlSGFzaChlbHQpKSB7XG4gICAgICAvLyBjbGVhbiB1cCBhbnkgcHJldmlvdXNseSBwcm9jZXNzZWQgaW5mb1xuICAgICAgZGVJbml0Tm9kZShlbHQpXG5cbiAgICAgIG5vZGVEYXRhLmluaXRIYXNoID0gYXR0cmlidXRlSGFzaChlbHQpXG5cbiAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OmJlZm9yZVByb2Nlc3NOb2RlJylcblxuICAgICAgLy8gQHRzLWlnbm9yZSB2YWx1ZSB3aWxsIGJlIHVuZGVmaW5lZCBmb3Igbm9uLWlucHV0IGVsZW1lbnRzLCB3aGljaCBpcyBmaW5lXG4gICAgICBpZiAoZWx0LnZhbHVlKSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgbm9kZURhdGEubGFzdFZhbHVlID0gZWx0LnZhbHVlXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHRyaWdnZXJTcGVjcyA9IGdldFRyaWdnZXJTcGVjcyhlbHQpXG4gICAgICBjb25zdCBoYXNFeHBsaWNpdEh0dHBBY3Rpb24gPSBwcm9jZXNzVmVyYnMoZWx0LCBub2RlRGF0YSwgdHJpZ2dlclNwZWNzKVxuXG4gICAgICBpZiAoIWhhc0V4cGxpY2l0SHR0cEFjdGlvbikge1xuICAgICAgICBpZiAoZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LWJvb3N0JykgPT09ICd0cnVlJykge1xuICAgICAgICAgIGJvb3N0RWxlbWVudChlbHQsIG5vZGVEYXRhLCB0cmlnZ2VyU3BlY3MpXG4gICAgICAgIH0gZWxzZSBpZiAoaGFzQXR0cmlidXRlKGVsdCwgJ2h4LXRyaWdnZXInKSkge1xuICAgICAgICAgIHRyaWdnZXJTcGVjcy5mb3JFYWNoKGZ1bmN0aW9uKHRyaWdnZXJTcGVjKSB7XG4gICAgICAgICAgICAvLyBGb3IgXCJuYWtlZFwiIHRyaWdnZXJzLCBkb24ndCBkbyBhbnl0aGluZyBhdCBhbGxcbiAgICAgICAgICAgIGFkZFRyaWdnZXJIYW5kbGVyKGVsdCwgdHJpZ2dlclNwZWMsIG5vZGVEYXRhLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBIYW5kbGUgc3VibWl0IGJ1dHRvbnMvaW5wdXRzIHRoYXQgaGF2ZSB0aGUgZm9ybSBhdHRyaWJ1dGUgc2V0XG4gICAgICAvLyBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZG9jcy9XZWIvSFRNTC9FbGVtZW50L2J1dHRvblxuICAgICAgaWYgKGVsdC50YWdOYW1lID09PSAnRk9STScgfHwgKGdldFJhd0F0dHJpYnV0ZShlbHQsICd0eXBlJykgPT09ICdzdWJtaXQnICYmIGhhc0F0dHJpYnV0ZShlbHQsICdmb3JtJykpKSB7XG4gICAgICAgIGluaXRCdXR0b25UcmFja2luZyhlbHQpXG4gICAgICB9XG5cbiAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OmFmdGVyUHJvY2Vzc05vZGUnKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQcm9jZXNzZXMgbmV3IGNvbnRlbnQsIGVuYWJsaW5nIGh0bXggYmVoYXZpb3IuIFRoaXMgY2FuIGJlIHVzZWZ1bCBpZiB5b3UgaGF2ZSBjb250ZW50IHRoYXQgaXMgYWRkZWQgdG8gdGhlIERPTSBvdXRzaWRlIG9mIHRoZSBub3JtYWwgaHRteCByZXF1ZXN0IGN5Y2xlIGJ1dCBzdGlsbCB3YW50IGh0bXggYXR0cmlidXRlcyB0byB3b3JrLlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNwcm9jZXNzXG4gICAqXG4gICAqIEBwYXJhbSB7RWxlbWVudHxzdHJpbmd9IGVsdCBlbGVtZW50IHRvIHByb2Nlc3NcbiAgICovXG4gIGZ1bmN0aW9uIHByb2Nlc3NOb2RlKGVsdCkge1xuICAgIGVsdCA9IHJlc29sdmVUYXJnZXQoZWx0KVxuICAgIGlmIChjbG9zZXN0KGVsdCwgaHRteC5jb25maWcuZGlzYWJsZVNlbGVjdG9yKSkge1xuICAgICAgY2xlYW5VcEVsZW1lbnQoZWx0KVxuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGluaXROb2RlKGVsdClcbiAgICBmb3JFYWNoKGZpbmRFbGVtZW50c1RvUHJvY2VzcyhlbHQpLCBmdW5jdGlvbihjaGlsZCkgeyBpbml0Tm9kZShjaGlsZCkgfSlcbiAgICBmb3JFYWNoKGZpbmRIeE9uV2lsZGNhcmRFbGVtZW50cyhlbHQpLCBwcm9jZXNzSHhPbldpbGRjYXJkKVxuICB9XG5cbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gRXZlbnQvTG9nIFN1cHBvcnRcbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgZnVuY3Rpb24ga2ViYWJFdmVudE5hbWUoc3RyKSB7XG4gICAgcmV0dXJuIHN0ci5yZXBsYWNlKC8oW2EtejAtOV0pKFtBLVpdKS9nLCAnJDEtJDInKS50b0xvd2VyQ2FzZSgpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZVxuICAgKiBAcGFyYW0ge2FueX0gZGV0YWlsXG4gICAqIEByZXR1cm5zIHtDdXN0b21FdmVudH1cbiAgICovXG4gIGZ1bmN0aW9uIG1ha2VFdmVudChldmVudE5hbWUsIGRldGFpbCkge1xuICAgIGxldCBldnRcbiAgICBpZiAod2luZG93LkN1c3RvbUV2ZW50ICYmIHR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIC8vIFRPRE86IGBjb21wb3NlZDogdHJ1ZWAgaGVyZSBpcyBhIGhhY2sgdG8gbWFrZSBnbG9iYWwgZXZlbnQgaGFuZGxlcnMgd29yayB3aXRoIGV2ZW50cyBpbiBzaGFkb3cgRE9NXG4gICAgICAvLyBUaGlzIGJyZWFrcyBleHBlY3RlZCBlbmNhcHN1bGF0aW9uIGJ1dCBuZWVkcyB0byBiZSBoZXJlIHVudGlsIGRlY2lkZWQgb3RoZXJ3aXNlIGJ5IGNvcmUgZGV2c1xuICAgICAgZXZ0ID0gbmV3IEN1c3RvbUV2ZW50KGV2ZW50TmFtZSwgeyBidWJibGVzOiB0cnVlLCBjYW5jZWxhYmxlOiB0cnVlLCBjb21wb3NlZDogdHJ1ZSwgZGV0YWlsIH0pXG4gICAgfSBlbHNlIHtcbiAgICAgIGV2dCA9IGdldERvY3VtZW50KCkuY3JlYXRlRXZlbnQoJ0N1c3RvbUV2ZW50JylcbiAgICAgIGV2dC5pbml0Q3VzdG9tRXZlbnQoZXZlbnROYW1lLCB0cnVlLCB0cnVlLCBkZXRhaWwpXG4gICAgfVxuICAgIHJldHVybiBldnRcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fHN0cmluZ30gZWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudE5hbWVcbiAgICogQHBhcmFtIHthbnk9fSBkZXRhaWxcbiAgICovXG4gIGZ1bmN0aW9uIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgZXZlbnROYW1lLCBkZXRhaWwpIHtcbiAgICB0cmlnZ2VyRXZlbnQoZWx0LCBldmVudE5hbWUsIG1lcmdlT2JqZWN0cyh7IGVycm9yOiBldmVudE5hbWUgfSwgZGV0YWlsKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gaWdub3JlRXZlbnRGb3JMb2dnaW5nKGV2ZW50TmFtZSkge1xuICAgIHJldHVybiBldmVudE5hbWUgPT09ICdodG14OmFmdGVyUHJvY2Vzc05vZGUnXG4gIH1cblxuICAvKipcbiAgICogYHdpdGhFeHRlbnNpb25zYCBsb2NhdGVzIGFsbCBhY3RpdmUgZXh0ZW5zaW9ucyBmb3IgYSBwcm92aWRlZCBlbGVtZW50LCB0aGVuXG4gICAqIGV4ZWN1dGVzIHRoZSBwcm92aWRlZCBmdW5jdGlvbiB1c2luZyBlYWNoIG9mIHRoZSBhY3RpdmUgZXh0ZW5zaW9ucy4gIEl0IHNob3VsZFxuICAgKiBiZSBjYWxsZWQgaW50ZXJuYWxseSBhdCBldmVyeSBleHRlbmRhYmxlIGV4ZWN1dGlvbiBwb2ludCBpbiBodG14LlxuICAgKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0geyhleHRlbnNpb246SHRteEV4dGVuc2lvbikgPT4gdm9pZH0gdG9Eb1xuICAgKiBAcmV0dXJucyB2b2lkXG4gICAqL1xuICBmdW5jdGlvbiB3aXRoRXh0ZW5zaW9ucyhlbHQsIHRvRG8pIHtcbiAgICBmb3JFYWNoKGdldEV4dGVuc2lvbnMoZWx0KSwgZnVuY3Rpb24oZXh0ZW5zaW9uKSB7XG4gICAgICB0cnkge1xuICAgICAgICB0b0RvKGV4dGVuc2lvbilcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgbG9nRXJyb3IoZSlcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgZnVuY3Rpb24gbG9nRXJyb3IobXNnKSB7XG4gICAgaWYgKGNvbnNvbGUuZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IobXNnKVxuICAgIH0gZWxzZSBpZiAoY29uc29sZS5sb2cpIHtcbiAgICAgIGNvbnNvbGUubG9nKCdFUlJPUjogJywgbXNnKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUcmlnZ2VycyBhIGdpdmVuIGV2ZW50IG9uIGFuIGVsZW1lbnRcbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jdHJpZ2dlclxuICAgKlxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fHN0cmluZ30gZWx0IHRoZSBlbGVtZW50IHRvIHRyaWdnZXIgdGhlIGV2ZW50IG9uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudE5hbWUgdGhlIG5hbWUgb2YgdGhlIGV2ZW50IHRvIHRyaWdnZXJcbiAgICogQHBhcmFtIHthbnk9fSBkZXRhaWwgZGV0YWlscyBmb3IgdGhlIGV2ZW50XG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gdHJpZ2dlckV2ZW50KGVsdCwgZXZlbnROYW1lLCBkZXRhaWwpIHtcbiAgICBlbHQgPSByZXNvbHZlVGFyZ2V0KGVsdClcbiAgICBpZiAoZGV0YWlsID09IG51bGwpIHtcbiAgICAgIGRldGFpbCA9IHt9XG4gICAgfVxuICAgIGRldGFpbC5lbHQgPSBlbHRcbiAgICBjb25zdCBldmVudCA9IG1ha2VFdmVudChldmVudE5hbWUsIGRldGFpbClcbiAgICBpZiAoaHRteC5sb2dnZXIgJiYgIWlnbm9yZUV2ZW50Rm9yTG9nZ2luZyhldmVudE5hbWUpKSB7XG4gICAgICBodG14LmxvZ2dlcihlbHQsIGV2ZW50TmFtZSwgZGV0YWlsKVxuICAgIH1cbiAgICBpZiAoZGV0YWlsLmVycm9yKSB7XG4gICAgICBsb2dFcnJvcihkZXRhaWwuZXJyb3IpXG4gICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDplcnJvcicsIHsgZXJyb3JJbmZvOiBkZXRhaWwgfSlcbiAgICB9XG4gICAgbGV0IGV2ZW50UmVzdWx0ID0gZWx0LmRpc3BhdGNoRXZlbnQoZXZlbnQpXG4gICAgY29uc3Qga2ViYWJOYW1lID0ga2ViYWJFdmVudE5hbWUoZXZlbnROYW1lKVxuICAgIGlmIChldmVudFJlc3VsdCAmJiBrZWJhYk5hbWUgIT09IGV2ZW50TmFtZSkge1xuICAgICAgY29uc3Qga2ViYWJlZEV2ZW50ID0gbWFrZUV2ZW50KGtlYmFiTmFtZSwgZXZlbnQuZGV0YWlsKVxuICAgICAgZXZlbnRSZXN1bHQgPSBldmVudFJlc3VsdCAmJiBlbHQuZGlzcGF0Y2hFdmVudChrZWJhYmVkRXZlbnQpXG4gICAgfVxuICAgIHdpdGhFeHRlbnNpb25zKGFzRWxlbWVudChlbHQpLCBmdW5jdGlvbihleHRlbnNpb24pIHtcbiAgICAgIGV2ZW50UmVzdWx0ID0gZXZlbnRSZXN1bHQgJiYgKGV4dGVuc2lvbi5vbkV2ZW50KGV2ZW50TmFtZSwgZXZlbnQpICE9PSBmYWxzZSAmJiAhZXZlbnQuZGVmYXVsdFByZXZlbnRlZClcbiAgICB9KVxuICAgIHJldHVybiBldmVudFJlc3VsdFxuICB9XG5cbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gSGlzdG9yeSBTdXBwb3J0XG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIGxldCBjdXJyZW50UGF0aEZvckhpc3RvcnkgPSBsb2NhdGlvbi5wYXRobmFtZSArIGxvY2F0aW9uLnNlYXJjaFxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7RWxlbWVudH1cbiAgICovXG4gIGZ1bmN0aW9uIGdldEhpc3RvcnlFbGVtZW50KCkge1xuICAgIGNvbnN0IGhpc3RvcnlFbHQgPSBnZXREb2N1bWVudCgpLnF1ZXJ5U2VsZWN0b3IoJ1toeC1oaXN0b3J5LWVsdF0sW2RhdGEtaHgtaGlzdG9yeS1lbHRdJylcbiAgICByZXR1cm4gaGlzdG9yeUVsdCB8fCBnZXREb2N1bWVudCgpLmJvZHlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdXJsXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gcm9vdEVsdFxuICAgKi9cbiAgZnVuY3Rpb24gc2F2ZVRvSGlzdG9yeUNhY2hlKHVybCwgcm9vdEVsdCkge1xuICAgIGlmICghY2FuQWNjZXNzTG9jYWxTdG9yYWdlKCkpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIC8vIGdldCBzdGF0ZSB0byBzYXZlXG4gICAgY29uc3QgaW5uZXJIVE1MID0gY2xlYW5Jbm5lckh0bWxGb3JIaXN0b3J5KHJvb3RFbHQpXG4gICAgY29uc3QgdGl0bGUgPSBnZXREb2N1bWVudCgpLnRpdGxlXG4gICAgY29uc3Qgc2Nyb2xsID0gd2luZG93LnNjcm9sbFlcblxuICAgIGlmIChodG14LmNvbmZpZy5oaXN0b3J5Q2FjaGVTaXplIDw9IDApIHtcbiAgICAgIC8vIG1ha2Ugc3VyZSB0aGF0IGFuIGV2ZW50dWFsbHkgYWxyZWFkeSBleGlzdGluZyBjYWNoZSBpcyBwdXJnZWRcbiAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKCdodG14LWhpc3RvcnktY2FjaGUnKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdXJsID0gbm9ybWFsaXplUGF0aCh1cmwpXG5cbiAgICBjb25zdCBoaXN0b3J5Q2FjaGUgPSBwYXJzZUpTT04obG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2h0bXgtaGlzdG9yeS1jYWNoZScpKSB8fCBbXVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaGlzdG9yeUNhY2hlLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoaGlzdG9yeUNhY2hlW2ldLnVybCA9PT0gdXJsKSB7XG4gICAgICAgIGhpc3RvcnlDYWNoZS5zcGxpY2UoaSwgMSlcbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogQHR5cGUgSHRteEhpc3RvcnlJdGVtICovXG4gICAgY29uc3QgbmV3SGlzdG9yeUl0ZW0gPSB7IHVybCwgY29udGVudDogaW5uZXJIVE1MLCB0aXRsZSwgc2Nyb2xsIH1cblxuICAgIHRyaWdnZXJFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14Omhpc3RvcnlJdGVtQ3JlYXRlZCcsIHsgaXRlbTogbmV3SGlzdG9yeUl0ZW0sIGNhY2hlOiBoaXN0b3J5Q2FjaGUgfSlcblxuICAgIGhpc3RvcnlDYWNoZS5wdXNoKG5ld0hpc3RvcnlJdGVtKVxuICAgIHdoaWxlIChoaXN0b3J5Q2FjaGUubGVuZ3RoID4gaHRteC5jb25maWcuaGlzdG9yeUNhY2hlU2l6ZSkge1xuICAgICAgaGlzdG9yeUNhY2hlLnNoaWZ0KClcbiAgICB9XG5cbiAgICAvLyBrZWVwIHRyeWluZyB0byBzYXZlIHRoZSBjYWNoZSB1bnRpbCBpdCBzdWNjZWVkcyBvciBpcyBlbXB0eVxuICAgIHdoaWxlIChoaXN0b3J5Q2FjaGUubGVuZ3RoID4gMCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ2h0bXgtaGlzdG9yeS1jYWNoZScsIEpTT04uc3RyaW5naWZ5KGhpc3RvcnlDYWNoZSkpXG4gICAgICAgIGJyZWFrXG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6aGlzdG9yeUNhY2hlRXJyb3InLCB7IGNhdXNlOiBlLCBjYWNoZTogaGlzdG9yeUNhY2hlIH0pXG4gICAgICAgIGhpc3RvcnlDYWNoZS5zaGlmdCgpIC8vIHNocmluayB0aGUgY2FjaGUgYW5kIHJldHJ5XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEB0eXBlZGVmIHtPYmplY3R9IEh0bXhIaXN0b3J5SXRlbVxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gdXJsXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBjb250ZW50XG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB0aXRsZVxuICAgKiBAcHJvcGVydHkge251bWJlcn0gc2Nyb2xsXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdXJsXG4gICAqIEByZXR1cm5zIHtIdG14SGlzdG9yeUl0ZW18bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIGdldENhY2hlZEhpc3RvcnkodXJsKSB7XG4gICAgaWYgKCFjYW5BY2Nlc3NMb2NhbFN0b3JhZ2UoKSkge1xuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG5cbiAgICB1cmwgPSBub3JtYWxpemVQYXRoKHVybClcblxuICAgIGNvbnN0IGhpc3RvcnlDYWNoZSA9IHBhcnNlSlNPTihsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnaHRteC1oaXN0b3J5LWNhY2hlJykpIHx8IFtdXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBoaXN0b3J5Q2FjaGUubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChoaXN0b3J5Q2FjaGVbaV0udXJsID09PSB1cmwpIHtcbiAgICAgICAgcmV0dXJuIGhpc3RvcnlDYWNoZVtpXVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBmdW5jdGlvbiBjbGVhbklubmVySHRtbEZvckhpc3RvcnkoZWx0KSB7XG4gICAgY29uc3QgY2xhc3NOYW1lID0gaHRteC5jb25maWcucmVxdWVzdENsYXNzXG4gICAgY29uc3QgY2xvbmUgPSAvKiogQHR5cGUgRWxlbWVudCAqLyAoZWx0LmNsb25lTm9kZSh0cnVlKSlcbiAgICBmb3JFYWNoKGZpbmRBbGwoY2xvbmUsICcuJyArIGNsYXNzTmFtZSksIGZ1bmN0aW9uKGNoaWxkKSB7XG4gICAgICByZW1vdmVDbGFzc0Zyb21FbGVtZW50KGNoaWxkLCBjbGFzc05hbWUpXG4gICAgfSlcbiAgICAvLyByZW1vdmUgdGhlIGRpc2FibGVkIGF0dHJpYnV0ZSBmb3IgYW55IGVsZW1lbnQgZGlzYWJsZWQgZHVlIHRvIGFuIGh0bXggcmVxdWVzdFxuICAgIGZvckVhY2goZmluZEFsbChjbG9uZSwgJ1tkYXRhLWRpc2FibGVkLWJ5LWh0bXhdJyksIGZ1bmN0aW9uKGNoaWxkKSB7XG4gICAgICBjaGlsZC5yZW1vdmVBdHRyaWJ1dGUoJ2Rpc2FibGVkJylcbiAgICB9KVxuICAgIHJldHVybiBjbG9uZS5pbm5lckhUTUxcbiAgfVxuXG4gIGZ1bmN0aW9uIHNhdmVDdXJyZW50UGFnZVRvSGlzdG9yeSgpIHtcbiAgICBjb25zdCBlbHQgPSBnZXRIaXN0b3J5RWxlbWVudCgpXG4gICAgY29uc3QgcGF0aCA9IGN1cnJlbnRQYXRoRm9ySGlzdG9yeSB8fCBsb2NhdGlvbi5wYXRobmFtZSArIGxvY2F0aW9uLnNlYXJjaFxuXG4gICAgLy8gQWxsb3cgaGlzdG9yeSBzbmFwc2hvdCBmZWF0dXJlIHRvIGJlIGRpc2FibGVkIHdoZXJlIGh4LWhpc3Rvcnk9XCJmYWxzZVwiXG4gICAgLy8gaXMgcHJlc2VudCAqYW55d2hlcmUqIGluIHRoZSBjdXJyZW50IGRvY3VtZW50IHdlJ3JlIGFib3V0IHRvIHNhdmUsXG4gICAgLy8gc28gd2UgY2FuIHByZXZlbnQgcHJpdmlsZWdlZCBkYXRhIGVudGVyaW5nIHRoZSBjYWNoZS5cbiAgICAvLyBUaGUgcGFnZSB3aWxsIHN0aWxsIGJlIHJlYWNoYWJsZSBhcyBhIGhpc3RvcnkgZW50cnksIGJ1dCBodG14IHdpbGwgZmV0Y2ggaXRcbiAgICAvLyBsaXZlIGZyb20gdGhlIHNlcnZlciBvbnBvcHN0YXRlIHJhdGhlciB0aGFuIGxvb2sgaW4gdGhlIGxvY2FsU3RvcmFnZSBjYWNoZVxuICAgIGxldCBkaXNhYmxlSGlzdG9yeUNhY2hlXG4gICAgdHJ5IHtcbiAgICAgIGRpc2FibGVIaXN0b3J5Q2FjaGUgPSBnZXREb2N1bWVudCgpLnF1ZXJ5U2VsZWN0b3IoJ1toeC1oaXN0b3J5PVwiZmFsc2VcIiBpXSxbZGF0YS1oeC1oaXN0b3J5PVwiZmFsc2VcIiBpXScpXG4gICAgfSBjYXRjaCAoZSkge1xuICAgIC8vIElFMTE6IGluc2Vuc2l0aXZlIG1vZGlmaWVyIG5vdCBzdXBwb3J0ZWQgc28gZmFsbGJhY2sgdG8gY2FzZSBzZW5zaXRpdmUgc2VsZWN0b3JcbiAgICAgIGRpc2FibGVIaXN0b3J5Q2FjaGUgPSBnZXREb2N1bWVudCgpLnF1ZXJ5U2VsZWN0b3IoJ1toeC1oaXN0b3J5PVwiZmFsc2VcIl0sW2RhdGEtaHgtaGlzdG9yeT1cImZhbHNlXCJdJylcbiAgICB9XG4gICAgaWYgKCFkaXNhYmxlSGlzdG9yeUNhY2hlKSB7XG4gICAgICB0cmlnZ2VyRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpiZWZvcmVIaXN0b3J5U2F2ZScsIHsgcGF0aCwgaGlzdG9yeUVsdDogZWx0IH0pXG4gICAgICBzYXZlVG9IaXN0b3J5Q2FjaGUocGF0aCwgZWx0KVxuICAgIH1cblxuICAgIGlmIChodG14LmNvbmZpZy5oaXN0b3J5RW5hYmxlZCkgaGlzdG9yeS5yZXBsYWNlU3RhdGUoeyBodG14OiB0cnVlIH0sIGdldERvY3VtZW50KCkudGl0bGUsIHdpbmRvdy5sb2NhdGlvbi5ocmVmKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gICAqL1xuICBmdW5jdGlvbiBwdXNoVXJsSW50b0hpc3RvcnkocGF0aCkge1xuICAvLyByZW1vdmUgdGhlIGNhY2hlIGJ1c3RlciBwYXJhbWV0ZXIsIGlmIGFueVxuICAgIGlmIChodG14LmNvbmZpZy5nZXRDYWNoZUJ1c3RlclBhcmFtKSB7XG4gICAgICBwYXRoID0gcGF0aC5yZXBsYWNlKC9vcmdcXC5odG14XFwuY2FjaGUtYnVzdGVyPVteJl0qJj8vLCAnJylcbiAgICAgIGlmIChlbmRzV2l0aChwYXRoLCAnJicpIHx8IGVuZHNXaXRoKHBhdGgsICc/JykpIHtcbiAgICAgICAgcGF0aCA9IHBhdGguc2xpY2UoMCwgLTEpXG4gICAgICB9XG4gICAgfVxuICAgIGlmIChodG14LmNvbmZpZy5oaXN0b3J5RW5hYmxlZCkge1xuICAgICAgaGlzdG9yeS5wdXNoU3RhdGUoeyBodG14OiB0cnVlIH0sICcnLCBwYXRoKVxuICAgIH1cbiAgICBjdXJyZW50UGF0aEZvckhpc3RvcnkgPSBwYXRoXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAgICovXG4gIGZ1bmN0aW9uIHJlcGxhY2VVcmxJbkhpc3RvcnkocGF0aCkge1xuICAgIGlmIChodG14LmNvbmZpZy5oaXN0b3J5RW5hYmxlZCkgaGlzdG9yeS5yZXBsYWNlU3RhdGUoeyBodG14OiB0cnVlIH0sICcnLCBwYXRoKVxuICAgIGN1cnJlbnRQYXRoRm9ySGlzdG9yeSA9IHBhdGhcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0h0bXhTZXR0bGVUYXNrW119IHRhc2tzXG4gICAqL1xuICBmdW5jdGlvbiBzZXR0bGVJbW1lZGlhdGVseSh0YXNrcykge1xuICAgIGZvckVhY2godGFza3MsIGZ1bmN0aW9uKHRhc2spIHtcbiAgICAgIHRhc2suY2FsbCh1bmRlZmluZWQpXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICAgKi9cbiAgZnVuY3Rpb24gbG9hZEhpc3RvcnlGcm9tU2VydmVyKHBhdGgpIHtcbiAgICBjb25zdCByZXF1ZXN0ID0gbmV3IFhNTEh0dHBSZXF1ZXN0KClcbiAgICBjb25zdCBkZXRhaWxzID0geyBwYXRoLCB4aHI6IHJlcXVlc3QgfVxuICAgIHRyaWdnZXJFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14Omhpc3RvcnlDYWNoZU1pc3MnLCBkZXRhaWxzKVxuICAgIHJlcXVlc3Qub3BlbignR0VUJywgcGF0aCwgdHJ1ZSlcbiAgICByZXF1ZXN0LnNldFJlcXVlc3RIZWFkZXIoJ0hYLVJlcXVlc3QnLCAndHJ1ZScpXG4gICAgcmVxdWVzdC5zZXRSZXF1ZXN0SGVhZGVyKCdIWC1IaXN0b3J5LVJlc3RvcmUtUmVxdWVzdCcsICd0cnVlJylcbiAgICByZXF1ZXN0LnNldFJlcXVlc3RIZWFkZXIoJ0hYLUN1cnJlbnQtVVJMJywgZ2V0RG9jdW1lbnQoKS5sb2NhdGlvbi5ocmVmKVxuICAgIHJlcXVlc3Qub25sb2FkID0gZnVuY3Rpb24oKSB7XG4gICAgICBpZiAodGhpcy5zdGF0dXMgPj0gMjAwICYmIHRoaXMuc3RhdHVzIDwgNDAwKSB7XG4gICAgICAgIHRyaWdnZXJFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14Omhpc3RvcnlDYWNoZU1pc3NMb2FkJywgZGV0YWlscylcbiAgICAgICAgY29uc3QgZnJhZ21lbnQgPSBtYWtlRnJhZ21lbnQodGhpcy5yZXNwb25zZSlcbiAgICAgICAgLyoqIEB0eXBlIFBhcmVudE5vZGUgKi9cbiAgICAgICAgY29uc3QgY29udGVudCA9IGZyYWdtZW50LnF1ZXJ5U2VsZWN0b3IoJ1toeC1oaXN0b3J5LWVsdF0sW2RhdGEtaHgtaGlzdG9yeS1lbHRdJykgfHwgZnJhZ21lbnRcbiAgICAgICAgY29uc3QgaGlzdG9yeUVsZW1lbnQgPSBnZXRIaXN0b3J5RWxlbWVudCgpXG4gICAgICAgIGNvbnN0IHNldHRsZUluZm8gPSBtYWtlU2V0dGxlSW5mbyhoaXN0b3J5RWxlbWVudClcbiAgICAgICAgaGFuZGxlVGl0bGUoZnJhZ21lbnQudGl0bGUpXG5cbiAgICAgICAgc3dhcElubmVySFRNTChoaXN0b3J5RWxlbWVudCwgY29udGVudCwgc2V0dGxlSW5mbylcbiAgICAgICAgc2V0dGxlSW1tZWRpYXRlbHkoc2V0dGxlSW5mby50YXNrcylcbiAgICAgICAgY3VycmVudFBhdGhGb3JIaXN0b3J5ID0gcGF0aFxuICAgICAgICB0cmlnZ2VyRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpoaXN0b3J5UmVzdG9yZScsIHsgcGF0aCwgY2FjaGVNaXNzOiB0cnVlLCBzZXJ2ZXJSZXNwb25zZTogdGhpcy5yZXNwb25zZSB9KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpoaXN0b3J5Q2FjaGVNaXNzTG9hZEVycm9yJywgZGV0YWlscylcbiAgICAgIH1cbiAgICB9XG4gICAgcmVxdWVzdC5zZW5kKClcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW3BhdGhdXG4gICAqL1xuICBmdW5jdGlvbiByZXN0b3JlSGlzdG9yeShwYXRoKSB7XG4gICAgc2F2ZUN1cnJlbnRQYWdlVG9IaXN0b3J5KClcbiAgICBwYXRoID0gcGF0aCB8fCBsb2NhdGlvbi5wYXRobmFtZSArIGxvY2F0aW9uLnNlYXJjaFxuICAgIGNvbnN0IGNhY2hlZCA9IGdldENhY2hlZEhpc3RvcnkocGF0aClcbiAgICBpZiAoY2FjaGVkKSB7XG4gICAgICBjb25zdCBmcmFnbWVudCA9IG1ha2VGcmFnbWVudChjYWNoZWQuY29udGVudClcbiAgICAgIGNvbnN0IGhpc3RvcnlFbGVtZW50ID0gZ2V0SGlzdG9yeUVsZW1lbnQoKVxuICAgICAgY29uc3Qgc2V0dGxlSW5mbyA9IG1ha2VTZXR0bGVJbmZvKGhpc3RvcnlFbGVtZW50KVxuICAgICAgaGFuZGxlVGl0bGUoZnJhZ21lbnQudGl0bGUpXG4gICAgICBzd2FwSW5uZXJIVE1MKGhpc3RvcnlFbGVtZW50LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICAgIHNldHRsZUltbWVkaWF0ZWx5KHNldHRsZUluZm8udGFza3MpXG4gICAgICBnZXRXaW5kb3coKS5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICB3aW5kb3cuc2Nyb2xsVG8oMCwgY2FjaGVkLnNjcm9sbClcbiAgICAgIH0sIDApIC8vIG5leHQgJ3RpY2snLCBzbyBicm93c2VyIGhhcyB0aW1lIHRvIHJlbmRlciBsYXlvdXRcbiAgICAgIGN1cnJlbnRQYXRoRm9ySGlzdG9yeSA9IHBhdGhcbiAgICAgIHRyaWdnZXJFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14Omhpc3RvcnlSZXN0b3JlJywgeyBwYXRoLCBpdGVtOiBjYWNoZWQgfSlcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGh0bXguY29uZmlnLnJlZnJlc2hPbkhpc3RvcnlNaXNzKSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmU6IG9wdGlvbmFsIHBhcmFtZXRlciBpbiByZWxvYWQoKSBmdW5jdGlvbiB0aHJvd3MgZXJyb3JcbiAgICAgICAgLy8gbm9pbnNwZWN0aW9uIEpTVW5yZXNvbHZlZFJlZmVyZW5jZVxuICAgICAgICB3aW5kb3cubG9jYXRpb24ucmVsb2FkKHRydWUpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsb2FkSGlzdG9yeUZyb21TZXJ2ZXIocGF0aClcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHJldHVybnMge0VsZW1lbnRbXX1cbiAgICovXG4gIGZ1bmN0aW9uIGFkZFJlcXVlc3RJbmRpY2F0b3JDbGFzc2VzKGVsdCkge1xuICAgIGxldCBpbmRpY2F0b3JzID0gLyoqIEB0eXBlIEVsZW1lbnRbXSAqLyAoZmluZEF0dHJpYnV0ZVRhcmdldHMoZWx0LCAnaHgtaW5kaWNhdG9yJykpXG4gICAgaWYgKGluZGljYXRvcnMgPT0gbnVsbCkge1xuICAgICAgaW5kaWNhdG9ycyA9IFtlbHRdXG4gICAgfVxuICAgIGZvckVhY2goaW5kaWNhdG9ycywgZnVuY3Rpb24oaWMpIHtcbiAgICAgIGNvbnN0IGludGVybmFsRGF0YSA9IGdldEludGVybmFsRGF0YShpYylcbiAgICAgIGludGVybmFsRGF0YS5yZXF1ZXN0Q291bnQgPSAoaW50ZXJuYWxEYXRhLnJlcXVlc3RDb3VudCB8fCAwKSArIDFcbiAgICAgIGljLmNsYXNzTGlzdC5hZGQuY2FsbChpYy5jbGFzc0xpc3QsIGh0bXguY29uZmlnLnJlcXVlc3RDbGFzcylcbiAgICB9KVxuICAgIHJldHVybiBpbmRpY2F0b3JzXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHJldHVybnMge0VsZW1lbnRbXX1cbiAgICovXG4gIGZ1bmN0aW9uIGRpc2FibGVFbGVtZW50cyhlbHQpIHtcbiAgICBsZXQgZGlzYWJsZWRFbHRzID0gLyoqIEB0eXBlIEVsZW1lbnRbXSAqLyAoZmluZEF0dHJpYnV0ZVRhcmdldHMoZWx0LCAnaHgtZGlzYWJsZWQtZWx0JykpXG4gICAgaWYgKGRpc2FibGVkRWx0cyA9PSBudWxsKSB7XG4gICAgICBkaXNhYmxlZEVsdHMgPSBbXVxuICAgIH1cbiAgICBmb3JFYWNoKGRpc2FibGVkRWx0cywgZnVuY3Rpb24oZGlzYWJsZWRFbGVtZW50KSB7XG4gICAgICBjb25zdCBpbnRlcm5hbERhdGEgPSBnZXRJbnRlcm5hbERhdGEoZGlzYWJsZWRFbGVtZW50KVxuICAgICAgaW50ZXJuYWxEYXRhLnJlcXVlc3RDb3VudCA9IChpbnRlcm5hbERhdGEucmVxdWVzdENvdW50IHx8IDApICsgMVxuICAgICAgZGlzYWJsZWRFbGVtZW50LnNldEF0dHJpYnV0ZSgnZGlzYWJsZWQnLCAnJylcbiAgICAgIGRpc2FibGVkRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2RhdGEtZGlzYWJsZWQtYnktaHRteCcsICcnKVxuICAgIH0pXG4gICAgcmV0dXJuIGRpc2FibGVkRWx0c1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudFtdfSBpbmRpY2F0b3JzXG4gICAqIEBwYXJhbSB7RWxlbWVudFtdfSBkaXNhYmxlZFxuICAgKi9cbiAgZnVuY3Rpb24gcmVtb3ZlUmVxdWVzdEluZGljYXRvcnMoaW5kaWNhdG9ycywgZGlzYWJsZWQpIHtcbiAgICBmb3JFYWNoKGluZGljYXRvcnMsIGZ1bmN0aW9uKGljKSB7XG4gICAgICBjb25zdCBpbnRlcm5hbERhdGEgPSBnZXRJbnRlcm5hbERhdGEoaWMpXG4gICAgICBpbnRlcm5hbERhdGEucmVxdWVzdENvdW50ID0gKGludGVybmFsRGF0YS5yZXF1ZXN0Q291bnQgfHwgMCkgLSAxXG4gICAgICBpZiAoaW50ZXJuYWxEYXRhLnJlcXVlc3RDb3VudCA9PT0gMCkge1xuICAgICAgICBpYy5jbGFzc0xpc3QucmVtb3ZlLmNhbGwoaWMuY2xhc3NMaXN0LCBodG14LmNvbmZpZy5yZXF1ZXN0Q2xhc3MpXG4gICAgICB9XG4gICAgfSlcbiAgICBmb3JFYWNoKGRpc2FibGVkLCBmdW5jdGlvbihkaXNhYmxlZEVsZW1lbnQpIHtcbiAgICAgIGNvbnN0IGludGVybmFsRGF0YSA9IGdldEludGVybmFsRGF0YShkaXNhYmxlZEVsZW1lbnQpXG4gICAgICBpbnRlcm5hbERhdGEucmVxdWVzdENvdW50ID0gKGludGVybmFsRGF0YS5yZXF1ZXN0Q291bnQgfHwgMCkgLSAxXG4gICAgICBpZiAoaW50ZXJuYWxEYXRhLnJlcXVlc3RDb3VudCA9PT0gMCkge1xuICAgICAgICBkaXNhYmxlZEVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCdkaXNhYmxlZCcpXG4gICAgICAgIGRpc2FibGVkRWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ2RhdGEtZGlzYWJsZWQtYnktaHRteCcpXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIElucHV0IFZhbHVlIFByb2Nlc3NpbmdcbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50W119IHByb2Nlc3NlZFxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGhhdmVTZWVuTm9kZShwcm9jZXNzZWQsIGVsdCkge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcHJvY2Vzc2VkLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBub2RlID0gcHJvY2Vzc2VkW2ldXG4gICAgICBpZiAobm9kZS5pc1NhbWVOb2RlKGVsdCkpIHtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50XG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBzaG91bGRJbmNsdWRlKGVsZW1lbnQpIHtcbiAgICAvLyBDYXN0IHRvIHRyaWNrIHRzYywgdW5kZWZpbmVkIHZhbHVlcyB3aWxsIHdvcmsgZmluZSBoZXJlXG4gICAgY29uc3QgZWx0ID0gLyoqIEB0eXBlIHtIVE1MSW5wdXRFbGVtZW50fSAqLyAoZWxlbWVudClcbiAgICBpZiAoZWx0Lm5hbWUgPT09ICcnIHx8IGVsdC5uYW1lID09IG51bGwgfHwgZWx0LmRpc2FibGVkIHx8IGNsb3Nlc3QoZWx0LCAnZmllbGRzZXRbZGlzYWJsZWRdJykpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgICAvLyBpZ25vcmUgXCJzdWJtaXR0ZXJcIiB0eXBlcyAoc2VlIGpRdWVyeSBzcmMvc2VyaWFsaXplLmpzKVxuICAgIGlmIChlbHQudHlwZSA9PT0gJ2J1dHRvbicgfHwgZWx0LnR5cGUgPT09ICdzdWJtaXQnIHx8IGVsdC50YWdOYW1lID09PSAnaW1hZ2UnIHx8IGVsdC50YWdOYW1lID09PSAncmVzZXQnIHx8IGVsdC50YWdOYW1lID09PSAnZmlsZScpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgICBpZiAoZWx0LnR5cGUgPT09ICdjaGVja2JveCcgfHwgZWx0LnR5cGUgPT09ICdyYWRpbycpIHtcbiAgICAgIHJldHVybiBlbHQuY2hlY2tlZFxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgLyoqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAqIEBwYXJhbSB7c3RyaW5nfEFycmF5fEZvcm1EYXRhRW50cnlWYWx1ZX0gdmFsdWVcbiAgICogQHBhcmFtIHtGb3JtRGF0YX0gZm9ybURhdGEgKi9cbiAgZnVuY3Rpb24gYWRkVmFsdWVUb0Zvcm1EYXRhKG5hbWUsIHZhbHVlLCBmb3JtRGF0YSkge1xuICAgIGlmIChuYW1lICE9IG51bGwgJiYgdmFsdWUgIT0gbnVsbCkge1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIHZhbHVlLmZvckVhY2goZnVuY3Rpb24odikgeyBmb3JtRGF0YS5hcHBlbmQobmFtZSwgdikgfSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZvcm1EYXRhLmFwcGVuZChuYW1lLCB2YWx1ZSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKiogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICogQHBhcmFtIHtzdHJpbmd8QXJyYXl9IHZhbHVlXG4gICAqIEBwYXJhbSB7Rm9ybURhdGF9IGZvcm1EYXRhICovXG4gIGZ1bmN0aW9uIHJlbW92ZVZhbHVlRnJvbUZvcm1EYXRhKG5hbWUsIHZhbHVlLCBmb3JtRGF0YSkge1xuICAgIGlmIChuYW1lICE9IG51bGwgJiYgdmFsdWUgIT0gbnVsbCkge1xuICAgICAgbGV0IHZhbHVlcyA9IGZvcm1EYXRhLmdldEFsbChuYW1lKVxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIHZhbHVlcyA9IHZhbHVlcy5maWx0ZXIodiA9PiB2YWx1ZS5pbmRleE9mKHYpIDwgMClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhbHVlcyA9IHZhbHVlcy5maWx0ZXIodiA9PiB2ICE9PSB2YWx1ZSlcbiAgICAgIH1cbiAgICAgIGZvcm1EYXRhLmRlbGV0ZShuYW1lKVxuICAgICAgZm9yRWFjaCh2YWx1ZXMsIHYgPT4gZm9ybURhdGEuYXBwZW5kKG5hbWUsIHYpKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnRbXX0gcHJvY2Vzc2VkXG4gICAqIEBwYXJhbSB7Rm9ybURhdGF9IGZvcm1EYXRhXG4gICAqIEBwYXJhbSB7SHRteEVsZW1lbnRWYWxpZGF0aW9uRXJyb3JbXX0gZXJyb3JzXG4gICAqIEBwYXJhbSB7RWxlbWVudHxIVE1MSW5wdXRFbGVtZW50fEhUTUxTZWxlY3RFbGVtZW50fEhUTUxGb3JtRWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gdmFsaWRhdGVcbiAgICovXG4gIGZ1bmN0aW9uIHByb2Nlc3NJbnB1dFZhbHVlKHByb2Nlc3NlZCwgZm9ybURhdGEsIGVycm9ycywgZWx0LCB2YWxpZGF0ZSkge1xuICAgIGlmIChlbHQgPT0gbnVsbCB8fCBoYXZlU2Vlbk5vZGUocHJvY2Vzc2VkLCBlbHQpKSB7XG4gICAgICByZXR1cm5cbiAgICB9IGVsc2Uge1xuICAgICAgcHJvY2Vzc2VkLnB1c2goZWx0KVxuICAgIH1cbiAgICBpZiAoc2hvdWxkSW5jbHVkZShlbHQpKSB7XG4gICAgICBjb25zdCBuYW1lID0gZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ25hbWUnKVxuICAgICAgLy8gQHRzLWlnbm9yZSB2YWx1ZSB3aWxsIGJlIHVuZGVmaW5lZCBmb3Igbm9uLWlucHV0IGVsZW1lbnRzLCB3aGljaCBpcyBmaW5lXG4gICAgICBsZXQgdmFsdWUgPSBlbHQudmFsdWVcbiAgICAgIGlmIChlbHQgaW5zdGFuY2VvZiBIVE1MU2VsZWN0RWxlbWVudCAmJiBlbHQubXVsdGlwbGUpIHtcbiAgICAgICAgdmFsdWUgPSB0b0FycmF5KGVsdC5xdWVyeVNlbGVjdG9yQWxsKCdvcHRpb246Y2hlY2tlZCcpKS5tYXAoZnVuY3Rpb24oZSkgeyByZXR1cm4gKC8qKiBAdHlwZSBIVE1MT3B0aW9uRWxlbWVudCAqLyhlKSkudmFsdWUgfSlcbiAgICAgIH1cbiAgICAgIC8vIGluY2x1ZGUgZmlsZSBpbnB1dHNcbiAgICAgIGlmIChlbHQgaW5zdGFuY2VvZiBIVE1MSW5wdXRFbGVtZW50ICYmIGVsdC5maWxlcykge1xuICAgICAgICB2YWx1ZSA9IHRvQXJyYXkoZWx0LmZpbGVzKVxuICAgICAgfVxuICAgICAgYWRkVmFsdWVUb0Zvcm1EYXRhKG5hbWUsIHZhbHVlLCBmb3JtRGF0YSlcbiAgICAgIGlmICh2YWxpZGF0ZSkge1xuICAgICAgICB2YWxpZGF0ZUVsZW1lbnQoZWx0LCBlcnJvcnMpXG4gICAgICB9XG4gICAgfVxuICAgIGlmIChlbHQgaW5zdGFuY2VvZiBIVE1MRm9ybUVsZW1lbnQpIHtcbiAgICAgIGZvckVhY2goZWx0LmVsZW1lbnRzLCBmdW5jdGlvbihpbnB1dCkge1xuICAgICAgICBpZiAocHJvY2Vzc2VkLmluZGV4T2YoaW5wdXQpID49IDApIHtcbiAgICAgICAgICAvLyBUaGUgaW5wdXQgaGFzIGFscmVhZHkgYmVlbiBwcm9jZXNzZWQgYW5kIGFkZGVkIHRvIHRoZSB2YWx1ZXMsIGJ1dCB0aGUgRm9ybURhdGEgdGhhdCB3aWxsIGJlXG4gICAgICAgICAgLy8gIGNvbnN0cnVjdGVkIHJpZ2h0IGFmdGVyIG9uIHRoZSBmb3JtLCB3aWxsIGluY2x1ZGUgaXQgb25jZSBhZ2Fpbi4gU28gcmVtb3ZlIHRoYXQgaW5wdXQncyB2YWx1ZVxuICAgICAgICAgIC8vICBub3cgdG8gYXZvaWQgZHVwbGljYXRlc1xuICAgICAgICAgIHJlbW92ZVZhbHVlRnJvbUZvcm1EYXRhKGlucHV0Lm5hbWUsIGlucHV0LnZhbHVlLCBmb3JtRGF0YSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwcm9jZXNzZWQucHVzaChpbnB1dClcbiAgICAgICAgfVxuICAgICAgICBpZiAodmFsaWRhdGUpIHtcbiAgICAgICAgICB2YWxpZGF0ZUVsZW1lbnQoaW5wdXQsIGVycm9ycylcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICAgIG5ldyBGb3JtRGF0YShlbHQpLmZvckVhY2goZnVuY3Rpb24odmFsdWUsIG5hbWUpIHtcbiAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRmlsZSAmJiB2YWx1ZS5uYW1lID09PSAnJykge1xuICAgICAgICAgIHJldHVybiAvLyBpZ25vcmUgbm8tbmFtZSBmaWxlc1xuICAgICAgICB9XG4gICAgICAgIGFkZFZhbHVlVG9Gb3JtRGF0YShuYW1lLCB2YWx1ZSwgZm9ybURhdGEpXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge0h0bXhFbGVtZW50VmFsaWRhdGlvbkVycm9yW119IGVycm9yc1xuICAgKi9cbiAgZnVuY3Rpb24gdmFsaWRhdGVFbGVtZW50KGVsdCwgZXJyb3JzKSB7XG4gICAgY29uc3QgZWxlbWVudCA9IC8qKiBAdHlwZSB7SFRNTEVsZW1lbnQgJiBFbGVtZW50SW50ZXJuYWxzfSAqLyAoZWx0KVxuICAgIGlmIChlbGVtZW50LndpbGxWYWxpZGF0ZSkge1xuICAgICAgdHJpZ2dlckV2ZW50KGVsZW1lbnQsICdodG14OnZhbGlkYXRpb246dmFsaWRhdGUnKVxuICAgICAgaWYgKCFlbGVtZW50LmNoZWNrVmFsaWRpdHkoKSkge1xuICAgICAgICBlcnJvcnMucHVzaCh7IGVsdDogZWxlbWVudCwgbWVzc2FnZTogZWxlbWVudC52YWxpZGF0aW9uTWVzc2FnZSwgdmFsaWRpdHk6IGVsZW1lbnQudmFsaWRpdHkgfSlcbiAgICAgICAgdHJpZ2dlckV2ZW50KGVsZW1lbnQsICdodG14OnZhbGlkYXRpb246ZmFpbGVkJywgeyBtZXNzYWdlOiBlbGVtZW50LnZhbGlkYXRpb25NZXNzYWdlLCB2YWxpZGl0eTogZWxlbWVudC52YWxpZGl0eSB9KVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBPdmVycmlkZSB2YWx1ZXMgaW4gdGhlIG9uZSBGb3JtRGF0YSB3aXRoIHRob3NlIGZyb20gYW5vdGhlci5cbiAgICogQHBhcmFtIHtGb3JtRGF0YX0gcmVjZWl2ZXIgdGhlIGZvcm1kYXRhIHRoYXQgd2lsbCBiZSBtdXRhdGVkXG4gICAqIEBwYXJhbSB7Rm9ybURhdGF9IGRvbm9yIHRoZSBmb3JtZGF0YSB0aGF0IHdpbGwgcHJvdmlkZSB0aGUgb3ZlcnJpZGluZyB2YWx1ZXNcbiAgICogQHJldHVybnMge0Zvcm1EYXRhfSB0aGUge0BsaW5rY29kZSByZWNlaXZlcn1cbiAgICovXG4gIGZ1bmN0aW9uIG92ZXJyaWRlRm9ybURhdGEocmVjZWl2ZXIsIGRvbm9yKSB7XG4gICAgZm9yIChjb25zdCBrZXkgb2YgZG9ub3Iua2V5cygpKSB7XG4gICAgICByZWNlaXZlci5kZWxldGUoa2V5KVxuICAgIH1cbiAgICBkb25vci5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHtcbiAgICAgIHJlY2VpdmVyLmFwcGVuZChrZXksIHZhbHVlKVxuICAgIH0pXG4gICAgcmV0dXJuIHJlY2VpdmVyXG4gIH1cblxuICAvKipcbiAqIEBwYXJhbSB7RWxlbWVudHxIVE1MRm9ybUVsZW1lbnR9IGVsdFxuICogQHBhcmFtIHtIdHRwVmVyYn0gdmVyYlxuICogQHJldHVybnMge3tlcnJvcnM6IEh0bXhFbGVtZW50VmFsaWRhdGlvbkVycm9yW10sIGZvcm1EYXRhOiBGb3JtRGF0YSwgdmFsdWVzOiBPYmplY3R9fVxuICovXG4gIGZ1bmN0aW9uIGdldElucHV0VmFsdWVzKGVsdCwgdmVyYikge1xuICAgIC8qKiBAdHlwZSBFbGVtZW50W10gKi9cbiAgICBjb25zdCBwcm9jZXNzZWQgPSBbXVxuICAgIGNvbnN0IGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKClcbiAgICBjb25zdCBwcmlvcml0eUZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKClcbiAgICAvKiogQHR5cGUgSHRteEVsZW1lbnRWYWxpZGF0aW9uRXJyb3JbXSAqL1xuICAgIGNvbnN0IGVycm9ycyA9IFtdXG4gICAgY29uc3QgaW50ZXJuYWxEYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGVsdClcbiAgICBpZiAoaW50ZXJuYWxEYXRhLmxhc3RCdXR0b25DbGlja2VkICYmICFib2R5Q29udGFpbnMoaW50ZXJuYWxEYXRhLmxhc3RCdXR0b25DbGlja2VkKSkge1xuICAgICAgaW50ZXJuYWxEYXRhLmxhc3RCdXR0b25DbGlja2VkID0gbnVsbFxuICAgIH1cblxuICAgIC8vIG9ubHkgdmFsaWRhdGUgd2hlbiBmb3JtIGlzIGRpcmVjdGx5IHN1Ym1pdHRlZCBhbmQgbm92YWxpZGF0ZSBvciBmb3Jtbm92YWxpZGF0ZSBhcmUgbm90IHNldFxuICAgIC8vIG9yIGlmIHRoZSBlbGVtZW50IGhhcyBhbiBleHBsaWNpdCBoeC12YWxpZGF0ZT1cInRydWVcIiBvbiBpdFxuICAgIGxldCB2YWxpZGF0ZSA9IChlbHQgaW5zdGFuY2VvZiBIVE1MRm9ybUVsZW1lbnQgJiYgZWx0Lm5vVmFsaWRhdGUgIT09IHRydWUpIHx8IGdldEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LXZhbGlkYXRlJykgPT09ICd0cnVlJ1xuICAgIGlmIChpbnRlcm5hbERhdGEubGFzdEJ1dHRvbkNsaWNrZWQpIHtcbiAgICAgIHZhbGlkYXRlID0gdmFsaWRhdGUgJiYgaW50ZXJuYWxEYXRhLmxhc3RCdXR0b25DbGlja2VkLmZvcm1Ob1ZhbGlkYXRlICE9PSB0cnVlXG4gICAgfVxuXG4gICAgLy8gZm9yIGEgbm9uLUdFVCBpbmNsdWRlIHRoZSBjbG9zZXN0IGZvcm1cbiAgICBpZiAodmVyYiAhPT0gJ2dldCcpIHtcbiAgICAgIHByb2Nlc3NJbnB1dFZhbHVlKHByb2Nlc3NlZCwgcHJpb3JpdHlGb3JtRGF0YSwgZXJyb3JzLCBjbG9zZXN0KGVsdCwgJ2Zvcm0nKSwgdmFsaWRhdGUpXG4gICAgfVxuXG4gICAgLy8gaW5jbHVkZSB0aGUgZWxlbWVudCBpdHNlbGZcbiAgICBwcm9jZXNzSW5wdXRWYWx1ZShwcm9jZXNzZWQsIGZvcm1EYXRhLCBlcnJvcnMsIGVsdCwgdmFsaWRhdGUpXG5cbiAgICAvLyBpZiBhIGJ1dHRvbiBvciBzdWJtaXQgd2FzIGNsaWNrZWQgbGFzdCwgaW5jbHVkZSBpdHMgdmFsdWVcbiAgICBpZiAoaW50ZXJuYWxEYXRhLmxhc3RCdXR0b25DbGlja2VkIHx8IGVsdC50YWdOYW1lID09PSAnQlVUVE9OJyB8fFxuICAgIChlbHQudGFnTmFtZSA9PT0gJ0lOUFVUJyAmJiBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAndHlwZScpID09PSAnc3VibWl0JykpIHtcbiAgICAgIGNvbnN0IGJ1dHRvbiA9IGludGVybmFsRGF0YS5sYXN0QnV0dG9uQ2xpY2tlZCB8fCAoLyoqIEB0eXBlIEhUTUxJbnB1dEVsZW1lbnR8SFRNTEJ1dHRvbkVsZW1lbnQgKi8oZWx0KSlcbiAgICAgIGNvbnN0IG5hbWUgPSBnZXRSYXdBdHRyaWJ1dGUoYnV0dG9uLCAnbmFtZScpXG4gICAgICBhZGRWYWx1ZVRvRm9ybURhdGEobmFtZSwgYnV0dG9uLnZhbHVlLCBwcmlvcml0eUZvcm1EYXRhKVxuICAgIH1cblxuICAgIC8vIGluY2x1ZGUgYW55IGV4cGxpY2l0IGluY2x1ZGVzXG4gICAgY29uc3QgaW5jbHVkZXMgPSBmaW5kQXR0cmlidXRlVGFyZ2V0cyhlbHQsICdoeC1pbmNsdWRlJylcbiAgICBmb3JFYWNoKGluY2x1ZGVzLCBmdW5jdGlvbihub2RlKSB7XG4gICAgICBwcm9jZXNzSW5wdXRWYWx1ZShwcm9jZXNzZWQsIGZvcm1EYXRhLCBlcnJvcnMsIGFzRWxlbWVudChub2RlKSwgdmFsaWRhdGUpXG4gICAgICAvLyBpZiBhIG5vbi1mb3JtIGlzIGluY2x1ZGVkLCBpbmNsdWRlIGFueSBpbnB1dCB2YWx1ZXMgd2l0aGluIGl0XG4gICAgICBpZiAoIW1hdGNoZXMobm9kZSwgJ2Zvcm0nKSkge1xuICAgICAgICBmb3JFYWNoKGFzUGFyZW50Tm9kZShub2RlKS5xdWVyeVNlbGVjdG9yQWxsKElOUFVUX1NFTEVDVE9SKSwgZnVuY3Rpb24oZGVzY2VuZGFudCkge1xuICAgICAgICAgIHByb2Nlc3NJbnB1dFZhbHVlKHByb2Nlc3NlZCwgZm9ybURhdGEsIGVycm9ycywgZGVzY2VuZGFudCwgdmFsaWRhdGUpXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfSlcblxuICAgIC8vIHZhbHVlcyBmcm9tIGEgPGZvcm0+IHRha2UgcHJlY2VkZW5jZSwgb3ZlcnJpZGluZyB0aGUgcmVndWxhciB2YWx1ZXNcbiAgICBvdmVycmlkZUZvcm1EYXRhKGZvcm1EYXRhLCBwcmlvcml0eUZvcm1EYXRhKVxuXG4gICAgcmV0dXJuIHsgZXJyb3JzLCBmb3JtRGF0YSwgdmFsdWVzOiBmb3JtRGF0YVByb3h5KGZvcm1EYXRhKSB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHJldHVyblN0clxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgKiBAcGFyYW0ge2FueX0gcmVhbFZhbHVlXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBmdW5jdGlvbiBhcHBlbmRQYXJhbShyZXR1cm5TdHIsIG5hbWUsIHJlYWxWYWx1ZSkge1xuICAgIGlmIChyZXR1cm5TdHIgIT09ICcnKSB7XG4gICAgICByZXR1cm5TdHIgKz0gJyYnXG4gICAgfVxuICAgIGlmIChTdHJpbmcocmVhbFZhbHVlKSA9PT0gJ1tvYmplY3QgT2JqZWN0XScpIHtcbiAgICAgIHJlYWxWYWx1ZSA9IEpTT04uc3RyaW5naWZ5KHJlYWxWYWx1ZSlcbiAgICB9XG4gICAgY29uc3QgcyA9IGVuY29kZVVSSUNvbXBvbmVudChyZWFsVmFsdWUpXG4gICAgcmV0dXJuU3RyICs9IGVuY29kZVVSSUNvbXBvbmVudChuYW1lKSArICc9JyArIHNcbiAgICByZXR1cm4gcmV0dXJuU3RyXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtGb3JtRGF0YXxPYmplY3R9IHZhbHVlc1xuICAgKiBAcmV0dXJucyBzdHJpbmdcbiAgICovXG4gIGZ1bmN0aW9uIHVybEVuY29kZSh2YWx1ZXMpIHtcbiAgICB2YWx1ZXMgPSBmb3JtRGF0YUZyb21PYmplY3QodmFsdWVzKVxuICAgIGxldCByZXR1cm5TdHIgPSAnJ1xuICAgIHZhbHVlcy5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHtcbiAgICAgIHJldHVyblN0ciA9IGFwcGVuZFBhcmFtKHJldHVyblN0ciwga2V5LCB2YWx1ZSlcbiAgICB9KVxuICAgIHJldHVybiByZXR1cm5TdHJcbiAgfVxuXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEFqYXhcbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gKiBAcGFyYW0ge0VsZW1lbnR9IHRhcmdldFxuICogQHBhcmFtIHtzdHJpbmd9IHByb21wdFxuICogQHJldHVybnMge0h0bXhIZWFkZXJTcGVjaWZpY2F0aW9ufVxuICovXG4gIGZ1bmN0aW9uIGdldEhlYWRlcnMoZWx0LCB0YXJnZXQsIHByb21wdCkge1xuICAgIC8qKiBAdHlwZSBIdG14SGVhZGVyU3BlY2lmaWNhdGlvbiAqL1xuICAgIGNvbnN0IGhlYWRlcnMgPSB7XG4gICAgICAnSFgtUmVxdWVzdCc6ICd0cnVlJyxcbiAgICAgICdIWC1UcmlnZ2VyJzogZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ2lkJyksXG4gICAgICAnSFgtVHJpZ2dlci1OYW1lJzogZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ25hbWUnKSxcbiAgICAgICdIWC1UYXJnZXQnOiBnZXRBdHRyaWJ1dGVWYWx1ZSh0YXJnZXQsICdpZCcpLFxuICAgICAgJ0hYLUN1cnJlbnQtVVJMJzogZ2V0RG9jdW1lbnQoKS5sb2NhdGlvbi5ocmVmXG4gICAgfVxuICAgIGdldFZhbHVlc0ZvckVsZW1lbnQoZWx0LCAnaHgtaGVhZGVycycsIGZhbHNlLCBoZWFkZXJzKVxuICAgIGlmIChwcm9tcHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGVhZGVyc1snSFgtUHJvbXB0J10gPSBwcm9tcHRcbiAgICB9XG4gICAgaWYgKGdldEludGVybmFsRGF0YShlbHQpLmJvb3N0ZWQpIHtcbiAgICAgIGhlYWRlcnNbJ0hYLUJvb3N0ZWQnXSA9ICd0cnVlJ1xuICAgIH1cbiAgICByZXR1cm4gaGVhZGVyc1xuICB9XG5cbiAgLyoqXG4gKiBmaWx0ZXJWYWx1ZXMgdGFrZXMgYW4gb2JqZWN0IGNvbnRhaW5pbmcgZm9ybSBpbnB1dCB2YWx1ZXNcbiAqIGFuZCByZXR1cm5zIGEgbmV3IG9iamVjdCB0aGF0IG9ubHkgY29udGFpbnMga2V5cyB0aGF0IGFyZVxuICogc3BlY2lmaWVkIGJ5IHRoZSBjbG9zZXN0IFwiaHgtcGFyYW1zXCIgYXR0cmlidXRlXG4gKiBAcGFyYW0ge0Zvcm1EYXRhfSBpbnB1dFZhbHVlc1xuICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAqIEByZXR1cm5zIHtGb3JtRGF0YX1cbiAqL1xuICBmdW5jdGlvbiBmaWx0ZXJWYWx1ZXMoaW5wdXRWYWx1ZXMsIGVsdCkge1xuICAgIGNvbnN0IHBhcmFtc1ZhbHVlID0gZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LXBhcmFtcycpXG4gICAgaWYgKHBhcmFtc1ZhbHVlKSB7XG4gICAgICBpZiAocGFyYW1zVmFsdWUgPT09ICdub25lJykge1xuICAgICAgICByZXR1cm4gbmV3IEZvcm1EYXRhKClcbiAgICAgIH0gZWxzZSBpZiAocGFyYW1zVmFsdWUgPT09ICcqJykge1xuICAgICAgICByZXR1cm4gaW5wdXRWYWx1ZXNcbiAgICAgIH0gZWxzZSBpZiAocGFyYW1zVmFsdWUuaW5kZXhPZignbm90ICcpID09PSAwKSB7XG4gICAgICAgIGZvckVhY2gocGFyYW1zVmFsdWUuc3Vic3RyKDQpLnNwbGl0KCcsJyksIGZ1bmN0aW9uKG5hbWUpIHtcbiAgICAgICAgICBuYW1lID0gbmFtZS50cmltKClcbiAgICAgICAgICBpbnB1dFZhbHVlcy5kZWxldGUobmFtZSlcbiAgICAgICAgfSlcbiAgICAgICAgcmV0dXJuIGlucHV0VmFsdWVzXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBuZXdWYWx1ZXMgPSBuZXcgRm9ybURhdGEoKVxuICAgICAgICBmb3JFYWNoKHBhcmFtc1ZhbHVlLnNwbGl0KCcsJyksIGZ1bmN0aW9uKG5hbWUpIHtcbiAgICAgICAgICBuYW1lID0gbmFtZS50cmltKClcbiAgICAgICAgICBpZiAoaW5wdXRWYWx1ZXMuaGFzKG5hbWUpKSB7XG4gICAgICAgICAgICBpbnB1dFZhbHVlcy5nZXRBbGwobmFtZSkuZm9yRWFjaChmdW5jdGlvbih2YWx1ZSkgeyBuZXdWYWx1ZXMuYXBwZW5kKG5hbWUsIHZhbHVlKSB9KVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICAgcmV0dXJuIG5ld1ZhbHVlc1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gaW5wdXRWYWx1ZXNcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGlzQW5jaG9yTGluayhlbHQpIHtcbiAgICByZXR1cm4gISFnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnaHJlZicpICYmIGdldFJhd0F0dHJpYnV0ZShlbHQsICdocmVmJykuaW5kZXhPZignIycpID49IDBcbiAgfVxuXG4gIC8qKlxuICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAqIEBwYXJhbSB7SHRteFN3YXBTdHlsZX0gW3N3YXBJbmZvT3ZlcnJpZGVdXG4gKiBAcmV0dXJucyB7SHRteFN3YXBTcGVjaWZpY2F0aW9ufVxuICovXG4gIGZ1bmN0aW9uIGdldFN3YXBTcGVjaWZpY2F0aW9uKGVsdCwgc3dhcEluZm9PdmVycmlkZSkge1xuICAgIGNvbnN0IHN3YXBJbmZvID0gc3dhcEluZm9PdmVycmlkZSB8fCBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtc3dhcCcpXG4gICAgLyoqIEB0eXBlIEh0bXhTd2FwU3BlY2lmaWNhdGlvbiAqL1xuICAgIGNvbnN0IHN3YXBTcGVjID0ge1xuICAgICAgc3dhcFN0eWxlOiBnZXRJbnRlcm5hbERhdGEoZWx0KS5ib29zdGVkID8gJ2lubmVySFRNTCcgOiBodG14LmNvbmZpZy5kZWZhdWx0U3dhcFN0eWxlLFxuICAgICAgc3dhcERlbGF5OiBodG14LmNvbmZpZy5kZWZhdWx0U3dhcERlbGF5LFxuICAgICAgc2V0dGxlRGVsYXk6IGh0bXguY29uZmlnLmRlZmF1bHRTZXR0bGVEZWxheVxuICAgIH1cbiAgICBpZiAoaHRteC5jb25maWcuc2Nyb2xsSW50b1ZpZXdPbkJvb3N0ICYmIGdldEludGVybmFsRGF0YShlbHQpLmJvb3N0ZWQgJiYgIWlzQW5jaG9yTGluayhlbHQpKSB7XG4gICAgICBzd2FwU3BlYy5zaG93ID0gJ3RvcCdcbiAgICB9XG4gICAgaWYgKHN3YXBJbmZvKSB7XG4gICAgICBjb25zdCBzcGxpdCA9IHNwbGl0T25XaGl0ZXNwYWNlKHN3YXBJbmZvKVxuICAgICAgaWYgKHNwbGl0Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzcGxpdC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNvbnN0IHZhbHVlID0gc3BsaXRbaV1cbiAgICAgICAgICBpZiAodmFsdWUuaW5kZXhPZignc3dhcDonKSA9PT0gMCkge1xuICAgICAgICAgICAgc3dhcFNwZWMuc3dhcERlbGF5ID0gcGFyc2VJbnRlcnZhbCh2YWx1ZS5zdWJzdHIoNSkpXG4gICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5pbmRleE9mKCdzZXR0bGU6JykgPT09IDApIHtcbiAgICAgICAgICAgIHN3YXBTcGVjLnNldHRsZURlbGF5ID0gcGFyc2VJbnRlcnZhbCh2YWx1ZS5zdWJzdHIoNykpXG4gICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5pbmRleE9mKCd0cmFuc2l0aW9uOicpID09PSAwKSB7XG4gICAgICAgICAgICBzd2FwU3BlYy50cmFuc2l0aW9uID0gdmFsdWUuc3Vic3RyKDExKSA9PT0gJ3RydWUnXG4gICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5pbmRleE9mKCdpZ25vcmVUaXRsZTonKSA9PT0gMCkge1xuICAgICAgICAgICAgc3dhcFNwZWMuaWdub3JlVGl0bGUgPSB2YWx1ZS5zdWJzdHIoMTIpID09PSAndHJ1ZSdcbiAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLmluZGV4T2YoJ3Njcm9sbDonKSA9PT0gMCkge1xuICAgICAgICAgICAgY29uc3Qgc2Nyb2xsU3BlYyA9IHZhbHVlLnN1YnN0cig3KVxuICAgICAgICAgICAgdmFyIHNwbGl0U3BlYyA9IHNjcm9sbFNwZWMuc3BsaXQoJzonKVxuICAgICAgICAgICAgY29uc3Qgc2Nyb2xsVmFsID0gc3BsaXRTcGVjLnBvcCgpXG4gICAgICAgICAgICB2YXIgc2VsZWN0b3JWYWwgPSBzcGxpdFNwZWMubGVuZ3RoID4gMCA/IHNwbGl0U3BlYy5qb2luKCc6JykgOiBudWxsXG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBzd2FwU3BlYy5zY3JvbGwgPSBzY3JvbGxWYWxcbiAgICAgICAgICAgIHN3YXBTcGVjLnNjcm9sbFRhcmdldCA9IHNlbGVjdG9yVmFsXG4gICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5pbmRleE9mKCdzaG93OicpID09PSAwKSB7XG4gICAgICAgICAgICBjb25zdCBzaG93U3BlYyA9IHZhbHVlLnN1YnN0cig1KVxuICAgICAgICAgICAgdmFyIHNwbGl0U3BlYyA9IHNob3dTcGVjLnNwbGl0KCc6JylcbiAgICAgICAgICAgIGNvbnN0IHNob3dWYWwgPSBzcGxpdFNwZWMucG9wKClcbiAgICAgICAgICAgIHZhciBzZWxlY3RvclZhbCA9IHNwbGl0U3BlYy5sZW5ndGggPiAwID8gc3BsaXRTcGVjLmpvaW4oJzonKSA6IG51bGxcbiAgICAgICAgICAgIHN3YXBTcGVjLnNob3cgPSBzaG93VmFsXG4gICAgICAgICAgICBzd2FwU3BlYy5zaG93VGFyZ2V0ID0gc2VsZWN0b3JWYWxcbiAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLmluZGV4T2YoJ2ZvY3VzLXNjcm9sbDonKSA9PT0gMCkge1xuICAgICAgICAgICAgY29uc3QgZm9jdXNTY3JvbGxWYWwgPSB2YWx1ZS5zdWJzdHIoJ2ZvY3VzLXNjcm9sbDonLmxlbmd0aClcbiAgICAgICAgICAgIHN3YXBTcGVjLmZvY3VzU2Nyb2xsID0gZm9jdXNTY3JvbGxWYWwgPT0gJ3RydWUnXG4gICAgICAgICAgfSBlbHNlIGlmIChpID09IDApIHtcbiAgICAgICAgICAgIHN3YXBTcGVjLnN3YXBTdHlsZSA9IHZhbHVlXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxvZ0Vycm9yKCdVbmtub3duIG1vZGlmaWVyIGluIGh4LXN3YXA6ICcgKyB2YWx1ZSlcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHN3YXBTcGVjXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIHVzZXNGb3JtRGF0YShlbHQpIHtcbiAgICByZXR1cm4gZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LWVuY29kaW5nJykgPT09ICdtdWx0aXBhcnQvZm9ybS1kYXRhJyB8fFxuICAgIChtYXRjaGVzKGVsdCwgJ2Zvcm0nKSAmJiBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnZW5jdHlwZScpID09PSAnbXVsdGlwYXJ0L2Zvcm0tZGF0YScpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtYTUxIdHRwUmVxdWVzdH0geGhyXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7Rm9ybURhdGF9IGZpbHRlcmVkUGFyYW1ldGVyc1xuICAgKiBAcmV0dXJucyB7KnxzdHJpbmd8bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIGVuY29kZVBhcmFtc0ZvckJvZHkoeGhyLCBlbHQsIGZpbHRlcmVkUGFyYW1ldGVycykge1xuICAgIGxldCBlbmNvZGVkUGFyYW1ldGVycyA9IG51bGxcbiAgICB3aXRoRXh0ZW5zaW9ucyhlbHQsIGZ1bmN0aW9uKGV4dGVuc2lvbikge1xuICAgICAgaWYgKGVuY29kZWRQYXJhbWV0ZXJzID09IG51bGwpIHtcbiAgICAgICAgZW5jb2RlZFBhcmFtZXRlcnMgPSBleHRlbnNpb24uZW5jb2RlUGFyYW1ldGVycyh4aHIsIGZpbHRlcmVkUGFyYW1ldGVycywgZWx0KVxuICAgICAgfVxuICAgIH0pXG4gICAgaWYgKGVuY29kZWRQYXJhbWV0ZXJzICE9IG51bGwpIHtcbiAgICAgIHJldHVybiBlbmNvZGVkUGFyYW1ldGVyc1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodXNlc0Zvcm1EYXRhKGVsdCkpIHtcbiAgICAgICAgLy8gRm9yY2UgY29udmVyc2lvbiB0byBhbiBhY3R1YWwgRm9ybURhdGEgb2JqZWN0IGluIGNhc2UgZmlsdGVyZWRQYXJhbWV0ZXJzIGlzIGEgZm9ybURhdGFQcm94eVxuICAgICAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2JpZ3NreXNvZnR3YXJlL2h0bXgvaXNzdWVzLzIzMTdcbiAgICAgICAgcmV0dXJuIG92ZXJyaWRlRm9ybURhdGEobmV3IEZvcm1EYXRhKCksIGZvcm1EYXRhRnJvbU9iamVjdChmaWx0ZXJlZFBhcmFtZXRlcnMpKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHVybEVuY29kZShmaWx0ZXJlZFBhcmFtZXRlcnMpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gKlxuICogQHBhcmFtIHtFbGVtZW50fSB0YXJnZXRcbiAqIEByZXR1cm5zIHtIdG14U2V0dGxlSW5mb31cbiAqL1xuICBmdW5jdGlvbiBtYWtlU2V0dGxlSW5mbyh0YXJnZXQpIHtcbiAgICByZXR1cm4geyB0YXNrczogW10sIGVsdHM6IFt0YXJnZXRdIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnRbXX0gY29udGVudFxuICAgKiBAcGFyYW0ge0h0bXhTd2FwU3BlY2lmaWNhdGlvbn0gc3dhcFNwZWNcbiAgICovXG4gIGZ1bmN0aW9uIHVwZGF0ZVNjcm9sbFN0YXRlKGNvbnRlbnQsIHN3YXBTcGVjKSB7XG4gICAgY29uc3QgZmlyc3QgPSBjb250ZW50WzBdXG4gICAgY29uc3QgbGFzdCA9IGNvbnRlbnRbY29udGVudC5sZW5ndGggLSAxXVxuICAgIGlmIChzd2FwU3BlYy5zY3JvbGwpIHtcbiAgICAgIHZhciB0YXJnZXQgPSBudWxsXG4gICAgICBpZiAoc3dhcFNwZWMuc2Nyb2xsVGFyZ2V0KSB7XG4gICAgICAgIHRhcmdldCA9IGFzRWxlbWVudChxdWVyeVNlbGVjdG9yRXh0KGZpcnN0LCBzd2FwU3BlYy5zY3JvbGxUYXJnZXQpKVxuICAgICAgfVxuICAgICAgaWYgKHN3YXBTcGVjLnNjcm9sbCA9PT0gJ3RvcCcgJiYgKGZpcnN0IHx8IHRhcmdldCkpIHtcbiAgICAgICAgdGFyZ2V0ID0gdGFyZ2V0IHx8IGZpcnN0XG4gICAgICAgIHRhcmdldC5zY3JvbGxUb3AgPSAwXG4gICAgICB9XG4gICAgICBpZiAoc3dhcFNwZWMuc2Nyb2xsID09PSAnYm90dG9tJyAmJiAobGFzdCB8fCB0YXJnZXQpKSB7XG4gICAgICAgIHRhcmdldCA9IHRhcmdldCB8fCBsYXN0XG4gICAgICAgIHRhcmdldC5zY3JvbGxUb3AgPSB0YXJnZXQuc2Nyb2xsSGVpZ2h0XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChzd2FwU3BlYy5zaG93KSB7XG4gICAgICB2YXIgdGFyZ2V0ID0gbnVsbFxuICAgICAgaWYgKHN3YXBTcGVjLnNob3dUYXJnZXQpIHtcbiAgICAgICAgbGV0IHRhcmdldFN0ciA9IHN3YXBTcGVjLnNob3dUYXJnZXRcbiAgICAgICAgaWYgKHN3YXBTcGVjLnNob3dUYXJnZXQgPT09ICd3aW5kb3cnKSB7XG4gICAgICAgICAgdGFyZ2V0U3RyID0gJ2JvZHknXG4gICAgICAgIH1cbiAgICAgICAgdGFyZ2V0ID0gYXNFbGVtZW50KHF1ZXJ5U2VsZWN0b3JFeHQoZmlyc3QsIHRhcmdldFN0cikpXG4gICAgICB9XG4gICAgICBpZiAoc3dhcFNwZWMuc2hvdyA9PT0gJ3RvcCcgJiYgKGZpcnN0IHx8IHRhcmdldCkpIHtcbiAgICAgICAgdGFyZ2V0ID0gdGFyZ2V0IHx8IGZpcnN0XG4gICAgICAgIC8vIEB0cy1pZ25vcmUgRm9yIHNvbWUgcmVhc29uIHRzYyBkb2Vzbid0IHJlY29nbml6ZSBcImluc3RhbnRcIiBhcyBhIHZhbGlkIG9wdGlvbiBmb3Igbm93XG4gICAgICAgIHRhcmdldC5zY3JvbGxJbnRvVmlldyh7IGJsb2NrOiAnc3RhcnQnLCBiZWhhdmlvcjogaHRteC5jb25maWcuc2Nyb2xsQmVoYXZpb3IgfSlcbiAgICAgIH1cbiAgICAgIGlmIChzd2FwU3BlYy5zaG93ID09PSAnYm90dG9tJyAmJiAobGFzdCB8fCB0YXJnZXQpKSB7XG4gICAgICAgIHRhcmdldCA9IHRhcmdldCB8fCBsYXN0XG4gICAgICAgIC8vIEB0cy1pZ25vcmUgRm9yIHNvbWUgcmVhc29uIHRzYyBkb2Vzbid0IHJlY29nbml6ZSBcImluc3RhbnRcIiBhcyBhIHZhbGlkIG9wdGlvbiBmb3Igbm93XG4gICAgICAgIHRhcmdldC5zY3JvbGxJbnRvVmlldyh7IGJsb2NrOiAnZW5kJywgYmVoYXZpb3I6IGh0bXguY29uZmlnLnNjcm9sbEJlaGF2aW9yIH0pXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICogQHBhcmFtIHtzdHJpbmd9IGF0dHJcbiAqIEBwYXJhbSB7Ym9vbGVhbj19IGV2YWxBc0RlZmF1bHRcbiAqIEBwYXJhbSB7T2JqZWN0PX0gdmFsdWVzXG4gKiBAcmV0dXJucyB7T2JqZWN0fVxuICovXG4gIGZ1bmN0aW9uIGdldFZhbHVlc0ZvckVsZW1lbnQoZWx0LCBhdHRyLCBldmFsQXNEZWZhdWx0LCB2YWx1ZXMpIHtcbiAgICBpZiAodmFsdWVzID09IG51bGwpIHtcbiAgICAgIHZhbHVlcyA9IHt9XG4gICAgfVxuICAgIGlmIChlbHQgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHZhbHVlc1xuICAgIH1cbiAgICBjb25zdCBhdHRyaWJ1dGVWYWx1ZSA9IGdldEF0dHJpYnV0ZVZhbHVlKGVsdCwgYXR0cilcbiAgICBpZiAoYXR0cmlidXRlVmFsdWUpIHtcbiAgICAgIGxldCBzdHIgPSBhdHRyaWJ1dGVWYWx1ZS50cmltKClcbiAgICAgIGxldCBldmFsdWF0ZVZhbHVlID0gZXZhbEFzRGVmYXVsdFxuICAgICAgaWYgKHN0ciA9PT0gJ3Vuc2V0Jykge1xuICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgfVxuICAgICAgaWYgKHN0ci5pbmRleE9mKCdqYXZhc2NyaXB0OicpID09PSAwKSB7XG4gICAgICAgIHN0ciA9IHN0ci5zdWJzdHIoMTEpXG4gICAgICAgIGV2YWx1YXRlVmFsdWUgPSB0cnVlXG4gICAgICB9IGVsc2UgaWYgKHN0ci5pbmRleE9mKCdqczonKSA9PT0gMCkge1xuICAgICAgICBzdHIgPSBzdHIuc3Vic3RyKDMpXG4gICAgICAgIGV2YWx1YXRlVmFsdWUgPSB0cnVlXG4gICAgICB9XG4gICAgICBpZiAoc3RyLmluZGV4T2YoJ3snKSAhPT0gMCkge1xuICAgICAgICBzdHIgPSAneycgKyBzdHIgKyAnfSdcbiAgICAgIH1cbiAgICAgIGxldCB2YXJzVmFsdWVzXG4gICAgICBpZiAoZXZhbHVhdGVWYWx1ZSkge1xuICAgICAgICB2YXJzVmFsdWVzID0gbWF5YmVFdmFsKGVsdCwgZnVuY3Rpb24oKSB7IHJldHVybiBGdW5jdGlvbigncmV0dXJuICgnICsgc3RyICsgJyknKSgpIH0sIHt9KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyc1ZhbHVlcyA9IHBhcnNlSlNPTihzdHIpXG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IGtleSBpbiB2YXJzVmFsdWVzKSB7XG4gICAgICAgIGlmICh2YXJzVmFsdWVzLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgICBpZiAodmFsdWVzW2tleV0gPT0gbnVsbCkge1xuICAgICAgICAgICAgdmFsdWVzW2tleV0gPSB2YXJzVmFsdWVzW2tleV1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGdldFZhbHVlc0ZvckVsZW1lbnQoYXNFbGVtZW50KHBhcmVudEVsdChlbHQpKSwgYXR0ciwgZXZhbEFzRGVmYXVsdCwgdmFsdWVzKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR8c3RyaW5nfSBlbHRcbiAgICogQHBhcmFtIHsoKSA9PiBhbnl9IHRvRXZhbFxuICAgKiBAcGFyYW0ge2FueT19IGRlZmF1bHRWYWxcbiAgICogQHJldHVybnMge2FueX1cbiAgICovXG4gIGZ1bmN0aW9uIG1heWJlRXZhbChlbHQsIHRvRXZhbCwgZGVmYXVsdFZhbCkge1xuICAgIGlmIChodG14LmNvbmZpZy5hbGxvd0V2YWwpIHtcbiAgICAgIHJldHVybiB0b0V2YWwoKVxuICAgIH0gZWxzZSB7XG4gICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OmV2YWxEaXNhbGxvd2VkRXJyb3InKVxuICAgICAgcmV0dXJuIGRlZmF1bHRWYWxcbiAgICB9XG4gIH1cblxuICAvKipcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gKiBAcGFyYW0geyo/fSBleHByZXNzaW9uVmFyc1xuICogQHJldHVybnNcbiAqL1xuICBmdW5jdGlvbiBnZXRIWFZhcnNGb3JFbGVtZW50KGVsdCwgZXhwcmVzc2lvblZhcnMpIHtcbiAgICByZXR1cm4gZ2V0VmFsdWVzRm9yRWxlbWVudChlbHQsICdoeC12YXJzJywgdHJ1ZSwgZXhwcmVzc2lvblZhcnMpXG4gIH1cblxuICAvKipcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gKiBAcGFyYW0geyo/fSBleHByZXNzaW9uVmFyc1xuICogQHJldHVybnNcbiAqL1xuICBmdW5jdGlvbiBnZXRIWFZhbHNGb3JFbGVtZW50KGVsdCwgZXhwcmVzc2lvblZhcnMpIHtcbiAgICByZXR1cm4gZ2V0VmFsdWVzRm9yRWxlbWVudChlbHQsICdoeC12YWxzJywgZmFsc2UsIGV4cHJlc3Npb25WYXJzKVxuICB9XG5cbiAgLyoqXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICogQHJldHVybnMge0Zvcm1EYXRhfVxuICovXG4gIGZ1bmN0aW9uIGdldEV4cHJlc3Npb25WYXJzKGVsdCkge1xuICAgIHJldHVybiBtZXJnZU9iamVjdHMoZ2V0SFhWYXJzRm9yRWxlbWVudChlbHQpLCBnZXRIWFZhbHNGb3JFbGVtZW50KGVsdCkpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtYTUxIdHRwUmVxdWVzdH0geGhyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBoZWFkZXJcbiAgICogQHBhcmFtIHtzdHJpbmd8bnVsbH0gaGVhZGVyVmFsdWVcbiAgICovXG4gIGZ1bmN0aW9uIHNhZmVseVNldEhlYWRlclZhbHVlKHhociwgaGVhZGVyLCBoZWFkZXJWYWx1ZSkge1xuICAgIGlmIChoZWFkZXJWYWx1ZSAhPT0gbnVsbCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoaGVhZGVyLCBoZWFkZXJWYWx1ZSlcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIE9uIGFuIGV4Y2VwdGlvbiwgdHJ5IHRvIHNldCB0aGUgaGVhZGVyIFVSSSBlbmNvZGVkIGluc3RlYWRcbiAgICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoaGVhZGVyLCBlbmNvZGVVUklDb21wb25lbnQoaGVhZGVyVmFsdWUpKVxuICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcihoZWFkZXIgKyAnLVVSSS1BdXRvRW5jb2RlZCcsICd0cnVlJylcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtYTUxIdHRwUmVxdWVzdH0geGhyXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGZ1bmN0aW9uIGdldFBhdGhGcm9tUmVzcG9uc2UoeGhyKSB7XG4gIC8vIE5COiBJRTExIGRvZXMgbm90IHN1cHBvcnQgdGhpcyBzdHVmZlxuICAgIGlmICh4aHIucmVzcG9uc2VVUkwgJiYgdHlwZW9mIChVUkwpICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgdXJsID0gbmV3IFVSTCh4aHIucmVzcG9uc2VVUkwpXG4gICAgICAgIHJldHVybiB1cmwucGF0aG5hbWUgKyB1cmwuc2VhcmNoXG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6YmFkUmVzcG9uc2VVcmwnLCB7IHVybDogeGhyLnJlc3BvbnNlVVJMIH0pXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7WE1MSHR0cFJlcXVlc3R9IHhoclxuICAgKiBAcGFyYW0ge1JlZ0V4cH0gcmVnZXhwXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBoYXNIZWFkZXIoeGhyLCByZWdleHApIHtcbiAgICByZXR1cm4gcmVnZXhwLnRlc3QoeGhyLmdldEFsbFJlc3BvbnNlSGVhZGVycygpKVxuICB9XG5cbiAgLyoqXG4gICAqIElzc3VlcyBhbiBodG14LXN0eWxlIEFKQVggcmVxdWVzdFxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNhamF4XG4gICAqXG4gICAqIEBwYXJhbSB7SHR0cFZlcmJ9IHZlcmJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggdGhlIFVSTCBwYXRoIHRvIG1ha2UgdGhlIEFKQVhcbiAgICogQHBhcmFtIHtFbGVtZW50fHN0cmluZ3xIdG14QWpheEhlbHBlckNvbnRleHR9IGNvbnRleHQgdGhlIGVsZW1lbnQgdG8gdGFyZ2V0IChkZWZhdWx0cyB0byB0aGUgKipib2R5KiopIHwgYSBzZWxlY3RvciBmb3IgdGhlIHRhcmdldCB8IGEgY29udGV4dCBvYmplY3QgdGhhdCBjb250YWlucyBhbnkgb2YgdGhlIGZvbGxvd2luZ1xuICAgKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgaW1tZWRpYXRlbHkgaWYgbm8gcmVxdWVzdCBpcyBzZW50LCBvciB3aGVuIHRoZSByZXF1ZXN0IGlzIGNvbXBsZXRlXG4gICAqL1xuICBmdW5jdGlvbiBhamF4SGVscGVyKHZlcmIsIHBhdGgsIGNvbnRleHQpIHtcbiAgICB2ZXJiID0gKC8qKiBAdHlwZSBIdHRwVmVyYiAqLyh2ZXJiLnRvTG93ZXJDYXNlKCkpKVxuICAgIGlmIChjb250ZXh0KSB7XG4gICAgICBpZiAoY29udGV4dCBpbnN0YW5jZW9mIEVsZW1lbnQgfHwgdHlwZW9mIGNvbnRleHQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiBpc3N1ZUFqYXhSZXF1ZXN0KHZlcmIsIHBhdGgsIG51bGwsIG51bGwsIHtcbiAgICAgICAgICB0YXJnZXRPdmVycmlkZTogcmVzb2x2ZVRhcmdldChjb250ZXh0KSxcbiAgICAgICAgICByZXR1cm5Qcm9taXNlOiB0cnVlXG4gICAgICAgIH0pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gaXNzdWVBamF4UmVxdWVzdCh2ZXJiLCBwYXRoLCByZXNvbHZlVGFyZ2V0KGNvbnRleHQuc291cmNlKSwgY29udGV4dC5ldmVudCxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBoYW5kbGVyOiBjb250ZXh0LmhhbmRsZXIsXG4gICAgICAgICAgICBoZWFkZXJzOiBjb250ZXh0LmhlYWRlcnMsXG4gICAgICAgICAgICB2YWx1ZXM6IGNvbnRleHQudmFsdWVzLFxuICAgICAgICAgICAgdGFyZ2V0T3ZlcnJpZGU6IHJlc29sdmVUYXJnZXQoY29udGV4dC50YXJnZXQpLFxuICAgICAgICAgICAgc3dhcE92ZXJyaWRlOiBjb250ZXh0LnN3YXAsXG4gICAgICAgICAgICBzZWxlY3Q6IGNvbnRleHQuc2VsZWN0LFxuICAgICAgICAgICAgcmV0dXJuUHJvbWlzZTogdHJ1ZVxuICAgICAgICAgIH0pXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBpc3N1ZUFqYXhSZXF1ZXN0KHZlcmIsIHBhdGgsIG51bGwsIG51bGwsIHtcbiAgICAgICAgcmV0dXJuUHJvbWlzZTogdHJ1ZVxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHJldHVybiB7RWxlbWVudFtdfVxuICAgKi9cbiAgZnVuY3Rpb24gaGllcmFyY2h5Rm9yRWx0KGVsdCkge1xuICAgIGNvbnN0IGFyciA9IFtdXG4gICAgd2hpbGUgKGVsdCkge1xuICAgICAgYXJyLnB1c2goZWx0KVxuICAgICAgZWx0ID0gZWx0LnBhcmVudEVsZW1lbnRcbiAgICB9XG4gICAgcmV0dXJuIGFyclxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gICAqIEBwYXJhbSB7SHRteFJlcXVlc3RDb25maWd9IHJlcXVlc3RDb25maWdcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIHZlcmlmeVBhdGgoZWx0LCBwYXRoLCByZXF1ZXN0Q29uZmlnKSB7XG4gICAgbGV0IHNhbWVIb3N0XG4gICAgbGV0IHVybFxuICAgIGlmICh0eXBlb2YgVVJMID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB1cmwgPSBuZXcgVVJMKHBhdGgsIGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpXG4gICAgICBjb25zdCBvcmlnaW4gPSBkb2N1bWVudC5sb2NhdGlvbi5vcmlnaW5cbiAgICAgIHNhbWVIb3N0ID0gb3JpZ2luID09PSB1cmwub3JpZ2luXG4gICAgfSBlbHNlIHtcbiAgICAvLyBJRTExIGRvZXNuJ3Qgc3VwcG9ydCBVUkxcbiAgICAgIHVybCA9IHBhdGhcbiAgICAgIHNhbWVIb3N0ID0gc3RhcnRzV2l0aChwYXRoLCBkb2N1bWVudC5sb2NhdGlvbi5vcmlnaW4pXG4gICAgfVxuXG4gICAgaWYgKGh0bXguY29uZmlnLnNlbGZSZXF1ZXN0c09ubHkpIHtcbiAgICAgIGlmICghc2FtZUhvc3QpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDp2YWxpZGF0ZVVybCcsIG1lcmdlT2JqZWN0cyh7IHVybCwgc2FtZUhvc3QgfSwgcmVxdWVzdENvbmZpZykpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtPYmplY3R8Rm9ybURhdGF9IG9ialxuICAgKiBAcmV0dXJuIHtGb3JtRGF0YX1cbiAgICovXG4gIGZ1bmN0aW9uIGZvcm1EYXRhRnJvbU9iamVjdChvYmopIHtcbiAgICBpZiAob2JqIGluc3RhbmNlb2YgRm9ybURhdGEpIHJldHVybiBvYmpcbiAgICBjb25zdCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpXG4gICAgZm9yIChjb25zdCBrZXkgaW4gb2JqKSB7XG4gICAgICBpZiAob2JqLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBvYmpba2V5XS5mb3JFYWNoID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgb2JqW2tleV0uZm9yRWFjaChmdW5jdGlvbih2KSB7IGZvcm1EYXRhLmFwcGVuZChrZXksIHYpIH0pXG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIG9ialtrZXldID09PSAnb2JqZWN0JyAmJiAhKG9ialtrZXldIGluc3RhbmNlb2YgQmxvYikpIHtcbiAgICAgICAgICBmb3JtRGF0YS5hcHBlbmQoa2V5LCBKU09OLnN0cmluZ2lmeShvYmpba2V5XSkpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZm9ybURhdGEuYXBwZW5kKGtleSwgb2JqW2tleV0pXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZvcm1EYXRhXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtGb3JtRGF0YX0gZm9ybURhdGFcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICogQHBhcmFtIHtBcnJheX0gYXJyYXlcbiAgICogQHJldHVybnMge0FycmF5fVxuICAgKi9cbiAgZnVuY3Rpb24gZm9ybURhdGFBcnJheVByb3h5KGZvcm1EYXRhLCBuYW1lLCBhcnJheSkge1xuICAgIC8vIG11dGF0aW5nIHRoZSBhcnJheSBzaG91bGQgbXV0YXRlIHRoZSB1bmRlcmx5aW5nIGZvcm0gZGF0YVxuICAgIHJldHVybiBuZXcgUHJveHkoYXJyYXksIHtcbiAgICAgIGdldDogZnVuY3Rpb24odGFyZ2V0LCBrZXkpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBrZXkgPT09ICdudW1iZXInKSByZXR1cm4gdGFyZ2V0W2tleV1cbiAgICAgICAgaWYgKGtleSA9PT0gJ2xlbmd0aCcpIHJldHVybiB0YXJnZXQubGVuZ3RoXG4gICAgICAgIGlmIChrZXkgPT09ICdwdXNoJykge1xuICAgICAgICAgIHJldHVybiBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgICAgICAgdGFyZ2V0LnB1c2godmFsdWUpXG4gICAgICAgICAgICBmb3JtRGF0YS5hcHBlbmQobmFtZSwgdmFsdWUpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgdGFyZ2V0W2tleV0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB0YXJnZXRba2V5XS5hcHBseSh0YXJnZXQsIGFyZ3VtZW50cylcbiAgICAgICAgICAgIGZvcm1EYXRhLmRlbGV0ZShuYW1lKVxuICAgICAgICAgICAgdGFyZ2V0LmZvckVhY2goZnVuY3Rpb24odikgeyBmb3JtRGF0YS5hcHBlbmQobmFtZSwgdikgfSlcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGFyZ2V0W2tleV0gJiYgdGFyZ2V0W2tleV0ubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgcmV0dXJuIHRhcmdldFtrZXldWzBdXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIHRhcmdldFtrZXldXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBzZXQ6IGZ1bmN0aW9uKHRhcmdldCwgaW5kZXgsIHZhbHVlKSB7XG4gICAgICAgIHRhcmdldFtpbmRleF0gPSB2YWx1ZVxuICAgICAgICBmb3JtRGF0YS5kZWxldGUobmFtZSlcbiAgICAgICAgdGFyZ2V0LmZvckVhY2goZnVuY3Rpb24odikgeyBmb3JtRGF0YS5hcHBlbmQobmFtZSwgdikgfSlcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Rm9ybURhdGF9IGZvcm1EYXRhXG4gICAqIEByZXR1cm5zIHtPYmplY3R9XG4gICAqL1xuICBmdW5jdGlvbiBmb3JtRGF0YVByb3h5KGZvcm1EYXRhKSB7XG4gICAgcmV0dXJuIG5ldyBQcm94eShmb3JtRGF0YSwge1xuICAgICAgZ2V0OiBmdW5jdGlvbih0YXJnZXQsIG5hbWUpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBuYW1lID09PSAnc3ltYm9sJykge1xuICAgICAgICAgIC8vIEZvcndhcmQgc3ltYm9sIGNhbGxzIHRvIHRoZSBGb3JtRGF0YSBpdHNlbGYgZGlyZWN0bHlcbiAgICAgICAgICByZXR1cm4gUmVmbGVjdC5nZXQodGFyZ2V0LCBuYW1lKVxuICAgICAgICB9XG4gICAgICAgIGlmIChuYW1lID09PSAndG9KU09OJykge1xuICAgICAgICAgIC8vIFN1cHBvcnQgSlNPTi5zdHJpbmdpZnkgY2FsbCBvbiBwcm94eVxuICAgICAgICAgIHJldHVybiAoKSA9PiBPYmplY3QuZnJvbUVudHJpZXMoZm9ybURhdGEpXG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5hbWUgaW4gdGFyZ2V0KSB7XG4gICAgICAgICAgLy8gV3JhcCBpbiBmdW5jdGlvbiB3aXRoIGFwcGx5IHRvIGNvcnJlY3RseSBiaW5kIHRoZSBGb3JtRGF0YSBjb250ZXh0LCBhcyBhIGRpcmVjdCBjYWxsIHdvdWxkIHJlc3VsdCBpbiBhbiBpbGxlZ2FsIGludm9jYXRpb24gZXJyb3JcbiAgICAgICAgICBpZiAodHlwZW9mIHRhcmdldFtuYW1lXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICByZXR1cm4gZm9ybURhdGFbbmFtZV0uYXBwbHkoZm9ybURhdGEsIGFyZ3VtZW50cylcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRhcmdldFtuYW1lXVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhcnJheSA9IGZvcm1EYXRhLmdldEFsbChuYW1lKVxuICAgICAgICAvLyBUaG9zZSAyIHVuZGVmaW5lZCAmIHNpbmdsZSB2YWx1ZSByZXR1cm5zIGFyZSBmb3IgcmV0cm8tY29tcGF0aWJpbGl0eSBhcyB3ZSB3ZXJlbid0IHVzaW5nIEZvcm1EYXRhIGJlZm9yZVxuICAgICAgICBpZiAoYXJyYXkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZFxuICAgICAgICB9IGVsc2UgaWYgKGFycmF5Lmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgIHJldHVybiBhcnJheVswXVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBmb3JtRGF0YUFycmF5UHJveHkodGFyZ2V0LCBuYW1lLCBhcnJheSlcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHNldDogZnVuY3Rpb24odGFyZ2V0LCBuYW1lLCB2YWx1ZSkge1xuICAgICAgICBpZiAodHlwZW9mIG5hbWUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgIH1cbiAgICAgICAgdGFyZ2V0LmRlbGV0ZShuYW1lKVxuICAgICAgICBpZiAodHlwZW9mIHZhbHVlLmZvckVhY2ggPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICB2YWx1ZS5mb3JFYWNoKGZ1bmN0aW9uKHYpIHsgdGFyZ2V0LmFwcGVuZChuYW1lLCB2KSB9KVxuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgISh2YWx1ZSBpbnN0YW5jZW9mIEJsb2IpKSB7XG4gICAgICAgICAgdGFyZ2V0LmFwcGVuZChuYW1lLCBKU09OLnN0cmluZ2lmeSh2YWx1ZSkpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGFyZ2V0LmFwcGVuZChuYW1lLCB2YWx1ZSlcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfSxcbiAgICAgIGRlbGV0ZVByb3BlcnR5OiBmdW5jdGlvbih0YXJnZXQsIG5hbWUpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBuYW1lID09PSAnc3RyaW5nJykge1xuICAgICAgICAgIHRhcmdldC5kZWxldGUobmFtZSlcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfSxcbiAgICAgIC8vIFN1cHBvcnQgT2JqZWN0LmFzc2lnbiBjYWxsIGZyb20gcHJveHlcbiAgICAgIG93bktleXM6IGZ1bmN0aW9uKHRhcmdldCkge1xuICAgICAgICByZXR1cm4gUmVmbGVjdC5vd25LZXlzKE9iamVjdC5mcm9tRW50cmllcyh0YXJnZXQpKVxuICAgICAgfSxcbiAgICAgIGdldE93blByb3BlcnR5RGVzY3JpcHRvcjogZnVuY3Rpb24odGFyZ2V0LCBwcm9wKSB7XG4gICAgICAgIHJldHVybiBSZWZsZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihPYmplY3QuZnJvbUVudHJpZXModGFyZ2V0KSwgcHJvcClcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7SHR0cFZlcmJ9IHZlcmJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtFdmVudH0gZXZlbnRcbiAgICogQHBhcmFtIHtIdG14QWpheEV0Y30gW2V0Y11cbiAgICogQHBhcmFtIHtib29sZWFufSBbY29uZmlybWVkXVxuICAgKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgZnVuY3Rpb24gaXNzdWVBamF4UmVxdWVzdCh2ZXJiLCBwYXRoLCBlbHQsIGV2ZW50LCBldGMsIGNvbmZpcm1lZCkge1xuICAgIGxldCByZXNvbHZlID0gbnVsbFxuICAgIGxldCByZWplY3QgPSBudWxsXG4gICAgZXRjID0gZXRjICE9IG51bGwgPyBldGMgOiB7fVxuICAgIGlmIChldGMucmV0dXJuUHJvbWlzZSAmJiB0eXBlb2YgUHJvbWlzZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHZhciBwcm9taXNlID0gbmV3IFByb21pc2UoZnVuY3Rpb24oX3Jlc29sdmUsIF9yZWplY3QpIHtcbiAgICAgICAgcmVzb2x2ZSA9IF9yZXNvbHZlXG4gICAgICAgIHJlamVjdCA9IF9yZWplY3RcbiAgICAgIH0pXG4gICAgfVxuICAgIGlmIChlbHQgPT0gbnVsbCkge1xuICAgICAgZWx0ID0gZ2V0RG9jdW1lbnQoKS5ib2R5XG4gICAgfVxuICAgIGNvbnN0IHJlc3BvbnNlSGFuZGxlciA9IGV0Yy5oYW5kbGVyIHx8IGhhbmRsZUFqYXhSZXNwb25zZVxuICAgIGNvbnN0IHNlbGVjdCA9IGV0Yy5zZWxlY3QgfHwgbnVsbFxuXG4gICAgaWYgKCFib2R5Q29udGFpbnMoZWx0KSkge1xuICAgIC8vIGRvIG5vdCBpc3N1ZSByZXF1ZXN0cyBmb3IgZWxlbWVudHMgcmVtb3ZlZCBmcm9tIHRoZSBET01cbiAgICAgIG1heWJlQ2FsbChyZXNvbHZlKVxuICAgICAgcmV0dXJuIHByb21pc2VcbiAgICB9XG4gICAgY29uc3QgdGFyZ2V0ID0gZXRjLnRhcmdldE92ZXJyaWRlIHx8IGFzRWxlbWVudChnZXRUYXJnZXQoZWx0KSlcbiAgICBpZiAodGFyZ2V0ID09IG51bGwgfHwgdGFyZ2V0ID09IERVTU1ZX0VMVCkge1xuICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDp0YXJnZXRFcnJvcicsIHsgdGFyZ2V0OiBnZXRBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC10YXJnZXQnKSB9KVxuICAgICAgbWF5YmVDYWxsKHJlamVjdClcbiAgICAgIHJldHVybiBwcm9taXNlXG4gICAgfVxuXG4gICAgbGV0IGVsdERhdGEgPSBnZXRJbnRlcm5hbERhdGEoZWx0KVxuICAgIGNvbnN0IHN1Ym1pdHRlciA9IGVsdERhdGEubGFzdEJ1dHRvbkNsaWNrZWRcblxuICAgIGlmIChzdWJtaXR0ZXIpIHtcbiAgICAgIGNvbnN0IGJ1dHRvblBhdGggPSBnZXRSYXdBdHRyaWJ1dGUoc3VibWl0dGVyLCAnZm9ybWFjdGlvbicpXG4gICAgICBpZiAoYnV0dG9uUGF0aCAhPSBudWxsKSB7XG4gICAgICAgIHBhdGggPSBidXR0b25QYXRoXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGJ1dHRvblZlcmIgPSBnZXRSYXdBdHRyaWJ1dGUoc3VibWl0dGVyLCAnZm9ybW1ldGhvZCcpXG4gICAgICBpZiAoYnV0dG9uVmVyYiAhPSBudWxsKSB7XG4gICAgICAvLyBpZ25vcmUgYnV0dG9ucyB3aXRoIGZvcm1tZXRob2Q9XCJkaWFsb2dcIlxuICAgICAgICBpZiAoYnV0dG9uVmVyYi50b0xvd2VyQ2FzZSgpICE9PSAnZGlhbG9nJykge1xuICAgICAgICAgIHZlcmIgPSAoLyoqIEB0eXBlIEh0dHBWZXJiICovKGJ1dHRvblZlcmIpKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgY29uZmlybVF1ZXN0aW9uID0gZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LWNvbmZpcm0nKVxuICAgIC8vIGFsbG93IGV2ZW50LWJhc2VkIGNvbmZpcm1hdGlvbiB3LyBhIGNhbGxiYWNrXG4gICAgaWYgKGNvbmZpcm1lZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBpc3N1ZVJlcXVlc3QgPSBmdW5jdGlvbihza2lwQ29uZmlybWF0aW9uKSB7XG4gICAgICAgIHJldHVybiBpc3N1ZUFqYXhSZXF1ZXN0KHZlcmIsIHBhdGgsIGVsdCwgZXZlbnQsIGV0YywgISFza2lwQ29uZmlybWF0aW9uKVxuICAgICAgfVxuICAgICAgY29uc3QgY29uZmlybURldGFpbHMgPSB7IHRhcmdldCwgZWx0LCBwYXRoLCB2ZXJiLCB0cmlnZ2VyaW5nRXZlbnQ6IGV2ZW50LCBldGMsIGlzc3VlUmVxdWVzdCwgcXVlc3Rpb246IGNvbmZpcm1RdWVzdGlvbiB9XG4gICAgICBpZiAodHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6Y29uZmlybScsIGNvbmZpcm1EZXRhaWxzKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgbWF5YmVDYWxsKHJlc29sdmUpXG4gICAgICAgIHJldHVybiBwcm9taXNlXG4gICAgICB9XG4gICAgfVxuXG4gICAgbGV0IHN5bmNFbHQgPSBlbHRcbiAgICBsZXQgc3luY1N0cmF0ZWd5ID0gZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LXN5bmMnKVxuICAgIGxldCBxdWV1ZVN0cmF0ZWd5ID0gbnVsbFxuICAgIGxldCBhYm9ydGFibGUgPSBmYWxzZVxuICAgIGlmIChzeW5jU3RyYXRlZ3kpIHtcbiAgICAgIGNvbnN0IHN5bmNTdHJpbmdzID0gc3luY1N0cmF0ZWd5LnNwbGl0KCc6JylcbiAgICAgIGNvbnN0IHNlbGVjdG9yID0gc3luY1N0cmluZ3NbMF0udHJpbSgpXG4gICAgICBpZiAoc2VsZWN0b3IgPT09ICd0aGlzJykge1xuICAgICAgICBzeW5jRWx0ID0gZmluZFRoaXNFbGVtZW50KGVsdCwgJ2h4LXN5bmMnKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3luY0VsdCA9IGFzRWxlbWVudChxdWVyeVNlbGVjdG9yRXh0KGVsdCwgc2VsZWN0b3IpKVxuICAgICAgfVxuICAgICAgLy8gZGVmYXVsdCB0byB0aGUgZHJvcCBzdHJhdGVneVxuICAgICAgc3luY1N0cmF0ZWd5ID0gKHN5bmNTdHJpbmdzWzFdIHx8ICdkcm9wJykudHJpbSgpXG4gICAgICBlbHREYXRhID0gZ2V0SW50ZXJuYWxEYXRhKHN5bmNFbHQpXG4gICAgICBpZiAoc3luY1N0cmF0ZWd5ID09PSAnZHJvcCcgJiYgZWx0RGF0YS54aHIgJiYgZWx0RGF0YS5hYm9ydGFibGUgIT09IHRydWUpIHtcbiAgICAgICAgbWF5YmVDYWxsKHJlc29sdmUpXG4gICAgICAgIHJldHVybiBwcm9taXNlXG4gICAgICB9IGVsc2UgaWYgKHN5bmNTdHJhdGVneSA9PT0gJ2Fib3J0Jykge1xuICAgICAgICBpZiAoZWx0RGF0YS54aHIpIHtcbiAgICAgICAgICBtYXliZUNhbGwocmVzb2x2ZSlcbiAgICAgICAgICByZXR1cm4gcHJvbWlzZVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGFib3J0YWJsZSA9IHRydWVcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChzeW5jU3RyYXRlZ3kgPT09ICdyZXBsYWNlJykge1xuICAgICAgICB0cmlnZ2VyRXZlbnQoc3luY0VsdCwgJ2h0bXg6YWJvcnQnKSAvLyBhYm9ydCB0aGUgY3VycmVudCByZXF1ZXN0IGFuZCBjb250aW51ZVxuICAgICAgfSBlbHNlIGlmIChzeW5jU3RyYXRlZ3kuaW5kZXhPZigncXVldWUnKSA9PT0gMCkge1xuICAgICAgICBjb25zdCBxdWV1ZVN0ckFycmF5ID0gc3luY1N0cmF0ZWd5LnNwbGl0KCcgJylcbiAgICAgICAgcXVldWVTdHJhdGVneSA9IChxdWV1ZVN0ckFycmF5WzFdIHx8ICdsYXN0JykudHJpbSgpXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGVsdERhdGEueGhyKSB7XG4gICAgICBpZiAoZWx0RGF0YS5hYm9ydGFibGUpIHtcbiAgICAgICAgdHJpZ2dlckV2ZW50KHN5bmNFbHQsICdodG14OmFib3J0JykgLy8gYWJvcnQgdGhlIGN1cnJlbnQgcmVxdWVzdCBhbmQgY29udGludWVcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChxdWV1ZVN0cmF0ZWd5ID09IG51bGwpIHtcbiAgICAgICAgICBpZiAoZXZlbnQpIHtcbiAgICAgICAgICAgIGNvbnN0IGV2ZW50RGF0YSA9IGdldEludGVybmFsRGF0YShldmVudClcbiAgICAgICAgICAgIGlmIChldmVudERhdGEgJiYgZXZlbnREYXRhLnRyaWdnZXJTcGVjICYmIGV2ZW50RGF0YS50cmlnZ2VyU3BlYy5xdWV1ZSkge1xuICAgICAgICAgICAgICBxdWV1ZVN0cmF0ZWd5ID0gZXZlbnREYXRhLnRyaWdnZXJTcGVjLnF1ZXVlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChxdWV1ZVN0cmF0ZWd5ID09IG51bGwpIHtcbiAgICAgICAgICAgIHF1ZXVlU3RyYXRlZ3kgPSAnbGFzdCdcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVsdERhdGEucXVldWVkUmVxdWVzdHMgPT0gbnVsbCkge1xuICAgICAgICAgIGVsdERhdGEucXVldWVkUmVxdWVzdHMgPSBbXVxuICAgICAgICB9XG4gICAgICAgIGlmIChxdWV1ZVN0cmF0ZWd5ID09PSAnZmlyc3QnICYmIGVsdERhdGEucXVldWVkUmVxdWVzdHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgZWx0RGF0YS5xdWV1ZWRSZXF1ZXN0cy5wdXNoKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgaXNzdWVBamF4UmVxdWVzdCh2ZXJiLCBwYXRoLCBlbHQsIGV2ZW50LCBldGMpXG4gICAgICAgICAgfSlcbiAgICAgICAgfSBlbHNlIGlmIChxdWV1ZVN0cmF0ZWd5ID09PSAnYWxsJykge1xuICAgICAgICAgIGVsdERhdGEucXVldWVkUmVxdWVzdHMucHVzaChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGlzc3VlQWpheFJlcXVlc3QodmVyYiwgcGF0aCwgZWx0LCBldmVudCwgZXRjKVxuICAgICAgICAgIH0pXG4gICAgICAgIH0gZWxzZSBpZiAocXVldWVTdHJhdGVneSA9PT0gJ2xhc3QnKSB7XG4gICAgICAgICAgZWx0RGF0YS5xdWV1ZWRSZXF1ZXN0cyA9IFtdIC8vIGR1bXAgZXhpc3RpbmcgcXVldWVcbiAgICAgICAgICBlbHREYXRhLnF1ZXVlZFJlcXVlc3RzLnB1c2goZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBpc3N1ZUFqYXhSZXF1ZXN0KHZlcmIsIHBhdGgsIGVsdCwgZXZlbnQsIGV0YylcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICAgIG1heWJlQ2FsbChyZXNvbHZlKVxuICAgICAgICByZXR1cm4gcHJvbWlzZVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpXG4gICAgZWx0RGF0YS54aHIgPSB4aHJcbiAgICBlbHREYXRhLmFib3J0YWJsZSA9IGFib3J0YWJsZVxuICAgIGNvbnN0IGVuZFJlcXVlc3RMb2NrID0gZnVuY3Rpb24oKSB7XG4gICAgICBlbHREYXRhLnhociA9IG51bGxcbiAgICAgIGVsdERhdGEuYWJvcnRhYmxlID0gZmFsc2VcbiAgICAgIGlmIChlbHREYXRhLnF1ZXVlZFJlcXVlc3RzICE9IG51bGwgJiZcbiAgICAgIGVsdERhdGEucXVldWVkUmVxdWVzdHMubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCBxdWV1ZWRSZXF1ZXN0ID0gZWx0RGF0YS5xdWV1ZWRSZXF1ZXN0cy5zaGlmdCgpXG4gICAgICAgIHF1ZXVlZFJlcXVlc3QoKVxuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBwcm9tcHRRdWVzdGlvbiA9IGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC1wcm9tcHQnKVxuICAgIGlmIChwcm9tcHRRdWVzdGlvbikge1xuICAgICAgdmFyIHByb21wdFJlc3BvbnNlID0gcHJvbXB0KHByb21wdFF1ZXN0aW9uKVxuICAgICAgLy8gcHJvbXB0IHJldHVybnMgbnVsbCBpZiBjYW5jZWxsZWQgYW5kIGVtcHR5IHN0cmluZyBpZiBhY2NlcHRlZCB3aXRoIG5vIGVudHJ5XG4gICAgICBpZiAocHJvbXB0UmVzcG9uc2UgPT09IG51bGwgfHxcbiAgICAgICF0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDpwcm9tcHQnLCB7IHByb21wdDogcHJvbXB0UmVzcG9uc2UsIHRhcmdldCB9KSkge1xuICAgICAgICBtYXliZUNhbGwocmVzb2x2ZSlcbiAgICAgICAgZW5kUmVxdWVzdExvY2soKVxuICAgICAgICByZXR1cm4gcHJvbWlzZVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjb25maXJtUXVlc3Rpb24gJiYgIWNvbmZpcm1lZCkge1xuICAgICAgaWYgKCFjb25maXJtKGNvbmZpcm1RdWVzdGlvbikpIHtcbiAgICAgICAgbWF5YmVDYWxsKHJlc29sdmUpXG4gICAgICAgIGVuZFJlcXVlc3RMb2NrKClcbiAgICAgICAgcmV0dXJuIHByb21pc2VcbiAgICAgIH1cbiAgICB9XG5cbiAgICBsZXQgaGVhZGVycyA9IGdldEhlYWRlcnMoZWx0LCB0YXJnZXQsIHByb21wdFJlc3BvbnNlKVxuXG4gICAgaWYgKHZlcmIgIT09ICdnZXQnICYmICF1c2VzRm9ybURhdGEoZWx0KSkge1xuICAgICAgaGVhZGVyc1snQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJ1xuICAgIH1cblxuICAgIGlmIChldGMuaGVhZGVycykge1xuICAgICAgaGVhZGVycyA9IG1lcmdlT2JqZWN0cyhoZWFkZXJzLCBldGMuaGVhZGVycylcbiAgICB9XG4gICAgY29uc3QgcmVzdWx0cyA9IGdldElucHV0VmFsdWVzKGVsdCwgdmVyYilcbiAgICBsZXQgZXJyb3JzID0gcmVzdWx0cy5lcnJvcnNcbiAgICBjb25zdCByYXdGb3JtRGF0YSA9IHJlc3VsdHMuZm9ybURhdGFcbiAgICBpZiAoZXRjLnZhbHVlcykge1xuICAgICAgb3ZlcnJpZGVGb3JtRGF0YShyYXdGb3JtRGF0YSwgZm9ybURhdGFGcm9tT2JqZWN0KGV0Yy52YWx1ZXMpKVxuICAgIH1cbiAgICBjb25zdCBleHByZXNzaW9uVmFycyA9IGZvcm1EYXRhRnJvbU9iamVjdChnZXRFeHByZXNzaW9uVmFycyhlbHQpKVxuICAgIGNvbnN0IGFsbEZvcm1EYXRhID0gb3ZlcnJpZGVGb3JtRGF0YShyYXdGb3JtRGF0YSwgZXhwcmVzc2lvblZhcnMpXG4gICAgbGV0IGZpbHRlcmVkRm9ybURhdGEgPSBmaWx0ZXJWYWx1ZXMoYWxsRm9ybURhdGEsIGVsdClcblxuICAgIGlmIChodG14LmNvbmZpZy5nZXRDYWNoZUJ1c3RlclBhcmFtICYmIHZlcmIgPT09ICdnZXQnKSB7XG4gICAgICBmaWx0ZXJlZEZvcm1EYXRhLnNldCgnb3JnLmh0bXguY2FjaGUtYnVzdGVyJywgZ2V0UmF3QXR0cmlidXRlKHRhcmdldCwgJ2lkJykgfHwgJ3RydWUnKVxuICAgIH1cblxuICAgIC8vIGJlaGF2aW9yIG9mIGFuY2hvcnMgdy8gZW1wdHkgaHJlZiBpcyB0byB1c2UgdGhlIGN1cnJlbnQgVVJMXG4gICAgaWYgKHBhdGggPT0gbnVsbCB8fCBwYXRoID09PSAnJykge1xuICAgICAgcGF0aCA9IGdldERvY3VtZW50KCkubG9jYXRpb24uaHJlZlxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEB0eXBlIHtPYmplY3R9XG4gICAgICogQHByb3BlcnR5IHtib29sZWFufSBbY3JlZGVudGlhbHNdXG4gICAgICogQHByb3BlcnR5IHtudW1iZXJ9IFt0aW1lb3V0XVxuICAgICAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW25vSGVhZGVyc11cbiAgICAgKi9cbiAgICBjb25zdCByZXF1ZXN0QXR0clZhbHVlcyA9IGdldFZhbHVlc0ZvckVsZW1lbnQoZWx0LCAnaHgtcmVxdWVzdCcpXG5cbiAgICBjb25zdCBlbHRJc0Jvb3N0ZWQgPSBnZXRJbnRlcm5hbERhdGEoZWx0KS5ib29zdGVkXG5cbiAgICBsZXQgdXNlVXJsUGFyYW1zID0gaHRteC5jb25maWcubWV0aG9kc1RoYXRVc2VVcmxQYXJhbXMuaW5kZXhPZih2ZXJiKSA+PSAwXG5cbiAgICAvKiogQHR5cGUgSHRteFJlcXVlc3RDb25maWcgKi9cbiAgICBjb25zdCByZXF1ZXN0Q29uZmlnID0ge1xuICAgICAgYm9vc3RlZDogZWx0SXNCb29zdGVkLFxuICAgICAgdXNlVXJsUGFyYW1zLFxuICAgICAgZm9ybURhdGE6IGZpbHRlcmVkRm9ybURhdGEsXG4gICAgICBwYXJhbWV0ZXJzOiBmb3JtRGF0YVByb3h5KGZpbHRlcmVkRm9ybURhdGEpLFxuICAgICAgdW5maWx0ZXJlZEZvcm1EYXRhOiBhbGxGb3JtRGF0YSxcbiAgICAgIHVuZmlsdGVyZWRQYXJhbWV0ZXJzOiBmb3JtRGF0YVByb3h5KGFsbEZvcm1EYXRhKSxcbiAgICAgIGhlYWRlcnMsXG4gICAgICB0YXJnZXQsXG4gICAgICB2ZXJiLFxuICAgICAgZXJyb3JzLFxuICAgICAgd2l0aENyZWRlbnRpYWxzOiBldGMuY3JlZGVudGlhbHMgfHwgcmVxdWVzdEF0dHJWYWx1ZXMuY3JlZGVudGlhbHMgfHwgaHRteC5jb25maWcud2l0aENyZWRlbnRpYWxzLFxuICAgICAgdGltZW91dDogZXRjLnRpbWVvdXQgfHwgcmVxdWVzdEF0dHJWYWx1ZXMudGltZW91dCB8fCBodG14LmNvbmZpZy50aW1lb3V0LFxuICAgICAgcGF0aCxcbiAgICAgIHRyaWdnZXJpbmdFdmVudDogZXZlbnRcbiAgICB9XG5cbiAgICBpZiAoIXRyaWdnZXJFdmVudChlbHQsICdodG14OmNvbmZpZ1JlcXVlc3QnLCByZXF1ZXN0Q29uZmlnKSkge1xuICAgICAgbWF5YmVDYWxsKHJlc29sdmUpXG4gICAgICBlbmRSZXF1ZXN0TG9jaygpXG4gICAgICByZXR1cm4gcHJvbWlzZVxuICAgIH1cblxuICAgIC8vIGNvcHkgb3V0IGluIGNhc2UgdGhlIG9iamVjdCB3YXMgb3ZlcndyaXR0ZW5cbiAgICBwYXRoID0gcmVxdWVzdENvbmZpZy5wYXRoXG4gICAgdmVyYiA9IHJlcXVlc3RDb25maWcudmVyYlxuICAgIGhlYWRlcnMgPSByZXF1ZXN0Q29uZmlnLmhlYWRlcnNcbiAgICBmaWx0ZXJlZEZvcm1EYXRhID0gZm9ybURhdGFGcm9tT2JqZWN0KHJlcXVlc3RDb25maWcucGFyYW1ldGVycylcbiAgICBlcnJvcnMgPSByZXF1ZXN0Q29uZmlnLmVycm9yc1xuICAgIHVzZVVybFBhcmFtcyA9IHJlcXVlc3RDb25maWcudXNlVXJsUGFyYW1zXG5cbiAgICBpZiAoZXJyb3JzICYmIGVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDp2YWxpZGF0aW9uOmhhbHRlZCcsIHJlcXVlc3RDb25maWcpXG4gICAgICBtYXliZUNhbGwocmVzb2x2ZSlcbiAgICAgIGVuZFJlcXVlc3RMb2NrKClcbiAgICAgIHJldHVybiBwcm9taXNlXG4gICAgfVxuXG4gICAgY29uc3Qgc3BsaXRQYXRoID0gcGF0aC5zcGxpdCgnIycpXG4gICAgY29uc3QgcGF0aE5vQW5jaG9yID0gc3BsaXRQYXRoWzBdXG4gICAgY29uc3QgYW5jaG9yID0gc3BsaXRQYXRoWzFdXG5cbiAgICBsZXQgZmluYWxQYXRoID0gcGF0aFxuICAgIGlmICh1c2VVcmxQYXJhbXMpIHtcbiAgICAgIGZpbmFsUGF0aCA9IHBhdGhOb0FuY2hvclxuICAgICAgY29uc3QgaGFzVmFsdWVzID0gIWZpbHRlcmVkRm9ybURhdGEua2V5cygpLm5leHQoKS5kb25lXG4gICAgICBpZiAoaGFzVmFsdWVzKSB7XG4gICAgICAgIGlmIChmaW5hbFBhdGguaW5kZXhPZignPycpIDwgMCkge1xuICAgICAgICAgIGZpbmFsUGF0aCArPSAnPydcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmaW5hbFBhdGggKz0gJyYnXG4gICAgICAgIH1cbiAgICAgICAgZmluYWxQYXRoICs9IHVybEVuY29kZShmaWx0ZXJlZEZvcm1EYXRhKVxuICAgICAgICBpZiAoYW5jaG9yKSB7XG4gICAgICAgICAgZmluYWxQYXRoICs9ICcjJyArIGFuY2hvclxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCF2ZXJpZnlQYXRoKGVsdCwgZmluYWxQYXRoLCByZXF1ZXN0Q29uZmlnKSkge1xuICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDppbnZhbGlkUGF0aCcsIHJlcXVlc3RDb25maWcpXG4gICAgICBtYXliZUNhbGwocmVqZWN0KVxuICAgICAgcmV0dXJuIHByb21pc2VcbiAgICB9XG5cbiAgICB4aHIub3Blbih2ZXJiLnRvVXBwZXJDYXNlKCksIGZpbmFsUGF0aCwgdHJ1ZSlcbiAgICB4aHIub3ZlcnJpZGVNaW1lVHlwZSgndGV4dC9odG1sJylcbiAgICB4aHIud2l0aENyZWRlbnRpYWxzID0gcmVxdWVzdENvbmZpZy53aXRoQ3JlZGVudGlhbHNcbiAgICB4aHIudGltZW91dCA9IHJlcXVlc3RDb25maWcudGltZW91dFxuXG4gICAgLy8gcmVxdWVzdCBoZWFkZXJzXG4gICAgaWYgKHJlcXVlc3RBdHRyVmFsdWVzLm5vSGVhZGVycykge1xuICAgIC8vIGlnbm9yZSBhbGwgaGVhZGVyc1xuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKGNvbnN0IGhlYWRlciBpbiBoZWFkZXJzKSB7XG4gICAgICAgIGlmIChoZWFkZXJzLmhhc093blByb3BlcnR5KGhlYWRlcikpIHtcbiAgICAgICAgICBjb25zdCBoZWFkZXJWYWx1ZSA9IGhlYWRlcnNbaGVhZGVyXVxuICAgICAgICAgIHNhZmVseVNldEhlYWRlclZhbHVlKHhociwgaGVhZGVyLCBoZWFkZXJWYWx1ZSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBAdHlwZSB7SHRteFJlc3BvbnNlSW5mb30gKi9cbiAgICBjb25zdCByZXNwb25zZUluZm8gPSB7XG4gICAgICB4aHIsXG4gICAgICB0YXJnZXQsXG4gICAgICByZXF1ZXN0Q29uZmlnLFxuICAgICAgZXRjLFxuICAgICAgYm9vc3RlZDogZWx0SXNCb29zdGVkLFxuICAgICAgc2VsZWN0LFxuICAgICAgcGF0aEluZm86IHtcbiAgICAgICAgcmVxdWVzdFBhdGg6IHBhdGgsXG4gICAgICAgIGZpbmFsUmVxdWVzdFBhdGg6IGZpbmFsUGF0aCxcbiAgICAgICAgcmVzcG9uc2VQYXRoOiBudWxsLFxuICAgICAgICBhbmNob3JcbiAgICAgIH1cbiAgICB9XG5cbiAgICB4aHIub25sb2FkID0gZnVuY3Rpb24oKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBoaWVyYXJjaHkgPSBoaWVyYXJjaHlGb3JFbHQoZWx0KVxuICAgICAgICByZXNwb25zZUluZm8ucGF0aEluZm8ucmVzcG9uc2VQYXRoID0gZ2V0UGF0aEZyb21SZXNwb25zZSh4aHIpXG4gICAgICAgIHJlc3BvbnNlSGFuZGxlcihlbHQsIHJlc3BvbnNlSW5mbylcbiAgICAgICAgaWYgKHJlc3BvbnNlSW5mby5rZWVwSW5kaWNhdG9ycyAhPT0gdHJ1ZSkge1xuICAgICAgICAgIHJlbW92ZVJlcXVlc3RJbmRpY2F0b3JzKGluZGljYXRvcnMsIGRpc2FibGVFbHRzKVxuICAgICAgICB9XG4gICAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OmFmdGVyUmVxdWVzdCcsIHJlc3BvbnNlSW5mbylcbiAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6YWZ0ZXJPbkxvYWQnLCByZXNwb25zZUluZm8pXG4gICAgICAgIC8vIGlmIHRoZSBib2R5IG5vIGxvbmdlciBjb250YWlucyB0aGUgZWxlbWVudCwgdHJpZ2dlciB0aGUgZXZlbnQgb24gdGhlIGNsb3Nlc3QgcGFyZW50XG4gICAgICAgIC8vIHJlbWFpbmluZyBpbiB0aGUgRE9NXG4gICAgICAgIGlmICghYm9keUNvbnRhaW5zKGVsdCkpIHtcbiAgICAgICAgICBsZXQgc2Vjb25kYXJ5VHJpZ2dlckVsdCA9IG51bGxcbiAgICAgICAgICB3aGlsZSAoaGllcmFyY2h5Lmxlbmd0aCA+IDAgJiYgc2Vjb25kYXJ5VHJpZ2dlckVsdCA9PSBudWxsKSB7XG4gICAgICAgICAgICBjb25zdCBwYXJlbnRFbHRJbkhpZXJhcmNoeSA9IGhpZXJhcmNoeS5zaGlmdCgpXG4gICAgICAgICAgICBpZiAoYm9keUNvbnRhaW5zKHBhcmVudEVsdEluSGllcmFyY2h5KSkge1xuICAgICAgICAgICAgICBzZWNvbmRhcnlUcmlnZ2VyRWx0ID0gcGFyZW50RWx0SW5IaWVyYXJjaHlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHNlY29uZGFyeVRyaWdnZXJFbHQpIHtcbiAgICAgICAgICAgIHRyaWdnZXJFdmVudChzZWNvbmRhcnlUcmlnZ2VyRWx0LCAnaHRteDphZnRlclJlcXVlc3QnLCByZXNwb25zZUluZm8pXG4gICAgICAgICAgICB0cmlnZ2VyRXZlbnQoc2Vjb25kYXJ5VHJpZ2dlckVsdCwgJ2h0bXg6YWZ0ZXJPbkxvYWQnLCByZXNwb25zZUluZm8pXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIG1heWJlQ2FsbChyZXNvbHZlKVxuICAgICAgICBlbmRSZXF1ZXN0TG9jaygpXG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6b25Mb2FkRXJyb3InLCBtZXJnZU9iamVjdHMoeyBlcnJvcjogZSB9LCByZXNwb25zZUluZm8pKVxuICAgICAgICB0aHJvdyBlXG4gICAgICB9XG4gICAgfVxuICAgIHhoci5vbmVycm9yID0gZnVuY3Rpb24oKSB7XG4gICAgICByZW1vdmVSZXF1ZXN0SW5kaWNhdG9ycyhpbmRpY2F0b3JzLCBkaXNhYmxlRWx0cylcbiAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6YWZ0ZXJSZXF1ZXN0JywgcmVzcG9uc2VJbmZvKVxuICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDpzZW5kRXJyb3InLCByZXNwb25zZUluZm8pXG4gICAgICBtYXliZUNhbGwocmVqZWN0KVxuICAgICAgZW5kUmVxdWVzdExvY2soKVxuICAgIH1cbiAgICB4aHIub25hYm9ydCA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmVtb3ZlUmVxdWVzdEluZGljYXRvcnMoaW5kaWNhdG9ycywgZGlzYWJsZUVsdHMpXG4gICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OmFmdGVyUmVxdWVzdCcsIHJlc3BvbnNlSW5mbylcbiAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6c2VuZEFib3J0JywgcmVzcG9uc2VJbmZvKVxuICAgICAgbWF5YmVDYWxsKHJlamVjdClcbiAgICAgIGVuZFJlcXVlc3RMb2NrKClcbiAgICB9XG4gICAgeGhyLm9udGltZW91dCA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmVtb3ZlUmVxdWVzdEluZGljYXRvcnMoaW5kaWNhdG9ycywgZGlzYWJsZUVsdHMpXG4gICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OmFmdGVyUmVxdWVzdCcsIHJlc3BvbnNlSW5mbylcbiAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6dGltZW91dCcsIHJlc3BvbnNlSW5mbylcbiAgICAgIG1heWJlQ2FsbChyZWplY3QpXG4gICAgICBlbmRSZXF1ZXN0TG9jaygpXG4gICAgfVxuICAgIGlmICghdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6YmVmb3JlUmVxdWVzdCcsIHJlc3BvbnNlSW5mbykpIHtcbiAgICAgIG1heWJlQ2FsbChyZXNvbHZlKVxuICAgICAgZW5kUmVxdWVzdExvY2soKVxuICAgICAgcmV0dXJuIHByb21pc2VcbiAgICB9XG4gICAgdmFyIGluZGljYXRvcnMgPSBhZGRSZXF1ZXN0SW5kaWNhdG9yQ2xhc3NlcyhlbHQpXG4gICAgdmFyIGRpc2FibGVFbHRzID0gZGlzYWJsZUVsZW1lbnRzKGVsdClcblxuICAgIGZvckVhY2goWydsb2Fkc3RhcnQnLCAnbG9hZGVuZCcsICdwcm9ncmVzcycsICdhYm9ydCddLCBmdW5jdGlvbihldmVudE5hbWUpIHtcbiAgICAgIGZvckVhY2goW3hociwgeGhyLnVwbG9hZF0sIGZ1bmN0aW9uKHRhcmdldCkge1xuICAgICAgICB0YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6eGhyOicgKyBldmVudE5hbWUsIHtcbiAgICAgICAgICAgIGxlbmd0aENvbXB1dGFibGU6IGV2ZW50Lmxlbmd0aENvbXB1dGFibGUsXG4gICAgICAgICAgICBsb2FkZWQ6IGV2ZW50LmxvYWRlZCxcbiAgICAgICAgICAgIHRvdGFsOiBldmVudC50b3RhbFxuICAgICAgICAgIH0pXG4gICAgICAgIH0pXG4gICAgICB9KVxuICAgIH0pXG4gICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6YmVmb3JlU2VuZCcsIHJlc3BvbnNlSW5mbylcbiAgICBjb25zdCBwYXJhbXMgPSB1c2VVcmxQYXJhbXMgPyBudWxsIDogZW5jb2RlUGFyYW1zRm9yQm9keSh4aHIsIGVsdCwgZmlsdGVyZWRGb3JtRGF0YSlcbiAgICB4aHIuc2VuZChwYXJhbXMpXG4gICAgcmV0dXJuIHByb21pc2VcbiAgfVxuXG4gIC8qKlxuICAgKiBAdHlwZWRlZiB7T2JqZWN0fSBIdG14SGlzdG9yeVVwZGF0ZVxuICAgKiBAcHJvcGVydHkge3N0cmluZ3xudWxsfSBbdHlwZV1cbiAgICogQHByb3BlcnR5IHtzdHJpbmd8bnVsbH0gW3BhdGhdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge0h0bXhSZXNwb25zZUluZm99IHJlc3BvbnNlSW5mb1xuICAgKiBAcmV0dXJuIHtIdG14SGlzdG9yeVVwZGF0ZX1cbiAgICovXG4gIGZ1bmN0aW9uIGRldGVybWluZUhpc3RvcnlVcGRhdGVzKGVsdCwgcmVzcG9uc2VJbmZvKSB7XG4gICAgY29uc3QgeGhyID0gcmVzcG9uc2VJbmZvLnhoclxuXG4gICAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIC8vIEZpcnN0IGNvbnN1bHQgcmVzcG9uc2UgaGVhZGVyc1xuICAgIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICBsZXQgcGF0aEZyb21IZWFkZXJzID0gbnVsbFxuICAgIGxldCB0eXBlRnJvbUhlYWRlcnMgPSBudWxsXG4gICAgaWYgKGhhc0hlYWRlcih4aHIsIC9IWC1QdXNoOi9pKSkge1xuICAgICAgcGF0aEZyb21IZWFkZXJzID0geGhyLmdldFJlc3BvbnNlSGVhZGVyKCdIWC1QdXNoJylcbiAgICAgIHR5cGVGcm9tSGVhZGVycyA9ICdwdXNoJ1xuICAgIH0gZWxzZSBpZiAoaGFzSGVhZGVyKHhociwgL0hYLVB1c2gtVXJsOi9pKSkge1xuICAgICAgcGF0aEZyb21IZWFkZXJzID0geGhyLmdldFJlc3BvbnNlSGVhZGVyKCdIWC1QdXNoLVVybCcpXG4gICAgICB0eXBlRnJvbUhlYWRlcnMgPSAncHVzaCdcbiAgICB9IGVsc2UgaWYgKGhhc0hlYWRlcih4aHIsIC9IWC1SZXBsYWNlLVVybDovaSkpIHtcbiAgICAgIHBhdGhGcm9tSGVhZGVycyA9IHhoci5nZXRSZXNwb25zZUhlYWRlcignSFgtUmVwbGFjZS1VcmwnKVxuICAgICAgdHlwZUZyb21IZWFkZXJzID0gJ3JlcGxhY2UnXG4gICAgfVxuXG4gICAgLy8gaWYgdGhlcmUgd2FzIGEgcmVzcG9uc2UgaGVhZGVyLCB0aGF0IGhhcyBwcmlvcml0eVxuICAgIGlmIChwYXRoRnJvbUhlYWRlcnMpIHtcbiAgICAgIGlmIChwYXRoRnJvbUhlYWRlcnMgPT09ICdmYWxzZScpIHtcbiAgICAgICAgcmV0dXJuIHt9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHR5cGU6IHR5cGVGcm9tSGVhZGVycyxcbiAgICAgICAgICBwYXRoOiBwYXRoRnJvbUhlYWRlcnNcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAvLyBOZXh0IHJlc29sdmUgdmlhIERPTSB2YWx1ZXNcbiAgICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgY29uc3QgcmVxdWVzdFBhdGggPSByZXNwb25zZUluZm8ucGF0aEluZm8uZmluYWxSZXF1ZXN0UGF0aFxuICAgIGNvbnN0IHJlc3BvbnNlUGF0aCA9IHJlc3BvbnNlSW5mby5wYXRoSW5mby5yZXNwb25zZVBhdGhcblxuICAgIGNvbnN0IHB1c2hVcmwgPSBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtcHVzaC11cmwnKVxuICAgIGNvbnN0IHJlcGxhY2VVcmwgPSBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtcmVwbGFjZS11cmwnKVxuICAgIGNvbnN0IGVsZW1lbnRJc0Jvb3N0ZWQgPSBnZXRJbnRlcm5hbERhdGEoZWx0KS5ib29zdGVkXG5cbiAgICBsZXQgc2F2ZVR5cGUgPSBudWxsXG4gICAgbGV0IHBhdGggPSBudWxsXG5cbiAgICBpZiAocHVzaFVybCkge1xuICAgICAgc2F2ZVR5cGUgPSAncHVzaCdcbiAgICAgIHBhdGggPSBwdXNoVXJsXG4gICAgfSBlbHNlIGlmIChyZXBsYWNlVXJsKSB7XG4gICAgICBzYXZlVHlwZSA9ICdyZXBsYWNlJ1xuICAgICAgcGF0aCA9IHJlcGxhY2VVcmxcbiAgICB9IGVsc2UgaWYgKGVsZW1lbnRJc0Jvb3N0ZWQpIHtcbiAgICAgIHNhdmVUeXBlID0gJ3B1c2gnXG4gICAgICBwYXRoID0gcmVzcG9uc2VQYXRoIHx8IHJlcXVlc3RQYXRoIC8vIGlmIHRoZXJlIGlzIG5vIHJlc3BvbnNlIHBhdGgsIGdvIHdpdGggdGhlIG9yaWdpbmFsIHJlcXVlc3QgcGF0aFxuICAgIH1cblxuICAgIGlmIChwYXRoKSB7XG4gICAgLy8gZmFsc2UgaW5kaWNhdGVzIG5vIHB1c2gsIHJldHVybiBlbXB0eSBvYmplY3RcbiAgICAgIGlmIChwYXRoID09PSAnZmFsc2UnKSB7XG4gICAgICAgIHJldHVybiB7fVxuICAgICAgfVxuXG4gICAgICAvLyB0cnVlIGluZGljYXRlcyB3ZSB3YW50IHRvIGZvbGxvdyB3aGVyZXZlciB0aGUgc2VydmVyIGVuZGVkIHVwIHNlbmRpbmcgdXNcbiAgICAgIGlmIChwYXRoID09PSAndHJ1ZScpIHtcbiAgICAgICAgcGF0aCA9IHJlc3BvbnNlUGF0aCB8fCByZXF1ZXN0UGF0aCAvLyBpZiB0aGVyZSBpcyBubyByZXNwb25zZSBwYXRoLCBnbyB3aXRoIHRoZSBvcmlnaW5hbCByZXF1ZXN0IHBhdGhcbiAgICAgIH1cblxuICAgICAgLy8gcmVzdG9yZSBhbnkgYW5jaG9yIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVxdWVzdFxuICAgICAgaWYgKHJlc3BvbnNlSW5mby5wYXRoSW5mby5hbmNob3IgJiYgcGF0aC5pbmRleE9mKCcjJykgPT09IC0xKSB7XG4gICAgICAgIHBhdGggPSBwYXRoICsgJyMnICsgcmVzcG9uc2VJbmZvLnBhdGhJbmZvLmFuY2hvclxuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiBzYXZlVHlwZSxcbiAgICAgICAgcGF0aFxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4ge31cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtIdG14UmVzcG9uc2VIYW5kbGluZ0NvbmZpZ30gcmVzcG9uc2VIYW5kbGluZ0NvbmZpZ1xuICAgKiBAcGFyYW0ge251bWJlcn0gc3RhdHVzXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBjb2RlTWF0Y2hlcyhyZXNwb25zZUhhbmRsaW5nQ29uZmlnLCBzdGF0dXMpIHtcbiAgICB2YXIgcmVnRXhwID0gbmV3IFJlZ0V4cChyZXNwb25zZUhhbmRsaW5nQ29uZmlnLmNvZGUpXG4gICAgcmV0dXJuIHJlZ0V4cC50ZXN0KHN0YXR1cy50b1N0cmluZygxMCkpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtYTUxIdHRwUmVxdWVzdH0geGhyXG4gICAqIEByZXR1cm4ge0h0bXhSZXNwb25zZUhhbmRsaW5nQ29uZmlnfVxuICAgKi9cbiAgZnVuY3Rpb24gcmVzb2x2ZVJlc3BvbnNlSGFuZGxpbmcoeGhyKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBodG14LmNvbmZpZy5yZXNwb25zZUhhbmRsaW5nLmxlbmd0aDsgaSsrKSB7XG4gICAgICAvKiogQHR5cGUgSHRteFJlc3BvbnNlSGFuZGxpbmdDb25maWcgKi9cbiAgICAgIHZhciByZXNwb25zZUhhbmRsaW5nRWxlbWVudCA9IGh0bXguY29uZmlnLnJlc3BvbnNlSGFuZGxpbmdbaV1cbiAgICAgIGlmIChjb2RlTWF0Y2hlcyhyZXNwb25zZUhhbmRsaW5nRWxlbWVudCwgeGhyLnN0YXR1cykpIHtcbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlSGFuZGxpbmdFbGVtZW50XG4gICAgICB9XG4gICAgfVxuICAgIC8vIG5vIG1hdGNoZXMsIHJldHVybiBubyBzd2FwXG4gICAgcmV0dXJuIHtcbiAgICAgIHN3YXA6IGZhbHNlXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0aXRsZVxuICAgKi9cbiAgZnVuY3Rpb24gaGFuZGxlVGl0bGUodGl0bGUpIHtcbiAgICBpZiAodGl0bGUpIHtcbiAgICAgIGNvbnN0IHRpdGxlRWx0ID0gZmluZCgndGl0bGUnKVxuICAgICAgaWYgKHRpdGxlRWx0KSB7XG4gICAgICAgIHRpdGxlRWx0LmlubmVySFRNTCA9IHRpdGxlXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB3aW5kb3cuZG9jdW1lbnQudGl0bGUgPSB0aXRsZVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge0h0bXhSZXNwb25zZUluZm99IHJlc3BvbnNlSW5mb1xuICAgKi9cbiAgZnVuY3Rpb24gaGFuZGxlQWpheFJlc3BvbnNlKGVsdCwgcmVzcG9uc2VJbmZvKSB7XG4gICAgY29uc3QgeGhyID0gcmVzcG9uc2VJbmZvLnhoclxuICAgIGxldCB0YXJnZXQgPSByZXNwb25zZUluZm8udGFyZ2V0XG4gICAgY29uc3QgZXRjID0gcmVzcG9uc2VJbmZvLmV0Y1xuICAgIGNvbnN0IHJlc3BvbnNlSW5mb1NlbGVjdCA9IHJlc3BvbnNlSW5mby5zZWxlY3RcblxuICAgIGlmICghdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6YmVmb3JlT25Mb2FkJywgcmVzcG9uc2VJbmZvKSkgcmV0dXJuXG5cbiAgICBpZiAoaGFzSGVhZGVyKHhociwgL0hYLVRyaWdnZXI6L2kpKSB7XG4gICAgICBoYW5kbGVUcmlnZ2VySGVhZGVyKHhociwgJ0hYLVRyaWdnZXInLCBlbHQpXG4gICAgfVxuXG4gICAgaWYgKGhhc0hlYWRlcih4aHIsIC9IWC1Mb2NhdGlvbjovaSkpIHtcbiAgICAgIHNhdmVDdXJyZW50UGFnZVRvSGlzdG9yeSgpXG4gICAgICBsZXQgcmVkaXJlY3RQYXRoID0geGhyLmdldFJlc3BvbnNlSGVhZGVyKCdIWC1Mb2NhdGlvbicpXG4gICAgICAvKiogQHR5cGUge0h0bXhBamF4SGVscGVyQ29udGV4dCZ7cGF0aDpzdHJpbmd9fSAqL1xuICAgICAgdmFyIHJlZGlyZWN0U3dhcFNwZWNcbiAgICAgIGlmIChyZWRpcmVjdFBhdGguaW5kZXhPZigneycpID09PSAwKSB7XG4gICAgICAgIHJlZGlyZWN0U3dhcFNwZWMgPSBwYXJzZUpTT04ocmVkaXJlY3RQYXRoKVxuICAgICAgICAvLyB3aGF0J3MgdGhlIGJlc3Qgd2F5IHRvIHRocm93IGFuIGVycm9yIGlmIHRoZSB1c2VyIGRpZG4ndCBpbmNsdWRlIHRoaXNcbiAgICAgICAgcmVkaXJlY3RQYXRoID0gcmVkaXJlY3RTd2FwU3BlYy5wYXRoXG4gICAgICAgIGRlbGV0ZSByZWRpcmVjdFN3YXBTcGVjLnBhdGhcbiAgICAgIH1cbiAgICAgIGFqYXhIZWxwZXIoJ2dldCcsIHJlZGlyZWN0UGF0aCwgcmVkaXJlY3RTd2FwU3BlYykudGhlbihmdW5jdGlvbigpIHtcbiAgICAgICAgcHVzaFVybEludG9IaXN0b3J5KHJlZGlyZWN0UGF0aClcbiAgICAgIH0pXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBzaG91bGRSZWZyZXNoID0gaGFzSGVhZGVyKHhociwgL0hYLVJlZnJlc2g6L2kpICYmIHhoci5nZXRSZXNwb25zZUhlYWRlcignSFgtUmVmcmVzaCcpID09PSAndHJ1ZSdcblxuICAgIGlmIChoYXNIZWFkZXIoeGhyLCAvSFgtUmVkaXJlY3Q6L2kpKSB7XG4gICAgICByZXNwb25zZUluZm8ua2VlcEluZGljYXRvcnMgPSB0cnVlXG4gICAgICBsb2NhdGlvbi5ocmVmID0geGhyLmdldFJlc3BvbnNlSGVhZGVyKCdIWC1SZWRpcmVjdCcpXG4gICAgICBzaG91bGRSZWZyZXNoICYmIGxvY2F0aW9uLnJlbG9hZCgpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAoc2hvdWxkUmVmcmVzaCkge1xuICAgICAgcmVzcG9uc2VJbmZvLmtlZXBJbmRpY2F0b3JzID0gdHJ1ZVxuICAgICAgbG9jYXRpb24ucmVsb2FkKClcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmIChoYXNIZWFkZXIoeGhyLCAvSFgtUmV0YXJnZXQ6L2kpKSB7XG4gICAgICBpZiAoeGhyLmdldFJlc3BvbnNlSGVhZGVyKCdIWC1SZXRhcmdldCcpID09PSAndGhpcycpIHtcbiAgICAgICAgcmVzcG9uc2VJbmZvLnRhcmdldCA9IGVsdFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzcG9uc2VJbmZvLnRhcmdldCA9IGFzRWxlbWVudChxdWVyeVNlbGVjdG9yRXh0KGVsdCwgeGhyLmdldFJlc3BvbnNlSGVhZGVyKCdIWC1SZXRhcmdldCcpKSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBoaXN0b3J5VXBkYXRlID0gZGV0ZXJtaW5lSGlzdG9yeVVwZGF0ZXMoZWx0LCByZXNwb25zZUluZm8pXG5cbiAgICBjb25zdCByZXNwb25zZUhhbmRsaW5nID0gcmVzb2x2ZVJlc3BvbnNlSGFuZGxpbmcoeGhyKVxuICAgIGNvbnN0IHNob3VsZFN3YXAgPSByZXNwb25zZUhhbmRsaW5nLnN3YXBcbiAgICBsZXQgaXNFcnJvciA9ICEhcmVzcG9uc2VIYW5kbGluZy5lcnJvclxuICAgIGxldCBpZ25vcmVUaXRsZSA9IGh0bXguY29uZmlnLmlnbm9yZVRpdGxlIHx8IHJlc3BvbnNlSGFuZGxpbmcuaWdub3JlVGl0bGVcbiAgICBsZXQgc2VsZWN0T3ZlcnJpZGUgPSByZXNwb25zZUhhbmRsaW5nLnNlbGVjdFxuICAgIGlmIChyZXNwb25zZUhhbmRsaW5nLnRhcmdldCkge1xuICAgICAgcmVzcG9uc2VJbmZvLnRhcmdldCA9IGFzRWxlbWVudChxdWVyeVNlbGVjdG9yRXh0KGVsdCwgcmVzcG9uc2VIYW5kbGluZy50YXJnZXQpKVxuICAgIH1cbiAgICB2YXIgc3dhcE92ZXJyaWRlID0gZXRjLnN3YXBPdmVycmlkZVxuICAgIGlmIChzd2FwT3ZlcnJpZGUgPT0gbnVsbCAmJiByZXNwb25zZUhhbmRsaW5nLnN3YXBPdmVycmlkZSkge1xuICAgICAgc3dhcE92ZXJyaWRlID0gcmVzcG9uc2VIYW5kbGluZy5zd2FwT3ZlcnJpZGVcbiAgICB9XG5cbiAgICAvLyByZXNwb25zZSBoZWFkZXJzIG92ZXJyaWRlIHJlc3BvbnNlIGhhbmRsaW5nIGNvbmZpZ1xuICAgIGlmIChoYXNIZWFkZXIoeGhyLCAvSFgtUmV0YXJnZXQ6L2kpKSB7XG4gICAgICBpZiAoeGhyLmdldFJlc3BvbnNlSGVhZGVyKCdIWC1SZXRhcmdldCcpID09PSAndGhpcycpIHtcbiAgICAgICAgcmVzcG9uc2VJbmZvLnRhcmdldCA9IGVsdFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzcG9uc2VJbmZvLnRhcmdldCA9IGFzRWxlbWVudChxdWVyeVNlbGVjdG9yRXh0KGVsdCwgeGhyLmdldFJlc3BvbnNlSGVhZGVyKCdIWC1SZXRhcmdldCcpKSlcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGhhc0hlYWRlcih4aHIsIC9IWC1SZXN3YXA6L2kpKSB7XG4gICAgICBzd2FwT3ZlcnJpZGUgPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVJlc3dhcCcpXG4gICAgfVxuXG4gICAgdmFyIHNlcnZlclJlc3BvbnNlID0geGhyLnJlc3BvbnNlXG4gICAgLyoqIEB0eXBlIEh0bXhCZWZvcmVTd2FwRGV0YWlscyAqL1xuICAgIHZhciBiZWZvcmVTd2FwRGV0YWlscyA9IG1lcmdlT2JqZWN0cyh7XG4gICAgICBzaG91bGRTd2FwLFxuICAgICAgc2VydmVyUmVzcG9uc2UsXG4gICAgICBpc0Vycm9yLFxuICAgICAgaWdub3JlVGl0bGUsXG4gICAgICBzZWxlY3RPdmVycmlkZVxuICAgIH0sIHJlc3BvbnNlSW5mbylcblxuICAgIGlmIChyZXNwb25zZUhhbmRsaW5nLmV2ZW50ICYmICF0cmlnZ2VyRXZlbnQodGFyZ2V0LCByZXNwb25zZUhhbmRsaW5nLmV2ZW50LCBiZWZvcmVTd2FwRGV0YWlscykpIHJldHVyblxuXG4gICAgaWYgKCF0cmlnZ2VyRXZlbnQodGFyZ2V0LCAnaHRteDpiZWZvcmVTd2FwJywgYmVmb3JlU3dhcERldGFpbHMpKSByZXR1cm5cblxuICAgIHRhcmdldCA9IGJlZm9yZVN3YXBEZXRhaWxzLnRhcmdldCAvLyBhbGxvdyByZS10YXJnZXRpbmdcbiAgICBzZXJ2ZXJSZXNwb25zZSA9IGJlZm9yZVN3YXBEZXRhaWxzLnNlcnZlclJlc3BvbnNlIC8vIGFsbG93IHVwZGF0aW5nIGNvbnRlbnRcbiAgICBpc0Vycm9yID0gYmVmb3JlU3dhcERldGFpbHMuaXNFcnJvciAvLyBhbGxvdyB1cGRhdGluZyBlcnJvclxuICAgIGlnbm9yZVRpdGxlID0gYmVmb3JlU3dhcERldGFpbHMuaWdub3JlVGl0bGUgLy8gYWxsb3cgdXBkYXRpbmcgaWdub3JpbmcgdGl0bGVcbiAgICBzZWxlY3RPdmVycmlkZSA9IGJlZm9yZVN3YXBEZXRhaWxzLnNlbGVjdE92ZXJyaWRlIC8vIGFsbG93IHVwZGF0aW5nIHNlbGVjdCBvdmVycmlkZVxuXG4gICAgcmVzcG9uc2VJbmZvLnRhcmdldCA9IHRhcmdldCAvLyBNYWtlIHVwZGF0ZWQgdGFyZ2V0IGF2YWlsYWJsZSB0byByZXNwb25zZSBldmVudHNcbiAgICByZXNwb25zZUluZm8uZmFpbGVkID0gaXNFcnJvciAvLyBNYWtlIGZhaWxlZCBwcm9wZXJ0eSBhdmFpbGFibGUgdG8gcmVzcG9uc2UgZXZlbnRzXG4gICAgcmVzcG9uc2VJbmZvLnN1Y2Nlc3NmdWwgPSAhaXNFcnJvciAvLyBNYWtlIHN1Y2Nlc3NmdWwgcHJvcGVydHkgYXZhaWxhYmxlIHRvIHJlc3BvbnNlIGV2ZW50c1xuXG4gICAgaWYgKGJlZm9yZVN3YXBEZXRhaWxzLnNob3VsZFN3YXApIHtcbiAgICAgIGlmICh4aHIuc3RhdHVzID09PSAyODYpIHtcbiAgICAgICAgY2FuY2VsUG9sbGluZyhlbHQpXG4gICAgICB9XG5cbiAgICAgIHdpdGhFeHRlbnNpb25zKGVsdCwgZnVuY3Rpb24oZXh0ZW5zaW9uKSB7XG4gICAgICAgIHNlcnZlclJlc3BvbnNlID0gZXh0ZW5zaW9uLnRyYW5zZm9ybVJlc3BvbnNlKHNlcnZlclJlc3BvbnNlLCB4aHIsIGVsdClcbiAgICAgIH0pXG5cbiAgICAgIC8vIFNhdmUgY3VycmVudCBwYWdlIGlmIHRoZXJlIHdpbGwgYmUgYSBoaXN0b3J5IHVwZGF0ZVxuICAgICAgaWYgKGhpc3RvcnlVcGRhdGUudHlwZSkge1xuICAgICAgICBzYXZlQ3VycmVudFBhZ2VUb0hpc3RvcnkoKVxuICAgICAgfVxuXG4gICAgICBpZiAoaGFzSGVhZGVyKHhociwgL0hYLVJlc3dhcDovaSkpIHtcbiAgICAgICAgc3dhcE92ZXJyaWRlID0geGhyLmdldFJlc3BvbnNlSGVhZGVyKCdIWC1SZXN3YXAnKVxuICAgICAgfVxuICAgICAgdmFyIHN3YXBTcGVjID0gZ2V0U3dhcFNwZWNpZmljYXRpb24oZWx0LCBzd2FwT3ZlcnJpZGUpXG5cbiAgICAgIGlmICghc3dhcFNwZWMuaGFzT3duUHJvcGVydHkoJ2lnbm9yZVRpdGxlJykpIHtcbiAgICAgICAgc3dhcFNwZWMuaWdub3JlVGl0bGUgPSBpZ25vcmVUaXRsZVxuICAgICAgfVxuXG4gICAgICB0YXJnZXQuY2xhc3NMaXN0LmFkZChodG14LmNvbmZpZy5zd2FwcGluZ0NsYXNzKVxuXG4gICAgICAvLyBvcHRpb25hbCB0cmFuc2l0aW9uIEFQSSBwcm9taXNlIGNhbGxiYWNrc1xuICAgICAgbGV0IHNldHRsZVJlc29sdmUgPSBudWxsXG4gICAgICBsZXQgc2V0dGxlUmVqZWN0ID0gbnVsbFxuXG4gICAgICBpZiAocmVzcG9uc2VJbmZvU2VsZWN0KSB7XG4gICAgICAgIHNlbGVjdE92ZXJyaWRlID0gcmVzcG9uc2VJbmZvU2VsZWN0XG4gICAgICB9XG5cbiAgICAgIGlmIChoYXNIZWFkZXIoeGhyLCAvSFgtUmVzZWxlY3Q6L2kpKSB7XG4gICAgICAgIHNlbGVjdE92ZXJyaWRlID0geGhyLmdldFJlc3BvbnNlSGVhZGVyKCdIWC1SZXNlbGVjdCcpXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHNlbGVjdE9PQiA9IGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC1zZWxlY3Qtb29iJylcbiAgICAgIGNvbnN0IHNlbGVjdCA9IGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC1zZWxlY3QnKVxuXG4gICAgICBsZXQgZG9Td2FwID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8gaWYgd2UgbmVlZCB0byBzYXZlIGhpc3RvcnksIGRvIHNvLCBiZWZvcmUgc3dhcHBpbmcgc28gdGhhdCByZWxhdGl2ZSByZXNvdXJjZXMgaGF2ZSB0aGUgY29ycmVjdCBiYXNlIFVSTFxuICAgICAgICAgIGlmIChoaXN0b3J5VXBkYXRlLnR5cGUpIHtcbiAgICAgICAgICAgIHRyaWdnZXJFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14OmJlZm9yZUhpc3RvcnlVcGRhdGUnLCBtZXJnZU9iamVjdHMoeyBoaXN0b3J5OiBoaXN0b3J5VXBkYXRlIH0sIHJlc3BvbnNlSW5mbykpXG4gICAgICAgICAgICBpZiAoaGlzdG9yeVVwZGF0ZS50eXBlID09PSAncHVzaCcpIHtcbiAgICAgICAgICAgICAgcHVzaFVybEludG9IaXN0b3J5KGhpc3RvcnlVcGRhdGUucGF0aClcbiAgICAgICAgICAgICAgdHJpZ2dlckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6cHVzaGVkSW50b0hpc3RvcnknLCB7IHBhdGg6IGhpc3RvcnlVcGRhdGUucGF0aCB9KVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmVwbGFjZVVybEluSGlzdG9yeShoaXN0b3J5VXBkYXRlLnBhdGgpXG4gICAgICAgICAgICAgIHRyaWdnZXJFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14OnJlcGxhY2VkSW5IaXN0b3J5JywgeyBwYXRoOiBoaXN0b3J5VXBkYXRlLnBhdGggfSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBzd2FwKHRhcmdldCwgc2VydmVyUmVzcG9uc2UsIHN3YXBTcGVjLCB7XG4gICAgICAgICAgICBzZWxlY3Q6IHNlbGVjdE92ZXJyaWRlIHx8IHNlbGVjdCxcbiAgICAgICAgICAgIHNlbGVjdE9PQixcbiAgICAgICAgICAgIGV2ZW50SW5mbzogcmVzcG9uc2VJbmZvLFxuICAgICAgICAgICAgYW5jaG9yOiByZXNwb25zZUluZm8ucGF0aEluZm8uYW5jaG9yLFxuICAgICAgICAgICAgY29udGV4dEVsZW1lbnQ6IGVsdCxcbiAgICAgICAgICAgIGFmdGVyU3dhcENhbGxiYWNrOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgaWYgKGhhc0hlYWRlcih4aHIsIC9IWC1UcmlnZ2VyLUFmdGVyLVN3YXA6L2kpKSB7XG4gICAgICAgICAgICAgICAgbGV0IGZpbmFsRWx0ID0gZWx0XG4gICAgICAgICAgICAgICAgaWYgKCFib2R5Q29udGFpbnMoZWx0KSkge1xuICAgICAgICAgICAgICAgICAgZmluYWxFbHQgPSBnZXREb2N1bWVudCgpLmJvZHlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaGFuZGxlVHJpZ2dlckhlYWRlcih4aHIsICdIWC1UcmlnZ2VyLUFmdGVyLVN3YXAnLCBmaW5hbEVsdClcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGFmdGVyU2V0dGxlQ2FsbGJhY2s6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICBpZiAoaGFzSGVhZGVyKHhociwgL0hYLVRyaWdnZXItQWZ0ZXItU2V0dGxlOi9pKSkge1xuICAgICAgICAgICAgICAgIGxldCBmaW5hbEVsdCA9IGVsdFxuICAgICAgICAgICAgICAgIGlmICghYm9keUNvbnRhaW5zKGVsdCkpIHtcbiAgICAgICAgICAgICAgICAgIGZpbmFsRWx0ID0gZ2V0RG9jdW1lbnQoKS5ib2R5XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGhhbmRsZVRyaWdnZXJIZWFkZXIoeGhyLCAnSFgtVHJpZ2dlci1BZnRlci1TZXR0bGUnLCBmaW5hbEVsdClcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBtYXliZUNhbGwoc2V0dGxlUmVzb2x2ZSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDpzd2FwRXJyb3InLCByZXNwb25zZUluZm8pXG4gICAgICAgICAgbWF5YmVDYWxsKHNldHRsZVJlamVjdClcbiAgICAgICAgICB0aHJvdyBlXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgbGV0IHNob3VsZFRyYW5zaXRpb24gPSBodG14LmNvbmZpZy5nbG9iYWxWaWV3VHJhbnNpdGlvbnNcbiAgICAgIGlmIChzd2FwU3BlYy5oYXNPd25Qcm9wZXJ0eSgndHJhbnNpdGlvbicpKSB7XG4gICAgICAgIHNob3VsZFRyYW5zaXRpb24gPSBzd2FwU3BlYy50cmFuc2l0aW9uXG4gICAgICB9XG5cbiAgICAgIGlmIChzaG91bGRUcmFuc2l0aW9uICYmXG4gICAgICAgICAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OmJlZm9yZVRyYW5zaXRpb24nLCByZXNwb25zZUluZm8pICYmXG4gICAgICAgICAgICAgIHR5cGVvZiBQcm9taXNlICE9PSAndW5kZWZpbmVkJyAmJlxuICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlIGV4cGVyaW1lbnRhbCBmZWF0dXJlIGF0bVxuICAgICAgICAgICAgICBkb2N1bWVudC5zdGFydFZpZXdUcmFuc2l0aW9uKSB7XG4gICAgICAgIGNvbnN0IHNldHRsZVByb21pc2UgPSBuZXcgUHJvbWlzZShmdW5jdGlvbihfcmVzb2x2ZSwgX3JlamVjdCkge1xuICAgICAgICAgIHNldHRsZVJlc29sdmUgPSBfcmVzb2x2ZVxuICAgICAgICAgIHNldHRsZVJlamVjdCA9IF9yZWplY3RcbiAgICAgICAgfSlcbiAgICAgICAgLy8gd3JhcCB0aGUgb3JpZ2luYWwgZG9Td2FwKCkgaW4gYSBjYWxsIHRvIHN0YXJ0Vmlld1RyYW5zaXRpb24oKVxuICAgICAgICBjb25zdCBpbm5lckRvU3dhcCA9IGRvU3dhcFxuICAgICAgICBkb1N3YXAgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAvLyBAdHMtaWdub3JlIGV4cGVyaW1lbnRhbCBmZWF0dXJlIGF0bVxuICAgICAgICAgIGRvY3VtZW50LnN0YXJ0Vmlld1RyYW5zaXRpb24oZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBpbm5lckRvU3dhcCgpXG4gICAgICAgICAgICByZXR1cm4gc2V0dGxlUHJvbWlzZVxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHN3YXBTcGVjLnN3YXBEZWxheSA+IDApIHtcbiAgICAgICAgZ2V0V2luZG93KCkuc2V0VGltZW91dChkb1N3YXAsIHN3YXBTcGVjLnN3YXBEZWxheSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRvU3dhcCgpXG4gICAgICB9XG4gICAgfVxuICAgIGlmIChpc0Vycm9yKSB7XG4gICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OnJlc3BvbnNlRXJyb3InLCBtZXJnZU9iamVjdHMoeyBlcnJvcjogJ1Jlc3BvbnNlIFN0YXR1cyBFcnJvciBDb2RlICcgKyB4aHIuc3RhdHVzICsgJyBmcm9tICcgKyByZXNwb25zZUluZm8ucGF0aEluZm8ucmVxdWVzdFBhdGggfSwgcmVzcG9uc2VJbmZvKSlcbiAgICB9XG4gIH1cblxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBFeHRlbnNpb25zIEFQSVxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKiBAdHlwZSB7T2JqZWN0PHN0cmluZywgSHRteEV4dGVuc2lvbj59ICovXG4gIGNvbnN0IGV4dGVuc2lvbnMgPSB7fVxuXG4gIC8qKlxuICAgKiBleHRlbnNpb25CYXNlIGRlZmluZXMgdGhlIGRlZmF1bHQgZnVuY3Rpb25zIGZvciBhbGwgZXh0ZW5zaW9ucy5cbiAgICogQHJldHVybnMge0h0bXhFeHRlbnNpb259XG4gICAqL1xuICBmdW5jdGlvbiBleHRlbnNpb25CYXNlKCkge1xuICAgIHJldHVybiB7XG4gICAgICBpbml0OiBmdW5jdGlvbihhcGkpIHsgcmV0dXJuIG51bGwgfSxcbiAgICAgIGdldFNlbGVjdG9yczogZnVuY3Rpb24oKSB7IHJldHVybiBudWxsIH0sXG4gICAgICBvbkV2ZW50OiBmdW5jdGlvbihuYW1lLCBldnQpIHsgcmV0dXJuIHRydWUgfSxcbiAgICAgIHRyYW5zZm9ybVJlc3BvbnNlOiBmdW5jdGlvbih0ZXh0LCB4aHIsIGVsdCkgeyByZXR1cm4gdGV4dCB9LFxuICAgICAgaXNJbmxpbmVTd2FwOiBmdW5jdGlvbihzd2FwU3R5bGUpIHsgcmV0dXJuIGZhbHNlIH0sXG4gICAgICBoYW5kbGVTd2FwOiBmdW5jdGlvbihzd2FwU3R5bGUsIHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pIHsgcmV0dXJuIGZhbHNlIH0sXG4gICAgICBlbmNvZGVQYXJhbWV0ZXJzOiBmdW5jdGlvbih4aHIsIHBhcmFtZXRlcnMsIGVsdCkgeyByZXR1cm4gbnVsbCB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIGRlZmluZUV4dGVuc2lvbiBpbml0aWFsaXplcyB0aGUgZXh0ZW5zaW9uIGFuZCBhZGRzIGl0IHRvIHRoZSBodG14IHJlZ2lzdHJ5XG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI2RlZmluZUV4dGVuc2lvblxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSB0aGUgZXh0ZW5zaW9uIG5hbWVcbiAgICogQHBhcmFtIHtIdG14RXh0ZW5zaW9ufSBleHRlbnNpb24gdGhlIGV4dGVuc2lvbiBkZWZpbml0aW9uXG4gICAqL1xuICBmdW5jdGlvbiBkZWZpbmVFeHRlbnNpb24obmFtZSwgZXh0ZW5zaW9uKSB7XG4gICAgaWYgKGV4dGVuc2lvbi5pbml0KSB7XG4gICAgICBleHRlbnNpb24uaW5pdChpbnRlcm5hbEFQSSlcbiAgICB9XG4gICAgZXh0ZW5zaW9uc1tuYW1lXSA9IG1lcmdlT2JqZWN0cyhleHRlbnNpb25CYXNlKCksIGV4dGVuc2lvbilcbiAgfVxuXG4gIC8qKlxuICAgKiByZW1vdmVFeHRlbnNpb24gcmVtb3ZlcyBhbiBleHRlbnNpb24gZnJvbSB0aGUgaHRteCByZWdpc3RyeVxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNyZW1vdmVFeHRlbnNpb25cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICovXG4gIGZ1bmN0aW9uIHJlbW92ZUV4dGVuc2lvbihuYW1lKSB7XG4gICAgZGVsZXRlIGV4dGVuc2lvbnNbbmFtZV1cbiAgfVxuXG4gIC8qKlxuICAgKiBnZXRFeHRlbnNpb25zIHNlYXJjaGVzIHVwIHRoZSBET00gdHJlZSB0byByZXR1cm4gYWxsIGV4dGVuc2lvbnMgdGhhdCBjYW4gYmUgYXBwbGllZCB0byBhIGdpdmVuIGVsZW1lbnRcbiAgICpcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtIdG14RXh0ZW5zaW9uW109fSBleHRlbnNpb25zVG9SZXR1cm5cbiAgICogQHBhcmFtIHtzdHJpbmdbXT19IGV4dGVuc2lvbnNUb0lnbm9yZVxuICAgKiBAcmV0dXJucyB7SHRteEV4dGVuc2lvbltdfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0RXh0ZW5zaW9ucyhlbHQsIGV4dGVuc2lvbnNUb1JldHVybiwgZXh0ZW5zaW9uc1RvSWdub3JlKSB7XG4gICAgaWYgKGV4dGVuc2lvbnNUb1JldHVybiA9PSB1bmRlZmluZWQpIHtcbiAgICAgIGV4dGVuc2lvbnNUb1JldHVybiA9IFtdXG4gICAgfVxuICAgIGlmIChlbHQgPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gZXh0ZW5zaW9uc1RvUmV0dXJuXG4gICAgfVxuICAgIGlmIChleHRlbnNpb25zVG9JZ25vcmUgPT0gdW5kZWZpbmVkKSB7XG4gICAgICBleHRlbnNpb25zVG9JZ25vcmUgPSBbXVxuICAgIH1cbiAgICBjb25zdCBleHRlbnNpb25zRm9yRWxlbWVudCA9IGdldEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LWV4dCcpXG4gICAgaWYgKGV4dGVuc2lvbnNGb3JFbGVtZW50KSB7XG4gICAgICBmb3JFYWNoKGV4dGVuc2lvbnNGb3JFbGVtZW50LnNwbGl0KCcsJyksIGZ1bmN0aW9uKGV4dGVuc2lvbk5hbWUpIHtcbiAgICAgICAgZXh0ZW5zaW9uTmFtZSA9IGV4dGVuc2lvbk5hbWUucmVwbGFjZSgvIC9nLCAnJylcbiAgICAgICAgaWYgKGV4dGVuc2lvbk5hbWUuc2xpY2UoMCwgNykgPT0gJ2lnbm9yZTonKSB7XG4gICAgICAgICAgZXh0ZW5zaW9uc1RvSWdub3JlLnB1c2goZXh0ZW5zaW9uTmFtZS5zbGljZSg3KSlcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBpZiAoZXh0ZW5zaW9uc1RvSWdub3JlLmluZGV4T2YoZXh0ZW5zaW9uTmFtZSkgPCAwKSB7XG4gICAgICAgICAgY29uc3QgZXh0ZW5zaW9uID0gZXh0ZW5zaW9uc1tleHRlbnNpb25OYW1lXVxuICAgICAgICAgIGlmIChleHRlbnNpb24gJiYgZXh0ZW5zaW9uc1RvUmV0dXJuLmluZGV4T2YoZXh0ZW5zaW9uKSA8IDApIHtcbiAgICAgICAgICAgIGV4dGVuc2lvbnNUb1JldHVybi5wdXNoKGV4dGVuc2lvbilcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfVxuICAgIHJldHVybiBnZXRFeHRlbnNpb25zKGFzRWxlbWVudChwYXJlbnRFbHQoZWx0KSksIGV4dGVuc2lvbnNUb1JldHVybiwgZXh0ZW5zaW9uc1RvSWdub3JlKVxuICB9XG5cbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gSW5pdGlhbGl6YXRpb25cbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIGlzUmVhZHkgPSBmYWxzZVxuICBnZXREb2N1bWVudCgpLmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCBmdW5jdGlvbigpIHtcbiAgICBpc1JlYWR5ID0gdHJ1ZVxuICB9KVxuXG4gIC8qKlxuICAgKiBFeGVjdXRlIGEgZnVuY3Rpb24gbm93IGlmIERPTUNvbnRlbnRMb2FkZWQgaGFzIGZpcmVkLCBvdGhlcndpc2UgbGlzdGVuIGZvciBpdC5cbiAgICpcbiAgICogVGhpcyBmdW5jdGlvbiB1c2VzIGlzUmVhZHkgYmVjYXVzZSB0aGVyZSBpcyBubyByZWxpYWJsZSB3YXkgdG8gYXNrIHRoZSBicm93c2VyIHdoZXRoZXJcbiAgICogdGhlIERPTUNvbnRlbnRMb2FkZWQgZXZlbnQgaGFzIGFscmVhZHkgYmVlbiBmaXJlZDsgdGhlcmUncyBhIGdhcCBiZXR3ZWVuIERPTUNvbnRlbnRMb2FkZWRcbiAgICogZmlyaW5nIGFuZCByZWFkeXN0YXRlPWNvbXBsZXRlLlxuICAgKi9cbiAgZnVuY3Rpb24gcmVhZHkoZm4pIHtcbiAgICAvLyBDaGVja2luZyByZWFkeVN0YXRlIGhlcmUgaXMgYSBmYWlsc2FmZSBpbiBjYXNlIHRoZSBodG14IHNjcmlwdCB0YWcgZW50ZXJlZCB0aGUgRE9NIGJ5XG4gICAgLy8gc29tZSBtZWFucyBvdGhlciB0aGFuIHRoZSBpbml0aWFsIHBhZ2UgbG9hZC5cbiAgICBpZiAoaXNSZWFkeSB8fCBnZXREb2N1bWVudCgpLnJlYWR5U3RhdGUgPT09ICdjb21wbGV0ZScpIHtcbiAgICAgIGZuKClcbiAgICB9IGVsc2Uge1xuICAgICAgZ2V0RG9jdW1lbnQoKS5hZGRFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJywgZm4pXG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gaW5zZXJ0SW5kaWNhdG9yU3R5bGVzKCkge1xuICAgIGlmIChodG14LmNvbmZpZy5pbmNsdWRlSW5kaWNhdG9yU3R5bGVzICE9PSBmYWxzZSkge1xuICAgICAgY29uc3Qgbm9uY2VBdHRyaWJ1dGUgPSBodG14LmNvbmZpZy5pbmxpbmVTdHlsZU5vbmNlID8gYCBub25jZT1cIiR7aHRteC5jb25maWcuaW5saW5lU3R5bGVOb25jZX1cImAgOiAnJ1xuICAgICAgZ2V0RG9jdW1lbnQoKS5oZWFkLmluc2VydEFkamFjZW50SFRNTCgnYmVmb3JlZW5kJyxcbiAgICAgICAgJzxzdHlsZScgKyBub25jZUF0dHJpYnV0ZSArICc+XFxcbiAgICAgIC4nICsgaHRteC5jb25maWcuaW5kaWNhdG9yQ2xhc3MgKyAne29wYWNpdHk6MH1cXFxuICAgICAgLicgKyBodG14LmNvbmZpZy5yZXF1ZXN0Q2xhc3MgKyAnIC4nICsgaHRteC5jb25maWcuaW5kaWNhdG9yQ2xhc3MgKyAne29wYWNpdHk6MTsgdHJhbnNpdGlvbjogb3BhY2l0eSAyMDBtcyBlYXNlLWluO31cXFxuICAgICAgLicgKyBodG14LmNvbmZpZy5yZXF1ZXN0Q2xhc3MgKyAnLicgKyBodG14LmNvbmZpZy5pbmRpY2F0b3JDbGFzcyArICd7b3BhY2l0eToxOyB0cmFuc2l0aW9uOiBvcGFjaXR5IDIwMG1zIGVhc2UtaW47fVxcXG4gICAgICA8L3N0eWxlPicpXG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gZ2V0TWV0YUNvbmZpZygpIHtcbiAgICAvKiogQHR5cGUgSFRNTE1ldGFFbGVtZW50ICovXG4gICAgY29uc3QgZWxlbWVudCA9IGdldERvY3VtZW50KCkucXVlcnlTZWxlY3RvcignbWV0YVtuYW1lPVwiaHRteC1jb25maWdcIl0nKVxuICAgIGlmIChlbGVtZW50KSB7XG4gICAgICByZXR1cm4gcGFyc2VKU09OKGVsZW1lbnQuY29udGVudClcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBtZXJnZU1ldGFDb25maWcoKSB7XG4gICAgY29uc3QgbWV0YUNvbmZpZyA9IGdldE1ldGFDb25maWcoKVxuICAgIGlmIChtZXRhQ29uZmlnKSB7XG4gICAgICBodG14LmNvbmZpZyA9IG1lcmdlT2JqZWN0cyhodG14LmNvbmZpZywgbWV0YUNvbmZpZylcbiAgICB9XG4gIH1cblxuICAvLyBpbml0aWFsaXplIHRoZSBkb2N1bWVudFxuICByZWFkeShmdW5jdGlvbigpIHtcbiAgICBtZXJnZU1ldGFDb25maWcoKVxuICAgIGluc2VydEluZGljYXRvclN0eWxlcygpXG4gICAgbGV0IGJvZHkgPSBnZXREb2N1bWVudCgpLmJvZHlcbiAgICBwcm9jZXNzTm9kZShib2R5KVxuICAgIGNvbnN0IHJlc3RvcmVkRWx0cyA9IGdldERvY3VtZW50KCkucXVlcnlTZWxlY3RvckFsbChcbiAgICAgIFwiW2h4LXRyaWdnZXI9J3Jlc3RvcmVkJ10sW2RhdGEtaHgtdHJpZ2dlcj0ncmVzdG9yZWQnXVwiXG4gICAgKVxuICAgIGJvZHkuYWRkRXZlbnRMaXN0ZW5lcignaHRteDphYm9ydCcsIGZ1bmN0aW9uKGV2dCkge1xuICAgICAgY29uc3QgdGFyZ2V0ID0gZXZ0LnRhcmdldFxuICAgICAgY29uc3QgaW50ZXJuYWxEYXRhID0gZ2V0SW50ZXJuYWxEYXRhKHRhcmdldClcbiAgICAgIGlmIChpbnRlcm5hbERhdGEgJiYgaW50ZXJuYWxEYXRhLnhocikge1xuICAgICAgICBpbnRlcm5hbERhdGEueGhyLmFib3J0KClcbiAgICAgIH1cbiAgICB9KVxuICAgIC8qKiBAdHlwZSB7KGV2OiBQb3BTdGF0ZUV2ZW50KSA9PiBhbnl9ICovXG4gICAgY29uc3Qgb3JpZ2luYWxQb3BzdGF0ZSA9IHdpbmRvdy5vbnBvcHN0YXRlID8gd2luZG93Lm9ucG9wc3RhdGUuYmluZCh3aW5kb3cpIDogbnVsbFxuICAgIC8qKiBAdHlwZSB7KGV2OiBQb3BTdGF0ZUV2ZW50KSA9PiBhbnl9ICovXG4gICAgd2luZG93Lm9ucG9wc3RhdGUgPSBmdW5jdGlvbihldmVudCkge1xuICAgICAgaWYgKGV2ZW50LnN0YXRlICYmIGV2ZW50LnN0YXRlLmh0bXgpIHtcbiAgICAgICAgcmVzdG9yZUhpc3RvcnkoKVxuICAgICAgICBmb3JFYWNoKHJlc3RvcmVkRWx0cywgZnVuY3Rpb24oZWx0KSB7XG4gICAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6cmVzdG9yZWQnLCB7XG4gICAgICAgICAgICBkb2N1bWVudDogZ2V0RG9jdW1lbnQoKSxcbiAgICAgICAgICAgIHRyaWdnZXJFdmVudFxuICAgICAgICAgIH0pXG4gICAgICAgIH0pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAob3JpZ2luYWxQb3BzdGF0ZSkge1xuICAgICAgICAgIG9yaWdpbmFsUG9wc3RhdGUoZXZlbnQpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgZ2V0V2luZG93KCkuc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgIHRyaWdnZXJFdmVudChib2R5LCAnaHRteDpsb2FkJywge30pIC8vIGdpdmUgcmVhZHkgaGFuZGxlcnMgYSBjaGFuY2UgdG8gbG9hZCB1cCBiZWZvcmUgZmlyaW5nIHRoaXMgZXZlbnRcbiAgICAgIGJvZHkgPSBudWxsIC8vIGtpbGwgcmVmZXJlbmNlIGZvciBnY1xuICAgIH0sIDApXG4gIH0pXG5cbiAgcmV0dXJuIGh0bXhcbn0pKClcblxuLyoqIEB0eXBlZGVmIHsnZ2V0J3wnaGVhZCd8J3Bvc3QnfCdwdXQnfCdkZWxldGUnfCdjb25uZWN0J3wnb3B0aW9ucyd8J3RyYWNlJ3wncGF0Y2gnfSBIdHRwVmVyYiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFN3YXBPcHRpb25zXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3NlbGVjdF1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbc2VsZWN0T09CXVxuICogQHByb3BlcnR5IHsqfSBbZXZlbnRJbmZvXVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFthbmNob3JdXG4gKiBAcHJvcGVydHkge0VsZW1lbnR9IFtjb250ZXh0RWxlbWVudF1cbiAqIEBwcm9wZXJ0eSB7c3dhcENhbGxiYWNrfSBbYWZ0ZXJTd2FwQ2FsbGJhY2tdXG4gKiBAcHJvcGVydHkge3N3YXBDYWxsYmFja30gW2FmdGVyU2V0dGxlQ2FsbGJhY2tdXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgc3dhcENhbGxiYWNrXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7J2lubmVySFRNTCcgfCAnb3V0ZXJIVE1MJyB8ICdiZWZvcmViZWdpbicgfCAnYWZ0ZXJiZWdpbicgfCAnYmVmb3JlZW5kJyB8ICdhZnRlcmVuZCcgfCAnZGVsZXRlJyB8ICdub25lJyB8IHN0cmluZ30gSHRteFN3YXBTdHlsZVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgSHRteFN3YXBTcGVjaWZpY2F0aW9uXG4gKiBAcHJvcGVydHkge0h0bXhTd2FwU3R5bGV9IHN3YXBTdHlsZVxuICogQHByb3BlcnR5IHtudW1iZXJ9IHN3YXBEZWxheVxuICogQHByb3BlcnR5IHtudW1iZXJ9IHNldHRsZURlbGF5XG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFt0cmFuc2l0aW9uXVxuICogQHByb3BlcnR5IHtib29sZWFufSBbaWdub3JlVGl0bGVdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2hlYWRdXG4gKiBAcHJvcGVydHkgeyd0b3AnIHwgJ2JvdHRvbSd9IFtzY3JvbGxdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3Njcm9sbFRhcmdldF1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbc2hvd11cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbc2hvd1RhcmdldF1cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2ZvY3VzU2Nyb2xsXVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgeygodGhpczpOb2RlLCBldnQ6RXZlbnQpID0+IGJvb2xlYW4pICYge3NvdXJjZTogc3RyaW5nfX0gQ29uZGl0aW9uYWxGdW5jdGlvblxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gSHRteFRyaWdnZXJTcGVjaWZpY2F0aW9uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gdHJpZ2dlclxuICogQHByb3BlcnR5IHtudW1iZXJ9IFtwb2xsSW50ZXJ2YWxdXG4gKiBAcHJvcGVydHkge0NvbmRpdGlvbmFsRnVuY3Rpb259IFtldmVudEZpbHRlcl1cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2NoYW5nZWRdXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtvbmNlXVxuICogQHByb3BlcnR5IHtib29sZWFufSBbY29uc3VtZV1cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbZGVsYXldXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2Zyb21dXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3RhcmdldF1cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbdGhyb3R0bGVdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3F1ZXVlXVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtyb290XVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFt0aHJlc2hvbGRdXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7e2VsdDogRWxlbWVudCwgbWVzc2FnZTogc3RyaW5nLCB2YWxpZGl0eTogVmFsaWRpdHlTdGF0ZX19IEh0bXhFbGVtZW50VmFsaWRhdGlvbkVycm9yXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7UmVjb3JkPHN0cmluZywgc3RyaW5nPn0gSHRteEhlYWRlclNwZWNpZmljYXRpb25cbiAqIEBwcm9wZXJ0eSB7J3RydWUnfSBIWC1SZXF1ZXN0XG4gKiBAcHJvcGVydHkge3N0cmluZ3xudWxsfSBIWC1UcmlnZ2VyXG4gKiBAcHJvcGVydHkge3N0cmluZ3xudWxsfSBIWC1UcmlnZ2VyLU5hbWVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfG51bGx9IEhYLVRhcmdldFxuICogQHByb3BlcnR5IHtzdHJpbmd9IEhYLUN1cnJlbnQtVVJMXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW0hYLVByb21wdF1cbiAqIEBwcm9wZXJ0eSB7J3RydWUnfSBbSFgtQm9vc3RlZF1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbQ29udGVudC1UeXBlXVxuICogQHByb3BlcnR5IHsndHJ1ZSd9IFtIWC1IaXN0b3J5LVJlc3RvcmUtUmVxdWVzdF1cbiAqL1xuXG4vKiogQHR5cGVkZWYgSHRteEFqYXhIZWxwZXJDb250ZXh0XG4gKiBAcHJvcGVydHkge0VsZW1lbnR8c3RyaW5nfSBbc291cmNlXVxuICogQHByb3BlcnR5IHtFdmVudH0gW2V2ZW50XVxuICogQHByb3BlcnR5IHtIdG14QWpheEhhbmRsZXJ9IFtoYW5kbGVyXVxuICogQHByb3BlcnR5IHtFbGVtZW50fHN0cmluZ30gW3RhcmdldF1cbiAqIEBwcm9wZXJ0eSB7SHRteFN3YXBTdHlsZX0gW3N3YXBdXG4gKiBAcHJvcGVydHkge09iamVjdHxGb3JtRGF0YX0gW3ZhbHVlc11cbiAqIEBwcm9wZXJ0eSB7UmVjb3JkPHN0cmluZyxzdHJpbmc+fSBbaGVhZGVyc11cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbc2VsZWN0XVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gSHRteFJlcXVlc3RDb25maWdcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gYm9vc3RlZFxuICogQHByb3BlcnR5IHtib29sZWFufSB1c2VVcmxQYXJhbXNcbiAqIEBwcm9wZXJ0eSB7Rm9ybURhdGF9IGZvcm1EYXRhXG4gKiBAcHJvcGVydHkge09iamVjdH0gcGFyYW1ldGVycyBmb3JtRGF0YSBwcm94eVxuICogQHByb3BlcnR5IHtGb3JtRGF0YX0gdW5maWx0ZXJlZEZvcm1EYXRhXG4gKiBAcHJvcGVydHkge09iamVjdH0gdW5maWx0ZXJlZFBhcmFtZXRlcnMgdW5maWx0ZXJlZEZvcm1EYXRhIHByb3h5XG4gKiBAcHJvcGVydHkge0h0bXhIZWFkZXJTcGVjaWZpY2F0aW9ufSBoZWFkZXJzXG4gKiBAcHJvcGVydHkge0VsZW1lbnR9IHRhcmdldFxuICogQHByb3BlcnR5IHtIdHRwVmVyYn0gdmVyYlxuICogQHByb3BlcnR5IHtIdG14RWxlbWVudFZhbGlkYXRpb25FcnJvcltdfSBlcnJvcnNcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gd2l0aENyZWRlbnRpYWxzXG4gKiBAcHJvcGVydHkge251bWJlcn0gdGltZW91dFxuICogQHByb3BlcnR5IHtzdHJpbmd9IHBhdGhcbiAqIEBwcm9wZXJ0eSB7RXZlbnR9IHRyaWdnZXJpbmdFdmVudFxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gSHRteFJlc3BvbnNlSW5mb1xuICogQHByb3BlcnR5IHtYTUxIdHRwUmVxdWVzdH0geGhyXG4gKiBAcHJvcGVydHkge0VsZW1lbnR9IHRhcmdldFxuICogQHByb3BlcnR5IHtIdG14UmVxdWVzdENvbmZpZ30gcmVxdWVzdENvbmZpZ1xuICogQHByb3BlcnR5IHtIdG14QWpheEV0Y30gZXRjXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGJvb3N0ZWRcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBzZWxlY3RcbiAqIEBwcm9wZXJ0eSB7e3JlcXVlc3RQYXRoOiBzdHJpbmcsIGZpbmFsUmVxdWVzdFBhdGg6IHN0cmluZywgcmVzcG9uc2VQYXRoOiBzdHJpbmd8bnVsbCwgYW5jaG9yOiBzdHJpbmd9fSBwYXRoSW5mb1xuICogQHByb3BlcnR5IHtib29sZWFufSBbZmFpbGVkXVxuICogQHByb3BlcnR5IHtib29sZWFufSBbc3VjY2Vzc2Z1bF1cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2tlZXBJbmRpY2F0b3JzXVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gSHRteEFqYXhFdGNcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW3JldHVyblByb21pc2VdXG4gKiBAcHJvcGVydHkge0h0bXhBamF4SGFuZGxlcn0gW2hhbmRsZXJdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3NlbGVjdF1cbiAqIEBwcm9wZXJ0eSB7RWxlbWVudH0gW3RhcmdldE92ZXJyaWRlXVxuICogQHByb3BlcnR5IHtIdG14U3dhcFN0eWxlfSBbc3dhcE92ZXJyaWRlXVxuICogQHByb3BlcnR5IHtSZWNvcmQ8c3RyaW5nLHN0cmluZz59IFtoZWFkZXJzXVxuICogQHByb3BlcnR5IHtPYmplY3R8Rm9ybURhdGF9IFt2YWx1ZXNdXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtjcmVkZW50aWFsc11cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbdGltZW91dF1cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEh0bXhSZXNwb25zZUhhbmRsaW5nQ29uZmlnXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2NvZGVdXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHN3YXBcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2Vycm9yXVxuICogQHByb3BlcnR5IHtib29sZWFufSBbaWdub3JlVGl0bGVdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3NlbGVjdF1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbdGFyZ2V0XVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtzd2FwT3ZlcnJpZGVdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2V2ZW50XVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge0h0bXhSZXNwb25zZUluZm8gJiB7c2hvdWxkU3dhcDogYm9vbGVhbiwgc2VydmVyUmVzcG9uc2U6IGFueSwgaXNFcnJvcjogYm9vbGVhbiwgaWdub3JlVGl0bGU6IGJvb2xlYW4sIHNlbGVjdE92ZXJyaWRlOnN0cmluZ319IEh0bXhCZWZvcmVTd2FwRGV0YWlsc1xuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEh0bXhBamF4SGFuZGxlclxuICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAqIEBwYXJhbSB7SHRteFJlc3BvbnNlSW5mb30gcmVzcG9uc2VJbmZvXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7KCgpID0+IHZvaWQpfSBIdG14U2V0dGxlVGFza1xuICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gSHRteFNldHRsZUluZm9cbiAqIEBwcm9wZXJ0eSB7SHRteFNldHRsZVRhc2tbXX0gdGFza3NcbiAqIEBwcm9wZXJ0eSB7RWxlbWVudFtdfSBlbHRzXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3RpdGxlXVxuICovXG5cbi8qKlxuICogQHNlZSBodHRwczovL2dpdGh1Yi5jb20vYmlnc2t5c29mdHdhcmUvaHRteC1leHRlbnNpb25zL2Jsb2IvbWFpbi9SRUFETUUubWRcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEh0bXhFeHRlbnNpb25cbiAqIEBwcm9wZXJ0eSB7KGFwaTogYW55KSA9PiB2b2lkfSBpbml0XG4gKiBAcHJvcGVydHkgeyhuYW1lOiBzdHJpbmcsIGV2ZW50OiBFdmVudHxDdXN0b21FdmVudCkgPT4gYm9vbGVhbn0gb25FdmVudFxuICogQHByb3BlcnR5IHsodGV4dDogc3RyaW5nLCB4aHI6IFhNTEh0dHBSZXF1ZXN0LCBlbHQ6IEVsZW1lbnQpID0+IHN0cmluZ30gdHJhbnNmb3JtUmVzcG9uc2VcbiAqIEBwcm9wZXJ0eSB7KHN3YXBTdHlsZTogSHRteFN3YXBTdHlsZSkgPT4gYm9vbGVhbn0gaXNJbmxpbmVTd2FwXG4gKiBAcHJvcGVydHkgeyhzd2FwU3R5bGU6IEh0bXhTd2FwU3R5bGUsIHRhcmdldDogTm9kZSwgZnJhZ21lbnQ6IE5vZGUsIHNldHRsZUluZm86IEh0bXhTZXR0bGVJbmZvKSA9PiBib29sZWFufE5vZGVbXX0gaGFuZGxlU3dhcFxuICogQHByb3BlcnR5IHsoeGhyOiBYTUxIdHRwUmVxdWVzdCwgcGFyYW1ldGVyczogRm9ybURhdGEsIGVsdDogTm9kZSkgPT4gKnxzdHJpbmd8bnVsbH0gZW5jb2RlUGFyYW1ldGVyc1xuICogQHByb3BlcnR5IHsoKSA9PiBzdHJpbmdbXXxudWxsfSBnZXRTZWxlY3RvcnNcbiAqL1xuZXhwb3J0IGRlZmF1bHQgaHRteFxuIiwiaW1wb3J0IGh0bXggZnJvbSBcImh0bXgub3JnXCI7XG5cbmZ1bmN0aW9uIGRlcGVuZHNPbihwYXRoU3BlYzogYW55LCB1cmw6IHN0cmluZykge1xuICBpZiAocGF0aFNwZWMgPT09IFwiaWdub3JlXCIpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgY29uc3QgZGVwZW5kZW5jeVBhdGggPSBwYXRoU3BlYy5zcGxpdChcIi9cIik7XG4gIGNvbnN0IHVybFBhdGggPSB1cmwuc3BsaXQoXCIvXCIpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHVybFBhdGgubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBkZXBlbmRlbmN5RWxlbWVudCA9IGRlcGVuZGVuY3lQYXRoLnNoaWZ0KCk7XG4gICAgY29uc3QgcGF0aEVsZW1lbnQgPSB1cmxQYXRoW2ldO1xuICAgIGlmIChkZXBlbmRlbmN5RWxlbWVudCAhPT0gcGF0aEVsZW1lbnQgJiYgZGVwZW5kZW5jeUVsZW1lbnQgIT09IFwiKlwiKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChcbiAgICAgIGRlcGVuZGVuY3lQYXRoLmxlbmd0aCA9PT0gMCB8fFxuICAgICAgKGRlcGVuZGVuY3lQYXRoLmxlbmd0aCA9PT0gMSAmJiBkZXBlbmRlbmN5UGF0aFswXSA9PT0gXCJcIilcbiAgICApIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIHJlZnJlc2hQYXRoKHBhdGg6IHN0cmluZykge1xuICBjb25zdCBlbHRzV2l0aERlcHMgPSBodG14LmZpbmRBbGwoXCJbcGF0aC1kZXBzXVwiKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBlbHRzV2l0aERlcHMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBlbHQgPSBlbHRzV2l0aERlcHNbaV07XG4gICAgaWYgKGRlcGVuZHNPbihlbHQuZ2V0QXR0cmlidXRlKFwicGF0aC1kZXBzXCIpLCBwYXRoKSkge1xuICAgICAgaHRteC50cmlnZ2VyKGVsdCwgXCJwYXRoLWRlcHNcIiwgbnVsbCk7XG4gICAgfVxuICB9XG59XG5cbmh0bXguZGVmaW5lRXh0ZW5zaW9uKFwicGF0aC1kZXBzXCIsIHtcbiAgLy8gQHRzLWlnbm9yZVxuICBvbkV2ZW50OiBmdW5jdGlvbiAobmFtZSwgZXZ0KSB7XG4gICAgaWYgKCEoZXZ0IGluc3RhbmNlb2YgQ3VzdG9tRXZlbnQpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChuYW1lID09PSBcImh0bXg6YmVmb3JlT25Mb2FkXCIpIHtcbiAgICAgIGNvbnN0IGNvbmZpZyA9IGV2dC5kZXRhaWwucmVxdWVzdENvbmZpZztcbiAgICAgIC8vIG11dGF0aW5nIGNhbGxcbiAgICAgIGlmIChcbiAgICAgICAgY29uZmlnICYmXG4gICAgICAgIGNvbmZpZy52ZXJiICE9PSBcImdldFwiICYmXG4gICAgICAgIGV2dC50YXJnZXQgIT0gbnVsbCAmJlxuICAgICAgICBldnQudGFyZ2V0IGluc3RhbmNlb2YgRWxlbWVudCAmJlxuICAgICAgICBldnQudGFyZ2V0LmdldEF0dHJpYnV0ZShcInBhdGgtZGVwc1wiKSAhPT0gXCJpZ25vcmVcIlxuICAgICAgKSB7XG4gICAgICAgIHJlZnJlc2hQYXRoKGNvbmZpZy5wYXRoKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG59KTtcbiIsImltcG9ydCBodG14IGZyb20gXCJodG14Lm9yZ1wiO1xuXG5mdW5jdGlvbiBrZWJhYkV2ZW50TmFtZShzdHI6IHN0cmluZykge1xuICAgIHJldHVybiBzdHIucmVwbGFjZSgvKFthLXowLTldKShbQS1aXSkvZywgJyQxLSQyJykudG9Mb3dlckNhc2UoKVxufVxuXG5jb25zdCBpZ25vcmVkRXZlbnRzID0gWydodG14OmJlZm9yZVByb2Nlc3NOb2RlJywgJ2h0bXg6YWZ0ZXJQcm9jZXNzTm9kZScsICdodG14OmJlZm9yZVN3YXAnLCAnaHRteDphZnRlclN3YXAnLCAnaHRteDpiZWZvcmVPbkxvYWQnLCAnaHRteDphZnRlck9uTG9hZCcsICdodG14OmNvbmZpZ1JlcXVlc3QnLCAnaHRteDpjb25maWdSZXNwb25zZScsICdodG14OnJlc3BvbnNlRXJyb3InXTtcblxuZnVuY3Rpb24gbWFrZUV2ZW50KGV2ZW50TmFtZTogc3RyaW5nLCBkZXRhaWw6IGFueSkge1xuICAgIGxldCBldnRcbiAgICBpZiAod2luZG93LkN1c3RvbUV2ZW50ICYmIHR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgLy8gVE9ETzogYGNvbXBvc2VkOiB0cnVlYCBoZXJlIGlzIGEgaGFjayB0byBtYWtlIGdsb2JhbCBldmVudCBoYW5kbGVycyB3b3JrIHdpdGggZXZlbnRzIGluIHNoYWRvdyBET01cbiAgICAgICAgZXZ0ID0gbmV3IEN1c3RvbUV2ZW50KGV2ZW50TmFtZSwgeyBidWJibGVzOiBmYWxzZSwgY2FuY2VsYWJsZTogdHJ1ZSwgY29tcG9zZWQ6IHRydWUsIGRldGFpbCB9KVxuICAgIH0gZWxzZSB7XG4gICAgICAgIGV2dCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdDdXN0b21FdmVudCcpXG4gICAgICAgIGV2dC5pbml0Q3VzdG9tRXZlbnQoZXZlbnROYW1lLCB0cnVlLCB0cnVlLCBkZXRhaWwpXG4gICAgfVxuICAgIHJldHVybiBldnRcbn1cblxuZnVuY3Rpb24gdHJpZ2dlckNoaWxkcmVuKHRhcmdldDogSFRNTEVsZW1lbnQsIG5hbWU6IHN0cmluZywgZXZlbnQ6IEN1c3RvbUV2ZW50LCB0cmlnZ2VyZWQ6IFNldDxIVE1MRWxlbWVudD4pIHtcbiAgICBpZihpZ25vcmVkRXZlbnRzLmluY2x1ZGVzKG5hbWUpKSB7XG4gICAgICAgIHJldHVyblxuICAgIH1cbiAgICBpZiAodGFyZ2V0ICYmIHRhcmdldC5jaGlsZHJlbikge1xuICAgICAgICBBcnJheS5mcm9tKHRhcmdldC5jaGlsZHJlbikuZm9yRWFjaCgoZSkgPT4ge1xuICAgICAgICAgICAgY29uc3Qga2VoYWIgPSBrZWJhYkV2ZW50TmFtZShuYW1lKTtcbiAgICAgICAgICAgIGNvbnN0IGV2ZW50TmFtZSA9IGtlaGFiLnJlcGxhY2UoXCJodG14OlwiLCBcImh4LW9uOjpcIilcbiAgICAgICAgICAgIGlmICghdHJpZ2dlcmVkLmhhcyhlIGFzIEhUTUxFbGVtZW50KSkge1xuICAgICAgICAgICAgICAgIGlmKGUuaGFzQXR0cmlidXRlKGV2ZW50TmFtZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV3RXZlbnQgPSBtYWtlRXZlbnQoZXZlbnROYW1lLnJlcGxhY2UoXCJoeC1vbjo6XCIsIFwiaHRteDpcIiksIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLmV2ZW50LmRldGFpbCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldDogZSxcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgbmV3RXZlbnQuZGV0YWlsLm1ldGEgPSAndHJpZ2dlci1jaGlsZHJlbidcbiAgICAgICAgICAgICAgICAgICAgZS5kaXNwYXRjaEV2ZW50KG5ld0V2ZW50KVxuICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyZWQuYWRkKGUgYXMgSFRNTEVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoZS5jaGlsZHJlbikge1xuICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyQ2hpbGRyZW4oZSBhcyBIVE1MRWxlbWVudCwgbmFtZSwgZXZlbnQsIHRyaWdnZXJlZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG59XG5cblxuLy8gQHRzLWlnbm9yZVxuaHRteC5kZWZpbmVFeHRlbnNpb24oXCJ0cmlnZ2VyLWNoaWxkcmVuXCIsIHtcbiAgICBvbkV2ZW50OiAobmFtZSwgZXZ0OiBFdmVudCB8IEN1c3RvbUV2ZW50KSA9PiB7XG4gICAgICAgIGlmICghKGV2dCBpbnN0YW5jZW9mIEN1c3RvbUV2ZW50KSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmKGV2dC5kZXRhaWwubWV0YSA9PT0gJ3RyaWdnZXItY2hpbGRyZW4nKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdHJpZ2dlcmVkID0gbmV3IFNldDxIVE1MRWxlbWVudD4oKTtcbiAgICAgICAgY29uc3QgdGFyZ2V0ID0gZXZ0LnRhcmdldCBhcyBIVE1MRWxlbWVudCB8fCBldnQuZGV0YWlsLnRhcmdldCBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgdHJpZ2dlckNoaWxkcmVuKHRhcmdldCwgbmFtZSwgZXZ0LCB0cmlnZ2VyZWQpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9LFxufSk7XG4iLCJpbXBvcnQgaHRteCBmcm9tIFwiaHRteC5vcmdcIjtcblxuaHRteC5kZWZpbmVFeHRlbnNpb24oXCJkZWJ1Z1wiLCB7XG4gIC8vIEB0cy1pZ25vcmVcbiAgb25FdmVudDogZnVuY3Rpb24gKG5hbWUsIGV2dCkge1xuICAgIGlmIChjb25zb2xlLmRlYnVnKSB7XG4gICAgICBjb25zb2xlLmRlYnVnKG5hbWUsIGV2dCk7XG4gICAgfSBlbHNlIGlmIChjb25zb2xlKSB7XG4gICAgICBjb25zb2xlLmxvZyhcIkRFQlVHOlwiLCBuYW1lLCBldnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBub29wXG4gICAgfVxuICB9LFxufSk7XG4iLCJpbXBvcnQgaHRteCBmcm9tIFwiaHRteC5vcmdcIjtcbmNvbnN0IGNvbmZpZzogYW55ID0gaHRteC5jb25maWc7XG5cbi8qKiBAdHlwZSB7aW1wb3J0KFwiLi4vaHRteFwiKS5IdG14SW50ZXJuYWxBcGl9ICovXG5sZXQgYXBpOiBhbnk7XG5cbmNvbnN0IGF0dHJQcmVmaXggPSBcImh4LXRhcmdldC1cIjtcblxuLy8gSUUxMSBkb2Vzbid0IHN1cHBvcnQgc3RyaW5nLnN0YXJ0c1dpdGhcbmZ1bmN0aW9uIHN0YXJ0c1dpdGgoc3RyOiBzdHJpbmcsIHByZWZpeDogc3RyaW5nKSB7XG4gIHJldHVybiBzdHIuc3Vic3RyaW5nKDAsIHByZWZpeC5sZW5ndGgpID09PSBwcmVmaXg7XG59XG5cbi8qKlxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWx0XG4gKiBAcGFyYW0gcmVzcENvZGVOdW1iZXJcbiAqIEByZXR1cm5zIHtIVE1MRWxlbWVudCB8IG51bGx9XG4gKi9cbmZ1bmN0aW9uIGdldFJlc3BDb2RlVGFyZ2V0KGVsdDogRWxlbWVudCwgcmVzcENvZGVOdW1iZXI6IG51bWJlcikge1xuICBpZiAoIWVsdCB8fCAhcmVzcENvZGVOdW1iZXIpIHJldHVybiBudWxsO1xuXG4gIGNvbnN0IHJlc3BDb2RlID0gcmVzcENvZGVOdW1iZXIudG9TdHJpbmcoKTtcblxuICAvLyAnKicgaXMgdGhlIG9yaWdpbmFsIHN5bnRheCwgYXMgdGhlIG9idmlvdXMgY2hhcmFjdGVyIGZvciBhIHdpbGRjYXJkLlxuICAvLyBUaGUgJ3gnIGFsdGVybmF0aXZlIHdhcyBhZGRlZCBmb3IgbWF4aW11bSBjb21wYXRpYmlsaXR5IHdpdGggSFRNTFxuICAvLyB0ZW1wbGF0aW5nIGVuZ2luZXMsIGR1ZSB0byBhbWJpZ3VpdHkgYXJvdW5kIHdoaWNoIGNoYXJhY3RlcnMgYXJlXG4gIC8vIHN1cHBvcnRlZCBpbiBIVE1MIGF0dHJpYnV0ZXMuXG4gIC8vXG4gIC8vIFN0YXJ0IHdpdGggdGhlIG1vc3Qgc3BlY2lmaWMgcG9zc2libGUgYXR0cmlidXRlIGFuZCBnZW5lcmFsaXplIGZyb21cbiAgLy8gdGhlcmUuXG4gIGNvbnN0IGF0dHJQb3NzaWJpbGl0aWVzID0gW1xuICAgIHJlc3BDb2RlLFxuXG4gICAgcmVzcENvZGUuc3Vic3RyKDAsIDIpICsgXCIqXCIsXG4gICAgcmVzcENvZGUuc3Vic3RyKDAsIDIpICsgXCJ4XCIsXG5cbiAgICByZXNwQ29kZS5zdWJzdHIoMCwgMSkgKyBcIipcIixcbiAgICByZXNwQ29kZS5zdWJzdHIoMCwgMSkgKyBcInhcIixcbiAgICByZXNwQ29kZS5zdWJzdHIoMCwgMSkgKyBcIioqXCIsXG4gICAgcmVzcENvZGUuc3Vic3RyKDAsIDEpICsgXCJ4eFwiLFxuXG4gICAgXCIqXCIsXG4gICAgXCJ4XCIsXG4gICAgXCIqKipcIixcbiAgICBcInh4eFwiLFxuICBdO1xuICBpZiAoc3RhcnRzV2l0aChyZXNwQ29kZSwgXCI0XCIpIHx8IHN0YXJ0c1dpdGgocmVzcENvZGUsIFwiNVwiKSkge1xuICAgIGF0dHJQb3NzaWJpbGl0aWVzLnB1c2goXCJlcnJvclwiKTtcbiAgfVxuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgYXR0clBvc3NpYmlsaXRpZXMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBhdHRyID0gYXR0clByZWZpeCArIGF0dHJQb3NzaWJpbGl0aWVzW2ldO1xuICAgIGNvbnN0IGF0dHJWYWx1ZSA9IGFwaS5nZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCBhdHRyKTtcbiAgICBpZiAoYXR0clZhbHVlKSB7XG4gICAgICBpZiAoYXR0clZhbHVlID09PSBcInRoaXNcIikge1xuICAgICAgICByZXR1cm4gYXBpLmZpbmRUaGlzRWxlbWVudChlbHQsIGF0dHIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGFwaS5xdWVyeVNlbGVjdG9yRXh0KGVsdCwgYXR0clZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuLyoqIEBwYXJhbSB7RXZlbnR9IGV2dCAqL1xuZnVuY3Rpb24gaGFuZGxlRXJyb3JGbGFnKGV2dDogQ3VzdG9tRXZlbnQpIHtcbiAgaWYgKGV2dC5kZXRhaWwuaXNFcnJvcikge1xuICAgIGlmIChjb25maWcucmVzcG9uc2VUYXJnZXRVbnNldHNFcnJvcikge1xuICAgICAgZXZ0LmRldGFpbC5pc0Vycm9yID0gZmFsc2U7XG4gICAgfVxuICB9IGVsc2UgaWYgKGNvbmZpZy5yZXNwb25zZVRhcmdldFNldHNFcnJvcikge1xuICAgIGV2dC5kZXRhaWwuaXNFcnJvciA9IHRydWU7XG4gIH1cbn1cblxuaHRteC5kZWZpbmVFeHRlbnNpb24oXCJyZXNwb25zZS10YXJnZXRzXCIsIHtcbiAgLy8gQHRzLWlnbm9yZVxuICBpbml0OiAoYXBpUmVmKSA9PiB7XG4gICAgYXBpID0gYXBpUmVmO1xuXG4gICAgaWYgKGNvbmZpZy5yZXNwb25zZVRhcmdldFVuc2V0c0Vycm9yID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbmZpZy5yZXNwb25zZVRhcmdldFVuc2V0c0Vycm9yID0gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5yZXNwb25zZVRhcmdldFNldHNFcnJvciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25maWcucmVzcG9uc2VUYXJnZXRTZXRzRXJyb3IgPSBmYWxzZTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5yZXNwb25zZVRhcmdldFByZWZlcnNFeGlzdGluZyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25maWcucmVzcG9uc2VUYXJnZXRQcmVmZXJzRXhpc3RpbmcgPSBmYWxzZTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5yZXNwb25zZVRhcmdldFByZWZlcnNSZXRhcmdldEhlYWRlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25maWcucmVzcG9uc2VUYXJnZXRQcmVmZXJzUmV0YXJnZXRIZWFkZXIgPSB0cnVlO1xuICAgIH1cbiAgfSxcblxuICAvLyBAdHMtaWdub3JlXG4gIG9uRXZlbnQ6IChuYW1lLCBldnQpID0+IHtcbiAgICBpZiAoIShldnQgaW5zdGFuY2VvZiBDdXN0b21FdmVudCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgbmFtZSA9PT0gXCJodG14OmJlZm9yZVN3YXBcIiAmJlxuICAgICAgZXZ0LmRldGFpbC54aHIgJiZcbiAgICAgIGV2dC5kZXRhaWwueGhyLnN0YXR1cyAhPT0gMjAwXG4gICAgKSB7XG4gICAgICBpZiAoZXZ0LmRldGFpbC50YXJnZXQpIHtcbiAgICAgICAgaWYgKGNvbmZpZy5yZXNwb25zZVRhcmdldFByZWZlcnNFeGlzdGluZykge1xuICAgICAgICAgIGV2dC5kZXRhaWwuc2hvdWxkU3dhcCA9IHRydWU7XG4gICAgICAgICAgaGFuZGxlRXJyb3JGbGFnKGV2dCk7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFxuICAgICAgICAgIGNvbmZpZy5yZXNwb25zZVRhcmdldFByZWZlcnNSZXRhcmdldEhlYWRlciAmJlxuICAgICAgICAgIGV2dC5kZXRhaWwueGhyLmdldEFsbFJlc3BvbnNlSGVhZGVycygpLm1hdGNoKC9IWC1SZXRhcmdldDovaSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgZXZ0LmRldGFpbC5zaG91bGRTd2FwID0gdHJ1ZTtcbiAgICAgICAgICBoYW5kbGVFcnJvckZsYWcoZXZ0KTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKCFldnQuZGV0YWlsLnJlcXVlc3RDb25maWcpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICBjb25zdCB0YXJnZXQgPSBnZXRSZXNwQ29kZVRhcmdldChcbiAgICAgICAgZXZ0LmRldGFpbC5yZXF1ZXN0Q29uZmlnLmVsdCxcbiAgICAgICAgZXZ0LmRldGFpbC54aHIuc3RhdHVzLFxuICAgICAgKTtcbiAgICAgIGlmICh0YXJnZXQpIHtcbiAgICAgICAgaGFuZGxlRXJyb3JGbGFnKGV2dCk7XG4gICAgICAgIGV2dC5kZXRhaWwuc2hvdWxkU3dhcCA9IHRydWU7XG4gICAgICAgIGV2dC5kZXRhaWwudGFyZ2V0ID0gdGFyZ2V0O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9LFxufSk7XG4iLCJpbXBvcnQgaHRteCBmcm9tIFwiaHRteC5vcmdcIjtcblxuaHRteC5kZWZpbmVFeHRlbnNpb24oXCJtdXRhdGlvbi1lcnJvclwiLCB7XG4gIC8vIEB0cy1pZ25vcmVcbiAgb25FdmVudDogKG5hbWUsIGV2dCkgPT4ge1xuICAgIGlmICghKGV2dCBpbnN0YW5jZW9mIEN1c3RvbUV2ZW50KSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAobmFtZSA9PT0gXCJodG14OmFmdGVyUmVxdWVzdFwiKSB7XG4gICAgICBpZiAoIWV2dC5kZXRhaWwgfHwgIWV2dC5kZXRhaWwueGhyKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHN0YXR1cyA9IGV2dC5kZXRhaWwueGhyLnN0YXR1cztcbiAgICAgIGlmIChzdGF0dXMgPj0gNDAwKSB7XG4gICAgICAgIGh0bXguZmluZEFsbChcIltoeC1vblxcXFw6XFxcXDptdXRhdGlvbi1lcnJvcl1cIikuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgICAgIGh0bXgudHJpZ2dlcihlbGVtZW50LCBcImh0bXg6bXV0YXRpb24tZXJyb3JcIiwgeyBzdGF0dXMgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfSxcbn0pO1xuIiwiaW1wb3J0IGh0bXggZnJvbSBcImh0bXgub3JnXCI7XG5cbmxldCBsYXN0VmVyc2lvbiA9IFwiXCI7XG5cbmh0bXguZGVmaW5lRXh0ZW5zaW9uKFwibGl2ZXJlbG9hZFwiLCB7XG4gICAgaW5pdDogZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIGxldCBlbmFibGVkID0gZmFsc2VcbiAgICAgICAgZm9yIChjb25zdCBlbGVtZW50IG9mIEFycmF5LmZyb20oaHRteC5maW5kQWxsKFwiW2h4LWV4dF1cIikpKSB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKFwiaHgtZXh0XCIpO1xuICAgICAgICAgICAgaWYodmFsdWU/LnNwbGl0KFwiIFwiKS5pbmNsdWRlcyhcImxpdmVyZWxvYWRcIikpIHtcbiAgICAgICAgICAgICAgICBlbmFibGVkID0gdHJ1ZVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYoIWVuYWJsZWQpIHtcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgY29uc29sZS5sb2coJ2xpdmVyZWxvYWQgZXh0ZW5zaW9uIGluaXRpYWxpemVkLicpO1xuICAgICAgICAvLyBDcmVhdGUgYSBuZXcgRXZlbnRTb3VyY2Ugb2JqZWN0IGFuZCBwb2ludCBpdCB0byB5b3VyIFNTRSBlbmRwb2ludFxuICAgICAgICBjb25zdCBldmVudFNvdXJjZSA9IG5ldyBFdmVudFNvdXJjZSgnL2Rldi9saXZlcmVsb2FkJyk7XG4gICAgICAgIC8vIExpc3RlbiBmb3IgbWVzc2FnZXMgZnJvbSB0aGUgc2VydmVyXG4gICAgICAgIGV2ZW50U291cmNlLm9ubWVzc2FnZSA9IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlID0gZXZlbnQuZGF0YVxuICAgICAgICAgICAgLy8gTG9nIHRoZSBtZXNzYWdlIGRhdGEgcmVjZWl2ZWQgZnJvbSB0aGUgc2VydmVyXG4gICAgICAgICAgICBpZihsYXN0VmVyc2lvbiA9PT0gXCJcIikge1xuICAgICAgICAgICAgICAgIGxhc3RWZXJzaW9uID0gbWVzc2FnZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmKGxhc3RWZXJzaW9uICE9PSBtZXNzYWdlKSB7XG4gICAgICAgICAgICAgICAgbGFzdFZlcnNpb24gPSBtZXNzYWdlO1xuICAgICAgICAgICAgICAgIHJlbG9hZCgpXG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIC8vIEhhbmRsZSBlcnJvcnMgKGUuZy4sIHdoZW4gdGhlIGNvbm5lY3Rpb24gaXMgY2xvc2VkKVxuICAgICAgICBldmVudFNvdXJjZS5vbmVycm9yID0gZnVuY3Rpb24oZXJyb3IpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0V2ZW50U291cmNlIGVycm9yOicsIGVycm9yKTtcbiAgICAgICAgfTtcblxuICAgIH0sXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIG9uRXZlbnQ6IGZ1bmN0aW9uIChuYW1lLCBldnQpIHtcblxuICAgIH0sXG59KTtcblxuZnVuY3Rpb24gcmVsb2FkKCkge1xuICAgIHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQoKVxufVxuIiwiaW1wb3J0IGh0bXggZnJvbSBcImh0bXgub3JnXCI7XG5cbmNvbnN0IGV2YWxGdW5jUmVnZXggPS9fX2V2YWxfW0EtWmEtejAtOV0rXFwoW2Etel0rXFwpL2dtXG5cbmh0bXguZGVmaW5lRXh0ZW5zaW9uKFwiaHRtZ29cIiwge1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBvbkV2ZW50OiBmdW5jdGlvbiAobmFtZSwgZXZ0KSB7XG4gICAgICAgaWYobmFtZSA9PT0gXCJodG14OmJlZm9yZUNsZWFudXBFbGVtZW50XCIgJiYgZXZ0LnRhcmdldCkge1xuICAgICAgICAgICByZW1vdmVBc3NvY2lhdGVkU2NyaXB0cyhldnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50KTtcbiAgICAgICB9XG4gICAgfSxcbn0pO1xuXG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlQXNzb2NpYXRlZFNjcmlwdHMoZWxlbWVudDogSFRNTEVsZW1lbnQpIHtcbiAgIGNvbnN0IGF0dHJpYnV0ZXMgPSBBcnJheS5mcm9tKGVsZW1lbnQuYXR0cmlidXRlcylcbiAgICBmb3IgKGxldCBhdHRyaWJ1dGUgb2YgYXR0cmlidXRlcykge1xuICAgICAgIGNvbnN0IG1hdGNoZXMgPSBhdHRyaWJ1dGUudmFsdWUubWF0Y2goZXZhbEZ1bmNSZWdleCkgfHwgW11cbiAgICAgICAgZm9yIChsZXQgbWF0Y2ggb2YgbWF0Y2hlcykge1xuICAgICAgICAgICAgY29uc3QgaWQgPSBtYXRjaC5yZXBsYWNlKFwiKClcIiwgXCJcIikucmVwbGFjZShcIih0aGlzKVwiLCBcIlwiKS5yZXBsYWNlKFwiO1wiLCBcIlwiKVxuICAgICAgICAgICAgY29uc3QgZWxlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpXG4gICAgICAgICAgICBpZihlbGUgJiYgZWxlLnRhZ05hbWUgPT09IFwiU0NSSVBUXCIpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmRlYnVnKFwicmVtb3ZpbmcgYXNzb2NpYXRlZCBzY3JpcHQgd2l0aCBpZFwiLCBpZClcbiAgICAgICAgICAgICAgICBlbGUucmVtb3ZlKClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cbiIsImltcG9ydCBodG14IGZyb20gJ2h0bXgub3JnJ1xuaW1wb3J0IHtyZW1vdmVBc3NvY2lhdGVkU2NyaXB0c30gZnJvbSBcIi4vaHRtZ29cIjtcblxubGV0IGFwaSA6IGFueSA9IG51bGw7XG5sZXQgcHJvY2Vzc2VkID0gbmV3IFNldDxzdHJpbmc+KClcblxuaHRteC5kZWZpbmVFeHRlbnNpb24oXCJzc2VcIiwge1xuICAgIGluaXQ6IGZ1bmN0aW9uIChhcGlSZWYpIHtcbiAgICAgICAgYXBpID0gYXBpUmVmO1xuICAgIH0sXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIG9uRXZlbnQ6IGZ1bmN0aW9uIChuYW1lLCBldnQpIHtcbiAgICAgICAgY29uc3QgdGFyZ2V0ID0gZXZ0LnRhcmdldDtcbiAgICAgICAgaWYoISh0YXJnZXQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkpIHtcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgaWYobmFtZSA9PT0gJ2h0bXg6YmVmb3JlQ2xlYW51cEVsZW1lbnQnKSB7XG4gICAgICAgICAgICByZW1vdmVBc3NvY2lhdGVkU2NyaXB0cyh0YXJnZXQpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYobmFtZSA9PT0gJ2h0bXg6YmVmb3JlUHJvY2Vzc05vZGUnKSB7XG4gICAgICAgICAgICBjb25zdCBlbGVtZW50cyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tzc2UtY29ubmVjdF0nKTtcbiAgICAgICAgICAgIGZvciAobGV0IGVsZW1lbnQgb2YgQXJyYXkuZnJvbShlbGVtZW50cykpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB1cmwgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShcInNzZS1jb25uZWN0XCIpITtcbiAgICAgICAgICAgICAgICBpZih1cmwgJiYgIXByb2Nlc3NlZC5oYXModXJsKSkge1xuICAgICAgICAgICAgICAgICAgICBjb25uZWN0RXZlbnRTb3VyY2UoZWxlbWVudCwgdXJsKVxuICAgICAgICAgICAgICAgICAgICBwcm9jZXNzZWQuYWRkKHVybClcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59KVxuXG5mdW5jdGlvbiBjb25uZWN0RXZlbnRTb3VyY2UoZWxlOiBFbGVtZW50LCB1cmw6IHN0cmluZykge1xuICAgIGlmKCF1cmwpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGNvbnNvbGUuaW5mbygnQ29ubmVjdGluZyB0byBFdmVudFNvdXJjZScsIHVybClcbiAgICBjb25zdCBldmVudFNvdXJjZSA9IG5ldyBFdmVudFNvdXJjZSh1cmwpO1xuXG4gICAgZXZlbnRTb3VyY2UuYWRkRXZlbnRMaXN0ZW5lcihcImNsb3NlXCIsIGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICAgIGh0bXgudHJpZ2dlcihlbGUsIFwiaHRteDpzc2VDbG9zZVwiLCB7ZXZlbnQ6IGV2ZW50fSk7XG4gICAgfSlcblxuICAgIGV2ZW50U291cmNlLm9ub3BlbiA9IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICAgIGh0bXgudHJpZ2dlcihlbGUsIFwiaHRteDpzc2VPcGVuXCIsIHtldmVudDogZXZlbnR9KTtcbiAgICB9XG5cbiAgICBldmVudFNvdXJjZS5vbmVycm9yID0gZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgaHRteC50cmlnZ2VyKGVsZSwgXCJodG14OnNzZUVycm9yXCIsIHtldmVudDogZXZlbnR9KTtcbiAgICAgICAgaWYgKGV2ZW50U291cmNlLnJlYWR5U3RhdGUgPT0gRXZlbnRTb3VyY2UuQ0xPU0VEKSB7XG4gICAgICAgICAgICBodG14LnRyaWdnZXIoZWxlLCBcImh0bXg6c3NlQ2xvc2VcIiwge2V2ZW50OiBldmVudH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZXZlbnRTb3VyY2Uub25tZXNzYWdlID0gZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgY29uc3Qgc2V0dGxlSW5mbyA9IGFwaS5tYWtlU2V0dGxlSW5mbyhlbGUpO1xuICAgICAgICBodG14LnRyaWdnZXIoZWxlLCBcImh0bXg6c3NlQmVmb3JlTWVzc2FnZVwiLCB7ZXZlbnQ6IGV2ZW50fSk7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gZXZlbnQuZGF0YVxuICAgICAgICBjb25zdCBmcmFnbWVudCA9IGFwaS5tYWtlRnJhZ21lbnQocmVzcG9uc2UpIGFzIERvY3VtZW50RnJhZ21lbnQ7XG4gICAgICAgIGNvbnN0IGNoaWxkcmVuID0gQXJyYXkuZnJvbShmcmFnbWVudC5jaGlsZHJlbik7XG4gICAgICAgIGZvciAobGV0IGNoaWxkIG9mIGNoaWxkcmVuKSB7XG4gICAgICAgICAgICBhcGkub29iU3dhcChhcGkuZ2V0QXR0cmlidXRlVmFsdWUoY2hpbGQsICdoeC1zd2FwLW9vYicpIHx8ICd0cnVlJywgY2hpbGQsIHNldHRsZUluZm8pO1xuICAgICAgICAgICAgLy8gc3VwcG9ydCBodG1nbyBldmFsX18gc2NyaXB0c1xuICAgICAgICAgICAgaWYoY2hpbGQudGFnTmFtZSA9PT0gJ1NDUklQVCcgJiYgY2hpbGQuaWQuc3RhcnRzV2l0aChcIl9fZXZhbFwiKSkge1xuICAgICAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoY2hpbGQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGh0bXgudHJpZ2dlcihlbGUsIFwiaHRteDpzc2VBZnRlck1lc3NhZ2VcIiwge2V2ZW50OiBldmVudH0pO1xuICAgIH1cbn1cbiIsImltcG9ydCBodG14IGZyb20gXCJodG14Lm9yZ1wiO1xuaW1wb3J0IFwiLi9odG14ZXh0ZW5zaW9ucy9wYXRoZGVwc1wiO1xuaW1wb3J0IFwiLi9odG14ZXh0ZW5zaW9ucy90cmlnZ2VyLWNoaWxkcmVuXCI7XG5pbXBvcnQgXCIuL2h0bXhleHRlbnNpb25zL2RlYnVnXCI7XG5pbXBvcnQgXCIuL2h0bXhleHRlbnNpb25zL3Jlc3BvbnNlLXRhcmdldHNcIjtcbmltcG9ydCBcIi4vaHRteGV4dGVuc2lvbnMvbXV0YXRpb24tZXJyb3JcIjtcbmltcG9ydCBcIi4vaHRteGV4dGVuc2lvbnMvbGl2ZXJlbG9hZFwiXG5pbXBvcnQgXCIuL2h0bXhleHRlbnNpb25zL2h0bWdvXCI7XG5pbXBvcnQgXCIuL2h0bXhleHRlbnNpb25zL3NzZVwiXG5cbi8vIEB0cy1pZ25vcmVcbndpbmRvdy5odG14ID0gaHRteDtcblxuZnVuY3Rpb24gd2F0Y2hVcmwoY2FsbGJhY2s6IChvbGRVcmw6IHN0cmluZywgbmV3VXJsOiBzdHJpbmcpID0+IHZvaWQpIHtcbiAgbGV0IGxhc3RVcmwgPSB3aW5kb3cubG9jYXRpb24uaHJlZjtcbiAgc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgIGlmICh3aW5kb3cubG9jYXRpb24uaHJlZiAhPT0gbGFzdFVybCkge1xuICAgICAgY2FsbGJhY2sobGFzdFVybCwgd2luZG93LmxvY2F0aW9uLmhyZWYpO1xuICAgICAgbGFzdFVybCA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmO1xuICAgIH1cbiAgfSwgMTAwKTtcbn1cblxud2F0Y2hVcmwoKF8sIG5ld1VybCkgPT4ge1xuICBvblVybENoYW5nZShuZXdVcmwpO1xufSk7XG5cbmZ1bmN0aW9uIG9uVXJsQ2hhbmdlKG5ld1VybDogc3RyaW5nKSB7XG4gIGxldCB1cmwgPSBuZXcgVVJMKG5ld1VybCk7XG5cbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChcIltoeC10cmlnZ2VyXVwiKS5mb3JFYWNoKGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgY29uc3QgdHJpZ2dlcnMgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShcImh4LXRyaWdnZXJcIik7XG4gICAgaWYgKCF0cmlnZ2Vycykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBzcGxpdCA9IHRyaWdnZXJzLnNwbGl0KFwiLCBcIik7XG4gICAgaWYgKHNwbGl0LmZpbmQoKHMpID0+IHMgPT09IFwidXJsXCIpKSB7XG4gICAgICBodG14LnN3YXAoZWxlbWVudCwgXCJ1cmxcIiwge1xuICAgICAgICBzd2FwU3R5bGU6IFwib3V0ZXJIVE1MXCIsXG4gICAgICAgIHN3YXBEZWxheTogMCxcbiAgICAgICAgc2V0dGxlRGVsYXk6IDAsXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgZm9yIChsZXQgW2tleSwgdmFsdWVzXSBvZiB1cmwuc2VhcmNoUGFyYW1zKSB7XG4gICAgICAgIGxldCBldmVudE5hbWUgPSBcInFzOlwiICsga2V5O1xuICAgICAgICBpZiAodHJpZ2dlcnMuaW5jbHVkZXMoZXZlbnROYW1lKSkge1xuICAgICAgICAgIGNvbnNvbGUubG9nKFwidHJpZ2dlcmluZ1wiLCBldmVudE5hbWUpO1xuICAgICAgICAgIGh0bXgudHJpZ2dlcihlbGVtZW50LCBldmVudE5hbWUsIG51bGwpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9KTtcblxuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFwiW2h4LW1hdGNoLXFwXVwiKS5mb3JFYWNoKChlbCkgPT4ge1xuICAgIGxldCBoYXNNYXRjaCA9IGZhbHNlO1xuICAgIGZvciAobGV0IG5hbWUgb2YgZWwuZ2V0QXR0cmlidXRlTmFtZXMoKSkge1xuICAgICAgaWYgKG5hbWUuc3RhcnRzV2l0aChcImh4LW1hdGNoLXFwLW1hcHBpbmc6XCIpKSB7XG4gICAgICAgIGxldCBtYXRjaCA9IG5hbWUucmVwbGFjZShcImh4LW1hdGNoLXFwLW1hcHBpbmc6XCIsIFwiXCIpO1xuICAgICAgICBsZXQgdmFsdWUgPSB1cmwuc2VhcmNoUGFyYW1zLmdldChtYXRjaCk7XG4gICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgIGh0bXguc3dhcChlbCwgZWwuZ2V0QXR0cmlidXRlKG5hbWUpID8/IFwiXCIsIHtcbiAgICAgICAgICAgIHN3YXBTdHlsZTogXCJpbm5lckhUTUxcIixcbiAgICAgICAgICAgIHN3YXBEZWxheTogMCxcbiAgICAgICAgICAgIHNldHRsZURlbGF5OiAwLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGhhc01hdGNoID0gdHJ1ZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIWhhc01hdGNoKSB7XG4gICAgICBsZXQgZGVmYXVsdEtleSA9IGVsLmdldEF0dHJpYnV0ZShcImh4LW1hdGNoLXFwLWRlZmF1bHRcIik7XG4gICAgICBpZiAoZGVmYXVsdEtleSkge1xuICAgICAgICBodG14LnN3YXAoXG4gICAgICAgICAgZWwsXG4gICAgICAgICAgZWwuZ2V0QXR0cmlidXRlKFwiaHgtbWF0Y2gtcXAtbWFwcGluZzpcIiArIGRlZmF1bHRLZXkpID8/IFwiXCIsXG4gICAgICAgICAgeyBzd2FwU3R5bGU6IFwiaW5uZXJIVE1MXCIsIHN3YXBEZWxheTogMCwgc2V0dGxlRGVsYXk6IDAgfSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xufVxuIl19 \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL2pzL25vZGVfbW9kdWxlcy9odG14Lm9yZy9kaXN0L2h0bXguZXNtLmpzIiwiLi4vanMvaHRteGV4dGVuc2lvbnMvcGF0aGRlcHMudHMiLCIuLi9qcy9odG14ZXh0ZW5zaW9ucy90cmlnZ2VyLWNoaWxkcmVuLnRzIiwiLi4vanMvaHRteGV4dGVuc2lvbnMvZGVidWcudHMiLCIuLi9qcy9odG14ZXh0ZW5zaW9ucy9yZXNwb25zZS10YXJnZXRzLnRzIiwiLi4vanMvaHRteGV4dGVuc2lvbnMvbXV0YXRpb24tZXJyb3IudHMiLCIuLi9qcy9odG14ZXh0ZW5zaW9ucy9saXZlcmVsb2FkLnRzIiwiLi4vanMvaHRteGV4dGVuc2lvbnMvaHRtZ28udHMiLCIuLi9qcy9odG14ZXh0ZW5zaW9ucy9zc2UudHMiLCIuLi9qcy9odG1nby50cyJdLCJuYW1lcyI6WyJodG14IiwiZWx0IiwidHlwZSIsInZlcmIiLCJ0YWciLCJnbG9iYWwiLCJzdHIiLCJpbnRlcnZhbCIsIm5hbWUiLCJxdWFsaWZpZWROYW1lIiwicGFyZW50IiwiY29uZGl0aW9uIiwiaW5pdGlhbEVsZW1lbnQiLCJhbmNlc3RvciIsImF0dHJpYnV0ZU5hbWUiLCJhdHRyaWJ1dGVWYWx1ZSIsImRpc2luaGVyaXQiLCJpbmhlcml0IiwiY2xvc2VzdEF0dHIiLCJlIiwic2VsZWN0b3IiLCJtYXRjaGVzRnVuY3Rpb24iLCJtYXRjaCIsInJlc3AiLCJmcmFnbWVudCIsInNjcmlwdCIsIm5ld1NjcmlwdCIsImF0dHIiLCJyZXNwb25zZSIsInJlc3BvbnNlV2l0aE5vSGVhZCIsInN0YXJ0VGFnIiwiZG9jIiwidGl0bGVFbGVtZW50IiwiZnVuYyIsIm8iLCJkYXRhUHJvcCIsImRhdGEiLCJhcnIiLCJyZXR1cm5BcnIiLCJpIiwiZWwiLCJyZWN0IiwiZWxlbVRvcCIsImVsZW1Cb3R0b20iLCJyb290Tm9kZSIsInRyaWdnZXIiLCJvYmoxIiwib2JqMiIsImtleSIsImpTdHJpbmciLCJlcnJvciIsInRlc3QiLCJwYXRoIiwidXJsIiwiY2FsbGJhY2siLCJldnQiLCJldmVudCIsImVsdE9yU2VsZWN0b3IiLCJkZWxheSIsInZhbHVlIiwiY2xhenoiLCJub2RlIiwiY2hpbGQiLCJwcmVmaXgiLCJzdWZmaXgiLCJ0cmltbWVkU2VsZWN0b3IiLCJzdGFydCIsInJlc3VsdHMiLCJjb250ZXh0IiwiYXJnMSIsImFyZzIiLCJhcmczIiwiZXZlbnRBcmdzIiwiYXR0ck5hbWUiLCJhdHRyVGFyZ2V0IiwicmVzdWx0IiwiYXR0cmlidXRlIiwidGFyZ2V0U3RyIiwiYXR0cmlidXRlc1RvU2V0dGxlIiwibWVyZ2VUbyIsIm1lcmdlRnJvbSIsInN3YXBTdHlsZSIsInRhcmdldCIsImV4dGVuc2lvbnMiLCJleHRlbnNpb24iLCJvb2JWYWx1ZSIsIm9vYkVsZW1lbnQiLCJzZXR0bGVJbmZvIiwidGFyZ2V0cyIsIm9vYkVsZW1lbnRDbG9uZSIsImJlZm9yZVN3YXBEZXRhaWxzIiwicHJlc2VydmVkRWx0IiwiaWQiLCJvbGRFbHQiLCJwYXJlbnROb2RlIiwibmV3Tm9kZSIsIm5vcm1hbGl6ZWRJZCIsIm5vcm1hbGl6ZWRUYWciLCJwYXJlbnRFbHQiLCJvbGROb2RlIiwibmV3QXR0cmlidXRlcyIsImF1dG9mb2N1cyIsImF1dG9Gb2N1c2VkRWx0IiwiaW5zZXJ0QmVmb3JlIiwic3RyaW5nIiwiaGFzaCIsImNoYXIiLCJpbnRlcm5hbERhdGEiLCJoYW5kbGVySW5mbyIsImVsZW1lbnQiLCJpbmZvIiwibmV3RWx0IiwiZWx0QmVmb3JlTmV3Q29udGVudCIsImZpcnN0Q2hpbGQiLCJleHQiLCJuZXdFbGVtZW50cyIsImoiLCJvb2JFbHRzIiwiY29udGVudCIsInN3YXBTcGVjIiwic3dhcE9wdGlvbnMiLCJhY3RpdmVFbHQiLCJzZWxlY3Rpb25JbmZvIiwib29iU2VsZWN0VmFsdWVzIiwib29iU2VsZWN0VmFsdWUiLCJ0ZW1wbGF0ZSIsIm5ld0ZyYWdtZW50IiwibmV3QWN0aXZlRWx0IiwiZm9jdXNPcHRpb25zIiwiZG9TZXR0bGUiLCJ0YXNrIiwiYW5jaG9yVGFyZ2V0IiwieGhyIiwiaGVhZGVyIiwidHJpZ2dlckJvZHkiLCJ0cmlnZ2VycyIsImV2ZW50TmFtZSIsImRldGFpbCIsImV2ZW50TmFtZXMiLCJ0b2tlbnMiLCJwb3NpdGlvbiIsInN0YXJ0UG9zaXRpb24iLCJzdGFydENoYXIiLCJzeW1ib2wiLCJ0b2tlbiIsImxhc3QiLCJwYXJhbU5hbWUiLCJicmFja2V0Q291bnQiLCJjb25kaXRpb25hbFNvdXJjZSIsImNvbmRpdGlvbkZ1bmN0aW9uIiwiZXhwbGljaXRUcmlnZ2VyIiwiY2FjaGUiLCJ0cmlnZ2VyU3BlY3MiLCJpbml0aWFsTGVuZ3RoIiwiZXZlcnkiLCJldmVudEZpbHRlciIsInRyaWdnZXJTcGVjIiwiZnJvbV9hcmciLCJoYW5kbGVyIiwic3BlYyIsIm5vZGVEYXRhIiwicmF3QXR0cmlidXRlIiwic291cmNlIiwiZXhwbGljaXRDYW5jZWwiLCJlbGVtZW50RGF0YSIsImVsdHNUb0xpc3Rlbk9uIiwiZWx0VG9MaXN0ZW5PbiIsImVsdFRvTGlzdGVuT25EYXRhIiwiZXZlbnRMaXN0ZW5lciIsImV2ZW50RGF0YSIsImxvYWQiLCJleHBsaWNpdEFjdGlvbiIsIm9ic2VydmVyT3B0aW9ucyIsImVudHJpZXMiLCJhdHRyaWJ1dGVzIiwiZWxlbWVudHMiLCJpdGVyIiwiYm9vc3RlZFNlbGVjdG9yIiwiZXh0ZW5zaW9uU2VsZWN0b3JzIiwic2VsZWN0b3JzIiwicyIsImZvcm0iLCJjb2RlIiwibGlzdGVuZXIiLCJhZnRlck9uUG9zaXRpb24iLCJuZXh0Q2hhciIsInRvRG8iLCJtc2ciLCJldmVudFJlc3VsdCIsImtlYmFiTmFtZSIsImtlYmFiZWRFdmVudCIsInJvb3RFbHQiLCJpbm5lckhUTUwiLCJ0aXRsZSIsInNjcm9sbCIsImhpc3RvcnlDYWNoZSIsIm5ld0hpc3RvcnlJdGVtIiwiY2xhc3NOYW1lIiwiY2xvbmUiLCJkaXNhYmxlSGlzdG9yeUNhY2hlIiwidGFza3MiLCJyZXF1ZXN0IiwiZGV0YWlscyIsImhpc3RvcnlFbGVtZW50IiwiY2FjaGVkIiwiaW5kaWNhdG9ycyIsImljIiwiZGlzYWJsZWRFbHRzIiwiZGlzYWJsZWRFbGVtZW50IiwiZGlzYWJsZWQiLCJwcm9jZXNzZWQiLCJmb3JtRGF0YSIsInYiLCJ2YWx1ZXMiLCJlcnJvcnMiLCJ2YWxpZGF0ZSIsImlucHV0IiwicmVjZWl2ZXIiLCJkb25vciIsInByaW9yaXR5Rm9ybURhdGEiLCJidXR0b24iLCJpbmNsdWRlcyIsImRlc2NlbmRhbnQiLCJyZXR1cm5TdHIiLCJyZWFsVmFsdWUiLCJwcm9tcHQiLCJoZWFkZXJzIiwiaW5wdXRWYWx1ZXMiLCJwYXJhbXNWYWx1ZSIsIm5ld1ZhbHVlcyIsInN3YXBJbmZvT3ZlcnJpZGUiLCJzd2FwSW5mbyIsInNwbGl0Iiwic3BsaXRTcGVjIiwic2Nyb2xsVmFsIiwic2VsZWN0b3JWYWwiLCJzaG93VmFsIiwiZm9jdXNTY3JvbGxWYWwiLCJmaWx0ZXJlZFBhcmFtZXRlcnMiLCJlbmNvZGVkUGFyYW1ldGVycyIsImZpcnN0IiwiZXZhbEFzRGVmYXVsdCIsImV2YWx1YXRlVmFsdWUiLCJ2YXJzVmFsdWVzIiwidG9FdmFsIiwiZGVmYXVsdFZhbCIsImV4cHJlc3Npb25WYXJzIiwiaGVhZGVyVmFsdWUiLCJyZWdleHAiLCJyZXF1ZXN0Q29uZmlnIiwic2FtZUhvc3QiLCJvYmoiLCJhcnJheSIsImluZGV4IiwicHJvcCIsImV0YyIsImNvbmZpcm1lZCIsInJlc29sdmUiLCJyZWplY3QiLCJwcm9taXNlIiwiX3Jlc29sdmUiLCJfcmVqZWN0IiwicmVzcG9uc2VIYW5kbGVyIiwic2VsZWN0IiwiZWx0RGF0YSIsInN1Ym1pdHRlciIsImJ1dHRvblBhdGgiLCJidXR0b25WZXJiIiwiY29uZmlybVF1ZXN0aW9uIiwic2tpcENvbmZpcm1hdGlvbiIsInN5bmNFbHQiLCJzeW5jU3RyYXRlZ3kiLCJxdWV1ZVN0cmF0ZWd5IiwiYWJvcnRhYmxlIiwic3luY1N0cmluZ3MiLCJlbmRSZXF1ZXN0TG9jayIsInByb21wdFF1ZXN0aW9uIiwicHJvbXB0UmVzcG9uc2UiLCJyYXdGb3JtRGF0YSIsImFsbEZvcm1EYXRhIiwiZmlsdGVyZWRGb3JtRGF0YSIsInJlcXVlc3RBdHRyVmFsdWVzIiwiZWx0SXNCb29zdGVkIiwidXNlVXJsUGFyYW1zIiwic3BsaXRQYXRoIiwicGF0aE5vQW5jaG9yIiwiYW5jaG9yIiwiZmluYWxQYXRoIiwicmVzcG9uc2VJbmZvIiwiaGllcmFyY2h5IiwiZGlzYWJsZUVsdHMiLCJzZWNvbmRhcnlUcmlnZ2VyRWx0IiwicGFyZW50RWx0SW5IaWVyYXJjaHkiLCJwYXJhbXMiLCJwYXRoRnJvbUhlYWRlcnMiLCJ0eXBlRnJvbUhlYWRlcnMiLCJyZXF1ZXN0UGF0aCIsInJlc3BvbnNlUGF0aCIsInB1c2hVcmwiLCJyZXBsYWNlVXJsIiwiZWxlbWVudElzQm9vc3RlZCIsInNhdmVUeXBlIiwicmVzcG9uc2VIYW5kbGluZ0NvbmZpZyIsInN0YXR1cyIsInJlZ0V4cCIsInJlc3BvbnNlSGFuZGxpbmdFbGVtZW50IiwidGl0bGVFbHQiLCJyZXNwb25zZUluZm9TZWxlY3QiLCJyZWRpcmVjdFBhdGgiLCJyZWRpcmVjdFN3YXBTcGVjIiwic2hvdWxkUmVmcmVzaCIsImhpc3RvcnlVcGRhdGUiLCJyZXNwb25zZUhhbmRsaW5nIiwic2hvdWxkU3dhcCIsImlzRXJyb3IiLCJpZ25vcmVUaXRsZSIsInNlbGVjdE92ZXJyaWRlIiwic3dhcE92ZXJyaWRlIiwic2VydmVyUmVzcG9uc2UiLCJzZXR0bGVSZXNvbHZlIiwic2V0dGxlUmVqZWN0Iiwic2VsZWN0T09CIiwiZG9Td2FwIiwiZmluYWxFbHQiLCJzaG91bGRUcmFuc2l0aW9uIiwic2V0dGxlUHJvbWlzZSIsImlubmVyRG9Td2FwIiwiYXBpIiwidGV4dCIsInBhcmFtZXRlcnMiLCJleHRlbnNpb25zVG9SZXR1cm4iLCJleHRlbnNpb25zVG9JZ25vcmUiLCJleHRlbnNpb25zRm9yRWxlbWVudCIsImV4dGVuc2lvbk5hbWUiLCJmbiIsIm5vbmNlQXR0cmlidXRlIiwibWV0YUNvbmZpZyIsImJvZHkiLCJyZXN0b3JlZEVsdHMiLCJvcmlnaW5hbFBvcHN0YXRlIiwiaHRteF9lc21fZGVmYXVsdCIsImRlcGVuZHNPbiIsInBhdGhTcGVjIiwiZGVwZW5kZW5jeVBhdGgiLCJ1cmxQYXRoIiwiZGVwZW5kZW5jeUVsZW1lbnQiLCJwYXRoRWxlbWVudCIsInJlZnJlc2hQYXRoIiwiZWx0c1dpdGhEZXBzIiwiY29uZmlnIiwia2ViYWJFdmVudE5hbWUiLCJpZ25vcmVkRXZlbnRzIiwibWFrZUV2ZW50IiwidHJpZ2dlckNoaWxkcmVuIiwidHJpZ2dlcmVkIiwibmV3RXZlbnQiLCJhdHRyUHJlZml4Iiwic3RhcnRzV2l0aCIsImdldFJlc3BDb2RlVGFyZ2V0IiwicmVzcENvZGVOdW1iZXIiLCJyZXNwQ29kZSIsImF0dHJQb3NzaWJpbGl0aWVzIiwiYXR0clZhbHVlIiwiaGFuZGxlRXJyb3JGbGFnIiwiYXBpUmVmIiwibGFzdFZlcnNpb24iLCJlbmFibGVkIiwiZXZlbnRTb3VyY2UiLCJtZXNzYWdlIiwicmVsb2FkIiwiZXZhbEZ1bmNSZWdleCIsInJlbW92ZUFzc29jaWF0ZWRTY3JpcHRzIiwibWF0Y2hlcyIsImVsZSIsImNvbm5lY3RFdmVudFNvdXJjZSIsImNoaWxkcmVuIiwiaWdub3JlZCIsIndhdGNoVXJsIiwibGFzdFVybCIsIl8iLCJuZXdVcmwiLCJvblVybENoYW5nZSIsImhhc01hdGNoIiwiZGVmYXVsdEtleSJdLCJtYXBwaW5ncyI6IkFBQUEsSUFBSUEsRUFBQUEsQ0FBUSxVQUFXLENBSXJCLElBQU0sSUFBTyxDQUFBLENBSVgsT0FBUSxJQUVSLENBQUEsT0FBQSxDQUFTLEtBRVQsRUFBSSxDQUFBLElBQUEsQ0FFSixJQUFLLElBRUwsQ0FBQSxPQUFBLENBQVMsS0FFVCxJQUFNLENBQUEsSUFBQSxDQUdOLEtBQU0sSUFFTixDQUFBLE9BQUEsQ0FBUyxLQUVULE9BQVMsQ0FBQSxJQUFBLENBVVQsT0FBUSxTQUFTQyxDQUFBQSxDQUFLQyxFQUFNLENBRTFCLE9BRG9CLGVBQWVELENBQUtDLENBQUFBLENBQUFBLEVBQVEs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RSxDQUN6RCxFQUVKLENBQ0YsQ0FBQyxFQUNIIiwiZmlsZSI6Imh0bWdvLmpzIiwic291cmNlc0NvbnRlbnQiOlsidmFyIGh0bXggPSAoZnVuY3Rpb24oKSB7XG4gICd1c2Ugc3RyaWN0J1xuXG4gIC8vIFB1YmxpYyBBUElcbiAgY29uc3QgaHRteCA9IHtcbiAgICAvLyBUc2MgbWFkbmVzcyBoZXJlLCBhc3NpZ25pbmcgdGhlIGZ1bmN0aW9ucyBkaXJlY3RseSByZXN1bHRzIGluIGFuIGludmFsaWQgVHlwZVNjcmlwdCBvdXRwdXQsIGJ1dCByZWFzc2lnbmluZyBpcyBmaW5lXG4gICAgLyogRXZlbnQgcHJvY2Vzc2luZyAqL1xuICAgIC8qKiBAdHlwZSB7dHlwZW9mIG9uTG9hZEhlbHBlcn0gKi9cbiAgICBvbkxvYWQ6IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgcHJvY2Vzc05vZGV9ICovXG4gICAgcHJvY2VzczogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiBhZGRFdmVudExpc3RlbmVySW1wbH0gKi9cbiAgICBvbjogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiByZW1vdmVFdmVudExpc3RlbmVySW1wbH0gKi9cbiAgICBvZmY6IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgdHJpZ2dlckV2ZW50fSAqL1xuICAgIHRyaWdnZXI6IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgYWpheEhlbHBlcn0gKi9cbiAgICBhamF4OiBudWxsLFxuICAgIC8qIERPTSBxdWVyeWluZyBoZWxwZXJzICovXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgZmluZH0gKi9cbiAgICBmaW5kOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIGZpbmRBbGx9ICovXG4gICAgZmluZEFsbDogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiBjbG9zZXN0fSAqL1xuICAgIGNsb3Nlc3Q6IG51bGwsXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgaW5wdXQgdmFsdWVzIHRoYXQgd291bGQgcmVzb2x2ZSBmb3IgYSBnaXZlbiBlbGVtZW50IHZpYSB0aGUgaHRteCB2YWx1ZSByZXNvbHV0aW9uIG1lY2hhbmlzbVxuICAgICAqXG4gICAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jdmFsdWVzXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdCB0aGUgZWxlbWVudCB0byByZXNvbHZlIHZhbHVlcyBvblxuICAgICAqIEBwYXJhbSB7SHR0cFZlcmJ9IHR5cGUgdGhlIHJlcXVlc3QgdHlwZSAoZS5nLiAqKmdldCoqIG9yICoqcG9zdCoqKSBub24tR0VUJ3Mgd2lsbCBpbmNsdWRlIHRoZSBlbmNsb3NpbmcgZm9ybSBvZiB0aGUgZWxlbWVudC4gRGVmYXVsdHMgdG8gKipwb3N0KipcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fVxuICAgICAqL1xuICAgIHZhbHVlczogZnVuY3Rpb24oZWx0LCB0eXBlKSB7XG4gICAgICBjb25zdCBpbnB1dFZhbHVlcyA9IGdldElucHV0VmFsdWVzKGVsdCwgdHlwZSB8fCAncG9zdCcpXG4gICAgICByZXR1cm4gaW5wdXRWYWx1ZXMudmFsdWVzXG4gICAgfSxcbiAgICAvKiBET00gbWFuaXB1bGF0aW9uIGhlbHBlcnMgKi9cbiAgICAvKiogQHR5cGUge3R5cGVvZiByZW1vdmVFbGVtZW50fSAqL1xuICAgIHJlbW92ZTogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiBhZGRDbGFzc1RvRWxlbWVudH0gKi9cbiAgICBhZGRDbGFzczogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiByZW1vdmVDbGFzc0Zyb21FbGVtZW50fSAqL1xuICAgIHJlbW92ZUNsYXNzOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIHRvZ2dsZUNsYXNzT25FbGVtZW50fSAqL1xuICAgIHRvZ2dsZUNsYXNzOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIHRha2VDbGFzc0ZvckVsZW1lbnR9ICovXG4gICAgdGFrZUNsYXNzOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIHN3YXB9ICovXG4gICAgc3dhcDogbnVsbCxcbiAgICAvKiBFeHRlbnNpb24gZW50cnlwb2ludHMgKi9cbiAgICAvKiogQHR5cGUge3R5cGVvZiBkZWZpbmVFeHRlbnNpb259ICovXG4gICAgZGVmaW5lRXh0ZW5zaW9uOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIHJlbW92ZUV4dGVuc2lvbn0gKi9cbiAgICByZW1vdmVFeHRlbnNpb246IG51bGwsXG4gICAgLyogRGVidWdnaW5nICovXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgbG9nQWxsfSAqL1xuICAgIGxvZ0FsbDogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiBsb2dOb25lfSAqL1xuICAgIGxvZ05vbmU6IG51bGwsXG4gICAgLyogRGVidWdnaW5nICovXG4gICAgLyoqXG4gICAgICogVGhlIGxvZ2dlciBodG14IHVzZXMgdG8gbG9nIHdpdGhcbiAgICAgKlxuICAgICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI2xvZ2dlclxuICAgICAqL1xuICAgIGxvZ2dlcjogbnVsbCxcbiAgICAvKipcbiAgICAgKiBBIHByb3BlcnR5IGhvbGRpbmcgdGhlIGNvbmZpZ3VyYXRpb24gaHRteCB1c2VzIGF0IHJ1bnRpbWUuXG4gICAgICpcbiAgICAgKiBOb3RlIHRoYXQgdXNpbmcgYSBbbWV0YSB0YWddKGh0dHBzOi8vaHRteC5vcmcvZG9jcy8jY29uZmlnKSBpcyB0aGUgcHJlZmVycmVkIG1lY2hhbmlzbSBmb3Igc2V0dGluZyB0aGVzZSBwcm9wZXJ0aWVzLlxuICAgICAqXG4gICAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jY29uZmlnXG4gICAgICovXG4gICAgY29uZmlnOiB7XG4gICAgICAvKipcbiAgICAgICAqIFdoZXRoZXIgdG8gdXNlIGhpc3RvcnkuXG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCB0cnVlXG4gICAgICAgKi9cbiAgICAgIGhpc3RvcnlFbmFibGVkOiB0cnVlLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgbnVtYmVyIG9mIHBhZ2VzIHRvIGtlZXAgaW4gKipsb2NhbFN0b3JhZ2UqKiBmb3IgaGlzdG9yeSBzdXBwb3J0LlxuICAgICAgICogQHR5cGUgbnVtYmVyXG4gICAgICAgKiBAZGVmYXVsdCAxMFxuICAgICAgICovXG4gICAgICBoaXN0b3J5Q2FjaGVTaXplOiAxMCxcbiAgICAgIC8qKlxuICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgICAqL1xuICAgICAgcmVmcmVzaE9uSGlzdG9yeU1pc3M6IGZhbHNlLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgZGVmYXVsdCBzd2FwIHN0eWxlIHRvIHVzZSBpZiAqKltoeC1zd2FwXShodHRwczovL2h0bXgub3JnL2F0dHJpYnV0ZXMvaHgtc3dhcCkqKiBpcyBvbWl0dGVkLlxuICAgICAgICogQHR5cGUgSHRteFN3YXBTdHlsZVxuICAgICAgICogQGRlZmF1bHQgJ2lubmVySFRNTCdcbiAgICAgICAqL1xuICAgICAgZGVmYXVsdFN3YXBTdHlsZTogJ2lubmVySFRNTCcsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBkZWZhdWx0IGRlbGF5IGJldHdlZW4gcmVjZWl2aW5nIGEgcmVzcG9uc2UgZnJvbSB0aGUgc2VydmVyIGFuZCBkb2luZyB0aGUgc3dhcC5cbiAgICAgICAqIEB0eXBlIG51bWJlclxuICAgICAgICogQGRlZmF1bHQgMFxuICAgICAgICovXG4gICAgICBkZWZhdWx0U3dhcERlbGF5OiAwLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgZGVmYXVsdCBkZWxheSBiZXR3ZWVuIGNvbXBsZXRpbmcgdGhlIGNvbnRlbnQgc3dhcCBhbmQgc2V0dGxpbmcgYXR0cmlidXRlcy5cbiAgICAgICAqIEB0eXBlIG51bWJlclxuICAgICAgICogQGRlZmF1bHQgMjBcbiAgICAgICAqL1xuICAgICAgZGVmYXVsdFNldHRsZURlbGF5OiAyMCxcbiAgICAgIC8qKlxuICAgICAgICogSWYgdHJ1ZSwgaHRteCB3aWxsIGluamVjdCBhIHNtYWxsIGFtb3VudCBvZiBDU1MgaW50byB0aGUgcGFnZSB0byBtYWtlIGluZGljYXRvcnMgaW52aXNpYmxlIHVubGVzcyB0aGUgKipodG14LWluZGljYXRvcioqIGNsYXNzIGlzIHByZXNlbnQuXG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCB0cnVlXG4gICAgICAgKi9cbiAgICAgIGluY2x1ZGVJbmRpY2F0b3JTdHlsZXM6IHRydWUsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBjbGFzcyB0byBwbGFjZSBvbiBpbmRpY2F0b3JzIHdoZW4gYSByZXF1ZXN0IGlzIGluIGZsaWdodC5cbiAgICAgICAqIEB0eXBlIHN0cmluZ1xuICAgICAgICogQGRlZmF1bHQgJ2h0bXgtaW5kaWNhdG9yJ1xuICAgICAgICovXG4gICAgICBpbmRpY2F0b3JDbGFzczogJ2h0bXgtaW5kaWNhdG9yJyxcbiAgICAgIC8qKlxuICAgICAgICogVGhlIGNsYXNzIHRvIHBsYWNlIG9uIHRyaWdnZXJpbmcgZWxlbWVudHMgd2hlbiBhIHJlcXVlc3QgaXMgaW4gZmxpZ2h0LlxuICAgICAgICogQHR5cGUgc3RyaW5nXG4gICAgICAgKiBAZGVmYXVsdCAnaHRteC1yZXF1ZXN0J1xuICAgICAgICovXG4gICAgICByZXF1ZXN0Q2xhc3M6ICdodG14LXJlcXVlc3QnLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgY2xhc3MgdG8gdGVtcG9yYXJpbHkgcGxhY2Ugb24gZWxlbWVudHMgdGhhdCBodG14IGhhcyBhZGRlZCB0byB0aGUgRE9NLlxuICAgICAgICogQHR5cGUgc3RyaW5nXG4gICAgICAgKiBAZGVmYXVsdCAnaHRteC1hZGRlZCdcbiAgICAgICAqL1xuICAgICAgYWRkZWRDbGFzczogJ2h0bXgtYWRkZWQnLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgY2xhc3MgdG8gcGxhY2Ugb24gdGFyZ2V0IGVsZW1lbnRzIHdoZW4gaHRteCBpcyBpbiB0aGUgc2V0dGxpbmcgcGhhc2UuXG4gICAgICAgKiBAdHlwZSBzdHJpbmdcbiAgICAgICAqIEBkZWZhdWx0ICdodG14LXNldHRsaW5nJ1xuICAgICAgICovXG4gICAgICBzZXR0bGluZ0NsYXNzOiAnaHRteC1zZXR0bGluZycsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBjbGFzcyB0byBwbGFjZSBvbiB0YXJnZXQgZWxlbWVudHMgd2hlbiBodG14IGlzIGluIHRoZSBzd2FwcGluZyBwaGFzZS5cbiAgICAgICAqIEB0eXBlIHN0cmluZ1xuICAgICAgICogQGRlZmF1bHQgJ2h0bXgtc3dhcHBpbmcnXG4gICAgICAgKi9cbiAgICAgIHN3YXBwaW5nQ2xhc3M6ICdodG14LXN3YXBwaW5nJyxcbiAgICAgIC8qKlxuICAgICAgICogQWxsb3dzIHRoZSB1c2Ugb2YgZXZhbC1saWtlIGZ1bmN0aW9uYWxpdHkgaW4gaHRteCwgdG8gZW5hYmxlICoqaHgtdmFycyoqLCB0cmlnZ2VyIGNvbmRpdGlvbnMgJiBzY3JpcHQgdGFnIGV2YWx1YXRpb24uIENhbiBiZSBzZXQgdG8gKipmYWxzZSoqIGZvciBDU1AgY29tcGF0aWJpbGl0eS5cbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IHRydWVcbiAgICAgICAqL1xuICAgICAgYWxsb3dFdmFsOiB0cnVlLFxuICAgICAgLyoqXG4gICAgICAgKiBJZiBzZXQgdG8gZmFsc2UsIGRpc2FibGVzIHRoZSBpbnRlcnByZXRhdGlvbiBvZiBzY3JpcHQgdGFncy5cbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IHRydWVcbiAgICAgICAqL1xuICAgICAgYWxsb3dTY3JpcHRUYWdzOiB0cnVlLFxuICAgICAgLyoqXG4gICAgICAgKiBJZiBzZXQsIHRoZSBub25jZSB3aWxsIGJlIGFkZGVkIHRvIGlubGluZSBzY3JpcHRzLlxuICAgICAgICogQHR5cGUgc3RyaW5nXG4gICAgICAgKiBAZGVmYXVsdCAnJ1xuICAgICAgICovXG4gICAgICBpbmxpbmVTY3JpcHROb25jZTogJycsXG4gICAgICAvKipcbiAgICAgICAqIElmIHNldCwgdGhlIG5vbmNlIHdpbGwgYmUgYWRkZWQgdG8gaW5saW5lIHN0eWxlcy5cbiAgICAgICAqIEB0eXBlIHN0cmluZ1xuICAgICAgICogQGRlZmF1bHQgJydcbiAgICAgICAqL1xuICAgICAgaW5saW5lU3R5bGVOb25jZTogJycsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBhdHRyaWJ1dGVzIHRvIHNldHRsZSBkdXJpbmcgdGhlIHNldHRsaW5nIHBoYXNlLlxuICAgICAgICogQHR5cGUgc3RyaW5nW11cbiAgICAgICAqIEBkZWZhdWx0IFsnY2xhc3MnLCAnc3R5bGUnLCAnd2lkdGgnLCAnaGVpZ2h0J11cbiAgICAgICAqL1xuICAgICAgYXR0cmlidXRlc1RvU2V0dGxlOiBbJ2NsYXNzJywgJ3N0eWxlJywgJ3dpZHRoJywgJ2hlaWdodCddLFxuICAgICAgLyoqXG4gICAgICAgKiBBbGxvdyBjcm9zcy1zaXRlIEFjY2Vzcy1Db250cm9sIHJlcXVlc3RzIHVzaW5nIGNyZWRlbnRpYWxzIHN1Y2ggYXMgY29va2llcywgYXV0aG9yaXphdGlvbiBoZWFkZXJzIG9yIFRMUyBjbGllbnQgY2VydGlmaWNhdGVzLlxuICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgICAqL1xuICAgICAgd2l0aENyZWRlbnRpYWxzOiBmYWxzZSxcbiAgICAgIC8qKlxuICAgICAgICogQHR5cGUgbnVtYmVyXG4gICAgICAgKiBAZGVmYXVsdCAwXG4gICAgICAgKi9cbiAgICAgIHRpbWVvdXQ6IDAsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mICoqZ2V0V2ViU29ja2V0UmVjb25uZWN0RGVsYXkqKiBmb3IgcmVjb25uZWN0aW5nIGFmdGVyIHVuZXhwZWN0ZWQgY29ubmVjdGlvbiBsb3NzIGJ5IHRoZSBldmVudCBjb2RlICoqQWJub3JtYWwgQ2xvc3VyZSoqLCAqKlNlcnZpY2UgUmVzdGFydCoqIG9yICoqVHJ5IEFnYWluIExhdGVyKiouXG4gICAgICAgKiBAdHlwZSB7J2Z1bGwtaml0dGVyJyB8ICgocmV0cnlDb3VudDpudW1iZXIpID0+IG51bWJlcil9XG4gICAgICAgKiBAZGVmYXVsdCBcImZ1bGwtaml0dGVyXCJcbiAgICAgICAqL1xuICAgICAgd3NSZWNvbm5lY3REZWxheTogJ2Z1bGwtaml0dGVyJyxcbiAgICAgIC8qKlxuICAgICAgICogVGhlIHR5cGUgb2YgYmluYXJ5IGRhdGEgYmVpbmcgcmVjZWl2ZWQgb3ZlciB0aGUgV2ViU29ja2V0IGNvbm5lY3Rpb25cbiAgICAgICAqIEB0eXBlIEJpbmFyeVR5cGVcbiAgICAgICAqIEBkZWZhdWx0ICdibG9iJ1xuICAgICAgICovXG4gICAgICB3c0JpbmFyeVR5cGU6ICdibG9iJyxcbiAgICAgIC8qKlxuICAgICAgICogQHR5cGUgc3RyaW5nXG4gICAgICAgKiBAZGVmYXVsdCAnW2h4LWRpc2FibGVdLCBbZGF0YS1oeC1kaXNhYmxlXSdcbiAgICAgICAqL1xuICAgICAgZGlzYWJsZVNlbGVjdG9yOiAnW2h4LWRpc2FibGVdLCBbZGF0YS1oeC1kaXNhYmxlXScsXG4gICAgICAvKipcbiAgICAgICAqIEB0eXBlIHsnYXV0bycgfCAnaW5zdGFudCcgfCAnc21vb3RoJ31cbiAgICAgICAqIEBkZWZhdWx0ICdpbnN0YW50J1xuICAgICAgICovXG4gICAgICBzY3JvbGxCZWhhdmlvcjogJ2luc3RhbnQnLFxuICAgICAgLyoqXG4gICAgICAgKiBJZiB0aGUgZm9jdXNlZCBlbGVtZW50IHNob3VsZCBiZSBzY3JvbGxlZCBpbnRvIHZpZXcuXG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAgICovXG4gICAgICBkZWZhdWx0Rm9jdXNTY3JvbGw6IGZhbHNlLFxuICAgICAgLyoqXG4gICAgICAgKiBJZiBzZXQgdG8gdHJ1ZSBodG14IHdpbGwgaW5jbHVkZSBhIGNhY2hlLWJ1c3RpbmcgcGFyYW1ldGVyIGluIEdFVCByZXF1ZXN0cyB0byBhdm9pZCBjYWNoaW5nIHBhcnRpYWwgcmVzcG9uc2VzIGJ5IHRoZSBicm93c2VyXG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAgICovXG4gICAgICBnZXRDYWNoZUJ1c3RlclBhcmFtOiBmYWxzZSxcbiAgICAgIC8qKlxuICAgICAgICogSWYgc2V0IHRvIHRydWUsIGh0bXggd2lsbCB1c2UgdGhlIFZpZXcgVHJhbnNpdGlvbiBBUEkgd2hlbiBzd2FwcGluZyBpbiBuZXcgY29udGVudC5cbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICAgKi9cbiAgICAgIGdsb2JhbFZpZXdUcmFuc2l0aW9uczogZmFsc2UsXG4gICAgICAvKipcbiAgICAgICAqIGh0bXggd2lsbCBmb3JtYXQgcmVxdWVzdHMgd2l0aCB0aGVzZSBtZXRob2RzIGJ5IGVuY29kaW5nIHRoZWlyIHBhcmFtZXRlcnMgaW4gdGhlIFVSTCwgbm90IHRoZSByZXF1ZXN0IGJvZHlcbiAgICAgICAqIEB0eXBlIHsoSHR0cFZlcmIpW119XG4gICAgICAgKiBAZGVmYXVsdCBbJ2dldCcsICdkZWxldGUnXVxuICAgICAgICovXG4gICAgICBtZXRob2RzVGhhdFVzZVVybFBhcmFtczogWydnZXQnLCAnZGVsZXRlJ10sXG4gICAgICAvKipcbiAgICAgICAqIElmIHNldCB0byB0cnVlLCBkaXNhYmxlcyBodG14LWJhc2VkIHJlcXVlc3RzIHRvIG5vbi1vcmlnaW4gaG9zdHMuXG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAgICovXG4gICAgICBzZWxmUmVxdWVzdHNPbmx5OiB0cnVlLFxuICAgICAgLyoqXG4gICAgICAgKiBJZiBzZXQgdG8gdHJ1ZSBodG14IHdpbGwgbm90IHVwZGF0ZSB0aGUgdGl0bGUgb2YgdGhlIGRvY3VtZW50IHdoZW4gYSB0aXRsZSB0YWcgaXMgZm91bmQgaW4gbmV3IGNvbnRlbnRcbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICAgKi9cbiAgICAgIGlnbm9yZVRpdGxlOiBmYWxzZSxcbiAgICAgIC8qKlxuICAgICAgICogV2hldGhlciB0aGUgdGFyZ2V0IG9mIGEgYm9vc3RlZCBlbGVtZW50IGlzIHNjcm9sbGVkIGludG8gdGhlIHZpZXdwb3J0LlxuICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICogQGRlZmF1bHQgdHJ1ZVxuICAgICAgICovXG4gICAgICBzY3JvbGxJbnRvVmlld09uQm9vc3Q6IHRydWUsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBjYWNoZSB0byBzdG9yZSBldmFsdWF0ZWQgdHJpZ2dlciBzcGVjaWZpY2F0aW9ucyBpbnRvLlxuICAgICAgICogWW91IG1heSBkZWZpbmUgYSBzaW1wbGUgb2JqZWN0IHRvIHVzZSBhIG5ldmVyLWNsZWFyaW5nIGNhY2hlLCBvciBpbXBsZW1lbnQgeW91ciBvd24gc3lzdGVtIHVzaW5nIGEgW3Byb3h5IG9iamVjdF0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvUHJveHkpXG4gICAgICAgKiBAdHlwZSB7T2JqZWN0fG51bGx9XG4gICAgICAgKiBAZGVmYXVsdCBudWxsXG4gICAgICAgKi9cbiAgICAgIHRyaWdnZXJTcGVjc0NhY2hlOiBudWxsLFxuICAgICAgLyoqIEB0eXBlIGJvb2xlYW4gKi9cbiAgICAgIGRpc2FibGVJbmhlcml0YW5jZTogZmFsc2UsXG4gICAgICAvKiogQHR5cGUgSHRteFJlc3BvbnNlSGFuZGxpbmdDb25maWdbXSAqL1xuICAgICAgcmVzcG9uc2VIYW5kbGluZzogW1xuICAgICAgICB7IGNvZGU6ICcyMDQnLCBzd2FwOiBmYWxzZSB9LFxuICAgICAgICB7IGNvZGU6ICdbMjNdLi4nLCBzd2FwOiB0cnVlIH0sXG4gICAgICAgIHsgY29kZTogJ1s0NV0uLicsIHN3YXA6IGZhbHNlLCBlcnJvcjogdHJ1ZSB9XG4gICAgICBdLFxuICAgICAgLyoqXG4gICAgICAgKiBXaGV0aGVyIHRvIHByb2Nlc3MgT09CIHN3YXBzIG9uIGVsZW1lbnRzIHRoYXQgYXJlIG5lc3RlZCB3aXRoaW4gdGhlIG1haW4gcmVzcG9uc2UgZWxlbWVudC5cbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IHRydWVcbiAgICAgICAqL1xuICAgICAgYWxsb3dOZXN0ZWRPb2JTd2FwczogdHJ1ZVxuICAgIH0sXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgcGFyc2VJbnRlcnZhbH0gKi9cbiAgICBwYXJzZUludGVydmFsOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIGludGVybmFsRXZhbH0gKi9cbiAgICBfOiBudWxsLFxuICAgIHZlcnNpb246ICcyLjAuMidcbiAgfVxuICAvLyBUc2MgbWFkbmVzcyBwYXJ0IDJcbiAgaHRteC5vbkxvYWQgPSBvbkxvYWRIZWxwZXJcbiAgaHRteC5wcm9jZXNzID0gcHJvY2Vzc05vZGVcbiAgaHRteC5vbiA9IGFkZEV2ZW50TGlzdGVuZXJJbXBsXG4gIGh0bXgub2ZmID0gcmVtb3ZlRXZlbnRMaXN0ZW5lckltcGxcbiAgaHRteC50cmlnZ2VyID0gdHJpZ2dlckV2ZW50XG4gIGh0bXguYWpheCA9IGFqYXhIZWxwZXJcbiAgaHRteC5maW5kID0gZmluZFxuICBodG14LmZpbmRBbGwgPSBmaW5kQWxsXG4gIGh0bXguY2xvc2VzdCA9IGNsb3Nlc3RcbiAgaHRteC5yZW1vdmUgPSByZW1vdmVFbGVtZW50XG4gIGh0bXguYWRkQ2xhc3MgPSBhZGRDbGFzc1RvRWxlbWVudFxuICBodG14LnJlbW92ZUNsYXNzID0gcmVtb3ZlQ2xhc3NGcm9tRWxlbWVudFxuICBodG14LnRvZ2dsZUNsYXNzID0gdG9nZ2xlQ2xhc3NPbkVsZW1lbnRcbiAgaHRteC50YWtlQ2xhc3MgPSB0YWtlQ2xhc3NGb3JFbGVtZW50XG4gIGh0bXguc3dhcCA9IHN3YXBcbiAgaHRteC5kZWZpbmVFeHRlbnNpb24gPSBkZWZpbmVFeHRlbnNpb25cbiAgaHRteC5yZW1vdmVFeHRlbnNpb24gPSByZW1vdmVFeHRlbnNpb25cbiAgaHRteC5sb2dBbGwgPSBsb2dBbGxcbiAgaHRteC5sb2dOb25lID0gbG9nTm9uZVxuICBodG14LnBhcnNlSW50ZXJ2YWwgPSBwYXJzZUludGVydmFsXG4gIGh0bXguXyA9IGludGVybmFsRXZhbFxuXG4gIGNvbnN0IGludGVybmFsQVBJID0ge1xuICAgIGFkZFRyaWdnZXJIYW5kbGVyLFxuICAgIGJvZHlDb250YWlucyxcbiAgICBjYW5BY2Nlc3NMb2NhbFN0b3JhZ2UsXG4gICAgZmluZFRoaXNFbGVtZW50LFxuICAgIGZpbHRlclZhbHVlcyxcbiAgICBzd2FwLFxuICAgIGhhc0F0dHJpYnV0ZSxcbiAgICBnZXRBdHRyaWJ1dGVWYWx1ZSxcbiAgICBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUsXG4gICAgZ2V0Q2xvc2VzdE1hdGNoLFxuICAgIGdldEV4cHJlc3Npb25WYXJzLFxuICAgIGdldEhlYWRlcnMsXG4gICAgZ2V0SW5wdXRWYWx1ZXMsXG4gICAgZ2V0SW50ZXJuYWxEYXRhLFxuICAgIGdldFN3YXBTcGVjaWZpY2F0aW9uLFxuICAgIGdldFRyaWdnZXJTcGVjcyxcbiAgICBnZXRUYXJnZXQsXG4gICAgbWFrZUZyYWdtZW50LFxuICAgIG1lcmdlT2JqZWN0cyxcbiAgICBtYWtlU2V0dGxlSW5mbyxcbiAgICBvb2JTd2FwLFxuICAgIHF1ZXJ5U2VsZWN0b3JFeHQsXG4gICAgc2V0dGxlSW1tZWRpYXRlbHksXG4gICAgc2hvdWxkQ2FuY2VsLFxuICAgIHRyaWdnZXJFdmVudCxcbiAgICB0cmlnZ2VyRXJyb3JFdmVudCxcbiAgICB3aXRoRXh0ZW5zaW9uc1xuICB9XG5cbiAgY29uc3QgVkVSQlMgPSBbJ2dldCcsICdwb3N0JywgJ3B1dCcsICdkZWxldGUnLCAncGF0Y2gnXVxuICBjb25zdCBWRVJCX1NFTEVDVE9SID0gVkVSQlMubWFwKGZ1bmN0aW9uKHZlcmIpIHtcbiAgICByZXR1cm4gJ1toeC0nICsgdmVyYiArICddLCBbZGF0YS1oeC0nICsgdmVyYiArICddJ1xuICB9KS5qb2luKCcsICcpXG5cbiAgY29uc3QgSEVBRF9UQUdfUkVHRVggPSBtYWtlVGFnUmVnRXgoJ2hlYWQnKVxuXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFV0aWxpdGllc1xuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFnXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gZ2xvYmFsXG4gICAqIEByZXR1cm5zIHtSZWdFeHB9XG4gICAqL1xuICBmdW5jdGlvbiBtYWtlVGFnUmVnRXgodGFnLCBnbG9iYWwgPSBmYWxzZSkge1xuICAgIHJldHVybiBuZXcgUmVnRXhwKGA8JHt0YWd9KFxcXFxzW14+XSo+fD4pKFtcXFxcc1xcXFxTXSo/KTxcXFxcLyR7dGFnfT5gLFxuICAgICAgZ2xvYmFsID8gJ2dpbScgOiAnaW0nKVxuICB9XG5cbiAgLyoqXG4gICAqIFBhcnNlcyBhbiBpbnRlcnZhbCBzdHJpbmcgY29uc2lzdGVudCB3aXRoIHRoZSB3YXkgaHRteCBkb2VzLiBVc2VmdWwgZm9yIHBsdWdpbnMgdGhhdCBoYXZlIHRpbWluZy1yZWxhdGVkIGF0dHJpYnV0ZXMuXG4gICAqXG4gICAqIENhdXRpb246IEFjY2VwdHMgYW4gaW50IGZvbGxvd2VkIGJ5IGVpdGhlciAqKnMqKiBvciAqKm1zKiouIEFsbCBvdGhlciB2YWx1ZXMgdXNlICoqcGFyc2VGbG9hdCoqXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI3BhcnNlSW50ZXJ2YWxcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0ciB0aW1pbmcgc3RyaW5nXG4gICAqIEByZXR1cm5zIHtudW1iZXJ8dW5kZWZpbmVkfVxuICAgKi9cbiAgZnVuY3Rpb24gcGFyc2VJbnRlcnZhbChzdHIpIHtcbiAgICBpZiAoc3RyID09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZFxuICAgIH1cblxuICAgIGxldCBpbnRlcnZhbCA9IE5hTlxuICAgIGlmIChzdHIuc2xpY2UoLTIpID09ICdtcycpIHtcbiAgICAgIGludGVydmFsID0gcGFyc2VGbG9hdChzdHIuc2xpY2UoMCwgLTIpKVxuICAgIH0gZWxzZSBpZiAoc3RyLnNsaWNlKC0xKSA9PSAncycpIHtcbiAgICAgIGludGVydmFsID0gcGFyc2VGbG9hdChzdHIuc2xpY2UoMCwgLTEpKSAqIDEwMDBcbiAgICB9IGVsc2UgaWYgKHN0ci5zbGljZSgtMSkgPT0gJ20nKSB7XG4gICAgICBpbnRlcnZhbCA9IHBhcnNlRmxvYXQoc3RyLnNsaWNlKDAsIC0xKSkgKiAxMDAwICogNjBcbiAgICB9IGVsc2Uge1xuICAgICAgaW50ZXJ2YWwgPSBwYXJzZUZsb2F0KHN0cilcbiAgICB9XG4gICAgcmV0dXJuIGlzTmFOKGludGVydmFsKSA/IHVuZGVmaW5lZCA6IGludGVydmFsXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICogQHJldHVybnMgeyhzdHJpbmcgfCBudWxsKX1cbiAgICovXG4gIGZ1bmN0aW9uIGdldFJhd0F0dHJpYnV0ZShlbHQsIG5hbWUpIHtcbiAgICByZXR1cm4gZWx0IGluc3RhbmNlb2YgRWxlbWVudCAmJiBlbHQuZ2V0QXR0cmlidXRlKG5hbWUpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IHF1YWxpZmllZE5hbWVcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICAvLyByZXNvbHZlIHdpdGggYm90aCBoeCBhbmQgZGF0YS1oeCBwcmVmaXhlc1xuICBmdW5jdGlvbiBoYXNBdHRyaWJ1dGUoZWx0LCBxdWFsaWZpZWROYW1lKSB7XG4gICAgcmV0dXJuICEhZWx0Lmhhc0F0dHJpYnV0ZSAmJiAoZWx0Lmhhc0F0dHJpYnV0ZShxdWFsaWZpZWROYW1lKSB8fFxuICAgICAgZWx0Lmhhc0F0dHJpYnV0ZSgnZGF0YS0nICsgcXVhbGlmaWVkTmFtZSkpXG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IHF1YWxpZmllZE5hbWVcbiAgICogQHJldHVybnMgeyhzdHJpbmcgfCBudWxsKX1cbiAgICovXG4gIGZ1bmN0aW9uIGdldEF0dHJpYnV0ZVZhbHVlKGVsdCwgcXVhbGlmaWVkTmFtZSkge1xuICAgIHJldHVybiBnZXRSYXdBdHRyaWJ1dGUoZWx0LCBxdWFsaWZpZWROYW1lKSB8fCBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnZGF0YS0nICsgcXVhbGlmaWVkTmFtZSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcmV0dXJucyB7Tm9kZSB8IG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBwYXJlbnRFbHQoZWx0KSB7XG4gICAgY29uc3QgcGFyZW50ID0gZWx0LnBhcmVudEVsZW1lbnRcbiAgICBpZiAoIXBhcmVudCAmJiBlbHQucGFyZW50Tm9kZSBpbnN0YW5jZW9mIFNoYWRvd1Jvb3QpIHJldHVybiBlbHQucGFyZW50Tm9kZVxuICAgIHJldHVybiBwYXJlbnRcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7RG9jdW1lbnR9XG4gICAqL1xuICBmdW5jdGlvbiBnZXREb2N1bWVudCgpIHtcbiAgICByZXR1cm4gZG9jdW1lbnRcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGdsb2JhbFxuICAgKiBAcmV0dXJucyB7Tm9kZXxEb2N1bWVudH1cbiAgICovXG4gIGZ1bmN0aW9uIGdldFJvb3ROb2RlKGVsdCwgZ2xvYmFsKSB7XG4gICAgcmV0dXJuIGVsdC5nZXRSb290Tm9kZSA/IGVsdC5nZXRSb290Tm9kZSh7IGNvbXBvc2VkOiBnbG9iYWwgfSkgOiBnZXREb2N1bWVudCgpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHBhcmFtIHsoZTpOb2RlKSA9PiBib29sZWFufSBjb25kaXRpb25cbiAgICogQHJldHVybnMge05vZGUgfCBudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0Q2xvc2VzdE1hdGNoKGVsdCwgY29uZGl0aW9uKSB7XG4gICAgd2hpbGUgKGVsdCAmJiAhY29uZGl0aW9uKGVsdCkpIHtcbiAgICAgIGVsdCA9IHBhcmVudEVsdChlbHQpXG4gICAgfVxuXG4gICAgcmV0dXJuIGVsdCB8fCBudWxsXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBpbml0aWFsRWxlbWVudFxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGFuY2VzdG9yXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhdHRyaWJ1dGVOYW1lXG4gICAqIEByZXR1cm5zIHtzdHJpbmd8bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIGdldEF0dHJpYnV0ZVZhbHVlV2l0aERpc2luaGVyaXRhbmNlKGluaXRpYWxFbGVtZW50LCBhbmNlc3RvciwgYXR0cmlidXRlTmFtZSkge1xuICAgIGNvbnN0IGF0dHJpYnV0ZVZhbHVlID0gZ2V0QXR0cmlidXRlVmFsdWUoYW5jZXN0b3IsIGF0dHJpYnV0ZU5hbWUpXG4gICAgY29uc3QgZGlzaW5oZXJpdCA9IGdldEF0dHJpYnV0ZVZhbHVlKGFuY2VzdG9yLCAnaHgtZGlzaW5oZXJpdCcpXG4gICAgdmFyIGluaGVyaXQgPSBnZXRBdHRyaWJ1dGVWYWx1ZShhbmNlc3RvciwgJ2h4LWluaGVyaXQnKVxuICAgIGlmIChpbml0aWFsRWxlbWVudCAhPT0gYW5jZXN0b3IpIHtcbiAgICAgIGlmIChodG14LmNvbmZpZy5kaXNhYmxlSW5oZXJpdGFuY2UpIHtcbiAgICAgICAgaWYgKGluaGVyaXQgJiYgKGluaGVyaXQgPT09ICcqJyB8fCBpbmhlcml0LnNwbGl0KCcgJykuaW5kZXhPZihhdHRyaWJ1dGVOYW1lKSA+PSAwKSkge1xuICAgICAgICAgIHJldHVybiBhdHRyaWJ1dGVWYWx1ZVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBudWxsXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChkaXNpbmhlcml0ICYmIChkaXNpbmhlcml0ID09PSAnKicgfHwgZGlzaW5oZXJpdC5zcGxpdCgnICcpLmluZGV4T2YoYXR0cmlidXRlTmFtZSkgPj0gMCkpIHtcbiAgICAgICAgcmV0dXJuICd1bnNldCdcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGF0dHJpYnV0ZVZhbHVlXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGF0dHJpYnV0ZU5hbWVcbiAgICogQHJldHVybnMge3N0cmluZyB8IG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCBhdHRyaWJ1dGVOYW1lKSB7XG4gICAgbGV0IGNsb3Nlc3RBdHRyID0gbnVsbFxuICAgIGdldENsb3Nlc3RNYXRjaChlbHQsIGZ1bmN0aW9uKGUpIHtcbiAgICAgIHJldHVybiAhIShjbG9zZXN0QXR0ciA9IGdldEF0dHJpYnV0ZVZhbHVlV2l0aERpc2luaGVyaXRhbmNlKGVsdCwgYXNFbGVtZW50KGUpLCBhdHRyaWJ1dGVOYW1lKSlcbiAgICB9KVxuICAgIGlmIChjbG9zZXN0QXR0ciAhPT0gJ3Vuc2V0Jykge1xuICAgICAgcmV0dXJuIGNsb3Nlc3RBdHRyXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvclxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIG1hdGNoZXMoZWx0LCBzZWxlY3Rvcikge1xuICAgIC8vIEB0cy1pZ25vcmU6IG5vbi1zdGFuZGFyZCBwcm9wZXJ0aWVzIGZvciBicm93c2VyIGNvbXBhdGliaWxpdHlcbiAgICAvLyBub2luc3BlY3Rpb24gSlNVbnJlc29sdmVkVmFyaWFibGVcbiAgICBjb25zdCBtYXRjaGVzRnVuY3Rpb24gPSBlbHQgaW5zdGFuY2VvZiBFbGVtZW50ICYmIChlbHQubWF0Y2hlcyB8fCBlbHQubWF0Y2hlc1NlbGVjdG9yIHx8IGVsdC5tc01hdGNoZXNTZWxlY3RvciB8fCBlbHQubW96TWF0Y2hlc1NlbGVjdG9yIHx8IGVsdC53ZWJraXRNYXRjaGVzU2VsZWN0b3IgfHwgZWx0Lm9NYXRjaGVzU2VsZWN0b3IpXG4gICAgcmV0dXJuICEhbWF0Y2hlc0Z1bmN0aW9uICYmIG1hdGNoZXNGdW5jdGlvbi5jYWxsKGVsdCwgc2VsZWN0b3IpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0U3RhcnRUYWcoc3RyKSB7XG4gICAgY29uc3QgdGFnTWF0Y2hlciA9IC88KFthLXpdW15cXC9cXDA+XFx4MjBcXHRcXHJcXG5cXGZdKikvaVxuICAgIGNvbnN0IG1hdGNoID0gdGFnTWF0Y2hlci5leGVjKHN0cilcbiAgICBpZiAobWF0Y2gpIHtcbiAgICAgIHJldHVybiBtYXRjaFsxXS50b0xvd2VyQ2FzZSgpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiAnJ1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcmVzcFxuICAgKiBAcmV0dXJucyB7RG9jdW1lbnR9XG4gICAqL1xuICBmdW5jdGlvbiBwYXJzZUhUTUwocmVzcCkge1xuICAgIGNvbnN0IHBhcnNlciA9IG5ldyBET01QYXJzZXIoKVxuICAgIHJldHVybiBwYXJzZXIucGFyc2VGcm9tU3RyaW5nKHJlc3AsICd0ZXh0L2h0bWwnKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RG9jdW1lbnRGcmFnbWVudH0gZnJhZ21lbnRcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICovXG4gIGZ1bmN0aW9uIHRha2VDaGlsZHJlbkZvcihmcmFnbWVudCwgZWx0KSB7XG4gICAgd2hpbGUgKGVsdC5jaGlsZE5vZGVzLmxlbmd0aCA+IDApIHtcbiAgICAgIGZyYWdtZW50LmFwcGVuZChlbHQuY2hpbGROb2Rlc1swXSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtIVE1MU2NyaXB0RWxlbWVudH0gc2NyaXB0XG4gICAqIEByZXR1cm5zIHtIVE1MU2NyaXB0RWxlbWVudH1cbiAgICovXG4gIGZ1bmN0aW9uIGR1cGxpY2F0ZVNjcmlwdChzY3JpcHQpIHtcbiAgICBjb25zdCBuZXdTY3JpcHQgPSBnZXREb2N1bWVudCgpLmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpXG4gICAgZm9yRWFjaChzY3JpcHQuYXR0cmlidXRlcywgZnVuY3Rpb24oYXR0cikge1xuICAgICAgbmV3U2NyaXB0LnNldEF0dHJpYnV0ZShhdHRyLm5hbWUsIGF0dHIudmFsdWUpXG4gICAgfSlcbiAgICBuZXdTY3JpcHQudGV4dENvbnRlbnQgPSBzY3JpcHQudGV4dENvbnRlbnRcbiAgICBuZXdTY3JpcHQuYXN5bmMgPSBmYWxzZVxuICAgIGlmIChodG14LmNvbmZpZy5pbmxpbmVTY3JpcHROb25jZSkge1xuICAgICAgbmV3U2NyaXB0Lm5vbmNlID0gaHRteC5jb25maWcuaW5saW5lU2NyaXB0Tm9uY2VcbiAgICB9XG4gICAgcmV0dXJuIG5ld1NjcmlwdFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7SFRNTFNjcmlwdEVsZW1lbnR9IHNjcmlwdFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGlzSmF2YVNjcmlwdFNjcmlwdE5vZGUoc2NyaXB0KSB7XG4gICAgcmV0dXJuIHNjcmlwdC5tYXRjaGVzKCdzY3JpcHQnKSAmJiAoc2NyaXB0LnR5cGUgPT09ICd0ZXh0L2phdmFzY3JpcHQnIHx8IHNjcmlwdC50eXBlID09PSAnbW9kdWxlJyB8fCBzY3JpcHQudHlwZSA9PT0gJycpXG4gIH1cblxuICAvKipcbiAgICogd2UgaGF2ZSB0byBtYWtlIG5ldyBjb3BpZXMgb2Ygc2NyaXB0IHRhZ3MgdGhhdCB3ZSBhcmUgZ29pbmcgdG8gaW5zZXJ0IGJlY2F1c2VcbiAgICogU09NRSBicm93c2VycyAobm90IHNheWluZyB3aG8sIGJ1dCBpdCBpbnZvbHZlcyBhbiBlbGVtZW50IGFuZCBhbiBhbmltYWwpIGRvbid0XG4gICAqIGV4ZWN1dGUgc2NyaXB0cyBjcmVhdGVkIGluIDx0ZW1wbGF0ZT4gdGFncyB3aGVuIHRoZXkgYXJlIGluc2VydGVkIGludG8gdGhlIERPTVxuICAgKiBhbmQgYWxsIHRoZSBvdGhlcnMgZG8gbG1hb1xuICAgKiBAcGFyYW0ge0RvY3VtZW50RnJhZ21lbnR9IGZyYWdtZW50XG4gICAqL1xuICBmdW5jdGlvbiBub3JtYWxpemVTY3JpcHRUYWdzKGZyYWdtZW50KSB7XG4gICAgQXJyYXkuZnJvbShmcmFnbWVudC5xdWVyeVNlbGVjdG9yQWxsKCdzY3JpcHQnKSkuZm9yRWFjaCgvKiogQHBhcmFtIHtIVE1MU2NyaXB0RWxlbWVudH0gc2NyaXB0ICovIChzY3JpcHQpID0+IHtcbiAgICAgIGlmIChpc0phdmFTY3JpcHRTY3JpcHROb2RlKHNjcmlwdCkpIHtcbiAgICAgICAgY29uc3QgbmV3U2NyaXB0ID0gZHVwbGljYXRlU2NyaXB0KHNjcmlwdClcbiAgICAgICAgY29uc3QgcGFyZW50ID0gc2NyaXB0LnBhcmVudE5vZGVcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBwYXJlbnQuaW5zZXJ0QmVmb3JlKG5ld1NjcmlwdCwgc2NyaXB0KVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgbG9nRXJyb3IoZSlcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBzY3JpcHQucmVtb3ZlKClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQHR5cGVkZWYge0RvY3VtZW50RnJhZ21lbnQgJiB7dGl0bGU/OiBzdHJpbmd9fSBEb2N1bWVudEZyYWdtZW50V2l0aFRpdGxlXG4gICAqIEBkZXNjcmlwdGlvbiAgYSBkb2N1bWVudCBmcmFnbWVudCByZXByZXNlbnRpbmcgdGhlIHJlc3BvbnNlIEhUTUwsIGluY2x1ZGluZ1xuICAgKiBhIGB0aXRsZWAgcHJvcGVydHkgZm9yIGFueSB0aXRsZSBpbmZvcm1hdGlvbiBmb3VuZFxuICAgKi9cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHJlc3BvbnNlIEhUTUxcbiAgICogQHJldHVybnMge0RvY3VtZW50RnJhZ21lbnRXaXRoVGl0bGV9XG4gICAqL1xuICBmdW5jdGlvbiBtYWtlRnJhZ21lbnQocmVzcG9uc2UpIHtcbiAgICAvLyBzdHJpcCBoZWFkIHRhZyB0byBkZXRlcm1pbmUgc2hhcGUgb2YgcmVzcG9uc2Ugd2UgYXJlIGRlYWxpbmcgd2l0aFxuICAgIGNvbnN0IHJlc3BvbnNlV2l0aE5vSGVhZCA9IHJlc3BvbnNlLnJlcGxhY2UoSEVBRF9UQUdfUkVHRVgsICcnKVxuICAgIGNvbnN0IHN0YXJ0VGFnID0gZ2V0U3RhcnRUYWcocmVzcG9uc2VXaXRoTm9IZWFkKVxuICAgIC8qKiBAdHlwZSBEb2N1bWVudEZyYWdtZW50V2l0aFRpdGxlICovXG4gICAgbGV0IGZyYWdtZW50XG4gICAgaWYgKHN0YXJ0VGFnID09PSAnaHRtbCcpIHtcbiAgICAgIC8vIGlmIGl0IGlzIGEgZnVsbCBkb2N1bWVudCwgcGFyc2UgaXQgYW5kIHJldHVybiB0aGUgYm9keVxuICAgICAgZnJhZ21lbnQgPSAvKiogQHR5cGUgRG9jdW1lbnRGcmFnbWVudFdpdGhUaXRsZSAqLyAobmV3IERvY3VtZW50RnJhZ21lbnQoKSlcbiAgICAgIGNvbnN0IGRvYyA9IHBhcnNlSFRNTChyZXNwb25zZSlcbiAgICAgIHRha2VDaGlsZHJlbkZvcihmcmFnbWVudCwgZG9jLmJvZHkpXG4gICAgICBmcmFnbWVudC50aXRsZSA9IGRvYy50aXRsZVxuICAgIH0gZWxzZSBpZiAoc3RhcnRUYWcgPT09ICdib2R5Jykge1xuICAgICAgLy8gcGFyc2UgYm9keSB3L28gd3JhcHBpbmcgaW4gdGVtcGxhdGVcbiAgICAgIGZyYWdtZW50ID0gLyoqIEB0eXBlIERvY3VtZW50RnJhZ21lbnRXaXRoVGl0bGUgKi8gKG5ldyBEb2N1bWVudEZyYWdtZW50KCkpXG4gICAgICBjb25zdCBkb2MgPSBwYXJzZUhUTUwocmVzcG9uc2VXaXRoTm9IZWFkKVxuICAgICAgdGFrZUNoaWxkcmVuRm9yKGZyYWdtZW50LCBkb2MuYm9keSlcbiAgICAgIGZyYWdtZW50LnRpdGxlID0gZG9jLnRpdGxlXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIG90aGVyd2lzZSB3ZSBoYXZlIG5vbi1ib2R5IHBhcnRpYWwgSFRNTCBjb250ZW50LCBzbyB3cmFwIGl0IGluIGEgdGVtcGxhdGUgdG8gbWF4aW1pemUgcGFyc2luZyBmbGV4aWJpbGl0eVxuICAgICAgY29uc3QgZG9jID0gcGFyc2VIVE1MKCc8Ym9keT48dGVtcGxhdGUgY2xhc3M9XCJpbnRlcm5hbC1odG14LXdyYXBwZXJcIj4nICsgcmVzcG9uc2VXaXRoTm9IZWFkICsgJzwvdGVtcGxhdGU+PC9ib2R5PicpXG4gICAgICBmcmFnbWVudCA9IC8qKiBAdHlwZSBEb2N1bWVudEZyYWdtZW50V2l0aFRpdGxlICovIChkb2MucXVlcnlTZWxlY3RvcigndGVtcGxhdGUnKS5jb250ZW50KVxuICAgICAgLy8gZXh0cmFjdCB0aXRsZSBpbnRvIGZyYWdtZW50IGZvciBsYXRlciBwcm9jZXNzaW5nXG4gICAgICBmcmFnbWVudC50aXRsZSA9IGRvYy50aXRsZVxuXG4gICAgICAvLyBmb3IgbGVnYWN5IHJlYXNvbnMgd2Ugc3VwcG9ydCBhIHRpdGxlIHRhZyBhdCB0aGUgcm9vdCBsZXZlbCBvZiBub24tYm9keSByZXNwb25zZXMsIHNvIHdlIG5lZWQgdG8gaGFuZGxlIGl0XG4gICAgICB2YXIgdGl0bGVFbGVtZW50ID0gZnJhZ21lbnQucXVlcnlTZWxlY3RvcigndGl0bGUnKVxuICAgICAgaWYgKHRpdGxlRWxlbWVudCAmJiB0aXRsZUVsZW1lbnQucGFyZW50Tm9kZSA9PT0gZnJhZ21lbnQpIHtcbiAgICAgICAgdGl0bGVFbGVtZW50LnJlbW92ZSgpXG4gICAgICAgIGZyYWdtZW50LnRpdGxlID0gdGl0bGVFbGVtZW50LmlubmVyVGV4dFxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZnJhZ21lbnQpIHtcbiAgICAgIGlmIChodG14LmNvbmZpZy5hbGxvd1NjcmlwdFRhZ3MpIHtcbiAgICAgICAgbm9ybWFsaXplU2NyaXB0VGFncyhmcmFnbWVudClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIHJlbW92ZSBhbGwgc2NyaXB0IHRhZ3MgaWYgc2NyaXB0cyBhcmUgZGlzYWJsZWRcbiAgICAgICAgZnJhZ21lbnQucXVlcnlTZWxlY3RvckFsbCgnc2NyaXB0JykuZm9yRWFjaCgoc2NyaXB0KSA9PiBzY3JpcHQucmVtb3ZlKCkpXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmcmFnbWVudFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmNcbiAgICovXG4gIGZ1bmN0aW9uIG1heWJlQ2FsbChmdW5jKSB7XG4gICAgaWYgKGZ1bmMpIHtcbiAgICAgIGZ1bmMoKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge2FueX0gb1xuICAgKiBAcGFyYW0ge3N0cmluZ30gdHlwZVxuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgZnVuY3Rpb24gaXNUeXBlKG8sIHR5cGUpIHtcbiAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pID09PSAnW29iamVjdCAnICsgdHlwZSArICddJ1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Kn0gb1xuICAgKiBAcmV0dXJucyB7byBpcyBGdW5jdGlvbn1cbiAgICovXG4gIGZ1bmN0aW9uIGlzRnVuY3Rpb24obykge1xuICAgIHJldHVybiB0eXBlb2YgbyA9PT0gJ2Z1bmN0aW9uJ1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Kn0gb1xuICAgKiBAcmV0dXJucyB7byBpcyBPYmplY3R9XG4gICAqL1xuICBmdW5jdGlvbiBpc1Jhd09iamVjdChvKSB7XG4gICAgcmV0dXJuIGlzVHlwZShvLCAnT2JqZWN0JylcbiAgfVxuXG4gIC8qKlxuICAgKiBAdHlwZWRlZiB7T2JqZWN0fSBPbkhhbmRsZXJcbiAgICogQHByb3BlcnR5IHsoa2V5b2YgSFRNTEVsZW1lbnRFdmVudE1hcCl8c3RyaW5nfSBldmVudFxuICAgKiBAcHJvcGVydHkge0V2ZW50TGlzdGVuZXJ9IGxpc3RlbmVyXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAdHlwZWRlZiB7T2JqZWN0fSBMaXN0ZW5lckluZm9cbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IHRyaWdnZXJcbiAgICogQHByb3BlcnR5IHtFdmVudExpc3RlbmVyfSBsaXN0ZW5lclxuICAgKiBAcHJvcGVydHkge0V2ZW50VGFyZ2V0fSBvblxuICAgKi9cblxuICAvKipcbiAgICogQHR5cGVkZWYge09iamVjdH0gSHRteE5vZGVJbnRlcm5hbERhdGFcbiAgICogRWxlbWVudCBkYXRhXG4gICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbaW5pdEhhc2hdXG4gICAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2Jvb3N0ZWRdXG4gICAqIEBwcm9wZXJ0eSB7T25IYW5kbGVyW119IFtvbkhhbmRsZXJzXVxuICAgKiBAcHJvcGVydHkge251bWJlcn0gW3RpbWVvdXRdXG4gICAqIEBwcm9wZXJ0eSB7TGlzdGVuZXJJbmZvW119IFtsaXN0ZW5lckluZm9zXVxuICAgKiBAcHJvcGVydHkge2Jvb2xlYW59IFtjYW5jZWxsZWRdXG4gICAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW3RyaWdnZXJlZE9uY2VdXG4gICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbZGVsYXllZF1cbiAgICogQHByb3BlcnR5IHtudW1iZXJ8bnVsbH0gW3Rocm90dGxlXVxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gW2xhc3RWYWx1ZV1cbiAgICogQHByb3BlcnR5IHtib29sZWFufSBbbG9hZGVkXVxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gW3BhdGhdXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbdmVyYl1cbiAgICogQHByb3BlcnR5IHtib29sZWFufSBbcG9sbGluZ11cbiAgICogQHByb3BlcnR5IHtIVE1MQnV0dG9uRWxlbWVudHxIVE1MSW5wdXRFbGVtZW50fG51bGx9IFtsYXN0QnV0dG9uQ2xpY2tlZF1cbiAgICogQHByb3BlcnR5IHtudW1iZXJ9IFtyZXF1ZXN0Q291bnRdXG4gICAqIEBwcm9wZXJ0eSB7WE1MSHR0cFJlcXVlc3R9IFt4aHJdXG4gICAqIEBwcm9wZXJ0eSB7KCgpID0+IHZvaWQpW119IFtxdWV1ZWRSZXF1ZXN0c11cbiAgICogQHByb3BlcnR5IHtib29sZWFufSBbYWJvcnRhYmxlXVxuICAgKlxuICAgKiBFdmVudCBkYXRhXG4gICAqIEBwcm9wZXJ0eSB7SHRteFRyaWdnZXJTcGVjaWZpY2F0aW9ufSBbdHJpZ2dlclNwZWNdXG4gICAqIEBwcm9wZXJ0eSB7RXZlbnRUYXJnZXRbXX0gW2hhbmRsZWRGb3JdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBnZXRJbnRlcm5hbERhdGEgcmV0cmlldmVzIFwicHJpdmF0ZVwiIGRhdGEgc3RvcmVkIGJ5IGh0bXggd2l0aGluIGFuIGVsZW1lbnRcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldHxFdmVudH0gZWx0XG4gICAqIEByZXR1cm5zIHtIdG14Tm9kZUludGVybmFsRGF0YX1cbiAgICovXG4gIGZ1bmN0aW9uIGdldEludGVybmFsRGF0YShlbHQpIHtcbiAgICBjb25zdCBkYXRhUHJvcCA9ICdodG14LWludGVybmFsLWRhdGEnXG4gICAgbGV0IGRhdGEgPSBlbHRbZGF0YVByb3BdXG4gICAgaWYgKCFkYXRhKSB7XG4gICAgICBkYXRhID0gZWx0W2RhdGFQcm9wXSA9IHt9XG4gICAgfVxuICAgIHJldHVybiBkYXRhXG4gIH1cblxuICAvKipcbiAgICogdG9BcnJheSBjb252ZXJ0cyBhbiBBcnJheUxpa2Ugb2JqZWN0IGludG8gYSByZWFsIGFycmF5LlxuICAgKiBAdGVtcGxhdGUgVFxuICAgKiBAcGFyYW0ge0FycmF5TGlrZTxUPn0gYXJyXG4gICAqIEByZXR1cm5zIHtUW119XG4gICAqL1xuICBmdW5jdGlvbiB0b0FycmF5KGFycikge1xuICAgIGNvbnN0IHJldHVybkFyciA9IFtdXG4gICAgaWYgKGFycikge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgcmV0dXJuQXJyLnB1c2goYXJyW2ldKVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmV0dXJuQXJyXG4gIH1cblxuICAvKipcbiAgICogQHRlbXBsYXRlIFRcbiAgICogQHBhcmFtIHtUW118TmFtZWROb2RlTWFwfEhUTUxDb2xsZWN0aW9ufEhUTUxGb3JtQ29udHJvbHNDb2xsZWN0aW9ufEFycmF5TGlrZTxUPn0gYXJyXG4gICAqIEBwYXJhbSB7KFQpID0+IHZvaWR9IGZ1bmNcbiAgICovXG4gIGZ1bmN0aW9uIGZvckVhY2goYXJyLCBmdW5jKSB7XG4gICAgaWYgKGFycikge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgZnVuYyhhcnJbaV0pXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWxcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBpc1Njcm9sbGVkSW50b1ZpZXcoZWwpIHtcbiAgICBjb25zdCByZWN0ID0gZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KClcbiAgICBjb25zdCBlbGVtVG9wID0gcmVjdC50b3BcbiAgICBjb25zdCBlbGVtQm90dG9tID0gcmVjdC5ib3R0b21cbiAgICByZXR1cm4gZWxlbVRvcCA8IHdpbmRvdy5pbm5lckhlaWdodCAmJiBlbGVtQm90dG9tID49IDBcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGJvZHlDb250YWlucyhlbHQpIHtcbiAgICAvLyBJRSBGaXhcbiAgICBjb25zdCByb290Tm9kZSA9IGVsdC5nZXRSb290Tm9kZSAmJiBlbHQuZ2V0Um9vdE5vZGUoKVxuICAgIGlmIChyb290Tm9kZSAmJiByb290Tm9kZSBpbnN0YW5jZW9mIHdpbmRvdy5TaGFkb3dSb290KSB7XG4gICAgICByZXR1cm4gZ2V0RG9jdW1lbnQoKS5ib2R5LmNvbnRhaW5zKHJvb3ROb2RlLmhvc3QpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBnZXREb2N1bWVudCgpLmJvZHkuY29udGFpbnMoZWx0KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdHJpZ2dlclxuICAgKiBAcmV0dXJucyB7c3RyaW5nW119XG4gICAqL1xuICBmdW5jdGlvbiBzcGxpdE9uV2hpdGVzcGFjZSh0cmlnZ2VyKSB7XG4gICAgcmV0dXJuIHRyaWdnZXIudHJpbSgpLnNwbGl0KC9cXHMrLylcbiAgfVxuXG4gIC8qKlxuICAgKiBtZXJnZU9iamVjdHMgdGFrZXMgYWxsIHRoZSBrZXlzIGZyb21cbiAgICogb2JqMiBhbmQgZHVwbGljYXRlcyB0aGVtIGludG8gb2JqMVxuICAgKiBAdGVtcGxhdGUgVDFcbiAgICogQHRlbXBsYXRlIFQyXG4gICAqIEBwYXJhbSB7VDF9IG9iajFcbiAgICogQHBhcmFtIHtUMn0gb2JqMlxuICAgKiBAcmV0dXJucyB7VDEgJiBUMn1cbiAgICovXG4gIGZ1bmN0aW9uIG1lcmdlT2JqZWN0cyhvYmoxLCBvYmoyKSB7XG4gICAgZm9yIChjb25zdCBrZXkgaW4gb2JqMikge1xuICAgICAgaWYgKG9iajIuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICAvLyBAdHMtaWdub3JlIHRzYyBkb2Vzbid0IHNlZW0gdG8gcHJvcGVybHkgaGFuZGxlIHR5cGVzIG1lcmdpbmdcbiAgICAgICAgb2JqMVtrZXldID0gb2JqMltrZXldXG4gICAgICB9XG4gICAgfVxuICAgIC8vIEB0cy1pZ25vcmUgdHNjIGRvZXNuJ3Qgc2VlbSB0byBwcm9wZXJseSBoYW5kbGUgdHlwZXMgbWVyZ2luZ1xuICAgIHJldHVybiBvYmoxXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IGpTdHJpbmdcbiAgICogQHJldHVybnMge2FueXxudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gcGFyc2VKU09OKGpTdHJpbmcpIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIEpTT04ucGFyc2UoalN0cmluZylcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nRXJyb3IoZXJyb3IpXG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGNhbkFjY2Vzc0xvY2FsU3RvcmFnZSgpIHtcbiAgICBjb25zdCB0ZXN0ID0gJ2h0bXg6bG9jYWxTdG9yYWdlVGVzdCdcbiAgICB0cnkge1xuICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0odGVzdCwgdGVzdClcbiAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKHRlc3QpXG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgZnVuY3Rpb24gbm9ybWFsaXplUGF0aChwYXRoKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHVybCA9IG5ldyBVUkwocGF0aClcbiAgICAgIGlmICh1cmwpIHtcbiAgICAgICAgcGF0aCA9IHVybC5wYXRobmFtZSArIHVybC5zZWFyY2hcbiAgICAgIH1cbiAgICAgIC8vIHJlbW92ZSB0cmFpbGluZyBzbGFzaCwgdW5sZXNzIGluZGV4IHBhZ2VcbiAgICAgIGlmICghKC9eXFwvJC8udGVzdChwYXRoKSkpIHtcbiAgICAgICAgcGF0aCA9IHBhdGgucmVwbGFjZSgvXFwvKyQvLCAnJylcbiAgICAgIH1cbiAgICAgIHJldHVybiBwYXRoXG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gYmUga2luZCB0byBJRTExLCB3aGljaCBkb2Vzbid0IHN1cHBvcnQgVVJMKClcbiAgICAgIHJldHVybiBwYXRoXG4gICAgfVxuICB9XG5cbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIHB1YmxpYyBBUElcbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAgICogQHJldHVybnMge2FueX1cbiAgICovXG4gIGZ1bmN0aW9uIGludGVybmFsRXZhbChzdHIpIHtcbiAgICByZXR1cm4gbWF5YmVFdmFsKGdldERvY3VtZW50KCkuYm9keSwgZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gZXZhbChzdHIpXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgY2FsbGJhY2sgZm9yIHRoZSAqKmh0bXg6bG9hZCoqIGV2ZW50LiBUaGlzIGNhbiBiZSB1c2VkIHRvIHByb2Nlc3MgbmV3IGNvbnRlbnQsIGZvciBleGFtcGxlIGluaXRpYWxpemluZyB0aGUgY29udGVudCB3aXRoIGEgamF2YXNjcmlwdCBsaWJyYXJ5XG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI29uTG9hZFxuICAgKlxuICAgKiBAcGFyYW0geyhlbHQ6IE5vZGUpID0+IHZvaWR9IGNhbGxiYWNrIHRoZSBjYWxsYmFjayB0byBjYWxsIG9uIG5ld2x5IGxvYWRlZCBjb250ZW50XG4gICAqIEByZXR1cm5zIHtFdmVudExpc3RlbmVyfVxuICAgKi9cbiAgZnVuY3Rpb24gb25Mb2FkSGVscGVyKGNhbGxiYWNrKSB7XG4gICAgY29uc3QgdmFsdWUgPSBodG14Lm9uKCdodG14OmxvYWQnLCAvKiogQHBhcmFtIHtDdXN0b21FdmVudH0gZXZ0ICovIGZ1bmN0aW9uKGV2dCkge1xuICAgICAgY2FsbGJhY2soZXZ0LmRldGFpbC5lbHQpXG4gICAgfSlcbiAgICByZXR1cm4gdmFsdWVcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2cgYWxsIGh0bXggZXZlbnRzLCB1c2VmdWwgZm9yIGRlYnVnZ2luZy5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jbG9nQWxsXG4gICAqL1xuICBmdW5jdGlvbiBsb2dBbGwoKSB7XG4gICAgaHRteC5sb2dnZXIgPSBmdW5jdGlvbihlbHQsIGV2ZW50LCBkYXRhKSB7XG4gICAgICBpZiAoY29uc29sZSkge1xuICAgICAgICBjb25zb2xlLmxvZyhldmVudCwgZWx0LCBkYXRhKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGxvZ05vbmUoKSB7XG4gICAgaHRteC5sb2dnZXIgPSBudWxsXG4gIH1cblxuICAvKipcbiAgICogRmluZHMgYW4gZWxlbWVudCBtYXRjaGluZyB0aGUgc2VsZWN0b3JcbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jZmluZFxuICAgKlxuICAgKiBAcGFyYW0ge1BhcmVudE5vZGV8c3RyaW5nfSBlbHRPclNlbGVjdG9yICB0aGUgcm9vdCBlbGVtZW50IHRvIGZpbmQgdGhlIG1hdGNoaW5nIGVsZW1lbnQgaW4sIGluY2x1c2l2ZSB8IHRoZSBzZWxlY3RvciB0byBtYXRjaFxuICAgKiBAcGFyYW0ge3N0cmluZ30gW3NlbGVjdG9yXSB0aGUgc2VsZWN0b3IgdG8gbWF0Y2hcbiAgICogQHJldHVybnMge0VsZW1lbnR8bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIGZpbmQoZWx0T3JTZWxlY3Rvciwgc2VsZWN0b3IpIHtcbiAgICBpZiAodHlwZW9mIGVsdE9yU2VsZWN0b3IgIT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gZWx0T3JTZWxlY3Rvci5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZmluZChnZXREb2N1bWVudCgpLCBlbHRPclNlbGVjdG9yKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kcyBhbGwgZWxlbWVudHMgbWF0Y2hpbmcgdGhlIHNlbGVjdG9yXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI2ZpbmRBbGxcbiAgICpcbiAgICogQHBhcmFtIHtQYXJlbnROb2RlfHN0cmluZ30gZWx0T3JTZWxlY3RvciB0aGUgcm9vdCBlbGVtZW50IHRvIGZpbmQgdGhlIG1hdGNoaW5nIGVsZW1lbnRzIGluLCBpbmNsdXNpdmUgfCB0aGUgc2VsZWN0b3IgdG8gbWF0Y2hcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtzZWxlY3Rvcl0gdGhlIHNlbGVjdG9yIHRvIG1hdGNoXG4gICAqIEByZXR1cm5zIHtOb2RlTGlzdE9mPEVsZW1lbnQ+fVxuICAgKi9cbiAgZnVuY3Rpb24gZmluZEFsbChlbHRPclNlbGVjdG9yLCBzZWxlY3Rvcikge1xuICAgIGlmICh0eXBlb2YgZWx0T3JTZWxlY3RvciAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiBlbHRPclNlbGVjdG9yLnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBmaW5kQWxsKGdldERvY3VtZW50KCksIGVsdE9yU2VsZWN0b3IpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIFdpbmRvd1xuICAgKi9cbiAgZnVuY3Rpb24gZ2V0V2luZG93KCkge1xuICAgIHJldHVybiB3aW5kb3dcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGFuIGVsZW1lbnQgZnJvbSB0aGUgRE9NXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI3JlbW92ZVxuICAgKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcGFyYW0ge251bWJlcn0gW2RlbGF5XVxuICAgKi9cbiAgZnVuY3Rpb24gcmVtb3ZlRWxlbWVudChlbHQsIGRlbGF5KSB7XG4gICAgZWx0ID0gcmVzb2x2ZVRhcmdldChlbHQpXG4gICAgaWYgKGRlbGF5KSB7XG4gICAgICBnZXRXaW5kb3coKS5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICByZW1vdmVFbGVtZW50KGVsdClcbiAgICAgICAgZWx0ID0gbnVsbFxuICAgICAgfSwgZGVsYXkpXG4gICAgfSBlbHNlIHtcbiAgICAgIHBhcmVudEVsdChlbHQpLnJlbW92ZUNoaWxkKGVsdClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHthbnl9IGVsdFxuICAgKiBAcmV0dXJuIHtFbGVtZW50fG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBhc0VsZW1lbnQoZWx0KSB7XG4gICAgcmV0dXJuIGVsdCBpbnN0YW5jZW9mIEVsZW1lbnQgPyBlbHQgOiBudWxsXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHthbnl9IGVsdFxuICAgKiBAcmV0dXJuIHtIVE1MRWxlbWVudHxudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gYXNIdG1sRWxlbWVudChlbHQpIHtcbiAgICByZXR1cm4gZWx0IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQgPyBlbHQgOiBudWxsXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHthbnl9IHZhbHVlXG4gICAqIEByZXR1cm4ge3N0cmluZ3xudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gYXNTdHJpbmcodmFsdWUpIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyA/IHZhbHVlIDogbnVsbFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR9IGVsdFxuICAgKiBAcmV0dXJuIHtQYXJlbnROb2RlfG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBhc1BhcmVudE5vZGUoZWx0KSB7XG4gICAgcmV0dXJuIGVsdCBpbnN0YW5jZW9mIEVsZW1lbnQgfHwgZWx0IGluc3RhbmNlb2YgRG9jdW1lbnQgfHwgZWx0IGluc3RhbmNlb2YgRG9jdW1lbnRGcmFnbWVudCA/IGVsdCA6IG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIG1ldGhvZCBhZGRzIGEgY2xhc3MgdG8gdGhlIGdpdmVuIGVsZW1lbnQuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI2FkZENsYXNzXG4gICAqXG4gICAqIEBwYXJhbSB7RWxlbWVudHxzdHJpbmd9IGVsdCB0aGUgZWxlbWVudCB0byBhZGQgdGhlIGNsYXNzIHRvXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjbGF6eiB0aGUgY2xhc3MgdG8gYWRkXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbZGVsYXldIHRoZSBkZWxheSAoaW4gbWlsbGlzZWNvbmRzKSBiZWZvcmUgY2xhc3MgaXMgYWRkZWRcbiAgICovXG4gIGZ1bmN0aW9uIGFkZENsYXNzVG9FbGVtZW50KGVsdCwgY2xhenosIGRlbGF5KSB7XG4gICAgZWx0ID0gYXNFbGVtZW50KHJlc29sdmVUYXJnZXQoZWx0KSlcbiAgICBpZiAoIWVsdCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGlmIChkZWxheSkge1xuICAgICAgZ2V0V2luZG93KCkuc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgYWRkQ2xhc3NUb0VsZW1lbnQoZWx0LCBjbGF6eilcbiAgICAgICAgZWx0ID0gbnVsbFxuICAgICAgfSwgZGVsYXkpXG4gICAgfSBlbHNlIHtcbiAgICAgIGVsdC5jbGFzc0xpc3QgJiYgZWx0LmNsYXNzTGlzdC5hZGQoY2xhenopXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgYSBjbGFzcyBmcm9tIHRoZSBnaXZlbiBlbGVtZW50XG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI3JlbW92ZUNsYXNzXG4gICAqXG4gICAqIEBwYXJhbSB7Tm9kZXxzdHJpbmd9IG5vZGUgZWxlbWVudCB0byByZW1vdmUgdGhlIGNsYXNzIGZyb21cbiAgICogQHBhcmFtIHtzdHJpbmd9IGNsYXp6IHRoZSBjbGFzcyB0byByZW1vdmVcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtkZWxheV0gdGhlIGRlbGF5IChpbiBtaWxsaXNlY29uZHMgYmVmb3JlIGNsYXNzIGlzIHJlbW92ZWQpXG4gICAqL1xuICBmdW5jdGlvbiByZW1vdmVDbGFzc0Zyb21FbGVtZW50KG5vZGUsIGNsYXp6LCBkZWxheSkge1xuICAgIGxldCBlbHQgPSBhc0VsZW1lbnQocmVzb2x2ZVRhcmdldChub2RlKSlcbiAgICBpZiAoIWVsdCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGlmIChkZWxheSkge1xuICAgICAgZ2V0V2luZG93KCkuc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgcmVtb3ZlQ2xhc3NGcm9tRWxlbWVudChlbHQsIGNsYXp6KVxuICAgICAgICBlbHQgPSBudWxsXG4gICAgICB9LCBkZWxheSlcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGVsdC5jbGFzc0xpc3QpIHtcbiAgICAgICAgZWx0LmNsYXNzTGlzdC5yZW1vdmUoY2xhenopXG4gICAgICAgIC8vIGlmIHRoZXJlIGFyZSBubyBjbGFzc2VzIGxlZnQsIHJlbW92ZSB0aGUgY2xhc3MgYXR0cmlidXRlXG4gICAgICAgIGlmIChlbHQuY2xhc3NMaXN0Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIGVsdC5yZW1vdmVBdHRyaWJ1dGUoJ2NsYXNzJylcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUb2dnbGVzIHRoZSBnaXZlbiBjbGFzcyBvbiBhbiBlbGVtZW50XG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI3RvZ2dsZUNsYXNzXG4gICAqXG4gICAqIEBwYXJhbSB7RWxlbWVudHxzdHJpbmd9IGVsdCB0aGUgZWxlbWVudCB0byB0b2dnbGUgdGhlIGNsYXNzIG9uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjbGF6eiB0aGUgY2xhc3MgdG8gdG9nZ2xlXG4gICAqL1xuICBmdW5jdGlvbiB0b2dnbGVDbGFzc09uRWxlbWVudChlbHQsIGNsYXp6KSB7XG4gICAgZWx0ID0gcmVzb2x2ZVRhcmdldChlbHQpXG4gICAgZWx0LmNsYXNzTGlzdC50b2dnbGUoY2xhenopXG4gIH1cblxuICAvKipcbiAgICogVGFrZXMgdGhlIGdpdmVuIGNsYXNzIGZyb20gaXRzIHNpYmxpbmdzLCBzbyB0aGF0IGFtb25nIGl0cyBzaWJsaW5ncywgb25seSB0aGUgZ2l2ZW4gZWxlbWVudCB3aWxsIGhhdmUgdGhlIGNsYXNzLlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyN0YWtlQ2xhc3NcbiAgICpcbiAgICogQHBhcmFtIHtOb2RlfHN0cmluZ30gZWx0IHRoZSBlbGVtZW50IHRoYXQgd2lsbCB0YWtlIHRoZSBjbGFzc1xuICAgKiBAcGFyYW0ge3N0cmluZ30gY2xhenogdGhlIGNsYXNzIHRvIHRha2VcbiAgICovXG4gIGZ1bmN0aW9uIHRha2VDbGFzc0ZvckVsZW1lbnQoZWx0LCBjbGF6eikge1xuICAgIGVsdCA9IHJlc29sdmVUYXJnZXQoZWx0KVxuICAgIGZvckVhY2goZWx0LnBhcmVudEVsZW1lbnQuY2hpbGRyZW4sIGZ1bmN0aW9uKGNoaWxkKSB7XG4gICAgICByZW1vdmVDbGFzc0Zyb21FbGVtZW50KGNoaWxkLCBjbGF6eilcbiAgICB9KVxuICAgIGFkZENsYXNzVG9FbGVtZW50KGFzRWxlbWVudChlbHQpLCBjbGF6eilcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kcyB0aGUgY2xvc2VzdCBtYXRjaGluZyBlbGVtZW50IGluIHRoZSBnaXZlbiBlbGVtZW50cyBwYXJlbnRhZ2UsIGluY2x1c2l2ZSBvZiB0aGUgZWxlbWVudFxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNjbG9zZXN0XG4gICAqXG4gICAqIEBwYXJhbSB7RWxlbWVudHxzdHJpbmd9IGVsdCB0aGUgZWxlbWVudCB0byBmaW5kIHRoZSBzZWxlY3RvciBmcm9tXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvciB0aGUgc2VsZWN0b3IgdG8gZmluZFxuICAgKiBAcmV0dXJucyB7RWxlbWVudHxudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gY2xvc2VzdChlbHQsIHNlbGVjdG9yKSB7XG4gICAgZWx0ID0gYXNFbGVtZW50KHJlc29sdmVUYXJnZXQoZWx0KSlcbiAgICBpZiAoZWx0ICYmIGVsdC5jbG9zZXN0KSB7XG4gICAgICByZXR1cm4gZWx0LmNsb3Nlc3Qoc2VsZWN0b3IpXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFRPRE8gcmVtb3ZlIHdoZW4gSUUgZ29lcyBhd2F5XG4gICAgICBkbyB7XG4gICAgICAgIGlmIChlbHQgPT0gbnVsbCB8fCBtYXRjaGVzKGVsdCwgc2VsZWN0b3IpKSB7XG4gICAgICAgICAgcmV0dXJuIGVsdFxuICAgICAgICB9XG4gICAgICB9XG4gICAgICB3aGlsZSAoZWx0ID0gZWx0ICYmIGFzRWxlbWVudChwYXJlbnRFbHQoZWx0KSkpXG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwcmVmaXhcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBzdGFydHNXaXRoKHN0ciwgcHJlZml4KSB7XG4gICAgcmV0dXJuIHN0ci5zdWJzdHJpbmcoMCwgcHJlZml4Lmxlbmd0aCkgPT09IHByZWZpeFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN1ZmZpeFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGVuZHNXaXRoKHN0ciwgc3VmZml4KSB7XG4gICAgcmV0dXJuIHN0ci5zdWJzdHJpbmcoc3RyLmxlbmd0aCAtIHN1ZmZpeC5sZW5ndGgpID09PSBzdWZmaXhcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3JcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGZ1bmN0aW9uIG5vcm1hbGl6ZVNlbGVjdG9yKHNlbGVjdG9yKSB7XG4gICAgY29uc3QgdHJpbW1lZFNlbGVjdG9yID0gc2VsZWN0b3IudHJpbSgpXG4gICAgaWYgKHN0YXJ0c1dpdGgodHJpbW1lZFNlbGVjdG9yLCAnPCcpICYmIGVuZHNXaXRoKHRyaW1tZWRTZWxlY3RvciwgJy8+JykpIHtcbiAgICAgIHJldHVybiB0cmltbWVkU2VsZWN0b3Iuc3Vic3RyaW5nKDEsIHRyaW1tZWRTZWxlY3Rvci5sZW5ndGggLSAyKVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdHJpbW1lZFNlbGVjdG9yXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZXxFbGVtZW50fERvY3VtZW50fHN0cmluZ30gZWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvclxuICAgKiBAcGFyYW0ge2Jvb2xlYW49fSBnbG9iYWxcbiAgICogQHJldHVybnMgeyhOb2RlfFdpbmRvdylbXX1cbiAgICovXG4gIGZ1bmN0aW9uIHF1ZXJ5U2VsZWN0b3JBbGxFeHQoZWx0LCBzZWxlY3RvciwgZ2xvYmFsKSB7XG4gICAgZWx0ID0gcmVzb2x2ZVRhcmdldChlbHQpXG4gICAgaWYgKHNlbGVjdG9yLmluZGV4T2YoJ2Nsb3Nlc3QgJykgPT09IDApIHtcbiAgICAgIHJldHVybiBbY2xvc2VzdChhc0VsZW1lbnQoZWx0KSwgbm9ybWFsaXplU2VsZWN0b3Ioc2VsZWN0b3Iuc3Vic3RyKDgpKSldXG4gICAgfSBlbHNlIGlmIChzZWxlY3Rvci5pbmRleE9mKCdmaW5kICcpID09PSAwKSB7XG4gICAgICByZXR1cm4gW2ZpbmQoYXNQYXJlbnROb2RlKGVsdCksIG5vcm1hbGl6ZVNlbGVjdG9yKHNlbGVjdG9yLnN1YnN0cig1KSkpXVxuICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IgPT09ICduZXh0Jykge1xuICAgICAgcmV0dXJuIFthc0VsZW1lbnQoZWx0KS5uZXh0RWxlbWVudFNpYmxpbmddXG4gICAgfSBlbHNlIGlmIChzZWxlY3Rvci5pbmRleE9mKCduZXh0ICcpID09PSAwKSB7XG4gICAgICByZXR1cm4gW3NjYW5Gb3J3YXJkUXVlcnkoZWx0LCBub3JtYWxpemVTZWxlY3RvcihzZWxlY3Rvci5zdWJzdHIoNSkpLCAhIWdsb2JhbCldXG4gICAgfSBlbHNlIGlmIChzZWxlY3RvciA9PT0gJ3ByZXZpb3VzJykge1xuICAgICAgcmV0dXJuIFthc0VsZW1lbnQoZWx0KS5wcmV2aW91c0VsZW1lbnRTaWJsaW5nXVxuICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IuaW5kZXhPZigncHJldmlvdXMgJykgPT09IDApIHtcbiAgICAgIHJldHVybiBbc2NhbkJhY2t3YXJkc1F1ZXJ5KGVsdCwgbm9ybWFsaXplU2VsZWN0b3Ioc2VsZWN0b3Iuc3Vic3RyKDkpKSwgISFnbG9iYWwpXVxuICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IgPT09ICdkb2N1bWVudCcpIHtcbiAgICAgIHJldHVybiBbZG9jdW1lbnRdXG4gICAgfSBlbHNlIGlmIChzZWxlY3RvciA9PT0gJ3dpbmRvdycpIHtcbiAgICAgIHJldHVybiBbd2luZG93XVxuICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IgPT09ICdib2R5Jykge1xuICAgICAgcmV0dXJuIFtkb2N1bWVudC5ib2R5XVxuICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IgPT09ICdyb290Jykge1xuICAgICAgcmV0dXJuIFtnZXRSb290Tm9kZShlbHQsICEhZ2xvYmFsKV1cbiAgICB9IGVsc2UgaWYgKHNlbGVjdG9yLmluZGV4T2YoJ2dsb2JhbCAnKSA9PT0gMCkge1xuICAgICAgcmV0dXJuIHF1ZXJ5U2VsZWN0b3JBbGxFeHQoZWx0LCBzZWxlY3Rvci5zbGljZSg3KSwgdHJ1ZSlcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRvQXJyYXkoYXNQYXJlbnROb2RlKGdldFJvb3ROb2RlKGVsdCwgISFnbG9iYWwpKS5xdWVyeVNlbGVjdG9yQWxsKG5vcm1hbGl6ZVNlbGVjdG9yKHNlbGVjdG9yKSkpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gc3RhcnRcbiAgICogQHBhcmFtIHtzdHJpbmd9IG1hdGNoXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gZ2xvYmFsXG4gICAqIEByZXR1cm5zIHtFbGVtZW50fVxuICAgKi9cbiAgdmFyIHNjYW5Gb3J3YXJkUXVlcnkgPSBmdW5jdGlvbihzdGFydCwgbWF0Y2gsIGdsb2JhbCkge1xuICAgIGNvbnN0IHJlc3VsdHMgPSBhc1BhcmVudE5vZGUoZ2V0Um9vdE5vZGUoc3RhcnQsIGdsb2JhbCkpLnF1ZXJ5U2VsZWN0b3JBbGwobWF0Y2gpXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXN1bHRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBlbHQgPSByZXN1bHRzW2ldXG4gICAgICBpZiAoZWx0LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKHN0YXJ0KSA9PT0gTm9kZS5ET0NVTUVOVF9QT1NJVElPTl9QUkVDRURJTkcpIHtcbiAgICAgICAgcmV0dXJuIGVsdFxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IHN0YXJ0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtYXRjaFxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGdsb2JhbFxuICAgKiBAcmV0dXJucyB7RWxlbWVudH1cbiAgICovXG4gIHZhciBzY2FuQmFja3dhcmRzUXVlcnkgPSBmdW5jdGlvbihzdGFydCwgbWF0Y2gsIGdsb2JhbCkge1xuICAgIGNvbnN0IHJlc3VsdHMgPSBhc1BhcmVudE5vZGUoZ2V0Um9vdE5vZGUoc3RhcnQsIGdsb2JhbCkpLnF1ZXJ5U2VsZWN0b3JBbGwobWF0Y2gpXG4gICAgZm9yIChsZXQgaSA9IHJlc3VsdHMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIGNvbnN0IGVsdCA9IHJlc3VsdHNbaV1cbiAgICAgIGlmIChlbHQuY29tcGFyZURvY3VtZW50UG9zaXRpb24oc3RhcnQpID09PSBOb2RlLkRPQ1VNRU5UX1BPU0lUSU9OX0ZPTExPV0lORykge1xuICAgICAgICByZXR1cm4gZWx0XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZXxzdHJpbmd9IGVsdE9yU2VsZWN0b3JcbiAgICogQHBhcmFtIHtzdHJpbmc9fSBzZWxlY3RvclxuICAgKiBAcmV0dXJucyB7Tm9kZXxXaW5kb3d9XG4gICAqL1xuICBmdW5jdGlvbiBxdWVyeVNlbGVjdG9yRXh0KGVsdE9yU2VsZWN0b3IsIHNlbGVjdG9yKSB7XG4gICAgaWYgKHR5cGVvZiBlbHRPclNlbGVjdG9yICE9PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIHF1ZXJ5U2VsZWN0b3JBbGxFeHQoZWx0T3JTZWxlY3Rvciwgc2VsZWN0b3IpWzBdXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBxdWVyeVNlbGVjdG9yQWxsRXh0KGdldERvY3VtZW50KCkuYm9keSwgZWx0T3JTZWxlY3RvcilbMF1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHRlbXBsYXRlIHtFdmVudFRhcmdldH0gVFxuICAgKiBAcGFyYW0ge1R8c3RyaW5nfSBlbHRPclNlbGVjdG9yXG4gICAqIEBwYXJhbSB7VH0gW2NvbnRleHRdXG4gICAqIEByZXR1cm5zIHtFbGVtZW50fFR8bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIHJlc29sdmVUYXJnZXQoZWx0T3JTZWxlY3RvciwgY29udGV4dCkge1xuICAgIGlmICh0eXBlb2YgZWx0T3JTZWxlY3RvciA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiBmaW5kKGFzUGFyZW50Tm9kZShjb250ZXh0KSB8fCBkb2N1bWVudCwgZWx0T3JTZWxlY3RvcilcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGVsdE9yU2VsZWN0b3JcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHR5cGVkZWYge2tleW9mIEhUTUxFbGVtZW50RXZlbnRNYXB8c3RyaW5nfSBBbnlFdmVudE5hbWVcbiAgICovXG5cbiAgLyoqXG4gICAqIEB0eXBlZGVmIHtPYmplY3R9IEV2ZW50QXJnc1xuICAgKiBAcHJvcGVydHkge0V2ZW50VGFyZ2V0fSB0YXJnZXRcbiAgICogQHByb3BlcnR5IHtBbnlFdmVudE5hbWV9IGV2ZW50XG4gICAqIEBwcm9wZXJ0eSB7RXZlbnRMaXN0ZW5lcn0gbGlzdGVuZXJcbiAgICovXG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR8QW55RXZlbnROYW1lfSBhcmcxXG4gICAqIEBwYXJhbSB7QW55RXZlbnROYW1lfEV2ZW50TGlzdGVuZXJ9IGFyZzJcbiAgICogQHBhcmFtIHtFdmVudExpc3RlbmVyfSBbYXJnM11cbiAgICogQHJldHVybnMge0V2ZW50QXJnc31cbiAgICovXG4gIGZ1bmN0aW9uIHByb2Nlc3NFdmVudEFyZ3MoYXJnMSwgYXJnMiwgYXJnMykge1xuICAgIGlmIChpc0Z1bmN0aW9uKGFyZzIpKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0YXJnZXQ6IGdldERvY3VtZW50KCkuYm9keSxcbiAgICAgICAgZXZlbnQ6IGFzU3RyaW5nKGFyZzEpLFxuICAgICAgICBsaXN0ZW5lcjogYXJnMlxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0YXJnZXQ6IHJlc29sdmVUYXJnZXQoYXJnMSksXG4gICAgICAgIGV2ZW50OiBhc1N0cmluZyhhcmcyKSxcbiAgICAgICAgbGlzdGVuZXI6IGFyZzNcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhbiBldmVudCBsaXN0ZW5lciB0byBhbiBlbGVtZW50XG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI29uXG4gICAqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR8c3RyaW5nfSBhcmcxIHRoZSBlbGVtZW50IHRvIGFkZCB0aGUgbGlzdGVuZXIgdG8gfCB0aGUgZXZlbnQgbmFtZSB0byBhZGQgdGhlIGxpc3RlbmVyIGZvclxuICAgKiBAcGFyYW0ge3N0cmluZ3xFdmVudExpc3RlbmVyfSBhcmcyIHRoZSBldmVudCBuYW1lIHRvIGFkZCB0aGUgbGlzdGVuZXIgZm9yIHwgdGhlIGxpc3RlbmVyIHRvIGFkZFxuICAgKiBAcGFyYW0ge0V2ZW50TGlzdGVuZXJ9IFthcmczXSB0aGUgbGlzdGVuZXIgdG8gYWRkXG4gICAqIEByZXR1cm5zIHtFdmVudExpc3RlbmVyfVxuICAgKi9cbiAgZnVuY3Rpb24gYWRkRXZlbnRMaXN0ZW5lckltcGwoYXJnMSwgYXJnMiwgYXJnMykge1xuICAgIHJlYWR5KGZ1bmN0aW9uKCkge1xuICAgICAgY29uc3QgZXZlbnRBcmdzID0gcHJvY2Vzc0V2ZW50QXJncyhhcmcxLCBhcmcyLCBhcmczKVxuICAgICAgZXZlbnRBcmdzLnRhcmdldC5hZGRFdmVudExpc3RlbmVyKGV2ZW50QXJncy5ldmVudCwgZXZlbnRBcmdzLmxpc3RlbmVyKVxuICAgIH0pXG4gICAgY29uc3QgYiA9IGlzRnVuY3Rpb24oYXJnMilcbiAgICByZXR1cm4gYiA/IGFyZzIgOiBhcmczXG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyBhbiBldmVudCBsaXN0ZW5lciBmcm9tIGFuIGVsZW1lbnRcbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jb2ZmXG4gICAqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR8c3RyaW5nfSBhcmcxIHRoZSBlbGVtZW50IHRvIHJlbW92ZSB0aGUgbGlzdGVuZXIgZnJvbSB8IHRoZSBldmVudCBuYW1lIHRvIHJlbW92ZSB0aGUgbGlzdGVuZXIgZnJvbVxuICAgKiBAcGFyYW0ge3N0cmluZ3xFdmVudExpc3RlbmVyfSBhcmcyIHRoZSBldmVudCBuYW1lIHRvIHJlbW92ZSB0aGUgbGlzdGVuZXIgZnJvbSB8IHRoZSBsaXN0ZW5lciB0byByZW1vdmVcbiAgICogQHBhcmFtIHtFdmVudExpc3RlbmVyfSBbYXJnM10gdGhlIGxpc3RlbmVyIHRvIHJlbW92ZVxuICAgKiBAcmV0dXJucyB7RXZlbnRMaXN0ZW5lcn1cbiAgICovXG4gIGZ1bmN0aW9uIHJlbW92ZUV2ZW50TGlzdGVuZXJJbXBsKGFyZzEsIGFyZzIsIGFyZzMpIHtcbiAgICByZWFkeShmdW5jdGlvbigpIHtcbiAgICAgIGNvbnN0IGV2ZW50QXJncyA9IHByb2Nlc3NFdmVudEFyZ3MoYXJnMSwgYXJnMiwgYXJnMylcbiAgICAgIGV2ZW50QXJncy50YXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudEFyZ3MuZXZlbnQsIGV2ZW50QXJncy5saXN0ZW5lcilcbiAgICB9KVxuICAgIHJldHVybiBpc0Z1bmN0aW9uKGFyZzIpID8gYXJnMiA6IGFyZzNcbiAgfVxuXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIE5vZGUgcHJvY2Vzc2luZ1xuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIGNvbnN0IERVTU1ZX0VMVCA9IGdldERvY3VtZW50KCkuY3JlYXRlRWxlbWVudCgnb3V0cHV0JykgLy8gZHVtbXkgZWxlbWVudCBmb3IgYmFkIHNlbGVjdG9yc1xuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGF0dHJOYW1lXG4gICAqIEByZXR1cm5zIHsoTm9kZXxXaW5kb3cpW119XG4gICAqL1xuICBmdW5jdGlvbiBmaW5kQXR0cmlidXRlVGFyZ2V0cyhlbHQsIGF0dHJOYW1lKSB7XG4gICAgY29uc3QgYXR0clRhcmdldCA9IGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsIGF0dHJOYW1lKVxuICAgIGlmIChhdHRyVGFyZ2V0KSB7XG4gICAgICBpZiAoYXR0clRhcmdldCA9PT0gJ3RoaXMnKSB7XG4gICAgICAgIHJldHVybiBbZmluZFRoaXNFbGVtZW50KGVsdCwgYXR0ck5hbWUpXVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gcXVlcnlTZWxlY3RvckFsbEV4dChlbHQsIGF0dHJUYXJnZXQpXG4gICAgICAgIGlmIChyZXN1bHQubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgbG9nRXJyb3IoJ1RoZSBzZWxlY3RvciBcIicgKyBhdHRyVGFyZ2V0ICsgJ1wiIG9uICcgKyBhdHRyTmFtZSArICcgcmV0dXJuZWQgbm8gbWF0Y2hlcyEnKVxuICAgICAgICAgIHJldHVybiBbRFVNTVlfRUxUXVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiByZXN1bHRcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXR0cmlidXRlXG4gICAqIEByZXR1cm5zIHtFbGVtZW50fG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBmaW5kVGhpc0VsZW1lbnQoZWx0LCBhdHRyaWJ1dGUpIHtcbiAgICByZXR1cm4gYXNFbGVtZW50KGdldENsb3Nlc3RNYXRjaChlbHQsIGZ1bmN0aW9uKGVsdCkge1xuICAgICAgcmV0dXJuIGdldEF0dHJpYnV0ZVZhbHVlKGFzRWxlbWVudChlbHQpLCBhdHRyaWJ1dGUpICE9IG51bGxcbiAgICB9KSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJucyB7Tm9kZXxXaW5kb3d8bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIGdldFRhcmdldChlbHQpIHtcbiAgICBjb25zdCB0YXJnZXRTdHIgPSBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtdGFyZ2V0JylcbiAgICBpZiAodGFyZ2V0U3RyKSB7XG4gICAgICBpZiAodGFyZ2V0U3RyID09PSAndGhpcycpIHtcbiAgICAgICAgcmV0dXJuIGZpbmRUaGlzRWxlbWVudChlbHQsICdoeC10YXJnZXQnKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHF1ZXJ5U2VsZWN0b3JFeHQoZWx0LCB0YXJnZXRTdHIpXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGRhdGEgPSBnZXRJbnRlcm5hbERhdGEoZWx0KVxuICAgICAgaWYgKGRhdGEuYm9vc3RlZCkge1xuICAgICAgICByZXR1cm4gZ2V0RG9jdW1lbnQoKS5ib2R5XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gZWx0XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gc2hvdWxkU2V0dGxlQXR0cmlidXRlKG5hbWUpIHtcbiAgICBjb25zdCBhdHRyaWJ1dGVzVG9TZXR0bGUgPSBodG14LmNvbmZpZy5hdHRyaWJ1dGVzVG9TZXR0bGVcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGF0dHJpYnV0ZXNUb1NldHRsZS5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKG5hbWUgPT09IGF0dHJpYnV0ZXNUb1NldHRsZVtpXSkge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IG1lcmdlVG9cbiAgICogQHBhcmFtIHtFbGVtZW50fSBtZXJnZUZyb21cbiAgICovXG4gIGZ1bmN0aW9uIGNsb25lQXR0cmlidXRlcyhtZXJnZVRvLCBtZXJnZUZyb20pIHtcbiAgICBmb3JFYWNoKG1lcmdlVG8uYXR0cmlidXRlcywgZnVuY3Rpb24oYXR0cikge1xuICAgICAgaWYgKCFtZXJnZUZyb20uaGFzQXR0cmlidXRlKGF0dHIubmFtZSkgJiYgc2hvdWxkU2V0dGxlQXR0cmlidXRlKGF0dHIubmFtZSkpIHtcbiAgICAgICAgbWVyZ2VUby5yZW1vdmVBdHRyaWJ1dGUoYXR0ci5uYW1lKVxuICAgICAgfVxuICAgIH0pXG4gICAgZm9yRWFjaChtZXJnZUZyb20uYXR0cmlidXRlcywgZnVuY3Rpb24oYXR0cikge1xuICAgICAgaWYgKHNob3VsZFNldHRsZUF0dHJpYnV0ZShhdHRyLm5hbWUpKSB7XG4gICAgICAgIG1lcmdlVG8uc2V0QXR0cmlidXRlKGF0dHIubmFtZSwgYXR0ci52YWx1ZSlcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7SHRteFN3YXBTdHlsZX0gc3dhcFN0eWxlXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gdGFyZ2V0XG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gaXNJbmxpbmVTd2FwKHN3YXBTdHlsZSwgdGFyZ2V0KSB7XG4gICAgY29uc3QgZXh0ZW5zaW9ucyA9IGdldEV4dGVuc2lvbnModGFyZ2V0KVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgZXh0ZW5zaW9uID0gZXh0ZW5zaW9uc1tpXVxuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKGV4dGVuc2lvbi5pc0lubGluZVN3YXAoc3dhcFN0eWxlKSkge1xuICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgbG9nRXJyb3IoZSlcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHN3YXBTdHlsZSA9PT0gJ291dGVySFRNTCdcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gb29iVmFsdWVcbiAgICogQHBhcmFtIHtFbGVtZW50fSBvb2JFbGVtZW50XG4gICAqIEBwYXJhbSB7SHRteFNldHRsZUluZm99IHNldHRsZUluZm9cbiAgICogQHJldHVybnNcbiAgICovXG4gIGZ1bmN0aW9uIG9vYlN3YXAob29iVmFsdWUsIG9vYkVsZW1lbnQsIHNldHRsZUluZm8pIHtcbiAgICBsZXQgc2VsZWN0b3IgPSAnIycgKyBnZXRSYXdBdHRyaWJ1dGUob29iRWxlbWVudCwgJ2lkJylcbiAgICAvKiogQHR5cGUgSHRteFN3YXBTdHlsZSAqL1xuICAgIGxldCBzd2FwU3R5bGUgPSAnb3V0ZXJIVE1MJ1xuICAgIGlmIChvb2JWYWx1ZSA9PT0gJ3RydWUnKSB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfSBlbHNlIGlmIChvb2JWYWx1ZS5pbmRleE9mKCc6JykgPiAwKSB7XG4gICAgICBzd2FwU3R5bGUgPSBvb2JWYWx1ZS5zdWJzdHIoMCwgb29iVmFsdWUuaW5kZXhPZignOicpKVxuICAgICAgc2VsZWN0b3IgPSBvb2JWYWx1ZS5zdWJzdHIob29iVmFsdWUuaW5kZXhPZignOicpICsgMSwgb29iVmFsdWUubGVuZ3RoKVxuICAgIH0gZWxzZSB7XG4gICAgICBzd2FwU3R5bGUgPSBvb2JWYWx1ZVxuICAgIH1cblxuICAgIGNvbnN0IHRhcmdldHMgPSBnZXREb2N1bWVudCgpLnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpXG4gICAgaWYgKHRhcmdldHMpIHtcbiAgICAgIGZvckVhY2goXG4gICAgICAgIHRhcmdldHMsXG4gICAgICAgIGZ1bmN0aW9uKHRhcmdldCkge1xuICAgICAgICAgIGxldCBmcmFnbWVudFxuICAgICAgICAgIGNvbnN0IG9vYkVsZW1lbnRDbG9uZSA9IG9vYkVsZW1lbnQuY2xvbmVOb2RlKHRydWUpXG4gICAgICAgICAgZnJhZ21lbnQgPSBnZXREb2N1bWVudCgpLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKVxuICAgICAgICAgIGZyYWdtZW50LmFwcGVuZENoaWxkKG9vYkVsZW1lbnRDbG9uZSlcbiAgICAgICAgICBpZiAoIWlzSW5saW5lU3dhcChzd2FwU3R5bGUsIHRhcmdldCkpIHtcbiAgICAgICAgICAgIGZyYWdtZW50ID0gYXNQYXJlbnROb2RlKG9vYkVsZW1lbnRDbG9uZSkgLy8gaWYgdGhpcyBpcyBub3QgYW4gaW5saW5lIHN3YXAsIHdlIHVzZSB0aGUgY29udGVudCBvZiB0aGUgbm9kZSwgbm90IHRoZSBub2RlIGl0c2VsZlxuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGJlZm9yZVN3YXBEZXRhaWxzID0geyBzaG91bGRTd2FwOiB0cnVlLCB0YXJnZXQsIGZyYWdtZW50IH1cbiAgICAgICAgICBpZiAoIXRyaWdnZXJFdmVudCh0YXJnZXQsICdodG14Om9vYkJlZm9yZVN3YXAnLCBiZWZvcmVTd2FwRGV0YWlscykpIHJldHVyblxuXG4gICAgICAgICAgdGFyZ2V0ID0gYmVmb3JlU3dhcERldGFpbHMudGFyZ2V0IC8vIGFsbG93IHJlLXRhcmdldGluZ1xuICAgICAgICAgIGlmIChiZWZvcmVTd2FwRGV0YWlscy5zaG91bGRTd2FwKSB7XG4gICAgICAgICAgICBzd2FwV2l0aFN0eWxlKHN3YXBTdHlsZSwgdGFyZ2V0LCB0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgICAgIH1cbiAgICAgICAgICBmb3JFYWNoKHNldHRsZUluZm8uZWx0cywgZnVuY3Rpb24oZWx0KSB7XG4gICAgICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDpvb2JBZnRlclN3YXAnLCBiZWZvcmVTd2FwRGV0YWlscylcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICApXG4gICAgICBvb2JFbGVtZW50LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQob29iRWxlbWVudClcbiAgICB9IGVsc2Uge1xuICAgICAgb29iRWxlbWVudC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG9vYkVsZW1lbnQpXG4gICAgICB0cmlnZ2VyRXJyb3JFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14Om9vYkVycm9yTm9UYXJnZXQnLCB7IGNvbnRlbnQ6IG9vYkVsZW1lbnQgfSlcbiAgICB9XG4gICAgcmV0dXJuIG9vYlZhbHVlXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtEb2N1bWVudEZyYWdtZW50fSBmcmFnbWVudFxuICAgKi9cbiAgZnVuY3Rpb24gaGFuZGxlUHJlc2VydmVkRWxlbWVudHMoZnJhZ21lbnQpIHtcbiAgICBmb3JFYWNoKGZpbmRBbGwoZnJhZ21lbnQsICdbaHgtcHJlc2VydmVdLCBbZGF0YS1oeC1wcmVzZXJ2ZV0nKSwgZnVuY3Rpb24ocHJlc2VydmVkRWx0KSB7XG4gICAgICBjb25zdCBpZCA9IGdldEF0dHJpYnV0ZVZhbHVlKHByZXNlcnZlZEVsdCwgJ2lkJylcbiAgICAgIGNvbnN0IG9sZEVsdCA9IGdldERvY3VtZW50KCkuZ2V0RWxlbWVudEJ5SWQoaWQpXG4gICAgICBpZiAob2xkRWx0ICE9IG51bGwpIHtcbiAgICAgICAgcHJlc2VydmVkRWx0LnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKG9sZEVsdCwgcHJlc2VydmVkRWx0KVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBwYXJlbnROb2RlXG4gICAqIEBwYXJhbSB7UGFyZW50Tm9kZX0gZnJhZ21lbnRcbiAgICogQHBhcmFtIHtIdG14U2V0dGxlSW5mb30gc2V0dGxlSW5mb1xuICAgKi9cbiAgZnVuY3Rpb24gaGFuZGxlQXR0cmlidXRlcyhwYXJlbnROb2RlLCBmcmFnbWVudCwgc2V0dGxlSW5mbykge1xuICAgIGZvckVhY2goZnJhZ21lbnQucXVlcnlTZWxlY3RvckFsbCgnW2lkXScpLCBmdW5jdGlvbihuZXdOb2RlKSB7XG4gICAgICBjb25zdCBpZCA9IGdldFJhd0F0dHJpYnV0ZShuZXdOb2RlLCAnaWQnKVxuICAgICAgaWYgKGlkICYmIGlkLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZElkID0gaWQucmVwbGFjZShcIidcIiwgXCJcXFxcJ1wiKVxuICAgICAgICBjb25zdCBub3JtYWxpemVkVGFnID0gbmV3Tm9kZS50YWdOYW1lLnJlcGxhY2UoJzonLCAnXFxcXDonKVxuICAgICAgICBjb25zdCBwYXJlbnRFbHQgPSBhc1BhcmVudE5vZGUocGFyZW50Tm9kZSlcbiAgICAgICAgY29uc3Qgb2xkTm9kZSA9IHBhcmVudEVsdCAmJiBwYXJlbnRFbHQucXVlcnlTZWxlY3Rvcihub3JtYWxpemVkVGFnICsgXCJbaWQ9J1wiICsgbm9ybWFsaXplZElkICsgXCInXVwiKVxuICAgICAgICBpZiAob2xkTm9kZSAmJiBvbGROb2RlICE9PSBwYXJlbnRFbHQpIHtcbiAgICAgICAgICBjb25zdCBuZXdBdHRyaWJ1dGVzID0gbmV3Tm9kZS5jbG9uZU5vZGUoKVxuICAgICAgICAgIGNsb25lQXR0cmlidXRlcyhuZXdOb2RlLCBvbGROb2RlKVxuICAgICAgICAgIHNldHRsZUluZm8udGFza3MucHVzaChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGNsb25lQXR0cmlidXRlcyhuZXdOb2RlLCBuZXdBdHRyaWJ1dGVzKVxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gY2hpbGRcbiAgICogQHJldHVybnMge0h0bXhTZXR0bGVUYXNrfVxuICAgKi9cbiAgZnVuY3Rpb24gbWFrZUFqYXhMb2FkVGFzayhjaGlsZCkge1xuICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgIHJlbW92ZUNsYXNzRnJvbUVsZW1lbnQoY2hpbGQsIGh0bXguY29uZmlnLmFkZGVkQ2xhc3MpXG4gICAgICBwcm9jZXNzTm9kZShhc0VsZW1lbnQoY2hpbGQpKVxuICAgICAgcHJvY2Vzc0ZvY3VzKGFzUGFyZW50Tm9kZShjaGlsZCkpXG4gICAgICB0cmlnZ2VyRXZlbnQoY2hpbGQsICdodG14OmxvYWQnKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1BhcmVudE5vZGV9IGNoaWxkXG4gICAqL1xuICBmdW5jdGlvbiBwcm9jZXNzRm9jdXMoY2hpbGQpIHtcbiAgICBjb25zdCBhdXRvZm9jdXMgPSAnW2F1dG9mb2N1c10nXG4gICAgY29uc3QgYXV0b0ZvY3VzZWRFbHQgPSBhc0h0bWxFbGVtZW50KG1hdGNoZXMoY2hpbGQsIGF1dG9mb2N1cykgPyBjaGlsZCA6IGNoaWxkLnF1ZXJ5U2VsZWN0b3IoYXV0b2ZvY3VzKSlcbiAgICBpZiAoYXV0b0ZvY3VzZWRFbHQgIT0gbnVsbCkge1xuICAgICAgYXV0b0ZvY3VzZWRFbHQuZm9jdXMoKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IHBhcmVudE5vZGVcbiAgICogQHBhcmFtIHtOb2RlfSBpbnNlcnRCZWZvcmVcbiAgICogQHBhcmFtIHtQYXJlbnROb2RlfSBmcmFnbWVudFxuICAgKiBAcGFyYW0ge0h0bXhTZXR0bGVJbmZvfSBzZXR0bGVJbmZvXG4gICAqL1xuICBmdW5jdGlvbiBpbnNlcnROb2Rlc0JlZm9yZShwYXJlbnROb2RlLCBpbnNlcnRCZWZvcmUsIGZyYWdtZW50LCBzZXR0bGVJbmZvKSB7XG4gICAgaGFuZGxlQXR0cmlidXRlcyhwYXJlbnROb2RlLCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICB3aGlsZSAoZnJhZ21lbnQuY2hpbGROb2Rlcy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBjaGlsZCA9IGZyYWdtZW50LmZpcnN0Q2hpbGRcbiAgICAgIGFkZENsYXNzVG9FbGVtZW50KGFzRWxlbWVudChjaGlsZCksIGh0bXguY29uZmlnLmFkZGVkQ2xhc3MpXG4gICAgICBwYXJlbnROb2RlLmluc2VydEJlZm9yZShjaGlsZCwgaW5zZXJ0QmVmb3JlKVxuICAgICAgaWYgKGNoaWxkLm5vZGVUeXBlICE9PSBOb2RlLlRFWFRfTk9ERSAmJiBjaGlsZC5ub2RlVHlwZSAhPT0gTm9kZS5DT01NRU5UX05PREUpIHtcbiAgICAgICAgc2V0dGxlSW5mby50YXNrcy5wdXNoKG1ha2VBamF4TG9hZFRhc2soY2hpbGQpKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBiYXNlZCBvbiBodHRwczovL2dpc3QuZ2l0aHViLmNvbS9oeWFtYW1vdG8vZmQ0MzU1MDVkMjllYmZhM2Q5NzE2ZmQyYmU4ZDQyZjAsXG4gICAqIGRlcml2ZWQgZnJvbSBKYXZhJ3Mgc3RyaW5nIGhhc2hjb2RlIGltcGxlbWVudGF0aW9uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmdcbiAgICogQHBhcmFtIHtudW1iZXJ9IGhhc2hcbiAgICogQHJldHVybnMge251bWJlcn1cbiAgICovXG4gIGZ1bmN0aW9uIHN0cmluZ0hhc2goc3RyaW5nLCBoYXNoKSB7XG4gICAgbGV0IGNoYXIgPSAwXG4gICAgd2hpbGUgKGNoYXIgPCBzdHJpbmcubGVuZ3RoKSB7XG4gICAgICBoYXNoID0gKGhhc2ggPDwgNSkgLSBoYXNoICsgc3RyaW5nLmNoYXJDb2RlQXQoY2hhcisrKSB8IDAgLy8gYml0d2lzZSBvciBlbnN1cmVzIHdlIGhhdmUgYSAzMi1iaXQgaW50XG4gICAgfVxuICAgIHJldHVybiBoYXNoXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHJldHVybnMge251bWJlcn1cbiAgICovXG4gIGZ1bmN0aW9uIGF0dHJpYnV0ZUhhc2goZWx0KSB7XG4gICAgbGV0IGhhc2ggPSAwXG4gICAgLy8gSUUgZml4XG4gICAgaWYgKGVsdC5hdHRyaWJ1dGVzKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVsdC5hdHRyaWJ1dGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGF0dHJpYnV0ZSA9IGVsdC5hdHRyaWJ1dGVzW2ldXG4gICAgICAgIGlmIChhdHRyaWJ1dGUudmFsdWUpIHsgLy8gb25seSBpbmNsdWRlIGF0dHJpYnV0ZXMgdy8gYWN0dWFsIHZhbHVlcyAoZW1wdHkgaXMgc2FtZSBhcyBub24tZXhpc3RlbnQpXG4gICAgICAgICAgaGFzaCA9IHN0cmluZ0hhc2goYXR0cmlidXRlLm5hbWUsIGhhc2gpXG4gICAgICAgICAgaGFzaCA9IHN0cmluZ0hhc2goYXR0cmlidXRlLnZhbHVlLCBoYXNoKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBoYXNoXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldH0gZWx0XG4gICAqL1xuICBmdW5jdGlvbiBkZUluaXRPbkhhbmRsZXJzKGVsdCkge1xuICAgIGNvbnN0IGludGVybmFsRGF0YSA9IGdldEludGVybmFsRGF0YShlbHQpXG4gICAgaWYgKGludGVybmFsRGF0YS5vbkhhbmRsZXJzKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGludGVybmFsRGF0YS5vbkhhbmRsZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGhhbmRsZXJJbmZvID0gaW50ZXJuYWxEYXRhLm9uSGFuZGxlcnNbaV1cbiAgICAgICAgcmVtb3ZlRXZlbnRMaXN0ZW5lckltcGwoZWx0LCBoYW5kbGVySW5mby5ldmVudCwgaGFuZGxlckluZm8ubGlzdGVuZXIpXG4gICAgICB9XG4gICAgICBkZWxldGUgaW50ZXJuYWxEYXRhLm9uSGFuZGxlcnNcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbGVtZW50XG4gICAqL1xuICBmdW5jdGlvbiBkZUluaXROb2RlKGVsZW1lbnQpIHtcbiAgICBjb25zdCBpbnRlcm5hbERhdGEgPSBnZXRJbnRlcm5hbERhdGEoZWxlbWVudClcbiAgICBpZiAoaW50ZXJuYWxEYXRhLnRpbWVvdXQpIHtcbiAgICAgIGNsZWFyVGltZW91dChpbnRlcm5hbERhdGEudGltZW91dClcbiAgICB9XG4gICAgaWYgKGludGVybmFsRGF0YS5saXN0ZW5lckluZm9zKSB7XG4gICAgICBmb3JFYWNoKGludGVybmFsRGF0YS5saXN0ZW5lckluZm9zLCBmdW5jdGlvbihpbmZvKSB7XG4gICAgICAgIGlmIChpbmZvLm9uKSB7XG4gICAgICAgICAgcmVtb3ZlRXZlbnRMaXN0ZW5lckltcGwoaW5mby5vbiwgaW5mby50cmlnZ2VyLCBpbmZvLmxpc3RlbmVyKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cbiAgICBkZUluaXRPbkhhbmRsZXJzKGVsZW1lbnQpXG4gICAgZm9yRWFjaChPYmplY3Qua2V5cyhpbnRlcm5hbERhdGEpLCBmdW5jdGlvbihrZXkpIHsgZGVsZXRlIGludGVybmFsRGF0YVtrZXldIH0pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbGVtZW50XG4gICAqL1xuICBmdW5jdGlvbiBjbGVhblVwRWxlbWVudChlbGVtZW50KSB7XG4gICAgdHJpZ2dlckV2ZW50KGVsZW1lbnQsICdodG14OmJlZm9yZUNsZWFudXBFbGVtZW50JylcbiAgICBkZUluaXROb2RlKGVsZW1lbnQpXG4gICAgLy8gQHRzLWlnbm9yZSBJRTExIGNvZGVcbiAgICAvLyBub2luc3BlY3Rpb24gSlNVbnJlc29sdmVkUmVmZXJlbmNlXG4gICAgaWYgKGVsZW1lbnQuY2hpbGRyZW4pIHsgLy8gSUVcbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIGZvckVhY2goZWxlbWVudC5jaGlsZHJlbiwgZnVuY3Rpb24oY2hpbGQpIHsgY2xlYW5VcEVsZW1lbnQoY2hpbGQpIH0pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gdGFyZ2V0XG4gICAqIEBwYXJhbSB7UGFyZW50Tm9kZX0gZnJhZ21lbnRcbiAgICogQHBhcmFtIHtIdG14U2V0dGxlSW5mb30gc2V0dGxlSW5mb1xuICAgKi9cbiAgZnVuY3Rpb24gc3dhcE91dGVySFRNTCh0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKSB7XG4gICAgaWYgKHRhcmdldCBpbnN0YW5jZW9mIEVsZW1lbnQgJiYgdGFyZ2V0LnRhZ05hbWUgPT09ICdCT0RZJykgeyAvLyBzcGVjaWFsIGNhc2UgdGhlIGJvZHkgdG8gaW5uZXJIVE1MIGJlY2F1c2UgRG9jdW1lbnRGcmFnbWVudHMgY2FuJ3QgY29udGFpbiBhIGJvZHkgZWx0IHVuZm9ydHVuYXRlbHlcbiAgICAgIHJldHVybiBzd2FwSW5uZXJIVE1MKHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgfVxuICAgIC8qKiBAdHlwZSB7Tm9kZX0gKi9cbiAgICBsZXQgbmV3RWx0XG4gICAgY29uc3QgZWx0QmVmb3JlTmV3Q29udGVudCA9IHRhcmdldC5wcmV2aW91c1NpYmxpbmdcbiAgICBpbnNlcnROb2Rlc0JlZm9yZShwYXJlbnRFbHQodGFyZ2V0KSwgdGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICBpZiAoZWx0QmVmb3JlTmV3Q29udGVudCA9PSBudWxsKSB7XG4gICAgICBuZXdFbHQgPSBwYXJlbnRFbHQodGFyZ2V0KS5maXJzdENoaWxkXG4gICAgfSBlbHNlIHtcbiAgICAgIG5ld0VsdCA9IGVsdEJlZm9yZU5ld0NvbnRlbnQubmV4dFNpYmxpbmdcbiAgICB9XG4gICAgc2V0dGxlSW5mby5lbHRzID0gc2V0dGxlSW5mby5lbHRzLmZpbHRlcihmdW5jdGlvbihlKSB7IHJldHVybiBlICE9PSB0YXJnZXQgfSlcbiAgICAvLyBzY2FuIHRocm91Z2ggYWxsIG5ld2x5IGFkZGVkIGNvbnRlbnQgYW5kIGFkZCBhbGwgZWxlbWVudHMgdG8gdGhlIHNldHRsZSBpbmZvIHNvIHdlIHRyaWdnZXJcbiAgICAvLyBldmVudHMgcHJvcGVybHkgb24gdGhlbVxuICAgIHdoaWxlIChuZXdFbHQgJiYgbmV3RWx0ICE9PSB0YXJnZXQpIHtcbiAgICAgIGlmIChuZXdFbHQgaW5zdGFuY2VvZiBFbGVtZW50KSB7XG4gICAgICAgIHNldHRsZUluZm8uZWx0cy5wdXNoKG5ld0VsdClcbiAgICAgIH1cbiAgICAgIG5ld0VsdCA9IG5ld0VsdC5uZXh0U2libGluZ1xuICAgIH1cbiAgICBjbGVhblVwRWxlbWVudCh0YXJnZXQpXG4gICAgaWYgKHRhcmdldCBpbnN0YW5jZW9mIEVsZW1lbnQpIHtcbiAgICAgIHRhcmdldC5yZW1vdmUoKVxuICAgIH0gZWxzZSB7XG4gICAgICB0YXJnZXQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0YXJnZXQpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gdGFyZ2V0XG4gICAqIEBwYXJhbSB7UGFyZW50Tm9kZX0gZnJhZ21lbnRcbiAgICogQHBhcmFtIHtIdG14U2V0dGxlSW5mb30gc2V0dGxlSW5mb1xuICAgKi9cbiAgZnVuY3Rpb24gc3dhcEFmdGVyQmVnaW4odGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbykge1xuICAgIHJldHVybiBpbnNlcnROb2Rlc0JlZm9yZSh0YXJnZXQsIHRhcmdldC5maXJzdENoaWxkLCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IHRhcmdldFxuICAgKiBAcGFyYW0ge1BhcmVudE5vZGV9IGZyYWdtZW50XG4gICAqIEBwYXJhbSB7SHRteFNldHRsZUluZm99IHNldHRsZUluZm9cbiAgICovXG4gIGZ1bmN0aW9uIHN3YXBCZWZvcmVCZWdpbih0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKSB7XG4gICAgcmV0dXJuIGluc2VydE5vZGVzQmVmb3JlKHBhcmVudEVsdCh0YXJnZXQpLCB0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gdGFyZ2V0XG4gICAqIEBwYXJhbSB7UGFyZW50Tm9kZX0gZnJhZ21lbnRcbiAgICogQHBhcmFtIHtIdG14U2V0dGxlSW5mb30gc2V0dGxlSW5mb1xuICAgKi9cbiAgZnVuY3Rpb24gc3dhcEJlZm9yZUVuZCh0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKSB7XG4gICAgcmV0dXJuIGluc2VydE5vZGVzQmVmb3JlKHRhcmdldCwgbnVsbCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSB0YXJnZXRcbiAgICogQHBhcmFtIHtQYXJlbnROb2RlfSBmcmFnbWVudFxuICAgKiBAcGFyYW0ge0h0bXhTZXR0bGVJbmZvfSBzZXR0bGVJbmZvXG4gICAqL1xuICBmdW5jdGlvbiBzd2FwQWZ0ZXJFbmQodGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbykge1xuICAgIHJldHVybiBpbnNlcnROb2Rlc0JlZm9yZShwYXJlbnRFbHQodGFyZ2V0KSwgdGFyZ2V0Lm5leHRTaWJsaW5nLCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IHRhcmdldFxuICAgKi9cbiAgZnVuY3Rpb24gc3dhcERlbGV0ZSh0YXJnZXQpIHtcbiAgICBjbGVhblVwRWxlbWVudCh0YXJnZXQpXG4gICAgcmV0dXJuIHBhcmVudEVsdCh0YXJnZXQpLnJlbW92ZUNoaWxkKHRhcmdldClcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IHRhcmdldFxuICAgKiBAcGFyYW0ge1BhcmVudE5vZGV9IGZyYWdtZW50XG4gICAqIEBwYXJhbSB7SHRteFNldHRsZUluZm99IHNldHRsZUluZm9cbiAgICovXG4gIGZ1bmN0aW9uIHN3YXBJbm5lckhUTUwodGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbykge1xuICAgIGNvbnN0IGZpcnN0Q2hpbGQgPSB0YXJnZXQuZmlyc3RDaGlsZFxuICAgIGluc2VydE5vZGVzQmVmb3JlKHRhcmdldCwgZmlyc3RDaGlsZCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgaWYgKGZpcnN0Q2hpbGQpIHtcbiAgICAgIHdoaWxlIChmaXJzdENoaWxkLm5leHRTaWJsaW5nKSB7XG4gICAgICAgIGNsZWFuVXBFbGVtZW50KGZpcnN0Q2hpbGQubmV4dFNpYmxpbmcpXG4gICAgICAgIHRhcmdldC5yZW1vdmVDaGlsZChmaXJzdENoaWxkLm5leHRTaWJsaW5nKVxuICAgICAgfVxuICAgICAgY2xlYW5VcEVsZW1lbnQoZmlyc3RDaGlsZClcbiAgICAgIHRhcmdldC5yZW1vdmVDaGlsZChmaXJzdENoaWxkKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0h0bXhTd2FwU3R5bGV9IHN3YXBTdHlsZVxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge05vZGV9IHRhcmdldFxuICAgKiBAcGFyYW0ge1BhcmVudE5vZGV9IGZyYWdtZW50XG4gICAqIEBwYXJhbSB7SHRteFNldHRsZUluZm99IHNldHRsZUluZm9cbiAgICovXG4gIGZ1bmN0aW9uIHN3YXBXaXRoU3R5bGUoc3dhcFN0eWxlLCBlbHQsIHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pIHtcbiAgICBzd2l0Y2ggKHN3YXBTdHlsZSkge1xuICAgICAgY2FzZSAnbm9uZSc6XG4gICAgICAgIHJldHVyblxuICAgICAgY2FzZSAnb3V0ZXJIVE1MJzpcbiAgICAgICAgc3dhcE91dGVySFRNTCh0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgICByZXR1cm5cbiAgICAgIGNhc2UgJ2FmdGVyYmVnaW4nOlxuICAgICAgICBzd2FwQWZ0ZXJCZWdpbih0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgICByZXR1cm5cbiAgICAgIGNhc2UgJ2JlZm9yZWJlZ2luJzpcbiAgICAgICAgc3dhcEJlZm9yZUJlZ2luKHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgICAgIHJldHVyblxuICAgICAgY2FzZSAnYmVmb3JlZW5kJzpcbiAgICAgICAgc3dhcEJlZm9yZUVuZCh0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgICByZXR1cm5cbiAgICAgIGNhc2UgJ2FmdGVyZW5kJzpcbiAgICAgICAgc3dhcEFmdGVyRW5kKHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgICAgIHJldHVyblxuICAgICAgY2FzZSAnZGVsZXRlJzpcbiAgICAgICAgc3dhcERlbGV0ZSh0YXJnZXQpXG4gICAgICAgIHJldHVyblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdmFyIGV4dGVuc2lvbnMgPSBnZXRFeHRlbnNpb25zKGVsdClcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBleHRlbnNpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgZXh0ID0gZXh0ZW5zaW9uc1tpXVxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBuZXdFbGVtZW50cyA9IGV4dC5oYW5kbGVTd2FwKHN3YXBTdHlsZSwgdGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICAgICAgICAgIGlmIChuZXdFbGVtZW50cykge1xuICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShuZXdFbGVtZW50cykpIHtcbiAgICAgICAgICAgICAgICAvLyBpZiBoYW5kbGVTd2FwIHJldHVybnMgYW4gYXJyYXkgKGxpa2UpIG9mIGVsZW1lbnRzLCB3ZSBoYW5kbGUgdGhlbVxuICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgbmV3RWxlbWVudHMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGNoaWxkID0gbmV3RWxlbWVudHNbal1cbiAgICAgICAgICAgICAgICAgIGlmIChjaGlsZC5ub2RlVHlwZSAhPT0gTm9kZS5URVhUX05PREUgJiYgY2hpbGQubm9kZVR5cGUgIT09IE5vZGUuQ09NTUVOVF9OT0RFKSB7XG4gICAgICAgICAgICAgICAgICAgIHNldHRsZUluZm8udGFza3MucHVzaChtYWtlQWpheExvYWRUYXNrKGNoaWxkKSlcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgbG9nRXJyb3IoZSlcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN3YXBTdHlsZSA9PT0gJ2lubmVySFRNTCcpIHtcbiAgICAgICAgICBzd2FwSW5uZXJIVE1MKHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc3dhcFdpdGhTdHlsZShodG14LmNvbmZpZy5kZWZhdWx0U3dhcFN0eWxlLCBlbHQsIHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtEb2N1bWVudEZyYWdtZW50fSBmcmFnbWVudFxuICAgKiBAcGFyYW0ge0h0bXhTZXR0bGVJbmZvfSBzZXR0bGVJbmZvXG4gICAqL1xuICBmdW5jdGlvbiBmaW5kQW5kU3dhcE9vYkVsZW1lbnRzKGZyYWdtZW50LCBzZXR0bGVJbmZvKSB7XG4gICAgdmFyIG9vYkVsdHMgPSBmaW5kQWxsKGZyYWdtZW50LCAnW2h4LXN3YXAtb29iXSwgW2RhdGEtaHgtc3dhcC1vb2JdJylcbiAgICBmb3JFYWNoKG9vYkVsdHMsIGZ1bmN0aW9uKG9vYkVsZW1lbnQpIHtcbiAgICAgIGlmIChodG14LmNvbmZpZy5hbGxvd05lc3RlZE9vYlN3YXBzIHx8IG9vYkVsZW1lbnQucGFyZW50RWxlbWVudCA9PT0gbnVsbCkge1xuICAgICAgICBjb25zdCBvb2JWYWx1ZSA9IGdldEF0dHJpYnV0ZVZhbHVlKG9vYkVsZW1lbnQsICdoeC1zd2FwLW9vYicpXG4gICAgICAgIGlmIChvb2JWYWx1ZSAhPSBudWxsKSB7XG4gICAgICAgICAgb29iU3dhcChvb2JWYWx1ZSwgb29iRWxlbWVudCwgc2V0dGxlSW5mbylcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb29iRWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ2h4LXN3YXAtb29iJylcbiAgICAgICAgb29iRWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ2RhdGEtaHgtc3dhcC1vb2InKVxuICAgICAgfVxuICAgIH0pXG4gICAgcmV0dXJuIG9vYkVsdHMubGVuZ3RoID4gMFxuICB9XG5cbiAgLyoqXG4gICAqIEltcGxlbWVudHMgY29tcGxldGUgc3dhcHBpbmcgcGlwZWxpbmUsIGluY2x1ZGluZzogZm9jdXMgYW5kIHNlbGVjdGlvbiBwcmVzZXJ2YXRpb24sXG4gICAqIHRpdGxlIHVwZGF0ZXMsIHNjcm9sbCwgT09CIHN3YXBwaW5nLCBub3JtYWwgc3dhcHBpbmcgYW5kIHNldHRsaW5nXG4gICAqIEBwYXJhbSB7c3RyaW5nfEVsZW1lbnR9IHRhcmdldFxuICAgKiBAcGFyYW0ge3N0cmluZ30gY29udGVudFxuICAgKiBAcGFyYW0ge0h0bXhTd2FwU3BlY2lmaWNhdGlvbn0gc3dhcFNwZWNcbiAgICogQHBhcmFtIHtTd2FwT3B0aW9uc30gW3N3YXBPcHRpb25zXVxuICAgKi9cbiAgZnVuY3Rpb24gc3dhcCh0YXJnZXQsIGNvbnRlbnQsIHN3YXBTcGVjLCBzd2FwT3B0aW9ucykge1xuICAgIGlmICghc3dhcE9wdGlvbnMpIHtcbiAgICAgIHN3YXBPcHRpb25zID0ge31cbiAgICB9XG5cbiAgICB0YXJnZXQgPSByZXNvbHZlVGFyZ2V0KHRhcmdldClcblxuICAgIC8vIHByZXNlcnZlIGZvY3VzIGFuZCBzZWxlY3Rpb25cbiAgICBjb25zdCBhY3RpdmVFbHQgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50XG4gICAgbGV0IHNlbGVjdGlvbkluZm8gPSB7fVxuICAgIHRyeSB7XG4gICAgICBzZWxlY3Rpb25JbmZvID0ge1xuICAgICAgICBlbHQ6IGFjdGl2ZUVsdCxcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBzdGFydDogYWN0aXZlRWx0ID8gYWN0aXZlRWx0LnNlbGVjdGlvblN0YXJ0IDogbnVsbCxcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBlbmQ6IGFjdGl2ZUVsdCA/IGFjdGl2ZUVsdC5zZWxlY3Rpb25FbmQgOiBudWxsXG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gc2FmYXJpIGlzc3VlIC0gc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9taWNyb3NvZnQvcGxheXdyaWdodC9pc3N1ZXMvNTg5NFxuICAgIH1cbiAgICBjb25zdCBzZXR0bGVJbmZvID0gbWFrZVNldHRsZUluZm8odGFyZ2V0KVxuXG4gICAgLy8gRm9yIHRleHQgY29udGVudCBzd2FwcywgZG9uJ3QgcGFyc2UgdGhlIHJlc3BvbnNlIGFzIEhUTUwsIGp1c3QgaW5zZXJ0IGl0XG4gICAgaWYgKHN3YXBTcGVjLnN3YXBTdHlsZSA9PT0gJ3RleHRDb250ZW50Jykge1xuICAgICAgdGFyZ2V0LnRleHRDb250ZW50ID0gY29udGVudFxuICAgIC8vIE90aGVyd2lzZSwgbWFrZSB0aGUgZnJhZ21lbnQgYW5kIHByb2Nlc3MgaXRcbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IGZyYWdtZW50ID0gbWFrZUZyYWdtZW50KGNvbnRlbnQpXG5cbiAgICAgIHNldHRsZUluZm8udGl0bGUgPSBmcmFnbWVudC50aXRsZVxuXG4gICAgICAvLyBzZWxlY3Qtb29iIHN3YXBzXG4gICAgICBpZiAoc3dhcE9wdGlvbnMuc2VsZWN0T09CKSB7XG4gICAgICAgIGNvbnN0IG9vYlNlbGVjdFZhbHVlcyA9IHN3YXBPcHRpb25zLnNlbGVjdE9PQi5zcGxpdCgnLCcpXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb29iU2VsZWN0VmFsdWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgY29uc3Qgb29iU2VsZWN0VmFsdWUgPSBvb2JTZWxlY3RWYWx1ZXNbaV0uc3BsaXQoJzonLCAyKVxuICAgICAgICAgIGxldCBpZCA9IG9vYlNlbGVjdFZhbHVlWzBdLnRyaW0oKVxuICAgICAgICAgIGlmIChpZC5pbmRleE9mKCcjJykgPT09IDApIHtcbiAgICAgICAgICAgIGlkID0gaWQuc3Vic3RyaW5nKDEpXG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IG9vYlZhbHVlID0gb29iU2VsZWN0VmFsdWVbMV0gfHwgJ3RydWUnXG4gICAgICAgICAgY29uc3Qgb29iRWxlbWVudCA9IGZyYWdtZW50LnF1ZXJ5U2VsZWN0b3IoJyMnICsgaWQpXG4gICAgICAgICAgaWYgKG9vYkVsZW1lbnQpIHtcbiAgICAgICAgICAgIG9vYlN3YXAob29iVmFsdWUsIG9vYkVsZW1lbnQsIHNldHRsZUluZm8pXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBvb2Igc3dhcHNcbiAgICAgIGZpbmRBbmRTd2FwT29iRWxlbWVudHMoZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgICBmb3JFYWNoKGZpbmRBbGwoZnJhZ21lbnQsICd0ZW1wbGF0ZScpLCAvKiogQHBhcmFtIHtIVE1MVGVtcGxhdGVFbGVtZW50fSB0ZW1wbGF0ZSAqL2Z1bmN0aW9uKHRlbXBsYXRlKSB7XG4gICAgICAgIGlmIChmaW5kQW5kU3dhcE9vYkVsZW1lbnRzKHRlbXBsYXRlLmNvbnRlbnQsIHNldHRsZUluZm8pKSB7XG4gICAgICAgICAgLy8gQXZvaWQgcG9sbHV0aW5nIHRoZSBET00gd2l0aCBlbXB0eSB0ZW1wbGF0ZXMgdGhhdCB3ZXJlIG9ubHkgdXNlZCB0byBlbmNhcHN1bGF0ZSBvb2Igc3dhcFxuICAgICAgICAgIHRlbXBsYXRlLnJlbW92ZSgpXG4gICAgICAgIH1cbiAgICAgIH0pXG5cbiAgICAgIC8vIG5vcm1hbCBzd2FwXG4gICAgICBpZiAoc3dhcE9wdGlvbnMuc2VsZWN0KSB7XG4gICAgICAgIGNvbnN0IG5ld0ZyYWdtZW50ID0gZ2V0RG9jdW1lbnQoKS5jcmVhdGVEb2N1bWVudEZyYWdtZW50KClcbiAgICAgICAgZm9yRWFjaChmcmFnbWVudC5xdWVyeVNlbGVjdG9yQWxsKHN3YXBPcHRpb25zLnNlbGVjdCksIGZ1bmN0aW9uKG5vZGUpIHtcbiAgICAgICAgICBuZXdGcmFnbWVudC5hcHBlbmRDaGlsZChub2RlKVxuICAgICAgICB9KVxuICAgICAgICBmcmFnbWVudCA9IG5ld0ZyYWdtZW50XG4gICAgICB9XG4gICAgICBoYW5kbGVQcmVzZXJ2ZWRFbGVtZW50cyhmcmFnbWVudClcbiAgICAgIHN3YXBXaXRoU3R5bGUoc3dhcFNwZWMuc3dhcFN0eWxlLCBzd2FwT3B0aW9ucy5jb250ZXh0RWxlbWVudCwgdGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICB9XG5cbiAgICAvLyBhcHBseSBzYXZlZCBmb2N1cyBhbmQgc2VsZWN0aW9uIGluZm9ybWF0aW9uIHRvIHN3YXBwZWQgY29udGVudFxuICAgIGlmIChzZWxlY3Rpb25JbmZvLmVsdCAmJlxuICAgICAgIWJvZHlDb250YWlucyhzZWxlY3Rpb25JbmZvLmVsdCkgJiZcbiAgICAgIGdldFJhd0F0dHJpYnV0ZShzZWxlY3Rpb25JbmZvLmVsdCwgJ2lkJykpIHtcbiAgICAgIGNvbnN0IG5ld0FjdGl2ZUVsdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGdldFJhd0F0dHJpYnV0ZShzZWxlY3Rpb25JbmZvLmVsdCwgJ2lkJykpXG4gICAgICBjb25zdCBmb2N1c09wdGlvbnMgPSB7IHByZXZlbnRTY3JvbGw6IHN3YXBTcGVjLmZvY3VzU2Nyb2xsICE9PSB1bmRlZmluZWQgPyAhc3dhcFNwZWMuZm9jdXNTY3JvbGwgOiAhaHRteC5jb25maWcuZGVmYXVsdEZvY3VzU2Nyb2xsIH1cbiAgICAgIGlmIChuZXdBY3RpdmVFbHQpIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBpZiAoc2VsZWN0aW9uSW5mby5zdGFydCAmJiBuZXdBY3RpdmVFbHQuc2V0U2VsZWN0aW9uUmFuZ2UpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgbmV3QWN0aXZlRWx0LnNldFNlbGVjdGlvblJhbmdlKHNlbGVjdGlvbkluZm8uc3RhcnQsIHNlbGVjdGlvbkluZm8uZW5kKVxuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIC8vIHRoZSBzZXRTZWxlY3Rpb25SYW5nZSBtZXRob2QgaXMgcHJlc2VudCBvbiBmaWVsZHMgdGhhdCBkb24ndCBzdXBwb3J0IGl0LCBzbyBqdXN0IGxldCB0aGlzIGZhaWxcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbmV3QWN0aXZlRWx0LmZvY3VzKGZvY3VzT3B0aW9ucylcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0YXJnZXQuY2xhc3NMaXN0LnJlbW92ZShodG14LmNvbmZpZy5zd2FwcGluZ0NsYXNzKVxuICAgIGZvckVhY2goc2V0dGxlSW5mby5lbHRzLCBmdW5jdGlvbihlbHQpIHtcbiAgICAgIGlmIChlbHQuY2xhc3NMaXN0KSB7XG4gICAgICAgIGVsdC5jbGFzc0xpc3QuYWRkKGh0bXguY29uZmlnLnNldHRsaW5nQ2xhc3MpXG4gICAgICB9XG4gICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDphZnRlclN3YXAnLCBzd2FwT3B0aW9ucy5ldmVudEluZm8pXG4gICAgfSlcbiAgICBpZiAoc3dhcE9wdGlvbnMuYWZ0ZXJTd2FwQ2FsbGJhY2spIHtcbiAgICAgIHN3YXBPcHRpb25zLmFmdGVyU3dhcENhbGxiYWNrKClcbiAgICB9XG5cbiAgICAvLyBtZXJnZSBpbiBuZXcgdGl0bGUgYWZ0ZXIgc3dhcCBidXQgYmVmb3JlIHNldHRsZVxuICAgIGlmICghc3dhcFNwZWMuaWdub3JlVGl0bGUpIHtcbiAgICAgIGhhbmRsZVRpdGxlKHNldHRsZUluZm8udGl0bGUpXG4gICAgfVxuXG4gICAgLy8gc2V0dGxlXG4gICAgY29uc3QgZG9TZXR0bGUgPSBmdW5jdGlvbigpIHtcbiAgICAgIGZvckVhY2goc2V0dGxlSW5mby50YXNrcywgZnVuY3Rpb24odGFzaykge1xuICAgICAgICB0YXNrLmNhbGwoKVxuICAgICAgfSlcbiAgICAgIGZvckVhY2goc2V0dGxlSW5mby5lbHRzLCBmdW5jdGlvbihlbHQpIHtcbiAgICAgICAgaWYgKGVsdC5jbGFzc0xpc3QpIHtcbiAgICAgICAgICBlbHQuY2xhc3NMaXN0LnJlbW92ZShodG14LmNvbmZpZy5zZXR0bGluZ0NsYXNzKVxuICAgICAgICB9XG4gICAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OmFmdGVyU2V0dGxlJywgc3dhcE9wdGlvbnMuZXZlbnRJbmZvKVxuICAgICAgfSlcblxuICAgICAgaWYgKHN3YXBPcHRpb25zLmFuY2hvcikge1xuICAgICAgICBjb25zdCBhbmNob3JUYXJnZXQgPSBhc0VsZW1lbnQocmVzb2x2ZVRhcmdldCgnIycgKyBzd2FwT3B0aW9ucy5hbmNob3IpKVxuICAgICAgICBpZiAoYW5jaG9yVGFyZ2V0KSB7XG4gICAgICAgICAgYW5jaG9yVGFyZ2V0LnNjcm9sbEludG9WaWV3KHsgYmxvY2s6ICdzdGFydCcsIGJlaGF2aW9yOiAnYXV0bycgfSlcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB1cGRhdGVTY3JvbGxTdGF0ZShzZXR0bGVJbmZvLmVsdHMsIHN3YXBTcGVjKVxuICAgICAgaWYgKHN3YXBPcHRpb25zLmFmdGVyU2V0dGxlQ2FsbGJhY2spIHtcbiAgICAgICAgc3dhcE9wdGlvbnMuYWZ0ZXJTZXR0bGVDYWxsYmFjaygpXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHN3YXBTcGVjLnNldHRsZURlbGF5ID4gMCkge1xuICAgICAgZ2V0V2luZG93KCkuc2V0VGltZW91dChkb1NldHRsZSwgc3dhcFNwZWMuc2V0dGxlRGVsYXkpXG4gICAgfSBlbHNlIHtcbiAgICAgIGRvU2V0dGxlKClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtYTUxIdHRwUmVxdWVzdH0geGhyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBoZWFkZXJcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldH0gZWx0XG4gICAqL1xuICBmdW5jdGlvbiBoYW5kbGVUcmlnZ2VySGVhZGVyKHhociwgaGVhZGVyLCBlbHQpIHtcbiAgICBjb25zdCB0cmlnZ2VyQm9keSA9IHhoci5nZXRSZXNwb25zZUhlYWRlcihoZWFkZXIpXG4gICAgaWYgKHRyaWdnZXJCb2R5LmluZGV4T2YoJ3snKSA9PT0gMCkge1xuICAgICAgY29uc3QgdHJpZ2dlcnMgPSBwYXJzZUpTT04odHJpZ2dlckJvZHkpXG4gICAgICBmb3IgKGNvbnN0IGV2ZW50TmFtZSBpbiB0cmlnZ2Vycykge1xuICAgICAgICBpZiAodHJpZ2dlcnMuaGFzT3duUHJvcGVydHkoZXZlbnROYW1lKSkge1xuICAgICAgICAgIGxldCBkZXRhaWwgPSB0cmlnZ2Vyc1tldmVudE5hbWVdXG4gICAgICAgICAgaWYgKGlzUmF3T2JqZWN0KGRldGFpbCkpIHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIGVsdCA9IGRldGFpbC50YXJnZXQgIT09IHVuZGVmaW5lZCA/IGRldGFpbC50YXJnZXQgOiBlbHRcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZGV0YWlsID0geyB2YWx1ZTogZGV0YWlsIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgZXZlbnROYW1lLCBkZXRhaWwpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgZXZlbnROYW1lcyA9IHRyaWdnZXJCb2R5LnNwbGl0KCcsJylcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZXZlbnROYW1lcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCBldmVudE5hbWVzW2ldLnRyaW0oKSwgW10pXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY29uc3QgV0hJVEVTUEFDRSA9IC9cXHMvXG4gIGNvbnN0IFdISVRFU1BBQ0VfT1JfQ09NTUEgPSAvW1xccyxdL1xuICBjb25zdCBTWU1CT0xfU1RBUlQgPSAvW18kYS16QS1aXS9cbiAgY29uc3QgU1lNQk9MX0NPTlQgPSAvW18kYS16QS1aMC05XS9cbiAgY29uc3QgU1RSSU5HSVNIX1NUQVJUID0gWydcIicsIFwiJ1wiLCAnLyddXG4gIGNvbnN0IE5PVF9XSElURVNQQUNFID0gL1teXFxzXS9cbiAgY29uc3QgQ09NQklORURfU0VMRUNUT1JfU1RBUlQgPSAvW3soXS9cbiAgY29uc3QgQ09NQklORURfU0VMRUNUT1JfRU5EID0gL1t9KV0vXG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAgICogQHJldHVybnMge3N0cmluZ1tdfVxuICAgKi9cbiAgZnVuY3Rpb24gdG9rZW5pemVTdHJpbmcoc3RyKSB7XG4gICAgLyoqIEB0eXBlIHN0cmluZ1tdICovXG4gICAgY29uc3QgdG9rZW5zID0gW11cbiAgICBsZXQgcG9zaXRpb24gPSAwXG4gICAgd2hpbGUgKHBvc2l0aW9uIDwgc3RyLmxlbmd0aCkge1xuICAgICAgaWYgKFNZTUJPTF9TVEFSVC5leGVjKHN0ci5jaGFyQXQocG9zaXRpb24pKSkge1xuICAgICAgICB2YXIgc3RhcnRQb3NpdGlvbiA9IHBvc2l0aW9uXG4gICAgICAgIHdoaWxlIChTWU1CT0xfQ09OVC5leGVjKHN0ci5jaGFyQXQocG9zaXRpb24gKyAxKSkpIHtcbiAgICAgICAgICBwb3NpdGlvbisrXG4gICAgICAgIH1cbiAgICAgICAgdG9rZW5zLnB1c2goc3RyLnN1YnN0cihzdGFydFBvc2l0aW9uLCBwb3NpdGlvbiAtIHN0YXJ0UG9zaXRpb24gKyAxKSlcbiAgICAgIH0gZWxzZSBpZiAoU1RSSU5HSVNIX1NUQVJULmluZGV4T2Yoc3RyLmNoYXJBdChwb3NpdGlvbikpICE9PSAtMSkge1xuICAgICAgICBjb25zdCBzdGFydENoYXIgPSBzdHIuY2hhckF0KHBvc2l0aW9uKVxuICAgICAgICB2YXIgc3RhcnRQb3NpdGlvbiA9IHBvc2l0aW9uXG4gICAgICAgIHBvc2l0aW9uKytcbiAgICAgICAgd2hpbGUgKHBvc2l0aW9uIDwgc3RyLmxlbmd0aCAmJiBzdHIuY2hhckF0KHBvc2l0aW9uKSAhPT0gc3RhcnRDaGFyKSB7XG4gICAgICAgICAgaWYgKHN0ci5jaGFyQXQocG9zaXRpb24pID09PSAnXFxcXCcpIHtcbiAgICAgICAgICAgIHBvc2l0aW9uKytcbiAgICAgICAgICB9XG4gICAgICAgICAgcG9zaXRpb24rK1xuICAgICAgICB9XG4gICAgICAgIHRva2Vucy5wdXNoKHN0ci5zdWJzdHIoc3RhcnRQb3NpdGlvbiwgcG9zaXRpb24gLSBzdGFydFBvc2l0aW9uICsgMSkpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBzeW1ib2wgPSBzdHIuY2hhckF0KHBvc2l0aW9uKVxuICAgICAgICB0b2tlbnMucHVzaChzeW1ib2wpXG4gICAgICB9XG4gICAgICBwb3NpdGlvbisrXG4gICAgfVxuICAgIHJldHVybiB0b2tlbnNcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdG9rZW5cbiAgICogQHBhcmFtIHtzdHJpbmd8bnVsbH0gbGFzdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGFyYW1OYW1lXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gaXNQb3NzaWJsZVJlbGF0aXZlUmVmZXJlbmNlKHRva2VuLCBsYXN0LCBwYXJhbU5hbWUpIHtcbiAgICByZXR1cm4gU1lNQk9MX1NUQVJULmV4ZWModG9rZW4uY2hhckF0KDApKSAmJlxuICAgICAgdG9rZW4gIT09ICd0cnVlJyAmJlxuICAgICAgdG9rZW4gIT09ICdmYWxzZScgJiZcbiAgICAgIHRva2VuICE9PSAndGhpcycgJiZcbiAgICAgIHRva2VuICE9PSBwYXJhbU5hbWUgJiZcbiAgICAgIGxhc3QgIT09ICcuJ1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR8c3RyaW5nfSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gdG9rZW5zXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXJhbU5hbWVcbiAgICogQHJldHVybnMge0NvbmRpdGlvbmFsRnVuY3Rpb258bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIG1heWJlR2VuZXJhdGVDb25kaXRpb25hbChlbHQsIHRva2VucywgcGFyYW1OYW1lKSB7XG4gICAgaWYgKHRva2Vuc1swXSA9PT0gJ1snKSB7XG4gICAgICB0b2tlbnMuc2hpZnQoKVxuICAgICAgbGV0IGJyYWNrZXRDb3VudCA9IDFcbiAgICAgIGxldCBjb25kaXRpb25hbFNvdXJjZSA9ICcgcmV0dXJuIChmdW5jdGlvbignICsgcGFyYW1OYW1lICsgJyl7IHJldHVybiAoJ1xuICAgICAgbGV0IGxhc3QgPSBudWxsXG4gICAgICB3aGlsZSAodG9rZW5zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgdG9rZW4gPSB0b2tlbnNbMF1cbiAgICAgICAgLy8gQHRzLWlnbm9yZSBGb3Igc29tZSByZWFzb24gdHNjIGRvZXNuJ3QgdW5kZXJzdGFuZCB0aGUgc2hpZnQgY2FsbCwgYW5kIHRoaW5rcyB3ZSdyZSBjb21wYXJpbmcgdGhlIHNhbWUgdmFsdWUgaGVyZSwgaS5lLiAnWycgdnMgJ10nXG4gICAgICAgIGlmICh0b2tlbiA9PT0gJ10nKSB7XG4gICAgICAgICAgYnJhY2tldENvdW50LS1cbiAgICAgICAgICBpZiAoYnJhY2tldENvdW50ID09PSAwKSB7XG4gICAgICAgICAgICBpZiAobGFzdCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICBjb25kaXRpb25hbFNvdXJjZSA9IGNvbmRpdGlvbmFsU291cmNlICsgJ3RydWUnXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0b2tlbnMuc2hpZnQoKVxuICAgICAgICAgICAgY29uZGl0aW9uYWxTb3VyY2UgKz0gJyl9KSdcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGNvbnN0IGNvbmRpdGlvbkZ1bmN0aW9uID0gbWF5YmVFdmFsKGVsdCwgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEZ1bmN0aW9uKGNvbmRpdGlvbmFsU291cmNlKSgpXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIGZ1bmN0aW9uKCkgeyByZXR1cm4gdHJ1ZSB9KVxuICAgICAgICAgICAgICBjb25kaXRpb25GdW5jdGlvbi5zb3VyY2UgPSBjb25kaXRpb25hbFNvdXJjZVxuICAgICAgICAgICAgICByZXR1cm4gY29uZGl0aW9uRnVuY3Rpb25cbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpzeW50YXg6ZXJyb3InLCB7IGVycm9yOiBlLCBzb3VyY2U6IGNvbmRpdGlvbmFsU291cmNlIH0pXG4gICAgICAgICAgICAgIHJldHVybiBudWxsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHRva2VuID09PSAnWycpIHtcbiAgICAgICAgICBicmFja2V0Q291bnQrK1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc1Bvc3NpYmxlUmVsYXRpdmVSZWZlcmVuY2UodG9rZW4sIGxhc3QsIHBhcmFtTmFtZSkpIHtcbiAgICAgICAgICBjb25kaXRpb25hbFNvdXJjZSArPSAnKCgnICsgcGFyYW1OYW1lICsgJy4nICsgdG9rZW4gKyAnKSA/ICgnICsgcGFyYW1OYW1lICsgJy4nICsgdG9rZW4gKyAnKSA6ICh3aW5kb3cuJyArIHRva2VuICsgJykpJ1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbmRpdGlvbmFsU291cmNlID0gY29uZGl0aW9uYWxTb3VyY2UgKyB0b2tlblxuICAgICAgICB9XG4gICAgICAgIGxhc3QgPSB0b2tlbnMuc2hpZnQoKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSB0b2tlbnNcbiAgICogQHBhcmFtIHtSZWdFeHB9IG1hdGNoXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBmdW5jdGlvbiBjb25zdW1lVW50aWwodG9rZW5zLCBtYXRjaCkge1xuICAgIGxldCByZXN1bHQgPSAnJ1xuICAgIHdoaWxlICh0b2tlbnMubGVuZ3RoID4gMCAmJiAhbWF0Y2gudGVzdCh0b2tlbnNbMF0pKSB7XG4gICAgICByZXN1bHQgKz0gdG9rZW5zLnNoaWZ0KClcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nW119IHRva2Vuc1xuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgZnVuY3Rpb24gY29uc3VtZUNTU1NlbGVjdG9yKHRva2Vucykge1xuICAgIGxldCByZXN1bHRcbiAgICBpZiAodG9rZW5zLmxlbmd0aCA+IDAgJiYgQ09NQklORURfU0VMRUNUT1JfU1RBUlQudGVzdCh0b2tlbnNbMF0pKSB7XG4gICAgICB0b2tlbnMuc2hpZnQoKVxuICAgICAgcmVzdWx0ID0gY29uc3VtZVVudGlsKHRva2VucywgQ09NQklORURfU0VMRUNUT1JfRU5EKS50cmltKClcbiAgICAgIHRva2Vucy5zaGlmdCgpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdCA9IGNvbnN1bWVVbnRpbCh0b2tlbnMsIFdISVRFU1BBQ0VfT1JfQ09NTUEpXG4gICAgfVxuICAgIHJldHVybiByZXN1bHRcbiAgfVxuXG4gIGNvbnN0IElOUFVUX1NFTEVDVE9SID0gJ2lucHV0LCB0ZXh0YXJlYSwgc2VsZWN0J1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXhwbGljaXRUcmlnZ2VyXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBjYWNoZSBmb3IgdHJpZ2dlciBzcGVjc1xuICAgKiBAcmV0dXJucyB7SHRteFRyaWdnZXJTcGVjaWZpY2F0aW9uW119XG4gICAqL1xuICBmdW5jdGlvbiBwYXJzZUFuZENhY2hlVHJpZ2dlcihlbHQsIGV4cGxpY2l0VHJpZ2dlciwgY2FjaGUpIHtcbiAgICAvKiogQHR5cGUgSHRteFRyaWdnZXJTcGVjaWZpY2F0aW9uW10gKi9cbiAgICBjb25zdCB0cmlnZ2VyU3BlY3MgPSBbXVxuICAgIGNvbnN0IHRva2VucyA9IHRva2VuaXplU3RyaW5nKGV4cGxpY2l0VHJpZ2dlcilcbiAgICBkbyB7XG4gICAgICBjb25zdW1lVW50aWwodG9rZW5zLCBOT1RfV0hJVEVTUEFDRSlcbiAgICAgIGNvbnN0IGluaXRpYWxMZW5ndGggPSB0b2tlbnMubGVuZ3RoXG4gICAgICBjb25zdCB0cmlnZ2VyID0gY29uc3VtZVVudGlsKHRva2VucywgL1ssXFxbXFxzXS8pXG4gICAgICBpZiAodHJpZ2dlciAhPT0gJycpIHtcbiAgICAgICAgaWYgKHRyaWdnZXIgPT09ICdldmVyeScpIHtcbiAgICAgICAgICAvKiogQHR5cGUgSHRteFRyaWdnZXJTcGVjaWZpY2F0aW9uICovXG4gICAgICAgICAgY29uc3QgZXZlcnkgPSB7IHRyaWdnZXI6ICdldmVyeScgfVxuICAgICAgICAgIGNvbnN1bWVVbnRpbCh0b2tlbnMsIE5PVF9XSElURVNQQUNFKVxuICAgICAgICAgIGV2ZXJ5LnBvbGxJbnRlcnZhbCA9IHBhcnNlSW50ZXJ2YWwoY29uc3VtZVVudGlsKHRva2VucywgL1ssXFxbXFxzXS8pKVxuICAgICAgICAgIGNvbnN1bWVVbnRpbCh0b2tlbnMsIE5PVF9XSElURVNQQUNFKVxuICAgICAgICAgIHZhciBldmVudEZpbHRlciA9IG1heWJlR2VuZXJhdGVDb25kaXRpb25hbChlbHQsIHRva2VucywgJ2V2ZW50JylcbiAgICAgICAgICBpZiAoZXZlbnRGaWx0ZXIpIHtcbiAgICAgICAgICAgIGV2ZXJ5LmV2ZW50RmlsdGVyID0gZXZlbnRGaWx0ZXJcbiAgICAgICAgICB9XG4gICAgICAgICAgdHJpZ2dlclNwZWNzLnB1c2goZXZlcnkpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLyoqIEB0eXBlIEh0bXhUcmlnZ2VyU3BlY2lmaWNhdGlvbiAqL1xuICAgICAgICAgIGNvbnN0IHRyaWdnZXJTcGVjID0geyB0cmlnZ2VyIH1cbiAgICAgICAgICB2YXIgZXZlbnRGaWx0ZXIgPSBtYXliZUdlbmVyYXRlQ29uZGl0aW9uYWwoZWx0LCB0b2tlbnMsICdldmVudCcpXG4gICAgICAgICAgaWYgKGV2ZW50RmlsdGVyKSB7XG4gICAgICAgICAgICB0cmlnZ2VyU3BlYy5ldmVudEZpbHRlciA9IGV2ZW50RmlsdGVyXG4gICAgICAgICAgfVxuICAgICAgICAgIHdoaWxlICh0b2tlbnMubGVuZ3RoID4gMCAmJiB0b2tlbnNbMF0gIT09ICcsJykge1xuICAgICAgICAgICAgY29uc3VtZVVudGlsKHRva2VucywgTk9UX1dISVRFU1BBQ0UpXG4gICAgICAgICAgICBjb25zdCB0b2tlbiA9IHRva2Vucy5zaGlmdCgpXG4gICAgICAgICAgICBpZiAodG9rZW4gPT09ICdjaGFuZ2VkJykge1xuICAgICAgICAgICAgICB0cmlnZ2VyU3BlYy5jaGFuZ2VkID0gdHJ1ZVxuICAgICAgICAgICAgfSBlbHNlIGlmICh0b2tlbiA9PT0gJ29uY2UnKSB7XG4gICAgICAgICAgICAgIHRyaWdnZXJTcGVjLm9uY2UgPSB0cnVlXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRva2VuID09PSAnY29uc3VtZScpIHtcbiAgICAgICAgICAgICAgdHJpZ2dlclNwZWMuY29uc3VtZSA9IHRydWVcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rZW4gPT09ICdkZWxheScgJiYgdG9rZW5zWzBdID09PSAnOicpIHtcbiAgICAgICAgICAgICAgdG9rZW5zLnNoaWZ0KClcbiAgICAgICAgICAgICAgdHJpZ2dlclNwZWMuZGVsYXkgPSBwYXJzZUludGVydmFsKGNvbnN1bWVVbnRpbCh0b2tlbnMsIFdISVRFU1BBQ0VfT1JfQ09NTUEpKVxuICAgICAgICAgICAgfSBlbHNlIGlmICh0b2tlbiA9PT0gJ2Zyb20nICYmIHRva2Vuc1swXSA9PT0gJzonKSB7XG4gICAgICAgICAgICAgIHRva2Vucy5zaGlmdCgpXG4gICAgICAgICAgICAgIGlmIChDT01CSU5FRF9TRUxFQ1RPUl9TVEFSVC50ZXN0KHRva2Vuc1swXSkpIHtcbiAgICAgICAgICAgICAgICB2YXIgZnJvbV9hcmcgPSBjb25zdW1lQ1NTU2VsZWN0b3IodG9rZW5zKVxuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHZhciBmcm9tX2FyZyA9IGNvbnN1bWVVbnRpbCh0b2tlbnMsIFdISVRFU1BBQ0VfT1JfQ09NTUEpXG4gICAgICAgICAgICAgICAgaWYgKGZyb21fYXJnID09PSAnY2xvc2VzdCcgfHwgZnJvbV9hcmcgPT09ICdmaW5kJyB8fCBmcm9tX2FyZyA9PT0gJ25leHQnIHx8IGZyb21fYXJnID09PSAncHJldmlvdXMnKSB7XG4gICAgICAgICAgICAgICAgICB0b2tlbnMuc2hpZnQoKVxuICAgICAgICAgICAgICAgICAgY29uc3Qgc2VsZWN0b3IgPSBjb25zdW1lQ1NTU2VsZWN0b3IodG9rZW5zKVxuICAgICAgICAgICAgICAgICAgLy8gYG5leHRgIGFuZCBgcHJldmlvdXNgIGFsbG93IGEgc2VsZWN0b3ItbGVzcyBzeW50YXhcbiAgICAgICAgICAgICAgICAgIGlmIChzZWxlY3Rvci5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGZyb21fYXJnICs9ICcgJyArIHNlbGVjdG9yXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHRyaWdnZXJTcGVjLmZyb20gPSBmcm9tX2FyZ1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0b2tlbiA9PT0gJ3RhcmdldCcgJiYgdG9rZW5zWzBdID09PSAnOicpIHtcbiAgICAgICAgICAgICAgdG9rZW5zLnNoaWZ0KClcbiAgICAgICAgICAgICAgdHJpZ2dlclNwZWMudGFyZ2V0ID0gY29uc3VtZUNTU1NlbGVjdG9yKHRva2VucylcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rZW4gPT09ICd0aHJvdHRsZScgJiYgdG9rZW5zWzBdID09PSAnOicpIHtcbiAgICAgICAgICAgICAgdG9rZW5zLnNoaWZ0KClcbiAgICAgICAgICAgICAgdHJpZ2dlclNwZWMudGhyb3R0bGUgPSBwYXJzZUludGVydmFsKGNvbnN1bWVVbnRpbCh0b2tlbnMsIFdISVRFU1BBQ0VfT1JfQ09NTUEpKVxuICAgICAgICAgICAgfSBlbHNlIGlmICh0b2tlbiA9PT0gJ3F1ZXVlJyAmJiB0b2tlbnNbMF0gPT09ICc6Jykge1xuICAgICAgICAgICAgICB0b2tlbnMuc2hpZnQoKVxuICAgICAgICAgICAgICB0cmlnZ2VyU3BlYy5xdWV1ZSA9IGNvbnN1bWVVbnRpbCh0b2tlbnMsIFdISVRFU1BBQ0VfT1JfQ09NTUEpXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRva2VuID09PSAncm9vdCcgJiYgdG9rZW5zWzBdID09PSAnOicpIHtcbiAgICAgICAgICAgICAgdG9rZW5zLnNoaWZ0KClcbiAgICAgICAgICAgICAgdHJpZ2dlclNwZWNbdG9rZW5dID0gY29uc3VtZUNTU1NlbGVjdG9yKHRva2VucylcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rZW4gPT09ICd0aHJlc2hvbGQnICYmIHRva2Vuc1swXSA9PT0gJzonKSB7XG4gICAgICAgICAgICAgIHRva2Vucy5zaGlmdCgpXG4gICAgICAgICAgICAgIHRyaWdnZXJTcGVjW3Rva2VuXSA9IGNvbnN1bWVVbnRpbCh0b2tlbnMsIFdISVRFU1BBQ0VfT1JfQ09NTUEpXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OnN5bnRheDplcnJvcicsIHsgdG9rZW46IHRva2Vucy5zaGlmdCgpIH0pXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHRyaWdnZXJTcGVjcy5wdXNoKHRyaWdnZXJTcGVjKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAodG9rZW5zLmxlbmd0aCA9PT0gaW5pdGlhbExlbmd0aCkge1xuICAgICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OnN5bnRheDplcnJvcicsIHsgdG9rZW46IHRva2Vucy5zaGlmdCgpIH0pXG4gICAgICB9XG4gICAgICBjb25zdW1lVW50aWwodG9rZW5zLCBOT1RfV0hJVEVTUEFDRSlcbiAgICB9IHdoaWxlICh0b2tlbnNbMF0gPT09ICcsJyAmJiB0b2tlbnMuc2hpZnQoKSlcbiAgICBpZiAoY2FjaGUpIHtcbiAgICAgIGNhY2hlW2V4cGxpY2l0VHJpZ2dlcl0gPSB0cmlnZ2VyU3BlY3NcbiAgICB9XG4gICAgcmV0dXJuIHRyaWdnZXJTcGVjc1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEByZXR1cm5zIHtIdG14VHJpZ2dlclNwZWNpZmljYXRpb25bXX1cbiAgICovXG4gIGZ1bmN0aW9uIGdldFRyaWdnZXJTcGVjcyhlbHQpIHtcbiAgICBjb25zdCBleHBsaWNpdFRyaWdnZXIgPSBnZXRBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC10cmlnZ2VyJylcbiAgICBsZXQgdHJpZ2dlclNwZWNzID0gW11cbiAgICBpZiAoZXhwbGljaXRUcmlnZ2VyKSB7XG4gICAgICBjb25zdCBjYWNoZSA9IGh0bXguY29uZmlnLnRyaWdnZXJTcGVjc0NhY2hlXG4gICAgICB0cmlnZ2VyU3BlY3MgPSAoY2FjaGUgJiYgY2FjaGVbZXhwbGljaXRUcmlnZ2VyXSkgfHwgcGFyc2VBbmRDYWNoZVRyaWdnZXIoZWx0LCBleHBsaWNpdFRyaWdnZXIsIGNhY2hlKVxuICAgIH1cblxuICAgIGlmICh0cmlnZ2VyU3BlY3MubGVuZ3RoID4gMCkge1xuICAgICAgcmV0dXJuIHRyaWdnZXJTcGVjc1xuICAgIH0gZWxzZSBpZiAobWF0Y2hlcyhlbHQsICdmb3JtJykpIHtcbiAgICAgIHJldHVybiBbeyB0cmlnZ2VyOiAnc3VibWl0JyB9XVxuICAgIH0gZWxzZSBpZiAobWF0Y2hlcyhlbHQsICdpbnB1dFt0eXBlPVwiYnV0dG9uXCJdLCBpbnB1dFt0eXBlPVwic3VibWl0XCJdJykpIHtcbiAgICAgIHJldHVybiBbeyB0cmlnZ2VyOiAnY2xpY2snIH1dXG4gICAgfSBlbHNlIGlmIChtYXRjaGVzKGVsdCwgSU5QVVRfU0VMRUNUT1IpKSB7XG4gICAgICByZXR1cm4gW3sgdHJpZ2dlcjogJ2NoYW5nZScgfV1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIFt7IHRyaWdnZXI6ICdjbGljaycgfV1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICovXG4gIGZ1bmN0aW9uIGNhbmNlbFBvbGxpbmcoZWx0KSB7XG4gICAgZ2V0SW50ZXJuYWxEYXRhKGVsdCkuY2FuY2VsbGVkID0gdHJ1ZVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7VHJpZ2dlckhhbmRsZXJ9IGhhbmRsZXJcbiAgICogQHBhcmFtIHtIdG14VHJpZ2dlclNwZWNpZmljYXRpb259IHNwZWNcbiAgICovXG4gIGZ1bmN0aW9uIHByb2Nlc3NQb2xsaW5nKGVsdCwgaGFuZGxlciwgc3BlYykge1xuICAgIGNvbnN0IG5vZGVEYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGVsdClcbiAgICBub2RlRGF0YS50aW1lb3V0ID0gZ2V0V2luZG93KCkuc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgIGlmIChib2R5Q29udGFpbnMoZWx0KSAmJiBub2RlRGF0YS5jYW5jZWxsZWQgIT09IHRydWUpIHtcbiAgICAgICAgaWYgKCFtYXliZUZpbHRlckV2ZW50KHNwZWMsIGVsdCwgbWFrZUV2ZW50KCdoeDpwb2xsOnRyaWdnZXInLCB7XG4gICAgICAgICAgdHJpZ2dlclNwZWM6IHNwZWMsXG4gICAgICAgICAgdGFyZ2V0OiBlbHRcbiAgICAgICAgfSkpKSB7XG4gICAgICAgICAgaGFuZGxlcihlbHQpXG4gICAgICAgIH1cbiAgICAgICAgcHJvY2Vzc1BvbGxpbmcoZWx0LCBoYW5kbGVyLCBzcGVjKVxuICAgICAgfVxuICAgIH0sIHNwZWMucG9sbEludGVydmFsKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7SFRNTEFuY2hvckVsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGlzTG9jYWxMaW5rKGVsdCkge1xuICAgIHJldHVybiBsb2NhdGlvbi5ob3N0bmFtZSA9PT0gZWx0Lmhvc3RuYW1lICYmXG4gICAgICBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnaHJlZicpICYmXG4gICAgICBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnaHJlZicpLmluZGV4T2YoJyMnKSAhPT0gMFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqL1xuICBmdW5jdGlvbiBlbHRJc0Rpc2FibGVkKGVsdCkge1xuICAgIHJldHVybiBjbG9zZXN0KGVsdCwgaHRteC5jb25maWcuZGlzYWJsZVNlbGVjdG9yKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7SHRteE5vZGVJbnRlcm5hbERhdGF9IG5vZGVEYXRhXG4gICAqIEBwYXJhbSB7SHRteFRyaWdnZXJTcGVjaWZpY2F0aW9uW119IHRyaWdnZXJTcGVjc1xuICAgKi9cbiAgZnVuY3Rpb24gYm9vc3RFbGVtZW50KGVsdCwgbm9kZURhdGEsIHRyaWdnZXJTcGVjcykge1xuICAgIGlmICgoZWx0IGluc3RhbmNlb2YgSFRNTEFuY2hvckVsZW1lbnQgJiYgaXNMb2NhbExpbmsoZWx0KSAmJiAoZWx0LnRhcmdldCA9PT0gJycgfHwgZWx0LnRhcmdldCA9PT0gJ19zZWxmJykpIHx8IChlbHQudGFnTmFtZSA9PT0gJ0ZPUk0nICYmIFN0cmluZyhnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnbWV0aG9kJykpLnRvTG93ZXJDYXNlKCkgIT09ICdkaWFsb2cnKSkge1xuICAgICAgbm9kZURhdGEuYm9vc3RlZCA9IHRydWVcbiAgICAgIGxldCB2ZXJiLCBwYXRoXG4gICAgICBpZiAoZWx0LnRhZ05hbWUgPT09ICdBJykge1xuICAgICAgICB2ZXJiID0gJ2dldCdcbiAgICAgICAgcGF0aCA9IGdldFJhd0F0dHJpYnV0ZShlbHQsICdocmVmJylcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHJhd0F0dHJpYnV0ZSA9IGdldFJhd0F0dHJpYnV0ZShlbHQsICdtZXRob2QnKVxuICAgICAgICB2ZXJiID0gcmF3QXR0cmlidXRlID8gcmF3QXR0cmlidXRlLnRvTG93ZXJDYXNlKCkgOiAnZ2V0J1xuICAgICAgICBpZiAodmVyYiA9PT0gJ2dldCcpIHtcbiAgICAgICAgfVxuICAgICAgICBwYXRoID0gZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ2FjdGlvbicpXG4gICAgICB9XG4gICAgICB0cmlnZ2VyU3BlY3MuZm9yRWFjaChmdW5jdGlvbih0cmlnZ2VyU3BlYykge1xuICAgICAgICBhZGRFdmVudExpc3RlbmVyKGVsdCwgZnVuY3Rpb24obm9kZSwgZXZ0KSB7XG4gICAgICAgICAgY29uc3QgZWx0ID0gYXNFbGVtZW50KG5vZGUpXG4gICAgICAgICAgaWYgKGVsdElzRGlzYWJsZWQoZWx0KSkge1xuICAgICAgICAgICAgY2xlYW5VcEVsZW1lbnQoZWx0KVxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgfVxuICAgICAgICAgIGlzc3VlQWpheFJlcXVlc3QodmVyYiwgcGF0aCwgZWx0LCBldnQpXG4gICAgICAgIH0sIG5vZGVEYXRhLCB0cmlnZ2VyU3BlYywgdHJ1ZSlcbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RXZlbnR9IGV2dFxuICAgKiBAcGFyYW0ge05vZGV9IG5vZGVcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBzaG91bGRDYW5jZWwoZXZ0LCBub2RlKSB7XG4gICAgY29uc3QgZWx0ID0gYXNFbGVtZW50KG5vZGUpXG4gICAgaWYgKCFlbHQpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgICBpZiAoZXZ0LnR5cGUgPT09ICdzdWJtaXQnIHx8IGV2dC50eXBlID09PSAnY2xpY2snKSB7XG4gICAgICBpZiAoZWx0LnRhZ05hbWUgPT09ICdGT1JNJykge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgICAgaWYgKG1hdGNoZXMoZWx0LCAnaW5wdXRbdHlwZT1cInN1Ym1pdFwiXSwgYnV0dG9uJykgJiYgY2xvc2VzdChlbHQsICdmb3JtJykgIT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICAgIGlmIChlbHQgaW5zdGFuY2VvZiBIVE1MQW5jaG9yRWxlbWVudCAmJiBlbHQuaHJlZiAmJlxuICAgICAgICAoZWx0LmdldEF0dHJpYnV0ZSgnaHJlZicpID09PSAnIycgfHwgZWx0LmdldEF0dHJpYnV0ZSgnaHJlZicpLmluZGV4T2YoJyMnKSAhPT0gMCkpIHtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHBhcmFtIHtFdmVudHxNb3VzZUV2ZW50fEtleWJvYXJkRXZlbnR8VG91Y2hFdmVudH0gZXZ0XG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gaWdub3JlQm9vc3RlZEFuY2hvckN0cmxDbGljayhlbHQsIGV2dCkge1xuICAgIHJldHVybiBnZXRJbnRlcm5hbERhdGEoZWx0KS5ib29zdGVkICYmIGVsdCBpbnN0YW5jZW9mIEhUTUxBbmNob3JFbGVtZW50ICYmIGV2dC50eXBlID09PSAnY2xpY2snICYmXG4gICAgICAvLyBAdHMtaWdub3JlIHRoaXMgd2lsbCByZXNvbHZlIHRvIHVuZGVmaW5lZCBmb3IgZXZlbnRzIHRoYXQgZG9uJ3QgZGVmaW5lIHRob3NlIHByb3BlcnRpZXMsIHdoaWNoIGlzIGZpbmVcbiAgICAgIChldnQuY3RybEtleSB8fCBldnQubWV0YUtleSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0h0bXhUcmlnZ2VyU3BlY2lmaWNhdGlvbn0gdHJpZ2dlclNwZWNcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHBhcmFtIHtFdmVudH0gZXZ0XG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gbWF5YmVGaWx0ZXJFdmVudCh0cmlnZ2VyU3BlYywgZWx0LCBldnQpIHtcbiAgICBjb25zdCBldmVudEZpbHRlciA9IHRyaWdnZXJTcGVjLmV2ZW50RmlsdGVyXG4gICAgaWYgKGV2ZW50RmlsdGVyKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gZXZlbnRGaWx0ZXIuY2FsbChlbHQsIGV2dCkgIT09IHRydWVcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY29uc3Qgc291cmNlID0gZXZlbnRGaWx0ZXIuc291cmNlXG4gICAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6ZXZlbnRGaWx0ZXI6ZXJyb3InLCB7IGVycm9yOiBlLCBzb3VyY2UgfSlcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHBhcmFtIHtUcmlnZ2VySGFuZGxlcn0gaGFuZGxlclxuICAgKiBAcGFyYW0ge0h0bXhOb2RlSW50ZXJuYWxEYXRhfSBub2RlRGF0YVxuICAgKiBAcGFyYW0ge0h0bXhUcmlnZ2VyU3BlY2lmaWNhdGlvbn0gdHJpZ2dlclNwZWNcbiAgICogQHBhcmFtIHtib29sZWFufSBbZXhwbGljaXRDYW5jZWxdXG4gICAqL1xuICBmdW5jdGlvbiBhZGRFdmVudExpc3RlbmVyKGVsdCwgaGFuZGxlciwgbm9kZURhdGEsIHRyaWdnZXJTcGVjLCBleHBsaWNpdENhbmNlbCkge1xuICAgIGNvbnN0IGVsZW1lbnREYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGVsdClcbiAgICAvKiogQHR5cGUgeyhOb2RlfFdpbmRvdylbXX0gKi9cbiAgICBsZXQgZWx0c1RvTGlzdGVuT25cbiAgICBpZiAodHJpZ2dlclNwZWMuZnJvbSkge1xuICAgICAgZWx0c1RvTGlzdGVuT24gPSBxdWVyeVNlbGVjdG9yQWxsRXh0KGVsdCwgdHJpZ2dlclNwZWMuZnJvbSlcbiAgICB9IGVsc2Uge1xuICAgICAgZWx0c1RvTGlzdGVuT24gPSBbZWx0XVxuICAgIH1cbiAgICAvLyBzdG9yZSB0aGUgaW5pdGlhbCB2YWx1ZXMgb2YgdGhlIGVsZW1lbnRzLCBzbyB3ZSBjYW4gdGVsbCBpZiB0aGV5IGNoYW5nZVxuICAgIGlmICh0cmlnZ2VyU3BlYy5jaGFuZ2VkKSB7XG4gICAgICBlbHRzVG9MaXN0ZW5Pbi5mb3JFYWNoKGZ1bmN0aW9uKGVsdFRvTGlzdGVuT24pIHtcbiAgICAgICAgY29uc3QgZWx0VG9MaXN0ZW5PbkRhdGEgPSBnZXRJbnRlcm5hbERhdGEoZWx0VG9MaXN0ZW5PbilcbiAgICAgICAgLy8gQHRzLWlnbm9yZSB2YWx1ZSB3aWxsIGJlIHVuZGVmaW5lZCBmb3Igbm9uLWlucHV0IGVsZW1lbnRzLCB3aGljaCBpcyBmaW5lXG4gICAgICAgIGVsdFRvTGlzdGVuT25EYXRhLmxhc3RWYWx1ZSA9IGVsdFRvTGlzdGVuT24udmFsdWVcbiAgICAgIH0pXG4gICAgfVxuICAgIGZvckVhY2goZWx0c1RvTGlzdGVuT24sIGZ1bmN0aW9uKGVsdFRvTGlzdGVuT24pIHtcbiAgICAgIC8qKiBAdHlwZSBFdmVudExpc3RlbmVyICovXG4gICAgICBjb25zdCBldmVudExpc3RlbmVyID0gZnVuY3Rpb24oZXZ0KSB7XG4gICAgICAgIGlmICghYm9keUNvbnRhaW5zKGVsdCkpIHtcbiAgICAgICAgICBlbHRUb0xpc3Rlbk9uLnJlbW92ZUV2ZW50TGlzdGVuZXIodHJpZ2dlclNwZWMudHJpZ2dlciwgZXZlbnRMaXN0ZW5lcilcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBpZiAoaWdub3JlQm9vc3RlZEFuY2hvckN0cmxDbGljayhlbHQsIGV2dCkpIHtcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBpZiAoZXhwbGljaXRDYW5jZWwgfHwgc2hvdWxkQ2FuY2VsKGV2dCwgZWx0KSkge1xuICAgICAgICAgIGV2dC5wcmV2ZW50RGVmYXVsdCgpXG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1heWJlRmlsdGVyRXZlbnQodHJpZ2dlclNwZWMsIGVsdCwgZXZ0KSkge1xuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGV2ZW50RGF0YSA9IGdldEludGVybmFsRGF0YShldnQpXG4gICAgICAgIGV2ZW50RGF0YS50cmlnZ2VyU3BlYyA9IHRyaWdnZXJTcGVjXG4gICAgICAgIGlmIChldmVudERhdGEuaGFuZGxlZEZvciA9PSBudWxsKSB7XG4gICAgICAgICAgZXZlbnREYXRhLmhhbmRsZWRGb3IgPSBbXVxuICAgICAgICB9XG4gICAgICAgIGlmIChldmVudERhdGEuaGFuZGxlZEZvci5pbmRleE9mKGVsdCkgPCAwKSB7XG4gICAgICAgICAgZXZlbnREYXRhLmhhbmRsZWRGb3IucHVzaChlbHQpXG4gICAgICAgICAgaWYgKHRyaWdnZXJTcGVjLmNvbnN1bWUpIHtcbiAgICAgICAgICAgIGV2dC5zdG9wUHJvcGFnYXRpb24oKVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodHJpZ2dlclNwZWMudGFyZ2V0ICYmIGV2dC50YXJnZXQpIHtcbiAgICAgICAgICAgIGlmICghbWF0Y2hlcyhhc0VsZW1lbnQoZXZ0LnRhcmdldCksIHRyaWdnZXJTcGVjLnRhcmdldCkpIHtcbiAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0cmlnZ2VyU3BlYy5vbmNlKSB7XG4gICAgICAgICAgICBpZiAoZWxlbWVudERhdGEudHJpZ2dlcmVkT25jZSkge1xuICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGVsZW1lbnREYXRhLnRyaWdnZXJlZE9uY2UgPSB0cnVlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0cmlnZ2VyU3BlYy5jaGFuZ2VkKSB7XG4gICAgICAgICAgICBjb25zdCBlbHRUb0xpc3Rlbk9uRGF0YSA9IGdldEludGVybmFsRGF0YShlbHRUb0xpc3Rlbk9uKVxuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZSB2YWx1ZSB3aWxsIGJlIHVuZGVmaW5lZCBmb3Igbm9uLWlucHV0IGVsZW1lbnRzLCB3aGljaCBpcyBmaW5lXG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGVsdFRvTGlzdGVuT24udmFsdWVcbiAgICAgICAgICAgIGlmIChlbHRUb0xpc3Rlbk9uRGF0YS5sYXN0VmFsdWUgPT09IHZhbHVlKSB7XG4gICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWx0VG9MaXN0ZW5PbkRhdGEubGFzdFZhbHVlID0gdmFsdWVcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGVsZW1lbnREYXRhLmRlbGF5ZWQpIHtcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChlbGVtZW50RGF0YS5kZWxheWVkKVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoZWxlbWVudERhdGEudGhyb3R0bGUpIHtcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICh0cmlnZ2VyU3BlYy50aHJvdHRsZSA+IDApIHtcbiAgICAgICAgICAgIGlmICghZWxlbWVudERhdGEudGhyb3R0bGUpIHtcbiAgICAgICAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6dHJpZ2dlcicpXG4gICAgICAgICAgICAgIGhhbmRsZXIoZWx0LCBldnQpXG4gICAgICAgICAgICAgIGVsZW1lbnREYXRhLnRocm90dGxlID0gZ2V0V2luZG93KCkuc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICBlbGVtZW50RGF0YS50aHJvdHRsZSA9IG51bGxcbiAgICAgICAgICAgICAgfSwgdHJpZ2dlclNwZWMudGhyb3R0bGUpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIGlmICh0cmlnZ2VyU3BlYy5kZWxheSA+IDApIHtcbiAgICAgICAgICAgIGVsZW1lbnREYXRhLmRlbGF5ZWQgPSBnZXRXaW5kb3coKS5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDp0cmlnZ2VyJylcbiAgICAgICAgICAgICAgaGFuZGxlcihlbHQsIGV2dClcbiAgICAgICAgICAgIH0sIHRyaWdnZXJTcGVjLmRlbGF5KVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDp0cmlnZ2VyJylcbiAgICAgICAgICAgIGhhbmRsZXIoZWx0LCBldnQpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAobm9kZURhdGEubGlzdGVuZXJJbmZvcyA9PSBudWxsKSB7XG4gICAgICAgIG5vZGVEYXRhLmxpc3RlbmVySW5mb3MgPSBbXVxuICAgICAgfVxuICAgICAgbm9kZURhdGEubGlzdGVuZXJJbmZvcy5wdXNoKHtcbiAgICAgICAgdHJpZ2dlcjogdHJpZ2dlclNwZWMudHJpZ2dlcixcbiAgICAgICAgbGlzdGVuZXI6IGV2ZW50TGlzdGVuZXIsXG4gICAgICAgIG9uOiBlbHRUb0xpc3Rlbk9uXG4gICAgICB9KVxuICAgICAgZWx0VG9MaXN0ZW5Pbi5hZGRFdmVudExpc3RlbmVyKHRyaWdnZXJTcGVjLnRyaWdnZXIsIGV2ZW50TGlzdGVuZXIpXG4gICAgfSlcbiAgfVxuXG4gIGxldCB3aW5kb3dJc1Njcm9sbGluZyA9IGZhbHNlIC8vIHVzZWQgYnkgaW5pdFNjcm9sbEhhbmRsZXJcbiAgbGV0IHNjcm9sbEhhbmRsZXIgPSBudWxsXG4gIGZ1bmN0aW9uIGluaXRTY3JvbGxIYW5kbGVyKCkge1xuICAgIGlmICghc2Nyb2xsSGFuZGxlcikge1xuICAgICAgc2Nyb2xsSGFuZGxlciA9IGZ1bmN0aW9uKCkge1xuICAgICAgICB3aW5kb3dJc1Njcm9sbGluZyA9IHRydWVcbiAgICAgIH1cbiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLCBzY3JvbGxIYW5kbGVyKVxuICAgICAgc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKSB7XG4gICAgICAgIGlmICh3aW5kb3dJc1Njcm9sbGluZykge1xuICAgICAgICAgIHdpbmRvd0lzU2Nyb2xsaW5nID0gZmFsc2VcbiAgICAgICAgICBmb3JFYWNoKGdldERvY3VtZW50KCkucXVlcnlTZWxlY3RvckFsbChcIltoeC10cmlnZ2VyKj0ncmV2ZWFsZWQnXSxbZGF0YS1oeC10cmlnZ2VyKj0ncmV2ZWFsZWQnXVwiKSwgZnVuY3Rpb24oZWx0KSB7XG4gICAgICAgICAgICBtYXliZVJldmVhbChlbHQpXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfSwgMjAwKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKi9cbiAgZnVuY3Rpb24gbWF5YmVSZXZlYWwoZWx0KSB7XG4gICAgaWYgKCFoYXNBdHRyaWJ1dGUoZWx0LCAnZGF0YS1oeC1yZXZlYWxlZCcpICYmIGlzU2Nyb2xsZWRJbnRvVmlldyhlbHQpKSB7XG4gICAgICBlbHQuc2V0QXR0cmlidXRlKCdkYXRhLWh4LXJldmVhbGVkJywgJ3RydWUnKVxuICAgICAgY29uc3Qgbm9kZURhdGEgPSBnZXRJbnRlcm5hbERhdGEoZWx0KVxuICAgICAgaWYgKG5vZGVEYXRhLmluaXRIYXNoKSB7XG4gICAgICAgIHRyaWdnZXJFdmVudChlbHQsICdyZXZlYWxlZCcpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBpZiB0aGUgbm9kZSBpc24ndCBpbml0aWFsaXplZCwgd2FpdCBmb3IgaXQgYmVmb3JlIHRyaWdnZXJpbmcgdGhlIHJlcXVlc3RcbiAgICAgICAgZWx0LmFkZEV2ZW50TGlzdGVuZXIoJ2h0bXg6YWZ0ZXJQcm9jZXNzTm9kZScsIGZ1bmN0aW9uKCkgeyB0cmlnZ2VyRXZlbnQoZWx0LCAncmV2ZWFsZWQnKSB9LCB7IG9uY2U6IHRydWUgfSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge1RyaWdnZXJIYW5kbGVyfSBoYW5kbGVyXG4gICAqIEBwYXJhbSB7SHRteE5vZGVJbnRlcm5hbERhdGF9IG5vZGVEYXRhXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBkZWxheVxuICAgKi9cbiAgZnVuY3Rpb24gbG9hZEltbWVkaWF0ZWx5KGVsdCwgaGFuZGxlciwgbm9kZURhdGEsIGRlbGF5KSB7XG4gICAgY29uc3QgbG9hZCA9IGZ1bmN0aW9uKCkge1xuICAgICAgaWYgKCFub2RlRGF0YS5sb2FkZWQpIHtcbiAgICAgICAgbm9kZURhdGEubG9hZGVkID0gdHJ1ZVxuICAgICAgICBoYW5kbGVyKGVsdClcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGRlbGF5ID4gMCkge1xuICAgICAgZ2V0V2luZG93KCkuc2V0VGltZW91dChsb2FkLCBkZWxheSlcbiAgICB9IGVsc2Uge1xuICAgICAgbG9hZCgpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7SHRteE5vZGVJbnRlcm5hbERhdGF9IG5vZGVEYXRhXG4gICAqIEBwYXJhbSB7SHRteFRyaWdnZXJTcGVjaWZpY2F0aW9uW119IHRyaWdnZXJTcGVjc1xuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIHByb2Nlc3NWZXJicyhlbHQsIG5vZGVEYXRhLCB0cmlnZ2VyU3BlY3MpIHtcbiAgICBsZXQgZXhwbGljaXRBY3Rpb24gPSBmYWxzZVxuICAgIGZvckVhY2goVkVSQlMsIGZ1bmN0aW9uKHZlcmIpIHtcbiAgICAgIGlmIChoYXNBdHRyaWJ1dGUoZWx0LCAnaHgtJyArIHZlcmIpKSB7XG4gICAgICAgIGNvbnN0IHBhdGggPSBnZXRBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC0nICsgdmVyYilcbiAgICAgICAgZXhwbGljaXRBY3Rpb24gPSB0cnVlXG4gICAgICAgIG5vZGVEYXRhLnBhdGggPSBwYXRoXG4gICAgICAgIG5vZGVEYXRhLnZlcmIgPSB2ZXJiXG4gICAgICAgIHRyaWdnZXJTcGVjcy5mb3JFYWNoKGZ1bmN0aW9uKHRyaWdnZXJTcGVjKSB7XG4gICAgICAgICAgYWRkVHJpZ2dlckhhbmRsZXIoZWx0LCB0cmlnZ2VyU3BlYywgbm9kZURhdGEsIGZ1bmN0aW9uKG5vZGUsIGV2dCkge1xuICAgICAgICAgICAgY29uc3QgZWx0ID0gYXNFbGVtZW50KG5vZGUpXG4gICAgICAgICAgICBpZiAoY2xvc2VzdChlbHQsIGh0bXguY29uZmlnLmRpc2FibGVTZWxlY3RvcikpIHtcbiAgICAgICAgICAgICAgY2xlYW5VcEVsZW1lbnQoZWx0KVxuICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlzc3VlQWpheFJlcXVlc3QodmVyYiwgcGF0aCwgZWx0LCBldnQpXG4gICAgICAgICAgfSlcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9KVxuICAgIHJldHVybiBleHBsaWNpdEFjdGlvblxuICB9XG5cbiAgLyoqXG4gICAqIEBjYWxsYmFjayBUcmlnZ2VySGFuZGxlclxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcGFyYW0ge0V2ZW50fSBbZXZ0XVxuICAgKi9cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHBhcmFtIHtIdG14VHJpZ2dlclNwZWNpZmljYXRpb259IHRyaWdnZXJTcGVjXG4gICAqIEBwYXJhbSB7SHRteE5vZGVJbnRlcm5hbERhdGF9IG5vZGVEYXRhXG4gICAqIEBwYXJhbSB7VHJpZ2dlckhhbmRsZXJ9IGhhbmRsZXJcbiAgICovXG4gIGZ1bmN0aW9uIGFkZFRyaWdnZXJIYW5kbGVyKGVsdCwgdHJpZ2dlclNwZWMsIG5vZGVEYXRhLCBoYW5kbGVyKSB7XG4gICAgaWYgKHRyaWdnZXJTcGVjLnRyaWdnZXIgPT09ICdyZXZlYWxlZCcpIHtcbiAgICAgIGluaXRTY3JvbGxIYW5kbGVyKClcbiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoZWx0LCBoYW5kbGVyLCBub2RlRGF0YSwgdHJpZ2dlclNwZWMpXG4gICAgICBtYXliZVJldmVhbChhc0VsZW1lbnQoZWx0KSlcbiAgICB9IGVsc2UgaWYgKHRyaWdnZXJTcGVjLnRyaWdnZXIgPT09ICdpbnRlcnNlY3QnKSB7XG4gICAgICBjb25zdCBvYnNlcnZlck9wdGlvbnMgPSB7fVxuICAgICAgaWYgKHRyaWdnZXJTcGVjLnJvb3QpIHtcbiAgICAgICAgb2JzZXJ2ZXJPcHRpb25zLnJvb3QgPSBxdWVyeVNlbGVjdG9yRXh0KGVsdCwgdHJpZ2dlclNwZWMucm9vdClcbiAgICAgIH1cbiAgICAgIGlmICh0cmlnZ2VyU3BlYy50aHJlc2hvbGQpIHtcbiAgICAgICAgb2JzZXJ2ZXJPcHRpb25zLnRocmVzaG9sZCA9IHBhcnNlRmxvYXQodHJpZ2dlclNwZWMudGhyZXNob2xkKVxuICAgICAgfVxuICAgICAgY29uc3Qgb2JzZXJ2ZXIgPSBuZXcgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIoZnVuY3Rpb24oZW50cmllcykge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVudHJpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBjb25zdCBlbnRyeSA9IGVudHJpZXNbaV1cbiAgICAgICAgICBpZiAoZW50cnkuaXNJbnRlcnNlY3RpbmcpIHtcbiAgICAgICAgICAgIHRyaWdnZXJFdmVudChlbHQsICdpbnRlcnNlY3QnKVxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sIG9ic2VydmVyT3B0aW9ucylcbiAgICAgIG9ic2VydmVyLm9ic2VydmUoYXNFbGVtZW50KGVsdCkpXG4gICAgICBhZGRFdmVudExpc3RlbmVyKGFzRWxlbWVudChlbHQpLCBoYW5kbGVyLCBub2RlRGF0YSwgdHJpZ2dlclNwZWMpXG4gICAgfSBlbHNlIGlmICh0cmlnZ2VyU3BlYy50cmlnZ2VyID09PSAnbG9hZCcpIHtcbiAgICAgIGlmICghbWF5YmVGaWx0ZXJFdmVudCh0cmlnZ2VyU3BlYywgZWx0LCBtYWtlRXZlbnQoJ2xvYWQnLCB7IGVsdCB9KSkpIHtcbiAgICAgICAgbG9hZEltbWVkaWF0ZWx5KGFzRWxlbWVudChlbHQpLCBoYW5kbGVyLCBub2RlRGF0YSwgdHJpZ2dlclNwZWMuZGVsYXkpXG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0cmlnZ2VyU3BlYy5wb2xsSW50ZXJ2YWwgPiAwKSB7XG4gICAgICBub2RlRGF0YS5wb2xsaW5nID0gdHJ1ZVxuICAgICAgcHJvY2Vzc1BvbGxpbmcoYXNFbGVtZW50KGVsdCksIGhhbmRsZXIsIHRyaWdnZXJTcGVjKVxuICAgIH0gZWxzZSB7XG4gICAgICBhZGRFdmVudExpc3RlbmVyKGVsdCwgaGFuZGxlciwgbm9kZURhdGEsIHRyaWdnZXJTcGVjKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IG5vZGVcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBzaG91bGRQcm9jZXNzSHhPbihub2RlKSB7XG4gICAgY29uc3QgZWx0ID0gYXNFbGVtZW50KG5vZGUpXG4gICAgaWYgKCFlbHQpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgICBjb25zdCBhdHRyaWJ1dGVzID0gZWx0LmF0dHJpYnV0ZXNcbiAgICBmb3IgKGxldCBqID0gMDsgaiA8IGF0dHJpYnV0ZXMubGVuZ3RoOyBqKyspIHtcbiAgICAgIGNvbnN0IGF0dHJOYW1lID0gYXR0cmlidXRlc1tqXS5uYW1lXG4gICAgICBpZiAoc3RhcnRzV2l0aChhdHRyTmFtZSwgJ2h4LW9uOicpIHx8IHN0YXJ0c1dpdGgoYXR0ck5hbWUsICdkYXRhLWh4LW9uOicpIHx8XG4gICAgICAgIHN0YXJ0c1dpdGgoYXR0ck5hbWUsICdoeC1vbi0nKSB8fCBzdGFydHNXaXRoKGF0dHJOYW1lLCAnZGF0YS1oeC1vbi0nKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcmV0dXJucyB7RWxlbWVudFtdfVxuICAgKi9cbiAgY29uc3QgSFhfT05fUVVFUlkgPSBuZXcgWFBhdGhFdmFsdWF0b3IoKVxuICAgIC5jcmVhdGVFeHByZXNzaW9uKCcuLy8qW0AqWyBzdGFydHMtd2l0aChuYW1lKCksIFwiaHgtb246XCIpIG9yIHN0YXJ0cy13aXRoKG5hbWUoKSwgXCJkYXRhLWh4LW9uOlwiKSBvcicgK1xuICAgICAgJyBzdGFydHMtd2l0aChuYW1lKCksIFwiaHgtb24tXCIpIG9yIHN0YXJ0cy13aXRoKG5hbWUoKSwgXCJkYXRhLWh4LW9uLVwiKSBdXScpXG5cbiAgZnVuY3Rpb24gcHJvY2Vzc0hYT25Sb290KGVsdCwgZWxlbWVudHMpIHtcbiAgICBpZiAoc2hvdWxkUHJvY2Vzc0h4T24oZWx0KSkge1xuICAgICAgZWxlbWVudHMucHVzaChhc0VsZW1lbnQoZWx0KSlcbiAgICB9XG4gICAgY29uc3QgaXRlciA9IEhYX09OX1FVRVJZLmV2YWx1YXRlKGVsdClcbiAgICBsZXQgbm9kZSA9IG51bGxcbiAgICB3aGlsZSAobm9kZSA9IGl0ZXIuaXRlcmF0ZU5leHQoKSkgZWxlbWVudHMucHVzaChhc0VsZW1lbnQobm9kZSkpXG4gIH1cblxuICBmdW5jdGlvbiBmaW5kSHhPbldpbGRjYXJkRWxlbWVudHMoZWx0KSB7XG4gICAgLyoqIEB0eXBlIHtFbGVtZW50W119ICovXG4gICAgY29uc3QgZWxlbWVudHMgPSBbXVxuICAgIGlmIChlbHQgaW5zdGFuY2VvZiBEb2N1bWVudEZyYWdtZW50KSB7XG4gICAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIGVsdC5jaGlsZE5vZGVzKSB7XG4gICAgICAgIHByb2Nlc3NIWE9uUm9vdChjaGlsZCwgZWxlbWVudHMpXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHByb2Nlc3NIWE9uUm9vdChlbHQsIGVsZW1lbnRzKVxuICAgIH1cbiAgICByZXR1cm4gZWxlbWVudHNcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJucyB7Tm9kZUxpc3RPZjxFbGVtZW50PnxbXX1cbiAgICovXG4gIGZ1bmN0aW9uIGZpbmRFbGVtZW50c1RvUHJvY2VzcyhlbHQpIHtcbiAgICBpZiAoZWx0LnF1ZXJ5U2VsZWN0b3JBbGwpIHtcbiAgICAgIGNvbnN0IGJvb3N0ZWRTZWxlY3RvciA9ICcsIFtoeC1ib29zdF0gYSwgW2RhdGEtaHgtYm9vc3RdIGEsIGFbaHgtYm9vc3RdLCBhW2RhdGEtaHgtYm9vc3RdJ1xuXG4gICAgICBjb25zdCBleHRlbnNpb25TZWxlY3RvcnMgPSBbXVxuICAgICAgZm9yIChjb25zdCBlIGluIGV4dGVuc2lvbnMpIHtcbiAgICAgICAgY29uc3QgZXh0ZW5zaW9uID0gZXh0ZW5zaW9uc1tlXVxuICAgICAgICBpZiAoZXh0ZW5zaW9uLmdldFNlbGVjdG9ycykge1xuICAgICAgICAgIHZhciBzZWxlY3RvcnMgPSBleHRlbnNpb24uZ2V0U2VsZWN0b3JzKClcbiAgICAgICAgICBpZiAoc2VsZWN0b3JzKSB7XG4gICAgICAgICAgICBleHRlbnNpb25TZWxlY3RvcnMucHVzaChzZWxlY3RvcnMpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlc3VsdHMgPSBlbHQucXVlcnlTZWxlY3RvckFsbChWRVJCX1NFTEVDVE9SICsgYm9vc3RlZFNlbGVjdG9yICsgXCIsIGZvcm0sIFt0eXBlPSdzdWJtaXQnXSxcIiArXG4gICAgICAgICcgW2h4LWV4dF0sIFtkYXRhLWh4LWV4dF0sIFtoeC10cmlnZ2VyXSwgW2RhdGEtaHgtdHJpZ2dlcl0nICsgZXh0ZW5zaW9uU2VsZWN0b3JzLmZsYXQoKS5tYXAocyA9PiAnLCAnICsgcykuam9pbignJykpXG5cbiAgICAgIHJldHVybiByZXN1bHRzXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBbXVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgc3VibWl0IGJ1dHRvbnMvaW5wdXRzIHRoYXQgaGF2ZSB0aGUgZm9ybSBhdHRyaWJ1dGUgc2V0XG4gICAqIHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9kb2NzL1dlYi9IVE1ML0VsZW1lbnQvYnV0dG9uXG4gICAqIEBwYXJhbSB7RXZlbnR9IGV2dFxuICAgKi9cbiAgZnVuY3Rpb24gbWF5YmVTZXRMYXN0QnV0dG9uQ2xpY2tlZChldnQpIHtcbiAgICBjb25zdCBlbHQgPSAvKiogQHR5cGUge0hUTUxCdXR0b25FbGVtZW50fEhUTUxJbnB1dEVsZW1lbnR9ICovIChjbG9zZXN0KGFzRWxlbWVudChldnQudGFyZ2V0KSwgXCJidXR0b24sIGlucHV0W3R5cGU9J3N1Ym1pdCddXCIpKVxuICAgIGNvbnN0IGludGVybmFsRGF0YSA9IGdldFJlbGF0ZWRGb3JtRGF0YShldnQpXG4gICAgaWYgKGludGVybmFsRGF0YSkge1xuICAgICAgaW50ZXJuYWxEYXRhLmxhc3RCdXR0b25DbGlja2VkID0gZWx0XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RXZlbnR9IGV2dFxuICAgKi9cbiAgZnVuY3Rpb24gbWF5YmVVbnNldExhc3RCdXR0b25DbGlja2VkKGV2dCkge1xuICAgIGNvbnN0IGludGVybmFsRGF0YSA9IGdldFJlbGF0ZWRGb3JtRGF0YShldnQpXG4gICAgaWYgKGludGVybmFsRGF0YSkge1xuICAgICAgaW50ZXJuYWxEYXRhLmxhc3RCdXR0b25DbGlja2VkID0gbnVsbFxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0V2ZW50fSBldnRcbiAgICogQHJldHVybnMge0h0bXhOb2RlSW50ZXJuYWxEYXRhfHVuZGVmaW5lZH1cbiAgICovXG4gIGZ1bmN0aW9uIGdldFJlbGF0ZWRGb3JtRGF0YShldnQpIHtcbiAgICBjb25zdCBlbHQgPSBjbG9zZXN0KGFzRWxlbWVudChldnQudGFyZ2V0KSwgXCJidXR0b24sIGlucHV0W3R5cGU9J3N1Ym1pdCddXCIpXG4gICAgaWYgKCFlbHQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBjb25zdCBmb3JtID0gcmVzb2x2ZVRhcmdldCgnIycgKyBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnZm9ybScpLCBlbHQuZ2V0Um9vdE5vZGUoKSkgfHwgY2xvc2VzdChlbHQsICdmb3JtJylcbiAgICBpZiAoIWZvcm0pIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICByZXR1cm4gZ2V0SW50ZXJuYWxEYXRhKGZvcm0pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldH0gZWx0XG4gICAqL1xuICBmdW5jdGlvbiBpbml0QnV0dG9uVHJhY2tpbmcoZWx0KSB7XG4gICAgLy8gbmVlZCB0byBoYW5kbGUgYm90aCBjbGljayBhbmQgZm9jdXMgaW46XG4gICAgLy8gICBmb2N1c2luIC0gaW4gY2FzZSBzb21lb25lIHRhYnMgaW4gdG8gYSBidXR0b24gYW5kIGhpdHMgdGhlIHNwYWNlIGJhclxuICAgIC8vICAgY2xpY2sgLSBvbiBPU1ggYnV0dG9ucyBkbyBub3QgZm9jdXMgb24gY2xpY2sgc2VlIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xMzcyNFxuICAgIGVsdC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIG1heWJlU2V0TGFzdEJ1dHRvbkNsaWNrZWQpXG4gICAgZWx0LmFkZEV2ZW50TGlzdGVuZXIoJ2ZvY3VzaW4nLCBtYXliZVNldExhc3RCdXR0b25DbGlja2VkKVxuICAgIGVsdC5hZGRFdmVudExpc3RlbmVyKCdmb2N1c291dCcsIG1heWJlVW5zZXRMYXN0QnV0dG9uQ2xpY2tlZClcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjb2RlXG4gICAqL1xuICBmdW5jdGlvbiBhZGRIeE9uRXZlbnRIYW5kbGVyKGVsdCwgZXZlbnROYW1lLCBjb2RlKSB7XG4gICAgY29uc3Qgbm9kZURhdGEgPSBnZXRJbnRlcm5hbERhdGEoZWx0KVxuICAgIGlmICghQXJyYXkuaXNBcnJheShub2RlRGF0YS5vbkhhbmRsZXJzKSkge1xuICAgICAgbm9kZURhdGEub25IYW5kbGVycyA9IFtdXG4gICAgfVxuICAgIGxldCBmdW5jXG4gICAgLyoqIEB0eXBlIEV2ZW50TGlzdGVuZXIgKi9cbiAgICBjb25zdCBsaXN0ZW5lciA9IGZ1bmN0aW9uKGUpIHtcbiAgICAgIG1heWJlRXZhbChlbHQsIGZ1bmN0aW9uKCkge1xuICAgICAgICBpZiAoZWx0SXNEaXNhYmxlZChlbHQpKSB7XG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFmdW5jKSB7XG4gICAgICAgICAgZnVuYyA9IG5ldyBGdW5jdGlvbignZXZlbnQnLCBjb2RlKVxuICAgICAgICB9XG4gICAgICAgIGZ1bmMuY2FsbChlbHQsIGUpXG4gICAgICB9KVxuICAgIH1cbiAgICBlbHQuYWRkRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIGxpc3RlbmVyKVxuICAgIG5vZGVEYXRhLm9uSGFuZGxlcnMucHVzaCh7IGV2ZW50OiBldmVudE5hbWUsIGxpc3RlbmVyIH0pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICovXG4gIGZ1bmN0aW9uIHByb2Nlc3NIeE9uV2lsZGNhcmQoZWx0KSB7XG4gICAgLy8gd2lwZSBhbnkgcHJldmlvdXMgb24gaGFuZGxlcnMgc28gdGhhdCB0aGlzIGZ1bmN0aW9uIHRha2VzIHByZWNlZGVuY2VcbiAgICBkZUluaXRPbkhhbmRsZXJzKGVsdClcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZWx0LmF0dHJpYnV0ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IG5hbWUgPSBlbHQuYXR0cmlidXRlc1tpXS5uYW1lXG4gICAgICBjb25zdCB2YWx1ZSA9IGVsdC5hdHRyaWJ1dGVzW2ldLnZhbHVlXG4gICAgICBpZiAoc3RhcnRzV2l0aChuYW1lLCAnaHgtb24nKSB8fCBzdGFydHNXaXRoKG5hbWUsICdkYXRhLWh4LW9uJykpIHtcbiAgICAgICAgY29uc3QgYWZ0ZXJPblBvc2l0aW9uID0gbmFtZS5pbmRleE9mKCctb24nKSArIDNcbiAgICAgICAgY29uc3QgbmV4dENoYXIgPSBuYW1lLnNsaWNlKGFmdGVyT25Qb3NpdGlvbiwgYWZ0ZXJPblBvc2l0aW9uICsgMSlcbiAgICAgICAgaWYgKG5leHRDaGFyID09PSAnLScgfHwgbmV4dENoYXIgPT09ICc6Jykge1xuICAgICAgICAgIGxldCBldmVudE5hbWUgPSBuYW1lLnNsaWNlKGFmdGVyT25Qb3NpdGlvbiArIDEpXG4gICAgICAgICAgLy8gaWYgdGhlIGV2ZW50TmFtZSBzdGFydHMgd2l0aCBhIGNvbG9uIG9yIGRhc2gsIHByZXBlbmQgXCJodG14XCIgZm9yIHNob3J0aGFuZCBzdXBwb3J0XG4gICAgICAgICAgaWYgKHN0YXJ0c1dpdGgoZXZlbnROYW1lLCAnOicpKSB7XG4gICAgICAgICAgICBldmVudE5hbWUgPSAnaHRteCcgKyBldmVudE5hbWVcbiAgICAgICAgICB9IGVsc2UgaWYgKHN0YXJ0c1dpdGgoZXZlbnROYW1lLCAnLScpKSB7XG4gICAgICAgICAgICBldmVudE5hbWUgPSAnaHRteDonICsgZXZlbnROYW1lLnNsaWNlKDEpXG4gICAgICAgICAgfSBlbHNlIGlmIChzdGFydHNXaXRoKGV2ZW50TmFtZSwgJ2h0bXgtJykpIHtcbiAgICAgICAgICAgIGV2ZW50TmFtZSA9ICdodG14OicgKyBldmVudE5hbWUuc2xpY2UoNSlcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBhZGRIeE9uRXZlbnRIYW5kbGVyKGVsdCwgZXZlbnROYW1lLCB2YWx1ZSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR8SFRNTElucHV0RWxlbWVudH0gZWx0XG4gICAqL1xuICBmdW5jdGlvbiBpbml0Tm9kZShlbHQpIHtcbiAgICBpZiAoY2xvc2VzdChlbHQsIGh0bXguY29uZmlnLmRpc2FibGVTZWxlY3RvcikpIHtcbiAgICAgIGNsZWFuVXBFbGVtZW50KGVsdClcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBjb25zdCBub2RlRGF0YSA9IGdldEludGVybmFsRGF0YShlbHQpXG4gICAgaWYgKG5vZGVEYXRhLmluaXRIYXNoICE9PSBhdHRyaWJ1dGVIYXNoKGVsdCkpIHtcbiAgICAgIC8vIGNsZWFuIHVwIGFueSBwcmV2aW91c2x5IHByb2Nlc3NlZCBpbmZvXG4gICAgICBkZUluaXROb2RlKGVsdClcblxuICAgICAgbm9kZURhdGEuaW5pdEhhc2ggPSBhdHRyaWJ1dGVIYXNoKGVsdClcblxuICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6YmVmb3JlUHJvY2Vzc05vZGUnKVxuXG4gICAgICAvLyBAdHMtaWdub3JlIHZhbHVlIHdpbGwgYmUgdW5kZWZpbmVkIGZvciBub24taW5wdXQgZWxlbWVudHMsIHdoaWNoIGlzIGZpbmVcbiAgICAgIGlmIChlbHQudmFsdWUpIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBub2RlRGF0YS5sYXN0VmFsdWUgPSBlbHQudmFsdWVcbiAgICAgIH1cblxuICAgICAgY29uc3QgdHJpZ2dlclNwZWNzID0gZ2V0VHJpZ2dlclNwZWNzKGVsdClcbiAgICAgIGNvbnN0IGhhc0V4cGxpY2l0SHR0cEFjdGlvbiA9IHByb2Nlc3NWZXJicyhlbHQsIG5vZGVEYXRhLCB0cmlnZ2VyU3BlY3MpXG5cbiAgICAgIGlmICghaGFzRXhwbGljaXRIdHRwQWN0aW9uKSB7XG4gICAgICAgIGlmIChnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtYm9vc3QnKSA9PT0gJ3RydWUnKSB7XG4gICAgICAgICAgYm9vc3RFbGVtZW50KGVsdCwgbm9kZURhdGEsIHRyaWdnZXJTcGVjcylcbiAgICAgICAgfSBlbHNlIGlmIChoYXNBdHRyaWJ1dGUoZWx0LCAnaHgtdHJpZ2dlcicpKSB7XG4gICAgICAgICAgdHJpZ2dlclNwZWNzLmZvckVhY2goZnVuY3Rpb24odHJpZ2dlclNwZWMpIHtcbiAgICAgICAgICAgIC8vIEZvciBcIm5ha2VkXCIgdHJpZ2dlcnMsIGRvbid0IGRvIGFueXRoaW5nIGF0IGFsbFxuICAgICAgICAgICAgYWRkVHJpZ2dlckhhbmRsZXIoZWx0LCB0cmlnZ2VyU3BlYywgbm9kZURhdGEsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIEhhbmRsZSBzdWJtaXQgYnV0dG9ucy9pbnB1dHMgdGhhdCBoYXZlIHRoZSBmb3JtIGF0dHJpYnV0ZSBzZXRcbiAgICAgIC8vIHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9kb2NzL1dlYi9IVE1ML0VsZW1lbnQvYnV0dG9uXG4gICAgICBpZiAoZWx0LnRhZ05hbWUgPT09ICdGT1JNJyB8fCAoZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ3R5cGUnKSA9PT0gJ3N1Ym1pdCcgJiYgaGFzQXR0cmlidXRlKGVsdCwgJ2Zvcm0nKSkpIHtcbiAgICAgICAgaW5pdEJ1dHRvblRyYWNraW5nKGVsdClcbiAgICAgIH1cblxuICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6YWZ0ZXJQcm9jZXNzTm9kZScpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFByb2Nlc3NlcyBuZXcgY29udGVudCwgZW5hYmxpbmcgaHRteCBiZWhhdmlvci4gVGhpcyBjYW4gYmUgdXNlZnVsIGlmIHlvdSBoYXZlIGNvbnRlbnQgdGhhdCBpcyBhZGRlZCB0byB0aGUgRE9NIG91dHNpZGUgb2YgdGhlIG5vcm1hbCBodG14IHJlcXVlc3QgY3ljbGUgYnV0IHN0aWxsIHdhbnQgaHRteCBhdHRyaWJ1dGVzIHRvIHdvcmsuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI3Byb2Nlc3NcbiAgICpcbiAgICogQHBhcmFtIHtFbGVtZW50fHN0cmluZ30gZWx0IGVsZW1lbnQgdG8gcHJvY2Vzc1xuICAgKi9cbiAgZnVuY3Rpb24gcHJvY2Vzc05vZGUoZWx0KSB7XG4gICAgZWx0ID0gcmVzb2x2ZVRhcmdldChlbHQpXG4gICAgaWYgKGNsb3Nlc3QoZWx0LCBodG14LmNvbmZpZy5kaXNhYmxlU2VsZWN0b3IpKSB7XG4gICAgICBjbGVhblVwRWxlbWVudChlbHQpXG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgaW5pdE5vZGUoZWx0KVxuICAgIGZvckVhY2goZmluZEVsZW1lbnRzVG9Qcm9jZXNzKGVsdCksIGZ1bmN0aW9uKGNoaWxkKSB7IGluaXROb2RlKGNoaWxkKSB9KVxuICAgIGZvckVhY2goZmluZEh4T25XaWxkY2FyZEVsZW1lbnRzKGVsdCksIHByb2Nlc3NIeE9uV2lsZGNhcmQpXG4gIH1cblxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBFdmVudC9Mb2cgU3VwcG9ydFxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBmdW5jdGlvbiBrZWJhYkV2ZW50TmFtZShzdHIpIHtcbiAgICByZXR1cm4gc3RyLnJlcGxhY2UoLyhbYS16MC05XSkoW0EtWl0pL2csICckMS0kMicpLnRvTG93ZXJDYXNlKClcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lXG4gICAqIEBwYXJhbSB7YW55fSBkZXRhaWxcbiAgICogQHJldHVybnMge0N1c3RvbUV2ZW50fVxuICAgKi9cbiAgZnVuY3Rpb24gbWFrZUV2ZW50KGV2ZW50TmFtZSwgZGV0YWlsKSB7XG4gICAgbGV0IGV2dFxuICAgIGlmICh3aW5kb3cuQ3VzdG9tRXZlbnQgJiYgdHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgLy8gVE9ETzogYGNvbXBvc2VkOiB0cnVlYCBoZXJlIGlzIGEgaGFjayB0byBtYWtlIGdsb2JhbCBldmVudCBoYW5kbGVycyB3b3JrIHdpdGggZXZlbnRzIGluIHNoYWRvdyBET01cbiAgICAgIC8vIFRoaXMgYnJlYWtzIGV4cGVjdGVkIGVuY2Fwc3VsYXRpb24gYnV0IG5lZWRzIHRvIGJlIGhlcmUgdW50aWwgZGVjaWRlZCBvdGhlcndpc2UgYnkgY29yZSBkZXZzXG4gICAgICBldnQgPSBuZXcgQ3VzdG9tRXZlbnQoZXZlbnROYW1lLCB7IGJ1YmJsZXM6IHRydWUsIGNhbmNlbGFibGU6IHRydWUsIGNvbXBvc2VkOiB0cnVlLCBkZXRhaWwgfSlcbiAgICB9IGVsc2Uge1xuICAgICAgZXZ0ID0gZ2V0RG9jdW1lbnQoKS5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKVxuICAgICAgZXZ0LmluaXRDdXN0b21FdmVudChldmVudE5hbWUsIHRydWUsIHRydWUsIGRldGFpbClcbiAgICB9XG4gICAgcmV0dXJuIGV2dFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR8c3RyaW5nfSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZVxuICAgKiBAcGFyYW0ge2FueT19IGRldGFpbFxuICAgKi9cbiAgZnVuY3Rpb24gdHJpZ2dlckVycm9yRXZlbnQoZWx0LCBldmVudE5hbWUsIGRldGFpbCkge1xuICAgIHRyaWdnZXJFdmVudChlbHQsIGV2ZW50TmFtZSwgbWVyZ2VPYmplY3RzKHsgZXJyb3I6IGV2ZW50TmFtZSB9LCBkZXRhaWwpKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudE5hbWVcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBpZ25vcmVFdmVudEZvckxvZ2dpbmcoZXZlbnROYW1lKSB7XG4gICAgcmV0dXJuIGV2ZW50TmFtZSA9PT0gJ2h0bXg6YWZ0ZXJQcm9jZXNzTm9kZSdcbiAgfVxuXG4gIC8qKlxuICAgKiBgd2l0aEV4dGVuc2lvbnNgIGxvY2F0ZXMgYWxsIGFjdGl2ZSBleHRlbnNpb25zIGZvciBhIHByb3ZpZGVkIGVsZW1lbnQsIHRoZW5cbiAgICogZXhlY3V0ZXMgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uIHVzaW5nIGVhY2ggb2YgdGhlIGFjdGl2ZSBleHRlbnNpb25zLiAgSXQgc2hvdWxkXG4gICAqIGJlIGNhbGxlZCBpbnRlcm5hbGx5IGF0IGV2ZXJ5IGV4dGVuZGFibGUgZXhlY3V0aW9uIHBvaW50IGluIGh0bXguXG4gICAqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7KGV4dGVuc2lvbjpIdG14RXh0ZW5zaW9uKSA9PiB2b2lkfSB0b0RvXG4gICAqIEByZXR1cm5zIHZvaWRcbiAgICovXG4gIGZ1bmN0aW9uIHdpdGhFeHRlbnNpb25zKGVsdCwgdG9Ebykge1xuICAgIGZvckVhY2goZ2V0RXh0ZW5zaW9ucyhlbHQpLCBmdW5jdGlvbihleHRlbnNpb24pIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHRvRG8oZXh0ZW5zaW9uKVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBsb2dFcnJvcihlKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICBmdW5jdGlvbiBsb2dFcnJvcihtc2cpIHtcbiAgICBpZiAoY29uc29sZS5lcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcihtc2cpXG4gICAgfSBlbHNlIGlmIChjb25zb2xlLmxvZykge1xuICAgICAgY29uc29sZS5sb2coJ0VSUk9SOiAnLCBtc2cpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRyaWdnZXJzIGEgZ2l2ZW4gZXZlbnQgb24gYW4gZWxlbWVudFxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyN0cmlnZ2VyXG4gICAqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR8c3RyaW5nfSBlbHQgdGhlIGVsZW1lbnQgdG8gdHJpZ2dlciB0aGUgZXZlbnQgb25cbiAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZSB0aGUgbmFtZSBvZiB0aGUgZXZlbnQgdG8gdHJpZ2dlclxuICAgKiBAcGFyYW0ge2FueT19IGRldGFpbCBkZXRhaWxzIGZvciB0aGUgZXZlbnRcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiB0cmlnZ2VyRXZlbnQoZWx0LCBldmVudE5hbWUsIGRldGFpbCkge1xuICAgIGVsdCA9IHJlc29sdmVUYXJnZXQoZWx0KVxuICAgIGlmIChkZXRhaWwgPT0gbnVsbCkge1xuICAgICAgZGV0YWlsID0ge31cbiAgICB9XG4gICAgZGV0YWlsLmVsdCA9IGVsdFxuICAgIGNvbnN0IGV2ZW50ID0gbWFrZUV2ZW50KGV2ZW50TmFtZSwgZGV0YWlsKVxuICAgIGlmIChodG14LmxvZ2dlciAmJiAhaWdub3JlRXZlbnRGb3JMb2dnaW5nKGV2ZW50TmFtZSkpIHtcbiAgICAgIGh0bXgubG9nZ2VyKGVsdCwgZXZlbnROYW1lLCBkZXRhaWwpXG4gICAgfVxuICAgIGlmIChkZXRhaWwuZXJyb3IpIHtcbiAgICAgIGxvZ0Vycm9yKGRldGFpbC5lcnJvcilcbiAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OmVycm9yJywgeyBlcnJvckluZm86IGRldGFpbCB9KVxuICAgIH1cbiAgICBsZXQgZXZlbnRSZXN1bHQgPSBlbHQuZGlzcGF0Y2hFdmVudChldmVudClcbiAgICBjb25zdCBrZWJhYk5hbWUgPSBrZWJhYkV2ZW50TmFtZShldmVudE5hbWUpXG4gICAgaWYgKGV2ZW50UmVzdWx0ICYmIGtlYmFiTmFtZSAhPT0gZXZlbnROYW1lKSB7XG4gICAgICBjb25zdCBrZWJhYmVkRXZlbnQgPSBtYWtlRXZlbnQoa2ViYWJOYW1lLCBldmVudC5kZXRhaWwpXG4gICAgICBldmVudFJlc3VsdCA9IGV2ZW50UmVzdWx0ICYmIGVsdC5kaXNwYXRjaEV2ZW50KGtlYmFiZWRFdmVudClcbiAgICB9XG4gICAgd2l0aEV4dGVuc2lvbnMoYXNFbGVtZW50KGVsdCksIGZ1bmN0aW9uKGV4dGVuc2lvbikge1xuICAgICAgZXZlbnRSZXN1bHQgPSBldmVudFJlc3VsdCAmJiAoZXh0ZW5zaW9uLm9uRXZlbnQoZXZlbnROYW1lLCBldmVudCkgIT09IGZhbHNlICYmICFldmVudC5kZWZhdWx0UHJldmVudGVkKVxuICAgIH0pXG4gICAgcmV0dXJuIGV2ZW50UmVzdWx0XG4gIH1cblxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBIaXN0b3J5IFN1cHBvcnRcbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgbGV0IGN1cnJlbnRQYXRoRm9ySGlzdG9yeSA9IGxvY2F0aW9uLnBhdGhuYW1lICsgbG9jYXRpb24uc2VhcmNoXG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtFbGVtZW50fVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0SGlzdG9yeUVsZW1lbnQoKSB7XG4gICAgY29uc3QgaGlzdG9yeUVsdCA9IGdldERvY3VtZW50KCkucXVlcnlTZWxlY3RvcignW2h4LWhpc3RvcnktZWx0XSxbZGF0YS1oeC1oaXN0b3J5LWVsdF0nKVxuICAgIHJldHVybiBoaXN0b3J5RWx0IHx8IGdldERvY3VtZW50KCkuYm9keVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1cmxcbiAgICogQHBhcmFtIHtFbGVtZW50fSByb290RWx0XG4gICAqL1xuICBmdW5jdGlvbiBzYXZlVG9IaXN0b3J5Q2FjaGUodXJsLCByb290RWx0KSB7XG4gICAgaWYgKCFjYW5BY2Nlc3NMb2NhbFN0b3JhZ2UoKSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gZ2V0IHN0YXRlIHRvIHNhdmVcbiAgICBjb25zdCBpbm5lckhUTUwgPSBjbGVhbklubmVySHRtbEZvckhpc3Rvcnkocm9vdEVsdClcbiAgICBjb25zdCB0aXRsZSA9IGdldERvY3VtZW50KCkudGl0bGVcbiAgICBjb25zdCBzY3JvbGwgPSB3aW5kb3cuc2Nyb2xsWVxuXG4gICAgaWYgKGh0bXguY29uZmlnLmhpc3RvcnlDYWNoZVNpemUgPD0gMCkge1xuICAgICAgLy8gbWFrZSBzdXJlIHRoYXQgYW4gZXZlbnR1YWxseSBhbHJlYWR5IGV4aXN0aW5nIGNhY2hlIGlzIHB1cmdlZFxuICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oJ2h0bXgtaGlzdG9yeS1jYWNoZScpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB1cmwgPSBub3JtYWxpemVQYXRoKHVybClcblxuICAgIGNvbnN0IGhpc3RvcnlDYWNoZSA9IHBhcnNlSlNPTihsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnaHRteC1oaXN0b3J5LWNhY2hlJykpIHx8IFtdXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBoaXN0b3J5Q2FjaGUubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChoaXN0b3J5Q2FjaGVbaV0udXJsID09PSB1cmwpIHtcbiAgICAgICAgaGlzdG9yeUNhY2hlLnNwbGljZShpLCAxKVxuICAgICAgICBicmVha1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBAdHlwZSBIdG14SGlzdG9yeUl0ZW0gKi9cbiAgICBjb25zdCBuZXdIaXN0b3J5SXRlbSA9IHsgdXJsLCBjb250ZW50OiBpbm5lckhUTUwsIHRpdGxlLCBzY3JvbGwgfVxuXG4gICAgdHJpZ2dlckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6aGlzdG9yeUl0ZW1DcmVhdGVkJywgeyBpdGVtOiBuZXdIaXN0b3J5SXRlbSwgY2FjaGU6IGhpc3RvcnlDYWNoZSB9KVxuXG4gICAgaGlzdG9yeUNhY2hlLnB1c2gobmV3SGlzdG9yeUl0ZW0pXG4gICAgd2hpbGUgKGhpc3RvcnlDYWNoZS5sZW5ndGggPiBodG14LmNvbmZpZy5oaXN0b3J5Q2FjaGVTaXplKSB7XG4gICAgICBoaXN0b3J5Q2FjaGUuc2hpZnQoKVxuICAgIH1cblxuICAgIC8vIGtlZXAgdHJ5aW5nIHRvIHNhdmUgdGhlIGNhY2hlIHVudGlsIGl0IHN1Y2NlZWRzIG9yIGlzIGVtcHR5XG4gICAgd2hpbGUgKGhpc3RvcnlDYWNoZS5sZW5ndGggPiAwKSB7XG4gICAgICB0cnkge1xuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnaHRteC1oaXN0b3J5LWNhY2hlJywgSlNPTi5zdHJpbmdpZnkoaGlzdG9yeUNhY2hlKSlcbiAgICAgICAgYnJlYWtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpoaXN0b3J5Q2FjaGVFcnJvcicsIHsgY2F1c2U6IGUsIGNhY2hlOiBoaXN0b3J5Q2FjaGUgfSlcbiAgICAgICAgaGlzdG9yeUNhY2hlLnNoaWZ0KCkgLy8gc2hyaW5rIHRoZSBjYWNoZSBhbmQgcmV0cnlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHR5cGVkZWYge09iamVjdH0gSHRteEhpc3RvcnlJdGVtXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB1cmxcbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IGNvbnRlbnRcbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IHRpdGxlXG4gICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBzY3JvbGxcbiAgICovXG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1cmxcbiAgICogQHJldHVybnMge0h0bXhIaXN0b3J5SXRlbXxudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0Q2FjaGVkSGlzdG9yeSh1cmwpIHtcbiAgICBpZiAoIWNhbkFjY2Vzc0xvY2FsU3RvcmFnZSgpKSB7XG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cblxuICAgIHVybCA9IG5vcm1hbGl6ZVBhdGgodXJsKVxuXG4gICAgY29uc3QgaGlzdG9yeUNhY2hlID0gcGFyc2VKU09OKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdodG14LWhpc3RvcnktY2FjaGUnKSkgfHwgW11cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGhpc3RvcnlDYWNoZS5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGhpc3RvcnlDYWNoZVtpXS51cmwgPT09IHVybCkge1xuICAgICAgICByZXR1cm4gaGlzdG9yeUNhY2hlW2ldXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGZ1bmN0aW9uIGNsZWFuSW5uZXJIdG1sRm9ySGlzdG9yeShlbHQpIHtcbiAgICBjb25zdCBjbGFzc05hbWUgPSBodG14LmNvbmZpZy5yZXF1ZXN0Q2xhc3NcbiAgICBjb25zdCBjbG9uZSA9IC8qKiBAdHlwZSBFbGVtZW50ICovIChlbHQuY2xvbmVOb2RlKHRydWUpKVxuICAgIGZvckVhY2goZmluZEFsbChjbG9uZSwgJy4nICsgY2xhc3NOYW1lKSwgZnVuY3Rpb24oY2hpbGQpIHtcbiAgICAgIHJlbW92ZUNsYXNzRnJvbUVsZW1lbnQoY2hpbGQsIGNsYXNzTmFtZSlcbiAgICB9KVxuICAgIC8vIHJlbW92ZSB0aGUgZGlzYWJsZWQgYXR0cmlidXRlIGZvciBhbnkgZWxlbWVudCBkaXNhYmxlZCBkdWUgdG8gYW4gaHRteCByZXF1ZXN0XG4gICAgZm9yRWFjaChmaW5kQWxsKGNsb25lLCAnW2RhdGEtZGlzYWJsZWQtYnktaHRteF0nKSwgZnVuY3Rpb24oY2hpbGQpIHtcbiAgICAgIGNoaWxkLnJlbW92ZUF0dHJpYnV0ZSgnZGlzYWJsZWQnKVxuICAgIH0pXG4gICAgcmV0dXJuIGNsb25lLmlubmVySFRNTFxuICB9XG5cbiAgZnVuY3Rpb24gc2F2ZUN1cnJlbnRQYWdlVG9IaXN0b3J5KCkge1xuICAgIGNvbnN0IGVsdCA9IGdldEhpc3RvcnlFbGVtZW50KClcbiAgICBjb25zdCBwYXRoID0gY3VycmVudFBhdGhGb3JIaXN0b3J5IHx8IGxvY2F0aW9uLnBhdGhuYW1lICsgbG9jYXRpb24uc2VhcmNoXG5cbiAgICAvLyBBbGxvdyBoaXN0b3J5IHNuYXBzaG90IGZlYXR1cmUgdG8gYmUgZGlzYWJsZWQgd2hlcmUgaHgtaGlzdG9yeT1cImZhbHNlXCJcbiAgICAvLyBpcyBwcmVzZW50ICphbnl3aGVyZSogaW4gdGhlIGN1cnJlbnQgZG9jdW1lbnQgd2UncmUgYWJvdXQgdG8gc2F2ZSxcbiAgICAvLyBzbyB3ZSBjYW4gcHJldmVudCBwcml2aWxlZ2VkIGRhdGEgZW50ZXJpbmcgdGhlIGNhY2hlLlxuICAgIC8vIFRoZSBwYWdlIHdpbGwgc3RpbGwgYmUgcmVhY2hhYmxlIGFzIGEgaGlzdG9yeSBlbnRyeSwgYnV0IGh0bXggd2lsbCBmZXRjaCBpdFxuICAgIC8vIGxpdmUgZnJvbSB0aGUgc2VydmVyIG9ucG9wc3RhdGUgcmF0aGVyIHRoYW4gbG9vayBpbiB0aGUgbG9jYWxTdG9yYWdlIGNhY2hlXG4gICAgbGV0IGRpc2FibGVIaXN0b3J5Q2FjaGVcbiAgICB0cnkge1xuICAgICAgZGlzYWJsZUhpc3RvcnlDYWNoZSA9IGdldERvY3VtZW50KCkucXVlcnlTZWxlY3RvcignW2h4LWhpc3Rvcnk9XCJmYWxzZVwiIGldLFtkYXRhLWh4LWhpc3Rvcnk9XCJmYWxzZVwiIGldJylcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgLy8gSUUxMTogaW5zZW5zaXRpdmUgbW9kaWZpZXIgbm90IHN1cHBvcnRlZCBzbyBmYWxsYmFjayB0byBjYXNlIHNlbnNpdGl2ZSBzZWxlY3RvclxuICAgICAgZGlzYWJsZUhpc3RvcnlDYWNoZSA9IGdldERvY3VtZW50KCkucXVlcnlTZWxlY3RvcignW2h4LWhpc3Rvcnk9XCJmYWxzZVwiXSxbZGF0YS1oeC1oaXN0b3J5PVwiZmFsc2VcIl0nKVxuICAgIH1cbiAgICBpZiAoIWRpc2FibGVIaXN0b3J5Q2FjaGUpIHtcbiAgICAgIHRyaWdnZXJFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14OmJlZm9yZUhpc3RvcnlTYXZlJywgeyBwYXRoLCBoaXN0b3J5RWx0OiBlbHQgfSlcbiAgICAgIHNhdmVUb0hpc3RvcnlDYWNoZShwYXRoLCBlbHQpXG4gICAgfVxuXG4gICAgaWYgKGh0bXguY29uZmlnLmhpc3RvcnlFbmFibGVkKSBoaXN0b3J5LnJlcGxhY2VTdGF0ZSh7IGh0bXg6IHRydWUgfSwgZ2V0RG9jdW1lbnQoKS50aXRsZSwgd2luZG93LmxvY2F0aW9uLmhyZWYpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAgICovXG4gIGZ1bmN0aW9uIHB1c2hVcmxJbnRvSGlzdG9yeShwYXRoKSB7XG4gIC8vIHJlbW92ZSB0aGUgY2FjaGUgYnVzdGVyIHBhcmFtZXRlciwgaWYgYW55XG4gICAgaWYgKGh0bXguY29uZmlnLmdldENhY2hlQnVzdGVyUGFyYW0pIHtcbiAgICAgIHBhdGggPSBwYXRoLnJlcGxhY2UoL29yZ1xcLmh0bXhcXC5jYWNoZS1idXN0ZXI9W14mXSomPy8sICcnKVxuICAgICAgaWYgKGVuZHNXaXRoKHBhdGgsICcmJykgfHwgZW5kc1dpdGgocGF0aCwgJz8nKSkge1xuICAgICAgICBwYXRoID0gcGF0aC5zbGljZSgwLCAtMSlcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGh0bXguY29uZmlnLmhpc3RvcnlFbmFibGVkKSB7XG4gICAgICBoaXN0b3J5LnB1c2hTdGF0ZSh7IGh0bXg6IHRydWUgfSwgJycsIHBhdGgpXG4gICAgfVxuICAgIGN1cnJlbnRQYXRoRm9ySGlzdG9yeSA9IHBhdGhcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICAgKi9cbiAgZnVuY3Rpb24gcmVwbGFjZVVybEluSGlzdG9yeShwYXRoKSB7XG4gICAgaWYgKGh0bXguY29uZmlnLmhpc3RvcnlFbmFibGVkKSBoaXN0b3J5LnJlcGxhY2VTdGF0ZSh7IGh0bXg6IHRydWUgfSwgJycsIHBhdGgpXG4gICAgY3VycmVudFBhdGhGb3JIaXN0b3J5ID0gcGF0aFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7SHRteFNldHRsZVRhc2tbXX0gdGFza3NcbiAgICovXG4gIGZ1bmN0aW9uIHNldHRsZUltbWVkaWF0ZWx5KHRhc2tzKSB7XG4gICAgZm9yRWFjaCh0YXNrcywgZnVuY3Rpb24odGFzaykge1xuICAgICAgdGFzay5jYWxsKHVuZGVmaW5lZClcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gICAqL1xuICBmdW5jdGlvbiBsb2FkSGlzdG9yeUZyb21TZXJ2ZXIocGF0aCkge1xuICAgIGNvbnN0IHJlcXVlc3QgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKVxuICAgIGNvbnN0IGRldGFpbHMgPSB7IHBhdGgsIHhocjogcmVxdWVzdCB9XG4gICAgdHJpZ2dlckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6aGlzdG9yeUNhY2hlTWlzcycsIGRldGFpbHMpXG4gICAgcmVxdWVzdC5vcGVuKCdHRVQnLCBwYXRoLCB0cnVlKVxuICAgIHJlcXVlc3Quc2V0UmVxdWVzdEhlYWRlcignSFgtUmVxdWVzdCcsICd0cnVlJylcbiAgICByZXF1ZXN0LnNldFJlcXVlc3RIZWFkZXIoJ0hYLUhpc3RvcnktUmVzdG9yZS1SZXF1ZXN0JywgJ3RydWUnKVxuICAgIHJlcXVlc3Quc2V0UmVxdWVzdEhlYWRlcignSFgtQ3VycmVudC1VUkwnLCBnZXREb2N1bWVudCgpLmxvY2F0aW9uLmhyZWYpXG4gICAgcmVxdWVzdC5vbmxvYWQgPSBmdW5jdGlvbigpIHtcbiAgICAgIGlmICh0aGlzLnN0YXR1cyA+PSAyMDAgJiYgdGhpcy5zdGF0dXMgPCA0MDApIHtcbiAgICAgICAgdHJpZ2dlckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6aGlzdG9yeUNhY2hlTWlzc0xvYWQnLCBkZXRhaWxzKVxuICAgICAgICBjb25zdCBmcmFnbWVudCA9IG1ha2VGcmFnbWVudCh0aGlzLnJlc3BvbnNlKVxuICAgICAgICAvKiogQHR5cGUgUGFyZW50Tm9kZSAqL1xuICAgICAgICBjb25zdCBjb250ZW50ID0gZnJhZ21lbnQucXVlcnlTZWxlY3RvcignW2h4LWhpc3RvcnktZWx0XSxbZGF0YS1oeC1oaXN0b3J5LWVsdF0nKSB8fCBmcmFnbWVudFxuICAgICAgICBjb25zdCBoaXN0b3J5RWxlbWVudCA9IGdldEhpc3RvcnlFbGVtZW50KClcbiAgICAgICAgY29uc3Qgc2V0dGxlSW5mbyA9IG1ha2VTZXR0bGVJbmZvKGhpc3RvcnlFbGVtZW50KVxuICAgICAgICBoYW5kbGVUaXRsZShmcmFnbWVudC50aXRsZSlcblxuICAgICAgICBzd2FwSW5uZXJIVE1MKGhpc3RvcnlFbGVtZW50LCBjb250ZW50LCBzZXR0bGVJbmZvKVxuICAgICAgICBzZXR0bGVJbW1lZGlhdGVseShzZXR0bGVJbmZvLnRhc2tzKVxuICAgICAgICBjdXJyZW50UGF0aEZvckhpc3RvcnkgPSBwYXRoXG4gICAgICAgIHRyaWdnZXJFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14Omhpc3RvcnlSZXN0b3JlJywgeyBwYXRoLCBjYWNoZU1pc3M6IHRydWUsIHNlcnZlclJlc3BvbnNlOiB0aGlzLnJlc3BvbnNlIH0pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0cmlnZ2VyRXJyb3JFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14Omhpc3RvcnlDYWNoZU1pc3NMb2FkRXJyb3InLCBkZXRhaWxzKVxuICAgICAgfVxuICAgIH1cbiAgICByZXF1ZXN0LnNlbmQoKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbcGF0aF1cbiAgICovXG4gIGZ1bmN0aW9uIHJlc3RvcmVIaXN0b3J5KHBhdGgpIHtcbiAgICBzYXZlQ3VycmVudFBhZ2VUb0hpc3RvcnkoKVxuICAgIHBhdGggPSBwYXRoIHx8IGxvY2F0aW9uLnBhdGhuYW1lICsgbG9jYXRpb24uc2VhcmNoXG4gICAgY29uc3QgY2FjaGVkID0gZ2V0Q2FjaGVkSGlzdG9yeShwYXRoKVxuICAgIGlmIChjYWNoZWQpIHtcbiAgICAgIGNvbnN0IGZyYWdtZW50ID0gbWFrZUZyYWdtZW50KGNhY2hlZC5jb250ZW50KVxuICAgICAgY29uc3QgaGlzdG9yeUVsZW1lbnQgPSBnZXRIaXN0b3J5RWxlbWVudCgpXG4gICAgICBjb25zdCBzZXR0bGVJbmZvID0gbWFrZVNldHRsZUluZm8oaGlzdG9yeUVsZW1lbnQpXG4gICAgICBoYW5kbGVUaXRsZShmcmFnbWVudC50aXRsZSlcbiAgICAgIHN3YXBJbm5lckhUTUwoaGlzdG9yeUVsZW1lbnQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgc2V0dGxlSW1tZWRpYXRlbHkoc2V0dGxlSW5mby50YXNrcylcbiAgICAgIGdldFdpbmRvdygpLnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgIHdpbmRvdy5zY3JvbGxUbygwLCBjYWNoZWQuc2Nyb2xsKVxuICAgICAgfSwgMCkgLy8gbmV4dCAndGljaycsIHNvIGJyb3dzZXIgaGFzIHRpbWUgdG8gcmVuZGVyIGxheW91dFxuICAgICAgY3VycmVudFBhdGhGb3JIaXN0b3J5ID0gcGF0aFxuICAgICAgdHJpZ2dlckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6aGlzdG9yeVJlc3RvcmUnLCB7IHBhdGgsIGl0ZW06IGNhY2hlZCB9KVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoaHRteC5jb25maWcucmVmcmVzaE9uSGlzdG9yeU1pc3MpIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZTogb3B0aW9uYWwgcGFyYW1ldGVyIGluIHJlbG9hZCgpIGZ1bmN0aW9uIHRocm93cyBlcnJvclxuICAgICAgICAvLyBub2luc3BlY3Rpb24gSlNVbnJlc29sdmVkUmVmZXJlbmNlXG4gICAgICAgIHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQodHJ1ZSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxvYWRIaXN0b3J5RnJvbVNlcnZlcihwYXRoKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJucyB7RWxlbWVudFtdfVxuICAgKi9cbiAgZnVuY3Rpb24gYWRkUmVxdWVzdEluZGljYXRvckNsYXNzZXMoZWx0KSB7XG4gICAgbGV0IGluZGljYXRvcnMgPSAvKiogQHR5cGUgRWxlbWVudFtdICovIChmaW5kQXR0cmlidXRlVGFyZ2V0cyhlbHQsICdoeC1pbmRpY2F0b3InKSlcbiAgICBpZiAoaW5kaWNhdG9ycyA9PSBudWxsKSB7XG4gICAgICBpbmRpY2F0b3JzID0gW2VsdF1cbiAgICB9XG4gICAgZm9yRWFjaChpbmRpY2F0b3JzLCBmdW5jdGlvbihpYykge1xuICAgICAgY29uc3QgaW50ZXJuYWxEYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGljKVxuICAgICAgaW50ZXJuYWxEYXRhLnJlcXVlc3RDb3VudCA9IChpbnRlcm5hbERhdGEucmVxdWVzdENvdW50IHx8IDApICsgMVxuICAgICAgaWMuY2xhc3NMaXN0LmFkZC5jYWxsKGljLmNsYXNzTGlzdCwgaHRteC5jb25maWcucmVxdWVzdENsYXNzKVxuICAgIH0pXG4gICAgcmV0dXJuIGluZGljYXRvcnNcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJucyB7RWxlbWVudFtdfVxuICAgKi9cbiAgZnVuY3Rpb24gZGlzYWJsZUVsZW1lbnRzKGVsdCkge1xuICAgIGxldCBkaXNhYmxlZEVsdHMgPSAvKiogQHR5cGUgRWxlbWVudFtdICovIChmaW5kQXR0cmlidXRlVGFyZ2V0cyhlbHQsICdoeC1kaXNhYmxlZC1lbHQnKSlcbiAgICBpZiAoZGlzYWJsZWRFbHRzID09IG51bGwpIHtcbiAgICAgIGRpc2FibGVkRWx0cyA9IFtdXG4gICAgfVxuICAgIGZvckVhY2goZGlzYWJsZWRFbHRzLCBmdW5jdGlvbihkaXNhYmxlZEVsZW1lbnQpIHtcbiAgICAgIGNvbnN0IGludGVybmFsRGF0YSA9IGdldEludGVybmFsRGF0YShkaXNhYmxlZEVsZW1lbnQpXG4gICAgICBpbnRlcm5hbERhdGEucmVxdWVzdENvdW50ID0gKGludGVybmFsRGF0YS5yZXF1ZXN0Q291bnQgfHwgMCkgKyAxXG4gICAgICBkaXNhYmxlZEVsZW1lbnQuc2V0QXR0cmlidXRlKCdkaXNhYmxlZCcsICcnKVxuICAgICAgZGlzYWJsZWRFbGVtZW50LnNldEF0dHJpYnV0ZSgnZGF0YS1kaXNhYmxlZC1ieS1odG14JywgJycpXG4gICAgfSlcbiAgICByZXR1cm4gZGlzYWJsZWRFbHRzXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50W119IGluZGljYXRvcnNcbiAgICogQHBhcmFtIHtFbGVtZW50W119IGRpc2FibGVkXG4gICAqL1xuICBmdW5jdGlvbiByZW1vdmVSZXF1ZXN0SW5kaWNhdG9ycyhpbmRpY2F0b3JzLCBkaXNhYmxlZCkge1xuICAgIGZvckVhY2goaW5kaWNhdG9ycywgZnVuY3Rpb24oaWMpIHtcbiAgICAgIGNvbnN0IGludGVybmFsRGF0YSA9IGdldEludGVybmFsRGF0YShpYylcbiAgICAgIGludGVybmFsRGF0YS5yZXF1ZXN0Q291bnQgPSAoaW50ZXJuYWxEYXRhLnJlcXVlc3RDb3VudCB8fCAwKSAtIDFcbiAgICAgIGlmIChpbnRlcm5hbERhdGEucmVxdWVzdENvdW50ID09PSAwKSB7XG4gICAgICAgIGljLmNsYXNzTGlzdC5yZW1vdmUuY2FsbChpYy5jbGFzc0xpc3QsIGh0bXguY29uZmlnLnJlcXVlc3RDbGFzcylcbiAgICAgIH1cbiAgICB9KVxuICAgIGZvckVhY2goZGlzYWJsZWQsIGZ1bmN0aW9uKGRpc2FibGVkRWxlbWVudCkge1xuICAgICAgY29uc3QgaW50ZXJuYWxEYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGRpc2FibGVkRWxlbWVudClcbiAgICAgIGludGVybmFsRGF0YS5yZXF1ZXN0Q291bnQgPSAoaW50ZXJuYWxEYXRhLnJlcXVlc3RDb3VudCB8fCAwKSAtIDFcbiAgICAgIGlmIChpbnRlcm5hbERhdGEucmVxdWVzdENvdW50ID09PSAwKSB7XG4gICAgICAgIGRpc2FibGVkRWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ2Rpc2FibGVkJylcbiAgICAgICAgZGlzYWJsZWRFbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgnZGF0YS1kaXNhYmxlZC1ieS1odG14JylcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gSW5wdXQgVmFsdWUgUHJvY2Vzc2luZ1xuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnRbXX0gcHJvY2Vzc2VkXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gaGF2ZVNlZW5Ob2RlKHByb2Nlc3NlZCwgZWx0KSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwcm9jZXNzZWQubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IG5vZGUgPSBwcm9jZXNzZWRbaV1cbiAgICAgIGlmIChub2RlLmlzU2FtZU5vZGUoZWx0KSkge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnRcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIHNob3VsZEluY2x1ZGUoZWxlbWVudCkge1xuICAgIC8vIENhc3QgdG8gdHJpY2sgdHNjLCB1bmRlZmluZWQgdmFsdWVzIHdpbGwgd29yayBmaW5lIGhlcmVcbiAgICBjb25zdCBlbHQgPSAvKiogQHR5cGUge0hUTUxJbnB1dEVsZW1lbnR9ICovIChlbGVtZW50KVxuICAgIGlmIChlbHQubmFtZSA9PT0gJycgfHwgZWx0Lm5hbWUgPT0gbnVsbCB8fCBlbHQuZGlzYWJsZWQgfHwgY2xvc2VzdChlbHQsICdmaWVsZHNldFtkaXNhYmxlZF0nKSkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICAgIC8vIGlnbm9yZSBcInN1Ym1pdHRlclwiIHR5cGVzIChzZWUgalF1ZXJ5IHNyYy9zZXJpYWxpemUuanMpXG4gICAgaWYgKGVsdC50eXBlID09PSAnYnV0dG9uJyB8fCBlbHQudHlwZSA9PT0gJ3N1Ym1pdCcgfHwgZWx0LnRhZ05hbWUgPT09ICdpbWFnZScgfHwgZWx0LnRhZ05hbWUgPT09ICdyZXNldCcgfHwgZWx0LnRhZ05hbWUgPT09ICdmaWxlJykge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICAgIGlmIChlbHQudHlwZSA9PT0gJ2NoZWNrYm94JyB8fCBlbHQudHlwZSA9PT0gJ3JhZGlvJykge1xuICAgICAgcmV0dXJuIGVsdC5jaGVja2VkXG4gICAgfVxuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICAvKiogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICogQHBhcmFtIHtzdHJpbmd8QXJyYXl8Rm9ybURhdGFFbnRyeVZhbHVlfSB2YWx1ZVxuICAgKiBAcGFyYW0ge0Zvcm1EYXRhfSBmb3JtRGF0YSAqL1xuICBmdW5jdGlvbiBhZGRWYWx1ZVRvRm9ybURhdGEobmFtZSwgdmFsdWUsIGZvcm1EYXRhKSB7XG4gICAgaWYgKG5hbWUgIT0gbnVsbCAmJiB2YWx1ZSAhPSBudWxsKSB7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgdmFsdWUuZm9yRWFjaChmdW5jdGlvbih2KSB7IGZvcm1EYXRhLmFwcGVuZChuYW1lLCB2KSB9KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZm9ybURhdGEuYXBwZW5kKG5hbWUsIHZhbHVlKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgKiBAcGFyYW0ge3N0cmluZ3xBcnJheX0gdmFsdWVcbiAgICogQHBhcmFtIHtGb3JtRGF0YX0gZm9ybURhdGEgKi9cbiAgZnVuY3Rpb24gcmVtb3ZlVmFsdWVGcm9tRm9ybURhdGEobmFtZSwgdmFsdWUsIGZvcm1EYXRhKSB7XG4gICAgaWYgKG5hbWUgIT0gbnVsbCAmJiB2YWx1ZSAhPSBudWxsKSB7XG4gICAgICBsZXQgdmFsdWVzID0gZm9ybURhdGEuZ2V0QWxsKG5hbWUpXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgdmFsdWVzID0gdmFsdWVzLmZpbHRlcih2ID0+IHZhbHVlLmluZGV4T2YodikgPCAwKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFsdWVzID0gdmFsdWVzLmZpbHRlcih2ID0+IHYgIT09IHZhbHVlKVxuICAgICAgfVxuICAgICAgZm9ybURhdGEuZGVsZXRlKG5hbWUpXG4gICAgICBmb3JFYWNoKHZhbHVlcywgdiA9PiBmb3JtRGF0YS5hcHBlbmQobmFtZSwgdikpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudFtdfSBwcm9jZXNzZWRcbiAgICogQHBhcmFtIHtGb3JtRGF0YX0gZm9ybURhdGFcbiAgICogQHBhcmFtIHtIdG14RWxlbWVudFZhbGlkYXRpb25FcnJvcltdfSBlcnJvcnNcbiAgICogQHBhcmFtIHtFbGVtZW50fEhUTUxJbnB1dEVsZW1lbnR8SFRNTFNlbGVjdEVsZW1lbnR8SFRNTEZvcm1FbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtib29sZWFufSB2YWxpZGF0ZVxuICAgKi9cbiAgZnVuY3Rpb24gcHJvY2Vzc0lucHV0VmFsdWUocHJvY2Vzc2VkLCBmb3JtRGF0YSwgZXJyb3JzLCBlbHQsIHZhbGlkYXRlKSB7XG4gICAgaWYgKGVsdCA9PSBudWxsIHx8IGhhdmVTZWVuTm9kZShwcm9jZXNzZWQsIGVsdCkpIHtcbiAgICAgIHJldHVyblxuICAgIH0gZWxzZSB7XG4gICAgICBwcm9jZXNzZWQucHVzaChlbHQpXG4gICAgfVxuICAgIGlmIChzaG91bGRJbmNsdWRlKGVsdCkpIHtcbiAgICAgIGNvbnN0IG5hbWUgPSBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnbmFtZScpXG4gICAgICAvLyBAdHMtaWdub3JlIHZhbHVlIHdpbGwgYmUgdW5kZWZpbmVkIGZvciBub24taW5wdXQgZWxlbWVudHMsIHdoaWNoIGlzIGZpbmVcbiAgICAgIGxldCB2YWx1ZSA9IGVsdC52YWx1ZVxuICAgICAgaWYgKGVsdCBpbnN0YW5jZW9mIEhUTUxTZWxlY3RFbGVtZW50ICYmIGVsdC5tdWx0aXBsZSkge1xuICAgICAgICB2YWx1ZSA9IHRvQXJyYXkoZWx0LnF1ZXJ5U2VsZWN0b3JBbGwoJ29wdGlvbjpjaGVja2VkJykpLm1hcChmdW5jdGlvbihlKSB7IHJldHVybiAoLyoqIEB0eXBlIEhUTUxPcHRpb25FbGVtZW50ICovKGUpKS52YWx1ZSB9KVxuICAgICAgfVxuICAgICAgLy8gaW5jbHVkZSBmaWxlIGlucHV0c1xuICAgICAgaWYgKGVsdCBpbnN0YW5jZW9mIEhUTUxJbnB1dEVsZW1lbnQgJiYgZWx0LmZpbGVzKSB7XG4gICAgICAgIHZhbHVlID0gdG9BcnJheShlbHQuZmlsZXMpXG4gICAgICB9XG4gICAgICBhZGRWYWx1ZVRvRm9ybURhdGEobmFtZSwgdmFsdWUsIGZvcm1EYXRhKVxuICAgICAgaWYgKHZhbGlkYXRlKSB7XG4gICAgICAgIHZhbGlkYXRlRWxlbWVudChlbHQsIGVycm9ycylcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGVsdCBpbnN0YW5jZW9mIEhUTUxGb3JtRWxlbWVudCkge1xuICAgICAgZm9yRWFjaChlbHQuZWxlbWVudHMsIGZ1bmN0aW9uKGlucHV0KSB7XG4gICAgICAgIGlmIChwcm9jZXNzZWQuaW5kZXhPZihpbnB1dCkgPj0gMCkge1xuICAgICAgICAgIC8vIFRoZSBpbnB1dCBoYXMgYWxyZWFkeSBiZWVuIHByb2Nlc3NlZCBhbmQgYWRkZWQgdG8gdGhlIHZhbHVlcywgYnV0IHRoZSBGb3JtRGF0YSB0aGF0IHdpbGwgYmVcbiAgICAgICAgICAvLyAgY29uc3RydWN0ZWQgcmlnaHQgYWZ0ZXIgb24gdGhlIGZvcm0sIHdpbGwgaW5jbHVkZSBpdCBvbmNlIGFnYWluLiBTbyByZW1vdmUgdGhhdCBpbnB1dCdzIHZhbHVlXG4gICAgICAgICAgLy8gIG5vdyB0byBhdm9pZCBkdXBsaWNhdGVzXG4gICAgICAgICAgcmVtb3ZlVmFsdWVGcm9tRm9ybURhdGEoaW5wdXQubmFtZSwgaW5wdXQudmFsdWUsIGZvcm1EYXRhKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHByb2Nlc3NlZC5wdXNoKGlucHV0KVxuICAgICAgICB9XG4gICAgICAgIGlmICh2YWxpZGF0ZSkge1xuICAgICAgICAgIHZhbGlkYXRlRWxlbWVudChpbnB1dCwgZXJyb3JzKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgICAgbmV3IEZvcm1EYXRhKGVsdCkuZm9yRWFjaChmdW5jdGlvbih2YWx1ZSwgbmFtZSkge1xuICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBGaWxlICYmIHZhbHVlLm5hbWUgPT09ICcnKSB7XG4gICAgICAgICAgcmV0dXJuIC8vIGlnbm9yZSBuby1uYW1lIGZpbGVzXG4gICAgICAgIH1cbiAgICAgICAgYWRkVmFsdWVUb0Zvcm1EYXRhKG5hbWUsIHZhbHVlLCBmb3JtRGF0YSlcbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7SHRteEVsZW1lbnRWYWxpZGF0aW9uRXJyb3JbXX0gZXJyb3JzXG4gICAqL1xuICBmdW5jdGlvbiB2YWxpZGF0ZUVsZW1lbnQoZWx0LCBlcnJvcnMpIHtcbiAgICBjb25zdCBlbGVtZW50ID0gLyoqIEB0eXBlIHtIVE1MRWxlbWVudCAmIEVsZW1lbnRJbnRlcm5hbHN9ICovIChlbHQpXG4gICAgaWYgKGVsZW1lbnQud2lsbFZhbGlkYXRlKSB7XG4gICAgICB0cmlnZ2VyRXZlbnQoZWxlbWVudCwgJ2h0bXg6dmFsaWRhdGlvbjp2YWxpZGF0ZScpXG4gICAgICBpZiAoIWVsZW1lbnQuY2hlY2tWYWxpZGl0eSgpKSB7XG4gICAgICAgIGVycm9ycy5wdXNoKHsgZWx0OiBlbGVtZW50LCBtZXNzYWdlOiBlbGVtZW50LnZhbGlkYXRpb25NZXNzYWdlLCB2YWxpZGl0eTogZWxlbWVudC52YWxpZGl0eSB9KVxuICAgICAgICB0cmlnZ2VyRXZlbnQoZWxlbWVudCwgJ2h0bXg6dmFsaWRhdGlvbjpmYWlsZWQnLCB7IG1lc3NhZ2U6IGVsZW1lbnQudmFsaWRhdGlvbk1lc3NhZ2UsIHZhbGlkaXR5OiBlbGVtZW50LnZhbGlkaXR5IH0pXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE92ZXJyaWRlIHZhbHVlcyBpbiB0aGUgb25lIEZvcm1EYXRhIHdpdGggdGhvc2UgZnJvbSBhbm90aGVyLlxuICAgKiBAcGFyYW0ge0Zvcm1EYXRhfSByZWNlaXZlciB0aGUgZm9ybWRhdGEgdGhhdCB3aWxsIGJlIG11dGF0ZWRcbiAgICogQHBhcmFtIHtGb3JtRGF0YX0gZG9ub3IgdGhlIGZvcm1kYXRhIHRoYXQgd2lsbCBwcm92aWRlIHRoZSBvdmVycmlkaW5nIHZhbHVlc1xuICAgKiBAcmV0dXJucyB7Rm9ybURhdGF9IHRoZSB7QGxpbmtjb2RlIHJlY2VpdmVyfVxuICAgKi9cbiAgZnVuY3Rpb24gb3ZlcnJpZGVGb3JtRGF0YShyZWNlaXZlciwgZG9ub3IpIHtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBkb25vci5rZXlzKCkpIHtcbiAgICAgIHJlY2VpdmVyLmRlbGV0ZShrZXkpXG4gICAgfVxuICAgIGRvbm9yLmZvckVhY2goZnVuY3Rpb24odmFsdWUsIGtleSkge1xuICAgICAgcmVjZWl2ZXIuYXBwZW5kKGtleSwgdmFsdWUpXG4gICAgfSlcbiAgICByZXR1cm4gcmVjZWl2ZXJcbiAgfVxuXG4gIC8qKlxuICogQHBhcmFtIHtFbGVtZW50fEhUTUxGb3JtRWxlbWVudH0gZWx0XG4gKiBAcGFyYW0ge0h0dHBWZXJifSB2ZXJiXG4gKiBAcmV0dXJucyB7e2Vycm9yczogSHRteEVsZW1lbnRWYWxpZGF0aW9uRXJyb3JbXSwgZm9ybURhdGE6IEZvcm1EYXRhLCB2YWx1ZXM6IE9iamVjdH19XG4gKi9cbiAgZnVuY3Rpb24gZ2V0SW5wdXRWYWx1ZXMoZWx0LCB2ZXJiKSB7XG4gICAgLyoqIEB0eXBlIEVsZW1lbnRbXSAqL1xuICAgIGNvbnN0IHByb2Nlc3NlZCA9IFtdXG4gICAgY29uc3QgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKVxuICAgIGNvbnN0IHByaW9yaXR5Rm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKVxuICAgIC8qKiBAdHlwZSBIdG14RWxlbWVudFZhbGlkYXRpb25FcnJvcltdICovXG4gICAgY29uc3QgZXJyb3JzID0gW11cbiAgICBjb25zdCBpbnRlcm5hbERhdGEgPSBnZXRJbnRlcm5hbERhdGEoZWx0KVxuICAgIGlmIChpbnRlcm5hbERhdGEubGFzdEJ1dHRvbkNsaWNrZWQgJiYgIWJvZHlDb250YWlucyhpbnRlcm5hbERhdGEubGFzdEJ1dHRvbkNsaWNrZWQpKSB7XG4gICAgICBpbnRlcm5hbERhdGEubGFzdEJ1dHRvbkNsaWNrZWQgPSBudWxsXG4gICAgfVxuXG4gICAgLy8gb25seSB2YWxpZGF0ZSB3aGVuIGZvcm0gaXMgZGlyZWN0bHkgc3VibWl0dGVkIGFuZCBub3ZhbGlkYXRlIG9yIGZvcm1ub3ZhbGlkYXRlIGFyZSBub3Qgc2V0XG4gICAgLy8gb3IgaWYgdGhlIGVsZW1lbnQgaGFzIGFuIGV4cGxpY2l0IGh4LXZhbGlkYXRlPVwidHJ1ZVwiIG9uIGl0XG4gICAgbGV0IHZhbGlkYXRlID0gKGVsdCBpbnN0YW5jZW9mIEhUTUxGb3JtRWxlbWVudCAmJiBlbHQubm9WYWxpZGF0ZSAhPT0gdHJ1ZSkgfHwgZ2V0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtdmFsaWRhdGUnKSA9PT0gJ3RydWUnXG4gICAgaWYgKGludGVybmFsRGF0YS5sYXN0QnV0dG9uQ2xpY2tlZCkge1xuICAgICAgdmFsaWRhdGUgPSB2YWxpZGF0ZSAmJiBpbnRlcm5hbERhdGEubGFzdEJ1dHRvbkNsaWNrZWQuZm9ybU5vVmFsaWRhdGUgIT09IHRydWVcbiAgICB9XG5cbiAgICAvLyBmb3IgYSBub24tR0VUIGluY2x1ZGUgdGhlIGNsb3Nlc3QgZm9ybVxuICAgIGlmICh2ZXJiICE9PSAnZ2V0Jykge1xuICAgICAgcHJvY2Vzc0lucHV0VmFsdWUocHJvY2Vzc2VkLCBwcmlvcml0eUZvcm1EYXRhLCBlcnJvcnMsIGNsb3Nlc3QoZWx0LCAnZm9ybScpLCB2YWxpZGF0ZSlcbiAgICB9XG5cbiAgICAvLyBpbmNsdWRlIHRoZSBlbGVtZW50IGl0c2VsZlxuICAgIHByb2Nlc3NJbnB1dFZhbHVlKHByb2Nlc3NlZCwgZm9ybURhdGEsIGVycm9ycywgZWx0LCB2YWxpZGF0ZSlcblxuICAgIC8vIGlmIGEgYnV0dG9uIG9yIHN1Ym1pdCB3YXMgY2xpY2tlZCBsYXN0LCBpbmNsdWRlIGl0cyB2YWx1ZVxuICAgIGlmIChpbnRlcm5hbERhdGEubGFzdEJ1dHRvbkNsaWNrZWQgfHwgZWx0LnRhZ05hbWUgPT09ICdCVVRUT04nIHx8XG4gICAgKGVsdC50YWdOYW1lID09PSAnSU5QVVQnICYmIGdldFJhd0F0dHJpYnV0ZShlbHQsICd0eXBlJykgPT09ICdzdWJtaXQnKSkge1xuICAgICAgY29uc3QgYnV0dG9uID0gaW50ZXJuYWxEYXRhLmxhc3RCdXR0b25DbGlja2VkIHx8ICgvKiogQHR5cGUgSFRNTElucHV0RWxlbWVudHxIVE1MQnV0dG9uRWxlbWVudCAqLyhlbHQpKVxuICAgICAgY29uc3QgbmFtZSA9IGdldFJhd0F0dHJpYnV0ZShidXR0b24sICduYW1lJylcbiAgICAgIGFkZFZhbHVlVG9Gb3JtRGF0YShuYW1lLCBidXR0b24udmFsdWUsIHByaW9yaXR5Rm9ybURhdGEpXG4gICAgfVxuXG4gICAgLy8gaW5jbHVkZSBhbnkgZXhwbGljaXQgaW5jbHVkZXNcbiAgICBjb25zdCBpbmNsdWRlcyA9IGZpbmRBdHRyaWJ1dGVUYXJnZXRzKGVsdCwgJ2h4LWluY2x1ZGUnKVxuICAgIGZvckVhY2goaW5jbHVkZXMsIGZ1bmN0aW9uKG5vZGUpIHtcbiAgICAgIHByb2Nlc3NJbnB1dFZhbHVlKHByb2Nlc3NlZCwgZm9ybURhdGEsIGVycm9ycywgYXNFbGVtZW50KG5vZGUpLCB2YWxpZGF0ZSlcbiAgICAgIC8vIGlmIGEgbm9uLWZvcm0gaXMgaW5jbHVkZWQsIGluY2x1ZGUgYW55IGlucHV0IHZhbHVlcyB3aXRoaW4gaXRcbiAgICAgIGlmICghbWF0Y2hlcyhub2RlLCAnZm9ybScpKSB7XG4gICAgICAgIGZvckVhY2goYXNQYXJlbnROb2RlKG5vZGUpLnF1ZXJ5U2VsZWN0b3JBbGwoSU5QVVRfU0VMRUNUT1IpLCBmdW5jdGlvbihkZXNjZW5kYW50KSB7XG4gICAgICAgICAgcHJvY2Vzc0lucHV0VmFsdWUocHJvY2Vzc2VkLCBmb3JtRGF0YSwgZXJyb3JzLCBkZXNjZW5kYW50LCB2YWxpZGF0ZSlcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9KVxuXG4gICAgLy8gdmFsdWVzIGZyb20gYSA8Zm9ybT4gdGFrZSBwcmVjZWRlbmNlLCBvdmVycmlkaW5nIHRoZSByZWd1bGFyIHZhbHVlc1xuICAgIG92ZXJyaWRlRm9ybURhdGEoZm9ybURhdGEsIHByaW9yaXR5Rm9ybURhdGEpXG5cbiAgICByZXR1cm4geyBlcnJvcnMsIGZvcm1EYXRhLCB2YWx1ZXM6IGZvcm1EYXRhUHJveHkoZm9ybURhdGEpIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcmV0dXJuU3RyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAqIEBwYXJhbSB7YW55fSByZWFsVmFsdWVcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGZ1bmN0aW9uIGFwcGVuZFBhcmFtKHJldHVyblN0ciwgbmFtZSwgcmVhbFZhbHVlKSB7XG4gICAgaWYgKHJldHVyblN0ciAhPT0gJycpIHtcbiAgICAgIHJldHVyblN0ciArPSAnJidcbiAgICB9XG4gICAgaWYgKFN0cmluZyhyZWFsVmFsdWUpID09PSAnW29iamVjdCBPYmplY3RdJykge1xuICAgICAgcmVhbFZhbHVlID0gSlNPTi5zdHJpbmdpZnkocmVhbFZhbHVlKVxuICAgIH1cbiAgICBjb25zdCBzID0gZW5jb2RlVVJJQ29tcG9uZW50KHJlYWxWYWx1ZSlcbiAgICByZXR1cm5TdHIgKz0gZW5jb2RlVVJJQ29tcG9uZW50KG5hbWUpICsgJz0nICsgc1xuICAgIHJldHVybiByZXR1cm5TdHJcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0Zvcm1EYXRhfE9iamVjdH0gdmFsdWVzXG4gICAqIEByZXR1cm5zIHN0cmluZ1xuICAgKi9cbiAgZnVuY3Rpb24gdXJsRW5jb2RlKHZhbHVlcykge1xuICAgIHZhbHVlcyA9IGZvcm1EYXRhRnJvbU9iamVjdCh2YWx1ZXMpXG4gICAgbGV0IHJldHVyblN0ciA9ICcnXG4gICAgdmFsdWVzLmZvckVhY2goZnVuY3Rpb24odmFsdWUsIGtleSkge1xuICAgICAgcmV0dXJuU3RyID0gYXBwZW5kUGFyYW0ocmV0dXJuU3RyLCBrZXksIHZhbHVlKVxuICAgIH0pXG4gICAgcmV0dXJuIHJldHVyblN0clxuICB9XG5cbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gQWpheFxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAqIEBwYXJhbSB7RWxlbWVudH0gdGFyZ2V0XG4gKiBAcGFyYW0ge3N0cmluZ30gcHJvbXB0XG4gKiBAcmV0dXJucyB7SHRteEhlYWRlclNwZWNpZmljYXRpb259XG4gKi9cbiAgZnVuY3Rpb24gZ2V0SGVhZGVycyhlbHQsIHRhcmdldCwgcHJvbXB0KSB7XG4gICAgLyoqIEB0eXBlIEh0bXhIZWFkZXJTcGVjaWZpY2F0aW9uICovXG4gICAgY29uc3QgaGVhZGVycyA9IHtcbiAgICAgICdIWC1SZXF1ZXN0JzogJ3RydWUnLFxuICAgICAgJ0hYLVRyaWdnZXInOiBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnaWQnKSxcbiAgICAgICdIWC1UcmlnZ2VyLU5hbWUnOiBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnbmFtZScpLFxuICAgICAgJ0hYLVRhcmdldCc6IGdldEF0dHJpYnV0ZVZhbHVlKHRhcmdldCwgJ2lkJyksXG4gICAgICAnSFgtQ3VycmVudC1VUkwnOiBnZXREb2N1bWVudCgpLmxvY2F0aW9uLmhyZWZcbiAgICB9XG4gICAgZ2V0VmFsdWVzRm9yRWxlbWVudChlbHQsICdoeC1oZWFkZXJzJywgZmFsc2UsIGhlYWRlcnMpXG4gICAgaWYgKHByb21wdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoZWFkZXJzWydIWC1Qcm9tcHQnXSA9IHByb21wdFxuICAgIH1cbiAgICBpZiAoZ2V0SW50ZXJuYWxEYXRhKGVsdCkuYm9vc3RlZCkge1xuICAgICAgaGVhZGVyc1snSFgtQm9vc3RlZCddID0gJ3RydWUnXG4gICAgfVxuICAgIHJldHVybiBoZWFkZXJzXG4gIH1cblxuICAvKipcbiAqIGZpbHRlclZhbHVlcyB0YWtlcyBhbiBvYmplY3QgY29udGFpbmluZyBmb3JtIGlucHV0IHZhbHVlc1xuICogYW5kIHJldHVybnMgYSBuZXcgb2JqZWN0IHRoYXQgb25seSBjb250YWlucyBrZXlzIHRoYXQgYXJlXG4gKiBzcGVjaWZpZWQgYnkgdGhlIGNsb3Nlc3QgXCJoeC1wYXJhbXNcIiBhdHRyaWJ1dGVcbiAqIEBwYXJhbSB7Rm9ybURhdGF9IGlucHV0VmFsdWVzXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICogQHJldHVybnMge0Zvcm1EYXRhfVxuICovXG4gIGZ1bmN0aW9uIGZpbHRlclZhbHVlcyhpbnB1dFZhbHVlcywgZWx0KSB7XG4gICAgY29uc3QgcGFyYW1zVmFsdWUgPSBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtcGFyYW1zJylcbiAgICBpZiAocGFyYW1zVmFsdWUpIHtcbiAgICAgIGlmIChwYXJhbXNWYWx1ZSA9PT0gJ25vbmUnKSB7XG4gICAgICAgIHJldHVybiBuZXcgRm9ybURhdGEoKVxuICAgICAgfSBlbHNlIGlmIChwYXJhbXNWYWx1ZSA9PT0gJyonKSB7XG4gICAgICAgIHJldHVybiBpbnB1dFZhbHVlc1xuICAgICAgfSBlbHNlIGlmIChwYXJhbXNWYWx1ZS5pbmRleE9mKCdub3QgJykgPT09IDApIHtcbiAgICAgICAgZm9yRWFjaChwYXJhbXNWYWx1ZS5zdWJzdHIoNCkuc3BsaXQoJywnKSwgZnVuY3Rpb24obmFtZSkge1xuICAgICAgICAgIG5hbWUgPSBuYW1lLnRyaW0oKVxuICAgICAgICAgIGlucHV0VmFsdWVzLmRlbGV0ZShuYW1lKVxuICAgICAgICB9KVxuICAgICAgICByZXR1cm4gaW5wdXRWYWx1ZXNcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IG5ld1ZhbHVlcyA9IG5ldyBGb3JtRGF0YSgpXG4gICAgICAgIGZvckVhY2gocGFyYW1zVmFsdWUuc3BsaXQoJywnKSwgZnVuY3Rpb24obmFtZSkge1xuICAgICAgICAgIG5hbWUgPSBuYW1lLnRyaW0oKVxuICAgICAgICAgIGlmIChpbnB1dFZhbHVlcy5oYXMobmFtZSkpIHtcbiAgICAgICAgICAgIGlucHV0VmFsdWVzLmdldEFsbChuYW1lKS5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlKSB7IG5ld1ZhbHVlcy5hcHBlbmQobmFtZSwgdmFsdWUpIH0pXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgICByZXR1cm4gbmV3VmFsdWVzXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBpbnB1dFZhbHVlc1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gaXNBbmNob3JMaW5rKGVsdCkge1xuICAgIHJldHVybiAhIWdldFJhd0F0dHJpYnV0ZShlbHQsICdocmVmJykgJiYgZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ2hyZWYnKS5pbmRleE9mKCcjJykgPj0gMFxuICB9XG5cbiAgLyoqXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICogQHBhcmFtIHtIdG14U3dhcFN0eWxlfSBbc3dhcEluZm9PdmVycmlkZV1cbiAqIEByZXR1cm5zIHtIdG14U3dhcFNwZWNpZmljYXRpb259XG4gKi9cbiAgZnVuY3Rpb24gZ2V0U3dhcFNwZWNpZmljYXRpb24oZWx0LCBzd2FwSW5mb092ZXJyaWRlKSB7XG4gICAgY29uc3Qgc3dhcEluZm8gPSBzd2FwSW5mb092ZXJyaWRlIHx8IGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC1zd2FwJylcbiAgICAvKiogQHR5cGUgSHRteFN3YXBTcGVjaWZpY2F0aW9uICovXG4gICAgY29uc3Qgc3dhcFNwZWMgPSB7XG4gICAgICBzd2FwU3R5bGU6IGdldEludGVybmFsRGF0YShlbHQpLmJvb3N0ZWQgPyAnaW5uZXJIVE1MJyA6IGh0bXguY29uZmlnLmRlZmF1bHRTd2FwU3R5bGUsXG4gICAgICBzd2FwRGVsYXk6IGh0bXguY29uZmlnLmRlZmF1bHRTd2FwRGVsYXksXG4gICAgICBzZXR0bGVEZWxheTogaHRteC5jb25maWcuZGVmYXVsdFNldHRsZURlbGF5XG4gICAgfVxuICAgIGlmIChodG14LmNvbmZpZy5zY3JvbGxJbnRvVmlld09uQm9vc3QgJiYgZ2V0SW50ZXJuYWxEYXRhKGVsdCkuYm9vc3RlZCAmJiAhaXNBbmNob3JMaW5rKGVsdCkpIHtcbiAgICAgIHN3YXBTcGVjLnNob3cgPSAndG9wJ1xuICAgIH1cbiAgICBpZiAoc3dhcEluZm8pIHtcbiAgICAgIGNvbnN0IHNwbGl0ID0gc3BsaXRPbldoaXRlc3BhY2Uoc3dhcEluZm8pXG4gICAgICBpZiAoc3BsaXQubGVuZ3RoID4gMCkge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNwbGl0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgdmFsdWUgPSBzcGxpdFtpXVxuICAgICAgICAgIGlmICh2YWx1ZS5pbmRleE9mKCdzd2FwOicpID09PSAwKSB7XG4gICAgICAgICAgICBzd2FwU3BlYy5zd2FwRGVsYXkgPSBwYXJzZUludGVydmFsKHZhbHVlLnN1YnN0cig1KSlcbiAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLmluZGV4T2YoJ3NldHRsZTonKSA9PT0gMCkge1xuICAgICAgICAgICAgc3dhcFNwZWMuc2V0dGxlRGVsYXkgPSBwYXJzZUludGVydmFsKHZhbHVlLnN1YnN0cig3KSlcbiAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLmluZGV4T2YoJ3RyYW5zaXRpb246JykgPT09IDApIHtcbiAgICAgICAgICAgIHN3YXBTcGVjLnRyYW5zaXRpb24gPSB2YWx1ZS5zdWJzdHIoMTEpID09PSAndHJ1ZSdcbiAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLmluZGV4T2YoJ2lnbm9yZVRpdGxlOicpID09PSAwKSB7XG4gICAgICAgICAgICBzd2FwU3BlYy5pZ25vcmVUaXRsZSA9IHZhbHVlLnN1YnN0cigxMikgPT09ICd0cnVlJ1xuICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUuaW5kZXhPZignc2Nyb2xsOicpID09PSAwKSB7XG4gICAgICAgICAgICBjb25zdCBzY3JvbGxTcGVjID0gdmFsdWUuc3Vic3RyKDcpXG4gICAgICAgICAgICB2YXIgc3BsaXRTcGVjID0gc2Nyb2xsU3BlYy5zcGxpdCgnOicpXG4gICAgICAgICAgICBjb25zdCBzY3JvbGxWYWwgPSBzcGxpdFNwZWMucG9wKClcbiAgICAgICAgICAgIHZhciBzZWxlY3RvclZhbCA9IHNwbGl0U3BlYy5sZW5ndGggPiAwID8gc3BsaXRTcGVjLmpvaW4oJzonKSA6IG51bGxcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIHN3YXBTcGVjLnNjcm9sbCA9IHNjcm9sbFZhbFxuICAgICAgICAgICAgc3dhcFNwZWMuc2Nyb2xsVGFyZ2V0ID0gc2VsZWN0b3JWYWxcbiAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLmluZGV4T2YoJ3Nob3c6JykgPT09IDApIHtcbiAgICAgICAgICAgIGNvbnN0IHNob3dTcGVjID0gdmFsdWUuc3Vic3RyKDUpXG4gICAgICAgICAgICB2YXIgc3BsaXRTcGVjID0gc2hvd1NwZWMuc3BsaXQoJzonKVxuICAgICAgICAgICAgY29uc3Qgc2hvd1ZhbCA9IHNwbGl0U3BlYy5wb3AoKVxuICAgICAgICAgICAgdmFyIHNlbGVjdG9yVmFsID0gc3BsaXRTcGVjLmxlbmd0aCA+IDAgPyBzcGxpdFNwZWMuam9pbignOicpIDogbnVsbFxuICAgICAgICAgICAgc3dhcFNwZWMuc2hvdyA9IHNob3dWYWxcbiAgICAgICAgICAgIHN3YXBTcGVjLnNob3dUYXJnZXQgPSBzZWxlY3RvclZhbFxuICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUuaW5kZXhPZignZm9jdXMtc2Nyb2xsOicpID09PSAwKSB7XG4gICAgICAgICAgICBjb25zdCBmb2N1c1Njcm9sbFZhbCA9IHZhbHVlLnN1YnN0cignZm9jdXMtc2Nyb2xsOicubGVuZ3RoKVxuICAgICAgICAgICAgc3dhcFNwZWMuZm9jdXNTY3JvbGwgPSBmb2N1c1Njcm9sbFZhbCA9PSAndHJ1ZSdcbiAgICAgICAgICB9IGVsc2UgaWYgKGkgPT0gMCkge1xuICAgICAgICAgICAgc3dhcFNwZWMuc3dhcFN0eWxlID0gdmFsdWVcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbG9nRXJyb3IoJ1Vua25vd24gbW9kaWZpZXIgaW4gaHgtc3dhcDogJyArIHZhbHVlKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc3dhcFNwZWNcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gdXNlc0Zvcm1EYXRhKGVsdCkge1xuICAgIHJldHVybiBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtZW5jb2RpbmcnKSA9PT0gJ211bHRpcGFydC9mb3JtLWRhdGEnIHx8XG4gICAgKG1hdGNoZXMoZWx0LCAnZm9ybScpICYmIGdldFJhd0F0dHJpYnV0ZShlbHQsICdlbmN0eXBlJykgPT09ICdtdWx0aXBhcnQvZm9ybS1kYXRhJylcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1hNTEh0dHBSZXF1ZXN0fSB4aHJcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtGb3JtRGF0YX0gZmlsdGVyZWRQYXJhbWV0ZXJzXG4gICAqIEByZXR1cm5zIHsqfHN0cmluZ3xudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gZW5jb2RlUGFyYW1zRm9yQm9keSh4aHIsIGVsdCwgZmlsdGVyZWRQYXJhbWV0ZXJzKSB7XG4gICAgbGV0IGVuY29kZWRQYXJhbWV0ZXJzID0gbnVsbFxuICAgIHdpdGhFeHRlbnNpb25zKGVsdCwgZnVuY3Rpb24oZXh0ZW5zaW9uKSB7XG4gICAgICBpZiAoZW5jb2RlZFBhcmFtZXRlcnMgPT0gbnVsbCkge1xuICAgICAgICBlbmNvZGVkUGFyYW1ldGVycyA9IGV4dGVuc2lvbi5lbmNvZGVQYXJhbWV0ZXJzKHhociwgZmlsdGVyZWRQYXJhbWV0ZXJzLCBlbHQpXG4gICAgICB9XG4gICAgfSlcbiAgICBpZiAoZW5jb2RlZFBhcmFtZXRlcnMgIT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGVuY29kZWRQYXJhbWV0ZXJzXG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh1c2VzRm9ybURhdGEoZWx0KSkge1xuICAgICAgICAvLyBGb3JjZSBjb252ZXJzaW9uIHRvIGFuIGFjdHVhbCBGb3JtRGF0YSBvYmplY3QgaW4gY2FzZSBmaWx0ZXJlZFBhcmFtZXRlcnMgaXMgYSBmb3JtRGF0YVByb3h5XG4gICAgICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vYmlnc2t5c29mdHdhcmUvaHRteC9pc3N1ZXMvMjMxN1xuICAgICAgICByZXR1cm4gb3ZlcnJpZGVGb3JtRGF0YShuZXcgRm9ybURhdGEoKSwgZm9ybURhdGFGcm9tT2JqZWN0KGZpbHRlcmVkUGFyYW1ldGVycykpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdXJsRW5jb2RlKGZpbHRlcmVkUGFyYW1ldGVycylcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAqXG4gKiBAcGFyYW0ge0VsZW1lbnR9IHRhcmdldFxuICogQHJldHVybnMge0h0bXhTZXR0bGVJbmZvfVxuICovXG4gIGZ1bmN0aW9uIG1ha2VTZXR0bGVJbmZvKHRhcmdldCkge1xuICAgIHJldHVybiB7IHRhc2tzOiBbXSwgZWx0czogW3RhcmdldF0gfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudFtdfSBjb250ZW50XG4gICAqIEBwYXJhbSB7SHRteFN3YXBTcGVjaWZpY2F0aW9ufSBzd2FwU3BlY1xuICAgKi9cbiAgZnVuY3Rpb24gdXBkYXRlU2Nyb2xsU3RhdGUoY29udGVudCwgc3dhcFNwZWMpIHtcbiAgICBjb25zdCBmaXJzdCA9IGNvbnRlbnRbMF1cbiAgICBjb25zdCBsYXN0ID0gY29udGVudFtjb250ZW50Lmxlbmd0aCAtIDFdXG4gICAgaWYgKHN3YXBTcGVjLnNjcm9sbCkge1xuICAgICAgdmFyIHRhcmdldCA9IG51bGxcbiAgICAgIGlmIChzd2FwU3BlYy5zY3JvbGxUYXJnZXQpIHtcbiAgICAgICAgdGFyZ2V0ID0gYXNFbGVtZW50KHF1ZXJ5U2VsZWN0b3JFeHQoZmlyc3QsIHN3YXBTcGVjLnNjcm9sbFRhcmdldCkpXG4gICAgICB9XG4gICAgICBpZiAoc3dhcFNwZWMuc2Nyb2xsID09PSAndG9wJyAmJiAoZmlyc3QgfHwgdGFyZ2V0KSkge1xuICAgICAgICB0YXJnZXQgPSB0YXJnZXQgfHwgZmlyc3RcbiAgICAgICAgdGFyZ2V0LnNjcm9sbFRvcCA9IDBcbiAgICAgIH1cbiAgICAgIGlmIChzd2FwU3BlYy5zY3JvbGwgPT09ICdib3R0b20nICYmIChsYXN0IHx8IHRhcmdldCkpIHtcbiAgICAgICAgdGFyZ2V0ID0gdGFyZ2V0IHx8IGxhc3RcbiAgICAgICAgdGFyZ2V0LnNjcm9sbFRvcCA9IHRhcmdldC5zY3JvbGxIZWlnaHRcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHN3YXBTcGVjLnNob3cpIHtcbiAgICAgIHZhciB0YXJnZXQgPSBudWxsXG4gICAgICBpZiAoc3dhcFNwZWMuc2hvd1RhcmdldCkge1xuICAgICAgICBsZXQgdGFyZ2V0U3RyID0gc3dhcFNwZWMuc2hvd1RhcmdldFxuICAgICAgICBpZiAoc3dhcFNwZWMuc2hvd1RhcmdldCA9PT0gJ3dpbmRvdycpIHtcbiAgICAgICAgICB0YXJnZXRTdHIgPSAnYm9keSdcbiAgICAgICAgfVxuICAgICAgICB0YXJnZXQgPSBhc0VsZW1lbnQocXVlcnlTZWxlY3RvckV4dChmaXJzdCwgdGFyZ2V0U3RyKSlcbiAgICAgIH1cbiAgICAgIGlmIChzd2FwU3BlYy5zaG93ID09PSAndG9wJyAmJiAoZmlyc3QgfHwgdGFyZ2V0KSkge1xuICAgICAgICB0YXJnZXQgPSB0YXJnZXQgfHwgZmlyc3RcbiAgICAgICAgLy8gQHRzLWlnbm9yZSBGb3Igc29tZSByZWFzb24gdHNjIGRvZXNuJ3QgcmVjb2duaXplIFwiaW5zdGFudFwiIGFzIGEgdmFsaWQgb3B0aW9uIGZvciBub3dcbiAgICAgICAgdGFyZ2V0LnNjcm9sbEludG9WaWV3KHsgYmxvY2s6ICdzdGFydCcsIGJlaGF2aW9yOiBodG14LmNvbmZpZy5zY3JvbGxCZWhhdmlvciB9KVxuICAgICAgfVxuICAgICAgaWYgKHN3YXBTcGVjLnNob3cgPT09ICdib3R0b20nICYmIChsYXN0IHx8IHRhcmdldCkpIHtcbiAgICAgICAgdGFyZ2V0ID0gdGFyZ2V0IHx8IGxhc3RcbiAgICAgICAgLy8gQHRzLWlnbm9yZSBGb3Igc29tZSByZWFzb24gdHNjIGRvZXNuJ3QgcmVjb2duaXplIFwiaW5zdGFudFwiIGFzIGEgdmFsaWQgb3B0aW9uIGZvciBub3dcbiAgICAgICAgdGFyZ2V0LnNjcm9sbEludG9WaWV3KHsgYmxvY2s6ICdlbmQnLCBiZWhhdmlvcjogaHRteC5jb25maWcuc2Nyb2xsQmVoYXZpb3IgfSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gKiBAcGFyYW0ge3N0cmluZ30gYXR0clxuICogQHBhcmFtIHtib29sZWFuPX0gZXZhbEFzRGVmYXVsdFxuICogQHBhcmFtIHtPYmplY3Q9fSB2YWx1ZXNcbiAqIEByZXR1cm5zIHtPYmplY3R9XG4gKi9cbiAgZnVuY3Rpb24gZ2V0VmFsdWVzRm9yRWxlbWVudChlbHQsIGF0dHIsIGV2YWxBc0RlZmF1bHQsIHZhbHVlcykge1xuICAgIGlmICh2YWx1ZXMgPT0gbnVsbCkge1xuICAgICAgdmFsdWVzID0ge31cbiAgICB9XG4gICAgaWYgKGVsdCA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gdmFsdWVzXG4gICAgfVxuICAgIGNvbnN0IGF0dHJpYnV0ZVZhbHVlID0gZ2V0QXR0cmlidXRlVmFsdWUoZWx0LCBhdHRyKVxuICAgIGlmIChhdHRyaWJ1dGVWYWx1ZSkge1xuICAgICAgbGV0IHN0ciA9IGF0dHJpYnV0ZVZhbHVlLnRyaW0oKVxuICAgICAgbGV0IGV2YWx1YXRlVmFsdWUgPSBldmFsQXNEZWZhdWx0XG4gICAgICBpZiAoc3RyID09PSAndW5zZXQnKSB7XG4gICAgICAgIHJldHVybiBudWxsXG4gICAgICB9XG4gICAgICBpZiAoc3RyLmluZGV4T2YoJ2phdmFzY3JpcHQ6JykgPT09IDApIHtcbiAgICAgICAgc3RyID0gc3RyLnN1YnN0cigxMSlcbiAgICAgICAgZXZhbHVhdGVWYWx1ZSA9IHRydWVcbiAgICAgIH0gZWxzZSBpZiAoc3RyLmluZGV4T2YoJ2pzOicpID09PSAwKSB7XG4gICAgICAgIHN0ciA9IHN0ci5zdWJzdHIoMylcbiAgICAgICAgZXZhbHVhdGVWYWx1ZSA9IHRydWVcbiAgICAgIH1cbiAgICAgIGlmIChzdHIuaW5kZXhPZigneycpICE9PSAwKSB7XG4gICAgICAgIHN0ciA9ICd7JyArIHN0ciArICd9J1xuICAgICAgfVxuICAgICAgbGV0IHZhcnNWYWx1ZXNcbiAgICAgIGlmIChldmFsdWF0ZVZhbHVlKSB7XG4gICAgICAgIHZhcnNWYWx1ZXMgPSBtYXliZUV2YWwoZWx0LCBmdW5jdGlvbigpIHsgcmV0dXJuIEZ1bmN0aW9uKCdyZXR1cm4gKCcgKyBzdHIgKyAnKScpKCkgfSwge30pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXJzVmFsdWVzID0gcGFyc2VKU09OKHN0cilcbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3Qga2V5IGluIHZhcnNWYWx1ZXMpIHtcbiAgICAgICAgaWYgKHZhcnNWYWx1ZXMuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICAgIGlmICh2YWx1ZXNba2V5XSA9PSBudWxsKSB7XG4gICAgICAgICAgICB2YWx1ZXNba2V5XSA9IHZhcnNWYWx1ZXNba2V5XVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZ2V0VmFsdWVzRm9yRWxlbWVudChhc0VsZW1lbnQocGFyZW50RWx0KGVsdCkpLCBhdHRyLCBldmFsQXNEZWZhdWx0LCB2YWx1ZXMpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldHxzdHJpbmd9IGVsdFxuICAgKiBAcGFyYW0geygpID0+IGFueX0gdG9FdmFsXG4gICAqIEBwYXJhbSB7YW55PX0gZGVmYXVsdFZhbFxuICAgKiBAcmV0dXJucyB7YW55fVxuICAgKi9cbiAgZnVuY3Rpb24gbWF5YmVFdmFsKGVsdCwgdG9FdmFsLCBkZWZhdWx0VmFsKSB7XG4gICAgaWYgKGh0bXguY29uZmlnLmFsbG93RXZhbCkge1xuICAgICAgcmV0dXJuIHRvRXZhbCgpXG4gICAgfSBlbHNlIHtcbiAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6ZXZhbERpc2FsbG93ZWRFcnJvcicpXG4gICAgICByZXR1cm4gZGVmYXVsdFZhbFxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAqIEBwYXJhbSB7Kj99IGV4cHJlc3Npb25WYXJzXG4gKiBAcmV0dXJuc1xuICovXG4gIGZ1bmN0aW9uIGdldEhYVmFyc0ZvckVsZW1lbnQoZWx0LCBleHByZXNzaW9uVmFycykge1xuICAgIHJldHVybiBnZXRWYWx1ZXNGb3JFbGVtZW50KGVsdCwgJ2h4LXZhcnMnLCB0cnVlLCBleHByZXNzaW9uVmFycylcbiAgfVxuXG4gIC8qKlxuICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAqIEBwYXJhbSB7Kj99IGV4cHJlc3Npb25WYXJzXG4gKiBAcmV0dXJuc1xuICovXG4gIGZ1bmN0aW9uIGdldEhYVmFsc0ZvckVsZW1lbnQoZWx0LCBleHByZXNzaW9uVmFycykge1xuICAgIHJldHVybiBnZXRWYWx1ZXNGb3JFbGVtZW50KGVsdCwgJ2h4LXZhbHMnLCBmYWxzZSwgZXhwcmVzc2lvblZhcnMpXG4gIH1cblxuICAvKipcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gKiBAcmV0dXJucyB7Rm9ybURhdGF9XG4gKi9cbiAgZnVuY3Rpb24gZ2V0RXhwcmVzc2lvblZhcnMoZWx0KSB7XG4gICAgcmV0dXJuIG1lcmdlT2JqZWN0cyhnZXRIWFZhcnNGb3JFbGVtZW50KGVsdCksIGdldEhYVmFsc0ZvckVsZW1lbnQoZWx0KSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1hNTEh0dHBSZXF1ZXN0fSB4aHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IGhlYWRlclxuICAgKiBAcGFyYW0ge3N0cmluZ3xudWxsfSBoZWFkZXJWYWx1ZVxuICAgKi9cbiAgZnVuY3Rpb24gc2FmZWx5U2V0SGVhZGVyVmFsdWUoeGhyLCBoZWFkZXIsIGhlYWRlclZhbHVlKSB7XG4gICAgaWYgKGhlYWRlclZhbHVlICE9PSBudWxsKSB7XG4gICAgICB0cnkge1xuICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcihoZWFkZXIsIGhlYWRlclZhbHVlKVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gT24gYW4gZXhjZXB0aW9uLCB0cnkgdG8gc2V0IHRoZSBoZWFkZXIgVVJJIGVuY29kZWQgaW5zdGVhZFxuICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcihoZWFkZXIsIGVuY29kZVVSSUNvbXBvbmVudChoZWFkZXJWYWx1ZSkpXG4gICAgICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKGhlYWRlciArICctVVJJLUF1dG9FbmNvZGVkJywgJ3RydWUnKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1hNTEh0dHBSZXF1ZXN0fSB4aHJcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0UGF0aEZyb21SZXNwb25zZSh4aHIpIHtcbiAgLy8gTkI6IElFMTEgZG9lcyBub3Qgc3VwcG9ydCB0aGlzIHN0dWZmXG4gICAgaWYgKHhoci5yZXNwb25zZVVSTCAmJiB0eXBlb2YgKFVSTCkgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCB1cmwgPSBuZXcgVVJMKHhoci5yZXNwb25zZVVSTClcbiAgICAgICAgcmV0dXJuIHVybC5wYXRobmFtZSArIHVybC5zZWFyY2hcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpiYWRSZXNwb25zZVVybCcsIHsgdXJsOiB4aHIucmVzcG9uc2VVUkwgfSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtYTUxIdHRwUmVxdWVzdH0geGhyXG4gICAqIEBwYXJhbSB7UmVnRXhwfSByZWdleHBcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGhhc0hlYWRlcih4aHIsIHJlZ2V4cCkge1xuICAgIHJldHVybiByZWdleHAudGVzdCh4aHIuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCkpXG4gIH1cblxuICAvKipcbiAgICogSXNzdWVzIGFuIGh0bXgtc3R5bGUgQUpBWCByZXF1ZXN0XG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI2FqYXhcbiAgICpcbiAgICogQHBhcmFtIHtIdHRwVmVyYn0gdmVyYlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aCB0aGUgVVJMIHBhdGggdG8gbWFrZSB0aGUgQUpBWFxuICAgKiBAcGFyYW0ge0VsZW1lbnR8c3RyaW5nfEh0bXhBamF4SGVscGVyQ29udGV4dH0gY29udGV4dCB0aGUgZWxlbWVudCB0byB0YXJnZXQgKGRlZmF1bHRzIHRvIHRoZSAqKmJvZHkqKikgfCBhIHNlbGVjdG9yIGZvciB0aGUgdGFyZ2V0IHwgYSBjb250ZXh0IG9iamVjdCB0aGF0IGNvbnRhaW5zIGFueSBvZiB0aGUgZm9sbG93aW5nXG4gICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IFByb21pc2UgdGhhdCByZXNvbHZlcyBpbW1lZGlhdGVseSBpZiBubyByZXF1ZXN0IGlzIHNlbnQsIG9yIHdoZW4gdGhlIHJlcXVlc3QgaXMgY29tcGxldGVcbiAgICovXG4gIGZ1bmN0aW9uIGFqYXhIZWxwZXIodmVyYiwgcGF0aCwgY29udGV4dCkge1xuICAgIHZlcmIgPSAoLyoqIEB0eXBlIEh0dHBWZXJiICovKHZlcmIudG9Mb3dlckNhc2UoKSkpXG4gICAgaWYgKGNvbnRleHQpIHtcbiAgICAgIGlmIChjb250ZXh0IGluc3RhbmNlb2YgRWxlbWVudCB8fCB0eXBlb2YgY29udGV4dCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIGlzc3VlQWpheFJlcXVlc3QodmVyYiwgcGF0aCwgbnVsbCwgbnVsbCwge1xuICAgICAgICAgIHRhcmdldE92ZXJyaWRlOiByZXNvbHZlVGFyZ2V0KGNvbnRleHQpLFxuICAgICAgICAgIHJldHVyblByb21pc2U6IHRydWVcbiAgICAgICAgfSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBpc3N1ZUFqYXhSZXF1ZXN0KHZlcmIsIHBhdGgsIHJlc29sdmVUYXJnZXQoY29udGV4dC5zb3VyY2UpLCBjb250ZXh0LmV2ZW50LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGhhbmRsZXI6IGNvbnRleHQuaGFuZGxlcixcbiAgICAgICAgICAgIGhlYWRlcnM6IGNvbnRleHQuaGVhZGVycyxcbiAgICAgICAgICAgIHZhbHVlczogY29udGV4dC52YWx1ZXMsXG4gICAgICAgICAgICB0YXJnZXRPdmVycmlkZTogcmVzb2x2ZVRhcmdldChjb250ZXh0LnRhcmdldCksXG4gICAgICAgICAgICBzd2FwT3ZlcnJpZGU6IGNvbnRleHQuc3dhcCxcbiAgICAgICAgICAgIHNlbGVjdDogY29udGV4dC5zZWxlY3QsXG4gICAgICAgICAgICByZXR1cm5Qcm9taXNlOiB0cnVlXG4gICAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGlzc3VlQWpheFJlcXVlc3QodmVyYiwgcGF0aCwgbnVsbCwgbnVsbCwge1xuICAgICAgICByZXR1cm5Qcm9taXNlOiB0cnVlXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJuIHtFbGVtZW50W119XG4gICAqL1xuICBmdW5jdGlvbiBoaWVyYXJjaHlGb3JFbHQoZWx0KSB7XG4gICAgY29uc3QgYXJyID0gW11cbiAgICB3aGlsZSAoZWx0KSB7XG4gICAgICBhcnIucHVzaChlbHQpXG4gICAgICBlbHQgPSBlbHQucGFyZW50RWxlbWVudFxuICAgIH1cbiAgICByZXR1cm4gYXJyXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAgICogQHBhcmFtIHtIdG14UmVxdWVzdENvbmZpZ30gcmVxdWVzdENvbmZpZ1xuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gdmVyaWZ5UGF0aChlbHQsIHBhdGgsIHJlcXVlc3RDb25maWcpIHtcbiAgICBsZXQgc2FtZUhvc3RcbiAgICBsZXQgdXJsXG4gICAgaWYgKHR5cGVvZiBVUkwgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHVybCA9IG5ldyBVUkwocGF0aCwgZG9jdW1lbnQubG9jYXRpb24uaHJlZilcbiAgICAgIGNvbnN0IG9yaWdpbiA9IGRvY3VtZW50LmxvY2F0aW9uLm9yaWdpblxuICAgICAgc2FtZUhvc3QgPSBvcmlnaW4gPT09IHVybC5vcmlnaW5cbiAgICB9IGVsc2Uge1xuICAgIC8vIElFMTEgZG9lc24ndCBzdXBwb3J0IFVSTFxuICAgICAgdXJsID0gcGF0aFxuICAgICAgc2FtZUhvc3QgPSBzdGFydHNXaXRoKHBhdGgsIGRvY3VtZW50LmxvY2F0aW9uLm9yaWdpbilcbiAgICB9XG5cbiAgICBpZiAoaHRteC5jb25maWcuc2VsZlJlcXVlc3RzT25seSkge1xuICAgICAgaWYgKCFzYW1lSG9zdCkge1xuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRyaWdnZXJFdmVudChlbHQsICdodG14OnZhbGlkYXRlVXJsJywgbWVyZ2VPYmplY3RzKHsgdXJsLCBzYW1lSG9zdCB9LCByZXF1ZXN0Q29uZmlnKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge09iamVjdHxGb3JtRGF0YX0gb2JqXG4gICAqIEByZXR1cm4ge0Zvcm1EYXRhfVxuICAgKi9cbiAgZnVuY3Rpb24gZm9ybURhdGFGcm9tT2JqZWN0KG9iaikge1xuICAgIGlmIChvYmogaW5zdGFuY2VvZiBGb3JtRGF0YSkgcmV0dXJuIG9ialxuICAgIGNvbnN0IGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKClcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBvYmopIHtcbiAgICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICBpZiAodHlwZW9mIG9ialtrZXldLmZvckVhY2ggPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBvYmpba2V5XS5mb3JFYWNoKGZ1bmN0aW9uKHYpIHsgZm9ybURhdGEuYXBwZW5kKGtleSwgdikgfSlcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2Ygb2JqW2tleV0gPT09ICdvYmplY3QnICYmICEob2JqW2tleV0gaW5zdGFuY2VvZiBCbG9iKSkge1xuICAgICAgICAgIGZvcm1EYXRhLmFwcGVuZChrZXksIEpTT04uc3RyaW5naWZ5KG9ialtrZXldKSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmb3JtRGF0YS5hcHBlbmQoa2V5LCBvYmpba2V5XSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZm9ybURhdGFcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0Zvcm1EYXRhfSBmb3JtRGF0YVxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheVxuICAgKiBAcmV0dXJucyB7QXJyYXl9XG4gICAqL1xuICBmdW5jdGlvbiBmb3JtRGF0YUFycmF5UHJveHkoZm9ybURhdGEsIG5hbWUsIGFycmF5KSB7XG4gICAgLy8gbXV0YXRpbmcgdGhlIGFycmF5IHNob3VsZCBtdXRhdGUgdGhlIHVuZGVybHlpbmcgZm9ybSBkYXRhXG4gICAgcmV0dXJuIG5ldyBQcm94eShhcnJheSwge1xuICAgICAgZ2V0OiBmdW5jdGlvbih0YXJnZXQsIGtleSkge1xuICAgICAgICBpZiAodHlwZW9mIGtleSA9PT0gJ251bWJlcicpIHJldHVybiB0YXJnZXRba2V5XVxuICAgICAgICBpZiAoa2V5ID09PSAnbGVuZ3RoJykgcmV0dXJuIHRhcmdldC5sZW5ndGhcbiAgICAgICAgaWYgKGtleSA9PT0gJ3B1c2gnKSB7XG4gICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgICAgICB0YXJnZXQucHVzaCh2YWx1ZSlcbiAgICAgICAgICAgIGZvcm1EYXRhLmFwcGVuZChuYW1lLCB2YWx1ZSlcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiB0YXJnZXRba2V5XSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHRhcmdldFtrZXldLmFwcGx5KHRhcmdldCwgYXJndW1lbnRzKVxuICAgICAgICAgICAgZm9ybURhdGEuZGVsZXRlKG5hbWUpXG4gICAgICAgICAgICB0YXJnZXQuZm9yRWFjaChmdW5jdGlvbih2KSB7IGZvcm1EYXRhLmFwcGVuZChuYW1lLCB2KSB9KVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0YXJnZXRba2V5XSAmJiB0YXJnZXRba2V5XS5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICByZXR1cm4gdGFyZ2V0W2tleV1bMF1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gdGFyZ2V0W2tleV1cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHNldDogZnVuY3Rpb24odGFyZ2V0LCBpbmRleCwgdmFsdWUpIHtcbiAgICAgICAgdGFyZ2V0W2luZGV4XSA9IHZhbHVlXG4gICAgICAgIGZvcm1EYXRhLmRlbGV0ZShuYW1lKVxuICAgICAgICB0YXJnZXQuZm9yRWFjaChmdW5jdGlvbih2KSB7IGZvcm1EYXRhLmFwcGVuZChuYW1lLCB2KSB9KVxuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtGb3JtRGF0YX0gZm9ybURhdGFcbiAgICogQHJldHVybnMge09iamVjdH1cbiAgICovXG4gIGZ1bmN0aW9uIGZvcm1EYXRhUHJveHkoZm9ybURhdGEpIHtcbiAgICByZXR1cm4gbmV3IFByb3h5KGZvcm1EYXRhLCB7XG4gICAgICBnZXQ6IGZ1bmN0aW9uKHRhcmdldCwgbmFtZSkge1xuICAgICAgICBpZiAodHlwZW9mIG5hbWUgPT09ICdzeW1ib2wnKSB7XG4gICAgICAgICAgLy8gRm9yd2FyZCBzeW1ib2wgY2FsbHMgdG8gdGhlIEZvcm1EYXRhIGl0c2VsZiBkaXJlY3RseVxuICAgICAgICAgIHJldHVybiBSZWZsZWN0LmdldCh0YXJnZXQsIG5hbWUpXG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5hbWUgPT09ICd0b0pTT04nKSB7XG4gICAgICAgICAgLy8gU3VwcG9ydCBKU09OLnN0cmluZ2lmeSBjYWxsIG9uIHByb3h5XG4gICAgICAgICAgcmV0dXJuICgpID0+IE9iamVjdC5mcm9tRW50cmllcyhmb3JtRGF0YSlcbiAgICAgICAgfVxuICAgICAgICBpZiAobmFtZSBpbiB0YXJnZXQpIHtcbiAgICAgICAgICAvLyBXcmFwIGluIGZ1bmN0aW9uIHdpdGggYXBwbHkgdG8gY29ycmVjdGx5IGJpbmQgdGhlIEZvcm1EYXRhIGNvbnRleHQsIGFzIGEgZGlyZWN0IGNhbGwgd291bGQgcmVzdWx0IGluIGFuIGlsbGVnYWwgaW52b2NhdGlvbiBlcnJvclxuICAgICAgICAgIGlmICh0eXBlb2YgdGFyZ2V0W25hbWVdID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgIHJldHVybiBmb3JtRGF0YVtuYW1lXS5hcHBseShmb3JtRGF0YSwgYXJndW1lbnRzKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGFyZ2V0W25hbWVdXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFycmF5ID0gZm9ybURhdGEuZ2V0QWxsKG5hbWUpXG4gICAgICAgIC8vIFRob3NlIDIgdW5kZWZpbmVkICYgc2luZ2xlIHZhbHVlIHJldHVybnMgYXJlIGZvciByZXRyby1jb21wYXRpYmlsaXR5IGFzIHdlIHdlcmVuJ3QgdXNpbmcgRm9ybURhdGEgYmVmb3JlXG4gICAgICAgIGlmIChhcnJheS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkXG4gICAgICAgIH0gZWxzZSBpZiAoYXJyYXkubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgcmV0dXJuIGFycmF5WzBdXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIGZvcm1EYXRhQXJyYXlQcm94eSh0YXJnZXQsIG5hbWUsIGFycmF5KVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgc2V0OiBmdW5jdGlvbih0YXJnZXQsIG5hbWUsIHZhbHVlKSB7XG4gICAgICAgIGlmICh0eXBlb2YgbmFtZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgfVxuICAgICAgICB0YXJnZXQuZGVsZXRlKG5hbWUpXG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUuZm9yRWFjaCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHZhbHVlLmZvckVhY2goZnVuY3Rpb24odikgeyB0YXJnZXQuYXBwZW5kKG5hbWUsIHYpIH0pXG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiAhKHZhbHVlIGluc3RhbmNlb2YgQmxvYikpIHtcbiAgICAgICAgICB0YXJnZXQuYXBwZW5kKG5hbWUsIEpTT04uc3RyaW5naWZ5KHZhbHVlKSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0YXJnZXQuYXBwZW5kKG5hbWUsIHZhbHVlKVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9LFxuICAgICAgZGVsZXRlUHJvcGVydHk6IGZ1bmN0aW9uKHRhcmdldCwgbmFtZSkge1xuICAgICAgICBpZiAodHlwZW9mIG5hbWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgdGFyZ2V0LmRlbGV0ZShuYW1lKVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9LFxuICAgICAgLy8gU3VwcG9ydCBPYmplY3QuYXNzaWduIGNhbGwgZnJvbSBwcm94eVxuICAgICAgb3duS2V5czogZnVuY3Rpb24odGFyZ2V0KSB7XG4gICAgICAgIHJldHVybiBSZWZsZWN0Lm93bktleXMoT2JqZWN0LmZyb21FbnRyaWVzKHRhcmdldCkpXG4gICAgICB9LFxuICAgICAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yOiBmdW5jdGlvbih0YXJnZXQsIHByb3ApIHtcbiAgICAgICAgcmV0dXJuIFJlZmxlY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdC5mcm9tRW50cmllcyh0YXJnZXQpLCBwcm9wKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtIdHRwVmVyYn0gdmVyYlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge0V2ZW50fSBldmVudFxuICAgKiBAcGFyYW0ge0h0bXhBamF4RXRjfSBbZXRjXVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtjb25maXJtZWRdXG4gICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBmdW5jdGlvbiBpc3N1ZUFqYXhSZXF1ZXN0KHZlcmIsIHBhdGgsIGVsdCwgZXZlbnQsIGV0YywgY29uZmlybWVkKSB7XG4gICAgbGV0IHJlc29sdmUgPSBudWxsXG4gICAgbGV0IHJlamVjdCA9IG51bGxcbiAgICBldGMgPSBldGMgIT0gbnVsbCA/IGV0YyA6IHt9XG4gICAgaWYgKGV0Yy5yZXR1cm5Qcm9taXNlICYmIHR5cGVvZiBQcm9taXNlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgdmFyIHByb21pc2UgPSBuZXcgUHJvbWlzZShmdW5jdGlvbihfcmVzb2x2ZSwgX3JlamVjdCkge1xuICAgICAgICByZXNvbHZlID0gX3Jlc29sdmVcbiAgICAgICAgcmVqZWN0ID0gX3JlamVjdFxuICAgICAgfSlcbiAgICB9XG4gICAgaWYgKGVsdCA9PSBudWxsKSB7XG4gICAgICBlbHQgPSBnZXREb2N1bWVudCgpLmJvZHlcbiAgICB9XG4gICAgY29uc3QgcmVzcG9uc2VIYW5kbGVyID0gZXRjLmhhbmRsZXIgfHwgaGFuZGxlQWpheFJlc3BvbnNlXG4gICAgY29uc3Qgc2VsZWN0ID0gZXRjLnNlbGVjdCB8fCBudWxsXG5cbiAgICBpZiAoIWJvZHlDb250YWlucyhlbHQpKSB7XG4gICAgLy8gZG8gbm90IGlzc3VlIHJlcXVlc3RzIGZvciBlbGVtZW50cyByZW1vdmVkIGZyb20gdGhlIERPTVxuICAgICAgbWF5YmVDYWxsKHJlc29sdmUpXG4gICAgICByZXR1cm4gcHJvbWlzZVxuICAgIH1cbiAgICBjb25zdCB0YXJnZXQgPSBldGMudGFyZ2V0T3ZlcnJpZGUgfHwgYXNFbGVtZW50KGdldFRhcmdldChlbHQpKVxuICAgIGlmICh0YXJnZXQgPT0gbnVsbCB8fCB0YXJnZXQgPT0gRFVNTVlfRUxUKSB7XG4gICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OnRhcmdldEVycm9yJywgeyB0YXJnZXQ6IGdldEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LXRhcmdldCcpIH0pXG4gICAgICBtYXliZUNhbGwocmVqZWN0KVxuICAgICAgcmV0dXJuIHByb21pc2VcbiAgICB9XG5cbiAgICBsZXQgZWx0RGF0YSA9IGdldEludGVybmFsRGF0YShlbHQpXG4gICAgY29uc3Qgc3VibWl0dGVyID0gZWx0RGF0YS5sYXN0QnV0dG9uQ2xpY2tlZFxuXG4gICAgaWYgKHN1Ym1pdHRlcikge1xuICAgICAgY29uc3QgYnV0dG9uUGF0aCA9IGdldFJhd0F0dHJpYnV0ZShzdWJtaXR0ZXIsICdmb3JtYWN0aW9uJylcbiAgICAgIGlmIChidXR0b25QYXRoICE9IG51bGwpIHtcbiAgICAgICAgcGF0aCA9IGJ1dHRvblBhdGhcbiAgICAgIH1cblxuICAgICAgY29uc3QgYnV0dG9uVmVyYiA9IGdldFJhd0F0dHJpYnV0ZShzdWJtaXR0ZXIsICdmb3JtbWV0aG9kJylcbiAgICAgIGlmIChidXR0b25WZXJiICE9IG51bGwpIHtcbiAgICAgIC8vIGlnbm9yZSBidXR0b25zIHdpdGggZm9ybW1ldGhvZD1cImRpYWxvZ1wiXG4gICAgICAgIGlmIChidXR0b25WZXJiLnRvTG93ZXJDYXNlKCkgIT09ICdkaWFsb2cnKSB7XG4gICAgICAgICAgdmVyYiA9ICgvKiogQHR5cGUgSHR0cFZlcmIgKi8oYnV0dG9uVmVyYikpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBjb25maXJtUXVlc3Rpb24gPSBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtY29uZmlybScpXG4gICAgLy8gYWxsb3cgZXZlbnQtYmFzZWQgY29uZmlybWF0aW9uIHcvIGEgY2FsbGJhY2tcbiAgICBpZiAoY29uZmlybWVkID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IGlzc3VlUmVxdWVzdCA9IGZ1bmN0aW9uKHNraXBDb25maXJtYXRpb24pIHtcbiAgICAgICAgcmV0dXJuIGlzc3VlQWpheFJlcXVlc3QodmVyYiwgcGF0aCwgZWx0LCBldmVudCwgZXRjLCAhIXNraXBDb25maXJtYXRpb24pXG4gICAgICB9XG4gICAgICBjb25zdCBjb25maXJtRGV0YWlscyA9IHsgdGFyZ2V0LCBlbHQsIHBhdGgsIHZlcmIsIHRyaWdnZXJpbmdFdmVudDogZXZlbnQsIGV0YywgaXNzdWVSZXF1ZXN0LCBxdWVzdGlvbjogY29uZmlybVF1ZXN0aW9uIH1cbiAgICAgIGlmICh0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDpjb25maXJtJywgY29uZmlybURldGFpbHMpID09PSBmYWxzZSkge1xuICAgICAgICBtYXliZUNhbGwocmVzb2x2ZSlcbiAgICAgICAgcmV0dXJuIHByb21pc2VcbiAgICAgIH1cbiAgICB9XG5cbiAgICBsZXQgc3luY0VsdCA9IGVsdFxuICAgIGxldCBzeW5jU3RyYXRlZ3kgPSBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtc3luYycpXG4gICAgbGV0IHF1ZXVlU3RyYXRlZ3kgPSBudWxsXG4gICAgbGV0IGFib3J0YWJsZSA9IGZhbHNlXG4gICAgaWYgKHN5bmNTdHJhdGVneSkge1xuICAgICAgY29uc3Qgc3luY1N0cmluZ3MgPSBzeW5jU3RyYXRlZ3kuc3BsaXQoJzonKVxuICAgICAgY29uc3Qgc2VsZWN0b3IgPSBzeW5jU3RyaW5nc1swXS50cmltKClcbiAgICAgIGlmIChzZWxlY3RvciA9PT0gJ3RoaXMnKSB7XG4gICAgICAgIHN5bmNFbHQgPSBmaW5kVGhpc0VsZW1lbnQoZWx0LCAnaHgtc3luYycpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzeW5jRWx0ID0gYXNFbGVtZW50KHF1ZXJ5U2VsZWN0b3JFeHQoZWx0LCBzZWxlY3RvcikpXG4gICAgICB9XG4gICAgICAvLyBkZWZhdWx0IHRvIHRoZSBkcm9wIHN0cmF0ZWd5XG4gICAgICBzeW5jU3RyYXRlZ3kgPSAoc3luY1N0cmluZ3NbMV0gfHwgJ2Ryb3AnKS50cmltKClcbiAgICAgIGVsdERhdGEgPSBnZXRJbnRlcm5hbERhdGEoc3luY0VsdClcbiAgICAgIGlmIChzeW5jU3RyYXRlZ3kgPT09ICdkcm9wJyAmJiBlbHREYXRhLnhociAmJiBlbHREYXRhLmFib3J0YWJsZSAhPT0gdHJ1ZSkge1xuICAgICAgICBtYXliZUNhbGwocmVzb2x2ZSlcbiAgICAgICAgcmV0dXJuIHByb21pc2VcbiAgICAgIH0gZWxzZSBpZiAoc3luY1N0cmF0ZWd5ID09PSAnYWJvcnQnKSB7XG4gICAgICAgIGlmIChlbHREYXRhLnhocikge1xuICAgICAgICAgIG1heWJlQ2FsbChyZXNvbHZlKVxuICAgICAgICAgIHJldHVybiBwcm9taXNlXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYWJvcnRhYmxlID0gdHJ1ZVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHN5bmNTdHJhdGVneSA9PT0gJ3JlcGxhY2UnKSB7XG4gICAgICAgIHRyaWdnZXJFdmVudChzeW5jRWx0LCAnaHRteDphYm9ydCcpIC8vIGFib3J0IHRoZSBjdXJyZW50IHJlcXVlc3QgYW5kIGNvbnRpbnVlXG4gICAgICB9IGVsc2UgaWYgKHN5bmNTdHJhdGVneS5pbmRleE9mKCdxdWV1ZScpID09PSAwKSB7XG4gICAgICAgIGNvbnN0IHF1ZXVlU3RyQXJyYXkgPSBzeW5jU3RyYXRlZ3kuc3BsaXQoJyAnKVxuICAgICAgICBxdWV1ZVN0cmF0ZWd5ID0gKHF1ZXVlU3RyQXJyYXlbMV0gfHwgJ2xhc3QnKS50cmltKClcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZWx0RGF0YS54aHIpIHtcbiAgICAgIGlmIChlbHREYXRhLmFib3J0YWJsZSkge1xuICAgICAgICB0cmlnZ2VyRXZlbnQoc3luY0VsdCwgJ2h0bXg6YWJvcnQnKSAvLyBhYm9ydCB0aGUgY3VycmVudCByZXF1ZXN0IGFuZCBjb250aW51ZVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHF1ZXVlU3RyYXRlZ3kgPT0gbnVsbCkge1xuICAgICAgICAgIGlmIChldmVudCkge1xuICAgICAgICAgICAgY29uc3QgZXZlbnREYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGV2ZW50KVxuICAgICAgICAgICAgaWYgKGV2ZW50RGF0YSAmJiBldmVudERhdGEudHJpZ2dlclNwZWMgJiYgZXZlbnREYXRhLnRyaWdnZXJTcGVjLnF1ZXVlKSB7XG4gICAgICAgICAgICAgIHF1ZXVlU3RyYXRlZ3kgPSBldmVudERhdGEudHJpZ2dlclNwZWMucXVldWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHF1ZXVlU3RyYXRlZ3kgPT0gbnVsbCkge1xuICAgICAgICAgICAgcXVldWVTdHJhdGVneSA9ICdsYXN0J1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoZWx0RGF0YS5xdWV1ZWRSZXF1ZXN0cyA9PSBudWxsKSB7XG4gICAgICAgICAgZWx0RGF0YS5xdWV1ZWRSZXF1ZXN0cyA9IFtdXG4gICAgICAgIH1cbiAgICAgICAgaWYgKHF1ZXVlU3RyYXRlZ3kgPT09ICdmaXJzdCcgJiYgZWx0RGF0YS5xdWV1ZWRSZXF1ZXN0cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICBlbHREYXRhLnF1ZXVlZFJlcXVlc3RzLnB1c2goZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBpc3N1ZUFqYXhSZXF1ZXN0KHZlcmIsIHBhdGgsIGVsdCwgZXZlbnQsIGV0YylcbiAgICAgICAgICB9KVxuICAgICAgICB9IGVsc2UgaWYgKHF1ZXVlU3RyYXRlZ3kgPT09ICdhbGwnKSB7XG4gICAgICAgICAgZWx0RGF0YS5xdWV1ZWRSZXF1ZXN0cy5wdXNoKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgaXNzdWVBamF4UmVxdWVzdCh2ZXJiLCBwYXRoLCBlbHQsIGV2ZW50LCBldGMpXG4gICAgICAgICAgfSlcbiAgICAgICAgfSBlbHNlIGlmIChxdWV1ZVN0cmF0ZWd5ID09PSAnbGFzdCcpIHtcbiAgICAgICAgICBlbHREYXRhLnF1ZXVlZFJlcXVlc3RzID0gW10gLy8gZHVtcCBleGlzdGluZyBxdWV1ZVxuICAgICAgICAgIGVsdERhdGEucXVldWVkUmVxdWVzdHMucHVzaChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGlzc3VlQWpheFJlcXVlc3QodmVyYiwgcGF0aCwgZWx0LCBldmVudCwgZXRjKVxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgICAgbWF5YmVDYWxsKHJlc29sdmUpXG4gICAgICAgIHJldHVybiBwcm9taXNlXG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KClcbiAgICBlbHREYXRhLnhociA9IHhoclxuICAgIGVsdERhdGEuYWJvcnRhYmxlID0gYWJvcnRhYmxlXG4gICAgY29uc3QgZW5kUmVxdWVzdExvY2sgPSBmdW5jdGlvbigpIHtcbiAgICAgIGVsdERhdGEueGhyID0gbnVsbFxuICAgICAgZWx0RGF0YS5hYm9ydGFibGUgPSBmYWxzZVxuICAgICAgaWYgKGVsdERhdGEucXVldWVkUmVxdWVzdHMgIT0gbnVsbCAmJlxuICAgICAgZWx0RGF0YS5xdWV1ZWRSZXF1ZXN0cy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IHF1ZXVlZFJlcXVlc3QgPSBlbHREYXRhLnF1ZXVlZFJlcXVlc3RzLnNoaWZ0KClcbiAgICAgICAgcXVldWVkUmVxdWVzdCgpXG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHByb21wdFF1ZXN0aW9uID0gZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LXByb21wdCcpXG4gICAgaWYgKHByb21wdFF1ZXN0aW9uKSB7XG4gICAgICB2YXIgcHJvbXB0UmVzcG9uc2UgPSBwcm9tcHQocHJvbXB0UXVlc3Rpb24pXG4gICAgICAvLyBwcm9tcHQgcmV0dXJucyBudWxsIGlmIGNhbmNlbGxlZCBhbmQgZW1wdHkgc3RyaW5nIGlmIGFjY2VwdGVkIHdpdGggbm8gZW50cnlcbiAgICAgIGlmIChwcm9tcHRSZXNwb25zZSA9PT0gbnVsbCB8fFxuICAgICAgIXRyaWdnZXJFdmVudChlbHQsICdodG14OnByb21wdCcsIHsgcHJvbXB0OiBwcm9tcHRSZXNwb25zZSwgdGFyZ2V0IH0pKSB7XG4gICAgICAgIG1heWJlQ2FsbChyZXNvbHZlKVxuICAgICAgICBlbmRSZXF1ZXN0TG9jaygpXG4gICAgICAgIHJldHVybiBwcm9taXNlXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNvbmZpcm1RdWVzdGlvbiAmJiAhY29uZmlybWVkKSB7XG4gICAgICBpZiAoIWNvbmZpcm0oY29uZmlybVF1ZXN0aW9uKSkge1xuICAgICAgICBtYXliZUNhbGwocmVzb2x2ZSlcbiAgICAgICAgZW5kUmVxdWVzdExvY2soKVxuICAgICAgICByZXR1cm4gcHJvbWlzZVxuICAgICAgfVxuICAgIH1cblxuICAgIGxldCBoZWFkZXJzID0gZ2V0SGVhZGVycyhlbHQsIHRhcmdldCwgcHJvbXB0UmVzcG9uc2UpXG5cbiAgICBpZiAodmVyYiAhPT0gJ2dldCcgJiYgIXVzZXNGb3JtRGF0YShlbHQpKSB7XG4gICAgICBoZWFkZXJzWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnXG4gICAgfVxuXG4gICAgaWYgKGV0Yy5oZWFkZXJzKSB7XG4gICAgICBoZWFkZXJzID0gbWVyZ2VPYmplY3RzKGhlYWRlcnMsIGV0Yy5oZWFkZXJzKVxuICAgIH1cbiAgICBjb25zdCByZXN1bHRzID0gZ2V0SW5wdXRWYWx1ZXMoZWx0LCB2ZXJiKVxuICAgIGxldCBlcnJvcnMgPSByZXN1bHRzLmVycm9yc1xuICAgIGNvbnN0IHJhd0Zvcm1EYXRhID0gcmVzdWx0cy5mb3JtRGF0YVxuICAgIGlmIChldGMudmFsdWVzKSB7XG4gICAgICBvdmVycmlkZUZvcm1EYXRhKHJhd0Zvcm1EYXRhLCBmb3JtRGF0YUZyb21PYmplY3QoZXRjLnZhbHVlcykpXG4gICAgfVxuICAgIGNvbnN0IGV4cHJlc3Npb25WYXJzID0gZm9ybURhdGFGcm9tT2JqZWN0KGdldEV4cHJlc3Npb25WYXJzKGVsdCkpXG4gICAgY29uc3QgYWxsRm9ybURhdGEgPSBvdmVycmlkZUZvcm1EYXRhKHJhd0Zvcm1EYXRhLCBleHByZXNzaW9uVmFycylcbiAgICBsZXQgZmlsdGVyZWRGb3JtRGF0YSA9IGZpbHRlclZhbHVlcyhhbGxGb3JtRGF0YSwgZWx0KVxuXG4gICAgaWYgKGh0bXguY29uZmlnLmdldENhY2hlQnVzdGVyUGFyYW0gJiYgdmVyYiA9PT0gJ2dldCcpIHtcbiAgICAgIGZpbHRlcmVkRm9ybURhdGEuc2V0KCdvcmcuaHRteC5jYWNoZS1idXN0ZXInLCBnZXRSYXdBdHRyaWJ1dGUodGFyZ2V0LCAnaWQnKSB8fCAndHJ1ZScpXG4gICAgfVxuXG4gICAgLy8gYmVoYXZpb3Igb2YgYW5jaG9ycyB3LyBlbXB0eSBocmVmIGlzIHRvIHVzZSB0aGUgY3VycmVudCBVUkxcbiAgICBpZiAocGF0aCA9PSBudWxsIHx8IHBhdGggPT09ICcnKSB7XG4gICAgICBwYXRoID0gZ2V0RG9jdW1lbnQoKS5sb2NhdGlvbi5ocmVmXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHR5cGUge09iamVjdH1cbiAgICAgKiBAcHJvcGVydHkge2Jvb2xlYW59IFtjcmVkZW50aWFsc11cbiAgICAgKiBAcHJvcGVydHkge251bWJlcn0gW3RpbWVvdXRdXG4gICAgICogQHByb3BlcnR5IHtib29sZWFufSBbbm9IZWFkZXJzXVxuICAgICAqL1xuICAgIGNvbnN0IHJlcXVlc3RBdHRyVmFsdWVzID0gZ2V0VmFsdWVzRm9yRWxlbWVudChlbHQsICdoeC1yZXF1ZXN0JylcblxuICAgIGNvbnN0IGVsdElzQm9vc3RlZCA9IGdldEludGVybmFsRGF0YShlbHQpLmJvb3N0ZWRcblxuICAgIGxldCB1c2VVcmxQYXJhbXMgPSBodG14LmNvbmZpZy5tZXRob2RzVGhhdFVzZVVybFBhcmFtcy5pbmRleE9mKHZlcmIpID49IDBcblxuICAgIC8qKiBAdHlwZSBIdG14UmVxdWVzdENvbmZpZyAqL1xuICAgIGNvbnN0IHJlcXVlc3RDb25maWcgPSB7XG4gICAgICBib29zdGVkOiBlbHRJc0Jvb3N0ZWQsXG4gICAgICB1c2VVcmxQYXJhbXMsXG4gICAgICBmb3JtRGF0YTogZmlsdGVyZWRGb3JtRGF0YSxcbiAgICAgIHBhcmFtZXRlcnM6IGZvcm1EYXRhUHJveHkoZmlsdGVyZWRGb3JtRGF0YSksXG4gICAgICB1bmZpbHRlcmVkRm9ybURhdGE6IGFsbEZvcm1EYXRhLFxuICAgICAgdW5maWx0ZXJlZFBhcmFtZXRlcnM6IGZvcm1EYXRhUHJveHkoYWxsRm9ybURhdGEpLFxuICAgICAgaGVhZGVycyxcbiAgICAgIHRhcmdldCxcbiAgICAgIHZlcmIsXG4gICAgICBlcnJvcnMsXG4gICAgICB3aXRoQ3JlZGVudGlhbHM6IGV0Yy5jcmVkZW50aWFscyB8fCByZXF1ZXN0QXR0clZhbHVlcy5jcmVkZW50aWFscyB8fCBodG14LmNvbmZpZy53aXRoQ3JlZGVudGlhbHMsXG4gICAgICB0aW1lb3V0OiBldGMudGltZW91dCB8fCByZXF1ZXN0QXR0clZhbHVlcy50aW1lb3V0IHx8IGh0bXguY29uZmlnLnRpbWVvdXQsXG4gICAgICBwYXRoLFxuICAgICAgdHJpZ2dlcmluZ0V2ZW50OiBldmVudFxuICAgIH1cblxuICAgIGlmICghdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6Y29uZmlnUmVxdWVzdCcsIHJlcXVlc3RDb25maWcpKSB7XG4gICAgICBtYXliZUNhbGwocmVzb2x2ZSlcbiAgICAgIGVuZFJlcXVlc3RMb2NrKClcbiAgICAgIHJldHVybiBwcm9taXNlXG4gICAgfVxuXG4gICAgLy8gY29weSBvdXQgaW4gY2FzZSB0aGUgb2JqZWN0IHdhcyBvdmVyd3JpdHRlblxuICAgIHBhdGggPSByZXF1ZXN0Q29uZmlnLnBhdGhcbiAgICB2ZXJiID0gcmVxdWVzdENvbmZpZy52ZXJiXG4gICAgaGVhZGVycyA9IHJlcXVlc3RDb25maWcuaGVhZGVyc1xuICAgIGZpbHRlcmVkRm9ybURhdGEgPSBmb3JtRGF0YUZyb21PYmplY3QocmVxdWVzdENvbmZpZy5wYXJhbWV0ZXJzKVxuICAgIGVycm9ycyA9IHJlcXVlc3RDb25maWcuZXJyb3JzXG4gICAgdXNlVXJsUGFyYW1zID0gcmVxdWVzdENvbmZpZy51c2VVcmxQYXJhbXNcblxuICAgIGlmIChlcnJvcnMgJiYgZXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OnZhbGlkYXRpb246aGFsdGVkJywgcmVxdWVzdENvbmZpZylcbiAgICAgIG1heWJlQ2FsbChyZXNvbHZlKVxuICAgICAgZW5kUmVxdWVzdExvY2soKVxuICAgICAgcmV0dXJuIHByb21pc2VcbiAgICB9XG5cbiAgICBjb25zdCBzcGxpdFBhdGggPSBwYXRoLnNwbGl0KCcjJylcbiAgICBjb25zdCBwYXRoTm9BbmNob3IgPSBzcGxpdFBhdGhbMF1cbiAgICBjb25zdCBhbmNob3IgPSBzcGxpdFBhdGhbMV1cblxuICAgIGxldCBmaW5hbFBhdGggPSBwYXRoXG4gICAgaWYgKHVzZVVybFBhcmFtcykge1xuICAgICAgZmluYWxQYXRoID0gcGF0aE5vQW5jaG9yXG4gICAgICBjb25zdCBoYXNWYWx1ZXMgPSAhZmlsdGVyZWRGb3JtRGF0YS5rZXlzKCkubmV4dCgpLmRvbmVcbiAgICAgIGlmIChoYXNWYWx1ZXMpIHtcbiAgICAgICAgaWYgKGZpbmFsUGF0aC5pbmRleE9mKCc/JykgPCAwKSB7XG4gICAgICAgICAgZmluYWxQYXRoICs9ICc/J1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGZpbmFsUGF0aCArPSAnJidcbiAgICAgICAgfVxuICAgICAgICBmaW5hbFBhdGggKz0gdXJsRW5jb2RlKGZpbHRlcmVkRm9ybURhdGEpXG4gICAgICAgIGlmIChhbmNob3IpIHtcbiAgICAgICAgICBmaW5hbFBhdGggKz0gJyMnICsgYW5jaG9yXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIXZlcmlmeVBhdGgoZWx0LCBmaW5hbFBhdGgsIHJlcXVlc3RDb25maWcpKSB7XG4gICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OmludmFsaWRQYXRoJywgcmVxdWVzdENvbmZpZylcbiAgICAgIG1heWJlQ2FsbChyZWplY3QpXG4gICAgICByZXR1cm4gcHJvbWlzZVxuICAgIH1cblxuICAgIHhoci5vcGVuKHZlcmIudG9VcHBlckNhc2UoKSwgZmluYWxQYXRoLCB0cnVlKVxuICAgIHhoci5vdmVycmlkZU1pbWVUeXBlKCd0ZXh0L2h0bWwnKVxuICAgIHhoci53aXRoQ3JlZGVudGlhbHMgPSByZXF1ZXN0Q29uZmlnLndpdGhDcmVkZW50aWFsc1xuICAgIHhoci50aW1lb3V0ID0gcmVxdWVzdENvbmZpZy50aW1lb3V0XG5cbiAgICAvLyByZXF1ZXN0IGhlYWRlcnNcbiAgICBpZiAocmVxdWVzdEF0dHJWYWx1ZXMubm9IZWFkZXJzKSB7XG4gICAgLy8gaWdub3JlIGFsbCBoZWFkZXJzXG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAoY29uc3QgaGVhZGVyIGluIGhlYWRlcnMpIHtcbiAgICAgICAgaWYgKGhlYWRlcnMuaGFzT3duUHJvcGVydHkoaGVhZGVyKSkge1xuICAgICAgICAgIGNvbnN0IGhlYWRlclZhbHVlID0gaGVhZGVyc1toZWFkZXJdXG4gICAgICAgICAgc2FmZWx5U2V0SGVhZGVyVmFsdWUoeGhyLCBoZWFkZXIsIGhlYWRlclZhbHVlKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEB0eXBlIHtIdG14UmVzcG9uc2VJbmZvfSAqL1xuICAgIGNvbnN0IHJlc3BvbnNlSW5mbyA9IHtcbiAgICAgIHhocixcbiAgICAgIHRhcmdldCxcbiAgICAgIHJlcXVlc3RDb25maWcsXG4gICAgICBldGMsXG4gICAgICBib29zdGVkOiBlbHRJc0Jvb3N0ZWQsXG4gICAgICBzZWxlY3QsXG4gICAgICBwYXRoSW5mbzoge1xuICAgICAgICByZXF1ZXN0UGF0aDogcGF0aCxcbiAgICAgICAgZmluYWxSZXF1ZXN0UGF0aDogZmluYWxQYXRoLFxuICAgICAgICByZXNwb25zZVBhdGg6IG51bGwsXG4gICAgICAgIGFuY2hvclxuICAgICAgfVxuICAgIH1cblxuICAgIHhoci5vbmxvYWQgPSBmdW5jdGlvbigpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGhpZXJhcmNoeSA9IGhpZXJhcmNoeUZvckVsdChlbHQpXG4gICAgICAgIHJlc3BvbnNlSW5mby5wYXRoSW5mby5yZXNwb25zZVBhdGggPSBnZXRQYXRoRnJvbVJlc3BvbnNlKHhocilcbiAgICAgICAgcmVzcG9uc2VIYW5kbGVyKGVsdCwgcmVzcG9uc2VJbmZvKVxuICAgICAgICBpZiAocmVzcG9uc2VJbmZvLmtlZXBJbmRpY2F0b3JzICE9PSB0cnVlKSB7XG4gICAgICAgICAgcmVtb3ZlUmVxdWVzdEluZGljYXRvcnMoaW5kaWNhdG9ycywgZGlzYWJsZUVsdHMpXG4gICAgICAgIH1cbiAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6YWZ0ZXJSZXF1ZXN0JywgcmVzcG9uc2VJbmZvKVxuICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDphZnRlck9uTG9hZCcsIHJlc3BvbnNlSW5mbylcbiAgICAgICAgLy8gaWYgdGhlIGJvZHkgbm8gbG9uZ2VyIGNvbnRhaW5zIHRoZSBlbGVtZW50LCB0cmlnZ2VyIHRoZSBldmVudCBvbiB0aGUgY2xvc2VzdCBwYXJlbnRcbiAgICAgICAgLy8gcmVtYWluaW5nIGluIHRoZSBET01cbiAgICAgICAgaWYgKCFib2R5Q29udGFpbnMoZWx0KSkge1xuICAgICAgICAgIGxldCBzZWNvbmRhcnlUcmlnZ2VyRWx0ID0gbnVsbFxuICAgICAgICAgIHdoaWxlIChoaWVyYXJjaHkubGVuZ3RoID4gMCAmJiBzZWNvbmRhcnlUcmlnZ2VyRWx0ID09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhcmVudEVsdEluSGllcmFyY2h5ID0gaGllcmFyY2h5LnNoaWZ0KClcbiAgICAgICAgICAgIGlmIChib2R5Q29udGFpbnMocGFyZW50RWx0SW5IaWVyYXJjaHkpKSB7XG4gICAgICAgICAgICAgIHNlY29uZGFyeVRyaWdnZXJFbHQgPSBwYXJlbnRFbHRJbkhpZXJhcmNoeVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoc2Vjb25kYXJ5VHJpZ2dlckVsdCkge1xuICAgICAgICAgICAgdHJpZ2dlckV2ZW50KHNlY29uZGFyeVRyaWdnZXJFbHQsICdodG14OmFmdGVyUmVxdWVzdCcsIHJlc3BvbnNlSW5mbylcbiAgICAgICAgICAgIHRyaWdnZXJFdmVudChzZWNvbmRhcnlUcmlnZ2VyRWx0LCAnaHRteDphZnRlck9uTG9hZCcsIHJlc3BvbnNlSW5mbylcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbWF5YmVDYWxsKHJlc29sdmUpXG4gICAgICAgIGVuZFJlcXVlc3RMb2NrKClcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDpvbkxvYWRFcnJvcicsIG1lcmdlT2JqZWN0cyh7IGVycm9yOiBlIH0sIHJlc3BvbnNlSW5mbykpXG4gICAgICAgIHRocm93IGVcbiAgICAgIH1cbiAgICB9XG4gICAgeGhyLm9uZXJyb3IgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJlbW92ZVJlcXVlc3RJbmRpY2F0b3JzKGluZGljYXRvcnMsIGRpc2FibGVFbHRzKVxuICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDphZnRlclJlcXVlc3QnLCByZXNwb25zZUluZm8pXG4gICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OnNlbmRFcnJvcicsIHJlc3BvbnNlSW5mbylcbiAgICAgIG1heWJlQ2FsbChyZWplY3QpXG4gICAgICBlbmRSZXF1ZXN0TG9jaygpXG4gICAgfVxuICAgIHhoci5vbmFib3J0ID0gZnVuY3Rpb24oKSB7XG4gICAgICByZW1vdmVSZXF1ZXN0SW5kaWNhdG9ycyhpbmRpY2F0b3JzLCBkaXNhYmxlRWx0cylcbiAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6YWZ0ZXJSZXF1ZXN0JywgcmVzcG9uc2VJbmZvKVxuICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDpzZW5kQWJvcnQnLCByZXNwb25zZUluZm8pXG4gICAgICBtYXliZUNhbGwocmVqZWN0KVxuICAgICAgZW5kUmVxdWVzdExvY2soKVxuICAgIH1cbiAgICB4aHIub250aW1lb3V0ID0gZnVuY3Rpb24oKSB7XG4gICAgICByZW1vdmVSZXF1ZXN0SW5kaWNhdG9ycyhpbmRpY2F0b3JzLCBkaXNhYmxlRWx0cylcbiAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6YWZ0ZXJSZXF1ZXN0JywgcmVzcG9uc2VJbmZvKVxuICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDp0aW1lb3V0JywgcmVzcG9uc2VJbmZvKVxuICAgICAgbWF5YmVDYWxsKHJlamVjdClcbiAgICAgIGVuZFJlcXVlc3RMb2NrKClcbiAgICB9XG4gICAgaWYgKCF0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDpiZWZvcmVSZXF1ZXN0JywgcmVzcG9uc2VJbmZvKSkge1xuICAgICAgbWF5YmVDYWxsKHJlc29sdmUpXG4gICAgICBlbmRSZXF1ZXN0TG9jaygpXG4gICAgICByZXR1cm4gcHJvbWlzZVxuICAgIH1cbiAgICB2YXIgaW5kaWNhdG9ycyA9IGFkZFJlcXVlc3RJbmRpY2F0b3JDbGFzc2VzKGVsdClcbiAgICB2YXIgZGlzYWJsZUVsdHMgPSBkaXNhYmxlRWxlbWVudHMoZWx0KVxuXG4gICAgZm9yRWFjaChbJ2xvYWRzdGFydCcsICdsb2FkZW5kJywgJ3Byb2dyZXNzJywgJ2Fib3J0J10sIGZ1bmN0aW9uKGV2ZW50TmFtZSkge1xuICAgICAgZm9yRWFjaChbeGhyLCB4aHIudXBsb2FkXSwgZnVuY3Rpb24odGFyZ2V0KSB7XG4gICAgICAgIHRhcmdldC5hZGRFdmVudExpc3RlbmVyKGV2ZW50TmFtZSwgZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDp4aHI6JyArIGV2ZW50TmFtZSwge1xuICAgICAgICAgICAgbGVuZ3RoQ29tcHV0YWJsZTogZXZlbnQubGVuZ3RoQ29tcHV0YWJsZSxcbiAgICAgICAgICAgIGxvYWRlZDogZXZlbnQubG9hZGVkLFxuICAgICAgICAgICAgdG90YWw6IGV2ZW50LnRvdGFsXG4gICAgICAgICAgfSlcbiAgICAgICAgfSlcbiAgICAgIH0pXG4gICAgfSlcbiAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDpiZWZvcmVTZW5kJywgcmVzcG9uc2VJbmZvKVxuICAgIGNvbnN0IHBhcmFtcyA9IHVzZVVybFBhcmFtcyA/IG51bGwgOiBlbmNvZGVQYXJhbXNGb3JCb2R5KHhociwgZWx0LCBmaWx0ZXJlZEZvcm1EYXRhKVxuICAgIHhoci5zZW5kKHBhcmFtcylcbiAgICByZXR1cm4gcHJvbWlzZVxuICB9XG5cbiAgLyoqXG4gICAqIEB0eXBlZGVmIHtPYmplY3R9IEh0bXhIaXN0b3J5VXBkYXRlXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfG51bGx9IFt0eXBlXVxuICAgKiBAcHJvcGVydHkge3N0cmluZ3xudWxsfSBbcGF0aF1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7SHRteFJlc3BvbnNlSW5mb30gcmVzcG9uc2VJbmZvXG4gICAqIEByZXR1cm4ge0h0bXhIaXN0b3J5VXBkYXRlfVxuICAgKi9cbiAgZnVuY3Rpb24gZGV0ZXJtaW5lSGlzdG9yeVVwZGF0ZXMoZWx0LCByZXNwb25zZUluZm8pIHtcbiAgICBjb25zdCB4aHIgPSByZXNwb25zZUluZm8ueGhyXG5cbiAgICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgLy8gRmlyc3QgY29uc3VsdCByZXNwb25zZSBoZWFkZXJzXG4gICAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIGxldCBwYXRoRnJvbUhlYWRlcnMgPSBudWxsXG4gICAgbGV0IHR5cGVGcm9tSGVhZGVycyA9IG51bGxcbiAgICBpZiAoaGFzSGVhZGVyKHhociwgL0hYLVB1c2g6L2kpKSB7XG4gICAgICBwYXRoRnJvbUhlYWRlcnMgPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVB1c2gnKVxuICAgICAgdHlwZUZyb21IZWFkZXJzID0gJ3B1c2gnXG4gICAgfSBlbHNlIGlmIChoYXNIZWFkZXIoeGhyLCAvSFgtUHVzaC1Vcmw6L2kpKSB7XG4gICAgICBwYXRoRnJvbUhlYWRlcnMgPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVB1c2gtVXJsJylcbiAgICAgIHR5cGVGcm9tSGVhZGVycyA9ICdwdXNoJ1xuICAgIH0gZWxzZSBpZiAoaGFzSGVhZGVyKHhociwgL0hYLVJlcGxhY2UtVXJsOi9pKSkge1xuICAgICAgcGF0aEZyb21IZWFkZXJzID0geGhyLmdldFJlc3BvbnNlSGVhZGVyKCdIWC1SZXBsYWNlLVVybCcpXG4gICAgICB0eXBlRnJvbUhlYWRlcnMgPSAncmVwbGFjZSdcbiAgICB9XG5cbiAgICAvLyBpZiB0aGVyZSB3YXMgYSByZXNwb25zZSBoZWFkZXIsIHRoYXQgaGFzIHByaW9yaXR5XG4gICAgaWYgKHBhdGhGcm9tSGVhZGVycykge1xuICAgICAgaWYgKHBhdGhGcm9tSGVhZGVycyA9PT0gJ2ZhbHNlJykge1xuICAgICAgICByZXR1cm4ge31cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdHlwZTogdHlwZUZyb21IZWFkZXJzLFxuICAgICAgICAgIHBhdGg6IHBhdGhGcm9tSGVhZGVyc1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIC8vIE5leHQgcmVzb2x2ZSB2aWEgRE9NIHZhbHVlc1xuICAgIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICBjb25zdCByZXF1ZXN0UGF0aCA9IHJlc3BvbnNlSW5mby5wYXRoSW5mby5maW5hbFJlcXVlc3RQYXRoXG4gICAgY29uc3QgcmVzcG9uc2VQYXRoID0gcmVzcG9uc2VJbmZvLnBhdGhJbmZvLnJlc3BvbnNlUGF0aFxuXG4gICAgY29uc3QgcHVzaFVybCA9IGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC1wdXNoLXVybCcpXG4gICAgY29uc3QgcmVwbGFjZVVybCA9IGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC1yZXBsYWNlLXVybCcpXG4gICAgY29uc3QgZWxlbWVudElzQm9vc3RlZCA9IGdldEludGVybmFsRGF0YShlbHQpLmJvb3N0ZWRcblxuICAgIGxldCBzYXZlVHlwZSA9IG51bGxcbiAgICBsZXQgcGF0aCA9IG51bGxcblxuICAgIGlmIChwdXNoVXJsKSB7XG4gICAgICBzYXZlVHlwZSA9ICdwdXNoJ1xuICAgICAgcGF0aCA9IHB1c2hVcmxcbiAgICB9IGVsc2UgaWYgKHJlcGxhY2VVcmwpIHtcbiAgICAgIHNhdmVUeXBlID0gJ3JlcGxhY2UnXG4gICAgICBwYXRoID0gcmVwbGFjZVVybFxuICAgIH0gZWxzZSBpZiAoZWxlbWVudElzQm9vc3RlZCkge1xuICAgICAgc2F2ZVR5cGUgPSAncHVzaCdcbiAgICAgIHBhdGggPSByZXNwb25zZVBhdGggfHwgcmVxdWVzdFBhdGggLy8gaWYgdGhlcmUgaXMgbm8gcmVzcG9uc2UgcGF0aCwgZ28gd2l0aCB0aGUgb3JpZ2luYWwgcmVxdWVzdCBwYXRoXG4gICAgfVxuXG4gICAgaWYgKHBhdGgpIHtcbiAgICAvLyBmYWxzZSBpbmRpY2F0ZXMgbm8gcHVzaCwgcmV0dXJuIGVtcHR5IG9iamVjdFxuICAgICAgaWYgKHBhdGggPT09ICdmYWxzZScpIHtcbiAgICAgICAgcmV0dXJuIHt9XG4gICAgICB9XG5cbiAgICAgIC8vIHRydWUgaW5kaWNhdGVzIHdlIHdhbnQgdG8gZm9sbG93IHdoZXJldmVyIHRoZSBzZXJ2ZXIgZW5kZWQgdXAgc2VuZGluZyB1c1xuICAgICAgaWYgKHBhdGggPT09ICd0cnVlJykge1xuICAgICAgICBwYXRoID0gcmVzcG9uc2VQYXRoIHx8IHJlcXVlc3RQYXRoIC8vIGlmIHRoZXJlIGlzIG5vIHJlc3BvbnNlIHBhdGgsIGdvIHdpdGggdGhlIG9yaWdpbmFsIHJlcXVlc3QgcGF0aFxuICAgICAgfVxuXG4gICAgICAvLyByZXN0b3JlIGFueSBhbmNob3IgYXNzb2NpYXRlZCB3aXRoIHRoZSByZXF1ZXN0XG4gICAgICBpZiAocmVzcG9uc2VJbmZvLnBhdGhJbmZvLmFuY2hvciAmJiBwYXRoLmluZGV4T2YoJyMnKSA9PT0gLTEpIHtcbiAgICAgICAgcGF0aCA9IHBhdGggKyAnIycgKyByZXNwb25zZUluZm8ucGF0aEluZm8uYW5jaG9yXG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6IHNhdmVUeXBlLFxuICAgICAgICBwYXRoXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB7fVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0h0bXhSZXNwb25zZUhhbmRsaW5nQ29uZmlnfSByZXNwb25zZUhhbmRsaW5nQ29uZmlnXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBzdGF0dXNcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGNvZGVNYXRjaGVzKHJlc3BvbnNlSGFuZGxpbmdDb25maWcsIHN0YXR1cykge1xuICAgIHZhciByZWdFeHAgPSBuZXcgUmVnRXhwKHJlc3BvbnNlSGFuZGxpbmdDb25maWcuY29kZSlcbiAgICByZXR1cm4gcmVnRXhwLnRlc3Qoc3RhdHVzLnRvU3RyaW5nKDEwKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1hNTEh0dHBSZXF1ZXN0fSB4aHJcbiAgICogQHJldHVybiB7SHRteFJlc3BvbnNlSGFuZGxpbmdDb25maWd9XG4gICAqL1xuICBmdW5jdGlvbiByZXNvbHZlUmVzcG9uc2VIYW5kbGluZyh4aHIpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGh0bXguY29uZmlnLnJlc3BvbnNlSGFuZGxpbmcubGVuZ3RoOyBpKyspIHtcbiAgICAgIC8qKiBAdHlwZSBIdG14UmVzcG9uc2VIYW5kbGluZ0NvbmZpZyAqL1xuICAgICAgdmFyIHJlc3BvbnNlSGFuZGxpbmdFbGVtZW50ID0gaHRteC5jb25maWcucmVzcG9uc2VIYW5kbGluZ1tpXVxuICAgICAgaWYgKGNvZGVNYXRjaGVzKHJlc3BvbnNlSGFuZGxpbmdFbGVtZW50LCB4aHIuc3RhdHVzKSkge1xuICAgICAgICByZXR1cm4gcmVzcG9uc2VIYW5kbGluZ0VsZW1lbnRcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gbm8gbWF0Y2hlcywgcmV0dXJuIG5vIHN3YXBcbiAgICByZXR1cm4ge1xuICAgICAgc3dhcDogZmFsc2VcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRpdGxlXG4gICAqL1xuICBmdW5jdGlvbiBoYW5kbGVUaXRsZSh0aXRsZSkge1xuICAgIGlmICh0aXRsZSkge1xuICAgICAgY29uc3QgdGl0bGVFbHQgPSBmaW5kKCd0aXRsZScpXG4gICAgICBpZiAodGl0bGVFbHQpIHtcbiAgICAgICAgdGl0bGVFbHQuaW5uZXJIVE1MID0gdGl0bGVcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHdpbmRvdy5kb2N1bWVudC50aXRsZSA9IHRpdGxlXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7SHRteFJlc3BvbnNlSW5mb30gcmVzcG9uc2VJbmZvXG4gICAqL1xuICBmdW5jdGlvbiBoYW5kbGVBamF4UmVzcG9uc2UoZWx0LCByZXNwb25zZUluZm8pIHtcbiAgICBjb25zdCB4aHIgPSByZXNwb25zZUluZm8ueGhyXG4gICAgbGV0IHRhcmdldCA9IHJlc3BvbnNlSW5mby50YXJnZXRcbiAgICBjb25zdCBldGMgPSByZXNwb25zZUluZm8uZXRjXG4gICAgY29uc3QgcmVzcG9uc2VJbmZvU2VsZWN0ID0gcmVzcG9uc2VJbmZvLnNlbGVjdFxuXG4gICAgaWYgKCF0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDpiZWZvcmVPbkxvYWQnLCByZXNwb25zZUluZm8pKSByZXR1cm5cblxuICAgIGlmIChoYXNIZWFkZXIoeGhyLCAvSFgtVHJpZ2dlcjovaSkpIHtcbiAgICAgIGhhbmRsZVRyaWdnZXJIZWFkZXIoeGhyLCAnSFgtVHJpZ2dlcicsIGVsdClcbiAgICB9XG5cbiAgICBpZiAoaGFzSGVhZGVyKHhociwgL0hYLUxvY2F0aW9uOi9pKSkge1xuICAgICAgc2F2ZUN1cnJlbnRQYWdlVG9IaXN0b3J5KClcbiAgICAgIGxldCByZWRpcmVjdFBhdGggPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLUxvY2F0aW9uJylcbiAgICAgIC8qKiBAdHlwZSB7SHRteEFqYXhIZWxwZXJDb250ZXh0JntwYXRoOnN0cmluZ319ICovXG4gICAgICB2YXIgcmVkaXJlY3RTd2FwU3BlY1xuICAgICAgaWYgKHJlZGlyZWN0UGF0aC5pbmRleE9mKCd7JykgPT09IDApIHtcbiAgICAgICAgcmVkaXJlY3RTd2FwU3BlYyA9IHBhcnNlSlNPTihyZWRpcmVjdFBhdGgpXG4gICAgICAgIC8vIHdoYXQncyB0aGUgYmVzdCB3YXkgdG8gdGhyb3cgYW4gZXJyb3IgaWYgdGhlIHVzZXIgZGlkbid0IGluY2x1ZGUgdGhpc1xuICAgICAgICByZWRpcmVjdFBhdGggPSByZWRpcmVjdFN3YXBTcGVjLnBhdGhcbiAgICAgICAgZGVsZXRlIHJlZGlyZWN0U3dhcFNwZWMucGF0aFxuICAgICAgfVxuICAgICAgYWpheEhlbHBlcignZ2V0JywgcmVkaXJlY3RQYXRoLCByZWRpcmVjdFN3YXBTcGVjKS50aGVuKGZ1bmN0aW9uKCkge1xuICAgICAgICBwdXNoVXJsSW50b0hpc3RvcnkocmVkaXJlY3RQYXRoKVxuICAgICAgfSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IHNob3VsZFJlZnJlc2ggPSBoYXNIZWFkZXIoeGhyLCAvSFgtUmVmcmVzaDovaSkgJiYgeGhyLmdldFJlc3BvbnNlSGVhZGVyKCdIWC1SZWZyZXNoJykgPT09ICd0cnVlJ1xuXG4gICAgaWYgKGhhc0hlYWRlcih4aHIsIC9IWC1SZWRpcmVjdDovaSkpIHtcbiAgICAgIHJlc3BvbnNlSW5mby5rZWVwSW5kaWNhdG9ycyA9IHRydWVcbiAgICAgIGxvY2F0aW9uLmhyZWYgPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVJlZGlyZWN0JylcbiAgICAgIHNob3VsZFJlZnJlc2ggJiYgbG9jYXRpb24ucmVsb2FkKClcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmIChzaG91bGRSZWZyZXNoKSB7XG4gICAgICByZXNwb25zZUluZm8ua2VlcEluZGljYXRvcnMgPSB0cnVlXG4gICAgICBsb2NhdGlvbi5yZWxvYWQoKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKGhhc0hlYWRlcih4aHIsIC9IWC1SZXRhcmdldDovaSkpIHtcbiAgICAgIGlmICh4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVJldGFyZ2V0JykgPT09ICd0aGlzJykge1xuICAgICAgICByZXNwb25zZUluZm8udGFyZ2V0ID0gZWx0XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXNwb25zZUluZm8udGFyZ2V0ID0gYXNFbGVtZW50KHF1ZXJ5U2VsZWN0b3JFeHQoZWx0LCB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVJldGFyZ2V0JykpKVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGhpc3RvcnlVcGRhdGUgPSBkZXRlcm1pbmVIaXN0b3J5VXBkYXRlcyhlbHQsIHJlc3BvbnNlSW5mbylcblxuICAgIGNvbnN0IHJlc3BvbnNlSGFuZGxpbmcgPSByZXNvbHZlUmVzcG9uc2VIYW5kbGluZyh4aHIpXG4gICAgY29uc3Qgc2hvdWxkU3dhcCA9IHJlc3BvbnNlSGFuZGxpbmcuc3dhcFxuICAgIGxldCBpc0Vycm9yID0gISFyZXNwb25zZUhhbmRsaW5nLmVycm9yXG4gICAgbGV0IGlnbm9yZVRpdGxlID0gaHRteC5jb25maWcuaWdub3JlVGl0bGUgfHwgcmVzcG9uc2VIYW5kbGluZy5pZ25vcmVUaXRsZVxuICAgIGxldCBzZWxlY3RPdmVycmlkZSA9IHJlc3BvbnNlSGFuZGxpbmcuc2VsZWN0XG4gICAgaWYgKHJlc3BvbnNlSGFuZGxpbmcudGFyZ2V0KSB7XG4gICAgICByZXNwb25zZUluZm8udGFyZ2V0ID0gYXNFbGVtZW50KHF1ZXJ5U2VsZWN0b3JFeHQoZWx0LCByZXNwb25zZUhhbmRsaW5nLnRhcmdldCkpXG4gICAgfVxuICAgIHZhciBzd2FwT3ZlcnJpZGUgPSBldGMuc3dhcE92ZXJyaWRlXG4gICAgaWYgKHN3YXBPdmVycmlkZSA9PSBudWxsICYmIHJlc3BvbnNlSGFuZGxpbmcuc3dhcE92ZXJyaWRlKSB7XG4gICAgICBzd2FwT3ZlcnJpZGUgPSByZXNwb25zZUhhbmRsaW5nLnN3YXBPdmVycmlkZVxuICAgIH1cblxuICAgIC8vIHJlc3BvbnNlIGhlYWRlcnMgb3ZlcnJpZGUgcmVzcG9uc2UgaGFuZGxpbmcgY29uZmlnXG4gICAgaWYgKGhhc0hlYWRlcih4aHIsIC9IWC1SZXRhcmdldDovaSkpIHtcbiAgICAgIGlmICh4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVJldGFyZ2V0JykgPT09ICd0aGlzJykge1xuICAgICAgICByZXNwb25zZUluZm8udGFyZ2V0ID0gZWx0XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXNwb25zZUluZm8udGFyZ2V0ID0gYXNFbGVtZW50KHF1ZXJ5U2VsZWN0b3JFeHQoZWx0LCB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVJldGFyZ2V0JykpKVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaGFzSGVhZGVyKHhociwgL0hYLVJlc3dhcDovaSkpIHtcbiAgICAgIHN3YXBPdmVycmlkZSA9IHhoci5nZXRSZXNwb25zZUhlYWRlcignSFgtUmVzd2FwJylcbiAgICB9XG5cbiAgICB2YXIgc2VydmVyUmVzcG9uc2UgPSB4aHIucmVzcG9uc2VcbiAgICAvKiogQHR5cGUgSHRteEJlZm9yZVN3YXBEZXRhaWxzICovXG4gICAgdmFyIGJlZm9yZVN3YXBEZXRhaWxzID0gbWVyZ2VPYmplY3RzKHtcbiAgICAgIHNob3VsZFN3YXAsXG4gICAgICBzZXJ2ZXJSZXNwb25zZSxcbiAgICAgIGlzRXJyb3IsXG4gICAgICBpZ25vcmVUaXRsZSxcbiAgICAgIHNlbGVjdE92ZXJyaWRlXG4gICAgfSwgcmVzcG9uc2VJbmZvKVxuXG4gICAgaWYgKHJlc3BvbnNlSGFuZGxpbmcuZXZlbnQgJiYgIXRyaWdnZXJFdmVudCh0YXJnZXQsIHJlc3BvbnNlSGFuZGxpbmcuZXZlbnQsIGJlZm9yZVN3YXBEZXRhaWxzKSkgcmV0dXJuXG5cbiAgICBpZiAoIXRyaWdnZXJFdmVudCh0YXJnZXQsICdodG14OmJlZm9yZVN3YXAnLCBiZWZvcmVTd2FwRGV0YWlscykpIHJldHVyblxuXG4gICAgdGFyZ2V0ID0gYmVmb3JlU3dhcERldGFpbHMudGFyZ2V0IC8vIGFsbG93IHJlLXRhcmdldGluZ1xuICAgIHNlcnZlclJlc3BvbnNlID0gYmVmb3JlU3dhcERldGFpbHMuc2VydmVyUmVzcG9uc2UgLy8gYWxsb3cgdXBkYXRpbmcgY29udGVudFxuICAgIGlzRXJyb3IgPSBiZWZvcmVTd2FwRGV0YWlscy5pc0Vycm9yIC8vIGFsbG93IHVwZGF0aW5nIGVycm9yXG4gICAgaWdub3JlVGl0bGUgPSBiZWZvcmVTd2FwRGV0YWlscy5pZ25vcmVUaXRsZSAvLyBhbGxvdyB1cGRhdGluZyBpZ25vcmluZyB0aXRsZVxuICAgIHNlbGVjdE92ZXJyaWRlID0gYmVmb3JlU3dhcERldGFpbHMuc2VsZWN0T3ZlcnJpZGUgLy8gYWxsb3cgdXBkYXRpbmcgc2VsZWN0IG92ZXJyaWRlXG5cbiAgICByZXNwb25zZUluZm8udGFyZ2V0ID0gdGFyZ2V0IC8vIE1ha2UgdXBkYXRlZCB0YXJnZXQgYXZhaWxhYmxlIHRvIHJlc3BvbnNlIGV2ZW50c1xuICAgIHJlc3BvbnNlSW5mby5mYWlsZWQgPSBpc0Vycm9yIC8vIE1ha2UgZmFpbGVkIHByb3BlcnR5IGF2YWlsYWJsZSB0byByZXNwb25zZSBldmVudHNcbiAgICByZXNwb25zZUluZm8uc3VjY2Vzc2Z1bCA9ICFpc0Vycm9yIC8vIE1ha2Ugc3VjY2Vzc2Z1bCBwcm9wZXJ0eSBhdmFpbGFibGUgdG8gcmVzcG9uc2UgZXZlbnRzXG5cbiAgICBpZiAoYmVmb3JlU3dhcERldGFpbHMuc2hvdWxkU3dhcCkge1xuICAgICAgaWYgKHhoci5zdGF0dXMgPT09IDI4Nikge1xuICAgICAgICBjYW5jZWxQb2xsaW5nKGVsdClcbiAgICAgIH1cblxuICAgICAgd2l0aEV4dGVuc2lvbnMoZWx0LCBmdW5jdGlvbihleHRlbnNpb24pIHtcbiAgICAgICAgc2VydmVyUmVzcG9uc2UgPSBleHRlbnNpb24udHJhbnNmb3JtUmVzcG9uc2Uoc2VydmVyUmVzcG9uc2UsIHhociwgZWx0KVxuICAgICAgfSlcblxuICAgICAgLy8gU2F2ZSBjdXJyZW50IHBhZ2UgaWYgdGhlcmUgd2lsbCBiZSBhIGhpc3RvcnkgdXBkYXRlXG4gICAgICBpZiAoaGlzdG9yeVVwZGF0ZS50eXBlKSB7XG4gICAgICAgIHNhdmVDdXJyZW50UGFnZVRvSGlzdG9yeSgpXG4gICAgICB9XG5cbiAgICAgIGlmIChoYXNIZWFkZXIoeGhyLCAvSFgtUmVzd2FwOi9pKSkge1xuICAgICAgICBzd2FwT3ZlcnJpZGUgPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVJlc3dhcCcpXG4gICAgICB9XG4gICAgICB2YXIgc3dhcFNwZWMgPSBnZXRTd2FwU3BlY2lmaWNhdGlvbihlbHQsIHN3YXBPdmVycmlkZSlcblxuICAgICAgaWYgKCFzd2FwU3BlYy5oYXNPd25Qcm9wZXJ0eSgnaWdub3JlVGl0bGUnKSkge1xuICAgICAgICBzd2FwU3BlYy5pZ25vcmVUaXRsZSA9IGlnbm9yZVRpdGxlXG4gICAgICB9XG5cbiAgICAgIHRhcmdldC5jbGFzc0xpc3QuYWRkKGh0bXguY29uZmlnLnN3YXBwaW5nQ2xhc3MpXG5cbiAgICAgIC8vIG9wdGlvbmFsIHRyYW5zaXRpb24gQVBJIHByb21pc2UgY2FsbGJhY2tzXG4gICAgICBsZXQgc2V0dGxlUmVzb2x2ZSA9IG51bGxcbiAgICAgIGxldCBzZXR0bGVSZWplY3QgPSBudWxsXG5cbiAgICAgIGlmIChyZXNwb25zZUluZm9TZWxlY3QpIHtcbiAgICAgICAgc2VsZWN0T3ZlcnJpZGUgPSByZXNwb25zZUluZm9TZWxlY3RcbiAgICAgIH1cblxuICAgICAgaWYgKGhhc0hlYWRlcih4aHIsIC9IWC1SZXNlbGVjdDovaSkpIHtcbiAgICAgICAgc2VsZWN0T3ZlcnJpZGUgPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVJlc2VsZWN0JylcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc2VsZWN0T09CID0gZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LXNlbGVjdC1vb2InKVxuICAgICAgY29uc3Qgc2VsZWN0ID0gZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LXNlbGVjdCcpXG5cbiAgICAgIGxldCBkb1N3YXAgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyBpZiB3ZSBuZWVkIHRvIHNhdmUgaGlzdG9yeSwgZG8gc28sIGJlZm9yZSBzd2FwcGluZyBzbyB0aGF0IHJlbGF0aXZlIHJlc291cmNlcyBoYXZlIHRoZSBjb3JyZWN0IGJhc2UgVVJMXG4gICAgICAgICAgaWYgKGhpc3RvcnlVcGRhdGUudHlwZSkge1xuICAgICAgICAgICAgdHJpZ2dlckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6YmVmb3JlSGlzdG9yeVVwZGF0ZScsIG1lcmdlT2JqZWN0cyh7IGhpc3Rvcnk6IGhpc3RvcnlVcGRhdGUgfSwgcmVzcG9uc2VJbmZvKSlcbiAgICAgICAgICAgIGlmIChoaXN0b3J5VXBkYXRlLnR5cGUgPT09ICdwdXNoJykge1xuICAgICAgICAgICAgICBwdXNoVXJsSW50b0hpc3RvcnkoaGlzdG9yeVVwZGF0ZS5wYXRoKVxuICAgICAgICAgICAgICB0cmlnZ2VyRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpwdXNoZWRJbnRvSGlzdG9yeScsIHsgcGF0aDogaGlzdG9yeVVwZGF0ZS5wYXRoIH0pXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByZXBsYWNlVXJsSW5IaXN0b3J5KGhpc3RvcnlVcGRhdGUucGF0aClcbiAgICAgICAgICAgICAgdHJpZ2dlckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6cmVwbGFjZWRJbkhpc3RvcnknLCB7IHBhdGg6IGhpc3RvcnlVcGRhdGUucGF0aCB9KVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHN3YXAodGFyZ2V0LCBzZXJ2ZXJSZXNwb25zZSwgc3dhcFNwZWMsIHtcbiAgICAgICAgICAgIHNlbGVjdDogc2VsZWN0T3ZlcnJpZGUgfHwgc2VsZWN0LFxuICAgICAgICAgICAgc2VsZWN0T09CLFxuICAgICAgICAgICAgZXZlbnRJbmZvOiByZXNwb25zZUluZm8sXG4gICAgICAgICAgICBhbmNob3I6IHJlc3BvbnNlSW5mby5wYXRoSW5mby5hbmNob3IsXG4gICAgICAgICAgICBjb250ZXh0RWxlbWVudDogZWx0LFxuICAgICAgICAgICAgYWZ0ZXJTd2FwQ2FsbGJhY2s6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICBpZiAoaGFzSGVhZGVyKHhociwgL0hYLVRyaWdnZXItQWZ0ZXItU3dhcDovaSkpIHtcbiAgICAgICAgICAgICAgICBsZXQgZmluYWxFbHQgPSBlbHRcbiAgICAgICAgICAgICAgICBpZiAoIWJvZHlDb250YWlucyhlbHQpKSB7XG4gICAgICAgICAgICAgICAgICBmaW5hbEVsdCA9IGdldERvY3VtZW50KCkuYm9keVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBoYW5kbGVUcmlnZ2VySGVhZGVyKHhociwgJ0hYLVRyaWdnZXItQWZ0ZXItU3dhcCcsIGZpbmFsRWx0KVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYWZ0ZXJTZXR0bGVDYWxsYmFjazogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgIGlmIChoYXNIZWFkZXIoeGhyLCAvSFgtVHJpZ2dlci1BZnRlci1TZXR0bGU6L2kpKSB7XG4gICAgICAgICAgICAgICAgbGV0IGZpbmFsRWx0ID0gZWx0XG4gICAgICAgICAgICAgICAgaWYgKCFib2R5Q29udGFpbnMoZWx0KSkge1xuICAgICAgICAgICAgICAgICAgZmluYWxFbHQgPSBnZXREb2N1bWVudCgpLmJvZHlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaGFuZGxlVHJpZ2dlckhlYWRlcih4aHIsICdIWC1UcmlnZ2VyLUFmdGVyLVNldHRsZScsIGZpbmFsRWx0KVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIG1heWJlQ2FsbChzZXR0bGVSZXNvbHZlKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OnN3YXBFcnJvcicsIHJlc3BvbnNlSW5mbylcbiAgICAgICAgICBtYXliZUNhbGwoc2V0dGxlUmVqZWN0KVxuICAgICAgICAgIHRocm93IGVcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBsZXQgc2hvdWxkVHJhbnNpdGlvbiA9IGh0bXguY29uZmlnLmdsb2JhbFZpZXdUcmFuc2l0aW9uc1xuICAgICAgaWYgKHN3YXBTcGVjLmhhc093blByb3BlcnR5KCd0cmFuc2l0aW9uJykpIHtcbiAgICAgICAgc2hvdWxkVHJhbnNpdGlvbiA9IHN3YXBTcGVjLnRyYW5zaXRpb25cbiAgICAgIH1cblxuICAgICAgaWYgKHNob3VsZFRyYW5zaXRpb24gJiZcbiAgICAgICAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6YmVmb3JlVHJhbnNpdGlvbicsIHJlc3BvbnNlSW5mbykgJiZcbiAgICAgICAgICAgICAgdHlwZW9mIFByb21pc2UgIT09ICd1bmRlZmluZWQnICYmXG4gICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmUgZXhwZXJpbWVudGFsIGZlYXR1cmUgYXRtXG4gICAgICAgICAgICAgIGRvY3VtZW50LnN0YXJ0Vmlld1RyYW5zaXRpb24pIHtcbiAgICAgICAgY29uc3Qgc2V0dGxlUHJvbWlzZSA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uKF9yZXNvbHZlLCBfcmVqZWN0KSB7XG4gICAgICAgICAgc2V0dGxlUmVzb2x2ZSA9IF9yZXNvbHZlXG4gICAgICAgICAgc2V0dGxlUmVqZWN0ID0gX3JlamVjdFxuICAgICAgICB9KVxuICAgICAgICAvLyB3cmFwIHRoZSBvcmlnaW5hbCBkb1N3YXAoKSBpbiBhIGNhbGwgdG8gc3RhcnRWaWV3VHJhbnNpdGlvbigpXG4gICAgICAgIGNvbnN0IGlubmVyRG9Td2FwID0gZG9Td2FwXG4gICAgICAgIGRvU3dhcCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIC8vIEB0cy1pZ25vcmUgZXhwZXJpbWVudGFsIGZlYXR1cmUgYXRtXG4gICAgICAgICAgZG9jdW1lbnQuc3RhcnRWaWV3VHJhbnNpdGlvbihmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGlubmVyRG9Td2FwKClcbiAgICAgICAgICAgIHJldHVybiBzZXR0bGVQcm9taXNlXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoc3dhcFNwZWMuc3dhcERlbGF5ID4gMCkge1xuICAgICAgICBnZXRXaW5kb3coKS5zZXRUaW1lb3V0KGRvU3dhcCwgc3dhcFNwZWMuc3dhcERlbGF5KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZG9Td2FwKClcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGlzRXJyb3IpIHtcbiAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6cmVzcG9uc2VFcnJvcicsIG1lcmdlT2JqZWN0cyh7IGVycm9yOiAnUmVzcG9uc2UgU3RhdHVzIEVycm9yIENvZGUgJyArIHhoci5zdGF0dXMgKyAnIGZyb20gJyArIHJlc3BvbnNlSW5mby5wYXRoSW5mby5yZXF1ZXN0UGF0aCB9LCByZXNwb25zZUluZm8pKVxuICAgIH1cbiAgfVxuXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEV4dGVuc2lvbnMgQVBJXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqIEB0eXBlIHtPYmplY3Q8c3RyaW5nLCBIdG14RXh0ZW5zaW9uPn0gKi9cbiAgY29uc3QgZXh0ZW5zaW9ucyA9IHt9XG5cbiAgLyoqXG4gICAqIGV4dGVuc2lvbkJhc2UgZGVmaW5lcyB0aGUgZGVmYXVsdCBmdW5jdGlvbnMgZm9yIGFsbCBleHRlbnNpb25zLlxuICAgKiBAcmV0dXJucyB7SHRteEV4dGVuc2lvbn1cbiAgICovXG4gIGZ1bmN0aW9uIGV4dGVuc2lvbkJhc2UoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGluaXQ6IGZ1bmN0aW9uKGFwaSkgeyByZXR1cm4gbnVsbCB9LFxuICAgICAgZ2V0U2VsZWN0b3JzOiBmdW5jdGlvbigpIHsgcmV0dXJuIG51bGwgfSxcbiAgICAgIG9uRXZlbnQ6IGZ1bmN0aW9uKG5hbWUsIGV2dCkgeyByZXR1cm4gdHJ1ZSB9LFxuICAgICAgdHJhbnNmb3JtUmVzcG9uc2U6IGZ1bmN0aW9uKHRleHQsIHhociwgZWx0KSB7IHJldHVybiB0ZXh0IH0sXG4gICAgICBpc0lubGluZVN3YXA6IGZ1bmN0aW9uKHN3YXBTdHlsZSkgeyByZXR1cm4gZmFsc2UgfSxcbiAgICAgIGhhbmRsZVN3YXA6IGZ1bmN0aW9uKHN3YXBTdHlsZSwgdGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbykgeyByZXR1cm4gZmFsc2UgfSxcbiAgICAgIGVuY29kZVBhcmFtZXRlcnM6IGZ1bmN0aW9uKHhociwgcGFyYW1ldGVycywgZWx0KSB7IHJldHVybiBudWxsIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogZGVmaW5lRXh0ZW5zaW9uIGluaXRpYWxpemVzIHRoZSBleHRlbnNpb24gYW5kIGFkZHMgaXQgdG8gdGhlIGh0bXggcmVnaXN0cnlcbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jZGVmaW5lRXh0ZW5zaW9uXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIHRoZSBleHRlbnNpb24gbmFtZVxuICAgKiBAcGFyYW0ge0h0bXhFeHRlbnNpb259IGV4dGVuc2lvbiB0aGUgZXh0ZW5zaW9uIGRlZmluaXRpb25cbiAgICovXG4gIGZ1bmN0aW9uIGRlZmluZUV4dGVuc2lvbihuYW1lLCBleHRlbnNpb24pIHtcbiAgICBpZiAoZXh0ZW5zaW9uLmluaXQpIHtcbiAgICAgIGV4dGVuc2lvbi5pbml0KGludGVybmFsQVBJKVxuICAgIH1cbiAgICBleHRlbnNpb25zW25hbWVdID0gbWVyZ2VPYmplY3RzKGV4dGVuc2lvbkJhc2UoKSwgZXh0ZW5zaW9uKVxuICB9XG5cbiAgLyoqXG4gICAqIHJlbW92ZUV4dGVuc2lvbiByZW1vdmVzIGFuIGV4dGVuc2lvbiBmcm9tIHRoZSBodG14IHJlZ2lzdHJ5XG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI3JlbW92ZUV4dGVuc2lvblxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgKi9cbiAgZnVuY3Rpb24gcmVtb3ZlRXh0ZW5zaW9uKG5hbWUpIHtcbiAgICBkZWxldGUgZXh0ZW5zaW9uc1tuYW1lXVxuICB9XG5cbiAgLyoqXG4gICAqIGdldEV4dGVuc2lvbnMgc2VhcmNoZXMgdXAgdGhlIERPTSB0cmVlIHRvIHJldHVybiBhbGwgZXh0ZW5zaW9ucyB0aGF0IGNhbiBiZSBhcHBsaWVkIHRvIGEgZ2l2ZW4gZWxlbWVudFxuICAgKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge0h0bXhFeHRlbnNpb25bXT19IGV4dGVuc2lvbnNUb1JldHVyblxuICAgKiBAcGFyYW0ge3N0cmluZ1tdPX0gZXh0ZW5zaW9uc1RvSWdub3JlXG4gICAqIEByZXR1cm5zIHtIdG14RXh0ZW5zaW9uW119XG4gICAqL1xuICBmdW5jdGlvbiBnZXRFeHRlbnNpb25zKGVsdCwgZXh0ZW5zaW9uc1RvUmV0dXJuLCBleHRlbnNpb25zVG9JZ25vcmUpIHtcbiAgICBpZiAoZXh0ZW5zaW9uc1RvUmV0dXJuID09IHVuZGVmaW5lZCkge1xuICAgICAgZXh0ZW5zaW9uc1RvUmV0dXJuID0gW11cbiAgICB9XG4gICAgaWYgKGVsdCA9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBleHRlbnNpb25zVG9SZXR1cm5cbiAgICB9XG4gICAgaWYgKGV4dGVuc2lvbnNUb0lnbm9yZSA9PSB1bmRlZmluZWQpIHtcbiAgICAgIGV4dGVuc2lvbnNUb0lnbm9yZSA9IFtdXG4gICAgfVxuICAgIGNvbnN0IGV4dGVuc2lvbnNGb3JFbGVtZW50ID0gZ2V0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtZXh0JylcbiAgICBpZiAoZXh0ZW5zaW9uc0ZvckVsZW1lbnQpIHtcbiAgICAgIGZvckVhY2goZXh0ZW5zaW9uc0ZvckVsZW1lbnQuc3BsaXQoJywnKSwgZnVuY3Rpb24oZXh0ZW5zaW9uTmFtZSkge1xuICAgICAgICBleHRlbnNpb25OYW1lID0gZXh0ZW5zaW9uTmFtZS5yZXBsYWNlKC8gL2csICcnKVxuICAgICAgICBpZiAoZXh0ZW5zaW9uTmFtZS5zbGljZSgwLCA3KSA9PSAnaWdub3JlOicpIHtcbiAgICAgICAgICBleHRlbnNpb25zVG9JZ25vcmUucHVzaChleHRlbnNpb25OYW1lLnNsaWNlKDcpKVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIGlmIChleHRlbnNpb25zVG9JZ25vcmUuaW5kZXhPZihleHRlbnNpb25OYW1lKSA8IDApIHtcbiAgICAgICAgICBjb25zdCBleHRlbnNpb24gPSBleHRlbnNpb25zW2V4dGVuc2lvbk5hbWVdXG4gICAgICAgICAgaWYgKGV4dGVuc2lvbiAmJiBleHRlbnNpb25zVG9SZXR1cm4uaW5kZXhPZihleHRlbnNpb24pIDwgMCkge1xuICAgICAgICAgICAgZXh0ZW5zaW9uc1RvUmV0dXJuLnB1c2goZXh0ZW5zaW9uKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9XG4gICAgcmV0dXJuIGdldEV4dGVuc2lvbnMoYXNFbGVtZW50KHBhcmVudEVsdChlbHQpKSwgZXh0ZW5zaW9uc1RvUmV0dXJuLCBleHRlbnNpb25zVG9JZ25vcmUpXG4gIH1cblxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBJbml0aWFsaXphdGlvblxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgaXNSZWFkeSA9IGZhbHNlXG4gIGdldERvY3VtZW50KCkuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsIGZ1bmN0aW9uKCkge1xuICAgIGlzUmVhZHkgPSB0cnVlXG4gIH0pXG5cbiAgLyoqXG4gICAqIEV4ZWN1dGUgYSBmdW5jdGlvbiBub3cgaWYgRE9NQ29udGVudExvYWRlZCBoYXMgZmlyZWQsIG90aGVyd2lzZSBsaXN0ZW4gZm9yIGl0LlxuICAgKlxuICAgKiBUaGlzIGZ1bmN0aW9uIHVzZXMgaXNSZWFkeSBiZWNhdXNlIHRoZXJlIGlzIG5vIHJlbGlhYmxlIHdheSB0byBhc2sgdGhlIGJyb3dzZXIgd2hldGhlclxuICAgKiB0aGUgRE9NQ29udGVudExvYWRlZCBldmVudCBoYXMgYWxyZWFkeSBiZWVuIGZpcmVkOyB0aGVyZSdzIGEgZ2FwIGJldHdlZW4gRE9NQ29udGVudExvYWRlZFxuICAgKiBmaXJpbmcgYW5kIHJlYWR5c3RhdGU9Y29tcGxldGUuXG4gICAqL1xuICBmdW5jdGlvbiByZWFkeShmbikge1xuICAgIC8vIENoZWNraW5nIHJlYWR5U3RhdGUgaGVyZSBpcyBhIGZhaWxzYWZlIGluIGNhc2UgdGhlIGh0bXggc2NyaXB0IHRhZyBlbnRlcmVkIHRoZSBET00gYnlcbiAgICAvLyBzb21lIG1lYW5zIG90aGVyIHRoYW4gdGhlIGluaXRpYWwgcGFnZSBsb2FkLlxuICAgIGlmIChpc1JlYWR5IHx8IGdldERvY3VtZW50KCkucmVhZHlTdGF0ZSA9PT0gJ2NvbXBsZXRlJykge1xuICAgICAgZm4oKVxuICAgIH0gZWxzZSB7XG4gICAgICBnZXREb2N1bWVudCgpLmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCBmbilcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBpbnNlcnRJbmRpY2F0b3JTdHlsZXMoKSB7XG4gICAgaWYgKGh0bXguY29uZmlnLmluY2x1ZGVJbmRpY2F0b3JTdHlsZXMgIT09IGZhbHNlKSB7XG4gICAgICBjb25zdCBub25jZUF0dHJpYnV0ZSA9IGh0bXguY29uZmlnLmlubGluZVN0eWxlTm9uY2UgPyBgIG5vbmNlPVwiJHtodG14LmNvbmZpZy5pbmxpbmVTdHlsZU5vbmNlfVwiYCA6ICcnXG4gICAgICBnZXREb2N1bWVudCgpLmhlYWQuaW5zZXJ0QWRqYWNlbnRIVE1MKCdiZWZvcmVlbmQnLFxuICAgICAgICAnPHN0eWxlJyArIG5vbmNlQXR0cmlidXRlICsgJz5cXFxuICAgICAgLicgKyBodG14LmNvbmZpZy5pbmRpY2F0b3JDbGFzcyArICd7b3BhY2l0eTowfVxcXG4gICAgICAuJyArIGh0bXguY29uZmlnLnJlcXVlc3RDbGFzcyArICcgLicgKyBodG14LmNvbmZpZy5pbmRpY2F0b3JDbGFzcyArICd7b3BhY2l0eToxOyB0cmFuc2l0aW9uOiBvcGFjaXR5IDIwMG1zIGVhc2UtaW47fVxcXG4gICAgICAuJyArIGh0bXguY29uZmlnLnJlcXVlc3RDbGFzcyArICcuJyArIGh0bXguY29uZmlnLmluZGljYXRvckNsYXNzICsgJ3tvcGFjaXR5OjE7IHRyYW5zaXRpb246IG9wYWNpdHkgMjAwbXMgZWFzZS1pbjt9XFxcbiAgICAgIDwvc3R5bGU+JylcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBnZXRNZXRhQ29uZmlnKCkge1xuICAgIC8qKiBAdHlwZSBIVE1MTWV0YUVsZW1lbnQgKi9cbiAgICBjb25zdCBlbGVtZW50ID0gZ2V0RG9jdW1lbnQoKS5xdWVyeVNlbGVjdG9yKCdtZXRhW25hbWU9XCJodG14LWNvbmZpZ1wiXScpXG4gICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgIHJldHVybiBwYXJzZUpTT04oZWxlbWVudC5jb250ZW50KVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIG1lcmdlTWV0YUNvbmZpZygpIHtcbiAgICBjb25zdCBtZXRhQ29uZmlnID0gZ2V0TWV0YUNvbmZpZygpXG4gICAgaWYgKG1ldGFDb25maWcpIHtcbiAgICAgIGh0bXguY29uZmlnID0gbWVyZ2VPYmplY3RzKGh0bXguY29uZmlnLCBtZXRhQ29uZmlnKVxuICAgIH1cbiAgfVxuXG4gIC8vIGluaXRpYWxpemUgdGhlIGRvY3VtZW50XG4gIHJlYWR5KGZ1bmN0aW9uKCkge1xuICAgIG1lcmdlTWV0YUNvbmZpZygpXG4gICAgaW5zZXJ0SW5kaWNhdG9yU3R5bGVzKClcbiAgICBsZXQgYm9keSA9IGdldERvY3VtZW50KCkuYm9keVxuICAgIHByb2Nlc3NOb2RlKGJvZHkpXG4gICAgY29uc3QgcmVzdG9yZWRFbHRzID0gZ2V0RG9jdW1lbnQoKS5xdWVyeVNlbGVjdG9yQWxsKFxuICAgICAgXCJbaHgtdHJpZ2dlcj0ncmVzdG9yZWQnXSxbZGF0YS1oeC10cmlnZ2VyPSdyZXN0b3JlZCddXCJcbiAgICApXG4gICAgYm9keS5hZGRFdmVudExpc3RlbmVyKCdodG14OmFib3J0JywgZnVuY3Rpb24oZXZ0KSB7XG4gICAgICBjb25zdCB0YXJnZXQgPSBldnQudGFyZ2V0XG4gICAgICBjb25zdCBpbnRlcm5hbERhdGEgPSBnZXRJbnRlcm5hbERhdGEodGFyZ2V0KVxuICAgICAgaWYgKGludGVybmFsRGF0YSAmJiBpbnRlcm5hbERhdGEueGhyKSB7XG4gICAgICAgIGludGVybmFsRGF0YS54aHIuYWJvcnQoKVxuICAgICAgfVxuICAgIH0pXG4gICAgLyoqIEB0eXBlIHsoZXY6IFBvcFN0YXRlRXZlbnQpID0+IGFueX0gKi9cbiAgICBjb25zdCBvcmlnaW5hbFBvcHN0YXRlID0gd2luZG93Lm9ucG9wc3RhdGUgPyB3aW5kb3cub25wb3BzdGF0ZS5iaW5kKHdpbmRvdykgOiBudWxsXG4gICAgLyoqIEB0eXBlIHsoZXY6IFBvcFN0YXRlRXZlbnQpID0+IGFueX0gKi9cbiAgICB3aW5kb3cub25wb3BzdGF0ZSA9IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICBpZiAoZXZlbnQuc3RhdGUgJiYgZXZlbnQuc3RhdGUuaHRteCkge1xuICAgICAgICByZXN0b3JlSGlzdG9yeSgpXG4gICAgICAgIGZvckVhY2gocmVzdG9yZWRFbHRzLCBmdW5jdGlvbihlbHQpIHtcbiAgICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDpyZXN0b3JlZCcsIHtcbiAgICAgICAgICAgIGRvY3VtZW50OiBnZXREb2N1bWVudCgpLFxuICAgICAgICAgICAgdHJpZ2dlckV2ZW50XG4gICAgICAgICAgfSlcbiAgICAgICAgfSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChvcmlnaW5hbFBvcHN0YXRlKSB7XG4gICAgICAgICAgb3JpZ2luYWxQb3BzdGF0ZShldmVudClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBnZXRXaW5kb3coKS5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgdHJpZ2dlckV2ZW50KGJvZHksICdodG14OmxvYWQnLCB7fSkgLy8gZ2l2ZSByZWFkeSBoYW5kbGVycyBhIGNoYW5jZSB0byBsb2FkIHVwIGJlZm9yZSBmaXJpbmcgdGhpcyBldmVudFxuICAgICAgYm9keSA9IG51bGwgLy8ga2lsbCByZWZlcmVuY2UgZm9yIGdjXG4gICAgfSwgMClcbiAgfSlcblxuICByZXR1cm4gaHRteFxufSkoKVxuXG4vKiogQHR5cGVkZWYgeydnZXQnfCdoZWFkJ3wncG9zdCd8J3B1dCd8J2RlbGV0ZSd8J2Nvbm5lY3QnfCdvcHRpb25zJ3wndHJhY2UnfCdwYXRjaCd9IEh0dHBWZXJiICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gU3dhcE9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbc2VsZWN0XVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtzZWxlY3RPT0JdXG4gKiBAcHJvcGVydHkgeyp9IFtldmVudEluZm9dXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2FuY2hvcl1cbiAqIEBwcm9wZXJ0eSB7RWxlbWVudH0gW2NvbnRleHRFbGVtZW50XVxuICogQHByb3BlcnR5IHtzd2FwQ2FsbGJhY2t9IFthZnRlclN3YXBDYWxsYmFja11cbiAqIEBwcm9wZXJ0eSB7c3dhcENhbGxiYWNrfSBbYWZ0ZXJTZXR0bGVDYWxsYmFja11cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBzd2FwQ2FsbGJhY2tcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHsnaW5uZXJIVE1MJyB8ICdvdXRlckhUTUwnIHwgJ2JlZm9yZWJlZ2luJyB8ICdhZnRlcmJlZ2luJyB8ICdiZWZvcmVlbmQnIHwgJ2FmdGVyZW5kJyB8ICdkZWxldGUnIHwgJ25vbmUnIHwgc3RyaW5nfSBIdG14U3dhcFN0eWxlXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBIdG14U3dhcFNwZWNpZmljYXRpb25cbiAqIEBwcm9wZXJ0eSB7SHRteFN3YXBTdHlsZX0gc3dhcFN0eWxlXG4gKiBAcHJvcGVydHkge251bWJlcn0gc3dhcERlbGF5XG4gKiBAcHJvcGVydHkge251bWJlcn0gc2V0dGxlRGVsYXlcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW3RyYW5zaXRpb25dXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtpZ25vcmVUaXRsZV1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbaGVhZF1cbiAqIEBwcm9wZXJ0eSB7J3RvcCcgfCAnYm90dG9tJ30gW3Njcm9sbF1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbc2Nyb2xsVGFyZ2V0XVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtzaG93XVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtzaG93VGFyZ2V0XVxuICogQHByb3BlcnR5IHtib29sZWFufSBbZm9jdXNTY3JvbGxdXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7KCh0aGlzOk5vZGUsIGV2dDpFdmVudCkgPT4gYm9vbGVhbikgJiB7c291cmNlOiBzdHJpbmd9fSBDb25kaXRpb25hbEZ1bmN0aW9uXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBIdG14VHJpZ2dlclNwZWNpZmljYXRpb25cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB0cmlnZ2VyXG4gKiBAcHJvcGVydHkge251bWJlcn0gW3BvbGxJbnRlcnZhbF1cbiAqIEBwcm9wZXJ0eSB7Q29uZGl0aW9uYWxGdW5jdGlvbn0gW2V2ZW50RmlsdGVyXVxuICogQHByb3BlcnR5IHtib29sZWFufSBbY2hhbmdlZF1cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW29uY2VdXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtjb25zdW1lXVxuICogQHByb3BlcnR5IHtudW1iZXJ9IFtkZWxheV1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbZnJvbV1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbdGFyZ2V0XVxuICogQHByb3BlcnR5IHtudW1iZXJ9IFt0aHJvdHRsZV1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbcXVldWVdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3Jvb3RdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3RocmVzaG9sZF1cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHt7ZWx0OiBFbGVtZW50LCBtZXNzYWdlOiBzdHJpbmcsIHZhbGlkaXR5OiBWYWxpZGl0eVN0YXRlfX0gSHRteEVsZW1lbnRWYWxpZGF0aW9uRXJyb3JcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+fSBIdG14SGVhZGVyU3BlY2lmaWNhdGlvblxuICogQHByb3BlcnR5IHsndHJ1ZSd9IEhYLVJlcXVlc3RcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfG51bGx9IEhYLVRyaWdnZXJcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfG51bGx9IEhYLVRyaWdnZXItTmFtZVxuICogQHByb3BlcnR5IHtzdHJpbmd8bnVsbH0gSFgtVGFyZ2V0XG4gKiBAcHJvcGVydHkge3N0cmluZ30gSFgtQ3VycmVudC1VUkxcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbSFgtUHJvbXB0XVxuICogQHByb3BlcnR5IHsndHJ1ZSd9IFtIWC1Cb29zdGVkXVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtDb250ZW50LVR5cGVdXG4gKiBAcHJvcGVydHkgeyd0cnVlJ30gW0hYLUhpc3RvcnktUmVzdG9yZS1SZXF1ZXN0XVxuICovXG5cbi8qKiBAdHlwZWRlZiBIdG14QWpheEhlbHBlckNvbnRleHRcbiAqIEBwcm9wZXJ0eSB7RWxlbWVudHxzdHJpbmd9IFtzb3VyY2VdXG4gKiBAcHJvcGVydHkge0V2ZW50fSBbZXZlbnRdXG4gKiBAcHJvcGVydHkge0h0bXhBamF4SGFuZGxlcn0gW2hhbmRsZXJdXG4gKiBAcHJvcGVydHkge0VsZW1lbnR8c3RyaW5nfSBbdGFyZ2V0XVxuICogQHByb3BlcnR5IHtIdG14U3dhcFN0eWxlfSBbc3dhcF1cbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fEZvcm1EYXRhfSBbdmFsdWVzXVxuICogQHByb3BlcnR5IHtSZWNvcmQ8c3RyaW5nLHN0cmluZz59IFtoZWFkZXJzXVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtzZWxlY3RdXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBIdG14UmVxdWVzdENvbmZpZ1xuICogQHByb3BlcnR5IHtib29sZWFufSBib29zdGVkXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHVzZVVybFBhcmFtc1xuICogQHByb3BlcnR5IHtGb3JtRGF0YX0gZm9ybURhdGFcbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBwYXJhbWV0ZXJzIGZvcm1EYXRhIHByb3h5XG4gKiBAcHJvcGVydHkge0Zvcm1EYXRhfSB1bmZpbHRlcmVkRm9ybURhdGFcbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSB1bmZpbHRlcmVkUGFyYW1ldGVycyB1bmZpbHRlcmVkRm9ybURhdGEgcHJveHlcbiAqIEBwcm9wZXJ0eSB7SHRteEhlYWRlclNwZWNpZmljYXRpb259IGhlYWRlcnNcbiAqIEBwcm9wZXJ0eSB7RWxlbWVudH0gdGFyZ2V0XG4gKiBAcHJvcGVydHkge0h0dHBWZXJifSB2ZXJiXG4gKiBAcHJvcGVydHkge0h0bXhFbGVtZW50VmFsaWRhdGlvbkVycm9yW119IGVycm9yc1xuICogQHByb3BlcnR5IHtib29sZWFufSB3aXRoQ3JlZGVudGlhbHNcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSB0aW1lb3V0XG4gKiBAcHJvcGVydHkge3N0cmluZ30gcGF0aFxuICogQHByb3BlcnR5IHtFdmVudH0gdHJpZ2dlcmluZ0V2ZW50XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBIdG14UmVzcG9uc2VJbmZvXG4gKiBAcHJvcGVydHkge1hNTEh0dHBSZXF1ZXN0fSB4aHJcbiAqIEBwcm9wZXJ0eSB7RWxlbWVudH0gdGFyZ2V0XG4gKiBAcHJvcGVydHkge0h0bXhSZXF1ZXN0Q29uZmlnfSByZXF1ZXN0Q29uZmlnXG4gKiBAcHJvcGVydHkge0h0bXhBamF4RXRjfSBldGNcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gYm9vc3RlZFxuICogQHByb3BlcnR5IHtzdHJpbmd9IHNlbGVjdFxuICogQHByb3BlcnR5IHt7cmVxdWVzdFBhdGg6IHN0cmluZywgZmluYWxSZXF1ZXN0UGF0aDogc3RyaW5nLCByZXNwb25zZVBhdGg6IHN0cmluZ3xudWxsLCBhbmNob3I6IHN0cmluZ319IHBhdGhJbmZvXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtmYWlsZWRdXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtzdWNjZXNzZnVsXVxuICogQHByb3BlcnR5IHtib29sZWFufSBba2VlcEluZGljYXRvcnNdXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBIdG14QWpheEV0Y1xuICogQHByb3BlcnR5IHtib29sZWFufSBbcmV0dXJuUHJvbWlzZV1cbiAqIEBwcm9wZXJ0eSB7SHRteEFqYXhIYW5kbGVyfSBbaGFuZGxlcl1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbc2VsZWN0XVxuICogQHByb3BlcnR5IHtFbGVtZW50fSBbdGFyZ2V0T3ZlcnJpZGVdXG4gKiBAcHJvcGVydHkge0h0bXhTd2FwU3R5bGV9IFtzd2FwT3ZlcnJpZGVdXG4gKiBAcHJvcGVydHkge1JlY29yZDxzdHJpbmcsc3RyaW5nPn0gW2hlYWRlcnNdXG4gKiBAcHJvcGVydHkge09iamVjdHxGb3JtRGF0YX0gW3ZhbHVlc11cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2NyZWRlbnRpYWxzXVxuICogQHByb3BlcnR5IHtudW1iZXJ9IFt0aW1lb3V0XVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gSHRteFJlc3BvbnNlSGFuZGxpbmdDb25maWdcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbY29kZV1cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gc3dhcFxuICogQHByb3BlcnR5IHtib29sZWFufSBbZXJyb3JdXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtpZ25vcmVUaXRsZV1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbc2VsZWN0XVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFt0YXJnZXRdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3N3YXBPdmVycmlkZV1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbZXZlbnRdXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7SHRteFJlc3BvbnNlSW5mbyAmIHtzaG91bGRTd2FwOiBib29sZWFuLCBzZXJ2ZXJSZXNwb25zZTogYW55LCBpc0Vycm9yOiBib29sZWFuLCBpZ25vcmVUaXRsZTogYm9vbGVhbiwgc2VsZWN0T3ZlcnJpZGU6c3RyaW5nfX0gSHRteEJlZm9yZVN3YXBEZXRhaWxzXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgSHRteEFqYXhIYW5kbGVyXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICogQHBhcmFtIHtIdG14UmVzcG9uc2VJbmZvfSByZXNwb25zZUluZm9cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHsoKCkgPT4gdm9pZCl9IEh0bXhTZXR0bGVUYXNrXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBIdG14U2V0dGxlSW5mb1xuICogQHByb3BlcnR5IHtIdG14U2V0dGxlVGFza1tdfSB0YXNrc1xuICogQHByb3BlcnR5IHtFbGVtZW50W119IGVsdHNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbdGl0bGVdXG4gKi9cblxuLyoqXG4gKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9iaWdza3lzb2Z0d2FyZS9odG14LWV4dGVuc2lvbnMvYmxvYi9tYWluL1JFQURNRS5tZFxuICogQHR5cGVkZWYge09iamVjdH0gSHRteEV4dGVuc2lvblxuICogQHByb3BlcnR5IHsoYXBpOiBhbnkpID0+IHZvaWR9IGluaXRcbiAqIEBwcm9wZXJ0eSB7KG5hbWU6IHN0cmluZywgZXZlbnQ6IEV2ZW50fEN1c3RvbUV2ZW50KSA9PiBib29sZWFufSBvbkV2ZW50XG4gKiBAcHJvcGVydHkgeyh0ZXh0OiBzdHJpbmcsIHhocjogWE1MSHR0cFJlcXVlc3QsIGVsdDogRWxlbWVudCkgPT4gc3RyaW5nfSB0cmFuc2Zvcm1SZXNwb25zZVxuICogQHByb3BlcnR5IHsoc3dhcFN0eWxlOiBIdG14U3dhcFN0eWxlKSA9PiBib29sZWFufSBpc0lubGluZVN3YXBcbiAqIEBwcm9wZXJ0eSB7KHN3YXBTdHlsZTogSHRteFN3YXBTdHlsZSwgdGFyZ2V0OiBOb2RlLCBmcmFnbWVudDogTm9kZSwgc2V0dGxlSW5mbzogSHRteFNldHRsZUluZm8pID0+IGJvb2xlYW58Tm9kZVtdfSBoYW5kbGVTd2FwXG4gKiBAcHJvcGVydHkgeyh4aHI6IFhNTEh0dHBSZXF1ZXN0LCBwYXJhbWV0ZXJzOiBGb3JtRGF0YSwgZWx0OiBOb2RlKSA9PiAqfHN0cmluZ3xudWxsfSBlbmNvZGVQYXJhbWV0ZXJzXG4gKiBAcHJvcGVydHkgeygpID0+IHN0cmluZ1tdfG51bGx9IGdldFNlbGVjdG9yc1xuICovXG5leHBvcnQgZGVmYXVsdCBodG14XG4iLCJpbXBvcnQgaHRteCBmcm9tIFwiaHRteC5vcmdcIjtcblxuZnVuY3Rpb24gZGVwZW5kc09uKHBhdGhTcGVjOiBhbnksIHVybDogc3RyaW5nKSB7XG4gIGlmIChwYXRoU3BlYyA9PT0gXCJpZ25vcmVcIikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBjb25zdCBkZXBlbmRlbmN5UGF0aCA9IHBhdGhTcGVjLnNwbGl0KFwiL1wiKTtcbiAgY29uc3QgdXJsUGF0aCA9IHVybC5zcGxpdChcIi9cIik7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgdXJsUGF0aC5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGRlcGVuZGVuY3lFbGVtZW50ID0gZGVwZW5kZW5jeVBhdGguc2hpZnQoKTtcbiAgICBjb25zdCBwYXRoRWxlbWVudCA9IHVybFBhdGhbaV07XG4gICAgaWYgKGRlcGVuZGVuY3lFbGVtZW50ICE9PSBwYXRoRWxlbWVudCAmJiBkZXBlbmRlbmN5RWxlbWVudCAhPT0gXCIqXCIpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgZGVwZW5kZW5jeVBhdGgubGVuZ3RoID09PSAwIHx8XG4gICAgICAoZGVwZW5kZW5jeVBhdGgubGVuZ3RoID09PSAxICYmIGRlcGVuZGVuY3lQYXRoWzBdID09PSBcIlwiKVxuICAgICkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gcmVmcmVzaFBhdGgocGF0aDogc3RyaW5nKSB7XG4gIGNvbnN0IGVsdHNXaXRoRGVwcyA9IGh0bXguZmluZEFsbChcIltwYXRoLWRlcHNdXCIpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGVsdHNXaXRoRGVwcy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGVsdCA9IGVsdHNXaXRoRGVwc1tpXTtcbiAgICBpZiAoZGVwZW5kc09uKGVsdC5nZXRBdHRyaWJ1dGUoXCJwYXRoLWRlcHNcIiksIHBhdGgpKSB7XG4gICAgICBodG14LnRyaWdnZXIoZWx0LCBcInBhdGgtZGVwc1wiLCBudWxsKTtcbiAgICB9XG4gIH1cbn1cblxuaHRteC5kZWZpbmVFeHRlbnNpb24oXCJwYXRoLWRlcHNcIiwge1xuICAvLyBAdHMtaWdub3JlXG4gIG9uRXZlbnQ6IGZ1bmN0aW9uIChuYW1lLCBldnQpIHtcbiAgICBpZiAoIShldnQgaW5zdGFuY2VvZiBDdXN0b21FdmVudCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKG5hbWUgPT09IFwiaHRteDpiZWZvcmVPbkxvYWRcIikge1xuICAgICAgY29uc3QgY29uZmlnID0gZXZ0LmRldGFpbC5yZXF1ZXN0Q29uZmlnO1xuICAgICAgLy8gbXV0YXRpbmcgY2FsbFxuICAgICAgaWYgKFxuICAgICAgICBjb25maWcgJiZcbiAgICAgICAgY29uZmlnLnZlcmIgIT09IFwiZ2V0XCIgJiZcbiAgICAgICAgZXZ0LnRhcmdldCAhPSBudWxsICYmXG4gICAgICAgIGV2dC50YXJnZXQgaW5zdGFuY2VvZiBFbGVtZW50ICYmXG4gICAgICAgIGV2dC50YXJnZXQuZ2V0QXR0cmlidXRlKFwicGF0aC1kZXBzXCIpICE9PSBcImlnbm9yZVwiXG4gICAgICApIHtcbiAgICAgICAgcmVmcmVzaFBhdGgoY29uZmlnLnBhdGgpO1xuICAgICAgfVxuICAgIH1cbiAgfSxcbn0pO1xuIiwiaW1wb3J0IGh0bXggZnJvbSBcImh0bXgub3JnXCI7XG5cbmZ1bmN0aW9uIGtlYmFiRXZlbnROYW1lKHN0cjogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHN0ci5yZXBsYWNlKC8oW2EtejAtOV0pKFtBLVpdKS9nLCAnJDEtJDInKS50b0xvd2VyQ2FzZSgpXG59XG5cbmNvbnN0IGlnbm9yZWRFdmVudHMgPSBbJ2h0bXg6YmVmb3JlUHJvY2Vzc05vZGUnLCAnaHRteDphZnRlclByb2Nlc3NOb2RlJywgJ2h0bXg6Y29uZmlnUmVxdWVzdCcsICdodG14OmNvbmZpZ1Jlc3BvbnNlJywgJ2h0bXg6cmVzcG9uc2VFcnJvciddO1xuXG5mdW5jdGlvbiBtYWtlRXZlbnQoZXZlbnROYW1lOiBzdHJpbmcsIGRldGFpbDogYW55KSB7XG4gICAgbGV0IGV2dFxuICAgIGlmICh3aW5kb3cuQ3VzdG9tRXZlbnQgJiYgdHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAvLyBUT0RPOiBgY29tcG9zZWQ6IHRydWVgIGhlcmUgaXMgYSBoYWNrIHRvIG1ha2UgZ2xvYmFsIGV2ZW50IGhhbmRsZXJzIHdvcmsgd2l0aCBldmVudHMgaW4gc2hhZG93IERPTVxuICAgICAgICBldnQgPSBuZXcgQ3VzdG9tRXZlbnQoZXZlbnROYW1lLCB7IGJ1YmJsZXM6IGZhbHNlLCBjYW5jZWxhYmxlOiB0cnVlLCBjb21wb3NlZDogdHJ1ZSwgZGV0YWlsIH0pXG4gICAgfSBlbHNlIHtcbiAgICAgICAgZXZ0ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0N1c3RvbUV2ZW50JylcbiAgICAgICAgZXZ0LmluaXRDdXN0b21FdmVudChldmVudE5hbWUsIHRydWUsIHRydWUsIGRldGFpbClcbiAgICB9XG4gICAgcmV0dXJuIGV2dFxufVxuXG5mdW5jdGlvbiB0cmlnZ2VyQ2hpbGRyZW4odGFyZ2V0OiBIVE1MRWxlbWVudCwgbmFtZTogc3RyaW5nLCBldmVudDogQ3VzdG9tRXZlbnQsIHRyaWdnZXJlZDogU2V0PEhUTUxFbGVtZW50Pikge1xuICAgIGlmKGlnbm9yZWRFdmVudHMuaW5jbHVkZXMobmFtZSkpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGlmICh0YXJnZXQgJiYgdGFyZ2V0LmNoaWxkcmVuKSB7XG4gICAgICAgIEFycmF5LmZyb20odGFyZ2V0LmNoaWxkcmVuKS5mb3JFYWNoKChlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBrZWhhYiA9IGtlYmFiRXZlbnROYW1lKG5hbWUpO1xuICAgICAgICAgICAgY29uc3QgZXZlbnROYW1lID0ga2VoYWIucmVwbGFjZShcImh0bXg6XCIsIFwiaHgtb246OlwiKVxuICAgICAgICAgICAgaWYgKCF0cmlnZ2VyZWQuaGFzKGUgYXMgSFRNTEVsZW1lbnQpKSB7XG4gICAgICAgICAgICAgICAgaWYoZS5oYXNBdHRyaWJ1dGUoZXZlbnROYW1lKSkge1xuICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ld0V2ZW50ID0gbWFrZUV2ZW50KGV2ZW50TmFtZS5yZXBsYWNlKFwiaHgtb246OlwiLCBcImh0bXg6XCIpLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uZXZlbnQuZGV0YWlsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldDogZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXdFdmVudC5kZXRhaWwubWV0YSA9ICd0cmlnZ2VyLWNoaWxkcmVuJ1xuICAgICAgICAgICAgICAgICAgICAgICAgZS5kaXNwYXRjaEV2ZW50KG5ld0V2ZW50KVxuICAgICAgICAgICAgICAgICAgICAgICAgdHJpZ2dlcmVkLmFkZChlIGFzIEhUTUxFbGVtZW50KTtcbiAgICAgICAgICAgICAgICAgICAgfSwgMSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGUuY2hpbGRyZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgdHJpZ2dlckNoaWxkcmVuKGUgYXMgSFRNTEVsZW1lbnQsIG5hbWUsIGV2ZW50LCB0cmlnZ2VyZWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxufVxuXG5cbi8vIEB0cy1pZ25vcmVcbmh0bXguZGVmaW5lRXh0ZW5zaW9uKFwidHJpZ2dlci1jaGlsZHJlblwiLCB7XG4gICAgb25FdmVudDogKG5hbWUsIGV2dDogRXZlbnQgfCBDdXN0b21FdmVudCkgPT4ge1xuICAgICAgICBpZiAoIShldnQgaW5zdGFuY2VvZiBDdXN0b21FdmVudCkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZihldnQuZGV0YWlsLm1ldGEgPT09ICd0cmlnZ2VyLWNoaWxkcmVuJykge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHRyaWdnZXJlZCA9IG5ldyBTZXQ8SFRNTEVsZW1lbnQ+KCk7XG4gICAgICAgIGNvbnN0IHRhcmdldCA9IGV2dC50YXJnZXQgYXMgSFRNTEVsZW1lbnQgfHwgZXZ0LmRldGFpbC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIHRyaWdnZXJDaGlsZHJlbih0YXJnZXQsIG5hbWUsIGV2dCwgdHJpZ2dlcmVkKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSxcbn0pO1xuIiwiaW1wb3J0IGh0bXggZnJvbSBcImh0bXgub3JnXCI7XG5cbmh0bXguZGVmaW5lRXh0ZW5zaW9uKFwiZGVidWdcIiwge1xuICAvLyBAdHMtaWdub3JlXG4gIG9uRXZlbnQ6IGZ1bmN0aW9uIChuYW1lLCBldnQpIHtcbiAgICBpZiAoY29uc29sZS5kZWJ1Zykge1xuICAgICAgY29uc29sZS5kZWJ1ZyhuYW1lLCBldnQpO1xuICAgIH0gZWxzZSBpZiAoY29uc29sZSkge1xuICAgICAgY29uc29sZS5sb2coXCJERUJVRzpcIiwgbmFtZSwgZXZ0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gbm9vcFxuICAgIH1cbiAgfSxcbn0pO1xuIiwiaW1wb3J0IGh0bXggZnJvbSBcImh0bXgub3JnXCI7XG5jb25zdCBjb25maWc6IGFueSA9IGh0bXguY29uZmlnO1xuXG4vKiogQHR5cGUge2ltcG9ydChcIi4uL2h0bXhcIikuSHRteEludGVybmFsQXBpfSAqL1xubGV0IGFwaTogYW55O1xuXG5jb25zdCBhdHRyUHJlZml4ID0gXCJoeC10YXJnZXQtXCI7XG5cbi8vIElFMTEgZG9lc24ndCBzdXBwb3J0IHN0cmluZy5zdGFydHNXaXRoXG5mdW5jdGlvbiBzdGFydHNXaXRoKHN0cjogc3RyaW5nLCBwcmVmaXg6IHN0cmluZykge1xuICByZXR1cm4gc3RyLnN1YnN0cmluZygwLCBwcmVmaXgubGVuZ3RoKSA9PT0gcHJlZml4O1xufVxuXG4vKipcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsdFxuICogQHBhcmFtIHJlc3BDb2RlTnVtYmVyXG4gKiBAcmV0dXJucyB7SFRNTEVsZW1lbnQgfCBudWxsfVxuICovXG5mdW5jdGlvbiBnZXRSZXNwQ29kZVRhcmdldChlbHQ6IEVsZW1lbnQsIHJlc3BDb2RlTnVtYmVyOiBudW1iZXIpIHtcbiAgaWYgKCFlbHQgfHwgIXJlc3BDb2RlTnVtYmVyKSByZXR1cm4gbnVsbDtcblxuICBjb25zdCByZXNwQ29kZSA9IHJlc3BDb2RlTnVtYmVyLnRvU3RyaW5nKCk7XG5cbiAgLy8gJyonIGlzIHRoZSBvcmlnaW5hbCBzeW50YXgsIGFzIHRoZSBvYnZpb3VzIGNoYXJhY3RlciBmb3IgYSB3aWxkY2FyZC5cbiAgLy8gVGhlICd4JyBhbHRlcm5hdGl2ZSB3YXMgYWRkZWQgZm9yIG1heGltdW0gY29tcGF0aWJpbGl0eSB3aXRoIEhUTUxcbiAgLy8gdGVtcGxhdGluZyBlbmdpbmVzLCBkdWUgdG8gYW1iaWd1aXR5IGFyb3VuZCB3aGljaCBjaGFyYWN0ZXJzIGFyZVxuICAvLyBzdXBwb3J0ZWQgaW4gSFRNTCBhdHRyaWJ1dGVzLlxuICAvL1xuICAvLyBTdGFydCB3aXRoIHRoZSBtb3N0IHNwZWNpZmljIHBvc3NpYmxlIGF0dHJpYnV0ZSBhbmQgZ2VuZXJhbGl6ZSBmcm9tXG4gIC8vIHRoZXJlLlxuICBjb25zdCBhdHRyUG9zc2liaWxpdGllcyA9IFtcbiAgICByZXNwQ29kZSxcblxuICAgIHJlc3BDb2RlLnN1YnN0cigwLCAyKSArIFwiKlwiLFxuICAgIHJlc3BDb2RlLnN1YnN0cigwLCAyKSArIFwieFwiLFxuXG4gICAgcmVzcENvZGUuc3Vic3RyKDAsIDEpICsgXCIqXCIsXG4gICAgcmVzcENvZGUuc3Vic3RyKDAsIDEpICsgXCJ4XCIsXG4gICAgcmVzcENvZGUuc3Vic3RyKDAsIDEpICsgXCIqKlwiLFxuICAgIHJlc3BDb2RlLnN1YnN0cigwLCAxKSArIFwieHhcIixcblxuICAgIFwiKlwiLFxuICAgIFwieFwiLFxuICAgIFwiKioqXCIsXG4gICAgXCJ4eHhcIixcbiAgXTtcbiAgaWYgKHN0YXJ0c1dpdGgocmVzcENvZGUsIFwiNFwiKSB8fCBzdGFydHNXaXRoKHJlc3BDb2RlLCBcIjVcIikpIHtcbiAgICBhdHRyUG9zc2liaWxpdGllcy5wdXNoKFwiZXJyb3JcIik7XG4gIH1cblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGF0dHJQb3NzaWJpbGl0aWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgYXR0ciA9IGF0dHJQcmVmaXggKyBhdHRyUG9zc2liaWxpdGllc1tpXTtcbiAgICBjb25zdCBhdHRyVmFsdWUgPSBhcGkuZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgYXR0cik7XG4gICAgaWYgKGF0dHJWYWx1ZSkge1xuICAgICAgaWYgKGF0dHJWYWx1ZSA9PT0gXCJ0aGlzXCIpIHtcbiAgICAgICAgcmV0dXJuIGFwaS5maW5kVGhpc0VsZW1lbnQoZWx0LCBhdHRyKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBhcGkucXVlcnlTZWxlY3RvckV4dChlbHQsIGF0dHJWYWx1ZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbi8qKiBAcGFyYW0ge0V2ZW50fSBldnQgKi9cbmZ1bmN0aW9uIGhhbmRsZUVycm9yRmxhZyhldnQ6IEN1c3RvbUV2ZW50KSB7XG4gIGlmIChldnQuZGV0YWlsLmlzRXJyb3IpIHtcbiAgICBpZiAoY29uZmlnLnJlc3BvbnNlVGFyZ2V0VW5zZXRzRXJyb3IpIHtcbiAgICAgIGV2dC5kZXRhaWwuaXNFcnJvciA9IGZhbHNlO1xuICAgIH1cbiAgfSBlbHNlIGlmIChjb25maWcucmVzcG9uc2VUYXJnZXRTZXRzRXJyb3IpIHtcbiAgICBldnQuZGV0YWlsLmlzRXJyb3IgPSB0cnVlO1xuICB9XG59XG5cbmh0bXguZGVmaW5lRXh0ZW5zaW9uKFwicmVzcG9uc2UtdGFyZ2V0c1wiLCB7XG4gIC8vIEB0cy1pZ25vcmVcbiAgaW5pdDogKGFwaVJlZikgPT4ge1xuICAgIGFwaSA9IGFwaVJlZjtcblxuICAgIGlmIChjb25maWcucmVzcG9uc2VUYXJnZXRVbnNldHNFcnJvciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25maWcucmVzcG9uc2VUYXJnZXRVbnNldHNFcnJvciA9IHRydWU7XG4gICAgfVxuICAgIGlmIChjb25maWcucmVzcG9uc2VUYXJnZXRTZXRzRXJyb3IgPT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uZmlnLnJlc3BvbnNlVGFyZ2V0U2V0c0Vycm9yID0gZmFsc2U7XG4gICAgfVxuICAgIGlmIChjb25maWcucmVzcG9uc2VUYXJnZXRQcmVmZXJzRXhpc3RpbmcgPT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uZmlnLnJlc3BvbnNlVGFyZ2V0UHJlZmVyc0V4aXN0aW5nID0gZmFsc2U7XG4gICAgfVxuICAgIGlmIChjb25maWcucmVzcG9uc2VUYXJnZXRQcmVmZXJzUmV0YXJnZXRIZWFkZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uZmlnLnJlc3BvbnNlVGFyZ2V0UHJlZmVyc1JldGFyZ2V0SGVhZGVyID0gdHJ1ZTtcbiAgICB9XG4gIH0sXG5cbiAgLy8gQHRzLWlnbm9yZVxuICBvbkV2ZW50OiAobmFtZSwgZXZ0KSA9PiB7XG4gICAgaWYgKCEoZXZ0IGluc3RhbmNlb2YgQ3VzdG9tRXZlbnQpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChcbiAgICAgIG5hbWUgPT09IFwiaHRteDpiZWZvcmVTd2FwXCIgJiZcbiAgICAgIGV2dC5kZXRhaWwueGhyICYmXG4gICAgICBldnQuZGV0YWlsLnhoci5zdGF0dXMgIT09IDIwMFxuICAgICkge1xuICAgICAgaWYgKGV2dC5kZXRhaWwudGFyZ2V0KSB7XG4gICAgICAgIGlmIChjb25maWcucmVzcG9uc2VUYXJnZXRQcmVmZXJzRXhpc3RpbmcpIHtcbiAgICAgICAgICBldnQuZGV0YWlsLnNob3VsZFN3YXAgPSB0cnVlO1xuICAgICAgICAgIGhhbmRsZUVycm9yRmxhZyhldnQpO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChcbiAgICAgICAgICBjb25maWcucmVzcG9uc2VUYXJnZXRQcmVmZXJzUmV0YXJnZXRIZWFkZXIgJiZcbiAgICAgICAgICBldnQuZGV0YWlsLnhoci5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKS5tYXRjaCgvSFgtUmV0YXJnZXQ6L2kpXG4gICAgICAgICkge1xuICAgICAgICAgIGV2dC5kZXRhaWwuc2hvdWxkU3dhcCA9IHRydWU7XG4gICAgICAgICAgaGFuZGxlRXJyb3JGbGFnKGV2dCk7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICghZXZ0LmRldGFpbC5yZXF1ZXN0Q29uZmlnKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgY29uc3QgdGFyZ2V0ID0gZ2V0UmVzcENvZGVUYXJnZXQoXG4gICAgICAgIGV2dC5kZXRhaWwucmVxdWVzdENvbmZpZy5lbHQsXG4gICAgICAgIGV2dC5kZXRhaWwueGhyLnN0YXR1cyxcbiAgICAgICk7XG4gICAgICBpZiAodGFyZ2V0KSB7XG4gICAgICAgIGhhbmRsZUVycm9yRmxhZyhldnQpO1xuICAgICAgICBldnQuZGV0YWlsLnNob3VsZFN3YXAgPSB0cnVlO1xuICAgICAgICBldnQuZGV0YWlsLnRhcmdldCA9IHRhcmdldDtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfSxcbn0pO1xuIiwiaW1wb3J0IGh0bXggZnJvbSBcImh0bXgub3JnXCI7XG5cbmh0bXguZGVmaW5lRXh0ZW5zaW9uKFwibXV0YXRpb24tZXJyb3JcIiwge1xuICAvLyBAdHMtaWdub3JlXG4gIG9uRXZlbnQ6IChuYW1lLCBldnQpID0+IHtcbiAgICBpZiAoIShldnQgaW5zdGFuY2VvZiBDdXN0b21FdmVudCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKG5hbWUgPT09IFwiaHRteDphZnRlclJlcXVlc3RcIikge1xuICAgICAgaWYgKCFldnQuZGV0YWlsIHx8ICFldnQuZGV0YWlsLnhocikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBzdGF0dXMgPSBldnQuZGV0YWlsLnhoci5zdGF0dXM7XG4gICAgICBpZiAoc3RhdHVzID49IDQwMCkge1xuICAgICAgICBodG14LmZpbmRBbGwoXCJbaHgtb25cXFxcOlxcXFw6bXV0YXRpb24tZXJyb3JdXCIpLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgICAgICBodG14LnRyaWdnZXIoZWxlbWVudCwgXCJodG14Om11dGF0aW9uLWVycm9yXCIsIHsgc3RhdHVzIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG59KTtcbiIsImltcG9ydCBodG14IGZyb20gXCJodG14Lm9yZ1wiO1xuXG5sZXQgbGFzdFZlcnNpb24gPSBcIlwiO1xuXG5odG14LmRlZmluZUV4dGVuc2lvbihcImxpdmVyZWxvYWRcIiwge1xuICAgIGluaXQ6IGZ1bmN0aW9uICgpIHtcblxuICAgICAgICBsZXQgZW5hYmxlZCA9IGZhbHNlXG4gICAgICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiBBcnJheS5mcm9tKGh0bXguZmluZEFsbChcIltoeC1leHRdXCIpKSkge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShcImh4LWV4dFwiKTtcbiAgICAgICAgICAgIGlmKHZhbHVlPy5zcGxpdChcIiBcIikuaW5jbHVkZXMoXCJsaXZlcmVsb2FkXCIpKSB7XG4gICAgICAgICAgICAgICAgZW5hYmxlZCA9IHRydWVcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmKCFlbmFibGVkKSB7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnNvbGUubG9nKCdsaXZlcmVsb2FkIGV4dGVuc2lvbiBpbml0aWFsaXplZC4nKTtcbiAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IEV2ZW50U291cmNlIG9iamVjdCBhbmQgcG9pbnQgaXQgdG8geW91ciBTU0UgZW5kcG9pbnRcbiAgICAgICAgY29uc3QgZXZlbnRTb3VyY2UgPSBuZXcgRXZlbnRTb3VyY2UoJy9kZXYvbGl2ZXJlbG9hZCcpO1xuICAgICAgICAvLyBMaXN0ZW4gZm9yIG1lc3NhZ2VzIGZyb20gdGhlIHNlcnZlclxuICAgICAgICBldmVudFNvdXJjZS5vbm1lc3NhZ2UgPSBmdW5jdGlvbihldmVudCkge1xuICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9IGV2ZW50LmRhdGFcbiAgICAgICAgICAgIC8vIExvZyB0aGUgbWVzc2FnZSBkYXRhIHJlY2VpdmVkIGZyb20gdGhlIHNlcnZlclxuICAgICAgICAgICAgaWYobGFzdFZlcnNpb24gPT09IFwiXCIpIHtcbiAgICAgICAgICAgICAgICBsYXN0VmVyc2lvbiA9IG1lc3NhZ2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZihsYXN0VmVyc2lvbiAhPT0gbWVzc2FnZSkge1xuICAgICAgICAgICAgICAgIGxhc3RWZXJzaW9uID0gbWVzc2FnZTtcbiAgICAgICAgICAgICAgICByZWxvYWQoKVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICAvLyBIYW5kbGUgZXJyb3JzIChlLmcuLCB3aGVuIHRoZSBjb25uZWN0aW9uIGlzIGNsb3NlZClcbiAgICAgICAgZXZlbnRTb3VyY2Uub25lcnJvciA9IGZ1bmN0aW9uKGVycm9yKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdFdmVudFNvdXJjZSBlcnJvcjonLCBlcnJvcik7XG4gICAgICAgIH07XG5cbiAgICB9LFxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBvbkV2ZW50OiBmdW5jdGlvbiAobmFtZSwgZXZ0KSB7XG5cbiAgICB9LFxufSk7XG5cbmZ1bmN0aW9uIHJlbG9hZCgpIHtcbiAgICB3aW5kb3cubG9jYXRpb24ucmVsb2FkKClcbn1cbiIsImltcG9ydCBodG14IGZyb20gXCJodG14Lm9yZ1wiO1xuXG5jb25zdCBldmFsRnVuY1JlZ2V4ID0vX19ldmFsX1tBLVphLXowLTldK1xcKFthLXpdK1xcKS9nbVxuXG5odG14LmRlZmluZUV4dGVuc2lvbihcImh0bWdvXCIsIHtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgb25FdmVudDogZnVuY3Rpb24gKG5hbWUsIGV2dCkge1xuICAgICAgIGlmKG5hbWUgPT09IFwiaHRteDpiZWZvcmVDbGVhbnVwRWxlbWVudFwiICYmIGV2dC50YXJnZXQpIHtcbiAgICAgICAgICAgcmVtb3ZlQXNzb2NpYXRlZFNjcmlwdHMoZXZ0LnRhcmdldCBhcyBIVE1MRWxlbWVudCk7XG4gICAgICAgfVxuICAgIH0sXG59KTtcblxuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZUFzc29jaWF0ZWRTY3JpcHRzKGVsZW1lbnQ6IEhUTUxFbGVtZW50KSB7XG4gICBjb25zdCBhdHRyaWJ1dGVzID0gQXJyYXkuZnJvbShlbGVtZW50LmF0dHJpYnV0ZXMpXG4gICAgZm9yIChsZXQgYXR0cmlidXRlIG9mIGF0dHJpYnV0ZXMpIHtcbiAgICAgICBjb25zdCBtYXRjaGVzID0gYXR0cmlidXRlLnZhbHVlLm1hdGNoKGV2YWxGdW5jUmVnZXgpIHx8IFtdXG4gICAgICAgIGZvciAobGV0IG1hdGNoIG9mIG1hdGNoZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IGlkID0gbWF0Y2gucmVwbGFjZShcIigpXCIsIFwiXCIpLnJlcGxhY2UoXCIodGhpcylcIiwgXCJcIikucmVwbGFjZShcIjtcIiwgXCJcIilcbiAgICAgICAgICAgIGNvbnN0IGVsZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKVxuICAgICAgICAgICAgaWYoZWxlICYmIGVsZS50YWdOYW1lID09PSBcIlNDUklQVFwiKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5kZWJ1ZyhcInJlbW92aW5nIGFzc29jaWF0ZWQgc2NyaXB0IHdpdGggaWRcIiwgaWQpXG4gICAgICAgICAgICAgICAgZWxlLnJlbW92ZSgpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCJpbXBvcnQgaHRteCBmcm9tICdodG14Lm9yZydcbmltcG9ydCB7cmVtb3ZlQXNzb2NpYXRlZFNjcmlwdHN9IGZyb20gXCIuL2h0bWdvXCI7XG5cbmxldCBhcGkgOiBhbnkgPSBudWxsO1xubGV0IHByb2Nlc3NlZCA9IG5ldyBTZXQ8c3RyaW5nPigpXG5cbmh0bXguZGVmaW5lRXh0ZW5zaW9uKFwic3NlXCIsIHtcbiAgICBpbml0OiBmdW5jdGlvbiAoYXBpUmVmKSB7XG4gICAgICAgIGFwaSA9IGFwaVJlZjtcbiAgICB9LFxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBvbkV2ZW50OiBmdW5jdGlvbiAobmFtZSwgZXZ0KSB7XG4gICAgICAgIGNvbnN0IHRhcmdldCA9IGV2dC50YXJnZXQ7XG4gICAgICAgIGlmKCEodGFyZ2V0IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpKSB7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGlmKG5hbWUgPT09ICdodG14OmJlZm9yZUNsZWFudXBFbGVtZW50Jykge1xuICAgICAgICAgICAgcmVtb3ZlQXNzb2NpYXRlZFNjcmlwdHModGFyZ2V0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmKG5hbWUgPT09ICdodG14OmJlZm9yZVByb2Nlc3NOb2RlJykge1xuICAgICAgICAgICAgY29uc3QgZWxlbWVudHMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdbc3NlLWNvbm5lY3RdJyk7XG4gICAgICAgICAgICBmb3IgKGxldCBlbGVtZW50IG9mIEFycmF5LmZyb20oZWxlbWVudHMpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdXJsID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJzc2UtY29ubmVjdFwiKSE7XG4gICAgICAgICAgICAgICAgaWYodXJsICYmICFwcm9jZXNzZWQuaGFzKHVybCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29ubmVjdEV2ZW50U291cmNlKGVsZW1lbnQsIHVybClcbiAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc2VkLmFkZCh1cmwpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufSlcblxuZnVuY3Rpb24gY29ubmVjdEV2ZW50U291cmNlKGVsZTogRWxlbWVudCwgdXJsOiBzdHJpbmcpIHtcbiAgICBpZighdXJsKSB7XG4gICAgICAgIHJldHVyblxuICAgIH1cbiAgICBjb25zb2xlLmluZm8oJ0Nvbm5lY3RpbmcgdG8gRXZlbnRTb3VyY2UnLCB1cmwpXG4gICAgY29uc3QgZXZlbnRTb3VyY2UgPSBuZXcgRXZlbnRTb3VyY2UodXJsKTtcblxuICAgIGV2ZW50U291cmNlLmFkZEV2ZW50TGlzdGVuZXIoXCJjbG9zZVwiLCBmdW5jdGlvbihldmVudCkge1xuICAgICAgICBodG14LnRyaWdnZXIoZWxlLCBcImh0bXg6c3NlQ2xvc2VcIiwge2V2ZW50OiBldmVudH0pO1xuICAgIH0pXG5cbiAgICBldmVudFNvdXJjZS5vbm9wZW4gPSBmdW5jdGlvbihldmVudCkge1xuICAgICAgICBodG14LnRyaWdnZXIoZWxlLCBcImh0bXg6c3NlT3BlblwiLCB7ZXZlbnQ6IGV2ZW50fSk7XG4gICAgfVxuXG4gICAgZXZlbnRTb3VyY2Uub25lcnJvciA9IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICAgIGh0bXgudHJpZ2dlcihlbGUsIFwiaHRteDpzc2VFcnJvclwiLCB7ZXZlbnQ6IGV2ZW50fSk7XG4gICAgICAgIGlmIChldmVudFNvdXJjZS5yZWFkeVN0YXRlID09IEV2ZW50U291cmNlLkNMT1NFRCkge1xuICAgICAgICAgICAgaHRteC50cmlnZ2VyKGVsZSwgXCJodG14OnNzZUNsb3NlXCIsIHtldmVudDogZXZlbnR9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGV2ZW50U291cmNlLm9ubWVzc2FnZSA9IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICAgIGNvbnN0IHNldHRsZUluZm8gPSBhcGkubWFrZVNldHRsZUluZm8oZWxlKTtcbiAgICAgICAgaHRteC50cmlnZ2VyKGVsZSwgXCJodG14OnNzZUJlZm9yZU1lc3NhZ2VcIiwge2V2ZW50OiBldmVudH0pO1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGV2ZW50LmRhdGFcbiAgICAgICAgY29uc3QgZnJhZ21lbnQgPSBhcGkubWFrZUZyYWdtZW50KHJlc3BvbnNlKSBhcyBEb2N1bWVudEZyYWdtZW50O1xuICAgICAgICBjb25zdCBjaGlsZHJlbiA9IEFycmF5LmZyb20oZnJhZ21lbnQuY2hpbGRyZW4pO1xuICAgICAgICBmb3IgKGxldCBjaGlsZCBvZiBjaGlsZHJlbikge1xuICAgICAgICAgICAgYXBpLm9vYlN3YXAoYXBpLmdldEF0dHJpYnV0ZVZhbHVlKGNoaWxkLCAnaHgtc3dhcC1vb2InKSB8fCAndHJ1ZScsIGNoaWxkLCBzZXR0bGVJbmZvKTtcbiAgICAgICAgICAgIC8vIHN1cHBvcnQgaHRtZ28gZXZhbF9fIHNjcmlwdHNcbiAgICAgICAgICAgIGlmKGNoaWxkLnRhZ05hbWUgPT09ICdTQ1JJUFQnICYmIGNoaWxkLmlkLnN0YXJ0c1dpdGgoXCJfX2V2YWxcIikpIHtcbiAgICAgICAgICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGNoaWxkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBodG14LnRyaWdnZXIoZWxlLCBcImh0bXg6c3NlQWZ0ZXJNZXNzYWdlXCIsIHtldmVudDogZXZlbnR9KTtcbiAgICB9XG59XG4iLCJpbXBvcnQgaHRteCBmcm9tIFwiaHRteC5vcmdcIjtcbmltcG9ydCBcIi4vaHRteGV4dGVuc2lvbnMvcGF0aGRlcHNcIjtcbmltcG9ydCBcIi4vaHRteGV4dGVuc2lvbnMvdHJpZ2dlci1jaGlsZHJlblwiO1xuaW1wb3J0IFwiLi9odG14ZXh0ZW5zaW9ucy9kZWJ1Z1wiO1xuaW1wb3J0IFwiLi9odG14ZXh0ZW5zaW9ucy9yZXNwb25zZS10YXJnZXRzXCI7XG5pbXBvcnQgXCIuL2h0bXhleHRlbnNpb25zL211dGF0aW9uLWVycm9yXCI7XG5pbXBvcnQgXCIuL2h0bXhleHRlbnNpb25zL2xpdmVyZWxvYWRcIlxuaW1wb3J0IFwiLi9odG14ZXh0ZW5zaW9ucy9odG1nb1wiO1xuaW1wb3J0IFwiLi9odG14ZXh0ZW5zaW9ucy9zc2VcIlxuXG4vKipcbiAqIEJyb3dzZXIgZG9lc24ndCBzdXBwb3J0IG9ubG9hZCBmb3IgYWxsIGVsZW1lbnRzLCBzbyB3ZSBuZWVkIHRvIG1hbnVhbGx5IHRyaWdnZXIgaXRcbiAqIHRoaXMgaXMgdXNlZnVsIGZvciBsb2NhbGl0eSBvZiBiZWhhdmlvclxuICovXG53aW5kb3cub25sb2FkID0gZnVuY3Rpb24oKSB7XG4gIGNvbnN0IGlnbm9yZWQgPSBbJ1NDUklQVCcsICdMSU5LJywgJ1NUWUxFJywgJ01FVEEnLCAnQkFTRScsICdUSVRMRScsICdIRUFEJywgJ0hUTUwnLCAnQk9EWSddO1xuICBmb3IgKGxldCBlbGVtZW50IG9mIEFycmF5LmZyb20oZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChgW29ubG9hZF1gKSkpIHtcbiAgICBpZihlbGVtZW50ICE9IG51bGwgJiYgZWxlbWVudCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSB7XG4gICAgICBpZihpZ25vcmVkLmluY2x1ZGVzKGVsZW1lbnQudGFnTmFtZSkpIHtcbiAgICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG4gICAgICBlbGVtZW50Lm9ubG9hZCEobmV3IEV2ZW50KFwibG9hZFwiKSk7XG4gICAgfVxuICB9XG59XG5cbi8vIEB0cy1pZ25vcmVcbndpbmRvdy5odG14ID0gaHRteDtcblxuZnVuY3Rpb24gd2F0Y2hVcmwoY2FsbGJhY2s6IChvbGRVcmw6IHN0cmluZywgbmV3VXJsOiBzdHJpbmcpID0+IHZvaWQpIHtcbiAgbGV0IGxhc3RVcmwgPSB3aW5kb3cubG9jYXRpb24uaHJlZjtcbiAgc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgIGlmICh3aW5kb3cubG9jYXRpb24uaHJlZiAhPT0gbGFzdFVybCkge1xuICAgICAgY2FsbGJhY2sobGFzdFVybCwgd2luZG93LmxvY2F0aW9uLmhyZWYpO1xuICAgICAgbGFzdFVybCA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmO1xuICAgIH1cbiAgfSwgMTAwKTtcbn1cblxud2F0Y2hVcmwoKF8sIG5ld1VybCkgPT4ge1xuICBvblVybENoYW5nZShuZXdVcmwpO1xufSk7XG5cbmZ1bmN0aW9uIG9uVXJsQ2hhbmdlKG5ld1VybDogc3RyaW5nKSB7XG4gIGxldCB1cmwgPSBuZXcgVVJMKG5ld1VybCk7XG5cbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChcIltoeC10cmlnZ2VyXVwiKS5mb3JFYWNoKGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgY29uc3QgdHJpZ2dlcnMgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShcImh4LXRyaWdnZXJcIik7XG4gICAgaWYgKCF0cmlnZ2Vycykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBzcGxpdCA9IHRyaWdnZXJzLnNwbGl0KFwiLCBcIik7XG4gICAgaWYgKHNwbGl0LmZpbmQoKHMpID0+IHMgPT09IFwidXJsXCIpKSB7XG4gICAgICBodG14LnN3YXAoZWxlbWVudCwgXCJ1cmxcIiwge1xuICAgICAgICBzd2FwU3R5bGU6IFwib3V0ZXJIVE1MXCIsXG4gICAgICAgIHN3YXBEZWxheTogMCxcbiAgICAgICAgc2V0dGxlRGVsYXk6IDAsXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgZm9yIChsZXQgW2tleSwgdmFsdWVzXSBvZiB1cmwuc2VhcmNoUGFyYW1zKSB7XG4gICAgICAgIGxldCBldmVudE5hbWUgPSBcInFzOlwiICsga2V5O1xuICAgICAgICBpZiAodHJpZ2dlcnMuaW5jbHVkZXMoZXZlbnROYW1lKSkge1xuICAgICAgICAgIGNvbnNvbGUubG9nKFwidHJpZ2dlcmluZ1wiLCBldmVudE5hbWUpO1xuICAgICAgICAgIGh0bXgudHJpZ2dlcihlbGVtZW50LCBldmVudE5hbWUsIG51bGwpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9KTtcblxuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFwiW2h4LW1hdGNoLXFwXVwiKS5mb3JFYWNoKChlbCkgPT4ge1xuICAgIGxldCBoYXNNYXRjaCA9IGZhbHNlO1xuICAgIGZvciAobGV0IG5hbWUgb2YgZWwuZ2V0QXR0cmlidXRlTmFtZXMoKSkge1xuICAgICAgaWYgKG5hbWUuc3RhcnRzV2l0aChcImh4LW1hdGNoLXFwLW1hcHBpbmc6XCIpKSB7XG4gICAgICAgIGxldCBtYXRjaCA9IG5hbWUucmVwbGFjZShcImh4LW1hdGNoLXFwLW1hcHBpbmc6XCIsIFwiXCIpO1xuICAgICAgICBsZXQgdmFsdWUgPSB1cmwuc2VhcmNoUGFyYW1zLmdldChtYXRjaCk7XG4gICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgIGh0bXguc3dhcChlbCwgZWwuZ2V0QXR0cmlidXRlKG5hbWUpID8/IFwiXCIsIHtcbiAgICAgICAgICAgIHN3YXBTdHlsZTogXCJpbm5lckhUTUxcIixcbiAgICAgICAgICAgIHN3YXBEZWxheTogMCxcbiAgICAgICAgICAgIHNldHRsZURlbGF5OiAwLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGhhc01hdGNoID0gdHJ1ZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIWhhc01hdGNoKSB7XG4gICAgICBsZXQgZGVmYXVsdEtleSA9IGVsLmdldEF0dHJpYnV0ZShcImh4LW1hdGNoLXFwLWRlZmF1bHRcIik7XG4gICAgICBpZiAoZGVmYXVsdEtleSkge1xuICAgICAgICBodG14LnN3YXAoXG4gICAgICAgICAgZWwsXG4gICAgICAgICAgZWwuZ2V0QXR0cmlidXRlKFwiaHgtbWF0Y2gtcXAtbWFwcGluZzpcIiArIGRlZmF1bHRLZXkpID8/IFwiXCIsXG4gICAgICAgICAgeyBzd2FwU3R5bGU6IFwiaW5uZXJIVE1MXCIsIHN3YXBEZWxheTogMCwgc2V0dGxlRGVsYXk6IDAgfSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xufVxuIl19 \ No newline at end of file diff --git a/framework/assets/js/htmgo.ts b/framework/assets/js/htmgo.ts index 29cb709..308da9b 100644 --- a/framework/assets/js/htmgo.ts +++ b/framework/assets/js/htmgo.ts @@ -8,6 +8,22 @@ import "./htmxextensions/livereload" import "./htmxextensions/htmgo"; import "./htmxextensions/sse" +/** + * Browser doesn't support onload for all elements, so we need to manually trigger it + * this is useful for locality of behavior + */ +window.onload = function() { + const ignored = ['SCRIPT', 'LINK', 'STYLE', 'META', 'BASE', 'TITLE', 'HEAD', 'HTML', 'BODY']; + for (let element of Array.from(document.querySelectorAll(`[onload]`))) { + if(element != null && element instanceof HTMLElement) { + if(ignored.includes(element.tagName)) { + continue + } + element.onload!(new Event("load")); + } + } +} + // @ts-ignore window.htmx = htmx; diff --git a/framework/assets/js/htmxextensions/trigger-children.ts b/framework/assets/js/htmxextensions/trigger-children.ts index 7f5b8b5..c32c738 100644 --- a/framework/assets/js/htmxextensions/trigger-children.ts +++ b/framework/assets/js/htmxextensions/trigger-children.ts @@ -4,7 +4,7 @@ function kebabEventName(str: string) { return str.replace(/([a-z0-9])([A-Z])/g, '$1-$2').toLowerCase() } -const ignoredEvents = ['htmx:beforeProcessNode', 'htmx:afterProcessNode', 'htmx:beforeSwap', 'htmx:afterSwap', 'htmx:beforeOnLoad', 'htmx:afterOnLoad', 'htmx:configRequest', 'htmx:configResponse', 'htmx:responseError']; +const ignoredEvents = ['htmx:beforeProcessNode', 'htmx:afterProcessNode', 'htmx:configRequest', 'htmx:configResponse', 'htmx:responseError']; function makeEvent(eventName: string, detail: any) { let evt @@ -28,13 +28,15 @@ function triggerChildren(target: HTMLElement, name: string, event: CustomEvent, const eventName = kehab.replace("htmx:", "hx-on::") if (!triggered.has(e as HTMLElement)) { if(e.hasAttribute(eventName)) { - const newEvent = makeEvent(eventName.replace("hx-on::", "htmx:"), { - ...event.detail, - target: e, - }) - newEvent.detail.meta = 'trigger-children' - e.dispatchEvent(newEvent) - triggered.add(e as HTMLElement); + setTimeout(() => { + const newEvent = makeEvent(eventName.replace("hx-on::", "htmx:"), { + ...event.detail, + target: e, + }) + newEvent.detail.meta = 'trigger-children' + e.dispatchEvent(newEvent) + triggered.add(e as HTMLElement); + }, 1) } if (e.children) { triggerChildren(e as HTMLElement, name, event, triggered); diff --git a/templates/starter/pages/root.go b/templates/starter/pages/root.go index cb3e629..bacdd61 100644 --- a/templates/starter/pages/root.go +++ b/templates/starter/pages/root.go @@ -6,7 +6,7 @@ import ( func RootPage(children ...h.Ren) h.Ren { return h.Html( - h.HxExtension(h.BaseExtensions()), + h.HxExtensions(h.BaseExtensions()), h.Head( h.Meta("viewport", "width=device-width, initial-scale=1"), h.Link("/public/favicon.ico", "icon"),