diff --git a/mkdocs-website/docs/en/roadmap.md b/mkdocs-website/docs/en/roadmap.md
index 875f468101e..559d755089e 100644
--- a/mkdocs-website/docs/en/roadmap.md
+++ b/mkdocs-website/docs/en/roadmap.md
@@ -23,6 +23,16 @@ Report any issues you find using [this guide](./getting-started/feedback.md).
- Test all the things on Linux!
+#### Status
+
+Linux examples:
+
+- :material-check-bold: - Working
+- :material-minus: - Partially working
+- :material-close: - Not working
+
+{{ read_csv("alpha5.csv") }}
+
## Upcoming milestones
## Alpha 6
diff --git a/mkdocs-website/shared/alpha1.csv b/mkdocs-website/shared/alpha1.csv
index f372dc65f02..1f553d43306 100644
--- a/mkdocs-website/shared/alpha1.csv
+++ b/mkdocs-website/shared/alpha1.csv
@@ -1,16 +1,16 @@
-" ",Mac,Windows,Linux
-binding,:material-check-bold:,:material-check-bold:,:material-check-bold:
-build,:material-check-bold:,:material-check-bold:,:material-check-bold:
-clipboard,:material-check-bold:,:material-check-bold:,:material-check-bold:
-context menus,:material-check-bold:,:material-check-bold:,:material-check-bold:
-dialogs,:material-check-bold:,:material-check-bold:,:material-check-bold:
-drag-n-drop,:material-check-bold:,:material-check-bold:,:material-check-bold:
-events,:material-check-bold:,:material-check-bold:,:material-minus:
-frameless,:material-check-bold:,:material-check-bold:,:material-check-bold:
-keybindings,:material-check-bold:,:material-check-bold:,:material-minus:
-plain,:material-check-bold:,:material-check-bold:,:material-check-bold:
-screen,:material-check-bold:,:material-check-bold:,:material-check-bold:
-systray,:material-check-bold:,:material-check-bold:,:material-check-bold:
-video,:material-check-bold:,:material-check-bold:,:material-check-bold:
-window,:material-check-bold:,:material-check-bold:,:material-minus:
-wml,:material-check-bold:,:material-check-bold:,:material-check-bold:
\ No newline at end of file
+" ",Linux,Notes
+binding," "," "
+build," "," "
+clipboard," "," "
+context menus," "," "
+dialogs," "," "
+drag-n-drop," "," "
+events,:material-check-bold:," "
+frameless," "," "
+keybindings," "," "
+plain," "," "
+screen," "," "
+systray," "," "
+video," "," "
+window," "," "
+wml," "," "
\ No newline at end of file
diff --git a/mkdocs-website/shared/alpha3-bindings-callbyname.csv b/mkdocs-website/shared/alpha3-bindings-callbyname.csv
index dbbc00e5c2b..faa8b62d9ba 100644
--- a/mkdocs-website/shared/alpha3-bindings-callbyname.csv
+++ b/mkdocs-website/shared/alpha3-bindings-callbyname.csv
@@ -1,9 +1,5 @@
Scenario,Windows,Mac,Linux
-Same package,: clipboardLock.RLock()
- defer clipboardLock.RUnlock()
- clipboardText := C.getClipboardText()
- result := C.GoString(clipboardText)
- return result, true:,:material-check-bold:,:material-check-bold:
+Same package,:material-check-bold,:material-check-bold:,:material-check-bold:
Different package,:material-check-bold:,:material-check-bold:,:material-check-bold:
Different package with same name,"on hold","on hold","on hold"
Containing another struct from same package,:material-check-bold:,:material-check-bold:,:material-check-bold:
diff --git a/mkdocs-website/shared/alpha5.csv b/mkdocs-website/shared/alpha5.csv
new file mode 100644
index 00000000000..f62050de27f
--- /dev/null
+++ b/mkdocs-website/shared/alpha5.csv
@@ -0,0 +1,16 @@
+Example,Linux
+binding," "
+build,:material-check-bold:
+clipboard,:material-check-bold:
+context menus,:material-minus:
+dialogs,:material-minus:
+drag-n-drop," "
+events,:material-check-bold:
+frameless,:material-check-bold:
+keybindings,:material-check-bold:
+plain," "
+screen,:material-check-bold:
+systray,:material-check-bold:
+video,:material-check-bold:
+window,:material-check-bold:
+wml,:material-check-bold:
\ No newline at end of file
diff --git a/v2/go.mod b/v2/go.mod
index a2d0ab416b8..aef70015a27 100644
--- a/v2/go.mod
+++ b/v2/go.mod
@@ -1,6 +1,8 @@
module github.com/wailsapp/wails/v2
-go 1.20
+go 1.21
+
+toolchain go1.22.0
require (
github.com/Masterminds/semver v1.5.0
diff --git a/v2/pkg/options/linux/linux.go b/v2/pkg/options/linux/linux.go
index 797450c2725..1287f1da2b5 100644
--- a/v2/pkg/options/linux/linux.go
+++ b/v2/pkg/options/linux/linux.go
@@ -4,10 +4,10 @@ package linux
type WebviewGpuPolicy int
const (
- // WebviewGpuPolicyAlways Hardware acceleration is always enabled.
- WebviewGpuPolicyAlways WebviewGpuPolicy = iota
// WebviewGpuPolicyOnDemand Hardware acceleration is enabled/disabled as request by web contents.
- WebviewGpuPolicyOnDemand
+ WebviewGpuPolicyOnDemand WebviewGpuPolicy = iota
+ // WebviewGpuPolicyAlways Hardware acceleration is always enabled.
+ WebviewGpuPolicyAlways
// WebviewGpuPolicyNever Hardware acceleration is always disabled.
WebviewGpuPolicyNever
)
diff --git a/v3/examples/binding/go.mod b/v3/examples/binding/go.mod
index d53e53e657d..963d59f479a 100644
--- a/v3/examples/binding/go.mod
+++ b/v3/examples/binding/go.mod
@@ -39,11 +39,11 @@ require (
github.com/wailsapp/go-webview2 v1.0.9 // indirect
github.com/wailsapp/mimetype v1.4.1 // indirect
github.com/xanzy/ssh-agent v0.3.3 // indirect
- golang.org/x/crypto v0.16.0 // indirect
+ golang.org/x/crypto v0.19.0 // indirect
golang.org/x/exp v0.0.0-20230626212559-97b1e661b5df // indirect
golang.org/x/mod v0.12.0 // indirect
golang.org/x/net v0.19.0 // indirect
- golang.org/x/sys v0.15.0 // indirect
+ golang.org/x/sys v0.17.0 // indirect
golang.org/x/tools v0.13.0 // indirect
gopkg.in/warnings.v0 v0.1.2 // indirect
)
diff --git a/v3/examples/binding/go.sum b/v3/examples/binding/go.sum
index b451aafd047..53111bf10b4 100644
--- a/v3/examples/binding/go.sum
+++ b/v3/examples/binding/go.sum
@@ -110,8 +110,8 @@ golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5y
golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
golang.org/x/crypto v0.3.1-0.20221117191849-2c476679df9a/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4=
golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU=
-golang.org/x/crypto v0.16.0 h1:mMMrFzRSCF0GvB7Ne27XVtVAaXLrPmgPC7/v0tkwHaY=
-golang.org/x/crypto v0.16.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4=
+golang.org/x/crypto v0.19.0 h1:ENy+Az/9Y1vSrlrvBSyna3PITt4tiZLf7sgCjZBX7Wo=
+golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU=
golang.org/x/exp v0.0.0-20230626212559-97b1e661b5df h1:UA2aFVmmsIlefxMk29Dp2juaUSth8Pyn3Tq5Y5mJGME=
golang.org/x/exp v0.0.0-20230626212559-97b1e661b5df/go.mod h1:FXUEEKJgO7OQYeo8N01OfiKP8RXMtf6e8aTskBGqWdc=
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
@@ -150,15 +150,15 @@ golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc=
-golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
+golang.org/x/sys v0.17.0 h1:25cE3gD+tdBA7lp7QfhuV+rJiE9YXTcS3VG1SqssI/Y=
+golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc=
golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U=
-golang.org/x/term v0.15.0 h1:y/Oo/a/q3IXu26lQgl04j/gjuBDOBlx7X6Om1j2CPW4=
-golang.org/x/term v0.15.0/go.mod h1:BDl952bC7+uMoWR75FIrCDx79TPU9oHkTZ9yRbYOrX0=
+golang.org/x/term v0.17.0 h1:mkTF7LCd6WGJNL3K1Ad7kwxNfYAW6a8a8QqtMblp/4U=
+golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
diff --git a/v3/examples/contextmenus/assets/index.html b/v3/examples/contextmenus/assets/index.html
index db6721e39d9..0c1c5e110aa 100644
--- a/v3/examples/contextmenus/assets/index.html
+++ b/v3/examples/contextmenus/assets/index.html
@@ -3,7 +3,7 @@
Title
-
+
diff --git a/v3/examples/contextmenus/assets/runtime.js b/v3/examples/contextmenus/assets/runtime.js
new file mode 100644
index 00000000000..baaccee0402
--- /dev/null
+++ b/v3/examples/contextmenus/assets/runtime.js
@@ -0,0 +1 @@
+(()=>{var de=Object.defineProperty;var w=(e,i)=>{for(var n in i)de(e,n,{get:i[n],enumerable:!0})};var T={};w(T,{Hide:()=>We,Quit:()=>fe,Show:()=>ge});var le="useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict";var f=(e=21)=>{let i="",n=e;for(;n--;)i+=le[Math.random()*64|0];return i};var ce=window.location.origin+"/wails/runtime",d={Call:0,Clipboard:1,Application:2,Events:3,ContextMenu:4,Dialog:5,Window:6,Screens:7,System:8,Browser:9},se=f();function l(e,i){return function(n,o=null){return we(e,n,i,o)}}function we(e,i,n,o){let t=new URL(ce);t.searchParams.append("object",e),t.searchParams.append("method",i);let a={headers:{}};return n&&(a.headers["x-wails-window-name"]=n),o&&t.searchParams.append("args",JSON.stringify(o)),a.headers["x-wails-client-id"]=se,new Promise((s,p)=>{fetch(t,a).then(c=>{if(c.ok)return c.headers.get("Content-Type")&&c.headers.get("Content-Type").indexOf("application/json")!==-1?c.json():c.text();p(Error(c.statusText))}).then(c=>s(c)).catch(c=>p(c))})}var P=l(d.Application,""),me=0,ue=1,pe=2;function We(){return P(me)}function ge(){return P(ue)}function fe(){return P(pe)}var B={};w(B,{OpenURL:()=>b});var he=l(d.Browser,""),De=0;function b(e){return he(De,{url:e})}var I={};w(I,{SetText:()=>xe,Text:()=>Me});var q=l(d.Clipboard,""),Ce=0,Se=1;function xe(e){return q(Ce,{text:e})}function Me(){return q(Se)}var L={};w(L,{Capabilities:()=>Re,Environment:()=>Ee,IsAMD64:()=>Oe,IsARM:()=>Pe,IsARM64:()=>Te,IsDarkMode:()=>be,IsDebug:()=>F,IsLinux:()=>Ue,IsMac:()=>ye,IsWindows:()=>R,invoke:()=>h});var J=l(d.System,""),Ae=0,ve=1;function h(e){return window.chrome?window.chrome.webview.postMessage(e):window.webkit.messageHandlers.external.postMessage(e)}function be(){return J(Ae)}function Re(){return fetch("/wails/capabilities").json()}function Ee(){return J(ve)}function R(){return window._wails.environment.OS==="windows"}function Ue(){return window._wails.environment.OS==="linux"}function ye(){return window._wails.environment.OS==="darwin"}function Oe(){return window._wails.environment.Arch==="amd64"}function Pe(){return window._wails.environment.Arch==="arm"}function Te(){return window._wails.environment.Arch==="arm64"}function F(){return window._wails.environment.Debug===!0}window.addEventListener("contextmenu",Le);var Be=l(d.ContextMenu,""),Ie=0;function Fe(e,i,n,o){Be(Ie,{id:e,x:i,y:n,data:o})}function Le(e){let i=e.target,n=window.getComputedStyle(i).getPropertyValue("--custom-contextmenu");if(n=n?n.trim():"",n){e.preventDefault();let o=window.getComputedStyle(i).getPropertyValue("--custom-contextmenu-data");Fe(n,e.clientX,e.clientY,o);return}ze(e)}function ze(e){if(F())return;let i=e.target;switch(window.getComputedStyle(i).getPropertyValue("--default-contextmenu").trim()){case"show":return;case"hide":e.preventDefault();return;default:if(i.isContentEditable)return;let t=window.getSelection(),a=t.toString().length>0;if(a)for(let s=0;sS});function S(e){try{return window._wails.flags[e]}catch(i){throw new Error("Unable to retrieve flag '"+e+"': "+i)}}window._wails=window._wails||{};window._wails.setResizable=He;window._wails.endDrag=ee;window.addEventListener("mousedown",_e);window.addEventListener("mousemove",Ge);window.addEventListener("mouseup",je);var x=!1,E=null,$=!1,ke="auto";function Ne(e){let i=window.getComputedStyle(e.target).getPropertyValue("--webkit-app-region");return!i||i===""||i.trim()!=="drag"||e.buttons!==1?!1:e.detail===1}function He(e){$=e}function ee(){document.body.style.cursor="default",x=!1}function Ve(){return E?(h(`resize:${E}`),!0):!1}function _e(e){(R()&&Ve()||Ne(e))&&(x=!!Ze(e))}function Ze(e){return!(e.offsetX>e.target.clientWidth||e.offsetY>e.target.clientHeight)}function je(e){(e.buttons!==void 0?e.buttons:e.which)>0&&ee()}function u(e=ke){document.documentElement.style.cursor=e,E=e}function Ge(e){x=Ye(e),R()&&$&&Ke(e)}function Ye(e){let i=e.buttons!==void 0?e.buttons:e.which;return x&&i>0?(h("drag"),!1):x}function Ke(e){let i=S("system.resizeHandleHeight")||5,n=S("system.resizeHandleWidth")||5,o=S("resizeCornerExtra")||10,t=window.outerWidth-e.clientXJe,GetCurrent:()=>ei,GetPrimary:()=>$e});var k=l(d.Screens,""),Xe=0,Qe=1,qe=2;function Je(){return k(Xe)}function $e(){return k(Qe)}function ei(){return k(qe)}var H={};w(H,{Center:()=>Oi,Close:()=>Qi,Fullscreen:()=>Ti,Get:()=>U,GetZoomLevel:()=>rn,Height:()=>en,Hide:()=>Vi,Maximise:()=>_i,Minimise:()=>Gi,RelativePosition:()=>Ni,Restore:()=>Ki,Screen:()=>Hi,SetAlwaysOnTop:()=>zi,SetBackgroundColour:()=>qi,SetMaxSize:()=>Fi,SetMinSize:()=>Li,SetRelativePosition:()=>ki,SetResizable:()=>Ji,SetSize:()=>Bi,SetTitle:()=>Pi,SetZoomLevel:()=>an,Show:()=>Xi,Size:()=>Ii,ToggleMaximise:()=>ji,UnMaximise:()=>Zi,UnMinimise:()=>Yi,Width:()=>$i,ZoomIn:()=>nn,ZoomOut:()=>on,ZoomReset:()=>tn});var ii=0,ni=1,oi=2,ti=3,ri=4,ai=5,di=6,li=7,ci=8,si=9,wi=10,mi=11,ui=12,pi=13,Wi=14,gi=15,fi=16,hi=17,Di=18,Ci=19,Si=20,xi=21,Mi=22,Ai=23,vi=24,bi=25,Ri=26,Ei=27,Ui=28,yi=29,r=U("");function ie(e){return{Get:i=>ie(l(d.Window,i)),Center:()=>e(ii),SetTitle:i=>e(ni,{title:i}),Fullscreen:()=>e(oi),UnFullscreen:()=>e(ti),SetSize:(i,n)=>e(ri,{width:i,height:n}),Size:()=>e(ai),SetMaxSize:(i,n)=>e(di,{width:i,height:n}),SetMinSize:(i,n)=>e(li,{width:i,height:n}),SetAlwaysOnTop:i=>e(ci,{alwaysOnTop:i}),SetRelativePosition:(i,n)=>e(si,{x:i,y:n}),RelativePosition:()=>e(wi),Screen:()=>e(mi),Hide:()=>e(ui),Maximise:()=>e(pi),UnMaximise:()=>e(Wi),ToggleMaximise:()=>e(gi),Minimise:()=>e(fi),UnMinimise:()=>e(hi),Restore:()=>e(Di),Show:()=>e(Ci),Close:()=>e(Si),SetBackgroundColour:(i,n,o,t)=>e(xi,{r:i,g:n,b:o,a:t}),SetResizable:i=>e(Mi,{resizable:i}),Width:()=>e(Ai),Height:()=>e(vi),ZoomIn:()=>e(bi),ZoomOut:()=>e(Ri),ZoomReset:()=>e(Ei),GetZoomLevel:()=>e(Ui),SetZoomLevel:i=>e(yi,{zoomLevel:i})}}function U(e){return ie(l(d.Window,e))}function Oi(){r.Center()}function Pi(e){r.SetTitle(e)}function Ti(){r.Fullscreen()}function Bi(e,i){r.SetSize(e,i)}function Ii(){return r.Size()}function Fi(e,i){r.SetMaxSize(e,i)}function Li(e,i){r.SetMinSize(e,i)}function zi(e){r.SetAlwaysOnTop(e)}function ki(e,i){r.SetRelativePosition(e,i)}function Ni(){return r.RelativePosition()}function Hi(){return r.Screen()}function Vi(){r.Hide()}function _i(){r.Maximise()}function Zi(){r.UnMaximise()}function ji(){r.ToggleMaximise()}function Gi(){r.Minimise()}function Yi(){r.UnMinimise()}function Ki(){r.Restore()}function Xi(){r.Show()}function Qi(){r.Close()}function qi(e,i,n,o){r.SetBackgroundColour(e,i,n,o)}function Ji(e){r.SetResizable(e)}function $i(){return r.Width()}function en(){return r.Height()}function nn(){r.ZoomIn()}function on(){r.ZoomOut()}function tn(){r.ZoomReset()}function rn(){return r.GetZoomLevel()}function an(e){r.SetZoomLevel(e)}var K={};w(K,{Reload:()=>Y});var j={};w(j,{Emit:()=>Z,Off:()=>Wn,OffAll:()=>gn,On:()=>mn,OnMultiple:()=>_,Once:()=>un,Types:()=>dn,WailsEvent:()=>M,setup:()=>sn});var ne={Windows:{SystemThemeChanged:"windows:SystemThemeChanged",APMPowerStatusChange:"windows:APMPowerStatusChange",APMSuspend:"windows:APMSuspend",APMResumeAutomatic:"windows:APMResumeAutomatic",APMResumeSuspend:"windows:APMResumeSuspend",APMPowerSettingChange:"windows:APMPowerSettingChange",ApplicationStarted:"windows:ApplicationStarted",WebViewNavigationCompleted:"windows:WebViewNavigationCompleted",WindowInactive:"windows:WindowInactive",WindowActive:"windows:WindowActive",WindowClickActive:"windows:WindowClickActive",WindowMaximise:"windows:WindowMaximise",WindowUnMaximise:"windows:WindowUnMaximise",WindowFullscreen:"windows:WindowFullscreen",WindowUnFullscreen:"windows:WindowUnFullscreen",WindowRestore:"windows:WindowRestore",WindowMinimise:"windows:WindowMinimise",WindowUnMinimise:"windows:WindowUnMinimise",WindowClose:"windows:WindowClose",WindowSetFocus:"windows:WindowSetFocus",WindowKillFocus:"windows:WindowKillFocus",WindowDragDrop:"windows:WindowDragDrop",WindowDragEnter:"windows:WindowDragEnter",WindowDragLeave:"windows:WindowDragLeave",WindowDragOver:"windows:WindowDragOver"},Mac:{ApplicationDidBecomeActive:"mac:ApplicationDidBecomeActive",ApplicationDidChangeBackingProperties:"mac:ApplicationDidChangeBackingProperties",ApplicationDidChangeEffectiveAppearance:"mac:ApplicationDidChangeEffectiveAppearance",ApplicationDidChangeIcon:"mac:ApplicationDidChangeIcon",ApplicationDidChangeOcclusionState:"mac:ApplicationDidChangeOcclusionState",ApplicationDidChangeScreenParameters:"mac:ApplicationDidChangeScreenParameters",ApplicationDidChangeStatusBarFrame:"mac:ApplicationDidChangeStatusBarFrame",ApplicationDidChangeStatusBarOrientation:"mac:ApplicationDidChangeStatusBarOrientation",ApplicationDidFinishLaunching:"mac:ApplicationDidFinishLaunching",ApplicationDidHide:"mac:ApplicationDidHide",ApplicationDidResignActiveNotification:"mac:ApplicationDidResignActiveNotification",ApplicationDidUnhide:"mac:ApplicationDidUnhide",ApplicationDidUpdate:"mac:ApplicationDidUpdate",ApplicationWillBecomeActive:"mac:ApplicationWillBecomeActive",ApplicationWillFinishLaunching:"mac:ApplicationWillFinishLaunching",ApplicationWillHide:"mac:ApplicationWillHide",ApplicationWillResignActive:"mac:ApplicationWillResignActive",ApplicationWillTerminate:"mac:ApplicationWillTerminate",ApplicationWillUnhide:"mac:ApplicationWillUnhide",ApplicationWillUpdate:"mac:ApplicationWillUpdate",ApplicationDidChangeTheme:"mac:ApplicationDidChangeTheme!",ApplicationShouldHandleReopen:"mac:ApplicationShouldHandleReopen!",WindowDidBecomeKey:"mac:WindowDidBecomeKey",WindowDidBecomeMain:"mac:WindowDidBecomeMain",WindowDidBeginSheet:"mac:WindowDidBeginSheet",WindowDidChangeAlpha:"mac:WindowDidChangeAlpha",WindowDidChangeBackingLocation:"mac:WindowDidChangeBackingLocation",WindowDidChangeBackingProperties:"mac:WindowDidChangeBackingProperties",WindowDidChangeCollectionBehavior:"mac:WindowDidChangeCollectionBehavior",WindowDidChangeEffectiveAppearance:"mac:WindowDidChangeEffectiveAppearance",WindowDidChangeOcclusionState:"mac:WindowDidChangeOcclusionState",WindowDidChangeOrderingMode:"mac:WindowDidChangeOrderingMode",WindowDidChangeScreen:"mac:WindowDidChangeScreen",WindowDidChangeScreenParameters:"mac:WindowDidChangeScreenParameters",WindowDidChangeScreenProfile:"mac:WindowDidChangeScreenProfile",WindowDidChangeScreenSpace:"mac:WindowDidChangeScreenSpace",WindowDidChangeScreenSpaceProperties:"mac:WindowDidChangeScreenSpaceProperties",WindowDidChangeSharingType:"mac:WindowDidChangeSharingType",WindowDidChangeSpace:"mac:WindowDidChangeSpace",WindowDidChangeSpaceOrderingMode:"mac:WindowDidChangeSpaceOrderingMode",WindowDidChangeTitle:"mac:WindowDidChangeTitle",WindowDidChangeToolbar:"mac:WindowDidChangeToolbar",WindowDidChangeVisibility:"mac:WindowDidChangeVisibility",WindowDidDeminiaturize:"mac:WindowDidDeminiaturize",WindowDidEndSheet:"mac:WindowDidEndSheet",WindowDidEnterFullScreen:"mac:WindowDidEnterFullScreen",WindowDidEnterVersionBrowser:"mac:WindowDidEnterVersionBrowser",WindowDidExitFullScreen:"mac:WindowDidExitFullScreen",WindowDidExitVersionBrowser:"mac:WindowDidExitVersionBrowser",WindowDidExpose:"mac:WindowDidExpose",WindowDidFocus:"mac:WindowDidFocus",WindowDidMiniaturize:"mac:WindowDidMiniaturize",WindowDidMove:"mac:WindowDidMove",WindowDidOrderOffScreen:"mac:WindowDidOrderOffScreen",WindowDidOrderOnScreen:"mac:WindowDidOrderOnScreen",WindowDidResignKey:"mac:WindowDidResignKey",WindowDidResignMain:"mac:WindowDidResignMain",WindowDidResize:"mac:WindowDidResize",WindowDidUpdate:"mac:WindowDidUpdate",WindowDidUpdateAlpha:"mac:WindowDidUpdateAlpha",WindowDidUpdateCollectionBehavior:"mac:WindowDidUpdateCollectionBehavior",WindowDidUpdateCollectionProperties:"mac:WindowDidUpdateCollectionProperties",WindowDidUpdateShadow:"mac:WindowDidUpdateShadow",WindowDidUpdateTitle:"mac:WindowDidUpdateTitle",WindowDidUpdateToolbar:"mac:WindowDidUpdateToolbar",WindowDidUpdateVisibility:"mac:WindowDidUpdateVisibility",WindowShouldClose:"mac:WindowShouldClose!",WindowWillBecomeKey:"mac:WindowWillBecomeKey",WindowWillBecomeMain:"mac:WindowWillBecomeMain",WindowWillBeginSheet:"mac:WindowWillBeginSheet",WindowWillChangeOrderingMode:"mac:WindowWillChangeOrderingMode",WindowWillClose:"mac:WindowWillClose",WindowWillDeminiaturize:"mac:WindowWillDeminiaturize",WindowWillEnterFullScreen:"mac:WindowWillEnterFullScreen",WindowWillEnterVersionBrowser:"mac:WindowWillEnterVersionBrowser",WindowWillExitFullScreen:"mac:WindowWillExitFullScreen",WindowWillExitVersionBrowser:"mac:WindowWillExitVersionBrowser",WindowWillFocus:"mac:WindowWillFocus",WindowWillMiniaturize:"mac:WindowWillMiniaturize",WindowWillMove:"mac:WindowWillMove",WindowWillOrderOffScreen:"mac:WindowWillOrderOffScreen",WindowWillOrderOnScreen:"mac:WindowWillOrderOnScreen",WindowWillResignMain:"mac:WindowWillResignMain",WindowWillResize:"mac:WindowWillResize",WindowWillUnfocus:"mac:WindowWillUnfocus",WindowWillUpdate:"mac:WindowWillUpdate",WindowWillUpdateAlpha:"mac:WindowWillUpdateAlpha",WindowWillUpdateCollectionBehavior:"mac:WindowWillUpdateCollectionBehavior",WindowWillUpdateCollectionProperties:"mac:WindowWillUpdateCollectionProperties",WindowWillUpdateShadow:"mac:WindowWillUpdateShadow",WindowWillUpdateTitle:"mac:WindowWillUpdateTitle",WindowWillUpdateToolbar:"mac:WindowWillUpdateToolbar",WindowWillUpdateVisibility:"mac:WindowWillUpdateVisibility",WindowWillUseStandardFrame:"mac:WindowWillUseStandardFrame",MenuWillOpen:"mac:MenuWillOpen",MenuDidOpen:"mac:MenuDidOpen",MenuDidClose:"mac:MenuDidClose",MenuWillSendAction:"mac:MenuWillSendAction",MenuDidSendAction:"mac:MenuDidSendAction",MenuWillHighlightItem:"mac:MenuWillHighlightItem",MenuDidHighlightItem:"mac:MenuDidHighlightItem",MenuWillDisplayItem:"mac:MenuWillDisplayItem",MenuDidDisplayItem:"mac:MenuDidDisplayItem",MenuWillAddItem:"mac:MenuWillAddItem",MenuDidAddItem:"mac:MenuDidAddItem",MenuWillRemoveItem:"mac:MenuWillRemoveItem",MenuDidRemoveItem:"mac:MenuDidRemoveItem",MenuWillBeginTracking:"mac:MenuWillBeginTracking",MenuDidBeginTracking:"mac:MenuDidBeginTracking",MenuWillEndTracking:"mac:MenuWillEndTracking",MenuDidEndTracking:"mac:MenuDidEndTracking",MenuWillUpdate:"mac:MenuWillUpdate",MenuDidUpdate:"mac:MenuDidUpdate",MenuWillPopUp:"mac:MenuWillPopUp",MenuDidPopUp:"mac:MenuDidPopUp",MenuWillSendActionToItem:"mac:MenuWillSendActionToItem",MenuDidSendActionToItem:"mac:MenuDidSendActionToItem",WebViewDidStartProvisionalNavigation:"mac:WebViewDidStartProvisionalNavigation",WebViewDidReceiveServerRedirectForProvisionalNavigation:"mac:WebViewDidReceiveServerRedirectForProvisionalNavigation",WebViewDidFinishNavigation:"mac:WebViewDidFinishNavigation",WebViewDidCommitNavigation:"mac:WebViewDidCommitNavigation",WindowFileDraggingEntered:"mac:WindowFileDraggingEntered",WindowFileDraggingPerformed:"mac:WindowFileDraggingPerformed",WindowFileDraggingExited:"mac:WindowFileDraggingExited"},Linux:{SystemThemeChanged:"linux:SystemThemeChanged",WindowLoadChanged:"linux:WindowLoadChanged",WindowDeleteEvent:"linux:WindowDeleteEvent",WindowFocusIn:"linux:WindowFocusIn",WindowFocusOut:"linux:WindowFocusOut",ApplicationStartup:"linux:ApplicationStartup"},Common:{ApplicationStarted:"common:ApplicationStarted",WindowMaximise:"common:WindowMaximise",WindowUnMaximise:"common:WindowUnMaximise",WindowFullscreen:"common:WindowFullscreen",WindowUnFullscreen:"common:WindowUnFullscreen",WindowRestore:"common:WindowRestore",WindowMinimise:"common:WindowMinimise",WindowUnMinimise:"common:WindowUnMinimise",WindowClosing:"common:WindowClosing",WindowZoom:"common:WindowZoom",WindowZoomIn:"common:WindowZoomIn",WindowZoomOut:"common:WindowZoomOut",WindowZoomReset:"common:WindowZoomReset",WindowFocus:"common:WindowFocus",WindowLostFocus:"common:WindowLostFocus",WindowShow:"common:WindowShow",WindowHide:"common:WindowHide",WindowDPIChanged:"common:WindowDPIChanged",WindowFilesDropped:"common:WindowFilesDropped",WindowRuntimeReady:"common:WindowRuntimeReady",ThemeChanged:"common:ThemeChanged"}};var dn=ne;window._wails=window._wails||{};window._wails.dispatchWailsEvent=wn;var ln=l(d.Events,""),cn=0,m=new Map,V=class{constructor(i,n,o){this.eventName=i,this.maxCallbacks=o||-1,this.Callback=t=>(n(t),this.maxCallbacks===-1?!1:(this.maxCallbacks-=1,this.maxCallbacks===0))}},M=class{constructor(i,n=null){this.name=i,this.data=n}};function sn(){}function wn(e){let i=m.get(e.name);if(i){let n=i.filter(o=>{if(o.Callback(e))return!0});n.length>0&&(i=i.filter(o=>!n.includes(o)),i.length===0?m.delete(e.name):m.set(e.name,i))}}function _(e,i,n){let o=m.get(e)||[],t=new V(e,i,n);return o.push(t),m.set(e,o),()=>pn(t)}function mn(e,i){return _(e,i,-1)}function un(e,i){return _(e,i,1)}function pn(e){let i=e.eventName,n=m.get(i).filter(o=>o!==e);n.length===0?m.delete(i):m.set(i,n)}function Wn(e,...i){[e,...i].forEach(o=>m.delete(o))}function gn(){m.clear()}function Z(e){return ln(cn,e)}var G={};w(G,{Error:()=>Un,Info:()=>Rn,OpenFile:()=>yn,Question:()=>A,SaveFile:()=>On,Warning:()=>En});window._wails=window._wails||{};window._wails.dialogErrorCallback=bn;window._wails.dialogResultCallback=vn;var fn=0,hn=1,Dn=2,Cn=3,Sn=4,xn=5,Mn=l(d.Dialog,""),W=new Map;function An(){let e;do e=f();while(W.has(e));return e}function D(e,i={}){let n=An();return i["dialog-id"]=n,new Promise((o,t)=>{W.set(n,{resolve:o,reject:t}),Mn(e,i).catch(a=>{t(a),W.delete(n)})})}function vn(e,i,n){let o=W.get(e);o&&(n?o.resolve(JSON.parse(i)):o.resolve(i),W.delete(e))}function bn(e,i){let n=W.get(e);n&&(n.reject(i),W.delete(e))}var Rn=e=>D(fn,e),En=e=>D(hn,e),Un=e=>D(Dn,e),A=e=>D(Cn,e),yn=e=>D(Sn,e),On=e=>D(xn,e);function oe(e,i=null){let n=new M(e,i);Z(n)}function Pn(){document.querySelectorAll("[wml-event]").forEach(function(i){let n=i.getAttribute("wml-event"),o=i.getAttribute("wml-confirm"),t=i.getAttribute("wml-trigger")||"click",a=function(){if(o){A({Title:"Confirm",Message:o,Detached:!1,Buttons:[{Label:"Yes"},{Label:"No",IsDefault:!0}]}).then(function(s){s!=="No"&&oe(n)});return}oe(n)};i.removeEventListener(t,a),i.addEventListener(t,a)})}function te(e,i){let n=U(e),o=In(n);o.has(i);try{o.get(i)()}catch{}}function Tn(){document.querySelectorAll("[wml-window]").forEach(function(i){let n=i.getAttribute("wml-window"),o=i.getAttribute("wml-confirm"),t=i.getAttribute("wml-trigger")||"click",a=i.getAttribute("wml-target-window")||"",s=function(){if(o){A({Title:"Confirm",Message:o,Buttons:[{Label:"Yes"},{Label:"No",IsDefault:!0}]}).then(function(p){p!=="No"&&te(a,n)});return}te(a,n)};i.removeEventListener(t,s),i.addEventListener(t,s)})}function Bn(){document.querySelectorAll("[wml-openurl]").forEach(function(i){let n=i.getAttribute("wml-openurl"),o=i.getAttribute("wml-confirm"),t=i.getAttribute("wml-trigger")||"click",a=function(){if(o){A({Title:"Confirm",Message:o,Buttons:[{Label:"Yes"},{Label:"No",IsDefault:!0}]}).then(function(s){s!=="No"&&b(n)});return}b(n)};i.removeEventListener(t,a),i.addEventListener(t,a)})}function Y(){Pn(),Tn(),Bn()}function In(e){let i=new Map;for(let n in e)typeof e[n]=="function"&&i.set(n,e[n]);return i}var X={};w(X,{ByID:()=>Vn,ByName:()=>Hn,Call:()=>Nn,Plugin:()=>_n});window._wails=window._wails||{};window._wails.callResultHandler=zn;window._wails.callErrorHandler=kn;var y=0,Fn=l(d.Call,""),v=new Map;function Ln(){let e;do e=f();while(v.has(e));return e}function zn(e,i,n){let o=re(e);o&&o.resolve(n?JSON.parse(i):i)}function kn(e,i){let n=re(e);n&&n.reject(i)}function re(e){let i=v.get(e);return v.delete(e),i}function O(e,i={}){return new Promise((n,o)=>{let t=Ln();i["call-id"]=t,v.set(t,{resolve:n,reject:o}),Fn(e,i).catch(a=>{o(a),v.delete(t)})})}function Nn(e){return O(y,e)}function Hn(e,...i){if(typeof e!="string"||e.split(".").length!==3)throw new Error("CallByName requires a string in the format 'package.struct.method'");let[n,o,t]=e.split(".");return O(y,{packageName:n,structName:o,methodName:t,args:i})}function Vn(e,...i){return O(y,{methodID:e,args:i})}function _n(e,i,...n){return O(y,{packageName:"wails-plugins",structName:e,methodName:i,args:n})}window._wails=window._wails||{};window._wails.invoke=h;window.wails=window.wails||{};window.wails.Application=T;window.wails.Browser=B;window.wails.Call=X;window.wails.Clipboard=I;window.wails.Dialogs=G;window.wails.Events=j;window.wails.Flags=z;window.wails.Screens=N;window.wails.System=L;window.wails.Window=H;window.wails.WML=K;var ae=!1;document.addEventListener("DOMContentLoaded",function(){ae=!0,window._wails.invoke("wails:runtime:ready")});function Zn(e){ae||document.readyState==="complete"?e():document.addEventListener("DOMContentLoaded",e)}Zn(()=>{Y()});})();
diff --git a/v3/examples/dev/go.mod b/v3/examples/dev/go.mod
index cebd31d2402..33fde4e41f8 100644
--- a/v3/examples/dev/go.mod
+++ b/v3/examples/dev/go.mod
@@ -1,17 +1,19 @@
module changeme
-go 1.21
+go 1.21.1
+
+toolchain go1.22.0
require github.com/wailsapp/wails/v3 v3.0.0-alpha.0
require (
- github.com/Microsoft/go-winio v0.4.16 // indirect
+ github.com/Microsoft/go-winio v0.6.1 // indirect
github.com/bep/debounce v1.2.1 // indirect
github.com/ebitengine/purego v0.4.0-alpha.4 // indirect
- github.com/emirpasic/gods v1.12.0 // indirect
- github.com/go-git/gcfg v1.5.0 // indirect
- github.com/go-git/go-billy/v5 v5.2.0 // indirect
- github.com/go-git/go-git/v5 v5.3.0 // indirect
+ github.com/emirpasic/gods v1.18.1 // indirect
+ github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 // indirect
+ github.com/go-git/go-billy/v5 v5.5.0 // indirect
+ github.com/go-git/go-git/v5 v5.11.0 // indirect
github.com/go-ole/go-ole v1.2.6 // indirect
github.com/godbus/dbus/v5 v5.1.0 // indirect
github.com/google/uuid v1.3.0 // indirect
@@ -19,11 +21,11 @@ require (
github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 // indirect
github.com/jchv/go-winloader v0.0.0-20210711035445-715c2860da7e // indirect
github.com/json-iterator/go v1.1.12 // indirect
- github.com/kevinburke/ssh_config v0.0.0-20201106050909-4977a11b4351 // indirect
+ github.com/kevinburke/ssh_config v1.2.0 // indirect
github.com/kr/pretty v0.3.1 // indirect
github.com/leaanthony/go-ansi-parser v1.6.1 // indirect
github.com/leaanthony/u v1.1.0 // indirect
- github.com/lmittmann/tint v1.0.0 // indirect
+ github.com/lmittmann/tint v1.0.3 // indirect
github.com/mattn/go-colorable v0.1.13 // indirect
github.com/mattn/go-isatty v0.0.19 // indirect
github.com/mitchellh/go-homedir v1.1.0 // indirect
@@ -31,17 +33,17 @@ require (
github.com/modern-go/reflect2 v1.0.2 // indirect
github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8 // indirect
github.com/rivo/uniseg v0.4.4 // indirect
- github.com/rogpeppe/go-internal v1.10.1-0.20230524175051-ec119421bb97 // indirect
+ github.com/rogpeppe/go-internal v1.11.0 // indirect
github.com/samber/lo v1.38.1 // indirect
github.com/sergi/go-diff v1.2.0 // indirect
github.com/stretchr/testify v1.8.4 // indirect
github.com/wailsapp/go-webview2 v1.0.9 // indirect
github.com/wailsapp/mimetype v1.4.1 // indirect
- github.com/xanzy/ssh-agent v0.3.0 // indirect
- golang.org/x/crypto v0.9.0 // indirect
+ github.com/xanzy/ssh-agent v0.3.3 // indirect
+ golang.org/x/crypto v0.19.0 // indirect
golang.org/x/exp v0.0.0-20230626212559-97b1e661b5df // indirect
- golang.org/x/net v0.10.0 // indirect
- golang.org/x/sys v0.13.0 // indirect
+ golang.org/x/net v0.19.0 // indirect
+ golang.org/x/sys v0.17.0 // indirect
gopkg.in/warnings.v0 v0.1.2 // indirect
)
diff --git a/v3/examples/dev/go.sum b/v3/examples/dev/go.sum
index acb39d10195..817d628318a 100644
--- a/v3/examples/dev/go.sum
+++ b/v3/examples/dev/go.sum
@@ -1,6 +1,8 @@
github.com/Microsoft/go-winio v0.4.14/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA=
github.com/Microsoft/go-winio v0.4.16 h1:FtSW/jqD+l4ba5iPBj9CODVtgfYAD8w2wS923g/cFDk=
github.com/Microsoft/go-winio v0.4.16/go.mod h1:XB6nPKklQyQ7GC9LdcBEcBl8PF76WugXOPRXwdLnMv0=
+github.com/Microsoft/go-winio v0.5.2/go.mod h1:WpS1mjBmmwHBEWmogvA2mj8546UReBk4v8QkMxJ6pZY=
+github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM=
github.com/alcortesm/tgz v0.0.0-20161220082320-9c5fe88206d7 h1:uSoVVbwJiQipAclBbw+8quDsfcvFjOpI5iCf4p/cqCs=
github.com/alcortesm/tgz v0.0.0-20161220082320-9c5fe88206d7/go.mod h1:6zEj6s6u/ghQa61ZWa/C2Aw3RkjiTBOix7dkqa1VLIs=
github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239 h1:kFOfPq6dUM1hTo4JG6LR5AXSUEsOjtdm0kw0FtQtMJA=
@@ -17,19 +19,23 @@ github.com/ebitengine/purego v0.4.0-alpha.4 h1:Y7yIV06Yo5M2BAdD7EVPhfp6LZ0tEcQo5
github.com/ebitengine/purego v0.4.0-alpha.4/go.mod h1:ah1In8AOtksoNK6yk5z1HTJeUkC1Ez4Wk2idgGslMwQ=
github.com/emirpasic/gods v1.12.0 h1:QAUIPSaCu4G+POclxeqb3F+WPpdKqFGlw36+yOzGlrg=
github.com/emirpasic/gods v1.12.0/go.mod h1:YfzfFFoVP/catgzJb4IKIqXjX78Ha8FMSDh3ymbK86o=
+github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ=
github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc=
github.com/gliderlabs/ssh v0.2.2 h1:6zsha5zo/TWhRhwqCD3+EarCAgZ2yN28ipRnGPnwkI0=
github.com/gliderlabs/ssh v0.2.2/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0=
github.com/go-git/gcfg v1.5.0 h1:Q5ViNfGF8zFgyJWPqYwA7qGFoMTEiBmdlkcfRmpIMa4=
github.com/go-git/gcfg v1.5.0/go.mod h1:5m20vg6GwYabIxaOonVkTdrILxQMpEShl1xiMF4ua+E=
+github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376/go.mod h1:an3vInlBmSxCcxctByoQdvwPiA7DTK7jaaFDBTtu0ic=
github.com/go-git/go-billy/v5 v5.0.0/go.mod h1:pmpqyWchKfYfrkb/UVH4otLvyi/5gJlGI4Hb3ZqZ3W0=
github.com/go-git/go-billy/v5 v5.1.0/go.mod h1:pmpqyWchKfYfrkb/UVH4otLvyi/5gJlGI4Hb3ZqZ3W0=
github.com/go-git/go-billy/v5 v5.2.0 h1:GcoouCP9J+5slw2uXAocL70z8ml4A8B/H8nEPt6CLPk=
github.com/go-git/go-billy/v5 v5.2.0/go.mod h1:pmpqyWchKfYfrkb/UVH4otLvyi/5gJlGI4Hb3ZqZ3W0=
+github.com/go-git/go-billy/v5 v5.5.0/go.mod h1:hmexnoNsr2SJU1Ju67OaNz5ASJY3+sHgFRpCtpDCKow=
github.com/go-git/go-git-fixtures/v4 v4.0.2-0.20200613231340-f56387b50c12 h1:PbKy9zOy4aAKrJ5pibIRpVO2BXnK1Tlcg+caKI7Ox5M=
github.com/go-git/go-git-fixtures/v4 v4.0.2-0.20200613231340-f56387b50c12/go.mod h1:m+ICp2rF3jDhFgEZ/8yziagdT1C+ZpZcrJjappBCDSw=
github.com/go-git/go-git/v5 v5.3.0 h1:8WKMtJR2j8RntEXR/uvTKagfEt4GYlwQ7mntE4+0GWc=
github.com/go-git/go-git/v5 v5.3.0/go.mod h1:xdX4bWJ48aOrdhnl2XqHYstHbbp6+LFS4r4X+lNVprw=
+github.com/go-git/go-git/v5 v5.11.0/go.mod h1:6GFcX2P3NM7FPBfpePbpLd21XxsgdAt+lKqXmCUiUCY=
github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY=
github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0=
github.com/godbus/dbus/v5 v5.1.0 h1:4KLkAxT3aOY8Li4FRJe/KvhoNFFxo0m6fNuFUO8QJUk=
@@ -51,6 +57,7 @@ github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnr
github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
github.com/kevinburke/ssh_config v0.0.0-20201106050909-4977a11b4351 h1:DowS9hvgyYSX4TO5NpyC606/Z4SxnNYbT+WX27or6Ck=
github.com/kevinburke/ssh_config v0.0.0-20201106050909-4977a11b4351/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM=
+github.com/kevinburke/ssh_config v1.2.0/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM=
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
@@ -66,6 +73,7 @@ github.com/leaanthony/u v1.1.0 h1:2n0d2BwPVXSUq5yhe8lJPHdxevE2qK5G99PMStMZMaI=
github.com/leaanthony/u v1.1.0/go.mod h1:9+o6hejoRljvZ3BzdYlVL0JYCwtnAsVuN9pVTQcaRfI=
github.com/lmittmann/tint v1.0.0 h1:fzEj70K1L58uyoePQxKe+ezDZJ5pybiWGdA0JeFvvyw=
github.com/lmittmann/tint v1.0.0/go.mod h1:HIS3gSy7qNwGCj+5oRjAutErFBl4BzdQP6cJZ0NfMwE=
+github.com/lmittmann/tint v1.0.3/go.mod h1:HIS3gSy7qNwGCj+5oRjAutErFBl4BzdQP6cJZ0NfMwE=
github.com/matryer/is v1.4.0 h1:sosSmIWwkYITGrxZ25ULNDeKiMNzFSr4V/eqBQP0PeE=
github.com/matryer/is v1.4.0/go.mod h1:8I/i5uYgLzgsgEloJE1U6xx5HkBQpAZvepWuujKwMRU=
github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=
@@ -94,12 +102,14 @@ github.com/rivo/uniseg v0.4.4/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUc
github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=
github.com/rogpeppe/go-internal v1.10.1-0.20230524175051-ec119421bb97 h1:3RPlVWzZ/PDqmVuf/FKHARG5EMid/tl7cv54Sw/QRVY=
github.com/rogpeppe/go-internal v1.10.1-0.20230524175051-ec119421bb97/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA=
+github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA=
github.com/samber/lo v1.38.1 h1:j2XEAqXKb09Am4ebOg31SpvzUTTs6EN3VfgeLUhPdXM=
github.com/samber/lo v1.38.1/go.mod h1:+m/ZKRl6ClXCE2Lgf3MsQlWfh4bn1bz6CXEOxnEXnEA=
github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM=
github.com/sergi/go-diff v1.2.0 h1:XU+rvMAioB0UC3q1MFrIQy4Vo5/4VsRDQQXHsEya6xQ=
github.com/sergi/go-diff v1.2.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM=
github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q=
+github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
@@ -113,31 +123,43 @@ github.com/wailsapp/mimetype v1.4.1 h1:pQN9ycO7uo4vsUUuPeHEYoUkLVkaRntMnHJxVwYhw
github.com/wailsapp/mimetype v1.4.1/go.mod h1:9aV5k31bBOv5z6u+QP8TltzvNGJPmNJD4XlAL3U+j3o=
github.com/xanzy/ssh-agent v0.3.0 h1:wUMzuKtKilRgBAD1sUb8gOwwRr2FGoBVumcjoOACClI=
github.com/xanzy/ssh-agent v0.3.0/go.mod h1:3s9xbODqPuuhK9JV1R321M/FlMZSBvE5aY6eAcqrDh0=
+github.com/xanzy/ssh-agent v0.3.3/go.mod h1:6dzNDKs0J9rVPHPhaGCukekBHKqfl+L3KghI1Bc68Uw=
golang.org/x/crypto v0.0.0-20190219172222-a4c6cb3142f2/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4=
+golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
golang.org/x/crypto v0.9.0 h1:LF6fAI+IutBocDJ2OT0Q1g8plpYljMZ4+lty+dsqw3g=
golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0=
+golang.org/x/crypto v0.16.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4=
+golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU=
golang.org/x/exp v0.0.0-20230626212559-97b1e661b5df h1:UA2aFVmmsIlefxMk29Dp2juaUSth8Pyn3Tq5Y5mJGME=
golang.org/x/exp v0.0.0-20230626212559-97b1e661b5df/go.mod h1:FXUEEKJgO7OQYeo8N01OfiKP8RXMtf6e8aTskBGqWdc=
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
golang.org/x/net v0.0.0-20210326060303-6b1517762897/go.mod h1:uSPa2vr4CLtc/ILN5odXGNXS6mhrKVzTaCXzk9m6W3k=
golang.org/x/net v0.0.0-20210505024714-0287a6fb4125/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
+golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
golang.org/x/net v0.10.0 h1:X2//UzNDwYmtCLn7To6G58Wr6f5ahEAQgKNzv9Y951M=
golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
+golang.org/x/net v0.19.0/go.mod h1:CfAk/cbD4CthTvqiEl8NpboMuiuOYsAr/7NOjZJtv1U=
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200810151505-1b9f1253b3ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210324051608-47abb6519492/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20210616045830-e2b7044e8c71/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE=
golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
+golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/term v0.13.0 h1:bb+I9cTfFazGW51MZqBVmZy7+JEJMouUHTUSKVQLBek=
golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U=
diff --git a/v3/examples/events/assets/index.html b/v3/examples/events/assets/index.html
index d8e0906ee5e..a64a42c32da 100644
--- a/v3/examples/events/assets/index.html
+++ b/v3/examples/events/assets/index.html
@@ -3,6 +3,7 @@
Title
+
diff --git a/v3/examples/events/assets/runtime.js b/v3/examples/events/assets/runtime.js
new file mode 100644
index 00000000000..ec430090db6
--- /dev/null
+++ b/v3/examples/events/assets/runtime.js
@@ -0,0 +1 @@
+(()=>{var de=Object.defineProperty;var w=(e,i)=>{for(var n in i)de(e,n,{get:i[n],enumerable:!0})};var T={};w(T,{Hide:()=>We,Quit:()=>fe,Show:()=>ge});var le="useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict";var f=(e=21)=>{let i="",n=e;for(;n--;)i+=le[Math.random()*64|0];return i};var ce=window.location.origin+"/wails/runtime",d={Call:0,Clipboard:1,Application:2,Events:3,ContextMenu:4,Dialog:5,Window:6,Screens:7,System:8,Browser:9},se=f();function l(e,i){return function(n,o=null){return we(e,n,i,o)}}function we(e,i,n,o){let t=new URL(ce);t.searchParams.append("object",e),t.searchParams.append("method",i);let a={headers:{}};return n&&(a.headers["x-wails-window-name"]=n),o&&t.searchParams.append("args",JSON.stringify(o)),a.headers["x-wails-client-id"]=se,new Promise((s,p)=>{fetch(t,a).then(c=>{if(c.ok)return c.headers.get("Content-Type")&&c.headers.get("Content-Type").indexOf("application/json")!==-1?c.json():c.text();p(Error(c.statusText))}).then(c=>s(c)).catch(c=>p(c))})}var P=l(d.Application,""),me=0,ue=1,pe=2;function We(){return P(me)}function ge(){return P(ue)}function fe(){return P(pe)}var B={};w(B,{OpenURL:()=>b});var he=l(d.Browser,""),De=0;function b(e){return he(De,{url:e})}var I={};w(I,{SetText:()=>Me,Text:()=>xe});var q=l(d.Clipboard,""),Ce=0,Se=1;function Me(e){return q(Ce,{text:e})}function xe(){return q(Se)}var L={};w(L,{Capabilities:()=>Re,Environment:()=>Ee,IsAMD64:()=>Oe,IsARM:()=>Pe,IsARM64:()=>Te,IsDarkMode:()=>be,IsDebug:()=>F,IsLinux:()=>Ue,IsMac:()=>ye,IsWindows:()=>R,invoke:()=>h});var J=l(d.System,""),Ae=0,ve=1;function h(e){return window.chrome?window.chrome.webview.postMessage(e):window.webkit.messageHandlers.external.postMessage(e)}function be(){return J(Ae)}function Re(){return fetch("/wails/capabilities").json()}function Ee(){return J(ve)}function R(){return window._wails.environment.OS==="windows"}function Ue(){return window._wails.environment.OS==="linux"}function ye(){return window._wails.environment.OS==="darwin"}function Oe(){return window._wails.environment.Arch==="amd64"}function Pe(){return window._wails.environment.Arch==="arm"}function Te(){return window._wails.environment.Arch==="arm64"}function F(){return window._wails.environment.Debug===!0}window.addEventListener("contextmenu",Le);var Be=l(d.ContextMenu,""),Ie=0;function Fe(e,i,n,o){Be(Ie,{id:e,x:i,y:n,data:o})}function Le(e){let i=e.target,n=window.getComputedStyle(i).getPropertyValue("--custom-contextmenu");if(n=n?n.trim():"",n){e.preventDefault();let o=window.getComputedStyle(i).getPropertyValue("--custom-contextmenu-data");Fe(n,e.clientX,e.clientY,o);return}ze(e)}function ze(e){if(F())return;let i=e.target;switch(window.getComputedStyle(i).getPropertyValue("--default-contextmenu").trim()){case"show":return;case"hide":e.preventDefault();return;default:if(i.isContentEditable)return;let t=window.getSelection(),a=t.toString().length>0;if(a)for(let s=0;sS});function S(e){try{return window._wails.flags[e]}catch(i){throw new Error("Unable to retrieve flag '"+e+"': "+i)}}window._wails=window._wails||{};window._wails.setResizable=He;window._wails.endDrag=ee;window.addEventListener("mousedown",_e);window.addEventListener("mousemove",Ge);window.addEventListener("mouseup",je);var M=!1,E=null,$=!1,ke="auto";function Ne(e){let i=window.getComputedStyle(e.target).getPropertyValue("--webkit-app-region");return!i||i===""||i.trim()!=="drag"||e.buttons!==1?!1:e.detail===1}function He(e){$=e}function ee(){document.body.style.cursor="default",M=!1}function Ve(){return E?(h(`resize:${E}`),!0):!1}function _e(e){(R()&&Ve()||Ne(e))&&(M=!!Ze(e))}function Ze(e){return!(e.offsetX>e.target.clientWidth||e.offsetY>e.target.clientHeight)}function je(e){(e.buttons!==void 0?e.buttons:e.which)>0&&ee()}function u(e=ke){document.documentElement.style.cursor=e,E=e}function Ge(e){M=Ye(e),R()&&$&&Ke(e)}function Ye(e){let i=e.buttons!==void 0?e.buttons:e.which;return M&&i>0?(h("drag"),!1):M}function Ke(e){let i=S("system.resizeHandleHeight")||5,n=S("system.resizeHandleWidth")||5,o=S("resizeCornerExtra")||10,t=window.outerWidth-e.clientXJe,GetCurrent:()=>ei,GetPrimary:()=>$e});var k=l(d.Screens,""),Xe=0,Qe=1,qe=2;function Je(){return k(Xe)}function $e(){return k(Qe)}function ei(){return k(qe)}var H={};w(H,{Center:()=>Oi,Close:()=>Qi,Fullscreen:()=>Ti,Get:()=>U,GetZoomLevel:()=>rn,Height:()=>en,Hide:()=>Vi,Maximise:()=>_i,Minimise:()=>Gi,RelativePosition:()=>Ni,Restore:()=>Ki,Screen:()=>Hi,SetAlwaysOnTop:()=>zi,SetBackgroundColour:()=>qi,SetMaxSize:()=>Fi,SetMinSize:()=>Li,SetRelativePosition:()=>ki,SetResizable:()=>Ji,SetSize:()=>Bi,SetTitle:()=>Pi,SetZoomLevel:()=>an,Show:()=>Xi,Size:()=>Ii,ToggleMaximise:()=>ji,UnMaximise:()=>Zi,UnMinimise:()=>Yi,Width:()=>$i,ZoomIn:()=>nn,ZoomOut:()=>on,ZoomReset:()=>tn});var ii=0,ni=1,oi=2,ti=3,ri=4,ai=5,di=6,li=7,ci=8,si=9,wi=10,mi=11,ui=12,pi=13,Wi=14,gi=15,fi=16,hi=17,Di=18,Ci=19,Si=20,Mi=21,xi=22,Ai=23,vi=24,bi=25,Ri=26,Ei=27,Ui=28,yi=29,r=U("");function ie(e){return{Get:i=>ie(l(d.Window,i)),Center:()=>e(ii),SetTitle:i=>e(ni,{title:i}),Fullscreen:()=>e(oi),UnFullscreen:()=>e(ti),SetSize:(i,n)=>e(ri,{width:i,height:n}),Size:()=>e(ai),SetMaxSize:(i,n)=>e(di,{width:i,height:n}),SetMinSize:(i,n)=>e(li,{width:i,height:n}),SetAlwaysOnTop:i=>e(ci,{alwaysOnTop:i}),SetRelativePosition:(i,n)=>e(si,{x:i,y:n}),RelativePosition:()=>e(wi),Screen:()=>e(mi),Hide:()=>e(ui),Maximise:()=>e(pi),UnMaximise:()=>e(Wi),ToggleMaximise:()=>e(gi),Minimise:()=>e(fi),UnMinimise:()=>e(hi),Restore:()=>e(Di),Show:()=>e(Ci),Close:()=>e(Si),SetBackgroundColour:(i,n,o,t)=>e(Mi,{r:i,g:n,b:o,a:t}),SetResizable:i=>e(xi,{resizable:i}),Width:()=>e(Ai),Height:()=>e(vi),ZoomIn:()=>e(bi),ZoomOut:()=>e(Ri),ZoomReset:()=>e(Ei),GetZoomLevel:()=>e(Ui),SetZoomLevel:i=>e(yi,{zoomLevel:i})}}function U(e){return ie(l(d.Window,e))}function Oi(){r.Center()}function Pi(e){r.SetTitle(e)}function Ti(){r.Fullscreen()}function Bi(e,i){r.SetSize(e,i)}function Ii(){return r.Size()}function Fi(e,i){r.SetMaxSize(e,i)}function Li(e,i){r.SetMinSize(e,i)}function zi(e){r.SetAlwaysOnTop(e)}function ki(e,i){r.SetRelativePosition(e,i)}function Ni(){return r.RelativePosition()}function Hi(){return r.Screen()}function Vi(){r.Hide()}function _i(){r.Maximise()}function Zi(){r.UnMaximise()}function ji(){r.ToggleMaximise()}function Gi(){r.Minimise()}function Yi(){r.UnMinimise()}function Ki(){r.Restore()}function Xi(){r.Show()}function Qi(){r.Close()}function qi(e,i,n,o){r.SetBackgroundColour(e,i,n,o)}function Ji(e){r.SetResizable(e)}function $i(){return r.Width()}function en(){return r.Height()}function nn(){r.ZoomIn()}function on(){r.ZoomOut()}function tn(){r.ZoomReset()}function rn(){return r.GetZoomLevel()}function an(e){r.SetZoomLevel(e)}var K={};w(K,{Reload:()=>Y});var j={};w(j,{Emit:()=>Z,Off:()=>Wn,OffAll:()=>gn,On:()=>mn,OnMultiple:()=>_,Once:()=>un,Types:()=>dn,WailsEvent:()=>x,setup:()=>sn});var ne={Windows:{SystemThemeChanged:"windows:SystemThemeChanged",APMPowerStatusChange:"windows:APMPowerStatusChange",APMSuspend:"windows:APMSuspend",APMResumeAutomatic:"windows:APMResumeAutomatic",APMResumeSuspend:"windows:APMResumeSuspend",APMPowerSettingChange:"windows:APMPowerSettingChange",ApplicationStarted:"windows:ApplicationStarted",WebViewNavigationCompleted:"windows:WebViewNavigationCompleted",WindowInactive:"windows:WindowInactive",WindowActive:"windows:WindowActive",WindowClickActive:"windows:WindowClickActive",WindowMaximise:"windows:WindowMaximise",WindowUnMaximise:"windows:WindowUnMaximise",WindowFullscreen:"windows:WindowFullscreen",WindowUnFullscreen:"windows:WindowUnFullscreen",WindowRestore:"windows:WindowRestore",WindowMinimise:"windows:WindowMinimise",WindowUnMinimise:"windows:WindowUnMinimise",WindowClose:"windows:WindowClose",WindowSetFocus:"windows:WindowSetFocus",WindowKillFocus:"windows:WindowKillFocus",WindowDragDrop:"windows:WindowDragDrop",WindowDragEnter:"windows:WindowDragEnter",WindowDragLeave:"windows:WindowDragLeave",WindowDragOver:"windows:WindowDragOver"},Mac:{ApplicationDidBecomeActive:"mac:ApplicationDidBecomeActive",ApplicationDidChangeBackingProperties:"mac:ApplicationDidChangeBackingProperties",ApplicationDidChangeEffectiveAppearance:"mac:ApplicationDidChangeEffectiveAppearance",ApplicationDidChangeIcon:"mac:ApplicationDidChangeIcon",ApplicationDidChangeOcclusionState:"mac:ApplicationDidChangeOcclusionState",ApplicationDidChangeScreenParameters:"mac:ApplicationDidChangeScreenParameters",ApplicationDidChangeStatusBarFrame:"mac:ApplicationDidChangeStatusBarFrame",ApplicationDidChangeStatusBarOrientation:"mac:ApplicationDidChangeStatusBarOrientation",ApplicationDidFinishLaunching:"mac:ApplicationDidFinishLaunching",ApplicationDidHide:"mac:ApplicationDidHide",ApplicationDidResignActiveNotification:"mac:ApplicationDidResignActiveNotification",ApplicationDidUnhide:"mac:ApplicationDidUnhide",ApplicationDidUpdate:"mac:ApplicationDidUpdate",ApplicationWillBecomeActive:"mac:ApplicationWillBecomeActive",ApplicationWillFinishLaunching:"mac:ApplicationWillFinishLaunching",ApplicationWillHide:"mac:ApplicationWillHide",ApplicationWillResignActive:"mac:ApplicationWillResignActive",ApplicationWillTerminate:"mac:ApplicationWillTerminate",ApplicationWillUnhide:"mac:ApplicationWillUnhide",ApplicationWillUpdate:"mac:ApplicationWillUpdate",ApplicationDidChangeTheme:"mac:ApplicationDidChangeTheme!",ApplicationShouldHandleReopen:"mac:ApplicationShouldHandleReopen!",WindowDidBecomeKey:"mac:WindowDidBecomeKey",WindowDidBecomeMain:"mac:WindowDidBecomeMain",WindowDidBeginSheet:"mac:WindowDidBeginSheet",WindowDidChangeAlpha:"mac:WindowDidChangeAlpha",WindowDidChangeBackingLocation:"mac:WindowDidChangeBackingLocation",WindowDidChangeBackingProperties:"mac:WindowDidChangeBackingProperties",WindowDidChangeCollectionBehavior:"mac:WindowDidChangeCollectionBehavior",WindowDidChangeEffectiveAppearance:"mac:WindowDidChangeEffectiveAppearance",WindowDidChangeOcclusionState:"mac:WindowDidChangeOcclusionState",WindowDidChangeOrderingMode:"mac:WindowDidChangeOrderingMode",WindowDidChangeScreen:"mac:WindowDidChangeScreen",WindowDidChangeScreenParameters:"mac:WindowDidChangeScreenParameters",WindowDidChangeScreenProfile:"mac:WindowDidChangeScreenProfile",WindowDidChangeScreenSpace:"mac:WindowDidChangeScreenSpace",WindowDidChangeScreenSpaceProperties:"mac:WindowDidChangeScreenSpaceProperties",WindowDidChangeSharingType:"mac:WindowDidChangeSharingType",WindowDidChangeSpace:"mac:WindowDidChangeSpace",WindowDidChangeSpaceOrderingMode:"mac:WindowDidChangeSpaceOrderingMode",WindowDidChangeTitle:"mac:WindowDidChangeTitle",WindowDidChangeToolbar:"mac:WindowDidChangeToolbar",WindowDidChangeVisibility:"mac:WindowDidChangeVisibility",WindowDidDeminiaturize:"mac:WindowDidDeminiaturize",WindowDidEndSheet:"mac:WindowDidEndSheet",WindowDidEnterFullScreen:"mac:WindowDidEnterFullScreen",WindowDidEnterVersionBrowser:"mac:WindowDidEnterVersionBrowser",WindowDidExitFullScreen:"mac:WindowDidExitFullScreen",WindowDidExitVersionBrowser:"mac:WindowDidExitVersionBrowser",WindowDidExpose:"mac:WindowDidExpose",WindowDidFocus:"mac:WindowDidFocus",WindowDidMiniaturize:"mac:WindowDidMiniaturize",WindowDidMove:"mac:WindowDidMove",WindowDidOrderOffScreen:"mac:WindowDidOrderOffScreen",WindowDidOrderOnScreen:"mac:WindowDidOrderOnScreen",WindowDidResignKey:"mac:WindowDidResignKey",WindowDidResignMain:"mac:WindowDidResignMain",WindowDidResize:"mac:WindowDidResize",WindowDidUpdate:"mac:WindowDidUpdate",WindowDidUpdateAlpha:"mac:WindowDidUpdateAlpha",WindowDidUpdateCollectionBehavior:"mac:WindowDidUpdateCollectionBehavior",WindowDidUpdateCollectionProperties:"mac:WindowDidUpdateCollectionProperties",WindowDidUpdateShadow:"mac:WindowDidUpdateShadow",WindowDidUpdateTitle:"mac:WindowDidUpdateTitle",WindowDidUpdateToolbar:"mac:WindowDidUpdateToolbar",WindowDidUpdateVisibility:"mac:WindowDidUpdateVisibility",WindowShouldClose:"mac:WindowShouldClose!",WindowWillBecomeKey:"mac:WindowWillBecomeKey",WindowWillBecomeMain:"mac:WindowWillBecomeMain",WindowWillBeginSheet:"mac:WindowWillBeginSheet",WindowWillChangeOrderingMode:"mac:WindowWillChangeOrderingMode",WindowWillClose:"mac:WindowWillClose",WindowWillDeminiaturize:"mac:WindowWillDeminiaturize",WindowWillEnterFullScreen:"mac:WindowWillEnterFullScreen",WindowWillEnterVersionBrowser:"mac:WindowWillEnterVersionBrowser",WindowWillExitFullScreen:"mac:WindowWillExitFullScreen",WindowWillExitVersionBrowser:"mac:WindowWillExitVersionBrowser",WindowWillFocus:"mac:WindowWillFocus",WindowWillMiniaturize:"mac:WindowWillMiniaturize",WindowWillMove:"mac:WindowWillMove",WindowWillOrderOffScreen:"mac:WindowWillOrderOffScreen",WindowWillOrderOnScreen:"mac:WindowWillOrderOnScreen",WindowWillResignMain:"mac:WindowWillResignMain",WindowWillResize:"mac:WindowWillResize",WindowWillUnfocus:"mac:WindowWillUnfocus",WindowWillUpdate:"mac:WindowWillUpdate",WindowWillUpdateAlpha:"mac:WindowWillUpdateAlpha",WindowWillUpdateCollectionBehavior:"mac:WindowWillUpdateCollectionBehavior",WindowWillUpdateCollectionProperties:"mac:WindowWillUpdateCollectionProperties",WindowWillUpdateShadow:"mac:WindowWillUpdateShadow",WindowWillUpdateTitle:"mac:WindowWillUpdateTitle",WindowWillUpdateToolbar:"mac:WindowWillUpdateToolbar",WindowWillUpdateVisibility:"mac:WindowWillUpdateVisibility",WindowWillUseStandardFrame:"mac:WindowWillUseStandardFrame",MenuWillOpen:"mac:MenuWillOpen",MenuDidOpen:"mac:MenuDidOpen",MenuDidClose:"mac:MenuDidClose",MenuWillSendAction:"mac:MenuWillSendAction",MenuDidSendAction:"mac:MenuDidSendAction",MenuWillHighlightItem:"mac:MenuWillHighlightItem",MenuDidHighlightItem:"mac:MenuDidHighlightItem",MenuWillDisplayItem:"mac:MenuWillDisplayItem",MenuDidDisplayItem:"mac:MenuDidDisplayItem",MenuWillAddItem:"mac:MenuWillAddItem",MenuDidAddItem:"mac:MenuDidAddItem",MenuWillRemoveItem:"mac:MenuWillRemoveItem",MenuDidRemoveItem:"mac:MenuDidRemoveItem",MenuWillBeginTracking:"mac:MenuWillBeginTracking",MenuDidBeginTracking:"mac:MenuDidBeginTracking",MenuWillEndTracking:"mac:MenuWillEndTracking",MenuDidEndTracking:"mac:MenuDidEndTracking",MenuWillUpdate:"mac:MenuWillUpdate",MenuDidUpdate:"mac:MenuDidUpdate",MenuWillPopUp:"mac:MenuWillPopUp",MenuDidPopUp:"mac:MenuDidPopUp",MenuWillSendActionToItem:"mac:MenuWillSendActionToItem",MenuDidSendActionToItem:"mac:MenuDidSendActionToItem",WebViewDidStartProvisionalNavigation:"mac:WebViewDidStartProvisionalNavigation",WebViewDidReceiveServerRedirectForProvisionalNavigation:"mac:WebViewDidReceiveServerRedirectForProvisionalNavigation",WebViewDidFinishNavigation:"mac:WebViewDidFinishNavigation",WebViewDidCommitNavigation:"mac:WebViewDidCommitNavigation",WindowFileDraggingEntered:"mac:WindowFileDraggingEntered",WindowFileDraggingPerformed:"mac:WindowFileDraggingPerformed",WindowFileDraggingExited:"mac:WindowFileDraggingExited"},Linux:{SystemThemeChanged:"linux:SystemThemeChanged"},Common:{ApplicationStarted:"common:ApplicationStarted",WindowMaximise:"common:WindowMaximise",WindowUnMaximise:"common:WindowUnMaximise",WindowFullscreen:"common:WindowFullscreen",WindowUnFullscreen:"common:WindowUnFullscreen",WindowRestore:"common:WindowRestore",WindowMinimise:"common:WindowMinimise",WindowUnMinimise:"common:WindowUnMinimise",WindowClosing:"common:WindowClosing",WindowZoom:"common:WindowZoom",WindowZoomIn:"common:WindowZoomIn",WindowZoomOut:"common:WindowZoomOut",WindowZoomReset:"common:WindowZoomReset",WindowFocus:"common:WindowFocus",WindowLostFocus:"common:WindowLostFocus",WindowShow:"common:WindowShow",WindowHide:"common:WindowHide",WindowDPIChanged:"common:WindowDPIChanged",WindowFilesDropped:"common:WindowFilesDropped",WindowRuntimeReady:"common:WindowRuntimeReady",ThemeChanged:"common:ThemeChanged"}};var dn=ne;window._wails=window._wails||{};window._wails.dispatchWailsEvent=wn;var ln=l(d.Events,""),cn=0,m=new Map,V=class{constructor(i,n,o){this.eventName=i,this.maxCallbacks=o||-1,this.Callback=t=>(n(t),this.maxCallbacks===-1?!1:(this.maxCallbacks-=1,this.maxCallbacks===0))}},x=class{constructor(i,n=null){this.name=i,this.data=n}};function sn(){}function wn(e){let i=m.get(e.name);if(i){let n=i.filter(o=>{if(o.Callback(e))return!0});n.length>0&&(i=i.filter(o=>!n.includes(o)),i.length===0?m.delete(e.name):m.set(e.name,i))}}function _(e,i,n){let o=m.get(e)||[],t=new V(e,i,n);return o.push(t),m.set(e,o),()=>pn(t)}function mn(e,i){return _(e,i,-1)}function un(e,i){return _(e,i,1)}function pn(e){let i=e.eventName,n=m.get(i).filter(o=>o!==e);n.length===0?m.delete(i):m.set(i,n)}function Wn(e,...i){[e,...i].forEach(o=>m.delete(o))}function gn(){m.clear()}function Z(e){return ln(cn,e)}var G={};w(G,{Error:()=>Un,Info:()=>Rn,OpenFile:()=>yn,Question:()=>A,SaveFile:()=>On,Warning:()=>En});window._wails=window._wails||{};window._wails.dialogErrorCallback=bn;window._wails.dialogResultCallback=vn;var fn=0,hn=1,Dn=2,Cn=3,Sn=4,Mn=5,xn=l(d.Dialog,""),W=new Map;function An(){let e;do e=f();while(W.has(e));return e}function D(e,i={}){let n=An();return i["dialog-id"]=n,new Promise((o,t)=>{W.set(n,{resolve:o,reject:t}),xn(e,i).catch(a=>{t(a),W.delete(n)})})}function vn(e,i,n){let o=W.get(e);o&&(n?o.resolve(JSON.parse(i)):o.resolve(i),W.delete(e))}function bn(e,i){let n=W.get(e);n&&(n.reject(i),W.delete(e))}var Rn=e=>D(fn,e),En=e=>D(hn,e),Un=e=>D(Dn,e),A=e=>D(Cn,e),yn=e=>D(Sn,e),On=e=>D(Mn,e);function oe(e,i=null){let n=new x(e,i);Z(n)}function Pn(){document.querySelectorAll("[wml-event]").forEach(function(i){let n=i.getAttribute("wml-event"),o=i.getAttribute("wml-confirm"),t=i.getAttribute("wml-trigger")||"click",a=function(){if(o){A({Title:"Confirm",Message:o,Detached:!1,Buttons:[{Label:"Yes"},{Label:"No",IsDefault:!0}]}).then(function(s){s!=="No"&&oe(n)});return}oe(n)};i.removeEventListener(t,a),i.addEventListener(t,a)})}function te(e,i){let n=U(e),o=In(n);o.has(i);try{o.get(i)()}catch{}}function Tn(){document.querySelectorAll("[wml-window]").forEach(function(i){let n=i.getAttribute("wml-window"),o=i.getAttribute("wml-confirm"),t=i.getAttribute("wml-trigger")||"click",a=i.getAttribute("wml-target-window")||"",s=function(){if(o){A({Title:"Confirm",Message:o,Buttons:[{Label:"Yes"},{Label:"No",IsDefault:!0}]}).then(function(p){p!=="No"&&te(a,n)});return}te(a,n)};i.removeEventListener(t,s),i.addEventListener(t,s)})}function Bn(){document.querySelectorAll("[wml-openurl]").forEach(function(i){let n=i.getAttribute("wml-openurl"),o=i.getAttribute("wml-confirm"),t=i.getAttribute("wml-trigger")||"click",a=function(){if(o){A({Title:"Confirm",Message:o,Buttons:[{Label:"Yes"},{Label:"No",IsDefault:!0}]}).then(function(s){s!=="No"&&b(n)});return}b(n)};i.removeEventListener(t,a),i.addEventListener(t,a)})}function Y(){Pn(),Tn(),Bn()}function In(e){let i=new Map;for(let n in e)typeof e[n]=="function"&&i.set(n,e[n]);return i}var X={};w(X,{ByID:()=>Vn,ByName:()=>Hn,Call:()=>Nn,Plugin:()=>_n});window._wails=window._wails||{};window._wails.callResultHandler=zn;window._wails.callErrorHandler=kn;var y=0,Fn=l(d.Call,""),v=new Map;function Ln(){let e;do e=f();while(v.has(e));return e}function zn(e,i,n){let o=re(e);o&&o.resolve(n?JSON.parse(i):i)}function kn(e,i){let n=re(e);n&&n.reject(i)}function re(e){let i=v.get(e);return v.delete(e),i}function O(e,i={}){return new Promise((n,o)=>{let t=Ln();i["call-id"]=t,v.set(t,{resolve:n,reject:o}),Fn(e,i).catch(a=>{o(a),v.delete(t)})})}function Nn(e){return O(y,e)}function Hn(e,...i){if(typeof e!="string"||e.split(".").length!==3)throw new Error("CallByName requires a string in the format 'package.struct.method'");let[n,o,t]=e.split(".");return O(y,{packageName:n,structName:o,methodName:t,args:i})}function Vn(e,...i){return O(y,{methodID:e,args:i})}function _n(e,i,...n){return O(y,{packageName:"wails-plugins",structName:e,methodName:i,args:n})}window._wails=window._wails||{};window._wails.invoke=h;window.wails=window.wails||{};window.wails.Application=T;window.wails.Browser=B;window.wails.Call=X;window.wails.Clipboard=I;window.wails.Dialogs=G;window.wails.Events=j;window.wails.Flags=z;window.wails.Screens=N;window.wails.System=L;window.wails.Window=H;window.wails.WML=K;var ae=!1;document.addEventListener("DOMContentLoaded",function(){ae=!0,window._wails.invoke("wails:runtime:ready")});function Zn(e){ae||document.readyState==="complete"?e():document.addEventListener("DOMContentLoaded",e)}Zn(()=>{Y()});})();
diff --git a/v3/examples/frameless/assets/runtime.js b/v3/examples/frameless/assets/runtime.js
index 2c7d16ed30b..baaccee0402 100644
--- a/v3/examples/frameless/assets/runtime.js
+++ b/v3/examples/frameless/assets/runtime.js
@@ -1 +1 @@
-(()=>{var le=Object.defineProperty;var w=(e,i)=>{for(var n in i)le(e,n,{get:i[n],enumerable:!0})};var T={};w(T,{Hide:()=>We,Quit:()=>fe,Show:()=>ge});var de="useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict";var f=(e=21)=>{let i="",n=e;for(;n--;)i+=de[Math.random()*64|0];return i};var ce=window.location.origin+"/wails/runtime",l={Call:0,Clipboard:1,Application:2,Events:3,ContextMenu:4,Dialog:5,Window:6,Screens:7,System:8,Browser:9,CancelCall:10},se=f();function d(e,i){return function(n,o=null){return we(e,n,i,o)}}function we(e,i,n,o){let t=new URL(ce);t.searchParams.append("object",e),t.searchParams.append("method",i);let a={headers:{}};return n&&(a.headers["x-wails-window-name"]=n),o&&t.searchParams.append("args",JSON.stringify(o)),a.headers["x-wails-client-id"]=se,new Promise((s,m)=>{fetch(t,a).then(c=>{if(c.ok)return c.headers.get("Content-Type")&&c.headers.get("Content-Type").indexOf("application/json")!==-1?c.json():c.text();m(Error(c.statusText))}).then(c=>s(c)).catch(c=>m(c))})}var P=d(l.Application,""),me=0,ue=1,pe=2;function We(){return P(me)}function ge(){return P(ue)}function fe(){return P(pe)}var B={};w(B,{OpenURL:()=>b});var he=d(l.Browser,""),De=0;function b(e){return he(De,{url:e})}var I={};w(I,{SetText:()=>Me,Text:()=>xe});var Q=d(l.Clipboard,""),Ce=0,Se=1;function Me(e){return Q(Ce,{text:e})}function xe(){return Q(Se)}var L={};w(L,{Capabilities:()=>Re,Environment:()=>Ee,IsAMD64:()=>Oe,IsARM:()=>Pe,IsARM64:()=>Te,IsDarkMode:()=>be,IsDebug:()=>F,IsLinux:()=>Ue,IsMac:()=>ye,IsWindows:()=>R,invoke:()=>h});var J=d(l.System,""),Ae=0,ve=1;function h(e){return window.chrome?window.chrome.webview.postMessage(e):window.webkit.messageHandlers.external.postMessage(e)}function be(){return J(Ae)}function Re(){return fetch("/wails/capabilities").json()}function Ee(){return J(ve)}function R(){return window._wails.environment.OS==="windows"}function Ue(){return window._wails.environment.OS==="linux"}function ye(){return window._wails.environment.OS==="darwin"}function Oe(){return window._wails.environment.Arch==="amd64"}function Pe(){return window._wails.environment.Arch==="arm"}function Te(){return window._wails.environment.Arch==="arm64"}function F(){return window._wails.environment.Debug===!0}window.addEventListener("contextmenu",Le);var Be=d(l.ContextMenu,""),Ie=0;function Fe(e,i,n,o){Be(Ie,{id:e,x:i,y:n,data:o})}function Le(e){let i=e.target,n=window.getComputedStyle(i).getPropertyValue("--custom-contextmenu");if(n=n?n.trim():"",n){e.preventDefault();let o=window.getComputedStyle(i).getPropertyValue("--custom-contextmenu-data");Fe(n,e.clientX,e.clientY,o);return}ze(e)}function ze(e){if(F())return;let i=e.target;switch(window.getComputedStyle(i).getPropertyValue("--default-contextmenu").trim()){case"show":return;case"hide":e.preventDefault();return;default:if(i.isContentEditable)return;let t=window.getSelection(),a=t.toString().length>0;if(a)for(let s=0;sS});function S(e){try{return window._wails.flags[e]}catch(i){throw new Error("Unable to retrieve flag '"+e+"': "+i)}}window._wails=window._wails||{};window._wails.setResizable=He;window._wails.endDrag=ee;window.addEventListener("mousedown",_e);window.addEventListener("mousemove",Ge);window.addEventListener("mouseup",je);var M=!1,E=null,$=!1,ke="auto";function Ne(e){let i=window.getComputedStyle(e.target).getPropertyValue("--webkit-app-region");return!i||i===""||i.trim()!=="drag"||e.buttons!==1?!1:e.detail===1}function He(e){$=e}function ee(){document.body.style.cursor="default",M=!1}function Ve(){return E?(h(`resize:${E}`),!0):!1}function _e(e){(R()&&Ve()||Ne(e))&&(M=!!Ze(e))}function Ze(e){return!(e.offsetX>e.target.clientWidth||e.offsetY>e.target.clientHeight)}function je(e){(e.buttons!==void 0?e.buttons:e.which)>0&&ee()}function W(e=ke){document.documentElement.style.cursor=e,E=e}function Ge(e){M=Ye(e),R()&&$&&Ke(e)}function Ye(e){let i=e.buttons!==void 0?e.buttons:e.which;return M&&i>0?(h("drag"),!1):M}function Ke(e){let i=S("system.resizeHandleHeight")||5,n=S("system.resizeHandleWidth")||5,o=S("resizeCornerExtra")||10,t=window.outerWidth-e.clientXJe,GetCurrent:()=>ei,GetPrimary:()=>$e});var k=d(l.Screens,""),Xe=0,qe=1,Qe=2;function Je(){return k(Xe)}function $e(){return k(qe)}function ei(){return k(Qe)}var H={};w(H,{Center:()=>Oi,Close:()=>qi,Fullscreen:()=>Ti,Get:()=>U,GetZoomLevel:()=>rn,Height:()=>en,Hide:()=>Vi,Maximise:()=>_i,Minimise:()=>Gi,RelativePosition:()=>Ni,Restore:()=>Ki,Screen:()=>Hi,SetAlwaysOnTop:()=>zi,SetBackgroundColour:()=>Qi,SetMaxSize:()=>Fi,SetMinSize:()=>Li,SetRelativePosition:()=>ki,SetResizable:()=>Ji,SetSize:()=>Bi,SetTitle:()=>Pi,SetZoomLevel:()=>an,Show:()=>Xi,Size:()=>Ii,ToggleMaximise:()=>ji,UnMaximise:()=>Zi,UnMinimise:()=>Yi,Width:()=>$i,ZoomIn:()=>nn,ZoomOut:()=>on,ZoomReset:()=>tn});var ii=0,ni=1,oi=2,ti=3,ri=4,ai=5,li=6,di=7,ci=8,si=9,wi=10,mi=11,ui=12,pi=13,Wi=14,gi=15,fi=16,hi=17,Di=18,Ci=19,Si=20,Mi=21,xi=22,Ai=23,vi=24,bi=25,Ri=26,Ei=27,Ui=28,yi=29,r=U("");function ie(e){return{Get:i=>ie(d(l.Window,i)),Center:()=>e(ii),SetTitle:i=>e(ni,{title:i}),Fullscreen:()=>e(oi),UnFullscreen:()=>e(ti),SetSize:(i,n)=>e(ri,{width:i,height:n}),Size:()=>e(ai),SetMaxSize:(i,n)=>e(li,{width:i,height:n}),SetMinSize:(i,n)=>e(di,{width:i,height:n}),SetAlwaysOnTop:i=>e(ci,{alwaysOnTop:i}),SetRelativePosition:(i,n)=>e(si,{x:i,y:n}),RelativePosition:()=>e(wi),Screen:()=>e(mi),Hide:()=>e(ui),Maximise:()=>e(pi),UnMaximise:()=>e(Wi),ToggleMaximise:()=>e(gi),Minimise:()=>e(fi),UnMinimise:()=>e(hi),Restore:()=>e(Di),Show:()=>e(Ci),Close:()=>e(Si),SetBackgroundColour:(i,n,o,t)=>e(Mi,{r:i,g:n,b:o,a:t}),SetResizable:i=>e(xi,{resizable:i}),Width:()=>e(Ai),Height:()=>e(vi),ZoomIn:()=>e(bi),ZoomOut:()=>e(Ri),ZoomReset:()=>e(Ei),GetZoomLevel:()=>e(Ui),SetZoomLevel:i=>e(yi,{zoomLevel:i})}}function U(e){return ie(d(l.Window,e))}function Oi(){r.Center()}function Pi(e){r.SetTitle(e)}function Ti(){r.Fullscreen()}function Bi(e,i){r.SetSize(e,i)}function Ii(){return r.Size()}function Fi(e,i){r.SetMaxSize(e,i)}function Li(e,i){r.SetMinSize(e,i)}function zi(e){r.SetAlwaysOnTop(e)}function ki(e,i){r.SetRelativePosition(e,i)}function Ni(){return r.RelativePosition()}function Hi(){return r.Screen()}function Vi(){r.Hide()}function _i(){r.Maximise()}function Zi(){r.UnMaximise()}function ji(){r.ToggleMaximise()}function Gi(){r.Minimise()}function Yi(){r.UnMinimise()}function Ki(){r.Restore()}function Xi(){r.Show()}function qi(){r.Close()}function Qi(e,i,n,o){r.SetBackgroundColour(e,i,n,o)}function Ji(e){r.SetResizable(e)}function $i(){return r.Width()}function en(){return r.Height()}function nn(){r.ZoomIn()}function on(){r.ZoomOut()}function tn(){r.ZoomReset()}function rn(){return r.GetZoomLevel()}function an(e){r.SetZoomLevel(e)}var K={};w(K,{Reload:()=>Y});var j={};w(j,{Emit:()=>Z,Off:()=>Wn,OffAll:()=>gn,On:()=>mn,OnMultiple:()=>_,Once:()=>un,Types:()=>ln,WailsEvent:()=>x,setup:()=>sn});var ne={Windows:{SystemThemeChanged:"windows:SystemThemeChanged",APMPowerStatusChange:"windows:APMPowerStatusChange",APMSuspend:"windows:APMSuspend",APMResumeAutomatic:"windows:APMResumeAutomatic",APMResumeSuspend:"windows:APMResumeSuspend",APMPowerSettingChange:"windows:APMPowerSettingChange",ApplicationStarted:"windows:ApplicationStarted",WebViewNavigationCompleted:"windows:WebViewNavigationCompleted",WindowInactive:"windows:WindowInactive",WindowActive:"windows:WindowActive",WindowClickActive:"windows:WindowClickActive",WindowMaximise:"windows:WindowMaximise",WindowUnMaximise:"windows:WindowUnMaximise",WindowFullscreen:"windows:WindowFullscreen",WindowUnFullscreen:"windows:WindowUnFullscreen",WindowRestore:"windows:WindowRestore",WindowMinimise:"windows:WindowMinimise",WindowUnMinimise:"windows:WindowUnMinimise",WindowClose:"windows:WindowClose",WindowSetFocus:"windows:WindowSetFocus",WindowKillFocus:"windows:WindowKillFocus",WindowDragDrop:"windows:WindowDragDrop",WindowDragEnter:"windows:WindowDragEnter",WindowDragLeave:"windows:WindowDragLeave",WindowDragOver:"windows:WindowDragOver"},Mac:{ApplicationDidBecomeActive:"mac:ApplicationDidBecomeActive",ApplicationDidChangeBackingProperties:"mac:ApplicationDidChangeBackingProperties",ApplicationDidChangeEffectiveAppearance:"mac:ApplicationDidChangeEffectiveAppearance",ApplicationDidChangeIcon:"mac:ApplicationDidChangeIcon",ApplicationDidChangeOcclusionState:"mac:ApplicationDidChangeOcclusionState",ApplicationDidChangeScreenParameters:"mac:ApplicationDidChangeScreenParameters",ApplicationDidChangeStatusBarFrame:"mac:ApplicationDidChangeStatusBarFrame",ApplicationDidChangeStatusBarOrientation:"mac:ApplicationDidChangeStatusBarOrientation",ApplicationDidFinishLaunching:"mac:ApplicationDidFinishLaunching",ApplicationDidHide:"mac:ApplicationDidHide",ApplicationDidResignActiveNotification:"mac:ApplicationDidResignActiveNotification",ApplicationDidUnhide:"mac:ApplicationDidUnhide",ApplicationDidUpdate:"mac:ApplicationDidUpdate",ApplicationWillBecomeActive:"mac:ApplicationWillBecomeActive",ApplicationWillFinishLaunching:"mac:ApplicationWillFinishLaunching",ApplicationWillHide:"mac:ApplicationWillHide",ApplicationWillResignActive:"mac:ApplicationWillResignActive",ApplicationWillTerminate:"mac:ApplicationWillTerminate",ApplicationWillUnhide:"mac:ApplicationWillUnhide",ApplicationWillUpdate:"mac:ApplicationWillUpdate",ApplicationDidChangeTheme:"mac:ApplicationDidChangeTheme!",ApplicationShouldHandleReopen:"mac:ApplicationShouldHandleReopen!",WindowDidBecomeKey:"mac:WindowDidBecomeKey",WindowDidBecomeMain:"mac:WindowDidBecomeMain",WindowDidBeginSheet:"mac:WindowDidBeginSheet",WindowDidChangeAlpha:"mac:WindowDidChangeAlpha",WindowDidChangeBackingLocation:"mac:WindowDidChangeBackingLocation",WindowDidChangeBackingProperties:"mac:WindowDidChangeBackingProperties",WindowDidChangeCollectionBehavior:"mac:WindowDidChangeCollectionBehavior",WindowDidChangeEffectiveAppearance:"mac:WindowDidChangeEffectiveAppearance",WindowDidChangeOcclusionState:"mac:WindowDidChangeOcclusionState",WindowDidChangeOrderingMode:"mac:WindowDidChangeOrderingMode",WindowDidChangeScreen:"mac:WindowDidChangeScreen",WindowDidChangeScreenParameters:"mac:WindowDidChangeScreenParameters",WindowDidChangeScreenProfile:"mac:WindowDidChangeScreenProfile",WindowDidChangeScreenSpace:"mac:WindowDidChangeScreenSpace",WindowDidChangeScreenSpaceProperties:"mac:WindowDidChangeScreenSpaceProperties",WindowDidChangeSharingType:"mac:WindowDidChangeSharingType",WindowDidChangeSpace:"mac:WindowDidChangeSpace",WindowDidChangeSpaceOrderingMode:"mac:WindowDidChangeSpaceOrderingMode",WindowDidChangeTitle:"mac:WindowDidChangeTitle",WindowDidChangeToolbar:"mac:WindowDidChangeToolbar",WindowDidChangeVisibility:"mac:WindowDidChangeVisibility",WindowDidDeminiaturize:"mac:WindowDidDeminiaturize",WindowDidEndSheet:"mac:WindowDidEndSheet",WindowDidEnterFullScreen:"mac:WindowDidEnterFullScreen",WindowDidEnterVersionBrowser:"mac:WindowDidEnterVersionBrowser",WindowDidExitFullScreen:"mac:WindowDidExitFullScreen",WindowDidExitVersionBrowser:"mac:WindowDidExitVersionBrowser",WindowDidExpose:"mac:WindowDidExpose",WindowDidFocus:"mac:WindowDidFocus",WindowDidMiniaturize:"mac:WindowDidMiniaturize",WindowDidMove:"mac:WindowDidMove",WindowDidOrderOffScreen:"mac:WindowDidOrderOffScreen",WindowDidOrderOnScreen:"mac:WindowDidOrderOnScreen",WindowDidResignKey:"mac:WindowDidResignKey",WindowDidResignMain:"mac:WindowDidResignMain",WindowDidResize:"mac:WindowDidResize",WindowDidUpdate:"mac:WindowDidUpdate",WindowDidUpdateAlpha:"mac:WindowDidUpdateAlpha",WindowDidUpdateCollectionBehavior:"mac:WindowDidUpdateCollectionBehavior",WindowDidUpdateCollectionProperties:"mac:WindowDidUpdateCollectionProperties",WindowDidUpdateShadow:"mac:WindowDidUpdateShadow",WindowDidUpdateTitle:"mac:WindowDidUpdateTitle",WindowDidUpdateToolbar:"mac:WindowDidUpdateToolbar",WindowDidUpdateVisibility:"mac:WindowDidUpdateVisibility",WindowShouldClose:"mac:WindowShouldClose!",WindowWillBecomeKey:"mac:WindowWillBecomeKey",WindowWillBecomeMain:"mac:WindowWillBecomeMain",WindowWillBeginSheet:"mac:WindowWillBeginSheet",WindowWillChangeOrderingMode:"mac:WindowWillChangeOrderingMode",WindowWillClose:"mac:WindowWillClose",WindowWillDeminiaturize:"mac:WindowWillDeminiaturize",WindowWillEnterFullScreen:"mac:WindowWillEnterFullScreen",WindowWillEnterVersionBrowser:"mac:WindowWillEnterVersionBrowser",WindowWillExitFullScreen:"mac:WindowWillExitFullScreen",WindowWillExitVersionBrowser:"mac:WindowWillExitVersionBrowser",WindowWillFocus:"mac:WindowWillFocus",WindowWillMiniaturize:"mac:WindowWillMiniaturize",WindowWillMove:"mac:WindowWillMove",WindowWillOrderOffScreen:"mac:WindowWillOrderOffScreen",WindowWillOrderOnScreen:"mac:WindowWillOrderOnScreen",WindowWillResignMain:"mac:WindowWillResignMain",WindowWillResize:"mac:WindowWillResize",WindowWillUnfocus:"mac:WindowWillUnfocus",WindowWillUpdate:"mac:WindowWillUpdate",WindowWillUpdateAlpha:"mac:WindowWillUpdateAlpha",WindowWillUpdateCollectionBehavior:"mac:WindowWillUpdateCollectionBehavior",WindowWillUpdateCollectionProperties:"mac:WindowWillUpdateCollectionProperties",WindowWillUpdateShadow:"mac:WindowWillUpdateShadow",WindowWillUpdateTitle:"mac:WindowWillUpdateTitle",WindowWillUpdateToolbar:"mac:WindowWillUpdateToolbar",WindowWillUpdateVisibility:"mac:WindowWillUpdateVisibility",WindowWillUseStandardFrame:"mac:WindowWillUseStandardFrame",MenuWillOpen:"mac:MenuWillOpen",MenuDidOpen:"mac:MenuDidOpen",MenuDidClose:"mac:MenuDidClose",MenuWillSendAction:"mac:MenuWillSendAction",MenuDidSendAction:"mac:MenuDidSendAction",MenuWillHighlightItem:"mac:MenuWillHighlightItem",MenuDidHighlightItem:"mac:MenuDidHighlightItem",MenuWillDisplayItem:"mac:MenuWillDisplayItem",MenuDidDisplayItem:"mac:MenuDidDisplayItem",MenuWillAddItem:"mac:MenuWillAddItem",MenuDidAddItem:"mac:MenuDidAddItem",MenuWillRemoveItem:"mac:MenuWillRemoveItem",MenuDidRemoveItem:"mac:MenuDidRemoveItem",MenuWillBeginTracking:"mac:MenuWillBeginTracking",MenuDidBeginTracking:"mac:MenuDidBeginTracking",MenuWillEndTracking:"mac:MenuWillEndTracking",MenuDidEndTracking:"mac:MenuDidEndTracking",MenuWillUpdate:"mac:MenuWillUpdate",MenuDidUpdate:"mac:MenuDidUpdate",MenuWillPopUp:"mac:MenuWillPopUp",MenuDidPopUp:"mac:MenuDidPopUp",MenuWillSendActionToItem:"mac:MenuWillSendActionToItem",MenuDidSendActionToItem:"mac:MenuDidSendActionToItem",WebViewDidStartProvisionalNavigation:"mac:WebViewDidStartProvisionalNavigation",WebViewDidReceiveServerRedirectForProvisionalNavigation:"mac:WebViewDidReceiveServerRedirectForProvisionalNavigation",WebViewDidFinishNavigation:"mac:WebViewDidFinishNavigation",WebViewDidCommitNavigation:"mac:WebViewDidCommitNavigation",WindowFileDraggingEntered:"mac:WindowFileDraggingEntered",WindowFileDraggingPerformed:"mac:WindowFileDraggingPerformed",WindowFileDraggingExited:"mac:WindowFileDraggingExited"},Linux:{SystemThemeChanged:"linux:SystemThemeChanged"},Common:{ApplicationStarted:"common:ApplicationStarted",WindowMaximise:"common:WindowMaximise",WindowUnMaximise:"common:WindowUnMaximise",WindowFullscreen:"common:WindowFullscreen",WindowUnFullscreen:"common:WindowUnFullscreen",WindowRestore:"common:WindowRestore",WindowMinimise:"common:WindowMinimise",WindowUnMinimise:"common:WindowUnMinimise",WindowClosing:"common:WindowClosing",WindowZoom:"common:WindowZoom",WindowZoomIn:"common:WindowZoomIn",WindowZoomOut:"common:WindowZoomOut",WindowZoomReset:"common:WindowZoomReset",WindowFocus:"common:WindowFocus",WindowLostFocus:"common:WindowLostFocus",WindowShow:"common:WindowShow",WindowHide:"common:WindowHide",WindowDPIChanged:"common:WindowDPIChanged",WindowFilesDropped:"common:WindowFilesDropped",WindowRuntimeReady:"common:WindowRuntimeReady",ThemeChanged:"common:ThemeChanged"}};var ln=ne;window._wails=window._wails||{};window._wails.dispatchWailsEvent=wn;var dn=d(l.Events,""),cn=0,u=new Map,V=class{constructor(i,n,o){this.eventName=i,this.maxCallbacks=o||-1,this.Callback=t=>(n(t),this.maxCallbacks===-1?!1:(this.maxCallbacks-=1,this.maxCallbacks===0))}},x=class{constructor(i,n=null){this.name=i,this.data=n}};function sn(){}function wn(e){let i=u.get(e.name);if(i){let n=i.filter(o=>{if(o.Callback(e))return!0});n.length>0&&(i=i.filter(o=>!n.includes(o)),i.length===0?u.delete(e.name):u.set(e.name,i))}}function _(e,i,n){let o=u.get(e)||[],t=new V(e,i,n);return o.push(t),u.set(e,o),()=>pn(t)}function mn(e,i){return _(e,i,-1)}function un(e,i){return _(e,i,1)}function pn(e){let i=e.eventName,n=u.get(i).filter(o=>o!==e);n.length===0?u.delete(i):u.set(i,n)}function Wn(e,...i){[e,...i].forEach(o=>u.delete(o))}function gn(){u.clear()}function Z(e){return dn(cn,e)}var G={};w(G,{Error:()=>Un,Info:()=>Rn,OpenFile:()=>yn,Question:()=>A,SaveFile:()=>On,Warning:()=>En});window._wails=window._wails||{};window._wails.dialogErrorCallback=bn;window._wails.dialogResultCallback=vn;var fn=0,hn=1,Dn=2,Cn=3,Sn=4,Mn=5,xn=d(l.Dialog,""),g=new Map;function An(){let e;do e=f();while(g.has(e));return e}function D(e,i={}){let n=An();return i["dialog-id"]=n,new Promise((o,t)=>{g.set(n,{resolve:o,reject:t}),xn(e,i).catch(a=>{t(a),g.delete(n)})})}function vn(e,i,n){let o=g.get(e);o&&(n?o.resolve(JSON.parse(i)):o.resolve(i),g.delete(e))}function bn(e,i){let n=g.get(e);n&&(n.reject(i),g.delete(e))}var Rn=e=>D(fn,e),En=e=>D(hn,e),Un=e=>D(Dn,e),A=e=>D(Cn,e),yn=e=>D(Sn,e),On=e=>D(Mn,e);function oe(e,i=null){let n=new x(e,i);Z(n)}function Pn(){document.querySelectorAll("[wml-event]").forEach(function(i){let n=i.getAttribute("wml-event"),o=i.getAttribute("wml-confirm"),t=i.getAttribute("wml-trigger")||"click",a=function(){if(o){A({Title:"Confirm",Message:o,Detached:!1,Buttons:[{Label:"Yes"},{Label:"No",IsDefault:!0}]}).then(function(s){s!=="No"&&oe(n)});return}oe(n)};i.removeEventListener(t,a),i.addEventListener(t,a)})}function te(e,i){let n=U(e),o=In(n);o.has(i);try{o.get(i)()}catch{}}function Tn(){document.querySelectorAll("[wml-window]").forEach(function(i){let n=i.getAttribute("wml-window"),o=i.getAttribute("wml-confirm"),t=i.getAttribute("wml-trigger")||"click",a=i.getAttribute("wml-target-window")||"",s=function(){if(o){A({Title:"Confirm",Message:o,Buttons:[{Label:"Yes"},{Label:"No",IsDefault:!0}]}).then(function(m){m!=="No"&&te(a,n)});return}te(a,n)};i.removeEventListener(t,s),i.addEventListener(t,s)})}function Bn(){document.querySelectorAll("[wml-openurl]").forEach(function(i){let n=i.getAttribute("wml-openurl"),o=i.getAttribute("wml-confirm"),t=i.getAttribute("wml-trigger")||"click",a=function(){if(o){A({Title:"Confirm",Message:o,Buttons:[{Label:"Yes"},{Label:"No",IsDefault:!0}]}).then(function(s){s!=="No"&&b(n)});return}b(n)};i.removeEventListener(t,a),i.addEventListener(t,a)})}function Y(){Pn(),Tn(),Bn()}function In(e){let i=new Map;for(let n in e)typeof e[n]=="function"&&i.set(n,e[n]);return i}var X={};w(X,{ByID:()=>_n,ByName:()=>Vn,Call:()=>Hn,Plugin:()=>Zn});window._wails=window._wails||{};window._wails.callResultHandler=kn;window._wails.callErrorHandler=Nn;var y=0,Fn=d(l.Call,""),Ln=d(l.CancelCall,""),v=new Map;function zn(){let e;do e=f();while(v.has(e));return e}function kn(e,i,n){let o=re(e);o&&o.resolve(n?JSON.parse(i):i)}function Nn(e,i){let n=re(e);n&&n.reject(i)}function re(e){let i=v.get(e);return v.delete(e),i}function O(e,i={}){let n=zn(),o=()=>{Ln(e,{"call-id":n})};var t=!1,a=!1,s=new Promise((m,c)=>{i["call-id"]=n,v.set(n,{resolve:m,reject:c}),Fn(e,i).then(p=>{a=!0,t&&o()}).catch(p=>{c(p),v.delete(n)})});return s.cancel=()=>{a?o():t=!0},s}function Hn(e){return O(y,e)}function Vn(e,...i){if(typeof e!="string"||e.split(".").length!==3)throw new Error("CallByName requires a string in the format 'package.struct.method'");let[n,o,t]=e.split(".");return O(y,{packageName:n,structName:o,methodName:t,args:i})}function _n(e,...i){return O(y,{methodID:e,args:i})}function Zn(e,i,...n){return O(y,{packageName:"wails-plugins",structName:e,methodName:i,args:n})}window._wails=window._wails||{};window._wails.invoke=h;window.wails=window.wails||{};window.wails.Application=T;window.wails.Browser=B;window.wails.Call=X;window.wails.Clipboard=I;window.wails.Dialogs=G;window.wails.Events=j;window.wails.Flags=z;window.wails.Screens=N;window.wails.System=L;window.wails.Window=H;window.wails.WML=K;var ae=!1;document.addEventListener("DOMContentLoaded",function(){ae=!0,window._wails.invoke("wails:runtime:ready")});function jn(e){ae||document.readyState==="complete"?e():document.addEventListener("DOMContentLoaded",e)}jn(()=>{Y()});})();
+(()=>{var de=Object.defineProperty;var w=(e,i)=>{for(var n in i)de(e,n,{get:i[n],enumerable:!0})};var T={};w(T,{Hide:()=>We,Quit:()=>fe,Show:()=>ge});var le="useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict";var f=(e=21)=>{let i="",n=e;for(;n--;)i+=le[Math.random()*64|0];return i};var ce=window.location.origin+"/wails/runtime",d={Call:0,Clipboard:1,Application:2,Events:3,ContextMenu:4,Dialog:5,Window:6,Screens:7,System:8,Browser:9},se=f();function l(e,i){return function(n,o=null){return we(e,n,i,o)}}function we(e,i,n,o){let t=new URL(ce);t.searchParams.append("object",e),t.searchParams.append("method",i);let a={headers:{}};return n&&(a.headers["x-wails-window-name"]=n),o&&t.searchParams.append("args",JSON.stringify(o)),a.headers["x-wails-client-id"]=se,new Promise((s,p)=>{fetch(t,a).then(c=>{if(c.ok)return c.headers.get("Content-Type")&&c.headers.get("Content-Type").indexOf("application/json")!==-1?c.json():c.text();p(Error(c.statusText))}).then(c=>s(c)).catch(c=>p(c))})}var P=l(d.Application,""),me=0,ue=1,pe=2;function We(){return P(me)}function ge(){return P(ue)}function fe(){return P(pe)}var B={};w(B,{OpenURL:()=>b});var he=l(d.Browser,""),De=0;function b(e){return he(De,{url:e})}var I={};w(I,{SetText:()=>xe,Text:()=>Me});var q=l(d.Clipboard,""),Ce=0,Se=1;function xe(e){return q(Ce,{text:e})}function Me(){return q(Se)}var L={};w(L,{Capabilities:()=>Re,Environment:()=>Ee,IsAMD64:()=>Oe,IsARM:()=>Pe,IsARM64:()=>Te,IsDarkMode:()=>be,IsDebug:()=>F,IsLinux:()=>Ue,IsMac:()=>ye,IsWindows:()=>R,invoke:()=>h});var J=l(d.System,""),Ae=0,ve=1;function h(e){return window.chrome?window.chrome.webview.postMessage(e):window.webkit.messageHandlers.external.postMessage(e)}function be(){return J(Ae)}function Re(){return fetch("/wails/capabilities").json()}function Ee(){return J(ve)}function R(){return window._wails.environment.OS==="windows"}function Ue(){return window._wails.environment.OS==="linux"}function ye(){return window._wails.environment.OS==="darwin"}function Oe(){return window._wails.environment.Arch==="amd64"}function Pe(){return window._wails.environment.Arch==="arm"}function Te(){return window._wails.environment.Arch==="arm64"}function F(){return window._wails.environment.Debug===!0}window.addEventListener("contextmenu",Le);var Be=l(d.ContextMenu,""),Ie=0;function Fe(e,i,n,o){Be(Ie,{id:e,x:i,y:n,data:o})}function Le(e){let i=e.target,n=window.getComputedStyle(i).getPropertyValue("--custom-contextmenu");if(n=n?n.trim():"",n){e.preventDefault();let o=window.getComputedStyle(i).getPropertyValue("--custom-contextmenu-data");Fe(n,e.clientX,e.clientY,o);return}ze(e)}function ze(e){if(F())return;let i=e.target;switch(window.getComputedStyle(i).getPropertyValue("--default-contextmenu").trim()){case"show":return;case"hide":e.preventDefault();return;default:if(i.isContentEditable)return;let t=window.getSelection(),a=t.toString().length>0;if(a)for(let s=0;sS});function S(e){try{return window._wails.flags[e]}catch(i){throw new Error("Unable to retrieve flag '"+e+"': "+i)}}window._wails=window._wails||{};window._wails.setResizable=He;window._wails.endDrag=ee;window.addEventListener("mousedown",_e);window.addEventListener("mousemove",Ge);window.addEventListener("mouseup",je);var x=!1,E=null,$=!1,ke="auto";function Ne(e){let i=window.getComputedStyle(e.target).getPropertyValue("--webkit-app-region");return!i||i===""||i.trim()!=="drag"||e.buttons!==1?!1:e.detail===1}function He(e){$=e}function ee(){document.body.style.cursor="default",x=!1}function Ve(){return E?(h(`resize:${E}`),!0):!1}function _e(e){(R()&&Ve()||Ne(e))&&(x=!!Ze(e))}function Ze(e){return!(e.offsetX>e.target.clientWidth||e.offsetY>e.target.clientHeight)}function je(e){(e.buttons!==void 0?e.buttons:e.which)>0&&ee()}function u(e=ke){document.documentElement.style.cursor=e,E=e}function Ge(e){x=Ye(e),R()&&$&&Ke(e)}function Ye(e){let i=e.buttons!==void 0?e.buttons:e.which;return x&&i>0?(h("drag"),!1):x}function Ke(e){let i=S("system.resizeHandleHeight")||5,n=S("system.resizeHandleWidth")||5,o=S("resizeCornerExtra")||10,t=window.outerWidth-e.clientXJe,GetCurrent:()=>ei,GetPrimary:()=>$e});var k=l(d.Screens,""),Xe=0,Qe=1,qe=2;function Je(){return k(Xe)}function $e(){return k(Qe)}function ei(){return k(qe)}var H={};w(H,{Center:()=>Oi,Close:()=>Qi,Fullscreen:()=>Ti,Get:()=>U,GetZoomLevel:()=>rn,Height:()=>en,Hide:()=>Vi,Maximise:()=>_i,Minimise:()=>Gi,RelativePosition:()=>Ni,Restore:()=>Ki,Screen:()=>Hi,SetAlwaysOnTop:()=>zi,SetBackgroundColour:()=>qi,SetMaxSize:()=>Fi,SetMinSize:()=>Li,SetRelativePosition:()=>ki,SetResizable:()=>Ji,SetSize:()=>Bi,SetTitle:()=>Pi,SetZoomLevel:()=>an,Show:()=>Xi,Size:()=>Ii,ToggleMaximise:()=>ji,UnMaximise:()=>Zi,UnMinimise:()=>Yi,Width:()=>$i,ZoomIn:()=>nn,ZoomOut:()=>on,ZoomReset:()=>tn});var ii=0,ni=1,oi=2,ti=3,ri=4,ai=5,di=6,li=7,ci=8,si=9,wi=10,mi=11,ui=12,pi=13,Wi=14,gi=15,fi=16,hi=17,Di=18,Ci=19,Si=20,xi=21,Mi=22,Ai=23,vi=24,bi=25,Ri=26,Ei=27,Ui=28,yi=29,r=U("");function ie(e){return{Get:i=>ie(l(d.Window,i)),Center:()=>e(ii),SetTitle:i=>e(ni,{title:i}),Fullscreen:()=>e(oi),UnFullscreen:()=>e(ti),SetSize:(i,n)=>e(ri,{width:i,height:n}),Size:()=>e(ai),SetMaxSize:(i,n)=>e(di,{width:i,height:n}),SetMinSize:(i,n)=>e(li,{width:i,height:n}),SetAlwaysOnTop:i=>e(ci,{alwaysOnTop:i}),SetRelativePosition:(i,n)=>e(si,{x:i,y:n}),RelativePosition:()=>e(wi),Screen:()=>e(mi),Hide:()=>e(ui),Maximise:()=>e(pi),UnMaximise:()=>e(Wi),ToggleMaximise:()=>e(gi),Minimise:()=>e(fi),UnMinimise:()=>e(hi),Restore:()=>e(Di),Show:()=>e(Ci),Close:()=>e(Si),SetBackgroundColour:(i,n,o,t)=>e(xi,{r:i,g:n,b:o,a:t}),SetResizable:i=>e(Mi,{resizable:i}),Width:()=>e(Ai),Height:()=>e(vi),ZoomIn:()=>e(bi),ZoomOut:()=>e(Ri),ZoomReset:()=>e(Ei),GetZoomLevel:()=>e(Ui),SetZoomLevel:i=>e(yi,{zoomLevel:i})}}function U(e){return ie(l(d.Window,e))}function Oi(){r.Center()}function Pi(e){r.SetTitle(e)}function Ti(){r.Fullscreen()}function Bi(e,i){r.SetSize(e,i)}function Ii(){return r.Size()}function Fi(e,i){r.SetMaxSize(e,i)}function Li(e,i){r.SetMinSize(e,i)}function zi(e){r.SetAlwaysOnTop(e)}function ki(e,i){r.SetRelativePosition(e,i)}function Ni(){return r.RelativePosition()}function Hi(){return r.Screen()}function Vi(){r.Hide()}function _i(){r.Maximise()}function Zi(){r.UnMaximise()}function ji(){r.ToggleMaximise()}function Gi(){r.Minimise()}function Yi(){r.UnMinimise()}function Ki(){r.Restore()}function Xi(){r.Show()}function Qi(){r.Close()}function qi(e,i,n,o){r.SetBackgroundColour(e,i,n,o)}function Ji(e){r.SetResizable(e)}function $i(){return r.Width()}function en(){return r.Height()}function nn(){r.ZoomIn()}function on(){r.ZoomOut()}function tn(){r.ZoomReset()}function rn(){return r.GetZoomLevel()}function an(e){r.SetZoomLevel(e)}var K={};w(K,{Reload:()=>Y});var j={};w(j,{Emit:()=>Z,Off:()=>Wn,OffAll:()=>gn,On:()=>mn,OnMultiple:()=>_,Once:()=>un,Types:()=>dn,WailsEvent:()=>M,setup:()=>sn});var ne={Windows:{SystemThemeChanged:"windows:SystemThemeChanged",APMPowerStatusChange:"windows:APMPowerStatusChange",APMSuspend:"windows:APMSuspend",APMResumeAutomatic:"windows:APMResumeAutomatic",APMResumeSuspend:"windows:APMResumeSuspend",APMPowerSettingChange:"windows:APMPowerSettingChange",ApplicationStarted:"windows:ApplicationStarted",WebViewNavigationCompleted:"windows:WebViewNavigationCompleted",WindowInactive:"windows:WindowInactive",WindowActive:"windows:WindowActive",WindowClickActive:"windows:WindowClickActive",WindowMaximise:"windows:WindowMaximise",WindowUnMaximise:"windows:WindowUnMaximise",WindowFullscreen:"windows:WindowFullscreen",WindowUnFullscreen:"windows:WindowUnFullscreen",WindowRestore:"windows:WindowRestore",WindowMinimise:"windows:WindowMinimise",WindowUnMinimise:"windows:WindowUnMinimise",WindowClose:"windows:WindowClose",WindowSetFocus:"windows:WindowSetFocus",WindowKillFocus:"windows:WindowKillFocus",WindowDragDrop:"windows:WindowDragDrop",WindowDragEnter:"windows:WindowDragEnter",WindowDragLeave:"windows:WindowDragLeave",WindowDragOver:"windows:WindowDragOver"},Mac:{ApplicationDidBecomeActive:"mac:ApplicationDidBecomeActive",ApplicationDidChangeBackingProperties:"mac:ApplicationDidChangeBackingProperties",ApplicationDidChangeEffectiveAppearance:"mac:ApplicationDidChangeEffectiveAppearance",ApplicationDidChangeIcon:"mac:ApplicationDidChangeIcon",ApplicationDidChangeOcclusionState:"mac:ApplicationDidChangeOcclusionState",ApplicationDidChangeScreenParameters:"mac:ApplicationDidChangeScreenParameters",ApplicationDidChangeStatusBarFrame:"mac:ApplicationDidChangeStatusBarFrame",ApplicationDidChangeStatusBarOrientation:"mac:ApplicationDidChangeStatusBarOrientation",ApplicationDidFinishLaunching:"mac:ApplicationDidFinishLaunching",ApplicationDidHide:"mac:ApplicationDidHide",ApplicationDidResignActiveNotification:"mac:ApplicationDidResignActiveNotification",ApplicationDidUnhide:"mac:ApplicationDidUnhide",ApplicationDidUpdate:"mac:ApplicationDidUpdate",ApplicationWillBecomeActive:"mac:ApplicationWillBecomeActive",ApplicationWillFinishLaunching:"mac:ApplicationWillFinishLaunching",ApplicationWillHide:"mac:ApplicationWillHide",ApplicationWillResignActive:"mac:ApplicationWillResignActive",ApplicationWillTerminate:"mac:ApplicationWillTerminate",ApplicationWillUnhide:"mac:ApplicationWillUnhide",ApplicationWillUpdate:"mac:ApplicationWillUpdate",ApplicationDidChangeTheme:"mac:ApplicationDidChangeTheme!",ApplicationShouldHandleReopen:"mac:ApplicationShouldHandleReopen!",WindowDidBecomeKey:"mac:WindowDidBecomeKey",WindowDidBecomeMain:"mac:WindowDidBecomeMain",WindowDidBeginSheet:"mac:WindowDidBeginSheet",WindowDidChangeAlpha:"mac:WindowDidChangeAlpha",WindowDidChangeBackingLocation:"mac:WindowDidChangeBackingLocation",WindowDidChangeBackingProperties:"mac:WindowDidChangeBackingProperties",WindowDidChangeCollectionBehavior:"mac:WindowDidChangeCollectionBehavior",WindowDidChangeEffectiveAppearance:"mac:WindowDidChangeEffectiveAppearance",WindowDidChangeOcclusionState:"mac:WindowDidChangeOcclusionState",WindowDidChangeOrderingMode:"mac:WindowDidChangeOrderingMode",WindowDidChangeScreen:"mac:WindowDidChangeScreen",WindowDidChangeScreenParameters:"mac:WindowDidChangeScreenParameters",WindowDidChangeScreenProfile:"mac:WindowDidChangeScreenProfile",WindowDidChangeScreenSpace:"mac:WindowDidChangeScreenSpace",WindowDidChangeScreenSpaceProperties:"mac:WindowDidChangeScreenSpaceProperties",WindowDidChangeSharingType:"mac:WindowDidChangeSharingType",WindowDidChangeSpace:"mac:WindowDidChangeSpace",WindowDidChangeSpaceOrderingMode:"mac:WindowDidChangeSpaceOrderingMode",WindowDidChangeTitle:"mac:WindowDidChangeTitle",WindowDidChangeToolbar:"mac:WindowDidChangeToolbar",WindowDidChangeVisibility:"mac:WindowDidChangeVisibility",WindowDidDeminiaturize:"mac:WindowDidDeminiaturize",WindowDidEndSheet:"mac:WindowDidEndSheet",WindowDidEnterFullScreen:"mac:WindowDidEnterFullScreen",WindowDidEnterVersionBrowser:"mac:WindowDidEnterVersionBrowser",WindowDidExitFullScreen:"mac:WindowDidExitFullScreen",WindowDidExitVersionBrowser:"mac:WindowDidExitVersionBrowser",WindowDidExpose:"mac:WindowDidExpose",WindowDidFocus:"mac:WindowDidFocus",WindowDidMiniaturize:"mac:WindowDidMiniaturize",WindowDidMove:"mac:WindowDidMove",WindowDidOrderOffScreen:"mac:WindowDidOrderOffScreen",WindowDidOrderOnScreen:"mac:WindowDidOrderOnScreen",WindowDidResignKey:"mac:WindowDidResignKey",WindowDidResignMain:"mac:WindowDidResignMain",WindowDidResize:"mac:WindowDidResize",WindowDidUpdate:"mac:WindowDidUpdate",WindowDidUpdateAlpha:"mac:WindowDidUpdateAlpha",WindowDidUpdateCollectionBehavior:"mac:WindowDidUpdateCollectionBehavior",WindowDidUpdateCollectionProperties:"mac:WindowDidUpdateCollectionProperties",WindowDidUpdateShadow:"mac:WindowDidUpdateShadow",WindowDidUpdateTitle:"mac:WindowDidUpdateTitle",WindowDidUpdateToolbar:"mac:WindowDidUpdateToolbar",WindowDidUpdateVisibility:"mac:WindowDidUpdateVisibility",WindowShouldClose:"mac:WindowShouldClose!",WindowWillBecomeKey:"mac:WindowWillBecomeKey",WindowWillBecomeMain:"mac:WindowWillBecomeMain",WindowWillBeginSheet:"mac:WindowWillBeginSheet",WindowWillChangeOrderingMode:"mac:WindowWillChangeOrderingMode",WindowWillClose:"mac:WindowWillClose",WindowWillDeminiaturize:"mac:WindowWillDeminiaturize",WindowWillEnterFullScreen:"mac:WindowWillEnterFullScreen",WindowWillEnterVersionBrowser:"mac:WindowWillEnterVersionBrowser",WindowWillExitFullScreen:"mac:WindowWillExitFullScreen",WindowWillExitVersionBrowser:"mac:WindowWillExitVersionBrowser",WindowWillFocus:"mac:WindowWillFocus",WindowWillMiniaturize:"mac:WindowWillMiniaturize",WindowWillMove:"mac:WindowWillMove",WindowWillOrderOffScreen:"mac:WindowWillOrderOffScreen",WindowWillOrderOnScreen:"mac:WindowWillOrderOnScreen",WindowWillResignMain:"mac:WindowWillResignMain",WindowWillResize:"mac:WindowWillResize",WindowWillUnfocus:"mac:WindowWillUnfocus",WindowWillUpdate:"mac:WindowWillUpdate",WindowWillUpdateAlpha:"mac:WindowWillUpdateAlpha",WindowWillUpdateCollectionBehavior:"mac:WindowWillUpdateCollectionBehavior",WindowWillUpdateCollectionProperties:"mac:WindowWillUpdateCollectionProperties",WindowWillUpdateShadow:"mac:WindowWillUpdateShadow",WindowWillUpdateTitle:"mac:WindowWillUpdateTitle",WindowWillUpdateToolbar:"mac:WindowWillUpdateToolbar",WindowWillUpdateVisibility:"mac:WindowWillUpdateVisibility",WindowWillUseStandardFrame:"mac:WindowWillUseStandardFrame",MenuWillOpen:"mac:MenuWillOpen",MenuDidOpen:"mac:MenuDidOpen",MenuDidClose:"mac:MenuDidClose",MenuWillSendAction:"mac:MenuWillSendAction",MenuDidSendAction:"mac:MenuDidSendAction",MenuWillHighlightItem:"mac:MenuWillHighlightItem",MenuDidHighlightItem:"mac:MenuDidHighlightItem",MenuWillDisplayItem:"mac:MenuWillDisplayItem",MenuDidDisplayItem:"mac:MenuDidDisplayItem",MenuWillAddItem:"mac:MenuWillAddItem",MenuDidAddItem:"mac:MenuDidAddItem",MenuWillRemoveItem:"mac:MenuWillRemoveItem",MenuDidRemoveItem:"mac:MenuDidRemoveItem",MenuWillBeginTracking:"mac:MenuWillBeginTracking",MenuDidBeginTracking:"mac:MenuDidBeginTracking",MenuWillEndTracking:"mac:MenuWillEndTracking",MenuDidEndTracking:"mac:MenuDidEndTracking",MenuWillUpdate:"mac:MenuWillUpdate",MenuDidUpdate:"mac:MenuDidUpdate",MenuWillPopUp:"mac:MenuWillPopUp",MenuDidPopUp:"mac:MenuDidPopUp",MenuWillSendActionToItem:"mac:MenuWillSendActionToItem",MenuDidSendActionToItem:"mac:MenuDidSendActionToItem",WebViewDidStartProvisionalNavigation:"mac:WebViewDidStartProvisionalNavigation",WebViewDidReceiveServerRedirectForProvisionalNavigation:"mac:WebViewDidReceiveServerRedirectForProvisionalNavigation",WebViewDidFinishNavigation:"mac:WebViewDidFinishNavigation",WebViewDidCommitNavigation:"mac:WebViewDidCommitNavigation",WindowFileDraggingEntered:"mac:WindowFileDraggingEntered",WindowFileDraggingPerformed:"mac:WindowFileDraggingPerformed",WindowFileDraggingExited:"mac:WindowFileDraggingExited"},Linux:{SystemThemeChanged:"linux:SystemThemeChanged",WindowLoadChanged:"linux:WindowLoadChanged",WindowDeleteEvent:"linux:WindowDeleteEvent",WindowFocusIn:"linux:WindowFocusIn",WindowFocusOut:"linux:WindowFocusOut",ApplicationStartup:"linux:ApplicationStartup"},Common:{ApplicationStarted:"common:ApplicationStarted",WindowMaximise:"common:WindowMaximise",WindowUnMaximise:"common:WindowUnMaximise",WindowFullscreen:"common:WindowFullscreen",WindowUnFullscreen:"common:WindowUnFullscreen",WindowRestore:"common:WindowRestore",WindowMinimise:"common:WindowMinimise",WindowUnMinimise:"common:WindowUnMinimise",WindowClosing:"common:WindowClosing",WindowZoom:"common:WindowZoom",WindowZoomIn:"common:WindowZoomIn",WindowZoomOut:"common:WindowZoomOut",WindowZoomReset:"common:WindowZoomReset",WindowFocus:"common:WindowFocus",WindowLostFocus:"common:WindowLostFocus",WindowShow:"common:WindowShow",WindowHide:"common:WindowHide",WindowDPIChanged:"common:WindowDPIChanged",WindowFilesDropped:"common:WindowFilesDropped",WindowRuntimeReady:"common:WindowRuntimeReady",ThemeChanged:"common:ThemeChanged"}};var dn=ne;window._wails=window._wails||{};window._wails.dispatchWailsEvent=wn;var ln=l(d.Events,""),cn=0,m=new Map,V=class{constructor(i,n,o){this.eventName=i,this.maxCallbacks=o||-1,this.Callback=t=>(n(t),this.maxCallbacks===-1?!1:(this.maxCallbacks-=1,this.maxCallbacks===0))}},M=class{constructor(i,n=null){this.name=i,this.data=n}};function sn(){}function wn(e){let i=m.get(e.name);if(i){let n=i.filter(o=>{if(o.Callback(e))return!0});n.length>0&&(i=i.filter(o=>!n.includes(o)),i.length===0?m.delete(e.name):m.set(e.name,i))}}function _(e,i,n){let o=m.get(e)||[],t=new V(e,i,n);return o.push(t),m.set(e,o),()=>pn(t)}function mn(e,i){return _(e,i,-1)}function un(e,i){return _(e,i,1)}function pn(e){let i=e.eventName,n=m.get(i).filter(o=>o!==e);n.length===0?m.delete(i):m.set(i,n)}function Wn(e,...i){[e,...i].forEach(o=>m.delete(o))}function gn(){m.clear()}function Z(e){return ln(cn,e)}var G={};w(G,{Error:()=>Un,Info:()=>Rn,OpenFile:()=>yn,Question:()=>A,SaveFile:()=>On,Warning:()=>En});window._wails=window._wails||{};window._wails.dialogErrorCallback=bn;window._wails.dialogResultCallback=vn;var fn=0,hn=1,Dn=2,Cn=3,Sn=4,xn=5,Mn=l(d.Dialog,""),W=new Map;function An(){let e;do e=f();while(W.has(e));return e}function D(e,i={}){let n=An();return i["dialog-id"]=n,new Promise((o,t)=>{W.set(n,{resolve:o,reject:t}),Mn(e,i).catch(a=>{t(a),W.delete(n)})})}function vn(e,i,n){let o=W.get(e);o&&(n?o.resolve(JSON.parse(i)):o.resolve(i),W.delete(e))}function bn(e,i){let n=W.get(e);n&&(n.reject(i),W.delete(e))}var Rn=e=>D(fn,e),En=e=>D(hn,e),Un=e=>D(Dn,e),A=e=>D(Cn,e),yn=e=>D(Sn,e),On=e=>D(xn,e);function oe(e,i=null){let n=new M(e,i);Z(n)}function Pn(){document.querySelectorAll("[wml-event]").forEach(function(i){let n=i.getAttribute("wml-event"),o=i.getAttribute("wml-confirm"),t=i.getAttribute("wml-trigger")||"click",a=function(){if(o){A({Title:"Confirm",Message:o,Detached:!1,Buttons:[{Label:"Yes"},{Label:"No",IsDefault:!0}]}).then(function(s){s!=="No"&&oe(n)});return}oe(n)};i.removeEventListener(t,a),i.addEventListener(t,a)})}function te(e,i){let n=U(e),o=In(n);o.has(i);try{o.get(i)()}catch{}}function Tn(){document.querySelectorAll("[wml-window]").forEach(function(i){let n=i.getAttribute("wml-window"),o=i.getAttribute("wml-confirm"),t=i.getAttribute("wml-trigger")||"click",a=i.getAttribute("wml-target-window")||"",s=function(){if(o){A({Title:"Confirm",Message:o,Buttons:[{Label:"Yes"},{Label:"No",IsDefault:!0}]}).then(function(p){p!=="No"&&te(a,n)});return}te(a,n)};i.removeEventListener(t,s),i.addEventListener(t,s)})}function Bn(){document.querySelectorAll("[wml-openurl]").forEach(function(i){let n=i.getAttribute("wml-openurl"),o=i.getAttribute("wml-confirm"),t=i.getAttribute("wml-trigger")||"click",a=function(){if(o){A({Title:"Confirm",Message:o,Buttons:[{Label:"Yes"},{Label:"No",IsDefault:!0}]}).then(function(s){s!=="No"&&b(n)});return}b(n)};i.removeEventListener(t,a),i.addEventListener(t,a)})}function Y(){Pn(),Tn(),Bn()}function In(e){let i=new Map;for(let n in e)typeof e[n]=="function"&&i.set(n,e[n]);return i}var X={};w(X,{ByID:()=>Vn,ByName:()=>Hn,Call:()=>Nn,Plugin:()=>_n});window._wails=window._wails||{};window._wails.callResultHandler=zn;window._wails.callErrorHandler=kn;var y=0,Fn=l(d.Call,""),v=new Map;function Ln(){let e;do e=f();while(v.has(e));return e}function zn(e,i,n){let o=re(e);o&&o.resolve(n?JSON.parse(i):i)}function kn(e,i){let n=re(e);n&&n.reject(i)}function re(e){let i=v.get(e);return v.delete(e),i}function O(e,i={}){return new Promise((n,o)=>{let t=Ln();i["call-id"]=t,v.set(t,{resolve:n,reject:o}),Fn(e,i).catch(a=>{o(a),v.delete(t)})})}function Nn(e){return O(y,e)}function Hn(e,...i){if(typeof e!="string"||e.split(".").length!==3)throw new Error("CallByName requires a string in the format 'package.struct.method'");let[n,o,t]=e.split(".");return O(y,{packageName:n,structName:o,methodName:t,args:i})}function Vn(e,...i){return O(y,{methodID:e,args:i})}function _n(e,i,...n){return O(y,{packageName:"wails-plugins",structName:e,methodName:i,args:n})}window._wails=window._wails||{};window._wails.invoke=h;window.wails=window.wails||{};window.wails.Application=T;window.wails.Browser=B;window.wails.Call=X;window.wails.Clipboard=I;window.wails.Dialogs=G;window.wails.Events=j;window.wails.Flags=z;window.wails.Screens=N;window.wails.System=L;window.wails.Window=H;window.wails.WML=K;var ae=!1;document.addEventListener("DOMContentLoaded",function(){ae=!0,window._wails.invoke("wails:runtime:ready")});function Zn(e){ae||document.readyState==="complete"?e():document.addEventListener("DOMContentLoaded",e)}Zn(()=>{Y()});})();
diff --git a/v3/examples/frameless/go.mod b/v3/examples/frameless/go.mod
index ab2668fb5a8..358eb760227 100644
--- a/v3/examples/frameless/go.mod
+++ b/v3/examples/frameless/go.mod
@@ -39,11 +39,11 @@ require (
github.com/wailsapp/go-webview2 v1.0.9 // indirect
github.com/wailsapp/mimetype v1.4.1 // indirect
github.com/xanzy/ssh-agent v0.3.3 // indirect
- golang.org/x/crypto v0.16.0 // indirect
+ golang.org/x/crypto v0.19.0 // indirect
golang.org/x/exp v0.0.0-20230626212559-97b1e661b5df // indirect
golang.org/x/mod v0.12.0 // indirect
golang.org/x/net v0.19.0 // indirect
- golang.org/x/sys v0.15.0 // indirect
+ golang.org/x/sys v0.17.0 // indirect
golang.org/x/tools v0.13.0 // indirect
gopkg.in/warnings.v0 v0.1.2 // indirect
)
diff --git a/v3/examples/frameless/go.sum b/v3/examples/frameless/go.sum
index 858cff35cf4..476b71ea3bd 100644
--- a/v3/examples/frameless/go.sum
+++ b/v3/examples/frameless/go.sum
@@ -110,8 +110,8 @@ golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5y
golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
golang.org/x/crypto v0.3.1-0.20221117191849-2c476679df9a/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4=
golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU=
-golang.org/x/crypto v0.16.0 h1:mMMrFzRSCF0GvB7Ne27XVtVAaXLrPmgPC7/v0tkwHaY=
-golang.org/x/crypto v0.16.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4=
+golang.org/x/crypto v0.19.0 h1:ENy+Az/9Y1vSrlrvBSyna3PITt4tiZLf7sgCjZBX7Wo=
+golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU=
golang.org/x/exp v0.0.0-20230626212559-97b1e661b5df h1:UA2aFVmmsIlefxMk29Dp2juaUSth8Pyn3Tq5Y5mJGME=
golang.org/x/exp v0.0.0-20230626212559-97b1e661b5df/go.mod h1:FXUEEKJgO7OQYeo8N01OfiKP8RXMtf6e8aTskBGqWdc=
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
@@ -150,15 +150,15 @@ golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc=
-golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
+golang.org/x/sys v0.17.0 h1:25cE3gD+tdBA7lp7QfhuV+rJiE9YXTcS3VG1SqssI/Y=
+golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc=
golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U=
-golang.org/x/term v0.15.0 h1:y/Oo/a/q3IXu26lQgl04j/gjuBDOBlx7X6Om1j2CPW4=
-golang.org/x/term v0.15.0/go.mod h1:BDl952bC7+uMoWR75FIrCDx79TPU9oHkTZ9yRbYOrX0=
+golang.org/x/term v0.17.0 h1:mkTF7LCd6WGJNL3K1Ad7kwxNfYAW6a8a8QqtMblp/4U=
+golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
diff --git a/v3/examples/keybindings/main.go b/v3/examples/keybindings/main.go
index a78068ac29a..ee9dee82568 100644
--- a/v3/examples/keybindings/main.go
+++ b/v3/examples/keybindings/main.go
@@ -26,7 +26,7 @@ func main() {
URL: "https://wails.io",
KeyBindings: map[string]func(window *application.WebviewWindow){
"F12": func(window *application.WebviewWindow) {
- window.ToggleDevTools()
+ window.OpenDevTools()
},
},
})
diff --git a/v3/examples/plugins/go.mod b/v3/examples/plugins/go.mod
index e84c04d5326..a31d9eb8a9a 100644
--- a/v3/examples/plugins/go.mod
+++ b/v3/examples/plugins/go.mod
@@ -1,20 +1,20 @@
module plugin_demo
-go 1.21
+go 1.21.1
-toolchain go1.21.0
+toolchain go1.22.0
require github.com/wailsapp/wails/v3 v3.0.0-alpha.0
require (
- github.com/Microsoft/go-winio v0.4.16 // indirect
+ github.com/Microsoft/go-winio v0.6.1 // indirect
github.com/bep/debounce v1.2.1 // indirect
github.com/dustin/go-humanize v1.0.0 // indirect
github.com/ebitengine/purego v0.4.0-alpha.4 // indirect
- github.com/emirpasic/gods v1.12.0 // indirect
- github.com/go-git/gcfg v1.5.0 // indirect
- github.com/go-git/go-billy/v5 v5.2.0 // indirect
- github.com/go-git/go-git/v5 v5.3.0 // indirect
+ github.com/emirpasic/gods v1.18.1 // indirect
+ github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 // indirect
+ github.com/go-git/go-billy/v5 v5.5.0 // indirect
+ github.com/go-git/go-git/v5 v5.11.0 // indirect
github.com/go-ole/go-ole v1.2.6 // indirect
github.com/godbus/dbus/v5 v5.1.0 // indirect
github.com/google/uuid v1.3.0 // indirect
@@ -23,11 +23,11 @@ require (
github.com/jchv/go-winloader v0.0.0-20210711035445-715c2860da7e // indirect
github.com/json-iterator/go v1.1.12 // indirect
github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 // indirect
- github.com/kevinburke/ssh_config v0.0.0-20201106050909-4977a11b4351 // indirect
+ github.com/kevinburke/ssh_config v1.2.0 // indirect
github.com/kr/pretty v0.3.1 // indirect
github.com/leaanthony/go-ansi-parser v1.6.1 // indirect
github.com/leaanthony/u v1.1.0 // indirect
- github.com/lmittmann/tint v1.0.0 // indirect
+ github.com/lmittmann/tint v1.0.3 // indirect
github.com/mattn/go-colorable v0.1.13 // indirect
github.com/mattn/go-isatty v0.0.19 // indirect
github.com/mitchellh/go-homedir v1.1.0 // indirect
@@ -37,19 +37,19 @@ require (
github.com/pkg/errors v0.9.1 // indirect
github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect
github.com/rivo/uniseg v0.4.4 // indirect
- github.com/rogpeppe/go-internal v1.10.1-0.20230524175051-ec119421bb97 // indirect
+ github.com/rogpeppe/go-internal v1.11.0 // indirect
github.com/samber/lo v1.38.1 // indirect
github.com/sergi/go-diff v1.2.0 // indirect
github.com/stretchr/testify v1.8.4 // indirect
github.com/wailsapp/go-webview2 v1.0.9 // indirect
github.com/wailsapp/mimetype v1.4.1 // indirect
- github.com/xanzy/ssh-agent v0.3.0 // indirect
- golang.org/x/crypto v0.9.0 // indirect
+ github.com/xanzy/ssh-agent v0.3.3 // indirect
+ golang.org/x/crypto v0.19.0 // indirect
golang.org/x/exp v0.0.0-20230626212559-97b1e661b5df // indirect
golang.org/x/mod v0.12.0 // indirect
- golang.org/x/net v0.10.0 // indirect
- golang.org/x/sys v0.13.0 // indirect
- golang.org/x/tools v0.6.0 // indirect
+ golang.org/x/net v0.19.0 // indirect
+ golang.org/x/sys v0.17.0 // indirect
+ golang.org/x/tools v0.13.0 // indirect
gopkg.in/warnings.v0 v0.1.2 // indirect
lukechampine.com/uint128 v1.2.0 // indirect
modernc.org/cc/v3 v3.40.0 // indirect
diff --git a/v3/examples/plugins/go.sum b/v3/examples/plugins/go.sum
index 499a8e0ad92..cbc968c45ea 100644
--- a/v3/examples/plugins/go.sum
+++ b/v3/examples/plugins/go.sum
@@ -1,6 +1,8 @@
github.com/Microsoft/go-winio v0.4.14/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA=
github.com/Microsoft/go-winio v0.4.16 h1:FtSW/jqD+l4ba5iPBj9CODVtgfYAD8w2wS923g/cFDk=
github.com/Microsoft/go-winio v0.4.16/go.mod h1:XB6nPKklQyQ7GC9LdcBEcBl8PF76WugXOPRXwdLnMv0=
+github.com/Microsoft/go-winio v0.5.2/go.mod h1:WpS1mjBmmwHBEWmogvA2mj8546UReBk4v8QkMxJ6pZY=
+github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM=
github.com/alcortesm/tgz v0.0.0-20161220082320-9c5fe88206d7 h1:uSoVVbwJiQipAclBbw+8quDsfcvFjOpI5iCf4p/cqCs=
github.com/alcortesm/tgz v0.0.0-20161220082320-9c5fe88206d7/go.mod h1:6zEj6s6u/ghQa61ZWa/C2Aw3RkjiTBOix7dkqa1VLIs=
github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239 h1:kFOfPq6dUM1hTo4JG6LR5AXSUEsOjtdm0kw0FtQtMJA=
@@ -19,19 +21,23 @@ github.com/ebitengine/purego v0.4.0-alpha.4 h1:Y7yIV06Yo5M2BAdD7EVPhfp6LZ0tEcQo5
github.com/ebitengine/purego v0.4.0-alpha.4/go.mod h1:ah1In8AOtksoNK6yk5z1HTJeUkC1Ez4Wk2idgGslMwQ=
github.com/emirpasic/gods v1.12.0 h1:QAUIPSaCu4G+POclxeqb3F+WPpdKqFGlw36+yOzGlrg=
github.com/emirpasic/gods v1.12.0/go.mod h1:YfzfFFoVP/catgzJb4IKIqXjX78Ha8FMSDh3ymbK86o=
+github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ=
github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc=
github.com/gliderlabs/ssh v0.2.2 h1:6zsha5zo/TWhRhwqCD3+EarCAgZ2yN28ipRnGPnwkI0=
github.com/gliderlabs/ssh v0.2.2/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0=
github.com/go-git/gcfg v1.5.0 h1:Q5ViNfGF8zFgyJWPqYwA7qGFoMTEiBmdlkcfRmpIMa4=
github.com/go-git/gcfg v1.5.0/go.mod h1:5m20vg6GwYabIxaOonVkTdrILxQMpEShl1xiMF4ua+E=
+github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376/go.mod h1:an3vInlBmSxCcxctByoQdvwPiA7DTK7jaaFDBTtu0ic=
github.com/go-git/go-billy/v5 v5.0.0/go.mod h1:pmpqyWchKfYfrkb/UVH4otLvyi/5gJlGI4Hb3ZqZ3W0=
github.com/go-git/go-billy/v5 v5.1.0/go.mod h1:pmpqyWchKfYfrkb/UVH4otLvyi/5gJlGI4Hb3ZqZ3W0=
github.com/go-git/go-billy/v5 v5.2.0 h1:GcoouCP9J+5slw2uXAocL70z8ml4A8B/H8nEPt6CLPk=
github.com/go-git/go-billy/v5 v5.2.0/go.mod h1:pmpqyWchKfYfrkb/UVH4otLvyi/5gJlGI4Hb3ZqZ3W0=
+github.com/go-git/go-billy/v5 v5.5.0/go.mod h1:hmexnoNsr2SJU1Ju67OaNz5ASJY3+sHgFRpCtpDCKow=
github.com/go-git/go-git-fixtures/v4 v4.0.2-0.20200613231340-f56387b50c12 h1:PbKy9zOy4aAKrJ5pibIRpVO2BXnK1Tlcg+caKI7Ox5M=
github.com/go-git/go-git-fixtures/v4 v4.0.2-0.20200613231340-f56387b50c12/go.mod h1:m+ICp2rF3jDhFgEZ/8yziagdT1C+ZpZcrJjappBCDSw=
github.com/go-git/go-git/v5 v5.3.0 h1:8WKMtJR2j8RntEXR/uvTKagfEt4GYlwQ7mntE4+0GWc=
github.com/go-git/go-git/v5 v5.3.0/go.mod h1:xdX4bWJ48aOrdhnl2XqHYstHbbp6+LFS4r4X+lNVprw=
+github.com/go-git/go-git/v5 v5.11.0/go.mod h1:6GFcX2P3NM7FPBfpePbpLd21XxsgdAt+lKqXmCUiUCY=
github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY=
github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0=
github.com/godbus/dbus/v5 v5.1.0 h1:4KLkAxT3aOY8Li4FRJe/KvhoNFFxo0m6fNuFUO8QJUk=
@@ -57,6 +63,7 @@ github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNU
github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8=
github.com/kevinburke/ssh_config v0.0.0-20201106050909-4977a11b4351 h1:DowS9hvgyYSX4TO5NpyC606/Z4SxnNYbT+WX27or6Ck=
github.com/kevinburke/ssh_config v0.0.0-20201106050909-4977a11b4351/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM=
+github.com/kevinburke/ssh_config v1.2.0/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM=
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
@@ -72,6 +79,7 @@ github.com/leaanthony/u v1.1.0 h1:2n0d2BwPVXSUq5yhe8lJPHdxevE2qK5G99PMStMZMaI=
github.com/leaanthony/u v1.1.0/go.mod h1:9+o6hejoRljvZ3BzdYlVL0JYCwtnAsVuN9pVTQcaRfI=
github.com/lmittmann/tint v1.0.0 h1:fzEj70K1L58uyoePQxKe+ezDZJ5pybiWGdA0JeFvvyw=
github.com/lmittmann/tint v1.0.0/go.mod h1:HIS3gSy7qNwGCj+5oRjAutErFBl4BzdQP6cJZ0NfMwE=
+github.com/lmittmann/tint v1.0.3/go.mod h1:HIS3gSy7qNwGCj+5oRjAutErFBl4BzdQP6cJZ0NfMwE=
github.com/matryer/is v1.4.0 h1:sosSmIWwkYITGrxZ25ULNDeKiMNzFSr4V/eqBQP0PeE=
github.com/matryer/is v1.4.0/go.mod h1:8I/i5uYgLzgsgEloJE1U6xx5HkBQpAZvepWuujKwMRU=
github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=
@@ -105,12 +113,14 @@ github.com/rivo/uniseg v0.4.4/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUc
github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=
github.com/rogpeppe/go-internal v1.10.1-0.20230524175051-ec119421bb97 h1:3RPlVWzZ/PDqmVuf/FKHARG5EMid/tl7cv54Sw/QRVY=
github.com/rogpeppe/go-internal v1.10.1-0.20230524175051-ec119421bb97/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA=
+github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA=
github.com/samber/lo v1.38.1 h1:j2XEAqXKb09Am4ebOg31SpvzUTTs6EN3VfgeLUhPdXM=
github.com/samber/lo v1.38.1/go.mod h1:+m/ZKRl6ClXCE2Lgf3MsQlWfh4bn1bz6CXEOxnEXnEA=
github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM=
github.com/sergi/go-diff v1.2.0 h1:XU+rvMAioB0UC3q1MFrIQy4Vo5/4VsRDQQXHsEya6xQ=
github.com/sergi/go-diff v1.2.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM=
github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q=
+github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
@@ -124,10 +134,14 @@ github.com/wailsapp/mimetype v1.4.1 h1:pQN9ycO7uo4vsUUuPeHEYoUkLVkaRntMnHJxVwYhw
github.com/wailsapp/mimetype v1.4.1/go.mod h1:9aV5k31bBOv5z6u+QP8TltzvNGJPmNJD4XlAL3U+j3o=
github.com/xanzy/ssh-agent v0.3.0 h1:wUMzuKtKilRgBAD1sUb8gOwwRr2FGoBVumcjoOACClI=
github.com/xanzy/ssh-agent v0.3.0/go.mod h1:3s9xbODqPuuhK9JV1R321M/FlMZSBvE5aY6eAcqrDh0=
+github.com/xanzy/ssh-agent v0.3.3/go.mod h1:6dzNDKs0J9rVPHPhaGCukekBHKqfl+L3KghI1Bc68Uw=
golang.org/x/crypto v0.0.0-20190219172222-a4c6cb3142f2/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4=
+golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
golang.org/x/crypto v0.9.0 h1:LF6fAI+IutBocDJ2OT0Q1g8plpYljMZ4+lty+dsqw3g=
golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0=
+golang.org/x/crypto v0.16.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4=
+golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU=
golang.org/x/exp v0.0.0-20230626212559-97b1e661b5df h1:UA2aFVmmsIlefxMk29Dp2juaUSth8Pyn3Tq5Y5mJGME=
golang.org/x/exp v0.0.0-20230626212559-97b1e661b5df/go.mod h1:FXUEEKJgO7OQYeo8N01OfiKP8RXMtf6e8aTskBGqWdc=
golang.org/x/mod v0.12.0 h1:rmsUpXtvNzj340zd98LZ4KntptpfRHwpFOHG188oHXc=
@@ -135,24 +149,32 @@ golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
golang.org/x/net v0.0.0-20210326060303-6b1517762897/go.mod h1:uSPa2vr4CLtc/ILN5odXGNXS6mhrKVzTaCXzk9m6W3k=
golang.org/x/net v0.0.0-20210505024714-0287a6fb4125/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
+golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
golang.org/x/net v0.10.0 h1:X2//UzNDwYmtCLn7To6G58Wr6f5ahEAQgKNzv9Y951M=
golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
+golang.org/x/net v0.19.0/go.mod h1:CfAk/cbD4CthTvqiEl8NpboMuiuOYsAr/7NOjZJtv1U=
golang.org/x/sync v0.4.0 h1:zxkM55ReGkDlKSM+Fu41A+zmbZuaPVbGMzvvdUPznYQ=
golang.org/x/sync v0.4.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y=
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200810151505-1b9f1253b3ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210324051608-47abb6519492/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20210616045830-e2b7044e8c71/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE=
golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
+golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/term v0.13.0 h1:bb+I9cTfFazGW51MZqBVmZy7+JEJMouUHTUSKVQLBek=
golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U=
@@ -163,6 +185,7 @@ golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.6.0 h1:BOw41kyTf3PuCW1pVQf8+Cyg8pMlkYB1oo9iJ6D/lKM=
golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
+golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
diff --git a/v3/examples/screen/assets/index.html b/v3/examples/screen/assets/index.html
index 4b385ada1fd..eafcfe1b9c2 100644
--- a/v3/examples/screen/assets/index.html
+++ b/v3/examples/screen/assets/index.html
@@ -43,6 +43,7 @@
text-align: -webkit-center;
}
+
diff --git a/v3/examples/screen/assets/runtime.js b/v3/examples/screen/assets/runtime.js
new file mode 100644
index 00000000000..baaccee0402
--- /dev/null
+++ b/v3/examples/screen/assets/runtime.js
@@ -0,0 +1 @@
+(()=>{var de=Object.defineProperty;var w=(e,i)=>{for(var n in i)de(e,n,{get:i[n],enumerable:!0})};var T={};w(T,{Hide:()=>We,Quit:()=>fe,Show:()=>ge});var le="useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict";var f=(e=21)=>{let i="",n=e;for(;n--;)i+=le[Math.random()*64|0];return i};var ce=window.location.origin+"/wails/runtime",d={Call:0,Clipboard:1,Application:2,Events:3,ContextMenu:4,Dialog:5,Window:6,Screens:7,System:8,Browser:9},se=f();function l(e,i){return function(n,o=null){return we(e,n,i,o)}}function we(e,i,n,o){let t=new URL(ce);t.searchParams.append("object",e),t.searchParams.append("method",i);let a={headers:{}};return n&&(a.headers["x-wails-window-name"]=n),o&&t.searchParams.append("args",JSON.stringify(o)),a.headers["x-wails-client-id"]=se,new Promise((s,p)=>{fetch(t,a).then(c=>{if(c.ok)return c.headers.get("Content-Type")&&c.headers.get("Content-Type").indexOf("application/json")!==-1?c.json():c.text();p(Error(c.statusText))}).then(c=>s(c)).catch(c=>p(c))})}var P=l(d.Application,""),me=0,ue=1,pe=2;function We(){return P(me)}function ge(){return P(ue)}function fe(){return P(pe)}var B={};w(B,{OpenURL:()=>b});var he=l(d.Browser,""),De=0;function b(e){return he(De,{url:e})}var I={};w(I,{SetText:()=>xe,Text:()=>Me});var q=l(d.Clipboard,""),Ce=0,Se=1;function xe(e){return q(Ce,{text:e})}function Me(){return q(Se)}var L={};w(L,{Capabilities:()=>Re,Environment:()=>Ee,IsAMD64:()=>Oe,IsARM:()=>Pe,IsARM64:()=>Te,IsDarkMode:()=>be,IsDebug:()=>F,IsLinux:()=>Ue,IsMac:()=>ye,IsWindows:()=>R,invoke:()=>h});var J=l(d.System,""),Ae=0,ve=1;function h(e){return window.chrome?window.chrome.webview.postMessage(e):window.webkit.messageHandlers.external.postMessage(e)}function be(){return J(Ae)}function Re(){return fetch("/wails/capabilities").json()}function Ee(){return J(ve)}function R(){return window._wails.environment.OS==="windows"}function Ue(){return window._wails.environment.OS==="linux"}function ye(){return window._wails.environment.OS==="darwin"}function Oe(){return window._wails.environment.Arch==="amd64"}function Pe(){return window._wails.environment.Arch==="arm"}function Te(){return window._wails.environment.Arch==="arm64"}function F(){return window._wails.environment.Debug===!0}window.addEventListener("contextmenu",Le);var Be=l(d.ContextMenu,""),Ie=0;function Fe(e,i,n,o){Be(Ie,{id:e,x:i,y:n,data:o})}function Le(e){let i=e.target,n=window.getComputedStyle(i).getPropertyValue("--custom-contextmenu");if(n=n?n.trim():"",n){e.preventDefault();let o=window.getComputedStyle(i).getPropertyValue("--custom-contextmenu-data");Fe(n,e.clientX,e.clientY,o);return}ze(e)}function ze(e){if(F())return;let i=e.target;switch(window.getComputedStyle(i).getPropertyValue("--default-contextmenu").trim()){case"show":return;case"hide":e.preventDefault();return;default:if(i.isContentEditable)return;let t=window.getSelection(),a=t.toString().length>0;if(a)for(let s=0;sS});function S(e){try{return window._wails.flags[e]}catch(i){throw new Error("Unable to retrieve flag '"+e+"': "+i)}}window._wails=window._wails||{};window._wails.setResizable=He;window._wails.endDrag=ee;window.addEventListener("mousedown",_e);window.addEventListener("mousemove",Ge);window.addEventListener("mouseup",je);var x=!1,E=null,$=!1,ke="auto";function Ne(e){let i=window.getComputedStyle(e.target).getPropertyValue("--webkit-app-region");return!i||i===""||i.trim()!=="drag"||e.buttons!==1?!1:e.detail===1}function He(e){$=e}function ee(){document.body.style.cursor="default",x=!1}function Ve(){return E?(h(`resize:${E}`),!0):!1}function _e(e){(R()&&Ve()||Ne(e))&&(x=!!Ze(e))}function Ze(e){return!(e.offsetX>e.target.clientWidth||e.offsetY>e.target.clientHeight)}function je(e){(e.buttons!==void 0?e.buttons:e.which)>0&&ee()}function u(e=ke){document.documentElement.style.cursor=e,E=e}function Ge(e){x=Ye(e),R()&&$&&Ke(e)}function Ye(e){let i=e.buttons!==void 0?e.buttons:e.which;return x&&i>0?(h("drag"),!1):x}function Ke(e){let i=S("system.resizeHandleHeight")||5,n=S("system.resizeHandleWidth")||5,o=S("resizeCornerExtra")||10,t=window.outerWidth-e.clientXJe,GetCurrent:()=>ei,GetPrimary:()=>$e});var k=l(d.Screens,""),Xe=0,Qe=1,qe=2;function Je(){return k(Xe)}function $e(){return k(Qe)}function ei(){return k(qe)}var H={};w(H,{Center:()=>Oi,Close:()=>Qi,Fullscreen:()=>Ti,Get:()=>U,GetZoomLevel:()=>rn,Height:()=>en,Hide:()=>Vi,Maximise:()=>_i,Minimise:()=>Gi,RelativePosition:()=>Ni,Restore:()=>Ki,Screen:()=>Hi,SetAlwaysOnTop:()=>zi,SetBackgroundColour:()=>qi,SetMaxSize:()=>Fi,SetMinSize:()=>Li,SetRelativePosition:()=>ki,SetResizable:()=>Ji,SetSize:()=>Bi,SetTitle:()=>Pi,SetZoomLevel:()=>an,Show:()=>Xi,Size:()=>Ii,ToggleMaximise:()=>ji,UnMaximise:()=>Zi,UnMinimise:()=>Yi,Width:()=>$i,ZoomIn:()=>nn,ZoomOut:()=>on,ZoomReset:()=>tn});var ii=0,ni=1,oi=2,ti=3,ri=4,ai=5,di=6,li=7,ci=8,si=9,wi=10,mi=11,ui=12,pi=13,Wi=14,gi=15,fi=16,hi=17,Di=18,Ci=19,Si=20,xi=21,Mi=22,Ai=23,vi=24,bi=25,Ri=26,Ei=27,Ui=28,yi=29,r=U("");function ie(e){return{Get:i=>ie(l(d.Window,i)),Center:()=>e(ii),SetTitle:i=>e(ni,{title:i}),Fullscreen:()=>e(oi),UnFullscreen:()=>e(ti),SetSize:(i,n)=>e(ri,{width:i,height:n}),Size:()=>e(ai),SetMaxSize:(i,n)=>e(di,{width:i,height:n}),SetMinSize:(i,n)=>e(li,{width:i,height:n}),SetAlwaysOnTop:i=>e(ci,{alwaysOnTop:i}),SetRelativePosition:(i,n)=>e(si,{x:i,y:n}),RelativePosition:()=>e(wi),Screen:()=>e(mi),Hide:()=>e(ui),Maximise:()=>e(pi),UnMaximise:()=>e(Wi),ToggleMaximise:()=>e(gi),Minimise:()=>e(fi),UnMinimise:()=>e(hi),Restore:()=>e(Di),Show:()=>e(Ci),Close:()=>e(Si),SetBackgroundColour:(i,n,o,t)=>e(xi,{r:i,g:n,b:o,a:t}),SetResizable:i=>e(Mi,{resizable:i}),Width:()=>e(Ai),Height:()=>e(vi),ZoomIn:()=>e(bi),ZoomOut:()=>e(Ri),ZoomReset:()=>e(Ei),GetZoomLevel:()=>e(Ui),SetZoomLevel:i=>e(yi,{zoomLevel:i})}}function U(e){return ie(l(d.Window,e))}function Oi(){r.Center()}function Pi(e){r.SetTitle(e)}function Ti(){r.Fullscreen()}function Bi(e,i){r.SetSize(e,i)}function Ii(){return r.Size()}function Fi(e,i){r.SetMaxSize(e,i)}function Li(e,i){r.SetMinSize(e,i)}function zi(e){r.SetAlwaysOnTop(e)}function ki(e,i){r.SetRelativePosition(e,i)}function Ni(){return r.RelativePosition()}function Hi(){return r.Screen()}function Vi(){r.Hide()}function _i(){r.Maximise()}function Zi(){r.UnMaximise()}function ji(){r.ToggleMaximise()}function Gi(){r.Minimise()}function Yi(){r.UnMinimise()}function Ki(){r.Restore()}function Xi(){r.Show()}function Qi(){r.Close()}function qi(e,i,n,o){r.SetBackgroundColour(e,i,n,o)}function Ji(e){r.SetResizable(e)}function $i(){return r.Width()}function en(){return r.Height()}function nn(){r.ZoomIn()}function on(){r.ZoomOut()}function tn(){r.ZoomReset()}function rn(){return r.GetZoomLevel()}function an(e){r.SetZoomLevel(e)}var K={};w(K,{Reload:()=>Y});var j={};w(j,{Emit:()=>Z,Off:()=>Wn,OffAll:()=>gn,On:()=>mn,OnMultiple:()=>_,Once:()=>un,Types:()=>dn,WailsEvent:()=>M,setup:()=>sn});var ne={Windows:{SystemThemeChanged:"windows:SystemThemeChanged",APMPowerStatusChange:"windows:APMPowerStatusChange",APMSuspend:"windows:APMSuspend",APMResumeAutomatic:"windows:APMResumeAutomatic",APMResumeSuspend:"windows:APMResumeSuspend",APMPowerSettingChange:"windows:APMPowerSettingChange",ApplicationStarted:"windows:ApplicationStarted",WebViewNavigationCompleted:"windows:WebViewNavigationCompleted",WindowInactive:"windows:WindowInactive",WindowActive:"windows:WindowActive",WindowClickActive:"windows:WindowClickActive",WindowMaximise:"windows:WindowMaximise",WindowUnMaximise:"windows:WindowUnMaximise",WindowFullscreen:"windows:WindowFullscreen",WindowUnFullscreen:"windows:WindowUnFullscreen",WindowRestore:"windows:WindowRestore",WindowMinimise:"windows:WindowMinimise",WindowUnMinimise:"windows:WindowUnMinimise",WindowClose:"windows:WindowClose",WindowSetFocus:"windows:WindowSetFocus",WindowKillFocus:"windows:WindowKillFocus",WindowDragDrop:"windows:WindowDragDrop",WindowDragEnter:"windows:WindowDragEnter",WindowDragLeave:"windows:WindowDragLeave",WindowDragOver:"windows:WindowDragOver"},Mac:{ApplicationDidBecomeActive:"mac:ApplicationDidBecomeActive",ApplicationDidChangeBackingProperties:"mac:ApplicationDidChangeBackingProperties",ApplicationDidChangeEffectiveAppearance:"mac:ApplicationDidChangeEffectiveAppearance",ApplicationDidChangeIcon:"mac:ApplicationDidChangeIcon",ApplicationDidChangeOcclusionState:"mac:ApplicationDidChangeOcclusionState",ApplicationDidChangeScreenParameters:"mac:ApplicationDidChangeScreenParameters",ApplicationDidChangeStatusBarFrame:"mac:ApplicationDidChangeStatusBarFrame",ApplicationDidChangeStatusBarOrientation:"mac:ApplicationDidChangeStatusBarOrientation",ApplicationDidFinishLaunching:"mac:ApplicationDidFinishLaunching",ApplicationDidHide:"mac:ApplicationDidHide",ApplicationDidResignActiveNotification:"mac:ApplicationDidResignActiveNotification",ApplicationDidUnhide:"mac:ApplicationDidUnhide",ApplicationDidUpdate:"mac:ApplicationDidUpdate",ApplicationWillBecomeActive:"mac:ApplicationWillBecomeActive",ApplicationWillFinishLaunching:"mac:ApplicationWillFinishLaunching",ApplicationWillHide:"mac:ApplicationWillHide",ApplicationWillResignActive:"mac:ApplicationWillResignActive",ApplicationWillTerminate:"mac:ApplicationWillTerminate",ApplicationWillUnhide:"mac:ApplicationWillUnhide",ApplicationWillUpdate:"mac:ApplicationWillUpdate",ApplicationDidChangeTheme:"mac:ApplicationDidChangeTheme!",ApplicationShouldHandleReopen:"mac:ApplicationShouldHandleReopen!",WindowDidBecomeKey:"mac:WindowDidBecomeKey",WindowDidBecomeMain:"mac:WindowDidBecomeMain",WindowDidBeginSheet:"mac:WindowDidBeginSheet",WindowDidChangeAlpha:"mac:WindowDidChangeAlpha",WindowDidChangeBackingLocation:"mac:WindowDidChangeBackingLocation",WindowDidChangeBackingProperties:"mac:WindowDidChangeBackingProperties",WindowDidChangeCollectionBehavior:"mac:WindowDidChangeCollectionBehavior",WindowDidChangeEffectiveAppearance:"mac:WindowDidChangeEffectiveAppearance",WindowDidChangeOcclusionState:"mac:WindowDidChangeOcclusionState",WindowDidChangeOrderingMode:"mac:WindowDidChangeOrderingMode",WindowDidChangeScreen:"mac:WindowDidChangeScreen",WindowDidChangeScreenParameters:"mac:WindowDidChangeScreenParameters",WindowDidChangeScreenProfile:"mac:WindowDidChangeScreenProfile",WindowDidChangeScreenSpace:"mac:WindowDidChangeScreenSpace",WindowDidChangeScreenSpaceProperties:"mac:WindowDidChangeScreenSpaceProperties",WindowDidChangeSharingType:"mac:WindowDidChangeSharingType",WindowDidChangeSpace:"mac:WindowDidChangeSpace",WindowDidChangeSpaceOrderingMode:"mac:WindowDidChangeSpaceOrderingMode",WindowDidChangeTitle:"mac:WindowDidChangeTitle",WindowDidChangeToolbar:"mac:WindowDidChangeToolbar",WindowDidChangeVisibility:"mac:WindowDidChangeVisibility",WindowDidDeminiaturize:"mac:WindowDidDeminiaturize",WindowDidEndSheet:"mac:WindowDidEndSheet",WindowDidEnterFullScreen:"mac:WindowDidEnterFullScreen",WindowDidEnterVersionBrowser:"mac:WindowDidEnterVersionBrowser",WindowDidExitFullScreen:"mac:WindowDidExitFullScreen",WindowDidExitVersionBrowser:"mac:WindowDidExitVersionBrowser",WindowDidExpose:"mac:WindowDidExpose",WindowDidFocus:"mac:WindowDidFocus",WindowDidMiniaturize:"mac:WindowDidMiniaturize",WindowDidMove:"mac:WindowDidMove",WindowDidOrderOffScreen:"mac:WindowDidOrderOffScreen",WindowDidOrderOnScreen:"mac:WindowDidOrderOnScreen",WindowDidResignKey:"mac:WindowDidResignKey",WindowDidResignMain:"mac:WindowDidResignMain",WindowDidResize:"mac:WindowDidResize",WindowDidUpdate:"mac:WindowDidUpdate",WindowDidUpdateAlpha:"mac:WindowDidUpdateAlpha",WindowDidUpdateCollectionBehavior:"mac:WindowDidUpdateCollectionBehavior",WindowDidUpdateCollectionProperties:"mac:WindowDidUpdateCollectionProperties",WindowDidUpdateShadow:"mac:WindowDidUpdateShadow",WindowDidUpdateTitle:"mac:WindowDidUpdateTitle",WindowDidUpdateToolbar:"mac:WindowDidUpdateToolbar",WindowDidUpdateVisibility:"mac:WindowDidUpdateVisibility",WindowShouldClose:"mac:WindowShouldClose!",WindowWillBecomeKey:"mac:WindowWillBecomeKey",WindowWillBecomeMain:"mac:WindowWillBecomeMain",WindowWillBeginSheet:"mac:WindowWillBeginSheet",WindowWillChangeOrderingMode:"mac:WindowWillChangeOrderingMode",WindowWillClose:"mac:WindowWillClose",WindowWillDeminiaturize:"mac:WindowWillDeminiaturize",WindowWillEnterFullScreen:"mac:WindowWillEnterFullScreen",WindowWillEnterVersionBrowser:"mac:WindowWillEnterVersionBrowser",WindowWillExitFullScreen:"mac:WindowWillExitFullScreen",WindowWillExitVersionBrowser:"mac:WindowWillExitVersionBrowser",WindowWillFocus:"mac:WindowWillFocus",WindowWillMiniaturize:"mac:WindowWillMiniaturize",WindowWillMove:"mac:WindowWillMove",WindowWillOrderOffScreen:"mac:WindowWillOrderOffScreen",WindowWillOrderOnScreen:"mac:WindowWillOrderOnScreen",WindowWillResignMain:"mac:WindowWillResignMain",WindowWillResize:"mac:WindowWillResize",WindowWillUnfocus:"mac:WindowWillUnfocus",WindowWillUpdate:"mac:WindowWillUpdate",WindowWillUpdateAlpha:"mac:WindowWillUpdateAlpha",WindowWillUpdateCollectionBehavior:"mac:WindowWillUpdateCollectionBehavior",WindowWillUpdateCollectionProperties:"mac:WindowWillUpdateCollectionProperties",WindowWillUpdateShadow:"mac:WindowWillUpdateShadow",WindowWillUpdateTitle:"mac:WindowWillUpdateTitle",WindowWillUpdateToolbar:"mac:WindowWillUpdateToolbar",WindowWillUpdateVisibility:"mac:WindowWillUpdateVisibility",WindowWillUseStandardFrame:"mac:WindowWillUseStandardFrame",MenuWillOpen:"mac:MenuWillOpen",MenuDidOpen:"mac:MenuDidOpen",MenuDidClose:"mac:MenuDidClose",MenuWillSendAction:"mac:MenuWillSendAction",MenuDidSendAction:"mac:MenuDidSendAction",MenuWillHighlightItem:"mac:MenuWillHighlightItem",MenuDidHighlightItem:"mac:MenuDidHighlightItem",MenuWillDisplayItem:"mac:MenuWillDisplayItem",MenuDidDisplayItem:"mac:MenuDidDisplayItem",MenuWillAddItem:"mac:MenuWillAddItem",MenuDidAddItem:"mac:MenuDidAddItem",MenuWillRemoveItem:"mac:MenuWillRemoveItem",MenuDidRemoveItem:"mac:MenuDidRemoveItem",MenuWillBeginTracking:"mac:MenuWillBeginTracking",MenuDidBeginTracking:"mac:MenuDidBeginTracking",MenuWillEndTracking:"mac:MenuWillEndTracking",MenuDidEndTracking:"mac:MenuDidEndTracking",MenuWillUpdate:"mac:MenuWillUpdate",MenuDidUpdate:"mac:MenuDidUpdate",MenuWillPopUp:"mac:MenuWillPopUp",MenuDidPopUp:"mac:MenuDidPopUp",MenuWillSendActionToItem:"mac:MenuWillSendActionToItem",MenuDidSendActionToItem:"mac:MenuDidSendActionToItem",WebViewDidStartProvisionalNavigation:"mac:WebViewDidStartProvisionalNavigation",WebViewDidReceiveServerRedirectForProvisionalNavigation:"mac:WebViewDidReceiveServerRedirectForProvisionalNavigation",WebViewDidFinishNavigation:"mac:WebViewDidFinishNavigation",WebViewDidCommitNavigation:"mac:WebViewDidCommitNavigation",WindowFileDraggingEntered:"mac:WindowFileDraggingEntered",WindowFileDraggingPerformed:"mac:WindowFileDraggingPerformed",WindowFileDraggingExited:"mac:WindowFileDraggingExited"},Linux:{SystemThemeChanged:"linux:SystemThemeChanged",WindowLoadChanged:"linux:WindowLoadChanged",WindowDeleteEvent:"linux:WindowDeleteEvent",WindowFocusIn:"linux:WindowFocusIn",WindowFocusOut:"linux:WindowFocusOut",ApplicationStartup:"linux:ApplicationStartup"},Common:{ApplicationStarted:"common:ApplicationStarted",WindowMaximise:"common:WindowMaximise",WindowUnMaximise:"common:WindowUnMaximise",WindowFullscreen:"common:WindowFullscreen",WindowUnFullscreen:"common:WindowUnFullscreen",WindowRestore:"common:WindowRestore",WindowMinimise:"common:WindowMinimise",WindowUnMinimise:"common:WindowUnMinimise",WindowClosing:"common:WindowClosing",WindowZoom:"common:WindowZoom",WindowZoomIn:"common:WindowZoomIn",WindowZoomOut:"common:WindowZoomOut",WindowZoomReset:"common:WindowZoomReset",WindowFocus:"common:WindowFocus",WindowLostFocus:"common:WindowLostFocus",WindowShow:"common:WindowShow",WindowHide:"common:WindowHide",WindowDPIChanged:"common:WindowDPIChanged",WindowFilesDropped:"common:WindowFilesDropped",WindowRuntimeReady:"common:WindowRuntimeReady",ThemeChanged:"common:ThemeChanged"}};var dn=ne;window._wails=window._wails||{};window._wails.dispatchWailsEvent=wn;var ln=l(d.Events,""),cn=0,m=new Map,V=class{constructor(i,n,o){this.eventName=i,this.maxCallbacks=o||-1,this.Callback=t=>(n(t),this.maxCallbacks===-1?!1:(this.maxCallbacks-=1,this.maxCallbacks===0))}},M=class{constructor(i,n=null){this.name=i,this.data=n}};function sn(){}function wn(e){let i=m.get(e.name);if(i){let n=i.filter(o=>{if(o.Callback(e))return!0});n.length>0&&(i=i.filter(o=>!n.includes(o)),i.length===0?m.delete(e.name):m.set(e.name,i))}}function _(e,i,n){let o=m.get(e)||[],t=new V(e,i,n);return o.push(t),m.set(e,o),()=>pn(t)}function mn(e,i){return _(e,i,-1)}function un(e,i){return _(e,i,1)}function pn(e){let i=e.eventName,n=m.get(i).filter(o=>o!==e);n.length===0?m.delete(i):m.set(i,n)}function Wn(e,...i){[e,...i].forEach(o=>m.delete(o))}function gn(){m.clear()}function Z(e){return ln(cn,e)}var G={};w(G,{Error:()=>Un,Info:()=>Rn,OpenFile:()=>yn,Question:()=>A,SaveFile:()=>On,Warning:()=>En});window._wails=window._wails||{};window._wails.dialogErrorCallback=bn;window._wails.dialogResultCallback=vn;var fn=0,hn=1,Dn=2,Cn=3,Sn=4,xn=5,Mn=l(d.Dialog,""),W=new Map;function An(){let e;do e=f();while(W.has(e));return e}function D(e,i={}){let n=An();return i["dialog-id"]=n,new Promise((o,t)=>{W.set(n,{resolve:o,reject:t}),Mn(e,i).catch(a=>{t(a),W.delete(n)})})}function vn(e,i,n){let o=W.get(e);o&&(n?o.resolve(JSON.parse(i)):o.resolve(i),W.delete(e))}function bn(e,i){let n=W.get(e);n&&(n.reject(i),W.delete(e))}var Rn=e=>D(fn,e),En=e=>D(hn,e),Un=e=>D(Dn,e),A=e=>D(Cn,e),yn=e=>D(Sn,e),On=e=>D(xn,e);function oe(e,i=null){let n=new M(e,i);Z(n)}function Pn(){document.querySelectorAll("[wml-event]").forEach(function(i){let n=i.getAttribute("wml-event"),o=i.getAttribute("wml-confirm"),t=i.getAttribute("wml-trigger")||"click",a=function(){if(o){A({Title:"Confirm",Message:o,Detached:!1,Buttons:[{Label:"Yes"},{Label:"No",IsDefault:!0}]}).then(function(s){s!=="No"&&oe(n)});return}oe(n)};i.removeEventListener(t,a),i.addEventListener(t,a)})}function te(e,i){let n=U(e),o=In(n);o.has(i);try{o.get(i)()}catch{}}function Tn(){document.querySelectorAll("[wml-window]").forEach(function(i){let n=i.getAttribute("wml-window"),o=i.getAttribute("wml-confirm"),t=i.getAttribute("wml-trigger")||"click",a=i.getAttribute("wml-target-window")||"",s=function(){if(o){A({Title:"Confirm",Message:o,Buttons:[{Label:"Yes"},{Label:"No",IsDefault:!0}]}).then(function(p){p!=="No"&&te(a,n)});return}te(a,n)};i.removeEventListener(t,s),i.addEventListener(t,s)})}function Bn(){document.querySelectorAll("[wml-openurl]").forEach(function(i){let n=i.getAttribute("wml-openurl"),o=i.getAttribute("wml-confirm"),t=i.getAttribute("wml-trigger")||"click",a=function(){if(o){A({Title:"Confirm",Message:o,Buttons:[{Label:"Yes"},{Label:"No",IsDefault:!0}]}).then(function(s){s!=="No"&&b(n)});return}b(n)};i.removeEventListener(t,a),i.addEventListener(t,a)})}function Y(){Pn(),Tn(),Bn()}function In(e){let i=new Map;for(let n in e)typeof e[n]=="function"&&i.set(n,e[n]);return i}var X={};w(X,{ByID:()=>Vn,ByName:()=>Hn,Call:()=>Nn,Plugin:()=>_n});window._wails=window._wails||{};window._wails.callResultHandler=zn;window._wails.callErrorHandler=kn;var y=0,Fn=l(d.Call,""),v=new Map;function Ln(){let e;do e=f();while(v.has(e));return e}function zn(e,i,n){let o=re(e);o&&o.resolve(n?JSON.parse(i):i)}function kn(e,i){let n=re(e);n&&n.reject(i)}function re(e){let i=v.get(e);return v.delete(e),i}function O(e,i={}){return new Promise((n,o)=>{let t=Ln();i["call-id"]=t,v.set(t,{resolve:n,reject:o}),Fn(e,i).catch(a=>{o(a),v.delete(t)})})}function Nn(e){return O(y,e)}function Hn(e,...i){if(typeof e!="string"||e.split(".").length!==3)throw new Error("CallByName requires a string in the format 'package.struct.method'");let[n,o,t]=e.split(".");return O(y,{packageName:n,structName:o,methodName:t,args:i})}function Vn(e,...i){return O(y,{methodID:e,args:i})}function _n(e,i,...n){return O(y,{packageName:"wails-plugins",structName:e,methodName:i,args:n})}window._wails=window._wails||{};window._wails.invoke=h;window.wails=window.wails||{};window.wails.Application=T;window.wails.Browser=B;window.wails.Call=X;window.wails.Clipboard=I;window.wails.Dialogs=G;window.wails.Events=j;window.wails.Flags=z;window.wails.Screens=N;window.wails.System=L;window.wails.Window=H;window.wails.WML=K;var ae=!1;document.addEventListener("DOMContentLoaded",function(){ae=!0,window._wails.invoke("wails:runtime:ready")});function Zn(e){ae||document.readyState==="complete"?e():document.addEventListener("DOMContentLoaded",e)}Zn(()=>{Y()});})();
diff --git a/v3/examples/server/go.mod b/v3/examples/server/go.mod
index bf3a7c2037f..4ebf1edafab 100644
--- a/v3/examples/server/go.mod
+++ b/v3/examples/server/go.mod
@@ -1,19 +1,19 @@
module server_demo
-go 1.21
+go 1.21.1
-toolchain go1.21.0
+toolchain go1.22.0
require github.com/wailsapp/wails/v3 v3.0.0-alpha.0
require (
- github.com/Microsoft/go-winio v0.4.16 // indirect
+ github.com/Microsoft/go-winio v0.6.1 // indirect
github.com/bep/debounce v1.2.1 // indirect
github.com/ebitengine/purego v0.4.0-alpha.4 // indirect
- github.com/emirpasic/gods v1.12.0 // indirect
- github.com/go-git/gcfg v1.5.0 // indirect
- github.com/go-git/go-billy/v5 v5.2.0 // indirect
- github.com/go-git/go-git/v5 v5.3.0 // indirect
+ github.com/emirpasic/gods v1.18.1 // indirect
+ github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 // indirect
+ github.com/go-git/go-billy/v5 v5.5.0 // indirect
+ github.com/go-git/go-git/v5 v5.11.0 // indirect
github.com/go-ole/go-ole v1.2.6 // indirect
github.com/godbus/dbus/v5 v5.1.0 // indirect
github.com/google/uuid v1.3.0 // indirect
@@ -21,11 +21,11 @@ require (
github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 // indirect
github.com/jchv/go-winloader v0.0.0-20210711035445-715c2860da7e // indirect
github.com/json-iterator/go v1.1.12 // indirect
- github.com/kevinburke/ssh_config v0.0.0-20201106050909-4977a11b4351 // indirect
+ github.com/kevinburke/ssh_config v1.2.0 // indirect
github.com/kr/pretty v0.3.1 // indirect
github.com/leaanthony/go-ansi-parser v1.6.1 // indirect
github.com/leaanthony/u v1.1.0 // indirect
- github.com/lmittmann/tint v1.0.0 // indirect
+ github.com/lmittmann/tint v1.0.3 // indirect
github.com/mattn/go-colorable v0.1.13 // indirect
github.com/mattn/go-isatty v0.0.19 // indirect
github.com/mitchellh/go-homedir v1.1.0 // indirect
@@ -33,17 +33,17 @@ require (
github.com/modern-go/reflect2 v1.0.2 // indirect
github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8 // indirect
github.com/rivo/uniseg v0.4.4 // indirect
- github.com/rogpeppe/go-internal v1.10.1-0.20230524175051-ec119421bb97 // indirect
+ github.com/rogpeppe/go-internal v1.11.0 // indirect
github.com/samber/lo v1.38.1 // indirect
github.com/sergi/go-diff v1.2.0 // indirect
github.com/stretchr/testify v1.8.4 // indirect
github.com/wailsapp/go-webview2 v1.0.9 // indirect
github.com/wailsapp/mimetype v1.4.1 // indirect
- github.com/xanzy/ssh-agent v0.3.0 // indirect
- golang.org/x/crypto v0.9.0 // indirect
+ github.com/xanzy/ssh-agent v0.3.3 // indirect
+ golang.org/x/crypto v0.19.0 // indirect
golang.org/x/exp v0.0.0-20230626212559-97b1e661b5df // indirect
- golang.org/x/net v0.10.0 // indirect
- golang.org/x/sys v0.13.0 // indirect
+ golang.org/x/net v0.19.0 // indirect
+ golang.org/x/sys v0.17.0 // indirect
gopkg.in/warnings.v0 v0.1.2 // indirect
)
diff --git a/v3/examples/server/go.sum b/v3/examples/server/go.sum
index acb39d10195..817d628318a 100644
--- a/v3/examples/server/go.sum
+++ b/v3/examples/server/go.sum
@@ -1,6 +1,8 @@
github.com/Microsoft/go-winio v0.4.14/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA=
github.com/Microsoft/go-winio v0.4.16 h1:FtSW/jqD+l4ba5iPBj9CODVtgfYAD8w2wS923g/cFDk=
github.com/Microsoft/go-winio v0.4.16/go.mod h1:XB6nPKklQyQ7GC9LdcBEcBl8PF76WugXOPRXwdLnMv0=
+github.com/Microsoft/go-winio v0.5.2/go.mod h1:WpS1mjBmmwHBEWmogvA2mj8546UReBk4v8QkMxJ6pZY=
+github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM=
github.com/alcortesm/tgz v0.0.0-20161220082320-9c5fe88206d7 h1:uSoVVbwJiQipAclBbw+8quDsfcvFjOpI5iCf4p/cqCs=
github.com/alcortesm/tgz v0.0.0-20161220082320-9c5fe88206d7/go.mod h1:6zEj6s6u/ghQa61ZWa/C2Aw3RkjiTBOix7dkqa1VLIs=
github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239 h1:kFOfPq6dUM1hTo4JG6LR5AXSUEsOjtdm0kw0FtQtMJA=
@@ -17,19 +19,23 @@ github.com/ebitengine/purego v0.4.0-alpha.4 h1:Y7yIV06Yo5M2BAdD7EVPhfp6LZ0tEcQo5
github.com/ebitengine/purego v0.4.0-alpha.4/go.mod h1:ah1In8AOtksoNK6yk5z1HTJeUkC1Ez4Wk2idgGslMwQ=
github.com/emirpasic/gods v1.12.0 h1:QAUIPSaCu4G+POclxeqb3F+WPpdKqFGlw36+yOzGlrg=
github.com/emirpasic/gods v1.12.0/go.mod h1:YfzfFFoVP/catgzJb4IKIqXjX78Ha8FMSDh3ymbK86o=
+github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ=
github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc=
github.com/gliderlabs/ssh v0.2.2 h1:6zsha5zo/TWhRhwqCD3+EarCAgZ2yN28ipRnGPnwkI0=
github.com/gliderlabs/ssh v0.2.2/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0=
github.com/go-git/gcfg v1.5.0 h1:Q5ViNfGF8zFgyJWPqYwA7qGFoMTEiBmdlkcfRmpIMa4=
github.com/go-git/gcfg v1.5.0/go.mod h1:5m20vg6GwYabIxaOonVkTdrILxQMpEShl1xiMF4ua+E=
+github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376/go.mod h1:an3vInlBmSxCcxctByoQdvwPiA7DTK7jaaFDBTtu0ic=
github.com/go-git/go-billy/v5 v5.0.0/go.mod h1:pmpqyWchKfYfrkb/UVH4otLvyi/5gJlGI4Hb3ZqZ3W0=
github.com/go-git/go-billy/v5 v5.1.0/go.mod h1:pmpqyWchKfYfrkb/UVH4otLvyi/5gJlGI4Hb3ZqZ3W0=
github.com/go-git/go-billy/v5 v5.2.0 h1:GcoouCP9J+5slw2uXAocL70z8ml4A8B/H8nEPt6CLPk=
github.com/go-git/go-billy/v5 v5.2.0/go.mod h1:pmpqyWchKfYfrkb/UVH4otLvyi/5gJlGI4Hb3ZqZ3W0=
+github.com/go-git/go-billy/v5 v5.5.0/go.mod h1:hmexnoNsr2SJU1Ju67OaNz5ASJY3+sHgFRpCtpDCKow=
github.com/go-git/go-git-fixtures/v4 v4.0.2-0.20200613231340-f56387b50c12 h1:PbKy9zOy4aAKrJ5pibIRpVO2BXnK1Tlcg+caKI7Ox5M=
github.com/go-git/go-git-fixtures/v4 v4.0.2-0.20200613231340-f56387b50c12/go.mod h1:m+ICp2rF3jDhFgEZ/8yziagdT1C+ZpZcrJjappBCDSw=
github.com/go-git/go-git/v5 v5.3.0 h1:8WKMtJR2j8RntEXR/uvTKagfEt4GYlwQ7mntE4+0GWc=
github.com/go-git/go-git/v5 v5.3.0/go.mod h1:xdX4bWJ48aOrdhnl2XqHYstHbbp6+LFS4r4X+lNVprw=
+github.com/go-git/go-git/v5 v5.11.0/go.mod h1:6GFcX2P3NM7FPBfpePbpLd21XxsgdAt+lKqXmCUiUCY=
github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY=
github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0=
github.com/godbus/dbus/v5 v5.1.0 h1:4KLkAxT3aOY8Li4FRJe/KvhoNFFxo0m6fNuFUO8QJUk=
@@ -51,6 +57,7 @@ github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnr
github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
github.com/kevinburke/ssh_config v0.0.0-20201106050909-4977a11b4351 h1:DowS9hvgyYSX4TO5NpyC606/Z4SxnNYbT+WX27or6Ck=
github.com/kevinburke/ssh_config v0.0.0-20201106050909-4977a11b4351/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM=
+github.com/kevinburke/ssh_config v1.2.0/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM=
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
@@ -66,6 +73,7 @@ github.com/leaanthony/u v1.1.0 h1:2n0d2BwPVXSUq5yhe8lJPHdxevE2qK5G99PMStMZMaI=
github.com/leaanthony/u v1.1.0/go.mod h1:9+o6hejoRljvZ3BzdYlVL0JYCwtnAsVuN9pVTQcaRfI=
github.com/lmittmann/tint v1.0.0 h1:fzEj70K1L58uyoePQxKe+ezDZJ5pybiWGdA0JeFvvyw=
github.com/lmittmann/tint v1.0.0/go.mod h1:HIS3gSy7qNwGCj+5oRjAutErFBl4BzdQP6cJZ0NfMwE=
+github.com/lmittmann/tint v1.0.3/go.mod h1:HIS3gSy7qNwGCj+5oRjAutErFBl4BzdQP6cJZ0NfMwE=
github.com/matryer/is v1.4.0 h1:sosSmIWwkYITGrxZ25ULNDeKiMNzFSr4V/eqBQP0PeE=
github.com/matryer/is v1.4.0/go.mod h1:8I/i5uYgLzgsgEloJE1U6xx5HkBQpAZvepWuujKwMRU=
github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=
@@ -94,12 +102,14 @@ github.com/rivo/uniseg v0.4.4/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUc
github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=
github.com/rogpeppe/go-internal v1.10.1-0.20230524175051-ec119421bb97 h1:3RPlVWzZ/PDqmVuf/FKHARG5EMid/tl7cv54Sw/QRVY=
github.com/rogpeppe/go-internal v1.10.1-0.20230524175051-ec119421bb97/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA=
+github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA=
github.com/samber/lo v1.38.1 h1:j2XEAqXKb09Am4ebOg31SpvzUTTs6EN3VfgeLUhPdXM=
github.com/samber/lo v1.38.1/go.mod h1:+m/ZKRl6ClXCE2Lgf3MsQlWfh4bn1bz6CXEOxnEXnEA=
github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM=
github.com/sergi/go-diff v1.2.0 h1:XU+rvMAioB0UC3q1MFrIQy4Vo5/4VsRDQQXHsEya6xQ=
github.com/sergi/go-diff v1.2.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM=
github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q=
+github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
@@ -113,31 +123,43 @@ github.com/wailsapp/mimetype v1.4.1 h1:pQN9ycO7uo4vsUUuPeHEYoUkLVkaRntMnHJxVwYhw
github.com/wailsapp/mimetype v1.4.1/go.mod h1:9aV5k31bBOv5z6u+QP8TltzvNGJPmNJD4XlAL3U+j3o=
github.com/xanzy/ssh-agent v0.3.0 h1:wUMzuKtKilRgBAD1sUb8gOwwRr2FGoBVumcjoOACClI=
github.com/xanzy/ssh-agent v0.3.0/go.mod h1:3s9xbODqPuuhK9JV1R321M/FlMZSBvE5aY6eAcqrDh0=
+github.com/xanzy/ssh-agent v0.3.3/go.mod h1:6dzNDKs0J9rVPHPhaGCukekBHKqfl+L3KghI1Bc68Uw=
golang.org/x/crypto v0.0.0-20190219172222-a4c6cb3142f2/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4=
+golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
golang.org/x/crypto v0.9.0 h1:LF6fAI+IutBocDJ2OT0Q1g8plpYljMZ4+lty+dsqw3g=
golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0=
+golang.org/x/crypto v0.16.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4=
+golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU=
golang.org/x/exp v0.0.0-20230626212559-97b1e661b5df h1:UA2aFVmmsIlefxMk29Dp2juaUSth8Pyn3Tq5Y5mJGME=
golang.org/x/exp v0.0.0-20230626212559-97b1e661b5df/go.mod h1:FXUEEKJgO7OQYeo8N01OfiKP8RXMtf6e8aTskBGqWdc=
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
golang.org/x/net v0.0.0-20210326060303-6b1517762897/go.mod h1:uSPa2vr4CLtc/ILN5odXGNXS6mhrKVzTaCXzk9m6W3k=
golang.org/x/net v0.0.0-20210505024714-0287a6fb4125/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
+golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
golang.org/x/net v0.10.0 h1:X2//UzNDwYmtCLn7To6G58Wr6f5ahEAQgKNzv9Y951M=
golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
+golang.org/x/net v0.19.0/go.mod h1:CfAk/cbD4CthTvqiEl8NpboMuiuOYsAr/7NOjZJtv1U=
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200810151505-1b9f1253b3ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210324051608-47abb6519492/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20210616045830-e2b7044e8c71/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE=
golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
+golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/term v0.13.0 h1:bb+I9cTfFazGW51MZqBVmZy7+JEJMouUHTUSKVQLBek=
golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U=
diff --git a/v3/examples/systray/main.go b/v3/examples/systray/main.go
index 592ce58c109..c2853152051 100644
--- a/v3/examples/systray/main.go
+++ b/v3/examples/systray/main.go
@@ -2,7 +2,6 @@ package main
import (
_ "embed"
- "fmt"
"log"
"runtime"
@@ -25,6 +24,7 @@ func main() {
window := app.NewWebviewWindowWithOptions(application.WebviewWindowOptions{
Width: 500,
Height: 800,
+ Name: "Systray Demo Window",
Frameless: true,
AlwaysOnTop: true,
Hidden: true,
@@ -79,7 +79,6 @@ func main() {
radioCallback := func(ctx *application.Context) {
menuItem := ctx.ClickedMenuItem()
menuItem.SetLabel(menuItem.Label() + "!")
- fmt.Println("radioCallback: ")
}
// Radio groups are created implicitly by placing radio items next to each other in a menu
diff --git a/v3/examples/video/go.mod b/v3/examples/video/go.mod
index edfa98f91a3..fed31b83339 100644
--- a/v3/examples/video/go.mod
+++ b/v3/examples/video/go.mod
@@ -1,46 +1,50 @@
module frameless
-go 1.21
+go 1.21.1
-toolchain go1.21.0
+toolchain go1.22.0
require github.com/wailsapp/wails/v3 v3.0.0-alpha.0
require (
- github.com/Microsoft/go-winio v0.4.16 // indirect
+ dario.cat/mergo v1.0.0 // indirect
+ github.com/Microsoft/go-winio v0.6.1 // indirect
+ github.com/ProtonMail/go-crypto v0.0.0-20230828082145-3c4c8a2d2371 // indirect
github.com/bep/debounce v1.2.1 // indirect
+ github.com/cloudflare/circl v1.3.3 // indirect
+ github.com/cyphar/filepath-securejoin v0.2.4 // indirect
github.com/ebitengine/purego v0.4.0-alpha.4 // indirect
- github.com/emirpasic/gods v1.12.0 // indirect
- github.com/go-git/gcfg v1.5.0 // indirect
- github.com/go-git/go-billy/v5 v5.2.0 // indirect
- github.com/go-git/go-git/v5 v5.3.0 // indirect
+ github.com/emirpasic/gods v1.18.1 // indirect
+ github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 // indirect
+ github.com/go-git/go-billy/v5 v5.5.0 // indirect
+ github.com/go-git/go-git/v5 v5.11.0 // indirect
github.com/go-ole/go-ole v1.2.6 // indirect
github.com/godbus/dbus/v5 v5.1.0 // indirect
+ github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect
github.com/google/uuid v1.3.0 // indirect
- github.com/imdario/mergo v0.3.12 // indirect
github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 // indirect
github.com/jchv/go-winloader v0.0.0-20210711035445-715c2860da7e // indirect
- github.com/json-iterator/go v1.1.12 // indirect
- github.com/kevinburke/ssh_config v0.0.0-20201106050909-4977a11b4351 // indirect
+ github.com/kevinburke/ssh_config v1.2.0 // indirect
github.com/leaanthony/go-ansi-parser v1.6.1 // indirect
github.com/leaanthony/u v1.1.0 // indirect
- github.com/lmittmann/tint v1.0.0 // indirect
+ github.com/lmittmann/tint v1.0.3 // indirect
github.com/mattn/go-colorable v0.1.13 // indirect
github.com/mattn/go-isatty v0.0.19 // indirect
- github.com/mitchellh/go-homedir v1.1.0 // indirect
- github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 // indirect
- github.com/modern-go/reflect2 v1.0.2 // indirect
+ github.com/pjbgf/sha1cd v0.3.0 // indirect
github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8 // indirect
github.com/rivo/uniseg v0.4.4 // indirect
github.com/samber/lo v1.38.1 // indirect
github.com/sergi/go-diff v1.2.0 // indirect
+ github.com/skeema/knownhosts v1.2.1 // indirect
github.com/wailsapp/go-webview2 v1.0.9 // indirect
github.com/wailsapp/mimetype v1.4.1 // indirect
- github.com/xanzy/ssh-agent v0.3.0 // indirect
- golang.org/x/crypto v0.9.0 // indirect
+ github.com/xanzy/ssh-agent v0.3.3 // indirect
+ golang.org/x/crypto v0.19.0 // indirect
golang.org/x/exp v0.0.0-20230626212559-97b1e661b5df // indirect
- golang.org/x/net v0.10.0 // indirect
- golang.org/x/sys v0.13.0 // indirect
+ golang.org/x/mod v0.12.0 // indirect
+ golang.org/x/net v0.19.0 // indirect
+ golang.org/x/sys v0.17.0 // indirect
+ golang.org/x/tools v0.13.0 // indirect
gopkg.in/warnings.v0 v0.1.2 // indirect
)
diff --git a/v3/examples/video/go.sum b/v3/examples/video/go.sum
index 169c421b948..476b71ea3bd 100644
--- a/v3/examples/video/go.sum
+++ b/v3/examples/video/go.sum
@@ -1,60 +1,59 @@
-github.com/Microsoft/go-winio v0.4.14/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA=
-github.com/Microsoft/go-winio v0.4.16 h1:FtSW/jqD+l4ba5iPBj9CODVtgfYAD8w2wS923g/cFDk=
-github.com/Microsoft/go-winio v0.4.16/go.mod h1:XB6nPKklQyQ7GC9LdcBEcBl8PF76WugXOPRXwdLnMv0=
-github.com/alcortesm/tgz v0.0.0-20161220082320-9c5fe88206d7 h1:uSoVVbwJiQipAclBbw+8quDsfcvFjOpI5iCf4p/cqCs=
-github.com/alcortesm/tgz v0.0.0-20161220082320-9c5fe88206d7/go.mod h1:6zEj6s6u/ghQa61ZWa/C2Aw3RkjiTBOix7dkqa1VLIs=
-github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239 h1:kFOfPq6dUM1hTo4JG6LR5AXSUEsOjtdm0kw0FtQtMJA=
-github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c=
+dario.cat/mergo v1.0.0 h1:AGCNq9Evsj31mOgNPcLyXc+4PNABt905YmuqPYYpBWk=
+dario.cat/mergo v1.0.0/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk=
+github.com/Microsoft/go-winio v0.5.2/go.mod h1:WpS1mjBmmwHBEWmogvA2mj8546UReBk4v8QkMxJ6pZY=
+github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow=
+github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM=
+github.com/ProtonMail/go-crypto v0.0.0-20230828082145-3c4c8a2d2371 h1:kkhsdkhsCvIsutKu5zLMgWtgh9YxGCNAw8Ad8hjwfYg=
+github.com/ProtonMail/go-crypto v0.0.0-20230828082145-3c4c8a2d2371/go.mod h1:EjAoLdwvbIOoOQr3ihjnSoLZRtE8azugULFRteWMNc0=
+github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be h1:9AeTilPcZAjCFIImctFaOjnTIavg87rW78vTPkQqLI8=
+github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be/go.mod h1:ySMOLuWl6zY27l47sB3qLNK6tF2fkHG55UZxx8oIVo4=
github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio=
github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs=
github.com/bep/debounce v1.2.1 h1:v67fRdBA9UQu2NhLFXrSg0Brw7CexQekrBwDMM8bzeY=
github.com/bep/debounce v1.2.1/go.mod h1:H8yggRPQKLUhUoqrJC1bO2xNya7vanpDl7xR3ISbCJ0=
-github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
+github.com/bwesterb/go-ristretto v1.2.3/go.mod h1:fUIoIZaG73pV5biE2Blr2xEzDoMj7NFEuV9ekS419A0=
+github.com/cloudflare/circl v1.3.3 h1:fE/Qz0QdIGqeWfnwq0RE0R7MI51s0M2E4Ga9kq5AEMs=
+github.com/cloudflare/circl v1.3.3/go.mod h1:5XYMA4rFBvNIrhs50XuiBJ15vF2pZn4nnUKZrLbUZFA=
+github.com/cyphar/filepath-securejoin v0.2.4 h1:Ugdm7cg7i6ZK6x3xDF1oEu1nfkyfH53EtKeQYTC3kyg=
+github.com/cyphar/filepath-securejoin v0.2.4/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
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/ebitengine/purego v0.4.0-alpha.4 h1:Y7yIV06Yo5M2BAdD7EVPhfp6LZ0tEcQo5770OhYUVes=
github.com/ebitengine/purego v0.4.0-alpha.4/go.mod h1:ah1In8AOtksoNK6yk5z1HTJeUkC1Ez4Wk2idgGslMwQ=
-github.com/emirpasic/gods v1.12.0 h1:QAUIPSaCu4G+POclxeqb3F+WPpdKqFGlw36+yOzGlrg=
-github.com/emirpasic/gods v1.12.0/go.mod h1:YfzfFFoVP/catgzJb4IKIqXjX78Ha8FMSDh3ymbK86o=
-github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc=
-github.com/gliderlabs/ssh v0.2.2 h1:6zsha5zo/TWhRhwqCD3+EarCAgZ2yN28ipRnGPnwkI0=
-github.com/gliderlabs/ssh v0.2.2/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0=
-github.com/go-git/gcfg v1.5.0 h1:Q5ViNfGF8zFgyJWPqYwA7qGFoMTEiBmdlkcfRmpIMa4=
-github.com/go-git/gcfg v1.5.0/go.mod h1:5m20vg6GwYabIxaOonVkTdrILxQMpEShl1xiMF4ua+E=
-github.com/go-git/go-billy/v5 v5.0.0/go.mod h1:pmpqyWchKfYfrkb/UVH4otLvyi/5gJlGI4Hb3ZqZ3W0=
-github.com/go-git/go-billy/v5 v5.1.0/go.mod h1:pmpqyWchKfYfrkb/UVH4otLvyi/5gJlGI4Hb3ZqZ3W0=
-github.com/go-git/go-billy/v5 v5.2.0 h1:GcoouCP9J+5slw2uXAocL70z8ml4A8B/H8nEPt6CLPk=
-github.com/go-git/go-billy/v5 v5.2.0/go.mod h1:pmpqyWchKfYfrkb/UVH4otLvyi/5gJlGI4Hb3ZqZ3W0=
-github.com/go-git/go-git-fixtures/v4 v4.0.2-0.20200613231340-f56387b50c12 h1:PbKy9zOy4aAKrJ5pibIRpVO2BXnK1Tlcg+caKI7Ox5M=
-github.com/go-git/go-git-fixtures/v4 v4.0.2-0.20200613231340-f56387b50c12/go.mod h1:m+ICp2rF3jDhFgEZ/8yziagdT1C+ZpZcrJjappBCDSw=
-github.com/go-git/go-git/v5 v5.3.0 h1:8WKMtJR2j8RntEXR/uvTKagfEt4GYlwQ7mntE4+0GWc=
-github.com/go-git/go-git/v5 v5.3.0/go.mod h1:xdX4bWJ48aOrdhnl2XqHYstHbbp6+LFS4r4X+lNVprw=
+github.com/elazarl/goproxy v0.0.0-20230808193330-2592e75ae04a h1:mATvB/9r/3gvcejNsXKSkQ6lcIaNec2nyfOdlTBR2lU=
+github.com/elazarl/goproxy v0.0.0-20230808193330-2592e75ae04a/go.mod h1:Ro8st/ElPeALwNFlcTpWmkr6IoMFfkjXAvTHpevnDsM=
+github.com/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc=
+github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ=
+github.com/gliderlabs/ssh v0.3.5 h1:OcaySEmAQJgyYcArR+gGGTHCyE7nvhEMTlYY+Dp8CpY=
+github.com/gliderlabs/ssh v0.3.5/go.mod h1:8XB4KraRrX39qHhT6yxPsHedjA08I/uBVwj4xC+/+z4=
+github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 h1:+zs/tPmkDkHx3U66DAb0lQFJrpS6731Oaa12ikc+DiI=
+github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376/go.mod h1:an3vInlBmSxCcxctByoQdvwPiA7DTK7jaaFDBTtu0ic=
+github.com/go-git/go-billy/v5 v5.5.0 h1:yEY4yhzCDuMGSv83oGxiBotRzhwhNr8VZyphhiu+mTU=
+github.com/go-git/go-billy/v5 v5.5.0/go.mod h1:hmexnoNsr2SJU1Ju67OaNz5ASJY3+sHgFRpCtpDCKow=
+github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399 h1:eMje31YglSBqCdIqdhKBW8lokaMrL3uTkpGYlE2OOT4=
+github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399/go.mod h1:1OCfN199q1Jm3HZlxleg+Dw/mwps2Wbk9frAWm+4FII=
+github.com/go-git/go-git/v5 v5.11.0 h1:XIZc1p+8YzypNr34itUfSvYJcv+eYdTnTvOZ2vD3cA4=
+github.com/go-git/go-git/v5 v5.11.0/go.mod h1:6GFcX2P3NM7FPBfpePbpLd21XxsgdAt+lKqXmCUiUCY=
github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY=
github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0=
github.com/godbus/dbus/v5 v5.1.0 h1:4KLkAxT3aOY8Li4FRJe/KvhoNFFxo0m6fNuFUO8QJUk=
github.com/godbus/dbus/v5 v5.1.0/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
-github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
-github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=
-github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
-github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
+github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE=
+github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
+github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
+github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I=
github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
-github.com/imdario/mergo v0.3.12 h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU=
-github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA=
github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOlocH6Fxy8MmwDt+yVQYULKfN0RoTN8A=
github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo=
github.com/jchv/go-winloader v0.0.0-20210711035445-715c2860da7e h1:Q3+PugElBCf4PFpxhErSzU3/PY5sFL5Z6rfv4AbGAck=
github.com/jchv/go-winloader v0.0.0-20210711035445-715c2860da7e/go.mod h1:alcuEEnZsY1WQsagKhZDsoPCRoOijYqhZvPwLG0kzVs=
-github.com/jessevdk/go-flags v1.5.0/go.mod h1:Fw0T6WPc1dYxT4mKEZRfG5kJhaTDP9pj1c2EWnYs/m4=
-github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=
-github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
-github.com/kevinburke/ssh_config v0.0.0-20201106050909-4977a11b4351 h1:DowS9hvgyYSX4TO5NpyC606/Z4SxnNYbT+WX27or6Ck=
-github.com/kevinburke/ssh_config v0.0.0-20201106050909-4977a11b4351/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM=
-github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
+github.com/kevinburke/ssh_config v1.2.0 h1:x584FjTGwHzMwvHx18PXxbBVzfnxogHaAReU4gf13a4=
+github.com/kevinburke/ssh_config v1.2.0/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM=
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
-github.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI=
-github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
+github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
+github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
@@ -63,8 +62,8 @@ github.com/leaanthony/go-ansi-parser v1.6.1 h1:xd8bzARK3dErqkPFtoF9F3/HgN8UQk0ed
github.com/leaanthony/go-ansi-parser v1.6.1/go.mod h1:+vva/2y4alzVmmIEpk9QDhA7vLC5zKDTRwfZGOp3IWU=
github.com/leaanthony/u v1.1.0 h1:2n0d2BwPVXSUq5yhe8lJPHdxevE2qK5G99PMStMZMaI=
github.com/leaanthony/u v1.1.0/go.mod h1:9+o6hejoRljvZ3BzdYlVL0JYCwtnAsVuN9pVTQcaRfI=
-github.com/lmittmann/tint v1.0.0 h1:fzEj70K1L58uyoePQxKe+ezDZJ5pybiWGdA0JeFvvyw=
-github.com/lmittmann/tint v1.0.0/go.mod h1:HIS3gSy7qNwGCj+5oRjAutErFBl4BzdQP6cJZ0NfMwE=
+github.com/lmittmann/tint v1.0.3 h1:W5PHeA2D8bBJVvabNfQD/XW9HPLZK1XoPZH0cq8NouQ=
+github.com/lmittmann/tint v1.0.3/go.mod h1:HIS3gSy7qNwGCj+5oRjAutErFBl4BzdQP6cJZ0NfMwE=
github.com/matryer/is v1.4.0 h1:sosSmIWwkYITGrxZ25ULNDeKiMNzFSr4V/eqBQP0PeE=
github.com/matryer/is v1.4.0/go.mod h1:8I/i5uYgLzgsgEloJE1U6xx5HkBQpAZvepWuujKwMRU=
github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=
@@ -72,16 +71,12 @@ github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovk
github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA=
github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
-github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=
-github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
-github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 h1:ZqeYNhU3OHLH3mGKHDcjJRFFRrJa6eAM5H+CtDdOsPc=
-github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
-github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=
-github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=
-github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
+github.com/onsi/gomega v1.27.10 h1:naR28SdDFlqrG6kScpT8VWpu1xWY5nJRCF3XaYyBjhI=
+github.com/onsi/gomega v1.27.10/go.mod h1:RsS8tutOdbdgzbPtzzATp12yT7kM5I5aElG3evPbQ0M=
+github.com/pjbgf/sha1cd v0.3.0 h1:4D5XXmUUBUl/xQ6IjCkEAbqXskkq/4O7LmGn0AqMDs4=
+github.com/pjbgf/sha1cd v0.3.0/go.mod h1:nZ1rrWOcGJ5uZgEEVL1VUM9iRQiZvWdbZjkKyFzPPsI=
github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8 h1:KoWmjvw+nsYOo29YJK9vDA65RGE3NrOnUtO7a+RF9HU=
github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8/go.mod h1:HKlIX3XHQyzLZPlr7++PzdhaXEj94dEiJgZDTsxEqUI=
-github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
@@ -89,66 +84,104 @@ github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZN
github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
github.com/rivo/uniseg v0.4.4 h1:8TfxU8dW6PdqD27gjM8MVNuicgxIjxpm4K7x4jp8sis=
github.com/rivo/uniseg v0.4.4/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88=
+github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M=
+github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA=
github.com/samber/lo v1.38.1 h1:j2XEAqXKb09Am4ebOg31SpvzUTTs6EN3VfgeLUhPdXM=
github.com/samber/lo v1.38.1/go.mod h1:+m/ZKRl6ClXCE2Lgf3MsQlWfh4bn1bz6CXEOxnEXnEA=
-github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM=
github.com/sergi/go-diff v1.2.0 h1:XU+rvMAioB0UC3q1MFrIQy4Vo5/4VsRDQQXHsEya6xQ=
github.com/sergi/go-diff v1.2.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM=
-github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q=
+github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=
+github.com/skeema/knownhosts v1.2.1 h1:SHWdIUa82uGZz+F+47k8SY4QhhI291cXCpopT1lK2AQ=
+github.com/skeema/knownhosts v1.2.1/go.mod h1:xYbVRSPxqBZFrdmDyMmsOs+uX1UZC3nTN3ThzgDxUwo=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
-github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
-github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
-github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk=
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
+github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=
+github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
github.com/wailsapp/go-webview2 v1.0.9 h1:lrU+q0cf1wgLdR69rN+ZnRtMJNaJRrcQ4ELxoO7/xjs=
github.com/wailsapp/go-webview2 v1.0.9/go.mod h1:Uk2BePfCRzttBBjFrBmqKGJd41P6QIHeV9kTgIeOZNo=
github.com/wailsapp/mimetype v1.4.1 h1:pQN9ycO7uo4vsUUuPeHEYoUkLVkaRntMnHJxVwYhwHs=
github.com/wailsapp/mimetype v1.4.1/go.mod h1:9aV5k31bBOv5z6u+QP8TltzvNGJPmNJD4XlAL3U+j3o=
-github.com/xanzy/ssh-agent v0.3.0 h1:wUMzuKtKilRgBAD1sUb8gOwwRr2FGoBVumcjoOACClI=
-github.com/xanzy/ssh-agent v0.3.0/go.mod h1:3s9xbODqPuuhK9JV1R321M/FlMZSBvE5aY6eAcqrDh0=
-golang.org/x/crypto v0.0.0-20190219172222-a4c6cb3142f2/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
-golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4=
-golang.org/x/crypto v0.9.0 h1:LF6fAI+IutBocDJ2OT0Q1g8plpYljMZ4+lty+dsqw3g=
-golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0=
+github.com/xanzy/ssh-agent v0.3.3 h1:+/15pJfg/RsTxqYcX6fHqOXZwwMP+2VyYWJeWM2qQFM=
+github.com/xanzy/ssh-agent v0.3.3/go.mod h1:6dzNDKs0J9rVPHPhaGCukekBHKqfl+L3KghI1Bc68Uw=
+github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
+golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
+golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
+golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
+golang.org/x/crypto v0.3.1-0.20221117191849-2c476679df9a/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4=
+golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU=
+golang.org/x/crypto v0.19.0 h1:ENy+Az/9Y1vSrlrvBSyna3PITt4tiZLf7sgCjZBX7Wo=
+golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU=
golang.org/x/exp v0.0.0-20230626212559-97b1e661b5df h1:UA2aFVmmsIlefxMk29Dp2juaUSth8Pyn3Tq5Y5mJGME=
golang.org/x/exp v0.0.0-20230626212559-97b1e661b5df/go.mod h1:FXUEEKJgO7OQYeo8N01OfiKP8RXMtf6e8aTskBGqWdc=
+golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
+golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
+golang.org/x/mod v0.12.0 h1:rmsUpXtvNzj340zd98LZ4KntptpfRHwpFOHG188oHXc=
+golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
+golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
-golang.org/x/net v0.0.0-20210326060303-6b1517762897/go.mod h1:uSPa2vr4CLtc/ILN5odXGNXS6mhrKVzTaCXzk9m6W3k=
golang.org/x/net v0.0.0-20210505024714-0287a6fb4125/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
-golang.org/x/net v0.10.0 h1:X2//UzNDwYmtCLn7To6G58Wr6f5ahEAQgKNzv9Y951M=
-golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
-golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
-golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
+golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
+golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY=
+golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
+golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc=
+golang.org/x/net v0.19.0 h1:zTwKpTd2XuCqf8huc7Fo2iSy+4RHPd10s4KzeTnVr1c=
+golang.org/x/net v0.19.0/go.mod h1:CfAk/cbD4CthTvqiEl8NpboMuiuOYsAr/7NOjZJtv1U=
+golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.4.0 h1:zxkM55ReGkDlKSM+Fu41A+zmbZuaPVbGMzvvdUPznYQ=
+golang.org/x/sync v0.4.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y=
+golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200810151505-1b9f1253b3ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20210324051608-47abb6519492/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20210616045830-e2b7044e8c71/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE=
-golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.17.0 h1:25cE3gD+tdBA7lp7QfhuV+rJiE9YXTcS3VG1SqssI/Y=
+golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
-golang.org/x/term v0.13.0 h1:bb+I9cTfFazGW51MZqBVmZy7+JEJMouUHTUSKVQLBek=
-golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U=
+golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
+golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc=
+golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
+golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U=
+golang.org/x/term v0.17.0 h1:mkTF7LCd6WGJNL3K1Ad7kwxNfYAW6a8a8QqtMblp/4U=
+golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk=
+golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
-golang.org/x/text v0.9.0 h1:2sjJmO8cDvYveuX97RDLsxlyUxLl+GHoLxBiRdHllBE=
-golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
+golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
+golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
+golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
+golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
+golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ=
+golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
+golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
+golang.org/x/tools v0.13.0 h1:Iey4qkscZuv0VvIt8E0neZjtPVQFSc870HQ448QgEmQ=
+golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58=
+golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
-gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
gopkg.in/warnings.v0 v0.1.2 h1:wFXVbFY8DY5/xOe1ECiWdKCzZlxgshcYVNkBHstARME=
gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI=
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
-gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
-gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
-gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
+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/v3/examples/window/main.go b/v3/examples/window/main.go
index 9c0e390f35d..f427d44946a 100644
--- a/v3/examples/window/main.go
+++ b/v3/examples/window/main.go
@@ -24,7 +24,7 @@ func main() {
ApplicationShouldTerminateAfterLastWindowClosed: false,
},
})
- app.On(events.Mac.ApplicationDidFinishLaunching, func(event *application.Event) {
+ app.On(events.Common.ApplicationStarted, func(event *application.Event) {
log.Println("ApplicationDidFinishLaunching")
})
@@ -154,21 +154,23 @@ func main() {
}).Show()
windowCounter++
})
- myMenu.Add("New WebviewWindow (ignores mouse events").
- SetAccelerator("CmdOrCtrl+F").
- OnClick(func(ctx *application.Context) {
- app.NewWebviewWindowWithOptions(application.WebviewWindowOptions{
- HTML: "",
- X: rand.Intn(1000),
- Y: rand.Intn(800),
- IgnoreMouseEvents: true,
- BackgroundType: application.BackgroundTypeTransparent,
- Mac: application.MacWindow{
- InvisibleTitleBarHeight: 50,
- },
- }).Show()
- windowCounter++
- })
+ if runtime.GOOS != "linux" {
+ myMenu.Add("New WebviewWindow (ignores mouse events)").
+ SetAccelerator("CmdOrCtrl+F").
+ OnClick(func(ctx *application.Context) {
+ app.NewWebviewWindowWithOptions(application.WebviewWindowOptions{
+ HTML: "",
+ X: rand.Intn(1000),
+ Y: rand.Intn(800),
+ IgnoreMouseEvents: true,
+ BackgroundType: application.BackgroundTypeTransparent,
+ Mac: application.MacWindow{
+ InvisibleTitleBarHeight: 50,
+ },
+ }).Show()
+ windowCounter++
+ })
+ }
if runtime.GOOS == "darwin" {
myMenu.Add("New WebviewWindow (MacTitleBarHiddenInset)").
OnClick(func(ctx *application.Context) {
@@ -437,12 +439,19 @@ func main() {
w.SetEnabled(true)
})
})
+ stateMenu.Add("Open Dev Tools").OnClick(func(ctx *application.Context) {
+ currentWindow(func(w *application.WebviewWindow) {
+ w.OpenDevTools()
+ })
+ })
- if runtime.GOOS == "windows" {
- stateMenu.Add("Flash Start").OnClick(func(ctx *application.Context) {
+ if runtime.GOOS != "darwin" {
+ stateMenu.Add("Flash for 5s").OnClick(func(ctx *application.Context) {
currentWindow(func(w *application.WebviewWindow) {
time.Sleep(2 * time.Second)
w.Flash(true)
+ time.Sleep(5 * time.Second)
+ w.Flash(false)
})
})
}
diff --git a/v3/examples/wml/assets/index.html b/v3/examples/wml/assets/index.html
index 1dca07b22bc..bd5c61f8e8d 100644
--- a/v3/examples/wml/assets/index.html
+++ b/v3/examples/wml/assets/index.html
@@ -131,7 +131,7 @@
-
+
Alpha
diff --git a/v3/examples/wml/assets/runtime.debug.js b/v3/examples/wml/assets/runtime.debug.js
deleted file mode 100644
index 101f237755c..00000000000
--- a/v3/examples/wml/assets/runtime.debug.js
+++ /dev/null
@@ -1,963 +0,0 @@
-(() => {
- var __defProp = Object.defineProperty;
- var __export = (target, all) => {
- for (var name in all)
- __defProp(target, name, { get: all[name], enumerable: true });
- };
-
- // desktop/@wailsio/runtime/src/log.js
- function debugLog(message) {
- console.log(
- "%c wails3 %c " + message + " ",
- "background: #aa0000; color: #fff; border-radius: 3px 0px 0px 3px; padding: 1px; font-size: 0.7rem",
- "background: #009900; color: #fff; border-radius: 0px 3px 3px 0px; padding: 1px; font-size: 0.7rem"
- );
- }
-
- // desktop/@wailsio/runtime/src/application.js
- var application_exports = {};
- __export(application_exports, {
- Hide: () => Hide,
- Quit: () => Quit,
- Show: () => Show
- });
-
- // node_modules/nanoid/non-secure/index.js
- var urlAlphabet = "useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict";
- var nanoid = (size2 = 21) => {
- let id = "";
- let i = size2;
- while (i--) {
- id += urlAlphabet[Math.random() * 64 | 0];
- }
- return id;
- };
-
- // desktop/@wailsio/runtime/src/runtime.js
- var runtimeURL = window.location.origin + "/wails/runtime";
- var objectNames = {
- Call: 0,
- Clipboard: 1,
- Application: 2,
- Events: 3,
- ContextMenu: 4,
- Dialog: 5,
- Window: 6,
- Screens: 7,
- System: 8,
- Browser: 9
- };
- var clientId = nanoid();
- function newRuntimeCallerWithID(object, windowName) {
- return function(method, args = null) {
- return runtimeCallWithID(object, method, windowName, args);
- };
- }
- function runtimeCallWithID(objectID, method, windowName, args) {
- let url = new URL(runtimeURL);
- url.searchParams.append("object", objectID);
- url.searchParams.append("method", method);
- let fetchOptions = {
- headers: {}
- };
- if (windowName) {
- fetchOptions.headers["x-wails-window-name"] = windowName;
- }
- if (args) {
- url.searchParams.append("args", JSON.stringify(args));
- }
- fetchOptions.headers["x-wails-client-id"] = clientId;
- return new Promise((resolve, reject) => {
- fetch(url, fetchOptions).then((response) => {
- if (response.ok) {
- if (response.headers.get("Content-Type") && response.headers.get("Content-Type").indexOf("application/json") !== -1) {
- return response.json();
- } else {
- return response.text();
- }
- }
- reject(Error(response.statusText));
- }).then((data) => resolve(data)).catch((error) => reject(error));
- });
- }
-
- // desktop/@wailsio/runtime/src/application.js
- var call = newRuntimeCallerWithID(objectNames.Application, "");
- var HideMethod = 0;
- var ShowMethod = 1;
- var QuitMethod = 2;
- function Hide() {
- return call(HideMethod);
- }
- function Show() {
- return call(ShowMethod);
- }
- function Quit() {
- return call(QuitMethod);
- }
-
- // desktop/@wailsio/runtime/src/browser.js
- var browser_exports = {};
- __export(browser_exports, {
- OpenURL: () => OpenURL
- });
- var call2 = newRuntimeCallerWithID(objectNames.Browser, "");
- var BrowserOpenURL = 0;
- function OpenURL(url) {
- return call2(BrowserOpenURL, { url });
- }
-
- // desktop/@wailsio/runtime/src/clipboard.js
- var clipboard_exports = {};
- __export(clipboard_exports, {
- SetText: () => SetText,
- Text: () => Text
- });
- var call3 = newRuntimeCallerWithID(objectNames.Clipboard, "");
- var ClipboardSetText = 0;
- var ClipboardText = 1;
- function SetText(text) {
- return call3(ClipboardSetText, { text });
- }
- function Text() {
- return call3(ClipboardText);
- }
-
- // desktop/@wailsio/runtime/src/flags.js
- var flags_exports = {};
- __export(flags_exports, {
- GetFlag: () => GetFlag
- });
- function GetFlag(keyString) {
- try {
- return window._wails.flags[keyString];
- } catch (e) {
- throw new Error("Unable to retrieve flag '" + keyString + "': " + e);
- }
- }
-
- // desktop/@wailsio/runtime/src/screens.js
- var screens_exports = {};
- __export(screens_exports, {
- GetAll: () => GetAll,
- GetCurrent: () => GetCurrent,
- GetPrimary: () => GetPrimary
- });
- var call4 = newRuntimeCallerWithID(objectNames.Screens, "");
- var getAll = 0;
- var getPrimary = 1;
- var getCurrent = 2;
- function GetAll() {
- return call4(getAll);
- }
- function GetPrimary() {
- return call4(getPrimary);
- }
- function GetCurrent() {
- return call4(getCurrent);
- }
-
- // desktop/@wailsio/runtime/src/system.js
- var system_exports = {};
- __export(system_exports, {
- Capabilities: () => Capabilities,
- Environment: () => Environment,
- IsAMD64: () => IsAMD64,
- IsARM: () => IsARM,
- IsARM64: () => IsARM64,
- IsDarkMode: () => IsDarkMode,
- IsDebug: () => IsDebug,
- IsLinux: () => IsLinux,
- IsMac: () => IsMac,
- IsWindows: () => IsWindows,
- invoke: () => invoke
- });
- var call5 = newRuntimeCallerWithID(objectNames.System, "");
- var systemIsDarkMode = 0;
- var environment = 1;
- function invoke(msg) {
- if (window.chrome) {
- return window.chrome.webview.postMessage(msg);
- }
- return window.webkit.messageHandlers.external.postMessage;
- }
- function IsDarkMode() {
- return call5(systemIsDarkMode);
- }
- function Capabilities() {
- let response = fetch("/wails/capabilities");
- return response.json();
- }
- function Environment() {
- return call5(environment);
- }
- function IsWindows() {
- return window._wails.environment.OS === "windows";
- }
- function IsLinux() {
- return window._wails.environment.OS === "linux";
- }
- function IsMac() {
- return window._wails.environment.OS === "darwin";
- }
- function IsAMD64() {
- return window._wails.environment.Arch === "amd64";
- }
- function IsARM() {
- return window._wails.environment.Arch === "arm";
- }
- function IsARM64() {
- return window._wails.environment.Arch === "arm64";
- }
- function IsDebug() {
- return window._wails.environment.Debug === true;
- }
-
- // desktop/@wailsio/runtime/src/window.js
- var window_exports = {};
- __export(window_exports, {
- Center: () => Center,
- Close: () => Close,
- Fullscreen: () => Fullscreen,
- Get: () => Get,
- GetZoomLevel: () => GetZoomLevel,
- Height: () => Height,
- Hide: () => Hide2,
- Maximise: () => Maximise,
- Minimise: () => Minimise,
- RelativePosition: () => RelativePosition,
- Restore: () => Restore,
- Screen: () => Screen,
- SetAlwaysOnTop: () => SetAlwaysOnTop,
- SetBackgroundColour: () => SetBackgroundColour,
- SetMaxSize: () => SetMaxSize,
- SetMinSize: () => SetMinSize,
- SetRelativePosition: () => SetRelativePosition,
- SetResizable: () => SetResizable,
- SetSize: () => SetSize,
- SetTitle: () => SetTitle,
- SetZoomLevel: () => SetZoomLevel,
- Show: () => Show2,
- Size: () => Size,
- ToggleMaximise: () => ToggleMaximise,
- UnMaximise: () => UnMaximise,
- UnMinimise: () => UnMinimise,
- Width: () => Width,
- ZoomIn: () => ZoomIn,
- ZoomOut: () => ZoomOut,
- ZoomReset: () => ZoomReset
- });
- var center = 0;
- var setTitle = 1;
- var fullscreen = 2;
- var unFullscreen = 3;
- var setSize = 4;
- var size = 5;
- var setMaxSize = 6;
- var setMinSize = 7;
- var setAlwaysOnTop = 8;
- var setRelativePosition = 9;
- var relativePosition = 10;
- var screen = 11;
- var hide = 12;
- var maximise = 13;
- var unMaximise = 14;
- var toggleMaximise = 15;
- var minimise = 16;
- var unMinimise = 17;
- var restore = 18;
- var show = 19;
- var close = 20;
- var setBackgroundColour = 21;
- var setResizable = 22;
- var width = 23;
- var height = 24;
- var zoomIn = 25;
- var zoomOut = 26;
- var zoomReset = 27;
- var getZoomLevel = 28;
- var setZoomLevel = 29;
- var thisWindow = Get("");
- function createWindow(call9) {
- return {
- Get: (windowName) => createWindow(newRuntimeCallerWithID(objectNames.Window, windowName)),
- Center: () => call9(center),
- SetTitle: (title) => call9(setTitle, { title }),
- Fullscreen: () => call9(fullscreen),
- UnFullscreen: () => call9(unFullscreen),
- SetSize: (width2, height2) => call9(setSize, { width: width2, height: height2 }),
- Size: () => call9(size),
- SetMaxSize: (width2, height2) => call9(setMaxSize, { width: width2, height: height2 }),
- SetMinSize: (width2, height2) => call9(setMinSize, { width: width2, height: height2 }),
- SetAlwaysOnTop: (onTop) => call9(setAlwaysOnTop, { alwaysOnTop: onTop }),
- SetRelativePosition: (x, y) => call9(setRelativePosition, { x, y }),
- RelativePosition: () => call9(relativePosition),
- Screen: () => call9(screen),
- Hide: () => call9(hide),
- Maximise: () => call9(maximise),
- UnMaximise: () => call9(unMaximise),
- ToggleMaximise: () => call9(toggleMaximise),
- Minimise: () => call9(minimise),
- UnMinimise: () => call9(unMinimise),
- Restore: () => call9(restore),
- Show: () => call9(show),
- Close: () => call9(close),
- SetBackgroundColour: (r, g, b, a) => call9(setBackgroundColour, { r, g, b, a }),
- SetResizable: (resizable) => call9(setResizable, { resizable }),
- Width: () => call9(width),
- Height: () => call9(height),
- ZoomIn: () => call9(zoomIn),
- ZoomOut: () => call9(zoomOut),
- ZoomReset: () => call9(zoomReset),
- GetZoomLevel: () => call9(getZoomLevel),
- SetZoomLevel: (zoomLevel) => call9(setZoomLevel, { zoomLevel })
- };
- }
- function Get(windowName) {
- return createWindow(newRuntimeCallerWithID(objectNames.Window, windowName));
- }
- function Center() {
- thisWindow.Center();
- }
- function SetTitle(title) {
- thisWindow.SetTitle(title);
- }
- function Fullscreen() {
- thisWindow.Fullscreen();
- }
- function SetSize(width2, height2) {
- thisWindow.SetSize(width2, height2);
- }
- function Size() {
- return thisWindow.Size();
- }
- function SetMaxSize(width2, height2) {
- thisWindow.SetMaxSize(width2, height2);
- }
- function SetMinSize(width2, height2) {
- thisWindow.SetMinSize(width2, height2);
- }
- function SetAlwaysOnTop(onTop) {
- thisWindow.SetAlwaysOnTop(onTop);
- }
- function SetRelativePosition(x, y) {
- thisWindow.SetRelativePosition(x, y);
- }
- function RelativePosition() {
- return thisWindow.RelativePosition();
- }
- function Screen() {
- return thisWindow.Screen();
- }
- function Hide2() {
- thisWindow.Hide();
- }
- function Maximise() {
- thisWindow.Maximise();
- }
- function UnMaximise() {
- thisWindow.UnMaximise();
- }
- function ToggleMaximise() {
- thisWindow.ToggleMaximise();
- }
- function Minimise() {
- thisWindow.Minimise();
- }
- function UnMinimise() {
- thisWindow.UnMinimise();
- }
- function Restore() {
- thisWindow.Restore();
- }
- function Show2() {
- thisWindow.Show();
- }
- function Close() {
- thisWindow.Close();
- }
- function SetBackgroundColour(r, g, b, a) {
- thisWindow.SetBackgroundColour(r, g, b, a);
- }
- function SetResizable(resizable) {
- thisWindow.SetResizable(resizable);
- }
- function Width() {
- return thisWindow.Width();
- }
- function Height() {
- return thisWindow.Height();
- }
- function ZoomIn() {
- thisWindow.ZoomIn();
- }
- function ZoomOut() {
- thisWindow.ZoomOut();
- }
- function ZoomReset() {
- thisWindow.ZoomReset();
- }
- function GetZoomLevel() {
- return thisWindow.GetZoomLevel();
- }
- function SetZoomLevel(zoomLevel) {
- thisWindow.SetZoomLevel(zoomLevel);
- }
-
- // desktop/@wailsio/runtime/src/wml.js
- var wml_exports = {};
- __export(wml_exports, {
- Reload: () => Reload
- });
-
- // desktop/@wailsio/runtime/src/events.js
- var events_exports = {};
- __export(events_exports, {
- Emit: () => Emit,
- Off: () => Off,
- OffAll: () => OffAll,
- On: () => On,
- OnMultiple: () => OnMultiple,
- Once: () => Once,
- Types: () => Types,
- WailsEvent: () => WailsEvent,
- setup: () => setup
- });
-
- // desktop/@wailsio/runtime/src/event_types.js
- var EventTypes = {
- Windows: {
- SystemThemeChanged: "windows:SystemThemeChanged",
- APMPowerStatusChange: "windows:APMPowerStatusChange",
- APMSuspend: "windows:APMSuspend",
- APMResumeAutomatic: "windows:APMResumeAutomatic",
- APMResumeSuspend: "windows:APMResumeSuspend",
- APMPowerSettingChange: "windows:APMPowerSettingChange",
- ApplicationStarted: "windows:ApplicationStarted",
- WebViewNavigationCompleted: "windows:WebViewNavigationCompleted",
- WindowInactive: "windows:WindowInactive",
- WindowActive: "windows:WindowActive",
- WindowClickActive: "windows:WindowClickActive",
- WindowMaximise: "windows:WindowMaximise",
- WindowUnMaximise: "windows:WindowUnMaximise",
- WindowFullscreen: "windows:WindowFullscreen",
- WindowUnFullscreen: "windows:WindowUnFullscreen",
- WindowRestore: "windows:WindowRestore",
- WindowMinimise: "windows:WindowMinimise",
- WindowUnMinimise: "windows:WindowUnMinimise",
- WindowClose: "windows:WindowClose",
- WindowSetFocus: "windows:WindowSetFocus",
- WindowKillFocus: "windows:WindowKillFocus",
- WindowDragDrop: "windows:WindowDragDrop",
- WindowDragEnter: "windows:WindowDragEnter",
- WindowDragLeave: "windows:WindowDragLeave",
- WindowDragOver: "windows:WindowDragOver"
- },
- Mac: {
- ApplicationDidBecomeActive: "mac:ApplicationDidBecomeActive",
- ApplicationDidChangeBackingProperties: "mac:ApplicationDidChangeBackingProperties",
- ApplicationDidChangeEffectiveAppearance: "mac:ApplicationDidChangeEffectiveAppearance",
- ApplicationDidChangeIcon: "mac:ApplicationDidChangeIcon",
- ApplicationDidChangeOcclusionState: "mac:ApplicationDidChangeOcclusionState",
- ApplicationDidChangeScreenParameters: "mac:ApplicationDidChangeScreenParameters",
- ApplicationDidChangeStatusBarFrame: "mac:ApplicationDidChangeStatusBarFrame",
- ApplicationDidChangeStatusBarOrientation: "mac:ApplicationDidChangeStatusBarOrientation",
- ApplicationDidFinishLaunching: "mac:ApplicationDidFinishLaunching",
- ApplicationDidHide: "mac:ApplicationDidHide",
- ApplicationDidResignActiveNotification: "mac:ApplicationDidResignActiveNotification",
- ApplicationDidUnhide: "mac:ApplicationDidUnhide",
- ApplicationDidUpdate: "mac:ApplicationDidUpdate",
- ApplicationWillBecomeActive: "mac:ApplicationWillBecomeActive",
- ApplicationWillFinishLaunching: "mac:ApplicationWillFinishLaunching",
- ApplicationWillHide: "mac:ApplicationWillHide",
- ApplicationWillResignActive: "mac:ApplicationWillResignActive",
- ApplicationWillTerminate: "mac:ApplicationWillTerminate",
- ApplicationWillUnhide: "mac:ApplicationWillUnhide",
- ApplicationWillUpdate: "mac:ApplicationWillUpdate",
- ApplicationDidChangeTheme: "mac:ApplicationDidChangeTheme!",
- ApplicationShouldHandleReopen: "mac:ApplicationShouldHandleReopen!",
- WindowDidBecomeKey: "mac:WindowDidBecomeKey",
- WindowDidBecomeMain: "mac:WindowDidBecomeMain",
- WindowDidBeginSheet: "mac:WindowDidBeginSheet",
- WindowDidChangeAlpha: "mac:WindowDidChangeAlpha",
- WindowDidChangeBackingLocation: "mac:WindowDidChangeBackingLocation",
- WindowDidChangeBackingProperties: "mac:WindowDidChangeBackingProperties",
- WindowDidChangeCollectionBehavior: "mac:WindowDidChangeCollectionBehavior",
- WindowDidChangeEffectiveAppearance: "mac:WindowDidChangeEffectiveAppearance",
- WindowDidChangeOcclusionState: "mac:WindowDidChangeOcclusionState",
- WindowDidChangeOrderingMode: "mac:WindowDidChangeOrderingMode",
- WindowDidChangeScreen: "mac:WindowDidChangeScreen",
- WindowDidChangeScreenParameters: "mac:WindowDidChangeScreenParameters",
- WindowDidChangeScreenProfile: "mac:WindowDidChangeScreenProfile",
- WindowDidChangeScreenSpace: "mac:WindowDidChangeScreenSpace",
- WindowDidChangeScreenSpaceProperties: "mac:WindowDidChangeScreenSpaceProperties",
- WindowDidChangeSharingType: "mac:WindowDidChangeSharingType",
- WindowDidChangeSpace: "mac:WindowDidChangeSpace",
- WindowDidChangeSpaceOrderingMode: "mac:WindowDidChangeSpaceOrderingMode",
- WindowDidChangeTitle: "mac:WindowDidChangeTitle",
- WindowDidChangeToolbar: "mac:WindowDidChangeToolbar",
- WindowDidChangeVisibility: "mac:WindowDidChangeVisibility",
- WindowDidDeminiaturize: "mac:WindowDidDeminiaturize",
- WindowDidEndSheet: "mac:WindowDidEndSheet",
- WindowDidEnterFullScreen: "mac:WindowDidEnterFullScreen",
- WindowDidEnterVersionBrowser: "mac:WindowDidEnterVersionBrowser",
- WindowDidExitFullScreen: "mac:WindowDidExitFullScreen",
- WindowDidExitVersionBrowser: "mac:WindowDidExitVersionBrowser",
- WindowDidExpose: "mac:WindowDidExpose",
- WindowDidFocus: "mac:WindowDidFocus",
- WindowDidMiniaturize: "mac:WindowDidMiniaturize",
- WindowDidMove: "mac:WindowDidMove",
- WindowDidOrderOffScreen: "mac:WindowDidOrderOffScreen",
- WindowDidOrderOnScreen: "mac:WindowDidOrderOnScreen",
- WindowDidResignKey: "mac:WindowDidResignKey",
- WindowDidResignMain: "mac:WindowDidResignMain",
- WindowDidResize: "mac:WindowDidResize",
- WindowDidUpdate: "mac:WindowDidUpdate",
- WindowDidUpdateAlpha: "mac:WindowDidUpdateAlpha",
- WindowDidUpdateCollectionBehavior: "mac:WindowDidUpdateCollectionBehavior",
- WindowDidUpdateCollectionProperties: "mac:WindowDidUpdateCollectionProperties",
- WindowDidUpdateShadow: "mac:WindowDidUpdateShadow",
- WindowDidUpdateTitle: "mac:WindowDidUpdateTitle",
- WindowDidUpdateToolbar: "mac:WindowDidUpdateToolbar",
- WindowDidUpdateVisibility: "mac:WindowDidUpdateVisibility",
- WindowShouldClose: "mac:WindowShouldClose!",
- WindowWillBecomeKey: "mac:WindowWillBecomeKey",
- WindowWillBecomeMain: "mac:WindowWillBecomeMain",
- WindowWillBeginSheet: "mac:WindowWillBeginSheet",
- WindowWillChangeOrderingMode: "mac:WindowWillChangeOrderingMode",
- WindowWillClose: "mac:WindowWillClose",
- WindowWillDeminiaturize: "mac:WindowWillDeminiaturize",
- WindowWillEnterFullScreen: "mac:WindowWillEnterFullScreen",
- WindowWillEnterVersionBrowser: "mac:WindowWillEnterVersionBrowser",
- WindowWillExitFullScreen: "mac:WindowWillExitFullScreen",
- WindowWillExitVersionBrowser: "mac:WindowWillExitVersionBrowser",
- WindowWillFocus: "mac:WindowWillFocus",
- WindowWillMiniaturize: "mac:WindowWillMiniaturize",
- WindowWillMove: "mac:WindowWillMove",
- WindowWillOrderOffScreen: "mac:WindowWillOrderOffScreen",
- WindowWillOrderOnScreen: "mac:WindowWillOrderOnScreen",
- WindowWillResignMain: "mac:WindowWillResignMain",
- WindowWillResize: "mac:WindowWillResize",
- WindowWillUnfocus: "mac:WindowWillUnfocus",
- WindowWillUpdate: "mac:WindowWillUpdate",
- WindowWillUpdateAlpha: "mac:WindowWillUpdateAlpha",
- WindowWillUpdateCollectionBehavior: "mac:WindowWillUpdateCollectionBehavior",
- WindowWillUpdateCollectionProperties: "mac:WindowWillUpdateCollectionProperties",
- WindowWillUpdateShadow: "mac:WindowWillUpdateShadow",
- WindowWillUpdateTitle: "mac:WindowWillUpdateTitle",
- WindowWillUpdateToolbar: "mac:WindowWillUpdateToolbar",
- WindowWillUpdateVisibility: "mac:WindowWillUpdateVisibility",
- WindowWillUseStandardFrame: "mac:WindowWillUseStandardFrame",
- MenuWillOpen: "mac:MenuWillOpen",
- MenuDidOpen: "mac:MenuDidOpen",
- MenuDidClose: "mac:MenuDidClose",
- MenuWillSendAction: "mac:MenuWillSendAction",
- MenuDidSendAction: "mac:MenuDidSendAction",
- MenuWillHighlightItem: "mac:MenuWillHighlightItem",
- MenuDidHighlightItem: "mac:MenuDidHighlightItem",
- MenuWillDisplayItem: "mac:MenuWillDisplayItem",
- MenuDidDisplayItem: "mac:MenuDidDisplayItem",
- MenuWillAddItem: "mac:MenuWillAddItem",
- MenuDidAddItem: "mac:MenuDidAddItem",
- MenuWillRemoveItem: "mac:MenuWillRemoveItem",
- MenuDidRemoveItem: "mac:MenuDidRemoveItem",
- MenuWillBeginTracking: "mac:MenuWillBeginTracking",
- MenuDidBeginTracking: "mac:MenuDidBeginTracking",
- MenuWillEndTracking: "mac:MenuWillEndTracking",
- MenuDidEndTracking: "mac:MenuDidEndTracking",
- MenuWillUpdate: "mac:MenuWillUpdate",
- MenuDidUpdate: "mac:MenuDidUpdate",
- MenuWillPopUp: "mac:MenuWillPopUp",
- MenuDidPopUp: "mac:MenuDidPopUp",
- MenuWillSendActionToItem: "mac:MenuWillSendActionToItem",
- MenuDidSendActionToItem: "mac:MenuDidSendActionToItem",
- WebViewDidStartProvisionalNavigation: "mac:WebViewDidStartProvisionalNavigation",
- WebViewDidReceiveServerRedirectForProvisionalNavigation: "mac:WebViewDidReceiveServerRedirectForProvisionalNavigation",
- WebViewDidFinishNavigation: "mac:WebViewDidFinishNavigation",
- WebViewDidCommitNavigation: "mac:WebViewDidCommitNavigation",
- WindowFileDraggingEntered: "mac:WindowFileDraggingEntered",
- WindowFileDraggingPerformed: "mac:WindowFileDraggingPerformed",
- WindowFileDraggingExited: "mac:WindowFileDraggingExited"
- },
- Linux: {
- SystemThemeChanged: "linux:SystemThemeChanged"
- },
- Common: {
- ApplicationStarted: "common:ApplicationStarted",
- WindowMaximise: "common:WindowMaximise",
- WindowUnMaximise: "common:WindowUnMaximise",
- WindowFullscreen: "common:WindowFullscreen",
- WindowUnFullscreen: "common:WindowUnFullscreen",
- WindowRestore: "common:WindowRestore",
- WindowMinimise: "common:WindowMinimise",
- WindowUnMinimise: "common:WindowUnMinimise",
- WindowClosing: "common:WindowClosing",
- WindowZoom: "common:WindowZoom",
- WindowZoomIn: "common:WindowZoomIn",
- WindowZoomOut: "common:WindowZoomOut",
- WindowZoomReset: "common:WindowZoomReset",
- WindowFocus: "common:WindowFocus",
- WindowLostFocus: "common:WindowLostFocus",
- WindowShow: "common:WindowShow",
- WindowHide: "common:WindowHide",
- WindowDPIChanged: "common:WindowDPIChanged",
- WindowFilesDropped: "common:WindowFilesDropped",
- WindowRuntimeReady: "common:WindowRuntimeReady",
- ThemeChanged: "common:ThemeChanged"
- }
- };
-
- // desktop/@wailsio/runtime/src/events.js
- var Types = EventTypes;
- window._wails = window._wails || {};
- window._wails.dispatchWailsEvent = dispatchWailsEvent;
- var call6 = newRuntimeCallerWithID(objectNames.Events, "");
- var EmitMethod = 0;
- var eventListeners = /* @__PURE__ */ new Map();
- var Listener = class {
- constructor(eventName, callback, maxCallbacks) {
- this.eventName = eventName;
- this.maxCallbacks = maxCallbacks || -1;
- this.Callback = (data) => {
- callback(data);
- if (this.maxCallbacks === -1)
- return false;
- this.maxCallbacks -= 1;
- return this.maxCallbacks === 0;
- };
- }
- };
- var WailsEvent = class {
- constructor(name, data = null) {
- this.name = name;
- this.data = data;
- }
- };
- function setup() {
- }
- function dispatchWailsEvent(event) {
- let listeners = eventListeners.get(event.name);
- if (listeners) {
- let toRemove = listeners.filter((listener) => {
- let remove = listener.Callback(event);
- if (remove)
- return true;
- });
- if (toRemove.length > 0) {
- listeners = listeners.filter((l) => !toRemove.includes(l));
- if (listeners.length === 0)
- eventListeners.delete(event.name);
- else
- eventListeners.set(event.name, listeners);
- }
- }
- }
- function OnMultiple(eventName, callback, maxCallbacks) {
- let listeners = eventListeners.get(eventName) || [];
- const thisListener = new Listener(eventName, callback, maxCallbacks);
- listeners.push(thisListener);
- eventListeners.set(eventName, listeners);
- return () => listenerOff(thisListener);
- }
- function On(eventName, callback) {
- return OnMultiple(eventName, callback, -1);
- }
- function Once(eventName, callback) {
- return OnMultiple(eventName, callback, 1);
- }
- function listenerOff(listener) {
- const eventName = listener.eventName;
- let listeners = eventListeners.get(eventName).filter((l) => l !== listener);
- if (listeners.length === 0)
- eventListeners.delete(eventName);
- else
- eventListeners.set(eventName, listeners);
- }
- function Off(eventName, ...additionalEventNames) {
- let eventsToRemove = [eventName, ...additionalEventNames];
- eventsToRemove.forEach((eventName2) => eventListeners.delete(eventName2));
- }
- function OffAll() {
- eventListeners.clear();
- }
- function Emit(event) {
- return call6(EmitMethod, event);
- }
-
- // desktop/@wailsio/runtime/src/dialogs.js
- var dialogs_exports = {};
- __export(dialogs_exports, {
- Error: () => Error2,
- Info: () => Info,
- OpenFile: () => OpenFile,
- Question: () => Question,
- SaveFile: () => SaveFile,
- Warning: () => Warning
- });
- window._wails = window._wails || {};
- window._wails.dialogErrorCallback = dialogErrorCallback;
- window._wails.dialogResultCallback = dialogResultCallback;
- var DialogInfo = 0;
- var DialogWarning = 1;
- var DialogError = 2;
- var DialogQuestion = 3;
- var DialogOpenFile = 4;
- var DialogSaveFile = 5;
- var call7 = newRuntimeCallerWithID(objectNames.Dialog, "");
- var dialogResponses = /* @__PURE__ */ new Map();
- function generateID() {
- let result;
- do {
- result = nanoid();
- } while (dialogResponses.has(result));
- return result;
- }
- function dialog(type, options = {}) {
- const id = generateID();
- options["dialog-id"] = id;
- return new Promise((resolve, reject) => {
- dialogResponses.set(id, { resolve, reject });
- call7(type, options).catch((error) => {
- reject(error);
- dialogResponses.delete(id);
- });
- });
- }
- function dialogResultCallback(id, data, isJSON) {
- let p = dialogResponses.get(id);
- if (p) {
- if (isJSON) {
- p.resolve(JSON.parse(data));
- } else {
- p.resolve(data);
- }
- dialogResponses.delete(id);
- }
- }
- function dialogErrorCallback(id, message) {
- let p = dialogResponses.get(id);
- if (p) {
- p.reject(message);
- dialogResponses.delete(id);
- }
- }
- var Info = (options) => dialog(DialogInfo, options);
- var Warning = (options) => dialog(DialogWarning, options);
- var Error2 = (options) => dialog(DialogError, options);
- var Question = (options) => dialog(DialogQuestion, options);
- var OpenFile = (options) => dialog(DialogOpenFile, options);
- var SaveFile = (options) => dialog(DialogSaveFile, options);
-
- // desktop/@wailsio/runtime/src/wml.js
- function sendEvent(eventName, data = null) {
- let event = new WailsEvent(eventName, data);
- Emit(event);
- }
- function addWMLEventListeners() {
- const elements = document.querySelectorAll("[wml-event]");
- elements.forEach(function(element) {
- const eventType = element.getAttribute("wml-event");
- const confirm = element.getAttribute("wml-confirm");
- const trigger = element.getAttribute("wml-trigger") || "click";
- let callback = function() {
- if (confirm) {
- Question({ Title: "Confirm", Message: confirm, Detached: false, Buttons: [{ Label: "Yes" }, { Label: "No", IsDefault: true }] }).then(function(result) {
- if (result !== "No") {
- sendEvent(eventType);
- }
- });
- return;
- }
- sendEvent(eventType);
- };
- element.removeEventListener(trigger, callback);
- element.addEventListener(trigger, callback);
- });
- }
- function callWindowMethod(windowName, method) {
- let targetWindow = Get(windowName);
- let methodMap = WindowMethods(targetWindow);
- if (!methodMap.has(method)) {
- console.log("Window method " + method + " not found");
- }
- try {
- methodMap.get(method)();
- } catch (e) {
- console.error("Error calling window method '" + method + "': " + e);
- }
- }
- function addWMLWindowListeners() {
- const elements = document.querySelectorAll("[wml-window]");
- elements.forEach(function(element) {
- const windowMethod = element.getAttribute("wml-window");
- const confirm = element.getAttribute("wml-confirm");
- const trigger = element.getAttribute("wml-trigger") || "click";
- const targetWindow = element.getAttribute("wml-target-window") || "";
- let callback = function() {
- if (confirm) {
- Question({ Title: "Confirm", Message: confirm, Buttons: [{ Label: "Yes" }, { Label: "No", IsDefault: true }] }).then(function(result) {
- if (result !== "No") {
- callWindowMethod(targetWindow, windowMethod);
- }
- });
- return;
- }
- callWindowMethod(targetWindow, windowMethod);
- };
- element.removeEventListener(trigger, callback);
- element.addEventListener(trigger, callback);
- });
- }
- function addWMLOpenBrowserListener() {
- const elements = document.querySelectorAll("[wml-openurl]");
- elements.forEach(function(element) {
- const url = element.getAttribute("wml-openurl");
- const confirm = element.getAttribute("wml-confirm");
- const trigger = element.getAttribute("wml-trigger") || "click";
- let callback = function() {
- if (confirm) {
- Question({ Title: "Confirm", Message: confirm, Buttons: [{ Label: "Yes" }, { Label: "No", IsDefault: true }] }).then(function(result) {
- if (result !== "No") {
- void OpenURL(url);
- }
- });
- return;
- }
- void OpenURL(url);
- };
- element.removeEventListener(trigger, callback);
- element.addEventListener(trigger, callback);
- });
- }
- function Reload() {
- if (true) {
- debugLog("Reloading WML");
- }
- addWMLEventListeners();
- addWMLWindowListeners();
- addWMLOpenBrowserListener();
- }
- function WindowMethods(targetWindow) {
- let result = /* @__PURE__ */ new Map();
- for (let method in targetWindow) {
- if (typeof targetWindow[method] === "function") {
- result.set(method, targetWindow[method]);
- }
- }
- return result;
- }
-
- // desktop/@wailsio/runtime/src/calls.js
- var calls_exports = {};
- __export(calls_exports, {
- ByID: () => ByID,
- ByName: () => ByName,
- Call: () => Call,
- Plugin: () => Plugin
- });
- window._wails = window._wails || {};
- window._wails.callResultHandler = resultHandler;
- window._wails.callErrorHandler = errorHandler;
- var CallBinding = 0;
- var call8 = newRuntimeCallerWithID(objectNames.Call, "");
- var callResponses = /* @__PURE__ */ new Map();
- function generateID2() {
- let result;
- do {
- result = nanoid();
- } while (callResponses.has(result));
- return result;
- }
- function resultHandler(id, data, isJSON) {
- const promiseHandler = getAndDeleteResponse(id);
- if (promiseHandler) {
- promiseHandler.resolve(isJSON ? JSON.parse(data) : data);
- }
- }
- function errorHandler(id, message) {
- const promiseHandler = getAndDeleteResponse(id);
- if (promiseHandler) {
- promiseHandler.reject(message);
- }
- }
- function getAndDeleteResponse(id) {
- const response = callResponses.get(id);
- callResponses.delete(id);
- return response;
- }
- function callBinding(type, options = {}) {
- return new Promise((resolve, reject) => {
- const id = generateID2();
- options["call-id"] = id;
- callResponses.set(id, { resolve, reject });
- call8(type, options).catch((error) => {
- reject(error);
- callResponses.delete(id);
- });
- });
- }
- function Call(options) {
- return callBinding(CallBinding, options);
- }
- function ByName(name, ...args) {
- if (typeof name !== "string" || name.split(".").length !== 3) {
- throw new Error("CallByName requires a string in the format 'package.struct.method'");
- }
- let [packageName, structName, methodName] = name.split(".");
- return callBinding(CallBinding, {
- packageName,
- structName,
- methodName,
- args
- });
- }
- function ByID(methodID, ...args) {
- return callBinding(CallBinding, {
- methodID,
- args
- });
- }
- function Plugin(pluginName, methodName, ...args) {
- return callBinding(CallBinding, {
- packageName: "wails-plugins",
- structName: pluginName,
- methodName,
- args
- });
- }
-
- // desktop/compiled/main.js
- window._wails = window._wails || {};
- window._wails.invoke = invoke;
- window.wails = window.wails || {};
- window.wails.Application = application_exports;
- window.wails.Browser = browser_exports;
- window.wails.Call = calls_exports;
- window.wails.Clipboard = clipboard_exports;
- window.wails.Dialogs = dialogs_exports;
- window.wails.Events = events_exports;
- window.wails.Flags = flags_exports;
- window.wails.Screens = screens_exports;
- window.wails.System = system_exports;
- window.wails.Window = window_exports;
- window.wails.WML = wml_exports;
- var isReady = false;
- document.addEventListener("DOMContentLoaded", function() {
- isReady = true;
- window._wails.invoke("wails:runtime:ready");
- if (true) {
- debugLog("Wails Runtime Loaded");
- }
- });
- function whenReady(fn) {
- if (isReady || document.readyState === "complete") {
- fn();
- } else {
- document.addEventListener("DOMContentLoaded", fn);
- }
- }
- whenReady(() => {
- Reload();
- });
-})();
-//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vcnVudGltZS9kZXNrdG9wL0B3YWlsc2lvL3J1bnRpbWUvc3JjL2xvZy5qcyIsICIuLi8uLi8uLi9ydW50aW1lL2Rlc2t0b3AvQHdhaWxzaW8vcnVudGltZS9zcmMvYXBwbGljYXRpb24uanMiLCAiLi4vLi4vLi4vcnVudGltZS9ub2RlX21vZHVsZXMvbmFub2lkL25vbi1zZWN1cmUvaW5kZXguanMiLCAiLi4vLi4vLi4vcnVudGltZS9kZXNrdG9wL0B3YWlsc2lvL3J1bnRpbWUvc3JjL3J1bnRpbWUuanMiLCAiLi4vLi4vLi4vcnVudGltZS9kZXNrdG9wL0B3YWlsc2lvL3J1bnRpbWUvc3JjL2Jyb3dzZXIuanMiLCAiLi4vLi4vLi4vcnVudGltZS9kZXNrdG9wL0B3YWlsc2lvL3J1bnRpbWUvc3JjL2NsaXBib2FyZC5qcyIsICIuLi8uLi8uLi9ydW50aW1lL2Rlc2t0b3AvQHdhaWxzaW8vcnVudGltZS9zcmMvZmxhZ3MuanMiLCAiLi4vLi4vLi4vcnVudGltZS9kZXNrdG9wL0B3YWlsc2lvL3J1bnRpbWUvc3JjL3NjcmVlbnMuanMiLCAiLi4vLi4vLi4vcnVudGltZS9kZXNrdG9wL0B3YWlsc2lvL3J1bnRpbWUvc3JjL3N5c3RlbS5qcyIsICIuLi8uLi8uLi9ydW50aW1lL2Rlc2t0b3AvQHdhaWxzaW8vcnVudGltZS9zcmMvd2luZG93LmpzIiwgIi4uLy4uLy4uL3J1bnRpbWUvZGVza3RvcC9Ad2FpbHNpby9ydW50aW1lL3NyYy93bWwuanMiLCAiLi4vLi4vLi4vcnVudGltZS9kZXNrdG9wL0B3YWlsc2lvL3J1bnRpbWUvc3JjL2V2ZW50cy5qcyIsICIuLi8uLi8uLi9ydW50aW1lL2Rlc2t0b3AvQHdhaWxzaW8vcnVudGltZS9zcmMvZXZlbnRfdHlwZXMuanMiLCAiLi4vLi4vLi4vcnVudGltZS9kZXNrdG9wL0B3YWlsc2lvL3J1bnRpbWUvc3JjL2RpYWxvZ3MuanMiLCAiLi4vLi4vLi4vcnVudGltZS9kZXNrdG9wL0B3YWlsc2lvL3J1bnRpbWUvc3JjL2NhbGxzLmpzIiwgIi4uLy4uLy4uL3J1bnRpbWUvZGVza3RvcC9jb21waWxlZC9tYWluLmpzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcclxuICogTG9ncyBhIG1lc3NhZ2UgdG8gdGhlIGNvbnNvbGUgd2l0aCBjdXN0b20gZm9ybWF0dGluZy5cclxuICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2UgLSBUaGUgbWVzc2FnZSB0byBiZSBsb2dnZWQuXHJcbiAqIEByZXR1cm4ge3ZvaWR9XHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZGVidWdMb2cobWVzc2FnZSkge1xyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXHJcbiAgICBjb25zb2xlLmxvZyhcclxuICAgICAgICAnJWMgd2FpbHMzICVjICcgKyBtZXNzYWdlICsgJyAnLFxyXG4gICAgICAgICdiYWNrZ3JvdW5kOiAjYWEwMDAwOyBjb2xvcjogI2ZmZjsgYm9yZGVyLXJhZGl1czogM3B4IDBweCAwcHggM3B4OyBwYWRkaW5nOiAxcHg7IGZvbnQtc2l6ZTogMC43cmVtJyxcclxuICAgICAgICAnYmFja2dyb3VuZDogIzAwOTkwMDsgY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDBweCAzcHggM3B4IDBweDsgcGFkZGluZzogMXB4OyBmb250LXNpemU6IDAuN3JlbSdcclxuICAgICk7XHJcbn0iLCAiLypcclxuIF9cdCAgIF9fXHQgIF8gX19cclxufCB8XHQgLyAvX19fIF8oXykgL19fX19cclxufCB8IC98IC8gLyBfXyBgLyAvIC8gX19fL1xyXG58IHwvIHwvIC8gL18vIC8gLyAoX18gIClcclxufF9fL3xfXy9cXF9fLF8vXy9fL19fX18vXHJcblRoZSBlbGVjdHJvbiBhbHRlcm5hdGl2ZSBmb3IgR29cclxuKGMpIExlYSBBbnRob255IDIwMTktcHJlc2VudFxyXG4qL1xyXG5cclxuLyoganNoaW50IGVzdmVyc2lvbjogOSAqL1xyXG5cclxuaW1wb3J0IHsgbmV3UnVudGltZUNhbGxlcldpdGhJRCwgb2JqZWN0TmFtZXMgfSBmcm9tIFwiLi9ydW50aW1lXCI7XHJcbmNvbnN0IGNhbGwgPSBuZXdSdW50aW1lQ2FsbGVyV2l0aElEKG9iamVjdE5hbWVzLkFwcGxpY2F0aW9uLCAnJyk7XHJcblxyXG5jb25zdCBIaWRlTWV0aG9kID0gMDtcclxuY29uc3QgU2hvd01ldGhvZCA9IDE7XHJcbmNvbnN0IFF1aXRNZXRob2QgPSAyO1xyXG5cclxuLyoqXHJcbiAqIEhpZGVzIGEgY2VydGFpbiBtZXRob2QgYnkgY2FsbGluZyB0aGUgSGlkZU1ldGhvZCBmdW5jdGlvbi5cclxuICpcclxuICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn1cclxuICpcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBIaWRlKCkge1xyXG4gICAgcmV0dXJuIGNhbGwoSGlkZU1ldGhvZCk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBDYWxscyB0aGUgU2hvd01ldGhvZCBhbmQgcmV0dXJucyB0aGUgcmVzdWx0LlxyXG4gKlxyXG4gKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fVxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIFNob3coKSB7XHJcbiAgICByZXR1cm4gY2FsbChTaG93TWV0aG9kKTtcclxufVxyXG5cclxuLyoqXHJcbiAqIENhbGxzIHRoZSBRdWl0TWV0aG9kIHRvIHRlcm1pbmF0ZSB0aGUgcHJvZ3JhbS5cclxuICpcclxuICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn1cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBRdWl0KCkge1xyXG4gICAgcmV0dXJuIGNhbGwoUXVpdE1ldGhvZCk7XHJcbn1cclxuIiwgImxldCB1cmxBbHBoYWJldCA9XG4gICd1c2VhbmRvbS0yNlQxOTgzNDBQWDc1cHhKQUNLVkVSWU1JTkRCVVNIV09MRl9HUVpiZmdoamtscXZ3eXpyaWN0J1xuZXhwb3J0IGxldCBjdXN0b21BbHBoYWJldCA9IChhbHBoYWJldCwgZGVmYXVsdFNpemUgPSAyMSkgPT4ge1xuICByZXR1cm4gKHNpemUgPSBkZWZhdWx0U2l6ZSkgPT4ge1xuICAgIGxldCBpZCA9ICcnXG4gICAgbGV0IGkgPSBzaXplXG4gICAgd2hpbGUgKGktLSkge1xuICAgICAgaWQgKz0gYWxwaGFiZXRbKE1hdGgucmFuZG9tKCkgKiBhbHBoYWJldC5sZW5ndGgpIHwgMF1cbiAgICB9XG4gICAgcmV0dXJuIGlkXG4gIH1cbn1cbmV4cG9ydCBsZXQgbmFub2lkID0gKHNpemUgPSAyMSkgPT4ge1xuICBsZXQgaWQgPSAnJ1xuICBsZXQgaSA9IHNpemVcbiAgd2hpbGUgKGktLSkge1xuICAgIGlkICs9IHVybEFscGhhYmV0WyhNYXRoLnJhbmRvbSgpICogNjQpIHwgMF1cbiAgfVxuICByZXR1cm4gaWRcbn1cbiIsICIvKlxyXG4gXyAgICAgX18gICAgIF8gX19cclxufCB8ICAvIC9fX18gXyhfKSAvX19fX1xyXG58IHwgL3wgLyAvIF9fIGAvIC8gLyBfX18vXHJcbnwgfC8gfC8gLyAvXy8gLyAvIChfXyAgKVxyXG58X18vfF9fL1xcX18sXy9fL18vX19fXy9cclxuVGhlIGVsZWN0cm9uIGFsdGVybmF0aXZlIGZvciBHb1xyXG4oYykgTGVhIEFudGhvbnkgMjAxOS1wcmVzZW50XHJcbiovXHJcblxyXG4vKiBqc2hpbnQgZXN2ZXJzaW9uOiA5ICovXHJcbmltcG9ydCB7IG5hbm9pZCB9IGZyb20gJ25hbm9pZC9ub24tc2VjdXJlJztcclxuXHJcbmNvbnN0IHJ1bnRpbWVVUkwgPSB3aW5kb3cubG9jYXRpb24ub3JpZ2luICsgXCIvd2FpbHMvcnVudGltZVwiO1xyXG5cclxuLy8gT2JqZWN0IE5hbWVzXHJcbmV4cG9ydCBjb25zdCBvYmplY3ROYW1lcyA9IHtcclxuICAgIENhbGw6IDAsXHJcbiAgICBDbGlwYm9hcmQ6IDEsXHJcbiAgICBBcHBsaWNhdGlvbjogMixcclxuICAgIEV2ZW50czogMyxcclxuICAgIENvbnRleHRNZW51OiA0LFxyXG4gICAgRGlhbG9nOiA1LFxyXG4gICAgV2luZG93OiA2LFxyXG4gICAgU2NyZWVuczogNyxcclxuICAgIFN5c3RlbTogOCxcclxuICAgIEJyb3dzZXI6IDksXHJcbn1cclxuZXhwb3J0IGxldCBjbGllbnRJZCA9IG5hbm9pZCgpO1xyXG5cclxuLyoqXHJcbiAqIENyZWF0ZXMgYSBydW50aW1lIGNhbGxlciBmdW5jdGlvbiB0aGF0IGludm9rZXMgYSBzcGVjaWZpZWQgbWV0aG9kIG9uIGEgZ2l2ZW4gb2JqZWN0IHdpdGhpbiBhIHNwZWNpZmllZCB3aW5kb3cgY29udGV4dC5cclxuICpcclxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCAtIFRoZSBvYmplY3Qgb24gd2hpY2ggdGhlIG1ldGhvZCBpcyB0byBiZSBpbnZva2VkLlxyXG4gKiBAcGFyYW0ge3N0cmluZ30gd2luZG93TmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB3aW5kb3cgY29udGV4dCBpbiB3aGljaCB0aGUgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQuXHJcbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gQSBydW50aW1lIGNhbGxlciBmdW5jdGlvbiB0aGF0IHRha2VzIHRoZSBtZXRob2QgbmFtZSBhbmQgb3B0aW9uYWxseSBhcmd1bWVudHMgYW5kIGludm9rZXMgdGhlIG1ldGhvZCB3aXRoaW4gdGhlIHNwZWNpZmllZCB3aW5kb3cgY29udGV4dC5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBuZXdSdW50aW1lQ2FsbGVyKG9iamVjdCwgd2luZG93TmFtZSkge1xyXG4gICAgcmV0dXJuIGZ1bmN0aW9uIChtZXRob2QsIGFyZ3M9bnVsbCkge1xyXG4gICAgICAgIHJldHVybiBydW50aW1lQ2FsbChvYmplY3QgKyBcIi5cIiArIG1ldGhvZCwgd2luZG93TmFtZSwgYXJncyk7XHJcbiAgICB9O1xyXG59XHJcblxyXG4vKipcclxuICogQ3JlYXRlcyBhIG5ldyBydW50aW1lIGNhbGxlciB3aXRoIHNwZWNpZmllZCBJRC5cclxuICpcclxuICogQHBhcmFtIHtvYmplY3R9IG9iamVjdCAtIFRoZSBvYmplY3QgdG8gaW52b2tlIHRoZSBtZXRob2Qgb24uXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSB3aW5kb3dOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHdpbmRvdy5cclxuICogQHJldHVybiB7RnVuY3Rpb259IC0gVGhlIG5ldyBydW50aW1lIGNhbGxlciBmdW5jdGlvbi5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBuZXdSdW50aW1lQ2FsbGVyV2l0aElEKG9iamVjdCwgd2luZG93TmFtZSkge1xyXG4gICAgcmV0dXJuIGZ1bmN0aW9uIChtZXRob2QsIGFyZ3M9bnVsbCkge1xyXG4gICAgICAgIHJldHVybiBydW50aW1lQ2FsbFdpdGhJRChvYmplY3QsIG1ldGhvZCwgd2luZG93TmFtZSwgYXJncyk7XHJcbiAgICB9O1xyXG59XHJcblxyXG5cclxuZnVuY3Rpb24gcnVudGltZUNhbGwobWV0aG9kLCB3aW5kb3dOYW1lLCBhcmdzKSB7XHJcbiAgICBsZXQgdXJsID0gbmV3IFVSTChydW50aW1lVVJMKTtcclxuICAgIGlmKCBtZXRob2QgKSB7XHJcbiAgICAgICAgdXJsLnNlYXJjaFBhcmFtcy5hcHBlbmQoXCJtZXRob2RcIiwgbWV0aG9kKTtcclxuICAgIH1cclxuICAgIGxldCBmZXRjaE9wdGlvbnMgPSB7XHJcbiAgICAgICAgaGVhZGVyczoge30sXHJcbiAgICB9O1xyXG4gICAgaWYgKHdpbmRvd05hbWUpIHtcclxuICAgICAgICBmZXRjaE9wdGlvbnMuaGVhZGVyc1tcIngtd2FpbHMtd2luZG93LW5hbWVcIl0gPSB3aW5kb3dOYW1lO1xyXG4gICAgfVxyXG4gICAgaWYgKGFyZ3MpIHtcclxuICAgICAgICB1cmwuc2VhcmNoUGFyYW1zLmFwcGVuZChcImFyZ3NcIiwgSlNPTi5zdHJpbmdpZnkoYXJncykpO1xyXG4gICAgfVxyXG4gICAgZmV0Y2hPcHRpb25zLmhlYWRlcnNbXCJ4LXdhaWxzLWNsaWVudC1pZFwiXSA9IGNsaWVudElkO1xyXG5cclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgZmV0Y2godXJsLCBmZXRjaE9wdGlvbnMpXHJcbiAgICAgICAgICAgIC50aGVuKHJlc3BvbnNlID0+IHtcclxuICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS5vaykge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIGNvbnRlbnQgdHlwZVxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS5oZWFkZXJzLmdldChcIkNvbnRlbnQtVHlwZVwiKSAmJiByZXNwb25zZS5oZWFkZXJzLmdldChcIkNvbnRlbnQtVHlwZVwiKS5pbmRleE9mKFwiYXBwbGljYXRpb24vanNvblwiKSAhPT0gLTEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlLmpzb24oKTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzcG9uc2UudGV4dCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJlamVjdChFcnJvcihyZXNwb25zZS5zdGF0dXNUZXh0KSk7XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIC50aGVuKGRhdGEgPT4gcmVzb2x2ZShkYXRhKSlcclxuICAgICAgICAgICAgLmNhdGNoKGVycm9yID0+IHJlamVjdChlcnJvcikpO1xyXG4gICAgfSk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHJ1bnRpbWVDYWxsV2l0aElEKG9iamVjdElELCBtZXRob2QsIHdpbmRvd05hbWUsIGFyZ3MpIHtcclxuICAgIGxldCB1cmwgPSBuZXcgVVJMKHJ1bnRpbWVVUkwpO1xyXG4gICAgdXJsLnNlYXJjaFBhcmFtcy5hcHBlbmQoXCJvYmplY3RcIiwgb2JqZWN0SUQpO1xyXG4gICAgdXJsLnNlYXJjaFBhcmFtcy5hcHBlbmQoXCJtZXRob2RcIiwgbWV0aG9kKTtcclxuICAgIGxldCBmZXRjaE9wdGlvbnMgPSB7XHJcbiAgICAgICAgaGVhZGVyczoge30sXHJcbiAgICB9O1xyXG4gICAgaWYgKHdpbmRvd05hbWUpIHtcclxuICAgICAgICBmZXRjaE9wdGlvbnMuaGVhZGVyc1tcIngtd2FpbHMtd2luZG93LW5hbWVcIl0gPSB3aW5kb3dOYW1lO1xyXG4gICAgfVxyXG4gICAgaWYgKGFyZ3MpIHtcclxuICAgICAgICB1cmwuc2VhcmNoUGFyYW1zLmFwcGVuZChcImFyZ3NcIiwgSlNPTi5zdHJpbmdpZnkoYXJncykpO1xyXG4gICAgfVxyXG4gICAgZmV0Y2hPcHRpb25zLmhlYWRlcnNbXCJ4LXdhaWxzLWNsaWVudC1pZFwiXSA9IGNsaWVudElkO1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgICBmZXRjaCh1cmwsIGZldGNoT3B0aW9ucylcclxuICAgICAgICAgICAgLnRoZW4ocmVzcG9uc2UgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLm9rKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgY29udGVudCB0eXBlXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLmhlYWRlcnMuZ2V0KFwiQ29udGVudC1UeXBlXCIpICYmIHJlc3BvbnNlLmhlYWRlcnMuZ2V0KFwiQ29udGVudC1UeXBlXCIpLmluZGV4T2YoXCJhcHBsaWNhdGlvbi9qc29uXCIpICE9PSAtMSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzcG9uc2UuanNvbigpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXNwb25zZS50ZXh0KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcmVqZWN0KEVycm9yKHJlc3BvbnNlLnN0YXR1c1RleHQpKTtcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgLnRoZW4oZGF0YSA9PiByZXNvbHZlKGRhdGEpKVxyXG4gICAgICAgICAgICAuY2F0Y2goZXJyb3IgPT4gcmVqZWN0KGVycm9yKSk7XHJcbiAgICB9KTtcclxufVxyXG4iLCAiLypcclxuIF9cdCAgIF9fXHQgIF8gX19cclxufCB8XHQgLyAvX19fIF8oXykgL19fX19cclxufCB8IC98IC8gLyBfXyBgLyAvIC8gX19fL1xyXG58IHwvIHwvIC8gL18vIC8gLyAoX18gIClcclxufF9fL3xfXy9cXF9fLF8vXy9fL19fX18vXHJcblRoZSBlbGVjdHJvbiBhbHRlcm5hdGl2ZSBmb3IgR29cclxuKGMpIExlYSBBbnRob255IDIwMTktcHJlc2VudFxyXG4qL1xyXG5cclxuLyoganNoaW50IGVzdmVyc2lvbjogOSAqL1xyXG5pbXBvcnQge25ld1J1bnRpbWVDYWxsZXJXaXRoSUQsIG9iamVjdE5hbWVzfSBmcm9tIFwiLi9ydW50aW1lXCI7XHJcblxyXG5jb25zdCBjYWxsID0gbmV3UnVudGltZUNhbGxlcldpdGhJRChvYmplY3ROYW1lcy5Ccm93c2VyLCAnJyk7XHJcbmNvbnN0IEJyb3dzZXJPcGVuVVJMID0gMDtcclxuXHJcbi8qKlxyXG4gKiBPcGVuIGEgYnJvd3NlciB3aW5kb3cgdG8gdGhlIGdpdmVuIFVSTFxyXG4gKiBAcGFyYW0ge3N0cmluZ30gdXJsIC0gVGhlIFVSTCB0byBvcGVuXHJcbiAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZz59XHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gT3BlblVSTCh1cmwpIHtcclxuICAgIHJldHVybiBjYWxsKEJyb3dzZXJPcGVuVVJMLCB7dXJsfSk7XHJcbn1cclxuIiwgIi8qXHJcbiBfXHQgICBfX1x0ICBfIF9fXHJcbnwgfFx0IC8gL19fXyBfKF8pIC9fX19fXHJcbnwgfCAvfCAvIC8gX18gYC8gLyAvIF9fXy9cclxufCB8LyB8LyAvIC9fLyAvIC8gKF9fICApXHJcbnxfXy98X18vXFxfXyxfL18vXy9fX19fL1xyXG5UaGUgZWxlY3Ryb24gYWx0ZXJuYXRpdmUgZm9yIEdvXHJcbihjKSBMZWEgQW50aG9ueSAyMDE5LXByZXNlbnRcclxuKi9cclxuXHJcbi8qIGpzaGludCBlc3ZlcnNpb246IDkgKi9cclxuXHJcbmltcG9ydCB7bmV3UnVudGltZUNhbGxlcldpdGhJRCwgb2JqZWN0TmFtZXN9IGZyb20gXCIuL3J1bnRpbWVcIjtcclxuXHJcbmNvbnN0IGNhbGwgPSBuZXdSdW50aW1lQ2FsbGVyV2l0aElEKG9iamVjdE5hbWVzLkNsaXBib2FyZCwgJycpO1xyXG5jb25zdCBDbGlwYm9hcmRTZXRUZXh0ID0gMDtcclxuY29uc3QgQ2xpcGJvYXJkVGV4dCA9IDE7XHJcblxyXG4vKipcclxuICogU2V0cyB0aGUgdGV4dCB0byB0aGUgQ2xpcGJvYXJkLlxyXG4gKlxyXG4gKiBAcGFyYW0ge3N0cmluZ30gdGV4dCAtIFRoZSB0ZXh0IHRvIGJlIHNldCB0byB0aGUgQ2xpcGJvYXJkLlxyXG4gKiBAcmV0dXJuIHtQcm9taXNlfSAtIEEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIG9wZXJhdGlvbiBpcyBzdWNjZXNzZnVsLlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIFNldFRleHQodGV4dCkge1xyXG4gICAgcmV0dXJuIGNhbGwoQ2xpcGJvYXJkU2V0VGV4dCwge3RleHR9KTtcclxufVxyXG5cclxuLyoqXHJcbiAqIEdldCB0aGUgQ2xpcGJvYXJkIHRleHRcclxuICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgdGV4dCBmcm9tIHRoZSBDbGlwYm9hcmQuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gVGV4dCgpIHtcclxuICAgIHJldHVybiBjYWxsKENsaXBib2FyZFRleHQpO1xyXG59XHJcbiIsICIvKlxyXG4gX1x0ICAgX19cdCAgXyBfX1xyXG58IHxcdCAvIC9fX18gXyhfKSAvX19fX1xyXG58IHwgL3wgLyAvIF9fIGAvIC8gLyBfX18vXHJcbnwgfC8gfC8gLyAvXy8gLyAvIChfXyAgKVxyXG58X18vfF9fL1xcX18sXy9fL18vX19fXy9cclxuVGhlIGVsZWN0cm9uIGFsdGVybmF0aXZlIGZvciBHb1xyXG4oYykgTGVhIEFudGhvbnkgMjAxOS1wcmVzZW50XHJcbiovXHJcblxyXG4vKiBqc2hpbnQgZXN2ZXJzaW9uOiA5ICovXHJcblxyXG4vKipcclxuICogUmV0cmlldmVzIHRoZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmllZCBrZXkgZnJvbSB0aGUgZmxhZyBtYXAuXHJcbiAqXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXlTdHJpbmcgLSBUaGUga2V5IHRvIHJldHJpZXZlIHRoZSB2YWx1ZSBmb3IuXHJcbiAqIEByZXR1cm4geyp9IC0gVGhlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIGtleS5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBHZXRGbGFnKGtleVN0cmluZykge1xyXG4gICAgdHJ5IHtcclxuICAgICAgICByZXR1cm4gd2luZG93Ll93YWlscy5mbGFnc1trZXlTdHJpbmddO1xyXG4gICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVuYWJsZSB0byByZXRyaWV2ZSBmbGFnICdcIiArIGtleVN0cmluZyArIFwiJzogXCIgKyBlKTtcclxuICAgIH1cclxufVxyXG4iLCAiLypcclxuIF9cdCAgIF9fXHQgIF8gX19cclxufCB8XHQgLyAvX19fIF8oXykgL19fX19cclxufCB8IC98IC8gLyBfXyBgLyAvIC8gX19fL1xyXG58IHwvIHwvIC8gL18vIC8gLyAoX18gIClcclxufF9fL3xfXy9cXF9fLF8vXy9fL19fX18vXHJcblRoZSBlbGVjdHJvbiBhbHRlcm5hdGl2ZSBmb3IgR29cclxuKGMpIExlYSBBbnRob255IDIwMTktcHJlc2VudFxyXG4qL1xyXG5cclxuLyoganNoaW50IGVzdmVyc2lvbjogOSAqL1xyXG5cclxuLyoqXHJcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFBvc2l0aW9uXHJcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBYIC0gVGhlIFggY29vcmRpbmF0ZS5cclxuICogQHByb3BlcnR5IHtudW1iZXJ9IFkgLSBUaGUgWSBjb29yZGluYXRlLlxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBTaXplXHJcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBYIC0gVGhlIHdpZHRoLlxyXG4gKiBAcHJvcGVydHkge251bWJlcn0gWSAtIFRoZSBoZWlnaHQuXHJcbiAqL1xyXG5cclxuXHJcbi8qKlxyXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBSZWN0XHJcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBYIC0gVGhlIFggY29vcmRpbmF0ZSBvZiB0aGUgdG9wLWxlZnQgY29ybmVyLlxyXG4gKiBAcHJvcGVydHkge251bWJlcn0gWSAtIFRoZSBZIGNvb3JkaW5hdGUgb2YgdGhlIHRvcC1sZWZ0IGNvcm5lci5cclxuICogQHByb3BlcnR5IHtudW1iZXJ9IFdpZHRoIC0gVGhlIHdpZHRoIG9mIHRoZSByZWN0YW5nbGUuXHJcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBIZWlnaHQgLSBUaGUgaGVpZ2h0IG9mIHRoZSByZWN0YW5nbGUuXHJcbiAqL1xyXG5cclxuXHJcbi8qKlxyXG4gKiBAdHlwZWRlZiB7KCdaZXJvJ3wnTmluZXR5J3wnT25lRWlnaHR5J3wnVHdvU2V2ZW50eScpfSBSb3RhdGlvblxyXG4gKiBUaGUgcm90YXRpb24gb2YgdGhlIHNjcmVlbi4gQ2FuIGJlIG9uZSBvZiAnWmVybycsICdOaW5ldHknLCAnT25lRWlnaHR5JywgJ1R3b1NldmVudHknLlxyXG4gKi9cclxuXHJcblxyXG4vKipcclxuICogQHR5cGVkZWYge09iamVjdH0gU2NyZWVuXHJcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBJZCAtIFVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgc2NyZWVuLlxyXG4gKiBAcHJvcGVydHkge3N0cmluZ30gTmFtZSAtIEh1bWFuIHJlYWRhYmxlIG5hbWUgb2YgdGhlIHNjcmVlbi5cclxuICogQHByb3BlcnR5IHtudW1iZXJ9IFNjYWxlIC0gVGhlIHJlc29sdXRpb24gc2NhbGUgb2YgdGhlIHNjcmVlbi4gMSA9IHN0YW5kYXJkIHJlc29sdXRpb24sIDIgPSBoaWdoIChSZXRpbmEpLCBldGMuXHJcbiAqIEBwcm9wZXJ0eSB7UG9zaXRpb259IFBvc2l0aW9uIC0gQ29udGFpbnMgdGhlIFggYW5kIFkgY29vcmRpbmF0ZXMgb2YgdGhlIHNjcmVlbidzIHBvc2l0aW9uLlxyXG4gKiBAcHJvcGVydHkge1NpemV9IFNpemUgLSBDb250YWlucyB0aGUgd2lkdGggYW5kIGhlaWdodCBvZiB0aGUgc2NyZWVuLlxyXG4gKiBAcHJvcGVydHkge1JlY3R9IEJvdW5kcyAtIENvbnRhaW5zIHRoZSBib3VuZHMgb2YgdGhlIHNjcmVlbiBpbiB0ZXJtcyBvZiBYLCBZLCBXaWR0aCwgYW5kIEhlaWdodC5cclxuICogQHByb3BlcnR5IHtSZWN0fSBXb3JrQXJlYSAtIENvbnRhaW5zIHRoZSBhcmVhIG9mIHRoZSBzY3JlZW4gdGhhdCBpcyBhY3R1YWxseSB1c2FibGUgKGV4Y2x1ZGluZyB0YXNrYmFyIGFuZCBvdGhlciBzeXN0ZW0gVUkpLlxyXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IElzUHJpbWFyeSAtIFRydWUgaWYgdGhpcyBpcyB0aGUgcHJpbWFyeSBtb25pdG9yIHNlbGVjdGVkIGJ5IHRoZSB1c2VyIGluIHRoZSBvcGVyYXRpbmcgc3lzdGVtLlxyXG4gKiBAcHJvcGVydHkge1JvdGF0aW9ufSBSb3RhdGlvbiAtIFRoZSByb3RhdGlvbiBvZiB0aGUgc2NyZWVuLlxyXG4gKi9cclxuXHJcblxyXG5pbXBvcnQge25ld1J1bnRpbWVDYWxsZXJXaXRoSUQsIG9iamVjdE5hbWVzfSBmcm9tIFwiLi9ydW50aW1lXCI7XHJcbmNvbnN0IGNhbGwgPSBuZXdSdW50aW1lQ2FsbGVyV2l0aElEKG9iamVjdE5hbWVzLlNjcmVlbnMsICcnKTtcclxuXHJcbmNvbnN0IGdldEFsbCA9IDA7XHJcbmNvbnN0IGdldFByaW1hcnkgPSAxO1xyXG5jb25zdCBnZXRDdXJyZW50ID0gMjtcclxuXHJcbi8qKlxyXG4gKiBHZXRzIGFsbCBzY3JlZW5zLlxyXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxTY3JlZW5bXT59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIGFuIGFycmF5IG9mIFNjcmVlbiBvYmplY3RzLlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIEdldEFsbCgpIHtcclxuICAgIHJldHVybiBjYWxsKGdldEFsbCk7XHJcbn1cclxuLyoqXHJcbiAqIEdldHMgdGhlIHByaW1hcnkgc2NyZWVuLlxyXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxTY3JlZW4+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgcHJpbWFyeSBzY3JlZW4uXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gR2V0UHJpbWFyeSgpIHtcclxuICAgIHJldHVybiBjYWxsKGdldFByaW1hcnkpO1xyXG59XHJcbi8qKlxyXG4gKiBHZXRzIHRoZSBjdXJyZW50IGFjdGl2ZSBzY3JlZW4uXHJcbiAqXHJcbiAqIEByZXR1cm5zIHtQcm9taXNlPFNjcmVlbj59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIGN1cnJlbnQgYWN0aXZlIHNjcmVlbi5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBHZXRDdXJyZW50KCkge1xyXG4gICAgcmV0dXJuIGNhbGwoZ2V0Q3VycmVudCk7XHJcbn0iLCAiLypcclxuIF9cdCAgIF9fXHQgIF8gX19cclxufCB8XHQgLyAvX19fIF8oXykgL19fX19cclxufCB8IC98IC8gLyBfXyBgLyAvIC8gX19fL1xyXG58IHwvIHwvIC8gL18vIC8gLyAoX18gIClcclxufF9fL3xfXy9cXF9fLF8vXy9fL19fX18vXHJcblRoZSBlbGVjdHJvbiBhbHRlcm5hdGl2ZSBmb3IgR29cclxuKGMpIExlYSBBbnRob255IDIwMTktcHJlc2VudFxyXG4qL1xyXG5cclxuLyoganNoaW50IGVzdmVyc2lvbjogOSAqL1xyXG5cclxuaW1wb3J0IHtuZXdSdW50aW1lQ2FsbGVyV2l0aElELCBvYmplY3ROYW1lc30gZnJvbSBcIi4vcnVudGltZVwiO1xyXG5sZXQgY2FsbCA9IG5ld1J1bnRpbWVDYWxsZXJXaXRoSUQob2JqZWN0TmFtZXMuU3lzdGVtLCAnJyk7XHJcbmNvbnN0IHN5c3RlbUlzRGFya01vZGUgPSAwO1xyXG5jb25zdCBlbnZpcm9ubWVudCA9IDE7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gaW52b2tlKG1zZykge1xyXG4gICAgaWYod2luZG93LmNocm9tZSkge1xyXG4gICAgICAgIHJldHVybiB3aW5kb3cuY2hyb21lLndlYnZpZXcucG9zdE1lc3NhZ2UobXNnKTtcclxuICAgIH1cclxuICAgIHJldHVybiB3aW5kb3cud2Via2l0Lm1lc3NhZ2VIYW5kbGVycy5leHRlcm5hbC5wb3N0TWVzc2FnZTtcclxufVxyXG5cclxuLyoqXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBSZXRyaWV2ZXMgdGhlIHN5c3RlbSBkYXJrIG1vZGUgc3RhdHVzLlxyXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxib29sZWFuPn0gLSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byBhIGJvb2xlYW4gdmFsdWUgaW5kaWNhdGluZyBpZiB0aGUgc3lzdGVtIGlzIGluIGRhcmsgbW9kZS5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBJc0RhcmtNb2RlKCkge1xyXG4gICAgcmV0dXJuIGNhbGwoc3lzdGVtSXNEYXJrTW9kZSk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBGZXRjaGVzIHRoZSBjYXBhYmlsaXRpZXMgb2YgdGhlIGFwcGxpY2F0aW9uIGZyb20gdGhlIHNlcnZlci5cclxuICpcclxuICogQGFzeW5jXHJcbiAqIEBmdW5jdGlvbiBDYXBhYmlsaXRpZXNcclxuICogQHJldHVybnMge1Byb21pc2U8T2JqZWN0Pn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gYW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIGNhcGFiaWxpdGllcy5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBDYXBhYmlsaXRpZXMoKSB7XHJcbiAgICBsZXQgcmVzcG9uc2UgPSBmZXRjaChcIi93YWlscy9jYXBhYmlsaXRpZXNcIik7XHJcbiAgICByZXR1cm4gcmVzcG9uc2UuanNvbigpO1xyXG59XHJcblxyXG4vKipcclxuICogQHR5cGVkZWYge29iamVjdH0gRW52aXJvbm1lbnRJbmZvXHJcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBPUyAtIFRoZSBvcGVyYXRpbmcgc3lzdGVtIGluIHVzZS5cclxuICogQHByb3BlcnR5IHtzdHJpbmd9IEFyY2ggLSBUaGUgYXJjaGl0ZWN0dXJlIG9mIHRoZSBzeXN0ZW0uXHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBSZXRyaWV2ZXMgZW52aXJvbm1lbnQgZGV0YWlscy5cclxuICogQHJldHVybnMge1Byb21pc2U8RW52aXJvbm1lbnRJbmZvPn0gLSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byBhbiBvYmplY3QgY29udGFpbmluZyBPUyBhbmQgc3lzdGVtIGFyY2hpdGVjdHVyZS5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBFbnZpcm9ubWVudCgpIHtcclxuICAgIHJldHVybiBjYWxsKGVudmlyb25tZW50KTtcclxufVxyXG5cclxuLyoqXHJcbiAqIENoZWNrcyBpZiB0aGUgY3VycmVudCBvcGVyYXRpbmcgc3lzdGVtIGlzIFdpbmRvd3MuXHJcbiAqXHJcbiAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgdGhlIG9wZXJhdGluZyBzeXN0ZW0gaXMgV2luZG93cywgb3RoZXJ3aXNlIGZhbHNlLlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIElzV2luZG93cygpIHtcclxuICAgIHJldHVybiB3aW5kb3cuX3dhaWxzLmVudmlyb25tZW50Lk9TID09PSBcIndpbmRvd3NcIjtcclxufVxyXG5cclxuLyoqXHJcbiAqIENoZWNrcyBpZiB0aGUgY3VycmVudCBvcGVyYXRpbmcgc3lzdGVtIGlzIExpbnV4LlxyXG4gKlxyXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyB0cnVlIGlmIHRoZSBjdXJyZW50IG9wZXJhdGluZyBzeXN0ZW0gaXMgTGludXgsIGZhbHNlIG90aGVyd2lzZS5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBJc0xpbnV4KCkge1xyXG4gICAgcmV0dXJuIHdpbmRvdy5fd2FpbHMuZW52aXJvbm1lbnQuT1MgPT09IFwibGludXhcIjtcclxufVxyXG5cclxuLyoqXHJcbiAqIENoZWNrcyBpZiB0aGUgY3VycmVudCBlbnZpcm9ubWVudCBpcyBhIG1hY09TIG9wZXJhdGluZyBzeXN0ZW0uXHJcbiAqXHJcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHRoZSBlbnZpcm9ubWVudCBpcyBtYWNPUywgZmFsc2Ugb3RoZXJ3aXNlLlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIElzTWFjKCkge1xyXG4gICAgcmV0dXJuIHdpbmRvdy5fd2FpbHMuZW52aXJvbm1lbnQuT1MgPT09IFwiZGFyd2luXCI7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBDaGVja3MgaWYgdGhlIGN1cnJlbnQgZW52aXJvbm1lbnQgYXJjaGl0ZWN0dXJlIGlzIEFNRDY0LlxyXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgY3VycmVudCBlbnZpcm9ubWVudCBhcmNoaXRlY3R1cmUgaXMgQU1ENjQsIGZhbHNlIG90aGVyd2lzZS5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBJc0FNRDY0KCkge1xyXG4gICAgcmV0dXJuIHdpbmRvdy5fd2FpbHMuZW52aXJvbm1lbnQuQXJjaCA9PT0gXCJhbWQ2NFwiO1xyXG59XHJcblxyXG4vKipcclxuICogQ2hlY2tzIGlmIHRoZSBjdXJyZW50IGFyY2hpdGVjdHVyZSBpcyBBUk0uXHJcbiAqXHJcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHRoZSBjdXJyZW50IGFyY2hpdGVjdHVyZSBpcyBBUk0sIGZhbHNlIG90aGVyd2lzZS5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBJc0FSTSgpIHtcclxuICAgIHJldHVybiB3aW5kb3cuX3dhaWxzLmVudmlyb25tZW50LkFyY2ggPT09IFwiYXJtXCI7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBDaGVja3MgaWYgdGhlIGN1cnJlbnQgZW52aXJvbm1lbnQgaXMgQVJNNjQgYXJjaGl0ZWN0dXJlLlxyXG4gKlxyXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSBSZXR1cm5zIHRydWUgaWYgdGhlIGVudmlyb25tZW50IGlzIEFSTTY0IGFyY2hpdGVjdHVyZSwgb3RoZXJ3aXNlIHJldHVybnMgZmFsc2UuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gSXNBUk02NCgpIHtcclxuICAgIHJldHVybiB3aW5kb3cuX3dhaWxzLmVudmlyb25tZW50LkFyY2ggPT09IFwiYXJtNjRcIjtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIElzRGVidWcoKSB7XHJcbiAgICByZXR1cm4gd2luZG93Ll93YWlscy5lbnZpcm9ubWVudC5EZWJ1ZyA9PT0gdHJ1ZTtcclxufVxyXG5cclxuIiwgIi8qXHJcbiBfXHQgICBfX1x0ICBfIF9fXHJcbnwgfFx0IC8gL19fXyBfKF8pIC9fX19fXHJcbnwgfCAvfCAvIC8gX18gYC8gLyAvIF9fXy9cclxufCB8LyB8LyAvIC9fLyAvIC8gKF9fICApXHJcbnxfXy98X18vXFxfXyxfL18vXy9fX19fL1xyXG5UaGUgZWxlY3Ryb24gYWx0ZXJuYXRpdmUgZm9yIEdvXHJcbihjKSBMZWEgQW50aG9ueSAyMDE5LXByZXNlbnRcclxuKi9cclxuXHJcbi8qIGpzaGludCBlc3ZlcnNpb246IDkgKi9cclxuXHJcbi8vIEltcG9ydCBzY3JlZW4ganNkb2MgZGVmaW5pdGlvbiBmcm9tIC4vc2NyZWVucy5qc1xyXG4vKipcclxuICogQHR5cGVkZWYge2ltcG9ydChcIi4vc2NyZWVuc1wiKS5TY3JlZW59IFNjcmVlblxyXG4gKi9cclxuXHJcbmltcG9ydCB7bmV3UnVudGltZUNhbGxlcldpdGhJRCwgb2JqZWN0TmFtZXN9IGZyb20gXCIuL3J1bnRpbWVcIjtcclxuXHJcbmNvbnN0IGNlbnRlciA9IDA7XHJcbmNvbnN0IHNldFRpdGxlID0gMTtcclxuY29uc3QgZnVsbHNjcmVlbiA9IDI7XHJcbmNvbnN0IHVuRnVsbHNjcmVlbiA9IDM7XHJcbmNvbnN0IHNldFNpemUgPSA0O1xyXG5jb25zdCBzaXplID0gNTtcclxuY29uc3Qgc2V0TWF4U2l6ZSA9IDY7XHJcbmNvbnN0IHNldE1pblNpemUgPSA3O1xyXG5jb25zdCBzZXRBbHdheXNPblRvcCA9IDg7XHJcbmNvbnN0IHNldFJlbGF0aXZlUG9zaXRpb24gPSA5O1xyXG5jb25zdCByZWxhdGl2ZVBvc2l0aW9uID0gMTA7XHJcbmNvbnN0IHNjcmVlbiA9IDExO1xyXG5jb25zdCBoaWRlID0gMTI7XHJcbmNvbnN0IG1heGltaXNlID0gMTM7XHJcbmNvbnN0IHVuTWF4aW1pc2UgPSAxNDtcclxuY29uc3QgdG9nZ2xlTWF4aW1pc2UgPSAxNTtcclxuY29uc3QgbWluaW1pc2UgPSAxNjtcclxuY29uc3QgdW5NaW5pbWlzZSA9IDE3O1xyXG5jb25zdCByZXN0b3JlID0gMTg7XHJcbmNvbnN0IHNob3cgPSAxOTtcclxuY29uc3QgY2xvc2UgPSAyMDtcclxuY29uc3Qgc2V0QmFja2dyb3VuZENvbG91ciA9IDIxO1xyXG5jb25zdCBzZXRSZXNpemFibGUgPSAyMjtcclxuY29uc3Qgd2lkdGggPSAyMztcclxuY29uc3QgaGVpZ2h0ID0gMjQ7XHJcbmNvbnN0IHpvb21JbiA9IDI1O1xyXG5jb25zdCB6b29tT3V0ID0gMjY7XHJcbmNvbnN0IHpvb21SZXNldCA9IDI3O1xyXG5jb25zdCBnZXRab29tTGV2ZWwgPSAyODtcclxuY29uc3Qgc2V0Wm9vbUxldmVsID0gMjk7XHJcblxyXG5jb25zdCB0aGlzV2luZG93ID0gR2V0KCcnKTtcclxuXHJcbmZ1bmN0aW9uIGNyZWF0ZVdpbmRvdyhjYWxsKSB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAgIEdldDogKHdpbmRvd05hbWUpID0+IGNyZWF0ZVdpbmRvdyhuZXdSdW50aW1lQ2FsbGVyV2l0aElEKG9iamVjdE5hbWVzLldpbmRvdywgd2luZG93TmFtZSkpLFxyXG4gICAgICAgIENlbnRlcjogKCkgPT4gY2FsbChjZW50ZXIpLFxyXG4gICAgICAgIFNldFRpdGxlOiAodGl0bGUpID0+IGNhbGwoc2V0VGl0bGUsIHt0aXRsZX0pLFxyXG4gICAgICAgIEZ1bGxzY3JlZW46ICgpID0+IGNhbGwoZnVsbHNjcmVlbiksXHJcbiAgICAgICAgVW5GdWxsc2NyZWVuOiAoKSA9PiBjYWxsKHVuRnVsbHNjcmVlbiksXHJcbiAgICAgICAgU2V0U2l6ZTogKHdpZHRoLCBoZWlnaHQpID0+IGNhbGwoc2V0U2l6ZSwge3dpZHRoLCBoZWlnaHR9KSxcclxuICAgICAgICBTaXplOiAoKSA9PiBjYWxsKHNpemUpLFxyXG4gICAgICAgIFNldE1heFNpemU6ICh3aWR0aCwgaGVpZ2h0KSA9PiBjYWxsKHNldE1heFNpemUsIHt3aWR0aCwgaGVpZ2h0fSksXHJcbiAgICAgICAgU2V0TWluU2l6ZTogKHdpZHRoLCBoZWlnaHQpID0+IGNhbGwoc2V0TWluU2l6ZSwge3dpZHRoLCBoZWlnaHR9KSxcclxuICAgICAgICBTZXRBbHdheXNPblRvcDogKG9uVG9wKSA9PiBjYWxsKHNldEFsd2F5c09uVG9wLCB7YWx3YXlzT25Ub3A6IG9uVG9wfSksXHJcbiAgICAgICAgU2V0UmVsYXRpdmVQb3NpdGlvbjogKHgsIHkpID0+IGNhbGwoc2V0UmVsYXRpdmVQb3NpdGlvbiwge3gsIHl9KSxcclxuICAgICAgICBSZWxhdGl2ZVBvc2l0aW9uOiAoKSA9PiBjYWxsKHJlbGF0aXZlUG9zaXRpb24pLFxyXG4gICAgICAgIFNjcmVlbjogKCkgPT4gY2FsbChzY3JlZW4pLFxyXG4gICAgICAgIEhpZGU6ICgpID0+IGNhbGwoaGlkZSksXHJcbiAgICAgICAgTWF4aW1pc2U6ICgpID0+IGNhbGwobWF4aW1pc2UpLFxyXG4gICAgICAgIFVuTWF4aW1pc2U6ICgpID0+IGNhbGwodW5NYXhpbWlzZSksXHJcbiAgICAgICAgVG9nZ2xlTWF4aW1pc2U6ICgpID0+IGNhbGwodG9nZ2xlTWF4aW1pc2UpLFxyXG4gICAgICAgIE1pbmltaXNlOiAoKSA9PiBjYWxsKG1pbmltaXNlKSxcclxuICAgICAgICBVbk1pbmltaXNlOiAoKSA9PiBjYWxsKHVuTWluaW1pc2UpLFxyXG4gICAgICAgIFJlc3RvcmU6ICgpID0+IGNhbGwocmVzdG9yZSksXHJcbiAgICAgICAgU2hvdzogKCkgPT4gY2FsbChzaG93KSxcclxuICAgICAgICBDbG9zZTogKCkgPT4gY2FsbChjbG9zZSksXHJcbiAgICAgICAgU2V0QmFja2dyb3VuZENvbG91cjogKHIsIGcsIGIsIGEpID0+IGNhbGwoc2V0QmFja2dyb3VuZENvbG91ciwge3IsIGcsIGIsIGF9KSxcclxuICAgICAgICBTZXRSZXNpemFibGU6IChyZXNpemFibGUpID0+IGNhbGwoc2V0UmVzaXphYmxlLCB7cmVzaXphYmxlfSksXHJcbiAgICAgICAgV2lkdGg6ICgpID0+IGNhbGwod2lkdGgpLFxyXG4gICAgICAgIEhlaWdodDogKCkgPT4gY2FsbChoZWlnaHQpLFxyXG4gICAgICAgIFpvb21JbjogKCkgPT4gY2FsbCh6b29tSW4pLFxyXG4gICAgICAgIFpvb21PdXQ6ICgpID0+IGNhbGwoem9vbU91dCksXHJcbiAgICAgICAgWm9vbVJlc2V0OiAoKSA9PiBjYWxsKHpvb21SZXNldCksXHJcbiAgICAgICAgR2V0Wm9vbUxldmVsOiAoKSA9PiBjYWxsKGdldFpvb21MZXZlbCksXHJcbiAgICAgICAgU2V0Wm9vbUxldmVsOiAoem9vbUxldmVsKSA9PiBjYWxsKHNldFpvb21MZXZlbCwge3pvb21MZXZlbH0pLFxyXG4gICAgfTtcclxufVxyXG5cclxuLyoqXHJcbiAqIEdldHMgdGhlIHNwZWNpZmllZCB3aW5kb3cuXHJcbiAqXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSB3aW5kb3dOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHdpbmRvdyB0byBnZXQuXHJcbiAqIEByZXR1cm4ge09iamVjdH0gLSBUaGUgc3BlY2lmaWVkIHdpbmRvdyBvYmplY3QuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gR2V0KHdpbmRvd05hbWUpIHtcclxuICAgIHJldHVybiBjcmVhdGVXaW5kb3cobmV3UnVudGltZUNhbGxlcldpdGhJRChvYmplY3ROYW1lcy5XaW5kb3csIHdpbmRvd05hbWUpKTtcclxufVxyXG5cclxuLyoqXHJcbiAqIENlbnRlcnMgdGhlIHdpbmRvdyBvbiB0aGUgc2NyZWVuLlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIENlbnRlcigpIHtcclxuICAgIHRoaXNXaW5kb3cuQ2VudGVyKCk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBTZXRzIHRoZSB0aXRsZSBvZiB0aGUgd2luZG93LlxyXG4gKiBAcGFyYW0ge3N0cmluZ30gdGl0bGUgLSBUaGUgdGl0bGUgdG8gc2V0LlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIFNldFRpdGxlKHRpdGxlKSB7XHJcbiAgICB0aGlzV2luZG93LlNldFRpdGxlKHRpdGxlKTtcclxufVxyXG5cclxuLyoqXHJcbiAqIFNldHMgdGhlIHdpbmRvdyB0byBmdWxsc2NyZWVuLlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIEZ1bGxzY3JlZW4oKSB7XHJcbiAgICB0aGlzV2luZG93LkZ1bGxzY3JlZW4oKTtcclxufVxyXG5cclxuLyoqXHJcbiAqIFNldHMgdGhlIHNpemUgb2YgdGhlIHdpbmRvdy5cclxuICogQHBhcmFtIHtudW1iZXJ9IHdpZHRoIC0gVGhlIHdpZHRoIG9mIHRoZSB3aW5kb3cuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBoZWlnaHQgLSBUaGUgaGVpZ2h0IG9mIHRoZSB3aW5kb3cuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gU2V0U2l6ZSh3aWR0aCwgaGVpZ2h0KSB7XHJcbiAgICB0aGlzV2luZG93LlNldFNpemUod2lkdGgsIGhlaWdodCk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBHZXRzIHRoZSBzaXplIG9mIHRoZSB3aW5kb3cuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gU2l6ZSgpIHtcclxuICAgIHJldHVybiB0aGlzV2luZG93LlNpemUoKTtcclxufVxyXG5cclxuLyoqXHJcbiAqIFNldHMgdGhlIG1heGltdW0gc2l6ZSBvZiB0aGUgd2luZG93LlxyXG4gKiBAcGFyYW0ge251bWJlcn0gd2lkdGggLSBUaGUgbWF4aW11bSB3aWR0aCBvZiB0aGUgd2luZG93LlxyXG4gKiBAcGFyYW0ge251bWJlcn0gaGVpZ2h0IC0gVGhlIG1heGltdW0gaGVpZ2h0IG9mIHRoZSB3aW5kb3cuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gU2V0TWF4U2l6ZSh3aWR0aCwgaGVpZ2h0KSB7XHJcbiAgICB0aGlzV2luZG93LlNldE1heFNpemUod2lkdGgsIGhlaWdodCk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBTZXRzIHRoZSBtaW5pbXVtIHNpemUgb2YgdGhlIHdpbmRvdy5cclxuICogQHBhcmFtIHtudW1iZXJ9IHdpZHRoIC0gVGhlIG1pbmltdW0gd2lkdGggb2YgdGhlIHdpbmRvdy5cclxuICogQHBhcmFtIHtudW1iZXJ9IGhlaWdodCAtIFRoZSBtaW5pbXVtIGhlaWdodCBvZiB0aGUgd2luZG93LlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIFNldE1pblNpemUod2lkdGgsIGhlaWdodCkge1xyXG4gICAgdGhpc1dpbmRvdy5TZXRNaW5TaXplKHdpZHRoLCBoZWlnaHQpO1xyXG59XHJcblxyXG4vKipcclxuICogU2V0cyB0aGUgd2luZG93IHRvIGFsd2F5cyBiZSBvbiB0b3AuXHJcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gb25Ub3AgLSBXaGV0aGVyIHRoZSB3aW5kb3cgc2hvdWxkIGFsd2F5cyBiZSBvbiB0b3AuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gU2V0QWx3YXlzT25Ub3Aob25Ub3ApIHtcclxuICAgIHRoaXNXaW5kb3cuU2V0QWx3YXlzT25Ub3Aob25Ub3ApO1xyXG59XHJcblxyXG4vKipcclxuICogU2V0cyB0aGUgcmVsYXRpdmUgcG9zaXRpb24gb2YgdGhlIHdpbmRvdy5cclxuICogQHBhcmFtIHtudW1iZXJ9IHggLSBUaGUgeC1jb29yZGluYXRlIG9mIHRoZSB3aW5kb3cncyBwb3NpdGlvbi5cclxuICogQHBhcmFtIHtudW1iZXJ9IHkgLSBUaGUgeS1jb29yZGluYXRlIG9mIHRoZSB3aW5kb3cncyBwb3NpdGlvbi5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBTZXRSZWxhdGl2ZVBvc2l0aW9uKHgsIHkpIHtcclxuICAgIHRoaXNXaW5kb3cuU2V0UmVsYXRpdmVQb3NpdGlvbih4LCB5KTtcclxufVxyXG5cclxuLyoqXHJcbiAqIEdldHMgdGhlIHJlbGF0aXZlIHBvc2l0aW9uIG9mIHRoZSB3aW5kb3cuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gUmVsYXRpdmVQb3NpdGlvbigpIHtcclxuICAgIHJldHVybiB0aGlzV2luZG93LlJlbGF0aXZlUG9zaXRpb24oKTtcclxufVxyXG5cclxuLyoqXHJcbiAqIEdldHMgdGhlIHNjcmVlbiB0aGF0IHRoZSB3aW5kb3cgaXMgb24uXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gU2NyZWVuKCkge1xyXG4gICAgcmV0dXJuIHRoaXNXaW5kb3cuU2NyZWVuKCk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBIaWRlcyB0aGUgd2luZG93LlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIEhpZGUoKSB7XHJcbiAgICB0aGlzV2luZG93LkhpZGUoKTtcclxufVxyXG5cclxuLyoqXHJcbiAqIE1heGltaXNlcyB0aGUgd2luZG93LlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIE1heGltaXNlKCkge1xyXG4gICAgdGhpc1dpbmRvdy5NYXhpbWlzZSgpO1xyXG59XHJcblxyXG4vKipcclxuICogVW4tbWF4aW1pc2VzIHRoZSB3aW5kb3cuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gVW5NYXhpbWlzZSgpIHtcclxuICAgIHRoaXNXaW5kb3cuVW5NYXhpbWlzZSgpO1xyXG59XHJcblxyXG4vKipcclxuICogVG9nZ2xlcyB0aGUgbWF4aW1pc2F0aW9uIG9mIHRoZSB3aW5kb3cuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gVG9nZ2xlTWF4aW1pc2UoKSB7XHJcbiAgICB0aGlzV2luZG93LlRvZ2dsZU1heGltaXNlKCk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBNaW5pbWlzZXMgdGhlIHdpbmRvdy5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBNaW5pbWlzZSgpIHtcclxuICAgIHRoaXNXaW5kb3cuTWluaW1pc2UoKTtcclxufVxyXG5cclxuLyoqXHJcbiAqIFVuLW1pbmltaXNlcyB0aGUgd2luZG93LlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIFVuTWluaW1pc2UoKSB7XHJcbiAgICB0aGlzV2luZG93LlVuTWluaW1pc2UoKTtcclxufVxyXG5cclxuLyoqXHJcbiAqIFJlc3RvcmVzIHRoZSB3aW5kb3cuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gUmVzdG9yZSgpIHtcclxuICAgIHRoaXNXaW5kb3cuUmVzdG9yZSgpO1xyXG59XHJcblxyXG4vKipcclxuICogU2hvd3MgdGhlIHdpbmRvdy5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBTaG93KCkge1xyXG4gICAgdGhpc1dpbmRvdy5TaG93KCk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBDbG9zZXMgdGhlIHdpbmRvdy5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBDbG9zZSgpIHtcclxuICAgIHRoaXNXaW5kb3cuQ2xvc2UoKTtcclxufVxyXG5cclxuLyoqXHJcbiAqIFNldHMgdGhlIGJhY2tncm91bmQgY29sb3VyIG9mIHRoZSB3aW5kb3cuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSByIC0gVGhlIHJlZCBjb21wb25lbnQgb2YgdGhlIGNvbG91ci5cclxuICogQHBhcmFtIHtudW1iZXJ9IGcgLSBUaGUgZ3JlZW4gY29tcG9uZW50IG9mIHRoZSBjb2xvdXIuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBiIC0gVGhlIGJsdWUgY29tcG9uZW50IG9mIHRoZSBjb2xvdXIuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBhIC0gVGhlIGFscGhhIGNvbXBvbmVudCBvZiB0aGUgY29sb3VyLlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIFNldEJhY2tncm91bmRDb2xvdXIociwgZywgYiwgYSkge1xyXG4gICAgdGhpc1dpbmRvdy5TZXRCYWNrZ3JvdW5kQ29sb3VyKHIsIGcsIGIsIGEpO1xyXG59XHJcblxyXG4vKipcclxuICogU2V0cyB3aGV0aGVyIHRoZSB3aW5kb3cgaXMgcmVzaXphYmxlLlxyXG4gKiBAcGFyYW0ge2Jvb2xlYW59IHJlc2l6YWJsZSAtIFdoZXRoZXIgdGhlIHdpbmRvdyBzaG91bGQgYmUgcmVzaXphYmxlLlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIFNldFJlc2l6YWJsZShyZXNpemFibGUpIHtcclxuICAgIHRoaXNXaW5kb3cuU2V0UmVzaXphYmxlKHJlc2l6YWJsZSk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBHZXRzIHRoZSB3aWR0aCBvZiB0aGUgd2luZG93LlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIFdpZHRoKCkge1xyXG4gICAgcmV0dXJuIHRoaXNXaW5kb3cuV2lkdGgoKTtcclxufVxyXG5cclxuLyoqXHJcbiAqIEdldHMgdGhlIGhlaWdodCBvZiB0aGUgd2luZG93LlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIEhlaWdodCgpIHtcclxuICAgIHJldHVybiB0aGlzV2luZG93LkhlaWdodCgpO1xyXG59XHJcblxyXG4vKipcclxuICogWm9vbXMgaW4gdGhlIHdpbmRvdy5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBab29tSW4oKSB7XHJcbiAgICB0aGlzV2luZG93Llpvb21JbigpO1xyXG59XHJcblxyXG4vKipcclxuICogWm9vbXMgb3V0IHRoZSB3aW5kb3cuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gWm9vbU91dCgpIHtcclxuICAgIHRoaXNXaW5kb3cuWm9vbU91dCgpO1xyXG59XHJcblxyXG4vKipcclxuICogUmVzZXRzIHRoZSB6b29tIG9mIHRoZSB3aW5kb3cuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gWm9vbVJlc2V0KCkge1xyXG4gICAgdGhpc1dpbmRvdy5ab29tUmVzZXQoKTtcclxufVxyXG5cclxuLyoqXHJcbiAqIEdldHMgdGhlIHpvb20gbGV2ZWwgb2YgdGhlIHdpbmRvdy5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBHZXRab29tTGV2ZWwoKSB7XHJcbiAgICByZXR1cm4gdGhpc1dpbmRvdy5HZXRab29tTGV2ZWwoKTtcclxufVxyXG5cclxuLyoqXHJcbiAqIFNldHMgdGhlIHpvb20gbGV2ZWwgb2YgdGhlIHdpbmRvdy5cclxuICogQHBhcmFtIHtudW1iZXJ9IHpvb21MZXZlbCAtIFRoZSB6b29tIGxldmVsIHRvIHNldC5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBTZXRab29tTGV2ZWwoem9vbUxldmVsKSB7XHJcbiAgICB0aGlzV2luZG93LlNldFpvb21MZXZlbCh6b29tTGV2ZWwpO1xyXG59XHJcbiIsICJcclxuaW1wb3J0IHtFbWl0LCBXYWlsc0V2ZW50fSBmcm9tIFwiLi9ldmVudHNcIjtcclxuaW1wb3J0IHtRdWVzdGlvbn0gZnJvbSBcIi4vZGlhbG9nc1wiO1xyXG5pbXBvcnQge0dldH0gZnJvbSBcIi4vd2luZG93XCI7XHJcbmltcG9ydCB7T3BlblVSTH0gZnJvbSBcIi4vYnJvd3NlclwiO1xyXG5pbXBvcnQge2RlYnVnTG9nfSBmcm9tIFwiLi9sb2dcIjtcclxuXHJcbi8qKlxyXG4gKiBTZW5kcyBhbiBldmVudCB3aXRoIHRoZSBnaXZlbiBuYW1lIGFuZCBvcHRpb25hbCBkYXRhLlxyXG4gKlxyXG4gKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGV2ZW50IHRvIHNlbmQuXHJcbiAqIEBwYXJhbSB7YW55fSBbZGF0YT1udWxsXSAtIE9wdGlvbmFsIGRhdGEgdG8gc2VuZCBhbG9uZyB3aXRoIHRoZSBldmVudC5cclxuICpcclxuICogQHJldHVybiB7dm9pZH1cclxuICovXHJcbmZ1bmN0aW9uIHNlbmRFdmVudChldmVudE5hbWUsIGRhdGE9bnVsbCkge1xyXG4gICAgbGV0IGV2ZW50ID0gbmV3IFdhaWxzRXZlbnQoZXZlbnROYW1lLCBkYXRhKTtcclxuICAgIEVtaXQoZXZlbnQpO1xyXG59XHJcblxyXG4vKipcclxuICogQWRkcyBldmVudCBsaXN0ZW5lcnMgdG8gZWxlbWVudHMgd2l0aCBgd21sLWV2ZW50YCBhdHRyaWJ1dGUuXHJcbiAqXHJcbiAqIEByZXR1cm4ge3ZvaWR9XHJcbiAqL1xyXG5mdW5jdGlvbiBhZGRXTUxFdmVudExpc3RlbmVycygpIHtcclxuICAgIGNvbnN0IGVsZW1lbnRzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW3dtbC1ldmVudF0nKTtcclxuICAgIGVsZW1lbnRzLmZvckVhY2goZnVuY3Rpb24gKGVsZW1lbnQpIHtcclxuICAgICAgICBjb25zdCBldmVudFR5cGUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgnd21sLWV2ZW50Jyk7XHJcbiAgICAgICAgY29uc3QgY29uZmlybSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCd3bWwtY29uZmlybScpO1xyXG4gICAgICAgIGNvbnN0IHRyaWdnZXIgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgnd21sLXRyaWdnZXInKSB8fCBcImNsaWNrXCI7XHJcblxyXG4gICAgICAgIGxldCBjYWxsYmFjayA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgaWYgKGNvbmZpcm0pIHtcclxuICAgICAgICAgICAgICAgIFF1ZXN0aW9uKHtUaXRsZTogXCJDb25maXJtXCIsIE1lc3NhZ2U6Y29uZmlybSwgRGV0YWNoZWQ6IGZhbHNlLCBCdXR0b25zOlt7TGFiZWw6XCJZZXNcIn0se0xhYmVsOlwiTm9cIiwgSXNEZWZhdWx0OnRydWV9XX0pLnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgIT09IFwiTm9cIikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZW5kRXZlbnQoZXZlbnRUeXBlKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBzZW5kRXZlbnQoZXZlbnRUeXBlKTtcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICAvLyBSZW1vdmUgZXhpc3RpbmcgbGlzdGVuZXJzXHJcbiAgICAgICAgZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKHRyaWdnZXIsIGNhbGxiYWNrKTtcclxuXHJcbiAgICAgICAgLy8gQWRkIG5ldyBsaXN0ZW5lclxyXG4gICAgICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcih0cmlnZ2VyLCBjYWxsYmFjayk7XHJcbiAgICB9KTtcclxufVxyXG5cclxuXHJcbi8qKlxyXG4gKiBDYWxscyBhIG1ldGhvZCBvbiBhIHNwZWNpZmllZCB3aW5kb3cuXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSB3aW5kb3dOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHdpbmRvdyB0byBjYWxsIHRoZSBtZXRob2Qgb24uXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSBtZXRob2QgLSBUaGUgbmFtZSBvZiB0aGUgbWV0aG9kIHRvIGNhbGwuXHJcbiAqL1xyXG5mdW5jdGlvbiBjYWxsV2luZG93TWV0aG9kKHdpbmRvd05hbWUsIG1ldGhvZCkge1xyXG4gICAgbGV0IHRhcmdldFdpbmRvdyA9IEdldCh3aW5kb3dOYW1lKTtcclxuICAgIGxldCBtZXRob2RNYXAgPSBXaW5kb3dNZXRob2RzKHRhcmdldFdpbmRvdyk7XHJcbiAgICBpZiAoIW1ldGhvZE1hcC5oYXMobWV0aG9kKSkge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKFwiV2luZG93IG1ldGhvZCBcIiArIG1ldGhvZCArIFwiIG5vdCBmb3VuZFwiKTtcclxuICAgIH1cclxuICAgIHRyeSB7XHJcbiAgICAgICAgbWV0aG9kTWFwLmdldChtZXRob2QpKCk7XHJcbiAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcihcIkVycm9yIGNhbGxpbmcgd2luZG93IG1ldGhvZCAnXCIgKyBtZXRob2QgKyBcIic6IFwiICsgZSk7XHJcbiAgICB9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBBZGRzIHdpbmRvdyBsaXN0ZW5lcnMgZm9yIGVsZW1lbnRzIHdpdGggdGhlICd3bWwtd2luZG93JyBhdHRyaWJ1dGUuXHJcbiAqIFJlbW92ZXMgYW55IGV4aXN0aW5nIGxpc3RlbmVycyBiZWZvcmUgYWRkaW5nIG5ldyBvbmVzLlxyXG4gKlxyXG4gKiBAcmV0dXJuIHt2b2lkfVxyXG4gKi9cclxuZnVuY3Rpb24gYWRkV01MV2luZG93TGlzdGVuZXJzKCkge1xyXG4gICAgY29uc3QgZWxlbWVudHMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdbd21sLXdpbmRvd10nKTtcclxuICAgIGVsZW1lbnRzLmZvckVhY2goZnVuY3Rpb24gKGVsZW1lbnQpIHtcclxuICAgICAgICBjb25zdCB3aW5kb3dNZXRob2QgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgnd21sLXdpbmRvdycpO1xyXG4gICAgICAgIGNvbnN0IGNvbmZpcm0gPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgnd21sLWNvbmZpcm0nKTtcclxuICAgICAgICBjb25zdCB0cmlnZ2VyID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ3dtbC10cmlnZ2VyJykgfHwgJ2NsaWNrJztcclxuICAgICAgICBjb25zdCB0YXJnZXRXaW5kb3cgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgnd21sLXRhcmdldC13aW5kb3cnKSB8fCAnJztcclxuXHJcbiAgICAgICAgbGV0IGNhbGxiYWNrID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBpZiAoY29uZmlybSkge1xyXG4gICAgICAgICAgICAgICAgUXVlc3Rpb24oe1RpdGxlOiBcIkNvbmZpcm1cIiwgTWVzc2FnZTpjb25maXJtLCBCdXR0b25zOlt7TGFiZWw6XCJZZXNcIn0se0xhYmVsOlwiTm9cIiwgSXNEZWZhdWx0OnRydWV9XX0pLnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgIT09IFwiTm9cIikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjYWxsV2luZG93TWV0aG9kKHRhcmdldFdpbmRvdywgd2luZG93TWV0aG9kKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYWxsV2luZG93TWV0aG9kKHRhcmdldFdpbmRvdywgd2luZG93TWV0aG9kKTtcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICAvLyBSZW1vdmUgZXhpc3RpbmcgbGlzdGVuZXJzXHJcbiAgICAgICAgZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKHRyaWdnZXIsIGNhbGxiYWNrKTtcclxuXHJcbiAgICAgICAgLy8gQWRkIG5ldyBsaXN0ZW5lclxyXG4gICAgICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcih0cmlnZ2VyLCBjYWxsYmFjayk7XHJcbiAgICB9KTtcclxufVxyXG5cclxuLyoqXHJcbiAqIEFkZHMgYSBsaXN0ZW5lciB0byBlbGVtZW50cyB3aXRoIHRoZSAnd21sLW9wZW51cmwnIGF0dHJpYnV0ZS5cclxuICogV2hlbiB0aGUgc3BlY2lmaWVkIHRyaWdnZXIgZXZlbnQgaXMgZmlyZWQgb24gYW55IG9mIHRoZXNlIGVsZW1lbnRzLFxyXG4gKiB0aGUgbGlzdGVuZXIgd2lsbCBvcGVuIHRoZSBVUkwgc3BlY2lmaWVkIGJ5IHRoZSAnd21sLW9wZW51cmwnIGF0dHJpYnV0ZS5cclxuICogSWYgYSAnd21sLWNvbmZpcm0nIGF0dHJpYnV0ZSBpcyBwcm92aWRlZCwgYSBjb25maXJtYXRpb24gZGlhbG9nIHdpbGwgYmUgZGlzcGxheWVkLFxyXG4gKiBhbmQgdGhlIFVSTCB3aWxsIG9ubHkgYmUgb3BlbmVkIGlmIHRoZSB1c2VyIGNvbmZpcm1zLlxyXG4gKlxyXG4gKiBAcmV0dXJuIHt2b2lkfVxyXG4gKi9cclxuZnVuY3Rpb24gYWRkV01MT3BlbkJyb3dzZXJMaXN0ZW5lcigpIHtcclxuICAgIGNvbnN0IGVsZW1lbnRzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW3dtbC1vcGVudXJsXScpO1xyXG4gICAgZWxlbWVudHMuZm9yRWFjaChmdW5jdGlvbiAoZWxlbWVudCkge1xyXG4gICAgICAgIGNvbnN0IHVybCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCd3bWwtb3BlbnVybCcpO1xyXG4gICAgICAgIGNvbnN0IGNvbmZpcm0gPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgnd21sLWNvbmZpcm0nKTtcclxuICAgICAgICBjb25zdCB0cmlnZ2VyID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ3dtbC10cmlnZ2VyJykgfHwgXCJjbGlja1wiO1xyXG5cclxuICAgICAgICBsZXQgY2FsbGJhY2sgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGlmIChjb25maXJtKSB7XHJcbiAgICAgICAgICAgICAgICBRdWVzdGlvbih7VGl0bGU6IFwiQ29uZmlybVwiLCBNZXNzYWdlOmNvbmZpcm0sIEJ1dHRvbnM6W3tMYWJlbDpcIlllc1wifSx7TGFiZWw6XCJOb1wiLCBJc0RlZmF1bHQ6dHJ1ZX1dfSkudGhlbihmdW5jdGlvbiAocmVzdWx0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCAhPT0gXCJOb1wiKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgT3BlblVSTCh1cmwpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHZvaWQgT3BlblVSTCh1cmwpO1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIC8vIFJlbW92ZSBleGlzdGluZyBsaXN0ZW5lcnNcclxuICAgICAgICBlbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIodHJpZ2dlciwgY2FsbGJhY2spO1xyXG5cclxuICAgICAgICAvLyBBZGQgbmV3IGxpc3RlbmVyXHJcbiAgICAgICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKHRyaWdnZXIsIGNhbGxiYWNrKTtcclxuICAgIH0pO1xyXG59XHJcblxyXG4vKipcclxuICogUmVsb2FkcyB0aGUgV01MIHBhZ2UgYnkgYWRkaW5nIG5lY2Vzc2FyeSBldmVudCBsaXN0ZW5lcnMgYW5kIGJyb3dzZXIgbGlzdGVuZXJzLlxyXG4gKlxyXG4gKiBAcmV0dXJuIHt2b2lkfVxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIFJlbG9hZCgpIHtcclxuICAgIGlmKERFQlVHKSB7XHJcbiAgICAgICAgZGVidWdMb2coXCJSZWxvYWRpbmcgV01MXCIpO1xyXG4gICAgfVxyXG4gICAgYWRkV01MRXZlbnRMaXN0ZW5lcnMoKTtcclxuICAgIGFkZFdNTFdpbmRvd0xpc3RlbmVycygpO1xyXG4gICAgYWRkV01MT3BlbkJyb3dzZXJMaXN0ZW5lcigpO1xyXG59XHJcblxyXG4vKipcclxuICogUmV0dXJucyBhIG1hcCBvZiBhbGwgbWV0aG9kcyBpbiB0aGUgY3VycmVudCB3aW5kb3cuXHJcbiAqIEByZXR1cm5zIHtNYXB9IC0gQSBtYXAgb2Ygd2luZG93IG1ldGhvZHMuXHJcbiAqL1xyXG5mdW5jdGlvbiBXaW5kb3dNZXRob2RzKHRhcmdldFdpbmRvdykge1xyXG4gICAgLy8gQ3JlYXRlIGEgbmV3IG1hcCB0byBzdG9yZSBtZXRob2RzXHJcbiAgICBsZXQgcmVzdWx0ID0gbmV3IE1hcCgpO1xyXG5cclxuICAgIC8vIEl0ZXJhdGUgb3ZlciBhbGwgcHJvcGVydGllcyBvZiB0aGUgd2luZG93IG9iamVjdFxyXG4gICAgZm9yIChsZXQgbWV0aG9kIGluIHRhcmdldFdpbmRvdykge1xyXG4gICAgICAgIC8vIENoZWNrIGlmIHRoZSBwcm9wZXJ0eSBpcyBpbmRlZWQgYSBtZXRob2QgKGZ1bmN0aW9uKVxyXG4gICAgICAgIGlmKHR5cGVvZiB0YXJnZXRXaW5kb3dbbWV0aG9kXSA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICAvLyBBZGQgdGhlIG1ldGhvZCB0byB0aGUgbWFwXHJcbiAgICAgICAgICAgIHJlc3VsdC5zZXQobWV0aG9kLCB0YXJnZXRXaW5kb3dbbWV0aG9kXSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH1cclxuICAgIC8vIFJldHVybiB0aGUgbWFwIG9mIHdpbmRvdyBtZXRob2RzXHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG59IiwgIi8qXHJcbiBfXHQgICBfX1x0ICBfIF9fXHJcbnwgfFx0IC8gL19fXyBfKF8pIC9fX19fXHJcbnwgfCAvfCAvIC8gX18gYC8gLyAvIF9fXy9cclxufCB8LyB8LyAvIC9fLyAvIC8gKF9fICApXHJcbnxfXy98X18vXFxfXyxfL18vXy9fX19fL1xyXG5UaGUgZWxlY3Ryb24gYWx0ZXJuYXRpdmUgZm9yIEdvXHJcbihjKSBMZWEgQW50aG9ueSAyMDE5LXByZXNlbnRcclxuKi9cclxuXHJcbi8qIGpzaGludCBlc3ZlcnNpb246IDkgKi9cclxuXHJcbi8qKlxyXG4gKiBAdHlwZWRlZiB7aW1wb3J0KFwiLi90eXBlc1wiKS5XYWlsc0V2ZW50fSBXYWlsc0V2ZW50XHJcbiAqL1xyXG5pbXBvcnQge25ld1J1bnRpbWVDYWxsZXJXaXRoSUQsIG9iamVjdE5hbWVzfSBmcm9tIFwiLi9ydW50aW1lXCI7XHJcblxyXG5pbXBvcnQge0V2ZW50VHlwZXN9IGZyb20gXCIuL2V2ZW50X3R5cGVzXCI7XHJcbmV4cG9ydCBjb25zdCBUeXBlcyA9IEV2ZW50VHlwZXM7XHJcblxyXG4vLyBTZXR1cFxyXG53aW5kb3cuX3dhaWxzID0gd2luZG93Ll93YWlscyB8fCB7fTtcclxud2luZG93Ll93YWlscy5kaXNwYXRjaFdhaWxzRXZlbnQgPSBkaXNwYXRjaFdhaWxzRXZlbnQ7XHJcblxyXG5jb25zdCBjYWxsID0gbmV3UnVudGltZUNhbGxlcldpdGhJRChvYmplY3ROYW1lcy5FdmVudHMsICcnKTtcclxuY29uc3QgRW1pdE1ldGhvZCA9IDA7XHJcbmNvbnN0IGV2ZW50TGlzdGVuZXJzID0gbmV3IE1hcCgpO1xyXG5cclxuY2xhc3MgTGlzdGVuZXIge1xyXG4gICAgY29uc3RydWN0b3IoZXZlbnROYW1lLCBjYWxsYmFjaywgbWF4Q2FsbGJhY2tzKSB7XHJcbiAgICAgICAgdGhpcy5ldmVudE5hbWUgPSBldmVudE5hbWU7XHJcbiAgICAgICAgdGhpcy5tYXhDYWxsYmFja3MgPSBtYXhDYWxsYmFja3MgfHwgLTE7XHJcbiAgICAgICAgdGhpcy5DYWxsYmFjayA9IChkYXRhKSA9PiB7XHJcbiAgICAgICAgICAgIGNhbGxiYWNrKGRhdGEpO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5tYXhDYWxsYmFja3MgPT09IC0xKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgIHRoaXMubWF4Q2FsbGJhY2tzIC09IDE7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm1heENhbGxiYWNrcyA9PT0gMDtcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgV2FpbHNFdmVudCB7XHJcbiAgICBjb25zdHJ1Y3RvcihuYW1lLCBkYXRhID0gbnVsbCkge1xyXG4gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7XHJcbiAgICAgICAgdGhpcy5kYXRhID0gZGF0YTtcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHNldHVwKCkge1xyXG59XHJcblxyXG5mdW5jdGlvbiBkaXNwYXRjaFdhaWxzRXZlbnQoZXZlbnQpIHtcclxuICAgIGxldCBsaXN0ZW5lcnMgPSBldmVudExpc3RlbmVycy5nZXQoZXZlbnQubmFtZSk7XHJcbiAgICBpZiAobGlzdGVuZXJzKSB7XHJcbiAgICAgICAgbGV0IHRvUmVtb3ZlID0gbGlzdGVuZXJzLmZpbHRlcihsaXN0ZW5lciA9PiB7XHJcbiAgICAgICAgICAgIGxldCByZW1vdmUgPSBsaXN0ZW5lci5DYWxsYmFjayhldmVudCk7XHJcbiAgICAgICAgICAgIGlmIChyZW1vdmUpIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGlmICh0b1JlbW92ZS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIGxpc3RlbmVycyA9IGxpc3RlbmVycy5maWx0ZXIobCA9PiAhdG9SZW1vdmUuaW5jbHVkZXMobCkpO1xyXG4gICAgICAgICAgICBpZiAobGlzdGVuZXJzLmxlbmd0aCA9PT0gMCkgZXZlbnRMaXN0ZW5lcnMuZGVsZXRlKGV2ZW50Lm5hbWUpO1xyXG4gICAgICAgICAgICBlbHNlIGV2ZW50TGlzdGVuZXJzLnNldChldmVudC5uYW1lLCBsaXN0ZW5lcnMpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIFJlZ2lzdGVyIGEgY2FsbGJhY2sgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzIGZvciBhIHNwZWNpZmljIGV2ZW50LlxyXG4gKlxyXG4gKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGV2ZW50IHRvIHJlZ2lzdGVyIHRoZSBjYWxsYmFjayBmb3IuXHJcbiAqIEBwYXJhbSB7ZnVuY3Rpb259IGNhbGxiYWNrIC0gVGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCB3aGVuIHRoZSBldmVudCBpcyB0cmlnZ2VyZWQuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBtYXhDYWxsYmFja3MgLSBUaGUgbWF4aW11bSBudW1iZXIgb2YgdGltZXMgdGhlIGNhbGxiYWNrIGNhbiBiZSBjYWxsZWQgZm9yIHRoZSBldmVudC4gT25jZSB0aGUgbWF4aW11bSBudW1iZXIgaXMgcmVhY2hlZCwgdGhlIGNhbGxiYWNrIHdpbGwgbm8gbG9uZ2VyIGJlIGNhbGxlZC5cclxuICpcclxuIEByZXR1cm4ge2Z1bmN0aW9ufSAtIEEgZnVuY3Rpb24gdGhhdCwgd2hlbiBjYWxsZWQsIHdpbGwgdW5yZWdpc3RlciB0aGUgY2FsbGJhY2sgZnJvbSB0aGUgZXZlbnQuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gT25NdWx0aXBsZShldmVudE5hbWUsIGNhbGxiYWNrLCBtYXhDYWxsYmFja3MpIHtcclxuICAgIGxldCBsaXN0ZW5lcnMgPSBldmVudExpc3RlbmVycy5nZXQoZXZlbnROYW1lKSB8fCBbXTtcclxuICAgIGNvbnN0IHRoaXNMaXN0ZW5lciA9IG5ldyBMaXN0ZW5lcihldmVudE5hbWUsIGNhbGxiYWNrLCBtYXhDYWxsYmFja3MpO1xyXG4gICAgbGlzdGVuZXJzLnB1c2godGhpc0xpc3RlbmVyKTtcclxuICAgIGV2ZW50TGlzdGVuZXJzLnNldChldmVudE5hbWUsIGxpc3RlbmVycyk7XHJcbiAgICByZXR1cm4gKCkgPT4gbGlzdGVuZXJPZmYodGhpc0xpc3RlbmVyKTtcclxufVxyXG5cclxuLyoqXHJcbiAqIFJlZ2lzdGVycyBhIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGJlIGV4ZWN1dGVkIHdoZW4gdGhlIHNwZWNpZmllZCBldmVudCBvY2N1cnMuXHJcbiAqXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSBldmVudE5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgZXZlbnQuXHJcbiAqIEBwYXJhbSB7ZnVuY3Rpb259IGNhbGxiYWNrIC0gVGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGJlIGV4ZWN1dGVkLiBJdCB0YWtlcyBubyBwYXJhbWV0ZXJzLlxyXG4gKiBAcmV0dXJuIHtmdW5jdGlvbn0gLSBBIGZ1bmN0aW9uIHRoYXQsIHdoZW4gY2FsbGVkLCB3aWxsIHVucmVnaXN0ZXIgdGhlIGNhbGxiYWNrIGZyb20gdGhlIGV2ZW50LiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gT24oZXZlbnROYW1lLCBjYWxsYmFjaykgeyByZXR1cm4gT25NdWx0aXBsZShldmVudE5hbWUsIGNhbGxiYWNrLCAtMSk7IH1cclxuXHJcbi8qKlxyXG4gKiBSZWdpc3RlcnMgYSBjYWxsYmFjayBmdW5jdGlvbiB0byBiZSBleGVjdXRlZCBvbmx5IG9uY2UgZm9yIHRoZSBzcGVjaWZpZWQgZXZlbnQuXHJcbiAqXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSBldmVudE5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgZXZlbnQuXHJcbiAqIEBwYXJhbSB7ZnVuY3Rpb259IGNhbGxiYWNrIC0gVGhlIGZ1bmN0aW9uIHRvIGJlIGV4ZWN1dGVkIHdoZW4gdGhlIGV2ZW50IG9jY3Vycy5cclxuICogQHJldHVybiB7ZnVuY3Rpb259IC0gQSBmdW5jdGlvbiB0aGF0LCB3aGVuIGNhbGxlZCwgd2lsbCB1bnJlZ2lzdGVyIHRoZSBjYWxsYmFjayBmcm9tIHRoZSBldmVudC5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBPbmNlKGV2ZW50TmFtZSwgY2FsbGJhY2spIHsgcmV0dXJuIE9uTXVsdGlwbGUoZXZlbnROYW1lLCBjYWxsYmFjaywgMSk7IH1cclxuXHJcbi8qKlxyXG4gKiBSZW1vdmVzIHRoZSBzcGVjaWZpZWQgbGlzdGVuZXIgZnJvbSB0aGUgZXZlbnQgbGlzdGVuZXJzIGNvbGxlY3Rpb24uXHJcbiAqIElmIGFsbCBsaXN0ZW5lcnMgZm9yIHRoZSBldmVudCBhcmUgcmVtb3ZlZCwgdGhlIGV2ZW50IGtleSBpcyBkZWxldGVkIGZyb20gdGhlIGNvbGxlY3Rpb24uXHJcbiAqXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBsaXN0ZW5lciAtIFRoZSBsaXN0ZW5lciB0byBiZSByZW1vdmVkLlxyXG4gKi9cclxuZnVuY3Rpb24gbGlzdGVuZXJPZmYobGlzdGVuZXIpIHtcclxuICAgIGNvbnN0IGV2ZW50TmFtZSA9IGxpc3RlbmVyLmV2ZW50TmFtZTtcclxuICAgIGxldCBsaXN0ZW5lcnMgPSBldmVudExpc3RlbmVycy5nZXQoZXZlbnROYW1lKS5maWx0ZXIobCA9PiBsICE9PSBsaXN0ZW5lcik7XHJcbiAgICBpZiAobGlzdGVuZXJzLmxlbmd0aCA9PT0gMCkgZXZlbnRMaXN0ZW5lcnMuZGVsZXRlKGV2ZW50TmFtZSk7XHJcbiAgICBlbHNlIGV2ZW50TGlzdGVuZXJzLnNldChldmVudE5hbWUsIGxpc3RlbmVycyk7XHJcbn1cclxuXHJcblxyXG4vKipcclxuICogUmVtb3ZlcyBldmVudCBsaXN0ZW5lcnMgZm9yIHRoZSBzcGVjaWZpZWQgZXZlbnQgbmFtZXMuXHJcbiAqXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSBldmVudE5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgZXZlbnQgdG8gcmVtb3ZlIGxpc3RlbmVycyBmb3IuXHJcbiAqIEBwYXJhbSB7Li4uc3RyaW5nfSBhZGRpdGlvbmFsRXZlbnROYW1lcyAtIEFkZGl0aW9uYWwgZXZlbnQgbmFtZXMgdG8gcmVtb3ZlIGxpc3RlbmVycyBmb3IuXHJcbiAqIEByZXR1cm4ge3VuZGVmaW5lZH1cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBPZmYoZXZlbnROYW1lLCAuLi5hZGRpdGlvbmFsRXZlbnROYW1lcykge1xyXG4gICAgbGV0IGV2ZW50c1RvUmVtb3ZlID0gW2V2ZW50TmFtZSwgLi4uYWRkaXRpb25hbEV2ZW50TmFtZXNdO1xyXG4gICAgZXZlbnRzVG9SZW1vdmUuZm9yRWFjaChldmVudE5hbWUgPT4gZXZlbnRMaXN0ZW5lcnMuZGVsZXRlKGV2ZW50TmFtZSkpO1xyXG59XHJcbi8qKlxyXG4gKiBSZW1vdmVzIGFsbCBldmVudCBsaXN0ZW5lcnMuXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBPZmZBbGxcclxuICogQHJldHVybnMge3ZvaWR9XHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gT2ZmQWxsKCkgeyBldmVudExpc3RlbmVycy5jbGVhcigpOyB9XHJcblxyXG4vKipcclxuICogRW1pdHMgYW4gZXZlbnQgdXNpbmcgdGhlIGdpdmVuIGV2ZW50IG5hbWUuXHJcbiAqXHJcbiAqIEBwYXJhbSB7V2FpbHNFdmVudH0gZXZlbnQgLSBUaGUgbmFtZSBvZiB0aGUgZXZlbnQgdG8gZW1pdC5cclxuICogQHJldHVybnMge2FueX0gLSBUaGUgcmVzdWx0IG9mIHRoZSBlbWl0dGVkIGV2ZW50LlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIEVtaXQoZXZlbnQpIHsgcmV0dXJuIGNhbGwoRW1pdE1ldGhvZCwgZXZlbnQpOyB9XHJcbiIsICJcbmV4cG9ydCBjb25zdCBFdmVudFR5cGVzID0ge1xuXHRXaW5kb3dzOiB7XG5cdFx0U3lzdGVtVGhlbWVDaGFuZ2VkOiBcIndpbmRvd3M6U3lzdGVtVGhlbWVDaGFuZ2VkXCIsXG5cdFx0QVBNUG93ZXJTdGF0dXNDaGFuZ2U6IFwid2luZG93czpBUE1Qb3dlclN0YXR1c0NoYW5nZVwiLFxuXHRcdEFQTVN1c3BlbmQ6IFwid2luZG93czpBUE1TdXNwZW5kXCIsXG5cdFx0QVBNUmVzdW1lQXV0b21hdGljOiBcIndpbmRvd3M6QVBNUmVzdW1lQXV0b21hdGljXCIsXG5cdFx0QVBNUmVzdW1lU3VzcGVuZDogXCJ3aW5kb3dzOkFQTVJlc3VtZVN1c3BlbmRcIixcblx0XHRBUE1Qb3dlclNldHRpbmdDaGFuZ2U6IFwid2luZG93czpBUE1Qb3dlclNldHRpbmdDaGFuZ2VcIixcblx0XHRBcHBsaWNhdGlvblN0YXJ0ZWQ6IFwid2luZG93czpBcHBsaWNhdGlvblN0YXJ0ZWRcIixcblx0XHRXZWJWaWV3TmF2aWdhdGlvbkNvbXBsZXRlZDogXCJ3aW5kb3dzOldlYlZpZXdOYXZpZ2F0aW9uQ29tcGxldGVkXCIsXG5cdFx0V2luZG93SW5hY3RpdmU6IFwid2luZG93czpXaW5kb3dJbmFjdGl2ZVwiLFxuXHRcdFdpbmRvd0FjdGl2ZTogXCJ3aW5kb3dzOldpbmRvd0FjdGl2ZVwiLFxuXHRcdFdpbmRvd0NsaWNrQWN0aXZlOiBcIndpbmRvd3M6V2luZG93Q2xpY2tBY3RpdmVcIixcblx0XHRXaW5kb3dNYXhpbWlzZTogXCJ3aW5kb3dzOldpbmRvd01heGltaXNlXCIsXG5cdFx0V2luZG93VW5NYXhpbWlzZTogXCJ3aW5kb3dzOldpbmRvd1VuTWF4aW1pc2VcIixcblx0XHRXaW5kb3dGdWxsc2NyZWVuOiBcIndpbmRvd3M6V2luZG93RnVsbHNjcmVlblwiLFxuXHRcdFdpbmRvd1VuRnVsbHNjcmVlbjogXCJ3aW5kb3dzOldpbmRvd1VuRnVsbHNjcmVlblwiLFxuXHRcdFdpbmRvd1Jlc3RvcmU6IFwid2luZG93czpXaW5kb3dSZXN0b3JlXCIsXG5cdFx0V2luZG93TWluaW1pc2U6IFwid2luZG93czpXaW5kb3dNaW5pbWlzZVwiLFxuXHRcdFdpbmRvd1VuTWluaW1pc2U6IFwid2luZG93czpXaW5kb3dVbk1pbmltaXNlXCIsXG5cdFx0V2luZG93Q2xvc2U6IFwid2luZG93czpXaW5kb3dDbG9zZVwiLFxuXHRcdFdpbmRvd1NldEZvY3VzOiBcIndpbmRvd3M6V2luZG93U2V0Rm9jdXNcIixcblx0XHRXaW5kb3dLaWxsRm9jdXM6IFwid2luZG93czpXaW5kb3dLaWxsRm9jdXNcIixcblx0XHRXaW5kb3dEcmFnRHJvcDogXCJ3aW5kb3dzOldpbmRvd0RyYWdEcm9wXCIsXG5cdFx0V2luZG93RHJhZ0VudGVyOiBcIndpbmRvd3M6V2luZG93RHJhZ0VudGVyXCIsXG5cdFx0V2luZG93RHJhZ0xlYXZlOiBcIndpbmRvd3M6V2luZG93RHJhZ0xlYXZlXCIsXG5cdFx0V2luZG93RHJhZ092ZXI6IFwid2luZG93czpXaW5kb3dEcmFnT3ZlclwiLFxuXHR9LFxuXHRNYWM6IHtcblx0XHRBcHBsaWNhdGlvbkRpZEJlY29tZUFjdGl2ZTogXCJtYWM6QXBwbGljYXRpb25EaWRCZWNvbWVBY3RpdmVcIixcblx0XHRBcHBsaWNhdGlvbkRpZENoYW5nZUJhY2tpbmdQcm9wZXJ0aWVzOiBcIm1hYzpBcHBsaWNhdGlvbkRpZENoYW5nZUJhY2tpbmdQcm9wZXJ0aWVzXCIsXG5cdFx0QXBwbGljYXRpb25EaWRDaGFuZ2VFZmZlY3RpdmVBcHBlYXJhbmNlOiBcIm1hYzpBcHBsaWNhdGlvbkRpZENoYW5nZUVmZmVjdGl2ZUFwcGVhcmFuY2VcIixcblx0XHRBcHBsaWNhdGlvbkRpZENoYW5nZUljb246IFwibWFjOkFwcGxpY2F0aW9uRGlkQ2hhbmdlSWNvblwiLFxuXHRcdEFwcGxpY2F0aW9uRGlkQ2hhbmdlT2NjbHVzaW9uU3RhdGU6IFwibWFjOkFwcGxpY2F0aW9uRGlkQ2hhbmdlT2NjbHVzaW9uU3RhdGVcIixcblx0XHRBcHBsaWNhdGlvbkRpZENoYW5nZVNjcmVlblBhcmFtZXRlcnM6IFwibWFjOkFwcGxpY2F0aW9uRGlkQ2hhbmdlU2NyZWVuUGFyYW1ldGVyc1wiLFxuXHRcdEFwcGxpY2F0aW9uRGlkQ2hhbmdlU3RhdHVzQmFyRnJhbWU6IFwibWFjOkFwcGxpY2F0aW9uRGlkQ2hhbmdlU3RhdHVzQmFyRnJhbWVcIixcblx0XHRBcHBsaWNhdGlvbkRpZENoYW5nZVN0YXR1c0Jhck9yaWVudGF0aW9uOiBcIm1hYzpBcHBsaWNhdGlvbkRpZENoYW5nZVN0YXR1c0Jhck9yaWVudGF0aW9uXCIsXG5cdFx0QXBwbGljYXRpb25EaWRGaW5pc2hMYXVuY2hpbmc6IFwibWFjOkFwcGxpY2F0aW9uRGlkRmluaXNoTGF1bmNoaW5nXCIsXG5cdFx0QXBwbGljYXRpb25EaWRIaWRlOiBcIm1hYzpBcHBsaWNhdGlvbkRpZEhpZGVcIixcblx0XHRBcHBsaWNhdGlvbkRpZFJlc2lnbkFjdGl2ZU5vdGlmaWNhdGlvbjogXCJtYWM6QXBwbGljYXRpb25EaWRSZXNpZ25BY3RpdmVOb3RpZmljYXRpb25cIixcblx0XHRBcHBsaWNhdGlvbkRpZFVuaGlkZTogXCJtYWM6QXBwbGljYXRpb25EaWRVbmhpZGVcIixcblx0XHRBcHBsaWNhdGlvbkRpZFVwZGF0ZTogXCJtYWM6QXBwbGljYXRpb25EaWRVcGRhdGVcIixcblx0XHRBcHBsaWNhdGlvbldpbGxCZWNvbWVBY3RpdmU6IFwibWFjOkFwcGxpY2F0aW9uV2lsbEJlY29tZUFjdGl2ZVwiLFxuXHRcdEFwcGxpY2F0aW9uV2lsbEZpbmlzaExhdW5jaGluZzogXCJtYWM6QXBwbGljYXRpb25XaWxsRmluaXNoTGF1bmNoaW5nXCIsXG5cdFx0QXBwbGljYXRpb25XaWxsSGlkZTogXCJtYWM6QXBwbGljYXRpb25XaWxsSGlkZVwiLFxuXHRcdEFwcGxpY2F0aW9uV2lsbFJlc2lnbkFjdGl2ZTogXCJtYWM6QXBwbGljYXRpb25XaWxsUmVzaWduQWN0aXZlXCIsXG5cdFx0QXBwbGljYXRpb25XaWxsVGVybWluYXRlOiBcIm1hYzpBcHBsaWNhdGlvbldpbGxUZXJtaW5hdGVcIixcblx0XHRBcHBsaWNhdGlvbldpbGxVbmhpZGU6IFwibWFjOkFwcGxpY2F0aW9uV2lsbFVuaGlkZVwiLFxuXHRcdEFwcGxpY2F0aW9uV2lsbFVwZGF0ZTogXCJtYWM6QXBwbGljYXRpb25XaWxsVXBkYXRlXCIsXG5cdFx0QXBwbGljYXRpb25EaWRDaGFuZ2VUaGVtZTogXCJtYWM6QXBwbGljYXRpb25EaWRDaGFuZ2VUaGVtZSFcIixcblx0XHRBcHBsaWNhdGlvblNob3VsZEhhbmRsZVJlb3BlbjogXCJtYWM6QXBwbGljYXRpb25TaG91bGRIYW5kbGVSZW9wZW4hXCIsXG5cdFx0V2luZG93RGlkQmVjb21lS2V5OiBcIm1hYzpXaW5kb3dEaWRCZWNvbWVLZXlcIixcblx0XHRXaW5kb3dEaWRCZWNvbWVNYWluOiBcIm1hYzpXaW5kb3dEaWRCZWNvbWVNYWluXCIsXG5cdFx0V2luZG93RGlkQmVnaW5TaGVldDogXCJtYWM6V2luZG93RGlkQmVnaW5TaGVldFwiLFxuXHRcdFdpbmRvd0RpZENoYW5nZUFscGhhOiBcIm1hYzpXaW5kb3dEaWRDaGFuZ2VBbHBoYVwiLFxuXHRcdFdpbmRvd0RpZENoYW5nZUJhY2tpbmdMb2NhdGlvbjogXCJtYWM6V2luZG93RGlkQ2hhbmdlQmFja2luZ0xvY2F0aW9uXCIsXG5cdFx0V2luZG93RGlkQ2hhbmdlQmFja2luZ1Byb3BlcnRpZXM6IFwibWFjOldpbmRvd0RpZENoYW5nZUJhY2tpbmdQcm9wZXJ0aWVzXCIsXG5cdFx0V2luZG93RGlkQ2hhbmdlQ29sbGVjdGlvbkJlaGF2aW9yOiBcIm1hYzpXaW5kb3dEaWRDaGFuZ2VDb2xsZWN0aW9uQmVoYXZpb3JcIixcblx0XHRXaW5kb3dEaWRDaGFuZ2VFZmZlY3RpdmVBcHBlYXJhbmNlOiBcIm1hYzpXaW5kb3dEaWRDaGFuZ2VFZmZlY3RpdmVBcHBlYXJhbmNlXCIsXG5cdFx0V2luZG93RGlkQ2hhbmdlT2NjbHVzaW9uU3RhdGU6IFwibWFjOldpbmRvd0RpZENoYW5nZU9jY2x1c2lvblN0YXRlXCIsXG5cdFx0V2luZG93RGlkQ2hhbmdlT3JkZXJpbmdNb2RlOiBcIm1hYzpXaW5kb3dEaWRDaGFuZ2VPcmRlcmluZ01vZGVcIixcblx0XHRXaW5kb3dEaWRDaGFuZ2VTY3JlZW46IFwibWFjOldpbmRvd0RpZENoYW5nZVNjcmVlblwiLFxuXHRcdFdpbmRvd0RpZENoYW5nZVNjcmVlblBhcmFtZXRlcnM6IFwibWFjOldpbmRvd0RpZENoYW5nZVNjcmVlblBhcmFtZXRlcnNcIixcblx0XHRXaW5kb3dEaWRDaGFuZ2VTY3JlZW5Qcm9maWxlOiBcIm1hYzpXaW5kb3dEaWRDaGFuZ2VTY3JlZW5Qcm9maWxlXCIsXG5cdFx0V2luZG93RGlkQ2hhbmdlU2NyZWVuU3BhY2U6IFwibWFjOldpbmRvd0RpZENoYW5nZVNjcmVlblNwYWNlXCIsXG5cdFx0V2luZG93RGlkQ2hhbmdlU2NyZWVuU3BhY2VQcm9wZXJ0aWVzOiBcIm1hYzpXaW5kb3dEaWRDaGFuZ2VTY3JlZW5TcGFjZVByb3BlcnRpZXNcIixcblx0XHRXaW5kb3dEaWRDaGFuZ2VTaGFyaW5nVHlwZTogXCJtYWM6V2luZG93RGlkQ2hhbmdlU2hhcmluZ1R5cGVcIixcblx0XHRXaW5kb3dEaWRDaGFuZ2VTcGFjZTogXCJtYWM6V2luZG93RGlkQ2hhbmdlU3BhY2VcIixcblx0XHRXaW5kb3dEaWRDaGFuZ2VTcGFjZU9yZGVyaW5nTW9kZTogXCJtYWM6V2luZG93RGlkQ2hhbmdlU3BhY2VPcmRlcmluZ01vZGVcIixcblx0XHRXaW5kb3dEaWRDaGFuZ2VUaXRsZTogXCJtYWM6V2luZG93RGlkQ2hhbmdlVGl0bGVcIixcblx0XHRXaW5kb3dEaWRDaGFuZ2VUb29sYmFyOiBcIm1hYzpXaW5kb3dEaWRDaGFuZ2VUb29sYmFyXCIsXG5cdFx0V2luZG93RGlkQ2hhbmdlVmlzaWJpbGl0eTogXCJtYWM6V2luZG93RGlkQ2hhbmdlVmlzaWJpbGl0eVwiLFxuXHRcdFdpbmRvd0RpZERlbWluaWF0dXJpemU6IFwibWFjOldpbmRvd0RpZERlbWluaWF0dXJpemVcIixcblx0XHRXaW5kb3dEaWRFbmRTaGVldDogXCJtYWM6V2luZG93RGlkRW5kU2hlZXRcIixcblx0XHRXaW5kb3dEaWRFbnRlckZ1bGxTY3JlZW46IFwibWFjOldpbmRvd0RpZEVudGVyRnVsbFNjcmVlblwiLFxuXHRcdFdpbmRvd0RpZEVudGVyVmVyc2lvbkJyb3dzZXI6IFwibWFjOldpbmRvd0RpZEVudGVyVmVyc2lvbkJyb3dzZXJcIixcblx0XHRXaW5kb3dEaWRFeGl0RnVsbFNjcmVlbjogXCJtYWM6V2luZG93RGlkRXhpdEZ1bGxTY3JlZW5cIixcblx0XHRXaW5kb3dEaWRFeGl0VmVyc2lvbkJyb3dzZXI6IFwibWFjOldpbmRvd0RpZEV4aXRWZXJzaW9uQnJvd3NlclwiLFxuXHRcdFdpbmRvd0RpZEV4cG9zZTogXCJtYWM6V2luZG93RGlkRXhwb3NlXCIsXG5cdFx0V2luZG93RGlkRm9jdXM6IFwibWFjOldpbmRvd0RpZEZvY3VzXCIsXG5cdFx0V2luZG93RGlkTWluaWF0dXJpemU6IFwibWFjOldpbmRvd0RpZE1pbmlhdHVyaXplXCIsXG5cdFx0V2luZG93RGlkTW92ZTogXCJtYWM6V2luZG93RGlkTW92ZVwiLFxuXHRcdFdpbmRvd0RpZE9yZGVyT2ZmU2NyZWVuOiBcIm1hYzpXaW5kb3dEaWRPcmRlck9mZlNjcmVlblwiLFxuXHRcdFdpbmRvd0RpZE9yZGVyT25TY3JlZW46IFwibWFjOldpbmRvd0RpZE9yZGVyT25TY3JlZW5cIixcblx0XHRXaW5kb3dEaWRSZXNpZ25LZXk6IFwibWFjOldpbmRvd0RpZFJlc2lnbktleVwiLFxuXHRcdFdpbmRvd0RpZFJlc2lnbk1haW46IFwibWFjOldpbmRvd0RpZFJlc2lnbk1haW5cIixcblx0XHRXaW5kb3dEaWRSZXNpemU6IFwibWFjOldpbmRvd0RpZFJlc2l6ZVwiLFxuXHRcdFdpbmRvd0RpZFVwZGF0ZTogXCJtYWM6V2luZG93RGlkVXBkYXRlXCIsXG5cdFx0V2luZG93RGlkVXBkYXRlQWxwaGE6IFwibWFjOldpbmRvd0RpZFVwZGF0ZUFscGhhXCIsXG5cdFx0V2luZG93RGlkVXBkYXRlQ29sbGVjdGlvbkJlaGF2aW9yOiBcIm1hYzpXaW5kb3dEaWRVcGRhdGVDb2xsZWN0aW9uQmVoYXZpb3JcIixcblx0XHRXaW5kb3dEaWRVcGRhdGVDb2xsZWN0aW9uUHJvcGVydGllczogXCJtYWM6V2luZG93RGlkVXBkYXRlQ29sbGVjdGlvblByb3BlcnRpZXNcIixcblx0XHRXaW5kb3dEaWRVcGRhdGVTaGFkb3c6IFwibWFjOldpbmRvd0RpZFVwZGF0ZVNoYWRvd1wiLFxuXHRcdFdpbmRvd0RpZFVwZGF0ZVRpdGxlOiBcIm1hYzpXaW5kb3dEaWRVcGRhdGVUaXRsZVwiLFxuXHRcdFdpbmRvd0RpZFVwZGF0ZVRvb2xiYXI6IFwibWFjOldpbmRvd0RpZFVwZGF0ZVRvb2xiYXJcIixcblx0XHRXaW5kb3dEaWRVcGRhdGVWaXNpYmlsaXR5OiBcIm1hYzpXaW5kb3dEaWRVcGRhdGVWaXNpYmlsaXR5XCIsXG5cdFx0V2luZG93U2hvdWxkQ2xvc2U6IFwibWFjOldpbmRvd1Nob3VsZENsb3NlIVwiLFxuXHRcdFdpbmRvd1dpbGxCZWNvbWVLZXk6IFwibWFjOldpbmRvd1dpbGxCZWNvbWVLZXlcIixcblx0XHRXaW5kb3dXaWxsQmVjb21lTWFpbjogXCJtYWM6V2luZG93V2lsbEJlY29tZU1haW5cIixcblx0XHRXaW5kb3dXaWxsQmVnaW5TaGVldDogXCJtYWM6V2luZG93V2lsbEJlZ2luU2hlZXRcIixcblx0XHRXaW5kb3dXaWxsQ2hhbmdlT3JkZXJpbmdNb2RlOiBcIm1hYzpXaW5kb3dXaWxsQ2hhbmdlT3JkZXJpbmdNb2RlXCIsXG5cdFx0V2luZG93V2lsbENsb3NlOiBcIm1hYzpXaW5kb3dXaWxsQ2xvc2VcIixcblx0XHRXaW5kb3dXaWxsRGVtaW5pYXR1cml6ZTogXCJtYWM6V2luZG93V2lsbERlbWluaWF0dXJpemVcIixcblx0XHRXaW5kb3dXaWxsRW50ZXJGdWxsU2NyZWVuOiBcIm1hYzpXaW5kb3dXaWxsRW50ZXJGdWxsU2NyZWVuXCIsXG5cdFx0V2luZG93V2lsbEVudGVyVmVyc2lvbkJyb3dzZXI6IFwibWFjOldpbmRvd1dpbGxFbnRlclZlcnNpb25Ccm93c2VyXCIsXG5cdFx0V2luZG93V2lsbEV4aXRGdWxsU2NyZWVuOiBcIm1hYzpXaW5kb3dXaWxsRXhpdEZ1bGxTY3JlZW5cIixcblx0XHRXaW5kb3dXaWxsRXhpdFZlcnNpb25Ccm93c2VyOiBcIm1hYzpXaW5kb3dXaWxsRXhpdFZlcnNpb25Ccm93c2VyXCIsXG5cdFx0V2luZG93V2lsbEZvY3VzOiBcIm1hYzpXaW5kb3dXaWxsRm9jdXNcIixcblx0XHRXaW5kb3dXaWxsTWluaWF0dXJpemU6IFwibWFjOldpbmRvd1dpbGxNaW5pYXR1cml6ZVwiLFxuXHRcdFdpbmRvd1dpbGxNb3ZlOiBcIm1hYzpXaW5kb3dXaWxsTW92ZVwiLFxuXHRcdFdpbmRvd1dpbGxPcmRlck9mZlNjcmVlbjogXCJtYWM6V2luZG93V2lsbE9yZGVyT2ZmU2NyZWVuXCIsXG5cdFx0V2luZG93V2lsbE9yZGVyT25TY3JlZW46IFwibWFjOldpbmRvd1dpbGxPcmRlck9uU2NyZWVuXCIsXG5cdFx0V2luZG93V2lsbFJlc2lnbk1haW46IFwibWFjOldpbmRvd1dpbGxSZXNpZ25NYWluXCIsXG5cdFx0V2luZG93V2lsbFJlc2l6ZTogXCJtYWM6V2luZG93V2lsbFJlc2l6ZVwiLFxuXHRcdFdpbmRvd1dpbGxVbmZvY3VzOiBcIm1hYzpXaW5kb3dXaWxsVW5mb2N1c1wiLFxuXHRcdFdpbmRvd1dpbGxVcGRhdGU6IFwibWFjOldpbmRvd1dpbGxVcGRhdGVcIixcblx0XHRXaW5kb3dXaWxsVXBkYXRlQWxwaGE6IFwibWFjOldpbmRvd1dpbGxVcGRhdGVBbHBoYVwiLFxuXHRcdFdpbmRvd1dpbGxVcGRhdGVDb2xsZWN0aW9uQmVoYXZpb3I6IFwibWFjOldpbmRvd1dpbGxVcGRhdGVDb2xsZWN0aW9uQmVoYXZpb3JcIixcblx0XHRXaW5kb3dXaWxsVXBkYXRlQ29sbGVjdGlvblByb3BlcnRpZXM6IFwibWFjOldpbmRvd1dpbGxVcGRhdGVDb2xsZWN0aW9uUHJvcGVydGllc1wiLFxuXHRcdFdpbmRvd1dpbGxVcGRhdGVTaGFkb3c6IFwibWFjOldpbmRvd1dpbGxVcGRhdGVTaGFkb3dcIixcblx0XHRXaW5kb3dXaWxsVXBkYXRlVGl0bGU6IFwibWFjOldpbmRvd1dpbGxVcGRhdGVUaXRsZVwiLFxuXHRcdFdpbmRvd1dpbGxVcGRhdGVUb29sYmFyOiBcIm1hYzpXaW5kb3dXaWxsVXBkYXRlVG9vbGJhclwiLFxuXHRcdFdpbmRvd1dpbGxVcGRhdGVWaXNpYmlsaXR5OiBcIm1hYzpXaW5kb3dXaWxsVXBkYXRlVmlzaWJpbGl0eVwiLFxuXHRcdFdpbmRvd1dpbGxVc2VTdGFuZGFyZEZyYW1lOiBcIm1hYzpXaW5kb3dXaWxsVXNlU3RhbmRhcmRGcmFtZVwiLFxuXHRcdE1lbnVXaWxsT3BlbjogXCJtYWM6TWVudVdpbGxPcGVuXCIsXG5cdFx0TWVudURpZE9wZW46IFwibWFjOk1lbnVEaWRPcGVuXCIsXG5cdFx0TWVudURpZENsb3NlOiBcIm1hYzpNZW51RGlkQ2xvc2VcIixcblx0XHRNZW51V2lsbFNlbmRBY3Rpb246IFwibWFjOk1lbnVXaWxsU2VuZEFjdGlvblwiLFxuXHRcdE1lbnVEaWRTZW5kQWN0aW9uOiBcIm1hYzpNZW51RGlkU2VuZEFjdGlvblwiLFxuXHRcdE1lbnVXaWxsSGlnaGxpZ2h0SXRlbTogXCJtYWM6TWVudVdpbGxIaWdobGlnaHRJdGVtXCIsXG5cdFx0TWVudURpZEhpZ2hsaWdodEl0ZW06IFwibWFjOk1lbnVEaWRIaWdobGlnaHRJdGVtXCIsXG5cdFx0TWVudVdpbGxEaXNwbGF5SXRlbTogXCJtYWM6TWVudVdpbGxEaXNwbGF5SXRlbVwiLFxuXHRcdE1lbnVEaWREaXNwbGF5SXRlbTogXCJtYWM6TWVudURpZERpc3BsYXlJdGVtXCIsXG5cdFx0TWVudVdpbGxBZGRJdGVtOiBcIm1hYzpNZW51V2lsbEFkZEl0ZW1cIixcblx0XHRNZW51RGlkQWRkSXRlbTogXCJtYWM6TWVudURpZEFkZEl0ZW1cIixcblx0XHRNZW51V2lsbFJlbW92ZUl0ZW06IFwibWFjOk1lbnVXaWxsUmVtb3ZlSXRlbVwiLFxuXHRcdE1lbnVEaWRSZW1vdmVJdGVtOiBcIm1hYzpNZW51RGlkUmVtb3ZlSXRlbVwiLFxuXHRcdE1lbnVXaWxsQmVnaW5UcmFja2luZzogXCJtYWM6TWVudVdpbGxCZWdpblRyYWNraW5nXCIsXG5cdFx0TWVudURpZEJlZ2luVHJhY2tpbmc6IFwibWFjOk1lbnVEaWRCZWdpblRyYWNraW5nXCIsXG5cdFx0TWVudVdpbGxFbmRUcmFja2luZzogXCJtYWM6TWVudVdpbGxFbmRUcmFja2luZ1wiLFxuXHRcdE1lbnVEaWRFbmRUcmFja2luZzogXCJtYWM6TWVudURpZEVuZFRyYWNraW5nXCIsXG5cdFx0TWVudVdpbGxVcGRhdGU6IFwibWFjOk1lbnVXaWxsVXBkYXRlXCIsXG5cdFx0TWVudURpZFVwZGF0ZTogXCJtYWM6TWVudURpZFVwZGF0ZVwiLFxuXHRcdE1lbnVXaWxsUG9wVXA6IFwibWFjOk1lbnVXaWxsUG9wVXBcIixcblx0XHRNZW51RGlkUG9wVXA6IFwibWFjOk1lbnVEaWRQb3BVcFwiLFxuXHRcdE1lbnVXaWxsU2VuZEFjdGlvblRvSXRlbTogXCJtYWM6TWVudVdpbGxTZW5kQWN0aW9uVG9JdGVtXCIsXG5cdFx0TWVudURpZFNlbmRBY3Rpb25Ub0l0ZW06IFwibWFjOk1lbnVEaWRTZW5kQWN0aW9uVG9JdGVtXCIsXG5cdFx0V2ViVmlld0RpZFN0YXJ0UHJvdmlzaW9uYWxOYXZpZ2F0aW9uOiBcIm1hYzpXZWJWaWV3RGlkU3RhcnRQcm92aXNpb25hbE5hdmlnYXRpb25cIixcblx0XHRXZWJWaWV3RGlkUmVjZWl2ZVNlcnZlclJlZGlyZWN0Rm9yUHJvdmlzaW9uYWxOYXZpZ2F0aW9uOiBcIm1hYzpXZWJWaWV3RGlkUmVjZWl2ZVNlcnZlclJlZGlyZWN0Rm9yUHJvdmlzaW9uYWxOYXZpZ2F0aW9uXCIsXG5cdFx0V2ViVmlld0RpZEZpbmlzaE5hdmlnYXRpb246IFwibWFjOldlYlZpZXdEaWRGaW5pc2hOYXZpZ2F0aW9uXCIsXG5cdFx0V2ViVmlld0RpZENvbW1pdE5hdmlnYXRpb246IFwibWFjOldlYlZpZXdEaWRDb21taXROYXZpZ2F0aW9uXCIsXG5cdFx0V2luZG93RmlsZURyYWdnaW5nRW50ZXJlZDogXCJtYWM6V2luZG93RmlsZURyYWdnaW5nRW50ZXJlZFwiLFxuXHRcdFdpbmRvd0ZpbGVEcmFnZ2luZ1BlcmZvcm1lZDogXCJtYWM6V2luZG93RmlsZURyYWdnaW5nUGVyZm9ybWVkXCIsXG5cdFx0V2luZG93RmlsZURyYWdnaW5nRXhpdGVkOiBcIm1hYzpXaW5kb3dGaWxlRHJhZ2dpbmdFeGl0ZWRcIixcblx0fSxcblx0TGludXg6IHtcblx0XHRTeXN0ZW1UaGVtZUNoYW5nZWQ6IFwibGludXg6U3lzdGVtVGhlbWVDaGFuZ2VkXCIsXG5cdH0sXG5cdENvbW1vbjoge1xuXHRcdEFwcGxpY2F0aW9uU3RhcnRlZDogXCJjb21tb246QXBwbGljYXRpb25TdGFydGVkXCIsXG5cdFx0V2luZG93TWF4aW1pc2U6IFwiY29tbW9uOldpbmRvd01heGltaXNlXCIsXG5cdFx0V2luZG93VW5NYXhpbWlzZTogXCJjb21tb246V2luZG93VW5NYXhpbWlzZVwiLFxuXHRcdFdpbmRvd0Z1bGxzY3JlZW46IFwiY29tbW9uOldpbmRvd0Z1bGxzY3JlZW5cIixcblx0XHRXaW5kb3dVbkZ1bGxzY3JlZW46IFwiY29tbW9uOldpbmRvd1VuRnVsbHNjcmVlblwiLFxuXHRcdFdpbmRvd1Jlc3RvcmU6IFwiY29tbW9uOldpbmRvd1Jlc3RvcmVcIixcblx0XHRXaW5kb3dNaW5pbWlzZTogXCJjb21tb246V2luZG93TWluaW1pc2VcIixcblx0XHRXaW5kb3dVbk1pbmltaXNlOiBcImNvbW1vbjpXaW5kb3dVbk1pbmltaXNlXCIsXG5cdFx0V2luZG93Q2xvc2luZzogXCJjb21tb246V2luZG93Q2xvc2luZ1wiLFxuXHRcdFdpbmRvd1pvb206IFwiY29tbW9uOldpbmRvd1pvb21cIixcblx0XHRXaW5kb3dab29tSW46IFwiY29tbW9uOldpbmRvd1pvb21JblwiLFxuXHRcdFdpbmRvd1pvb21PdXQ6IFwiY29tbW9uOldpbmRvd1pvb21PdXRcIixcblx0XHRXaW5kb3dab29tUmVzZXQ6IFwiY29tbW9uOldpbmRvd1pvb21SZXNldFwiLFxuXHRcdFdpbmRvd0ZvY3VzOiBcImNvbW1vbjpXaW5kb3dGb2N1c1wiLFxuXHRcdFdpbmRvd0xvc3RGb2N1czogXCJjb21tb246V2luZG93TG9zdEZvY3VzXCIsXG5cdFx0V2luZG93U2hvdzogXCJjb21tb246V2luZG93U2hvd1wiLFxuXHRcdFdpbmRvd0hpZGU6IFwiY29tbW9uOldpbmRvd0hpZGVcIixcblx0XHRXaW5kb3dEUElDaGFuZ2VkOiBcImNvbW1vbjpXaW5kb3dEUElDaGFuZ2VkXCIsXG5cdFx0V2luZG93RmlsZXNEcm9wcGVkOiBcImNvbW1vbjpXaW5kb3dGaWxlc0Ryb3BwZWRcIixcblx0XHRXaW5kb3dSdW50aW1lUmVhZHk6IFwiY29tbW9uOldpbmRvd1J1bnRpbWVSZWFkeVwiLFxuXHRcdFRoZW1lQ2hhbmdlZDogXCJjb21tb246VGhlbWVDaGFuZ2VkXCIsXG5cdH0sXG59O1xuIiwgIi8qXHJcbiBfXHQgICBfX1x0ICBfIF9fXHJcbnwgfFx0IC8gL19fXyBfKF8pIC9fX19fXHJcbnwgfCAvfCAvIC8gX18gYC8gLyAvIF9fXy9cclxufCB8LyB8LyAvIC9fLyAvIC8gKF9fICApXHJcbnxfXy98X18vXFxfXyxfL18vXy9fX19fL1xyXG5UaGUgZWxlY3Ryb24gYWx0ZXJuYXRpdmUgZm9yIEdvXHJcbihjKSBMZWEgQW50aG9ueSAyMDE5LXByZXNlbnRcclxuKi9cclxuXHJcbi8qIGpzaGludCBlc3ZlcnNpb246IDkgKi9cclxuXHJcbi8qKlxyXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBPcGVuRmlsZURpYWxvZ09wdGlvbnNcclxuICogQHByb3BlcnR5IHtib29sZWFufSBbQ2FuQ2hvb3NlRGlyZWN0b3JpZXNdIC0gSW5kaWNhdGVzIGlmIGRpcmVjdG9yaWVzIGNhbiBiZSBjaG9zZW4uXHJcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW0NhbkNob29zZUZpbGVzXSAtIEluZGljYXRlcyBpZiBmaWxlcyBjYW4gYmUgY2hvc2VuLlxyXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtDYW5DcmVhdGVEaXJlY3Rvcmllc10gLSBJbmRpY2F0ZXMgaWYgZGlyZWN0b3JpZXMgY2FuIGJlIGNyZWF0ZWQuXHJcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW1Nob3dIaWRkZW5GaWxlc10gLSBJbmRpY2F0ZXMgaWYgaGlkZGVuIGZpbGVzIHNob3VsZCBiZSBzaG93bi5cclxuICogQHByb3BlcnR5IHtib29sZWFufSBbUmVzb2x2ZXNBbGlhc2VzXSAtIEluZGljYXRlcyBpZiBhbGlhc2VzIHNob3VsZCBiZSByZXNvbHZlZC5cclxuICogQHByb3BlcnR5IHtib29sZWFufSBbQWxsb3dzTXVsdGlwbGVTZWxlY3Rpb25dIC0gSW5kaWNhdGVzIGlmIG11bHRpcGxlIHNlbGVjdGlvbiBpcyBhbGxvd2VkLlxyXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtIaWRlRXh0ZW5zaW9uXSAtIEluZGljYXRlcyBpZiB0aGUgZXh0ZW5zaW9uIHNob3VsZCBiZSBoaWRkZW4uXHJcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW0NhblNlbGVjdEhpZGRlbkV4dGVuc2lvbl0gLSBJbmRpY2F0ZXMgaWYgaGlkZGVuIGV4dGVuc2lvbnMgY2FuIGJlIHNlbGVjdGVkLlxyXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtUcmVhdHNGaWxlUGFja2FnZXNBc0RpcmVjdG9yaWVzXSAtIEluZGljYXRlcyBpZiBmaWxlIHBhY2thZ2VzIHNob3VsZCBiZSB0cmVhdGVkIGFzIGRpcmVjdG9yaWVzLlxyXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtBbGxvd3NPdGhlckZpbGV0eXBlc10gLSBJbmRpY2F0ZXMgaWYgb3RoZXIgZmlsZSB0eXBlcyBhcmUgYWxsb3dlZC5cclxuICogQHByb3BlcnR5IHtGaWxlRmlsdGVyW119IFtGaWx0ZXJzXSAtIEFycmF5IG9mIGZpbGUgZmlsdGVycy5cclxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtUaXRsZV0gLSBUaXRsZSBvZiB0aGUgZGlhbG9nLlxyXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW01lc3NhZ2VdIC0gTWVzc2FnZSB0byBzaG93IGluIHRoZSBkaWFsb2cuXHJcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbQnV0dG9uVGV4dF0gLSBUZXh0IHRvIGRpc3BsYXkgb24gdGhlIGJ1dHRvbi5cclxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtEaXJlY3RvcnldIC0gRGlyZWN0b3J5IHRvIG9wZW4gaW4gdGhlIGRpYWxvZy5cclxuICogQHByb3BlcnR5IHtib29sZWFufSBbRGV0YWNoZWRdIC0gSW5kaWNhdGVzIGlmIHRoZSBkaWFsb2cgc2hvdWxkIGFwcGVhciBkZXRhY2hlZCBmcm9tIHRoZSBtYWluIHdpbmRvdy5cclxuICovXHJcblxyXG5cclxuLyoqXHJcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFNhdmVGaWxlRGlhbG9nT3B0aW9uc1xyXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW0ZpbGVuYW1lXSAtIERlZmF1bHQgZmlsZW5hbWUgdG8gdXNlIGluIHRoZSBkaWFsb2cuXHJcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW0NhbkNob29zZURpcmVjdG9yaWVzXSAtIEluZGljYXRlcyBpZiBkaXJlY3RvcmllcyBjYW4gYmUgY2hvc2VuLlxyXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtDYW5DaG9vc2VGaWxlc10gLSBJbmRpY2F0ZXMgaWYgZmlsZXMgY2FuIGJlIGNob3Nlbi5cclxuICogQHByb3BlcnR5IHtib29sZWFufSBbQ2FuQ3JlYXRlRGlyZWN0b3JpZXNdIC0gSW5kaWNhdGVzIGlmIGRpcmVjdG9yaWVzIGNhbiBiZSBjcmVhdGVkLlxyXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtTaG93SGlkZGVuRmlsZXNdIC0gSW5kaWNhdGVzIGlmIGhpZGRlbiBmaWxlcyBzaG91bGQgYmUgc2hvd24uXHJcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW1Jlc29sdmVzQWxpYXNlc10gLSBJbmRpY2F0ZXMgaWYgYWxpYXNlcyBzaG91bGQgYmUgcmVzb2x2ZWQuXHJcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW0FsbG93c011bHRpcGxlU2VsZWN0aW9uXSAtIEluZGljYXRlcyBpZiBtdWx0aXBsZSBzZWxlY3Rpb24gaXMgYWxsb3dlZC5cclxuICogQHByb3BlcnR5IHtib29sZWFufSBbSGlkZUV4dGVuc2lvbl0gLSBJbmRpY2F0ZXMgaWYgdGhlIGV4dGVuc2lvbiBzaG91bGQgYmUgaGlkZGVuLlxyXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtDYW5TZWxlY3RIaWRkZW5FeHRlbnNpb25dIC0gSW5kaWNhdGVzIGlmIGhpZGRlbiBleHRlbnNpb25zIGNhbiBiZSBzZWxlY3RlZC5cclxuICogQHByb3BlcnR5IHtib29sZWFufSBbVHJlYXRzRmlsZVBhY2thZ2VzQXNEaXJlY3Rvcmllc10gLSBJbmRpY2F0ZXMgaWYgZmlsZSBwYWNrYWdlcyBzaG91bGQgYmUgdHJlYXRlZCBhcyBkaXJlY3Rvcmllcy5cclxuICogQHByb3BlcnR5IHtib29sZWFufSBbQWxsb3dzT3RoZXJGaWxldHlwZXNdIC0gSW5kaWNhdGVzIGlmIG90aGVyIGZpbGUgdHlwZXMgYXJlIGFsbG93ZWQuXHJcbiAqIEBwcm9wZXJ0eSB7RmlsZUZpbHRlcltdfSBbRmlsdGVyc10gLSBBcnJheSBvZiBmaWxlIGZpbHRlcnMuXHJcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbVGl0bGVdIC0gVGl0bGUgb2YgdGhlIGRpYWxvZy5cclxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtNZXNzYWdlXSAtIE1lc3NhZ2UgdG8gc2hvdyBpbiB0aGUgZGlhbG9nLlxyXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW0J1dHRvblRleHRdIC0gVGV4dCB0byBkaXNwbGF5IG9uIHRoZSBidXR0b24uXHJcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbRGlyZWN0b3J5XSAtIERpcmVjdG9yeSB0byBvcGVuIGluIHRoZSBkaWFsb2cuXHJcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW0RldGFjaGVkXSAtIEluZGljYXRlcyBpZiB0aGUgZGlhbG9nIHNob3VsZCBhcHBlYXIgZGV0YWNoZWQgZnJvbSB0aGUgbWFpbiB3aW5kb3cuXHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIEB0eXBlZGVmIHtPYmplY3R9IE1lc3NhZ2VEaWFsb2dPcHRpb25zXHJcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbVGl0bGVdIC0gVGhlIHRpdGxlIG9mIHRoZSBkaWFsb2cgd2luZG93LlxyXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW01lc3NhZ2VdIC0gVGhlIG1haW4gbWVzc2FnZSB0byBzaG93IGluIHRoZSBkaWFsb2cuXHJcbiAqIEBwcm9wZXJ0eSB7QnV0dG9uW119IFtCdXR0b25zXSAtIEFycmF5IG9mIGJ1dHRvbiBvcHRpb25zIHRvIHNob3cgaW4gdGhlIGRpYWxvZy5cclxuICogQHByb3BlcnR5IHtib29sZWFufSBbRGV0YWNoZWRdIC0gVHJ1ZSBpZiB0aGUgZGlhbG9nIHNob3VsZCBhcHBlYXIgZGV0YWNoZWQgZnJvbSB0aGUgbWFpbiB3aW5kb3cgKGlmIGFwcGxpY2FibGUpLlxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBCdXR0b25cclxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtMYWJlbF0gLSBUZXh0IHRoYXQgYXBwZWFycyB3aXRoaW4gdGhlIGJ1dHRvbi5cclxuICogQHByb3BlcnR5IHtib29sZWFufSBbSXNDYW5jZWxdIC0gVHJ1ZSBpZiB0aGUgYnV0dG9uIHNob3VsZCBjYW5jZWwgYW4gb3BlcmF0aW9uIHdoZW4gY2xpY2tlZC5cclxuICogQHByb3BlcnR5IHtib29sZWFufSBbSXNEZWZhdWx0XSAtIFRydWUgaWYgdGhlIGJ1dHRvbiBzaG91bGQgYmUgdGhlIGRlZmF1bHQgYWN0aW9uIHdoZW4gdGhlIHVzZXIgcHJlc3NlcyBlbnRlci5cclxuICovXHJcblxyXG4vKipcclxuICogQHR5cGVkZWYge09iamVjdH0gRmlsZUZpbHRlclxyXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW0Rpc3BsYXlOYW1lXSAtIERpc3BsYXkgbmFtZSBmb3IgdGhlIGZpbHRlciwgaXQgY291bGQgYmUgXCJUZXh0IEZpbGVzXCIsIFwiSW1hZ2VzXCIgZXRjLlxyXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW1BhdHRlcm5dIC0gUGF0dGVybiB0byBtYXRjaCBmb3IgdGhlIGZpbHRlciwgZS5nLiBcIioudHh0OyoubWRcIiBmb3IgdGV4dCBtYXJrZG93biBmaWxlcy5cclxuICovXHJcblxyXG4vLyBzZXR1cFxyXG53aW5kb3cuX3dhaWxzID0gd2luZG93Ll93YWlscyB8fCB7fTtcclxud2luZG93Ll93YWlscy5kaWFsb2dFcnJvckNhbGxiYWNrID0gZGlhbG9nRXJyb3JDYWxsYmFjaztcclxud2luZG93Ll93YWlscy5kaWFsb2dSZXN1bHRDYWxsYmFjayA9IGRpYWxvZ1Jlc3VsdENhbGxiYWNrO1xyXG5cclxuaW1wb3J0IHtuZXdSdW50aW1lQ2FsbGVyV2l0aElELCBvYmplY3ROYW1lc30gZnJvbSBcIi4vcnVudGltZVwiO1xyXG5cclxuaW1wb3J0IHsgbmFub2lkIH0gZnJvbSAnbmFub2lkL25vbi1zZWN1cmUnO1xyXG5cclxuLy8gRGVmaW5lIGNvbnN0YW50cyBmcm9tIHRoZSBgbWV0aG9kc2Agb2JqZWN0IGluIFRpdGxlIENhc2VcclxuY29uc3QgRGlhbG9nSW5mbyA9IDA7XHJcbmNvbnN0IERpYWxvZ1dhcm5pbmcgPSAxO1xyXG5jb25zdCBEaWFsb2dFcnJvciA9IDI7XHJcbmNvbnN0IERpYWxvZ1F1ZXN0aW9uID0gMztcclxuY29uc3QgRGlhbG9nT3BlbkZpbGUgPSA0O1xyXG5jb25zdCBEaWFsb2dTYXZlRmlsZSA9IDU7XHJcblxyXG5jb25zdCBjYWxsID0gbmV3UnVudGltZUNhbGxlcldpdGhJRChvYmplY3ROYW1lcy5EaWFsb2csICcnKTtcclxuY29uc3QgZGlhbG9nUmVzcG9uc2VzID0gbmV3IE1hcCgpO1xyXG5cclxuLyoqXHJcbiAqIEdlbmVyYXRlcyBhIHVuaXF1ZSBpZCB0aGF0IGlzIG5vdCBwcmVzZW50IGluIGRpYWxvZ1Jlc3BvbnNlcy5cclxuICogQHJldHVybnMge3N0cmluZ30gdW5pcXVlIGlkXHJcbiAqL1xyXG5mdW5jdGlvbiBnZW5lcmF0ZUlEKCkge1xyXG4gICAgbGV0IHJlc3VsdDtcclxuICAgIGRvIHtcclxuICAgICAgICByZXN1bHQgPSBuYW5vaWQoKTtcclxuICAgIH0gd2hpbGUgKGRpYWxvZ1Jlc3BvbnNlcy5oYXMocmVzdWx0KSk7XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG59XHJcblxyXG4vKipcclxuICogU2hvd3MgYSBkaWFsb2cgb2Ygc3BlY2lmaWVkIHR5cGUgd2l0aCB0aGUgZ2l2ZW4gb3B0aW9ucy5cclxuICogQHBhcmFtIHtudW1iZXJ9IHR5cGUgLSB0eXBlIG9mIGRpYWxvZ1xyXG4gKiBAcGFyYW0ge01lc3NhZ2VEaWFsb2dPcHRpb25zfE9wZW5GaWxlRGlhbG9nT3B0aW9uc3xTYXZlRmlsZURpYWxvZ09wdGlvbnN9IG9wdGlvbnMgLSBvcHRpb25zIGZvciB0aGUgZGlhbG9nXHJcbiAqIEByZXR1cm5zIHtQcm9taXNlfSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCByZXN1bHQgb2YgZGlhbG9nXHJcbiAqL1xyXG5mdW5jdGlvbiBkaWFsb2codHlwZSwgb3B0aW9ucyA9IHt9KSB7XHJcbiAgICBjb25zdCBpZCA9IGdlbmVyYXRlSUQoKTtcclxuICAgIG9wdGlvbnNbXCJkaWFsb2ctaWRcIl0gPSBpZDtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgZGlhbG9nUmVzcG9uc2VzLnNldChpZCwge3Jlc29sdmUsIHJlamVjdH0pO1xyXG4gICAgICAgIGNhbGwodHlwZSwgb3B0aW9ucykuY2F0Y2goKGVycm9yKSA9PiB7XHJcbiAgICAgICAgICAgIHJlamVjdChlcnJvcik7XHJcbiAgICAgICAgICAgIGRpYWxvZ1Jlc3BvbnNlcy5kZWxldGUoaWQpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfSk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBIYW5kbGVzIHRoZSBjYWxsYmFjayBmcm9tIGEgZGlhbG9nLlxyXG4gKlxyXG4gKiBAcGFyYW0ge3N0cmluZ30gaWQgLSBUaGUgSUQgb2YgdGhlIGRpYWxvZyByZXNwb25zZS5cclxuICogQHBhcmFtIHtzdHJpbmd9IGRhdGEgLSBUaGUgZGF0YSByZWNlaXZlZCBmcm9tIHRoZSBkaWFsb2cuXHJcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gaXNKU09OIC0gRmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGRhdGEgaXMgaW4gSlNPTiBmb3JtYXQuXHJcbiAqXHJcbiAqIEByZXR1cm4ge3VuZGVmaW5lZH1cclxuICovXHJcbmZ1bmN0aW9uIGRpYWxvZ1Jlc3VsdENhbGxiYWNrKGlkLCBkYXRhLCBpc0pTT04pIHtcclxuICAgIGxldCBwID0gZGlhbG9nUmVzcG9uc2VzLmdldChpZCk7XHJcbiAgICBpZiAocCkge1xyXG4gICAgICAgIGlmIChpc0pTT04pIHtcclxuICAgICAgICAgICAgcC5yZXNvbHZlKEpTT04ucGFyc2UoZGF0YSkpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHAucmVzb2x2ZShkYXRhKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZGlhbG9nUmVzcG9uc2VzLmRlbGV0ZShpZCk7XHJcbiAgICB9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBDYWxsYmFjayBmdW5jdGlvbiBmb3IgaGFuZGxpbmcgZXJyb3JzIGluIGRpYWxvZy5cclxuICpcclxuICogQHBhcmFtIHtzdHJpbmd9IGlkIC0gVGhlIGlkIG9mIHRoZSBkaWFsb2cgcmVzcG9uc2UuXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlIC0gVGhlIGVycm9yIG1lc3NhZ2UuXHJcbiAqXHJcbiAqIEByZXR1cm4ge3ZvaWR9XHJcbiAqL1xyXG5mdW5jdGlvbiBkaWFsb2dFcnJvckNhbGxiYWNrKGlkLCBtZXNzYWdlKSB7XHJcbiAgICBsZXQgcCA9IGRpYWxvZ1Jlc3BvbnNlcy5nZXQoaWQpO1xyXG4gICAgaWYgKHApIHtcclxuICAgICAgICBwLnJlamVjdChtZXNzYWdlKTtcclxuICAgICAgICBkaWFsb2dSZXNwb25zZXMuZGVsZXRlKGlkKTtcclxuICAgIH1cclxufVxyXG5cclxuXHJcbi8vIFJlcGxhY2UgYG1ldGhvZHNgIHdpdGggY29uc3RhbnRzIGluIFRpdGxlIENhc2VcclxuXHJcbi8qKlxyXG4gKiBAcGFyYW0ge01lc3NhZ2VEaWFsb2dPcHRpb25zfSBvcHRpb25zIC0gRGlhbG9nIG9wdGlvbnNcclxuICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nPn0gLSBUaGUgbGFiZWwgb2YgdGhlIGJ1dHRvbiBwcmVzc2VkXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgSW5mbyA9IChvcHRpb25zKSA9PiBkaWFsb2coRGlhbG9nSW5mbywgb3B0aW9ucyk7XHJcblxyXG4vKipcclxuICogQHBhcmFtIHtNZXNzYWdlRGlhbG9nT3B0aW9uc30gb3B0aW9ucyAtIERpYWxvZyBvcHRpb25zXHJcbiAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZz59IC0gVGhlIGxhYmVsIG9mIHRoZSBidXR0b24gcHJlc3NlZFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IFdhcm5pbmcgPSAob3B0aW9ucykgPT4gZGlhbG9nKERpYWxvZ1dhcm5pbmcsIG9wdGlvbnMpO1xyXG5cclxuLyoqXHJcbiAqIEBwYXJhbSB7TWVzc2FnZURpYWxvZ09wdGlvbnN9IG9wdGlvbnMgLSBEaWFsb2cgb3B0aW9uc1xyXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmc+fSAtIFRoZSBsYWJlbCBvZiB0aGUgYnV0dG9uIHByZXNzZWRcclxuICovXHJcbmV4cG9ydCBjb25zdCBFcnJvciA9IChvcHRpb25zKSA9PiBkaWFsb2coRGlhbG9nRXJyb3IsIG9wdGlvbnMpO1xyXG5cclxuLyoqXHJcbiAqIEBwYXJhbSB7TWVzc2FnZURpYWxvZ09wdGlvbnN9IG9wdGlvbnMgLSBEaWFsb2cgb3B0aW9uc1xyXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmc+fSAtIFRoZSBsYWJlbCBvZiB0aGUgYnV0dG9uIHByZXNzZWRcclxuICovXHJcbmV4cG9ydCBjb25zdCBRdWVzdGlvbiA9IChvcHRpb25zKSA9PiBkaWFsb2coRGlhbG9nUXVlc3Rpb24sIG9wdGlvbnMpO1xyXG5cclxuLyoqXHJcbiAqIEBwYXJhbSB7T3BlbkZpbGVEaWFsb2dPcHRpb25zfSBvcHRpb25zIC0gRGlhbG9nIG9wdGlvbnNcclxuICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nW118c3RyaW5nPn0gUmV0dXJucyBzZWxlY3RlZCBmaWxlIG9yIGxpc3Qgb2YgZmlsZXMuIFJldHVybnMgYmxhbmsgc3RyaW5nIGlmIG5vIGZpbGUgaXMgc2VsZWN0ZWQuXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgT3BlbkZpbGUgPSAob3B0aW9ucykgPT4gZGlhbG9nKERpYWxvZ09wZW5GaWxlLCBvcHRpb25zKTtcclxuXHJcbi8qKlxyXG4gKiBAcGFyYW0ge1NhdmVGaWxlRGlhbG9nT3B0aW9uc30gb3B0aW9ucyAtIERpYWxvZyBvcHRpb25zXHJcbiAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZz59IFJldHVybnMgdGhlIHNlbGVjdGVkIGZpbGUuIFJldHVybnMgYmxhbmsgc3RyaW5nIGlmIG5vIGZpbGUgaXMgc2VsZWN0ZWQuXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgU2F2ZUZpbGUgPSAob3B0aW9ucykgPT4gZGlhbG9nKERpYWxvZ1NhdmVGaWxlLCBvcHRpb25zKTtcclxuIiwgIi8qXHJcbiBfXHQgICBfX1x0ICBfIF9fXHJcbnwgfFx0IC8gL19fXyBfKF8pIC9fX19fXHJcbnwgfCAvfCAvIC8gX18gYC8gLyAvIF9fXy9cclxufCB8LyB8LyAvIC9fLyAvIC8gKF9fICApXHJcbnxfXy98X18vXFxfXyxfL18vXy9fX19fL1xyXG5UaGUgZWxlY3Ryb24gYWx0ZXJuYXRpdmUgZm9yIEdvXHJcbihjKSBMZWEgQW50aG9ueSAyMDE5LXByZXNlbnRcclxuKi9cclxuXHJcbi8qIGpzaGludCBlc3ZlcnNpb246IDkgKi9cclxuaW1wb3J0IHsgbmV3UnVudGltZUNhbGxlcldpdGhJRCwgb2JqZWN0TmFtZXMgfSBmcm9tIFwiLi9ydW50aW1lXCI7XHJcbmltcG9ydCB7IG5hbm9pZCB9IGZyb20gJ25hbm9pZC9ub24tc2VjdXJlJztcclxuXHJcbi8vIFNldHVwXHJcbndpbmRvdy5fd2FpbHMgPSB3aW5kb3cuX3dhaWxzIHx8IHt9O1xyXG53aW5kb3cuX3dhaWxzLmNhbGxSZXN1bHRIYW5kbGVyID0gcmVzdWx0SGFuZGxlcjtcclxud2luZG93Ll93YWlscy5jYWxsRXJyb3JIYW5kbGVyID0gZXJyb3JIYW5kbGVyO1xyXG5cclxuXHJcbmNvbnN0IENhbGxCaW5kaW5nID0gMDtcclxuY29uc3QgY2FsbCA9IG5ld1J1bnRpbWVDYWxsZXJXaXRoSUQob2JqZWN0TmFtZXMuQ2FsbCwgJycpO1xyXG5sZXQgY2FsbFJlc3BvbnNlcyA9IG5ldyBNYXAoKTtcclxuXHJcbi8qKlxyXG4gKiBHZW5lcmF0ZXMgYSB1bmlxdWUgSUQgdXNpbmcgdGhlIG5hbm9pZCBsaWJyYXJ5LlxyXG4gKlxyXG4gKiBAcmV0dXJuIHtzdHJpbmd9IC0gQSB1bmlxdWUgSUQgdGhhdCBkb2VzIG5vdCBleGlzdCBpbiB0aGUgY2FsbFJlc3BvbnNlcyBzZXQuXHJcbiAqL1xyXG5mdW5jdGlvbiBnZW5lcmF0ZUlEKCkge1xyXG4gICAgbGV0IHJlc3VsdDtcclxuICAgIGRvIHtcclxuICAgICAgICByZXN1bHQgPSBuYW5vaWQoKTtcclxuICAgIH0gd2hpbGUgKGNhbGxSZXNwb25zZXMuaGFzKHJlc3VsdCkpO1xyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxufVxyXG5cclxuLyoqXHJcbiAqIEhhbmRsZXMgdGhlIHJlc3VsdCBvZiBhIGNhbGwgcmVxdWVzdC5cclxuICpcclxuICogQHBhcmFtIHtzdHJpbmd9IGlkIC0gVGhlIGlkIG9mIHRoZSByZXF1ZXN0IHRvIGhhbmRsZSB0aGUgcmVzdWx0IGZvci5cclxuICogQHBhcmFtIHtzdHJpbmd9IGRhdGEgLSBUaGUgcmVzdWx0IGRhdGEgb2YgdGhlIHJlcXVlc3QuXHJcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gaXNKU09OIC0gSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGRhdGEgaXMgSlNPTiBvciBub3QuXHJcbiAqXHJcbiAqIEByZXR1cm4ge3VuZGVmaW5lZH0gLSBUaGlzIG1ldGhvZCBkb2VzIG5vdCByZXR1cm4gYW55IHZhbHVlLlxyXG4gKi9cclxuZnVuY3Rpb24gcmVzdWx0SGFuZGxlcihpZCwgZGF0YSwgaXNKU09OKSB7XHJcbiAgICBjb25zdCBwcm9taXNlSGFuZGxlciA9IGdldEFuZERlbGV0ZVJlc3BvbnNlKGlkKTtcclxuICAgIGlmIChwcm9taXNlSGFuZGxlcikge1xyXG4gICAgICAgIHByb21pc2VIYW5kbGVyLnJlc29sdmUoaXNKU09OID8gSlNPTi5wYXJzZShkYXRhKSA6IGRhdGEpO1xyXG4gICAgfVxyXG59XHJcblxyXG4vKipcclxuICogSGFuZGxlcyB0aGUgZXJyb3IgZnJvbSBhIGNhbGwgcmVxdWVzdC5cclxuICpcclxuICogQHBhcmFtIHtzdHJpbmd9IGlkIC0gVGhlIGlkIG9mIHRoZSBwcm9taXNlIGhhbmRsZXIuXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlIC0gVGhlIGVycm9yIG1lc3NhZ2UgdG8gcmVqZWN0IHRoZSBwcm9taXNlIGhhbmRsZXIgd2l0aC5cclxuICpcclxuICogQHJldHVybiB7dm9pZH1cclxuICovXHJcbmZ1bmN0aW9uIGVycm9ySGFuZGxlcihpZCwgbWVzc2FnZSkge1xyXG4gICAgY29uc3QgcHJvbWlzZUhhbmRsZXIgPSBnZXRBbmREZWxldGVSZXNwb25zZShpZCk7XHJcbiAgICBpZiAocHJvbWlzZUhhbmRsZXIpIHtcclxuICAgICAgICBwcm9taXNlSGFuZGxlci5yZWplY3QobWVzc2FnZSk7XHJcbiAgICB9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBSZXRyaWV2ZXMgYW5kIHJlbW92ZXMgdGhlIHJlc3BvbnNlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gSUQgZnJvbSB0aGUgY2FsbFJlc3BvbnNlcyBtYXAuXHJcbiAqXHJcbiAqIEBwYXJhbSB7YW55fSBpZCAtIFRoZSBJRCBvZiB0aGUgcmVzcG9uc2UgdG8gYmUgcmV0cmlldmVkIGFuZCByZW1vdmVkLlxyXG4gKlxyXG4gKiBAcmV0dXJucyB7YW55fSBUaGUgcmVzcG9uc2Ugb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gSUQuXHJcbiAqL1xyXG5mdW5jdGlvbiBnZXRBbmREZWxldGVSZXNwb25zZShpZCkge1xyXG4gICAgY29uc3QgcmVzcG9uc2UgPSBjYWxsUmVzcG9uc2VzLmdldChpZCk7XHJcbiAgICBjYWxsUmVzcG9uc2VzLmRlbGV0ZShpZCk7XHJcbiAgICByZXR1cm4gcmVzcG9uc2U7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBFeGVjdXRlcyBhIGNhbGwgdXNpbmcgdGhlIHByb3ZpZGVkIHR5cGUgYW5kIG9wdGlvbnMuXHJcbiAqXHJcbiAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gdHlwZSAtIFRoZSB0eXBlIG9mIGNhbGwgdG8gZXhlY3V0ZS5cclxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zPXt9XSAtIEFkZGl0aW9uYWwgb3B0aW9ucyBmb3IgdGhlIGNhbGwuXHJcbiAqIEByZXR1cm4ge1Byb21pc2V9IC0gQSBwcm9taXNlIHRoYXQgd2lsbCBiZSByZXNvbHZlZCBvciByZWplY3RlZCBiYXNlZCBvbiB0aGUgcmVzdWx0IG9mIHRoZSBjYWxsLlxyXG4gKi9cclxuZnVuY3Rpb24gY2FsbEJpbmRpbmcodHlwZSwgb3B0aW9ucyA9IHt9KSB7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGlkID0gZ2VuZXJhdGVJRCgpO1xyXG4gICAgICAgIG9wdGlvbnNbXCJjYWxsLWlkXCJdID0gaWQ7XHJcbiAgICAgICAgY2FsbFJlc3BvbnNlcy5zZXQoaWQsIHsgcmVzb2x2ZSwgcmVqZWN0IH0pO1xyXG4gICAgICAgIGNhbGwodHlwZSwgb3B0aW9ucykuY2F0Y2goKGVycm9yKSA9PiB7XHJcbiAgICAgICAgICAgIHJlamVjdChlcnJvcik7XHJcbiAgICAgICAgICAgIGNhbGxSZXNwb25zZXMuZGVsZXRlKGlkKTtcclxuICAgICAgICB9KTtcclxuICAgIH0pO1xyXG59XHJcblxyXG4vKipcclxuICogQ2FsbCBtZXRob2QuXHJcbiAqXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gVGhlIG9wdGlvbnMgZm9yIHRoZSBtZXRob2QuXHJcbiAqIEByZXR1cm5zIHtPYmplY3R9IC0gVGhlIHJlc3VsdCBvZiB0aGUgY2FsbC5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBDYWxsKG9wdGlvbnMpIHtcclxuICAgIHJldHVybiBjYWxsQmluZGluZyhDYWxsQmluZGluZywgb3B0aW9ucyk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBFeGVjdXRlcyBhIG1ldGhvZCBieSBuYW1lLlxyXG4gKlxyXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBtZXRob2QgaW4gdGhlIGZvcm1hdCAncGFja2FnZS5zdHJ1Y3QubWV0aG9kJy5cclxuICogQHBhcmFtIHsuLi4qfSBhcmdzIC0gVGhlIGFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSBtZXRob2QuXHJcbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgbmFtZSBpcyBub3QgYSBzdHJpbmcgb3IgaXMgbm90IGluIHRoZSBjb3JyZWN0IGZvcm1hdC5cclxuICogQHJldHVybnMgeyp9IFRoZSByZXN1bHQgb2YgdGhlIG1ldGhvZCBleGVjdXRpb24uXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gQnlOYW1lKG5hbWUsIC4uLmFyZ3MpIHtcclxuICAgIGlmICh0eXBlb2YgbmFtZSAhPT0gXCJzdHJpbmdcIiB8fCBuYW1lLnNwbGl0KFwiLlwiKS5sZW5ndGggIT09IDMpIHtcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYWxsQnlOYW1lIHJlcXVpcmVzIGEgc3RyaW5nIGluIHRoZSBmb3JtYXQgJ3BhY2thZ2Uuc3RydWN0Lm1ldGhvZCdcIik7XHJcbiAgICB9XHJcbiAgICBsZXQgW3BhY2thZ2VOYW1lLCBzdHJ1Y3ROYW1lLCBtZXRob2ROYW1lXSA9IG5hbWUuc3BsaXQoXCIuXCIpO1xyXG4gICAgcmV0dXJuIGNhbGxCaW5kaW5nKENhbGxCaW5kaW5nLCB7XHJcbiAgICAgICAgcGFja2FnZU5hbWUsXHJcbiAgICAgICAgc3RydWN0TmFtZSxcclxuICAgICAgICBtZXRob2ROYW1lLFxyXG4gICAgICAgIGFyZ3NcclxuICAgIH0pO1xyXG59XHJcblxyXG4vKipcclxuICogQ2FsbHMgYSBtZXRob2QgYnkgaXRzIElEIHdpdGggdGhlIHNwZWNpZmllZCBhcmd1bWVudHMuXHJcbiAqXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBtZXRob2RJRCAtIFRoZSBJRCBvZiB0aGUgbWV0aG9kIHRvIGNhbGwuXHJcbiAqIEBwYXJhbSB7Li4uKn0gYXJncyAtIFRoZSBhcmd1bWVudHMgdG8gcGFzcyB0byB0aGUgbWV0aG9kLlxyXG4gKiBAcmV0dXJuIHsqfSAtIFRoZSByZXN1bHQgb2YgdGhlIG1ldGhvZCBjYWxsLlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIEJ5SUQobWV0aG9kSUQsIC4uLmFyZ3MpIHtcclxuICAgIHJldHVybiBjYWxsQmluZGluZyhDYWxsQmluZGluZywge1xyXG4gICAgICAgIG1ldGhvZElELFxyXG4gICAgICAgIGFyZ3NcclxuICAgIH0pO1xyXG59XHJcblxyXG4vKipcclxuICogQ2FsbHMgYSBtZXRob2Qgb24gYSBwbHVnaW4uXHJcbiAqXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSBwbHVnaW5OYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHBsdWdpbi5cclxuICogQHBhcmFtIHtzdHJpbmd9IG1ldGhvZE5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgbWV0aG9kIHRvIGNhbGwuXHJcbiAqIEBwYXJhbSB7Li4uKn0gYXJncyAtIFRoZSBhcmd1bWVudHMgdG8gcGFzcyB0byB0aGUgbWV0aG9kLlxyXG4gKiBAcmV0dXJucyB7Kn0gLSBUaGUgcmVzdWx0IG9mIHRoZSBtZXRob2QgY2FsbC5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBQbHVnaW4ocGx1Z2luTmFtZSwgbWV0aG9kTmFtZSwgLi4uYXJncykge1xyXG4gICAgcmV0dXJuIGNhbGxCaW5kaW5nKENhbGxCaW5kaW5nLCB7XHJcbiAgICAgICAgcGFja2FnZU5hbWU6IFwid2FpbHMtcGx1Z2luc1wiLFxyXG4gICAgICAgIHN0cnVjdE5hbWU6IHBsdWdpbk5hbWUsXHJcbiAgICAgICAgbWV0aG9kTmFtZSxcclxuICAgICAgICBhcmdzXHJcbiAgICB9KTtcclxufVxyXG4iLCAiLypcclxuIF9cdCAgIF9fXHQgIF8gX19cclxufCB8XHQgLyAvX19fIF8oXykgL19fX19cclxufCB8IC98IC8gLyBfXyBgLyAvIC8gX19fL1xyXG58IHwvIHwvIC8gL18vIC8gLyAoX18gIClcclxufF9fL3xfXy9cXF9fLF8vXy9fL19fX18vXHJcblRoZSBlbGVjdHJvbiBhbHRlcm5hdGl2ZSBmb3IgR29cclxuKGMpIExlYSBBbnRob255IDIwMTktcHJlc2VudFxyXG4qL1xyXG5cclxuaW1wb3J0IHtkZWJ1Z0xvZ30gZnJvbSBcIi4uL0B3YWlsc2lvL3J1bnRpbWUvc3JjL2xvZ1wiO1xyXG5cclxud2luZG93Ll93YWlscyA9IHdpbmRvdy5fd2FpbHMgfHwge307XHJcblxyXG5pbXBvcnQgKiBhcyBBcHBsaWNhdGlvbiBmcm9tIFwiLi4vQHdhaWxzaW8vcnVudGltZS9zcmMvYXBwbGljYXRpb25cIjtcclxuaW1wb3J0ICogYXMgQnJvd3NlciBmcm9tIFwiLi4vQHdhaWxzaW8vcnVudGltZS9zcmMvYnJvd3NlclwiO1xyXG5pbXBvcnQgKiBhcyBDbGlwYm9hcmQgZnJvbSBcIi4uL0B3YWlsc2lvL3J1bnRpbWUvc3JjL2NsaXBib2FyZFwiO1xyXG5pbXBvcnQgKiBhcyBGbGFncyBmcm9tIFwiLi4vQHdhaWxzaW8vcnVudGltZS9zcmMvZmxhZ3NcIjtcclxuaW1wb3J0ICogYXMgU2NyZWVucyBmcm9tIFwiLi4vQHdhaWxzaW8vcnVudGltZS9zcmMvc2NyZWVuc1wiO1xyXG5pbXBvcnQgKiBhcyBTeXN0ZW0gZnJvbSBcIi4uL0B3YWlsc2lvL3J1bnRpbWUvc3JjL3N5c3RlbVwiO1xyXG5pbXBvcnQgKiBhcyBXaW5kb3cgZnJvbSBcIi4uL0B3YWlsc2lvL3J1bnRpbWUvc3JjL3dpbmRvd1wiO1xyXG5pbXBvcnQgKiBhcyBXTUwgZnJvbSAnLi4vQHdhaWxzaW8vcnVudGltZS9zcmMvd21sJztcclxuaW1wb3J0ICogYXMgRXZlbnRzIGZyb20gXCIuLi9Ad2FpbHNpby9ydW50aW1lL3NyYy9ldmVudHNcIjtcclxuaW1wb3J0ICogYXMgRGlhbG9ncyBmcm9tIFwiLi4vQHdhaWxzaW8vcnVudGltZS9zcmMvZGlhbG9nc1wiO1xyXG5pbXBvcnQgKiBhcyBDYWxsIGZyb20gXCIuLi9Ad2FpbHNpby9ydW50aW1lL3NyYy9jYWxsc1wiO1xyXG5pbXBvcnQge2ludm9rZX0gZnJvbSBcIi4uL0B3YWlsc2lvL3J1bnRpbWUvc3JjL3N5c3RlbVwiO1xyXG5cclxuLyoqKlxyXG4gVGhpcyB0ZWNobmlxdWUgZm9yIHByb3BlciBsb2FkIGRldGVjdGlvbiBpcyB0YWtlbiBmcm9tIEhUTVg6XHJcblxyXG4gQlNEIDItQ2xhdXNlIExpY2Vuc2VcclxuXHJcbiBDb3B5cmlnaHQgKGMpIDIwMjAsIEJpZyBTa3kgU29mdHdhcmVcclxuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXHJcblxyXG4gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XHJcbiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcclxuXHJcbiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcclxuIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxyXG5cclxuIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcclxuIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb25cclxuIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLlxyXG5cclxuIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXHJcbiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXHJcbiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkVcclxuIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEVcclxuIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMXHJcbiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUlxyXG4gU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVJcclxuIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksXHJcbiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRVxyXG4gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cclxuXHJcbiAqKiovXHJcblxyXG53aW5kb3cuX3dhaWxzLmludm9rZT1pbnZva2U7XHJcblxyXG53aW5kb3cud2FpbHMgPSB3aW5kb3cud2FpbHMgfHwge307XHJcbndpbmRvdy53YWlscy5BcHBsaWNhdGlvbiA9IEFwcGxpY2F0aW9uO1xyXG53aW5kb3cud2FpbHMuQnJvd3NlciA9IEJyb3dzZXI7XHJcbndpbmRvdy53YWlscy5DYWxsID0gQ2FsbDtcclxud2luZG93LndhaWxzLkNsaXBib2FyZCA9IENsaXBib2FyZDtcclxud2luZG93LndhaWxzLkRpYWxvZ3MgPSBEaWFsb2dzO1xyXG53aW5kb3cud2FpbHMuRXZlbnRzID0gRXZlbnRzO1xyXG53aW5kb3cud2FpbHMuRmxhZ3MgPSBGbGFncztcclxud2luZG93LndhaWxzLlNjcmVlbnMgPSBTY3JlZW5zO1xyXG53aW5kb3cud2FpbHMuU3lzdGVtID0gU3lzdGVtO1xyXG53aW5kb3cud2FpbHMuV2luZG93ID0gV2luZG93O1xyXG53aW5kb3cud2FpbHMuV01MID0gV01MO1xyXG5cclxuXHJcbmxldCBpc1JlYWR5ID0gZmFsc2VcclxuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsIGZ1bmN0aW9uKCkge1xyXG4gICAgaXNSZWFkeSA9IHRydWVcclxuICAgIHdpbmRvdy5fd2FpbHMuaW52b2tlKCd3YWlsczpydW50aW1lOnJlYWR5Jyk7XHJcbiAgICBpZihERUJVRykge1xyXG4gICAgICAgIGRlYnVnTG9nKFwiV2FpbHMgUnVudGltZSBMb2FkZWRcIik7XHJcbiAgICB9XHJcbn0pXHJcblxyXG5mdW5jdGlvbiB3aGVuUmVhZHkoZm4pIHtcclxuICAgIGlmIChpc1JlYWR5IHx8IGRvY3VtZW50LnJlYWR5U3RhdGUgPT09ICdjb21wbGV0ZScpIHtcclxuICAgICAgICBmbigpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJywgZm4pO1xyXG4gICAgfVxyXG59XHJcblxyXG53aGVuUmVhZHkoKCkgPT4ge1xyXG4gICAgV01MLlJlbG9hZCgpO1xyXG59KTtcclxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7QUFLTyxXQUFTLFNBQVMsU0FBUztBQUU5QixZQUFRO0FBQUEsTUFDSixrQkFBa0IsVUFBVTtBQUFBLE1BQzVCO0FBQUEsTUFDQTtBQUFBLElBQ0o7QUFBQSxFQUNKOzs7QUNaQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7OztBQ0FBLE1BQUksY0FDRjtBQVdLLE1BQUksU0FBUyxDQUFDQSxRQUFPLE9BQU87QUFDakMsUUFBSSxLQUFLO0FBQ1QsUUFBSSxJQUFJQTtBQUNSLFdBQU8sS0FBSztBQUNWLFlBQU0sWUFBYSxLQUFLLE9BQU8sSUFBSSxLQUFNLENBQUM7QUFBQSxJQUM1QztBQUNBLFdBQU87QUFBQSxFQUNUOzs7QUNOQSxNQUFNLGFBQWEsT0FBTyxTQUFTLFNBQVM7QUFHckMsTUFBTSxjQUFjO0FBQUEsSUFDdkIsTUFBTTtBQUFBLElBQ04sV0FBVztBQUFBLElBQ1gsYUFBYTtBQUFBLElBQ2IsUUFBUTtBQUFBLElBQ1IsYUFBYTtBQUFBLElBQ2IsUUFBUTtBQUFBLElBQ1IsUUFBUTtBQUFBLElBQ1IsU0FBUztBQUFBLElBQ1QsUUFBUTtBQUFBLElBQ1Is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TUFDaEMscUJBQXFCO0FBQUEsTUFDckIsNkJBQTZCO0FBQUEsTUFDN0IsMEJBQTBCO0FBQUEsTUFDMUIsdUJBQXVCO0FBQUEsTUFDdkIsdUJBQXVCO0FBQUEsTUFDdkIsMkJBQTJCO0FBQUEsTUFDM0IsK0JBQStCO0FBQUEsTUFDL0Isb0JBQW9CO0FBQUEsTUFDcEIscUJBQXFCO0FBQUEsTUFDckIscUJBQXFCO0FBQUEsTUFDckIsc0JBQXNCO0FBQUEsTUFDdEIsZ0NBQWdDO0FBQUEsTUFDaEMsa0NBQWtDO0FBQUEsTUFDbEMsbUNBQW1DO0FBQUEsTUFDbkMsb0NBQW9DO0FBQUEsTUFDcEMsK0JBQStCO0FBQUEsTUFDL0IsNkJBQTZCO0FBQUEsTUFDN0IsdUJBQXVCO0FBQUEsTUFDdkIsaUNBQWlDO0FBQUEsTUFDakMsOEJBQThCO0FBQUEsTUFDOUIsNEJBQTRCO0FBQUEsTUFDNUIsc0NBQXNDO0FBQUEsTUFDdEMsNEJBQTRCO0FBQUEsTUFDNUIsc0JBQXNCO0FBQUEsTUFDdEIsa0NBQWtDO0FBQUEsTUFDbEMsc0JBQXNCO0FBQUEsTUFDdEIsd0JBQXdCO0FBQUEsTUFDeEIsMkJBQTJCO0FBQUEsTUFDM0Isd0JBQXdCO0FBQUEsTUFDeEIsbUJBQW1CO0FBQUEsTUFDbkIsMEJBQTBCO0FBQUEsTUFDMUIsOEJBQThCO0FBQUEsTUFDOUIseUJBQXlCO0FBQUEsTUFDekIsNkJBQTZCO0FBQUEsTUFDN0IsaUJBQWlCO0FBQUEsTUFDakIsZ0JBQWdCO0FBQUEsTUFDaEIsc0JBQXNCO0FBQUEsTUFDdEIsZUFBZTtBQUFBLE1BQ2YseUJBQXlCO0FBQUEsTUFDekIsd0JBQXdCO0FBQUEsTUFDeEIsb0JBQW9CO0FBQUEsTUFDcEIscUJBQXFCO0FBQUEsTUFDckIsaUJBQWlCO0FBQUEsTUFDakIsaUJBQWlCO0FBQUEsTUFDakIsc0JBQXNCO0FBQUEsTUFDdEIsbUNBQW1DO0FBQUEsTUFDbkMscUNBQXFDO0FBQUEsTUFDckMsdUJBQXVCO0FBQUEsTUFDdkIsc0JBQXNCO0FBQUEsTUFDdEIsd0JBQXdCO0FBQUEsTUFDeEIsMkJBQTJCO0FBQUEsTUFDM0IsbUJBQW1CO0FBQUEsTUFDbkIscUJBQXFCO0FBQUEsTUFDckIsc0JBQXNCO0FBQUEsTUFDdEIsc0JBQXNCO0FBQUEsTUFDdEIsOEJBQThCO0FBQUEsTUFDOUIsaUJBQWlCO0FBQUEsTUFDakIseUJBQXlCO0FBQUEsTUFDekIsMkJBQTJCO0FBQUEsTUFDM0IsK0JBQStCO0FBQUEsTUFDL0IsMEJBQTBCO0FBQUEsTUFDMUIsOEJBQThCO0FBQUEsTUFDOUIsaUJBQWlCO0FBQUEsTUFDakIsdUJBQXVCO0FBQUEsTUFDdkIsZ0JBQWdCO0FBQUEsTUFDaEIsMEJBQTBCO0FBQUEsTUFDMUIseUJBQXlCO0FBQUEsTUFDekIsc0JBQXNCO0FBQUEsTUFDdEIsa0JBQWtCO0FBQUEsTUFDbEIsbUJBQW1CO0FBQUEsTUFDbkIsa0JBQWtCO0FBQUEsTUFDbEIsdUJBQXVCO0FBQUEsTUFDdkIsb0NBQW9DO0FBQUEsTUFDcEMsc0NBQXNDO0FBQUEsTUFDdEMsd0JBQXdCO0FBQUEsTUFDeEIsdUJBQXVCO0FBQUEsTUFDdkIseUJBQXlCO0FBQUEsTUFDekIsNEJBQTRCO0FBQUEsTUFDNUIsNEJBQTRCO0FBQUEsTUFDNUIsY0FBYztBQUFBLE1BQ2QsYUFBYTtBQUFBLE1BQ2IsY0FBYztBQUFBLE1BQ2Qsb0JBQW9CO0FBQUEsTUFDcEIsbUJBQW1CO0FBQUEsTUFDbkIsdUJBQXVCO0FBQUEsTUFDdkIsc0JBQXNCO0FBQUEsTUFDdEIscUJBQXFCO0FBQUEsTUFDckIsb0JBQW9CO0FBQUEsTUFDcEIsaUJBQWlCO0FBQUEsTUFDakIsZ0JBQWdCO0FBQUEsTUFDaEIsb0JBQW9CO0FBQUEsTUFDcEIsbUJBQW1CO0FBQUEsTUFDbkIsdUJBQXVCO0FBQUEsTUFDdkIsc0JBQXNCO0FBQUEsTUFDdEIscUJBQXFCO0FBQUEsTUFDckIsb0JBQW9CO0FBQUEsTUFDcEIsZ0JBQWdCO0FBQUEsTUFDaEIsZUFBZTtBQUFBLE1BQ2YsZUFBZTtBQUFBLE1BQ2YsY0FBYztBQUFBLE1BQ2QsMEJBQTBCO0FBQUEsTUFDMUIseUJBQXlCO0FBQUEsTUFDekIsc0NBQXNDO0FBQUEsTUFDdEMseURBQXlEO0FBQUEsTUFDekQsNEJBQTRCO0FBQUEsTUFDNUIsNEJBQTRCO0FBQUEsTUFDNUIsMkJBQTJCO0FBQUEsTUFDM0IsNkJBQTZCO0FBQUEsTUFDN0IsMEJBQTBCO0FBQUEsSUFDM0I7QUFBQSxJQUNBLE9BQU87QUFBQSxNQUNOLG9CQUFvQjtBQUFBLElBQ3JCO0FBQUEsSUFDQSxRQUFRO0FBQUEsTUFDUCxvQkFBb0I7QUFBQSxNQUNwQixnQkFBZ0I7QUFBQSxNQUNoQixrQkFBa0I7QUFBQSxNQUNsQixrQkFBa0I7QUFBQSxNQUNsQixvQkFBb0I7QUFBQSxNQUNwQixlQUFlO0FBQUEsTUFDZixnQkFBZ0I7QUFBQSxNQUNoQixrQkFBa0I7QUFBQSxNQUNsQixlQUFlO0FBQUEsTUFDZixZQUFZO0FBQUEsTUFDWixjQUFjO0FBQUEsTUFDZCxlQUFlO0FBQUEsTUFDZixpQkFBaUI7QUFBQSxNQUNqQixhQUFhO0FBQUEsTUFDYixpQkFBaUI7QUFBQSxNQUNqQixZQUFZO0FBQUEsTUFDWixZQUFZO0FBQUEsTUFDWixrQkFBa0I7QUFBQSxNQUNsQixvQkFBb0I7QUFBQSxNQUNwQixvQkFBb0I7QUFBQSxNQUNwQixjQUFjO0FBQUEsSUFDZjtBQUFBLEVBQ0Q7OztBRG5LTyxNQUFNLFFBQVE7QUFHckIsU0FBTyxTQUFTLE9BQU8sVUFBVSxDQUFDO0FBQ2xDLFNBQU8sT0FBTyxxQkFBcUI7QUFFbkMsTUFBTUMsUUFBTyx1QkFBdUIsWUFBWSxRQUFRLEVBQUU7QUFDMUQsTUFBTSxhQUFhO0FBQ25CLE1BQU0saUJBQWlCLG9CQUFJLElBQUk7QUFFL0IsTUFBTSxXQUFOLE1BQWU7QUFBQSxJQUNYLFlBQVksV0FBVyxVQUFVLGNBQWM7QUFDM0MsV0FBSyxZQUFZO0FBQ2pCLFdBQUssZUFBZSxnQkFBZ0I7QUFDcEMsV0FBSyxXQUFXLENBQUMsU0FBUztBQUN0QixpQkFBUyxJQUFJO0FBQ2IsWUFBSSxLQUFLLGlCQUFpQjtBQUFJLGlCQUFPO0FBQ3JDLGFBQUssZ0JBQWdCO0FBQ3JCLGVBQU8sS0FBSyxpQkFBaUI7QUFBQSxNQUNqQztBQUFBLElBQ0o7QUFBQSxFQUNKO0FBRU8sTUFBTSxhQUFOLE1BQWlCO0FBQUEsSUFDcEIsWUFBWSxNQUFNLE9BQU8sTUFBTTtBQUMzQixXQUFLLE9BQU87QUFDWixXQUFLLE9BQU87QUFBQSxJQUNoQjtBQUFBLEVBQ0o7QUFFTyxXQUFTLFFBQVE7QUFBQSxFQUN4QjtBQUVBLFdBQVMsbUJBQW1CLE9BQU87QUFDL0IsUUFBSSxZQUFZLGVBQWUsSUFBSSxNQUFNLElBQUk7QUFDN0MsUUFBSSxXQUFXO0FBQ1gsVUFBSSxXQUFXLFVBQVUsT0FBTyxjQUFZO0FBQ3hDLFlBQUksU0FBUyxTQUFTLFNBQVMsS0FBSztBQUNwQyxZQUFJO0FBQVEsaUJBQU87QUFBQSxNQUN2QixDQUFDO0FBQ0QsVUFBSSxTQUFTLFNBQVMsR0FBRztBQUNyQixvQkFBWSxVQUFVLE9BQU8sT0FBSyxDQUFDLFNBQVMsU0FBUyxDQUFDLENBQUM7QUFDdkQsWUFBSSxVQUFVLFdBQVc7QUFBRyx5QkFBZSxPQUFPLE1BQU0sSUFBSTtBQUFBO0FBQ3ZELHlCQUFlLElBQUksTUFBTSxNQUFNLFNBQVM7QUFBQSxNQUNqRDtBQUFBLElBQ0o7QUFBQSxFQUNKO0FBV08sV0FBUyxXQUFXLFdBQVcsVUFBVSxjQUFjO0FBQzFELFFBQUksWUFBWSxlQUFlLElBQUksU0FBUyxLQUFLLENBQUM7QUFDbEQsVUFBTSxlQUFlLElBQUksU0FBUyxXQUFXLFVBQVUsWUFBWTtBQUNuRSxjQUFVLEtBQUssWUFBWTtBQUMzQixtQkFBZSxJQUFJLFdBQVcsU0FBUztBQUN2QyxXQUFPLE1BQU0sWUFBWSxZQUFZO0FBQUEsRUFDekM7QUFRTyxXQUFTLEdBQUcsV0FBVyxVQUFVO0FBQUUsV0FBTyxXQUFXLFdBQVcsVUFBVSxFQUFFO0FBQUEsRUFBRztBQVMvRSxXQUFTLEtBQUssV0FBVyxVQUFVO0FBQUUsV0FBTyxXQUFXLFdBQVcsVUFBVSxDQUFDO0FBQUEsRUFBRztBQVF2RixXQUFTLFlBQVksVUFBVTtBQUMzQixVQUFNLFlBQVksU0FBUztBQUMzQixRQUFJLFlBQVksZUFBZSxJQUFJLFNBQVMsRUFBRSxPQUFPLE9BQUssTUFBTSxRQUFRO0FBQ3hFLFFBQUksVUFBVSxXQUFXO0FBQUcscUJBQWUsT0FBTyxTQUFTO0FBQUE7QUFDdEQscUJBQWUsSUFBSSxXQUFXLFNBQVM7QUFBQSxFQUNoRDtBQVVPLFdBQVMsSUFBSSxjQUFjLHNCQUFzQjtBQUNwRCxRQUFJLGlCQUFpQixDQUFDLFdBQVcsR0FBRyxvQkFBb0I7QUFDeEQsbUJBQWUsUUFBUSxDQUFBQyxlQUFhLGVBQWUsT0FBT0EsVUFBUyxDQUFDO0FBQUEsRUFDeEU7QUFPTyxXQUFTLFNBQVM7QUFBRSxtQkFBZSxNQUFNO0FBQUEsRUFBRztBQVE1QyxXQUFTLEtBQUssT0FBTztBQUFFLFdBQU9ELE1BQUssWUFBWSxLQUFLO0FBQUEsRUFBRzs7O0FFM0k5RDtBQUFBO0FBQUEsaUJBQUFFO0FBQUEsSUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUE0RUEsU0FBTyxTQUFTLE9BQU8sVUFBVSxDQUFDO0FBQ2xDLFNBQU8sT0FBTyxzQkFBc0I7QUFDcEMsU0FBTyxPQUFPLHVCQUF1QjtBQU9yQyxNQUFNLGFBQWE7QUFDbkIsTUFBTSxnQkFBZ0I7QUFDdEIsTUFBTSxjQUFjO0FBQ3BCLE1BQU0saUJBQWlCO0FBQ3ZCLE1BQU0saUJBQWlCO0FBQ3ZCLE1BQU0saUJBQWlCO0FBRXZCLE1BQU1DLFFBQU8sdUJBQXVCLFlBQVksUUFBUSxFQUFFO0FBQzFELE1BQU0sa0JBQWtCLG9CQUFJLElBQUk7QUFNaEMsV0FBUyxhQUFhO0FBQ2xCLFFBQUk7QUFDSixPQUFHO0FBQ0MsZUFBUyxPQUFPO0FBQUEsSUFDcEIsU0FBUyxnQkFBZ0IsSUFBSSxNQUFNO0FBQ25DLFdBQU87QUFBQSxFQUNYO0FBUUEsV0FBUyxPQUFPLE1BQU0sVUFBVSxDQUFDLEdBQUc7QUFDaEMsVUFBTSxLQUFLLFdBQVc7QUFDdEIsWUFBUSxXQUFXLElBQUk7QUFDdkIsV0FBTyxJQUFJLFFBQVEsQ0FBQyxTQUFTLFdBQVc7QUFDcEMsc0JBQWdCLElBQUksSUFBSSxFQUFDLFNBQVMsT0FBTSxDQUFDO0FBQ3pDLE1BQUFBLE1BQUssTUFBTSxPQUFPLEVBQUUsTUFBTSxDQUFDLFVBQVU7QUFDakMsZUFBTyxLQUFLO0FBQ1osd0JBQWdCLE9BQU8sRUFBRTtBQUFBLE1BQzdCLENBQUM7QUFBQSxJQUNMLENBQUM7QUFBQSxFQUNMO0FBV0EsV0FBUyxxQkFBcUIsSUFBSSxNQUFNLFFBQVE7QUFDNUMsUUFBSSxJQUFJLGdCQUFnQixJQUFJLEVBQUU7QUFDOUIsUUFBSSxHQUFHO0FBQ0gsVUFBSSxRQUFRO0FBQ1IsVUFBRSxRQUFRLEtBQUssTUFBTSxJQUFJLENBQUM7QUFBQSxNQUM5QixPQUFPO0FBQ0gsVUFBRSxRQUFRLElBQUk7QUFBQSxNQUNsQjtBQUNBLHNCQUFnQixPQUFPLEVBQUU7QUFBQSxJQUM3QjtBQUFBLEVBQ0o7QUFVQSxXQUFTLG9CQUFvQixJQUFJLFNBQVM7QUFDdEMsUUFBSSxJQUFJLGdCQUFnQixJQUFJLEVBQUU7QUFDOUIsUUFBSSxHQUFHO0FBQ0gsUUFBRSxPQUFPLE9BQU87QUFDaEIsc0JBQWdCLE9BQU8sRUFBRTtBQUFBLElBQzdCO0FBQUEsRUFDSjtBQVNPLE1BQU0sT0FBTyxDQUFDLFlBQVksT0FBTyxZQUFZLE9BQU87QUFNcEQsTUFBTSxVQUFVLENBQUMsWUFBWSxPQUFPLGVBQWUsT0FBTztBQU0xRCxNQUFNQyxTQUFRLENBQUMsWUFBWSxPQUFPLGFBQWEsT0FBTztBQU10RCxNQUFNLFdBQVcsQ0FBQyxZQUFZLE9BQU8sZ0JBQWdCLE9BQU87QUFNNUQsTUFBTSxXQUFXLENBQUMsWUFBWSxPQUFPLGdCQUFnQixPQUFPO0FBTTVELE1BQU0sV0FBVyxDQUFDLFlBQVksT0FBTyxnQkFBZ0IsT0FBTzs7O0FIeExuRSxXQUFTLFVBQVUsV0FBVyxPQUFLLE1BQU07QUFDckMsUUFBSSxRQUFRLElBQUksV0FBVyxXQUFXLElBQUk7QUFDMUMsU0FBSyxLQUFLO0FBQUEsRUFDZDtBQU9BLFdBQVMsdUJBQXVCO0FBQzVCLFVBQU0sV0FBVyxTQUFTLGlCQUFpQixhQUFhO0FBQ3hELGFBQVMsUUFBUSxTQUFVLFNBQVM7QUFDaEMsWUFBTSxZQUFZLFFBQVEsYUFBYSxXQUFXO0FBQ2xELFlBQU0sVUFBVSxRQUFRLGFBQWEsYUFBYTtBQUNsRCxZQUFNLFVBQVUsUUFBUSxhQUFhLGFBQWEsS0FBSztBQUV2RCxVQUFJLFdBQVcsV0FBWTtBQUN2QixZQUFJLFNBQVM7QUFDVCxtQkFBUyxFQUFDLE9BQU8sV0FBVyxTQUFRLFNBQVMsVUFBVSxPQUFPLFNBQVEsQ0FBQyxFQUFDLE9BQU0sTUFBSyxHQUFFLEVBQUMsT0FBTSxNQUFNLFdBQVUsS0FBSSxDQUFDLEVBQUMsQ0FBQyxFQUFFLEtBQUssU0FBVSxRQUFRO0FBQ3hJLGdCQUFJLFdBQVcsTUFBTTtBQUNqQix3QkFBVSxTQUFTO0FBQUEsWUFDdkI7QUFBQSxVQUNKLENBQUM7QUFDRDtBQUFBLFFBQ0o7QUFDQSxrQkFBVSxTQUFTO0FBQUEsTUFDdkI7QUFHQSxjQUFRLG9CQUFvQixTQUFTLFFBQVE7QUFHN0MsY0FBUSxpQkFBaUIsU0FBUyxRQUFRO0FBQUEsSUFDOUMsQ0FBQztBQUFBLEVBQ0w7QUFRQSxXQUFTLGlCQUFpQixZQUFZLFFBQVE7QUFDMUMsUUFBSSxlQUFlLElBQUksVUFBVTtBQUNqQyxRQUFJLFlBQVksY0FBYyxZQUFZO0FBQzFDLFFBQUksQ0FBQyxVQUFVLElBQUksTUFBTSxHQUFHO0FBQ3hCLGNBQVEsSUFBSSxtQkFBbUIsU0FBUyxZQUFZO0FBQUEsSUFDeEQ7QUFDQSxRQUFJO0FBQ0EsZ0JBQVUsSUFBSSxNQUFNLEVBQUU7QUFBQSxJQUMxQixTQUFTLEdBQUc7QUFDUixjQUFRLE1BQU0sa0NBQWtDLFNBQVMsUUFBUSxDQUFDO0FBQUEsSUFDdEU7QUFBQSxFQUNKO0FBUUEsV0FBUyx3QkFBd0I7QUFDN0IsVUFBTSxXQUFXLFNBQVMsaUJBQWlCLGNBQWM7QUFDekQsYUFBUyxRQUFRLFNBQVUsU0FBUztBQUNoQyxZQUFNLGVBQWUsUUFBUSxhQUFhLFlBQVk7QUFDdEQsWUFBTSxVQUFVLFFBQVEsYUFBYSxhQUFhO0FBQ2xELFlBQU0sVUFBVSxRQUFRLGFBQWEsYUFBYSxLQUFLO0FBQ3ZELFlBQU0sZUFBZSxRQUFRLGFBQWEsbUJBQW1CLEtBQUs7QUFFbEUsVUFBSSxXQUFXLFdBQVk7QUFDdkIsWUFBSSxTQUFTO0FBQ1QsbUJBQVMsRUFBQyxPQUFPLFdBQVcsU0FBUSxTQUFTLFNBQVEsQ0FBQyxFQUFDLE9BQU0sTUFBSyxHQUFFLEVBQUMsT0FBTSxNQUFNLFdBQVUsS0FBSSxDQUFDLEVBQUMsQ0FBQyxFQUFFLEtBQUssU0FBVSxRQUFRO0FBQ3ZILGdCQUFJLFdBQVcsTUFBTTtBQUNqQiwrQkFBaUIsY0FBYyxZQUFZO0FBQUEsWUFDL0M7QUFBQSxVQUNKLENBQUM7QUFDRDtBQUFBLFFBQ0o7QUFDQSx5QkFBaUIsY0FBYyxZQUFZO0FBQUEsTUFDL0M7QUFHQSxjQUFRLG9CQUFvQixTQUFTLFFBQVE7QUFHN0MsY0FBUSxpQkFBaUIsU0FBUyxRQUFRO0FBQUEsSUFDOUMsQ0FBQztBQUFBLEVBQ0w7QUFXQSxXQUFTLDRCQUE0QjtBQUNqQyxVQUFNLFdBQVcsU0FBUyxpQkFBaUIsZUFBZTtBQUMxRCxhQUFTLFFBQVEsU0FBVSxTQUFTO0FBQ2hDLFlBQU0sTUFBTSxRQUFRLGFBQWEsYUFBYTtBQUM5QyxZQUFNLFVBQVUsUUFBUSxhQUFhLGFBQWE7QUFDbEQsWUFBTSxVQUFVLFFBQVEsYUFBYSxhQUFhLEtBQUs7QUFFdkQsVUFBSSxXQUFXLFdBQVk7QUFDdkIsWUFBSSxTQUFTO0FBQ1QsbUJBQVMsRUFBQyxPQUFPLFdBQVcsU0FBUSxTQUFTLFNBQVEsQ0FBQyxFQUFDLE9BQU0sTUFBSyxHQUFFLEVBQUMsT0FBTSxNQUFNLFdBQVUsS0FBSSxDQUFDLEVBQUMsQ0FBQyxFQUFFLEtBQUssU0FBVSxRQUFRO0FBQ3ZILGdCQUFJLFdBQVcsTUFBTTtBQUNqQixtQkFBSyxRQUFRLEdBQUc7QUFBQSxZQUNwQjtBQUFBLFVBQ0osQ0FBQztBQUNEO0FBQUEsUUFDSjtBQUNBLGFBQUssUUFBUSxHQUFHO0FBQUEsTUFDcEI7QUFHQSxjQUFRLG9CQUFvQixTQUFTLFFBQVE7QUFHN0MsY0FBUSxpQkFBaUIsU0FBUyxRQUFRO0FBQUEsSUFDOUMsQ0FBQztBQUFBLEVBQ0w7QUFPTyxXQUFTLFNBQVM7QUFDckIsUUFBRyxNQUFPO0FBQ04sZUFBUyxlQUFlO0FBQUEsSUFDNUI7QUFDQSx5QkFBcUI7QUFDckIsMEJBQXNCO0FBQ3RCLDhCQUEwQjtBQUFBLEVBQzlCO0FBTUEsV0FBUyxjQUFjLGNBQWM7QUFFakMsUUFBSSxTQUFTLG9CQUFJLElBQUk7QUFHckIsYUFBUyxVQUFVLGNBQWM7QUFFN0IsVUFBRyxPQUFPLGFBQWEsTUFBTSxNQUFNLFlBQVk7QUFFM0MsZUFBTyxJQUFJLFFBQVEsYUFBYSxNQUFNLENBQUM7QUFBQSxNQUMzQztBQUFBLElBRUo7QUFFQSxXQUFPO0FBQUEsRUFDWDs7O0FJOUtBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBZUEsU0FBTyxTQUFTLE9BQU8sVUFBVSxDQUFDO0FBQ2xDLFNBQU8sT0FBTyxvQkFBb0I7QUFDbEMsU0FBTyxPQUFPLG1CQUFtQjtBQUdqQyxNQUFNLGNBQWM7QUFDcEIsTUFBTUMsUUFBTyx1QkFBdUIsWUFBWSxNQUFNLEVBQUU7QUFDeEQsTUFBSSxnQkFBZ0Isb0JBQUksSUFBSTtBQU81QixXQUFTQyxjQUFhO0FBQ2xCLFFBQUk7QUFDSixPQUFHO0FBQ0MsZUFBUyxPQUFPO0FBQUEsSUFDcEIsU0FBUyxjQUFjLElBQUksTUFBTTtBQUNqQyxXQUFPO0FBQUEsRUFDWDtBQVdBLFdBQVMsY0FBYyxJQUFJLE1BQU0sUUFBUTtBQUNyQyxVQUFNLGlCQUFpQixxQkFBcUIsRUFBRTtBQUM5QyxRQUFJLGdCQUFnQjtBQUNoQixxQkFBZSxRQUFRLFNBQVMsS0FBSyxNQUFNLElBQUksSUFBSSxJQUFJO0FBQUEsSUFDM0Q7QUFBQSxFQUNKO0FBVUEsV0FBUyxhQUFhLElBQUksU0FBUztBQUMvQixVQUFNLGlCQUFpQixxQkFBcUIsRUFBRTtBQUM5QyxRQUFJLGdCQUFnQjtBQUNoQixxQkFBZSxPQUFPLE9BQU87QUFBQSxJQUNqQztBQUFBLEVBQ0o7QUFTQSxXQUFTLHFCQUFxQixJQUFJO0FBQzlCLFVBQU0sV0FBVyxjQUFjLElBQUksRUFBRTtBQUNyQyxrQkFBYyxPQUFPLEVBQUU7QUFDdkIsV0FBTztBQUFBLEVBQ1g7QUFTQSxXQUFTLFlBQVksTUFBTSxVQUFVLENBQUMsR0FBRztBQUNyQyxXQUFPLElBQUksUUFBUSxDQUFDLFNBQVMsV0FBVztBQUNwQyxZQUFNLEtBQUtBLFlBQVc7QUFDdEIsY0FBUSxTQUFTLElBQUk7QUFDckIsb0JBQWMsSUFBSSxJQUFJLEVBQUUsU0FBUyxPQUFPLENBQUM7QUFDekMsTUFBQUQsTUFBSyxNQUFNLE9BQU8sRUFBRSxNQUFNLENBQUMsVUFBVTtBQUNqQyxlQUFPLEtBQUs7QUFDWixzQkFBYyxPQUFPLEVBQUU7QUFBQSxNQUMzQixDQUFDO0FBQUEsSUFDTCxDQUFDO0FBQUEsRUFDTDtBQVFPLFdBQVMsS0FBSyxTQUFTO0FBQzFCLFdBQU8sWUFBWSxhQUFhLE9BQU87QUFBQSxFQUMzQztBQVVPLFdBQVMsT0FBTyxTQUFTLE1BQU07QUFDbEMsUUFBSSxPQUFPLFNBQVMsWUFBWSxLQUFLLE1BQU0sR0FBRyxFQUFFLFdBQVcsR0FBRztBQUMxRCxZQUFNLElBQUksTUFBTSxvRUFBb0U7QUFBQSxJQUN4RjtBQUNBLFFBQUksQ0FBQyxhQUFhLFlBQVksVUFBVSxJQUFJLEtBQUssTUFBTSxHQUFHO0FBQzFELFdBQU8sWUFBWSxhQUFhO0FBQUEsTUFDNUI7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxJQUNKLENBQUM7QUFBQSxFQUNMO0FBU08sV0FBUyxLQUFLLGFBQWEsTUFBTTtBQUNwQyxXQUFPLFlBQVksYUFBYTtBQUFBLE1BQzVCO0FBQUEsTUFDQTtBQUFBLElBQ0osQ0FBQztBQUFBLEVBQ0w7QUFVTyxXQUFTLE9BQU8sWUFBWSxlQUFlLE1BQU07QUFDcEQsV0FBTyxZQUFZLGFBQWE7QUFBQSxNQUM1QixhQUFhO0FBQUEsTUFDYixZQUFZO0FBQUEsTUFDWjtBQUFBLE1BQ0E7QUFBQSxJQUNKLENBQUM7QUFBQSxFQUNMOzs7QUNwSkEsU0FBTyxTQUFTLE9BQU8sVUFBVSxDQUFDO0FBOENsQyxTQUFPLE9BQU8sU0FBTztBQUVyQixTQUFPLFFBQVEsT0FBTyxTQUFTLENBQUM7QUFDaEMsU0FBTyxNQUFNLGNBQWM7QUFDM0IsU0FBTyxNQUFNLFVBQVU7QUFDdkIsU0FBTyxNQUFNLE9BQU87QUFDcEIsU0FBTyxNQUFNLFlBQVk7QUFDekIsU0FBTyxNQUFNLFVBQVU7QUFDdkIsU0FBTyxNQUFNLFNBQVM7QUFDdEIsU0FBTyxNQUFNLFFBQVE7QUFDckIsU0FBTyxNQUFNLFVBQVU7QUFDdkIsU0FBTyxNQUFNLFNBQVM7QUFDdEIsU0FBTyxNQUFNLFNBQVM7QUFDdEIsU0FBTyxNQUFNLE1BQU07QUFHbkIsTUFBSSxVQUFVO0FBQ2QsV0FBUyxpQkFBaUIsb0JBQW9CLFdBQVc7QUFDckQsY0FBVTtBQUNWLFdBQU8sT0FBTyxPQUFPLHFCQUFxQjtBQUMxQyxRQUFHLE1BQU87QUFDTixlQUFTLHNCQUFzQjtBQUFBLElBQ25DO0FBQUEsRUFDSixDQUFDO0FBRUQsV0FBUyxVQUFVLElBQUk7QUFDbkIsUUFBSSxXQUFXLFNBQVMsZUFBZSxZQUFZO0FBQy9DLFNBQUc7QUFBQSxJQUNQLE9BQU87QUFDSCxlQUFTLGlCQUFpQixvQkFBb0IsRUFBRTtBQUFBLElBQ3BEO0FBQUEsRUFDSjtBQUVBLFlBQVUsTUFBTTtBQUNaLElBQUksT0FBTztBQUFBLEVBQ2YsQ0FBQzsiLAogICJuYW1lcyI6IFsic2l6ZSIsICJjYWxsIiwgImNhbGwiLCAiY2FsbCIsICJjYWxsIiwgIkhpZGUiLCAiU2hvdyIsICJjYWxsIiwgIndpZHRoIiwgImhlaWdodCIsICJIaWRlIiwgIlNob3ciLCAiY2FsbCIsICJldmVudE5hbWUiLCAiRXJyb3IiLCAiY2FsbCIsICJFcnJvciIsICJjYWxsIiwgImdlbmVyYXRlSUQiXQp9Cg==
diff --git a/v3/examples/wml/assets/runtime.js b/v3/examples/wml/assets/runtime.js
index 2c7d16ed30b..baaccee0402 100644
--- a/v3/examples/wml/assets/runtime.js
+++ b/v3/examples/wml/assets/runtime.js
@@ -1 +1 @@
-(()=>{var le=Object.defineProperty;var w=(e,i)=>{for(var n in i)le(e,n,{get:i[n],enumerable:!0})};var T={};w(T,{Hide:()=>We,Quit:()=>fe,Show:()=>ge});var de="useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict";var f=(e=21)=>{let i="",n=e;for(;n--;)i+=de[Math.random()*64|0];return i};var ce=window.location.origin+"/wails/runtime",l={Call:0,Clipboard:1,Application:2,Events:3,ContextMenu:4,Dialog:5,Window:6,Screens:7,System:8,Browser:9,CancelCall:10},se=f();function d(e,i){return function(n,o=null){return we(e,n,i,o)}}function we(e,i,n,o){let t=new URL(ce);t.searchParams.append("object",e),t.searchParams.append("method",i);let a={headers:{}};return n&&(a.headers["x-wails-window-name"]=n),o&&t.searchParams.append("args",JSON.stringify(o)),a.headers["x-wails-client-id"]=se,new Promise((s,m)=>{fetch(t,a).then(c=>{if(c.ok)return c.headers.get("Content-Type")&&c.headers.get("Content-Type").indexOf("application/json")!==-1?c.json():c.text();m(Error(c.statusText))}).then(c=>s(c)).catch(c=>m(c))})}var P=d(l.Application,""),me=0,ue=1,pe=2;function We(){return P(me)}function ge(){return P(ue)}function fe(){return P(pe)}var B={};w(B,{OpenURL:()=>b});var he=d(l.Browser,""),De=0;function b(e){return he(De,{url:e})}var I={};w(I,{SetText:()=>Me,Text:()=>xe});var Q=d(l.Clipboard,""),Ce=0,Se=1;function Me(e){return Q(Ce,{text:e})}function xe(){return Q(Se)}var L={};w(L,{Capabilities:()=>Re,Environment:()=>Ee,IsAMD64:()=>Oe,IsARM:()=>Pe,IsARM64:()=>Te,IsDarkMode:()=>be,IsDebug:()=>F,IsLinux:()=>Ue,IsMac:()=>ye,IsWindows:()=>R,invoke:()=>h});var J=d(l.System,""),Ae=0,ve=1;function h(e){return window.chrome?window.chrome.webview.postMessage(e):window.webkit.messageHandlers.external.postMessage(e)}function be(){return J(Ae)}function Re(){return fetch("/wails/capabilities").json()}function Ee(){return J(ve)}function R(){return window._wails.environment.OS==="windows"}function Ue(){return window._wails.environment.OS==="linux"}function ye(){return window._wails.environment.OS==="darwin"}function Oe(){return window._wails.environment.Arch==="amd64"}function Pe(){return window._wails.environment.Arch==="arm"}function Te(){return window._wails.environment.Arch==="arm64"}function F(){return window._wails.environment.Debug===!0}window.addEventListener("contextmenu",Le);var Be=d(l.ContextMenu,""),Ie=0;function Fe(e,i,n,o){Be(Ie,{id:e,x:i,y:n,data:o})}function Le(e){let i=e.target,n=window.getComputedStyle(i).getPropertyValue("--custom-contextmenu");if(n=n?n.trim():"",n){e.preventDefault();let o=window.getComputedStyle(i).getPropertyValue("--custom-contextmenu-data");Fe(n,e.clientX,e.clientY,o);return}ze(e)}function ze(e){if(F())return;let i=e.target;switch(window.getComputedStyle(i).getPropertyValue("--default-contextmenu").trim()){case"show":return;case"hide":e.preventDefault();return;default:if(i.isContentEditable)return;let t=window.getSelection(),a=t.toString().length>0;if(a)for(let s=0;sS});function S(e){try{return window._wails.flags[e]}catch(i){throw new Error("Unable to retrieve flag '"+e+"': "+i)}}window._wails=window._wails||{};window._wails.setResizable=He;window._wails.endDrag=ee;window.addEventListener("mousedown",_e);window.addEventListener("mousemove",Ge);window.addEventListener("mouseup",je);var M=!1,E=null,$=!1,ke="auto";function Ne(e){let i=window.getComputedStyle(e.target).getPropertyValue("--webkit-app-region");return!i||i===""||i.trim()!=="drag"||e.buttons!==1?!1:e.detail===1}function He(e){$=e}function ee(){document.body.style.cursor="default",M=!1}function Ve(){return E?(h(`resize:${E}`),!0):!1}function _e(e){(R()&&Ve()||Ne(e))&&(M=!!Ze(e))}function Ze(e){return!(e.offsetX>e.target.clientWidth||e.offsetY>e.target.clientHeight)}function je(e){(e.buttons!==void 0?e.buttons:e.which)>0&&ee()}function W(e=ke){document.documentElement.style.cursor=e,E=e}function Ge(e){M=Ye(e),R()&&$&&Ke(e)}function Ye(e){let i=e.buttons!==void 0?e.buttons:e.which;return M&&i>0?(h("drag"),!1):M}function Ke(e){let i=S("system.resizeHandleHeight")||5,n=S("system.resizeHandleWidth")||5,o=S("resizeCornerExtra")||10,t=window.outerWidth-e.clientXJe,GetCurrent:()=>ei,GetPrimary:()=>$e});var k=d(l.Screens,""),Xe=0,qe=1,Qe=2;function Je(){return k(Xe)}function $e(){return k(qe)}function ei(){return k(Qe)}var H={};w(H,{Center:()=>Oi,Close:()=>qi,Fullscreen:()=>Ti,Get:()=>U,GetZoomLevel:()=>rn,Height:()=>en,Hide:()=>Vi,Maximise:()=>_i,Minimise:()=>Gi,RelativePosition:()=>Ni,Restore:()=>Ki,Screen:()=>Hi,SetAlwaysOnTop:()=>zi,SetBackgroundColour:()=>Qi,SetMaxSize:()=>Fi,SetMinSize:()=>Li,SetRelativePosition:()=>ki,SetResizable:()=>Ji,SetSize:()=>Bi,SetTitle:()=>Pi,SetZoomLevel:()=>an,Show:()=>Xi,Size:()=>Ii,ToggleMaximise:()=>ji,UnMaximise:()=>Zi,UnMinimise:()=>Yi,Width:()=>$i,ZoomIn:()=>nn,ZoomOut:()=>on,ZoomReset:()=>tn});var ii=0,ni=1,oi=2,ti=3,ri=4,ai=5,li=6,di=7,ci=8,si=9,wi=10,mi=11,ui=12,pi=13,Wi=14,gi=15,fi=16,hi=17,Di=18,Ci=19,Si=20,Mi=21,xi=22,Ai=23,vi=24,bi=25,Ri=26,Ei=27,Ui=28,yi=29,r=U("");function ie(e){return{Get:i=>ie(d(l.Window,i)),Center:()=>e(ii),SetTitle:i=>e(ni,{title:i}),Fullscreen:()=>e(oi),UnFullscreen:()=>e(ti),SetSize:(i,n)=>e(ri,{width:i,height:n}),Size:()=>e(ai),SetMaxSize:(i,n)=>e(li,{width:i,height:n}),SetMinSize:(i,n)=>e(di,{width:i,height:n}),SetAlwaysOnTop:i=>e(ci,{alwaysOnTop:i}),SetRelativePosition:(i,n)=>e(si,{x:i,y:n}),RelativePosition:()=>e(wi),Screen:()=>e(mi),Hide:()=>e(ui),Maximise:()=>e(pi),UnMaximise:()=>e(Wi),ToggleMaximise:()=>e(gi),Minimise:()=>e(fi),UnMinimise:()=>e(hi),Restore:()=>e(Di),Show:()=>e(Ci),Close:()=>e(Si),SetBackgroundColour:(i,n,o,t)=>e(Mi,{r:i,g:n,b:o,a:t}),SetResizable:i=>e(xi,{resizable:i}),Width:()=>e(Ai),Height:()=>e(vi),ZoomIn:()=>e(bi),ZoomOut:()=>e(Ri),ZoomReset:()=>e(Ei),GetZoomLevel:()=>e(Ui),SetZoomLevel:i=>e(yi,{zoomLevel:i})}}function U(e){return ie(d(l.Window,e))}function Oi(){r.Center()}function Pi(e){r.SetTitle(e)}function Ti(){r.Fullscreen()}function Bi(e,i){r.SetSize(e,i)}function Ii(){return r.Size()}function Fi(e,i){r.SetMaxSize(e,i)}function Li(e,i){r.SetMinSize(e,i)}function zi(e){r.SetAlwaysOnTop(e)}function ki(e,i){r.SetRelativePosition(e,i)}function Ni(){return r.RelativePosition()}function Hi(){return r.Screen()}function Vi(){r.Hide()}function _i(){r.Maximise()}function Zi(){r.UnMaximise()}function ji(){r.ToggleMaximise()}function Gi(){r.Minimise()}function Yi(){r.UnMinimise()}function Ki(){r.Restore()}function Xi(){r.Show()}function qi(){r.Close()}function Qi(e,i,n,o){r.SetBackgroundColour(e,i,n,o)}function Ji(e){r.SetResizable(e)}function $i(){return r.Width()}function en(){return r.Height()}function nn(){r.ZoomIn()}function on(){r.ZoomOut()}function tn(){r.ZoomReset()}function rn(){return r.GetZoomLevel()}function an(e){r.SetZoomLevel(e)}var K={};w(K,{Reload:()=>Y});var j={};w(j,{Emit:()=>Z,Off:()=>Wn,OffAll:()=>gn,On:()=>mn,OnMultiple:()=>_,Once:()=>un,Types:()=>ln,WailsEvent:()=>x,setup:()=>sn});var ne={Windows:{SystemThemeChanged:"windows:SystemThemeChanged",APMPowerStatusChange:"windows:APMPowerStatusChange",APMSuspend:"windows:APMSuspend",APMResumeAutomatic:"windows:APMResumeAutomatic",APMResumeSuspend:"windows:APMResumeSuspend",APMPowerSettingChange:"windows:APMPowerSettingChange",ApplicationStarted:"windows:ApplicationStarted",WebViewNavigationCompleted:"windows:WebViewNavigationCompleted",WindowInactive:"windows:WindowInactive",WindowActive:"windows:WindowActive",WindowClickActive:"windows:WindowClickActive",WindowMaximise:"windows:WindowMaximise",WindowUnMaximise:"windows:WindowUnMaximise",WindowFullscreen:"windows:WindowFullscreen",WindowUnFullscreen:"windows:WindowUnFullscreen",WindowRestore:"windows:WindowRestore",WindowMinimise:"windows:WindowMinimise",WindowUnMinimise:"windows:WindowUnMinimise",WindowClose:"windows:WindowClose",WindowSetFocus:"windows:WindowSetFocus",WindowKillFocus:"windows:WindowKillFocus",WindowDragDrop:"windows:WindowDragDrop",WindowDragEnter:"windows:WindowDragEnter",WindowDragLeave:"windows:WindowDragLeave",WindowDragOver:"windows:WindowDragOver"},Mac:{ApplicationDidBecomeActive:"mac:ApplicationDidBecomeActive",ApplicationDidChangeBackingProperties:"mac:ApplicationDidChangeBackingProperties",ApplicationDidChangeEffectiveAppearance:"mac:ApplicationDidChangeEffectiveAppearance",ApplicationDidChangeIcon:"mac:ApplicationDidChangeIcon",ApplicationDidChangeOcclusionState:"mac:ApplicationDidChangeOcclusionState",ApplicationDidChangeScreenParameters:"mac:ApplicationDidChangeScreenParameters",ApplicationDidChangeStatusBarFrame:"mac:ApplicationDidChangeStatusBarFrame",ApplicationDidChangeStatusBarOrientation:"mac:ApplicationDidChangeStatusBarOrientation",ApplicationDidFinishLaunching:"mac:ApplicationDidFinishLaunching",ApplicationDidHide:"mac:ApplicationDidHide",ApplicationDidResignActiveNotification:"mac:ApplicationDidResignActiveNotification",ApplicationDidUnhide:"mac:ApplicationDidUnhide",ApplicationDidUpdate:"mac:ApplicationDidUpdate",ApplicationWillBecomeActive:"mac:ApplicationWillBecomeActive",ApplicationWillFinishLaunching:"mac:ApplicationWillFinishLaunching",ApplicationWillHide:"mac:ApplicationWillHide",ApplicationWillResignActive:"mac:ApplicationWillResignActive",ApplicationWillTerminate:"mac:ApplicationWillTerminate",ApplicationWillUnhide:"mac:ApplicationWillUnhide",ApplicationWillUpdate:"mac:ApplicationWillUpdate",ApplicationDidChangeTheme:"mac:ApplicationDidChangeTheme!",ApplicationShouldHandleReopen:"mac:ApplicationShouldHandleReopen!",WindowDidBecomeKey:"mac:WindowDidBecomeKey",WindowDidBecomeMain:"mac:WindowDidBecomeMain",WindowDidBeginSheet:"mac:WindowDidBeginSheet",WindowDidChangeAlpha:"mac:WindowDidChangeAlpha",WindowDidChangeBackingLocation:"mac:WindowDidChangeBackingLocation",WindowDidChangeBackingProperties:"mac:WindowDidChangeBackingProperties",WindowDidChangeCollectionBehavior:"mac:WindowDidChangeCollectionBehavior",WindowDidChangeEffectiveAppearance:"mac:WindowDidChangeEffectiveAppearance",WindowDidChangeOcclusionState:"mac:WindowDidChangeOcclusionState",WindowDidChangeOrderingMode:"mac:WindowDidChangeOrderingMode",WindowDidChangeScreen:"mac:WindowDidChangeScreen",WindowDidChangeScreenParameters:"mac:WindowDidChangeScreenParameters",WindowDidChangeScreenProfile:"mac:WindowDidChangeScreenProfile",WindowDidChangeScreenSpace:"mac:WindowDidChangeScreenSpace",WindowDidChangeScreenSpaceProperties:"mac:WindowDidChangeScreenSpaceProperties",WindowDidChangeSharingType:"mac:WindowDidChangeSharingType",WindowDidChangeSpace:"mac:WindowDidChangeSpace",WindowDidChangeSpaceOrderingMode:"mac:WindowDidChangeSpaceOrderingMode",WindowDidChangeTitle:"mac:WindowDidChangeTitle",WindowDidChangeToolbar:"mac:WindowDidChangeToolbar",WindowDidChangeVisibility:"mac:WindowDidChangeVisibility",WindowDidDeminiaturize:"mac:WindowDidDeminiaturize",WindowDidEndSheet:"mac:WindowDidEndSheet",WindowDidEnterFullScreen:"mac:WindowDidEnterFullScreen",WindowDidEnterVersionBrowser:"mac:WindowDidEnterVersionBrowser",WindowDidExitFullScreen:"mac:WindowDidExitFullScreen",WindowDidExitVersionBrowser:"mac:WindowDidExitVersionBrowser",WindowDidExpose:"mac:WindowDidExpose",WindowDidFocus:"mac:WindowDidFocus",WindowDidMiniaturize:"mac:WindowDidMiniaturize",WindowDidMove:"mac:WindowDidMove",WindowDidOrderOffScreen:"mac:WindowDidOrderOffScreen",WindowDidOrderOnScreen:"mac:WindowDidOrderOnScreen",WindowDidResignKey:"mac:WindowDidResignKey",WindowDidResignMain:"mac:WindowDidResignMain",WindowDidResize:"mac:WindowDidResize",WindowDidUpdate:"mac:WindowDidUpdate",WindowDidUpdateAlpha:"mac:WindowDidUpdateAlpha",WindowDidUpdateCollectionBehavior:"mac:WindowDidUpdateCollectionBehavior",WindowDidUpdateCollectionProperties:"mac:WindowDidUpdateCollectionProperties",WindowDidUpdateShadow:"mac:WindowDidUpdateShadow",WindowDidUpdateTitle:"mac:WindowDidUpdateTitle",WindowDidUpdateToolbar:"mac:WindowDidUpdateToolbar",WindowDidUpdateVisibility:"mac:WindowDidUpdateVisibility",WindowShouldClose:"mac:WindowShouldClose!",WindowWillBecomeKey:"mac:WindowWillBecomeKey",WindowWillBecomeMain:"mac:WindowWillBecomeMain",WindowWillBeginSheet:"mac:WindowWillBeginSheet",WindowWillChangeOrderingMode:"mac:WindowWillChangeOrderingMode",WindowWillClose:"mac:WindowWillClose",WindowWillDeminiaturize:"mac:WindowWillDeminiaturize",WindowWillEnterFullScreen:"mac:WindowWillEnterFullScreen",WindowWillEnterVersionBrowser:"mac:WindowWillEnterVersionBrowser",WindowWillExitFullScreen:"mac:WindowWillExitFullScreen",WindowWillExitVersionBrowser:"mac:WindowWillExitVersionBrowser",WindowWillFocus:"mac:WindowWillFocus",WindowWillMiniaturize:"mac:WindowWillMiniaturize",WindowWillMove:"mac:WindowWillMove",WindowWillOrderOffScreen:"mac:WindowWillOrderOffScreen",WindowWillOrderOnScreen:"mac:WindowWillOrderOnScreen",WindowWillResignMain:"mac:WindowWillResignMain",WindowWillResize:"mac:WindowWillResize",WindowWillUnfocus:"mac:WindowWillUnfocus",WindowWillUpdate:"mac:WindowWillUpdate",WindowWillUpdateAlpha:"mac:WindowWillUpdateAlpha",WindowWillUpdateCollectionBehavior:"mac:WindowWillUpdateCollectionBehavior",WindowWillUpdateCollectionProperties:"mac:WindowWillUpdateCollectionProperties",WindowWillUpdateShadow:"mac:WindowWillUpdateShadow",WindowWillUpdateTitle:"mac:WindowWillUpdateTitle",WindowWillUpdateToolbar:"mac:WindowWillUpdateToolbar",WindowWillUpdateVisibility:"mac:WindowWillUpdateVisibility",WindowWillUseStandardFrame:"mac:WindowWillUseStandardFrame",MenuWillOpen:"mac:MenuWillOpen",MenuDidOpen:"mac:MenuDidOpen",MenuDidClose:"mac:MenuDidClose",MenuWillSendAction:"mac:MenuWillSendAction",MenuDidSendAction:"mac:MenuDidSendAction",MenuWillHighlightItem:"mac:MenuWillHighlightItem",MenuDidHighlightItem:"mac:MenuDidHighlightItem",MenuWillDisplayItem:"mac:MenuWillDisplayItem",MenuDidDisplayItem:"mac:MenuDidDisplayItem",MenuWillAddItem:"mac:MenuWillAddItem",MenuDidAddItem:"mac:MenuDidAddItem",MenuWillRemoveItem:"mac:MenuWillRemoveItem",MenuDidRemoveItem:"mac:MenuDidRemoveItem",MenuWillBeginTracking:"mac:MenuWillBeginTracking",MenuDidBeginTracking:"mac:MenuDidBeginTracking",MenuWillEndTracking:"mac:MenuWillEndTracking",MenuDidEndTracking:"mac:MenuDidEndTracking",MenuWillUpdate:"mac:MenuWillUpdate",MenuDidUpdate:"mac:MenuDidUpdate",MenuWillPopUp:"mac:MenuWillPopUp",MenuDidPopUp:"mac:MenuDidPopUp",MenuWillSendActionToItem:"mac:MenuWillSendActionToItem",MenuDidSendActionToItem:"mac:MenuDidSendActionToItem",WebViewDidStartProvisionalNavigation:"mac:WebViewDidStartProvisionalNavigation",WebViewDidReceiveServerRedirectForProvisionalNavigation:"mac:WebViewDidReceiveServerRedirectForProvisionalNavigation",WebViewDidFinishNavigation:"mac:WebViewDidFinishNavigation",WebViewDidCommitNavigation:"mac:WebViewDidCommitNavigation",WindowFileDraggingEntered:"mac:WindowFileDraggingEntered",WindowFileDraggingPerformed:"mac:WindowFileDraggingPerformed",WindowFileDraggingExited:"mac:WindowFileDraggingExited"},Linux:{SystemThemeChanged:"linux:SystemThemeChanged"},Common:{ApplicationStarted:"common:ApplicationStarted",WindowMaximise:"common:WindowMaximise",WindowUnMaximise:"common:WindowUnMaximise",WindowFullscreen:"common:WindowFullscreen",WindowUnFullscreen:"common:WindowUnFullscreen",WindowRestore:"common:WindowRestore",WindowMinimise:"common:WindowMinimise",WindowUnMinimise:"common:WindowUnMinimise",WindowClosing:"common:WindowClosing",WindowZoom:"common:WindowZoom",WindowZoomIn:"common:WindowZoomIn",WindowZoomOut:"common:WindowZoomOut",WindowZoomReset:"common:WindowZoomReset",WindowFocus:"common:WindowFocus",WindowLostFocus:"common:WindowLostFocus",WindowShow:"common:WindowShow",WindowHide:"common:WindowHide",WindowDPIChanged:"common:WindowDPIChanged",WindowFilesDropped:"common:WindowFilesDropped",WindowRuntimeReady:"common:WindowRuntimeReady",ThemeChanged:"common:ThemeChanged"}};var ln=ne;window._wails=window._wails||{};window._wails.dispatchWailsEvent=wn;var dn=d(l.Events,""),cn=0,u=new Map,V=class{constructor(i,n,o){this.eventName=i,this.maxCallbacks=o||-1,this.Callback=t=>(n(t),this.maxCallbacks===-1?!1:(this.maxCallbacks-=1,this.maxCallbacks===0))}},x=class{constructor(i,n=null){this.name=i,this.data=n}};function sn(){}function wn(e){let i=u.get(e.name);if(i){let n=i.filter(o=>{if(o.Callback(e))return!0});n.length>0&&(i=i.filter(o=>!n.includes(o)),i.length===0?u.delete(e.name):u.set(e.name,i))}}function _(e,i,n){let o=u.get(e)||[],t=new V(e,i,n);return o.push(t),u.set(e,o),()=>pn(t)}function mn(e,i){return _(e,i,-1)}function un(e,i){return _(e,i,1)}function pn(e){let i=e.eventName,n=u.get(i).filter(o=>o!==e);n.length===0?u.delete(i):u.set(i,n)}function Wn(e,...i){[e,...i].forEach(o=>u.delete(o))}function gn(){u.clear()}function Z(e){return dn(cn,e)}var G={};w(G,{Error:()=>Un,Info:()=>Rn,OpenFile:()=>yn,Question:()=>A,SaveFile:()=>On,Warning:()=>En});window._wails=window._wails||{};window._wails.dialogErrorCallback=bn;window._wails.dialogResultCallback=vn;var fn=0,hn=1,Dn=2,Cn=3,Sn=4,Mn=5,xn=d(l.Dialog,""),g=new Map;function An(){let e;do e=f();while(g.has(e));return e}function D(e,i={}){let n=An();return i["dialog-id"]=n,new Promise((o,t)=>{g.set(n,{resolve:o,reject:t}),xn(e,i).catch(a=>{t(a),g.delete(n)})})}function vn(e,i,n){let o=g.get(e);o&&(n?o.resolve(JSON.parse(i)):o.resolve(i),g.delete(e))}function bn(e,i){let n=g.get(e);n&&(n.reject(i),g.delete(e))}var Rn=e=>D(fn,e),En=e=>D(hn,e),Un=e=>D(Dn,e),A=e=>D(Cn,e),yn=e=>D(Sn,e),On=e=>D(Mn,e);function oe(e,i=null){let n=new x(e,i);Z(n)}function Pn(){document.querySelectorAll("[wml-event]").forEach(function(i){let n=i.getAttribute("wml-event"),o=i.getAttribute("wml-confirm"),t=i.getAttribute("wml-trigger")||"click",a=function(){if(o){A({Title:"Confirm",Message:o,Detached:!1,Buttons:[{Label:"Yes"},{Label:"No",IsDefault:!0}]}).then(function(s){s!=="No"&&oe(n)});return}oe(n)};i.removeEventListener(t,a),i.addEventListener(t,a)})}function te(e,i){let n=U(e),o=In(n);o.has(i);try{o.get(i)()}catch{}}function Tn(){document.querySelectorAll("[wml-window]").forEach(function(i){let n=i.getAttribute("wml-window"),o=i.getAttribute("wml-confirm"),t=i.getAttribute("wml-trigger")||"click",a=i.getAttribute("wml-target-window")||"",s=function(){if(o){A({Title:"Confirm",Message:o,Buttons:[{Label:"Yes"},{Label:"No",IsDefault:!0}]}).then(function(m){m!=="No"&&te(a,n)});return}te(a,n)};i.removeEventListener(t,s),i.addEventListener(t,s)})}function Bn(){document.querySelectorAll("[wml-openurl]").forEach(function(i){let n=i.getAttribute("wml-openurl"),o=i.getAttribute("wml-confirm"),t=i.getAttribute("wml-trigger")||"click",a=function(){if(o){A({Title:"Confirm",Message:o,Buttons:[{Label:"Yes"},{Label:"No",IsDefault:!0}]}).then(function(s){s!=="No"&&b(n)});return}b(n)};i.removeEventListener(t,a),i.addEventListener(t,a)})}function Y(){Pn(),Tn(),Bn()}function In(e){let i=new Map;for(let n in e)typeof e[n]=="function"&&i.set(n,e[n]);return i}var X={};w(X,{ByID:()=>_n,ByName:()=>Vn,Call:()=>Hn,Plugin:()=>Zn});window._wails=window._wails||{};window._wails.callResultHandler=kn;window._wails.callErrorHandler=Nn;var y=0,Fn=d(l.Call,""),Ln=d(l.CancelCall,""),v=new Map;function zn(){let e;do e=f();while(v.has(e));return e}function kn(e,i,n){let o=re(e);o&&o.resolve(n?JSON.parse(i):i)}function Nn(e,i){let n=re(e);n&&n.reject(i)}function re(e){let i=v.get(e);return v.delete(e),i}function O(e,i={}){let n=zn(),o=()=>{Ln(e,{"call-id":n})};var t=!1,a=!1,s=new Promise((m,c)=>{i["call-id"]=n,v.set(n,{resolve:m,reject:c}),Fn(e,i).then(p=>{a=!0,t&&o()}).catch(p=>{c(p),v.delete(n)})});return s.cancel=()=>{a?o():t=!0},s}function Hn(e){return O(y,e)}function Vn(e,...i){if(typeof e!="string"||e.split(".").length!==3)throw new Error("CallByName requires a string in the format 'package.struct.method'");let[n,o,t]=e.split(".");return O(y,{packageName:n,structName:o,methodName:t,args:i})}function _n(e,...i){return O(y,{methodID:e,args:i})}function Zn(e,i,...n){return O(y,{packageName:"wails-plugins",structName:e,methodName:i,args:n})}window._wails=window._wails||{};window._wails.invoke=h;window.wails=window.wails||{};window.wails.Application=T;window.wails.Browser=B;window.wails.Call=X;window.wails.Clipboard=I;window.wails.Dialogs=G;window.wails.Events=j;window.wails.Flags=z;window.wails.Screens=N;window.wails.System=L;window.wails.Window=H;window.wails.WML=K;var ae=!1;document.addEventListener("DOMContentLoaded",function(){ae=!0,window._wails.invoke("wails:runtime:ready")});function jn(e){ae||document.readyState==="complete"?e():document.addEventListener("DOMContentLoaded",e)}jn(()=>{Y()});})();
+(()=>{var de=Object.defineProperty;var w=(e,i)=>{for(var n in i)de(e,n,{get:i[n],enumerable:!0})};var T={};w(T,{Hide:()=>We,Quit:()=>fe,Show:()=>ge});var le="useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict";var f=(e=21)=>{let i="",n=e;for(;n--;)i+=le[Math.random()*64|0];return i};var ce=window.location.origin+"/wails/runtime",d={Call:0,Clipboard:1,Application:2,Events:3,ContextMenu:4,Dialog:5,Window:6,Screens:7,System:8,Browser:9},se=f();function l(e,i){return function(n,o=null){return we(e,n,i,o)}}function we(e,i,n,o){let t=new URL(ce);t.searchParams.append("object",e),t.searchParams.append("method",i);let a={headers:{}};return n&&(a.headers["x-wails-window-name"]=n),o&&t.searchParams.append("args",JSON.stringify(o)),a.headers["x-wails-client-id"]=se,new Promise((s,p)=>{fetch(t,a).then(c=>{if(c.ok)return c.headers.get("Content-Type")&&c.headers.get("Content-Type").indexOf("application/json")!==-1?c.json():c.text();p(Error(c.statusText))}).then(c=>s(c)).catch(c=>p(c))})}var P=l(d.Application,""),me=0,ue=1,pe=2;function We(){return P(me)}function ge(){return P(ue)}function fe(){return P(pe)}var B={};w(B,{OpenURL:()=>b});var he=l(d.Browser,""),De=0;function b(e){return he(De,{url:e})}var I={};w(I,{SetText:()=>xe,Text:()=>Me});var q=l(d.Clipboard,""),Ce=0,Se=1;function xe(e){return q(Ce,{text:e})}function Me(){return q(Se)}var L={};w(L,{Capabilities:()=>Re,Environment:()=>Ee,IsAMD64:()=>Oe,IsARM:()=>Pe,IsARM64:()=>Te,IsDarkMode:()=>be,IsDebug:()=>F,IsLinux:()=>Ue,IsMac:()=>ye,IsWindows:()=>R,invoke:()=>h});var J=l(d.System,""),Ae=0,ve=1;function h(e){return window.chrome?window.chrome.webview.postMessage(e):window.webkit.messageHandlers.external.postMessage(e)}function be(){return J(Ae)}function Re(){return fetch("/wails/capabilities").json()}function Ee(){return J(ve)}function R(){return window._wails.environment.OS==="windows"}function Ue(){return window._wails.environment.OS==="linux"}function ye(){return window._wails.environment.OS==="darwin"}function Oe(){return window._wails.environment.Arch==="amd64"}function Pe(){return window._wails.environment.Arch==="arm"}function Te(){return window._wails.environment.Arch==="arm64"}function F(){return window._wails.environment.Debug===!0}window.addEventListener("contextmenu",Le);var Be=l(d.ContextMenu,""),Ie=0;function Fe(e,i,n,o){Be(Ie,{id:e,x:i,y:n,data:o})}function Le(e){let i=e.target,n=window.getComputedStyle(i).getPropertyValue("--custom-contextmenu");if(n=n?n.trim():"",n){e.preventDefault();let o=window.getComputedStyle(i).getPropertyValue("--custom-contextmenu-data");Fe(n,e.clientX,e.clientY,o);return}ze(e)}function ze(e){if(F())return;let i=e.target;switch(window.getComputedStyle(i).getPropertyValue("--default-contextmenu").trim()){case"show":return;case"hide":e.preventDefault();return;default:if(i.isContentEditable)return;let t=window.getSelection(),a=t.toString().length>0;if(a)for(let s=0;sS});function S(e){try{return window._wails.flags[e]}catch(i){throw new Error("Unable to retrieve flag '"+e+"': "+i)}}window._wails=window._wails||{};window._wails.setResizable=He;window._wails.endDrag=ee;window.addEventListener("mousedown",_e);window.addEventListener("mousemove",Ge);window.addEventListener("mouseup",je);var x=!1,E=null,$=!1,ke="auto";function Ne(e){let i=window.getComputedStyle(e.target).getPropertyValue("--webkit-app-region");return!i||i===""||i.trim()!=="drag"||e.buttons!==1?!1:e.detail===1}function He(e){$=e}function ee(){document.body.style.cursor="default",x=!1}function Ve(){return E?(h(`resize:${E}`),!0):!1}function _e(e){(R()&&Ve()||Ne(e))&&(x=!!Ze(e))}function Ze(e){return!(e.offsetX>e.target.clientWidth||e.offsetY>e.target.clientHeight)}function je(e){(e.buttons!==void 0?e.buttons:e.which)>0&&ee()}function u(e=ke){document.documentElement.style.cursor=e,E=e}function Ge(e){x=Ye(e),R()&&$&&Ke(e)}function Ye(e){let i=e.buttons!==void 0?e.buttons:e.which;return x&&i>0?(h("drag"),!1):x}function Ke(e){let i=S("system.resizeHandleHeight")||5,n=S("system.resizeHandleWidth")||5,o=S("resizeCornerExtra")||10,t=window.outerWidth-e.clientXJe,GetCurrent:()=>ei,GetPrimary:()=>$e});var k=l(d.Screens,""),Xe=0,Qe=1,qe=2;function Je(){return k(Xe)}function $e(){return k(Qe)}function ei(){return k(qe)}var H={};w(H,{Center:()=>Oi,Close:()=>Qi,Fullscreen:()=>Ti,Get:()=>U,GetZoomLevel:()=>rn,Height:()=>en,Hide:()=>Vi,Maximise:()=>_i,Minimise:()=>Gi,RelativePosition:()=>Ni,Restore:()=>Ki,Screen:()=>Hi,SetAlwaysOnTop:()=>zi,SetBackgroundColour:()=>qi,SetMaxSize:()=>Fi,SetMinSize:()=>Li,SetRelativePosition:()=>ki,SetResizable:()=>Ji,SetSize:()=>Bi,SetTitle:()=>Pi,SetZoomLevel:()=>an,Show:()=>Xi,Size:()=>Ii,ToggleMaximise:()=>ji,UnMaximise:()=>Zi,UnMinimise:()=>Yi,Width:()=>$i,ZoomIn:()=>nn,ZoomOut:()=>on,ZoomReset:()=>tn});var ii=0,ni=1,oi=2,ti=3,ri=4,ai=5,di=6,li=7,ci=8,si=9,wi=10,mi=11,ui=12,pi=13,Wi=14,gi=15,fi=16,hi=17,Di=18,Ci=19,Si=20,xi=21,Mi=22,Ai=23,vi=24,bi=25,Ri=26,Ei=27,Ui=28,yi=29,r=U("");function ie(e){return{Get:i=>ie(l(d.Window,i)),Center:()=>e(ii),SetTitle:i=>e(ni,{title:i}),Fullscreen:()=>e(oi),UnFullscreen:()=>e(ti),SetSize:(i,n)=>e(ri,{width:i,height:n}),Size:()=>e(ai),SetMaxSize:(i,n)=>e(di,{width:i,height:n}),SetMinSize:(i,n)=>e(li,{width:i,height:n}),SetAlwaysOnTop:i=>e(ci,{alwaysOnTop:i}),SetRelativePosition:(i,n)=>e(si,{x:i,y:n}),RelativePosition:()=>e(wi),Screen:()=>e(mi),Hide:()=>e(ui),Maximise:()=>e(pi),UnMaximise:()=>e(Wi),ToggleMaximise:()=>e(gi),Minimise:()=>e(fi),UnMinimise:()=>e(hi),Restore:()=>e(Di),Show:()=>e(Ci),Close:()=>e(Si),SetBackgroundColour:(i,n,o,t)=>e(xi,{r:i,g:n,b:o,a:t}),SetResizable:i=>e(Mi,{resizable:i}),Width:()=>e(Ai),Height:()=>e(vi),ZoomIn:()=>e(bi),ZoomOut:()=>e(Ri),ZoomReset:()=>e(Ei),GetZoomLevel:()=>e(Ui),SetZoomLevel:i=>e(yi,{zoomLevel:i})}}function U(e){return ie(l(d.Window,e))}function Oi(){r.Center()}function Pi(e){r.SetTitle(e)}function Ti(){r.Fullscreen()}function Bi(e,i){r.SetSize(e,i)}function Ii(){return r.Size()}function Fi(e,i){r.SetMaxSize(e,i)}function Li(e,i){r.SetMinSize(e,i)}function zi(e){r.SetAlwaysOnTop(e)}function ki(e,i){r.SetRelativePosition(e,i)}function Ni(){return r.RelativePosition()}function Hi(){return r.Screen()}function Vi(){r.Hide()}function _i(){r.Maximise()}function Zi(){r.UnMaximise()}function ji(){r.ToggleMaximise()}function Gi(){r.Minimise()}function Yi(){r.UnMinimise()}function Ki(){r.Restore()}function Xi(){r.Show()}function Qi(){r.Close()}function qi(e,i,n,o){r.SetBackgroundColour(e,i,n,o)}function Ji(e){r.SetResizable(e)}function $i(){return r.Width()}function en(){return r.Height()}function nn(){r.ZoomIn()}function on(){r.ZoomOut()}function tn(){r.ZoomReset()}function rn(){return r.GetZoomLevel()}function an(e){r.SetZoomLevel(e)}var K={};w(K,{Reload:()=>Y});var j={};w(j,{Emit:()=>Z,Off:()=>Wn,OffAll:()=>gn,On:()=>mn,OnMultiple:()=>_,Once:()=>un,Types:()=>dn,WailsEvent:()=>M,setup:()=>sn});var ne={Windows:{SystemThemeChanged:"windows:SystemThemeChanged",APMPowerStatusChange:"windows:APMPowerStatusChange",APMSuspend:"windows:APMSuspend",APMResumeAutomatic:"windows:APMResumeAutomatic",APMResumeSuspend:"windows:APMResumeSuspend",APMPowerSettingChange:"windows:APMPowerSettingChange",ApplicationStarted:"windows:ApplicationStarted",WebViewNavigationCompleted:"windows:WebViewNavigationCompleted",WindowInactive:"windows:WindowInactive",WindowActive:"windows:WindowActive",WindowClickActive:"windows:WindowClickActive",WindowMaximise:"windows:WindowMaximise",WindowUnMaximise:"windows:WindowUnMaximise",WindowFullscreen:"windows:WindowFullscreen",WindowUnFullscreen:"windows:WindowUnFullscreen",WindowRestore:"windows:WindowRestore",WindowMinimise:"windows:WindowMinimise",WindowUnMinimise:"windows:WindowUnMinimise",WindowClose:"windows:WindowClose",WindowSetFocus:"windows:WindowSetFocus",WindowKillFocus:"windows:WindowKillFocus",WindowDragDrop:"windows:WindowDragDrop",WindowDragEnter:"windows:WindowDragEnter",WindowDragLeave:"windows:WindowDragLeave",WindowDragOver:"windows:WindowDragOver"},Mac:{ApplicationDidBecomeActive:"mac:ApplicationDidBecomeActive",ApplicationDidChangeBackingProperties:"mac:ApplicationDidChangeBackingProperties",ApplicationDidChangeEffectiveAppearance:"mac:ApplicationDidChangeEffectiveAppearance",ApplicationDidChangeIcon:"mac:ApplicationDidChangeIcon",ApplicationDidChangeOcclusionState:"mac:ApplicationDidChangeOcclusionState",ApplicationDidChangeScreenParameters:"mac:ApplicationDidChangeScreenParameters",ApplicationDidChangeStatusBarFrame:"mac:ApplicationDidChangeStatusBarFrame",ApplicationDidChangeStatusBarOrientation:"mac:ApplicationDidChangeStatusBarOrientation",ApplicationDidFinishLaunching:"mac:ApplicationDidFinishLaunching",ApplicationDidHide:"mac:ApplicationDidHide",ApplicationDidResignActiveNotification:"mac:ApplicationDidResignActiveNotification",ApplicationDidUnhide:"mac:ApplicationDidUnhide",ApplicationDidUpdate:"mac:ApplicationDidUpdate",ApplicationWillBecomeActive:"mac:ApplicationWillBecomeActive",ApplicationWillFinishLaunching:"mac:ApplicationWillFinishLaunching",ApplicationWillHide:"mac:ApplicationWillHide",ApplicationWillResignActive:"mac:ApplicationWillResignActive",ApplicationWillTerminate:"mac:ApplicationWillTerminate",ApplicationWillUnhide:"mac:ApplicationWillUnhide",ApplicationWillUpdate:"mac:ApplicationWillUpdate",ApplicationDidChangeTheme:"mac:ApplicationDidChangeTheme!",ApplicationShouldHandleReopen:"mac:ApplicationShouldHandleReopen!",WindowDidBecomeKey:"mac:WindowDidBecomeKey",WindowDidBecomeMain:"mac:WindowDidBecomeMain",WindowDidBeginSheet:"mac:WindowDidBeginSheet",WindowDidChangeAlpha:"mac:WindowDidChangeAlpha",WindowDidChangeBackingLocation:"mac:WindowDidChangeBackingLocation",WindowDidChangeBackingProperties:"mac:WindowDidChangeBackingProperties",WindowDidChangeCollectionBehavior:"mac:WindowDidChangeCollectionBehavior",WindowDidChangeEffectiveAppearance:"mac:WindowDidChangeEffectiveAppearance",WindowDidChangeOcclusionState:"mac:WindowDidChangeOcclusionState",WindowDidChangeOrderingMode:"mac:WindowDidChangeOrderingMode",WindowDidChangeScreen:"mac:WindowDidChangeScreen",WindowDidChangeScreenParameters:"mac:WindowDidChangeScreenParameters",WindowDidChangeScreenProfile:"mac:WindowDidChangeScreenProfile",WindowDidChangeScreenSpace:"mac:WindowDidChangeScreenSpace",WindowDidChangeScreenSpaceProperties:"mac:WindowDidChangeScreenSpaceProperties",WindowDidChangeSharingType:"mac:WindowDidChangeSharingType",WindowDidChangeSpace:"mac:WindowDidChangeSpace",WindowDidChangeSpaceOrderingMode:"mac:WindowDidChangeSpaceOrderingMode",WindowDidChangeTitle:"mac:WindowDidChangeTitle",WindowDidChangeToolbar:"mac:WindowDidChangeToolbar",WindowDidChangeVisibility:"mac:WindowDidChangeVisibility",WindowDidDeminiaturize:"mac:WindowDidDeminiaturize",WindowDidEndSheet:"mac:WindowDidEndSheet",WindowDidEnterFullScreen:"mac:WindowDidEnterFullScreen",WindowDidEnterVersionBrowser:"mac:WindowDidEnterVersionBrowser",WindowDidExitFullScreen:"mac:WindowDidExitFullScreen",WindowDidExitVersionBrowser:"mac:WindowDidExitVersionBrowser",WindowDidExpose:"mac:WindowDidExpose",WindowDidFocus:"mac:WindowDidFocus",WindowDidMiniaturize:"mac:WindowDidMiniaturize",WindowDidMove:"mac:WindowDidMove",WindowDidOrderOffScreen:"mac:WindowDidOrderOffScreen",WindowDidOrderOnScreen:"mac:WindowDidOrderOnScreen",WindowDidResignKey:"mac:WindowDidResignKey",WindowDidResignMain:"mac:WindowDidResignMain",WindowDidResize:"mac:WindowDidResize",WindowDidUpdate:"mac:WindowDidUpdate",WindowDidUpdateAlpha:"mac:WindowDidUpdateAlpha",WindowDidUpdateCollectionBehavior:"mac:WindowDidUpdateCollectionBehavior",WindowDidUpdateCollectionProperties:"mac:WindowDidUpdateCollectionProperties",WindowDidUpdateShadow:"mac:WindowDidUpdateShadow",WindowDidUpdateTitle:"mac:WindowDidUpdateTitle",WindowDidUpdateToolbar:"mac:WindowDidUpdateToolbar",WindowDidUpdateVisibility:"mac:WindowDidUpdateVisibility",WindowShouldClose:"mac:WindowShouldClose!",WindowWillBecomeKey:"mac:WindowWillBecomeKey",WindowWillBecomeMain:"mac:WindowWillBecomeMain",WindowWillBeginSheet:"mac:WindowWillBeginSheet",WindowWillChangeOrderingMode:"mac:WindowWillChangeOrderingMode",WindowWillClose:"mac:WindowWillClose",WindowWillDeminiaturize:"mac:WindowWillDeminiaturize",WindowWillEnterFullScreen:"mac:WindowWillEnterFullScreen",WindowWillEnterVersionBrowser:"mac:WindowWillEnterVersionBrowser",WindowWillExitFullScreen:"mac:WindowWillExitFullScreen",WindowWillExitVersionBrowser:"mac:WindowWillExitVersionBrowser",WindowWillFocus:"mac:WindowWillFocus",WindowWillMiniaturize:"mac:WindowWillMiniaturize",WindowWillMove:"mac:WindowWillMove",WindowWillOrderOffScreen:"mac:WindowWillOrderOffScreen",WindowWillOrderOnScreen:"mac:WindowWillOrderOnScreen",WindowWillResignMain:"mac:WindowWillResignMain",WindowWillResize:"mac:WindowWillResize",WindowWillUnfocus:"mac:WindowWillUnfocus",WindowWillUpdate:"mac:WindowWillUpdate",WindowWillUpdateAlpha:"mac:WindowWillUpdateAlpha",WindowWillUpdateCollectionBehavior:"mac:WindowWillUpdateCollectionBehavior",WindowWillUpdateCollectionProperties:"mac:WindowWillUpdateCollectionProperties",WindowWillUpdateShadow:"mac:WindowWillUpdateShadow",WindowWillUpdateTitle:"mac:WindowWillUpdateTitle",WindowWillUpdateToolbar:"mac:WindowWillUpdateToolbar",WindowWillUpdateVisibility:"mac:WindowWillUpdateVisibility",WindowWillUseStandardFrame:"mac:WindowWillUseStandardFrame",MenuWillOpen:"mac:MenuWillOpen",MenuDidOpen:"mac:MenuDidOpen",MenuDidClose:"mac:MenuDidClose",MenuWillSendAction:"mac:MenuWillSendAction",MenuDidSendAction:"mac:MenuDidSendAction",MenuWillHighlightItem:"mac:MenuWillHighlightItem",MenuDidHighlightItem:"mac:MenuDidHighlightItem",MenuWillDisplayItem:"mac:MenuWillDisplayItem",MenuDidDisplayItem:"mac:MenuDidDisplayItem",MenuWillAddItem:"mac:MenuWillAddItem",MenuDidAddItem:"mac:MenuDidAddItem",MenuWillRemoveItem:"mac:MenuWillRemoveItem",MenuDidRemoveItem:"mac:MenuDidRemoveItem",MenuWillBeginTracking:"mac:MenuWillBeginTracking",MenuDidBeginTracking:"mac:MenuDidBeginTracking",MenuWillEndTracking:"mac:MenuWillEndTracking",MenuDidEndTracking:"mac:MenuDidEndTracking",MenuWillUpdate:"mac:MenuWillUpdate",MenuDidUpdate:"mac:MenuDidUpdate",MenuWillPopUp:"mac:MenuWillPopUp",MenuDidPopUp:"mac:MenuDidPopUp",MenuWillSendActionToItem:"mac:MenuWillSendActionToItem",MenuDidSendActionToItem:"mac:MenuDidSendActionToItem",WebViewDidStartProvisionalNavigation:"mac:WebViewDidStartProvisionalNavigation",WebViewDidReceiveServerRedirectForProvisionalNavigation:"mac:WebViewDidReceiveServerRedirectForProvisionalNavigation",WebViewDidFinishNavigation:"mac:WebViewDidFinishNavigation",WebViewDidCommitNavigation:"mac:WebViewDidCommitNavigation",WindowFileDraggingEntered:"mac:WindowFileDraggingEntered",WindowFileDraggingPerformed:"mac:WindowFileDraggingPerformed",WindowFileDraggingExited:"mac:WindowFileDraggingExited"},Linux:{SystemThemeChanged:"linux:SystemThemeChanged",WindowLoadChanged:"linux:WindowLoadChanged",WindowDeleteEvent:"linux:WindowDeleteEvent",WindowFocusIn:"linux:WindowFocusIn",WindowFocusOut:"linux:WindowFocusOut",ApplicationStartup:"linux:ApplicationStartup"},Common:{ApplicationStarted:"common:ApplicationStarted",WindowMaximise:"common:WindowMaximise",WindowUnMaximise:"common:WindowUnMaximise",WindowFullscreen:"common:WindowFullscreen",WindowUnFullscreen:"common:WindowUnFullscreen",WindowRestore:"common:WindowRestore",WindowMinimise:"common:WindowMinimise",WindowUnMinimise:"common:WindowUnMinimise",WindowClosing:"common:WindowClosing",WindowZoom:"common:WindowZoom",WindowZoomIn:"common:WindowZoomIn",WindowZoomOut:"common:WindowZoomOut",WindowZoomReset:"common:WindowZoomReset",WindowFocus:"common:WindowFocus",WindowLostFocus:"common:WindowLostFocus",WindowShow:"common:WindowShow",WindowHide:"common:WindowHide",WindowDPIChanged:"common:WindowDPIChanged",WindowFilesDropped:"common:WindowFilesDropped",WindowRuntimeReady:"common:WindowRuntimeReady",ThemeChanged:"common:ThemeChanged"}};var dn=ne;window._wails=window._wails||{};window._wails.dispatchWailsEvent=wn;var ln=l(d.Events,""),cn=0,m=new Map,V=class{constructor(i,n,o){this.eventName=i,this.maxCallbacks=o||-1,this.Callback=t=>(n(t),this.maxCallbacks===-1?!1:(this.maxCallbacks-=1,this.maxCallbacks===0))}},M=class{constructor(i,n=null){this.name=i,this.data=n}};function sn(){}function wn(e){let i=m.get(e.name);if(i){let n=i.filter(o=>{if(o.Callback(e))return!0});n.length>0&&(i=i.filter(o=>!n.includes(o)),i.length===0?m.delete(e.name):m.set(e.name,i))}}function _(e,i,n){let o=m.get(e)||[],t=new V(e,i,n);return o.push(t),m.set(e,o),()=>pn(t)}function mn(e,i){return _(e,i,-1)}function un(e,i){return _(e,i,1)}function pn(e){let i=e.eventName,n=m.get(i).filter(o=>o!==e);n.length===0?m.delete(i):m.set(i,n)}function Wn(e,...i){[e,...i].forEach(o=>m.delete(o))}function gn(){m.clear()}function Z(e){return ln(cn,e)}var G={};w(G,{Error:()=>Un,Info:()=>Rn,OpenFile:()=>yn,Question:()=>A,SaveFile:()=>On,Warning:()=>En});window._wails=window._wails||{};window._wails.dialogErrorCallback=bn;window._wails.dialogResultCallback=vn;var fn=0,hn=1,Dn=2,Cn=3,Sn=4,xn=5,Mn=l(d.Dialog,""),W=new Map;function An(){let e;do e=f();while(W.has(e));return e}function D(e,i={}){let n=An();return i["dialog-id"]=n,new Promise((o,t)=>{W.set(n,{resolve:o,reject:t}),Mn(e,i).catch(a=>{t(a),W.delete(n)})})}function vn(e,i,n){let o=W.get(e);o&&(n?o.resolve(JSON.parse(i)):o.resolve(i),W.delete(e))}function bn(e,i){let n=W.get(e);n&&(n.reject(i),W.delete(e))}var Rn=e=>D(fn,e),En=e=>D(hn,e),Un=e=>D(Dn,e),A=e=>D(Cn,e),yn=e=>D(Sn,e),On=e=>D(xn,e);function oe(e,i=null){let n=new M(e,i);Z(n)}function Pn(){document.querySelectorAll("[wml-event]").forEach(function(i){let n=i.getAttribute("wml-event"),o=i.getAttribute("wml-confirm"),t=i.getAttribute("wml-trigger")||"click",a=function(){if(o){A({Title:"Confirm",Message:o,Detached:!1,Buttons:[{Label:"Yes"},{Label:"No",IsDefault:!0}]}).then(function(s){s!=="No"&&oe(n)});return}oe(n)};i.removeEventListener(t,a),i.addEventListener(t,a)})}function te(e,i){let n=U(e),o=In(n);o.has(i);try{o.get(i)()}catch{}}function Tn(){document.querySelectorAll("[wml-window]").forEach(function(i){let n=i.getAttribute("wml-window"),o=i.getAttribute("wml-confirm"),t=i.getAttribute("wml-trigger")||"click",a=i.getAttribute("wml-target-window")||"",s=function(){if(o){A({Title:"Confirm",Message:o,Buttons:[{Label:"Yes"},{Label:"No",IsDefault:!0}]}).then(function(p){p!=="No"&&te(a,n)});return}te(a,n)};i.removeEventListener(t,s),i.addEventListener(t,s)})}function Bn(){document.querySelectorAll("[wml-openurl]").forEach(function(i){let n=i.getAttribute("wml-openurl"),o=i.getAttribute("wml-confirm"),t=i.getAttribute("wml-trigger")||"click",a=function(){if(o){A({Title:"Confirm",Message:o,Buttons:[{Label:"Yes"},{Label:"No",IsDefault:!0}]}).then(function(s){s!=="No"&&b(n)});return}b(n)};i.removeEventListener(t,a),i.addEventListener(t,a)})}function Y(){Pn(),Tn(),Bn()}function In(e){let i=new Map;for(let n in e)typeof e[n]=="function"&&i.set(n,e[n]);return i}var X={};w(X,{ByID:()=>Vn,ByName:()=>Hn,Call:()=>Nn,Plugin:()=>_n});window._wails=window._wails||{};window._wails.callResultHandler=zn;window._wails.callErrorHandler=kn;var y=0,Fn=l(d.Call,""),v=new Map;function Ln(){let e;do e=f();while(v.has(e));return e}function zn(e,i,n){let o=re(e);o&&o.resolve(n?JSON.parse(i):i)}function kn(e,i){let n=re(e);n&&n.reject(i)}function re(e){let i=v.get(e);return v.delete(e),i}function O(e,i={}){return new Promise((n,o)=>{let t=Ln();i["call-id"]=t,v.set(t,{resolve:n,reject:o}),Fn(e,i).catch(a=>{o(a),v.delete(t)})})}function Nn(e){return O(y,e)}function Hn(e,...i){if(typeof e!="string"||e.split(".").length!==3)throw new Error("CallByName requires a string in the format 'package.struct.method'");let[n,o,t]=e.split(".");return O(y,{packageName:n,structName:o,methodName:t,args:i})}function Vn(e,...i){return O(y,{methodID:e,args:i})}function _n(e,i,...n){return O(y,{packageName:"wails-plugins",structName:e,methodName:i,args:n})}window._wails=window._wails||{};window._wails.invoke=h;window.wails=window.wails||{};window.wails.Application=T;window.wails.Browser=B;window.wails.Call=X;window.wails.Clipboard=I;window.wails.Dialogs=G;window.wails.Events=j;window.wails.Flags=z;window.wails.Screens=N;window.wails.System=L;window.wails.Window=H;window.wails.WML=K;var ae=!1;document.addEventListener("DOMContentLoaded",function(){ae=!0,window._wails.invoke("wails:runtime:ready")});function Zn(e){ae||document.readyState==="complete"?e():document.addEventListener("DOMContentLoaded",e)}Zn(()=>{Y()});})();
diff --git a/v3/go.mod b/v3/go.mod
index ab75c4bcfb6..229b7ae81e7 100644
--- a/v3/go.mod
+++ b/v3/go.mod
@@ -1,8 +1,6 @@
module github.com/wailsapp/wails/v3
-go 1.21.1
-
-toolchain go1.21.4
+go 1.22
require (
github.com/atterpac/refresh v0.6.2
@@ -36,7 +34,7 @@ require (
github.com/tc-hib/winres v0.1.6
github.com/wailsapp/go-webview2 v1.0.9
github.com/wailsapp/mimetype v1.4.1
- golang.org/x/sys v0.15.0
+ golang.org/x/sys v0.18.0
modernc.org/sqlite v1.21.0
)
@@ -49,7 +47,8 @@ require (
github.com/Microsoft/go-winio v0.6.1 // indirect
github.com/ProtonMail/go-crypto v0.0.0-20230828082145-3c4c8a2d2371 // indirect
github.com/StackExchange/wmi v1.2.1 // indirect
- github.com/cloudflare/circl v1.3.3 // indirect
+ github.com/alexbrainman/ps v0.0.0-20171229230509-b3e1b4a15894 // indirect
+ github.com/cloudflare/circl v1.3.7 // indirect
github.com/containerd/console v1.0.3 // indirect
github.com/cyphar/filepath-securejoin v0.2.4 // indirect
github.com/dustin/go-humanize v1.0.0 // indirect
@@ -89,14 +88,14 @@ require (
github.com/xanzy/ssh-agent v0.3.3 // indirect
github.com/xo/terminfo v0.0.0-20210125001918-ca9a967f8778 // indirect
github.com/zeebo/xxh3 v1.0.2 // indirect
- golang.org/x/crypto v0.16.0 // indirect
+ golang.org/x/crypto v0.21.0 // indirect
golang.org/x/exp v0.0.0-20230626212559-97b1e661b5df // indirect
- golang.org/x/image v0.5.0 // indirect
+ golang.org/x/image v0.15.0 // indirect
golang.org/x/mod v0.12.0 // indirect
- golang.org/x/net v0.19.0 // indirect
+ golang.org/x/net v0.21.0 // indirect
golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43 // indirect
golang.org/x/sync v0.4.0 // indirect
- golang.org/x/term v0.15.0 // indirect
+ golang.org/x/term v0.18.0 // indirect
golang.org/x/text v0.14.0 // indirect
golang.org/x/tools v0.13.0 // indirect
google.golang.org/appengine v1.6.6 // indirect
diff --git a/v3/go.sum b/v3/go.sum
index 44c1e5294b7..15030fdfa21 100644
--- a/v3/go.sum
+++ b/v3/go.sum
@@ -77,8 +77,9 @@ github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWR
github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=
github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
-github.com/cloudflare/circl v1.3.3 h1:fE/Qz0QdIGqeWfnwq0RE0R7MI51s0M2E4Ga9kq5AEMs=
github.com/cloudflare/circl v1.3.3/go.mod h1:5XYMA4rFBvNIrhs50XuiBJ15vF2pZn4nnUKZrLbUZFA=
+github.com/cloudflare/circl v1.3.7 h1:qlCDlTPz2n9fu58M0Nh1J/JzcFpfgkFHHX3O35r5vcU=
+github.com/cloudflare/circl v1.3.7/go.mod h1:sRTcRWXGLrKw6yIGJ+l7amYJFfAXbZG0kBSc8r4zxgA=
github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
github.com/containerd/console v1.0.3 h1:lIr7SlA5PxZyMV30bDW0MGbiOPXwc63yRuCP0ARubLw=
github.com/containerd/console v1.0.3/go.mod h1:7LqA/THxQ86k76b8c/EMSiaJ3h1eZkMkXar0TQ1gf3U=
@@ -386,8 +387,8 @@ golang.org/x/crypto v0.0.0-20220214200702-86341886e292/go.mod h1:IxCIyHEi3zRg3s0
golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
golang.org/x/crypto v0.3.1-0.20221117191849-2c476679df9a/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4=
golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU=
-golang.org/x/crypto v0.16.0 h1:mMMrFzRSCF0GvB7Ne27XVtVAaXLrPmgPC7/v0tkwHaY=
-golang.org/x/crypto v0.16.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4=
+golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA=
+golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs=
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
@@ -404,8 +405,8 @@ golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMx
golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
golang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
golang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
-golang.org/x/image v0.5.0 h1:5JMiNunQeQw++mMOz48/ISeNu3Iweh/JaZU8ZLqHRrI=
-golang.org/x/image v0.5.0/go.mod h1:FVC7BI/5Ym8R25iw5OLsgshdUBbT1h5jZTpA+mvAdZ4=
+golang.org/x/image v0.15.0 h1:kOELfmgrmJlw4Cdb7g/QGuB3CvDrXbqEIww/pNtNBm8=
+golang.org/x/image v0.15.0/go.mod h1:HUYqC05R2ZcZ3ejNQsIHQDQiwWM4JBqmm6MKANTp4LE=
golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
@@ -462,8 +463,8 @@ golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug
golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY=
golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc=
-golang.org/x/net v0.19.0 h1:zTwKpTd2XuCqf8huc7Fo2iSy+4RHPd10s4KzeTnVr1c=
-golang.org/x/net v0.19.0/go.mod h1:CfAk/cbD4CthTvqiEl8NpboMuiuOYsAr/7NOjZJtv1U=
+golang.org/x/net v0.21.0 h1:AQyQV4dYCvJ7vGmJyKki9+PBdyvhkSd8EIx/qb0AYv4=
+golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44=
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
@@ -530,8 +531,8 @@ golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc=
-golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
+golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4=
+golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/term v0.0.0-20210615171337-6886f2dfbf5b/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
@@ -539,8 +540,8 @@ golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuX
golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc=
golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U=
-golang.org/x/term v0.15.0 h1:y/Oo/a/q3IXu26lQgl04j/gjuBDOBlx7X6Om1j2CPW4=
-golang.org/x/term v0.15.0/go.mod h1:BDl952bC7+uMoWR75FIrCDx79TPU9oHkTZ9yRbYOrX0=
+golang.org/x/term v0.18.0 h1:FcHjZXDMxI8mM3nwhX9HlKop4C0YQvCVCdwYl2wOtE8=
+golang.org/x/term v0.18.0/go.mod h1:ILwASektA3OnRv7amZ1xhE/KTR+u50pbXfZ03+6Nx58=
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
diff --git a/v3/internal/assetserver/webview/webkit2_36+.go b/v3/internal/assetserver/webview/webkit2.go
similarity index 53%
rename from v3/internal/assetserver/webview/webkit2_36+.go
rename to v3/internal/assetserver/webview/webkit2.go
index 2c1a79c4331..2682dc81f3a 100644
--- a/v3/internal/assetserver/webview/webkit2_36+.go
+++ b/v3/internal/assetserver/webview/webkit2.go
@@ -1,4 +1,4 @@
-//go:build linux && (webkit2_36 || webkit2_40)
+//go:build linux
package webview
@@ -12,11 +12,15 @@ package webview
import "C"
import (
+ "fmt"
+ "io"
"net/http"
"strings"
"unsafe"
)
+const Webkit2MinMinorVersion = 40
+
func webkit_uri_scheme_request_get_http_method(req *C.WebKitURISchemeRequest) string {
method := C.GoString(C.webkit_uri_scheme_request_get_http_method(req))
return strings.ToUpper(method)
@@ -67,3 +71,67 @@ func webkit_uri_scheme_request_finish(req *C.WebKitURISchemeRequest, code int, h
C.webkit_uri_scheme_request_finish_with_response(req, resp)
return nil
}
+
+func webkit_uri_scheme_request_get_http_body(req *C.WebKitURISchemeRequest) io.ReadCloser {
+ stream := C.webkit_uri_scheme_request_get_http_body(req)
+ if stream == nil {
+ return http.NoBody
+ }
+ return &webkitRequestBody{stream: stream}
+}
+
+type webkitRequestBody struct {
+ stream *C.GInputStream
+ closed bool
+}
+
+// Read implements io.Reader
+func (r *webkitRequestBody) Read(p []byte) (int, error) {
+ if r.closed {
+ return 0, io.ErrClosedPipe
+ }
+
+ var content unsafe.Pointer
+ var contentLen int
+ if p != nil {
+ content = unsafe.Pointer(&p[0])
+ contentLen = len(p)
+ }
+
+ var n C.gsize
+ var gErr *C.GError
+ res := C.g_input_stream_read_all(r.stream, content, C.gsize(contentLen), &n, nil, &gErr)
+ if res == 0 {
+ return 0, formatGError("stream read failed", gErr)
+ } else if n == 0 {
+ return 0, io.EOF
+ }
+ return int(n), nil
+}
+
+func (r *webkitRequestBody) Close() error {
+ if r.closed {
+ return nil
+ }
+ r.closed = true
+
+ // https://docs.gtk.org/gio/method.InputStream.close.html
+ // Streams will be automatically closed when the last reference is dropped, but you might want to call this function
+ // to make sure resources are released as early as possible.
+ var err error
+ var gErr *C.GError
+ if C.g_input_stream_close(r.stream, nil, &gErr) == 0 {
+ err = formatGError("stream close failed", gErr)
+ }
+ C.g_object_unref(C.gpointer(r.stream))
+ r.stream = nil
+ return err
+}
+
+func formatGError(msg string, gErr *C.GError, args ...any) error {
+ if gErr != nil && gErr.message != nil {
+ msg += ": " + C.GoString(gErr.message)
+ C.g_error_free(gErr)
+ }
+ return fmt.Errorf(msg, args...)
+}
diff --git a/v3/internal/assetserver/webview/webkit2_36.go b/v3/internal/assetserver/webview/webkit2_36.go
deleted file mode 100644
index cd200af8eb6..00000000000
--- a/v3/internal/assetserver/webview/webkit2_36.go
+++ /dev/null
@@ -1,21 +0,0 @@
-//go:build linux && webkit2_36
-
-package webview
-
-/*
-#cgo linux pkg-config: webkit2gtk-4.0
-
-#include "webkit2/webkit2.h"
-*/
-import "C"
-
-import (
- "io"
- "net/http"
-)
-
-const Webkit2MinMinorVersion = 36
-
-func webkit_uri_scheme_request_get_http_body(_ *C.WebKitURISchemeRequest) io.ReadCloser {
- return http.NoBody
-}
diff --git a/v3/internal/assetserver/webview/webkit2_40+.go b/v3/internal/assetserver/webview/webkit2_40+.go
deleted file mode 100644
index dceb0803d5d..00000000000
--- a/v3/internal/assetserver/webview/webkit2_40+.go
+++ /dev/null
@@ -1,83 +0,0 @@
-//go:build linux && webkit2_40
-
-package webview
-
-/*
-#cgo linux pkg-config: gtk+-3.0 webkit2gtk-4.0 gio-unix-2.0
-
-#include "gtk/gtk.h"
-#include "webkit2/webkit2.h"
-#include "gio/gunixinputstream.h"
-*/
-import "C"
-
-import (
- "fmt"
- "io"
- "net/http"
- "unsafe"
-)
-
-func webkit_uri_scheme_request_get_http_body(req *C.WebKitURISchemeRequest) io.ReadCloser {
- stream := C.webkit_uri_scheme_request_get_http_body(req)
- if stream == nil {
- return http.NoBody
- }
- return &webkitRequestBody{stream: stream}
-}
-
-type webkitRequestBody struct {
- stream *C.GInputStream
- closed bool
-}
-
-// Read implements io.Reader
-func (r *webkitRequestBody) Read(p []byte) (int, error) {
- if r.closed {
- return 0, io.ErrClosedPipe
- }
-
- var content unsafe.Pointer
- var contentLen int
- if p != nil {
- content = unsafe.Pointer(&p[0])
- contentLen = len(p)
- }
-
- var n C.gsize
- var gErr *C.GError
- res := C.g_input_stream_read_all(r.stream, content, C.gsize(contentLen), &n, nil, &gErr)
- if res == 0 {
- return 0, formatGError("stream read failed", gErr)
- } else if n == 0 {
- return 0, io.EOF
- }
- return int(n), nil
-}
-
-func (r *webkitRequestBody) Close() error {
- if r.closed {
- return nil
- }
- r.closed = true
-
- // https://docs.gtk.org/gio/method.InputStream.close.html
- // Streams will be automatically closed when the last reference is dropped, but you might want to call this function
- // to make sure resources are released as early as possible.
- var err error
- var gErr *C.GError
- if C.g_input_stream_close(r.stream, nil, &gErr) == 0 {
- err = formatGError("stream close failed", gErr)
- }
- C.g_object_unref(C.gpointer(r.stream))
- r.stream = nil
- return err
-}
-
-func formatGError(msg string, gErr *C.GError, args ...any) error {
- if gErr != nil && gErr.message != nil {
- msg += ": " + C.GoString(gErr.message)
- C.g_error_free(gErr)
- }
- return fmt.Errorf(msg, args...)
-}
diff --git a/v3/internal/assetserver/webview/webkit2_40+_purego.go b/v3/internal/assetserver/webview/webkit2_40+_purego.go
deleted file mode 100644
index 1088be25e09..00000000000
--- a/v3/internal/assetserver/webview/webkit2_40+_purego.go
+++ /dev/null
@@ -1,74 +0,0 @@
-//go:build linux && webkit2_40 && purego
-
-package webview
-
-import (
- "fmt"
- "io"
- "net/http"
- "unsafe"
-)
-
-func webkit_uri_scheme_request_get_http_body(req *C.WebKitURISchemeRequest) io.ReadCloser {
- stream := C.webkit_uri_scheme_request_get_http_body(req)
- if stream == nil {
- return http.NoBody
- }
- return &webkitRequestBody{stream: stream}
-}
-
-type webkitRequestBody struct {
- stream *C.GInputStream
- closed bool
-}
-
-// Read implements io.Reader
-func (r *webkitRequestBody) Read(p []byte) (int, error) {
- if r.closed {
- return 0, io.ErrClosedPipe
- }
-
- var content unsafe.Pointer
- var contentLen int
- if p != nil {
- content = unsafe.Pointer(&p[0])
- contentLen = len(p)
- }
-
- var n C.gsize
- var gErr *C.GError
- res := C.g_input_stream_read_all(r.stream, content, C.gsize(contentLen), &n, nil, &gErr)
- if res == 0 {
- return 0, formatGError("stream read failed", gErr)
- } else if n == 0 {
- return 0, io.EOF
- }
- return int(n), nil
-}
-
-func (r *webkitRequestBody) Close() error {
- if r.closed {
- return nil
- }
- r.closed = true
-
- // https://docs.gtk.org/gio/method.InputStream.close.html
- // Streams will be automatically closed when the last reference is dropped, but you might want to call this function
- // to make sure resources are released as early as possible.
- var err error
- var gErr *C.GError
- if C.g_input_stream_close(r.stream, nil, &gErr) == 0 {
- err = formatGError("stream close failed", gErr)
- }
- C.g_object_unref(C.gpointer(r.stream))
- r.stream = nil
- return err
-}
-
-func formatGError(msg string, gErr *C.GError, args ...any) error {
- if gErr != nil && gErr.message != nil {
- msg += ": " + C.GoString(gErr.message)
- C.g_error_free(gErr)
- }
- return fmt.Errorf(msg, args...)
-}
diff --git a/v3/internal/assetserver/webview/webkit2_40.go b/v3/internal/assetserver/webview/webkit2_40.go
deleted file mode 100644
index 47b504383af..00000000000
--- a/v3/internal/assetserver/webview/webkit2_40.go
+++ /dev/null
@@ -1,5 +0,0 @@
-//go:build linux && webkit2_40
-
-package webview
-
-const Webkit2MinMinorVersion = 40
diff --git a/v3/internal/assetserver/webview/webkit2_legacy.go b/v3/internal/assetserver/webview/webkit2_legacy.go
deleted file mode 100644
index 1a87fe96aeb..00000000000
--- a/v3/internal/assetserver/webview/webkit2_legacy.go
+++ /dev/null
@@ -1,48 +0,0 @@
-//go:build linux && !(webkit2_36 || webkit2_40)
-
-package webview
-
-/*
-#cgo linux pkg-config: gtk+-3.0 webkit2gtk-4.0
-
-#include "gtk/gtk.h"
-#include "webkit2/webkit2.h"
-*/
-import "C"
-
-import (
- "fmt"
- "io"
- "net/http"
- "unsafe"
-)
-
-const Webkit2MinMinorVersion = 0
-
-func webkit_uri_scheme_request_get_http_method(_ *C.WebKitURISchemeRequest) string {
- return http.MethodGet
-}
-
-func webkit_uri_scheme_request_get_http_headers(_ *C.WebKitURISchemeRequest) http.Header {
- // Fake some basic default headers that are needed if e.g. request are being proxied to the an external sever, like
- // we do in the devserver.
- h := http.Header{}
- h.Add("Accept", "*/*")
- h.Add("User-Agent", "wails.io/605.1.15")
- return h
-}
-
-func webkit_uri_scheme_request_get_http_body(_ *C.WebKitURISchemeRequest) io.ReadCloser {
- return http.NoBody
-}
-
-func webkit_uri_scheme_request_finish(req *C.WebKitURISchemeRequest, code int, header http.Header, stream *C.GInputStream, streamLength int64) error {
- if code != http.StatusOK {
- return fmt.Errorf("StatusCodes not supported: %d - %s", code, http.StatusText(code))
- }
-
- cMimeType := C.CString(header.Get(HeaderContentType))
- C.webkit_uri_scheme_request_finish(req, stream, C.gint64(streamLength), cMimeType)
- C.free(unsafe.Pointer(cMimeType))
- return nil
-}
diff --git a/v3/internal/assetserver/webview/webkit2_legacy_purego.go b/v3/internal/assetserver/webview/webkit2_legacy_purego.go
deleted file mode 100644
index 2e88864c8e8..00000000000
--- a/v3/internal/assetserver/webview/webkit2_legacy_purego.go
+++ /dev/null
@@ -1,36 +0,0 @@
-//go:build linux && !(webkit2_36 || webkit2_40) && purego
-
-package webview
-
-import (
- "fmt"
- "io"
- "net/http"
-
- "github.com/ebitengine/purego"
-)
-
-const Webkit2MinMinorVersion = 0
-
-func webkit_uri_scheme_request_get_http_method(_ uintptr) string {
- return http.MethodGet
-}
-
-func webkit_uri_scheme_request_get_http_headers(_ uintptr) http.Header {
- return http.Header{}
-}
-
-func webkit_uri_scheme_request_get_http_body(_ uintptr) io.ReadCloser {
- return http.NoBody
-}
-
-func webkit_uri_scheme_request_finish(req uintptr, code int, header http.Header, stream uintptr, streamLength int64) error {
- if code != http.StatusOK {
- return fmt.Errorf("StatusCodes not supported: %d - %s", code, http.StatusText(code))
- }
-
- var requestFinish func(uintptr, uintptr, int64, string)
- purego.RegisterLibFunc(&requestFinish, webkit, "webkit_uri_scheme_request_finish")
- requestFinish(req, stream, streamLength, header.Get(HeaderContentType))
- return nil
-}
diff --git a/v3/internal/assetserver/webview/webkit2_36+_purego.go b/v3/internal/assetserver/webview/webkit2_purego.go
similarity index 62%
rename from v3/internal/assetserver/webview/webkit2_36+_purego.go
rename to v3/internal/assetserver/webview/webkit2_purego.go
index 2386868c38f..28832c8bd95 100644
--- a/v3/internal/assetserver/webview/webkit2_36+_purego.go
+++ b/v3/internal/assetserver/webview/webkit2_purego.go
@@ -1,4 +1,4 @@
-//go:build linux && (webkit2_36 || webkit2_40) && purego
+//go:build linux && purego
package webview
@@ -92,3 +92,67 @@ func webkit_uri_scheme_request_finish(req uintptr, code int, header http.Header,
return nil
}
+
+func webkit_uri_scheme_request_get_http_body(req *C.WebKitURISchemeRequest) io.ReadCloser {
+ stream := C.webkit_uri_scheme_request_get_http_body(req)
+ if stream == nil {
+ return http.NoBody
+ }
+ return &webkitRequestBody{stream: stream}
+}
+
+type webkitRequestBody struct {
+ stream *C.GInputStream
+ closed bool
+}
+
+// Read implements io.Reader
+func (r *webkitRequestBody) Read(p []byte) (int, error) {
+ if r.closed {
+ return 0, io.ErrClosedPipe
+ }
+
+ var content unsafe.Pointer
+ var contentLen int
+ if p != nil {
+ content = unsafe.Pointer(&p[0])
+ contentLen = len(p)
+ }
+
+ var n C.gsize
+ var gErr *C.GError
+ res := C.g_input_stream_read_all(r.stream, content, C.gsize(contentLen), &n, nil, &gErr)
+ if res == 0 {
+ return 0, formatGError("stream read failed", gErr)
+ } else if n == 0 {
+ return 0, io.EOF
+ }
+ return int(n), nil
+}
+
+func (r *webkitRequestBody) Close() error {
+ if r.closed {
+ return nil
+ }
+ r.closed = true
+
+ // https://docs.gtk.org/gio/method.InputStream.close.html
+ // Streams will be automatically closed when the last reference is dropped, but you might want to call this function
+ // to make sure resources are released as early as possible.
+ var err error
+ var gErr *C.GError
+ if C.g_input_stream_close(r.stream, nil, &gErr) == 0 {
+ err = formatGError("stream close failed", gErr)
+ }
+ C.g_object_unref(C.gpointer(r.stream))
+ r.stream = nil
+ return err
+}
+
+func formatGError(msg string, gErr *C.GError, args ...any) error {
+ if gErr != nil && gErr.message != nil {
+ msg += ": " + C.GoString(gErr.message)
+ C.g_error_free(gErr)
+ }
+ return fmt.Errorf(msg, args...)
+}
diff --git a/v3/internal/commands/build_assets/runtime/runtime.debug.js b/v3/internal/commands/build_assets/runtime/runtime.debug.js
index cd19505891a..834309aac4c 100644
--- a/v3/internal/commands/build_assets/runtime/runtime.debug.js
+++ b/v3/internal/commands/build_assets/runtime/runtime.debug.js
@@ -736,7 +736,12 @@
WindowFileDraggingExited: "mac:WindowFileDraggingExited"
},
Linux: {
- SystemThemeChanged: "linux:SystemThemeChanged"
+ SystemThemeChanged: "linux:SystemThemeChanged",
+ WindowLoadChanged: "linux:WindowLoadChanged",
+ WindowDeleteEvent: "linux:WindowDeleteEvent",
+ WindowFocusIn: "linux:WindowFocusIn",
+ WindowFocusOut: "linux:WindowFocusOut",
+ ApplicationStartup: "linux:ApplicationStartup"
},
Common: {
ApplicationStarted: "common:ApplicationStarted",
@@ -1131,4 +1136,4 @@
Reload();
});
})();
-//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vcnVudGltZS9kZXNrdG9wL0B3YWlsc2lvL3J1bnRpbWUvc3JjL2xvZy5qcyIsICIuLi8uLi8uLi9ydW50aW1lL2Rlc2t0b3AvQHdhaWxzaW8vcnVudGltZS9zcmMvYXBwbGljYXRpb24uanMiLCAiLi4vLi4vLi4vcnVudGltZS9ub2RlX21vZHVsZXMvbmFub2lkL25vbi1zZWN1cmUvaW5kZXguanMiLCAiLi4vLi4vLi4vcnVudGltZS9kZXNrdG9wL0B3YWlsc2lvL3J1bnRpbWUvc3JjL3J1bnRpbWUuanMiLCAiLi4vLi4vLi4vcnVudGltZS9kZXNrdG9wL0B3YWlsc2lvL3J1bnRpbWUvc3JjL2Jyb3dzZXIuanMiLCAiLi4vLi4vLi4vcnVudGltZS9kZXNrdG9wL0B3YWlsc2lvL3J1bnRpbWUvc3JjL2NsaXBib2FyZC5qcyIsICIuLi8uLi8uLi9ydW50aW1lL2Rlc2t0b3AvQHdhaWxzaW8vcnVudGltZS9zcmMvc3lzdGVtLmpzIiwgIi4uLy4uLy4uL3J1bnRpbWUvZGVza3RvcC9Ad2FpbHNpby9ydW50aW1lL3NyYy9jb250ZXh0bWVudS5qcyIsICIuLi8uLi8uLi9ydW50aW1lL2Rlc2t0b3AvQHdhaWxzaW8vcnVudGltZS9zcmMvZmxhZ3MuanMiLCAiLi4vLi4vLi4vcnVudGltZS9kZXNrdG9wL0B3YWlsc2lvL3J1bnRpbWUvc3JjL2RyYWcuanMiLCAiLi4vLi4vLi4vcnVudGltZS9kZXNrdG9wL0B3YWlsc2lvL3J1bnRpbWUvc3JjL3NjcmVlbnMuanMiLCAiLi4vLi4vLi4vcnVudGltZS9kZXNrdG9wL0B3YWlsc2lvL3J1bnRpbWUvc3JjL3dpbmRvdy5qcyIsICIuLi8uLi8uLi9ydW50aW1lL2Rlc2t0b3AvQHdhaWxzaW8vcnVudGltZS9zcmMvd21sLmpzIiwgIi4uLy4uLy4uL3J1bnRpbWUvZGVza3RvcC9Ad2FpbHNpby9ydW50aW1lL3NyYy9ldmVudHMuanMiLCAiLi4vLi4vLi4vcnVudGltZS9kZXNrdG9wL0B3YWlsc2lvL3J1bnRpbWUvc3JjL2V2ZW50X3R5cGVzLmpzIiwgIi4uLy4uLy4uL3J1bnRpbWUvZGVza3RvcC9Ad2FpbHNpby9ydW50aW1lL3NyYy9kaWFsb2dzLmpzIiwgIi4uLy4uLy4uL3J1bnRpbWUvZGVza3RvcC9Ad2FpbHNpby9ydW50aW1lL3NyYy9jYWxscy5qcyIsICIuLi8uLi8uLi9ydW50aW1lL2Rlc2t0b3AvY29tcGlsZWQvbWFpbi5qcyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBMb2dzIGEgbWVzc2FnZSB0byB0aGUgY29uc29sZSB3aXRoIGN1c3RvbSBmb3JtYXR0aW5nLlxuICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2UgLSBUaGUgbWVzc2FnZSB0byBiZSBsb2dnZWQuXG4gKiBAcmV0dXJuIHt2b2lkfVxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVidWdMb2cobWVzc2FnZSkge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZVxuICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAnJWMgd2FpbHMzICVjICcgKyBtZXNzYWdlICsgJyAnLFxuICAgICAgICAnYmFja2dyb3VuZDogI2FhMDAwMDsgY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDNweCAwcHggMHB4IDNweDsgcGFkZGluZzogMXB4OyBmb250LXNpemU6IDAuN3JlbScsXG4gICAgICAgICdiYWNrZ3JvdW5kOiAjMDA5OTAwOyBjb2xvcjogI2ZmZjsgYm9yZGVyLXJhZGl1czogMHB4IDNweCAzcHggMHB4OyBwYWRkaW5nOiAxcHg7IGZvbnQtc2l6ZTogMC43cmVtJ1xuICAgICk7XG59IiwgIi8qXG4gX1x0ICAgX19cdCAgXyBfX1xufCB8XHQgLyAvX19fIF8oXykgL19fX19cbnwgfCAvfCAvIC8gX18gYC8gLyAvIF9fXy9cbnwgfC8gfC8gLyAvXy8gLyAvIChfXyAgKVxufF9fL3xfXy9cXF9fLF8vXy9fL19fX18vXG5UaGUgZWxlY3Ryb24gYWx0ZXJuYXRpdmUgZm9yIEdvXG4oYykgTGVhIEFudGhvbnkgMjAxOS1wcmVzZW50XG4qL1xuXG4vKiBqc2hpbnQgZXN2ZXJzaW9uOiA5ICovXG5cbmltcG9ydCB7IG5ld1J1bnRpbWVDYWxsZXJXaXRoSUQsIG9iamVjdE5hbWVzIH0gZnJvbSBcIi4vcnVudGltZVwiO1xuY29uc3QgY2FsbCA9IG5ld1J1bnRpbWVDYWxsZXJXaXRoSUQob2JqZWN0TmFtZXMuQXBwbGljYXRpb24sICcnKTtcblxuY29uc3QgSGlkZU1ldGhvZCA9IDA7XG5jb25zdCBTaG93TWV0aG9kID0gMTtcbmNvbnN0IFF1aXRNZXRob2QgPSAyO1xuXG4vKipcbiAqIEhpZGVzIGEgY2VydGFpbiBtZXRob2QgYnkgY2FsbGluZyB0aGUgSGlkZU1ldGhvZCBmdW5jdGlvbi5cbiAqXG4gKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fVxuICpcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIEhpZGUoKSB7XG4gICAgcmV0dXJuIGNhbGwoSGlkZU1ldGhvZCk7XG59XG5cbi8qKlxuICogQ2FsbHMgdGhlIFNob3dNZXRob2QgYW5kIHJldHVybnMgdGhlIHJlc3VsdC5cbiAqXG4gKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fVxuICovXG5leHBvcnQgZnVuY3Rpb24gU2hvdygpIHtcbiAgICByZXR1cm4gY2FsbChTaG93TWV0aG9kKTtcbn1cblxuLyoqXG4gKiBDYWxscyB0aGUgUXVpdE1ldGhvZCB0byB0ZXJtaW5hdGUgdGhlIHByb2dyYW0uXG4gKlxuICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFF1aXQoKSB7XG4gICAgcmV0dXJuIGNhbGwoUXVpdE1ldGhvZCk7XG59XG4iLCAibGV0IHVybEFscGhhYmV0ID1cbiAgJ3VzZWFuZG9tLTI2VDE5ODM0MFBYNzVweEpBQ0tWRVJZTUlOREJVU0hXT0xGX0dRWmJmZ2hqa2xxdnd5enJpY3QnXG5leHBvcnQgbGV0IGN1c3RvbUFscGhhYmV0ID0gKGFscGhhYmV0LCBkZWZhdWx0U2l6ZSA9IDIxKSA9PiB7XG4gIHJldHVybiAoc2l6ZSA9IGRlZmF1bHRTaXplKSA9PiB7XG4gICAgbGV0IGlkID0gJydcbiAgICBsZXQgaSA9IHNpemVcbiAgICB3aGlsZSAoaS0tKSB7XG4gICAgICBpZCArPSBhbHBoYWJldFsoTWF0aC5yYW5kb20oKSAqIGFscGhhYmV0Lmxlbmd0aCkgfCAwXVxuICAgIH1cbiAgICByZXR1cm4gaWRcbiAgfVxufVxuZXhwb3J0IGxldCBuYW5vaWQgPSAoc2l6ZSA9IDIxKSA9PiB7XG4gIGxldCBpZCA9ICcnXG4gIGxldCBpID0gc2l6ZVxuICB3aGlsZSAoaS0tKSB7XG4gICAgaWQgKz0gdXJsQWxwaGFiZXRbKE1hdGgucmFuZG9tKCkgKiA2NCkgfCAwXVxuICB9XG4gIHJldHVybiBpZFxufVxuIiwgIi8qXG4gXyAgICAgX18gICAgIF8gX19cbnwgfCAgLyAvX19fIF8oXykgL19fX19cbnwgfCAvfCAvIC8gX18gYC8gLyAvIF9fXy9cbnwgfC8gfC8gLyAvXy8gLyAvIChfXyAgKVxufF9fL3xfXy9cXF9fLF8vXy9fL19fX18vXG5UaGUgZWxlY3Ryb24gYWx0ZXJuYXRpdmUgZm9yIEdvXG4oYykgTGVhIEFudGhvbnkgMjAxOS1wcmVzZW50XG4qL1xuXG4vKiBqc2hpbnQgZXN2ZXJzaW9uOiA5ICovXG5pbXBvcnQgeyBuYW5vaWQgfSBmcm9tICduYW5vaWQvbm9uLXNlY3VyZSc7XG5cbmNvbnN0IHJ1bnRpbWVVUkwgPSB3aW5kb3cubG9jYXRpb24ub3JpZ2luICsgXCIvd2FpbHMvcnVudGltZVwiO1xuXG4vLyBPYmplY3QgTmFtZXNcbmV4cG9ydCBjb25zdCBvYmplY3ROYW1lcyA9IHtcbiAgICBDYWxsOiAwLFxuICAgIENsaXBib2FyZDogMSxcbiAgICBBcHBsaWNhdGlvbjogMixcbiAgICBFdmVudHM6IDMsXG4gICAgQ29udGV4dE1lbnU6IDQsXG4gICAgRGlhbG9nOiA1LFxuICAgIFdpbmRvdzogNixcbiAgICBTY3JlZW5zOiA3LFxuICAgIFN5c3RlbTogOCxcbiAgICBCcm93c2VyOiA5LFxuICAgIENhbmNlbENhbGw6IDEwLFxufVxuZXhwb3J0IGxldCBjbGllbnRJZCA9IG5hbm9pZCgpO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBydW50aW1lIGNhbGxlciBmdW5jdGlvbiB0aGF0IGludm9rZXMgYSBzcGVjaWZpZWQgbWV0aG9kIG9uIGEgZ2l2ZW4gb2JqZWN0IHdpdGhpbiBhIHNwZWNpZmllZCB3aW5kb3cgY29udGV4dC5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IC0gVGhlIG9iamVjdCBvbiB3aGljaCB0aGUgbWV0aG9kIGlzIHRvIGJlIGludm9rZWQuXG4gKiBAcGFyYW0ge3N0cmluZ30gd2luZG93TmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB3aW5kb3cgY29udGV4dCBpbiB3aGljaCB0aGUgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IEEgcnVudGltZSBjYWxsZXIgZnVuY3Rpb24gdGhhdCB0YWtlcyB0aGUgbWV0aG9kIG5hbWUgYW5kIG9wdGlvbmFsbHkgYXJndW1lbnRzIGFuZCBpbnZva2VzIHRoZSBtZXRob2Qgd2l0aGluIHRoZSBzcGVjaWZpZWQgd2luZG93IGNvbnRleHQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBuZXdSdW50aW1lQ2FsbGVyKG9iamVjdCwgd2luZG93TmFtZSkge1xuICAgIHJldHVybiBmdW5jdGlvbiAobWV0aG9kLCBhcmdzPW51bGwpIHtcbiAgICAgICAgcmV0dXJuIHJ1bnRpbWVDYWxsKG9iamVjdCArIFwiLlwiICsgbWV0aG9kLCB3aW5kb3dOYW1lLCBhcmdzKTtcbiAgICB9O1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgcnVudGltZSBjYWxsZXIgd2l0aCBzcGVjaWZpZWQgSUQuXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IG9iamVjdCAtIFRoZSBvYmplY3QgdG8gaW52b2tlIHRoZSBtZXRob2Qgb24uXG4gKiBAcGFyYW0ge3N0cmluZ30gd2luZG93TmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB3aW5kb3cuXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gLSBUaGUgbmV3IHJ1bnRpbWUgY2FsbGVyIGZ1bmN0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbmV3UnVudGltZUNhbGxlcldpdGhJRChvYmplY3QsIHdpbmRvd05hbWUpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKG1ldGhvZCwgYXJncz1udWxsKSB7XG4gICAgICAgIHJldHVybiBydW50aW1lQ2FsbFdpdGhJRChvYmplY3QsIG1ldGhvZCwgd2luZG93TmFtZSwgYXJncyk7XG4gICAgfTtcbn1cblxuXG5mdW5jdGlvbiBydW50aW1lQ2FsbChtZXRob2QsIHdpbmRvd05hbWUsIGFyZ3MpIHtcbiAgICBsZXQgdXJsID0gbmV3IFVSTChydW50aW1lVVJMKTtcbiAgICBpZiggbWV0aG9kICkge1xuICAgICAgICB1cmwuc2VhcmNoUGFyYW1zLmFwcGVuZChcIm1ldGhvZFwiLCBtZXRob2QpO1xuICAgIH1cbiAgICBsZXQgZmV0Y2hPcHRpb25zID0ge1xuICAgICAgICBoZWFkZXJzOiB7fSxcbiAgICB9O1xuICAgIGlmICh3aW5kb3dOYW1lKSB7XG4gICAgICAgIGZldGNoT3B0aW9ucy5oZWFkZXJzW1wieC13YWlscy13aW5kb3ctbmFtZVwiXSA9IHdpbmRvd05hbWU7XG4gICAgfVxuICAgIGlmIChhcmdzKSB7XG4gICAgICAgIHVybC5zZWFyY2hQYXJhbXMuYXBwZW5kKFwiYXJnc1wiLCBKU09OLnN0cmluZ2lmeShhcmdzKSk7XG4gICAgfVxuICAgIGZldGNoT3B0aW9ucy5oZWFkZXJzW1wieC13YWlscy1jbGllbnQtaWRcIl0gPSBjbGllbnRJZDtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGZldGNoKHVybCwgZmV0Y2hPcHRpb25zKVxuICAgICAgICAgICAgLnRoZW4ocmVzcG9uc2UgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS5vaykge1xuICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayBjb250ZW50IHR5cGVcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLmhlYWRlcnMuZ2V0KFwiQ29udGVudC1UeXBlXCIpICYmIHJlc3BvbnNlLmhlYWRlcnMuZ2V0KFwiQ29udGVudC1UeXBlXCIpLmluZGV4T2YoXCJhcHBsaWNhdGlvbi9qc29uXCIpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlLmpzb24oKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXNwb25zZS50ZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmVqZWN0KEVycm9yKHJlc3BvbnNlLnN0YXR1c1RleHQpKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAudGhlbihkYXRhID0+IHJlc29sdmUoZGF0YSkpXG4gICAgICAgICAgICAuY2F0Y2goZXJyb3IgPT4gcmVqZWN0KGVycm9yKSk7XG4gICAgfSk7XG59XG5cbmZ1bmN0aW9uIHJ1bnRpbWVDYWxsV2l0aElEKG9iamVjdElELCBtZXRob2QsIHdpbmRvd05hbWUsIGFyZ3MpIHtcbiAgICBsZXQgdXJsID0gbmV3IFVSTChydW50aW1lVVJMKTtcbiAgICB1cmwuc2VhcmNoUGFyYW1zLmFwcGVuZChcIm9iamVjdFwiLCBvYmplY3RJRCk7XG4gICAgdXJsLnNlYXJjaFBhcmFtcy5hcHBlbmQoXCJtZXRob2RcIiwgbWV0aG9kKTtcbiAgICBsZXQgZmV0Y2hPcHRpb25zID0ge1xuICAgICAgICBoZWFkZXJzOiB7fSxcbiAgICB9O1xuICAgIGlmICh3aW5kb3dOYW1lKSB7XG4gICAgICAgIGZldGNoT3B0aW9ucy5oZWFkZXJzW1wieC13YWlscy13aW5kb3ctbmFtZVwiXSA9IHdpbmRvd05hbWU7XG4gICAgfVxuICAgIGlmIChhcmdzKSB7XG4gICAgICAgIHVybC5zZWFyY2hQYXJhbXMuYXBwZW5kKFwiYXJnc1wiLCBKU09OLnN0cmluZ2lmeShhcmdzKSk7XG4gICAgfVxuICAgIGZldGNoT3B0aW9ucy5oZWFkZXJzW1wieC13YWlscy1jbGllbnQtaWRcIl0gPSBjbGllbnRJZDtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBmZXRjaCh1cmwsIGZldGNoT3B0aW9ucylcbiAgICAgICAgICAgIC50aGVuKHJlc3BvbnNlID0+IHtcbiAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2Uub2spIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgY29udGVudCB0eXBlXG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS5oZWFkZXJzLmdldChcIkNvbnRlbnQtVHlwZVwiKSAmJiByZXNwb25zZS5oZWFkZXJzLmdldChcIkNvbnRlbnQtVHlwZVwiKS5pbmRleE9mKFwiYXBwbGljYXRpb24vanNvblwiKSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXNwb25zZS5qc29uKCk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzcG9uc2UudGV4dCgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJlamVjdChFcnJvcihyZXNwb25zZS5zdGF0dXNUZXh0KSk7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLnRoZW4oZGF0YSA9PiByZXNvbHZlKGRhdGEpKVxuICAgICAgICAgICAgLmNhdGNoKGVycm9yID0+IHJlamVjdChlcnJvcikpO1xuICAgIH0pO1xufVxuIiwgIi8qXG4gX1x0ICAgX19cdCAgXyBfX1xufCB8XHQgLyAvX19fIF8oXykgL19fX19cbnwgfCAvfCAvIC8gX18gYC8gLyAvIF9fXy9cbnwgfC8gfC8gLyAvXy8gLyAvIChfXyAgKVxufF9fL3xfXy9cXF9fLF8vXy9fL19fX18vXG5UaGUgZWxlY3Ryb24gYWx0ZXJuYXRpdmUgZm9yIEdvXG4oYykgTGVhIEFudGhvbnkgMjAxOS1wcmVzZW50XG4qL1xuXG4vKiBqc2hpbnQgZXN2ZXJzaW9uOiA5ICovXG5pbXBvcnQge25ld1J1bnRpbWVDYWxsZXJXaXRoSUQsIG9iamVjdE5hbWVzfSBmcm9tIFwiLi9ydW50aW1lXCI7XG5cbmNvbnN0IGNhbGwgPSBuZXdSdW50aW1lQ2FsbGVyV2l0aElEKG9iamVjdE5hbWVzLkJyb3dzZXIsICcnKTtcbmNvbnN0IEJyb3dzZXJPcGVuVVJMID0gMDtcblxuLyoqXG4gKiBPcGVuIGEgYnJvd3NlciB3aW5kb3cgdG8gdGhlIGdpdmVuIFVSTFxuICogQHBhcmFtIHtzdHJpbmd9IHVybCAtIFRoZSBVUkwgdG8gb3BlblxuICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nPn1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIE9wZW5VUkwodXJsKSB7XG4gICAgcmV0dXJuIGNhbGwoQnJvd3Nlck9wZW5VUkwsIHt1cmx9KTtcbn1cbiIsICIvKlxuIF9cdCAgIF9fXHQgIF8gX19cbnwgfFx0IC8gL19fXyBfKF8pIC9fX19fXG58IHwgL3wgLyAvIF9fIGAvIC8gLyBfX18vXG58IHwvIHwvIC8gL18vIC8gLyAoX18gIClcbnxfXy98X18vXFxfXyxfL18vXy9fX19fL1xuVGhlIGVsZWN0cm9uIGFsdGVybmF0aXZlIGZvciBHb1xuKGMpIExlYSBBbnRob255IDIwMTktcHJlc2VudFxuKi9cblxuLyoganNoaW50IGVzdmVyc2lvbjogOSAqL1xuXG5pbXBvcnQge25ld1J1bnRpbWVDYWxsZXJXaXRoSUQsIG9iamVjdE5hbWVzfSBmcm9tIFwiLi9ydW50aW1lXCI7XG5cbmNvbnN0IGNhbGwgPSBuZXdSdW50aW1lQ2FsbGVyV2l0aElEKG9iamVjdE5hbWVzLkNsaXBib2FyZCwgJycpO1xuY29uc3QgQ2xpcGJvYXJkU2V0VGV4dCA9IDA7XG5jb25zdCBDbGlwYm9hcmRUZXh0ID0gMTtcblxuLyoqXG4gKiBTZXRzIHRoZSB0ZXh0IHRvIHRoZSBDbGlwYm9hcmQuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHRleHQgLSBUaGUgdGV4dCB0byBiZSBzZXQgdG8gdGhlIENsaXBib2FyZC5cbiAqIEByZXR1cm4ge1Byb21pc2V9IC0gQSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgb3BlcmF0aW9uIGlzIHN1Y2Nlc3NmdWwuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBTZXRUZXh0KHRleHQpIHtcbiAgICByZXR1cm4gY2FsbChDbGlwYm9hcmRTZXRUZXh0LCB7dGV4dH0pO1xufVxuXG4vKipcbiAqIEdldCB0aGUgQ2xpcGJvYXJkIHRleHRcbiAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZz59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIHRleHQgZnJvbSB0aGUgQ2xpcGJvYXJkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gVGV4dCgpIHtcbiAgICByZXR1cm4gY2FsbChDbGlwYm9hcmRUZXh0KTtcbn1cbiIsICIvKlxuIF9cdCAgIF9fXHQgIF8gX19cbnwgfFx0IC8gL19fXyBfKF8pIC9fX19fXG58IHwgL3wgLyAvIF9fIGAvIC8gLyBfX18vXG58IHwvIHwvIC8gL18vIC8gLyAoX18gIClcbnxfXy98X18vXFxfXyxfL18vXy9fX19fL1xuVGhlIGVsZWN0cm9uIGFsdGVybmF0aXZlIGZvciBHb1xuKGMpIExlYSBBbnRob255IDIwMTktcHJlc2VudFxuKi9cblxuLyoganNoaW50IGVzdmVyc2lvbjogOSAqL1xuXG5pbXBvcnQge25ld1J1bnRpbWVDYWxsZXJXaXRoSUQsIG9iamVjdE5hbWVzfSBmcm9tIFwiLi9ydW50aW1lXCI7XG5sZXQgY2FsbCA9IG5ld1J1bnRpbWVDYWxsZXJXaXRoSUQob2JqZWN0TmFtZXMuU3lzdGVtLCAnJyk7XG5jb25zdCBzeXN0ZW1Jc0RhcmtNb2RlID0gMDtcbmNvbnN0IGVudmlyb25tZW50ID0gMTtcblxuZXhwb3J0IGZ1bmN0aW9uIGludm9rZShtc2cpIHtcbiAgICBpZih3aW5kb3cuY2hyb21lKSB7XG4gICAgICAgIHJldHVybiB3aW5kb3cuY2hyb21lLndlYnZpZXcucG9zdE1lc3NhZ2UobXNnKTtcbiAgICB9XG4gICAgcmV0dXJuIHdpbmRvdy53ZWJraXQubWVzc2FnZUhhbmRsZXJzLmV4dGVybmFsLnBvc3RNZXNzYWdlKG1zZyk7XG59XG5cbi8qKlxuICogQGZ1bmN0aW9uXG4gKiBSZXRyaWV2ZXMgdGhlIHN5c3RlbSBkYXJrIG1vZGUgc3RhdHVzLlxuICogQHJldHVybnMge1Byb21pc2U8Ym9vbGVhbj59IC0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gYSBib29sZWFuIHZhbHVlIGluZGljYXRpbmcgaWYgdGhlIHN5c3RlbSBpcyBpbiBkYXJrIG1vZGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBJc0RhcmtNb2RlKCkge1xuICAgIHJldHVybiBjYWxsKHN5c3RlbUlzRGFya01vZGUpO1xufVxuXG4vKipcbiAqIEZldGNoZXMgdGhlIGNhcGFiaWxpdGllcyBvZiB0aGUgYXBwbGljYXRpb24gZnJvbSB0aGUgc2VydmVyLlxuICpcbiAqIEBhc3luY1xuICogQGZ1bmN0aW9uIENhcGFiaWxpdGllc1xuICogQHJldHVybnMge1Byb21pc2U8T2JqZWN0Pn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gYW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIGNhcGFiaWxpdGllcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIENhcGFiaWxpdGllcygpIHtcbiAgICBsZXQgcmVzcG9uc2UgPSBmZXRjaChcIi93YWlscy9jYXBhYmlsaXRpZXNcIik7XG4gICAgcmV0dXJuIHJlc3BvbnNlLmpzb24oKTtcbn1cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBFbnZpcm9ubWVudEluZm9cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBPUyAtIFRoZSBvcGVyYXRpbmcgc3lzdGVtIGluIHVzZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBBcmNoIC0gVGhlIGFyY2hpdGVjdHVyZSBvZiB0aGUgc3lzdGVtLlxuICovXG5cbi8qKlxuICogQGZ1bmN0aW9uXG4gKiBSZXRyaWV2ZXMgZW52aXJvbm1lbnQgZGV0YWlscy5cbiAqIEByZXR1cm5zIHtQcm9taXNlPEVudmlyb25tZW50SW5mbz59IC0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gYW4gb2JqZWN0IGNvbnRhaW5pbmcgT1MgYW5kIHN5c3RlbSBhcmNoaXRlY3R1cmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBFbnZpcm9ubWVudCgpIHtcbiAgICByZXR1cm4gY2FsbChlbnZpcm9ubWVudCk7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIHRoZSBjdXJyZW50IG9wZXJhdGluZyBzeXN0ZW0gaXMgV2luZG93cy5cbiAqXG4gKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIHRoZSBvcGVyYXRpbmcgc3lzdGVtIGlzIFdpbmRvd3MsIG90aGVyd2lzZSBmYWxzZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIElzV2luZG93cygpIHtcbiAgICByZXR1cm4gd2luZG93Ll93YWlscy5lbnZpcm9ubWVudC5PUyA9PT0gXCJ3aW5kb3dzXCI7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIHRoZSBjdXJyZW50IG9wZXJhdGluZyBzeXN0ZW0gaXMgTGludXguXG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgdHJ1ZSBpZiB0aGUgY3VycmVudCBvcGVyYXRpbmcgc3lzdGVtIGlzIExpbnV4LCBmYWxzZSBvdGhlcndpc2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBJc0xpbnV4KCkge1xuICAgIHJldHVybiB3aW5kb3cuX3dhaWxzLmVudmlyb25tZW50Lk9TID09PSBcImxpbnV4XCI7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIHRoZSBjdXJyZW50IGVudmlyb25tZW50IGlzIGEgbWFjT1Mgb3BlcmF0aW5nIHN5c3RlbS5cbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgZW52aXJvbm1lbnQgaXMgbWFjT1MsIGZhbHNlIG90aGVyd2lzZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIElzTWFjKCkge1xuICAgIHJldHVybiB3aW5kb3cuX3dhaWxzLmVudmlyb25tZW50Lk9TID09PSBcImRhcndpblwiO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiB0aGUgY3VycmVudCBlbnZpcm9ubWVudCBhcmNoaXRlY3R1cmUgaXMgQU1ENjQuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgY3VycmVudCBlbnZpcm9ubWVudCBhcmNoaXRlY3R1cmUgaXMgQU1ENjQsIGZhbHNlIG90aGVyd2lzZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIElzQU1ENjQoKSB7XG4gICAgcmV0dXJuIHdpbmRvdy5fd2FpbHMuZW52aXJvbm1lbnQuQXJjaCA9PT0gXCJhbWQ2NFwiO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiB0aGUgY3VycmVudCBhcmNoaXRlY3R1cmUgaXMgQVJNLlxuICpcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHRoZSBjdXJyZW50IGFyY2hpdGVjdHVyZSBpcyBBUk0sIGZhbHNlIG90aGVyd2lzZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIElzQVJNKCkge1xuICAgIHJldHVybiB3aW5kb3cuX3dhaWxzLmVudmlyb25tZW50LkFyY2ggPT09IFwiYXJtXCI7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIHRoZSBjdXJyZW50IGVudmlyb25tZW50IGlzIEFSTTY0IGFyY2hpdGVjdHVyZS5cbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSBSZXR1cm5zIHRydWUgaWYgdGhlIGVudmlyb25tZW50IGlzIEFSTTY0IGFyY2hpdGVjdHVyZSwgb3RoZXJ3aXNlIHJldHVybnMgZmFsc2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBJc0FSTTY0KCkge1xuICAgIHJldHVybiB3aW5kb3cuX3dhaWxzLmVudmlyb25tZW50LkFyY2ggPT09IFwiYXJtNjRcIjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIElzRGVidWcoKSB7XG4gICAgcmV0dXJuIHdpbmRvdy5fd2FpbHMuZW52aXJvbm1lbnQuRGVidWcgPT09IHRydWU7XG59XG5cbiIsICIvKlxuIF9cdCAgIF9fXHQgIF8gX19cbnwgfFx0IC8gL19fXyBfKF8pIC9fX19fXG58IHwgL3wgLyAvIF9fIGAvIC8gLyBfX18vXG58IHwvIHwvIC8gL18vIC8gLyAoX18gIClcbnxfXy98X18vXFxfXyxfL18vXy9fX19fL1xuVGhlIGVsZWN0cm9uIGFsdGVybmF0aXZlIGZvciBHb1xuKGMpIExlYSBBbnRob255IDIwMTktcHJlc2VudFxuKi9cblxuLyoganNoaW50IGVzdmVyc2lvbjogOSAqL1xuXG5pbXBvcnQge25ld1J1bnRpbWVDYWxsZXJXaXRoSUQsIG9iamVjdE5hbWVzfSBmcm9tIFwiLi9ydW50aW1lXCI7XG5pbXBvcnQge0lzRGVidWd9IGZyb20gXCIuL3N5c3RlbVwiO1xuXG4vLyBzZXR1cFxud2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2NvbnRleHRtZW51JywgY29udGV4dE1lbnVIYW5kbGVyKTtcblxuY29uc3QgY2FsbCA9IG5ld1J1bnRpbWVDYWxsZXJXaXRoSUQob2JqZWN0TmFtZXMuQ29udGV4dE1lbnUsICcnKTtcbmNvbnN0IENvbnRleHRNZW51T3BlbiA9IDA7XG5cbmZ1bmN0aW9uIG9wZW5Db250ZXh0TWVudShpZCwgeCwgeSwgZGF0YSkge1xuICAgIHZvaWQgY2FsbChDb250ZXh0TWVudU9wZW4sIHtpZCwgeCwgeSwgZGF0YX0pO1xufVxuXG5mdW5jdGlvbiBjb250ZXh0TWVudUhhbmRsZXIoZXZlbnQpIHtcbiAgICAvLyBDaGVjayBmb3IgY3VzdG9tIGNvbnRleHQgbWVudVxuICAgIGxldCBlbGVtZW50ID0gZXZlbnQudGFyZ2V0O1xuICAgIGxldCBjdXN0b21Db250ZXh0TWVudSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpLmdldFByb3BlcnR5VmFsdWUoXCItLWN1c3RvbS1jb250ZXh0bWVudVwiKTtcbiAgICBjdXN0b21Db250ZXh0TWVudSA9IGN1c3RvbUNvbnRleHRNZW51ID8gY3VzdG9tQ29udGV4dE1lbnUudHJpbSgpIDogXCJcIjtcbiAgICBpZiAoY3VzdG9tQ29udGV4dE1lbnUpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgbGV0IGN1c3RvbUNvbnRleHRNZW51RGF0YSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpLmdldFByb3BlcnR5VmFsdWUoXCItLWN1c3RvbS1jb250ZXh0bWVudS1kYXRhXCIpO1xuICAgICAgICBvcGVuQ29udGV4dE1lbnUoY3VzdG9tQ29udGV4dE1lbnUsIGV2ZW50LmNsaWVudFgsIGV2ZW50LmNsaWVudFksIGN1c3RvbUNvbnRleHRNZW51RGF0YSk7XG4gICAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHByb2Nlc3NEZWZhdWx0Q29udGV4dE1lbnUoZXZlbnQpO1xufVxuXG5cbi8qXG4tLWRlZmF1bHQtY29udGV4dG1lbnU6IGF1dG87IChkZWZhdWx0KSB3aWxsIHNob3cgdGhlIGRlZmF1bHQgY29udGV4dCBtZW51IGlmIGNvbnRlbnRFZGl0YWJsZSBpcyB0cnVlIE9SIHRleHQgaGFzIGJlZW4gc2VsZWN0ZWQgT1IgZWxlbWVudCBpcyBpbnB1dCBvciB0ZXh0YXJlYVxuLS1kZWZhdWx0LWNvbnRleHRtZW51OiBzaG93OyB3aWxsIGFsd2F5cyBzaG93IHRoZSBkZWZhdWx0IGNvbnRleHQgbWVudVxuLS1kZWZhdWx0LWNvbnRleHRtZW51OiBoaWRlOyB3aWxsIGFsd2F5cyBoaWRlIHRoZSBkZWZhdWx0IGNvbnRleHQgbWVudVxuXG5UaGlzIHJ1bGUgaXMgaW5oZXJpdGVkIGxpa2Ugbm9ybWFsIENTUyBydWxlcywgc28gbmVzdGluZyB3b3JrcyBhcyBleHBlY3RlZFxuKi9cbmZ1bmN0aW9uIHByb2Nlc3NEZWZhdWx0Q29udGV4dE1lbnUoZXZlbnQpIHtcblxuICAgIC8vIERlYnVnIGJ1aWxkcyBhbHdheXMgc2hvdyB0aGUgbWVudVxuICAgIGlmIChJc0RlYnVnKCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFByb2Nlc3MgZGVmYXVsdCBjb250ZXh0IG1lbnVcbiAgICBjb25zdCBlbGVtZW50ID0gZXZlbnQudGFyZ2V0O1xuICAgIGNvbnN0IGNvbXB1dGVkU3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KTtcbiAgICBjb25zdCBkZWZhdWx0Q29udGV4dE1lbnVBY3Rpb24gPSBjb21wdXRlZFN0eWxlLmdldFByb3BlcnR5VmFsdWUoXCItLWRlZmF1bHQtY29udGV4dG1lbnVcIikudHJpbSgpO1xuICAgIHN3aXRjaCAoZGVmYXVsdENvbnRleHRNZW51QWN0aW9uKSB7XG4gICAgICAgIGNhc2UgXCJzaG93XCI6XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGNhc2UgXCJoaWRlXCI6XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgLy8gQ2hlY2sgaWYgY29udGVudEVkaXRhYmxlIGlzIHRydWVcbiAgICAgICAgICAgIGlmIChlbGVtZW50LmlzQ29udGVudEVkaXRhYmxlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBDaGVjayBpZiB0ZXh0IGhhcyBiZWVuIHNlbGVjdGVkXG4gICAgICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XG4gICAgICAgICAgICBjb25zdCBoYXNTZWxlY3Rpb24gPSAoc2VsZWN0aW9uLnRvU3RyaW5nKCkubGVuZ3RoID4gMClcbiAgICAgICAgICAgIGlmIChoYXNTZWxlY3Rpb24pIHtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNlbGVjdGlvbi5yYW5nZUNvdW50OyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmFuZ2UgPSBzZWxlY3Rpb24uZ2V0UmFuZ2VBdChpKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVjdHMgPSByYW5nZS5nZXRDbGllbnRSZWN0cygpO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHJlY3RzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZWN0ID0gcmVjdHNbal07XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZG9jdW1lbnQuZWxlbWVudEZyb21Qb2ludChyZWN0LmxlZnQsIHJlY3QudG9wKSA9PT0gZWxlbWVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIENoZWNrIGlmIHRhZ25hbWUgaXMgaW5wdXQgb3IgdGV4dGFyZWFcbiAgICAgICAgICAgIGlmIChlbGVtZW50LnRhZ05hbWUgPT09IFwiSU5QVVRcIiB8fCBlbGVtZW50LnRhZ05hbWUgPT09IFwiVEVYVEFSRUFcIikge1xuICAgICAgICAgICAgICAgIGlmIChoYXNTZWxlY3Rpb24gfHwgKCFlbGVtZW50LnJlYWRPbmx5ICYmICFlbGVtZW50LmRpc2FibGVkKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBoaWRlIGRlZmF1bHQgY29udGV4dCBtZW51XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cbn1cbiIsICIvKlxuIF9cdCAgIF9fXHQgIF8gX19cbnwgfFx0IC8gL19fXyBfKF8pIC9fX19fXG58IHwgL3wgLyAvIF9fIGAvIC8gLyBfX18vXG58IHwvIHwvIC8gL18vIC8gLyAoX18gIClcbnxfXy98X18vXFxfXyxfL18vXy9fX19fL1xuVGhlIGVsZWN0cm9uIGFsdGVybmF0aXZlIGZvciBHb1xuKGMpIExlYSBBbnRob255IDIwMTktcHJlc2VudFxuKi9cblxuLyoganNoaW50IGVzdmVyc2lvbjogOSAqL1xuXG4vKipcbiAqIFJldHJpZXZlcyB0aGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQga2V5IGZyb20gdGhlIGZsYWcgbWFwLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXlTdHJpbmcgLSBUaGUga2V5IHRvIHJldHJpZXZlIHRoZSB2YWx1ZSBmb3IuXG4gKiBAcmV0dXJuIHsqfSAtIFRoZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmllZCBrZXkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBHZXRGbGFnKGtleVN0cmluZykge1xuICAgIHRyeSB7XG4gICAgICAgIHJldHVybiB3aW5kb3cuX3dhaWxzLmZsYWdzW2tleVN0cmluZ107XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbmFibGUgdG8gcmV0cmlldmUgZmxhZyAnXCIgKyBrZXlTdHJpbmcgKyBcIic6IFwiICsgZSk7XG4gICAgfVxufVxuIiwgIi8qXG4gX1x0ICAgX19cdCAgXyBfX1xufCB8XHQgLyAvX19fIF8oXykgL19fX19cbnwgfCAvfCAvIC8gX18gYC8gLyAvIF9fXy9cbnwgfC8gfC8gLyAvXy8gLyAvIChfXyAgKVxufF9fL3xfXy9cXF9fLF8vXy9fL19fX18vXG5UaGUgZWxlY3Ryb24gYWx0ZXJuYXRpdmUgZm9yIEdvXG4oYykgTGVhIEFudGhvbnkgMjAxOS1wcmVzZW50XG4qL1xuXG4vKiBqc2hpbnQgZXN2ZXJzaW9uOiA5ICovXG5cbmltcG9ydCB7aW52b2tlLCBJc1dpbmRvd3N9IGZyb20gXCIuL3N5c3RlbVwiO1xuaW1wb3J0IHtHZXRGbGFnfSBmcm9tIFwiLi9mbGFnc1wiO1xuXG4vLyBTZXR1cFxud2luZG93Ll93YWlscyA9IHdpbmRvdy5fd2FpbHMgfHwge307XG53aW5kb3cuX3dhaWxzLnNldFJlc2l6YWJsZSA9IHNldFJlc2l6YWJsZTtcbndpbmRvdy5fd2FpbHMuZW5kRHJhZyA9IGVuZERyYWc7XG53aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgb25Nb3VzZURvd24pO1xud2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIG9uTW91c2VNb3ZlKTtcbndpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgb25Nb3VzZVVwKTtcblxuXG5sZXQgc2hvdWxkRHJhZyA9IGZhbHNlO1xubGV0IHJlc2l6ZUVkZ2UgPSBudWxsO1xubGV0IHJlc2l6YWJsZSA9IGZhbHNlO1xubGV0IGRlZmF1bHRDdXJzb3IgPSBcImF1dG9cIjtcblxuZnVuY3Rpb24gZHJhZ1Rlc3QoZSkge1xuICAgIGxldCB2YWwgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlLnRhcmdldCkuZ2V0UHJvcGVydHlWYWx1ZShcIi0td2Via2l0LWFwcC1yZWdpb25cIik7XG4gICAgaWYgKCF2YWwgfHwgdmFsID09PSBcIlwiIHx8IHZhbC50cmltKCkgIT09IFwiZHJhZ1wiIHx8IGUuYnV0dG9ucyAhPT0gMSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiBlLmRldGFpbCA9PT0gMTtcbn1cblxuZnVuY3Rpb24gc2V0UmVzaXphYmxlKHZhbHVlKSB7XG4gICAgcmVzaXphYmxlID0gdmFsdWU7XG59XG5cbmZ1bmN0aW9uIGVuZERyYWcoKSB7XG4gICAgZG9jdW1lbnQuYm9keS5zdHlsZS5jdXJzb3IgPSAnZGVmYXVsdCc7XG4gICAgc2hvdWxkRHJhZyA9IGZhbHNlO1xufVxuXG5mdW5jdGlvbiB0ZXN0UmVzaXplKCkge1xuICAgIGlmKCByZXNpemVFZGdlICkge1xuICAgICAgICBpbnZva2UoYHJlc2l6ZToke3Jlc2l6ZUVkZ2V9YCk7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gb25Nb3VzZURvd24oZSkge1xuICAgIGlmKElzV2luZG93cygpICYmIHRlc3RSZXNpemUoKSB8fCBkcmFnVGVzdChlKSkge1xuICAgICAgICBzaG91bGREcmFnID0gISFpc1ZhbGlkRHJhZyhlKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGlzVmFsaWREcmFnKGUpIHtcbiAgICAvLyBJZ25vcmUgZHJhZyBvbiBzY3JvbGxiYXJzXG4gICAgcmV0dXJuICEoZS5vZmZzZXRYID4gZS50YXJnZXQuY2xpZW50V2lkdGggfHwgZS5vZmZzZXRZID4gZS50YXJnZXQuY2xpZW50SGVpZ2h0KTtcbn1cblxuZnVuY3Rpb24gb25Nb3VzZVVwKGUpIHtcbiAgICBsZXQgbW91c2VQcmVzc2VkID0gZS5idXR0b25zICE9PSB1bmRlZmluZWQgPyBlLmJ1dHRvbnMgOiBlLndoaWNoO1xuICAgIGlmIChtb3VzZVByZXNzZWQgPiAwKSB7XG4gICAgICAgIGVuZERyYWcoKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIHNldFJlc2l6ZShjdXJzb3IgPSBkZWZhdWx0Q3Vyc29yKSB7XG4gICAgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlLmN1cnNvciA9IGN1cnNvcjtcbiAgICByZXNpemVFZGdlID0gY3Vyc29yO1xufVxuXG5mdW5jdGlvbiBvbk1vdXNlTW92ZShlKSB7XG4gICAgc2hvdWxkRHJhZyA9IGNoZWNrRHJhZyhlKTtcbiAgICBpZiAoSXNXaW5kb3dzKCkgJiYgcmVzaXphYmxlKSB7XG4gICAgICAgIGhhbmRsZVJlc2l6ZShlKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGNoZWNrRHJhZyhlKSB7XG4gICAgbGV0IG1vdXNlUHJlc3NlZCA9IGUuYnV0dG9ucyAhPT0gdW5kZWZpbmVkID8gZS5idXR0b25zIDogZS53aGljaDtcbiAgICBpZihzaG91bGREcmFnICYmIG1vdXNlUHJlc3NlZCA+IDApIHtcbiAgICAgICAgaW52b2tlKFwiZHJhZ1wiKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gc2hvdWxkRHJhZztcbn1cblxuZnVuY3Rpb24gaGFuZGxlUmVzaXplKGUpIHtcbiAgICBsZXQgcmVzaXplSGFuZGxlSGVpZ2h0ID0gR2V0RmxhZyhcInN5c3RlbS5yZXNpemVIYW5kbGVIZWlnaHRcIikgfHwgNTtcbiAgICBsZXQgcmVzaXplSGFuZGxlV2lkdGggPSBHZXRGbGFnKFwic3lzdGVtLnJlc2l6ZUhhbmRsZVdpZHRoXCIpIHx8IDU7XG5cbiAgICAvLyBFeHRyYSBwaXhlbHMgZm9yIHRoZSBjb3JuZXIgYXJlYXNcbiAgICBsZXQgY29ybmVyRXh0cmEgPSBHZXRGbGFnKFwicmVzaXplQ29ybmVyRXh0cmFcIikgfHwgMTA7XG5cbiAgICBsZXQgcmlnaHRCb3JkZXIgPSB3aW5kb3cub3V0ZXJXaWR0aCAtIGUuY2xpZW50WCA8IHJlc2l6ZUhhbmRsZVdpZHRoO1xuICAgIGxldCBsZWZ0Qm9yZGVyID0gZS5jbGllbnRYIDwgcmVzaXplSGFuZGxlV2lkdGg7XG4gICAgbGV0IHRvcEJvcmRlciA9IGUuY2xpZW50WSA8IHJlc2l6ZUhhbmRsZUhlaWdodDtcbiAgICBsZXQgYm90dG9tQm9yZGVyID0gd2luZG93Lm91dGVySGVpZ2h0IC0gZS5jbGllbnRZIDwgcmVzaXplSGFuZGxlSGVpZ2h0O1xuXG4gICAgLy8gQWRqdXN0IGZvciBjb3JuZXJzXG4gICAgbGV0IHJpZ2h0Q29ybmVyID0gd2luZG93Lm91dGVyV2lkdGggLSBlLmNsaWVudFggPCAocmVzaXplSGFuZGxlV2lkdGggKyBjb3JuZXJFeHRyYSk7XG4gICAgbGV0IGxlZnRDb3JuZXIgPSBlLmNsaWVudFggPCAocmVzaXplSGFuZGxlV2lkdGggKyBjb3JuZXJFeHRyYSk7XG4gICAgbGV0IHRvcENvcm5lciA9IGUuY2xpZW50WSA8IChyZXNpemVIYW5kbGVIZWlnaHQgKyBjb3JuZXJFeHRyYSk7XG4gICAgbGV0IGJvdHRvbUNvcm5lciA9IHdpbmRvdy5vdXRlckhlaWdodCAtIGUuY2xpZW50WSA8IChyZXNpemVIYW5kbGVIZWlnaHQgKyBjb3JuZXJFeHRyYSk7XG5cbiAgICAvLyBJZiB3ZSBhcmVuJ3Qgb24gYW4gZWRnZSwgYnV0IHdlcmUsIHJlc2V0IHRoZSBjdXJzb3IgdG8gZGVmYXVsdFxuICAgIGlmICghbGVmdEJvcmRlciAmJiAhcmlnaHRCb3JkZXIgJiYgIXRvcEJvcmRlciAmJiAhYm90dG9tQm9yZGVyICYmIHJlc2l6ZUVkZ2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBzZXRSZXNpemUoKTtcbiAgICB9XG4gICAgLy8gQWRqdXN0ZWQgZm9yIGNvcm5lciBhcmVhc1xuICAgIGVsc2UgaWYgKHJpZ2h0Q29ybmVyICYmIGJvdHRvbUNvcm5lcikgc2V0UmVzaXplKFwic2UtcmVzaXplXCIpO1xuICAgIGVsc2UgaWYgKGxlZnRDb3JuZXIgJiYgYm90dG9tQ29ybmVyKSBzZXRSZXNpemUoXCJzdy1yZXNpemVcIik7XG4gICAgZWxzZSBpZiAobGVmdENvcm5lciAmJiB0b3BDb3JuZXIpIHNldFJlc2l6ZShcIm53LXJlc2l6ZVwiKTtcbiAgICBlbHNlIGlmICh0b3BDb3JuZXIgJiYgcmlnaHRDb3JuZXIpIHNldFJlc2l6ZShcIm5lLXJlc2l6ZVwiKTtcbiAgICBlbHNlIGlmIChsZWZ0Qm9yZGVyKSBzZXRSZXNpemUoXCJ3LXJlc2l6ZVwiKTtcbiAgICBlbHNlIGlmICh0b3BCb3JkZXIpIHNldFJlc2l6ZShcIm4tcmVzaXplXCIpO1xuICAgIGVsc2UgaWYgKGJvdHRvbUJvcmRlcikgc2V0UmVzaXplKFwicy1yZXNpemVcIik7XG4gICAgZWxzZSBpZiAocmlnaHRCb3JkZXIpIHNldFJlc2l6ZShcImUtcmVzaXplXCIpO1xufVxuIiwgIi8qXG4gX1x0ICAgX19cdCAgXyBfX1xufCB8XHQgLyAvX19fIF8oXykgL19fX19cbnwgfCAvfCAvIC8gX18gYC8gLyAvIF9fXy9cbnwgfC8gfC8gLyAvXy8gLyAvIChfXyAgKVxufF9fL3xfXy9cXF9fLF8vXy9fL19fX18vXG5UaGUgZWxlY3Ryb24gYWx0ZXJuYXRpdmUgZm9yIEdvXG4oYykgTGVhIEFudGhvbnkgMjAxOS1wcmVzZW50XG4qL1xuXG4vKiBqc2hpbnQgZXN2ZXJzaW9uOiA5ICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gUG9zaXRpb25cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBYIC0gVGhlIFggY29vcmRpbmF0ZS5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBZIC0gVGhlIFkgY29vcmRpbmF0ZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFNpemVcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBYIC0gVGhlIHdpZHRoLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IFkgLSBUaGUgaGVpZ2h0LlxuICovXG5cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBSZWN0XG4gKiBAcHJvcGVydHkge251bWJlcn0gWCAtIFRoZSBYIGNvb3JkaW5hdGUgb2YgdGhlIHRvcC1sZWZ0IGNvcm5lci5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBZIC0gVGhlIFkgY29vcmRpbmF0ZSBvZiB0aGUgdG9wLWxlZnQgY29ybmVyLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IFdpZHRoIC0gVGhlIHdpZHRoIG9mIHRoZSByZWN0YW5nbGUuXG4gKiBAcHJvcGVydHkge251bWJlcn0gSGVpZ2h0IC0gVGhlIGhlaWdodCBvZiB0aGUgcmVjdGFuZ2xlLlxuICovXG5cblxuLyoqXG4gKiBAdHlwZWRlZiB7KCdaZXJvJ3wnTmluZXR5J3wnT25lRWlnaHR5J3wnVHdvU2V2ZW50eScpfSBSb3RhdGlvblxuICogVGhlIHJvdGF0aW9uIG9mIHRoZSBzY3JlZW4uIENhbiBiZSBvbmUgb2YgJ1plcm8nLCAnTmluZXR5JywgJ09uZUVpZ2h0eScsICdUd29TZXZlbnR5Jy5cbiAqL1xuXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gU2NyZWVuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gSWQgLSBVbmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHNjcmVlbi5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBOYW1lIC0gSHVtYW4gcmVhZGFibGUgbmFtZSBvZiB0aGUgc2NyZWVuLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IFNjYWxlIC0gVGhlIHJlc29sdXRpb24gc2NhbGUgb2YgdGhlIHNjcmVlbi4gMSA9IHN0YW5kYXJkIHJlc29sdXRpb24sIDIgPSBoaWdoIChSZXRpbmEpLCBldGMuXG4gKiBAcHJvcGVydHkge1Bvc2l0aW9ufSBQb3NpdGlvbiAtIENvbnRhaW5zIHRoZSBYIGFuZCBZIGNvb3JkaW5hdGVzIG9mIHRoZSBzY3JlZW4ncyBwb3NpdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2l6ZX0gU2l6ZSAtIENvbnRhaW5zIHRoZSB3aWR0aCBhbmQgaGVpZ2h0IG9mIHRoZSBzY3JlZW4uXG4gKiBAcHJvcGVydHkge1JlY3R9IEJvdW5kcyAtIENvbnRhaW5zIHRoZSBib3VuZHMgb2YgdGhlIHNjcmVlbiBpbiB0ZXJtcyBvZiBYLCBZLCBXaWR0aCwgYW5kIEhlaWdodC5cbiAqIEBwcm9wZXJ0eSB7UmVjdH0gV29ya0FyZWEgLSBDb250YWlucyB0aGUgYXJlYSBvZiB0aGUgc2NyZWVuIHRoYXQgaXMgYWN0dWFsbHkgdXNhYmxlIChleGNsdWRpbmcgdGFza2JhciBhbmQgb3RoZXIgc3lzdGVtIFVJKS5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gSXNQcmltYXJ5IC0gVHJ1ZSBpZiB0aGlzIGlzIHRoZSBwcmltYXJ5IG1vbml0b3Igc2VsZWN0ZWQgYnkgdGhlIHVzZXIgaW4gdGhlIG9wZXJhdGluZyBzeXN0ZW0uXG4gKiBAcHJvcGVydHkge1JvdGF0aW9ufSBSb3RhdGlvbiAtIFRoZSByb3RhdGlvbiBvZiB0aGUgc2NyZWVuLlxuICovXG5cblxuaW1wb3J0IHtuZXdSdW50aW1lQ2FsbGVyV2l0aElELCBvYmplY3ROYW1lc30gZnJvbSBcIi4vcnVudGltZVwiO1xuY29uc3QgY2FsbCA9IG5ld1J1bnRpbWVDYWxsZXJXaXRoSUQob2JqZWN0TmFtZXMuU2NyZWVucywgJycpO1xuXG5jb25zdCBnZXRBbGwgPSAwO1xuY29uc3QgZ2V0UHJpbWFyeSA9IDE7XG5jb25zdCBnZXRDdXJyZW50ID0gMjtcblxuLyoqXG4gKiBHZXRzIGFsbCBzY3JlZW5zLlxuICogQHJldHVybnMge1Byb21pc2U8U2NyZWVuW10+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byBhbiBhcnJheSBvZiBTY3JlZW4gb2JqZWN0cy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIEdldEFsbCgpIHtcbiAgICByZXR1cm4gY2FsbChnZXRBbGwpO1xufVxuLyoqXG4gKiBHZXRzIHRoZSBwcmltYXJ5IHNjcmVlbi5cbiAqIEByZXR1cm5zIHtQcm9taXNlPFNjcmVlbj59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSBwcmltYXJ5IHNjcmVlbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIEdldFByaW1hcnkoKSB7XG4gICAgcmV0dXJuIGNhbGwoZ2V0UHJpbWFyeSk7XG59XG4vKipcbiAqIEdldHMgdGhlIGN1cnJlbnQgYWN0aXZlIHNjcmVlbi5cbiAqXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxTY3JlZW4+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBjdXJyZW50IGFjdGl2ZSBzY3JlZW4uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBHZXRDdXJyZW50KCkge1xuICAgIHJldHVybiBjYWxsKGdldEN1cnJlbnQpO1xufSIsICIvKlxuIF9cdCAgIF9fXHQgIF8gX19cbnwgfFx0IC8gL19fXyBfKF8pIC9fX19fXG58IHwgL3wgLyAvIF9fIGAvIC8gLyBfX18vXG58IHwvIHwvIC8gL18vIC8gLyAoX18gIClcbnxfXy98X18vXFxfXyxfL18vXy9fX19fL1xuVGhlIGVsZWN0cm9uIGFsdGVybmF0aXZlIGZvciBHb1xuKGMpIExlYSBBbnRob255IDIwMTktcHJlc2VudFxuKi9cblxuLyoganNoaW50IGVzdmVyc2lvbjogOSAqL1xuXG4vLyBJbXBvcnQgc2NyZWVuIGpzZG9jIGRlZmluaXRpb24gZnJvbSAuL3NjcmVlbnMuanNcbi8qKlxuICogQHR5cGVkZWYge2ltcG9ydChcIi4vc2NyZWVuc1wiKS5TY3JlZW59IFNjcmVlblxuICovXG5cbmltcG9ydCB7bmV3UnVudGltZUNhbGxlcldpdGhJRCwgb2JqZWN0TmFtZXN9IGZyb20gXCIuL3J1bnRpbWVcIjtcblxuY29uc3QgY2VudGVyID0gMDtcbmNvbnN0IHNldFRpdGxlID0gMTtcbmNvbnN0IGZ1bGxzY3JlZW4gPSAyO1xuY29uc3QgdW5GdWxsc2NyZWVuID0gMztcbmNvbnN0IHNldFNpemUgPSA0O1xuY29uc3Qgc2l6ZSA9IDU7XG5jb25zdCBzZXRNYXhTaXplID0gNjtcbmNvbnN0IHNldE1pblNpemUgPSA3O1xuY29uc3Qgc2V0QWx3YXlzT25Ub3AgPSA4O1xuY29uc3Qgc2V0UmVsYXRpdmVQb3NpdGlvbiA9IDk7XG5jb25zdCByZWxhdGl2ZVBvc2l0aW9uID0gMTA7XG5jb25zdCBzY3JlZW4gPSAxMTtcbmNvbnN0IGhpZGUgPSAxMjtcbmNvbnN0IG1heGltaXNlID0gMTM7XG5jb25zdCB1bk1heGltaXNlID0gMTQ7XG5jb25zdCB0b2dnbGVNYXhpbWlzZSA9IDE1O1xuY29uc3QgbWluaW1pc2UgPSAxNjtcbmNvbnN0IHVuTWluaW1pc2UgPSAxNztcbmNvbnN0IHJlc3RvcmUgPSAxODtcbmNvbnN0IHNob3cgPSAxOTtcbmNvbnN0IGNsb3NlID0gMjA7XG5jb25zdCBzZXRCYWNrZ3JvdW5kQ29sb3VyID0gMjE7XG5jb25zdCBzZXRSZXNpemFibGUgPSAyMjtcbmNvbnN0IHdpZHRoID0gMjM7XG5jb25zdCBoZWlnaHQgPSAyNDtcbmNvbnN0IHpvb21JbiA9IDI1O1xuY29uc3Qgem9vbU91dCA9IDI2O1xuY29uc3Qgem9vbVJlc2V0ID0gMjc7XG5jb25zdCBnZXRab29tTGV2ZWwgPSAyODtcbmNvbnN0IHNldFpvb21MZXZlbCA9IDI5O1xuXG5jb25zdCB0aGlzV2luZG93ID0gR2V0KCcnKTtcblxuZnVuY3Rpb24gY3JlYXRlV2luZG93KGNhbGwpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBHZXQ6ICh3aW5kb3dOYW1lKSA9PiBjcmVhdGVXaW5kb3cobmV3UnVudGltZUNhbGxlcldpdGhJRChvYmplY3ROYW1lcy5XaW5kb3csIHdpbmRvd05hbWUpKSxcbiAgICAgICAgQ2VudGVyOiAoKSA9PiBjYWxsKGNlbnRlciksXG4gICAgICAgIFNldFRpdGxlOiAodGl0bGUpID0+IGNhbGwoc2V0VGl0bGUsIHt0aXRsZX0pLFxuICAgICAgICBGdWxsc2NyZWVuOiAoKSA9PiBjYWxsKGZ1bGxzY3JlZW4pLFxuICAgICAgICBVbkZ1bGxzY3JlZW46ICgpID0+IGNhbGwodW5GdWxsc2NyZWVuKSxcbiAgICAgICAgU2V0U2l6ZTogKHdpZHRoLCBoZWlnaHQpID0+IGNhbGwoc2V0U2l6ZSwge3dpZHRoLCBoZWlnaHR9KSxcbiAgICAgICAgU2l6ZTogKCkgPT4gY2FsbChzaXplKSxcbiAgICAgICAgU2V0TWF4U2l6ZTogKHdpZHRoLCBoZWlnaHQpID0+IGNhbGwoc2V0TWF4U2l6ZSwge3dpZHRoLCBoZWlnaHR9KSxcbiAgICAgICAgU2V0TWluU2l6ZTogKHdpZHRoLCBoZWlnaHQpID0+IGNhbGwoc2V0TWluU2l6ZSwge3dpZHRoLCBoZWlnaHR9KSxcbiAgICAgICAgU2V0QWx3YXlzT25Ub3A6IChvblRvcCkgPT4gY2FsbChzZXRBbHdheXNPblRvcCwge2Fsd2F5c09uVG9wOiBvblRvcH0pLFxuICAgICAgICBTZXRSZWxhdGl2ZVBvc2l0aW9uOiAoeCwgeSkgPT4gY2FsbChzZXRSZWxhdGl2ZVBvc2l0aW9uLCB7eCwgeX0pLFxuICAgICAgICBSZWxhdGl2ZVBvc2l0aW9uOiAoKSA9PiBjYWxsKHJlbGF0aXZlUG9zaXRpb24pLFxuICAgICAgICBTY3JlZW46ICgpID0+IGNhbGwoc2NyZWVuKSxcbiAgICAgICAgSGlkZTogKCkgPT4gY2FsbChoaWRlKSxcbiAgICAgICAgTWF4aW1pc2U6ICgpID0+IGNhbGwobWF4aW1pc2UpLFxuICAgICAgICBVbk1heGltaXNlOiAoKSA9PiBjYWxsKHVuTWF4aW1pc2UpLFxuICAgICAgICBUb2dnbGVNYXhpbWlzZTogKCkgPT4gY2FsbCh0b2dnbGVNYXhpbWlzZSksXG4gICAgICAgIE1pbmltaXNlOiAoKSA9PiBjYWxsKG1pbmltaXNlKSxcbiAgICAgICAgVW5NaW5pbWlzZTogKCkgPT4gY2FsbCh1bk1pbmltaXNlKSxcbiAgICAgICAgUmVzdG9yZTogKCkgPT4gY2FsbChyZXN0b3JlKSxcbiAgICAgICAgU2hvdzogKCkgPT4gY2FsbChzaG93KSxcbiAgICAgICAgQ2xvc2U6ICgpID0+IGNhbGwoY2xvc2UpLFxuICAgICAgICBTZXRCYWNrZ3JvdW5kQ29sb3VyOiAociwgZywgYiwgYSkgPT4gY2FsbChzZXRCYWNrZ3JvdW5kQ29sb3VyLCB7ciwgZywgYiwgYX0pLFxuICAgICAgICBTZXRSZXNpemFibGU6IChyZXNpemFibGUpID0+IGNhbGwoc2V0UmVzaXphYmxlLCB7cmVzaXphYmxlfSksXG4gICAgICAgIFdpZHRoOiAoKSA9PiBjYWxsKHdpZHRoKSxcbiAgICAgICAgSGVpZ2h0OiAoKSA9PiBjYWxsKGhlaWdodCksXG4gICAgICAgIFpvb21JbjogKCkgPT4gY2FsbCh6b29tSW4pLFxuICAgICAgICBab29tT3V0OiAoKSA9PiBjYWxsKHpvb21PdXQpLFxuICAgICAgICBab29tUmVzZXQ6ICgpID0+IGNhbGwoem9vbVJlc2V0KSxcbiAgICAgICAgR2V0Wm9vbUxldmVsOiAoKSA9PiBjYWxsKGdldFpvb21MZXZlbCksXG4gICAgICAgIFNldFpvb21MZXZlbDogKHpvb21MZXZlbCkgPT4gY2FsbChzZXRab29tTGV2ZWwsIHt6b29tTGV2ZWx9KSxcbiAgICB9O1xufVxuXG4vKipcbiAqIEdldHMgdGhlIHNwZWNpZmllZCB3aW5kb3cuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHdpbmRvd05hbWUgLSBUaGUgbmFtZSBvZiB0aGUgd2luZG93IHRvIGdldC5cbiAqIEByZXR1cm4ge09iamVjdH0gLSBUaGUgc3BlY2lmaWVkIHdpbmRvdyBvYmplY3QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBHZXQod2luZG93TmFtZSkge1xuICAgIHJldHVybiBjcmVhdGVXaW5kb3cobmV3UnVudGltZUNhbGxlcldpdGhJRChvYmplY3ROYW1lcy5XaW5kb3csIHdpbmRvd05hbWUpKTtcbn1cblxuLyoqXG4gKiBDZW50ZXJzIHRoZSB3aW5kb3cgb24gdGhlIHNjcmVlbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIENlbnRlcigpIHtcbiAgICB0aGlzV2luZG93LkNlbnRlcigpO1xufVxuXG4vKipcbiAqIFNldHMgdGhlIHRpdGxlIG9mIHRoZSB3aW5kb3cuXG4gKiBAcGFyYW0ge3N0cmluZ30gdGl0bGUgLSBUaGUgdGl0bGUgdG8gc2V0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gU2V0VGl0bGUodGl0bGUpIHtcbiAgICB0aGlzV2luZG93LlNldFRpdGxlKHRpdGxlKTtcbn1cblxuLyoqXG4gKiBTZXRzIHRoZSB3aW5kb3cgdG8gZnVsbHNjcmVlbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIEZ1bGxzY3JlZW4oKSB7XG4gICAgdGhpc1dpbmRvdy5GdWxsc2NyZWVuKCk7XG59XG5cbi8qKlxuICogU2V0cyB0aGUgc2l6ZSBvZiB0aGUgd2luZG93LlxuICogQHBhcmFtIHtudW1iZXJ9IHdpZHRoIC0gVGhlIHdpZHRoIG9mIHRoZSB3aW5kb3cuXG4gKiBAcGFyYW0ge251bWJlcn0gaGVpZ2h0IC0gVGhlIGhlaWdodCBvZiB0aGUgd2luZG93LlxuICovXG5leHBvcnQgZnVuY3Rpb24gU2V0U2l6ZSh3aWR0aCwgaGVpZ2h0KSB7XG4gICAgdGhpc1dpbmRvdy5TZXRTaXplKHdpZHRoLCBoZWlnaHQpO1xufVxuXG4vKipcbiAqIEdldHMgdGhlIHNpemUgb2YgdGhlIHdpbmRvdy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFNpemUoKSB7XG4gICAgcmV0dXJuIHRoaXNXaW5kb3cuU2l6ZSgpO1xufVxuXG4vKipcbiAqIFNldHMgdGhlIG1heGltdW0gc2l6ZSBvZiB0aGUgd2luZG93LlxuICogQHBhcmFtIHtudW1iZXJ9IHdpZHRoIC0gVGhlIG1heGltdW0gd2lkdGggb2YgdGhlIHdpbmRvdy5cbiAqIEBwYXJhbSB7bnVtYmVyfSBoZWlnaHQgLSBUaGUgbWF4aW11bSBoZWlnaHQgb2YgdGhlIHdpbmRvdy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFNldE1heFNpemUod2lkdGgsIGhlaWdodCkge1xuICAgIHRoaXNXaW5kb3cuU2V0TWF4U2l6ZSh3aWR0aCwgaGVpZ2h0KTtcbn1cblxuLyoqXG4gKiBTZXRzIHRoZSBtaW5pbXVtIHNpemUgb2YgdGhlIHdpbmRvdy5cbiAqIEBwYXJhbSB7bnVtYmVyfSB3aWR0aCAtIFRoZSBtaW5pbXVtIHdpZHRoIG9mIHRoZSB3aW5kb3cuXG4gKiBAcGFyYW0ge251bWJlcn0gaGVpZ2h0IC0gVGhlIG1pbmltdW0gaGVpZ2h0IG9mIHRoZSB3aW5kb3cuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBTZXRNaW5TaXplKHdpZHRoLCBoZWlnaHQpIHtcbiAgICB0aGlzV2luZG93LlNldE1pblNpemUod2lkdGgsIGhlaWdodCk7XG59XG5cbi8qKlxuICogU2V0cyB0aGUgd2luZG93IHRvIGFsd2F5cyBiZSBvbiB0b3AuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IG9uVG9wIC0gV2hldGhlciB0aGUgd2luZG93IHNob3VsZCBhbHdheXMgYmUgb24gdG9wLlxuICovXG5leHBvcnQgZnVuY3Rpb24gU2V0QWx3YXlzT25Ub3Aob25Ub3ApIHtcbiAgICB0aGlzV2luZG93LlNldEFsd2F5c09uVG9wKG9uVG9wKTtcbn1cblxuLyoqXG4gKiBTZXRzIHRoZSByZWxhdGl2ZSBwb3NpdGlvbiBvZiB0aGUgd2luZG93LlxuICogQHBhcmFtIHtudW1iZXJ9IHggLSBUaGUgeC1jb29yZGluYXRlIG9mIHRoZSB3aW5kb3cncyBwb3NpdGlvbi5cbiAqIEBwYXJhbSB7bnVtYmVyfSB5IC0gVGhlIHktY29vcmRpbmF0ZSBvZiB0aGUgd2luZG93J3MgcG9zaXRpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBTZXRSZWxhdGl2ZVBvc2l0aW9uKHgsIHkpIHtcbiAgICB0aGlzV2luZG93LlNldFJlbGF0aXZlUG9zaXRpb24oeCwgeSk7XG59XG5cbi8qKlxuICogR2V0cyB0aGUgcmVsYXRpdmUgcG9zaXRpb24gb2YgdGhlIHdpbmRvdy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFJlbGF0aXZlUG9zaXRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXNXaW5kb3cuUmVsYXRpdmVQb3NpdGlvbigpO1xufVxuXG4vKipcbiAqIEdldHMgdGhlIHNjcmVlbiB0aGF0IHRoZSB3aW5kb3cgaXMgb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBTY3JlZW4oKSB7XG4gICAgcmV0dXJuIHRoaXNXaW5kb3cuU2NyZWVuKCk7XG59XG5cbi8qKlxuICogSGlkZXMgdGhlIHdpbmRvdy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIEhpZGUoKSB7XG4gICAgdGhpc1dpbmRvdy5IaWRlKCk7XG59XG5cbi8qKlxuICogTWF4aW1pc2VzIHRoZSB3aW5kb3cuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBNYXhpbWlzZSgpIHtcbiAgICB0aGlzV2luZG93Lk1heGltaXNlKCk7XG59XG5cbi8qKlxuICogVW4tbWF4aW1pc2VzIHRoZSB3aW5kb3cuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBVbk1heGltaXNlKCkge1xuICAgIHRoaXNXaW5kb3cuVW5NYXhpbWlzZSgpO1xufVxuXG4vKipcbiAqIFRvZ2dsZXMgdGhlIG1heGltaXNhdGlvbiBvZiB0aGUgd2luZG93LlxuICovXG5leHBvcnQgZnVuY3Rpb24gVG9nZ2xlTWF4aW1pc2UoKSB7XG4gICAgdGhpc1dpbmRvdy5Ub2dnbGVNYXhpbWlzZSgpO1xufVxuXG4vKipcbiAqIE1pbmltaXNlcyB0aGUgd2luZG93LlxuICovXG5leHBvcnQgZnVuY3Rpb24gTWluaW1pc2UoKSB7XG4gICAgdGhpc1dpbmRvdy5NaW5pbWlzZSgpO1xufVxuXG4vKipcbiAqIFVuLW1pbmltaXNlcyB0aGUgd2luZG93LlxuICovXG5leHBvcnQgZnVuY3Rpb24gVW5NaW5pbWlzZSgpIHtcbiAgICB0aGlzV2luZG93LlVuTWluaW1pc2UoKTtcbn1cblxuLyoqXG4gKiBSZXN0b3JlcyB0aGUgd2luZG93LlxuICovXG5leHBvcnQgZnVuY3Rpb24gUmVzdG9yZSgpIHtcbiAgICB0aGlzV2luZG93LlJlc3RvcmUoKTtcbn1cblxuLyoqXG4gKiBTaG93cyB0aGUgd2luZG93LlxuICovXG5leHBvcnQgZnVuY3Rpb24gU2hvdygpIHtcbiAgICB0aGlzV2luZG93LlNob3coKTtcbn1cblxuLyoqXG4gKiBDbG9zZXMgdGhlIHdpbmRvdy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIENsb3NlKCkge1xuICAgIHRoaXNXaW5kb3cuQ2xvc2UoKTtcbn1cblxuLyoqXG4gKiBTZXRzIHRoZSBiYWNrZ3JvdW5kIGNvbG91ciBvZiB0aGUgd2luZG93LlxuICogQHBhcmFtIHtudW1iZXJ9IHIgLSBUaGUgcmVkIGNvbXBvbmVudCBvZiB0aGUgY29sb3VyLlxuICogQHBhcmFtIHtudW1iZXJ9IGcgLSBUaGUgZ3JlZW4gY29tcG9uZW50IG9mIHRoZSBjb2xvdXIuXG4gKiBAcGFyYW0ge251bWJlcn0gYiAtIFRoZSBibHVlIGNvbXBvbmVudCBvZiB0aGUgY29sb3VyLlxuICogQHBhcmFtIHtudW1iZXJ9IGEgLSBUaGUgYWxwaGEgY29tcG9uZW50IG9mIHRoZSBjb2xvdXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBTZXRCYWNrZ3JvdW5kQ29sb3VyKHIsIGcsIGIsIGEpIHtcbiAgICB0aGlzV2luZG93LlNldEJhY2tncm91bmRDb2xvdXIociwgZywgYiwgYSk7XG59XG5cbi8qKlxuICogU2V0cyB3aGV0aGVyIHRoZSB3aW5kb3cgaXMgcmVzaXphYmxlLlxuICogQHBhcmFtIHtib29sZWFufSByZXNpemFibGUgLSBXaGV0aGVyIHRoZSB3aW5kb3cgc2hvdWxkIGJlIHJlc2l6YWJsZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFNldFJlc2l6YWJsZShyZXNpemFibGUpIHtcbiAgICB0aGlzV2luZG93LlNldFJlc2l6YWJsZShyZXNpemFibGUpO1xufVxuXG4vKipcbiAqIEdldHMgdGhlIHdpZHRoIG9mIHRoZSB3aW5kb3cuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBXaWR0aCgpIHtcbiAgICByZXR1cm4gdGhpc1dpbmRvdy5XaWR0aCgpO1xufVxuXG4vKipcbiAqIEdldHMgdGhlIGhlaWdodCBvZiB0aGUgd2luZG93LlxuICovXG5leHBvcnQgZnVuY3Rpb24gSGVpZ2h0KCkge1xuICAgIHJldHVybiB0aGlzV2luZG93LkhlaWdodCgpO1xufVxuXG4vKipcbiAqIFpvb21zIGluIHRoZSB3aW5kb3cuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBab29tSW4oKSB7XG4gICAgdGhpc1dpbmRvdy5ab29tSW4oKTtcbn1cblxuLyoqXG4gKiBab29tcyBvdXQgdGhlIHdpbmRvdy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFpvb21PdXQoKSB7XG4gICAgdGhpc1dpbmRvdy5ab29tT3V0KCk7XG59XG5cbi8qKlxuICogUmVzZXRzIHRoZSB6b29tIG9mIHRoZSB3aW5kb3cuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBab29tUmVzZXQoKSB7XG4gICAgdGhpc1dpbmRvdy5ab29tUmVzZXQoKTtcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSB6b29tIGxldmVsIG9mIHRoZSB3aW5kb3cuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBHZXRab29tTGV2ZWwoKSB7XG4gICAgcmV0dXJuIHRoaXNXaW5kb3cuR2V0Wm9vbUxldmVsKCk7XG59XG5cbi8qKlxuICogU2V0cyB0aGUgem9vbSBsZXZlbCBvZiB0aGUgd2luZG93LlxuICogQHBhcmFtIHtudW1iZXJ9IHpvb21MZXZlbCAtIFRoZSB6b29tIGxldmVsIHRvIHNldC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFNldFpvb21MZXZlbCh6b29tTGV2ZWwpIHtcbiAgICB0aGlzV2luZG93LlNldFpvb21MZXZlbCh6b29tTGV2ZWwpO1xufVxuIiwgIlxuaW1wb3J0IHtFbWl0LCBXYWlsc0V2ZW50fSBmcm9tIFwiLi9ldmVudHNcIjtcbmltcG9ydCB7UXVlc3Rpb259IGZyb20gXCIuL2RpYWxvZ3NcIjtcbmltcG9ydCB7R2V0fSBmcm9tIFwiLi93aW5kb3dcIjtcbmltcG9ydCB7T3BlblVSTH0gZnJvbSBcIi4vYnJvd3NlclwiO1xuXG4vKipcbiAqIFNlbmRzIGFuIGV2ZW50IHdpdGggdGhlIGdpdmVuIG5hbWUgYW5kIG9wdGlvbmFsIGRhdGEuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBldmVudCB0byBzZW5kLlxuICogQHBhcmFtIHthbnl9IFtkYXRhPW51bGxdIC0gT3B0aW9uYWwgZGF0YSB0byBzZW5kIGFsb25nIHdpdGggdGhlIGV2ZW50LlxuICpcbiAqIEByZXR1cm4ge3ZvaWR9XG4gKi9cbmZ1bmN0aW9uIHNlbmRFdmVudChldmVudE5hbWUsIGRhdGE9bnVsbCkge1xuICAgIGxldCBldmVudCA9IG5ldyBXYWlsc0V2ZW50KGV2ZW50TmFtZSwgZGF0YSk7XG4gICAgRW1pdChldmVudCk7XG59XG5cbi8qKlxuICogQWRkcyBldmVudCBsaXN0ZW5lcnMgdG8gZWxlbWVudHMgd2l0aCBgd21sLWV2ZW50YCBhdHRyaWJ1dGUuXG4gKlxuICogQHJldHVybiB7dm9pZH1cbiAqL1xuZnVuY3Rpb24gYWRkV01MRXZlbnRMaXN0ZW5lcnMoKSB7XG4gICAgY29uc3QgZWxlbWVudHMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdbd21sLWV2ZW50XScpO1xuICAgIGVsZW1lbnRzLmZvckVhY2goZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICAgICAgY29uc3QgZXZlbnRUeXBlID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ3dtbC1ldmVudCcpO1xuICAgICAgICBjb25zdCBjb25maXJtID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ3dtbC1jb25maXJtJyk7XG4gICAgICAgIGNvbnN0IHRyaWdnZXIgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgnd21sLXRyaWdnZXInKSB8fCBcImNsaWNrXCI7XG5cbiAgICAgICAgbGV0IGNhbGxiYWNrID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKGNvbmZpcm0pIHtcbiAgICAgICAgICAgICAgICBRdWVzdGlvbih7VGl0bGU6IFwiQ29uZmlybVwiLCBNZXNzYWdlOmNvbmZpcm0sIERldGFjaGVkOiBmYWxzZSwgQnV0dG9uczpbe0xhYmVsOlwiWWVzXCJ9LHtMYWJlbDpcIk5vXCIsIElzRGVmYXVsdDp0cnVlfV19KS50aGVuKGZ1bmN0aW9uIChyZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCAhPT0gXCJOb1wiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZW5kRXZlbnQoZXZlbnRUeXBlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNlbmRFdmVudChldmVudFR5cGUpO1xuICAgICAgICB9O1xuXG4gICAgICAgIC8vIFJlbW92ZSBleGlzdGluZyBsaXN0ZW5lcnNcbiAgICAgICAgZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKHRyaWdnZXIsIGNhbGxiYWNrKTtcblxuICAgICAgICAvLyBBZGQgbmV3IGxpc3RlbmVyXG4gICAgICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcih0cmlnZ2VyLCBjYWxsYmFjayk7XG4gICAgfSk7XG59XG5cblxuLyoqXG4gKiBDYWxscyBhIG1ldGhvZCBvbiBhIHNwZWNpZmllZCB3aW5kb3cuXG4gKiBAcGFyYW0ge3N0cmluZ30gd2luZG93TmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB3aW5kb3cgdG8gY2FsbCB0aGUgbWV0aG9kIG9uLlxuICogQHBhcmFtIHtzdHJpbmd9IG1ldGhvZCAtIFRoZSBuYW1lIG9mIHRoZSBtZXRob2QgdG8gY2FsbC5cbiAqL1xuZnVuY3Rpb24gY2FsbFdpbmRvd01ldGhvZCh3aW5kb3dOYW1lLCBtZXRob2QpIHtcbiAgICBsZXQgdGFyZ2V0V2luZG93ID0gR2V0KHdpbmRvd05hbWUpO1xuICAgIGxldCBtZXRob2RNYXAgPSBXaW5kb3dNZXRob2RzKHRhcmdldFdpbmRvdyk7XG4gICAgaWYgKCFtZXRob2RNYXAuaGFzKG1ldGhvZCkpIHtcbiAgICAgICAgY29uc29sZS5sb2coXCJXaW5kb3cgbWV0aG9kIFwiICsgbWV0aG9kICsgXCIgbm90IGZvdW5kXCIpO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICBtZXRob2RNYXAuZ2V0KG1ldGhvZCkoKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciBjYWxsaW5nIHdpbmRvdyBtZXRob2QgJ1wiICsgbWV0aG9kICsgXCInOiBcIiArIGUpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBBZGRzIHdpbmRvdyBsaXN0ZW5lcnMgZm9yIGVsZW1lbnRzIHdpdGggdGhlICd3bWwtd2luZG93JyBhdHRyaWJ1dGUuXG4gKiBSZW1vdmVzIGFueSBleGlzdGluZyBsaXN0ZW5lcnMgYmVmb3JlIGFkZGluZyBuZXcgb25lcy5cbiAqXG4gKiBAcmV0dXJuIHt2b2lkfVxuICovXG5mdW5jdGlvbiBhZGRXTUxXaW5kb3dMaXN0ZW5lcnMoKSB7XG4gICAgY29uc3QgZWxlbWVudHMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdbd21sLXdpbmRvd10nKTtcbiAgICBlbGVtZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICAgIGNvbnN0IHdpbmRvd01ldGhvZCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCd3bWwtd2luZG93Jyk7XG4gICAgICAgIGNvbnN0IGNvbmZpcm0gPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgnd21sLWNvbmZpcm0nKTtcbiAgICAgICAgY29uc3QgdHJpZ2dlciA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCd3bWwtdHJpZ2dlcicpIHx8ICdjbGljayc7XG4gICAgICAgIGNvbnN0IHRhcmdldFdpbmRvdyA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCd3bWwtdGFyZ2V0LXdpbmRvdycpIHx8ICcnO1xuXG4gICAgICAgIGxldCBjYWxsYmFjayA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmIChjb25maXJtKSB7XG4gICAgICAgICAgICAgICAgUXVlc3Rpb24oe1RpdGxlOiBcIkNvbmZpcm1cIiwgTWVzc2FnZTpjb25maXJtLCBCdXR0b25zOlt7TGFiZWw6XCJZZXNcIn0se0xhYmVsOlwiTm9cIiwgSXNEZWZhdWx0OnRydWV9XX0pLnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0ICE9PSBcIk5vXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxXaW5kb3dNZXRob2QodGFyZ2V0V2luZG93LCB3aW5kb3dNZXRob2QpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FsbFdpbmRvd01ldGhvZCh0YXJnZXRXaW5kb3csIHdpbmRvd01ldGhvZCk7XG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gUmVtb3ZlIGV4aXN0aW5nIGxpc3RlbmVyc1xuICAgICAgICBlbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIodHJpZ2dlciwgY2FsbGJhY2spO1xuXG4gICAgICAgIC8vIEFkZCBuZXcgbGlzdGVuZXJcbiAgICAgICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKHRyaWdnZXIsIGNhbGxiYWNrKTtcbiAgICB9KTtcbn1cblxuLyoqXG4gKiBBZGRzIGEgbGlzdGVuZXIgdG8gZWxlbWVudHMgd2l0aCB0aGUgJ3dtbC1vcGVudXJsJyBhdHRyaWJ1dGUuXG4gKiBXaGVuIHRoZSBzcGVjaWZpZWQgdHJpZ2dlciBldmVudCBpcyBmaXJlZCBvbiBhbnkgb2YgdGhlc2UgZWxlbWVudHMsXG4gKiB0aGUgbGlzdGVuZXIgd2lsbCBvcGVuIHRoZSBVUkwgc3BlY2lmaWVkIGJ5IHRoZSAnd21sLW9wZW51cmwnIGF0dHJpYnV0ZS5cbiAqIElmIGEgJ3dtbC1jb25maXJtJyBhdHRyaWJ1dGUgaXMgcHJvdmlkZWQsIGEgY29uZmlybWF0aW9uIGRpYWxvZyB3aWxsIGJlIGRpc3BsYXllZCxcbiAqIGFuZCB0aGUgVVJMIHdpbGwgb25seSBiZSBvcGVuZWQgaWYgdGhlIHVzZXIgY29uZmlybXMuXG4gKlxuICogQHJldHVybiB7dm9pZH1cbiAqL1xuZnVuY3Rpb24gYWRkV01MT3BlbkJyb3dzZXJMaXN0ZW5lcigpIHtcbiAgICBjb25zdCBlbGVtZW50cyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1t3bWwtb3BlbnVybF0nKTtcbiAgICBlbGVtZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICAgIGNvbnN0IHVybCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCd3bWwtb3BlbnVybCcpO1xuICAgICAgICBjb25zdCBjb25maXJtID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ3dtbC1jb25maXJtJyk7XG4gICAgICAgIGNvbnN0IHRyaWdnZXIgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgnd21sLXRyaWdnZXInKSB8fCBcImNsaWNrXCI7XG5cbiAgICAgICAgbGV0IGNhbGxiYWNrID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKGNvbmZpcm0pIHtcbiAgICAgICAgICAgICAgICBRdWVzdGlvbih7VGl0bGU6IFwiQ29uZmlybVwiLCBNZXNzYWdlOmNvbmZpcm0sIEJ1dHRvbnM6W3tMYWJlbDpcIlllc1wifSx7TGFiZWw6XCJOb1wiLCBJc0RlZmF1bHQ6dHJ1ZX1dfSkudGhlbihmdW5jdGlvbiAocmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgIT09IFwiTm9cIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCBPcGVuVVJMKHVybCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2b2lkIE9wZW5VUkwodXJsKTtcbiAgICAgICAgfTtcblxuICAgICAgICAvLyBSZW1vdmUgZXhpc3RpbmcgbGlzdGVuZXJzXG4gICAgICAgIGVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcih0cmlnZ2VyLCBjYWxsYmFjayk7XG5cbiAgICAgICAgLy8gQWRkIG5ldyBsaXN0ZW5lclxuICAgICAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIodHJpZ2dlciwgY2FsbGJhY2spO1xuICAgIH0pO1xufVxuXG4vKipcbiAqIFJlbG9hZHMgdGhlIFdNTCBwYWdlIGJ5IGFkZGluZyBuZWNlc3NhcnkgZXZlbnQgbGlzdGVuZXJzIGFuZCBicm93c2VyIGxpc3RlbmVycy5cbiAqXG4gKiBAcmV0dXJuIHt2b2lkfVxuICovXG5leHBvcnQgZnVuY3Rpb24gUmVsb2FkKCkge1xuICAgIGFkZFdNTEV2ZW50TGlzdGVuZXJzKCk7XG4gICAgYWRkV01MV2luZG93TGlzdGVuZXJzKCk7XG4gICAgYWRkV01MT3BlbkJyb3dzZXJMaXN0ZW5lcigpO1xufVxuXG4vKipcbiAqIFJldHVybnMgYSBtYXAgb2YgYWxsIG1ldGhvZHMgaW4gdGhlIGN1cnJlbnQgd2luZG93LlxuICogQHJldHVybnMge01hcH0gLSBBIG1hcCBvZiB3aW5kb3cgbWV0aG9kcy5cbiAqL1xuZnVuY3Rpb24gV2luZG93TWV0aG9kcyh0YXJnZXRXaW5kb3cpIHtcbiAgICAvLyBDcmVhdGUgYSBuZXcgbWFwIHRvIHN0b3JlIG1ldGhvZHNcbiAgICBsZXQgcmVzdWx0ID0gbmV3IE1hcCgpO1xuXG4gICAgLy8gSXRlcmF0ZSBvdmVyIGFsbCBwcm9wZXJ0aWVzIG9mIHRoZSB3aW5kb3cgb2JqZWN0XG4gICAgZm9yIChsZXQgbWV0aG9kIGluIHRhcmdldFdpbmRvdykge1xuICAgICAgICAvLyBDaGVjayBpZiB0aGUgcHJvcGVydHkgaXMgaW5kZWVkIGEgbWV0aG9kIChmdW5jdGlvbilcbiAgICAgICAgaWYodHlwZW9mIHRhcmdldFdpbmRvd1ttZXRob2RdID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAvLyBBZGQgdGhlIG1ldGhvZCB0byB0aGUgbWFwXG4gICAgICAgICAgICByZXN1bHQuc2V0KG1ldGhvZCwgdGFyZ2V0V2luZG93W21ldGhvZF0pO1xuICAgICAgICB9XG5cbiAgICB9XG4gICAgLy8gUmV0dXJuIHRoZSBtYXAgb2Ygd2luZG93IG1ldGhvZHNcbiAgICByZXR1cm4gcmVzdWx0O1xufSIsICIvKlxuIF9cdCAgIF9fXHQgIF8gX19cbnwgfFx0IC8gL19fXyBfKF8pIC9fX19fXG58IHwgL3wgLyAvIF9fIGAvIC8gLyBfX18vXG58IHwvIHwvIC8gL18vIC8gLyAoX18gIClcbnxfXy98X18vXFxfXyxfL18vXy9fX19fL1xuVGhlIGVsZWN0cm9uIGFsdGVybmF0aXZlIGZvciBHb1xuKGMpIExlYSBBbnRob255IDIwMTktcHJlc2VudFxuKi9cblxuLyoganNoaW50IGVzdmVyc2lvbjogOSAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtpbXBvcnQoXCIuL3R5cGVzXCIpLldhaWxzRXZlbnR9IFdhaWxzRXZlbnRcbiAqL1xuaW1wb3J0IHtuZXdSdW50aW1lQ2FsbGVyV2l0aElELCBvYmplY3ROYW1lc30gZnJvbSBcIi4vcnVudGltZVwiO1xuXG5pbXBvcnQge0V2ZW50VHlwZXN9IGZyb20gXCIuL2V2ZW50X3R5cGVzXCI7XG5leHBvcnQgY29uc3QgVHlwZXMgPSBFdmVudFR5cGVzO1xuXG4vLyBTZXR1cFxud2luZG93Ll93YWlscyA9IHdpbmRvdy5fd2FpbHMgfHwge307XG53aW5kb3cuX3dhaWxzLmRpc3BhdGNoV2FpbHNFdmVudCA9IGRpc3BhdGNoV2FpbHNFdmVudDtcblxuY29uc3QgY2FsbCA9IG5ld1J1bnRpbWVDYWxsZXJXaXRoSUQob2JqZWN0TmFtZXMuRXZlbnRzLCAnJyk7XG5jb25zdCBFbWl0TWV0aG9kID0gMDtcbmNvbnN0IGV2ZW50TGlzdGVuZXJzID0gbmV3IE1hcCgpO1xuXG5jbGFzcyBMaXN0ZW5lciB7XG4gICAgY29uc3RydWN0b3IoZXZlbnROYW1lLCBjYWxsYmFjaywgbWF4Q2FsbGJhY2tzKSB7XG4gICAgICAgIHRoaXMuZXZlbnROYW1lID0gZXZlbnROYW1lO1xuICAgICAgICB0aGlzLm1heENhbGxiYWNrcyA9IG1heENhbGxiYWNrcyB8fCAtMTtcbiAgICAgICAgdGhpcy5DYWxsYmFjayA9IChkYXRhKSA9PiB7XG4gICAgICAgICAgICBjYWxsYmFjayhkYXRhKTtcbiAgICAgICAgICAgIGlmICh0aGlzLm1heENhbGxiYWNrcyA9PT0gLTEpIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMubWF4Q2FsbGJhY2tzIC09IDE7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5tYXhDYWxsYmFja3MgPT09IDA7XG4gICAgICAgIH07XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgV2FpbHNFdmVudCB7XG4gICAgY29uc3RydWN0b3IobmFtZSwgZGF0YSA9IG51bGwpIHtcbiAgICAgICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICAgICAgdGhpcy5kYXRhID0gZGF0YTtcbiAgICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXR1cCgpIHtcbn1cblxuZnVuY3Rpb24gZGlzcGF0Y2hXYWlsc0V2ZW50KGV2ZW50KSB7XG4gICAgbGV0IGxpc3RlbmVycyA9IGV2ZW50TGlzdGVuZXJzLmdldChldmVudC5uYW1lKTtcbiAgICBpZiAobGlzdGVuZXJzKSB7XG4gICAgICAgIGxldCB0b1JlbW92ZSA9IGxpc3RlbmVycy5maWx0ZXIobGlzdGVuZXIgPT4ge1xuICAgICAgICAgICAgbGV0IHJlbW92ZSA9IGxpc3RlbmVyLkNhbGxiYWNrKGV2ZW50KTtcbiAgICAgICAgICAgIGlmIChyZW1vdmUpIHJldHVybiB0cnVlO1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHRvUmVtb3ZlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGxpc3RlbmVycyA9IGxpc3RlbmVycy5maWx0ZXIobCA9PiAhdG9SZW1vdmUuaW5jbHVkZXMobCkpO1xuICAgICAgICAgICAgaWYgKGxpc3RlbmVycy5sZW5ndGggPT09IDApIGV2ZW50TGlzdGVuZXJzLmRlbGV0ZShldmVudC5uYW1lKTtcbiAgICAgICAgICAgIGVsc2UgZXZlbnRMaXN0ZW5lcnMuc2V0KGV2ZW50Lm5hbWUsIGxpc3RlbmVycyk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbi8qKlxuICogUmVnaXN0ZXIgYSBjYWxsYmFjayBmdW5jdGlvbiB0byBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMgZm9yIGEgc3BlY2lmaWMgZXZlbnQuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBldmVudCB0byByZWdpc3RlciB0aGUgY2FsbGJhY2sgZm9yLlxuICogQHBhcmFtIHtmdW5jdGlvbn0gY2FsbGJhY2sgLSBUaGUgY2FsbGJhY2sgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIHdoZW4gdGhlIGV2ZW50IGlzIHRyaWdnZXJlZC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBtYXhDYWxsYmFja3MgLSBUaGUgbWF4aW11bSBudW1iZXIgb2YgdGltZXMgdGhlIGNhbGxiYWNrIGNhbiBiZSBjYWxsZWQgZm9yIHRoZSBldmVudC4gT25jZSB0aGUgbWF4aW11bSBudW1iZXIgaXMgcmVhY2hlZCwgdGhlIGNhbGxiYWNrIHdpbGwgbm8gbG9uZ2VyIGJlIGNhbGxlZC5cbiAqXG4gQHJldHVybiB7ZnVuY3Rpb259IC0gQSBmdW5jdGlvbiB0aGF0LCB3aGVuIGNhbGxlZCwgd2lsbCB1bnJlZ2lzdGVyIHRoZSBjYWxsYmFjayBmcm9tIHRoZSBldmVudC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIE9uTXVsdGlwbGUoZXZlbnROYW1lLCBjYWxsYmFjaywgbWF4Q2FsbGJhY2tzKSB7XG4gICAgbGV0IGxpc3RlbmVycyA9IGV2ZW50TGlzdGVuZXJzLmdldChldmVudE5hbWUpIHx8IFtdO1xuICAgIGNvbnN0IHRoaXNMaXN0ZW5lciA9IG5ldyBMaXN0ZW5lcihldmVudE5hbWUsIGNhbGxiYWNrLCBtYXhDYWxsYmFja3MpO1xuICAgIGxpc3RlbmVycy5wdXNoKHRoaXNMaXN0ZW5lcik7XG4gICAgZXZlbnRMaXN0ZW5lcnMuc2V0KGV2ZW50TmFtZSwgbGlzdGVuZXJzKTtcbiAgICByZXR1cm4gKCkgPT4gbGlzdGVuZXJPZmYodGhpc0xpc3RlbmVyKTtcbn1cblxuLyoqXG4gKiBSZWdpc3RlcnMgYSBjYWxsYmFjayBmdW5jdGlvbiB0byBiZSBleGVjdXRlZCB3aGVuIHRoZSBzcGVjaWZpZWQgZXZlbnQgb2NjdXJzLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBldmVudE5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgZXZlbnQuXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBjYWxsYmFjayAtIFRoZSBjYWxsYmFjayBmdW5jdGlvbiB0byBiZSBleGVjdXRlZC4gSXQgdGFrZXMgbm8gcGFyYW1ldGVycy5cbiAqIEByZXR1cm4ge2Z1bmN0aW9ufSAtIEEgZnVuY3Rpb24gdGhhdCwgd2hlbiBjYWxsZWQsIHdpbGwgdW5yZWdpc3RlciB0aGUgY2FsbGJhY2sgZnJvbSB0aGUgZXZlbnQuICovXG5leHBvcnQgZnVuY3Rpb24gT24oZXZlbnROYW1lLCBjYWxsYmFjaykgeyByZXR1cm4gT25NdWx0aXBsZShldmVudE5hbWUsIGNhbGxiYWNrLCAtMSk7IH1cblxuLyoqXG4gKiBSZWdpc3RlcnMgYSBjYWxsYmFjayBmdW5jdGlvbiB0byBiZSBleGVjdXRlZCBvbmx5IG9uY2UgZm9yIHRoZSBzcGVjaWZpZWQgZXZlbnQuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBldmVudC5cbiAqIEBwYXJhbSB7ZnVuY3Rpb259IGNhbGxiYWNrIC0gVGhlIGZ1bmN0aW9uIHRvIGJlIGV4ZWN1dGVkIHdoZW4gdGhlIGV2ZW50IG9jY3Vycy5cbiAqIEByZXR1cm4ge2Z1bmN0aW9ufSAtIEEgZnVuY3Rpb24gdGhhdCwgd2hlbiBjYWxsZWQsIHdpbGwgdW5yZWdpc3RlciB0aGUgY2FsbGJhY2sgZnJvbSB0aGUgZXZlbnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBPbmNlKGV2ZW50TmFtZSwgY2FsbGJhY2spIHsgcmV0dXJuIE9uTXVsdGlwbGUoZXZlbnROYW1lLCBjYWxsYmFjaywgMSk7IH1cblxuLyoqXG4gKiBSZW1vdmVzIHRoZSBzcGVjaWZpZWQgbGlzdGVuZXIgZnJvbSB0aGUgZXZlbnQgbGlzdGVuZXJzIGNvbGxlY3Rpb24uXG4gKiBJZiBhbGwgbGlzdGVuZXJzIGZvciB0aGUgZXZlbnQgYXJlIHJlbW92ZWQsIHRoZSBldmVudCBrZXkgaXMgZGVsZXRlZCBmcm9tIHRoZSBjb2xsZWN0aW9uLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBsaXN0ZW5lciAtIFRoZSBsaXN0ZW5lciB0byBiZSByZW1vdmVkLlxuICovXG5mdW5jdGlvbiBsaXN0ZW5lck9mZihsaXN0ZW5lcikge1xuICAgIGNvbnN0IGV2ZW50TmFtZSA9IGxpc3RlbmVyLmV2ZW50TmFtZTtcbiAgICBsZXQgbGlzdGVuZXJzID0gZXZlbnRMaXN0ZW5lcnMuZ2V0KGV2ZW50TmFtZSkuZmlsdGVyKGwgPT4gbCAhPT0gbGlzdGVuZXIpO1xuICAgIGlmIChsaXN0ZW5lcnMubGVuZ3RoID09PSAwKSBldmVudExpc3RlbmVycy5kZWxldGUoZXZlbnROYW1lKTtcbiAgICBlbHNlIGV2ZW50TGlzdGVuZXJzLnNldChldmVudE5hbWUsIGxpc3RlbmVycyk7XG59XG5cblxuLyoqXG4gKiBSZW1vdmVzIGV2ZW50IGxpc3RlbmVycyBmb3IgdGhlIHNwZWNpZmllZCBldmVudCBuYW1lcy5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGV2ZW50IHRvIHJlbW92ZSBsaXN0ZW5lcnMgZm9yLlxuICogQHBhcmFtIHsuLi5zdHJpbmd9IGFkZGl0aW9uYWxFdmVudE5hbWVzIC0gQWRkaXRpb25hbCBldmVudCBuYW1lcyB0byByZW1vdmUgbGlzdGVuZXJzIGZvci5cbiAqIEByZXR1cm4ge3VuZGVmaW5lZH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIE9mZihldmVudE5hbWUsIC4uLmFkZGl0aW9uYWxFdmVudE5hbWVzKSB7XG4gICAgbGV0IGV2ZW50c1RvUmVtb3ZlID0gW2V2ZW50TmFtZSwgLi4uYWRkaXRpb25hbEV2ZW50TmFtZXNdO1xuICAgIGV2ZW50c1RvUmVtb3ZlLmZvckVhY2goZXZlbnROYW1lID0+IGV2ZW50TGlzdGVuZXJzLmRlbGV0ZShldmVudE5hbWUpKTtcbn1cbi8qKlxuICogUmVtb3ZlcyBhbGwgZXZlbnQgbGlzdGVuZXJzLlxuICpcbiAqIEBmdW5jdGlvbiBPZmZBbGxcbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5leHBvcnQgZnVuY3Rpb24gT2ZmQWxsKCkgeyBldmVudExpc3RlbmVycy5jbGVhcigpOyB9XG5cbi8qKlxuICogRW1pdHMgYW4gZXZlbnQgdXNpbmcgdGhlIGdpdmVuIGV2ZW50IG5hbWUuXG4gKlxuICogQHBhcmFtIHtXYWlsc0V2ZW50fSBldmVudCAtIFRoZSBuYW1lIG9mIHRoZSBldmVudCB0byBlbWl0LlxuICogQHJldHVybnMge2FueX0gLSBUaGUgcmVzdWx0IG9mIHRoZSBlbWl0dGVkIGV2ZW50LlxuICovXG5leHBvcnQgZnVuY3Rpb24gRW1pdChldmVudCkgeyByZXR1cm4gY2FsbChFbWl0TWV0aG9kLCBldmVudCk7IH1cbiIsICJcbmV4cG9ydCBjb25zdCBFdmVudFR5cGVzID0ge1xuXHRXaW5kb3dzOiB7XG5cdFx0U3lzdGVtVGhlbWVDaGFuZ2VkOiBcIndpbmRvd3M6U3lzdGVtVGhlbWVDaGFuZ2VkXCIsXG5cdFx0QVBNUG93ZXJTdGF0dXNDaGFuZ2U6IFwid2luZG93czpBUE1Qb3dlclN0YXR1c0NoYW5nZVwiLFxuXHRcdEFQTVN1c3BlbmQ6IFwid2luZG93czpBUE1TdXNwZW5kXCIsXG5cdFx0QVBNUmVzdW1lQXV0b21hdGljOiBcIndpbmRvd3M6QVBNUmVzdW1lQXV0b21hdGljXCIsXG5cdFx0QVBNUmVzdW1lU3VzcGVuZDogXCJ3aW5kb3dzOkFQTVJlc3VtZVN1c3BlbmRcIixcblx0XHRBUE1Qb3dlclNldHRpbmdDaGFuZ2U6IFwid2luZG93czpBUE1Qb3dlclNldHRpbmdDaGFuZ2VcIixcblx0XHRBcHBsaWNhdGlvblN0YXJ0ZWQ6IFwid2luZG93czpBcHBsaWNhdGlvblN0YXJ0ZWRcIixcblx0XHRXZWJWaWV3TmF2aWdhdGlvbkNvbXBsZXRlZDogXCJ3aW5kb3dzOldlYlZpZXdOYXZpZ2F0aW9uQ29tcGxldGVkXCIsXG5cdFx0V2luZG93SW5hY3RpdmU6IFwid2luZG93czpXaW5kb3dJbmFjdGl2ZVwiLFxuXHRcdFdpbmRvd0FjdGl2ZTogXCJ3aW5kb3dzOldpbmRvd0FjdGl2ZVwiLFxuXHRcdFdpbmRvd0NsaWNrQWN0aXZlOiBcIndpbmRvd3M6V2luZG93Q2xpY2tBY3RpdmVcIixcblx0XHRXaW5kb3dNYXhpbWlzZTogXCJ3aW5kb3dzOldpbmRvd01heGltaXNlXCIsXG5cdFx0V2luZG93VW5NYXhpbWlzZTogXCJ3aW5kb3dzOldpbmRvd1VuTWF4aW1pc2VcIixcblx0XHRXaW5kb3dGdWxsc2NyZWVuOiBcIndpbmRvd3M6V2luZG93RnVsbHNjcmVlblwiLFxuXHRcdFdpbmRvd1VuRnVsbHNjcmVlbjogXCJ3aW5kb3dzOldpbmRvd1VuRnVsbHNjcmVlblwiLFxuXHRcdFdpbmRvd1Jlc3RvcmU6IFwid2luZG93czpXaW5kb3dSZXN0b3JlXCIsXG5cdFx0V2luZG93TWluaW1pc2U6IFwid2luZG93czpXaW5kb3dNaW5pbWlzZVwiLFxuXHRcdFdpbmRvd1VuTWluaW1pc2U6IFwid2luZG93czpXaW5kb3dVbk1pbmltaXNlXCIsXG5cdFx0V2luZG93Q2xvc2U6IFwid2luZG93czpXaW5kb3dDbG9zZVwiLFxuXHRcdFdpbmRvd1NldEZvY3VzOiBcIndpbmRvd3M6V2luZG93U2V0Rm9jdXNcIixcblx0XHRXaW5kb3dLaWxsRm9jdXM6IFwid2luZG93czpXaW5kb3dLaWxsRm9jdXNcIixcblx0XHRXaW5kb3dEcmFnRHJvcDogXCJ3aW5kb3dzOldpbmRvd0RyYWdEcm9wXCIsXG5cdFx0V2luZG93RHJhZ0VudGVyOiBcIndpbmRvd3M6V2luZG93RHJhZ0VudGVyXCIsXG5cdFx0V2luZG93RHJhZ0xlYXZlOiBcIndpbmRvd3M6V2luZG93RHJhZ0xlYXZlXCIsXG5cdFx0V2luZG93RHJhZ092ZXI6IFwid2luZG93czpXaW5kb3dEcmFnT3ZlclwiLFxuXHR9LFxuXHRNYWM6IHtcblx0XHRBcHBsaWNhdGlvbkRpZEJlY29tZUFjdGl2ZTogXCJtYWM6QXBwbGljYXRpb25EaWRCZWNvbWVBY3RpdmVcIixcblx0XHRBcHBsaWNhdGlvbkRpZENoYW5nZUJhY2tpbmdQcm9wZXJ0aWVzOiBcIm1hYzpBcHBsaWNhdGlvbkRpZENoYW5nZUJhY2tpbmdQcm9wZXJ0aWVzXCIsXG5cdFx0QXBwbGljYXRpb25EaWRDaGFuZ2VFZmZlY3RpdmVBcHBlYXJhbmNlOiBcIm1hYzpBcHBsaWNhdGlvbkRpZENoYW5nZUVmZmVjdGl2ZUFwcGVhcmFuY2VcIixcblx0XHRBcHBsaWNhdGlvbkRpZENoYW5nZUljb246IFwibWFjOkFwcGxpY2F0aW9uRGlkQ2hhbmdlSWNvblwiLFxuXHRcdEFwcGxpY2F0aW9uRGlkQ2hhbmdlT2NjbHVzaW9uU3RhdGU6IFwibWFjOkFwcGxpY2F0aW9uRGlkQ2hhbmdlT2NjbHVzaW9uU3RhdGVcIixcblx0XHRBcHBsaWNhdGlvbkRpZENoYW5nZVNjcmVlblBhcmFtZXRlcnM6IFwibWFjOkFwcGxpY2F0aW9uRGlkQ2hhbmdlU2NyZWVuUGFyYW1ldGVyc1wiLFxuXHRcdEFwcGxpY2F0aW9uRGlkQ2hhbmdlU3RhdHVzQmFyRnJhbWU6IFwibWFjOkFwcGxpY2F0aW9uRGlkQ2hhbmdlU3RhdHVzQmFyRnJhbWVcIixcblx0XHRBcHBsaWNhdGlvbkRpZENoYW5nZVN0YXR1c0Jhck9yaWVudGF0aW9uOiBcIm1hYzpBcHBsaWNhdGlvbkRpZENoYW5nZVN0YXR1c0Jhck9yaWVudGF0aW9uXCIsXG5cdFx0QXBwbGljYXRpb25EaWRGaW5pc2hMYXVuY2hpbmc6IFwibWFjOkFwcGxpY2F0aW9uRGlkRmluaXNoTGF1bmNoaW5nXCIsXG5cdFx0QXBwbGljYXRpb25EaWRIaWRlOiBcIm1hYzpBcHBsaWNhdGlvbkRpZEhpZGVcIixcblx0XHRBcHBsaWNhdGlvbkRpZFJlc2lnbkFjdGl2ZU5vdGlmaWNhdGlvbjogXCJtYWM6QXBwbGljYXRpb25EaWRSZXNpZ25BY3RpdmVOb3RpZmljYXRpb25cIixcblx0XHRBcHBsaWNhdGlvbkRpZFVuaGlkZTogXCJtYWM6QXBwbGljYXRpb25EaWRVbmhpZGVcIixcblx0XHRBcHBsaWNhdGlvbkRpZFVwZGF0ZTogXCJtYWM6QXBwbGljYXRpb25EaWRVcGRhdGVcIixcblx0XHRBcHBsaWNhdGlvbldpbGxCZWNvbWVBY3RpdmU6IFwibWFjOkFwcGxpY2F0aW9uV2lsbEJlY29tZUFjdGl2ZVwiLFxuXHRcdEFwcGxpY2F0aW9uV2lsbEZpbmlzaExhdW5jaGluZzogXCJtYWM6QXBwbGljYXRpb25XaWxsRmluaXNoTGF1bmNoaW5nXCIsXG5cdFx0QXBwbGljYXRpb25XaWxsSGlkZTogXCJtYWM6QXBwbGljYXRpb25XaWxsSGlkZVwiLFxuXHRcdEFwcGxpY2F0aW9uV2lsbFJlc2lnbkFjdGl2ZTogXCJtYWM6QXBwbGljYXRpb25XaWxsUmVzaWduQWN0aXZlXCIsXG5cdFx0QXBwbGljYXRpb25XaWxsVGVybWluYXRlOiBcIm1hYzpBcHBsaWNhdGlvbldpbGxUZXJtaW5hdGVcIixcblx0XHRBcHBsaWNhdGlvbldpbGxVbmhpZGU6IFwibWFjOkFwcGxpY2F0aW9uV2lsbFVuaGlkZVwiLFxuXHRcdEFwcGxpY2F0aW9uV2lsbFVwZGF0ZTogXCJtYWM6QXBwbGljYXRpb25XaWxsVXBkYXRlXCIsXG5cdFx0QXBwbGljYXRpb25EaWRDaGFuZ2VUaGVtZTogXCJtYWM6QXBwbGljYXRpb25EaWRDaGFuZ2VUaGVtZSFcIixcblx0XHRBcHBsaWNhdGlvblNob3VsZEhhbmRsZVJlb3BlbjogXCJtYWM6QXBwbGljYXRpb25TaG91bGRIYW5kbGVSZW9wZW4hXCIsXG5cdFx0V2luZG93RGlkQmVjb21lS2V5OiBcIm1hYzpXaW5kb3dEaWRCZWNvbWVLZXlcIixcblx0XHRXaW5kb3dEaWRCZWNvbWVNYWluOiBcIm1hYzpXaW5kb3dEaWRCZWNvbWVNYWluXCIsXG5cdFx0V2luZG93RGlkQmVnaW5TaGVldDogXCJtYWM6V2luZG93RGlkQmVnaW5TaGVldFwiLFxuXHRcdFdpbmRvd0RpZENoYW5nZUFscGhhOiBcIm1hYzpXaW5kb3dEaWRDaGFuZ2VBbHBoYVwiLFxuXHRcdFdpbmRvd0RpZENoYW5nZUJhY2tpbmdMb2NhdGlvbjogXCJtYWM6V2luZG93RGlkQ2hhbmdlQmFja2luZ0xvY2F0aW9uXCIsXG5cdFx0V2luZG93RGlkQ2hhbmdlQmFja2luZ1Byb3BlcnRpZXM6IFwibWFjOldpbmRvd0RpZENoYW5nZUJhY2tpbmdQcm9wZXJ0aWVzXCIsXG5cdFx0V2luZG93RGlkQ2hhbmdlQ29sbGVjdGlvbkJlaGF2aW9yOiBcIm1hYzpXaW5kb3dEaWRDaGFuZ2VDb2xsZWN0aW9uQmVoYXZpb3JcIixcblx0XHRXaW5kb3dEaWRDaGFuZ2VFZmZlY3RpdmVBcHBlYXJhbmNlOiBcIm1hYzpXaW5kb3dEaWRDaGFuZ2VFZmZlY3RpdmVBcHBlYXJhbmNlXCIsXG5cdFx0V2luZG93RGlkQ2hhbmdlT2NjbHVzaW9uU3RhdGU6IFwibWFjOldpbmRvd0RpZENoYW5nZU9jY2x1c2lvblN0YXRlXCIsXG5cdFx0V2luZG93RGlkQ2hhbmdlT3JkZXJpbmdNb2RlOiBcIm1hYzpXaW5kb3dEaWRDaGFuZ2VPcmRlcmluZ01vZGVcIixcblx0XHRXaW5kb3dEaWRDaGFuZ2VTY3JlZW46IFwibWFjOldpbmRvd0RpZENoYW5nZVNjcmVlblwiLFxuXHRcdFdpbmRvd0RpZENoYW5nZVNjcmVlblBhcmFtZXRlcnM6IFwibWFjOldpbmRvd0RpZENoYW5nZVNjcmVlblBhcmFtZXRlcnNcIixcblx0XHRXaW5kb3dEaWRDaGFuZ2VTY3JlZW5Qcm9maWxlOiBcIm1hYzpXaW5kb3dEaWRDaGFuZ2VTY3JlZW5Qcm9maWxlXCIsXG5cdFx0V2luZG93RGlkQ2hhbmdlU2NyZWVuU3BhY2U6IFwibWFjOldpbmRvd0RpZENoYW5nZVNjcmVlblNwYWNlXCIsXG5cdFx0V2luZG93RGlkQ2hhbmdlU2NyZWVuU3BhY2VQcm9wZXJ0aWVzOiBcIm1hYzpXaW5kb3dEaWRDaGFuZ2VTY3JlZW5TcGFjZVByb3BlcnRpZXNcIixcblx0XHRXaW5kb3dEaWRDaGFuZ2VTaGFyaW5nVHlwZTogXCJtYWM6V2luZG93RGlkQ2hhbmdlU2hhcmluZ1R5cGVcIixcblx0XHRXaW5kb3dEaWRDaGFuZ2VTcGFjZTogXCJtYWM6V2luZG93RGlkQ2hhbmdlU3BhY2VcIixcblx0XHRXaW5kb3dEaWRDaGFuZ2VTcGFjZU9yZGVyaW5nTW9kZTogXCJtYWM6V2luZG93RGlkQ2hhbmdlU3BhY2VPcmRlcmluZ01vZGVcIixcblx0XHRXaW5kb3dEaWRDaGFuZ2VUaXRsZTogXCJtYWM6V2luZG93RGlkQ2hhbmdlVGl0bGVcIixcblx0XHRXaW5kb3dEaWRDaGFuZ2VUb29sYmFyOiBcIm1hYzpXaW5kb3dEaWRDaGFuZ2VUb29sYmFyXCIsXG5cdFx0V2luZG93RGlkQ2hhbmdlVmlzaWJpbGl0eTogXCJtYWM6V2luZG93RGlkQ2hhbmdlVmlzaWJpbGl0eVwiLFxuXHRcdFdpbmRvd0RpZERlbWluaWF0dXJpemU6IFwibWFjOldpbmRvd0RpZERlbWluaWF0dXJpemVcIixcblx0XHRXaW5kb3dEaWRFbmRTaGVldDogXCJtYWM6V2luZG93RGlkRW5kU2hlZXRcIixcblx0XHRXaW5kb3dEaWRFbnRlckZ1bGxTY3JlZW46IFwibWFjOldpbmRvd0RpZEVudGVyRnVsbFNjcmVlblwiLFxuXHRcdFdpbmRvd0RpZEVudGVyVmVyc2lvbkJyb3dzZXI6IFwibWFjOldpbmRvd0RpZEVudGVyVmVyc2lvbkJyb3dzZXJcIixcblx0XHRXaW5kb3dEaWRFeGl0RnVsbFNjcmVlbjogXCJtYWM6V2luZG93RGlkRXhpdEZ1bGxTY3JlZW5cIixcblx0XHRXaW5kb3dEaWRFeGl0VmVyc2lvbkJyb3dzZXI6IFwibWFjOldpbmRvd0RpZEV4aXRWZXJzaW9uQnJvd3NlclwiLFxuXHRcdFdpbmRvd0RpZEV4cG9zZTogXCJtYWM6V2luZG93RGlkRXhwb3NlXCIsXG5cdFx0V2luZG93RGlkRm9jdXM6IFwibWFjOldpbmRvd0RpZEZvY3VzXCIsXG5cdFx0V2luZG93RGlkTWluaWF0dXJpemU6IFwibWFjOldpbmRvd0RpZE1pbmlhdHVyaXplXCIsXG5cdFx0V2luZG93RGlkTW92ZTogXCJtYWM6V2luZG93RGlkTW92ZVwiLFxuXHRcdFdpbmRvd0RpZE9yZGVyT2ZmU2NyZWVuOiBcIm1hYzpXaW5kb3dEaWRPcmRlck9mZlNjcmVlblwiLFxuXHRcdFdpbmRvd0RpZE9yZGVyT25TY3JlZW46IFwibWFjOldpbmRvd0RpZE9yZGVyT25TY3JlZW5cIixcblx0XHRXaW5kb3dEaWRSZXNpZ25LZXk6IFwibWFjOldpbmRvd0RpZFJlc2lnbktleVwiLFxuXHRcdFdpbmRvd0RpZFJlc2lnbk1haW46IFwibWFjOldpbmRvd0RpZFJlc2lnbk1haW5cIixcblx0XHRXaW5kb3dEaWRSZXNpemU6IFwibWFjOldpbmRvd0RpZFJlc2l6ZVwiLFxuXHRcdFdpbmRvd0RpZFVwZGF0ZTogXCJtYWM6V2luZG93RGlkVXBkYXRlXCIsXG5cdFx0V2luZG93RGlkVXBkYXRlQWxwaGE6IFwibWFjOldpbmRvd0RpZFVwZGF0ZUFscGhhXCIsXG5cdFx0V2luZG93RGlkVXBkYXRlQ29sbGVjdGlvbkJlaGF2aW9yOiBcIm1hYzpXaW5kb3dEaWRVcGRhdGVDb2xsZWN0aW9uQmVoYXZpb3JcIixcblx0XHRXaW5kb3dEaWRVcGRhdGVDb2xsZWN0aW9uUHJvcGVydGllczogXCJtYWM6V2luZG93RGlkVXBkYXRlQ29sbGVjdGlvblByb3BlcnRpZXNcIixcblx0XHRXaW5kb3dEaWRVcGRhdGVTaGFkb3c6IFwibWFjOldpbmRvd0RpZFVwZGF0ZVNoYWRvd1wiLFxuXHRcdFdpbmRvd0RpZFVwZGF0ZVRpdGxlOiBcIm1hYzpXaW5kb3dEaWRVcGRhdGVUaXRsZVwiLFxuXHRcdFdpbmRvd0RpZFVwZGF0ZVRvb2xiYXI6IFwibWFjOldpbmRvd0RpZFVwZGF0ZVRvb2xiYXJcIixcblx0XHRXaW5kb3dEaWRVcGRhdGVWaXNpYmlsaXR5OiBcIm1hYzpXaW5kb3dEaWRVcGRhdGVWaXNpYmlsaXR5XCIsXG5cdFx0V2luZG93U2hvdWxkQ2xvc2U6IFwibWFjOldpbmRvd1Nob3VsZENsb3NlIVwiLFxuXHRcdFdpbmRvd1dpbGxCZWNvbWVLZXk6IFwibWFjOldpbmRvd1dpbGxCZWNvbWVLZXlcIixcblx0XHRXaW5kb3dXaWxsQmVjb21lTWFpbjogXCJtYWM6V2luZG93V2lsbEJlY29tZU1haW5cIixcblx0XHRXaW5kb3dXaWxsQmVnaW5TaGVldDogXCJtYWM6V2luZG93V2lsbEJlZ2luU2hlZXRcIixcblx0XHRXaW5kb3dXaWxsQ2hhbmdlT3JkZXJpbmdNb2RlOiBcIm1hYzpXaW5kb3dXaWxsQ2hhbmdlT3JkZXJpbmdNb2RlXCIsXG5cdFx0V2luZG93V2lsbENsb3NlOiBcIm1hYzpXaW5kb3dXaWxsQ2xvc2VcIixcblx0XHRXaW5kb3dXaWxsRGVtaW5pYXR1cml6ZTogXCJtYWM6V2luZG93V2lsbERlbWluaWF0dXJpemVcIixcblx0XHRXaW5kb3dXaWxsRW50ZXJGdWxsU2NyZWVuOiBcIm1hYzpXaW5kb3dXaWxsRW50ZXJGdWxsU2NyZWVuXCIsXG5cdFx0V2luZG93V2lsbEVudGVyVmVyc2lvbkJyb3dzZXI6IFwibWFjOldpbmRvd1dpbGxFbnRlclZlcnNpb25Ccm93c2VyXCIsXG5cdFx0V2luZG93V2lsbEV4aXRGdWxsU2NyZWVuOiBcIm1hYzpXaW5kb3dXaWxsRXhpdEZ1bGxTY3JlZW5cIixcblx0XHRXaW5kb3dXaWxsRXhpdFZlcnNpb25Ccm93c2VyOiBcIm1hYzpXaW5kb3dXaWxsRXhpdFZlcnNpb25Ccm93c2VyXCIsXG5cdFx0V2luZG93V2lsbEZvY3VzOiBcIm1hYzpXaW5kb3dXaWxsRm9jdXNcIixcblx0XHRXaW5kb3dXaWxsTWluaWF0dXJpemU6IFwibWFjOldpbmRvd1dpbGxNaW5pYXR1cml6ZVwiLFxuXHRcdFdpbmRvd1dpbGxNb3ZlOiBcIm1hYzpXaW5kb3dXaWxsTW92ZVwiLFxuXHRcdFdpbmRvd1dpbGxPcmRlck9mZlNjcmVlbjogXCJtYWM6V2luZG93V2lsbE9yZGVyT2ZmU2NyZWVuXCIsXG5cdFx0V2luZG93V2lsbE9yZGVyT25TY3JlZW46IFwibWFjOldpbmRvd1dpbGxPcmRlck9uU2NyZWVuXCIsXG5cdFx0V2luZG93V2lsbFJlc2lnbk1haW46IFwibWFjOldpbmRvd1dpbGxSZXNpZ25NYWluXCIsXG5cdFx0V2luZG93V2lsbFJlc2l6ZTogXCJtYWM6V2luZG93V2lsbFJlc2l6ZVwiLFxuXHRcdFdpbmRvd1dpbGxVbmZvY3VzOiBcIm1hYzpXaW5kb3dXaWxsVW5mb2N1c1wiLFxuXHRcdFdpbmRvd1dpbGxVcGRhdGU6IFwibWFjOldpbmRvd1dpbGxVcGRhdGVcIixcblx0XHRXaW5kb3dXaWxsVXBkYXRlQWxwaGE6IFwibWFjOldpbmRvd1dpbGxVcGRhdGVBbHBoYVwiLFxuXHRcdFdpbmRvd1dpbGxVcGRhdGVDb2xsZWN0aW9uQmVoYXZpb3I6IFwibWFjOldpbmRvd1dpbGxVcGRhdGVDb2xsZWN0aW9uQmVoYXZpb3JcIixcblx0XHRXaW5kb3dXaWxsVXBkYXRlQ29sbGVjdGlvblByb3BlcnRpZXM6IFwibWFjOldpbmRvd1dpbGxVcGRhdGVDb2xsZWN0aW9uUHJvcGVydGllc1wiLFxuXHRcdFdpbmRvd1dpbGxVcGRhdGVTaGFkb3c6IFwibWFjOldpbmRvd1dpbGxVcGRhdGVTaGFkb3dcIixcblx0XHRXaW5kb3dXaWxsVXBkYXRlVGl0bGU6IFwibWFjOldpbmRvd1dpbGxVcGRhdGVUaXRsZVwiLFxuXHRcdFdpbmRvd1dpbGxVcGRhdGVUb29sYmFyOiBcIm1hYzpXaW5kb3dXaWxsVXBkYXRlVG9vbGJhclwiLFxuXHRcdFdpbmRvd1dpbGxVcGRhdGVWaXNpYmlsaXR5OiBcIm1hYzpXaW5kb3dXaWxsVXBkYXRlVmlzaWJpbGl0eVwiLFxuXHRcdFdpbmRvd1dpbGxVc2VTdGFuZGFyZEZyYW1lOiBcIm1hYzpXaW5kb3dXaWxsVXNlU3RhbmRhcmRGcmFtZVwiLFxuXHRcdE1lbnVXaWxsT3BlbjogXCJtYWM6TWVudVdpbGxPcGVuXCIsXG5cdFx0TWVudURpZE9wZW46IFwibWFjOk1lbnVEaWRPcGVuXCIsXG5cdFx0TWVudURpZENsb3NlOiBcIm1hYzpNZW51RGlkQ2xvc2VcIixcblx0XHRNZW51V2lsbFNlbmRBY3Rpb246IFwibWFjOk1lbnVXaWxsU2VuZEFjdGlvblwiLFxuXHRcdE1lbnVEaWRTZW5kQWN0aW9uOiBcIm1hYzpNZW51RGlkU2VuZEFjdGlvblwiLFxuXHRcdE1lbnVXaWxsSGlnaGxpZ2h0SXRlbTogXCJtYWM6TWVudVdpbGxIaWdobGlnaHRJdGVtXCIsXG5cdFx0TWVudURpZEhpZ2hsaWdodEl0ZW06IFwibWFjOk1lbnVEaWRIaWdobGlnaHRJdGVtXCIsXG5cdFx0TWVudVdpbGxEaXNwbGF5SXRlbTogXCJtYWM6TWVudVdpbGxEaXNwbGF5SXRlbVwiLFxuXHRcdE1lbnVEaWREaXNwbGF5SXRlbTogXCJtYWM6TWVudURpZERpc3BsYXlJdGVtXCIsXG5cdFx0TWVudVdpbGxBZGRJdGVtOiBcIm1hYzpNZW51V2lsbEFkZEl0ZW1cIixcblx0XHRNZW51RGlkQWRkSXRlbTogXCJtYWM6TWVudURpZEFkZEl0ZW1cIixcblx0XHRNZW51V2lsbFJlbW92ZUl0ZW06IFwibWFjOk1lbnVXaWxsUmVtb3ZlSXRlbVwiLFxuXHRcdE1lbnVEaWRSZW1vdmVJdGVtOiBcIm1hYzpNZW51RGlkUmVtb3ZlSXRlbVwiLFxuXHRcdE1lbnVXaWxsQmVnaW5UcmFja2luZzogXCJtYWM6TWVudVdpbGxCZWdpblRyYWNraW5nXCIsXG5cdFx0TWVudURpZEJlZ2luVHJhY2tpbmc6IFwibWFjOk1lbnVEaWRCZWdpblRyYWNraW5nXCIsXG5cdFx0TWVudVdpbGxFbmRUcmFja2luZzogXCJtYWM6TWVudVdpbGxFbmRUcmFja2luZ1wiLFxuXHRcdE1lbnVEaWRFbmRUcmFja2luZzogXCJtYWM6TWVudURpZEVuZFRyYWNraW5nXCIsXG5cdFx0TWVudVdpbGxVcGRhdGU6IFwibWFjOk1lbnVXaWxsVXBkYXRlXCIsXG5cdFx0TWVudURpZFVwZGF0ZTogXCJtYWM6TWVudURpZFVwZGF0ZVwiLFxuXHRcdE1lbnVXaWxsUG9wVXA6IFwibWFjOk1lbnVXaWxsUG9wVXBcIixcblx0XHRNZW51RGlkUG9wVXA6IFwibWFjOk1lbnVEaWRQb3BVcFwiLFxuXHRcdE1lbnVXaWxsU2VuZEFjdGlvblRvSXRlbTogXCJtYWM6TWVudVdpbGxTZW5kQWN0aW9uVG9JdGVtXCIsXG5cdFx0TWVudURpZFNlbmRBY3Rpb25Ub0l0ZW06IFwibWFjOk1lbnVEaWRTZW5kQWN0aW9uVG9JdGVtXCIsXG5cdFx0V2ViVmlld0RpZFN0YXJ0UHJvdmlzaW9uYWxOYXZpZ2F0aW9uOiBcIm1hYzpXZWJWaWV3RGlkU3RhcnRQcm92aXNpb25hbE5hdmlnYXRpb25cIixcblx0XHRXZWJWaWV3RGlkUmVjZWl2ZVNlcnZlclJlZGlyZWN0Rm9yUHJvdmlzaW9uYWxOYXZpZ2F0aW9uOiBcIm1hYzpXZWJWaWV3RGlkUmVjZWl2ZVNlcnZlclJlZGlyZWN0Rm9yUHJvdmlzaW9uYWxOYXZpZ2F0aW9uXCIsXG5cdFx0V2ViVmlld0RpZEZpbmlzaE5hdmlnYXRpb246IFwibWFjOldlYlZpZXdEaWRGaW5pc2hOYXZpZ2F0aW9uXCIsXG5cdFx0V2ViVmlld0RpZENvbW1pdE5hdmlnYXRpb246IFwibWFjOldlYlZpZXdEaWRDb21taXROYXZpZ2F0aW9uXCIsXG5cdFx0V2luZG93RmlsZURyYWdnaW5nRW50ZXJlZDogXCJtYWM6V2luZG93RmlsZURyYWdnaW5nRW50ZXJlZFwiLFxuXHRcdFdpbmRvd0ZpbGVEcmFnZ2luZ1BlcmZvcm1lZDogXCJtYWM6V2luZG93RmlsZURyYWdnaW5nUGVyZm9ybWVkXCIsXG5cdFx0V2luZG93RmlsZURyYWdnaW5nRXhpdGVkOiBcIm1hYzpXaW5kb3dGaWxlRHJhZ2dpbmdFeGl0ZWRcIixcblx0fSxcblx0TGludXg6IHtcblx0XHRTeXN0ZW1UaGVtZUNoYW5nZWQ6IFwibGludXg6U3lzdGVtVGhlbWVDaGFuZ2VkXCIsXG5cdH0sXG5cdENvbW1vbjoge1xuXHRcdEFwcGxpY2F0aW9uU3RhcnRlZDogXCJjb21tb246QXBwbGljYXRpb25TdGFydGVkXCIsXG5cdFx0V2luZG93TWF4aW1pc2U6IFwiY29tbW9uOldpbmRvd01heGltaXNlXCIsXG5cdFx0V2luZG93VW5NYXhpbWlzZTogXCJjb21tb246V2luZG93VW5NYXhpbWlzZVwiLFxuXHRcdFdpbmRvd0Z1bGxzY3JlZW46IFwiY29tbW9uOldpbmRvd0Z1bGxzY3JlZW5cIixcblx0XHRXaW5kb3dVbkZ1bGxzY3JlZW46IFwiY29tbW9uOldpbmRvd1VuRnVsbHNjcmVlblwiLFxuXHRcdFdpbmRvd1Jlc3RvcmU6IFwiY29tbW9uOldpbmRvd1Jlc3RvcmVcIixcblx0XHRXaW5kb3dNaW5pbWlzZTogXCJjb21tb246V2luZG93TWluaW1pc2VcIixcblx0XHRXaW5kb3dVbk1pbmltaXNlOiBcImNvbW1vbjpXaW5kb3dVbk1pbmltaXNlXCIsXG5cdFx0V2luZG93Q2xvc2luZzogXCJjb21tb246V2luZG93Q2xvc2luZ1wiLFxuXHRcdFdpbmRvd1pvb206IFwiY29tbW9uOldpbmRvd1pvb21cIixcblx0XHRXaW5kb3dab29tSW46IFwiY29tbW9uOldpbmRvd1pvb21JblwiLFxuXHRcdFdpbmRvd1pvb21PdXQ6IFwiY29tbW9uOldpbmRvd1pvb21PdXRcIixcblx0XHRXaW5kb3dab29tUmVzZXQ6IFwiY29tbW9uOldpbmRvd1pvb21SZXNldFwiLFxuXHRcdFdpbmRvd0ZvY3VzOiBcImNvbW1vbjpXaW5kb3dGb2N1c1wiLFxuXHRcdFdpbmRvd0xvc3RGb2N1czogXCJjb21tb246V2luZG93TG9zdEZvY3VzXCIsXG5cdFx0V2luZG93U2hvdzogXCJjb21tb246V2luZG93U2hvd1wiLFxuXHRcdFdpbmRvd0hpZGU6IFwiY29tbW9uOldpbmRvd0hpZGVcIixcblx0XHRXaW5kb3dEUElDaGFuZ2VkOiBcImNvbW1vbjpXaW5kb3dEUElDaGFuZ2VkXCIsXG5cdFx0V2luZG93RmlsZXNEcm9wcGVkOiBcImNvbW1vbjpXaW5kb3dGaWxlc0Ryb3BwZWRcIixcblx0XHRXaW5kb3dSdW50aW1lUmVhZHk6IFwiY29tbW9uOldpbmRvd1J1bnRpbWVSZWFkeVwiLFxuXHRcdFRoZW1lQ2hhbmdlZDogXCJjb21tb246VGhlbWVDaGFuZ2VkXCIsXG5cdH0sXG59O1xuIiwgIi8qXG4gX1x0ICAgX19cdCAgXyBfX1xufCB8XHQgLyAvX19fIF8oXykgL19fX19cbnwgfCAvfCAvIC8gX18gYC8gLyAvIF9fXy9cbnwgfC8gfC8gLyAvXy8gLyAvIChfXyAgKVxufF9fL3xfXy9cXF9fLF8vXy9fL19fX18vXG5UaGUgZWxlY3Ryb24gYWx0ZXJuYXRpdmUgZm9yIEdvXG4oYykgTGVhIEFudGhvbnkgMjAxOS1wcmVzZW50XG4qL1xuXG4vKiBqc2hpbnQgZXN2ZXJzaW9uOiA5ICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gT3BlbkZpbGVEaWFsb2dPcHRpb25zXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtDYW5DaG9vc2VEaXJlY3Rvcmllc10gLSBJbmRpY2F0ZXMgaWYgZGlyZWN0b3JpZXMgY2FuIGJlIGNob3Nlbi5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW0NhbkNob29zZUZpbGVzXSAtIEluZGljYXRlcyBpZiBmaWxlcyBjYW4gYmUgY2hvc2VuLlxuICogQHByb3BlcnR5IHtib29sZWFufSBbQ2FuQ3JlYXRlRGlyZWN0b3JpZXNdIC0gSW5kaWNhdGVzIGlmIGRpcmVjdG9yaWVzIGNhbiBiZSBjcmVhdGVkLlxuICogQHByb3BlcnR5IHtib29sZWFufSBbU2hvd0hpZGRlbkZpbGVzXSAtIEluZGljYXRlcyBpZiBoaWRkZW4gZmlsZXMgc2hvdWxkIGJlIHNob3duLlxuICogQHByb3BlcnR5IHtib29sZWFufSBbUmVzb2x2ZXNBbGlhc2VzXSAtIEluZGljYXRlcyBpZiBhbGlhc2VzIHNob3VsZCBiZSByZXNvbHZlZC5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW0FsbG93c011bHRpcGxlU2VsZWN0aW9uXSAtIEluZGljYXRlcyBpZiBtdWx0aXBsZSBzZWxlY3Rpb24gaXMgYWxsb3dlZC5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW0hpZGVFeHRlbnNpb25dIC0gSW5kaWNhdGVzIGlmIHRoZSBleHRlbnNpb24gc2hvdWxkIGJlIGhpZGRlbi5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW0NhblNlbGVjdEhpZGRlbkV4dGVuc2lvbl0gLSBJbmRpY2F0ZXMgaWYgaGlkZGVuIGV4dGVuc2lvbnMgY2FuIGJlIHNlbGVjdGVkLlxuICogQHByb3BlcnR5IHtib29sZWFufSBbVHJlYXRzRmlsZVBhY2thZ2VzQXNEaXJlY3Rvcmllc10gLSBJbmRpY2F0ZXMgaWYgZmlsZSBwYWNrYWdlcyBzaG91bGQgYmUgdHJlYXRlZCBhcyBkaXJlY3Rvcmllcy5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW0FsbG93c090aGVyRmlsZXR5cGVzXSAtIEluZGljYXRlcyBpZiBvdGhlciBmaWxlIHR5cGVzIGFyZSBhbGxvd2VkLlxuICogQHByb3BlcnR5IHtGaWxlRmlsdGVyW119IFtGaWx0ZXJzXSAtIEFycmF5IG9mIGZpbGUgZmlsdGVycy5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbVGl0bGVdIC0gVGl0bGUgb2YgdGhlIGRpYWxvZy5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbTWVzc2FnZV0gLSBNZXNzYWdlIHRvIHNob3cgaW4gdGhlIGRpYWxvZy5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbQnV0dG9uVGV4dF0gLSBUZXh0IHRvIGRpc3BsYXkgb24gdGhlIGJ1dHRvbi5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbRGlyZWN0b3J5XSAtIERpcmVjdG9yeSB0byBvcGVuIGluIHRoZSBkaWFsb2cuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtEZXRhY2hlZF0gLSBJbmRpY2F0ZXMgaWYgdGhlIGRpYWxvZyBzaG91bGQgYXBwZWFyIGRldGFjaGVkIGZyb20gdGhlIG1haW4gd2luZG93LlxuICovXG5cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBTYXZlRmlsZURpYWxvZ09wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbRmlsZW5hbWVdIC0gRGVmYXVsdCBmaWxlbmFtZSB0byB1c2UgaW4gdGhlIGRpYWxvZy5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW0NhbkNob29zZURpcmVjdG9yaWVzXSAtIEluZGljYXRlcyBpZiBkaXJlY3RvcmllcyBjYW4gYmUgY2hvc2VuLlxuICogQHByb3BlcnR5IHtib29sZWFufSBbQ2FuQ2hvb3NlRmlsZXNdIC0gSW5kaWNhdGVzIGlmIGZpbGVzIGNhbiBiZSBjaG9zZW4uXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtDYW5DcmVhdGVEaXJlY3Rvcmllc10gLSBJbmRpY2F0ZXMgaWYgZGlyZWN0b3JpZXMgY2FuIGJlIGNyZWF0ZWQuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtTaG93SGlkZGVuRmlsZXNdIC0gSW5kaWNhdGVzIGlmIGhpZGRlbiBmaWxlcyBzaG91bGQgYmUgc2hvd24uXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtSZXNvbHZlc0FsaWFzZXNdIC0gSW5kaWNhdGVzIGlmIGFsaWFzZXMgc2hvdWxkIGJlIHJlc29sdmVkLlxuICogQHByb3BlcnR5IHtib29sZWFufSBbQWxsb3dzTXVsdGlwbGVTZWxlY3Rpb25dIC0gSW5kaWNhdGVzIGlmIG11bHRpcGxlIHNlbGVjdGlvbiBpcyBhbGxvd2VkLlxuICogQHByb3BlcnR5IHtib29sZWFufSBbSGlkZUV4dGVuc2lvbl0gLSBJbmRpY2F0ZXMgaWYgdGhlIGV4dGVuc2lvbiBzaG91bGQgYmUgaGlkZGVuLlxuICogQHByb3BlcnR5IHtib29sZWFufSBbQ2FuU2VsZWN0SGlkZGVuRXh0ZW5zaW9uXSAtIEluZGljYXRlcyBpZiBoaWRkZW4gZXh0ZW5zaW9ucyBjYW4gYmUgc2VsZWN0ZWQuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtUcmVhdHNGaWxlUGFja2FnZXNBc0RpcmVjdG9yaWVzXSAtIEluZGljYXRlcyBpZiBmaWxlIHBhY2thZ2VzIHNob3VsZCBiZSB0cmVhdGVkIGFzIGRpcmVjdG9yaWVzLlxuICogQHByb3BlcnR5IHtib29sZWFufSBbQWxsb3dzT3RoZXJGaWxldHlwZXNdIC0gSW5kaWNhdGVzIGlmIG90aGVyIGZpbGUgdHlwZXMgYXJlIGFsbG93ZWQuXG4gKiBAcHJvcGVydHkge0ZpbGVGaWx0ZXJbXX0gW0ZpbHRlcnNdIC0gQXJyYXkgb2YgZmlsZSBmaWx0ZXJzLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtUaXRsZV0gLSBUaXRsZSBvZiB0aGUgZGlhbG9nLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtNZXNzYWdlXSAtIE1lc3NhZ2UgdG8gc2hvdyBpbiB0aGUgZGlhbG9nLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtCdXR0b25UZXh0XSAtIFRleHQgdG8gZGlzcGxheSBvbiB0aGUgYnV0dG9uLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtEaXJlY3RvcnldIC0gRGlyZWN0b3J5IHRvIG9wZW4gaW4gdGhlIGRpYWxvZy5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW0RldGFjaGVkXSAtIEluZGljYXRlcyBpZiB0aGUgZGlhbG9nIHNob3VsZCBhcHBlYXIgZGV0YWNoZWQgZnJvbSB0aGUgbWFpbiB3aW5kb3cuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBNZXNzYWdlRGlhbG9nT3B0aW9uc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IFtUaXRsZV0gLSBUaGUgdGl0bGUgb2YgdGhlIGRpYWxvZyB3aW5kb3cuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW01lc3NhZ2VdIC0gVGhlIG1haW4gbWVzc2FnZSB0byBzaG93IGluIHRoZSBkaWFsb2cuXG4gKiBAcHJvcGVydHkge0J1dHRvbltdfSBbQnV0dG9uc10gLSBBcnJheSBvZiBidXR0b24gb3B0aW9ucyB0byBzaG93IGluIHRoZSBkaWFsb2cuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtEZXRhY2hlZF0gLSBUcnVlIGlmIHRoZSBkaWFsb2cgc2hvdWxkIGFwcGVhciBkZXRhY2hlZCBmcm9tIHRoZSBtYWluIHdpbmRvdyAoaWYgYXBwbGljYWJsZSkuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBCdXR0b25cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbTGFiZWxdIC0gVGV4dCB0aGF0IGFwcGVhcnMgd2l0aGluIHRoZSBidXR0b24uXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtJc0NhbmNlbF0gLSBUcnVlIGlmIHRoZSBidXR0b24gc2hvdWxkIGNhbmNlbCBhbiBvcGVyYXRpb24gd2hlbiBjbGlja2VkLlxuICogQHByb3BlcnR5IHtib29sZWFufSBbSXNEZWZhdWx0XSAtIFRydWUgaWYgdGhlIGJ1dHRvbiBzaG91bGQgYmUgdGhlIGRlZmF1bHQgYWN0aW9uIHdoZW4gdGhlIHVzZXIgcHJlc3NlcyBlbnRlci5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEZpbGVGaWx0ZXJcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbRGlzcGxheU5hbWVdIC0gRGlzcGxheSBuYW1lIGZvciB0aGUgZmlsdGVyLCBpdCBjb3VsZCBiZSBcIlRleHQgRmlsZXNcIiwgXCJJbWFnZXNcIiBldGMuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW1BhdHRlcm5dIC0gUGF0dGVybiB0byBtYXRjaCBmb3IgdGhlIGZpbHRlciwgZS5nLiBcIioudHh0OyoubWRcIiBmb3IgdGV4dCBtYXJrZG93biBmaWxlcy5cbiAqL1xuXG4vLyBzZXR1cFxud2luZG93Ll93YWlscyA9IHdpbmRvdy5fd2FpbHMgfHwge307XG53aW5kb3cuX3dhaWxzLmRpYWxvZ0Vycm9yQ2FsbGJhY2sgPSBkaWFsb2dFcnJvckNhbGxiYWNrO1xud2luZG93Ll93YWlscy5kaWFsb2dSZXN1bHRDYWxsYmFjayA9IGRpYWxvZ1Jlc3VsdENhbGxiYWNrO1xuXG5pbXBvcnQge25ld1J1bnRpbWVDYWxsZXJXaXRoSUQsIG9iamVjdE5hbWVzfSBmcm9tIFwiLi9ydW50aW1lXCI7XG5cbmltcG9ydCB7IG5hbm9pZCB9IGZyb20gJ25hbm9pZC9ub24tc2VjdXJlJztcblxuLy8gRGVmaW5lIGNvbnN0YW50cyBmcm9tIHRoZSBgbWV0aG9kc2Agb2JqZWN0IGluIFRpdGxlIENhc2VcbmNvbnN0IERpYWxvZ0luZm8gPSAwO1xuY29uc3QgRGlhbG9nV2FybmluZyA9IDE7XG5jb25zdCBEaWFsb2dFcnJvciA9IDI7XG5jb25zdCBEaWFsb2dRdWVzdGlvbiA9IDM7XG5jb25zdCBEaWFsb2dPcGVuRmlsZSA9IDQ7XG5jb25zdCBEaWFsb2dTYXZlRmlsZSA9IDU7XG5cbmNvbnN0IGNhbGwgPSBuZXdSdW50aW1lQ2FsbGVyV2l0aElEKG9iamVjdE5hbWVzLkRpYWxvZywgJycpO1xuY29uc3QgZGlhbG9nUmVzcG9uc2VzID0gbmV3IE1hcCgpO1xuXG4vKipcbiAqIEdlbmVyYXRlcyBhIHVuaXF1ZSBpZCB0aGF0IGlzIG5vdCBwcmVzZW50IGluIGRpYWxvZ1Jlc3BvbnNlcy5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IHVuaXF1ZSBpZFxuICovXG5mdW5jdGlvbiBnZW5lcmF0ZUlEKCkge1xuICAgIGxldCByZXN1bHQ7XG4gICAgZG8ge1xuICAgICAgICByZXN1bHQgPSBuYW5vaWQoKTtcbiAgICB9IHdoaWxlIChkaWFsb2dSZXNwb25zZXMuaGFzKHJlc3VsdCkpO1xuICAgIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogU2hvd3MgYSBkaWFsb2cgb2Ygc3BlY2lmaWVkIHR5cGUgd2l0aCB0aGUgZ2l2ZW4gb3B0aW9ucy5cbiAqIEBwYXJhbSB7bnVtYmVyfSB0eXBlIC0gdHlwZSBvZiBkaWFsb2dcbiAqIEBwYXJhbSB7TWVzc2FnZURpYWxvZ09wdGlvbnN8T3BlbkZpbGVEaWFsb2dPcHRpb25zfFNhdmVGaWxlRGlhbG9nT3B0aW9uc30gb3B0aW9ucyAtIG9wdGlvbnMgZm9yIHRoZSBkaWFsb2dcbiAqIEByZXR1cm5zIHtQcm9taXNlfSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCByZXN1bHQgb2YgZGlhbG9nXG4gKi9cbmZ1bmN0aW9uIGRpYWxvZyh0eXBlLCBvcHRpb25zID0ge30pIHtcbiAgICBjb25zdCBpZCA9IGdlbmVyYXRlSUQoKTtcbiAgICBvcHRpb25zW1wiZGlhbG9nLWlkXCJdID0gaWQ7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgZGlhbG9nUmVzcG9uc2VzLnNldChpZCwge3Jlc29sdmUsIHJlamVjdH0pO1xuICAgICAgICBjYWxsKHR5cGUsIG9wdGlvbnMpLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgICAgIGRpYWxvZ1Jlc3BvbnNlcy5kZWxldGUoaWQpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbn1cblxuLyoqXG4gKiBIYW5kbGVzIHRoZSBjYWxsYmFjayBmcm9tIGEgZGlhbG9nLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBpZCAtIFRoZSBJRCBvZiB0aGUgZGlhbG9nIHJlc3BvbnNlLlxuICogQHBhcmFtIHtzdHJpbmd9IGRhdGEgLSBUaGUgZGF0YSByZWNlaXZlZCBmcm9tIHRoZSBkaWFsb2cuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGlzSlNPTiAtIEZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBkYXRhIGlzIGluIEpTT04gZm9ybWF0LlxuICpcbiAqIEByZXR1cm4ge3VuZGVmaW5lZH1cbiAqL1xuZnVuY3Rpb24gZGlhbG9nUmVzdWx0Q2FsbGJhY2soaWQsIGRhdGEsIGlzSlNPTikge1xuICAgIGxldCBwID0gZGlhbG9nUmVzcG9uc2VzLmdldChpZCk7XG4gICAgaWYgKHApIHtcbiAgICAgICAgaWYgKGlzSlNPTikge1xuICAgICAgICAgICAgcC5yZXNvbHZlKEpTT04ucGFyc2UoZGF0YSkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcC5yZXNvbHZlKGRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGRpYWxvZ1Jlc3BvbnNlcy5kZWxldGUoaWQpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBDYWxsYmFjayBmdW5jdGlvbiBmb3IgaGFuZGxpbmcgZXJyb3JzIGluIGRpYWxvZy5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gaWQgLSBUaGUgaWQgb2YgdGhlIGRpYWxvZyByZXNwb25zZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlIC0gVGhlIGVycm9yIG1lc3NhZ2UuXG4gKlxuICogQHJldHVybiB7dm9pZH1cbiAqL1xuZnVuY3Rpb24gZGlhbG9nRXJyb3JDYWxsYmFjayhpZCwgbWVzc2FnZSkge1xuICAgIGxldCBwID0gZGlhbG9nUmVzcG9uc2VzLmdldChpZCk7XG4gICAgaWYgKHApIHtcbiAgICAgICAgcC5yZWplY3QobWVzc2FnZSk7XG4gICAgICAgIGRpYWxvZ1Jlc3BvbnNlcy5kZWxldGUoaWQpO1xuICAgIH1cbn1cblxuXG4vLyBSZXBsYWNlIGBtZXRob2RzYCB3aXRoIGNvbnN0YW50cyBpbiBUaXRsZSBDYXNlXG5cbi8qKlxuICogQHBhcmFtIHtNZXNzYWdlRGlhbG9nT3B0aW9uc30gb3B0aW9ucyAtIERpYWxvZyBvcHRpb25zXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmc+fSAtIFRoZSBsYWJlbCBvZiB0aGUgYnV0dG9uIHByZXNzZWRcbiAqL1xuZXhwb3J0IGNvbnN0IEluZm8gPSAob3B0aW9ucykgPT4gZGlhbG9nKERpYWxvZ0luZm8sIG9wdGlvbnMpO1xuXG4vKipcbiAqIEBwYXJhbSB7TWVzc2FnZURpYWxvZ09wdGlvbnN9IG9wdGlvbnMgLSBEaWFsb2cgb3B0aW9uc1xuICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nPn0gLSBUaGUgbGFiZWwgb2YgdGhlIGJ1dHRvbiBwcmVzc2VkXG4gKi9cbmV4cG9ydCBjb25zdCBXYXJuaW5nID0gKG9wdGlvbnMpID0+IGRpYWxvZyhEaWFsb2dXYXJuaW5nLCBvcHRpb25zKTtcblxuLyoqXG4gKiBAcGFyYW0ge01lc3NhZ2VEaWFsb2dPcHRpb25zfSBvcHRpb25zIC0gRGlhbG9nIG9wdGlvbnNcbiAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZz59IC0gVGhlIGxhYmVsIG9mIHRoZSBidXR0b24gcHJlc3NlZFxuICovXG5leHBvcnQgY29uc3QgRXJyb3IgPSAob3B0aW9ucykgPT4gZGlhbG9nKERpYWxvZ0Vycm9yLCBvcHRpb25zKTtcblxuLyoqXG4gKiBAcGFyYW0ge01lc3NhZ2VEaWFsb2dPcHRpb25zfSBvcHRpb25zIC0gRGlhbG9nIG9wdGlvbnNcbiAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZz59IC0gVGhlIGxhYmVsIG9mIHRoZSBidXR0b24gcHJlc3NlZFxuICovXG5leHBvcnQgY29uc3QgUXVlc3Rpb24gPSAob3B0aW9ucykgPT4gZGlhbG9nKERpYWxvZ1F1ZXN0aW9uLCBvcHRpb25zKTtcblxuLyoqXG4gKiBAcGFyYW0ge09wZW5GaWxlRGlhbG9nT3B0aW9uc30gb3B0aW9ucyAtIERpYWxvZyBvcHRpb25zXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmdbXXxzdHJpbmc+fSBSZXR1cm5zIHNlbGVjdGVkIGZpbGUgb3IgbGlzdCBvZiBmaWxlcy4gUmV0dXJucyBibGFuayBzdHJpbmcgaWYgbm8gZmlsZSBpcyBzZWxlY3RlZC5cbiAqL1xuZXhwb3J0IGNvbnN0IE9wZW5GaWxlID0gKG9wdGlvbnMpID0+IGRpYWxvZyhEaWFsb2dPcGVuRmlsZSwgb3B0aW9ucyk7XG5cbi8qKlxuICogQHBhcmFtIHtTYXZlRmlsZURpYWxvZ09wdGlvbnN9IG9wdGlvbnMgLSBEaWFsb2cgb3B0aW9uc1xuICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nPn0gUmV0dXJucyB0aGUgc2VsZWN0ZWQgZmlsZS4gUmV0dXJucyBibGFuayBzdHJpbmcgaWYgbm8gZmlsZSBpcyBzZWxlY3RlZC5cbiAqL1xuZXhwb3J0IGNvbnN0IFNhdmVGaWxlID0gKG9wdGlvbnMpID0+IGRpYWxvZyhEaWFsb2dTYXZlRmlsZSwgb3B0aW9ucyk7XG4iLCAiLypcbiBfXHQgICBfX1x0ICBfIF9fXG58IHxcdCAvIC9fX18gXyhfKSAvX19fX1xufCB8IC98IC8gLyBfXyBgLyAvIC8gX19fL1xufCB8LyB8LyAvIC9fLyAvIC8gKF9fICApXG58X18vfF9fL1xcX18sXy9fL18vX19fXy9cblRoZSBlbGVjdHJvbiBhbHRlcm5hdGl2ZSBmb3IgR29cbihjKSBMZWEgQW50aG9ueSAyMDE5LXByZXNlbnRcbiovXG5cbi8qIGpzaGludCBlc3ZlcnNpb246IDkgKi9cbmltcG9ydCB7IG5ld1J1bnRpbWVDYWxsZXJXaXRoSUQsIG9iamVjdE5hbWVzIH0gZnJvbSBcIi4vcnVudGltZVwiO1xuaW1wb3J0IHsgbmFub2lkIH0gZnJvbSAnbmFub2lkL25vbi1zZWN1cmUnO1xuXG4vLyBTZXR1cFxud2luZG93Ll93YWlscyA9IHdpbmRvdy5fd2FpbHMgfHwge307XG53aW5kb3cuX3dhaWxzLmNhbGxSZXN1bHRIYW5kbGVyID0gcmVzdWx0SGFuZGxlcjtcbndpbmRvdy5fd2FpbHMuY2FsbEVycm9ySGFuZGxlciA9IGVycm9ySGFuZGxlcjtcblxuXG5jb25zdCBDYWxsQmluZGluZyA9IDA7XG5jb25zdCBjYWxsID0gbmV3UnVudGltZUNhbGxlcldpdGhJRChvYmplY3ROYW1lcy5DYWxsLCAnJyk7XG5jb25zdCBjYW5jZWxDYWxsID0gbmV3UnVudGltZUNhbGxlcldpdGhJRChvYmplY3ROYW1lcy5DYW5jZWxDYWxsLCAnJyk7XG5sZXQgY2FsbFJlc3BvbnNlcyA9IG5ldyBNYXAoKTtcblxuLyoqXG4gKiBHZW5lcmF0ZXMgYSB1bmlxdWUgSUQgdXNpbmcgdGhlIG5hbm9pZCBsaWJyYXJ5LlxuICpcbiAqIEByZXR1cm4ge3N0cmluZ30gLSBBIHVuaXF1ZSBJRCB0aGF0IGRvZXMgbm90IGV4aXN0IGluIHRoZSBjYWxsUmVzcG9uc2VzIHNldC5cbiAqL1xuZnVuY3Rpb24gZ2VuZXJhdGVJRCgpIHtcbiAgICBsZXQgcmVzdWx0O1xuICAgIGRvIHtcbiAgICAgICAgcmVzdWx0ID0gbmFub2lkKCk7XG4gICAgfSB3aGlsZSAoY2FsbFJlc3BvbnNlcy5oYXMocmVzdWx0KSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBIYW5kbGVzIHRoZSByZXN1bHQgb2YgYSBjYWxsIHJlcXVlc3QuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGlkIC0gVGhlIGlkIG9mIHRoZSByZXF1ZXN0IHRvIGhhbmRsZSB0aGUgcmVzdWx0IGZvci5cbiAqIEBwYXJhbSB7c3RyaW5nfSBkYXRhIC0gVGhlIHJlc3VsdCBkYXRhIG9mIHRoZSByZXF1ZXN0LlxuICogQHBhcmFtIHtib29sZWFufSBpc0pTT04gLSBJbmRpY2F0ZXMgd2hldGhlciB0aGUgZGF0YSBpcyBKU09OIG9yIG5vdC5cbiAqXG4gKiBAcmV0dXJuIHt1bmRlZmluZWR9IC0gVGhpcyBtZXRob2QgZG9lcyBub3QgcmV0dXJuIGFueSB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gcmVzdWx0SGFuZGxlcihpZCwgZGF0YSwgaXNKU09OKSB7XG4gICAgY29uc3QgcHJvbWlzZUhhbmRsZXIgPSBnZXRBbmREZWxldGVSZXNwb25zZShpZCk7XG4gICAgaWYgKHByb21pc2VIYW5kbGVyKSB7XG4gICAgICAgIHByb21pc2VIYW5kbGVyLnJlc29sdmUoaXNKU09OID8gSlNPTi5wYXJzZShkYXRhKSA6IGRhdGEpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBIYW5kbGVzIHRoZSBlcnJvciBmcm9tIGEgY2FsbCByZXF1ZXN0LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBpZCAtIFRoZSBpZCBvZiB0aGUgcHJvbWlzZSBoYW5kbGVyLlxuICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2UgLSBUaGUgZXJyb3IgbWVzc2FnZSB0byByZWplY3QgdGhlIHByb21pc2UgaGFuZGxlciB3aXRoLlxuICpcbiAqIEByZXR1cm4ge3ZvaWR9XG4gKi9cbmZ1bmN0aW9uIGVycm9ySGFuZGxlcihpZCwgbWVzc2FnZSkge1xuICAgIGNvbnN0IHByb21pc2VIYW5kbGVyID0gZ2V0QW5kRGVsZXRlUmVzcG9uc2UoaWQpO1xuICAgIGlmIChwcm9taXNlSGFuZGxlcikge1xuICAgICAgICBwcm9taXNlSGFuZGxlci5yZWplY3QobWVzc2FnZSk7XG4gICAgfVxufVxuXG4vKipcbiAqIFJldHJpZXZlcyBhbmQgcmVtb3ZlcyB0aGUgcmVzcG9uc2UgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBJRCBmcm9tIHRoZSBjYWxsUmVzcG9uc2VzIG1hcC5cbiAqXG4gKiBAcGFyYW0ge2FueX0gaWQgLSBUaGUgSUQgb2YgdGhlIHJlc3BvbnNlIHRvIGJlIHJldHJpZXZlZCBhbmQgcmVtb3ZlZC5cbiAqXG4gKiBAcmV0dXJucyB7YW55fSBUaGUgcmVzcG9uc2Ugb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gSUQuXG4gKi9cbmZ1bmN0aW9uIGdldEFuZERlbGV0ZVJlc3BvbnNlKGlkKSB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBjYWxsUmVzcG9uc2VzLmdldChpZCk7XG4gICAgY2FsbFJlc3BvbnNlcy5kZWxldGUoaWQpO1xuICAgIHJldHVybiByZXNwb25zZTtcbn1cblxuLyoqXG4gKiBFeGVjdXRlcyBhIGNhbGwgdXNpbmcgdGhlIHByb3ZpZGVkIHR5cGUgYW5kIG9wdGlvbnMuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSB0eXBlIC0gVGhlIHR5cGUgb2YgY2FsbCB0byBleGVjdXRlLlxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zPXt9XSAtIEFkZGl0aW9uYWwgb3B0aW9ucyBmb3IgdGhlIGNhbGwuXG4gKiBAcmV0dXJuIHtQcm9taXNlfSAtIEEgcHJvbWlzZSB0aGF0IHdpbGwgYmUgcmVzb2x2ZWQgb3IgcmVqZWN0ZWQgYmFzZWQgb24gdGhlIHJlc3VsdCBvZiB0aGUgY2FsbC4gSXQgYWxzbyBoYXMgYSBjYW5jZWwgbWV0aG9kIHRvIGNhbmNlbCBhIGxvbmcgcnVubmluZyByZXF1ZXN0LlxuICovXG5mdW5jdGlvbiBjYWxsQmluZGluZyh0eXBlLCBvcHRpb25zID0ge30pIHtcbiAgICBjb25zdCBpZCA9IGdlbmVyYXRlSUQoKTtcbiAgICBjb25zdCBkb0NhbmNlbCA9ICgpID0+IHsgY2FuY2VsQ2FsbCh0eXBlLCB7XCJjYWxsLWlkXCI6IGlkfSkgfTtcbiAgICB2YXIgcXVldWVkQ2FuY2VsID0gZmFsc2UsIGNhbGxSdW5uaW5nID0gZmFsc2U7XG4gICAgdmFyIHAgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIG9wdGlvbnNbXCJjYWxsLWlkXCJdID0gaWQ7XG4gICAgICAgIGNhbGxSZXNwb25zZXMuc2V0KGlkLCB7IHJlc29sdmUsIHJlamVjdCB9KTtcbiAgICAgICAgY2FsbCh0eXBlLCBvcHRpb25zKS5cbiAgICAgICAgICAgIHRoZW4oKF8pID0+IHtcbiAgICAgICAgICAgICAgICBjYWxsUnVubmluZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgaWYgKHF1ZXVlZENhbmNlbCkge1xuICAgICAgICAgICAgICAgICAgICBkb0NhbmNlbCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pLlxuICAgICAgICAgICAgY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgICAgICAgICBjYWxsUmVzcG9uc2VzLmRlbGV0ZShpZCk7XG4gICAgICAgICAgICB9KTtcbiAgICB9KTtcbiAgICBwLmNhbmNlbCA9ICgpID0+IHtcbiAgICAgICAgaWYgKGNhbGxSdW5uaW5nKSB7XG4gICAgICAgICAgICBkb0NhbmNlbCgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcXVldWVkQ2FuY2VsID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgXG4gICAgcmV0dXJuIHA7XG59XG5cbi8qKlxuICogQ2FsbCBtZXRob2QuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgLSBUaGUgb3B0aW9ucyBmb3IgdGhlIG1ldGhvZC5cbiAqIEByZXR1cm5zIHtPYmplY3R9IC0gVGhlIHJlc3VsdCBvZiB0aGUgY2FsbC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIENhbGwob3B0aW9ucykge1xuICAgIHJldHVybiBjYWxsQmluZGluZyhDYWxsQmluZGluZywgb3B0aW9ucyk7XG59XG5cbi8qKlxuICogRXhlY3V0ZXMgYSBtZXRob2QgYnkgbmFtZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBtZXRob2QgaW4gdGhlIGZvcm1hdCAncGFja2FnZS5zdHJ1Y3QubWV0aG9kJy5cbiAqIEBwYXJhbSB7Li4uKn0gYXJncyAtIFRoZSBhcmd1bWVudHMgdG8gcGFzcyB0byB0aGUgbWV0aG9kLlxuICogQHRocm93cyB7RXJyb3J9IElmIHRoZSBuYW1lIGlzIG5vdCBhIHN0cmluZyBvciBpcyBub3QgaW4gdGhlIGNvcnJlY3QgZm9ybWF0LlxuICogQHJldHVybnMgeyp9IFRoZSByZXN1bHQgb2YgdGhlIG1ldGhvZCBleGVjdXRpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBCeU5hbWUobmFtZSwgLi4uYXJncykge1xuICAgIGlmICh0eXBlb2YgbmFtZSAhPT0gXCJzdHJpbmdcIiB8fCBuYW1lLnNwbGl0KFwiLlwiKS5sZW5ndGggIT09IDMpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2FsbEJ5TmFtZSByZXF1aXJlcyBhIHN0cmluZyBpbiB0aGUgZm9ybWF0ICdwYWNrYWdlLnN0cnVjdC5tZXRob2QnXCIpO1xuICAgIH1cbiAgICBsZXQgW3BhY2thZ2VOYW1lLCBzdHJ1Y3ROYW1lLCBtZXRob2ROYW1lXSA9IG5hbWUuc3BsaXQoXCIuXCIpO1xuICAgIHJldHVybiBjYWxsQmluZGluZyhDYWxsQmluZGluZywge1xuICAgICAgICBwYWNrYWdlTmFtZSxcbiAgICAgICAgc3RydWN0TmFtZSxcbiAgICAgICAgbWV0aG9kTmFtZSxcbiAgICAgICAgYXJnc1xuICAgIH0pO1xufVxuXG4vKipcbiAqIENhbGxzIGEgbWV0aG9kIGJ5IGl0cyBJRCB3aXRoIHRoZSBzcGVjaWZpZWQgYXJndW1lbnRzLlxuICpcbiAqIEBwYXJhbSB7bnVtYmVyfSBtZXRob2RJRCAtIFRoZSBJRCBvZiB0aGUgbWV0aG9kIHRvIGNhbGwuXG4gKiBAcGFyYW0gey4uLip9IGFyZ3MgLSBUaGUgYXJndW1lbnRzIHRvIHBhc3MgdG8gdGhlIG1ldGhvZC5cbiAqIEByZXR1cm4geyp9IC0gVGhlIHJlc3VsdCBvZiB0aGUgbWV0aG9kIGNhbGwuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBCeUlEKG1ldGhvZElELCAuLi5hcmdzKSB7XG4gICAgcmV0dXJuIGNhbGxCaW5kaW5nKENhbGxCaW5kaW5nLCB7XG4gICAgICAgIG1ldGhvZElELFxuICAgICAgICBhcmdzXG4gICAgfSk7XG59XG5cbi8qKlxuICogQ2FsbHMgYSBtZXRob2Qgb24gYSBwbHVnaW4uXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHBsdWdpbk5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgcGx1Z2luLlxuICogQHBhcmFtIHtzdHJpbmd9IG1ldGhvZE5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgbWV0aG9kIHRvIGNhbGwuXG4gKiBAcGFyYW0gey4uLip9IGFyZ3MgLSBUaGUgYXJndW1lbnRzIHRvIHBhc3MgdG8gdGhlIG1ldGhvZC5cbiAqIEByZXR1cm5zIHsqfSAtIFRoZSByZXN1bHQgb2YgdGhlIG1ldGhvZCBjYWxsLlxuICovXG5leHBvcnQgZnVuY3Rpb24gUGx1Z2luKHBsdWdpbk5hbWUsIG1ldGhvZE5hbWUsIC4uLmFyZ3MpIHtcbiAgICByZXR1cm4gY2FsbEJpbmRpbmcoQ2FsbEJpbmRpbmcsIHtcbiAgICAgICAgcGFja2FnZU5hbWU6IFwid2FpbHMtcGx1Z2luc1wiLFxuICAgICAgICBzdHJ1Y3ROYW1lOiBwbHVnaW5OYW1lLFxuICAgICAgICBtZXRob2ROYW1lLFxuICAgICAgICBhcmdzXG4gICAgfSk7XG59XG4iLCAiLypcbiBfXHQgICBfX1x0ICBfIF9fXG58IHxcdCAvIC9fX18gXyhfKSAvX19fX1xufCB8IC98IC8gLyBfXyBgLyAvIC8gX19fL1xufCB8LyB8LyAvIC9fLyAvIC8gKF9fICApXG58X18vfF9fL1xcX18sXy9fL18vX19fXy9cblRoZSBlbGVjdHJvbiBhbHRlcm5hdGl2ZSBmb3IgR29cbihjKSBMZWEgQW50aG9ueSAyMDE5LXByZXNlbnRcbiovXG5cbmltcG9ydCB7ZGVidWdMb2d9IGZyb20gXCIuLi9Ad2FpbHNpby9ydW50aW1lL3NyYy9sb2dcIjtcblxud2luZG93Ll93YWlscyA9IHdpbmRvdy5fd2FpbHMgfHwge307XG5cbmltcG9ydCAqIGFzIEFwcGxpY2F0aW9uIGZyb20gXCIuLi9Ad2FpbHNpby9ydW50aW1lL3NyYy9hcHBsaWNhdGlvblwiO1xuaW1wb3J0ICogYXMgQnJvd3NlciBmcm9tIFwiLi4vQHdhaWxzaW8vcnVudGltZS9zcmMvYnJvd3NlclwiO1xuaW1wb3J0ICogYXMgQ2xpcGJvYXJkIGZyb20gXCIuLi9Ad2FpbHNpby9ydW50aW1lL3NyYy9jbGlwYm9hcmRcIjtcbmltcG9ydCAqIGFzIENvbnRleHRNZW51IGZyb20gXCIuLi9Ad2FpbHNpby9ydW50aW1lL3NyYy9jb250ZXh0bWVudVwiO1xuaW1wb3J0ICogYXMgRHJhZyBmcm9tIFwiLi4vQHdhaWxzaW8vcnVudGltZS9zcmMvZHJhZ1wiO1xuaW1wb3J0ICogYXMgRmxhZ3MgZnJvbSBcIi4uL0B3YWlsc2lvL3J1bnRpbWUvc3JjL2ZsYWdzXCI7XG5pbXBvcnQgKiBhcyBTY3JlZW5zIGZyb20gXCIuLi9Ad2FpbHNpby9ydW50aW1lL3NyYy9zY3JlZW5zXCI7XG5pbXBvcnQgKiBhcyBTeXN0ZW0gZnJvbSBcIi4uL0B3YWlsc2lvL3J1bnRpbWUvc3JjL3N5c3RlbVwiO1xuaW1wb3J0ICogYXMgV2luZG93IGZyb20gXCIuLi9Ad2FpbHNpby9ydW50aW1lL3NyYy93aW5kb3dcIjtcbmltcG9ydCAqIGFzIFdNTCBmcm9tICcuLi9Ad2FpbHNpby9ydW50aW1lL3NyYy93bWwnO1xuaW1wb3J0ICogYXMgRXZlbnRzIGZyb20gXCIuLi9Ad2FpbHNpby9ydW50aW1lL3NyYy9ldmVudHNcIjtcbmltcG9ydCAqIGFzIERpYWxvZ3MgZnJvbSBcIi4uL0B3YWlsc2lvL3J1bnRpbWUvc3JjL2RpYWxvZ3NcIjtcbmltcG9ydCAqIGFzIENhbGwgZnJvbSBcIi4uL0B3YWlsc2lvL3J1bnRpbWUvc3JjL2NhbGxzXCI7XG5pbXBvcnQge2ludm9rZX0gZnJvbSBcIi4uL0B3YWlsc2lvL3J1bnRpbWUvc3JjL3N5c3RlbVwiO1xuXG4vKioqXG4gVGhpcyB0ZWNobmlxdWUgZm9yIHByb3BlciBsb2FkIGRldGVjdGlvbiBpcyB0YWtlbiBmcm9tIEhUTVg6XG5cbiBCU0QgMi1DbGF1c2UgTGljZW5zZVxuXG4gQ29weXJpZ2h0IChjKSAyMDIwLCBCaWcgU2t5IFNvZnR3YXJlXG4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cblxuIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuXG4gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4gbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG5cbiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4gdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvblxuIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLlxuXG4gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4gSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFXG4gRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRVxuIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMXG4gREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1JcbiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUlxuIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksXG4gT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0VcbiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuXG4gKioqL1xuXG53aW5kb3cuX3dhaWxzLmludm9rZT1pbnZva2U7XG5cbndpbmRvdy53YWlscyA9IHdpbmRvdy53YWlscyB8fCB7fTtcbndpbmRvdy53YWlscy5BcHBsaWNhdGlvbiA9IEFwcGxpY2F0aW9uO1xud2luZG93LndhaWxzLkJyb3dzZXIgPSBCcm93c2VyO1xud2luZG93LndhaWxzLkNhbGwgPSBDYWxsO1xud2luZG93LndhaWxzLkNsaXBib2FyZCA9IENsaXBib2FyZDtcbndpbmRvdy53YWlscy5EaWFsb2dzID0gRGlhbG9ncztcbndpbmRvdy53YWlscy5FdmVudHMgPSBFdmVudHM7XG53aW5kb3cud2FpbHMuRmxhZ3MgPSBGbGFncztcbndpbmRvdy53YWlscy5TY3JlZW5zID0gU2NyZWVucztcbndpbmRvdy53YWlscy5TeXN0ZW0gPSBTeXN0ZW07XG53aW5kb3cud2FpbHMuV2luZG93ID0gV2luZG93O1xud2luZG93LndhaWxzLldNTCA9IFdNTDtcblxuXG5sZXQgaXNSZWFkeSA9IGZhbHNlXG5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJywgZnVuY3Rpb24oKSB7XG4gICAgaXNSZWFkeSA9IHRydWVcbiAgICB3aW5kb3cuX3dhaWxzLmludm9rZSgnd2FpbHM6cnVudGltZTpyZWFkeScpO1xuICAgIGlmKERFQlVHKSB7XG4gICAgICAgIGRlYnVnTG9nKFwiV2FpbHMgUnVudGltZSBMb2FkZWRcIik7XG4gICAgfVxufSlcblxuZnVuY3Rpb24gd2hlblJlYWR5KGZuKSB7XG4gICAgaWYgKGlzUmVhZHkgfHwgZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gJ2NvbXBsZXRlJykge1xuICAgICAgICBmbigpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCBmbik7XG4gICAgfVxufVxuXG53aGVuUmVhZHkoKCkgPT4ge1xuICAgIFdNTC5SZWxvYWQoKTtcbn0pO1xuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7QUFLTyxXQUFTLFNBQVMsU0FBUztBQUU5QixZQUFRO0FBQUEsTUFDSixrQkFBa0IsVUFBVTtBQUFBLE1BQzVCO0FBQUEsTUFDQTtB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cEMsMENBQTBDO0FBQUEsTUFDMUMsK0JBQStCO0FBQUEsTUFDL0Isb0JBQW9CO0FBQUEsTUFDcEIsd0NBQXdDO0FBQUEsTUFDeEMsc0JBQXNCO0FBQUEsTUFDdEIsc0JBQXNCO0FBQUEsTUFDdEIsNkJBQTZCO0FBQUEsTUFDN0IsZ0NBQWdDO0FBQUEsTUFDaEMscUJBQXFCO0FBQUEsTUFDckIsNkJBQTZCO0FBQUEsTUFDN0IsMEJBQTBCO0FBQUEsTUFDMUIsdUJBQXVCO0FBQUEsTUFDdkIsdUJBQXVCO0FBQUEsTUFDdkIsMkJBQTJCO0FBQUEsTUFDM0IsK0JBQStCO0FBQUEsTUFDL0Isb0JBQW9CO0FBQUEsTUFDcEIscUJBQXFCO0FBQUEsTUFDckIscUJBQXFCO0FBQUEsTUFDckIsc0JBQXNCO0FBQUEsTUFDdEIsZ0NBQWdDO0FBQUEsTUFDaEMsa0NBQWtDO0FBQUEsTUFDbEMsbUNBQW1DO0FBQUEsTUFDbkMsb0NBQW9DO0FBQUEsTUFDcEMsK0JBQStCO0FBQUEsTUFDL0IsNkJBQTZCO0FBQUEsTUFDN0IsdUJBQXVCO0FBQUEsTUFDdkIsaUNBQWlDO0FBQUEsTUFDakMsOEJBQThCO0FBQUEsTUFDOUIsNEJBQTRCO0FBQUEsTUFDNUIsc0NBQXNDO0FBQUEsTUFDdEMsNEJBQTRCO0FBQUEsTUFDNUIsc0JBQXNCO0FBQUEsTUFDdEIsa0NBQWtDO0FBQUEsTUFDbEMsc0JBQXNCO0FBQUEsTUFDdEIsd0JBQXdCO0FBQUEsTUFDeEIsMkJBQTJCO0FBQUEsTUFDM0Isd0JBQXdCO0FBQUEsTUFDeEIsbUJBQW1CO0FBQUEsTUFDbkIsMEJBQTBCO0FBQUEsTUFDMUIsOEJBQThCO0FBQUEsTUFDOUIseUJBQXlCO0FBQUEsTUFDekIsNkJBQTZCO0FBQUEsTUFDN0IsaUJBQWlCO0FBQUEsTUFDakIsZ0JBQWdCO0FBQUEsTUFDaEIsc0JBQXNCO0FBQUEsTUFDdEIsZUFBZTtBQUFBLE1BQ2YseUJBQXlCO0FBQUEsTUFDekIsd0JBQXdCO0FBQUEsTUFDeEIsb0JBQW9CO0FBQUEsTUFDcEIscUJBQXFCO0FBQUEsTUFDckIsaUJBQWlCO0FBQUEsTUFDakIsaUJBQWlCO0FBQUEsTUFDakIsc0JBQXNCO0FBQUEsTUFDdEIsbUNBQW1DO0FBQUEsTUFDbkMscUNBQXFDO0FBQUEsTUFDckMsdUJBQXVCO0FBQUEsTUFDdkIsc0JBQXNCO0FBQUEsTUFDdEIsd0JBQXdCO0FBQUEsTUFDeEIsMkJBQTJCO0FBQUEsTUFDM0IsbUJBQW1CO0FBQUEsTUFDbkIscUJBQXFCO0FBQUEsTUFDckIsc0JBQXNCO0FBQUEsTUFDdEIsc0JBQXNCO0FBQUEsTUFDdEIsOEJBQThCO0FBQUEsTUFDOUIsaUJBQWlCO0FBQUEsTUFDakIseUJBQXlCO0FBQUEsTUFDekIsMkJBQTJCO0FBQUEsTUFDM0IsK0JBQStCO0FBQUEsTUFDL0IsMEJBQTBCO0FBQUEsTUFDMUIsOEJBQThCO0FBQUEsTUFDOUIsaUJBQWlCO0FBQUEsTUFDakIsdUJBQXVCO0FBQUEsTUFDdkIsZ0JBQWdCO0FBQUEsTUFDaEIsMEJBQTBCO0FBQUEsTUFDMUIseUJBQXlCO0FBQUEsTUFDekIsc0JBQXNCO0FBQUEsTUFDdEIsa0JBQWtCO0FBQUEsTUFDbEIsbUJBQW1CO0FBQUEsTUFDbkIsa0JBQWtCO0FBQUEsTUFDbEIsdUJBQXVCO0FBQUEsTUFDdkIsb0NBQW9DO0FBQUEsTUFDcEMsc0NBQXNDO0FBQUEsTUFDdEMsd0JBQXdCO0FBQUEsTUFDeEIsdUJBQXVCO0FBQUEsTUFDdkIseUJBQXlCO0FBQUEsTUFDekIsNEJBQTRCO0FBQUEsTUFDNUIsNEJBQTRCO0FBQUEsTUFDNUIsY0FBYztBQUFBLE1BQ2QsYUFBYTtBQUFBLE1BQ2IsY0FBYztBQUFBLE1BQ2Qsb0JBQW9CO0FBQUEsTUFDcEIsbUJBQW1CO0FBQUEsTUFDbkIsdUJBQXVCO0FBQUEsTUFDdkIsc0JBQXNCO0FBQUEsTUFDdEIscUJBQXFCO0FBQUEsTUFDckIsb0JBQW9CO0FBQUEsTUFDcEIsaUJBQWlCO0FBQUEsTUFDakIsZ0JBQWdCO0FBQUEsTUFDaEIsb0JBQW9CO0FBQUEsTUFDcEIsbUJBQW1CO0FBQUEsTUFDbkIsdUJBQXVCO0FB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LHFCQUFxQjtBQUMxQyxRQUFHLE1BQU87QUFDTixlQUFTLHNCQUFzQjtBQUFBLElBQ25DO0FBQUEsRUFDSixDQUFDO0FBRUQsV0FBUyxVQUFVLElBQUk7QUFDbkIsUUFBSSxXQUFXLFNBQVMsZUFBZSxZQUFZO0FBQy9DLFNBQUc7QUFBQSxJQUNQLE9BQU87QUFDSCxlQUFTLGlCQUFpQixvQkFBb0IsRUFBRTtBQUFBLElBQ3BEO0FBQUEsRUFDSjtBQUVBLFlBQVUsTUFBTTtBQUNaLElBQUksT0FBTztBQUFBLEVBQ2YsQ0FBQzsiLAogICJuYW1lcyI6IFsic2l6ZSIsICJjYWxsIiwgImNhbGwiLCAiY2FsbCIsICJjYWxsIiwgImNhbGwiLCAiSGlkZSIsICJTaG93IiwgInNldFJlc2l6YWJsZSIsICJjYWxsIiwgIndpZHRoIiwgImhlaWdodCIsICJyZXNpemFibGUiLCAiSGlkZSIsICJTaG93IiwgImNhbGwiLCAiZXZlbnROYW1lIiwgIkVycm9yIiwgImNhbGwiLCAiRXJyb3IiLCAiY2FsbCIsICJnZW5lcmF0ZUlEIl0KfQo=
+//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vcnVudGltZS9kZXNrdG9wL0B3YWlsc2lvL3J1bnRpbWUvc3JjL2xvZy5qcyIsICIuLi8uLi8uLi9ydW50aW1lL2Rlc2t0b3AvQHdhaWxzaW8vcnVudGltZS9zcmMvYXBwbGljYXRpb24uanMiLCAiLi4vLi4vLi4vcnVudGltZS9ub2RlX21vZHVsZXMvbmFub2lkL25vbi1zZWN1cmUvaW5kZXguanMiLCAiLi4vLi4vLi4vcnVudGltZS9kZXNrdG9wL0B3YWlsc2lvL3J1bnRpbWUvc3JjL3J1bnRpbWUuanMiLCAiLi4vLi4vLi4vcnVudGltZS9kZXNrdG9wL0B3YWlsc2lvL3J1bnRpbWUvc3JjL2Jyb3dzZXIuanMiLCAiLi4vLi4vLi4vcnVudGltZS9kZXNrdG9wL0B3YWlsc2lvL3J1bnRpbWUvc3JjL2NsaXBib2FyZC5qcyIsICIuLi8uLi8uLi9ydW50aW1lL2Rlc2t0b3AvQHdhaWxzaW8vcnVudGltZS9zcmMvc3lzdGVtLmpzIiwgIi4uLy4uLy4uL3J1bnRpbWUvZGVza3RvcC9Ad2FpbHNpby9ydW50aW1lL3NyYy9jb250ZXh0bWVudS5qcyIsICIuLi8uLi8uLi9ydW50aW1lL2Rlc2t0b3AvQHdhaWxzaW8vcnVudGltZS9zcmMvZmxhZ3MuanMiLCAiLi4vLi4vLi4vcnVudGltZS9kZXNrdG9wL0B3YWlsc2lvL3J1bnRpbWUvc3JjL2RyYWcuanMiLCAiLi4vLi4vLi4vcnVudGltZS9kZXNrdG9wL0B3YWlsc2lvL3J1bnRpbWUvc3JjL3NjcmVlbnMuanMiLCAiLi4vLi4vLi4vcnVudGltZS9kZXNrdG9wL0B3YWlsc2lvL3J1bnRpbWUvc3JjL3dpbmRvdy5qcyIsICIuLi8uLi8uLi9ydW50aW1lL2Rlc2t0b3AvQHdhaWxzaW8vcnVudGltZS9zcmMvd21sLmpzIiwgIi4uLy4uLy4uL3J1bnRpbWUvZGVza3RvcC9Ad2FpbHNpby9ydW50aW1lL3NyYy9ldmVudHMuanMiLCAiLi4vLi4vLi4vcnVudGltZS9kZXNrdG9wL0B3YWlsc2lvL3J1bnRpbWUvc3JjL2V2ZW50X3R5cGVzLmpzIiwgIi4uLy4uLy4uL3J1bnRpbWUvZGVza3RvcC9Ad2FpbHNpby9ydW50aW1lL3NyYy9kaWFsb2dzLmpzIiwgIi4uLy4uLy4uL3J1bnRpbWUvZGVza3RvcC9Ad2FpbHNpby9ydW50aW1lL3NyYy9jYWxscy5qcyIsICIuLi8uLi8uLi9ydW50aW1lL2Rlc2t0b3AvY29tcGlsZWQvbWFpbi5qcyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBMb2dzIGEgbWVzc2FnZSB0byB0aGUgY29uc29sZSB3aXRoIGN1c3RvbSBmb3JtYXR0aW5nLlxuICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2UgLSBUaGUgbWVzc2FnZSB0byBiZSBsb2dnZWQuXG4gKiBAcmV0dXJuIHt2b2lkfVxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVidWdMb2cobWVzc2FnZSkge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZVxuICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAnJWMgd2FpbHMzICVjICcgKyBtZXNzYWdlICsgJyAnLFxuICAgICAgICAnYmFja2dyb3VuZDogI2FhMDAwMDsgY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDNweCAwcHggMHB4IDNweDsgcGFkZGluZzogMXB4OyBmb250LXNpemU6IDAuN3JlbScsXG4gICAgICAgICdiYWNrZ3JvdW5kOiAjMDA5OTAwOyBjb2xvcjogI2ZmZjsgYm9yZGVyLXJhZGl1czogMHB4IDNweCAzcHggMHB4OyBwYWRkaW5nOiAxcHg7IGZvbnQtc2l6ZTogMC43cmVtJ1xuICAgICk7XG59IiwgIi8qXG4gX1x0ICAgX19cdCAgXyBfX1xufCB8XHQgLyAvX19fIF8oXykgL19fX19cbnwgfCAvfCAvIC8gX18gYC8gLyAvIF9fXy9cbnwgfC8gfC8gLyAvXy8gLyAvIChfXyAgKVxufF9fL3xfXy9cXF9fLF8vXy9fL19fX18vXG5UaGUgZWxlY3Ryb24gYWx0ZXJuYXRpdmUgZm9yIEdvXG4oYykgTGVhIEFudGhvbnkgMjAxOS1wcmVzZW50XG4qL1xuXG4vKiBqc2hpbnQgZXN2ZXJzaW9uOiA5ICovXG5cbmltcG9ydCB7IG5ld1J1bnRpbWVDYWxsZXJXaXRoSUQsIG9iamVjdE5hbWVzIH0gZnJvbSBcIi4vcnVudGltZVwiO1xuY29uc3QgY2FsbCA9IG5ld1J1bnRpbWVDYWxsZXJXaXRoSUQob2JqZWN0TmFtZXMuQXBwbGljYXRpb24sICcnKTtcblxuY29uc3QgSGlkZU1ldGhvZCA9IDA7XG5jb25zdCBTaG93TWV0aG9kID0gMTtcbmNvbnN0IFF1aXRNZXRob2QgPSAyO1xuXG4vKipcbiAqIEhpZGVzIGEgY2VydGFpbiBtZXRob2QgYnkgY2FsbGluZyB0aGUgSGlkZU1ldGhvZCBmdW5jdGlvbi5cbiAqXG4gKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fVxuICpcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIEhpZGUoKSB7XG4gICAgcmV0dXJuIGNhbGwoSGlkZU1ldGhvZCk7XG59XG5cbi8qKlxuICogQ2FsbHMgdGhlIFNob3dNZXRob2QgYW5kIHJldHVybnMgdGhlIHJlc3VsdC5cbiAqXG4gKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fVxuICovXG5leHBvcnQgZnVuY3Rpb24gU2hvdygpIHtcbiAgICByZXR1cm4gY2FsbChTaG93TWV0aG9kKTtcbn1cblxuLyoqXG4gKiBDYWxscyB0aGUgUXVpdE1ldGhvZCB0byB0ZXJtaW5hdGUgdGhlIHByb2dyYW0uXG4gKlxuICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFF1aXQoKSB7XG4gICAgcmV0dXJuIGNhbGwoUXVpdE1ldGhvZCk7XG59XG4iLCAibGV0IHVybEFscGhhYmV0ID1cbiAgJ3VzZWFuZG9tLTI2VDE5ODM0MFBYNzVweEpBQ0tWRVJZTUlOREJVU0hXT0xGX0dRWmJmZ2hqa2xxdnd5enJpY3QnXG5leHBvcnQgbGV0IGN1c3RvbUFscGhhYmV0ID0gKGFscGhhYmV0LCBkZWZhdWx0U2l6ZSA9IDIxKSA9PiB7XG4gIHJldHVybiAoc2l6ZSA9IGRlZmF1bHRTaXplKSA9PiB7XG4gICAgbGV0IGlkID0gJydcbiAgICBsZXQgaSA9IHNpemVcbiAgICB3aGlsZSAoaS0tKSB7XG4gICAgICBpZCArPSBhbHBoYWJldFsoTWF0aC5yYW5kb20oKSAqIGFscGhhYmV0Lmxlbmd0aCkgfCAwXVxuICAgIH1cbiAgICByZXR1cm4gaWRcbiAgfVxufVxuZXhwb3J0IGxldCBuYW5vaWQgPSAoc2l6ZSA9IDIxKSA9PiB7XG4gIGxldCBpZCA9ICcnXG4gIGxldCBpID0gc2l6ZVxuICB3aGlsZSAoaS0tKSB7XG4gICAgaWQgKz0gdXJsQWxwaGFiZXRbKE1hdGgucmFuZG9tKCkgKiA2NCkgfCAwXVxuICB9XG4gIHJldHVybiBpZFxufVxuIiwgIi8qXG4gXyAgICAgX18gICAgIF8gX19cbnwgfCAgLyAvX19fIF8oXykgL19fX19cbnwgfCAvfCAvIC8gX18gYC8gLyAvIF9fXy9cbnwgfC8gfC8gLyAvXy8gLyAvIChfXyAgKVxufF9fL3xfXy9cXF9fLF8vXy9fL19fX18vXG5UaGUgZWxlY3Ryb24gYWx0ZXJuYXRpdmUgZm9yIEdvXG4oYykgTGVhIEFudGhvbnkgMjAxOS1wcmVzZW50XG4qL1xuXG4vKiBqc2hpbnQgZXN2ZXJzaW9uOiA5ICovXG5pbXBvcnQgeyBuYW5vaWQgfSBmcm9tICduYW5vaWQvbm9uLXNlY3VyZSc7XG5cbmNvbnN0IHJ1bnRpbWVVUkwgPSB3aW5kb3cubG9jYXRpb24ub3JpZ2luICsgXCIvd2FpbHMvcnVudGltZVwiO1xuXG4vLyBPYmplY3QgTmFtZXNcbmV4cG9ydCBjb25zdCBvYmplY3ROYW1lcyA9IHtcbiAgICBDYWxsOiAwLFxuICAgIENsaXBib2FyZDogMSxcbiAgICBBcHBsaWNhdGlvbjogMixcbiAgICBFdmVudHM6IDMsXG4gICAgQ29udGV4dE1lbnU6IDQsXG4gICAgRGlhbG9nOiA1LFxuICAgIFdpbmRvdzogNixcbiAgICBTY3JlZW5zOiA3LFxuICAgIFN5c3RlbTogOCxcbiAgICBCcm93c2VyOiA5LFxufVxuZXhwb3J0IGxldCBjbGllbnRJZCA9IG5hbm9pZCgpO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBydW50aW1lIGNhbGxlciBmdW5jdGlvbiB0aGF0IGludm9rZXMgYSBzcGVjaWZpZWQgbWV0aG9kIG9uIGEgZ2l2ZW4gb2JqZWN0IHdpdGhpbiBhIHNwZWNpZmllZCB3aW5kb3cgY29udGV4dC5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IC0gVGhlIG9iamVjdCBvbiB3aGljaCB0aGUgbWV0aG9kIGlzIHRvIGJlIGludm9rZWQuXG4gKiBAcGFyYW0ge3N0cmluZ30gd2luZG93TmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB3aW5kb3cgY29udGV4dCBpbiB3aGljaCB0aGUgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IEEgcnVudGltZSBjYWxsZXIgZnVuY3Rpb24gdGhhdCB0YWtlcyB0aGUgbWV0aG9kIG5hbWUgYW5kIG9wdGlvbmFsbHkgYXJndW1lbnRzIGFuZCBpbnZva2VzIHRoZSBtZXRob2Qgd2l0aGluIHRoZSBzcGVjaWZpZWQgd2luZG93IGNvbnRleHQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBuZXdSdW50aW1lQ2FsbGVyKG9iamVjdCwgd2luZG93TmFtZSkge1xuICAgIHJldHVybiBmdW5jdGlvbiAobWV0aG9kLCBhcmdzPW51bGwpIHtcbiAgICAgICAgcmV0dXJuIHJ1bnRpbWVDYWxsKG9iamVjdCArIFwiLlwiICsgbWV0aG9kLCB3aW5kb3dOYW1lLCBhcmdzKTtcbiAgICB9O1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgcnVudGltZSBjYWxsZXIgd2l0aCBzcGVjaWZpZWQgSUQuXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IG9iamVjdCAtIFRoZSBvYmplY3QgdG8gaW52b2tlIHRoZSBtZXRob2Qgb24uXG4gKiBAcGFyYW0ge3N0cmluZ30gd2luZG93TmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB3aW5kb3cuXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gLSBUaGUgbmV3IHJ1bnRpbWUgY2FsbGVyIGZ1bmN0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbmV3UnVudGltZUNhbGxlcldpdGhJRChvYmplY3QsIHdpbmRvd05hbWUpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKG1ldGhvZCwgYXJncz1udWxsKSB7XG4gICAgICAgIHJldHVybiBydW50aW1lQ2FsbFdpdGhJRChvYmplY3QsIG1ldGhvZCwgd2luZG93TmFtZSwgYXJncyk7XG4gICAgfTtcbn1cblxuXG5mdW5jdGlvbiBydW50aW1lQ2FsbChtZXRob2QsIHdpbmRvd05hbWUsIGFyZ3MpIHtcbiAgICBsZXQgdXJsID0gbmV3IFVSTChydW50aW1lVVJMKTtcbiAgICBpZiggbWV0aG9kICkge1xuICAgICAgICB1cmwuc2VhcmNoUGFyYW1zLmFwcGVuZChcIm1ldGhvZFwiLCBtZXRob2QpO1xuICAgIH1cbiAgICBsZXQgZmV0Y2hPcHRpb25zID0ge1xuICAgICAgICBoZWFkZXJzOiB7fSxcbiAgICB9O1xuICAgIGlmICh3aW5kb3dOYW1lKSB7XG4gICAgICAgIGZldGNoT3B0aW9ucy5oZWFkZXJzW1wieC13YWlscy13aW5kb3ctbmFtZVwiXSA9IHdpbmRvd05hbWU7XG4gICAgfVxuICAgIGlmIChhcmdzKSB7XG4gICAgICAgIHVybC5zZWFyY2hQYXJhbXMuYXBwZW5kKFwiYXJnc1wiLCBKU09OLnN0cmluZ2lmeShhcmdzKSk7XG4gICAgfVxuICAgIGZldGNoT3B0aW9ucy5oZWFkZXJzW1wieC13YWlscy1jbGllbnQtaWRcIl0gPSBjbGllbnRJZDtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGZldGNoKHVybCwgZmV0Y2hPcHRpb25zKVxuICAgICAgICAgICAgLnRoZW4ocmVzcG9uc2UgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS5vaykge1xuICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayBjb250ZW50IHR5cGVcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLmhlYWRlcnMuZ2V0KFwiQ29udGVudC1UeXBlXCIpICYmIHJlc3BvbnNlLmhlYWRlcnMuZ2V0KFwiQ29udGVudC1UeXBlXCIpLmluZGV4T2YoXCJhcHBsaWNhdGlvbi9qc29uXCIpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlLmpzb24oKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXNwb25zZS50ZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmVqZWN0KEVycm9yKHJlc3BvbnNlLnN0YXR1c1RleHQpKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAudGhlbihkYXRhID0+IHJlc29sdmUoZGF0YSkpXG4gICAgICAgICAgICAuY2F0Y2goZXJyb3IgPT4gcmVqZWN0KGVycm9yKSk7XG4gICAgfSk7XG59XG5cbmZ1bmN0aW9uIHJ1bnRpbWVDYWxsV2l0aElEKG9iamVjdElELCBtZXRob2QsIHdpbmRvd05hbWUsIGFyZ3MpIHtcbiAgICBsZXQgdXJsID0gbmV3IFVSTChydW50aW1lVVJMKTtcbiAgICB1cmwuc2VhcmNoUGFyYW1zLmFwcGVuZChcIm9iamVjdFwiLCBvYmplY3RJRCk7XG4gICAgdXJsLnNlYXJjaFBhcmFtcy5hcHBlbmQoXCJtZXRob2RcIiwgbWV0aG9kKTtcbiAgICBsZXQgZmV0Y2hPcHRpb25zID0ge1xuICAgICAgICBoZWFkZXJzOiB7fSxcbiAgICB9O1xuICAgIGlmICh3aW5kb3dOYW1lKSB7XG4gICAgICAgIGZldGNoT3B0aW9ucy5oZWFkZXJzW1wieC13YWlscy13aW5kb3ctbmFtZVwiXSA9IHdpbmRvd05hbWU7XG4gICAgfVxuICAgIGlmIChhcmdzKSB7XG4gICAgICAgIHVybC5zZWFyY2hQYXJhbXMuYXBwZW5kKFwiYXJnc1wiLCBKU09OLnN0cmluZ2lmeShhcmdzKSk7XG4gICAgfVxuICAgIGZldGNoT3B0aW9ucy5oZWFkZXJzW1wieC13YWlscy1jbGllbnQtaWRcIl0gPSBjbGllbnRJZDtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBmZXRjaCh1cmwsIGZldGNoT3B0aW9ucylcbiAgICAgICAgICAgIC50aGVuKHJlc3BvbnNlID0+IHtcbiAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2Uub2spIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgY29udGVudCB0eXBlXG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS5oZWFkZXJzLmdldChcIkNvbnRlbnQtVHlwZVwiKSAmJiByZXNwb25zZS5oZWFkZXJzLmdldChcIkNvbnRlbnQtVHlwZVwiKS5pbmRleE9mKFwiYXBwbGljYXRpb24vanNvblwiKSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXNwb25zZS5qc29uKCk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzcG9uc2UudGV4dCgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJlamVjdChFcnJvcihyZXNwb25zZS5zdGF0dXNUZXh0KSk7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLnRoZW4oZGF0YSA9PiByZXNvbHZlKGRhdGEpKVxuICAgICAgICAgICAgLmNhdGNoKGVycm9yID0+IHJlamVjdChlcnJvcikpO1xuICAgIH0pO1xufVxuIiwgIi8qXG4gX1x0ICAgX19cdCAgXyBfX1xufCB8XHQgLyAvX19fIF8oXykgL19fX19cbnwgfCAvfCAvIC8gX18gYC8gLyAvIF9fXy9cbnwgfC8gfC8gLyAvXy8gLyAvIChfXyAgKVxufF9fL3xfXy9cXF9fLF8vXy9fL19fX18vXG5UaGUgZWxlY3Ryb24gYWx0ZXJuYXRpdmUgZm9yIEdvXG4oYykgTGVhIEFudGhvbnkgMjAxOS1wcmVzZW50XG4qL1xuXG4vKiBqc2hpbnQgZXN2ZXJzaW9uOiA5ICovXG5pbXBvcnQge25ld1J1bnRpbWVDYWxsZXJXaXRoSUQsIG9iamVjdE5hbWVzfSBmcm9tIFwiLi9ydW50aW1lXCI7XG5cbmNvbnN0IGNhbGwgPSBuZXdSdW50aW1lQ2FsbGVyV2l0aElEKG9iamVjdE5hbWVzLkJyb3dzZXIsICcnKTtcbmNvbnN0IEJyb3dzZXJPcGVuVVJMID0gMDtcblxuLyoqXG4gKiBPcGVuIGEgYnJvd3NlciB3aW5kb3cgdG8gdGhlIGdpdmVuIFVSTFxuICogQHBhcmFtIHtzdHJpbmd9IHVybCAtIFRoZSBVUkwgdG8gb3BlblxuICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nPn1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIE9wZW5VUkwodXJsKSB7XG4gICAgcmV0dXJuIGNhbGwoQnJvd3Nlck9wZW5VUkwsIHt1cmx9KTtcbn1cbiIsICIvKlxuIF9cdCAgIF9fXHQgIF8gX19cbnwgfFx0IC8gL19fXyBfKF8pIC9fX19fXG58IHwgL3wgLyAvIF9fIGAvIC8gLyBfX18vXG58IHwvIHwvIC8gL18vIC8gLyAoX18gIClcbnxfXy98X18vXFxfXyxfL18vXy9fX19fL1xuVGhlIGVsZWN0cm9uIGFsdGVybmF0aXZlIGZvciBHb1xuKGMpIExlYSBBbnRob255IDIwMTktcHJlc2VudFxuKi9cblxuLyoganNoaW50IGVzdmVyc2lvbjogOSAqL1xuXG5pbXBvcnQge25ld1J1bnRpbWVDYWxsZXJXaXRoSUQsIG9iamVjdE5hbWVzfSBmcm9tIFwiLi9ydW50aW1lXCI7XG5cbmNvbnN0IGNhbGwgPSBuZXdSdW50aW1lQ2FsbGVyV2l0aElEKG9iamVjdE5hbWVzLkNsaXBib2FyZCwgJycpO1xuY29uc3QgQ2xpcGJvYXJkU2V0VGV4dCA9IDA7XG5jb25zdCBDbGlwYm9hcmRUZXh0ID0gMTtcblxuLyoqXG4gKiBTZXRzIHRoZSB0ZXh0IHRvIHRoZSBDbGlwYm9hcmQuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHRleHQgLSBUaGUgdGV4dCB0byBiZSBzZXQgdG8gdGhlIENsaXBib2FyZC5cbiAqIEByZXR1cm4ge1Byb21pc2V9IC0gQSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgb3BlcmF0aW9uIGlzIHN1Y2Nlc3NmdWwuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBTZXRUZXh0KHRleHQpIHtcbiAgICByZXR1cm4gY2FsbChDbGlwYm9hcmRTZXRUZXh0LCB7dGV4dH0pO1xufVxuXG4vKipcbiAqIEdldCB0aGUgQ2xpcGJvYXJkIHRleHRcbiAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZz59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIHRleHQgZnJvbSB0aGUgQ2xpcGJvYXJkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gVGV4dCgpIHtcbiAgICByZXR1cm4gY2FsbChDbGlwYm9hcmRUZXh0KTtcbn1cbiIsICIvKlxuIF9cdCAgIF9fXHQgIF8gX19cbnwgfFx0IC8gL19fXyBfKF8pIC9fX19fXG58IHwgL3wgLyAvIF9fIGAvIC8gLyBfX18vXG58IHwvIHwvIC8gL18vIC8gLyAoX18gIClcbnxfXy98X18vXFxfXyxfL18vXy9fX19fL1xuVGhlIGVsZWN0cm9uIGFsdGVybmF0aXZlIGZvciBHb1xuKGMpIExlYSBBbnRob255IDIwMTktcHJlc2VudFxuKi9cblxuLyoganNoaW50IGVzdmVyc2lvbjogOSAqL1xuXG5pbXBvcnQge25ld1J1bnRpbWVDYWxsZXJXaXRoSUQsIG9iamVjdE5hbWVzfSBmcm9tIFwiLi9ydW50aW1lXCI7XG5sZXQgY2FsbCA9IG5ld1J1bnRpbWVDYWxsZXJXaXRoSUQob2JqZWN0TmFtZXMuU3lzdGVtLCAnJyk7XG5jb25zdCBzeXN0ZW1Jc0RhcmtNb2RlID0gMDtcbmNvbnN0IGVudmlyb25tZW50ID0gMTtcblxuZXhwb3J0IGZ1bmN0aW9uIGludm9rZShtc2cpIHtcbiAgICBpZih3aW5kb3cuY2hyb21lKSB7XG4gICAgICAgIHJldHVybiB3aW5kb3cuY2hyb21lLndlYnZpZXcucG9zdE1lc3NhZ2UobXNnKTtcbiAgICB9XG4gICAgcmV0dXJuIHdpbmRvdy53ZWJraXQubWVzc2FnZUhhbmRsZXJzLmV4dGVybmFsLnBvc3RNZXNzYWdlKG1zZyk7XG59XG5cbi8qKlxuICogQGZ1bmN0aW9uXG4gKiBSZXRyaWV2ZXMgdGhlIHN5c3RlbSBkYXJrIG1vZGUgc3RhdHVzLlxuICogQHJldHVybnMge1Byb21pc2U8Ym9vbGVhbj59IC0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gYSBib29sZWFuIHZhbHVlIGluZGljYXRpbmcgaWYgdGhlIHN5c3RlbSBpcyBpbiBkYXJrIG1vZGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBJc0RhcmtNb2RlKCkge1xuICAgIHJldHVybiBjYWxsKHN5c3RlbUlzRGFya01vZGUpO1xufVxuXG4vKipcbiAqIEZldGNoZXMgdGhlIGNhcGFiaWxpdGllcyBvZiB0aGUgYXBwbGljYXRpb24gZnJvbSB0aGUgc2VydmVyLlxuICpcbiAqIEBhc3luY1xuICogQGZ1bmN0aW9uIENhcGFiaWxpdGllc1xuICogQHJldHVybnMge1Byb21pc2U8T2JqZWN0Pn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gYW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIGNhcGFiaWxpdGllcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIENhcGFiaWxpdGllcygpIHtcbiAgICBsZXQgcmVzcG9uc2UgPSBmZXRjaChcIi93YWlscy9jYXBhYmlsaXRpZXNcIik7XG4gICAgcmV0dXJuIHJlc3BvbnNlLmpzb24oKTtcbn1cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBFbnZpcm9ubWVudEluZm9cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBPUyAtIFRoZSBvcGVyYXRpbmcgc3lzdGVtIGluIHVzZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBBcmNoIC0gVGhlIGFyY2hpdGVjdHVyZSBvZiB0aGUgc3lzdGVtLlxuICovXG5cbi8qKlxuICogQGZ1bmN0aW9uXG4gKiBSZXRyaWV2ZXMgZW52aXJvbm1lbnQgZGV0YWlscy5cbiAqIEByZXR1cm5zIHtQcm9taXNlPEVudmlyb25tZW50SW5mbz59IC0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gYW4gb2JqZWN0IGNvbnRhaW5pbmcgT1MgYW5kIHN5c3RlbSBhcmNoaXRlY3R1cmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBFbnZpcm9ubWVudCgpIHtcbiAgICByZXR1cm4gY2FsbChlbnZpcm9ubWVudCk7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIHRoZSBjdXJyZW50IG9wZXJhdGluZyBzeXN0ZW0gaXMgV2luZG93cy5cbiAqXG4gKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIHRoZSBvcGVyYXRpbmcgc3lzdGVtIGlzIFdpbmRvd3MsIG90aGVyd2lzZSBmYWxzZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIElzV2luZG93cygpIHtcbiAgICByZXR1cm4gd2luZG93Ll93YWlscy5lbnZpcm9ubWVudC5PUyA9PT0gXCJ3aW5kb3dzXCI7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIHRoZSBjdXJyZW50IG9wZXJhdGluZyBzeXN0ZW0gaXMgTGludXguXG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgdHJ1ZSBpZiB0aGUgY3VycmVudCBvcGVyYXRpbmcgc3lzdGVtIGlzIExpbnV4LCBmYWxzZSBvdGhlcndpc2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBJc0xpbnV4KCkge1xuICAgIHJldHVybiB3aW5kb3cuX3dhaWxzLmVudmlyb25tZW50Lk9TID09PSBcImxpbnV4XCI7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIHRoZSBjdXJyZW50IGVudmlyb25tZW50IGlzIGEgbWFjT1Mgb3BlcmF0aW5nIHN5c3RlbS5cbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgZW52aXJvbm1lbnQgaXMgbWFjT1MsIGZhbHNlIG90aGVyd2lzZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIElzTWFjKCkge1xuICAgIHJldHVybiB3aW5kb3cuX3dhaWxzLmVudmlyb25tZW50Lk9TID09PSBcImRhcndpblwiO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiB0aGUgY3VycmVudCBlbnZpcm9ubWVudCBhcmNoaXRlY3R1cmUgaXMgQU1ENjQuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgY3VycmVudCBlbnZpcm9ubWVudCBhcmNoaXRlY3R1cmUgaXMgQU1ENjQsIGZhbHNlIG90aGVyd2lzZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIElzQU1ENjQoKSB7XG4gICAgcmV0dXJuIHdpbmRvdy5fd2FpbHMuZW52aXJvbm1lbnQuQXJjaCA9PT0gXCJhbWQ2NFwiO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiB0aGUgY3VycmVudCBhcmNoaXRlY3R1cmUgaXMgQVJNLlxuICpcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHRoZSBjdXJyZW50IGFyY2hpdGVjdHVyZSBpcyBBUk0sIGZhbHNlIG90aGVyd2lzZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIElzQVJNKCkge1xuICAgIHJldHVybiB3aW5kb3cuX3dhaWxzLmVudmlyb25tZW50LkFyY2ggPT09IFwiYXJtXCI7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIHRoZSBjdXJyZW50IGVudmlyb25tZW50IGlzIEFSTTY0IGFyY2hpdGVjdHVyZS5cbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSBSZXR1cm5zIHRydWUgaWYgdGhlIGVudmlyb25tZW50IGlzIEFSTTY0IGFyY2hpdGVjdHVyZSwgb3RoZXJ3aXNlIHJldHVybnMgZmFsc2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBJc0FSTTY0KCkge1xuICAgIHJldHVybiB3aW5kb3cuX3dhaWxzLmVudmlyb25tZW50LkFyY2ggPT09IFwiYXJtNjRcIjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIElzRGVidWcoKSB7XG4gICAgcmV0dXJuIHdpbmRvdy5fd2FpbHMuZW52aXJvbm1lbnQuRGVidWcgPT09IHRydWU7XG59XG5cbiIsICIvKlxuIF9cdCAgIF9fXHQgIF8gX19cbnwgfFx0IC8gL19fXyBfKF8pIC9fX19fXG58IHwgL3wgLyAvIF9fIGAvIC8gLyBfX18vXG58IHwvIHwvIC8gL18vIC8gLyAoX18gIClcbnxfXy98X18vXFxfXyxfL18vXy9fX19fL1xuVGhlIGVsZWN0cm9uIGFsdGVybmF0aXZlIGZvciBHb1xuKGMpIExlYSBBbnRob255IDIwMTktcHJlc2VudFxuKi9cblxuLyoganNoaW50IGVzdmVyc2lvbjogOSAqL1xuXG5pbXBvcnQge25ld1J1bnRpbWVDYWxsZXJXaXRoSUQsIG9iamVjdE5hbWVzfSBmcm9tIFwiLi9ydW50aW1lXCI7XG5pbXBvcnQge0lzRGVidWd9IGZyb20gXCIuL3N5c3RlbVwiO1xuXG4vLyBzZXR1cFxud2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2NvbnRleHRtZW51JywgY29udGV4dE1lbnVIYW5kbGVyKTtcblxuY29uc3QgY2FsbCA9IG5ld1J1bnRpbWVDYWxsZXJXaXRoSUQob2JqZWN0TmFtZXMuQ29udGV4dE1lbnUsICcnKTtcbmNvbnN0IENvbnRleHRNZW51T3BlbiA9IDA7XG5cbmZ1bmN0aW9uIG9wZW5Db250ZXh0TWVudShpZCwgeCwgeSwgZGF0YSkge1xuICAgIHZvaWQgY2FsbChDb250ZXh0TWVudU9wZW4sIHtpZCwgeCwgeSwgZGF0YX0pO1xufVxuXG5mdW5jdGlvbiBjb250ZXh0TWVudUhhbmRsZXIoZXZlbnQpIHtcbiAgICAvLyBDaGVjayBmb3IgY3VzdG9tIGNvbnRleHQgbWVudVxuICAgIGxldCBlbGVtZW50ID0gZXZlbnQudGFyZ2V0O1xuICAgIGxldCBjdXN0b21Db250ZXh0TWVudSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpLmdldFByb3BlcnR5VmFsdWUoXCItLWN1c3RvbS1jb250ZXh0bWVudVwiKTtcbiAgICBjdXN0b21Db250ZXh0TWVudSA9IGN1c3RvbUNvbnRleHRNZW51ID8gY3VzdG9tQ29udGV4dE1lbnUudHJpbSgpIDogXCJcIjtcbiAgICBpZiAoY3VzdG9tQ29udGV4dE1lbnUpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgbGV0IGN1c3RvbUNvbnRleHRNZW51RGF0YSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpLmdldFByb3BlcnR5VmFsdWUoXCItLWN1c3RvbS1jb250ZXh0bWVudS1kYXRhXCIpO1xuICAgICAgICBvcGVuQ29udGV4dE1lbnUoY3VzdG9tQ29udGV4dE1lbnUsIGV2ZW50LmNsaWVudFgsIGV2ZW50LmNsaWVudFksIGN1c3RvbUNvbnRleHRNZW51RGF0YSk7XG4gICAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHByb2Nlc3NEZWZhdWx0Q29udGV4dE1lbnUoZXZlbnQpO1xufVxuXG5cbi8qXG4tLWRlZmF1bHQtY29udGV4dG1lbnU6IGF1dG87IChkZWZhdWx0KSB3aWxsIHNob3cgdGhlIGRlZmF1bHQgY29udGV4dCBtZW51IGlmIGNvbnRlbnRFZGl0YWJsZSBpcyB0cnVlIE9SIHRleHQgaGFzIGJlZW4gc2VsZWN0ZWQgT1IgZWxlbWVudCBpcyBpbnB1dCBvciB0ZXh0YXJlYVxuLS1kZWZhdWx0LWNvbnRleHRtZW51OiBzaG93OyB3aWxsIGFsd2F5cyBzaG93IHRoZSBkZWZhdWx0IGNvbnRleHQgbWVudVxuLS1kZWZhdWx0LWNvbnRleHRtZW51OiBoaWRlOyB3aWxsIGFsd2F5cyBoaWRlIHRoZSBkZWZhdWx0IGNvbnRleHQgbWVudVxuXG5UaGlzIHJ1bGUgaXMgaW5oZXJpdGVkIGxpa2Ugbm9ybWFsIENTUyBydWxlcywgc28gbmVzdGluZyB3b3JrcyBhcyBleHBlY3RlZFxuKi9cbmZ1bmN0aW9uIHByb2Nlc3NEZWZhdWx0Q29udGV4dE1lbnUoZXZlbnQpIHtcblxuICAgIC8vIERlYnVnIGJ1aWxkcyBhbHdheXMgc2hvdyB0aGUgbWVudVxuICAgIGlmIChJc0RlYnVnKCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFByb2Nlc3MgZGVmYXVsdCBjb250ZXh0IG1lbnVcbiAgICBjb25zdCBlbGVtZW50ID0gZXZlbnQudGFyZ2V0O1xuICAgIGNvbnN0IGNvbXB1dGVkU3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KTtcbiAgICBjb25zdCBkZWZhdWx0Q29udGV4dE1lbnVBY3Rpb24gPSBjb21wdXRlZFN0eWxlLmdldFByb3BlcnR5VmFsdWUoXCItLWRlZmF1bHQtY29udGV4dG1lbnVcIikudHJpbSgpO1xuICAgIHN3aXRjaCAoZGVmYXVsdENvbnRleHRNZW51QWN0aW9uKSB7XG4gICAgICAgIGNhc2UgXCJzaG93XCI6XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGNhc2UgXCJoaWRlXCI6XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgLy8gQ2hlY2sgaWYgY29udGVudEVkaXRhYmxlIGlzIHRydWVcbiAgICAgICAgICAgIGlmIChlbGVtZW50LmlzQ29udGVudEVkaXRhYmxlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBDaGVjayBpZiB0ZXh0IGhhcyBiZWVuIHNlbGVjdGVkXG4gICAgICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XG4gICAgICAgICAgICBjb25zdCBoYXNTZWxlY3Rpb24gPSAoc2VsZWN0aW9uLnRvU3RyaW5nKCkubGVuZ3RoID4gMClcbiAgICAgICAgICAgIGlmIChoYXNTZWxlY3Rpb24pIHtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNlbGVjdGlvbi5yYW5nZUNvdW50OyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmFuZ2UgPSBzZWxlY3Rpb24uZ2V0UmFuZ2VBdChpKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVjdHMgPSByYW5nZS5nZXRDbGllbnRSZWN0cygpO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHJlY3RzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZWN0ID0gcmVjdHNbal07XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZG9jdW1lbnQuZWxlbWVudEZyb21Qb2ludChyZWN0LmxlZnQsIHJlY3QudG9wKSA9PT0gZWxlbWVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIENoZWNrIGlmIHRhZ25hbWUgaXMgaW5wdXQgb3IgdGV4dGFyZWFcbiAgICAgICAgICAgIGlmIChlbGVtZW50LnRhZ05hbWUgPT09IFwiSU5QVVRcIiB8fCBlbGVtZW50LnRhZ05hbWUgPT09IFwiVEVYVEFSRUFcIikge1xuICAgICAgICAgICAgICAgIGlmIChoYXNTZWxlY3Rpb24gfHwgKCFlbGVtZW50LnJlYWRPbmx5ICYmICFlbGVtZW50LmRpc2FibGVkKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBoaWRlIGRlZmF1bHQgY29udGV4dCBtZW51XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cbn1cbiIsICIvKlxuIF9cdCAgIF9fXHQgIF8gX19cbnwgfFx0IC8gL19fXyBfKF8pIC9fX19fXG58IHwgL3wgLyAvIF9fIGAvIC8gLyBfX18vXG58IHwvIHwvIC8gL18vIC8gLyAoX18gIClcbnxfXy98X18vXFxfXyxfL18vXy9fX19fL1xuVGhlIGVsZWN0cm9uIGFsdGVybmF0aXZlIGZvciBHb1xuKGMpIExlYSBBbnRob255IDIwMTktcHJlc2VudFxuKi9cblxuLyoganNoaW50IGVzdmVyc2lvbjogOSAqL1xuXG4vKipcbiAqIFJldHJpZXZlcyB0aGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQga2V5IGZyb20gdGhlIGZsYWcgbWFwLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXlTdHJpbmcgLSBUaGUga2V5IHRvIHJldHJpZXZlIHRoZSB2YWx1ZSBmb3IuXG4gKiBAcmV0dXJuIHsqfSAtIFRoZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmllZCBrZXkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBHZXRGbGFnKGtleVN0cmluZykge1xuICAgIHRyeSB7XG4gICAgICAgIHJldHVybiB3aW5kb3cuX3dhaWxzLmZsYWdzW2tleVN0cmluZ107XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbmFibGUgdG8gcmV0cmlldmUgZmxhZyAnXCIgKyBrZXlTdHJpbmcgKyBcIic6IFwiICsgZSk7XG4gICAgfVxufVxuIiwgIi8qXG4gX1x0ICAgX19cdCAgXyBfX1xufCB8XHQgLyAvX19fIF8oXykgL19fX19cbnwgfCAvfCAvIC8gX18gYC8gLyAvIF9fXy9cbnwgfC8gfC8gLyAvXy8gLyAvIChfXyAgKVxufF9fL3xfXy9cXF9fLF8vXy9fL19fX18vXG5UaGUgZWxlY3Ryb24gYWx0ZXJuYXRpdmUgZm9yIEdvXG4oYykgTGVhIEFudGhvbnkgMjAxOS1wcmVzZW50XG4qL1xuXG4vKiBqc2hpbnQgZXN2ZXJzaW9uOiA5ICovXG5cbmltcG9ydCB7aW52b2tlLCBJc1dpbmRvd3N9IGZyb20gXCIuL3N5c3RlbVwiO1xuaW1wb3J0IHtHZXRGbGFnfSBmcm9tIFwiLi9mbGFnc1wiO1xuXG4vLyBTZXR1cFxud2luZG93Ll93YWlscyA9IHdpbmRvdy5fd2FpbHMgfHwge307XG53aW5kb3cuX3dhaWxzLnNldFJlc2l6YWJsZSA9IHNldFJlc2l6YWJsZTtcbndpbmRvdy5fd2FpbHMuZW5kRHJhZyA9IGVuZERyYWc7XG53aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgb25Nb3VzZURvd24pO1xud2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIG9uTW91c2VNb3ZlKTtcbndpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgb25Nb3VzZVVwKTtcblxuXG5sZXQgc2hvdWxkRHJhZyA9IGZhbHNlO1xubGV0IHJlc2l6ZUVkZ2UgPSBudWxsO1xubGV0IHJlc2l6YWJsZSA9IGZhbHNlO1xubGV0IGRlZmF1bHRDdXJzb3IgPSBcImF1dG9cIjtcblxuZnVuY3Rpb24gZHJhZ1Rlc3QoZSkge1xuICAgIGxldCB2YWwgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlLnRhcmdldCkuZ2V0UHJvcGVydHlWYWx1ZShcIi0td2Via2l0LWFwcC1yZWdpb25cIik7XG4gICAgaWYgKCF2YWwgfHwgdmFsID09PSBcIlwiIHx8IHZhbC50cmltKCkgIT09IFwiZHJhZ1wiIHx8IGUuYnV0dG9ucyAhPT0gMSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiBlLmRldGFpbCA9PT0gMTtcbn1cblxuZnVuY3Rpb24gc2V0UmVzaXphYmxlKHZhbHVlKSB7XG4gICAgcmVzaXphYmxlID0gdmFsdWU7XG59XG5cbmZ1bmN0aW9uIGVuZERyYWcoKSB7XG4gICAgZG9jdW1lbnQuYm9keS5zdHlsZS5jdXJzb3IgPSAnZGVmYXVsdCc7XG4gICAgc2hvdWxkRHJhZyA9IGZhbHNlO1xufVxuXG5mdW5jdGlvbiB0ZXN0UmVzaXplKCkge1xuICAgIGlmKCByZXNpemVFZGdlICkge1xuICAgICAgICBpbnZva2UoYHJlc2l6ZToke3Jlc2l6ZUVkZ2V9YCk7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gb25Nb3VzZURvd24oZSkge1xuICAgIGlmKElzV2luZG93cygpICYmIHRlc3RSZXNpemUoKSB8fCBkcmFnVGVzdChlKSkge1xuICAgICAgICBzaG91bGREcmFnID0gISFpc1ZhbGlkRHJhZyhlKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGlzVmFsaWREcmFnKGUpIHtcbiAgICAvLyBJZ25vcmUgZHJhZyBvbiBzY3JvbGxiYXJzXG4gICAgcmV0dXJuICEoZS5vZmZzZXRYID4gZS50YXJnZXQuY2xpZW50V2lkdGggfHwgZS5vZmZzZXRZID4gZS50YXJnZXQuY2xpZW50SGVpZ2h0KTtcbn1cblxuZnVuY3Rpb24gb25Nb3VzZVVwKGUpIHtcbiAgICBsZXQgbW91c2VQcmVzc2VkID0gZS5idXR0b25zICE9PSB1bmRlZmluZWQgPyBlLmJ1dHRvbnMgOiBlLndoaWNoO1xuICAgIGlmIChtb3VzZVByZXNzZWQgPiAwKSB7XG4gICAgICAgIGVuZERyYWcoKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIHNldFJlc2l6ZShjdXJzb3IgPSBkZWZhdWx0Q3Vyc29yKSB7XG4gICAgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlLmN1cnNvciA9IGN1cnNvcjtcbiAgICByZXNpemVFZGdlID0gY3Vyc29yO1xufVxuXG5mdW5jdGlvbiBvbk1vdXNlTW92ZShlKSB7XG4gICAgc2hvdWxkRHJhZyA9IGNoZWNrRHJhZyhlKTtcbiAgICBpZiAoSXNXaW5kb3dzKCkgJiYgcmVzaXphYmxlKSB7XG4gICAgICAgIGhhbmRsZVJlc2l6ZShlKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGNoZWNrRHJhZyhlKSB7XG4gICAgbGV0IG1vdXNlUHJlc3NlZCA9IGUuYnV0dG9ucyAhPT0gdW5kZWZpbmVkID8gZS5idXR0b25zIDogZS53aGljaDtcbiAgICBpZihzaG91bGREcmFnICYmIG1vdXNlUHJlc3NlZCA+IDApIHtcbiAgICAgICAgaW52b2tlKFwiZHJhZ1wiKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gc2hvdWxkRHJhZztcbn1cblxuZnVuY3Rpb24gaGFuZGxlUmVzaXplKGUpIHtcbiAgICBsZXQgcmVzaXplSGFuZGxlSGVpZ2h0ID0gR2V0RmxhZyhcInN5c3RlbS5yZXNpemVIYW5kbGVIZWlnaHRcIikgfHwgNTtcbiAgICBsZXQgcmVzaXplSGFuZGxlV2lkdGggPSBHZXRGbGFnKFwic3lzdGVtLnJlc2l6ZUhhbmRsZVdpZHRoXCIpIHx8IDU7XG5cbiAgICAvLyBFeHRyYSBwaXhlbHMgZm9yIHRoZSBjb3JuZXIgYXJlYXNcbiAgICBsZXQgY29ybmVyRXh0cmEgPSBHZXRGbGFnKFwicmVzaXplQ29ybmVyRXh0cmFcIikgfHwgMTA7XG5cbiAgICBsZXQgcmlnaHRCb3JkZXIgPSB3aW5kb3cub3V0ZXJXaWR0aCAtIGUuY2xpZW50WCA8IHJlc2l6ZUhhbmRsZVdpZHRoO1xuICAgIGxldCBsZWZ0Qm9yZGVyID0gZS5jbGllbnRYIDwgcmVzaXplSGFuZGxlV2lkdGg7XG4gICAgbGV0IHRvcEJvcmRlciA9IGUuY2xpZW50WSA8IHJlc2l6ZUhhbmRsZUhlaWdodDtcbiAgICBsZXQgYm90dG9tQm9yZGVyID0gd2luZG93Lm91dGVySGVpZ2h0IC0gZS5jbGllbnRZIDwgcmVzaXplSGFuZGxlSGVpZ2h0O1xuXG4gICAgLy8gQWRqdXN0IGZvciBjb3JuZXJzXG4gICAgbGV0IHJpZ2h0Q29ybmVyID0gd2luZG93Lm91dGVyV2lkdGggLSBlLmNsaWVudFggPCAocmVzaXplSGFuZGxlV2lkdGggKyBjb3JuZXJFeHRyYSk7XG4gICAgbGV0IGxlZnRDb3JuZXIgPSBlLmNsaWVudFggPCAocmVzaXplSGFuZGxlV2lkdGggKyBjb3JuZXJFeHRyYSk7XG4gICAgbGV0IHRvcENvcm5lciA9IGUuY2xpZW50WSA8IChyZXNpemVIYW5kbGVIZWlnaHQgKyBjb3JuZXJFeHRyYSk7XG4gICAgbGV0IGJvdHRvbUNvcm5lciA9IHdpbmRvdy5vdXRlckhlaWdodCAtIGUuY2xpZW50WSA8IChyZXNpemVIYW5kbGVIZWlnaHQgKyBjb3JuZXJFeHRyYSk7XG5cbiAgICAvLyBJZiB3ZSBhcmVuJ3Qgb24gYW4gZWRnZSwgYnV0IHdlcmUsIHJlc2V0IHRoZSBjdXJzb3IgdG8gZGVmYXVsdFxuICAgIGlmICghbGVmdEJvcmRlciAmJiAhcmlnaHRCb3JkZXIgJiYgIXRvcEJvcmRlciAmJiAhYm90dG9tQm9yZGVyICYmIHJlc2l6ZUVkZ2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBzZXRSZXNpemUoKTtcbiAgICB9XG4gICAgLy8gQWRqdXN0ZWQgZm9yIGNvcm5lciBhcmVhc1xuICAgIGVsc2UgaWYgKHJpZ2h0Q29ybmVyICYmIGJvdHRvbUNvcm5lcikgc2V0UmVzaXplKFwic2UtcmVzaXplXCIpO1xuICAgIGVsc2UgaWYgKGxlZnRDb3JuZXIgJiYgYm90dG9tQ29ybmVyKSBzZXRSZXNpemUoXCJzdy1yZXNpemVcIik7XG4gICAgZWxzZSBpZiAobGVmdENvcm5lciAmJiB0b3BDb3JuZXIpIHNldFJlc2l6ZShcIm53LXJlc2l6ZVwiKTtcbiAgICBlbHNlIGlmICh0b3BDb3JuZXIgJiYgcmlnaHRDb3JuZXIpIHNldFJlc2l6ZShcIm5lLXJlc2l6ZVwiKTtcbiAgICBlbHNlIGlmIChsZWZ0Qm9yZGVyKSBzZXRSZXNpemUoXCJ3LXJlc2l6ZVwiKTtcbiAgICBlbHNlIGlmICh0b3BCb3JkZXIpIHNldFJlc2l6ZShcIm4tcmVzaXplXCIpO1xuICAgIGVsc2UgaWYgKGJvdHRvbUJvcmRlcikgc2V0UmVzaXplKFwicy1yZXNpemVcIik7XG4gICAgZWxzZSBpZiAocmlnaHRCb3JkZXIpIHNldFJlc2l6ZShcImUtcmVzaXplXCIpO1xufVxuIiwgIi8qXG4gX1x0ICAgX19cdCAgXyBfX1xufCB8XHQgLyAvX19fIF8oXykgL19fX19cbnwgfCAvfCAvIC8gX18gYC8gLyAvIF9fXy9cbnwgfC8gfC8gLyAvXy8gLyAvIChfXyAgKVxufF9fL3xfXy9cXF9fLF8vXy9fL19fX18vXG5UaGUgZWxlY3Ryb24gYWx0ZXJuYXRpdmUgZm9yIEdvXG4oYykgTGVhIEFudGhvbnkgMjAxOS1wcmVzZW50XG4qL1xuXG4vKiBqc2hpbnQgZXN2ZXJzaW9uOiA5ICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gUG9zaXRpb25cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBYIC0gVGhlIFggY29vcmRpbmF0ZS5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBZIC0gVGhlIFkgY29vcmRpbmF0ZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFNpemVcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBYIC0gVGhlIHdpZHRoLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IFkgLSBUaGUgaGVpZ2h0LlxuICovXG5cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBSZWN0XG4gKiBAcHJvcGVydHkge251bWJlcn0gWCAtIFRoZSBYIGNvb3JkaW5hdGUgb2YgdGhlIHRvcC1sZWZ0IGNvcm5lci5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBZIC0gVGhlIFkgY29vcmRpbmF0ZSBvZiB0aGUgdG9wLWxlZnQgY29ybmVyLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IFdpZHRoIC0gVGhlIHdpZHRoIG9mIHRoZSByZWN0YW5nbGUuXG4gKiBAcHJvcGVydHkge251bWJlcn0gSGVpZ2h0IC0gVGhlIGhlaWdodCBvZiB0aGUgcmVjdGFuZ2xlLlxuICovXG5cblxuLyoqXG4gKiBAdHlwZWRlZiB7KCdaZXJvJ3wnTmluZXR5J3wnT25lRWlnaHR5J3wnVHdvU2V2ZW50eScpfSBSb3RhdGlvblxuICogVGhlIHJvdGF0aW9uIG9mIHRoZSBzY3JlZW4uIENhbiBiZSBvbmUgb2YgJ1plcm8nLCAnTmluZXR5JywgJ09uZUVpZ2h0eScsICdUd29TZXZlbnR5Jy5cbiAqL1xuXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gU2NyZWVuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gSWQgLSBVbmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHNjcmVlbi5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBOYW1lIC0gSHVtYW4gcmVhZGFibGUgbmFtZSBvZiB0aGUgc2NyZWVuLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IFNjYWxlIC0gVGhlIHJlc29sdXRpb24gc2NhbGUgb2YgdGhlIHNjcmVlbi4gMSA9IHN0YW5kYXJkIHJlc29sdXRpb24sIDIgPSBoaWdoIChSZXRpbmEpLCBldGMuXG4gKiBAcHJvcGVydHkge1Bvc2l0aW9ufSBQb3NpdGlvbiAtIENvbnRhaW5zIHRoZSBYIGFuZCBZIGNvb3JkaW5hdGVzIG9mIHRoZSBzY3JlZW4ncyBwb3NpdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2l6ZX0gU2l6ZSAtIENvbnRhaW5zIHRoZSB3aWR0aCBhbmQgaGVpZ2h0IG9mIHRoZSBzY3JlZW4uXG4gKiBAcHJvcGVydHkge1JlY3R9IEJvdW5kcyAtIENvbnRhaW5zIHRoZSBib3VuZHMgb2YgdGhlIHNjcmVlbiBpbiB0ZXJtcyBvZiBYLCBZLCBXaWR0aCwgYW5kIEhlaWdodC5cbiAqIEBwcm9wZXJ0eSB7UmVjdH0gV29ya0FyZWEgLSBDb250YWlucyB0aGUgYXJlYSBvZiB0aGUgc2NyZWVuIHRoYXQgaXMgYWN0dWFsbHkgdXNhYmxlIChleGNsdWRpbmcgdGFza2JhciBhbmQgb3RoZXIgc3lzdGVtIFVJKS5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gSXNQcmltYXJ5IC0gVHJ1ZSBpZiB0aGlzIGlzIHRoZSBwcmltYXJ5IG1vbml0b3Igc2VsZWN0ZWQgYnkgdGhlIHVzZXIgaW4gdGhlIG9wZXJhdGluZyBzeXN0ZW0uXG4gKiBAcHJvcGVydHkge1JvdGF0aW9ufSBSb3RhdGlvbiAtIFRoZSByb3RhdGlvbiBvZiB0aGUgc2NyZWVuLlxuICovXG5cblxuaW1wb3J0IHtuZXdSdW50aW1lQ2FsbGVyV2l0aElELCBvYmplY3ROYW1lc30gZnJvbSBcIi4vcnVudGltZVwiO1xuY29uc3QgY2FsbCA9IG5ld1J1bnRpbWVDYWxsZXJXaXRoSUQob2JqZWN0TmFtZXMuU2NyZWVucywgJycpO1xuXG5jb25zdCBnZXRBbGwgPSAwO1xuY29uc3QgZ2V0UHJpbWFyeSA9IDE7XG5jb25zdCBnZXRDdXJyZW50ID0gMjtcblxuLyoqXG4gKiBHZXRzIGFsbCBzY3JlZW5zLlxuICogQHJldHVybnMge1Byb21pc2U8U2NyZWVuW10+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byBhbiBhcnJheSBvZiBTY3JlZW4gb2JqZWN0cy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIEdldEFsbCgpIHtcbiAgICByZXR1cm4gY2FsbChnZXRBbGwpO1xufVxuLyoqXG4gKiBHZXRzIHRoZSBwcmltYXJ5IHNjcmVlbi5cbiAqIEByZXR1cm5zIHtQcm9taXNlPFNjcmVlbj59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSBwcmltYXJ5IHNjcmVlbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIEdldFByaW1hcnkoKSB7XG4gICAgcmV0dXJuIGNhbGwoZ2V0UHJpbWFyeSk7XG59XG4vKipcbiAqIEdldHMgdGhlIGN1cnJlbnQgYWN0aXZlIHNjcmVlbi5cbiAqXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxTY3JlZW4+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBjdXJyZW50IGFjdGl2ZSBzY3JlZW4uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBHZXRDdXJyZW50KCkge1xuICAgIHJldHVybiBjYWxsKGdldEN1cnJlbnQpO1xufSIsICIvKlxuIF9cdCAgIF9fXHQgIF8gX19cbnwgfFx0IC8gL19fXyBfKF8pIC9fX19fXG58IHwgL3wgLyAvIF9fIGAvIC8gLyBfX18vXG58IHwvIHwvIC8gL18vIC8gLyAoX18gIClcbnxfXy98X18vXFxfXyxfL18vXy9fX19fL1xuVGhlIGVsZWN0cm9uIGFsdGVybmF0aXZlIGZvciBHb1xuKGMpIExlYSBBbnRob255IDIwMTktcHJlc2VudFxuKi9cblxuLyoganNoaW50IGVzdmVyc2lvbjogOSAqL1xuXG4vLyBJbXBvcnQgc2NyZWVuIGpzZG9jIGRlZmluaXRpb24gZnJvbSAuL3NjcmVlbnMuanNcbi8qKlxuICogQHR5cGVkZWYge2ltcG9ydChcIi4vc2NyZWVuc1wiKS5TY3JlZW59IFNjcmVlblxuICovXG5cbmltcG9ydCB7bmV3UnVudGltZUNhbGxlcldpdGhJRCwgb2JqZWN0TmFtZXN9IGZyb20gXCIuL3J1bnRpbWVcIjtcblxuY29uc3QgY2VudGVyID0gMDtcbmNvbnN0IHNldFRpdGxlID0gMTtcbmNvbnN0IGZ1bGxzY3JlZW4gPSAyO1xuY29uc3QgdW5GdWxsc2NyZWVuID0gMztcbmNvbnN0IHNldFNpemUgPSA0O1xuY29uc3Qgc2l6ZSA9IDU7XG5jb25zdCBzZXRNYXhTaXplID0gNjtcbmNvbnN0IHNldE1pblNpemUgPSA3O1xuY29uc3Qgc2V0QWx3YXlzT25Ub3AgPSA4O1xuY29uc3Qgc2V0UmVsYXRpdmVQb3NpdGlvbiA9IDk7XG5jb25zdCByZWxhdGl2ZVBvc2l0aW9uID0gMTA7XG5jb25zdCBzY3JlZW4gPSAxMTtcbmNvbnN0IGhpZGUgPSAxMjtcbmNvbnN0IG1heGltaXNlID0gMTM7XG5jb25zdCB1bk1heGltaXNlID0gMTQ7XG5jb25zdCB0b2dnbGVNYXhpbWlzZSA9IDE1O1xuY29uc3QgbWluaW1pc2UgPSAxNjtcbmNvbnN0IHVuTWluaW1pc2UgPSAxNztcbmNvbnN0IHJlc3RvcmUgPSAxODtcbmNvbnN0IHNob3cgPSAxOTtcbmNvbnN0IGNsb3NlID0gMjA7XG5jb25zdCBzZXRCYWNrZ3JvdW5kQ29sb3VyID0gMjE7XG5jb25zdCBzZXRSZXNpemFibGUgPSAyMjtcbmNvbnN0IHdpZHRoID0gMjM7XG5jb25zdCBoZWlnaHQgPSAyNDtcbmNvbnN0IHpvb21JbiA9IDI1O1xuY29uc3Qgem9vbU91dCA9IDI2O1xuY29uc3Qgem9vbVJlc2V0ID0gMjc7XG5jb25zdCBnZXRab29tTGV2ZWwgPSAyODtcbmNvbnN0IHNldFpvb21MZXZlbCA9IDI5O1xuXG5jb25zdCB0aGlzV2luZG93ID0gR2V0KCcnKTtcblxuZnVuY3Rpb24gY3JlYXRlV2luZG93KGNhbGwpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBHZXQ6ICh3aW5kb3dOYW1lKSA9PiBjcmVhdGVXaW5kb3cobmV3UnVudGltZUNhbGxlcldpdGhJRChvYmplY3ROYW1lcy5XaW5kb3csIHdpbmRvd05hbWUpKSxcbiAgICAgICAgQ2VudGVyOiAoKSA9PiBjYWxsKGNlbnRlciksXG4gICAgICAgIFNldFRpdGxlOiAodGl0bGUpID0+IGNhbGwoc2V0VGl0bGUsIHt0aXRsZX0pLFxuICAgICAgICBGdWxsc2NyZWVuOiAoKSA9PiBjYWxsKGZ1bGxzY3JlZW4pLFxuICAgICAgICBVbkZ1bGxzY3JlZW46ICgpID0+IGNhbGwodW5GdWxsc2NyZWVuKSxcbiAgICAgICAgU2V0U2l6ZTogKHdpZHRoLCBoZWlnaHQpID0+IGNhbGwoc2V0U2l6ZSwge3dpZHRoLCBoZWlnaHR9KSxcbiAgICAgICAgU2l6ZTogKCkgPT4gY2FsbChzaXplKSxcbiAgICAgICAgU2V0TWF4U2l6ZTogKHdpZHRoLCBoZWlnaHQpID0+IGNhbGwoc2V0TWF4U2l6ZSwge3dpZHRoLCBoZWlnaHR9KSxcbiAgICAgICAgU2V0TWluU2l6ZTogKHdpZHRoLCBoZWlnaHQpID0+IGNhbGwoc2V0TWluU2l6ZSwge3dpZHRoLCBoZWlnaHR9KSxcbiAgICAgICAgU2V0QWx3YXlzT25Ub3A6IChvblRvcCkgPT4gY2FsbChzZXRBbHdheXNPblRvcCwge2Fsd2F5c09uVG9wOiBvblRvcH0pLFxuICAgICAgICBTZXRSZWxhdGl2ZVBvc2l0aW9uOiAoeCwgeSkgPT4gY2FsbChzZXRSZWxhdGl2ZVBvc2l0aW9uLCB7eCwgeX0pLFxuICAgICAgICBSZWxhdGl2ZVBvc2l0aW9uOiAoKSA9PiBjYWxsKHJlbGF0aXZlUG9zaXRpb24pLFxuICAgICAgICBTY3JlZW46ICgpID0+IGNhbGwoc2NyZWVuKSxcbiAgICAgICAgSGlkZTogKCkgPT4gY2FsbChoaWRlKSxcbiAgICAgICAgTWF4aW1pc2U6ICgpID0+IGNhbGwobWF4aW1pc2UpLFxuICAgICAgICBVbk1heGltaXNlOiAoKSA9PiBjYWxsKHVuTWF4aW1pc2UpLFxuICAgICAgICBUb2dnbGVNYXhpbWlzZTogKCkgPT4gY2FsbCh0b2dnbGVNYXhpbWlzZSksXG4gICAgICAgIE1pbmltaXNlOiAoKSA9PiBjYWxsKG1pbmltaXNlKSxcbiAgICAgICAgVW5NaW5pbWlzZTogKCkgPT4gY2FsbCh1bk1pbmltaXNlKSxcbiAgICAgICAgUmVzdG9yZTogKCkgPT4gY2FsbChyZXN0b3JlKSxcbiAgICAgICAgU2hvdzogKCkgPT4gY2FsbChzaG93KSxcbiAgICAgICAgQ2xvc2U6ICgpID0+IGNhbGwoY2xvc2UpLFxuICAgICAgICBTZXRCYWNrZ3JvdW5kQ29sb3VyOiAociwgZywgYiwgYSkgPT4gY2FsbChzZXRCYWNrZ3JvdW5kQ29sb3VyLCB7ciwgZywgYiwgYX0pLFxuICAgICAgICBTZXRSZXNpemFibGU6IChyZXNpemFibGUpID0+IGNhbGwoc2V0UmVzaXphYmxlLCB7cmVzaXphYmxlfSksXG4gICAgICAgIFdpZHRoOiAoKSA9PiBjYWxsKHdpZHRoKSxcbiAgICAgICAgSGVpZ2h0OiAoKSA9PiBjYWxsKGhlaWdodCksXG4gICAgICAgIFpvb21JbjogKCkgPT4gY2FsbCh6b29tSW4pLFxuICAgICAgICBab29tT3V0OiAoKSA9PiBjYWxsKHpvb21PdXQpLFxuICAgICAgICBab29tUmVzZXQ6ICgpID0+IGNhbGwoem9vbVJlc2V0KSxcbiAgICAgICAgR2V0Wm9vbUxldmVsOiAoKSA9PiBjYWxsKGdldFpvb21MZXZlbCksXG4gICAgICAgIFNldFpvb21MZXZlbDogKHpvb21MZXZlbCkgPT4gY2FsbChzZXRab29tTGV2ZWwsIHt6b29tTGV2ZWx9KSxcbiAgICB9O1xufVxuXG4vKipcbiAqIEdldHMgdGhlIHNwZWNpZmllZCB3aW5kb3cuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHdpbmRvd05hbWUgLSBUaGUgbmFtZSBvZiB0aGUgd2luZG93IHRvIGdldC5cbiAqIEByZXR1cm4ge09iamVjdH0gLSBUaGUgc3BlY2lmaWVkIHdpbmRvdyBvYmplY3QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBHZXQod2luZG93TmFtZSkge1xuICAgIHJldHVybiBjcmVhdGVXaW5kb3cobmV3UnVudGltZUNhbGxlcldpdGhJRChvYmplY3ROYW1lcy5XaW5kb3csIHdpbmRvd05hbWUpKTtcbn1cblxuLyoqXG4gKiBDZW50ZXJzIHRoZSB3aW5kb3cgb24gdGhlIHNjcmVlbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIENlbnRlcigpIHtcbiAgICB0aGlzV2luZG93LkNlbnRlcigpO1xufVxuXG4vKipcbiAqIFNldHMgdGhlIHRpdGxlIG9mIHRoZSB3aW5kb3cuXG4gKiBAcGFyYW0ge3N0cmluZ30gdGl0bGUgLSBUaGUgdGl0bGUgdG8gc2V0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gU2V0VGl0bGUodGl0bGUpIHtcbiAgICB0aGlzV2luZG93LlNldFRpdGxlKHRpdGxlKTtcbn1cblxuLyoqXG4gKiBTZXRzIHRoZSB3aW5kb3cgdG8gZnVsbHNjcmVlbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIEZ1bGxzY3JlZW4oKSB7XG4gICAgdGhpc1dpbmRvdy5GdWxsc2NyZWVuKCk7XG59XG5cbi8qKlxuICogU2V0cyB0aGUgc2l6ZSBvZiB0aGUgd2luZG93LlxuICogQHBhcmFtIHtudW1iZXJ9IHdpZHRoIC0gVGhlIHdpZHRoIG9mIHRoZSB3aW5kb3cuXG4gKiBAcGFyYW0ge251bWJlcn0gaGVpZ2h0IC0gVGhlIGhlaWdodCBvZiB0aGUgd2luZG93LlxuICovXG5leHBvcnQgZnVuY3Rpb24gU2V0U2l6ZSh3aWR0aCwgaGVpZ2h0KSB7XG4gICAgdGhpc1dpbmRvdy5TZXRTaXplKHdpZHRoLCBoZWlnaHQpO1xufVxuXG4vKipcbiAqIEdldHMgdGhlIHNpemUgb2YgdGhlIHdpbmRvdy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFNpemUoKSB7XG4gICAgcmV0dXJuIHRoaXNXaW5kb3cuU2l6ZSgpO1xufVxuXG4vKipcbiAqIFNldHMgdGhlIG1heGltdW0gc2l6ZSBvZiB0aGUgd2luZG93LlxuICogQHBhcmFtIHtudW1iZXJ9IHdpZHRoIC0gVGhlIG1heGltdW0gd2lkdGggb2YgdGhlIHdpbmRvdy5cbiAqIEBwYXJhbSB7bnVtYmVyfSBoZWlnaHQgLSBUaGUgbWF4aW11bSBoZWlnaHQgb2YgdGhlIHdpbmRvdy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFNldE1heFNpemUod2lkdGgsIGhlaWdodCkge1xuICAgIHRoaXNXaW5kb3cuU2V0TWF4U2l6ZSh3aWR0aCwgaGVpZ2h0KTtcbn1cblxuLyoqXG4gKiBTZXRzIHRoZSBtaW5pbXVtIHNpemUgb2YgdGhlIHdpbmRvdy5cbiAqIEBwYXJhbSB7bnVtYmVyfSB3aWR0aCAtIFRoZSBtaW5pbXVtIHdpZHRoIG9mIHRoZSB3aW5kb3cuXG4gKiBAcGFyYW0ge251bWJlcn0gaGVpZ2h0IC0gVGhlIG1pbmltdW0gaGVpZ2h0IG9mIHRoZSB3aW5kb3cuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBTZXRNaW5TaXplKHdpZHRoLCBoZWlnaHQpIHtcbiAgICB0aGlzV2luZG93LlNldE1pblNpemUod2lkdGgsIGhlaWdodCk7XG59XG5cbi8qKlxuICogU2V0cyB0aGUgd2luZG93IHRvIGFsd2F5cyBiZSBvbiB0b3AuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IG9uVG9wIC0gV2hldGhlciB0aGUgd2luZG93IHNob3VsZCBhbHdheXMgYmUgb24gdG9wLlxuICovXG5leHBvcnQgZnVuY3Rpb24gU2V0QWx3YXlzT25Ub3Aob25Ub3ApIHtcbiAgICB0aGlzV2luZG93LlNldEFsd2F5c09uVG9wKG9uVG9wKTtcbn1cblxuLyoqXG4gKiBTZXRzIHRoZSByZWxhdGl2ZSBwb3NpdGlvbiBvZiB0aGUgd2luZG93LlxuICogQHBhcmFtIHtudW1iZXJ9IHggLSBUaGUgeC1jb29yZGluYXRlIG9mIHRoZSB3aW5kb3cncyBwb3NpdGlvbi5cbiAqIEBwYXJhbSB7bnVtYmVyfSB5IC0gVGhlIHktY29vcmRpbmF0ZSBvZiB0aGUgd2luZG93J3MgcG9zaXRpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBTZXRSZWxhdGl2ZVBvc2l0aW9uKHgsIHkpIHtcbiAgICB0aGlzV2luZG93LlNldFJlbGF0aXZlUG9zaXRpb24oeCwgeSk7XG59XG5cbi8qKlxuICogR2V0cyB0aGUgcmVsYXRpdmUgcG9zaXRpb24gb2YgdGhlIHdpbmRvdy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFJlbGF0aXZlUG9zaXRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXNXaW5kb3cuUmVsYXRpdmVQb3NpdGlvbigpO1xufVxuXG4vKipcbiAqIEdldHMgdGhlIHNjcmVlbiB0aGF0IHRoZSB3aW5kb3cgaXMgb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBTY3JlZW4oKSB7XG4gICAgcmV0dXJuIHRoaXNXaW5kb3cuU2NyZWVuKCk7XG59XG5cbi8qKlxuICogSGlkZXMgdGhlIHdpbmRvdy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIEhpZGUoKSB7XG4gICAgdGhpc1dpbmRvdy5IaWRlKCk7XG59XG5cbi8qKlxuICogTWF4aW1pc2VzIHRoZSB3aW5kb3cuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBNYXhpbWlzZSgpIHtcbiAgICB0aGlzV2luZG93Lk1heGltaXNlKCk7XG59XG5cbi8qKlxuICogVW4tbWF4aW1pc2VzIHRoZSB3aW5kb3cuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBVbk1heGltaXNlKCkge1xuICAgIHRoaXNXaW5kb3cuVW5NYXhpbWlzZSgpO1xufVxuXG4vKipcbiAqIFRvZ2dsZXMgdGhlIG1heGltaXNhdGlvbiBvZiB0aGUgd2luZG93LlxuICovXG5leHBvcnQgZnVuY3Rpb24gVG9nZ2xlTWF4aW1pc2UoKSB7XG4gICAgdGhpc1dpbmRvdy5Ub2dnbGVNYXhpbWlzZSgpO1xufVxuXG4vKipcbiAqIE1pbmltaXNlcyB0aGUgd2luZG93LlxuICovXG5leHBvcnQgZnVuY3Rpb24gTWluaW1pc2UoKSB7XG4gICAgdGhpc1dpbmRvdy5NaW5pbWlzZSgpO1xufVxuXG4vKipcbiAqIFVuLW1pbmltaXNlcyB0aGUgd2luZG93LlxuICovXG5leHBvcnQgZnVuY3Rpb24gVW5NaW5pbWlzZSgpIHtcbiAgICB0aGlzV2luZG93LlVuTWluaW1pc2UoKTtcbn1cblxuLyoqXG4gKiBSZXN0b3JlcyB0aGUgd2luZG93LlxuICovXG5leHBvcnQgZnVuY3Rpb24gUmVzdG9yZSgpIHtcbiAgICB0aGlzV2luZG93LlJlc3RvcmUoKTtcbn1cblxuLyoqXG4gKiBTaG93cyB0aGUgd2luZG93LlxuICovXG5leHBvcnQgZnVuY3Rpb24gU2hvdygpIHtcbiAgICB0aGlzV2luZG93LlNob3coKTtcbn1cblxuLyoqXG4gKiBDbG9zZXMgdGhlIHdpbmRvdy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIENsb3NlKCkge1xuICAgIHRoaXNXaW5kb3cuQ2xvc2UoKTtcbn1cblxuLyoqXG4gKiBTZXRzIHRoZSBiYWNrZ3JvdW5kIGNvbG91ciBvZiB0aGUgd2luZG93LlxuICogQHBhcmFtIHtudW1iZXJ9IHIgLSBUaGUgcmVkIGNvbXBvbmVudCBvZiB0aGUgY29sb3VyLlxuICogQHBhcmFtIHtudW1iZXJ9IGcgLSBUaGUgZ3JlZW4gY29tcG9uZW50IG9mIHRoZSBjb2xvdXIuXG4gKiBAcGFyYW0ge251bWJlcn0gYiAtIFRoZSBibHVlIGNvbXBvbmVudCBvZiB0aGUgY29sb3VyLlxuICogQHBhcmFtIHtudW1iZXJ9IGEgLSBUaGUgYWxwaGEgY29tcG9uZW50IG9mIHRoZSBjb2xvdXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBTZXRCYWNrZ3JvdW5kQ29sb3VyKHIsIGcsIGIsIGEpIHtcbiAgICB0aGlzV2luZG93LlNldEJhY2tncm91bmRDb2xvdXIociwgZywgYiwgYSk7XG59XG5cbi8qKlxuICogU2V0cyB3aGV0aGVyIHRoZSB3aW5kb3cgaXMgcmVzaXphYmxlLlxuICogQHBhcmFtIHtib29sZWFufSByZXNpemFibGUgLSBXaGV0aGVyIHRoZSB3aW5kb3cgc2hvdWxkIGJlIHJlc2l6YWJsZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFNldFJlc2l6YWJsZShyZXNpemFibGUpIHtcbiAgICB0aGlzV2luZG93LlNldFJlc2l6YWJsZShyZXNpemFibGUpO1xufVxuXG4vKipcbiAqIEdldHMgdGhlIHdpZHRoIG9mIHRoZSB3aW5kb3cuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBXaWR0aCgpIHtcbiAgICByZXR1cm4gdGhpc1dpbmRvdy5XaWR0aCgpO1xufVxuXG4vKipcbiAqIEdldHMgdGhlIGhlaWdodCBvZiB0aGUgd2luZG93LlxuICovXG5leHBvcnQgZnVuY3Rpb24gSGVpZ2h0KCkge1xuICAgIHJldHVybiB0aGlzV2luZG93LkhlaWdodCgpO1xufVxuXG4vKipcbiAqIFpvb21zIGluIHRoZSB3aW5kb3cuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBab29tSW4oKSB7XG4gICAgdGhpc1dpbmRvdy5ab29tSW4oKTtcbn1cblxuLyoqXG4gKiBab29tcyBvdXQgdGhlIHdpbmRvdy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFpvb21PdXQoKSB7XG4gICAgdGhpc1dpbmRvdy5ab29tT3V0KCk7XG59XG5cbi8qKlxuICogUmVzZXRzIHRoZSB6b29tIG9mIHRoZSB3aW5kb3cuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBab29tUmVzZXQoKSB7XG4gICAgdGhpc1dpbmRvdy5ab29tUmVzZXQoKTtcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSB6b29tIGxldmVsIG9mIHRoZSB3aW5kb3cuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBHZXRab29tTGV2ZWwoKSB7XG4gICAgcmV0dXJuIHRoaXNXaW5kb3cuR2V0Wm9vbUxldmVsKCk7XG59XG5cbi8qKlxuICogU2V0cyB0aGUgem9vbSBsZXZlbCBvZiB0aGUgd2luZG93LlxuICogQHBhcmFtIHtudW1iZXJ9IHpvb21MZXZlbCAtIFRoZSB6b29tIGxldmVsIHRvIHNldC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFNldFpvb21MZXZlbCh6b29tTGV2ZWwpIHtcbiAgICB0aGlzV2luZG93LlNldFpvb21MZXZlbCh6b29tTGV2ZWwpO1xufVxuIiwgIlxuaW1wb3J0IHtFbWl0LCBXYWlsc0V2ZW50fSBmcm9tIFwiLi9ldmVudHNcIjtcbmltcG9ydCB7UXVlc3Rpb259IGZyb20gXCIuL2RpYWxvZ3NcIjtcbmltcG9ydCB7R2V0fSBmcm9tIFwiLi93aW5kb3dcIjtcbmltcG9ydCB7T3BlblVSTH0gZnJvbSBcIi4vYnJvd3NlclwiO1xuXG4vKipcbiAqIFNlbmRzIGFuIGV2ZW50IHdpdGggdGhlIGdpdmVuIG5hbWUgYW5kIG9wdGlvbmFsIGRhdGEuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBldmVudCB0byBzZW5kLlxuICogQHBhcmFtIHthbnl9IFtkYXRhPW51bGxdIC0gT3B0aW9uYWwgZGF0YSB0byBzZW5kIGFsb25nIHdpdGggdGhlIGV2ZW50LlxuICpcbiAqIEByZXR1cm4ge3ZvaWR9XG4gKi9cbmZ1bmN0aW9uIHNlbmRFdmVudChldmVudE5hbWUsIGRhdGE9bnVsbCkge1xuICAgIGxldCBldmVudCA9IG5ldyBXYWlsc0V2ZW50KGV2ZW50TmFtZSwgZGF0YSk7XG4gICAgRW1pdChldmVudCk7XG59XG5cbi8qKlxuICogQWRkcyBldmVudCBsaXN0ZW5lcnMgdG8gZWxlbWVudHMgd2l0aCBgd21sLWV2ZW50YCBhdHRyaWJ1dGUuXG4gKlxuICogQHJldHVybiB7dm9pZH1cbiAqL1xuZnVuY3Rpb24gYWRkV01MRXZlbnRMaXN0ZW5lcnMoKSB7XG4gICAgY29uc3QgZWxlbWVudHMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdbd21sLWV2ZW50XScpO1xuICAgIGVsZW1lbnRzLmZvckVhY2goZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICAgICAgY29uc3QgZXZlbnRUeXBlID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ3dtbC1ldmVudCcpO1xuICAgICAgICBjb25zdCBjb25maXJtID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ3dtbC1jb25maXJtJyk7XG4gICAgICAgIGNvbnN0IHRyaWdnZXIgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgnd21sLXRyaWdnZXInKSB8fCBcImNsaWNrXCI7XG5cbiAgICAgICAgbGV0IGNhbGxiYWNrID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKGNvbmZpcm0pIHtcbiAgICAgICAgICAgICAgICBRdWVzdGlvbih7VGl0bGU6IFwiQ29uZmlybVwiLCBNZXNzYWdlOmNvbmZpcm0sIERldGFjaGVkOiBmYWxzZSwgQnV0dG9uczpbe0xhYmVsOlwiWWVzXCJ9LHtMYWJlbDpcIk5vXCIsIElzRGVmYXVsdDp0cnVlfV19KS50aGVuKGZ1bmN0aW9uIChyZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCAhPT0gXCJOb1wiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZW5kRXZlbnQoZXZlbnRUeXBlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNlbmRFdmVudChldmVudFR5cGUpO1xuICAgICAgICB9O1xuXG4gICAgICAgIC8vIFJlbW92ZSBleGlzdGluZyBsaXN0ZW5lcnNcbiAgICAgICAgZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKHRyaWdnZXIsIGNhbGxiYWNrKTtcblxuICAgICAgICAvLyBBZGQgbmV3IGxpc3RlbmVyXG4gICAgICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcih0cmlnZ2VyLCBjYWxsYmFjayk7XG4gICAgfSk7XG59XG5cblxuLyoqXG4gKiBDYWxscyBhIG1ldGhvZCBvbiBhIHNwZWNpZmllZCB3aW5kb3cuXG4gKiBAcGFyYW0ge3N0cmluZ30gd2luZG93TmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB3aW5kb3cgdG8gY2FsbCB0aGUgbWV0aG9kIG9uLlxuICogQHBhcmFtIHtzdHJpbmd9IG1ldGhvZCAtIFRoZSBuYW1lIG9mIHRoZSBtZXRob2QgdG8gY2FsbC5cbiAqL1xuZnVuY3Rpb24gY2FsbFdpbmRvd01ldGhvZCh3aW5kb3dOYW1lLCBtZXRob2QpIHtcbiAgICBsZXQgdGFyZ2V0V2luZG93ID0gR2V0KHdpbmRvd05hbWUpO1xuICAgIGxldCBtZXRob2RNYXAgPSBXaW5kb3dNZXRob2RzKHRhcmdldFdpbmRvdyk7XG4gICAgaWYgKCFtZXRob2RNYXAuaGFzKG1ldGhvZCkpIHtcbiAgICAgICAgY29uc29sZS5sb2coXCJXaW5kb3cgbWV0aG9kIFwiICsgbWV0aG9kICsgXCIgbm90IGZvdW5kXCIpO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICBtZXRob2RNYXAuZ2V0KG1ldGhvZCkoKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciBjYWxsaW5nIHdpbmRvdyBtZXRob2QgJ1wiICsgbWV0aG9kICsgXCInOiBcIiArIGUpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBBZGRzIHdpbmRvdyBsaXN0ZW5lcnMgZm9yIGVsZW1lbnRzIHdpdGggdGhlICd3bWwtd2luZG93JyBhdHRyaWJ1dGUuXG4gKiBSZW1vdmVzIGFueSBleGlzdGluZyBsaXN0ZW5lcnMgYmVmb3JlIGFkZGluZyBuZXcgb25lcy5cbiAqXG4gKiBAcmV0dXJuIHt2b2lkfVxuICovXG5mdW5jdGlvbiBhZGRXTUxXaW5kb3dMaXN0ZW5lcnMoKSB7XG4gICAgY29uc3QgZWxlbWVudHMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdbd21sLXdpbmRvd10nKTtcbiAgICBlbGVtZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICAgIGNvbnN0IHdpbmRvd01ldGhvZCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCd3bWwtd2luZG93Jyk7XG4gICAgICAgIGNvbnN0IGNvbmZpcm0gPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgnd21sLWNvbmZpcm0nKTtcbiAgICAgICAgY29uc3QgdHJpZ2dlciA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCd3bWwtdHJpZ2dlcicpIHx8ICdjbGljayc7XG4gICAgICAgIGNvbnN0IHRhcmdldFdpbmRvdyA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCd3bWwtdGFyZ2V0LXdpbmRvdycpIHx8ICcnO1xuXG4gICAgICAgIGxldCBjYWxsYmFjayA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmIChjb25maXJtKSB7XG4gICAgICAgICAgICAgICAgUXVlc3Rpb24oe1RpdGxlOiBcIkNvbmZpcm1cIiwgTWVzc2FnZTpjb25maXJtLCBCdXR0b25zOlt7TGFiZWw6XCJZZXNcIn0se0xhYmVsOlwiTm9cIiwgSXNEZWZhdWx0OnRydWV9XX0pLnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0ICE9PSBcIk5vXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxXaW5kb3dNZXRob2QodGFyZ2V0V2luZG93LCB3aW5kb3dNZXRob2QpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FsbFdpbmRvd01ldGhvZCh0YXJnZXRXaW5kb3csIHdpbmRvd01ldGhvZCk7XG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gUmVtb3ZlIGV4aXN0aW5nIGxpc3RlbmVyc1xuICAgICAgICBlbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIodHJpZ2dlciwgY2FsbGJhY2spO1xuXG4gICAgICAgIC8vIEFkZCBuZXcgbGlzdGVuZXJcbiAgICAgICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKHRyaWdnZXIsIGNhbGxiYWNrKTtcbiAgICB9KTtcbn1cblxuLyoqXG4gKiBBZGRzIGEgbGlzdGVuZXIgdG8gZWxlbWVudHMgd2l0aCB0aGUgJ3dtbC1vcGVudXJsJyBhdHRyaWJ1dGUuXG4gKiBXaGVuIHRoZSBzcGVjaWZpZWQgdHJpZ2dlciBldmVudCBpcyBmaXJlZCBvbiBhbnkgb2YgdGhlc2UgZWxlbWVudHMsXG4gKiB0aGUgbGlzdGVuZXIgd2lsbCBvcGVuIHRoZSBVUkwgc3BlY2lmaWVkIGJ5IHRoZSAnd21sLW9wZW51cmwnIGF0dHJpYnV0ZS5cbiAqIElmIGEgJ3dtbC1jb25maXJtJyBhdHRyaWJ1dGUgaXMgcHJvdmlkZWQsIGEgY29uZmlybWF0aW9uIGRpYWxvZyB3aWxsIGJlIGRpc3BsYXllZCxcbiAqIGFuZCB0aGUgVVJMIHdpbGwgb25seSBiZSBvcGVuZWQgaWYgdGhlIHVzZXIgY29uZmlybXMuXG4gKlxuICogQHJldHVybiB7dm9pZH1cbiAqL1xuZnVuY3Rpb24gYWRkV01MT3BlbkJyb3dzZXJMaXN0ZW5lcigpIHtcbiAgICBjb25zdCBlbGVtZW50cyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1t3bWwtb3BlbnVybF0nKTtcbiAgICBlbGVtZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICAgIGNvbnN0IHVybCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCd3bWwtb3BlbnVybCcpO1xuICAgICAgICBjb25zdCBjb25maXJtID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ3dtbC1jb25maXJtJyk7XG4gICAgICAgIGNvbnN0IHRyaWdnZXIgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgnd21sLXRyaWdnZXInKSB8fCBcImNsaWNrXCI7XG5cbiAgICAgICAgbGV0IGNhbGxiYWNrID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKGNvbmZpcm0pIHtcbiAgICAgICAgICAgICAgICBRdWVzdGlvbih7VGl0bGU6IFwiQ29uZmlybVwiLCBNZXNzYWdlOmNvbmZpcm0sIEJ1dHRvbnM6W3tMYWJlbDpcIlllc1wifSx7TGFiZWw6XCJOb1wiLCBJc0RlZmF1bHQ6dHJ1ZX1dfSkudGhlbihmdW5jdGlvbiAocmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgIT09IFwiTm9cIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCBPcGVuVVJMKHVybCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2b2lkIE9wZW5VUkwodXJsKTtcbiAgICAgICAgfTtcblxuICAgICAgICAvLyBSZW1vdmUgZXhpc3RpbmcgbGlzdGVuZXJzXG4gICAgICAgIGVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcih0cmlnZ2VyLCBjYWxsYmFjayk7XG5cbiAgICAgICAgLy8gQWRkIG5ldyBsaXN0ZW5lclxuICAgICAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIodHJpZ2dlciwgY2FsbGJhY2spO1xuICAgIH0pO1xufVxuXG4vKipcbiAqIFJlbG9hZHMgdGhlIFdNTCBwYWdlIGJ5IGFkZGluZyBuZWNlc3NhcnkgZXZlbnQgbGlzdGVuZXJzIGFuZCBicm93c2VyIGxpc3RlbmVycy5cbiAqXG4gKiBAcmV0dXJuIHt2b2lkfVxuICovXG5leHBvcnQgZnVuY3Rpb24gUmVsb2FkKCkge1xuICAgIGFkZFdNTEV2ZW50TGlzdGVuZXJzKCk7XG4gICAgYWRkV01MV2luZG93TGlzdGVuZXJzKCk7XG4gICAgYWRkV01MT3BlbkJyb3dzZXJMaXN0ZW5lcigpO1xufVxuXG4vKipcbiAqIFJldHVybnMgYSBtYXAgb2YgYWxsIG1ldGhvZHMgaW4gdGhlIGN1cnJlbnQgd2luZG93LlxuICogQHJldHVybnMge01hcH0gLSBBIG1hcCBvZiB3aW5kb3cgbWV0aG9kcy5cbiAqL1xuZnVuY3Rpb24gV2luZG93TWV0aG9kcyh0YXJnZXRXaW5kb3cpIHtcbiAgICAvLyBDcmVhdGUgYSBuZXcgbWFwIHRvIHN0b3JlIG1ldGhvZHNcbiAgICBsZXQgcmVzdWx0ID0gbmV3IE1hcCgpO1xuXG4gICAgLy8gSXRlcmF0ZSBvdmVyIGFsbCBwcm9wZXJ0aWVzIG9mIHRoZSB3aW5kb3cgb2JqZWN0XG4gICAgZm9yIChsZXQgbWV0aG9kIGluIHRhcmdldFdpbmRvdykge1xuICAgICAgICAvLyBDaGVjayBpZiB0aGUgcHJvcGVydHkgaXMgaW5kZWVkIGEgbWV0aG9kIChmdW5jdGlvbilcbiAgICAgICAgaWYodHlwZW9mIHRhcmdldFdpbmRvd1ttZXRob2RdID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAvLyBBZGQgdGhlIG1ldGhvZCB0byB0aGUgbWFwXG4gICAgICAgICAgICByZXN1bHQuc2V0KG1ldGhvZCwgdGFyZ2V0V2luZG93W21ldGhvZF0pO1xuICAgICAgICB9XG5cbiAgICB9XG4gICAgLy8gUmV0dXJuIHRoZSBtYXAgb2Ygd2luZG93IG1ldGhvZHNcbiAgICByZXR1cm4gcmVzdWx0O1xufSIsICIvKlxuIF9cdCAgIF9fXHQgIF8gX19cbnwgfFx0IC8gL19fXyBfKF8pIC9fX19fXG58IHwgL3wgLyAvIF9fIGAvIC8gLyBfX18vXG58IHwvIHwvIC8gL18vIC8gLyAoX18gIClcbnxfXy98X18vXFxfXyxfL18vXy9fX19fL1xuVGhlIGVsZWN0cm9uIGFsdGVybmF0aXZlIGZvciBHb1xuKGMpIExlYSBBbnRob255IDIwMTktcHJlc2VudFxuKi9cblxuLyoganNoaW50IGVzdmVyc2lvbjogOSAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtpbXBvcnQoXCIuL3R5cGVzXCIpLldhaWxzRXZlbnR9IFdhaWxzRXZlbnRcbiAqL1xuaW1wb3J0IHtuZXdSdW50aW1lQ2FsbGVyV2l0aElELCBvYmplY3ROYW1lc30gZnJvbSBcIi4vcnVudGltZVwiO1xuXG5pbXBvcnQge0V2ZW50VHlwZXN9IGZyb20gXCIuL2V2ZW50X3R5cGVzXCI7XG5leHBvcnQgY29uc3QgVHlwZXMgPSBFdmVudFR5cGVzO1xuXG4vLyBTZXR1cFxud2luZG93Ll93YWlscyA9IHdpbmRvdy5fd2FpbHMgfHwge307XG53aW5kb3cuX3dhaWxzLmRpc3BhdGNoV2FpbHNFdmVudCA9IGRpc3BhdGNoV2FpbHNFdmVudDtcblxuY29uc3QgY2FsbCA9IG5ld1J1bnRpbWVDYWxsZXJXaXRoSUQob2JqZWN0TmFtZXMuRXZlbnRzLCAnJyk7XG5jb25zdCBFbWl0TWV0aG9kID0gMDtcbmNvbnN0IGV2ZW50TGlzdGVuZXJzID0gbmV3IE1hcCgpO1xuXG5jbGFzcyBMaXN0ZW5lciB7XG4gICAgY29uc3RydWN0b3IoZXZlbnROYW1lLCBjYWxsYmFjaywgbWF4Q2FsbGJhY2tzKSB7XG4gICAgICAgIHRoaXMuZXZlbnROYW1lID0gZXZlbnROYW1lO1xuICAgICAgICB0aGlzLm1heENhbGxiYWNrcyA9IG1heENhbGxiYWNrcyB8fCAtMTtcbiAgICAgICAgdGhpcy5DYWxsYmFjayA9IChkYXRhKSA9PiB7XG4gICAgICAgICAgICBjYWxsYmFjayhkYXRhKTtcbiAgICAgICAgICAgIGlmICh0aGlzLm1heENhbGxiYWNrcyA9PT0gLTEpIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMubWF4Q2FsbGJhY2tzIC09IDE7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5tYXhDYWxsYmFja3MgPT09IDA7XG4gICAgICAgIH07XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgV2FpbHNFdmVudCB7XG4gICAgY29uc3RydWN0b3IobmFtZSwgZGF0YSA9IG51bGwpIHtcbiAgICAgICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICAgICAgdGhpcy5kYXRhID0gZGF0YTtcbiAgICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXR1cCgpIHtcbn1cblxuZnVuY3Rpb24gZGlzcGF0Y2hXYWlsc0V2ZW50KGV2ZW50KSB7XG4gICAgbGV0IGxpc3RlbmVycyA9IGV2ZW50TGlzdGVuZXJzLmdldChldmVudC5uYW1lKTtcbiAgICBpZiAobGlzdGVuZXJzKSB7XG4gICAgICAgIGxldCB0b1JlbW92ZSA9IGxpc3RlbmVycy5maWx0ZXIobGlzdGVuZXIgPT4ge1xuICAgICAgICAgICAgbGV0IHJlbW92ZSA9IGxpc3RlbmVyLkNhbGxiYWNrKGV2ZW50KTtcbiAgICAgICAgICAgIGlmIChyZW1vdmUpIHJldHVybiB0cnVlO1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHRvUmVtb3ZlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGxpc3RlbmVycyA9IGxpc3RlbmVycy5maWx0ZXIobCA9PiAhdG9SZW1vdmUuaW5jbHVkZXMobCkpO1xuICAgICAgICAgICAgaWYgKGxpc3RlbmVycy5sZW5ndGggPT09IDApIGV2ZW50TGlzdGVuZXJzLmRlbGV0ZShldmVudC5uYW1lKTtcbiAgICAgICAgICAgIGVsc2UgZXZlbnRMaXN0ZW5lcnMuc2V0KGV2ZW50Lm5hbWUsIGxpc3RlbmVycyk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbi8qKlxuICogUmVnaXN0ZXIgYSBjYWxsYmFjayBmdW5jdGlvbiB0byBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMgZm9yIGEgc3BlY2lmaWMgZXZlbnQuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBldmVudCB0byByZWdpc3RlciB0aGUgY2FsbGJhY2sgZm9yLlxuICogQHBhcmFtIHtmdW5jdGlvbn0gY2FsbGJhY2sgLSBUaGUgY2FsbGJhY2sgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIHdoZW4gdGhlIGV2ZW50IGlzIHRyaWdnZXJlZC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBtYXhDYWxsYmFja3MgLSBUaGUgbWF4aW11bSBudW1iZXIgb2YgdGltZXMgdGhlIGNhbGxiYWNrIGNhbiBiZSBjYWxsZWQgZm9yIHRoZSBldmVudC4gT25jZSB0aGUgbWF4aW11bSBudW1iZXIgaXMgcmVhY2hlZCwgdGhlIGNhbGxiYWNrIHdpbGwgbm8gbG9uZ2VyIGJlIGNhbGxlZC5cbiAqXG4gQHJldHVybiB7ZnVuY3Rpb259IC0gQSBmdW5jdGlvbiB0aGF0LCB3aGVuIGNhbGxlZCwgd2lsbCB1bnJlZ2lzdGVyIHRoZSBjYWxsYmFjayBmcm9tIHRoZSBldmVudC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIE9uTXVsdGlwbGUoZXZlbnROYW1lLCBjYWxsYmFjaywgbWF4Q2FsbGJhY2tzKSB7XG4gICAgbGV0IGxpc3RlbmVycyA9IGV2ZW50TGlzdGVuZXJzLmdldChldmVudE5hbWUpIHx8IFtdO1xuICAgIGNvbnN0IHRoaXNMaXN0ZW5lciA9IG5ldyBMaXN0ZW5lcihldmVudE5hbWUsIGNhbGxiYWNrLCBtYXhDYWxsYmFja3MpO1xuICAgIGxpc3RlbmVycy5wdXNoKHRoaXNMaXN0ZW5lcik7XG4gICAgZXZlbnRMaXN0ZW5lcnMuc2V0KGV2ZW50TmFtZSwgbGlzdGVuZXJzKTtcbiAgICByZXR1cm4gKCkgPT4gbGlzdGVuZXJPZmYodGhpc0xpc3RlbmVyKTtcbn1cblxuLyoqXG4gKiBSZWdpc3RlcnMgYSBjYWxsYmFjayBmdW5jdGlvbiB0byBiZSBleGVjdXRlZCB3aGVuIHRoZSBzcGVjaWZpZWQgZXZlbnQgb2NjdXJzLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBldmVudE5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgZXZlbnQuXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBjYWxsYmFjayAtIFRoZSBjYWxsYmFjayBmdW5jdGlvbiB0byBiZSBleGVjdXRlZC4gSXQgdGFrZXMgbm8gcGFyYW1ldGVycy5cbiAqIEByZXR1cm4ge2Z1bmN0aW9ufSAtIEEgZnVuY3Rpb24gdGhhdCwgd2hlbiBjYWxsZWQsIHdpbGwgdW5yZWdpc3RlciB0aGUgY2FsbGJhY2sgZnJvbSB0aGUgZXZlbnQuICovXG5leHBvcnQgZnVuY3Rpb24gT24oZXZlbnROYW1lLCBjYWxsYmFjaykgeyByZXR1cm4gT25NdWx0aXBsZShldmVudE5hbWUsIGNhbGxiYWNrLCAtMSk7IH1cblxuLyoqXG4gKiBSZWdpc3RlcnMgYSBjYWxsYmFjayBmdW5jdGlvbiB0byBiZSBleGVjdXRlZCBvbmx5IG9uY2UgZm9yIHRoZSBzcGVjaWZpZWQgZXZlbnQuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBldmVudC5cbiAqIEBwYXJhbSB7ZnVuY3Rpb259IGNhbGxiYWNrIC0gVGhlIGZ1bmN0aW9uIHRvIGJlIGV4ZWN1dGVkIHdoZW4gdGhlIGV2ZW50IG9jY3Vycy5cbiAqIEByZXR1cm4ge2Z1bmN0aW9ufSAtIEEgZnVuY3Rpb24gdGhhdCwgd2hlbiBjYWxsZWQsIHdpbGwgdW5yZWdpc3RlciB0aGUgY2FsbGJhY2sgZnJvbSB0aGUgZXZlbnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBPbmNlKGV2ZW50TmFtZSwgY2FsbGJhY2spIHsgcmV0dXJuIE9uTXVsdGlwbGUoZXZlbnROYW1lLCBjYWxsYmFjaywgMSk7IH1cblxuLyoqXG4gKiBSZW1vdmVzIHRoZSBzcGVjaWZpZWQgbGlzdGVuZXIgZnJvbSB0aGUgZXZlbnQgbGlzdGVuZXJzIGNvbGxlY3Rpb24uXG4gKiBJZiBhbGwgbGlzdGVuZXJzIGZvciB0aGUgZXZlbnQgYXJlIHJlbW92ZWQsIHRoZSBldmVudCBrZXkgaXMgZGVsZXRlZCBmcm9tIHRoZSBjb2xsZWN0aW9uLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBsaXN0ZW5lciAtIFRoZSBsaXN0ZW5lciB0byBiZSByZW1vdmVkLlxuICovXG5mdW5jdGlvbiBsaXN0ZW5lck9mZihsaXN0ZW5lcikge1xuICAgIGNvbnN0IGV2ZW50TmFtZSA9IGxpc3RlbmVyLmV2ZW50TmFtZTtcbiAgICBsZXQgbGlzdGVuZXJzID0gZXZlbnRMaXN0ZW5lcnMuZ2V0KGV2ZW50TmFtZSkuZmlsdGVyKGwgPT4gbCAhPT0gbGlzdGVuZXIpO1xuICAgIGlmIChsaXN0ZW5lcnMubGVuZ3RoID09PSAwKSBldmVudExpc3RlbmVycy5kZWxldGUoZXZlbnROYW1lKTtcbiAgICBlbHNlIGV2ZW50TGlzdGVuZXJzLnNldChldmVudE5hbWUsIGxpc3RlbmVycyk7XG59XG5cblxuLyoqXG4gKiBSZW1vdmVzIGV2ZW50IGxpc3RlbmVycyBmb3IgdGhlIHNwZWNpZmllZCBldmVudCBuYW1lcy5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGV2ZW50IHRvIHJlbW92ZSBsaXN0ZW5lcnMgZm9yLlxuICogQHBhcmFtIHsuLi5zdHJpbmd9IGFkZGl0aW9uYWxFdmVudE5hbWVzIC0gQWRkaXRpb25hbCBldmVudCBuYW1lcyB0byByZW1vdmUgbGlzdGVuZXJzIGZvci5cbiAqIEByZXR1cm4ge3VuZGVmaW5lZH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIE9mZihldmVudE5hbWUsIC4uLmFkZGl0aW9uYWxFdmVudE5hbWVzKSB7XG4gICAgbGV0IGV2ZW50c1RvUmVtb3ZlID0gW2V2ZW50TmFtZSwgLi4uYWRkaXRpb25hbEV2ZW50TmFtZXNdO1xuICAgIGV2ZW50c1RvUmVtb3ZlLmZvckVhY2goZXZlbnROYW1lID0+IGV2ZW50TGlzdGVuZXJzLmRlbGV0ZShldmVudE5hbWUpKTtcbn1cbi8qKlxuICogUmVtb3ZlcyBhbGwgZXZlbnQgbGlzdGVuZXJzLlxuICpcbiAqIEBmdW5jdGlvbiBPZmZBbGxcbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5leHBvcnQgZnVuY3Rpb24gT2ZmQWxsKCkgeyBldmVudExpc3RlbmVycy5jbGVhcigpOyB9XG5cbi8qKlxuICogRW1pdHMgYW4gZXZlbnQgdXNpbmcgdGhlIGdpdmVuIGV2ZW50IG5hbWUuXG4gKlxuICogQHBhcmFtIHtXYWlsc0V2ZW50fSBldmVudCAtIFRoZSBuYW1lIG9mIHRoZSBldmVudCB0byBlbWl0LlxuICogQHJldHVybnMge2FueX0gLSBUaGUgcmVzdWx0IG9mIHRoZSBlbWl0dGVkIGV2ZW50LlxuICovXG5leHBvcnQgZnVuY3Rpb24gRW1pdChldmVudCkgeyByZXR1cm4gY2FsbChFbWl0TWV0aG9kLCBldmVudCk7IH1cbiIsICJcbmV4cG9ydCBjb25zdCBFdmVudFR5cGVzID0ge1xuXHRXaW5kb3dzOiB7XG5cdFx0U3lzdGVtVGhlbWVDaGFuZ2VkOiBcIndpbmRvd3M6U3lzdGVtVGhlbWVDaGFuZ2VkXCIsXG5cdFx0QVBNUG93ZXJTdGF0dXNDaGFuZ2U6IFwid2luZG93czpBUE1Qb3dlclN0YXR1c0NoYW5nZVwiLFxuXHRcdEFQTVN1c3BlbmQ6IFwid2luZG93czpBUE1TdXNwZW5kXCIsXG5cdFx0QVBNUmVzdW1lQXV0b21hdGljOiBcIndpbmRvd3M6QVBNUmVzdW1lQXV0b21hdGljXCIsXG5cdFx0QVBNUmVzdW1lU3VzcGVuZDogXCJ3aW5kb3dzOkFQTVJlc3VtZVN1c3BlbmRcIixcblx0XHRBUE1Qb3dlclNldHRpbmdDaGFuZ2U6IFwid2luZG93czpBUE1Qb3dlclNldHRpbmdDaGFuZ2VcIixcblx0XHRBcHBsaWNhdGlvblN0YXJ0ZWQ6IFwid2luZG93czpBcHBsaWNhdGlvblN0YXJ0ZWRcIixcblx0XHRXZWJWaWV3TmF2aWdhdGlvbkNvbXBsZXRlZDogXCJ3aW5kb3dzOldlYlZpZXdOYXZpZ2F0aW9uQ29tcGxldGVkXCIsXG5cdFx0V2luZG93SW5hY3RpdmU6IFwid2luZG93czpXaW5kb3dJbmFjdGl2ZVwiLFxuXHRcdFdpbmRvd0FjdGl2ZTogXCJ3aW5kb3dzOldpbmRvd0FjdGl2ZVwiLFxuXHRcdFdpbmRvd0NsaWNrQWN0aXZlOiBcIndpbmRvd3M6V2luZG93Q2xpY2tBY3RpdmVcIixcblx0XHRXaW5kb3dNYXhpbWlzZTogXCJ3aW5kb3dzOldpbmRvd01heGltaXNlXCIsXG5cdFx0V2luZG93VW5NYXhpbWlzZTogXCJ3aW5kb3dzOldpbmRvd1VuTWF4aW1pc2VcIixcblx0XHRXaW5kb3dGdWxsc2NyZWVuOiBcIndpbmRvd3M6V2luZG93RnVsbHNjcmVlblwiLFxuXHRcdFdpbmRvd1VuRnVsbHNjcmVlbjogXCJ3aW5kb3dzOldpbmRvd1VuRnVsbHNjcmVlblwiLFxuXHRcdFdpbmRvd1Jlc3RvcmU6IFwid2luZG93czpXaW5kb3dSZXN0b3JlXCIsXG5cdFx0V2luZG93TWluaW1pc2U6IFwid2luZG93czpXaW5kb3dNaW5pbWlzZVwiLFxuXHRcdFdpbmRvd1VuTWluaW1pc2U6IFwid2luZG93czpXaW5kb3dVbk1pbmltaXNlXCIsXG5cdFx0V2luZG93Q2xvc2U6IFwid2luZG93czpXaW5kb3dDbG9zZVwiLFxuXHRcdFdpbmRvd1NldEZvY3VzOiBcIndpbmRvd3M6V2luZG93U2V0Rm9jdXNcIixcblx0XHRXaW5kb3dLaWxsRm9jdXM6IFwid2luZG93czpXaW5kb3dLaWxsRm9jdXNcIixcblx0XHRXaW5kb3dEcmFnRHJvcDogXCJ3aW5kb3dzOldpbmRvd0RyYWdEcm9wXCIsXG5cdFx0V2luZG93RHJhZ0VudGVyOiBcIndpbmRvd3M6V2luZG93RHJhZ0VudGVyXCIsXG5cdFx0V2luZG93RHJhZ0xlYXZlOiBcIndpbmRvd3M6V2luZG93RHJhZ0xlYXZlXCIsXG5cdFx0V2luZG93RHJhZ092ZXI6IFwid2luZG93czpXaW5kb3dEcmFnT3ZlclwiLFxuXHR9LFxuXHRNYWM6IHtcblx0XHRBcHBsaWNhdGlvbkRpZEJlY29tZUFjdGl2ZTogXCJtYWM6QXBwbGljYXRpb25EaWRCZWNvbWVBY3RpdmVcIixcblx0XHRBcHBsaWNhdGlvbkRpZENoYW5nZUJhY2tpbmdQcm9wZXJ0aWVzOiBcIm1hYzpBcHBsaWNhdGlvbkRpZENoYW5nZUJhY2tpbmdQcm9wZXJ0aWVzXCIsXG5cdFx0QXBwbGljYXRpb25EaWRDaGFuZ2VFZmZlY3RpdmVBcHBlYXJhbmNlOiBcIm1hYzpBcHBsaWNhdGlvbkRpZENoYW5nZUVmZmVjdGl2ZUFwcGVhcmFuY2VcIixcblx0XHRBcHBsaWNhdGlvbkRpZENoYW5nZUljb246IFwibWFjOkFwcGxpY2F0aW9uRGlkQ2hhbmdlSWNvblwiLFxuXHRcdEFwcGxpY2F0aW9uRGlkQ2hhbmdlT2NjbHVzaW9uU3RhdGU6IFwibWFjOkFwcGxpY2F0aW9uRGlkQ2hhbmdlT2NjbHVzaW9uU3RhdGVcIixcblx0XHRBcHBsaWNhdGlvbkRpZENoYW5nZVNjcmVlblBhcmFtZXRlcnM6IFwibWFjOkFwcGxpY2F0aW9uRGlkQ2hhbmdlU2NyZWVuUGFyYW1ldGVyc1wiLFxuXHRcdEFwcGxpY2F0aW9uRGlkQ2hhbmdlU3RhdHVzQmFyRnJhbWU6IFwibWFjOkFwcGxpY2F0aW9uRGlkQ2hhbmdlU3RhdHVzQmFyRnJhbWVcIixcblx0XHRBcHBsaWNhdGlvbkRpZENoYW5nZVN0YXR1c0Jhck9yaWVudGF0aW9uOiBcIm1hYzpBcHBsaWNhdGlvbkRpZENoYW5nZVN0YXR1c0Jhck9yaWVudGF0aW9uXCIsXG5cdFx0QXBwbGljYXRpb25EaWRGaW5pc2hMYXVuY2hpbmc6IFwibWFjOkFwcGxpY2F0aW9uRGlkRmluaXNoTGF1bmNoaW5nXCIsXG5cdFx0QXBwbGljYXRpb25EaWRIaWRlOiBcIm1hYzpBcHBsaWNhdGlvbkRpZEhpZGVcIixcblx0XHRBcHBsaWNhdGlvbkRpZFJlc2lnbkFjdGl2ZU5vdGlmaWNhdGlvbjogXCJtYWM6QXBwbGljYXRpb25EaWRSZXNpZ25BY3RpdmVOb3RpZmljYXRpb25cIixcblx0XHRBcHBsaWNhdGlvbkRpZFVuaGlkZTogXCJtYWM6QXBwbGljYXRpb25EaWRVbmhpZGVcIixcblx0XHRBcHBsaWNhdGlvbkRpZFVwZGF0ZTogXCJtYWM6QXBwbGljYXRpb25EaWRVcGRhdGVcIixcblx0XHRBcHBsaWNhdGlvbldpbGxCZWNvbWVBY3RpdmU6IFwibWFjOkFwcGxpY2F0aW9uV2lsbEJlY29tZUFjdGl2ZVwiLFxuXHRcdEFwcGxpY2F0aW9uV2lsbEZpbmlzaExhdW5jaGluZzogXCJtYWM6QXBwbGljYXRpb25XaWxsRmluaXNoTGF1bmNoaW5nXCIsXG5cdFx0QXBwbGljYXRpb25XaWxsSGlkZTogXCJtYWM6QXBwbGljYXRpb25XaWxsSGlkZVwiLFxuXHRcdEFwcGxpY2F0aW9uV2lsbFJlc2lnbkFjdGl2ZTogXCJtYWM6QXBwbGljYXRpb25XaWxsUmVzaWduQWN0aXZlXCIsXG5cdFx0QXBwbGljYXRpb25XaWxsVGVybWluYXRlOiBcIm1hYzpBcHBsaWNhdGlvbldpbGxUZXJtaW5hdGVcIixcblx0XHRBcHBsaWNhdGlvbldpbGxVbmhpZGU6IFwibWFjOkFwcGxpY2F0aW9uV2lsbFVuaGlkZVwiLFxuXHRcdEFwcGxpY2F0aW9uV2lsbFVwZGF0ZTogXCJtYWM6QXBwbGljYXRpb25XaWxsVXBkYXRlXCIsXG5cdFx0QXBwbGljYXRpb25EaWRDaGFuZ2VUaGVtZTogXCJtYWM6QXBwbGljYXRpb25EaWRDaGFuZ2VUaGVtZSFcIixcblx0XHRBcHBsaWNhdGlvblNob3VsZEhhbmRsZVJlb3BlbjogXCJtYWM6QXBwbGljYXRpb25TaG91bGRIYW5kbGVSZW9wZW4hXCIsXG5cdFx0V2luZG93RGlkQmVjb21lS2V5OiBcIm1hYzpXaW5kb3dEaWRCZWNvbWVLZXlcIixcblx0XHRXaW5kb3dEaWRCZWNvbWVNYWluOiBcIm1hYzpXaW5kb3dEaWRCZWNvbWVNYWluXCIsXG5cdFx0V2luZG93RGlkQmVnaW5TaGVldDogXCJtYWM6V2luZG93RGlkQmVnaW5TaGVldFwiLFxuXHRcdFdpbmRvd0RpZENoYW5nZUFscGhhOiBcIm1hYzpXaW5kb3dEaWRDaGFuZ2VBbHBoYVwiLFxuXHRcdFdpbmRvd0RpZENoYW5nZUJhY2tpbmdMb2NhdGlvbjogXCJtYWM6V2luZG93RGlkQ2hhbmdlQmFja2luZ0xvY2F0aW9uXCIsXG5cdFx0V2luZG93RGlkQ2hhbmdlQmFja2luZ1Byb3BlcnRpZXM6IFwibWFjOldpbmRvd0RpZENoYW5nZUJhY2tpbmdQcm9wZXJ0aWVzXCIsXG5cdFx0V2luZG93RGlkQ2hhbmdlQ29sbGVjdGlvbkJlaGF2aW9yOiBcIm1hYzpXaW5kb3dEaWRDaGFuZ2VDb2xsZWN0aW9uQmVoYXZpb3JcIixcblx0XHRXaW5kb3dEaWRDaGFuZ2VFZmZlY3RpdmVBcHBlYXJhbmNlOiBcIm1hYzpXaW5kb3dEaWRDaGFuZ2VFZmZlY3RpdmVBcHBlYXJhbmNlXCIsXG5cdFx0V2luZG93RGlkQ2hhbmdlT2NjbHVzaW9uU3RhdGU6IFwibWFjOldpbmRvd0RpZENoYW5nZU9jY2x1c2lvblN0YXRlXCIsXG5cdFx0V2luZG93RGlkQ2hhbmdlT3JkZXJpbmdNb2RlOiBcIm1hYzpXaW5kb3dEaWRDaGFuZ2VPcmRlcmluZ01vZGVcIixcblx0XHRXaW5kb3dEaWRDaGFuZ2VTY3JlZW46IFwibWFjOldpbmRvd0RpZENoYW5nZVNjcmVlblwiLFxuXHRcdFdpbmRvd0RpZENoYW5nZVNjcmVlblBhcmFtZXRlcnM6IFwibWFjOldpbmRvd0RpZENoYW5nZVNjcmVlblBhcmFtZXRlcnNcIixcblx0XHRXaW5kb3dEaWRDaGFuZ2VTY3JlZW5Qcm9maWxlOiBcIm1hYzpXaW5kb3dEaWRDaGFuZ2VTY3JlZW5Qcm9maWxlXCIsXG5cdFx0V2luZG93RGlkQ2hhbmdlU2NyZWVuU3BhY2U6IFwibWFjOldpbmRvd0RpZENoYW5nZVNjcmVlblNwYWNlXCIsXG5cdFx0V2luZG93RGlkQ2hhbmdlU2NyZWVuU3BhY2VQcm9wZXJ0aWVzOiBcIm1hYzpXaW5kb3dEaWRDaGFuZ2VTY3JlZW5TcGFjZVByb3BlcnRpZXNcIixcblx0XHRXaW5kb3dEaWRDaGFuZ2VTaGFyaW5nVHlwZTogXCJtYWM6V2luZG93RGlkQ2hhbmdlU2hhcmluZ1R5cGVcIixcblx0XHRXaW5kb3dEaWRDaGFuZ2VTcGFjZTogXCJtYWM6V2luZG93RGlkQ2hhbmdlU3BhY2VcIixcblx0XHRXaW5kb3dEaWRDaGFuZ2VTcGFjZU9yZGVyaW5nTW9kZTogXCJtYWM6V2luZG93RGlkQ2hhbmdlU3BhY2VPcmRlcmluZ01vZGVcIixcblx0XHRXaW5kb3dEaWRDaGFuZ2VUaXRsZTogXCJtYWM6V2luZG93RGlkQ2hhbmdlVGl0bGVcIixcblx0XHRXaW5kb3dEaWRDaGFuZ2VUb29sYmFyOiBcIm1hYzpXaW5kb3dEaWRDaGFuZ2VUb29sYmFyXCIsXG5cdFx0V2luZG93RGlkQ2hhbmdlVmlzaWJpbGl0eTogXCJtYWM6V2luZG93RGlkQ2hhbmdlVmlzaWJpbGl0eVwiLFxuXHRcdFdpbmRvd0RpZERlbWluaWF0dXJpemU6IFwibWFjOldpbmRvd0RpZERlbWluaWF0dXJpemVcIixcblx0XHRXaW5kb3dEaWRFbmRTaGVldDogXCJtYWM6V2luZG93RGlkRW5kU2hlZXRcIixcblx0XHRXaW5kb3dEaWRFbnRlckZ1bGxTY3JlZW46IFwibWFjOldpbmRvd0RpZEVudGVyRnVsbFNjcmVlblwiLFxuXHRcdFdpbmRvd0RpZEVudGVyVmVyc2lvbkJyb3dzZXI6IFwibWFjOldpbmRvd0RpZEVudGVyVmVyc2lvbkJyb3dzZXJcIixcblx0XHRXaW5kb3dEaWRFeGl0RnVsbFNjcmVlbjogXCJtYWM6V2luZG93RGlkRXhpdEZ1bGxTY3JlZW5cIixcblx0XHRXaW5kb3dEaWRFeGl0VmVyc2lvbkJyb3dzZXI6IFwibWFjOldpbmRvd0RpZEV4aXRWZXJzaW9uQnJvd3NlclwiLFxuXHRcdFdpbmRvd0RpZEV4cG9zZTogXCJtYWM6V2luZG93RGlkRXhwb3NlXCIsXG5cdFx0V2luZG93RGlkRm9jdXM6IFwibWFjOldpbmRvd0RpZEZvY3VzXCIsXG5cdFx0V2luZG93RGlkTWluaWF0dXJpemU6IFwibWFjOldpbmRvd0RpZE1pbmlhdHVyaXplXCIsXG5cdFx0V2luZG93RGlkTW92ZTogXCJtYWM6V2luZG93RGlkTW92ZVwiLFxuXHRcdFdpbmRvd0RpZE9yZGVyT2ZmU2NyZWVuOiBcIm1hYzpXaW5kb3dEaWRPcmRlck9mZlNjcmVlblwiLFxuXHRcdFdpbmRvd0RpZE9yZGVyT25TY3JlZW46IFwibWFjOldpbmRvd0RpZE9yZGVyT25TY3JlZW5cIixcblx0XHRXaW5kb3dEaWRSZXNpZ25LZXk6IFwibWFjOldpbmRvd0RpZFJlc2lnbktleVwiLFxuXHRcdFdpbmRvd0RpZFJlc2lnbk1haW46IFwibWFjOldpbmRvd0RpZFJlc2lnbk1haW5cIixcblx0XHRXaW5kb3dEaWRSZXNpemU6IFwibWFjOldpbmRvd0RpZFJlc2l6ZVwiLFxuXHRcdFdpbmRvd0RpZFVwZGF0ZTogXCJtYWM6V2luZG93RGlkVXBkYXRlXCIsXG5cdFx0V2luZG93RGlkVXBkYXRlQWxwaGE6IFwibWFjOldpbmRvd0RpZFVwZGF0ZUFscGhhXCIsXG5cdFx0V2luZG93RGlkVXBkYXRlQ29sbGVjdGlvbkJlaGF2aW9yOiBcIm1hYzpXaW5kb3dEaWRVcGRhdGVDb2xsZWN0aW9uQmVoYXZpb3JcIixcblx0XHRXaW5kb3dEaWRVcGRhdGVDb2xsZWN0aW9uUHJvcGVydGllczogXCJtYWM6V2luZG93RGlkVXBkYXRlQ29sbGVjdGlvblByb3BlcnRpZXNcIixcblx0XHRXaW5kb3dEaWRVcGRhdGVTaGFkb3c6IFwibWFjOldpbmRvd0RpZFVwZGF0ZVNoYWRvd1wiLFxuXHRcdFdpbmRvd0RpZFVwZGF0ZVRpdGxlOiBcIm1hYzpXaW5kb3dEaWRVcGRhdGVUaXRsZVwiLFxuXHRcdFdpbmRvd0RpZFVwZGF0ZVRvb2xiYXI6IFwibWFjOldpbmRvd0RpZFVwZGF0ZVRvb2xiYXJcIixcblx0XHRXaW5kb3dEaWRVcGRhdGVWaXNpYmlsaXR5OiBcIm1hYzpXaW5kb3dEaWRVcGRhdGVWaXNpYmlsaXR5XCIsXG5cdFx0V2luZG93U2hvdWxkQ2xvc2U6IFwibWFjOldpbmRvd1Nob3VsZENsb3NlIVwiLFxuXHRcdFdpbmRvd1dpbGxCZWNvbWVLZXk6IFwibWFjOldpbmRvd1dpbGxCZWNvbWVLZXlcIixcblx0XHRXaW5kb3dXaWxsQmVjb21lTWFpbjogXCJtYWM6V2luZG93V2lsbEJlY29tZU1haW5cIixcblx0XHRXaW5kb3dXaWxsQmVnaW5TaGVldDogXCJtYWM6V2luZG93V2lsbEJlZ2luU2hlZXRcIixcblx0XHRXaW5kb3dXaWxsQ2hhbmdlT3JkZXJpbmdNb2RlOiBcIm1hYzpXaW5kb3dXaWxsQ2hhbmdlT3JkZXJpbmdNb2RlXCIsXG5cdFx0V2luZG93V2lsbENsb3NlOiBcIm1hYzpXaW5kb3dXaWxsQ2xvc2VcIixcblx0XHRXaW5kb3dXaWxsRGVtaW5pYXR1cml6ZTogXCJtYWM6V2luZG93V2lsbERlbWluaWF0dXJpemVcIixcblx0XHRXaW5kb3dXaWxsRW50ZXJGdWxsU2NyZWVuOiBcIm1hYzpXaW5kb3dXaWxsRW50ZXJGdWxsU2NyZWVuXCIsXG5cdFx0V2luZG93V2lsbEVudGVyVmVyc2lvbkJyb3dzZXI6IFwibWFjOldpbmRvd1dpbGxFbnRlclZlcnNpb25Ccm93c2VyXCIsXG5cdFx0V2luZG93V2lsbEV4aXRGdWxsU2NyZWVuOiBcIm1hYzpXaW5kb3dXaWxsRXhpdEZ1bGxTY3JlZW5cIixcblx0XHRXaW5kb3dXaWxsRXhpdFZlcnNpb25Ccm93c2VyOiBcIm1hYzpXaW5kb3dXaWxsRXhpdFZlcnNpb25Ccm93c2VyXCIsXG5cdFx0V2luZG93V2lsbEZvY3VzOiBcIm1hYzpXaW5kb3dXaWxsRm9jdXNcIixcblx0XHRXaW5kb3dXaWxsTWluaWF0dXJpemU6IFwibWFjOldpbmRvd1dpbGxNaW5pYXR1cml6ZVwiLFxuXHRcdFdpbmRvd1dpbGxNb3ZlOiBcIm1hYzpXaW5kb3dXaWxsTW92ZVwiLFxuXHRcdFdpbmRvd1dpbGxPcmRlck9mZlNjcmVlbjogXCJtYWM6V2luZG93V2lsbE9yZGVyT2ZmU2NyZWVuXCIsXG5cdFx0V2luZG93V2lsbE9yZGVyT25TY3JlZW46IFwibWFjOldpbmRvd1dpbGxPcmRlck9uU2NyZWVuXCIsXG5cdFx0V2luZG93V2lsbFJlc2lnbk1haW46IFwibWFjOldpbmRvd1dpbGxSZXNpZ25NYWluXCIsXG5cdFx0V2luZG93V2lsbFJlc2l6ZTogXCJtYWM6V2luZG93V2lsbFJlc2l6ZVwiLFxuXHRcdFdpbmRvd1dpbGxVbmZvY3VzOiBcIm1hYzpXaW5kb3dXaWxsVW5mb2N1c1wiLFxuXHRcdFdpbmRvd1dpbGxVcGRhdGU6IFwibWFjOldpbmRvd1dpbGxVcGRhdGVcIixcblx0XHRXaW5kb3dXaWxsVXBkYXRlQWxwaGE6IFwibWFjOldpbmRvd1dpbGxVcGRhdGVBbHBoYVwiLFxuXHRcdFdpbmRvd1dpbGxVcGRhdGVDb2xsZWN0aW9uQmVoYXZpb3I6IFwibWFjOldpbmRvd1dpbGxVcGRhdGVDb2xsZWN0aW9uQmVoYXZpb3JcIixcblx0XHRXaW5kb3dXaWxsVXBkYXRlQ29sbGVjdGlvblByb3BlcnRpZXM6IFwibWFjOldpbmRvd1dpbGxVcGRhdGVDb2xsZWN0aW9uUHJvcGVydGllc1wiLFxuXHRcdFdpbmRvd1dpbGxVcGRhdGVTaGFkb3c6IFwibWFjOldpbmRvd1dpbGxVcGRhdGVTaGFkb3dcIixcblx0XHRXaW5kb3dXaWxsVXBkYXRlVGl0bGU6IFwibWFjOldpbmRvd1dpbGxVcGRhdGVUaXRsZVwiLFxuXHRcdFdpbmRvd1dpbGxVcGRhdGVUb29sYmFyOiBcIm1hYzpXaW5kb3dXaWxsVXBkYXRlVG9vbGJhclwiLFxuXHRcdFdpbmRvd1dpbGxVcGRhdGVWaXNpYmlsaXR5OiBcIm1hYzpXaW5kb3dXaWxsVXBkYXRlVmlzaWJpbGl0eVwiLFxuXHRcdFdpbmRvd1dpbGxVc2VTdGFuZGFyZEZyYW1lOiBcIm1hYzpXaW5kb3dXaWxsVXNlU3RhbmRhcmRGcmFtZVwiLFxuXHRcdE1lbnVXaWxsT3BlbjogXCJtYWM6TWVudVdpbGxPcGVuXCIsXG5cdFx0TWVudURpZE9wZW46IFwibWFjOk1lbnVEaWRPcGVuXCIsXG5cdFx0TWVudURpZENsb3NlOiBcIm1hYzpNZW51RGlkQ2xvc2VcIixcblx0XHRNZW51V2lsbFNlbmRBY3Rpb246IFwibWFjOk1lbnVXaWxsU2VuZEFjdGlvblwiLFxuXHRcdE1lbnVEaWRTZW5kQWN0aW9uOiBcIm1hYzpNZW51RGlkU2VuZEFjdGlvblwiLFxuXHRcdE1lbnVXaWxsSGlnaGxpZ2h0SXRlbTogXCJtYWM6TWVudVdpbGxIaWdobGlnaHRJdGVtXCIsXG5cdFx0TWVudURpZEhpZ2hsaWdodEl0ZW06IFwibWFjOk1lbnVEaWRIaWdobGlnaHRJdGVtXCIsXG5cdFx0TWVudVdpbGxEaXNwbGF5SXRlbTogXCJtYWM6TWVudVdpbGxEaXNwbGF5SXRlbVwiLFxuXHRcdE1lbnVEaWREaXNwbGF5SXRlbTogXCJtYWM6TWVudURpZERpc3BsYXlJdGVtXCIsXG5cdFx0TWVudVdpbGxBZGRJdGVtOiBcIm1hYzpNZW51V2lsbEFkZEl0ZW1cIixcblx0XHRNZW51RGlkQWRkSXRlbTogXCJtYWM6TWVudURpZEFkZEl0ZW1cIixcblx0XHRNZW51V2lsbFJlbW92ZUl0ZW06IFwibWFjOk1lbnVXaWxsUmVtb3ZlSXRlbVwiLFxuXHRcdE1lbnVEaWRSZW1vdmVJdGVtOiBcIm1hYzpNZW51RGlkUmVtb3ZlSXRlbVwiLFxuXHRcdE1lbnVXaWxsQmVnaW5UcmFja2luZzogXCJtYWM6TWVudVdpbGxCZWdpblRyYWNraW5nXCIsXG5cdFx0TWVudURpZEJlZ2luVHJhY2tpbmc6IFwibWFjOk1lbnVEaWRCZWdpblRyYWNraW5nXCIsXG5cdFx0TWVudVdpbGxFbmRUcmFja2luZzogXCJtYWM6TWVudVdpbGxFbmRUcmFja2luZ1wiLFxuXHRcdE1lbnVEaWRFbmRUcmFja2luZzogXCJtYWM6TWVudURpZEVuZFRyYWNraW5nXCIsXG5cdFx0TWVudVdpbGxVcGRhdGU6IFwibWFjOk1lbnVXaWxsVXBkYXRlXCIsXG5cdFx0TWVudURpZFVwZGF0ZTogXCJtYWM6TWVudURpZFVwZGF0ZVwiLFxuXHRcdE1lbnVXaWxsUG9wVXA6IFwibWFjOk1lbnVXaWxsUG9wVXBcIixcblx0XHRNZW51RGlkUG9wVXA6IFwibWFjOk1lbnVEaWRQb3BVcFwiLFxuXHRcdE1lbnVXaWxsU2VuZEFjdGlvblRvSXRlbTogXCJtYWM6TWVudVdpbGxTZW5kQWN0aW9uVG9JdGVtXCIsXG5cdFx0TWVudURpZFNlbmRBY3Rpb25Ub0l0ZW06IFwibWFjOk1lbnVEaWRTZW5kQWN0aW9uVG9JdGVtXCIsXG5cdFx0V2ViVmlld0RpZFN0YXJ0UHJvdmlzaW9uYWxOYXZpZ2F0aW9uOiBcIm1hYzpXZWJWaWV3RGlkU3RhcnRQcm92aXNpb25hbE5hdmlnYXRpb25cIixcblx0XHRXZWJWaWV3RGlkUmVjZWl2ZVNlcnZlclJlZGlyZWN0Rm9yUHJvdmlzaW9uYWxOYXZpZ2F0aW9uOiBcIm1hYzpXZWJWaWV3RGlkUmVjZWl2ZVNlcnZlclJlZGlyZWN0Rm9yUHJvdmlzaW9uYWxOYXZpZ2F0aW9uXCIsXG5cdFx0V2ViVmlld0RpZEZpbmlzaE5hdmlnYXRpb246IFwibWFjOldlYlZpZXdEaWRGaW5pc2hOYXZpZ2F0aW9uXCIsXG5cdFx0V2ViVmlld0RpZENvbW1pdE5hdmlnYXRpb246IFwibWFjOldlYlZpZXdEaWRDb21taXROYXZpZ2F0aW9uXCIsXG5cdFx0V2luZG93RmlsZURyYWdnaW5nRW50ZXJlZDogXCJtYWM6V2luZG93RmlsZURyYWdnaW5nRW50ZXJlZFwiLFxuXHRcdFdpbmRvd0ZpbGVEcmFnZ2luZ1BlcmZvcm1lZDogXCJtYWM6V2luZG93RmlsZURyYWdnaW5nUGVyZm9ybWVkXCIsXG5cdFx0V2luZG93RmlsZURyYWdnaW5nRXhpdGVkOiBcIm1hYzpXaW5kb3dGaWxlRHJhZ2dpbmdFeGl0ZWRcIixcblx0fSxcblx0TGludXg6IHtcblx0XHRTeXN0ZW1UaGVtZUNoYW5nZWQ6IFwibGludXg6U3lzdGVtVGhlbWVDaGFuZ2VkXCIsXG5cdFx0V2luZG93TG9hZENoYW5nZWQ6IFwibGludXg6V2luZG93TG9hZENoYW5nZWRcIixcblx0XHRXaW5kb3dEZWxldGVFdmVudDogXCJsaW51eDpXaW5kb3dEZWxldGVFdmVudFwiLFxuXHRcdFdpbmRvd0ZvY3VzSW46IFwibGludXg6V2luZG93Rm9jdXNJblwiLFxuXHRcdFdpbmRvd0ZvY3VzT3V0OiBcImxpbnV4OldpbmRvd0ZvY3VzT3V0XCIsXG5cdFx0QXBwbGljYXRpb25TdGFydHVwOiBcImxpbnV4OkFwcGxpY2F0aW9uU3RhcnR1cFwiLFxuXHR9LFxuXHRDb21tb246IHtcblx0XHRBcHBsaWNhdGlvblN0YXJ0ZWQ6IFwiY29tbW9uOkFwcGxpY2F0aW9uU3RhcnRlZFwiLFxuXHRcdFdpbmRvd01heGltaXNlOiBcImNvbW1vbjpXaW5kb3dNYXhpbWlzZVwiLFxuXHRcdFdpbmRvd1VuTWF4aW1pc2U6IFwiY29tbW9uOldpbmRvd1VuTWF4aW1pc2VcIixcblx0XHRXaW5kb3dGdWxsc2NyZWVuOiBcImNvbW1vbjpXaW5kb3dGdWxsc2NyZWVuXCIsXG5cdFx0V2luZG93VW5GdWxsc2NyZWVuOiBcImNvbW1vbjpXaW5kb3dVbkZ1bGxzY3JlZW5cIixcblx0XHRXaW5kb3dSZXN0b3JlOiBcImNvbW1vbjpXaW5kb3dSZXN0b3JlXCIsXG5cdFx0V2luZG93TWluaW1pc2U6IFwiY29tbW9uOldpbmRvd01pbmltaXNlXCIsXG5cdFx0V2luZG93VW5NaW5pbWlzZTogXCJjb21tb246V2luZG93VW5NaW5pbWlzZVwiLFxuXHRcdFdpbmRvd0Nsb3Npbmc6IFwiY29tbW9uOldpbmRvd0Nsb3NpbmdcIixcblx0XHRXaW5kb3dab29tOiBcImNvbW1vbjpXaW5kb3dab29tXCIsXG5cdFx0V2luZG93Wm9vbUluOiBcImNvbW1vbjpXaW5kb3dab29tSW5cIixcblx0XHRXaW5kb3dab29tT3V0OiBcImNvbW1vbjpXaW5kb3dab29tT3V0XCIsXG5cdFx0V2luZG93Wm9vbVJlc2V0OiBcImNvbW1vbjpXaW5kb3dab29tUmVzZXRcIixcblx0XHRXaW5kb3dGb2N1czogXCJjb21tb246V2luZG93Rm9jdXNcIixcblx0XHRXaW5kb3dMb3N0Rm9jdXM6IFwiY29tbW9uOldpbmRvd0xvc3RGb2N1c1wiLFxuXHRcdFdpbmRvd1Nob3c6IFwiY29tbW9uOldpbmRvd1Nob3dcIixcblx0XHRXaW5kb3dIaWRlOiBcImNvbW1vbjpXaW5kb3dIaWRlXCIsXG5cdFx0V2luZG93RFBJQ2hhbmdlZDogXCJjb21tb246V2luZG93RFBJQ2hhbmdlZFwiLFxuXHRcdFdpbmRvd0ZpbGVzRHJvcHBlZDogXCJjb21tb246V2luZG93RmlsZXNEcm9wcGVkXCIsXG5cdFx0V2luZG93UnVudGltZVJlYWR5OiBcImNvbW1vbjpXaW5kb3dSdW50aW1lUmVhZHlcIixcblx0XHRUaGVtZUNoYW5nZWQ6IFwiY29tbW9uOlRoZW1lQ2hhbmdlZFwiLFxuXHR9LFxufTtcbiIsICIvKlxuIF9cdCAgIF9fXHQgIF8gX19cbnwgfFx0IC8gL19fXyBfKF8pIC9fX19fXG58IHwgL3wgLyAvIF9fIGAvIC8gLyBfX18vXG58IHwvIHwvIC8gL18vIC8gLyAoX18gIClcbnxfXy98X18vXFxfXyxfL18vXy9fX19fL1xuVGhlIGVsZWN0cm9uIGFsdGVybmF0aXZlIGZvciBHb1xuKGMpIExlYSBBbnRob255IDIwMTktcHJlc2VudFxuKi9cblxuLyoganNoaW50IGVzdmVyc2lvbjogOSAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IE9wZW5GaWxlRGlhbG9nT3B0aW9uc1xuICogQHByb3BlcnR5IHtib29sZWFufSBbQ2FuQ2hvb3NlRGlyZWN0b3JpZXNdIC0gSW5kaWNhdGVzIGlmIGRpcmVjdG9yaWVzIGNhbiBiZSBjaG9zZW4uXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtDYW5DaG9vc2VGaWxlc10gLSBJbmRpY2F0ZXMgaWYgZmlsZXMgY2FuIGJlIGNob3Nlbi5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW0NhbkNyZWF0ZURpcmVjdG9yaWVzXSAtIEluZGljYXRlcyBpZiBkaXJlY3RvcmllcyBjYW4gYmUgY3JlYXRlZC5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW1Nob3dIaWRkZW5GaWxlc10gLSBJbmRpY2F0ZXMgaWYgaGlkZGVuIGZpbGVzIHNob3VsZCBiZSBzaG93bi5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW1Jlc29sdmVzQWxpYXNlc10gLSBJbmRpY2F0ZXMgaWYgYWxpYXNlcyBzaG91bGQgYmUgcmVzb2x2ZWQuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtBbGxvd3NNdWx0aXBsZVNlbGVjdGlvbl0gLSBJbmRpY2F0ZXMgaWYgbXVsdGlwbGUgc2VsZWN0aW9uIGlzIGFsbG93ZWQuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtIaWRlRXh0ZW5zaW9uXSAtIEluZGljYXRlcyBpZiB0aGUgZXh0ZW5zaW9uIHNob3VsZCBiZSBoaWRkZW4uXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtDYW5TZWxlY3RIaWRkZW5FeHRlbnNpb25dIC0gSW5kaWNhdGVzIGlmIGhpZGRlbiBleHRlbnNpb25zIGNhbiBiZSBzZWxlY3RlZC5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW1RyZWF0c0ZpbGVQYWNrYWdlc0FzRGlyZWN0b3JpZXNdIC0gSW5kaWNhdGVzIGlmIGZpbGUgcGFja2FnZXMgc2hvdWxkIGJlIHRyZWF0ZWQgYXMgZGlyZWN0b3JpZXMuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtBbGxvd3NPdGhlckZpbGV0eXBlc10gLSBJbmRpY2F0ZXMgaWYgb3RoZXIgZmlsZSB0eXBlcyBhcmUgYWxsb3dlZC5cbiAqIEBwcm9wZXJ0eSB7RmlsZUZpbHRlcltdfSBbRmlsdGVyc10gLSBBcnJheSBvZiBmaWxlIGZpbHRlcnMuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW1RpdGxlXSAtIFRpdGxlIG9mIHRoZSBkaWFsb2cuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW01lc3NhZ2VdIC0gTWVzc2FnZSB0byBzaG93IGluIHRoZSBkaWFsb2cuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW0J1dHRvblRleHRdIC0gVGV4dCB0byBkaXNwbGF5IG9uIHRoZSBidXR0b24uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW0RpcmVjdG9yeV0gLSBEaXJlY3RvcnkgdG8gb3BlbiBpbiB0aGUgZGlhbG9nLlxuICogQHByb3BlcnR5IHtib29sZWFufSBbRGV0YWNoZWRdIC0gSW5kaWNhdGVzIGlmIHRoZSBkaWFsb2cgc2hvdWxkIGFwcGVhciBkZXRhY2hlZCBmcm9tIHRoZSBtYWluIHdpbmRvdy5cbiAqL1xuXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gU2F2ZUZpbGVEaWFsb2dPcHRpb25zXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW0ZpbGVuYW1lXSAtIERlZmF1bHQgZmlsZW5hbWUgdG8gdXNlIGluIHRoZSBkaWFsb2cuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtDYW5DaG9vc2VEaXJlY3Rvcmllc10gLSBJbmRpY2F0ZXMgaWYgZGlyZWN0b3JpZXMgY2FuIGJlIGNob3Nlbi5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW0NhbkNob29zZUZpbGVzXSAtIEluZGljYXRlcyBpZiBmaWxlcyBjYW4gYmUgY2hvc2VuLlxuICogQHByb3BlcnR5IHtib29sZWFufSBbQ2FuQ3JlYXRlRGlyZWN0b3JpZXNdIC0gSW5kaWNhdGVzIGlmIGRpcmVjdG9yaWVzIGNhbiBiZSBjcmVhdGVkLlxuICogQHByb3BlcnR5IHtib29sZWFufSBbU2hvd0hpZGRlbkZpbGVzXSAtIEluZGljYXRlcyBpZiBoaWRkZW4gZmlsZXMgc2hvdWxkIGJlIHNob3duLlxuICogQHByb3BlcnR5IHtib29sZWFufSBbUmVzb2x2ZXNBbGlhc2VzXSAtIEluZGljYXRlcyBpZiBhbGlhc2VzIHNob3VsZCBiZSByZXNvbHZlZC5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW0FsbG93c011bHRpcGxlU2VsZWN0aW9uXSAtIEluZGljYXRlcyBpZiBtdWx0aXBsZSBzZWxlY3Rpb24gaXMgYWxsb3dlZC5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW0hpZGVFeHRlbnNpb25dIC0gSW5kaWNhdGVzIGlmIHRoZSBleHRlbnNpb24gc2hvdWxkIGJlIGhpZGRlbi5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW0NhblNlbGVjdEhpZGRlbkV4dGVuc2lvbl0gLSBJbmRpY2F0ZXMgaWYgaGlkZGVuIGV4dGVuc2lvbnMgY2FuIGJlIHNlbGVjdGVkLlxuICogQHByb3BlcnR5IHtib29sZWFufSBbVHJlYXRzRmlsZVBhY2thZ2VzQXNEaXJlY3Rvcmllc10gLSBJbmRpY2F0ZXMgaWYgZmlsZSBwYWNrYWdlcyBzaG91bGQgYmUgdHJlYXRlZCBhcyBkaXJlY3Rvcmllcy5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW0FsbG93c090aGVyRmlsZXR5cGVzXSAtIEluZGljYXRlcyBpZiBvdGhlciBmaWxlIHR5cGVzIGFyZSBhbGxvd2VkLlxuICogQHByb3BlcnR5IHtGaWxlRmlsdGVyW119IFtGaWx0ZXJzXSAtIEFycmF5IG9mIGZpbGUgZmlsdGVycy5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbVGl0bGVdIC0gVGl0bGUgb2YgdGhlIGRpYWxvZy5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbTWVzc2FnZV0gLSBNZXNzYWdlIHRvIHNob3cgaW4gdGhlIGRpYWxvZy5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbQnV0dG9uVGV4dF0gLSBUZXh0IHRvIGRpc3BsYXkgb24gdGhlIGJ1dHRvbi5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbRGlyZWN0b3J5XSAtIERpcmVjdG9yeSB0byBvcGVuIGluIHRoZSBkaWFsb2cuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtEZXRhY2hlZF0gLSBJbmRpY2F0ZXMgaWYgdGhlIGRpYWxvZyBzaG91bGQgYXBwZWFyIGRldGFjaGVkIGZyb20gdGhlIG1haW4gd2luZG93LlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gTWVzc2FnZURpYWxvZ09wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbVGl0bGVdIC0gVGhlIHRpdGxlIG9mIHRoZSBkaWFsb2cgd2luZG93LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtNZXNzYWdlXSAtIFRoZSBtYWluIG1lc3NhZ2UgdG8gc2hvdyBpbiB0aGUgZGlhbG9nLlxuICogQHByb3BlcnR5IHtCdXR0b25bXX0gW0J1dHRvbnNdIC0gQXJyYXkgb2YgYnV0dG9uIG9wdGlvbnMgdG8gc2hvdyBpbiB0aGUgZGlhbG9nLlxuICogQHByb3BlcnR5IHtib29sZWFufSBbRGV0YWNoZWRdIC0gVHJ1ZSBpZiB0aGUgZGlhbG9nIHNob3VsZCBhcHBlYXIgZGV0YWNoZWQgZnJvbSB0aGUgbWFpbiB3aW5kb3cgKGlmIGFwcGxpY2FibGUpLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gQnV0dG9uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW0xhYmVsXSAtIFRleHQgdGhhdCBhcHBlYXJzIHdpdGhpbiB0aGUgYnV0dG9uLlxuICogQHByb3BlcnR5IHtib29sZWFufSBbSXNDYW5jZWxdIC0gVHJ1ZSBpZiB0aGUgYnV0dG9uIHNob3VsZCBjYW5jZWwgYW4gb3BlcmF0aW9uIHdoZW4gY2xpY2tlZC5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW0lzRGVmYXVsdF0gLSBUcnVlIGlmIHRoZSBidXR0b24gc2hvdWxkIGJlIHRoZSBkZWZhdWx0IGFjdGlvbiB3aGVuIHRoZSB1c2VyIHByZXNzZXMgZW50ZXIuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBGaWxlRmlsdGVyXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW0Rpc3BsYXlOYW1lXSAtIERpc3BsYXkgbmFtZSBmb3IgdGhlIGZpbHRlciwgaXQgY291bGQgYmUgXCJUZXh0IEZpbGVzXCIsIFwiSW1hZ2VzXCIgZXRjLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtQYXR0ZXJuXSAtIFBhdHRlcm4gdG8gbWF0Y2ggZm9yIHRoZSBmaWx0ZXIsIGUuZy4gXCIqLnR4dDsqLm1kXCIgZm9yIHRleHQgbWFya2Rvd24gZmlsZXMuXG4gKi9cblxuLy8gc2V0dXBcbndpbmRvdy5fd2FpbHMgPSB3aW5kb3cuX3dhaWxzIHx8IHt9O1xud2luZG93Ll93YWlscy5kaWFsb2dFcnJvckNhbGxiYWNrID0gZGlhbG9nRXJyb3JDYWxsYmFjaztcbndpbmRvdy5fd2FpbHMuZGlhbG9nUmVzdWx0Q2FsbGJhY2sgPSBkaWFsb2dSZXN1bHRDYWxsYmFjaztcblxuaW1wb3J0IHtuZXdSdW50aW1lQ2FsbGVyV2l0aElELCBvYmplY3ROYW1lc30gZnJvbSBcIi4vcnVudGltZVwiO1xuXG5pbXBvcnQgeyBuYW5vaWQgfSBmcm9tICduYW5vaWQvbm9uLXNlY3VyZSc7XG5cbi8vIERlZmluZSBjb25zdGFudHMgZnJvbSB0aGUgYG1ldGhvZHNgIG9iamVjdCBpbiBUaXRsZSBDYXNlXG5jb25zdCBEaWFsb2dJbmZvID0gMDtcbmNvbnN0IERpYWxvZ1dhcm5pbmcgPSAxO1xuY29uc3QgRGlhbG9nRXJyb3IgPSAyO1xuY29uc3QgRGlhbG9nUXVlc3Rpb24gPSAzO1xuY29uc3QgRGlhbG9nT3BlbkZpbGUgPSA0O1xuY29uc3QgRGlhbG9nU2F2ZUZpbGUgPSA1O1xuXG5jb25zdCBjYWxsID0gbmV3UnVudGltZUNhbGxlcldpdGhJRChvYmplY3ROYW1lcy5EaWFsb2csICcnKTtcbmNvbnN0IGRpYWxvZ1Jlc3BvbnNlcyA9IG5ldyBNYXAoKTtcblxuLyoqXG4gKiBHZW5lcmF0ZXMgYSB1bmlxdWUgaWQgdGhhdCBpcyBub3QgcHJlc2VudCBpbiBkaWFsb2dSZXNwb25zZXMuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSB1bmlxdWUgaWRcbiAqL1xuZnVuY3Rpb24gZ2VuZXJhdGVJRCgpIHtcbiAgICBsZXQgcmVzdWx0O1xuICAgIGRvIHtcbiAgICAgICAgcmVzdWx0ID0gbmFub2lkKCk7XG4gICAgfSB3aGlsZSAoZGlhbG9nUmVzcG9uc2VzLmhhcyhyZXN1bHQpKTtcbiAgICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIFNob3dzIGEgZGlhbG9nIG9mIHNwZWNpZmllZCB0eXBlIHdpdGggdGhlIGdpdmVuIG9wdGlvbnMuXG4gKiBAcGFyYW0ge251bWJlcn0gdHlwZSAtIHR5cGUgb2YgZGlhbG9nXG4gKiBAcGFyYW0ge01lc3NhZ2VEaWFsb2dPcHRpb25zfE9wZW5GaWxlRGlhbG9nT3B0aW9uc3xTYXZlRmlsZURpYWxvZ09wdGlvbnN9IG9wdGlvbnMgLSBvcHRpb25zIGZvciB0aGUgZGlhbG9nXG4gKiBAcmV0dXJucyB7UHJvbWlzZX0gcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggcmVzdWx0IG9mIGRpYWxvZ1xuICovXG5mdW5jdGlvbiBkaWFsb2codHlwZSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgY29uc3QgaWQgPSBnZW5lcmF0ZUlEKCk7XG4gICAgb3B0aW9uc1tcImRpYWxvZy1pZFwiXSA9IGlkO1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGRpYWxvZ1Jlc3BvbnNlcy5zZXQoaWQsIHtyZXNvbHZlLCByZWplY3R9KTtcbiAgICAgICAgY2FsbCh0eXBlLCBvcHRpb25zKS5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgICAgICBkaWFsb2dSZXNwb25zZXMuZGVsZXRlKGlkKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG59XG5cbi8qKlxuICogSGFuZGxlcyB0aGUgY2FsbGJhY2sgZnJvbSBhIGRpYWxvZy5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gaWQgLSBUaGUgSUQgb2YgdGhlIGRpYWxvZyByZXNwb25zZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBkYXRhIC0gVGhlIGRhdGEgcmVjZWl2ZWQgZnJvbSB0aGUgZGlhbG9nLlxuICogQHBhcmFtIHtib29sZWFufSBpc0pTT04gLSBGbGFnIGluZGljYXRpbmcgd2hldGhlciB0aGUgZGF0YSBpcyBpbiBKU09OIGZvcm1hdC5cbiAqXG4gKiBAcmV0dXJuIHt1bmRlZmluZWR9XG4gKi9cbmZ1bmN0aW9uIGRpYWxvZ1Jlc3VsdENhbGxiYWNrKGlkLCBkYXRhLCBpc0pTT04pIHtcbiAgICBsZXQgcCA9IGRpYWxvZ1Jlc3BvbnNlcy5nZXQoaWQpO1xuICAgIGlmIChwKSB7XG4gICAgICAgIGlmIChpc0pTT04pIHtcbiAgICAgICAgICAgIHAucmVzb2x2ZShKU09OLnBhcnNlKGRhdGEpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHAucmVzb2x2ZShkYXRhKTtcbiAgICAgICAgfVxuICAgICAgICBkaWFsb2dSZXNwb25zZXMuZGVsZXRlKGlkKTtcbiAgICB9XG59XG5cbi8qKlxuICogQ2FsbGJhY2sgZnVuY3Rpb24gZm9yIGhhbmRsaW5nIGVycm9ycyBpbiBkaWFsb2cuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGlkIC0gVGhlIGlkIG9mIHRoZSBkaWFsb2cgcmVzcG9uc2UuXG4gKiBAcGFyYW0ge3N0cmluZ30gbWVzc2FnZSAtIFRoZSBlcnJvciBtZXNzYWdlLlxuICpcbiAqIEByZXR1cm4ge3ZvaWR9XG4gKi9cbmZ1bmN0aW9uIGRpYWxvZ0Vycm9yQ2FsbGJhY2soaWQsIG1lc3NhZ2UpIHtcbiAgICBsZXQgcCA9IGRpYWxvZ1Jlc3BvbnNlcy5nZXQoaWQpO1xuICAgIGlmIChwKSB7XG4gICAgICAgIHAucmVqZWN0KG1lc3NhZ2UpO1xuICAgICAgICBkaWFsb2dSZXNwb25zZXMuZGVsZXRlKGlkKTtcbiAgICB9XG59XG5cblxuLy8gUmVwbGFjZSBgbWV0aG9kc2Agd2l0aCBjb25zdGFudHMgaW4gVGl0bGUgQ2FzZVxuXG4vKipcbiAqIEBwYXJhbSB7TWVzc2FnZURpYWxvZ09wdGlvbnN9IG9wdGlvbnMgLSBEaWFsb2cgb3B0aW9uc1xuICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nPn0gLSBUaGUgbGFiZWwgb2YgdGhlIGJ1dHRvbiBwcmVzc2VkXG4gKi9cbmV4cG9ydCBjb25zdCBJbmZvID0gKG9wdGlvbnMpID0+IGRpYWxvZyhEaWFsb2dJbmZvLCBvcHRpb25zKTtcblxuLyoqXG4gKiBAcGFyYW0ge01lc3NhZ2VEaWFsb2dPcHRpb25zfSBvcHRpb25zIC0gRGlhbG9nIG9wdGlvbnNcbiAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZz59IC0gVGhlIGxhYmVsIG9mIHRoZSBidXR0b24gcHJlc3NlZFxuICovXG5leHBvcnQgY29uc3QgV2FybmluZyA9IChvcHRpb25zKSA9PiBkaWFsb2coRGlhbG9nV2FybmluZywgb3B0aW9ucyk7XG5cbi8qKlxuICogQHBhcmFtIHtNZXNzYWdlRGlhbG9nT3B0aW9uc30gb3B0aW9ucyAtIERpYWxvZyBvcHRpb25zXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmc+fSAtIFRoZSBsYWJlbCBvZiB0aGUgYnV0dG9uIHByZXNzZWRcbiAqL1xuZXhwb3J0IGNvbnN0IEVycm9yID0gKG9wdGlvbnMpID0+IGRpYWxvZyhEaWFsb2dFcnJvciwgb3B0aW9ucyk7XG5cbi8qKlxuICogQHBhcmFtIHtNZXNzYWdlRGlhbG9nT3B0aW9uc30gb3B0aW9ucyAtIERpYWxvZyBvcHRpb25zXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmc+fSAtIFRoZSBsYWJlbCBvZiB0aGUgYnV0dG9uIHByZXNzZWRcbiAqL1xuZXhwb3J0IGNvbnN0IFF1ZXN0aW9uID0gKG9wdGlvbnMpID0+IGRpYWxvZyhEaWFsb2dRdWVzdGlvbiwgb3B0aW9ucyk7XG5cbi8qKlxuICogQHBhcmFtIHtPcGVuRmlsZURpYWxvZ09wdGlvbnN9IG9wdGlvbnMgLSBEaWFsb2cgb3B0aW9uc1xuICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nW118c3RyaW5nPn0gUmV0dXJucyBzZWxlY3RlZCBmaWxlIG9yIGxpc3Qgb2YgZmlsZXMuIFJldHVybnMgYmxhbmsgc3RyaW5nIGlmIG5vIGZpbGUgaXMgc2VsZWN0ZWQuXG4gKi9cbmV4cG9ydCBjb25zdCBPcGVuRmlsZSA9IChvcHRpb25zKSA9PiBkaWFsb2coRGlhbG9nT3BlbkZpbGUsIG9wdGlvbnMpO1xuXG4vKipcbiAqIEBwYXJhbSB7U2F2ZUZpbGVEaWFsb2dPcHRpb25zfSBvcHRpb25zIC0gRGlhbG9nIG9wdGlvbnNcbiAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZz59IFJldHVybnMgdGhlIHNlbGVjdGVkIGZpbGUuIFJldHVybnMgYmxhbmsgc3RyaW5nIGlmIG5vIGZpbGUgaXMgc2VsZWN0ZWQuXG4gKi9cbmV4cG9ydCBjb25zdCBTYXZlRmlsZSA9IChvcHRpb25zKSA9PiBkaWFsb2coRGlhbG9nU2F2ZUZpbGUsIG9wdGlvbnMpO1xuIiwgIi8qXG4gX1x0ICAgX19cdCAgXyBfX1xufCB8XHQgLyAvX19fIF8oXykgL19fX19cbnwgfCAvfCAvIC8gX18gYC8gLyAvIF9fXy9cbnwgfC8gfC8gLyAvXy8gLyAvIChfXyAgKVxufF9fL3xfXy9cXF9fLF8vXy9fL19fX18vXG5UaGUgZWxlY3Ryb24gYWx0ZXJuYXRpdmUgZm9yIEdvXG4oYykgTGVhIEFudGhvbnkgMjAxOS1wcmVzZW50XG4qL1xuXG4vKiBqc2hpbnQgZXN2ZXJzaW9uOiA5ICovXG5pbXBvcnQgeyBuZXdSdW50aW1lQ2FsbGVyV2l0aElELCBvYmplY3ROYW1lcyB9IGZyb20gXCIuL3J1bnRpbWVcIjtcbmltcG9ydCB7IG5hbm9pZCB9IGZyb20gJ25hbm9pZC9ub24tc2VjdXJlJztcblxuLy8gU2V0dXBcbndpbmRvdy5fd2FpbHMgPSB3aW5kb3cuX3dhaWxzIHx8IHt9O1xud2luZG93Ll93YWlscy5jYWxsUmVzdWx0SGFuZGxlciA9IHJlc3VsdEhhbmRsZXI7XG53aW5kb3cuX3dhaWxzLmNhbGxFcnJvckhhbmRsZXIgPSBlcnJvckhhbmRsZXI7XG5cblxuY29uc3QgQ2FsbEJpbmRpbmcgPSAwO1xuY29uc3QgY2FsbCA9IG5ld1J1bnRpbWVDYWxsZXJXaXRoSUQob2JqZWN0TmFtZXMuQ2FsbCwgJycpO1xubGV0IGNhbGxSZXNwb25zZXMgPSBuZXcgTWFwKCk7XG5cbi8qKlxuICogR2VuZXJhdGVzIGEgdW5pcXVlIElEIHVzaW5nIHRoZSBuYW5vaWQgbGlicmFyeS5cbiAqXG4gKiBAcmV0dXJuIHtzdHJpbmd9IC0gQSB1bmlxdWUgSUQgdGhhdCBkb2VzIG5vdCBleGlzdCBpbiB0aGUgY2FsbFJlc3BvbnNlcyBzZXQuXG4gKi9cbmZ1bmN0aW9uIGdlbmVyYXRlSUQoKSB7XG4gICAgbGV0IHJlc3VsdDtcbiAgICBkbyB7XG4gICAgICAgIHJlc3VsdCA9IG5hbm9pZCgpO1xuICAgIH0gd2hpbGUgKGNhbGxSZXNwb25zZXMuaGFzKHJlc3VsdCkpO1xuICAgIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogSGFuZGxlcyB0aGUgcmVzdWx0IG9mIGEgY2FsbCByZXF1ZXN0LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBpZCAtIFRoZSBpZCBvZiB0aGUgcmVxdWVzdCB0byBoYW5kbGUgdGhlIHJlc3VsdCBmb3IuXG4gKiBAcGFyYW0ge3N0cmluZ30gZGF0YSAtIFRoZSByZXN1bHQgZGF0YSBvZiB0aGUgcmVxdWVzdC5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gaXNKU09OIC0gSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGRhdGEgaXMgSlNPTiBvciBub3QuXG4gKlxuICogQHJldHVybiB7dW5kZWZpbmVkfSAtIFRoaXMgbWV0aG9kIGRvZXMgbm90IHJldHVybiBhbnkgdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIHJlc3VsdEhhbmRsZXIoaWQsIGRhdGEsIGlzSlNPTikge1xuICAgIGNvbnN0IHByb21pc2VIYW5kbGVyID0gZ2V0QW5kRGVsZXRlUmVzcG9uc2UoaWQpO1xuICAgIGlmIChwcm9taXNlSGFuZGxlcikge1xuICAgICAgICBwcm9taXNlSGFuZGxlci5yZXNvbHZlKGlzSlNPTiA/IEpTT04ucGFyc2UoZGF0YSkgOiBkYXRhKTtcbiAgICB9XG59XG5cbi8qKlxuICogSGFuZGxlcyB0aGUgZXJyb3IgZnJvbSBhIGNhbGwgcmVxdWVzdC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gaWQgLSBUaGUgaWQgb2YgdGhlIHByb21pc2UgaGFuZGxlci5cbiAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlIC0gVGhlIGVycm9yIG1lc3NhZ2UgdG8gcmVqZWN0IHRoZSBwcm9taXNlIGhhbmRsZXIgd2l0aC5cbiAqXG4gKiBAcmV0dXJuIHt2b2lkfVxuICovXG5mdW5jdGlvbiBlcnJvckhhbmRsZXIoaWQsIG1lc3NhZ2UpIHtcbiAgICBjb25zdCBwcm9taXNlSGFuZGxlciA9IGdldEFuZERlbGV0ZVJlc3BvbnNlKGlkKTtcbiAgICBpZiAocHJvbWlzZUhhbmRsZXIpIHtcbiAgICAgICAgcHJvbWlzZUhhbmRsZXIucmVqZWN0KG1lc3NhZ2UpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBSZXRyaWV2ZXMgYW5kIHJlbW92ZXMgdGhlIHJlc3BvbnNlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gSUQgZnJvbSB0aGUgY2FsbFJlc3BvbnNlcyBtYXAuXG4gKlxuICogQHBhcmFtIHthbnl9IGlkIC0gVGhlIElEIG9mIHRoZSByZXNwb25zZSB0byBiZSByZXRyaWV2ZWQgYW5kIHJlbW92ZWQuXG4gKlxuICogQHJldHVybnMge2FueX0gVGhlIHJlc3BvbnNlIG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIElELlxuICovXG5mdW5jdGlvbiBnZXRBbmREZWxldGVSZXNwb25zZShpZCkge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gY2FsbFJlc3BvbnNlcy5nZXQoaWQpO1xuICAgIGNhbGxSZXNwb25zZXMuZGVsZXRlKGlkKTtcbiAgICByZXR1cm4gcmVzcG9uc2U7XG59XG5cbi8qKlxuICogRXhlY3V0ZXMgYSBjYWxsIHVzaW5nIHRoZSBwcm92aWRlZCB0eXBlIGFuZCBvcHRpb25zLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gdHlwZSAtIFRoZSB0eXBlIG9mIGNhbGwgdG8gZXhlY3V0ZS5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucz17fV0gLSBBZGRpdGlvbmFsIG9wdGlvbnMgZm9yIHRoZSBjYWxsLlxuICogQHJldHVybiB7UHJvbWlzZX0gLSBBIHByb21pc2UgdGhhdCB3aWxsIGJlIHJlc29sdmVkIG9yIHJlamVjdGVkIGJhc2VkIG9uIHRoZSByZXN1bHQgb2YgdGhlIGNhbGwuXG4gKi9cbmZ1bmN0aW9uIGNhbGxCaW5kaW5nKHR5cGUsIG9wdGlvbnMgPSB7fSkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGNvbnN0IGlkID0gZ2VuZXJhdGVJRCgpO1xuICAgICAgICBvcHRpb25zW1wiY2FsbC1pZFwiXSA9IGlkO1xuICAgICAgICBjYWxsUmVzcG9uc2VzLnNldChpZCwgeyByZXNvbHZlLCByZWplY3QgfSk7XG4gICAgICAgIGNhbGwodHlwZSwgb3B0aW9ucykuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICAgICAgY2FsbFJlc3BvbnNlcy5kZWxldGUoaWQpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbn1cblxuLyoqXG4gKiBDYWxsIG1ldGhvZC5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyAtIFRoZSBvcHRpb25zIGZvciB0aGUgbWV0aG9kLlxuICogQHJldHVybnMge09iamVjdH0gLSBUaGUgcmVzdWx0IG9mIHRoZSBjYWxsLlxuICovXG5leHBvcnQgZnVuY3Rpb24gQ2FsbChvcHRpb25zKSB7XG4gICAgcmV0dXJuIGNhbGxCaW5kaW5nKENhbGxCaW5kaW5nLCBvcHRpb25zKTtcbn1cblxuLyoqXG4gKiBFeGVjdXRlcyBhIG1ldGhvZCBieSBuYW1lLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIG1ldGhvZCBpbiB0aGUgZm9ybWF0ICdwYWNrYWdlLnN0cnVjdC5tZXRob2QnLlxuICogQHBhcmFtIHsuLi4qfSBhcmdzIC0gVGhlIGFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSBtZXRob2QuXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIG5hbWUgaXMgbm90IGEgc3RyaW5nIG9yIGlzIG5vdCBpbiB0aGUgY29ycmVjdCBmb3JtYXQuXG4gKiBAcmV0dXJucyB7Kn0gVGhlIHJlc3VsdCBvZiB0aGUgbWV0aG9kIGV4ZWN1dGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIEJ5TmFtZShuYW1lLCAuLi5hcmdzKSB7XG4gICAgaWYgKHR5cGVvZiBuYW1lICE9PSBcInN0cmluZ1wiIHx8IG5hbWUuc3BsaXQoXCIuXCIpLmxlbmd0aCAhPT0gMykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYWxsQnlOYW1lIHJlcXVpcmVzIGEgc3RyaW5nIGluIHRoZSBmb3JtYXQgJ3BhY2thZ2Uuc3RydWN0Lm1ldGhvZCdcIik7XG4gICAgfVxuICAgIGxldCBbcGFja2FnZU5hbWUsIHN0cnVjdE5hbWUsIG1ldGhvZE5hbWVdID0gbmFtZS5zcGxpdChcIi5cIik7XG4gICAgcmV0dXJuIGNhbGxCaW5kaW5nKENhbGxCaW5kaW5nLCB7XG4gICAgICAgIHBhY2thZ2VOYW1lLFxuICAgICAgICBzdHJ1Y3ROYW1lLFxuICAgICAgICBtZXRob2ROYW1lLFxuICAgICAgICBhcmdzXG4gICAgfSk7XG59XG5cbi8qKlxuICogQ2FsbHMgYSBtZXRob2QgYnkgaXRzIElEIHdpdGggdGhlIHNwZWNpZmllZCBhcmd1bWVudHMuXG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IG1ldGhvZElEIC0gVGhlIElEIG9mIHRoZSBtZXRob2QgdG8gY2FsbC5cbiAqIEBwYXJhbSB7Li4uKn0gYXJncyAtIFRoZSBhcmd1bWVudHMgdG8gcGFzcyB0byB0aGUgbWV0aG9kLlxuICogQHJldHVybiB7Kn0gLSBUaGUgcmVzdWx0IG9mIHRoZSBtZXRob2QgY2FsbC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIEJ5SUQobWV0aG9kSUQsIC4uLmFyZ3MpIHtcbiAgICByZXR1cm4gY2FsbEJpbmRpbmcoQ2FsbEJpbmRpbmcsIHtcbiAgICAgICAgbWV0aG9kSUQsXG4gICAgICAgIGFyZ3NcbiAgICB9KTtcbn1cblxuLyoqXG4gKiBDYWxscyBhIG1ldGhvZCBvbiBhIHBsdWdpbi5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcGx1Z2luTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBwbHVnaW4uXG4gKiBAcGFyYW0ge3N0cmluZ30gbWV0aG9kTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBtZXRob2QgdG8gY2FsbC5cbiAqIEBwYXJhbSB7Li4uKn0gYXJncyAtIFRoZSBhcmd1bWVudHMgdG8gcGFzcyB0byB0aGUgbWV0aG9kLlxuICogQHJldHVybnMgeyp9IC0gVGhlIHJlc3VsdCBvZiB0aGUgbWV0aG9kIGNhbGwuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBQbHVnaW4ocGx1Z2luTmFtZSwgbWV0aG9kTmFtZSwgLi4uYXJncykge1xuICAgIHJldHVybiBjYWxsQmluZGluZyhDYWxsQmluZGluZywge1xuICAgICAgICBwYWNrYWdlTmFtZTogXCJ3YWlscy1wbHVnaW5zXCIsXG4gICAgICAgIHN0cnVjdE5hbWU6IHBsdWdpbk5hbWUsXG4gICAgICAgIG1ldGhvZE5hbWUsXG4gICAgICAgIGFyZ3NcbiAgICB9KTtcbn1cbiIsICIvKlxuIF9cdCAgIF9fXHQgIF8gX19cbnwgfFx0IC8gL19fXyBfKF8pIC9fX19fXG58IHwgL3wgLyAvIF9fIGAvIC8gLyBfX18vXG58IHwvIHwvIC8gL18vIC8gLyAoX18gIClcbnxfXy98X18vXFxfXyxfL18vXy9fX19fL1xuVGhlIGVsZWN0cm9uIGFsdGVybmF0aXZlIGZvciBHb1xuKGMpIExlYSBBbnRob255IDIwMTktcHJlc2VudFxuKi9cblxuaW1wb3J0IHtkZWJ1Z0xvZ30gZnJvbSBcIi4uL0B3YWlsc2lvL3J1bnRpbWUvc3JjL2xvZ1wiO1xuXG53aW5kb3cuX3dhaWxzID0gd2luZG93Ll93YWlscyB8fCB7fTtcblxuaW1wb3J0ICogYXMgQXBwbGljYXRpb24gZnJvbSBcIi4uL0B3YWlsc2lvL3J1bnRpbWUvc3JjL2FwcGxpY2F0aW9uXCI7XG5pbXBvcnQgKiBhcyBCcm93c2VyIGZyb20gXCIuLi9Ad2FpbHNpby9ydW50aW1lL3NyYy9icm93c2VyXCI7XG5pbXBvcnQgKiBhcyBDbGlwYm9hcmQgZnJvbSBcIi4uL0B3YWlsc2lvL3J1bnRpbWUvc3JjL2NsaXBib2FyZFwiO1xuaW1wb3J0ICogYXMgQ29udGV4dE1lbnUgZnJvbSBcIi4uL0B3YWlsc2lvL3J1bnRpbWUvc3JjL2NvbnRleHRtZW51XCI7XG5pbXBvcnQgKiBhcyBEcmFnIGZyb20gXCIuLi9Ad2FpbHNpby9ydW50aW1lL3NyYy9kcmFnXCI7XG5pbXBvcnQgKiBhcyBGbGFncyBmcm9tIFwiLi4vQHdhaWxzaW8vcnVudGltZS9zcmMvZmxhZ3NcIjtcbmltcG9ydCAqIGFzIFNjcmVlbnMgZnJvbSBcIi4uL0B3YWlsc2lvL3J1bnRpbWUvc3JjL3NjcmVlbnNcIjtcbmltcG9ydCAqIGFzIFN5c3RlbSBmcm9tIFwiLi4vQHdhaWxzaW8vcnVudGltZS9zcmMvc3lzdGVtXCI7XG5pbXBvcnQgKiBhcyBXaW5kb3cgZnJvbSBcIi4uL0B3YWlsc2lvL3J1bnRpbWUvc3JjL3dpbmRvd1wiO1xuaW1wb3J0ICogYXMgV01MIGZyb20gJy4uL0B3YWlsc2lvL3J1bnRpbWUvc3JjL3dtbCc7XG5pbXBvcnQgKiBhcyBFdmVudHMgZnJvbSBcIi4uL0B3YWlsc2lvL3J1bnRpbWUvc3JjL2V2ZW50c1wiO1xuaW1wb3J0ICogYXMgRGlhbG9ncyBmcm9tIFwiLi4vQHdhaWxzaW8vcnVudGltZS9zcmMvZGlhbG9nc1wiO1xuaW1wb3J0ICogYXMgQ2FsbCBmcm9tIFwiLi4vQHdhaWxzaW8vcnVudGltZS9zcmMvY2FsbHNcIjtcbmltcG9ydCB7aW52b2tlfSBmcm9tIFwiLi4vQHdhaWxzaW8vcnVudGltZS9zcmMvc3lzdGVtXCI7XG5cbi8qKipcbiBUaGlzIHRlY2huaXF1ZSBmb3IgcHJvcGVyIGxvYWQgZGV0ZWN0aW9uIGlzIHRha2VuIGZyb20gSFRNWDpcblxuIEJTRCAyLUNsYXVzZSBMaWNlbnNlXG5cbiBDb3B5cmlnaHQgKGMpIDIwMjAsIEJpZyBTa3kgU29mdHdhcmVcbiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuXG4gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG5cbiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cblxuIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uXG4gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uXG5cbiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkVcbiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFXG4gRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUxcbiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUlxuIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSXG4gQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSxcbiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRVxuIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG5cbiAqKiovXG5cbndpbmRvdy5fd2FpbHMuaW52b2tlPWludm9rZTtcblxud2luZG93LndhaWxzID0gd2luZG93LndhaWxzIHx8IHt9O1xud2luZG93LndhaWxzLkFwcGxpY2F0aW9uID0gQXBwbGljYXRpb247XG53aW5kb3cud2FpbHMuQnJvd3NlciA9IEJyb3dzZXI7XG53aW5kb3cud2FpbHMuQ2FsbCA9IENhbGw7XG53aW5kb3cud2FpbHMuQ2xpcGJvYXJkID0gQ2xpcGJvYXJkO1xud2luZG93LndhaWxzLkRpYWxvZ3MgPSBEaWFsb2dzO1xud2luZG93LndhaWxzLkV2ZW50cyA9IEV2ZW50cztcbndpbmRvdy53YWlscy5GbGFncyA9IEZsYWdzO1xud2luZG93LndhaWxzLlNjcmVlbnMgPSBTY3JlZW5zO1xud2luZG93LndhaWxzLlN5c3RlbSA9IFN5c3RlbTtcbndpbmRvdy53YWlscy5XaW5kb3cgPSBXaW5kb3c7XG53aW5kb3cud2FpbHMuV01MID0gV01MO1xuXG5cbmxldCBpc1JlYWR5ID0gZmFsc2VcbmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCBmdW5jdGlvbigpIHtcbiAgICBpc1JlYWR5ID0gdHJ1ZVxuICAgIHdpbmRvdy5fd2FpbHMuaW52b2tlKCd3YWlsczpydW50aW1lOnJlYWR5Jyk7XG4gICAgaWYoREVCVUcpIHtcbiAgICAgICAgZGVidWdMb2coXCJXYWlscyBSdW50aW1lIExvYWRlZFwiKTtcbiAgICB9XG59KVxuXG5mdW5jdGlvbiB3aGVuUmVhZHkoZm4pIHtcbiAgICBpZiAoaXNSZWFkeSB8fCBkb2N1bWVudC5yZWFkeVN0YXRlID09PSAnY29tcGxldGUnKSB7XG4gICAgICAgIGZuKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsIGZuKTtcbiAgICB9XG59XG5cbndoZW5SZWFkeSgoKSA9PiB7XG4gICAgV01MLlJlbG9hZCgpO1xufSk7XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7OztBQUtPLFdBQVMsU0FBUyxTQUFTO0FBRTlCLFlBQVE7QUFBQSxNQUNKLGtCQUFrQixVQUFVO0FBQUEsTUFDNUI7QUFBQSxNQUNBO0FBQUEsSUFDSjtBQUFBLEVBQ0o7OztBQ1pBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7O0FDQUEsTUFBSSxjQUNGO0FBV0ssTUFBSSxTQUFTLENBQUNBLFFBQU8sT0FBTztBQUNqQyxRQUFJLEtBQUs7QUFDVCxRQUFJLElBQUlBO0FBQ1IsV0FBTyxLQUFLO0FBQ1YsWUFBTSxZQUFhLEtBQUssT0FBTyxJQUFJLEtBQU0sQ0FBQztBQUFBLElBQzVDO0FBQ0EsV0FBTztBQUFBLEVBQ1Q7OztBQ05BLE1BQU0sYUFBYSxPQUFPLFNBQVMsU0FBUztBQUdyQyxNQUFNLGNBQWM7QUFBQSxJQUN2QixNQUFNO0FBQUEsSUFDTixXQUFXO0FBQUEsSUFDWCxhQUFhO0FBQUEsSUFDYixRQUFRO0FBQUEsSUFDUixhQUFhO0FBQUEsSUFDYixRQUFRO0FBQUEsSUFDUixRQUFRO0FBQUEsSUFDUixTQUFTO0FBQUEsSUFDVCxRQUFRO0FBQUEsSUFDUixTQUFTO0FBQUEsRUFDYjtBQUNPLE1BQUksV0FBVyxPQUFPO0FBc0J0QixXQUFTLHVCQUF1QixRQUFRLFlBQVk7QUFDdkQsV0FBTyxTQUFVLFFBQVEsT0FBSyxNQUFNO0FBQ2hDLGFBQU8sa0JBQWtCLFFBQVEsUUFBUSxZQUFZLElBQUk7QUFBQSxJQUM3RDtBQUFBLEVBQ0o7QUFxQ0EsV0FBUyxrQkFBa0IsVUFBVSxRQUFRLFlBQVksTUFBTTtBQUMzRCxRQUFJLE1BQU0sSUFBSSxJQUFJLFVBQVU7QUFDNUIsUUFBSSxhQUFhLE9BQU8sVUFBVSxRQUFRO0FBQzFDLFFBQUksYUFBYSxPQUFPLFVBQVUsTUFBTTtBQUN4QyxRQUFJLGVBQWU7QUFBQSxNQUNmLFNBQVMsQ0FBQztBQUFBLElBQ2Q7QUFDQSxRQUFJLFlBQVk7QUFDWixtQkFBYSxRQUFRLHFCQUFxQixJQUFJO0FBQUEsSUFDbEQ7QUFDQSxRQUFJLE1BQU07QUFDTixVQUFJLGFBQWEsT0FBTyxRQUFRLEtBQUssVUFBVSxJQUFJLENBQUM7QUFBQSxJQUN4RDtBQUNBLGlCQUFhLFFBQVEsbUJBQW1CLElBQUk7QUFDNUMsV0FBTyxJQUFJLFFBQVEsQ0FBQyxTQUFTLFdBQVc7QUFDcEMsWUFBTSxLQUFLLFlBQVksRUFDbEIsS0FBSyxjQUFZO0FBQ2QsWUFBSSxTQUFTLElBQUk7QUFFYixjQUFJLFNBQVMsUUFBUSxJQUFJLGNBQWMsS0FBSyxTQUFTLFFBQVEsSUFBSSxjQUFjLEVBQUUsUUFBUSxrQkFBa0IsTUFBTSxJQUFJO0FBQ2pILG1CQUFPLFNBQVMsS0FBSztBQUFBLFVBQ3pCLE9BQU87QUFDSCxtQkFBTyxTQUFTLEtBQUs7QUFBQSxVQUN6QjtBQUFBLFFBQ0o7QUFDQSxlQUFPLE1BQU0sU0FBUyxVQUFVLENBQUM7QUFBQSxNQUNyQyxDQUFDLEVBQ0EsS0FBSyxVQUFRLFFBQVEsSUFBSSxDQUFDLEVBQzFCLE1BQU0sV0FBUyxPQUFPLEtBQUssQ0FBQztBQUFBLElBQ3JDLENBQUM7QUFBQSxFQUNMOzs7QUY1R0EsTUFBTSxPQUFPLHVCQUF1QixZQUFZLGFBQWEsRUFBRTtBQUUvRCxNQUFNLGFBQWE7QUFDbkIsTUFBTSxhQUFhO0FBQ25CLE1BQU0sYUFBYTtBQVFaLFdBQVMsT0FBTztBQUNuQixXQUFPLEtBQUssVUFBVTtBQUFBLEVBQzFCO0FBT08sV0FBUyxPQUFPO0FBQ25CLFdBQU8sS0FBSyxVQUFVO0FBQUEsRUFDMUI7QUFPTyxXQUFTLE9BQU87QUFDbkIsV0FBTyxLQUFLLFVBQVU7QUFBQSxFQUMxQjs7O0FHN0NBO0FBQUE7QUFBQTtBQUFBO0FBYUEsTUFBTUMsUUFBTyx1QkFBdUIsWUFBWSxTQUFTLEVBQUU7QUFDM0QsTUFBTSxpQkFBaUI7QUFPaEIsV0FBUyxRQUFRLEtBQUs7QUFDekIsV0FBT0EsTUFBSyxnQkFBZ0IsRUFBQyxJQUFHLENBQUM7QUFBQSxFQUNyQzs7O0FDdkJBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFjQSxNQUFNQyxRQUFPLHVCQUF1QixZQUFZLFdBQVcsRUFBRTtBQUM3RCxNQUFNLG1CQUFtQjtBQUN6QixNQUFNLGdCQUFnQjtBQVFmLFdBQVMsUUFBUSxNQUFNO0FBQzFCLFdBQU9BLE1BQUssa0JBQWtCLEVBQUMsS0FBSSxDQUFDO0FBQUEsRUFDeEM7QUFNTyxXQUFTLE9BQU87QUFDbkIsV0FBT0EsTUFBSyxhQUFhO0FBQUEsRUFDN0I7OztBQ2xDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBYUEsTUFBSUMsUUFBTyx1QkFBdUIsWUFBWSxRQUFRLEVBQUU7QUFDeEQsTUFBTSxtQkFBbUI7QUFDekIsTUFBTSxjQUFjO0FBRWIsV0FBUyxPQUFPLEtBQUs7QUFDeEIsUUFBRyxPQUFPLFFBQVE7QUFDZCxhQUFPLE9BQU8sT0FBTyxRQUFRLFlBQVksR0FBRztBQUFBLElBQ2hEO0FBQ0EsV0FBTyxPQUFPLE9BQU8sZ0JBQWdCLFNBQVMsWUFBWSxHQUFHO0FBQUEsRUFDakU7QUFPTyxXQUFTLGFBQWE7QUFDekIsV0FBT0EsTUFBSyxnQkFBZ0I7QUFBQSxFQUNoQztBQVNPLFdBQVMsZUFBZTtBQUMzQixRQUFJLFdBQVcsTUFBTSxxQkFBcUI7QUFDMUMsV0FBTyxTQUFTLEtBQUs7QUFBQSxFQUN6QjtBQWFPLFdBQVMsY0FBYztBQUMxQixXQUFPQSxNQUFLLFdBQVc7QUFBQSxFQUMzQjtBQU9PLFdBQVMsWUFBWTtBQUN4QixXQUFPLE9BQU8sT0FBTyxZQUFZLE9BQU87QUFBQSxFQUM1QztBQU9PLFdBQVMsVUFBVTtBQUN0QixXQUFPLE9BQU8sT0FBTyxZQUFZLE9BQU87QUFBQSxFQUM1QztBQU9PLFdBQVMsUUFBUTtBQUNwQixXQUFPLE9BQU8sT0FBTyxZQUFZLE9BQU87QUFBQSxFQUM1QztBQU1PLFdBQVMsVUFBVTtBQUN0QixXQUFPLE9BQU8sT0FBTyxZQUFZLFNBQVM7QUFBQSxFQUM5QztBQU9PLFdBQVMsUUFBUTtBQUNwQixXQUFPLE9BQU8sT0FBTyxZQUFZLFNBQVM7QUFBQSxFQUM5QztBQU9PLFdBQVMsVUFBVTtBQUN0QixXQUFPLE9BQU8sT0FBTyxZQUFZLFNBQVM7QUFBQSxFQUM5QztBQUVPLFdBQVMsVUFBVTtBQUN0QixXQUFPLE9BQU8sT0FBTyxZQUFZLFVBQVU7QUFBQSxFQUMvQzs7O0FDbkdBLFNBQU8saUJBQWlCLGVBQWUsa0JBQWtCO0FBRXpELE1BQU1DLFFBQU8sdUJBQXVCLFlBQVksYUFBYSxFQUFFO0FBQy9ELE1BQU0sa0JBQWtCO0FBRXhCLFdBQVMsZ0JBQWdCLElBQUksR0FBRyxHQUFHLE1BQU07QUFDckMsU0FBS0EsTUFBSyxpQkFBaUIsRUFBQyxJQUFJLEdBQUcsR0FBRyxLQUFJLENBQUM7QUFBQSxFQUMvQztBQUVBLFdBQVMsbUJBQW1CLE9BQU87QUFFL0IsUUFBSSxVQUFVLE1BQU07QUFDcEIsUUFBSSxvQkFBb0IsT0FBTyxpQkFBaUIsT0FBTyxFQUFFLGlCQUFpQixzQkFBc0I7QUFDaEcsd0JBQW9CLG9CQUFvQixrQkFBa0IsS0FBSyxJQUFJO0FBQ25FLFFBQUksbUJBQW1CO0FBQ25CLFlBQU0sZUFBZTtBQUNyQixVQUFJLHdCQUF3QixPQUFPLGlCQUFpQixPQUFPLEVBQUUsaUJBQWlCLDJCQUEyQjtBQUN6RyxzQkFBZ0IsbUJBQW1CLE1BQU0sU0FBUyxNQUFNLFNBQVMscUJBQXFCO0FBQ3RGO0FBQUEsSUFDSjtBQUVBLDhCQUEwQixLQUFLO0FBQUEsRUFDbkM7QUFVQSxXQUFTLDBCQUEwQixPQUFPO0FBR3RDLFFBQUksUUFBUSxHQUFHO0FBQ1g7QUFBQSxJQUNKO0FBR0EsVUFBTSxVQUFVLE1BQU07QUFDdEIsVUFBTSxnQkFBZ0IsT0FBTyxpQkFBaUIsT0FBTztBQUNyRCxVQUFNLDJCQUEyQixjQUFjLGlCQUFpQix1QkFBdUIsRUFBRSxLQUFLO0FBQzlGLFlBQVEsMEJBQTBCO0FBQUEsTUFDOUIsS0FBSztBQUNEO0FBQUEsTUFDSixLQUFLO0FBQ0QsY0FBTSxlQUFlO0FBQ3JCO0FBQUEsTUFDSjtBQUVJLFlBQUksUUFBUSxtQkFBbUI7QUFDM0I7QUFBQSxRQUNKO0FBR0EsY0FBTSxZQUFZLE9BQU8sYUFBYTtBQUN0QyxjQUFNLGVBQWdCLFVBQVUsU0FBUyxFQUFFLFNBQVM7QUFDcEQsWUFBSSxjQUFjO0FBQ2QsbUJBQVMsSUFBSSxHQUFHLElBQUksVUFBVSxZQUFZLEtBQUs7QUFDM0Msa0JBQU0sUUFBUSxVQUFVLFdBQVcsQ0FBQztBQUNwQyxrQkFBTSxRQUFRLE1BQU0sZUFBZTtBQUNuQyxxQkFBUyxJQUFJLEdBQUcsSUFBSSxNQUFNLFFBQVEsS0FBSztBQUNuQyxvQkFBTSxPQUFPLE1BQU0sQ0FBQztBQUNwQixrQkFBSSxTQUFTLGlCQUFpQixLQUFLLE1BQU0sS0FBSyxHQUFHLE1BQU0sU0FBUztBQUM1RDtBQUFBLGNBQ0o7QUFBQSxZQUNKO0FBQUEsVUFDSjtBQUFBLFFBQ0o7QUFFQSxZQUFJLFFBQVEsWUFBWSxXQUFXLFFBQVEsWUFBWSxZQUFZO0FBQy9ELGNBQUksZ0JBQWlCLENBQUMsUUFBUSxZQUFZLENBQUMsUUFBUSxVQUFXO0FBQzFEO0FBQUEsVUFDSjtBQUFBLFFBQ0o7QUFHQSxjQUFNLGVBQWU7QUFBQSxJQUM3QjtBQUFBLEVBQ0o7OztBQ2hHQTtBQUFBO0FBQUE7QUFBQTtBQWtCTyxXQUFTLFFBQVEsV0FBVztBQUMvQixRQUFJO0FBQ0EsYUFBTyxPQUFPLE9BQU8sTUFBTSxTQUFTO0FBQUEsSUFDeEMsU0FBUyxHQUFHO0FBQ1IsWUFBTSxJQUFJLE1BQU0sOEJBQThCLFlBQVksUUFBUSxDQUFDO0FBQUEsSUFDdkU7QUFBQSxFQUNKOzs7QUNSQSxTQUFPLFNBQVMsT0FBTyxVQUFVLENBQUM7QUFDbEMsU0FBTyxPQUFPLGVBQWU7QUFDN0IsU0FBTyxPQUFPLFVBQVU7QUFDeEIsU0FBTyxpQkFBaUIsYUFBYSxXQUFXO0FBQ2hELFNBQU8saUJBQWlCLGFBQWEsV0FBVztBQUNoRCxTQUFPLGlCQUFpQixXQUFXLFNBQVM7QUFHNUMsTUFBSSxhQUFhO0FBQ2pCLE1BQUksYUFBYTtBQUNqQixNQUFJLFlBQVk7QUFDaEIsTUFBSSxnQkFBZ0I7QUFFcEIsV0FBUyxTQUFTLEdBQUc7QUFDakIsUUFBSSxNQUFNLE9BQU8saUJBQWlCLEVBQUUsTUFBTSxFQUFFLGlCQUFpQixxQkFBcUI7QUFDbEYsUUFBSSxDQUFDLE9BQU8sUUFBUSxNQUFNLElBQUksS0FBSyxNQUFNLFVBQVUsRUFBRSxZQUFZLEdBQUc7QUFDaEUsYUFBTztBQUFBLElBQ1g7QUFDQSxXQUFPLEVBQUUsV0FBVztBQUFBLEVBQ3hCO0FBRUEsV0FBUyxhQUFhLE9BQU87QUFDekIsZ0JBQVk7QUFBQSxFQUNoQjtBQUVBLFdBQVMsVUFBVTtBQUNmLGFBQVMsS0FBSyxNQUFNLFNBQVM7QUFDN0IsaUJBQWE7QUFBQSxFQUNqQjtBQUVBLFdBQVMsYUFBYTtBQUNsQixRQUFJLFlBQWE7QUFDYixhQUFPLFVBQVUsVUFBVSxFQUFFO0FBQzdCLGFBQU87QUFBQSxJQUNYO0FBQ0EsV0FBTztBQUFBLEVBQ1g7QUFFQSxXQUFTLFlBQVksR0FBRztBQUNwQixRQUFHLFVBQVUsS0FBSyxXQUFXLEtBQUssU0FBUyxDQUFDLEdBQUc7QUFDM0MsbUJBQWEsQ0FBQyxDQUFDLFlBQVksQ0FBQztBQUFBLElBQ2hDO0FBQUEsRUFDSjtBQUVBLFdBQVMsWUFBWSxHQUFHO0FBRXBCLFdBQU8sRUFBRSxFQUFFLFVBQVUsRUFBRSxPQUFPLGVBQWUsRUFBRSxVQUFVLEVBQUUsT0FBTztBQUFBLEVBQ3RFO0FBRUEsV0FBUyxVQUFVLEdBQUc7QUFDbEIsUUFBSSxlQUFlLEVBQUUsWUFBWSxTQUFZLEVBQUUsVUFBVSxFQUFFO0FBQzNELFFBQUksZUFBZSxHQUFHO0FBQ2xCLGNBQVE7QUFBQSxJQUNaO0FBQUEsRUFDSjtBQUVBLFdBQVMsVUFBVSxTQUFTLGVBQWU7QUFDdkMsYUFBUyxnQkFBZ0IsTUFBTSxTQUFTO0FBQ3hDLGlCQUFhO0FBQUEsRUFDakI7QUFFQSxXQUFTLFlBQVksR0FBRztBQUNwQixpQkFBYSxVQUFVLENBQUM7QUFDeEIsUUFBSSxVQUFVLEtBQUssV0FBVztBQUMxQixtQkFBYSxDQUFDO0FBQUEsSUFDbEI7QUFBQSxFQUNKO0FBRUEsV0FBUyxVQUFVLEdBQUc7QUFDbEIsUUFBSSxlQUFlLEVBQUUsWUFBWSxTQUFZLEVBQUUsVUFBVSxFQUFFO0FBQzNELFFBQUcsY0FBYyxlQUFlLEdBQUc7QUFDL0IsYUFBTyxNQUFNO0FBQ2IsYUFBTztBQUFBLElBQ1g7QUFDQSxXQUFPO0FBQUEsRUFDWDtBQUVBLFdBQVMsYUFBYSxHQUFHO0FBQ3JCLFFBQUkscUJBQXFCLFFBQVEsMkJBQTJCLEtBQUs7QUFDakUsUUFBSSxvQkFBb0IsUUFBUSwwQkFBMEIsS0FBSztBQUcvRCxRQUFJLGNBQWMsUUFBUSxtQkFBbUIsS0FBSztBQUVsRCxRQUFJLGNBQWMsT0FBTyxhQUFhLEVBQUUsVUFBVTtBQUNsRCxRQUFJLGFBQWEsRUFBRSxVQUFVO0FBQzdCLFFBQUksWUFBWSxFQUFFLFVBQVU7QUFDNUIsUUFBSSxlQUFlLE9BQU8sY0FBYyxFQUFFLFVBQVU7QUFHcEQsUUFBSSxjQUFjLE9BQU8sYUFBYSxFQUFFLFVBQVcsb0JBQW9CO0FBQ3ZFLFFBQUksYUFBYSxFQUFFLFVBQVcsb0JBQW9CO0FBQ2xELFFBQUksWUFBWSxFQUFFLFVBQVcscUJBQXFCO0FBQ2xELFFBQUksZUFBZSxPQUFPLGNBQWMsRUFBRSxVQUFXLHFCQUFxQjtBQUcxRSxRQUFJLENBQUMsY0FBYyxDQUFDLGVBQWUsQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLGVBQWUsUUFBVztBQUN4RixnQkFBVTtBQUFBLElBQ2QsV0FFUyxlQUFlO0FBQWMsZ0JBQVUsV0FBVztBQUFBLGFBQ2xELGNBQWM7QUFBYyxnQkFBVSxXQUFXO0FBQUEsYUFDakQsY0FBYztBQUFXLGdCQUFVLFdBQVc7QUFBQSxhQUM5QyxhQUFhO0FBQWEsZ0JBQVUsV0FBVztBQUFBLGFBQy9DO0FBQVksZ0JBQVUsVUFBVTtBQUFBLGFBQ2hDO0FBQVcsZ0JBQVUsVUFBVTtBQUFBLGFBQy9CO0FBQWMsZ0JBQVUsVUFBVTtBQUFBLGFBQ2xDO0FBQWEsZ0JBQVUsVUFBVTtBQUFBLEVBQzlDOzs7QUM1SEE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBdURBLE1BQU1DLFFBQU8sdUJBQXVCLFlBQVksU0FBUyxFQUFFO0FBRTNELE1BQU0sU0FBUztBQUNmLE1BQU0sYUFBYTtBQUNuQixNQUFNLGFBQWE7QUFNWixXQUFTLFNBQVM7QUFDckIsV0FBT0EsTUFBSyxNQUFNO0FBQUEsRUFDdEI7QUFLTyxXQUFTLGFBQWE7QUFDekIsV0FBT0EsTUFBSyxVQUFVO0FBQUEsRUFDMUI7QUFNTyxXQUFTLGFBQWE7QUFDekIsV0FBT0EsTUFBSyxVQUFVO0FBQUEsRUFDMUI7OztBQ2xGQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsZ0JBQUFDO0FBQUEsSUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsZ0JBQUFDO0FBQUEsSUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFtQkEsTUFBTSxTQUFTO0FBQ2YsTUFBTSxXQUFXO0FBQ2pCLE1BQU0sYUFBYTtBQUNuQixNQUFNLGVBQWU7QUFDckIsTUFBTSxVQUFVO0FBQ2hCLE1BQU0sT0FBTztBQUNiLE1BQU0sYUFBYTtBQUNuQixNQUFNLGFBQWE7QUFDbkIsTUFBTSxpQkFBaUI7QUFDdkIsTUFBTSxzQkFBc0I7QUFDNUIsTUFBTSxtQkFBbUI7QUFDekIsTUFBTSxTQUFTO0FBQ2YsTUFBTSxPQUFPO0FBQ2IsTUFBTSxXQUFXO0FBQ2pCLE1BQU0sYUFBYTtBQUNuQixNQUFNLGlCQUFpQjtBQUN2QixNQUFNLFdBQVc7QUFDakIsTUFBTSxhQUFhO0FBQ25CLE1BQU0sVUFBVTtBQUNoQixNQUFNLE9BQU87QUFDYixNQUFNLFFBQVE7QUFDZCxNQUFNLHNCQUFzQjtBQUM1QixNQUFNQyxnQkFBZTtBQUNyQixNQUFNLFFBQVE7QUFDZCxNQUFNLFNBQVM7QUFDZixNQUFNLFNBQVM7QUFDZixNQUFNLFVBQVU7QUFDaEIsTUFBTSxZQUFZO0FBQ2xCLE1BQU0sZUFBZTtBQUNyQixNQUFNLGVBQWU7QUFFckIsTUFBTSxhQUFhLElBQUksRUFBRTtBQUV6QixXQUFTLGFBQWFDLFFBQU07QUFDeEIsV0FBTztBQUFBLE1BQ0gsS0FBSyxDQUFDLGVBQWUsYUFBYSx1QkFBdUIsWUFBWSxRQUFRLFVBQVUsQ0FBQztBQUFBLE1BQ3hGLFFBQVEsTUFBTUEsT0FBSyxNQUFNO0FBQUEsTUFDekIsVUFBVSxDQUFDLFVBQVVBLE9BQUssVUFBVSxFQUFDLE1BQUssQ0FBQztBQUFBLE1BQzNDLFlBQVksTUFBTUEsT0FBSyxVQUFVO0FBQUEsTUFDakMsY0FBYyxNQUFNQSxPQUFLLFlBQVk7QUFBQSxNQUNyQyxTQUFTLENBQUNDLFFBQU9DLFlBQVdGLE9BQUssU0FBUyxFQUFDLE9BQUFDLFFBQU8sUUFBQUMsUUFBTSxDQUFDO0FBQUEsTUFDekQsTUFBTSxNQUFNRixPQUFLLElBQUk7QUFBQSxNQUNyQixZQUFZLENBQUNDLFFBQU9DLFlBQVdGLE9BQUssWUFBWSxFQUFDLE9BQUFDLFFBQU8sUUFBQUMsUUFBTSxDQUFDO0FBQUEsTUFDL0QsWUFBWSxDQUFDRCxRQUFPQyxZQUFXRixPQUFLLFlBQVksRUFBQyxPQUFBQyxRQUFPLFFBQUFDLFFBQU0sQ0FBQztBQUFBLE1BQy9ELGdCQUFnQixDQUFDLFVBQVVGLE9BQUssZ0JBQWdCLEVBQUMsYUFBYSxNQUFLLENBQUM7QUFBQSxNQUNwRSxxQkFBcUIsQ0FBQyxHQUFHLE1BQU1BLE9BQUsscUJBQXFCLEVBQUMsR0FBRyxFQUFDLENBQUM7QUFBQSxNQUMvRCxrQkFBa0IsTUFBTUEsT0FBSyxnQkFBZ0I7QUFBQSxNQUM3QyxRQUFRLE1BQU1BLE9BQUssTUFBTTtBQUFBLE1BQ3pCLE1BQU0sTUFBTUEsT0FBSyxJQUFJO0FBQUEsTUFDckIsVUFBVSxNQUFNQSxPQUFLLFFBQVE7QUFBQSxNQUM3QixZQUFZLE1BQU1BLE9BQUssVUFBVTtBQUFBLE1BQ2pDLGdCQUFnQixNQUFNQSxPQUFLLGNBQWM7QUFBQSxNQUN6QyxVQUFVLE1BQU1BLE9BQUssUUFBUTtBQUFBLE1BQzdCLFlBQVksTUFBTUEsT0FBSyxVQUFVO0FBQUEsTUFDakMsU0FBUyxNQUFNQSxPQUFLLE9BQU87QUFBQSxNQUMzQixNQUFNLE1BQU1BLE9BQUssSUFBSTtBQUFBLE1BQ3JCLE9BQU8sTUFBTUEsT0FBSyxLQUFLO0FBQUEsTUFDdkIscUJBQXFCLENBQUMsR0FBRyxHQUFHLEdBQUcsTUFBTUEsT0FBSyxxQkFBcUIsRUFBQyxHQUFHLEdBQUcsR0FBRyxFQUFDLENBQUM7QUFBQSxNQUMzRSxjQUFjLENBQUNHLGVBQWNILE9BQUtELGVBQWMsRUFBQyxXQUFBSSxXQUFTLENBQUM7QUFBQSxNQUMzRCxPQUFPLE1BQU1ILE9BQUssS0FBSztBQUFBLE1BQ3ZCLFFBQVEsTUFBTUEsT0FBSyxNQUFNO0FBQUEsTUFDekIsUUFBUSxNQUFNQSxPQUFLLE1BQU07QUFBQSxNQUN6QixTQUFTLE1BQU1BLE9BQUssT0FBTztBQUFBLE1BQzNCLFdBQVcsTUFBTUEsT0FBSyxTQUFTO0FBQUEsTUFDL0IsY0FBYyxNQUFNQSxPQUFLLFlBQVk7QUFBQSxNQUNyQyxjQUFjLENBQUMsY0FBY0EsT0FBSyxjQUFjLEVBQUMsVUFBUyxDQUFDO0FBQUEsSUFDL0Q7QUFBQSxFQUNKO0FBUU8sV0FBUyxJQUFJLFlBQVk7QUFDNUIsV0FBTyxhQUFhLHVCQUF1QixZQUFZLFFBQVEsVUFBVSxDQUFDO0FBQUEsRUFDOUU7QUFLTyxXQUFTLFNBQVM7QUFDckIsZUFBVyxPQUFPO0FBQUEsRUFDdEI7QUFNTyxXQUFTLFNBQVMsT0FBTztBQUM1QixlQUFXLFNBQVMsS0FBSztBQUFBLEVBQzdCO0FBS08sV0FBUyxhQUFhO0FBQ3pCLGVBQVcsV0FBVztBQUFBLEVBQzFCO0FBT08sV0FBUyxRQUFRQyxRQUFPQyxTQUFRO0FBQ25DLGVBQVcsUUFBUUQsUUFBT0MsT0FBTTtBQUFBLEVBQ3BDO0FBS08sV0FBUyxPQUFPO0FBQ25CLFdBQU8sV0FBVyxLQUFLO0FBQUEsRUFDM0I7QUFPTyxXQUFTLFdBQVdELFFBQU9DLFNBQVE7QUFDdEMsZUFBVyxXQUFXRCxRQUFPQyxPQUFNO0FBQUEsRUFDdkM7QUFPTyxXQUFTLFdBQVdELFFBQU9DLFNBQVE7QUFDdEMsZUFBVyxXQUFXRCxRQUFPQyxPQUFNO0FBQUEsRUFDdkM7QUFNTyxXQUFTLGVBQWUsT0FBTztBQUNsQyxlQUFXLGVBQWUsS0FBSztBQUFBLEVBQ25DO0FBT08sV0FBUyxvQkFBb0IsR0FBRyxHQUFHO0FBQ3RDLGVBQVcsb0JBQW9CLEdBQUcsQ0FBQztBQUFBLEVBQ3ZDO0FBS08sV0FBUyxtQkFBbUI7QUFDL0IsV0FBTyxXQUFXLGlCQUFpQjtBQUFBLEVBQ3ZDO0FBS08sV0FBUyxTQUFTO0FBQ3JCLFdBQU8sV0FBVyxPQUFPO0FBQUEsRUFDN0I7QUFLTyxXQUFTRSxRQUFPO0FBQ25CLGVBQVcsS0FBSztBQUFBLEVBQ3BCO0FBS08sV0FBUyxXQUFXO0FBQ3ZCLGVBQVcsU0FBUztBQUFBLEVBQ3hCO0FBS08sV0FBUyxhQUFhO0FBQ3pCLGVBQVcsV0FBVztBQUFBLEVBQzFCO0FBS08sV0FBUyxpQkFBaUI7QUFDN0IsZUFBVyxlQUFlO0FBQUEsRUFDOUI7QUFLTyxXQUFTLFdBQVc7QUFDdkIsZUFBVyxTQUFTO0FBQUEsRUFDeEI7QUFLTyxXQUFTLGFBQWE7QUFDekIsZUFBVyxXQUFXO0FBQUEsRUFDMUI7QUFLTyxXQUFTLFVBQVU7QUFDdEIsZUFBVyxRQUFRO0FBQUEsRUFDdkI7QUFLTyxXQUFTQyxRQUFPO0FBQ25CLGVBQVcsS0FBSztBQUFBLEVBQ3BCO0FBS08sV0FBUyxRQUFRO0FBQ3BCLGVBQVcsTUFBTTtBQUFBLEVBQ3JCO0FBU08sV0FBUyxvQkFBb0IsR0FBRyxHQUFHLEdBQUcsR0FBRztBQUM1QyxlQUFXLG9CQUFvQixHQUFHLEdBQUcsR0FBRyxDQUFDO0FBQUEsRUFDN0M7QUFNTyxXQUFTLGFBQWFGLFlBQVc7QUFDcEMsZUFBVyxhQUFhQSxVQUFTO0FBQUEsRUFDckM7QUFLTyxXQUFTLFFBQVE7QUFDcEIsV0FBTyxXQUFXLE1BQU07QUFBQSxFQUM1QjtBQUtPLFdBQVMsU0FBUztBQUNyQixXQUFPLFdBQVcsT0FBTztBQUFBLEVBQzdCO0FBS08sV0FBUyxTQUFTO0FBQ3JCLGVBQVcsT0FBTztBQUFBLEVBQ3RCO0FBS08sV0FBUyxVQUFVO0FBQ3RCLGVBQVcsUUFBUTtBQUFBLEVBQ3ZCO0FBS08sV0FBUyxZQUFZO0FBQ3hCLGVBQVcsVUFBVTtBQUFBLEVBQ3pCO0FBS08sV0FBUyxlQUFlO0FBQzNCLFdBQU8sV0FBVyxhQUFhO0FBQUEsRUFDbkM7QUFNTyxXQUFTLGFBQWEsV0FBVztBQUNwQyxlQUFXLGFBQWEsU0FBUztBQUFBLEVBQ3JDOzs7QUMzVEE7QUFBQTtBQUFBO0FBQUE7OztBQ0FBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7O0FDQ08sTUFBTSxhQUFhO0FBQUEsSUFDekIsU0FBUztBQUFBLE1BQ1Isb0JBQW9CO0FBQUEsTUFDcEIsc0JBQXNCO0FBQUEsTUFDdEIsWUFBWTtBQUFBLE1BQ1osb0JBQW9CO0FBQUEsTUFDcEIsa0JBQWtCO0FBQUEsTUFDbEIsdUJBQXVCO0FBQUEsTUFDdkIsb0JBQW9CO0FBQUEsTUFDcEIsNEJBQTRCO0FBQUEsTUFDNUIsZ0JBQWdCO0FBQUEsTUFDaEIsY0FBYztBQUFBLE1BQ2QsbUJBQW1CO0FBQUEsTUFDbkIsZ0JBQWdCO0FBQUEsTUFDaEIsa0JBQWtCO0FBQUEsTUFDbEIsa0JBQWtCO0FBQUEsTUFDbEIsb0JBQW9CO0FBQUEsTUFDcEIsZUFBZTtBQUFBLE1BQ2YsZ0JBQWdCO0FBQUEsTUFDaEIsa0JBQWtCO0FBQUEsTUFDbEIsYUFBYTtBQUFBLE1BQ2IsZ0JBQWdCO0FBQUEsTUFDaEIsaUJBQWlCO0FBQUEsTUFDakIsZ0JBQWdCO0FBQUEsTUFDaEIsaUJBQWlCO0FBQUEsTUFDakIsaUJBQWlCO0FBQUEsTUFDakIsZ0JBQWdCO0FBQUEsSUFDakI7QUFBQSxJQUNBLEtBQUs7QUFBQSxNQUNKLDRCQUE0QjtBQUFBLE1BQzVCLHVDQUF1QztBQUFBLE1BQ3ZDLHlDQUF5QztBQUFBLE1BQ3pDLDBCQUEwQjtBQUFBLE1BQzFCLG9DQUFvQztBQUFBLE1BQ3BDLHNDQUFzQztBQUFBLE1BQ3RDLG9DQUFvQztBQUFBLE1BQ3BDLDBDQUEwQztBQUFBLE1BQzFDLCtCQUErQjtBQUFBLE1BQy9CLG9CQUFvQjtBQUFBLE1BQ3BCLHdDQUF3QztBQUFBLE1BQ3hDLHNCQUFzQjtBQUFBLE1BQ3RCLHNCQUFzQjtBQUFBLE1BQ3RCLDZCQUE2QjtBQUFBLE1BQzdCLGdDQUFnQztBQUFBLE1BQ2hDLHFCQUFxQjtBQUFBLE1BQ3JCLDZCQUE2QjtBQUFBLE1BQzdCLDBCQUEwQjtBQUFBLE1BQzFCLHVCQUF1QjtBQUFBLE1BQ3ZCLHVCQUF1QjtBQUFBLE1BQ3ZCLDJCQUEyQjtBQUFBLE1BQzNCLCtCQUErQjtBQUFBLE1BQy9CLG9CQUFvQjtBQUFBLE1BQ3BCLHFCQUFxQjtBQUFBLE1BQ3JCLHFCQUFxQjtBQUFBLE1BQ3JCLHNCQUFzQjtBQUFBLE1BQ3RCLGdDQUFnQztBQUFBLE1BQ2hDLGtDQUFrQztBQUFBLE1BQ2xDLG1DQUFtQztBQUFBLE1BQ25DLG9DQUFvQztBQUFBLE1BQ3BDLCtCQUErQjtBQUFBLE1BQy9CLDZCQUE2QjtBQUFBLE1BQzdCLHVCQUF1QjtBQUFBLE1BQ3ZCLGlDQUFpQztBQUFBLE1BQ2pDLDhCQUE4QjtBQUFBLE1BQzlCLDRCQUE0QjtBQUFBLE1BQzVCLHNDQUFzQztBQUFBLE1BQ3RDLDRCQUE0QjtBQUFBLE1BQzVCLHNCQUFzQjtBQUFBLE1BQ3RCLGtDQUFrQztBQUFBLE1BQ2xDLHNCQUFzQjtBQUFBLE1BQ3RCLHdCQUF3QjtBQUFBLE1BQ3hCLDJCQUEyQjtBQUFBLE1BQzNCLHdCQUF3QjtBQUFBLE1BQ3hCLG1CQUFtQjtBQUFBLE1BQ25CLDBCQUEwQjtBQUFBLE1BQzFCLDhCQUE4QjtBQUFBLE1BQzlCLHlCQUF5QjtBQUFBLE1BQ3pCLDZCQUE2QjtBQUFBLE1BQzdCLGlCQUFpQjtBQUFBLE1BQ2pCLGdCQUFnQjtBQUFBLE1BQ2hCLHNCQUFzQjtBQUFBLE1BQ3RCLGVBQWU7QUFBQSxNQUNmLHlCQUF5QjtBQUFBLE1BQ3pCLHdCQUF3QjtBQUFBLE1BQ3hCLG9CQUFvQjtBQUFBLE1BQ3BCLHFCQUFxQjtBQUFBLE1BQ3JCLGlCQUFpQjtBQUFBLE1BQ2pCLGlCQUFpQjtBQUFBLE1BQ2pCLHNCQUFzQjtBQUFBLE1BQ3RCLG1DQUFtQztBQUFBLE1BQ25DLHFDQUFxQztBQUFBLE1BQ3JDLHVCQUF1QjtBQUFBLE1BQ3ZCLHNCQUFzQjtBQUFBLE1BQ3RCLHdCQUF3QjtBQUFBLE1BQ3hCLDJCQUEyQjtBQUFBLE1BQzNCLG1CQUFtQjtBQUFBLE1BQ25CLHFCQUFxQjtBQUFBLE1BQ3JCLHNCQUFzQjtBQUFBLE1BQ3RCLHNCQUFzQjtBQUFBLE1BQ3RCLDhCQUE4QjtBQUFBLE1BQzlCLGlCQUFpQjtBQUFBLE1BQ2pCLHlCQUF5QjtBQUFBLE1BQ3pCLDJCQUEyQjtBQUFBLE1BQzNCLCtCQUErQjtBQUFBLE1BQy9CLDBCQUEwQjtBQUFBLE1BQzFCLDhCQUE4QjtBQUFBLE1BQzlCLGlCQUFpQjtBQUFBLE1BQ2pCLHVCQUF1QjtBQUFBLE1BQ3ZCLGdCQUFn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VTtBQUN2QixTQUFPLE1BQU0sT0FBTztBQUNwQixTQUFPLE1BQU0sWUFBWTtBQUN6QixTQUFPLE1BQU0sVUFBVTtBQUN2QixTQUFPLE1BQU0sU0FBUztBQUN0QixTQUFPLE1BQU0sUUFBUTtBQUNyQixTQUFPLE1BQU0sVUFBVTtBQUN2QixTQUFPLE1BQU0sU0FBUztBQUN0QixTQUFPLE1BQU0sU0FBUztBQUN0QixTQUFPLE1BQU0sTUFBTTtBQUduQixNQUFJLFVBQVU7QUFDZCxXQUFTLGlCQUFpQixvQkFBb0IsV0FBVztBQUNyRCxjQUFVO0FBQ1YsV0FBTyxPQUFPLE9BQU8scUJBQXFCO0FBQzFDLFFBQUcsTUFBTztBQUNOLGVBQVMsc0JBQXNCO0FBQUEsSUFDbkM7QUFBQSxFQUNKLENBQUM7QUFFRCxXQUFTLFVBQVUsSUFBSTtBQUNuQixRQUFJLFdBQVcsU0FBUyxlQUFlLFlBQVk7QUFDL0MsU0FBRztBQUFBLElBQ1AsT0FBTztBQUNILGVBQVMsaUJBQWlCLG9CQUFvQixFQUFFO0FBQUEsSUFDcEQ7QUFBQSxFQUNKO0FBRUEsWUFBVSxNQUFNO0FBQ1osSUFBSSxPQUFPO0FBQUEsRUFDZixDQUFDOyIsCiAgIm5hbWVzIjogWyJzaXplIiwgImNhbGwiLCAiY2FsbCIsICJjYWxsIiwgImNhbGwiLCAiY2FsbCIsICJIaWRlIiwgIlNob3ciLCAic2V0UmVzaXphYmxlIiwgImNhbGwiLCAid2lkdGgiLCAiaGVpZ2h0IiwgInJlc2l6YWJsZSIsICJIaWRlIiwgIlNob3ciLCAiY2FsbCIsICJldmVudE5hbWUiLCAiRXJyb3IiLCAiY2FsbCIsICJFcnJvciIsICJjYWxsIiwgImdlbmVyYXRlSUQiXQp9Cg==
diff --git a/v3/internal/commands/build_assets/runtime/runtime.js b/v3/internal/commands/build_assets/runtime/runtime.js
index 2c7d16ed30b..baaccee0402 100644
--- a/v3/internal/commands/build_assets/runtime/runtime.js
+++ b/v3/internal/commands/build_assets/runtime/runtime.js
@@ -1 +1 @@
-(()=>{var le=Object.defineProperty;var w=(e,i)=>{for(var n in i)le(e,n,{get:i[n],enumerable:!0})};var T={};w(T,{Hide:()=>We,Quit:()=>fe,Show:()=>ge});var de="useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict";var f=(e=21)=>{let i="",n=e;for(;n--;)i+=de[Math.random()*64|0];return i};var ce=window.location.origin+"/wails/runtime",l={Call:0,Clipboard:1,Application:2,Events:3,ContextMenu:4,Dialog:5,Window:6,Screens:7,System:8,Browser:9,CancelCall:10},se=f();function d(e,i){return function(n,o=null){return we(e,n,i,o)}}function we(e,i,n,o){let t=new URL(ce);t.searchParams.append("object",e),t.searchParams.append("method",i);let a={headers:{}};return n&&(a.headers["x-wails-window-name"]=n),o&&t.searchParams.append("args",JSON.stringify(o)),a.headers["x-wails-client-id"]=se,new Promise((s,m)=>{fetch(t,a).then(c=>{if(c.ok)return c.headers.get("Content-Type")&&c.headers.get("Content-Type").indexOf("application/json")!==-1?c.json():c.text();m(Error(c.statusText))}).then(c=>s(c)).catch(c=>m(c))})}var P=d(l.Application,""),me=0,ue=1,pe=2;function We(){return P(me)}function ge(){return P(ue)}function fe(){return P(pe)}var B={};w(B,{OpenURL:()=>b});var he=d(l.Browser,""),De=0;function b(e){return he(De,{url:e})}var I={};w(I,{SetText:()=>Me,Text:()=>xe});var Q=d(l.Clipboard,""),Ce=0,Se=1;function Me(e){return Q(Ce,{text:e})}function xe(){return Q(Se)}var L={};w(L,{Capabilities:()=>Re,Environment:()=>Ee,IsAMD64:()=>Oe,IsARM:()=>Pe,IsARM64:()=>Te,IsDarkMode:()=>be,IsDebug:()=>F,IsLinux:()=>Ue,IsMac:()=>ye,IsWindows:()=>R,invoke:()=>h});var J=d(l.System,""),Ae=0,ve=1;function h(e){return window.chrome?window.chrome.webview.postMessage(e):window.webkit.messageHandlers.external.postMessage(e)}function be(){return J(Ae)}function Re(){return fetch("/wails/capabilities").json()}function Ee(){return J(ve)}function R(){return window._wails.environment.OS==="windows"}function Ue(){return window._wails.environment.OS==="linux"}function ye(){return window._wails.environment.OS==="darwin"}function Oe(){return window._wails.environment.Arch==="amd64"}function Pe(){return window._wails.environment.Arch==="arm"}function Te(){return window._wails.environment.Arch==="arm64"}function F(){return window._wails.environment.Debug===!0}window.addEventListener("contextmenu",Le);var Be=d(l.ContextMenu,""),Ie=0;function Fe(e,i,n,o){Be(Ie,{id:e,x:i,y:n,data:o})}function Le(e){let i=e.target,n=window.getComputedStyle(i).getPropertyValue("--custom-contextmenu");if(n=n?n.trim():"",n){e.preventDefault();let o=window.getComputedStyle(i).getPropertyValue("--custom-contextmenu-data");Fe(n,e.clientX,e.clientY,o);return}ze(e)}function ze(e){if(F())return;let i=e.target;switch(window.getComputedStyle(i).getPropertyValue("--default-contextmenu").trim()){case"show":return;case"hide":e.preventDefault();return;default:if(i.isContentEditable)return;let t=window.getSelection(),a=t.toString().length>0;if(a)for(let s=0;sS});function S(e){try{return window._wails.flags[e]}catch(i){throw new Error("Unable to retrieve flag '"+e+"': "+i)}}window._wails=window._wails||{};window._wails.setResizable=He;window._wails.endDrag=ee;window.addEventListener("mousedown",_e);window.addEventListener("mousemove",Ge);window.addEventListener("mouseup",je);var M=!1,E=null,$=!1,ke="auto";function Ne(e){let i=window.getComputedStyle(e.target).getPropertyValue("--webkit-app-region");return!i||i===""||i.trim()!=="drag"||e.buttons!==1?!1:e.detail===1}function He(e){$=e}function ee(){document.body.style.cursor="default",M=!1}function Ve(){return E?(h(`resize:${E}`),!0):!1}function _e(e){(R()&&Ve()||Ne(e))&&(M=!!Ze(e))}function Ze(e){return!(e.offsetX>e.target.clientWidth||e.offsetY>e.target.clientHeight)}function je(e){(e.buttons!==void 0?e.buttons:e.which)>0&&ee()}function W(e=ke){document.documentElement.style.cursor=e,E=e}function Ge(e){M=Ye(e),R()&&$&&Ke(e)}function Ye(e){let i=e.buttons!==void 0?e.buttons:e.which;return M&&i>0?(h("drag"),!1):M}function Ke(e){let i=S("system.resizeHandleHeight")||5,n=S("system.resizeHandleWidth")||5,o=S("resizeCornerExtra")||10,t=window.outerWidth-e.clientXJe,GetCurrent:()=>ei,GetPrimary:()=>$e});var k=d(l.Screens,""),Xe=0,qe=1,Qe=2;function Je(){return k(Xe)}function $e(){return k(qe)}function ei(){return k(Qe)}var H={};w(H,{Center:()=>Oi,Close:()=>qi,Fullscreen:()=>Ti,Get:()=>U,GetZoomLevel:()=>rn,Height:()=>en,Hide:()=>Vi,Maximise:()=>_i,Minimise:()=>Gi,RelativePosition:()=>Ni,Restore:()=>Ki,Screen:()=>Hi,SetAlwaysOnTop:()=>zi,SetBackgroundColour:()=>Qi,SetMaxSize:()=>Fi,SetMinSize:()=>Li,SetRelativePosition:()=>ki,SetResizable:()=>Ji,SetSize:()=>Bi,SetTitle:()=>Pi,SetZoomLevel:()=>an,Show:()=>Xi,Size:()=>Ii,ToggleMaximise:()=>ji,UnMaximise:()=>Zi,UnMinimise:()=>Yi,Width:()=>$i,ZoomIn:()=>nn,ZoomOut:()=>on,ZoomReset:()=>tn});var ii=0,ni=1,oi=2,ti=3,ri=4,ai=5,li=6,di=7,ci=8,si=9,wi=10,mi=11,ui=12,pi=13,Wi=14,gi=15,fi=16,hi=17,Di=18,Ci=19,Si=20,Mi=21,xi=22,Ai=23,vi=24,bi=25,Ri=26,Ei=27,Ui=28,yi=29,r=U("");function ie(e){return{Get:i=>ie(d(l.Window,i)),Center:()=>e(ii),SetTitle:i=>e(ni,{title:i}),Fullscreen:()=>e(oi),UnFullscreen:()=>e(ti),SetSize:(i,n)=>e(ri,{width:i,height:n}),Size:()=>e(ai),SetMaxSize:(i,n)=>e(li,{width:i,height:n}),SetMinSize:(i,n)=>e(di,{width:i,height:n}),SetAlwaysOnTop:i=>e(ci,{alwaysOnTop:i}),SetRelativePosition:(i,n)=>e(si,{x:i,y:n}),RelativePosition:()=>e(wi),Screen:()=>e(mi),Hide:()=>e(ui),Maximise:()=>e(pi),UnMaximise:()=>e(Wi),ToggleMaximise:()=>e(gi),Minimise:()=>e(fi),UnMinimise:()=>e(hi),Restore:()=>e(Di),Show:()=>e(Ci),Close:()=>e(Si),SetBackgroundColour:(i,n,o,t)=>e(Mi,{r:i,g:n,b:o,a:t}),SetResizable:i=>e(xi,{resizable:i}),Width:()=>e(Ai),Height:()=>e(vi),ZoomIn:()=>e(bi),ZoomOut:()=>e(Ri),ZoomReset:()=>e(Ei),GetZoomLevel:()=>e(Ui),SetZoomLevel:i=>e(yi,{zoomLevel:i})}}function U(e){return ie(d(l.Window,e))}function Oi(){r.Center()}function Pi(e){r.SetTitle(e)}function Ti(){r.Fullscreen()}function Bi(e,i){r.SetSize(e,i)}function Ii(){return r.Size()}function Fi(e,i){r.SetMaxSize(e,i)}function Li(e,i){r.SetMinSize(e,i)}function zi(e){r.SetAlwaysOnTop(e)}function ki(e,i){r.SetRelativePosition(e,i)}function Ni(){return r.RelativePosition()}function Hi(){return r.Screen()}function Vi(){r.Hide()}function _i(){r.Maximise()}function Zi(){r.UnMaximise()}function ji(){r.ToggleMaximise()}function Gi(){r.Minimise()}function Yi(){r.UnMinimise()}function Ki(){r.Restore()}function Xi(){r.Show()}function qi(){r.Close()}function Qi(e,i,n,o){r.SetBackgroundColour(e,i,n,o)}function Ji(e){r.SetResizable(e)}function $i(){return r.Width()}function en(){return r.Height()}function nn(){r.ZoomIn()}function on(){r.ZoomOut()}function tn(){r.ZoomReset()}function rn(){return r.GetZoomLevel()}function an(e){r.SetZoomLevel(e)}var K={};w(K,{Reload:()=>Y});var j={};w(j,{Emit:()=>Z,Off:()=>Wn,OffAll:()=>gn,On:()=>mn,OnMultiple:()=>_,Once:()=>un,Types:()=>ln,WailsEvent:()=>x,setup:()=>sn});var ne={Windows:{SystemThemeChanged:"windows:SystemThemeChanged",APMPowerStatusChange:"windows:APMPowerStatusChange",APMSuspend:"windows:APMSuspend",APMResumeAutomatic:"windows:APMResumeAutomatic",APMResumeSuspend:"windows:APMResumeSuspend",APMPowerSettingChange:"windows:APMPowerSettingChange",ApplicationStarted:"windows:ApplicationStarted",WebViewNavigationCompleted:"windows:WebViewNavigationCompleted",WindowInactive:"windows:WindowInactive",WindowActive:"windows:WindowActive",WindowClickActive:"windows:WindowClickActive",WindowMaximise:"windows:WindowMaximise",WindowUnMaximise:"windows:WindowUnMaximise",WindowFullscreen:"windows:WindowFullscreen",WindowUnFullscreen:"windows:WindowUnFullscreen",WindowRestore:"windows:WindowRestore",WindowMinimise:"windows:WindowMinimise",WindowUnMinimise:"windows:WindowUnMinimise",WindowClose:"windows:WindowClose",WindowSetFocus:"windows:WindowSetFocus",WindowKillFocus:"windows:WindowKillFocus",WindowDragDrop:"windows:WindowDragDrop",WindowDragEnter:"windows:WindowDragEnter",WindowDragLeave:"windows:WindowDragLeave",WindowDragOver:"windows:WindowDragOver"},Mac:{ApplicationDidBecomeActive:"mac:ApplicationDidBecomeActive",ApplicationDidChangeBackingProperties:"mac:ApplicationDidChangeBackingProperties",ApplicationDidChangeEffectiveAppearance:"mac:ApplicationDidChangeEffectiveAppearance",ApplicationDidChangeIcon:"mac:ApplicationDidChangeIcon",ApplicationDidChangeOcclusionState:"mac:ApplicationDidChangeOcclusionState",ApplicationDidChangeScreenParameters:"mac:ApplicationDidChangeScreenParameters",ApplicationDidChangeStatusBarFrame:"mac:ApplicationDidChangeStatusBarFrame",ApplicationDidChangeStatusBarOrientation:"mac:ApplicationDidChangeStatusBarOrientation",ApplicationDidFinishLaunching:"mac:ApplicationDidFinishLaunching",ApplicationDidHide:"mac:ApplicationDidHide",ApplicationDidResignActiveNotification:"mac:ApplicationDidResignActiveNotification",ApplicationDidUnhide:"mac:ApplicationDidUnhide",ApplicationDidUpdate:"mac:ApplicationDidUpdate",ApplicationWillBecomeActive:"mac:ApplicationWillBecomeActive",ApplicationWillFinishLaunching:"mac:ApplicationWillFinishLaunching",ApplicationWillHide:"mac:ApplicationWillHide",ApplicationWillResignActive:"mac:ApplicationWillResignActive",ApplicationWillTerminate:"mac:ApplicationWillTerminate",ApplicationWillUnhide:"mac:ApplicationWillUnhide",ApplicationWillUpdate:"mac:ApplicationWillUpdate",ApplicationDidChangeTheme:"mac:ApplicationDidChangeTheme!",ApplicationShouldHandleReopen:"mac:ApplicationShouldHandleReopen!",WindowDidBecomeKey:"mac:WindowDidBecomeKey",WindowDidBecomeMain:"mac:WindowDidBecomeMain",WindowDidBeginSheet:"mac:WindowDidBeginSheet",WindowDidChangeAlpha:"mac:WindowDidChangeAlpha",WindowDidChangeBackingLocation:"mac:WindowDidChangeBackingLocation",WindowDidChangeBackingProperties:"mac:WindowDidChangeBackingProperties",WindowDidChangeCollectionBehavior:"mac:WindowDidChangeCollectionBehavior",WindowDidChangeEffectiveAppearance:"mac:WindowDidChangeEffectiveAppearance",WindowDidChangeOcclusionState:"mac:WindowDidChangeOcclusionState",WindowDidChangeOrderingMode:"mac:WindowDidChangeOrderingMode",WindowDidChangeScreen:"mac:WindowDidChangeScreen",WindowDidChangeScreenParameters:"mac:WindowDidChangeScreenParameters",WindowDidChangeScreenProfile:"mac:WindowDidChangeScreenProfile",WindowDidChangeScreenSpace:"mac:WindowDidChangeScreenSpace",WindowDidChangeScreenSpaceProperties:"mac:WindowDidChangeScreenSpaceProperties",WindowDidChangeSharingType:"mac:WindowDidChangeSharingType",WindowDidChangeSpace:"mac:WindowDidChangeSpace",WindowDidChangeSpaceOrderingMode:"mac:WindowDidChangeSpaceOrderingMode",WindowDidChangeTitle:"mac:WindowDidChangeTitle",WindowDidChangeToolbar:"mac:WindowDidChangeToolbar",WindowDidChangeVisibility:"mac:WindowDidChangeVisibility",WindowDidDeminiaturize:"mac:WindowDidDeminiaturize",WindowDidEndSheet:"mac:WindowDidEndSheet",WindowDidEnterFullScreen:"mac:WindowDidEnterFullScreen",WindowDidEnterVersionBrowser:"mac:WindowDidEnterVersionBrowser",WindowDidExitFullScreen:"mac:WindowDidExitFullScreen",WindowDidExitVersionBrowser:"mac:WindowDidExitVersionBrowser",WindowDidExpose:"mac:WindowDidExpose",WindowDidFocus:"mac:WindowDidFocus",WindowDidMiniaturize:"mac:WindowDidMiniaturize",WindowDidMove:"mac:WindowDidMove",WindowDidOrderOffScreen:"mac:WindowDidOrderOffScreen",WindowDidOrderOnScreen:"mac:WindowDidOrderOnScreen",WindowDidResignKey:"mac:WindowDidResignKey",WindowDidResignMain:"mac:WindowDidResignMain",WindowDidResize:"mac:WindowDidResize",WindowDidUpdate:"mac:WindowDidUpdate",WindowDidUpdateAlpha:"mac:WindowDidUpdateAlpha",WindowDidUpdateCollectionBehavior:"mac:WindowDidUpdateCollectionBehavior",WindowDidUpdateCollectionProperties:"mac:WindowDidUpdateCollectionProperties",WindowDidUpdateShadow:"mac:WindowDidUpdateShadow",WindowDidUpdateTitle:"mac:WindowDidUpdateTitle",WindowDidUpdateToolbar:"mac:WindowDidUpdateToolbar",WindowDidUpdateVisibility:"mac:WindowDidUpdateVisibility",WindowShouldClose:"mac:WindowShouldClose!",WindowWillBecomeKey:"mac:WindowWillBecomeKey",WindowWillBecomeMain:"mac:WindowWillBecomeMain",WindowWillBeginSheet:"mac:WindowWillBeginSheet",WindowWillChangeOrderingMode:"mac:WindowWillChangeOrderingMode",WindowWillClose:"mac:WindowWillClose",WindowWillDeminiaturize:"mac:WindowWillDeminiaturize",WindowWillEnterFullScreen:"mac:WindowWillEnterFullScreen",WindowWillEnterVersionBrowser:"mac:WindowWillEnterVersionBrowser",WindowWillExitFullScreen:"mac:WindowWillExitFullScreen",WindowWillExitVersionBrowser:"mac:WindowWillExitVersionBrowser",WindowWillFocus:"mac:WindowWillFocus",WindowWillMiniaturize:"mac:WindowWillMiniaturize",WindowWillMove:"mac:WindowWillMove",WindowWillOrderOffScreen:"mac:WindowWillOrderOffScreen",WindowWillOrderOnScreen:"mac:WindowWillOrderOnScreen",WindowWillResignMain:"mac:WindowWillResignMain",WindowWillResize:"mac:WindowWillResize",WindowWillUnfocus:"mac:WindowWillUnfocus",WindowWillUpdate:"mac:WindowWillUpdate",WindowWillUpdateAlpha:"mac:WindowWillUpdateAlpha",WindowWillUpdateCollectionBehavior:"mac:WindowWillUpdateCollectionBehavior",WindowWillUpdateCollectionProperties:"mac:WindowWillUpdateCollectionProperties",WindowWillUpdateShadow:"mac:WindowWillUpdateShadow",WindowWillUpdateTitle:"mac:WindowWillUpdateTitle",WindowWillUpdateToolbar:"mac:WindowWillUpdateToolbar",WindowWillUpdateVisibility:"mac:WindowWillUpdateVisibility",WindowWillUseStandardFrame:"mac:WindowWillUseStandardFrame",MenuWillOpen:"mac:MenuWillOpen",MenuDidOpen:"mac:MenuDidOpen",MenuDidClose:"mac:MenuDidClose",MenuWillSendAction:"mac:MenuWillSendAction",MenuDidSendAction:"mac:MenuDidSendAction",MenuWillHighlightItem:"mac:MenuWillHighlightItem",MenuDidHighlightItem:"mac:MenuDidHighlightItem",MenuWillDisplayItem:"mac:MenuWillDisplayItem",MenuDidDisplayItem:"mac:MenuDidDisplayItem",MenuWillAddItem:"mac:MenuWillAddItem",MenuDidAddItem:"mac:MenuDidAddItem",MenuWillRemoveItem:"mac:MenuWillRemoveItem",MenuDidRemoveItem:"mac:MenuDidRemoveItem",MenuWillBeginTracking:"mac:MenuWillBeginTracking",MenuDidBeginTracking:"mac:MenuDidBeginTracking",MenuWillEndTracking:"mac:MenuWillEndTracking",MenuDidEndTracking:"mac:MenuDidEndTracking",MenuWillUpdate:"mac:MenuWillUpdate",MenuDidUpdate:"mac:MenuDidUpdate",MenuWillPopUp:"mac:MenuWillPopUp",MenuDidPopUp:"mac:MenuDidPopUp",MenuWillSendActionToItem:"mac:MenuWillSendActionToItem",MenuDidSendActionToItem:"mac:MenuDidSendActionToItem",WebViewDidStartProvisionalNavigation:"mac:WebViewDidStartProvisionalNavigation",WebViewDidReceiveServerRedirectForProvisionalNavigation:"mac:WebViewDidReceiveServerRedirectForProvisionalNavigation",WebViewDidFinishNavigation:"mac:WebViewDidFinishNavigation",WebViewDidCommitNavigation:"mac:WebViewDidCommitNavigation",WindowFileDraggingEntered:"mac:WindowFileDraggingEntered",WindowFileDraggingPerformed:"mac:WindowFileDraggingPerformed",WindowFileDraggingExited:"mac:WindowFileDraggingExited"},Linux:{SystemThemeChanged:"linux:SystemThemeChanged"},Common:{ApplicationStarted:"common:ApplicationStarted",WindowMaximise:"common:WindowMaximise",WindowUnMaximise:"common:WindowUnMaximise",WindowFullscreen:"common:WindowFullscreen",WindowUnFullscreen:"common:WindowUnFullscreen",WindowRestore:"common:WindowRestore",WindowMinimise:"common:WindowMinimise",WindowUnMinimise:"common:WindowUnMinimise",WindowClosing:"common:WindowClosing",WindowZoom:"common:WindowZoom",WindowZoomIn:"common:WindowZoomIn",WindowZoomOut:"common:WindowZoomOut",WindowZoomReset:"common:WindowZoomReset",WindowFocus:"common:WindowFocus",WindowLostFocus:"common:WindowLostFocus",WindowShow:"common:WindowShow",WindowHide:"common:WindowHide",WindowDPIChanged:"common:WindowDPIChanged",WindowFilesDropped:"common:WindowFilesDropped",WindowRuntimeReady:"common:WindowRuntimeReady",ThemeChanged:"common:ThemeChanged"}};var ln=ne;window._wails=window._wails||{};window._wails.dispatchWailsEvent=wn;var dn=d(l.Events,""),cn=0,u=new Map,V=class{constructor(i,n,o){this.eventName=i,this.maxCallbacks=o||-1,this.Callback=t=>(n(t),this.maxCallbacks===-1?!1:(this.maxCallbacks-=1,this.maxCallbacks===0))}},x=class{constructor(i,n=null){this.name=i,this.data=n}};function sn(){}function wn(e){let i=u.get(e.name);if(i){let n=i.filter(o=>{if(o.Callback(e))return!0});n.length>0&&(i=i.filter(o=>!n.includes(o)),i.length===0?u.delete(e.name):u.set(e.name,i))}}function _(e,i,n){let o=u.get(e)||[],t=new V(e,i,n);return o.push(t),u.set(e,o),()=>pn(t)}function mn(e,i){return _(e,i,-1)}function un(e,i){return _(e,i,1)}function pn(e){let i=e.eventName,n=u.get(i).filter(o=>o!==e);n.length===0?u.delete(i):u.set(i,n)}function Wn(e,...i){[e,...i].forEach(o=>u.delete(o))}function gn(){u.clear()}function Z(e){return dn(cn,e)}var G={};w(G,{Error:()=>Un,Info:()=>Rn,OpenFile:()=>yn,Question:()=>A,SaveFile:()=>On,Warning:()=>En});window._wails=window._wails||{};window._wails.dialogErrorCallback=bn;window._wails.dialogResultCallback=vn;var fn=0,hn=1,Dn=2,Cn=3,Sn=4,Mn=5,xn=d(l.Dialog,""),g=new Map;function An(){let e;do e=f();while(g.has(e));return e}function D(e,i={}){let n=An();return i["dialog-id"]=n,new Promise((o,t)=>{g.set(n,{resolve:o,reject:t}),xn(e,i).catch(a=>{t(a),g.delete(n)})})}function vn(e,i,n){let o=g.get(e);o&&(n?o.resolve(JSON.parse(i)):o.resolve(i),g.delete(e))}function bn(e,i){let n=g.get(e);n&&(n.reject(i),g.delete(e))}var Rn=e=>D(fn,e),En=e=>D(hn,e),Un=e=>D(Dn,e),A=e=>D(Cn,e),yn=e=>D(Sn,e),On=e=>D(Mn,e);function oe(e,i=null){let n=new x(e,i);Z(n)}function Pn(){document.querySelectorAll("[wml-event]").forEach(function(i){let n=i.getAttribute("wml-event"),o=i.getAttribute("wml-confirm"),t=i.getAttribute("wml-trigger")||"click",a=function(){if(o){A({Title:"Confirm",Message:o,Detached:!1,Buttons:[{Label:"Yes"},{Label:"No",IsDefault:!0}]}).then(function(s){s!=="No"&&oe(n)});return}oe(n)};i.removeEventListener(t,a),i.addEventListener(t,a)})}function te(e,i){let n=U(e),o=In(n);o.has(i);try{o.get(i)()}catch{}}function Tn(){document.querySelectorAll("[wml-window]").forEach(function(i){let n=i.getAttribute("wml-window"),o=i.getAttribute("wml-confirm"),t=i.getAttribute("wml-trigger")||"click",a=i.getAttribute("wml-target-window")||"",s=function(){if(o){A({Title:"Confirm",Message:o,Buttons:[{Label:"Yes"},{Label:"No",IsDefault:!0}]}).then(function(m){m!=="No"&&te(a,n)});return}te(a,n)};i.removeEventListener(t,s),i.addEventListener(t,s)})}function Bn(){document.querySelectorAll("[wml-openurl]").forEach(function(i){let n=i.getAttribute("wml-openurl"),o=i.getAttribute("wml-confirm"),t=i.getAttribute("wml-trigger")||"click",a=function(){if(o){A({Title:"Confirm",Message:o,Buttons:[{Label:"Yes"},{Label:"No",IsDefault:!0}]}).then(function(s){s!=="No"&&b(n)});return}b(n)};i.removeEventListener(t,a),i.addEventListener(t,a)})}function Y(){Pn(),Tn(),Bn()}function In(e){let i=new Map;for(let n in e)typeof e[n]=="function"&&i.set(n,e[n]);return i}var X={};w(X,{ByID:()=>_n,ByName:()=>Vn,Call:()=>Hn,Plugin:()=>Zn});window._wails=window._wails||{};window._wails.callResultHandler=kn;window._wails.callErrorHandler=Nn;var y=0,Fn=d(l.Call,""),Ln=d(l.CancelCall,""),v=new Map;function zn(){let e;do e=f();while(v.has(e));return e}function kn(e,i,n){let o=re(e);o&&o.resolve(n?JSON.parse(i):i)}function Nn(e,i){let n=re(e);n&&n.reject(i)}function re(e){let i=v.get(e);return v.delete(e),i}function O(e,i={}){let n=zn(),o=()=>{Ln(e,{"call-id":n})};var t=!1,a=!1,s=new Promise((m,c)=>{i["call-id"]=n,v.set(n,{resolve:m,reject:c}),Fn(e,i).then(p=>{a=!0,t&&o()}).catch(p=>{c(p),v.delete(n)})});return s.cancel=()=>{a?o():t=!0},s}function Hn(e){return O(y,e)}function Vn(e,...i){if(typeof e!="string"||e.split(".").length!==3)throw new Error("CallByName requires a string in the format 'package.struct.method'");let[n,o,t]=e.split(".");return O(y,{packageName:n,structName:o,methodName:t,args:i})}function _n(e,...i){return O(y,{methodID:e,args:i})}function Zn(e,i,...n){return O(y,{packageName:"wails-plugins",structName:e,methodName:i,args:n})}window._wails=window._wails||{};window._wails.invoke=h;window.wails=window.wails||{};window.wails.Application=T;window.wails.Browser=B;window.wails.Call=X;window.wails.Clipboard=I;window.wails.Dialogs=G;window.wails.Events=j;window.wails.Flags=z;window.wails.Screens=N;window.wails.System=L;window.wails.Window=H;window.wails.WML=K;var ae=!1;document.addEventListener("DOMContentLoaded",function(){ae=!0,window._wails.invoke("wails:runtime:ready")});function jn(e){ae||document.readyState==="complete"?e():document.addEventListener("DOMContentLoaded",e)}jn(()=>{Y()});})();
+(()=>{var de=Object.defineProperty;var w=(e,i)=>{for(var n in i)de(e,n,{get:i[n],enumerable:!0})};var T={};w(T,{Hide:()=>We,Quit:()=>fe,Show:()=>ge});var le="useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict";var f=(e=21)=>{let i="",n=e;for(;n--;)i+=le[Math.random()*64|0];return i};var ce=window.location.origin+"/wails/runtime",d={Call:0,Clipboard:1,Application:2,Events:3,ContextMenu:4,Dialog:5,Window:6,Screens:7,System:8,Browser:9},se=f();function l(e,i){return function(n,o=null){return we(e,n,i,o)}}function we(e,i,n,o){let t=new URL(ce);t.searchParams.append("object",e),t.searchParams.append("method",i);let a={headers:{}};return n&&(a.headers["x-wails-window-name"]=n),o&&t.searchParams.append("args",JSON.stringify(o)),a.headers["x-wails-client-id"]=se,new Promise((s,p)=>{fetch(t,a).then(c=>{if(c.ok)return c.headers.get("Content-Type")&&c.headers.get("Content-Type").indexOf("application/json")!==-1?c.json():c.text();p(Error(c.statusText))}).then(c=>s(c)).catch(c=>p(c))})}var P=l(d.Application,""),me=0,ue=1,pe=2;function We(){return P(me)}function ge(){return P(ue)}function fe(){return P(pe)}var B={};w(B,{OpenURL:()=>b});var he=l(d.Browser,""),De=0;function b(e){return he(De,{url:e})}var I={};w(I,{SetText:()=>xe,Text:()=>Me});var q=l(d.Clipboard,""),Ce=0,Se=1;function xe(e){return q(Ce,{text:e})}function Me(){return q(Se)}var L={};w(L,{Capabilities:()=>Re,Environment:()=>Ee,IsAMD64:()=>Oe,IsARM:()=>Pe,IsARM64:()=>Te,IsDarkMode:()=>be,IsDebug:()=>F,IsLinux:()=>Ue,IsMac:()=>ye,IsWindows:()=>R,invoke:()=>h});var J=l(d.System,""),Ae=0,ve=1;function h(e){return window.chrome?window.chrome.webview.postMessage(e):window.webkit.messageHandlers.external.postMessage(e)}function be(){return J(Ae)}function Re(){return fetch("/wails/capabilities").json()}function Ee(){return J(ve)}function R(){return window._wails.environment.OS==="windows"}function Ue(){return window._wails.environment.OS==="linux"}function ye(){return window._wails.environment.OS==="darwin"}function Oe(){return window._wails.environment.Arch==="amd64"}function Pe(){return window._wails.environment.Arch==="arm"}function Te(){return window._wails.environment.Arch==="arm64"}function F(){return window._wails.environment.Debug===!0}window.addEventListener("contextmenu",Le);var Be=l(d.ContextMenu,""),Ie=0;function Fe(e,i,n,o){Be(Ie,{id:e,x:i,y:n,data:o})}function Le(e){let i=e.target,n=window.getComputedStyle(i).getPropertyValue("--custom-contextmenu");if(n=n?n.trim():"",n){e.preventDefault();let o=window.getComputedStyle(i).getPropertyValue("--custom-contextmenu-data");Fe(n,e.clientX,e.clientY,o);return}ze(e)}function ze(e){if(F())return;let i=e.target;switch(window.getComputedStyle(i).getPropertyValue("--default-contextmenu").trim()){case"show":return;case"hide":e.preventDefault();return;default:if(i.isContentEditable)return;let t=window.getSelection(),a=t.toString().length>0;if(a)for(let s=0;sS});function S(e){try{return window._wails.flags[e]}catch(i){throw new Error("Unable to retrieve flag '"+e+"': "+i)}}window._wails=window._wails||{};window._wails.setResizable=He;window._wails.endDrag=ee;window.addEventListener("mousedown",_e);window.addEventListener("mousemove",Ge);window.addEventListener("mouseup",je);var x=!1,E=null,$=!1,ke="auto";function Ne(e){let i=window.getComputedStyle(e.target).getPropertyValue("--webkit-app-region");return!i||i===""||i.trim()!=="drag"||e.buttons!==1?!1:e.detail===1}function He(e){$=e}function ee(){document.body.style.cursor="default",x=!1}function Ve(){return E?(h(`resize:${E}`),!0):!1}function _e(e){(R()&&Ve()||Ne(e))&&(x=!!Ze(e))}function Ze(e){return!(e.offsetX>e.target.clientWidth||e.offsetY>e.target.clientHeight)}function je(e){(e.buttons!==void 0?e.buttons:e.which)>0&&ee()}function u(e=ke){document.documentElement.style.cursor=e,E=e}function Ge(e){x=Ye(e),R()&&$&&Ke(e)}function Ye(e){let i=e.buttons!==void 0?e.buttons:e.which;return x&&i>0?(h("drag"),!1):x}function Ke(e){let i=S("system.resizeHandleHeight")||5,n=S("system.resizeHandleWidth")||5,o=S("resizeCornerExtra")||10,t=window.outerWidth-e.clientXJe,GetCurrent:()=>ei,GetPrimary:()=>$e});var k=l(d.Screens,""),Xe=0,Qe=1,qe=2;function Je(){return k(Xe)}function $e(){return k(Qe)}function ei(){return k(qe)}var H={};w(H,{Center:()=>Oi,Close:()=>Qi,Fullscreen:()=>Ti,Get:()=>U,GetZoomLevel:()=>rn,Height:()=>en,Hide:()=>Vi,Maximise:()=>_i,Minimise:()=>Gi,RelativePosition:()=>Ni,Restore:()=>Ki,Screen:()=>Hi,SetAlwaysOnTop:()=>zi,SetBackgroundColour:()=>qi,SetMaxSize:()=>Fi,SetMinSize:()=>Li,SetRelativePosition:()=>ki,SetResizable:()=>Ji,SetSize:()=>Bi,SetTitle:()=>Pi,SetZoomLevel:()=>an,Show:()=>Xi,Size:()=>Ii,ToggleMaximise:()=>ji,UnMaximise:()=>Zi,UnMinimise:()=>Yi,Width:()=>$i,ZoomIn:()=>nn,ZoomOut:()=>on,ZoomReset:()=>tn});var ii=0,ni=1,oi=2,ti=3,ri=4,ai=5,di=6,li=7,ci=8,si=9,wi=10,mi=11,ui=12,pi=13,Wi=14,gi=15,fi=16,hi=17,Di=18,Ci=19,Si=20,xi=21,Mi=22,Ai=23,vi=24,bi=25,Ri=26,Ei=27,Ui=28,yi=29,r=U("");function ie(e){return{Get:i=>ie(l(d.Window,i)),Center:()=>e(ii),SetTitle:i=>e(ni,{title:i}),Fullscreen:()=>e(oi),UnFullscreen:()=>e(ti),SetSize:(i,n)=>e(ri,{width:i,height:n}),Size:()=>e(ai),SetMaxSize:(i,n)=>e(di,{width:i,height:n}),SetMinSize:(i,n)=>e(li,{width:i,height:n}),SetAlwaysOnTop:i=>e(ci,{alwaysOnTop:i}),SetRelativePosition:(i,n)=>e(si,{x:i,y:n}),RelativePosition:()=>e(wi),Screen:()=>e(mi),Hide:()=>e(ui),Maximise:()=>e(pi),UnMaximise:()=>e(Wi),ToggleMaximise:()=>e(gi),Minimise:()=>e(fi),UnMinimise:()=>e(hi),Restore:()=>e(Di),Show:()=>e(Ci),Close:()=>e(Si),SetBackgroundColour:(i,n,o,t)=>e(xi,{r:i,g:n,b:o,a:t}),SetResizable:i=>e(Mi,{resizable:i}),Width:()=>e(Ai),Height:()=>e(vi),ZoomIn:()=>e(bi),ZoomOut:()=>e(Ri),ZoomReset:()=>e(Ei),GetZoomLevel:()=>e(Ui),SetZoomLevel:i=>e(yi,{zoomLevel:i})}}function U(e){return ie(l(d.Window,e))}function Oi(){r.Center()}function Pi(e){r.SetTitle(e)}function Ti(){r.Fullscreen()}function Bi(e,i){r.SetSize(e,i)}function Ii(){return r.Size()}function Fi(e,i){r.SetMaxSize(e,i)}function Li(e,i){r.SetMinSize(e,i)}function zi(e){r.SetAlwaysOnTop(e)}function ki(e,i){r.SetRelativePosition(e,i)}function Ni(){return r.RelativePosition()}function Hi(){return r.Screen()}function Vi(){r.Hide()}function _i(){r.Maximise()}function Zi(){r.UnMaximise()}function ji(){r.ToggleMaximise()}function Gi(){r.Minimise()}function Yi(){r.UnMinimise()}function Ki(){r.Restore()}function Xi(){r.Show()}function Qi(){r.Close()}function qi(e,i,n,o){r.SetBackgroundColour(e,i,n,o)}function Ji(e){r.SetResizable(e)}function $i(){return r.Width()}function en(){return r.Height()}function nn(){r.ZoomIn()}function on(){r.ZoomOut()}function tn(){r.ZoomReset()}function rn(){return r.GetZoomLevel()}function an(e){r.SetZoomLevel(e)}var K={};w(K,{Reload:()=>Y});var j={};w(j,{Emit:()=>Z,Off:()=>Wn,OffAll:()=>gn,On:()=>mn,OnMultiple:()=>_,Once:()=>un,Types:()=>dn,WailsEvent:()=>M,setup:()=>sn});var ne={Windows:{SystemThemeChanged:"windows:SystemThemeChanged",APMPowerStatusChange:"windows:APMPowerStatusChange",APMSuspend:"windows:APMSuspend",APMResumeAutomatic:"windows:APMResumeAutomatic",APMResumeSuspend:"windows:APMResumeSuspend",APMPowerSettingChange:"windows:APMPowerSettingChange",ApplicationStarted:"windows:ApplicationStarted",WebViewNavigationCompleted:"windows:WebViewNavigationCompleted",WindowInactive:"windows:WindowInactive",WindowActive:"windows:WindowActive",WindowClickActive:"windows:WindowClickActive",WindowMaximise:"windows:WindowMaximise",WindowUnMaximise:"windows:WindowUnMaximise",WindowFullscreen:"windows:WindowFullscreen",WindowUnFullscreen:"windows:WindowUnFullscreen",WindowRestore:"windows:WindowRestore",WindowMinimise:"windows:WindowMinimise",WindowUnMinimise:"windows:WindowUnMinimise",WindowClose:"windows:WindowClose",WindowSetFocus:"windows:WindowSetFocus",WindowKillFocus:"windows:WindowKillFocus",WindowDragDrop:"windows:WindowDragDrop",WindowDragEnter:"windows:WindowDragEnter",WindowDragLeave:"windows:WindowDragLeave",WindowDragOver:"windows:WindowDragOver"},Mac:{ApplicationDidBecomeActive:"mac:ApplicationDidBecomeActive",ApplicationDidChangeBackingProperties:"mac:ApplicationDidChangeBackingProperties",ApplicationDidChangeEffectiveAppearance:"mac:ApplicationDidChangeEffectiveAppearance",ApplicationDidChangeIcon:"mac:ApplicationDidChangeIcon",ApplicationDidChangeOcclusionState:"mac:ApplicationDidChangeOcclusionState",ApplicationDidChangeScreenParameters:"mac:ApplicationDidChangeScreenParameters",ApplicationDidChangeStatusBarFrame:"mac:ApplicationDidChangeStatusBarFrame",ApplicationDidChangeStatusBarOrientation:"mac:ApplicationDidChangeStatusBarOrientation",ApplicationDidFinishLaunching:"mac:ApplicationDidFinishLaunching",ApplicationDidHide:"mac:ApplicationDidHide",ApplicationDidResignActiveNotification:"mac:ApplicationDidResignActiveNotification",ApplicationDidUnhide:"mac:ApplicationDidUnhide",ApplicationDidUpdate:"mac:ApplicationDidUpdate",ApplicationWillBecomeActive:"mac:ApplicationWillBecomeActive",ApplicationWillFinishLaunching:"mac:ApplicationWillFinishLaunching",ApplicationWillHide:"mac:ApplicationWillHide",ApplicationWillResignActive:"mac:ApplicationWillResignActive",ApplicationWillTerminate:"mac:ApplicationWillTerminate",ApplicationWillUnhide:"mac:ApplicationWillUnhide",ApplicationWillUpdate:"mac:ApplicationWillUpdate",ApplicationDidChangeTheme:"mac:ApplicationDidChangeTheme!",ApplicationShouldHandleReopen:"mac:ApplicationShouldHandleReopen!",WindowDidBecomeKey:"mac:WindowDidBecomeKey",WindowDidBecomeMain:"mac:WindowDidBecomeMain",WindowDidBeginSheet:"mac:WindowDidBeginSheet",WindowDidChangeAlpha:"mac:WindowDidChangeAlpha",WindowDidChangeBackingLocation:"mac:WindowDidChangeBackingLocation",WindowDidChangeBackingProperties:"mac:WindowDidChangeBackingProperties",WindowDidChangeCollectionBehavior:"mac:WindowDidChangeCollectionBehavior",WindowDidChangeEffectiveAppearance:"mac:WindowDidChangeEffectiveAppearance",WindowDidChangeOcclusionState:"mac:WindowDidChangeOcclusionState",WindowDidChangeOrderingMode:"mac:WindowDidChangeOrderingMode",WindowDidChangeScreen:"mac:WindowDidChangeScreen",WindowDidChangeScreenParameters:"mac:WindowDidChangeScreenParameters",WindowDidChangeScreenProfile:"mac:WindowDidChangeScreenProfile",WindowDidChangeScreenSpace:"mac:WindowDidChangeScreenSpace",WindowDidChangeScreenSpaceProperties:"mac:WindowDidChangeScreenSpaceProperties",WindowDidChangeSharingType:"mac:WindowDidChangeSharingType",WindowDidChangeSpace:"mac:WindowDidChangeSpace",WindowDidChangeSpaceOrderingMode:"mac:WindowDidChangeSpaceOrderingMode",WindowDidChangeTitle:"mac:WindowDidChangeTitle",WindowDidChangeToolbar:"mac:WindowDidChangeToolbar",WindowDidChangeVisibility:"mac:WindowDidChangeVisibility",WindowDidDeminiaturize:"mac:WindowDidDeminiaturize",WindowDidEndSheet:"mac:WindowDidEndSheet",WindowDidEnterFullScreen:"mac:WindowDidEnterFullScreen",WindowDidEnterVersionBrowser:"mac:WindowDidEnterVersionBrowser",WindowDidExitFullScreen:"mac:WindowDidExitFullScreen",WindowDidExitVersionBrowser:"mac:WindowDidExitVersionBrowser",WindowDidExpose:"mac:WindowDidExpose",WindowDidFocus:"mac:WindowDidFocus",WindowDidMiniaturize:"mac:WindowDidMiniaturize",WindowDidMove:"mac:WindowDidMove",WindowDidOrderOffScreen:"mac:WindowDidOrderOffScreen",WindowDidOrderOnScreen:"mac:WindowDidOrderOnScreen",WindowDidResignKey:"mac:WindowDidResignKey",WindowDidResignMain:"mac:WindowDidResignMain",WindowDidResize:"mac:WindowDidResize",WindowDidUpdate:"mac:WindowDidUpdate",WindowDidUpdateAlpha:"mac:WindowDidUpdateAlpha",WindowDidUpdateCollectionBehavior:"mac:WindowDidUpdateCollectionBehavior",WindowDidUpdateCollectionProperties:"mac:WindowDidUpdateCollectionProperties",WindowDidUpdateShadow:"mac:WindowDidUpdateShadow",WindowDidUpdateTitle:"mac:WindowDidUpdateTitle",WindowDidUpdateToolbar:"mac:WindowDidUpdateToolbar",WindowDidUpdateVisibility:"mac:WindowDidUpdateVisibility",WindowShouldClose:"mac:WindowShouldClose!",WindowWillBecomeKey:"mac:WindowWillBecomeKey",WindowWillBecomeMain:"mac:WindowWillBecomeMain",WindowWillBeginSheet:"mac:WindowWillBeginSheet",WindowWillChangeOrderingMode:"mac:WindowWillChangeOrderingMode",WindowWillClose:"mac:WindowWillClose",WindowWillDeminiaturize:"mac:WindowWillDeminiaturize",WindowWillEnterFullScreen:"mac:WindowWillEnterFullScreen",WindowWillEnterVersionBrowser:"mac:WindowWillEnterVersionBrowser",WindowWillExitFullScreen:"mac:WindowWillExitFullScreen",WindowWillExitVersionBrowser:"mac:WindowWillExitVersionBrowser",WindowWillFocus:"mac:WindowWillFocus",WindowWillMiniaturize:"mac:WindowWillMiniaturize",WindowWillMove:"mac:WindowWillMove",WindowWillOrderOffScreen:"mac:WindowWillOrderOffScreen",WindowWillOrderOnScreen:"mac:WindowWillOrderOnScreen",WindowWillResignMain:"mac:WindowWillResignMain",WindowWillResize:"mac:WindowWillResize",WindowWillUnfocus:"mac:WindowWillUnfocus",WindowWillUpdate:"mac:WindowWillUpdate",WindowWillUpdateAlpha:"mac:WindowWillUpdateAlpha",WindowWillUpdateCollectionBehavior:"mac:WindowWillUpdateCollectionBehavior",WindowWillUpdateCollectionProperties:"mac:WindowWillUpdateCollectionProperties",WindowWillUpdateShadow:"mac:WindowWillUpdateShadow",WindowWillUpdateTitle:"mac:WindowWillUpdateTitle",WindowWillUpdateToolbar:"mac:WindowWillUpdateToolbar",WindowWillUpdateVisibility:"mac:WindowWillUpdateVisibility",WindowWillUseStandardFrame:"mac:WindowWillUseStandardFrame",MenuWillOpen:"mac:MenuWillOpen",MenuDidOpen:"mac:MenuDidOpen",MenuDidClose:"mac:MenuDidClose",MenuWillSendAction:"mac:MenuWillSendAction",MenuDidSendAction:"mac:MenuDidSendAction",MenuWillHighlightItem:"mac:MenuWillHighlightItem",MenuDidHighlightItem:"mac:MenuDidHighlightItem",MenuWillDisplayItem:"mac:MenuWillDisplayItem",MenuDidDisplayItem:"mac:MenuDidDisplayItem",MenuWillAddItem:"mac:MenuWillAddItem",MenuDidAddItem:"mac:MenuDidAddItem",MenuWillRemoveItem:"mac:MenuWillRemoveItem",MenuDidRemoveItem:"mac:MenuDidRemoveItem",MenuWillBeginTracking:"mac:MenuWillBeginTracking",MenuDidBeginTracking:"mac:MenuDidBeginTracking",MenuWillEndTracking:"mac:MenuWillEndTracking",MenuDidEndTracking:"mac:MenuDidEndTracking",MenuWillUpdate:"mac:MenuWillUpdate",MenuDidUpdate:"mac:MenuDidUpdate",MenuWillPopUp:"mac:MenuWillPopUp",MenuDidPopUp:"mac:MenuDidPopUp",MenuWillSendActionToItem:"mac:MenuWillSendActionToItem",MenuDidSendActionToItem:"mac:MenuDidSendActionToItem",WebViewDidStartProvisionalNavigation:"mac:WebViewDidStartProvisionalNavigation",WebViewDidReceiveServerRedirectForProvisionalNavigation:"mac:WebViewDidReceiveServerRedirectForProvisionalNavigation",WebViewDidFinishNavigation:"mac:WebViewDidFinishNavigation",WebViewDidCommitNavigation:"mac:WebViewDidCommitNavigation",WindowFileDraggingEntered:"mac:WindowFileDraggingEntered",WindowFileDraggingPerformed:"mac:WindowFileDraggingPerformed",WindowFileDraggingExited:"mac:WindowFileDraggingExited"},Linux:{SystemThemeChanged:"linux:SystemThemeChanged",WindowLoadChanged:"linux:WindowLoadChanged",WindowDeleteEvent:"linux:WindowDeleteEvent",WindowFocusIn:"linux:WindowFocusIn",WindowFocusOut:"linux:WindowFocusOut",ApplicationStartup:"linux:ApplicationStartup"},Common:{ApplicationStarted:"common:ApplicationStarted",WindowMaximise:"common:WindowMaximise",WindowUnMaximise:"common:WindowUnMaximise",WindowFullscreen:"common:WindowFullscreen",WindowUnFullscreen:"common:WindowUnFullscreen",WindowRestore:"common:WindowRestore",WindowMinimise:"common:WindowMinimise",WindowUnMinimise:"common:WindowUnMinimise",WindowClosing:"common:WindowClosing",WindowZoom:"common:WindowZoom",WindowZoomIn:"common:WindowZoomIn",WindowZoomOut:"common:WindowZoomOut",WindowZoomReset:"common:WindowZoomReset",WindowFocus:"common:WindowFocus",WindowLostFocus:"common:WindowLostFocus",WindowShow:"common:WindowShow",WindowHide:"common:WindowHide",WindowDPIChanged:"common:WindowDPIChanged",WindowFilesDropped:"common:WindowFilesDropped",WindowRuntimeReady:"common:WindowRuntimeReady",ThemeChanged:"common:ThemeChanged"}};var dn=ne;window._wails=window._wails||{};window._wails.dispatchWailsEvent=wn;var ln=l(d.Events,""),cn=0,m=new Map,V=class{constructor(i,n,o){this.eventName=i,this.maxCallbacks=o||-1,this.Callback=t=>(n(t),this.maxCallbacks===-1?!1:(this.maxCallbacks-=1,this.maxCallbacks===0))}},M=class{constructor(i,n=null){this.name=i,this.data=n}};function sn(){}function wn(e){let i=m.get(e.name);if(i){let n=i.filter(o=>{if(o.Callback(e))return!0});n.length>0&&(i=i.filter(o=>!n.includes(o)),i.length===0?m.delete(e.name):m.set(e.name,i))}}function _(e,i,n){let o=m.get(e)||[],t=new V(e,i,n);return o.push(t),m.set(e,o),()=>pn(t)}function mn(e,i){return _(e,i,-1)}function un(e,i){return _(e,i,1)}function pn(e){let i=e.eventName,n=m.get(i).filter(o=>o!==e);n.length===0?m.delete(i):m.set(i,n)}function Wn(e,...i){[e,...i].forEach(o=>m.delete(o))}function gn(){m.clear()}function Z(e){return ln(cn,e)}var G={};w(G,{Error:()=>Un,Info:()=>Rn,OpenFile:()=>yn,Question:()=>A,SaveFile:()=>On,Warning:()=>En});window._wails=window._wails||{};window._wails.dialogErrorCallback=bn;window._wails.dialogResultCallback=vn;var fn=0,hn=1,Dn=2,Cn=3,Sn=4,xn=5,Mn=l(d.Dialog,""),W=new Map;function An(){let e;do e=f();while(W.has(e));return e}function D(e,i={}){let n=An();return i["dialog-id"]=n,new Promise((o,t)=>{W.set(n,{resolve:o,reject:t}),Mn(e,i).catch(a=>{t(a),W.delete(n)})})}function vn(e,i,n){let o=W.get(e);o&&(n?o.resolve(JSON.parse(i)):o.resolve(i),W.delete(e))}function bn(e,i){let n=W.get(e);n&&(n.reject(i),W.delete(e))}var Rn=e=>D(fn,e),En=e=>D(hn,e),Un=e=>D(Dn,e),A=e=>D(Cn,e),yn=e=>D(Sn,e),On=e=>D(xn,e);function oe(e,i=null){let n=new M(e,i);Z(n)}function Pn(){document.querySelectorAll("[wml-event]").forEach(function(i){let n=i.getAttribute("wml-event"),o=i.getAttribute("wml-confirm"),t=i.getAttribute("wml-trigger")||"click",a=function(){if(o){A({Title:"Confirm",Message:o,Detached:!1,Buttons:[{Label:"Yes"},{Label:"No",IsDefault:!0}]}).then(function(s){s!=="No"&&oe(n)});return}oe(n)};i.removeEventListener(t,a),i.addEventListener(t,a)})}function te(e,i){let n=U(e),o=In(n);o.has(i);try{o.get(i)()}catch{}}function Tn(){document.querySelectorAll("[wml-window]").forEach(function(i){let n=i.getAttribute("wml-window"),o=i.getAttribute("wml-confirm"),t=i.getAttribute("wml-trigger")||"click",a=i.getAttribute("wml-target-window")||"",s=function(){if(o){A({Title:"Confirm",Message:o,Buttons:[{Label:"Yes"},{Label:"No",IsDefault:!0}]}).then(function(p){p!=="No"&&te(a,n)});return}te(a,n)};i.removeEventListener(t,s),i.addEventListener(t,s)})}function Bn(){document.querySelectorAll("[wml-openurl]").forEach(function(i){let n=i.getAttribute("wml-openurl"),o=i.getAttribute("wml-confirm"),t=i.getAttribute("wml-trigger")||"click",a=function(){if(o){A({Title:"Confirm",Message:o,Buttons:[{Label:"Yes"},{Label:"No",IsDefault:!0}]}).then(function(s){s!=="No"&&b(n)});return}b(n)};i.removeEventListener(t,a),i.addEventListener(t,a)})}function Y(){Pn(),Tn(),Bn()}function In(e){let i=new Map;for(let n in e)typeof e[n]=="function"&&i.set(n,e[n]);return i}var X={};w(X,{ByID:()=>Vn,ByName:()=>Hn,Call:()=>Nn,Plugin:()=>_n});window._wails=window._wails||{};window._wails.callResultHandler=zn;window._wails.callErrorHandler=kn;var y=0,Fn=l(d.Call,""),v=new Map;function Ln(){let e;do e=f();while(v.has(e));return e}function zn(e,i,n){let o=re(e);o&&o.resolve(n?JSON.parse(i):i)}function kn(e,i){let n=re(e);n&&n.reject(i)}function re(e){let i=v.get(e);return v.delete(e),i}function O(e,i={}){return new Promise((n,o)=>{let t=Ln();i["call-id"]=t,v.set(t,{resolve:n,reject:o}),Fn(e,i).catch(a=>{o(a),v.delete(t)})})}function Nn(e){return O(y,e)}function Hn(e,...i){if(typeof e!="string"||e.split(".").length!==3)throw new Error("CallByName requires a string in the format 'package.struct.method'");let[n,o,t]=e.split(".");return O(y,{packageName:n,structName:o,methodName:t,args:i})}function Vn(e,...i){return O(y,{methodID:e,args:i})}function _n(e,i,...n){return O(y,{packageName:"wails-plugins",structName:e,methodName:i,args:n})}window._wails=window._wails||{};window._wails.invoke=h;window.wails=window.wails||{};window.wails.Application=T;window.wails.Browser=B;window.wails.Call=X;window.wails.Clipboard=I;window.wails.Dialogs=G;window.wails.Events=j;window.wails.Flags=z;window.wails.Screens=N;window.wails.System=L;window.wails.Window=H;window.wails.WML=K;var ae=!1;document.addEventListener("DOMContentLoaded",function(){ae=!0,window._wails.invoke("wails:runtime:ready")});function Zn(e){ae||document.readyState==="complete"?e():document.addEventListener("DOMContentLoaded",e)}Zn(()=>{Y()});})();
diff --git a/v3/internal/operatingsystem/webkit_linux.go b/v3/internal/operatingsystem/webkit_linux.go
index 70085d8fa1b..a13f6eebfdf 100644
--- a/v3/internal/operatingsystem/webkit_linux.go
+++ b/v3/internal/operatingsystem/webkit_linux.go
@@ -1,7 +1,7 @@
package operatingsystem
/*
-#cgo linux pkg-config: gtk+-3.0 webkit2gtk-4.0 javascriptcoregtk-4.1
+#cgo linux pkg-config: gtk+-3.0 webkit2gtk-4.0
#include
*/
import "C"
diff --git a/v3/internal/runtime/Taskfile.yaml b/v3/internal/runtime/Taskfile.yaml
index 875375d1cd4..794769b2856 100644
--- a/v3/internal/runtime/Taskfile.yaml
+++ b/v3/internal/runtime/Taskfile.yaml
@@ -38,8 +38,10 @@ tasks:
- cmd: wails3 tool cp ../commands/build_assets/runtime/runtime.js ../../examples/binding/assets/runtime.js
- cmd: wails3 tool cp ../commands/build_assets/runtime/runtime.js ../../examples/frameless/assets/runtime.js
- cmd: wails3 tool cp ../commands/build_assets/runtime/runtime.js ../../examples/window-api/assets/runtime.js
+ - cmd: wails3 tool cp ../commands/build_assets/runtime/runtime.js ../../examples/contextmenus/assets/runtime.js
- cmd: wails3 tool cp ../commands/build_assets/runtime/runtime.js ../../examples/wml/assets/runtime.js
- cmd: wails3 tool cp ../commands/build_assets/runtime/runtime.js ../../internal/commands/build_assets/runtime/runtime.js
+ - cmd: wails3 tool cp ../commands/build_assets/runtime/runtime.js ../../examples/screen/assets/runtime.js
- cmd: wails3 tool cp ../commands/build_assets/runtime/runtime.js ../../pkg/application/assets/alpha/runtime.js
- cmd: echo "Build Complete."
diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/src/event_types.js b/v3/internal/runtime/desktop/@wailsio/runtime/src/event_types.js
index 76aa8135e74..f39ec6a908d 100644
--- a/v3/internal/runtime/desktop/@wailsio/runtime/src/event_types.js
+++ b/v3/internal/runtime/desktop/@wailsio/runtime/src/event_types.js
@@ -155,6 +155,11 @@ export const EventTypes = {
},
Linux: {
SystemThemeChanged: "linux:SystemThemeChanged",
+ WindowLoadChanged: "linux:WindowLoadChanged",
+ WindowDeleteEvent: "linux:WindowDeleteEvent",
+ WindowFocusIn: "linux:WindowFocusIn",
+ WindowFocusOut: "linux:WindowFocusOut",
+ ApplicationStartup: "linux:ApplicationStartup",
},
Common: {
ApplicationStarted: "common:ApplicationStarted",
diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/types/event_types.d.ts b/v3/internal/runtime/desktop/@wailsio/runtime/types/event_types.d.ts
index 6c04c9e6be3..744bb437b91 100644
--- a/v3/internal/runtime/desktop/@wailsio/runtime/types/event_types.d.ts
+++ b/v3/internal/runtime/desktop/@wailsio/runtime/types/event_types.d.ts
@@ -155,6 +155,11 @@ export declare const EventTypes: {
},
Linux: {
SystemThemeChanged: string,
+ WindowLoadChanged: string,
+ WindowDeleteEvent: string,
+ WindowFocusIn: string,
+ WindowFocusOut: string,
+ ApplicationStartup: string,
},
Common: {
ApplicationStarted: string,
diff --git a/v3/pkg/application/application_darwin_delegate.m b/v3/pkg/application/application_darwin_delegate.m
index aae5b0bd7d4..2b91eb4d2f1 100644
--- a/v3/pkg/application/application_darwin_delegate.m
+++ b/v3/pkg/application/application_darwin_delegate.m
@@ -4,7 +4,6 @@
extern bool hasListeners(unsigned int);
extern bool shouldQuitApplication();
extern void cleanup();
-
@implementation AppDelegate
- (void)dealloc
{
diff --git a/v3/pkg/application/application_linux.go b/v3/pkg/application/application_linux.go
index f098a1fc4b2..4db23d058c1 100644
--- a/v3/pkg/application/application_linux.go
+++ b/v3/pkg/application/application_linux.go
@@ -2,6 +2,7 @@
package application
+import "C"
import (
"fmt"
"log"
@@ -21,20 +22,19 @@ func init() {
}
type linuxApp struct {
- application pointer
- applicationMenu pointer
- parent *App
+ application pointer
+ parent *App
startupActions []func()
// Native -> uint
- windows map[windowPointer]uint
- windowsLock sync.Mutex
+ windowMap map[windowPointer]uint
+ windowMapLock sync.Mutex
theme string
}
-func (m *linuxApp) GetFlags(options Options) map[string]any {
+func (a *linuxApp) GetFlags(options Options) map[string]any {
if options.Flags == nil {
options.Flags = make(map[string]any)
}
@@ -45,32 +45,27 @@ func getNativeApplication() *linuxApp {
return globalApplication.impl.(*linuxApp)
}
-func (m *linuxApp) hide() {
- hideAllWindows(m.application)
+func (a *linuxApp) hide() {
+ a.hideAllWindows()
}
-func (m *linuxApp) show() {
- showAllWindows(m.application)
+func (a *linuxApp) show() {
+ a.showAllWindows()
}
-func (m *linuxApp) on(eventID uint) {
- // TODO: What do we need to do here?
- log.Println("linuxApp.on()", eventID)
+func (a *linuxApp) on(eventID uint) {
+ // TODO: Test register/unregister events
+ //C.registerApplicationEvent(l.application, C.uint(eventID))
}
-func (m *linuxApp) setIcon(icon []byte) {
-
+func (a *linuxApp) setIcon(icon []byte) {
log.Println("linuxApp.setIcon", "not implemented")
}
-func (m *linuxApp) name() string {
+func (a *linuxApp) name() string {
return appName()
}
-func (m *linuxApp) getCurrentWindowID() uint {
- return getCurrentWindowID(m.application, m.windows)
-}
-
type rnr struct {
f func()
}
@@ -79,22 +74,7 @@ func (r rnr) run() {
r.f()
}
-func (m *linuxApp) getApplicationMenu() pointer {
- if m.applicationMenu != nilPointer {
- return m.applicationMenu
- }
-
- menu := globalApplication.ApplicationMenu
- if menu != nil {
- InvokeSync(func() {
- menu.Update()
- })
- m.applicationMenu = (menu.impl).(*linuxMenu).native
- }
- return m.applicationMenu
-}
-
-func (m *linuxApp) setApplicationMenu(menu *Menu) {
+func (a *linuxApp) setApplicationMenu(menu *Menu) {
// FIXME: How do we avoid putting a menu?
if menu == nil {
// Create a default menu
@@ -103,46 +83,55 @@ func (m *linuxApp) setApplicationMenu(menu *Menu) {
}
}
-func (m *linuxApp) run() error {
+func (a *linuxApp) run() error {
- // Add a hook to the ApplicationDidFinishLaunching event
- // FIXME: add Wails specific events - i.e. Shouldn't platform specific ones be translated to Wails events?
- m.parent.On(events.Mac.ApplicationDidFinishLaunching, func(evt *Event) {
- // Do we need to do anything now?
- fmt.Println("events.Mac.ApplicationDidFinishLaunching received!")
+ a.parent.On(events.Linux.ApplicationStartup, func(evt *Event) {
+ fmt.Println("events.Linux.ApplicationStartup received!")
})
- m.monitorThemeChanges()
- return appRun(m.application)
+ a.setupCommonEvents()
+ a.monitorThemeChanges()
+ return appRun(a.application)
}
-func (m *linuxApp) destroy() {
+func (a *linuxApp) unregisterWindow(w windowPointer) {
+ a.windowMapLock.Lock()
+ delete(a.windowMap, w)
+ a.windowMapLock.Unlock()
+
+ // If this was the last window...
+ if len(a.windowMap) == 0 && !a.parent.options.Linux.DisableQuitOnLastWindowClosed {
+ a.destroy()
+ }
+}
+
+func (a *linuxApp) destroy() {
if !globalApplication.shouldQuit() {
return
}
globalApplication.cleanup()
- appDestroy(m.application)
+ appDestroy(a.application)
}
-func (m *linuxApp) isOnMainThread() bool {
+func (a *linuxApp) isOnMainThread() bool {
return isOnMainThread()
}
// register our window to our parent mapping
-func (m *linuxApp) registerWindow(window pointer, id uint) {
- m.windowsLock.Lock()
- m.windows[windowPointer(window)] = id
- m.windowsLock.Unlock()
+func (a *linuxApp) registerWindow(window pointer, id uint) {
+ a.windowMapLock.Lock()
+ a.windowMap[windowPointer(window)] = id
+ a.windowMapLock.Unlock()
}
-func (m *linuxApp) isDarkMode() bool {
- return strings.Contains(m.theme, "dark")
+func (a *linuxApp) isDarkMode() bool {
+ return strings.Contains(a.theme, "dark")
}
-func (m *linuxApp) monitorThemeChanges() {
+func (a *linuxApp) monitorThemeChanges() {
go func() {
conn, err := dbus.ConnectSessionBus()
if err != nil {
- m.parent.info("[WARNING] Failed to connect to session bus; monitoring for theme changes will not function:", err)
+ a.parent.info("[WARNING] Failed to connect to session bus; monitoring for theme changes will not function:", err)
return
}
defer conn.Close()
@@ -175,10 +164,10 @@ func (m *linuxApp) monitorThemeChanges() {
continue
}
- if theme != m.theme {
- m.theme = theme
+ if theme != a.theme {
+ a.theme = theme
event := newApplicationEvent(events.Common.ThemeChanged)
- event.Context().setIsDarkMode(m.isDarkMode())
+ event.Context().setIsDarkMode(a.isDarkMode())
applicationEvents <- event
}
@@ -187,6 +176,7 @@ func (m *linuxApp) monitorThemeChanges() {
}
func newPlatformApp(parent *App) *linuxApp {
+
name := strings.ToLower(strings.Replace(parent.options.Name, " ", "", -1))
if name == "" {
name = "undefined"
@@ -194,7 +184,7 @@ func newPlatformApp(parent *App) *linuxApp {
app := &linuxApp{
parent: parent,
application: appNew(name),
- windows: map[windowPointer]uint{},
+ windowMap: map[windowPointer]uint{},
}
return app
}
@@ -213,3 +203,11 @@ func (a *App) logPlatformInfo() {
a.info("Platform Info:", platformInfo...)
}
+
+//export processWindowEvent
+func processWindowEvent(windowID C.uint, eventID C.uint) {
+ windowEvents <- &windowEvent{
+ WindowID: uint(windowID),
+ EventID: uint(eventID),
+ }
+}
diff --git a/v3/pkg/application/options_application.go b/v3/pkg/application/application_options.go
similarity index 62%
rename from v3/pkg/application/options_application.go
rename to v3/pkg/application/application_options.go
index 10bf75188eb..e786c66a541 100644
--- a/v3/pkg/application/options_application.go
+++ b/v3/pkg/application/application_options.go
@@ -24,6 +24,9 @@ type Options struct {
// Windows is the Windows specific configuration for Windows builds
Windows WindowsOptions
+ // Linux is the Linux specific configuration for Linux builds
+ Linux LinuxOptions
+
// Bind allows you to bind Go methods to the frontend.
Bind []any
@@ -111,3 +114,56 @@ func ChainMiddleware(middleware ...Middleware) Middleware {
func AssetFileServerFS(assets fs.FS) http.Handler {
return assetserver.NewAssetFileServer(assets)
}
+
+/******** Mac Options ********/
+
+// ActivationPolicy is the activation policy for the application.
+type ActivationPolicy int
+
+const (
+ // ActivationPolicyRegular is used for applications that have a user interface,
+ ActivationPolicyRegular ActivationPolicy = iota
+ // ActivationPolicyAccessory is used for applications that do not have a main window,
+ // such as system tray applications or background applications.
+ ActivationPolicyAccessory
+ ActivationPolicyProhibited
+)
+
+// MacOptions contains options for macOS applications.
+type MacOptions struct {
+ // ActivationPolicy is the activation policy for the application. Defaults to
+ // applicationActivationPolicyRegular.
+ ActivationPolicy ActivationPolicy
+ // If set to true, the application will terminate when the last window is closed.
+ ApplicationShouldTerminateAfterLastWindowClosed bool
+}
+
+/****** Windows Options *******/
+
+// WindowsOptions contains options for Windows applications.
+type WindowsOptions struct {
+
+ // WndProcInterceptor is a function that will be called for every message sent in the application.
+ // Use this to hook into the main message loop. This is useful for handling custom window messages.
+ // If `shouldReturn` is `true` then `returnCode` will be returned by the main message loop.
+ // If `shouldReturn` is `false` then returnCode will be ignored and the message will be processed by the main message loop.
+ WndProcInterceptor func(hwnd uintptr, msg uint32, wParam, lParam uintptr) (returnCode uintptr, shouldReturn bool)
+
+ // DisableQuitOnLastWindowClosed disables the auto quit of the application if the last window has been closed.
+ DisableQuitOnLastWindowClosed bool
+
+ // Path where the WebView2 stores the user data. If empty %APPDATA%\[BinaryName.exe] will be used.
+ // If the path is not valid, a messagebox will be displayed with the error and the app will exit with error code.
+ WebviewUserDataPath string
+
+ // Path to the directory with WebView2 executables. If empty WebView2 installed in the system will be used.
+ WebviewBrowserPath string
+}
+
+/********* Linux Options *********/
+
+// LinuxOptions contains options for Linux applications.
+type LinuxOptions struct {
+ // DisableQuitOnLastWindowClosed disables the auto quit of the application if the last window has been closed.
+ DisableQuitOnLastWindowClosed bool
+}
diff --git a/v3/pkg/application/assets/alpha/runtime.js b/v3/pkg/application/assets/alpha/runtime.js
index 2c7d16ed30b..baaccee0402 100644
--- a/v3/pkg/application/assets/alpha/runtime.js
+++ b/v3/pkg/application/assets/alpha/runtime.js
@@ -1 +1 @@
-(()=>{var le=Object.defineProperty;var w=(e,i)=>{for(var n in i)le(e,n,{get:i[n],enumerable:!0})};var T={};w(T,{Hide:()=>We,Quit:()=>fe,Show:()=>ge});var de="useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict";var f=(e=21)=>{let i="",n=e;for(;n--;)i+=de[Math.random()*64|0];return i};var ce=window.location.origin+"/wails/runtime",l={Call:0,Clipboard:1,Application:2,Events:3,ContextMenu:4,Dialog:5,Window:6,Screens:7,System:8,Browser:9,CancelCall:10},se=f();function d(e,i){return function(n,o=null){return we(e,n,i,o)}}function we(e,i,n,o){let t=new URL(ce);t.searchParams.append("object",e),t.searchParams.append("method",i);let a={headers:{}};return n&&(a.headers["x-wails-window-name"]=n),o&&t.searchParams.append("args",JSON.stringify(o)),a.headers["x-wails-client-id"]=se,new Promise((s,m)=>{fetch(t,a).then(c=>{if(c.ok)return c.headers.get("Content-Type")&&c.headers.get("Content-Type").indexOf("application/json")!==-1?c.json():c.text();m(Error(c.statusText))}).then(c=>s(c)).catch(c=>m(c))})}var P=d(l.Application,""),me=0,ue=1,pe=2;function We(){return P(me)}function ge(){return P(ue)}function fe(){return P(pe)}var B={};w(B,{OpenURL:()=>b});var he=d(l.Browser,""),De=0;function b(e){return he(De,{url:e})}var I={};w(I,{SetText:()=>Me,Text:()=>xe});var Q=d(l.Clipboard,""),Ce=0,Se=1;function Me(e){return Q(Ce,{text:e})}function xe(){return Q(Se)}var L={};w(L,{Capabilities:()=>Re,Environment:()=>Ee,IsAMD64:()=>Oe,IsARM:()=>Pe,IsARM64:()=>Te,IsDarkMode:()=>be,IsDebug:()=>F,IsLinux:()=>Ue,IsMac:()=>ye,IsWindows:()=>R,invoke:()=>h});var J=d(l.System,""),Ae=0,ve=1;function h(e){return window.chrome?window.chrome.webview.postMessage(e):window.webkit.messageHandlers.external.postMessage(e)}function be(){return J(Ae)}function Re(){return fetch("/wails/capabilities").json()}function Ee(){return J(ve)}function R(){return window._wails.environment.OS==="windows"}function Ue(){return window._wails.environment.OS==="linux"}function ye(){return window._wails.environment.OS==="darwin"}function Oe(){return window._wails.environment.Arch==="amd64"}function Pe(){return window._wails.environment.Arch==="arm"}function Te(){return window._wails.environment.Arch==="arm64"}function F(){return window._wails.environment.Debug===!0}window.addEventListener("contextmenu",Le);var Be=d(l.ContextMenu,""),Ie=0;function Fe(e,i,n,o){Be(Ie,{id:e,x:i,y:n,data:o})}function Le(e){let i=e.target,n=window.getComputedStyle(i).getPropertyValue("--custom-contextmenu");if(n=n?n.trim():"",n){e.preventDefault();let o=window.getComputedStyle(i).getPropertyValue("--custom-contextmenu-data");Fe(n,e.clientX,e.clientY,o);return}ze(e)}function ze(e){if(F())return;let i=e.target;switch(window.getComputedStyle(i).getPropertyValue("--default-contextmenu").trim()){case"show":return;case"hide":e.preventDefault();return;default:if(i.isContentEditable)return;let t=window.getSelection(),a=t.toString().length>0;if(a)for(let s=0;sS});function S(e){try{return window._wails.flags[e]}catch(i){throw new Error("Unable to retrieve flag '"+e+"': "+i)}}window._wails=window._wails||{};window._wails.setResizable=He;window._wails.endDrag=ee;window.addEventListener("mousedown",_e);window.addEventListener("mousemove",Ge);window.addEventListener("mouseup",je);var M=!1,E=null,$=!1,ke="auto";function Ne(e){let i=window.getComputedStyle(e.target).getPropertyValue("--webkit-app-region");return!i||i===""||i.trim()!=="drag"||e.buttons!==1?!1:e.detail===1}function He(e){$=e}function ee(){document.body.style.cursor="default",M=!1}function Ve(){return E?(h(`resize:${E}`),!0):!1}function _e(e){(R()&&Ve()||Ne(e))&&(M=!!Ze(e))}function Ze(e){return!(e.offsetX>e.target.clientWidth||e.offsetY>e.target.clientHeight)}function je(e){(e.buttons!==void 0?e.buttons:e.which)>0&&ee()}function W(e=ke){document.documentElement.style.cursor=e,E=e}function Ge(e){M=Ye(e),R()&&$&&Ke(e)}function Ye(e){let i=e.buttons!==void 0?e.buttons:e.which;return M&&i>0?(h("drag"),!1):M}function Ke(e){let i=S("system.resizeHandleHeight")||5,n=S("system.resizeHandleWidth")||5,o=S("resizeCornerExtra")||10,t=window.outerWidth-e.clientXJe,GetCurrent:()=>ei,GetPrimary:()=>$e});var k=d(l.Screens,""),Xe=0,qe=1,Qe=2;function Je(){return k(Xe)}function $e(){return k(qe)}function ei(){return k(Qe)}var H={};w(H,{Center:()=>Oi,Close:()=>qi,Fullscreen:()=>Ti,Get:()=>U,GetZoomLevel:()=>rn,Height:()=>en,Hide:()=>Vi,Maximise:()=>_i,Minimise:()=>Gi,RelativePosition:()=>Ni,Restore:()=>Ki,Screen:()=>Hi,SetAlwaysOnTop:()=>zi,SetBackgroundColour:()=>Qi,SetMaxSize:()=>Fi,SetMinSize:()=>Li,SetRelativePosition:()=>ki,SetResizable:()=>Ji,SetSize:()=>Bi,SetTitle:()=>Pi,SetZoomLevel:()=>an,Show:()=>Xi,Size:()=>Ii,ToggleMaximise:()=>ji,UnMaximise:()=>Zi,UnMinimise:()=>Yi,Width:()=>$i,ZoomIn:()=>nn,ZoomOut:()=>on,ZoomReset:()=>tn});var ii=0,ni=1,oi=2,ti=3,ri=4,ai=5,li=6,di=7,ci=8,si=9,wi=10,mi=11,ui=12,pi=13,Wi=14,gi=15,fi=16,hi=17,Di=18,Ci=19,Si=20,Mi=21,xi=22,Ai=23,vi=24,bi=25,Ri=26,Ei=27,Ui=28,yi=29,r=U("");function ie(e){return{Get:i=>ie(d(l.Window,i)),Center:()=>e(ii),SetTitle:i=>e(ni,{title:i}),Fullscreen:()=>e(oi),UnFullscreen:()=>e(ti),SetSize:(i,n)=>e(ri,{width:i,height:n}),Size:()=>e(ai),SetMaxSize:(i,n)=>e(li,{width:i,height:n}),SetMinSize:(i,n)=>e(di,{width:i,height:n}),SetAlwaysOnTop:i=>e(ci,{alwaysOnTop:i}),SetRelativePosition:(i,n)=>e(si,{x:i,y:n}),RelativePosition:()=>e(wi),Screen:()=>e(mi),Hide:()=>e(ui),Maximise:()=>e(pi),UnMaximise:()=>e(Wi),ToggleMaximise:()=>e(gi),Minimise:()=>e(fi),UnMinimise:()=>e(hi),Restore:()=>e(Di),Show:()=>e(Ci),Close:()=>e(Si),SetBackgroundColour:(i,n,o,t)=>e(Mi,{r:i,g:n,b:o,a:t}),SetResizable:i=>e(xi,{resizable:i}),Width:()=>e(Ai),Height:()=>e(vi),ZoomIn:()=>e(bi),ZoomOut:()=>e(Ri),ZoomReset:()=>e(Ei),GetZoomLevel:()=>e(Ui),SetZoomLevel:i=>e(yi,{zoomLevel:i})}}function U(e){return ie(d(l.Window,e))}function Oi(){r.Center()}function Pi(e){r.SetTitle(e)}function Ti(){r.Fullscreen()}function Bi(e,i){r.SetSize(e,i)}function Ii(){return r.Size()}function Fi(e,i){r.SetMaxSize(e,i)}function Li(e,i){r.SetMinSize(e,i)}function zi(e){r.SetAlwaysOnTop(e)}function ki(e,i){r.SetRelativePosition(e,i)}function Ni(){return r.RelativePosition()}function Hi(){return r.Screen()}function Vi(){r.Hide()}function _i(){r.Maximise()}function Zi(){r.UnMaximise()}function ji(){r.ToggleMaximise()}function Gi(){r.Minimise()}function Yi(){r.UnMinimise()}function Ki(){r.Restore()}function Xi(){r.Show()}function qi(){r.Close()}function Qi(e,i,n,o){r.SetBackgroundColour(e,i,n,o)}function Ji(e){r.SetResizable(e)}function $i(){return r.Width()}function en(){return r.Height()}function nn(){r.ZoomIn()}function on(){r.ZoomOut()}function tn(){r.ZoomReset()}function rn(){return r.GetZoomLevel()}function an(e){r.SetZoomLevel(e)}var K={};w(K,{Reload:()=>Y});var j={};w(j,{Emit:()=>Z,Off:()=>Wn,OffAll:()=>gn,On:()=>mn,OnMultiple:()=>_,Once:()=>un,Types:()=>ln,WailsEvent:()=>x,setup:()=>sn});var ne={Windows:{SystemThemeChanged:"windows:SystemThemeChanged",APMPowerStatusChange:"windows:APMPowerStatusChange",APMSuspend:"windows:APMSuspend",APMResumeAutomatic:"windows:APMResumeAutomatic",APMResumeSuspend:"windows:APMResumeSuspend",APMPowerSettingChange:"windows:APMPowerSettingChange",ApplicationStarted:"windows:ApplicationStarted",WebViewNavigationCompleted:"windows:WebViewNavigationCompleted",WindowInactive:"windows:WindowInactive",WindowActive:"windows:WindowActive",WindowClickActive:"windows:WindowClickActive",WindowMaximise:"windows:WindowMaximise",WindowUnMaximise:"windows:WindowUnMaximise",WindowFullscreen:"windows:WindowFullscreen",WindowUnFullscreen:"windows:WindowUnFullscreen",WindowRestore:"windows:WindowRestore",WindowMinimise:"windows:WindowMinimise",WindowUnMinimise:"windows:WindowUnMinimise",WindowClose:"windows:WindowClose",WindowSetFocus:"windows:WindowSetFocus",WindowKillFocus:"windows:WindowKillFocus",WindowDragDrop:"windows:WindowDragDrop",WindowDragEnter:"windows:WindowDragEnter",WindowDragLeave:"windows:WindowDragLeave",WindowDragOver:"windows:WindowDragOver"},Mac:{ApplicationDidBecomeActive:"mac:ApplicationDidBecomeActive",ApplicationDidChangeBackingProperties:"mac:ApplicationDidChangeBackingProperties",ApplicationDidChangeEffectiveAppearance:"mac:ApplicationDidChangeEffectiveAppearance",ApplicationDidChangeIcon:"mac:ApplicationDidChangeIcon",ApplicationDidChangeOcclusionState:"mac:ApplicationDidChangeOcclusionState",ApplicationDidChangeScreenParameters:"mac:ApplicationDidChangeScreenParameters",ApplicationDidChangeStatusBarFrame:"mac:ApplicationDidChangeStatusBarFrame",ApplicationDidChangeStatusBarOrientation:"mac:ApplicationDidChangeStatusBarOrientation",ApplicationDidFinishLaunching:"mac:ApplicationDidFinishLaunching",ApplicationDidHide:"mac:ApplicationDidHide",ApplicationDidResignActiveNotification:"mac:ApplicationDidResignActiveNotification",ApplicationDidUnhide:"mac:ApplicationDidUnhide",ApplicationDidUpdate:"mac:ApplicationDidUpdate",ApplicationWillBecomeActive:"mac:ApplicationWillBecomeActive",ApplicationWillFinishLaunching:"mac:ApplicationWillFinishLaunching",ApplicationWillHide:"mac:ApplicationWillHide",ApplicationWillResignActive:"mac:ApplicationWillResignActive",ApplicationWillTerminate:"mac:ApplicationWillTerminate",ApplicationWillUnhide:"mac:ApplicationWillUnhide",ApplicationWillUpdate:"mac:ApplicationWillUpdate",ApplicationDidChangeTheme:"mac:ApplicationDidChangeTheme!",ApplicationShouldHandleReopen:"mac:ApplicationShouldHandleReopen!",WindowDidBecomeKey:"mac:WindowDidBecomeKey",WindowDidBecomeMain:"mac:WindowDidBecomeMain",WindowDidBeginSheet:"mac:WindowDidBeginSheet",WindowDidChangeAlpha:"mac:WindowDidChangeAlpha",WindowDidChangeBackingLocation:"mac:WindowDidChangeBackingLocation",WindowDidChangeBackingProperties:"mac:WindowDidChangeBackingProperties",WindowDidChangeCollectionBehavior:"mac:WindowDidChangeCollectionBehavior",WindowDidChangeEffectiveAppearance:"mac:WindowDidChangeEffectiveAppearance",WindowDidChangeOcclusionState:"mac:WindowDidChangeOcclusionState",WindowDidChangeOrderingMode:"mac:WindowDidChangeOrderingMode",WindowDidChangeScreen:"mac:WindowDidChangeScreen",WindowDidChangeScreenParameters:"mac:WindowDidChangeScreenParameters",WindowDidChangeScreenProfile:"mac:WindowDidChangeScreenProfile",WindowDidChangeScreenSpace:"mac:WindowDidChangeScreenSpace",WindowDidChangeScreenSpaceProperties:"mac:WindowDidChangeScreenSpaceProperties",WindowDidChangeSharingType:"mac:WindowDidChangeSharingType",WindowDidChangeSpace:"mac:WindowDidChangeSpace",WindowDidChangeSpaceOrderingMode:"mac:WindowDidChangeSpaceOrderingMode",WindowDidChangeTitle:"mac:WindowDidChangeTitle",WindowDidChangeToolbar:"mac:WindowDidChangeToolbar",WindowDidChangeVisibility:"mac:WindowDidChangeVisibility",WindowDidDeminiaturize:"mac:WindowDidDeminiaturize",WindowDidEndSheet:"mac:WindowDidEndSheet",WindowDidEnterFullScreen:"mac:WindowDidEnterFullScreen",WindowDidEnterVersionBrowser:"mac:WindowDidEnterVersionBrowser",WindowDidExitFullScreen:"mac:WindowDidExitFullScreen",WindowDidExitVersionBrowser:"mac:WindowDidExitVersionBrowser",WindowDidExpose:"mac:WindowDidExpose",WindowDidFocus:"mac:WindowDidFocus",WindowDidMiniaturize:"mac:WindowDidMiniaturize",WindowDidMove:"mac:WindowDidMove",WindowDidOrderOffScreen:"mac:WindowDidOrderOffScreen",WindowDidOrderOnScreen:"mac:WindowDidOrderOnScreen",WindowDidResignKey:"mac:WindowDidResignKey",WindowDidResignMain:"mac:WindowDidResignMain",WindowDidResize:"mac:WindowDidResize",WindowDidUpdate:"mac:WindowDidUpdate",WindowDidUpdateAlpha:"mac:WindowDidUpdateAlpha",WindowDidUpdateCollectionBehavior:"mac:WindowDidUpdateCollectionBehavior",WindowDidUpdateCollectionProperties:"mac:WindowDidUpdateCollectionProperties",WindowDidUpdateShadow:"mac:WindowDidUpdateShadow",WindowDidUpdateTitle:"mac:WindowDidUpdateTitle",WindowDidUpdateToolbar:"mac:WindowDidUpdateToolbar",WindowDidUpdateVisibility:"mac:WindowDidUpdateVisibility",WindowShouldClose:"mac:WindowShouldClose!",WindowWillBecomeKey:"mac:WindowWillBecomeKey",WindowWillBecomeMain:"mac:WindowWillBecomeMain",WindowWillBeginSheet:"mac:WindowWillBeginSheet",WindowWillChangeOrderingMode:"mac:WindowWillChangeOrderingMode",WindowWillClose:"mac:WindowWillClose",WindowWillDeminiaturize:"mac:WindowWillDeminiaturize",WindowWillEnterFullScreen:"mac:WindowWillEnterFullScreen",WindowWillEnterVersionBrowser:"mac:WindowWillEnterVersionBrowser",WindowWillExitFullScreen:"mac:WindowWillExitFullScreen",WindowWillExitVersionBrowser:"mac:WindowWillExitVersionBrowser",WindowWillFocus:"mac:WindowWillFocus",WindowWillMiniaturize:"mac:WindowWillMiniaturize",WindowWillMove:"mac:WindowWillMove",WindowWillOrderOffScreen:"mac:WindowWillOrderOffScreen",WindowWillOrderOnScreen:"mac:WindowWillOrderOnScreen",WindowWillResignMain:"mac:WindowWillResignMain",WindowWillResize:"mac:WindowWillResize",WindowWillUnfocus:"mac:WindowWillUnfocus",WindowWillUpdate:"mac:WindowWillUpdate",WindowWillUpdateAlpha:"mac:WindowWillUpdateAlpha",WindowWillUpdateCollectionBehavior:"mac:WindowWillUpdateCollectionBehavior",WindowWillUpdateCollectionProperties:"mac:WindowWillUpdateCollectionProperties",WindowWillUpdateShadow:"mac:WindowWillUpdateShadow",WindowWillUpdateTitle:"mac:WindowWillUpdateTitle",WindowWillUpdateToolbar:"mac:WindowWillUpdateToolbar",WindowWillUpdateVisibility:"mac:WindowWillUpdateVisibility",WindowWillUseStandardFrame:"mac:WindowWillUseStandardFrame",MenuWillOpen:"mac:MenuWillOpen",MenuDidOpen:"mac:MenuDidOpen",MenuDidClose:"mac:MenuDidClose",MenuWillSendAction:"mac:MenuWillSendAction",MenuDidSendAction:"mac:MenuDidSendAction",MenuWillHighlightItem:"mac:MenuWillHighlightItem",MenuDidHighlightItem:"mac:MenuDidHighlightItem",MenuWillDisplayItem:"mac:MenuWillDisplayItem",MenuDidDisplayItem:"mac:MenuDidDisplayItem",MenuWillAddItem:"mac:MenuWillAddItem",MenuDidAddItem:"mac:MenuDidAddItem",MenuWillRemoveItem:"mac:MenuWillRemoveItem",MenuDidRemoveItem:"mac:MenuDidRemoveItem",MenuWillBeginTracking:"mac:MenuWillBeginTracking",MenuDidBeginTracking:"mac:MenuDidBeginTracking",MenuWillEndTracking:"mac:MenuWillEndTracking",MenuDidEndTracking:"mac:MenuDidEndTracking",MenuWillUpdate:"mac:MenuWillUpdate",MenuDidUpdate:"mac:MenuDidUpdate",MenuWillPopUp:"mac:MenuWillPopUp",MenuDidPopUp:"mac:MenuDidPopUp",MenuWillSendActionToItem:"mac:MenuWillSendActionToItem",MenuDidSendActionToItem:"mac:MenuDidSendActionToItem",WebViewDidStartProvisionalNavigation:"mac:WebViewDidStartProvisionalNavigation",WebViewDidReceiveServerRedirectForProvisionalNavigation:"mac:WebViewDidReceiveServerRedirectForProvisionalNavigation",WebViewDidFinishNavigation:"mac:WebViewDidFinishNavigation",WebViewDidCommitNavigation:"mac:WebViewDidCommitNavigation",WindowFileDraggingEntered:"mac:WindowFileDraggingEntered",WindowFileDraggingPerformed:"mac:WindowFileDraggingPerformed",WindowFileDraggingExited:"mac:WindowFileDraggingExited"},Linux:{SystemThemeChanged:"linux:SystemThemeChanged"},Common:{ApplicationStarted:"common:ApplicationStarted",WindowMaximise:"common:WindowMaximise",WindowUnMaximise:"common:WindowUnMaximise",WindowFullscreen:"common:WindowFullscreen",WindowUnFullscreen:"common:WindowUnFullscreen",WindowRestore:"common:WindowRestore",WindowMinimise:"common:WindowMinimise",WindowUnMinimise:"common:WindowUnMinimise",WindowClosing:"common:WindowClosing",WindowZoom:"common:WindowZoom",WindowZoomIn:"common:WindowZoomIn",WindowZoomOut:"common:WindowZoomOut",WindowZoomReset:"common:WindowZoomReset",WindowFocus:"common:WindowFocus",WindowLostFocus:"common:WindowLostFocus",WindowShow:"common:WindowShow",WindowHide:"common:WindowHide",WindowDPIChanged:"common:WindowDPIChanged",WindowFilesDropped:"common:WindowFilesDropped",WindowRuntimeReady:"common:WindowRuntimeReady",ThemeChanged:"common:ThemeChanged"}};var ln=ne;window._wails=window._wails||{};window._wails.dispatchWailsEvent=wn;var dn=d(l.Events,""),cn=0,u=new Map,V=class{constructor(i,n,o){this.eventName=i,this.maxCallbacks=o||-1,this.Callback=t=>(n(t),this.maxCallbacks===-1?!1:(this.maxCallbacks-=1,this.maxCallbacks===0))}},x=class{constructor(i,n=null){this.name=i,this.data=n}};function sn(){}function wn(e){let i=u.get(e.name);if(i){let n=i.filter(o=>{if(o.Callback(e))return!0});n.length>0&&(i=i.filter(o=>!n.includes(o)),i.length===0?u.delete(e.name):u.set(e.name,i))}}function _(e,i,n){let o=u.get(e)||[],t=new V(e,i,n);return o.push(t),u.set(e,o),()=>pn(t)}function mn(e,i){return _(e,i,-1)}function un(e,i){return _(e,i,1)}function pn(e){let i=e.eventName,n=u.get(i).filter(o=>o!==e);n.length===0?u.delete(i):u.set(i,n)}function Wn(e,...i){[e,...i].forEach(o=>u.delete(o))}function gn(){u.clear()}function Z(e){return dn(cn,e)}var G={};w(G,{Error:()=>Un,Info:()=>Rn,OpenFile:()=>yn,Question:()=>A,SaveFile:()=>On,Warning:()=>En});window._wails=window._wails||{};window._wails.dialogErrorCallback=bn;window._wails.dialogResultCallback=vn;var fn=0,hn=1,Dn=2,Cn=3,Sn=4,Mn=5,xn=d(l.Dialog,""),g=new Map;function An(){let e;do e=f();while(g.has(e));return e}function D(e,i={}){let n=An();return i["dialog-id"]=n,new Promise((o,t)=>{g.set(n,{resolve:o,reject:t}),xn(e,i).catch(a=>{t(a),g.delete(n)})})}function vn(e,i,n){let o=g.get(e);o&&(n?o.resolve(JSON.parse(i)):o.resolve(i),g.delete(e))}function bn(e,i){let n=g.get(e);n&&(n.reject(i),g.delete(e))}var Rn=e=>D(fn,e),En=e=>D(hn,e),Un=e=>D(Dn,e),A=e=>D(Cn,e),yn=e=>D(Sn,e),On=e=>D(Mn,e);function oe(e,i=null){let n=new x(e,i);Z(n)}function Pn(){document.querySelectorAll("[wml-event]").forEach(function(i){let n=i.getAttribute("wml-event"),o=i.getAttribute("wml-confirm"),t=i.getAttribute("wml-trigger")||"click",a=function(){if(o){A({Title:"Confirm",Message:o,Detached:!1,Buttons:[{Label:"Yes"},{Label:"No",IsDefault:!0}]}).then(function(s){s!=="No"&&oe(n)});return}oe(n)};i.removeEventListener(t,a),i.addEventListener(t,a)})}function te(e,i){let n=U(e),o=In(n);o.has(i);try{o.get(i)()}catch{}}function Tn(){document.querySelectorAll("[wml-window]").forEach(function(i){let n=i.getAttribute("wml-window"),o=i.getAttribute("wml-confirm"),t=i.getAttribute("wml-trigger")||"click",a=i.getAttribute("wml-target-window")||"",s=function(){if(o){A({Title:"Confirm",Message:o,Buttons:[{Label:"Yes"},{Label:"No",IsDefault:!0}]}).then(function(m){m!=="No"&&te(a,n)});return}te(a,n)};i.removeEventListener(t,s),i.addEventListener(t,s)})}function Bn(){document.querySelectorAll("[wml-openurl]").forEach(function(i){let n=i.getAttribute("wml-openurl"),o=i.getAttribute("wml-confirm"),t=i.getAttribute("wml-trigger")||"click",a=function(){if(o){A({Title:"Confirm",Message:o,Buttons:[{Label:"Yes"},{Label:"No",IsDefault:!0}]}).then(function(s){s!=="No"&&b(n)});return}b(n)};i.removeEventListener(t,a),i.addEventListener(t,a)})}function Y(){Pn(),Tn(),Bn()}function In(e){let i=new Map;for(let n in e)typeof e[n]=="function"&&i.set(n,e[n]);return i}var X={};w(X,{ByID:()=>_n,ByName:()=>Vn,Call:()=>Hn,Plugin:()=>Zn});window._wails=window._wails||{};window._wails.callResultHandler=kn;window._wails.callErrorHandler=Nn;var y=0,Fn=d(l.Call,""),Ln=d(l.CancelCall,""),v=new Map;function zn(){let e;do e=f();while(v.has(e));return e}function kn(e,i,n){let o=re(e);o&&o.resolve(n?JSON.parse(i):i)}function Nn(e,i){let n=re(e);n&&n.reject(i)}function re(e){let i=v.get(e);return v.delete(e),i}function O(e,i={}){let n=zn(),o=()=>{Ln(e,{"call-id":n})};var t=!1,a=!1,s=new Promise((m,c)=>{i["call-id"]=n,v.set(n,{resolve:m,reject:c}),Fn(e,i).then(p=>{a=!0,t&&o()}).catch(p=>{c(p),v.delete(n)})});return s.cancel=()=>{a?o():t=!0},s}function Hn(e){return O(y,e)}function Vn(e,...i){if(typeof e!="string"||e.split(".").length!==3)throw new Error("CallByName requires a string in the format 'package.struct.method'");let[n,o,t]=e.split(".");return O(y,{packageName:n,structName:o,methodName:t,args:i})}function _n(e,...i){return O(y,{methodID:e,args:i})}function Zn(e,i,...n){return O(y,{packageName:"wails-plugins",structName:e,methodName:i,args:n})}window._wails=window._wails||{};window._wails.invoke=h;window.wails=window.wails||{};window.wails.Application=T;window.wails.Browser=B;window.wails.Call=X;window.wails.Clipboard=I;window.wails.Dialogs=G;window.wails.Events=j;window.wails.Flags=z;window.wails.Screens=N;window.wails.System=L;window.wails.Window=H;window.wails.WML=K;var ae=!1;document.addEventListener("DOMContentLoaded",function(){ae=!0,window._wails.invoke("wails:runtime:ready")});function jn(e){ae||document.readyState==="complete"?e():document.addEventListener("DOMContentLoaded",e)}jn(()=>{Y()});})();
+(()=>{var de=Object.defineProperty;var w=(e,i)=>{for(var n in i)de(e,n,{get:i[n],enumerable:!0})};var T={};w(T,{Hide:()=>We,Quit:()=>fe,Show:()=>ge});var le="useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict";var f=(e=21)=>{let i="",n=e;for(;n--;)i+=le[Math.random()*64|0];return i};var ce=window.location.origin+"/wails/runtime",d={Call:0,Clipboard:1,Application:2,Events:3,ContextMenu:4,Dialog:5,Window:6,Screens:7,System:8,Browser:9},se=f();function l(e,i){return function(n,o=null){return we(e,n,i,o)}}function we(e,i,n,o){let t=new URL(ce);t.searchParams.append("object",e),t.searchParams.append("method",i);let a={headers:{}};return n&&(a.headers["x-wails-window-name"]=n),o&&t.searchParams.append("args",JSON.stringify(o)),a.headers["x-wails-client-id"]=se,new Promise((s,p)=>{fetch(t,a).then(c=>{if(c.ok)return c.headers.get("Content-Type")&&c.headers.get("Content-Type").indexOf("application/json")!==-1?c.json():c.text();p(Error(c.statusText))}).then(c=>s(c)).catch(c=>p(c))})}var P=l(d.Application,""),me=0,ue=1,pe=2;function We(){return P(me)}function ge(){return P(ue)}function fe(){return P(pe)}var B={};w(B,{OpenURL:()=>b});var he=l(d.Browser,""),De=0;function b(e){return he(De,{url:e})}var I={};w(I,{SetText:()=>xe,Text:()=>Me});var q=l(d.Clipboard,""),Ce=0,Se=1;function xe(e){return q(Ce,{text:e})}function Me(){return q(Se)}var L={};w(L,{Capabilities:()=>Re,Environment:()=>Ee,IsAMD64:()=>Oe,IsARM:()=>Pe,IsARM64:()=>Te,IsDarkMode:()=>be,IsDebug:()=>F,IsLinux:()=>Ue,IsMac:()=>ye,IsWindows:()=>R,invoke:()=>h});var J=l(d.System,""),Ae=0,ve=1;function h(e){return window.chrome?window.chrome.webview.postMessage(e):window.webkit.messageHandlers.external.postMessage(e)}function be(){return J(Ae)}function Re(){return fetch("/wails/capabilities").json()}function Ee(){return J(ve)}function R(){return window._wails.environment.OS==="windows"}function Ue(){return window._wails.environment.OS==="linux"}function ye(){return window._wails.environment.OS==="darwin"}function Oe(){return window._wails.environment.Arch==="amd64"}function Pe(){return window._wails.environment.Arch==="arm"}function Te(){return window._wails.environment.Arch==="arm64"}function F(){return window._wails.environment.Debug===!0}window.addEventListener("contextmenu",Le);var Be=l(d.ContextMenu,""),Ie=0;function Fe(e,i,n,o){Be(Ie,{id:e,x:i,y:n,data:o})}function Le(e){let i=e.target,n=window.getComputedStyle(i).getPropertyValue("--custom-contextmenu");if(n=n?n.trim():"",n){e.preventDefault();let o=window.getComputedStyle(i).getPropertyValue("--custom-contextmenu-data");Fe(n,e.clientX,e.clientY,o);return}ze(e)}function ze(e){if(F())return;let i=e.target;switch(window.getComputedStyle(i).getPropertyValue("--default-contextmenu").trim()){case"show":return;case"hide":e.preventDefault();return;default:if(i.isContentEditable)return;let t=window.getSelection(),a=t.toString().length>0;if(a)for(let s=0;sS});function S(e){try{return window._wails.flags[e]}catch(i){throw new Error("Unable to retrieve flag '"+e+"': "+i)}}window._wails=window._wails||{};window._wails.setResizable=He;window._wails.endDrag=ee;window.addEventListener("mousedown",_e);window.addEventListener("mousemove",Ge);window.addEventListener("mouseup",je);var x=!1,E=null,$=!1,ke="auto";function Ne(e){let i=window.getComputedStyle(e.target).getPropertyValue("--webkit-app-region");return!i||i===""||i.trim()!=="drag"||e.buttons!==1?!1:e.detail===1}function He(e){$=e}function ee(){document.body.style.cursor="default",x=!1}function Ve(){return E?(h(`resize:${E}`),!0):!1}function _e(e){(R()&&Ve()||Ne(e))&&(x=!!Ze(e))}function Ze(e){return!(e.offsetX>e.target.clientWidth||e.offsetY>e.target.clientHeight)}function je(e){(e.buttons!==void 0?e.buttons:e.which)>0&&ee()}function u(e=ke){document.documentElement.style.cursor=e,E=e}function Ge(e){x=Ye(e),R()&&$&&Ke(e)}function Ye(e){let i=e.buttons!==void 0?e.buttons:e.which;return x&&i>0?(h("drag"),!1):x}function Ke(e){let i=S("system.resizeHandleHeight")||5,n=S("system.resizeHandleWidth")||5,o=S("resizeCornerExtra")||10,t=window.outerWidth-e.clientXJe,GetCurrent:()=>ei,GetPrimary:()=>$e});var k=l(d.Screens,""),Xe=0,Qe=1,qe=2;function Je(){return k(Xe)}function $e(){return k(Qe)}function ei(){return k(qe)}var H={};w(H,{Center:()=>Oi,Close:()=>Qi,Fullscreen:()=>Ti,Get:()=>U,GetZoomLevel:()=>rn,Height:()=>en,Hide:()=>Vi,Maximise:()=>_i,Minimise:()=>Gi,RelativePosition:()=>Ni,Restore:()=>Ki,Screen:()=>Hi,SetAlwaysOnTop:()=>zi,SetBackgroundColour:()=>qi,SetMaxSize:()=>Fi,SetMinSize:()=>Li,SetRelativePosition:()=>ki,SetResizable:()=>Ji,SetSize:()=>Bi,SetTitle:()=>Pi,SetZoomLevel:()=>an,Show:()=>Xi,Size:()=>Ii,ToggleMaximise:()=>ji,UnMaximise:()=>Zi,UnMinimise:()=>Yi,Width:()=>$i,ZoomIn:()=>nn,ZoomOut:()=>on,ZoomReset:()=>tn});var ii=0,ni=1,oi=2,ti=3,ri=4,ai=5,di=6,li=7,ci=8,si=9,wi=10,mi=11,ui=12,pi=13,Wi=14,gi=15,fi=16,hi=17,Di=18,Ci=19,Si=20,xi=21,Mi=22,Ai=23,vi=24,bi=25,Ri=26,Ei=27,Ui=28,yi=29,r=U("");function ie(e){return{Get:i=>ie(l(d.Window,i)),Center:()=>e(ii),SetTitle:i=>e(ni,{title:i}),Fullscreen:()=>e(oi),UnFullscreen:()=>e(ti),SetSize:(i,n)=>e(ri,{width:i,height:n}),Size:()=>e(ai),SetMaxSize:(i,n)=>e(di,{width:i,height:n}),SetMinSize:(i,n)=>e(li,{width:i,height:n}),SetAlwaysOnTop:i=>e(ci,{alwaysOnTop:i}),SetRelativePosition:(i,n)=>e(si,{x:i,y:n}),RelativePosition:()=>e(wi),Screen:()=>e(mi),Hide:()=>e(ui),Maximise:()=>e(pi),UnMaximise:()=>e(Wi),ToggleMaximise:()=>e(gi),Minimise:()=>e(fi),UnMinimise:()=>e(hi),Restore:()=>e(Di),Show:()=>e(Ci),Close:()=>e(Si),SetBackgroundColour:(i,n,o,t)=>e(xi,{r:i,g:n,b:o,a:t}),SetResizable:i=>e(Mi,{resizable:i}),Width:()=>e(Ai),Height:()=>e(vi),ZoomIn:()=>e(bi),ZoomOut:()=>e(Ri),ZoomReset:()=>e(Ei),GetZoomLevel:()=>e(Ui),SetZoomLevel:i=>e(yi,{zoomLevel:i})}}function U(e){return ie(l(d.Window,e))}function Oi(){r.Center()}function Pi(e){r.SetTitle(e)}function Ti(){r.Fullscreen()}function Bi(e,i){r.SetSize(e,i)}function Ii(){return r.Size()}function Fi(e,i){r.SetMaxSize(e,i)}function Li(e,i){r.SetMinSize(e,i)}function zi(e){r.SetAlwaysOnTop(e)}function ki(e,i){r.SetRelativePosition(e,i)}function Ni(){return r.RelativePosition()}function Hi(){return r.Screen()}function Vi(){r.Hide()}function _i(){r.Maximise()}function Zi(){r.UnMaximise()}function ji(){r.ToggleMaximise()}function Gi(){r.Minimise()}function Yi(){r.UnMinimise()}function Ki(){r.Restore()}function Xi(){r.Show()}function Qi(){r.Close()}function qi(e,i,n,o){r.SetBackgroundColour(e,i,n,o)}function Ji(e){r.SetResizable(e)}function $i(){return r.Width()}function en(){return r.Height()}function nn(){r.ZoomIn()}function on(){r.ZoomOut()}function tn(){r.ZoomReset()}function rn(){return r.GetZoomLevel()}function an(e){r.SetZoomLevel(e)}var K={};w(K,{Reload:()=>Y});var j={};w(j,{Emit:()=>Z,Off:()=>Wn,OffAll:()=>gn,On:()=>mn,OnMultiple:()=>_,Once:()=>un,Types:()=>dn,WailsEvent:()=>M,setup:()=>sn});var ne={Windows:{SystemThemeChanged:"windows:SystemThemeChanged",APMPowerStatusChange:"windows:APMPowerStatusChange",APMSuspend:"windows:APMSuspend",APMResumeAutomatic:"windows:APMResumeAutomatic",APMResumeSuspend:"windows:APMResumeSuspend",APMPowerSettingChange:"windows:APMPowerSettingChange",ApplicationStarted:"windows:ApplicationStarted",WebViewNavigationCompleted:"windows:WebViewNavigationCompleted",WindowInactive:"windows:WindowInactive",WindowActive:"windows:WindowActive",WindowClickActive:"windows:WindowClickActive",WindowMaximise:"windows:WindowMaximise",WindowUnMaximise:"windows:WindowUnMaximise",WindowFullscreen:"windows:WindowFullscreen",WindowUnFullscreen:"windows:WindowUnFullscreen",WindowRestore:"windows:WindowRestore",WindowMinimise:"windows:WindowMinimise",WindowUnMinimise:"windows:WindowUnMinimise",WindowClose:"windows:WindowClose",WindowSetFocus:"windows:WindowSetFocus",WindowKillFocus:"windows:WindowKillFocus",WindowDragDrop:"windows:WindowDragDrop",WindowDragEnter:"windows:WindowDragEnter",WindowDragLeave:"windows:WindowDragLeave",WindowDragOver:"windows:WindowDragOver"},Mac:{ApplicationDidBecomeActive:"mac:ApplicationDidBecomeActive",ApplicationDidChangeBackingProperties:"mac:ApplicationDidChangeBackingProperties",ApplicationDidChangeEffectiveAppearance:"mac:ApplicationDidChangeEffectiveAppearance",ApplicationDidChangeIcon:"mac:ApplicationDidChangeIcon",ApplicationDidChangeOcclusionState:"mac:ApplicationDidChangeOcclusionState",ApplicationDidChangeScreenParameters:"mac:ApplicationDidChangeScreenParameters",ApplicationDidChangeStatusBarFrame:"mac:ApplicationDidChangeStatusBarFrame",ApplicationDidChangeStatusBarOrientation:"mac:ApplicationDidChangeStatusBarOrientation",ApplicationDidFinishLaunching:"mac:ApplicationDidFinishLaunching",ApplicationDidHide:"mac:ApplicationDidHide",ApplicationDidResignActiveNotification:"mac:ApplicationDidResignActiveNotification",ApplicationDidUnhide:"mac:ApplicationDidUnhide",ApplicationDidUpdate:"mac:ApplicationDidUpdate",ApplicationWillBecomeActive:"mac:ApplicationWillBecomeActive",ApplicationWillFinishLaunching:"mac:ApplicationWillFinishLaunching",ApplicationWillHide:"mac:ApplicationWillHide",ApplicationWillResignActive:"mac:ApplicationWillResignActive",ApplicationWillTerminate:"mac:ApplicationWillTerminate",ApplicationWillUnhide:"mac:ApplicationWillUnhide",ApplicationWillUpdate:"mac:ApplicationWillUpdate",ApplicationDidChangeTheme:"mac:ApplicationDidChangeTheme!",ApplicationShouldHandleReopen:"mac:ApplicationShouldHandleReopen!",WindowDidBecomeKey:"mac:WindowDidBecomeKey",WindowDidBecomeMain:"mac:WindowDidBecomeMain",WindowDidBeginSheet:"mac:WindowDidBeginSheet",WindowDidChangeAlpha:"mac:WindowDidChangeAlpha",WindowDidChangeBackingLocation:"mac:WindowDidChangeBackingLocation",WindowDidChangeBackingProperties:"mac:WindowDidChangeBackingProperties",WindowDidChangeCollectionBehavior:"mac:WindowDidChangeCollectionBehavior",WindowDidChangeEffectiveAppearance:"mac:WindowDidChangeEffectiveAppearance",WindowDidChangeOcclusionState:"mac:WindowDidChangeOcclusionState",WindowDidChangeOrderingMode:"mac:WindowDidChangeOrderingMode",WindowDidChangeScreen:"mac:WindowDidChangeScreen",WindowDidChangeScreenParameters:"mac:WindowDidChangeScreenParameters",WindowDidChangeScreenProfile:"mac:WindowDidChangeScreenProfile",WindowDidChangeScreenSpace:"mac:WindowDidChangeScreenSpace",WindowDidChangeScreenSpaceProperties:"mac:WindowDidChangeScreenSpaceProperties",WindowDidChangeSharingType:"mac:WindowDidChangeSharingType",WindowDidChangeSpace:"mac:WindowDidChangeSpace",WindowDidChangeSpaceOrderingMode:"mac:WindowDidChangeSpaceOrderingMode",WindowDidChangeTitle:"mac:WindowDidChangeTitle",WindowDidChangeToolbar:"mac:WindowDidChangeToolbar",WindowDidChangeVisibility:"mac:WindowDidChangeVisibility",WindowDidDeminiaturize:"mac:WindowDidDeminiaturize",WindowDidEndSheet:"mac:WindowDidEndSheet",WindowDidEnterFullScreen:"mac:WindowDidEnterFullScreen",WindowDidEnterVersionBrowser:"mac:WindowDidEnterVersionBrowser",WindowDidExitFullScreen:"mac:WindowDidExitFullScreen",WindowDidExitVersionBrowser:"mac:WindowDidExitVersionBrowser",WindowDidExpose:"mac:WindowDidExpose",WindowDidFocus:"mac:WindowDidFocus",WindowDidMiniaturize:"mac:WindowDidMiniaturize",WindowDidMove:"mac:WindowDidMove",WindowDidOrderOffScreen:"mac:WindowDidOrderOffScreen",WindowDidOrderOnScreen:"mac:WindowDidOrderOnScreen",WindowDidResignKey:"mac:WindowDidResignKey",WindowDidResignMain:"mac:WindowDidResignMain",WindowDidResize:"mac:WindowDidResize",WindowDidUpdate:"mac:WindowDidUpdate",WindowDidUpdateAlpha:"mac:WindowDidUpdateAlpha",WindowDidUpdateCollectionBehavior:"mac:WindowDidUpdateCollectionBehavior",WindowDidUpdateCollectionProperties:"mac:WindowDidUpdateCollectionProperties",WindowDidUpdateShadow:"mac:WindowDidUpdateShadow",WindowDidUpdateTitle:"mac:WindowDidUpdateTitle",WindowDidUpdateToolbar:"mac:WindowDidUpdateToolbar",WindowDidUpdateVisibility:"mac:WindowDidUpdateVisibility",WindowShouldClose:"mac:WindowShouldClose!",WindowWillBecomeKey:"mac:WindowWillBecomeKey",WindowWillBecomeMain:"mac:WindowWillBecomeMain",WindowWillBeginSheet:"mac:WindowWillBeginSheet",WindowWillChangeOrderingMode:"mac:WindowWillChangeOrderingMode",WindowWillClose:"mac:WindowWillClose",WindowWillDeminiaturize:"mac:WindowWillDeminiaturize",WindowWillEnterFullScreen:"mac:WindowWillEnterFullScreen",WindowWillEnterVersionBrowser:"mac:WindowWillEnterVersionBrowser",WindowWillExitFullScreen:"mac:WindowWillExitFullScreen",WindowWillExitVersionBrowser:"mac:WindowWillExitVersionBrowser",WindowWillFocus:"mac:WindowWillFocus",WindowWillMiniaturize:"mac:WindowWillMiniaturize",WindowWillMove:"mac:WindowWillMove",WindowWillOrderOffScreen:"mac:WindowWillOrderOffScreen",WindowWillOrderOnScreen:"mac:WindowWillOrderOnScreen",WindowWillResignMain:"mac:WindowWillResignMain",WindowWillResize:"mac:WindowWillResize",WindowWillUnfocus:"mac:WindowWillUnfocus",WindowWillUpdate:"mac:WindowWillUpdate",WindowWillUpdateAlpha:"mac:WindowWillUpdateAlpha",WindowWillUpdateCollectionBehavior:"mac:WindowWillUpdateCollectionBehavior",WindowWillUpdateCollectionProperties:"mac:WindowWillUpdateCollectionProperties",WindowWillUpdateShadow:"mac:WindowWillUpdateShadow",WindowWillUpdateTitle:"mac:WindowWillUpdateTitle",WindowWillUpdateToolbar:"mac:WindowWillUpdateToolbar",WindowWillUpdateVisibility:"mac:WindowWillUpdateVisibility",WindowWillUseStandardFrame:"mac:WindowWillUseStandardFrame",MenuWillOpen:"mac:MenuWillOpen",MenuDidOpen:"mac:MenuDidOpen",MenuDidClose:"mac:MenuDidClose",MenuWillSendAction:"mac:MenuWillSendAction",MenuDidSendAction:"mac:MenuDidSendAction",MenuWillHighlightItem:"mac:MenuWillHighlightItem",MenuDidHighlightItem:"mac:MenuDidHighlightItem",MenuWillDisplayItem:"mac:MenuWillDisplayItem",MenuDidDisplayItem:"mac:MenuDidDisplayItem",MenuWillAddItem:"mac:MenuWillAddItem",MenuDidAddItem:"mac:MenuDidAddItem",MenuWillRemoveItem:"mac:MenuWillRemoveItem",MenuDidRemoveItem:"mac:MenuDidRemoveItem",MenuWillBeginTracking:"mac:MenuWillBeginTracking",MenuDidBeginTracking:"mac:MenuDidBeginTracking",MenuWillEndTracking:"mac:MenuWillEndTracking",MenuDidEndTracking:"mac:MenuDidEndTracking",MenuWillUpdate:"mac:MenuWillUpdate",MenuDidUpdate:"mac:MenuDidUpdate",MenuWillPopUp:"mac:MenuWillPopUp",MenuDidPopUp:"mac:MenuDidPopUp",MenuWillSendActionToItem:"mac:MenuWillSendActionToItem",MenuDidSendActionToItem:"mac:MenuDidSendActionToItem",WebViewDidStartProvisionalNavigation:"mac:WebViewDidStartProvisionalNavigation",WebViewDidReceiveServerRedirectForProvisionalNavigation:"mac:WebViewDidReceiveServerRedirectForProvisionalNavigation",WebViewDidFinishNavigation:"mac:WebViewDidFinishNavigation",WebViewDidCommitNavigation:"mac:WebViewDidCommitNavigation",WindowFileDraggingEntered:"mac:WindowFileDraggingEntered",WindowFileDraggingPerformed:"mac:WindowFileDraggingPerformed",WindowFileDraggingExited:"mac:WindowFileDraggingExited"},Linux:{SystemThemeChanged:"linux:SystemThemeChanged",WindowLoadChanged:"linux:WindowLoadChanged",WindowDeleteEvent:"linux:WindowDeleteEvent",WindowFocusIn:"linux:WindowFocusIn",WindowFocusOut:"linux:WindowFocusOut",ApplicationStartup:"linux:ApplicationStartup"},Common:{ApplicationStarted:"common:ApplicationStarted",WindowMaximise:"common:WindowMaximise",WindowUnMaximise:"common:WindowUnMaximise",WindowFullscreen:"common:WindowFullscreen",WindowUnFullscreen:"common:WindowUnFullscreen",WindowRestore:"common:WindowRestore",WindowMinimise:"common:WindowMinimise",WindowUnMinimise:"common:WindowUnMinimise",WindowClosing:"common:WindowClosing",WindowZoom:"common:WindowZoom",WindowZoomIn:"common:WindowZoomIn",WindowZoomOut:"common:WindowZoomOut",WindowZoomReset:"common:WindowZoomReset",WindowFocus:"common:WindowFocus",WindowLostFocus:"common:WindowLostFocus",WindowShow:"common:WindowShow",WindowHide:"common:WindowHide",WindowDPIChanged:"common:WindowDPIChanged",WindowFilesDropped:"common:WindowFilesDropped",WindowRuntimeReady:"common:WindowRuntimeReady",ThemeChanged:"common:ThemeChanged"}};var dn=ne;window._wails=window._wails||{};window._wails.dispatchWailsEvent=wn;var ln=l(d.Events,""),cn=0,m=new Map,V=class{constructor(i,n,o){this.eventName=i,this.maxCallbacks=o||-1,this.Callback=t=>(n(t),this.maxCallbacks===-1?!1:(this.maxCallbacks-=1,this.maxCallbacks===0))}},M=class{constructor(i,n=null){this.name=i,this.data=n}};function sn(){}function wn(e){let i=m.get(e.name);if(i){let n=i.filter(o=>{if(o.Callback(e))return!0});n.length>0&&(i=i.filter(o=>!n.includes(o)),i.length===0?m.delete(e.name):m.set(e.name,i))}}function _(e,i,n){let o=m.get(e)||[],t=new V(e,i,n);return o.push(t),m.set(e,o),()=>pn(t)}function mn(e,i){return _(e,i,-1)}function un(e,i){return _(e,i,1)}function pn(e){let i=e.eventName,n=m.get(i).filter(o=>o!==e);n.length===0?m.delete(i):m.set(i,n)}function Wn(e,...i){[e,...i].forEach(o=>m.delete(o))}function gn(){m.clear()}function Z(e){return ln(cn,e)}var G={};w(G,{Error:()=>Un,Info:()=>Rn,OpenFile:()=>yn,Question:()=>A,SaveFile:()=>On,Warning:()=>En});window._wails=window._wails||{};window._wails.dialogErrorCallback=bn;window._wails.dialogResultCallback=vn;var fn=0,hn=1,Dn=2,Cn=3,Sn=4,xn=5,Mn=l(d.Dialog,""),W=new Map;function An(){let e;do e=f();while(W.has(e));return e}function D(e,i={}){let n=An();return i["dialog-id"]=n,new Promise((o,t)=>{W.set(n,{resolve:o,reject:t}),Mn(e,i).catch(a=>{t(a),W.delete(n)})})}function vn(e,i,n){let o=W.get(e);o&&(n?o.resolve(JSON.parse(i)):o.resolve(i),W.delete(e))}function bn(e,i){let n=W.get(e);n&&(n.reject(i),W.delete(e))}var Rn=e=>D(fn,e),En=e=>D(hn,e),Un=e=>D(Dn,e),A=e=>D(Cn,e),yn=e=>D(Sn,e),On=e=>D(xn,e);function oe(e,i=null){let n=new M(e,i);Z(n)}function Pn(){document.querySelectorAll("[wml-event]").forEach(function(i){let n=i.getAttribute("wml-event"),o=i.getAttribute("wml-confirm"),t=i.getAttribute("wml-trigger")||"click",a=function(){if(o){A({Title:"Confirm",Message:o,Detached:!1,Buttons:[{Label:"Yes"},{Label:"No",IsDefault:!0}]}).then(function(s){s!=="No"&&oe(n)});return}oe(n)};i.removeEventListener(t,a),i.addEventListener(t,a)})}function te(e,i){let n=U(e),o=In(n);o.has(i);try{o.get(i)()}catch{}}function Tn(){document.querySelectorAll("[wml-window]").forEach(function(i){let n=i.getAttribute("wml-window"),o=i.getAttribute("wml-confirm"),t=i.getAttribute("wml-trigger")||"click",a=i.getAttribute("wml-target-window")||"",s=function(){if(o){A({Title:"Confirm",Message:o,Buttons:[{Label:"Yes"},{Label:"No",IsDefault:!0}]}).then(function(p){p!=="No"&&te(a,n)});return}te(a,n)};i.removeEventListener(t,s),i.addEventListener(t,s)})}function Bn(){document.querySelectorAll("[wml-openurl]").forEach(function(i){let n=i.getAttribute("wml-openurl"),o=i.getAttribute("wml-confirm"),t=i.getAttribute("wml-trigger")||"click",a=function(){if(o){A({Title:"Confirm",Message:o,Buttons:[{Label:"Yes"},{Label:"No",IsDefault:!0}]}).then(function(s){s!=="No"&&b(n)});return}b(n)};i.removeEventListener(t,a),i.addEventListener(t,a)})}function Y(){Pn(),Tn(),Bn()}function In(e){let i=new Map;for(let n in e)typeof e[n]=="function"&&i.set(n,e[n]);return i}var X={};w(X,{ByID:()=>Vn,ByName:()=>Hn,Call:()=>Nn,Plugin:()=>_n});window._wails=window._wails||{};window._wails.callResultHandler=zn;window._wails.callErrorHandler=kn;var y=0,Fn=l(d.Call,""),v=new Map;function Ln(){let e;do e=f();while(v.has(e));return e}function zn(e,i,n){let o=re(e);o&&o.resolve(n?JSON.parse(i):i)}function kn(e,i){let n=re(e);n&&n.reject(i)}function re(e){let i=v.get(e);return v.delete(e),i}function O(e,i={}){return new Promise((n,o)=>{let t=Ln();i["call-id"]=t,v.set(t,{resolve:n,reject:o}),Fn(e,i).catch(a=>{o(a),v.delete(t)})})}function Nn(e){return O(y,e)}function Hn(e,...i){if(typeof e!="string"||e.split(".").length!==3)throw new Error("CallByName requires a string in the format 'package.struct.method'");let[n,o,t]=e.split(".");return O(y,{packageName:n,structName:o,methodName:t,args:i})}function Vn(e,...i){return O(y,{methodID:e,args:i})}function _n(e,i,...n){return O(y,{packageName:"wails-plugins",structName:e,methodName:i,args:n})}window._wails=window._wails||{};window._wails.invoke=h;window.wails=window.wails||{};window.wails.Application=T;window.wails.Browser=B;window.wails.Call=X;window.wails.Clipboard=I;window.wails.Dialogs=G;window.wails.Events=j;window.wails.Flags=z;window.wails.Screens=N;window.wails.System=L;window.wails.Window=H;window.wails.WML=K;var ae=!1;document.addEventListener("DOMContentLoaded",function(){ae=!0,window._wails.invoke("wails:runtime:ready")});function Zn(e){ae||document.readyState==="complete"?e():document.addEventListener("DOMContentLoaded",e)}Zn(()=>{Y()});})();
diff --git a/v3/pkg/application/dialogs_linux.go b/v3/pkg/application/dialogs_linux.go
index 4943766f0af..be480d17677 100644
--- a/v3/pkg/application/dialogs_linux.go
+++ b/v3/pkg/application/dialogs_linux.go
@@ -1,7 +1,7 @@
package application
-func (m *linuxApp) showAboutDialog(title string, message string, icon []byte) {
- window := globalApplication.getWindowForID(m.getCurrentWindowID())
+func (a *linuxApp) showAboutDialog(title string, message string, icon []byte) {
+ window := globalApplication.getWindowForID(a.getCurrentWindowID())
var parent uintptr
if window != nil {
parent, _ = window.(*WebviewWindow).NativeWindowHandle()
diff --git a/v3/pkg/application/events_common_linux.go b/v3/pkg/application/events_common_linux.go
new file mode 100644
index 00000000000..e06fb8cfefc
--- /dev/null
+++ b/v3/pkg/application/events_common_linux.go
@@ -0,0 +1,21 @@
+//go:build linux
+
+package application
+
+import "github.com/wailsapp/wails/v3/pkg/events"
+
+var commonApplicationEventMap = map[events.ApplicationEventType]events.ApplicationEventType{
+ events.Linux.ApplicationStartup: events.Common.ApplicationStarted,
+ events.Linux.SystemThemeChanged: events.Common.ThemeChanged,
+}
+
+func (a *linuxApp) setupCommonEvents() {
+ for sourceEvent, targetEvent := range commonApplicationEventMap {
+ sourceEvent := sourceEvent
+ targetEvent := targetEvent
+ a.parent.On(sourceEvent, func(event *Event) {
+ event.Id = uint(targetEvent)
+ applicationEvents <- event
+ })
+ }
+}
diff --git a/v3/pkg/application/keys.go b/v3/pkg/application/keys.go
index 4a6fc0e6494..b366c10665e 100644
--- a/v3/pkg/application/keys.go
+++ b/v3/pkg/application/keys.go
@@ -70,6 +70,11 @@ type accelerator struct {
Modifiers []modifier
}
+func (a *accelerator) clone() *accelerator {
+ result := *a
+ return &result
+}
+
func (a *accelerator) String() string {
var result []string
// Sort modifiers
diff --git a/v3/pkg/application/linux_cgo.go b/v3/pkg/application/linux_cgo.go
index a669fe84c52..a7ce902ae49 100644
--- a/v3/pkg/application/linux_cgo.go
+++ b/v3/pkg/application/linux_cgo.go
@@ -6,16 +6,17 @@ import (
"fmt"
"regexp"
"strings"
+ "sync"
"unsafe"
"github.com/wailsapp/wails/v3/internal/assetserver/webview"
+
"github.com/wailsapp/wails/v3/pkg/events"
)
/*
-#cgo linux pkg-config: gtk+-3.0 webkit2gtk-4.0 javascriptcoregtk-4.1
+#cgo linux pkg-config: gtk+-3.0 webkit2gtk-4.0 gdk-3.0
-#include
#include
#include
#include
@@ -58,8 +59,11 @@ typedef struct WindowEvent {
// exported below
void activateLinux(gpointer data);
extern void emit(WindowEvent* data);
+extern gboolean handleDeleteEvent(GtkWidget*, GdkEvent*, uintptr_t);
+extern gboolean handleFocusEvent(GtkWidget*, GdkEvent*, uintptr_t);
+extern void handleLoadChanged(WebKitWebView*, WebKitLoadEvent, uintptr_t);
void handleClick(void*);
-extern gboolean onButtonEvent(GtkWidget *widget, GdkEventButton *event, gpointer user_data);
+extern gboolean onButtonEvent(GtkWidget *widget, GdkEventButton *event, uintptr_t user_data);
extern void onDragNDrop(
void *target,
GdkDragContext* context,
@@ -69,8 +73,8 @@ extern void onDragNDrop(
guint info,
guint time,
gpointer data);
-extern gboolean onKeyPressEvent (GtkWidget *widget, GdkEventKey *event, gpointer user_data);
-extern void onProcessRequest(void *request, gpointer user_data);
+extern gboolean onKeyPressEvent (GtkWidget *widget, GdkEventKey *event, uintptr_t user_data);
+extern void onProcessRequest(WebKitURISchemeRequest *request, uintptr_t user_data);
extern void sendMessageToBackend(WebKitUserContentManager *contentManager, WebKitJavascriptResult *result, void *data);
// exported below (end)
@@ -79,6 +83,10 @@ static void signal_connect(void *widget, char *event, void *cb, void* data) {
g_signal_connect(widget, event, cb, data);
}
+static WebKitWebView* webkit_web_view(GtkWidget *webview) {
+ return WEBKIT_WEB_VIEW(webview);
+}
+
static void* new_message_dialog(GtkWindow *parent, const gchar *msg, int dialogType, bool hasButtons) {
// gtk_message_dialog_new is variadic! Can't call from cgo directly
GtkWidget *dialog;
@@ -138,6 +146,65 @@ typedef struct Screen {
bool isPrimary;
} Screen;
+// CREDIT: https://github.com/rainycape/magick
+#include
+#include
+#include
+#include
+
+static void fix_signal(int signum) {
+ struct sigaction st;
+
+ if (sigaction(signum, NULL, &st) < 0) {
+ goto fix_signal_error;
+ }
+ st.sa_flags |= SA_ONSTACK;
+ if (sigaction(signum, &st, NULL) < 0) {
+ goto fix_signal_error;
+ }
+ return;
+fix_signal_error:
+ fprintf(stderr, "error fixing handler for signal %d, please "
+ "report this issue to "
+ "https://github.com/wailsapp/wails: %s\n",
+ signum, strerror(errno));
+}
+
+static void install_signal_handlers() {
+ #if defined(SIGCHLD)
+ fix_signal(SIGCHLD);
+ #endif
+ #if defined(SIGHUP)
+ fix_signal(SIGHUP);
+ #endif
+ #if defined(SIGINT)
+ fix_signal(SIGINT);
+ #endif
+ #if defined(SIGQUIT)
+ fix_signal(SIGQUIT);
+ #endif
+ #if defined(SIGABRT)
+ fix_signal(SIGABRT);
+ #endif
+ #if defined(SIGFPE)
+ fix_signal(SIGFPE);
+ #endif
+ #if defined(SIGTERM)
+ fix_signal(SIGTERM);
+ #endif
+ #if defined(SIGBUS)
+ fix_signal(SIGBUS);
+ #endif
+ #if defined(SIGSEGV)
+ fix_signal(SIGSEGV);
+ #endif
+ #if defined(SIGXCPU)
+ fix_signal(SIGXCPU);
+ #endif
+ #if defined(SIGXFSZ)
+ fix_signal(SIGXFSZ);
+ #endif
+}
static int GetNumScreens(){
return 0;
@@ -145,6 +212,31 @@ static int GetNumScreens(){
*/
import "C"
+// Calloc handles alloc/dealloc of C data
+type Calloc struct {
+ pool []unsafe.Pointer
+}
+
+// NewCalloc creates a new allocator
+func NewCalloc() Calloc {
+ return Calloc{}
+}
+
+// String creates a new C string and retains a reference to it
+func (c Calloc) String(in string) *C.char {
+ result := C.CString(in)
+ c.pool = append(c.pool, unsafe.Pointer(result))
+ return result
+}
+
+// Free frees all allocated C memory
+func (c Calloc) Free() {
+ for _, str := range c.pool {
+ C.free(str)
+ }
+ c.pool = []unsafe.Pointer{}
+}
+
type windowPointer *C.GtkWindow
type identifier C.uint
type pointer unsafe.Pointer
@@ -161,6 +253,8 @@ var (
mainThreadId *C.GThread
)
+var registerURIScheme sync.Once
+
func init() {
gtkSignalToMenuItem = map[uint]*MenuItem{}
@@ -179,7 +273,36 @@ func dispatchOnMainThreadCallback(callbackID C.uint) {
//export activateLinux
func activateLinux(data pointer) {
- // NOOP: Callback for now
+ processApplicationEvent(C.uint(events.Linux.ApplicationStartup), data)
+}
+
+//export processApplicationEvent
+func processApplicationEvent(eventID C.uint, data pointer) {
+ event := newApplicationEvent(events.ApplicationEventType(eventID))
+
+ //if data != nil {
+ // dataCStrJSON := C.serializationNSDictionary(data)
+ // if dataCStrJSON != nil {
+ // defer C.free(unsafe.Pointer(dataCStrJSON))
+ //
+ // dataJSON := C.GoString(dataCStrJSON)
+ // var result map[string]any
+ // err := json.Unmarshal([]byte(dataJSON), &result)
+ //
+ // if err != nil {
+ // panic(err)
+ // }
+ //
+ // event.Context().setData(result)
+ // }
+ //}
+
+ switch event.Id {
+ case uint(events.Linux.SystemThemeChanged):
+ isDark := globalApplication.IsDarkMode()
+ event.Context().setIsDarkMode(isDark)
+ }
+ applicationEvents <- event
}
func isOnMainThread() bool {
@@ -195,6 +318,8 @@ func appName() string {
}
func appNew(name string) pointer {
+ C.install_signal_handlers()
+
// prevent leading number
if matched, _ := regexp.MatchString(`^\d+`, name); matched {
name = fmt.Sprintf("_%s", name)
@@ -209,17 +334,12 @@ func appNew(name string) pointer {
func appRun(app pointer) error {
application := (*C.GApplication)(app)
+ //TODO: Only set this if we configure it to do so
C.g_application_hold(application) // allows it to run without a window
signal := C.CString("activate")
defer C.free(unsafe.Pointer(signal))
- C.g_signal_connect_data(
- C.gpointer(application),
- signal,
- C.GCallback(C.activateLinux),
- nil,
- nil,
- 0)
+ C.signal_connect(unsafe.Pointer(application), signal, C.activateLinux, nil)
status := C.g_application_run(application, 0, nil)
C.g_application_release(application)
C.g_object_unref(C.gpointer(app))
@@ -235,13 +355,13 @@ func appDestroy(application pointer) {
C.g_application_quit((*C.GApplication)(application))
}
-func contextMenuShow(window pointer, menu pointer, data *ContextMenuData) {
+func (w *linuxWebviewWindow) contextMenuShow(menu pointer, data *ContextMenuData) {
geometry := C.GdkRectangle{
x: C.int(data.X),
y: C.int(data.Y),
}
event := C.GdkEvent{}
- gdkWindow := C.gtk_widget_get_window((*C.GtkWidget)(window))
+ gdkWindow := C.gtk_widget_get_window(w.gtkWidget())
C.gtk_menu_popup_at_rect(
(*C.GtkMenu)(menu),
gdkWindow,
@@ -252,13 +372,13 @@ func contextMenuShow(window pointer, menu pointer, data *ContextMenuData) {
)
}
-func getCurrentWindowID(application pointer, windows map[windowPointer]uint) uint {
+func (a *linuxApp) getCurrentWindowID() uint {
// TODO: Add extra metadata to window and use it!
- window := (*C.GtkWindow)(C.gtk_application_get_active_window((*C.GtkApplication)(application)))
+ window := (*C.GtkWindow)(C.gtk_application_get_active_window((*C.GtkApplication)(a.application)))
if window == nil {
return uint(1)
}
- identifier, ok := windows[window]
+ identifier, ok := a.windowMap[window]
if ok {
return identifier
}
@@ -266,9 +386,9 @@ func getCurrentWindowID(application pointer, windows map[windowPointer]uint) uin
return uint(1)
}
-func getWindows(application pointer) []pointer {
+func (a *linuxApp) getWindows() []pointer {
result := []pointer{}
- windows := C.gtk_application_get_windows((*C.GtkApplication)(application))
+ windows := C.gtk_application_get_windows((*C.GtkApplication)(a.application))
for {
result = append(result, pointer(windows.data))
windows = windows.next
@@ -278,14 +398,14 @@ func getWindows(application pointer) []pointer {
}
}
-func hideAllWindows(application pointer) {
- for _, window := range getWindows(application) {
+func (a *linuxApp) hideAllWindows() {
+ for _, window := range a.getWindows() {
C.gtk_widget_hide((*C.GtkWidget)(window))
}
}
-func showAllWindows(application pointer) {
- for _, window := range getWindows(application) {
+func (a *linuxApp) showAllWindows() {
+ for _, window := range a.getWindows() {
C.gtk_window_present((*C.GtkWindow)(window))
}
}
@@ -560,9 +680,10 @@ func getScreenByIndex(display *C.struct__GdkDisplay, index int) *Screen {
if C.gdk_monitor_is_primary(monitor) == 1 {
primary = true
}
+ name := C.gdk_monitor_get_model(monitor)
return &Screen{
ID: fmt.Sprintf("%d", index),
- Name: fmt.Sprintf("Screen %d", index),
+ Name: C.GoString(name),
IsPrimary: primary,
Scale: float32(C.gdk_monitor_get_scale_factor(monitor)),
X: int(geometry.x),
@@ -593,13 +714,14 @@ func getScreens(app pointer) ([]*Screen, error) {
}
// widgets
-func widgetSetSensitive(widget pointer, enabled bool) {
- value := C.int(0)
+
+func (w *linuxWebviewWindow) setEnabled(enabled bool) {
+ var value C.int
if enabled {
value = C.int(1)
}
- C.gtk_widget_set_sensitive((*C.GtkWidget)(widget), value)
+ C.gtk_widget_set_sensitive(w.gtkWidget(), value)
}
func widgetSetVisible(widget pointer, hidden bool) {
@@ -610,26 +732,27 @@ func widgetSetVisible(widget pointer, hidden bool) {
}
}
-// window related functions
-func windowClose(window pointer) {
- C.gtk_window_close((*C.GtkWindow)(window))
+func (w *linuxWebviewWindow) close() {
+ C.gtk_widget_destroy(w.gtkWidget())
+ getNativeApplication().unregisterWindow(windowPointer(w.window))
}
-func windowEnableDND(id uint, webview pointer) {
+func (w *linuxWebviewWindow) enableDND() {
+ id := w.parent.id
dnd := C.CString("text/uri-list")
defer C.free(unsafe.Pointer(dnd))
targetentry := C.gtk_target_entry_new(dnd, 0, C.guint(id))
defer C.gtk_target_entry_free(targetentry)
- C.gtk_drag_dest_set((*C.GtkWidget)(webview), C.GTK_DEST_DEFAULT_DROP, targetentry, 1, C.GDK_ACTION_COPY)
+ C.gtk_drag_dest_set((*C.GtkWidget)(w.webview), C.GTK_DEST_DEFAULT_DROP, targetentry, 1, C.GDK_ACTION_COPY)
event := C.CString("drag-data-received")
defer C.free(unsafe.Pointer(event))
windowId := C.uint(id)
- C.signal_connect(unsafe.Pointer(webview), event, C.onDragNDrop, unsafe.Pointer(C.gpointer(&windowId)))
+ C.signal_connect(unsafe.Pointer(w.webview), event, C.onDragNDrop, unsafe.Pointer(C.gpointer(&windowId)))
}
-func windowExecJS(webview pointer, js string) {
+func (w *linuxWebviewWindow) execJS(js string) {
value := C.CString(js)
- C.webkit_web_view_evaluate_javascript((*C.WebKitWebView)(webview),
+ C.webkit_web_view_evaluate_javascript(w.webKitWebView(),
value,
C.long(len(js)),
nil,
@@ -640,28 +763,86 @@ func windowExecJS(webview pointer, js string) {
C.free(unsafe.Pointer(value))
}
-func windowDestroy(window pointer) {
- // Should this truly 'destroy' ?
- C.gtk_window_close((*C.GtkWindow)(window))
- //C.gtk_widget_destroy((*C.GtkWidget)(window))
-}
-
-func windowFullscreen(window pointer) {
- C.gtk_window_fullscreen((*C.GtkWindow)(window))
+func getMousePosition() (int, int, *Screen) {
+ var x, y C.gint
+ var screen *C.GdkScreen
+ defaultDisplay := C.gdk_display_get_default()
+ device := C.gdk_seat_get_pointer(C.gdk_display_get_default_seat(defaultDisplay))
+ C.gdk_device_get_position(device, &screen, &x, &y)
+ // Get Monitor for screen
+ monitor := C.gdk_display_get_monitor_at_point(defaultDisplay, x, y)
+ geometry := C.GdkRectangle{}
+ C.gdk_monitor_get_geometry(monitor, &geometry)
+ scale := int(C.gdk_monitor_get_scale_factor(monitor))
+ return int(x), int(y), &Screen{
+ ID: fmt.Sprintf("%d", 0), // A unique identifier for the display
+ Name: C.GoString(C.gdk_monitor_get_model(monitor)), // The name of the display
+ Scale: float32(scale), // The scale factor of the display
+ X: int(geometry.x), // The x-coordinate of the top-left corner of the rectangle
+ Y: int(geometry.y), // The y-coordinate of the top-left corner of the rectangle
+ Size: Size{Width: int(geometry.width), Height: int(geometry.height)}, // The size of the display
+ Bounds: Rect{}, // The bounds of the display
+ WorkArea: Rect{}, // The work area of the display
+ IsPrimary: false, // Whether this is the primary display
+ Rotation: 0.0, // The rotation of the display
+ }
+}
+
+func (w *linuxWebviewWindow) destroy() {
+ w.parent.markAsDestroyed()
+ // Free menu
+ if w.gtkmenu != nil {
+ C.gtk_widget_destroy((*C.GtkWidget)(w.gtkmenu))
+ w.gtkmenu = nil
+ }
+ // Free window
+ C.gtk_widget_destroy(w.gtkWidget())
+}
+
+func (w *linuxWebviewWindow) fullscreen() {
+ w.maximise()
+ //w.lastWidth, w.lastHeight = w.size()
+ x, y, width, height, scale := w.getCurrentMonitorGeometry()
+ if x == -1 && y == -1 && width == -1 && height == -1 {
+ return
+ }
+ w.setMinMaxSize(0, 0, width*scale, height*scale)
+ w.setSize(width*scale, height*scale)
+ C.gtk_window_fullscreen(w.gtkWindow())
+ w.setRelativePosition(0, 0)
}
-func windowGetCurrentMonitor(window pointer) *C.GdkMonitor {
+func (w *linuxWebviewWindow) getCurrentMonitor() *C.GdkMonitor {
// Get the monitor that the window is currently on
- display := C.gtk_widget_get_display((*C.GtkWidget)(window))
- gdk_window := C.gtk_widget_get_window((*C.GtkWidget)(window))
- if gdk_window == nil {
+ display := C.gtk_widget_get_display(w.gtkWidget())
+ gdkWindow := C.gtk_widget_get_window(w.gtkWidget())
+ if gdkWindow == nil {
return nil
}
- return C.gdk_display_get_monitor_at_window(display, gdk_window)
+ return C.gdk_display_get_monitor_at_window(display, gdkWindow)
}
-func windowGetCurrentMonitorGeometry(window pointer) (x int, y int, width int, height int, scale int) {
- monitor := windowGetCurrentMonitor(window)
+func (w *linuxWebviewWindow) getScreen() (*Screen, error) {
+ // Get the current screen for the window
+ monitor := w.getCurrentMonitor()
+ name := C.gdk_monitor_get_model(monitor)
+ mx, my, width, height, scale := w.getCurrentMonitorGeometry()
+ return &Screen{
+ ID: fmt.Sprintf("%d", w.id), // A unique identifier for the display
+ Name: C.GoString(name), // The name of the display
+ Scale: float32(scale), // The scale factor of the display
+ X: mx, // The x-coordinate of the top-left corner of the rectangle
+ Y: my, // The y-coordinate of the top-left corner of the rectangle
+ Size: Size{Width: width, Height: height}, // The size of the display
+ Bounds: Rect{}, // The bounds of the display
+ WorkArea: Rect{}, // The work area of the display
+ IsPrimary: false, // Whether this is the primary display
+ Rotation: 0.0, // The rotation of the display
+ }, nil
+}
+
+func (w *linuxWebviewWindow) getCurrentMonitorGeometry() (x int, y int, width int, height int, scale int) {
+ monitor := w.getCurrentMonitor()
if monitor == nil {
return -1, -1, -1, -1, 1
}
@@ -671,25 +852,18 @@ func windowGetCurrentMonitorGeometry(window pointer) (x int, y int, width int, h
return int(result.x), int(result.y), int(result.width), int(result.height), scale
}
-func windowGetAbsolutePosition(window pointer) (int, int) {
- var x C.int
- var y C.int
- C.gtk_window_get_position((*C.GtkWindow)(window), &x, &y)
- return int(x), int(y)
-}
-
-func windowGetSize(window pointer) (int, int) {
+func (w *linuxWebviewWindow) size() (int, int) {
var windowWidth C.int
var windowHeight C.int
- C.gtk_window_get_size((*C.GtkWindow)(window), &windowWidth, &windowHeight)
+ C.gtk_window_get_size(w.gtkWindow(), &windowWidth, &windowHeight)
return int(windowWidth), int(windowHeight)
}
-func windowGetRelativePosition(window pointer) (int, int) {
- x, y := windowGetAbsolutePosition(window)
+func (w *linuxWebviewWindow) relativePosition() (int, int) {
+ x, y := w.absolutePosition()
// The position must be relative to the screen it is on
// We need to get the screen it is on
- monitor := windowGetCurrentMonitor(window)
+ monitor := w.getCurrentMonitor()
geometry := C.GdkRectangle{}
C.gdk_monitor_get_geometry(monitor, &geometry)
x = x - int(geometry.x)
@@ -700,49 +874,55 @@ func windowGetRelativePosition(window pointer) (int, int) {
return x, y
}
-func windowHide(window pointer) {
- C.gtk_widget_hide((*C.GtkWidget)(window))
+func (w *linuxWebviewWindow) gtkWidget() *C.GtkWidget {
+ return (*C.GtkWidget)(w.window)
}
-func windowIsFullscreen(window pointer) bool {
- gdkwindow := C.gtk_widget_get_window((*C.GtkWidget)(window))
- state := C.gdk_window_get_state(gdkwindow)
+func (w *linuxWebviewWindow) hide() {
+ // save position
+ w.lastX, w.lastY = w.absolutePosition()
+ C.gtk_widget_hide(w.gtkWidget())
+}
+
+func (w *linuxWebviewWindow) isFullscreen() bool {
+ gdkWindow := C.gtk_widget_get_window(w.gtkWidget())
+ state := C.gdk_window_get_state(gdkWindow)
return state&C.GDK_WINDOW_STATE_FULLSCREEN > 0
}
-func windowIsFocused(window pointer) bool {
+func (w *linuxWebviewWindow) isFocused() bool {
// returns true if window is focused
- return C.gtk_window_has_toplevel_focus((*C.GtkWindow)(window)) == 1
+ return C.gtk_window_has_toplevel_focus(w.gtkWindow()) == 1
}
-func windowIsMaximized(window pointer) bool {
- gdkwindow := C.gtk_widget_get_window((*C.GtkWidget)(window))
+func (w *linuxWebviewWindow) isMaximised() bool {
+ gdkwindow := C.gtk_widget_get_window(w.gtkWidget())
state := C.gdk_window_get_state(gdkwindow)
return state&C.GDK_WINDOW_STATE_MAXIMIZED > 0 && state&C.GDK_WINDOW_STATE_FULLSCREEN == 0
}
-func windowIsMinimized(window pointer) bool {
- gdkwindow := C.gtk_widget_get_window((*C.GtkWidget)(window))
+func (w *linuxWebviewWindow) isMinimised() bool {
+ gdkwindow := C.gtk_widget_get_window(w.gtkWidget())
state := C.gdk_window_get_state(gdkwindow)
return state&C.GDK_WINDOW_STATE_ICONIFIED > 0
}
-func windowIsVisible(window pointer) bool {
- if C.gtk_widget_is_visible((*C.GtkWidget)(window)) == 1 {
+func (w *linuxWebviewWindow) isVisible() bool {
+ if C.gtk_widget_is_visible(w.gtkWidget()) == 1 {
return true
}
return false
}
-func windowMaximize(window pointer) {
- C.gtk_window_maximize((*C.GtkWindow)(window))
+func (w *linuxWebviewWindow) maximise() {
+ C.gtk_window_maximize(w.gtkWindow())
}
-func windowMinimize(window pointer) {
- C.gtk_window_iconify((*C.GtkWindow)(window))
+func (w *linuxWebviewWindow) minimise() {
+ C.gtk_window_iconify(w.gtkWindow())
}
-func windowNew(application pointer, menu pointer, windowId uint, gpuPolicy int) (window, webview, vbox pointer) {
+func windowNew(application pointer, menu pointer, windowId uint, gpuPolicy WebviewGpuPolicy) (window, webview, vbox pointer) {
window = pointer(C.gtk_application_window_new((*C.GtkApplication)(application)))
C.g_object_ref_sink(C.gpointer(window))
webview = windowNewWebview(windowId, gpuPolicy)
@@ -759,78 +939,97 @@ func windowNew(application pointer, menu pointer, windowId uint, gpuPolicy int)
return
}
-func windowNewWebview(parentId uint, gpuPolicy int) pointer {
+func windowNewWebview(parentId uint, gpuPolicy WebviewGpuPolicy) pointer {
+ c := NewCalloc()
+ defer c.Free()
manager := C.webkit_user_content_manager_new()
- external := C.CString("external")
- C.webkit_user_content_manager_register_script_message_handler(manager, external)
- C.free(unsafe.Pointer(external))
- webview := C.webkit_web_view_new_with_user_content_manager(manager)
- id := C.uint(parentId)
- if !registered {
- wails := C.CString("wails")
+ C.webkit_user_content_manager_register_script_message_handler(manager, c.String("external"))
+ webView := C.webkit_web_view_new_with_user_content_manager(manager)
+ winID := unsafe.Pointer(uintptr(C.uint(parentId)))
+
+ // attach window id to both the webview and contentmanager
+ C.g_object_set_data((*C.GObject)(unsafe.Pointer(webView)), c.String("windowid"), C.gpointer(winID))
+ C.g_object_set_data((*C.GObject)(unsafe.Pointer(manager)), c.String("windowid"), C.gpointer(winID))
+
+ registerURIScheme.Do(func() {
+ context := C.webkit_web_view_get_context(C.webkit_web_view(webView))
C.webkit_web_context_register_uri_scheme(
- C.webkit_web_context_get_default(),
- wails,
+ context,
+ c.String("wails"),
C.WebKitURISchemeRequestCallback(C.onProcessRequest),
- C.gpointer(&id),
+ nil,
nil)
- registered = true
- C.free(unsafe.Pointer(wails))
- }
- settings := C.webkit_web_view_get_settings((*C.WebKitWebView)(unsafe.Pointer(webview)))
- wails_io := C.CString("wails.io")
- empty := C.CString("")
- defer C.free(unsafe.Pointer(wails_io))
- defer C.free(unsafe.Pointer(empty))
- C.webkit_settings_set_user_agent_with_application_details(settings, wails_io, empty)
+ })
+ settings := C.webkit_web_view_get_settings((*C.WebKitWebView)(unsafe.Pointer(webView)))
+ C.webkit_settings_set_user_agent_with_application_details(settings, c.String("wails.io"), c.String(""))
switch gpuPolicy {
- case 0:
+ case WebviewGpuPolicyAlways:
C.webkit_settings_set_hardware_acceleration_policy(settings, C.WEBKIT_HARDWARE_ACCELERATION_POLICY_ALWAYS)
break
- case 1:
+ case WebviewGpuPolicyOnDemand:
C.webkit_settings_set_hardware_acceleration_policy(settings, C.WEBKIT_HARDWARE_ACCELERATION_POLICY_ON_DEMAND)
break
- case 2:
+ case WebviewGpuPolicyNever:
C.webkit_settings_set_hardware_acceleration_policy(settings, C.WEBKIT_HARDWARE_ACCELERATION_POLICY_NEVER)
break
default:
C.webkit_settings_set_hardware_acceleration_policy(settings, C.WEBKIT_HARDWARE_ACCELERATION_POLICY_ON_DEMAND)
}
- return pointer(webview)
+ return pointer(webView)
}
-func windowPresent(window pointer) {
- C.gtk_window_present((*C.GtkWindow)(window))
- // gtk_window_unminimize ((*C.GtkWindow)(w.window)) /// gtk4
+func (w *linuxWebviewWindow) present() {
+ C.gtk_window_present(w.gtkWindow())
+ // gtk_window_unminimize (w.gtkWindow()) /// gtk4
}
-func windowReload(webview pointer, address string) {
- uri := C.CString(address)
- C.webkit_web_view_load_uri((*C.WebKitWebView)(webview), uri)
- C.free(unsafe.Pointer(uri))
-}
-
-func windowResize(window pointer, width, height int) {
+func (w *linuxWebviewWindow) setSize(width, height int) {
C.gtk_window_resize(
- (*C.GtkWindow)(window),
+ w.gtkWindow(),
C.gint(width),
C.gint(height))
}
-func windowShow(window pointer) {
- C.gtk_widget_show_all((*C.GtkWidget)(window))
+func (w *linuxWebviewWindow) show() {
+ if w.gtkWidget() == nil {
+ return
+ }
+ C.gtk_widget_show_all(w.gtkWidget())
+ //w.setAbsolutePosition(w.lastX, w.lastY)
+}
+
+func windowIgnoreMouseEvents(window pointer, webview pointer, ignore bool) {
+ var enable C.int
+ if ignore {
+ enable = 1
+ }
+ gdkWindow := (*C.GdkWindow)(window)
+ C.gdk_window_set_pass_through(gdkWindow, enable)
+ C.webkit_web_view_set_editable((*C.WebKitWebView)(webview), C.gboolean(enable))
+}
+
+func (w *linuxWebviewWindow) webKitWebView() *C.WebKitWebView {
+ return (*C.WebKitWebView)(w.webview)
+}
+
+func (w *linuxWebviewWindow) setBorderless(borderless bool) {
+ C.gtk_window_set_decorated(w.gtkWindow(), gtkBool(!borderless))
}
-func windowSetBackgroundColour(vbox, webview pointer, colour RGBA) {
+func (w *linuxWebviewWindow) setResizable(resizable bool) {
+ C.gtk_window_set_resizable(w.gtkWindow(), gtkBool(resizable))
+}
+
+func (w *linuxWebviewWindow) setBackgroundColour(colour RGBA) {
rgba := C.GdkRGBA{C.double(colour.Red) / 255.0, C.double(colour.Green) / 255.0, C.double(colour.Blue) / 255.0, C.double(colour.Alpha) / 255.0}
- C.webkit_web_view_set_background_color((*C.WebKitWebView)(webview), &rgba)
+ C.webkit_web_view_set_background_color((*C.WebKitWebView)(w.webview), &rgba)
colour.Alpha = 255
cssStr := C.CString(fmt.Sprintf("#webview-box {background-color: rgba(%d, %d, %d, %1.1f);}", colour.Red, colour.Green, colour.Blue, float32(colour.Alpha)/255.0))
provider := C.gtk_css_provider_new()
C.gtk_style_context_add_provider(
- C.gtk_widget_get_style_context((*C.GtkWidget)(vbox)),
+ C.gtk_widget_get_style_context((*C.GtkWidget)(w.vbox)),
(*C.GtkStyleProvider)(unsafe.Pointer(provider)),
C.GTK_STYLE_PROVIDER_PRIORITY_USER)
C.g_object_unref(C.gpointer(provider))
@@ -838,6 +1037,34 @@ func windowSetBackgroundColour(vbox, webview pointer, colour RGBA) {
C.free(unsafe.Pointer(cssStr))
}
+func getPrimaryScreen() (*Screen, error) {
+ display := C.gdk_display_get_default()
+ monitor := C.gdk_display_get_primary_monitor(display)
+ geometry := C.GdkRectangle{}
+ C.gdk_monitor_get_geometry(monitor, &geometry)
+ scale := int(C.gdk_monitor_get_scale_factor(monitor))
+ // get the name for the screen
+ name := C.gdk_monitor_get_model(monitor)
+ return &Screen{
+ ID: "0",
+ Name: C.GoString(name),
+ IsPrimary: true,
+ X: int(geometry.x),
+ Y: int(geometry.y),
+ Size: Size{
+ Height: int(geometry.height),
+ Width: int(geometry.width),
+ },
+ Bounds: Rect{
+ X: int(geometry.x),
+ Y: int(geometry.y),
+ Height: int(geometry.height),
+ Width: int(geometry.width),
+ },
+ Scale: float32(scale),
+ }, nil
+}
+
func windowSetGeometryHints(window pointer, minWidth, minHeight, maxWidth, maxHeight int) {
size := C.GdkGeometry{
min_width: C.int(minWidth),
@@ -848,14 +1075,14 @@ func windowSetGeometryHints(window pointer, minWidth, minHeight, maxWidth, maxHe
C.gtk_window_set_geometry_hints((*C.GtkWindow)(window), nil, &size, C.GDK_HINT_MAX_SIZE|C.GDK_HINT_MIN_SIZE)
}
-func windowSetFrameless(window pointer, frameless bool) {
- C.gtk_window_set_decorated((*C.GtkWindow)(window), gtkBool(!frameless))
+func (w *linuxWebviewWindow) setFrameless(frameless bool) {
+ C.gtk_window_set_decorated(w.gtkWindow(), gtkBool(!frameless))
// TODO: Deal with transparency for the titlebar if possible when !frameless
// Perhaps we just make it undecorated and add a menu bar inside?
}
// TODO: confirm this is working properly
-func windowSetHTML(webview pointer, html string) {
+func (w *linuxWebviewWindow) setHTML(html string) {
cHTML := C.CString(html)
uri := C.CString("wails://")
empty := C.CString("")
@@ -863,39 +1090,45 @@ func windowSetHTML(webview pointer, html string) {
defer C.free(unsafe.Pointer(uri))
defer C.free(unsafe.Pointer(empty))
C.webkit_web_view_load_alternate_html(
- (*C.WebKitWebView)(webview),
+ w.webKitWebView(),
cHTML,
uri,
empty)
}
-func windowSetKeepAbove(window pointer, alwaysOnTop bool) {
- C.gtk_window_set_keep_above((*C.GtkWindow)(window), gtkBool(alwaysOnTop))
+func (w *linuxWebviewWindow) setAlwaysOnTop(alwaysOnTop bool) {
+ C.gtk_window_set_keep_above(w.gtkWindow(), gtkBool(alwaysOnTop))
+}
+
+func (w *linuxWebviewWindow) flash(_ bool) {
+ // Not supported on Linux
}
-func windowSetResizable(window pointer, resizable bool) {
- C.gtk_window_set_resizable((*C.GtkWindow)(window), gtkBool(resizable))
+func (w *linuxWebviewWindow) setTitle(title string) {
+ if !w.parent.options.Frameless {
+ cTitle := C.CString(title)
+ C.gtk_window_set_title(w.gtkWindow(), cTitle)
+ C.free(unsafe.Pointer(cTitle))
+ }
}
-func windowSetTitle(window pointer, title string) {
- cTitle := C.CString(title)
- C.gtk_window_set_title((*C.GtkWindow)(window), cTitle)
- C.free(unsafe.Pointer(cTitle))
+func (w *linuxWebviewWindow) gtkWindow() *C.GtkWindow {
+ return (*C.GtkWindow)(w.window)
}
-func windowSetTransparent(window pointer) {
- screen := C.gtk_widget_get_screen((*C.GtkWidget)(window))
+func (w *linuxWebviewWindow) setTransparent() {
+ screen := C.gtk_widget_get_screen(w.gtkWidget())
visual := C.gdk_screen_get_rgba_visual(screen)
if visual != nil && C.gdk_screen_is_composited(screen) == C.int(1) {
- C.gtk_widget_set_app_paintable((*C.GtkWidget)(window), C.gboolean(1))
- C.gtk_widget_set_visual((*C.GtkWidget)(window), visual)
+ C.gtk_widget_set_app_paintable(w.gtkWidget(), C.gboolean(1))
+ C.gtk_widget_set_visual(w.gtkWidget(), visual)
}
}
-func windowSetURL(webview pointer, uri string) {
+func (w *linuxWebviewWindow) setURL(uri string) {
target := C.CString(uri)
- C.webkit_web_view_load_uri((*C.WebKitWebView)(webview), target)
+ C.webkit_web_view_load_uri(w.webKitWebView(), target)
C.free(unsafe.Pointer(target))
}
@@ -910,53 +1143,77 @@ func emit(we *C.WindowEvent) {
}
}
-func windowSetupSignalHandlers(windowId uint, window, webview pointer, emit func(e events.WindowEventType)) {
- event := C.CString("delete-event")
- defer C.free(unsafe.Pointer(event))
- wEvent := C.WindowEvent{
- id: C.uint(windowId),
- event: C.uint(events.Common.WindowClosing),
+//export handleDeleteEvent
+func handleDeleteEvent(widget *C.GtkWidget, event *C.GdkEvent, data C.uintptr_t) C.gboolean {
+ processWindowEvent(C.uint(data), C.uint(events.Linux.WindowDeleteEvent))
+ return C.gboolean(1)
+}
+
+//export handleFocusEvent
+func handleFocusEvent(widget *C.GtkWidget, event *C.GdkEvent, data C.uintptr_t) C.gboolean {
+ focusEvent := (*C.GdkEventFocus)(unsafe.Pointer(event))
+ if focusEvent._type == C.GDK_FOCUS_CHANGE {
+ if focusEvent.in == C.TRUE {
+ processWindowEvent(C.uint(data), C.uint(events.Linux.WindowFocusIn))
+ } else {
+ processWindowEvent(C.uint(data), C.uint(events.Linux.WindowFocusOut))
+ }
}
- C.signal_connect(unsafe.Pointer(window), event, C.emit, unsafe.Pointer(&wEvent))
+ return C.gboolean(0)
+}
- contentManager := C.webkit_web_view_get_user_content_manager((*C.WebKitWebView)(webview))
- event = C.CString("script-message-received::external")
- defer C.free(unsafe.Pointer(event))
- C.signal_connect(unsafe.Pointer(contentManager), event, C.sendMessageToBackend, nil)
+//export handleLoadChanged
+func handleLoadChanged(webview *C.WebKitWebView, event C.WebKitLoadEvent, data C.uintptr_t) {
+ switch event {
+ case C.WEBKIT_LOAD_FINISHED:
+ processWindowEvent(C.uint(data), C.uint(events.Linux.WindowLoadChanged))
+ }
+}
- /*
- event = C.CString("load-changed")
- defer C.free(unsafe.Pointer(event))
- C.signal_connect(webview, event, C.webviewLoadChanged, unsafe.Pointer(&w.parent.id))
- */
- id := C.uint(windowId)
- event = C.CString("button-press-event")
- C.signal_connect(unsafe.Pointer(webview), event, C.onButtonEvent, unsafe.Pointer(&id))
- C.free(unsafe.Pointer(event))
- event = C.CString("button-release-event")
- defer C.free(unsafe.Pointer(event))
- C.signal_connect(unsafe.Pointer(webview), event, C.onButtonEvent, unsafe.Pointer(&id))
+func (w *linuxWebviewWindow) setupSignalHandlers(emit func(e events.WindowEventType)) {
- event = C.CString("key-press-event")
- defer C.free(unsafe.Pointer(event))
- C.signal_connect(unsafe.Pointer(webview), event, C.onKeyPressEvent, unsafe.Pointer(&id))
+ c := NewCalloc()
+ defer c.Free()
+
+ winID := unsafe.Pointer(uintptr(C.uint(w.parent.ID())))
+
+ // Set up the window close event
+ wv := unsafe.Pointer(w.webview)
+ C.signal_connect(unsafe.Pointer(w.window), c.String("delete-event"), C.handleDeleteEvent, winID)
+ C.signal_connect(unsafe.Pointer(w.window), c.String("focus-out-event"), C.handleFocusEvent, winID)
+ C.signal_connect(wv, c.String("load-changed"), C.handleLoadChanged, winID)
+
+ contentManager := C.webkit_web_view_get_user_content_manager(w.webKitWebView())
+ C.signal_connect(unsafe.Pointer(contentManager), c.String("script-message-received::external"), C.sendMessageToBackend, nil)
+ C.signal_connect(wv, c.String("button-press-event"), C.onButtonEvent, winID)
+ C.signal_connect(wv, c.String("button-release-event"), C.onButtonEvent, winID)
+ C.signal_connect(wv, c.String("key-press-event"), C.onKeyPressEvent, winID)
}
-func windowShowDevTools(webview pointer) {
+func getMouseButtons() (bool, bool, bool) {
+ var pointer *C.GdkDevice
+ var state C.GdkModifierType
+ pointer = C.gdk_seat_get_pointer(C.gdk_display_get_default_seat(C.gdk_display_get_default()))
+ C.gdk_device_get_state(pointer, nil, nil, &state)
+ return state&C.GDK_BUTTON1_MASK > 0, state&C.GDK_BUTTON2_MASK > 0, state&C.GDK_BUTTON3_MASK > 0
+}
+
+func openDevTools(webview pointer) {
inspector := C.webkit_web_view_get_inspector((*C.WebKitWebView)(webview))
C.webkit_web_inspector_show(inspector)
}
-func windowStartDrag(window pointer, button uint, xroot int, yroot int, dragTime uint32) {
+func (w *linuxWebviewWindow) startDrag() error {
C.gtk_window_begin_move_drag(
- (*C.GtkWindow)(window),
- C.int(button),
- C.int(xroot),
- C.int(yroot),
- C.uint32_t(dragTime))
+ (*C.GtkWindow)(w.window),
+ C.int(w.drag.MouseButton),
+ C.int(w.drag.XRoot),
+ C.int(w.drag.YRoot),
+ C.uint32_t(w.drag.DragTime))
+ return nil
}
-func windowToggleDevTools(webview pointer) {
+func enableDevTools(webview pointer) {
settings := C.webkit_web_view_get_settings((*C.WebKitWebView)(webview))
enabled := C.webkit_settings_get_enable_developer_extras(settings)
switch enabled {
@@ -968,49 +1225,69 @@ func windowToggleDevTools(webview pointer) {
C.webkit_settings_set_enable_developer_extras(settings, enabled)
}
-func windowUnfullscreen(window pointer) {
- C.gtk_window_unfullscreen((*C.GtkWindow)(window))
+func (w *linuxWebviewWindow) unfullscreen() {
+ C.gtk_window_unfullscreen((*C.GtkWindow)(w.window))
+ w.unmaximise()
}
-func windowUnmaximize(window pointer) {
- C.gtk_window_unmaximize((*C.GtkWindow)(window))
+func (w *linuxWebviewWindow) unmaximise() {
+ C.gtk_window_unmaximize((*C.GtkWindow)(w.window))
}
-func windowZoom(webview pointer) float64 {
- return float64(C.webkit_web_view_get_zoom_level((*C.WebKitWebView)(webview)))
+func (w *linuxWebviewWindow) getZoom() float64 {
+ return float64(C.webkit_web_view_get_zoom_level(w.webKitWebView()))
}
-// FIXME: ZoomIn/Out is assumed to be incorrect!
-func windowZoomIn(webview pointer) {
+func (w *linuxWebviewWindow) zoomIn() {
+ // FIXME: ZoomIn/Out is assumed to be incorrect!
ZoomInFactor := 1.10
- windowZoomSet(webview, windowZoom(webview)*ZoomInFactor)
+ w.setZoom(w.getZoom() * ZoomInFactor)
}
-func windowZoomOut(webview pointer) {
- ZoomOutFactor := -1.10
- windowZoomSet(webview, windowZoom(webview)*ZoomOutFactor)
+
+func (w *linuxWebviewWindow) zoomOut() {
+ ZoomInFactor := -1.10
+ w.setZoom(w.getZoom() * ZoomInFactor)
}
-func windowZoomSet(webview pointer, zoom float64) {
+func (w *linuxWebviewWindow) zoomReset() {
+ w.setZoom(1.0)
+}
+
+func (w *linuxWebviewWindow) reload() {
+ uri := C.CString("wails://")
+ C.webkit_web_view_load_uri(w.webKitWebView(), uri)
+ C.free(unsafe.Pointer(uri))
+}
+
+func (w *linuxWebviewWindow) setZoom(zoom float64) {
if zoom < 1 { // 1.0 is the smallest allowable
zoom = 1
}
- C.webkit_web_view_set_zoom_level((*C.WebKitWebView)(webview), C.double(zoom))
+ C.webkit_web_view_set_zoom_level(w.webKitWebView(), C.double(zoom))
+}
+
+func (w *linuxWebviewWindow) move(x, y int) {
+ // Move the window to these coordinates
+ C.gtk_window_move(w.gtkWindow(), C.int(x), C.int(y))
}
-func windowMove(window pointer, x, y int) {
- C.gtk_window_move((*C.GtkWindow)(window), C.int(x), C.int(y))
+func (w *linuxWebviewWindow) absolutePosition() (int, int) {
+ var x C.int
+ var y C.int
+ C.gtk_window_get_position((*C.GtkWindow)(w.window), &x, &y)
+ return int(x), int(y)
}
// FIXME Change this to reflect mouse button!
//
//export onButtonEvent
-func onButtonEvent(_ *C.GtkWidget, event *C.GdkEventButton, data unsafe.Pointer) C.gboolean {
+func onButtonEvent(_ *C.GtkWidget, event *C.GdkEventButton, data C.uintptr_t) C.gboolean {
// Constants (defined here to be easier to use with purego)
GdkButtonPress := C.GDK_BUTTON_PRESS // 4
Gdk2ButtonPress := C.GDK_2BUTTON_PRESS // 5 for double-click
GdkButtonRelease := C.GDK_BUTTON_RELEASE // 7
- windowId := uint(*((*C.uint)(data)))
+ windowId := uint(C.uint(data))
window := globalApplication.getWindowForID(windowId)
if window == nil {
return C.gboolean(0)
@@ -1068,17 +1345,15 @@ func onDragNDrop(target unsafe.Pointer, context *C.GdkDragContext, x C.gint, y C
}
//export onKeyPressEvent
-func onKeyPressEvent(widget *C.GtkWidget, event *C.GdkEventKey, userData unsafe.Pointer) C.gboolean {
- windowID := uint(*((*C.uint)(userData)))
- accelerator, ok := getKeyboardState(event)
- if !ok {
- return C.gboolean(1)
- }
- windowKeyEvents <- &windowKeyEvent{
- windowId: windowID,
- acceleratorString: accelerator,
+func onKeyPressEvent(widget *C.GtkWidget, event *C.GdkEventKey, userData C.uintptr_t) C.gboolean {
+ windowID := uint(C.uint(userData))
+ if accelerator, ok := getKeyboardState(event); ok {
+ windowKeyEvents <- &windowKeyEvent{
+ windowId: windowID,
+ acceleratorString: accelerator,
+ }
}
- return C.gboolean(1)
+ return C.gboolean(0)
}
func getKeyboardState(event *C.GdkEventKey) (string, bool) {
@@ -1109,10 +1384,11 @@ func getKeyboardState(event *C.GdkEventKey) (string, bool) {
}
//export onProcessRequest
-func onProcessRequest(request unsafe.Pointer, data unsafe.Pointer) {
- windowId := uint(*((*C.uint)(data)))
+func onProcessRequest(request *C.WebKitURISchemeRequest, data C.uintptr_t) {
+ webView := C.webkit_uri_scheme_request_get_web_view(request)
+ windowId := uint(uintptr(C.g_object_get_data((*C.GObject)(unsafe.Pointer(webView)), C.CString("windowid"))))
webviewRequests <- &webViewAssetRequest{
- Request: webview.NewRequest(request),
+ Request: webview.NewRequest(unsafe.Pointer(request)),
windowId: windowId,
windowName: globalApplication.getWindowForID(windowId).Name(),
}
@@ -1122,13 +1398,16 @@ func onProcessRequest(request unsafe.Pointer, data unsafe.Pointer) {
func sendMessageToBackend(contentManager *C.WebKitUserContentManager, result *C.WebKitJavascriptResult,
data unsafe.Pointer) {
+ // Get the windowID from the contentManager
+ windowID := uint(uintptr(C.g_object_get_data((*C.GObject)(unsafe.Pointer(contentManager)), C.CString("windowid"))))
+
var msg string
value := C.webkit_javascript_result_get_js_value(result)
message := C.jsc_value_to_string(value)
msg = C.GoString(message)
defer C.g_free(C.gpointer(message))
windowMessageBuffer <- &windowMessage{
- windowId: uint(windowID),
+ windowId: windowID,
message: msg,
}
}
@@ -1187,7 +1466,7 @@ func runChooserDialog(window pointer, allowMultiple, createFolders, showHidden b
gtkFilters := []*C.GtkFileFilter{}
for _, filter := range filters {
- f := (C.gtk_file_filter_new())
+ f := C.gtk_file_filter_new()
displayStr := C.CString(filter.DisplayName)
C.gtk_file_filter_set_name(f, displayStr)
C.free(unsafe.Pointer(displayStr))
diff --git a/v3/pkg/application/linux_purego.go b/v3/pkg/application/linux_purego.go
index 682bf195eda..5c58ae57854 100644
--- a/v3/pkg/application/linux_purego.go
+++ b/v3/pkg/application/linux_purego.go
@@ -976,7 +976,7 @@ func windowSetupSignalHandlers(windowId uint, window, webview pointer, emit func
*/
}
-func windowToggleDevTools(webview pointer) {
+func windowOpenDevTools(webview pointer) {
settings := webkitWebViewGetSettings(pointer(webview))
webkitSettingsSetEnableDeveloperExtras(
settings,
diff --git a/v3/pkg/application/mainthread_linux.go b/v3/pkg/application/mainthread_linux.go
index 572b081be3e..a718688bc4f 100644
--- a/v3/pkg/application/mainthread_linux.go
+++ b/v3/pkg/application/mainthread_linux.go
@@ -2,7 +2,7 @@
package application
-func (m *linuxApp) dispatchOnMainThread(id uint) {
+func (a *linuxApp) dispatchOnMainThread(id uint) {
dispatchOnMainThread(id)
}
diff --git a/v3/pkg/application/menu.go b/v3/pkg/application/menu.go
index f4a18f39a08..ae75c00ad9f 100644
--- a/v3/pkg/application/menu.go
+++ b/v3/pkg/application/menu.go
@@ -95,6 +95,21 @@ func (m *Menu) setContextData(data *ContextMenuData) {
}
}
+// Clone recursively clones the menu and all its submenus.
+func (m *Menu) clone() *Menu {
+ result := &Menu{
+ label: m.label,
+ }
+ for _, item := range m.items {
+ result.items = append(result.items, item.clone())
+ }
+ return result
+}
+
+func (m *Menu) Append(in *Menu) {
+ m.items = append(m.items, in.items...)
+}
+
func (a *App) NewMenu() *Menu {
return &Menu{}
}
diff --git a/v3/pkg/application/menuitem.go b/v3/pkg/application/menuitem.go
index f363fb7409e..1f05874e8c6 100644
--- a/v3/pkg/application/menuitem.go
+++ b/v3/pkg/application/menuitem.go
@@ -167,8 +167,8 @@ func newRole(role Role) *MenuItem {
return newForceReloadMenuItem()
case ToggleFullscreen:
return newToggleFullscreenMenuItem()
- case ShowDevTools:
- return newShowDevToolsMenuItem()
+ case OpenDevTools:
+ return newOpenDevToolsMenuItem()
case ResetZoom:
return newZoomResetMenuItem()
case ZoomIn:
@@ -332,3 +332,29 @@ func (m *MenuItem) setContextData(data *ContextMenuData) {
m.submenu.setContextData(data)
}
}
+
+// clone returns a deep copy of the MenuItem
+func (m *MenuItem) clone() *MenuItem {
+ result := &MenuItem{
+ id: m.id,
+ label: m.label,
+ tooltip: m.tooltip,
+ disabled: m.disabled,
+ checked: m.checked,
+ hidden: m.hidden,
+ bitmap: m.bitmap,
+ callback: m.callback,
+ itemType: m.itemType,
+ role: m.role,
+ }
+ if m.submenu != nil {
+ result.submenu = m.submenu.clone()
+ }
+ if m.accelerator != nil {
+ result.accelerator = m.accelerator.clone()
+ }
+ if m.contextMenuData != nil {
+ result.contextMenuData = m.contextMenuData.clone()
+ }
+ return result
+}
diff --git a/v3/pkg/application/menuitem_darwin.go b/v3/pkg/application/menuitem_darwin.go
index 714851bb533..3b25b56e2e7 100644
--- a/v3/pkg/application/menuitem_darwin.go
+++ b/v3/pkg/application/menuitem_darwin.go
@@ -576,17 +576,6 @@ func newToggleFullscreenMenuItem() *MenuItem {
return result
}
-func newToggleDevToolsMenuItem() *MenuItem {
- return newMenuItem("Toggle Developer Tools").
- SetAccelerator("Alt+Command+I").
- OnClick(func(ctx *Context) {
- currentWindow := globalApplication.CurrentWindow()
- if currentWindow != nil {
- currentWindow.ToggleDevTools()
- }
- })
-}
-
func newZoomResetMenuItem() *MenuItem {
// reset zoom menu item
return newMenuItem("Actual Size").
diff --git a/v3/pkg/application/menuitem_dev.go b/v3/pkg/application/menuitem_dev.go
index 23b0395cd18..7375b117dfe 100644
--- a/v3/pkg/application/menuitem_dev.go
+++ b/v3/pkg/application/menuitem_dev.go
@@ -2,13 +2,13 @@
package application
-func newShowDevToolsMenuItem() *MenuItem {
- return newMenuItem("Show Developer Tools").
+func newOpenDevToolsMenuItem() *MenuItem {
+ return newMenuItem("Open Developer Tools").
SetAccelerator("Alt+Command+I").
OnClick(func(ctx *Context) {
currentWindow := globalApplication.CurrentWindow()
if currentWindow != nil {
- currentWindow.ToggleDevTools()
+ currentWindow.OpenDevTools()
}
})
}
diff --git a/v3/pkg/application/menuitem_linux.go b/v3/pkg/application/menuitem_linux.go
index 058b586092d..abdd8fe0551 100644
--- a/v3/pkg/application/menuitem_linux.go
+++ b/v3/pkg/application/menuitem_linux.go
@@ -294,17 +294,6 @@ func newToggleFullscreenMenuItem() *MenuItem {
return result
}
-func newToggleDevToolsMenuItem() *MenuItem {
- return newMenuItem("Toggle Developer Tools").
- SetAccelerator("Alt+Command+I").
- OnClick(func(ctx *Context) {
- currentWindow := globalApplication.CurrentWindow()
- if currentWindow != nil {
- currentWindow.ToggleDevTools()
- }
- })
-}
-
func newZoomResetMenuItem() *MenuItem {
// reset zoom menu item
return newMenuItem("Actual Size").
diff --git a/v3/pkg/application/menuitem_production.go b/v3/pkg/application/menuitem_production.go
index 553338e879f..387b9d06cb1 100644
--- a/v3/pkg/application/menuitem_production.go
+++ b/v3/pkg/application/menuitem_production.go
@@ -2,6 +2,6 @@
package application
-func newShowDevToolsMenuItem() *MenuItem {
+func newOpenDevToolsMenuItem() *MenuItem {
return nil
}
diff --git a/v3/pkg/application/messageprocessor_contextmenu.go b/v3/pkg/application/messageprocessor_contextmenu.go
index c7c8a86a892..0d7f2e8948b 100644
--- a/v3/pkg/application/messageprocessor_contextmenu.go
+++ b/v3/pkg/application/messageprocessor_contextmenu.go
@@ -11,6 +11,15 @@ type ContextMenuData struct {
Data any `json:"data"`
}
+func (d ContextMenuData) clone() *ContextMenuData {
+ return &ContextMenuData{
+ Id: d.Id,
+ X: d.X,
+ Y: d.Y,
+ Data: d.Data,
+ }
+}
+
const (
ContextMenuOpen = 0
)
diff --git a/v3/pkg/application/options_application_mac.go b/v3/pkg/application/options_application_mac.go
deleted file mode 100644
index ddfbc80e65b..00000000000
--- a/v3/pkg/application/options_application_mac.go
+++ /dev/null
@@ -1,22 +0,0 @@
-package application
-
-// ActivationPolicy is the activation policy for the application.
-type ActivationPolicy int
-
-const (
- // ActivationPolicyRegular is used for applications that have a user interface,
- ActivationPolicyRegular ActivationPolicy = iota
- // ActivationPolicyAccessory is used for applications that do not have a main window,
- // such as system tray applications or background applications.
- ActivationPolicyAccessory
- ActivationPolicyProhibited
-)
-
-// MacOptions contains options for macOS applications.
-type MacOptions struct {
- // ActivationPolicy is the activation policy for the application. Defaults to
- // applicationActivationPolicyRegular.
- ActivationPolicy ActivationPolicy
- // If set to true, the application will terminate when the last window is closed.
- ApplicationShouldTerminateAfterLastWindowClosed bool
-}
diff --git a/v3/pkg/application/options_application_win.go b/v3/pkg/application/options_application_win.go
deleted file mode 100644
index b5a7afdb7ec..00000000000
--- a/v3/pkg/application/options_application_win.go
+++ /dev/null
@@ -1,21 +0,0 @@
-package application
-
-// WindowsOptions contains options for Windows applications.
-type WindowsOptions struct {
-
- // WndProcInterceptor is a function that will be called for every message sent in the application.
- // Use this to hook into the main message loop. This is useful for handling custom window messages.
- // If `shouldReturn` is `true` then `returnCode` will be returned by the main message loop.
- // If `shouldReturn` is `false` then returnCode will be ignored and the message will be processed by the main message loop.
- WndProcInterceptor func(hwnd uintptr, msg uint32, wParam, lParam uintptr) (returnCode uintptr, shouldReturn bool)
-
- // DisableQuitOnLastWindowClosed disables the auto quit of the application if the last window has been closed.
- DisableQuitOnLastWindowClosed bool
-
- // Path where the WebView2 stores the user data. If empty %APPDATA%\[BinaryName.exe] will be used.
- // If the path is not valid, a messagebox will be displayed with the error and the app will exit with error code.
- WebviewUserDataPath string
-
- // Path to the directory with WebView2 executables. If empty WebView2 installed in the system will be used.
- WebviewBrowserPath string
-}
diff --git a/v3/pkg/application/options_linux.go b/v3/pkg/application/options_linux.go
deleted file mode 100644
index bf3d0c308f4..00000000000
--- a/v3/pkg/application/options_linux.go
+++ /dev/null
@@ -1,6 +0,0 @@
-package application
-
-// LinuxWindow contains macOS specific options
-type LinuxWindow struct {
- ShowApplicationMenu bool
-}
diff --git a/v3/pkg/application/options_mac.go b/v3/pkg/application/options_mac.go
deleted file mode 100644
index 6255cc5cec1..00000000000
--- a/v3/pkg/application/options_mac.go
+++ /dev/null
@@ -1,165 +0,0 @@
-package application
-
-import (
- "github.com/leaanthony/u"
- "github.com/wailsapp/wails/v3/pkg/events"
-)
-
-// MacBackdrop is the backdrop type for macOS
-type MacBackdrop int
-
-const (
- // MacBackdropNormal - The default value. The window will have a normal opaque background.
- MacBackdropNormal MacBackdrop = iota
- // MacBackdropTransparent - The window will have a transparent background, with the content underneath it being visible
- MacBackdropTransparent
- // MacBackdropTranslucent - The window will have a translucent background, with the content underneath it being "fuzzy" or "frosted"
- MacBackdropTranslucent
-)
-
-// MacToolbarStyle is the style of toolbar for macOS
-type MacToolbarStyle int
-
-const (
- // MacToolbarStyleAutomatic - The default value. The style will be determined by the window's given configuration
- MacToolbarStyleAutomatic MacToolbarStyle = iota
- // MacToolbarStyleExpanded - The toolbar will appear below the window title
- MacToolbarStyleExpanded
- // MacToolbarStylePreference - The toolbar will appear below the window title and the items in the toolbar will attempt to have equal widths when possible
- MacToolbarStylePreference
- // MacToolbarStyleUnified - The window title will appear inline with the toolbar when visible
- MacToolbarStyleUnified
- // MacToolbarStyleUnifiedCompact - Same as MacToolbarStyleUnified, but with reduced margins in the toolbar allowing more focus to be on the contents of the window
- MacToolbarStyleUnifiedCompact
-)
-
-// MacWindow contains macOS specific options for Webview Windows
-type MacWindow struct {
- // Backdrop is the backdrop type for the window
- Backdrop MacBackdrop
- // DisableShadow will disable the window shadow
- DisableShadow bool
- // TitleBar contains options for the Mac titlebar
- TitleBar MacTitleBar
- // Appearance is the appearance type for the window
- Appearance MacAppearanceType
- // InvisibleTitleBarHeight defines the height of an invisible titlebar which responds to dragging
- InvisibleTitleBarHeight int
- // Maps events from platform specific to common event types
- EventMapping map[events.WindowEventType]events.WindowEventType
-
- // EnableFraudulentWebsiteWarnings will enable warnings for fraudulent websites.
- // Default: false
- EnableFraudulentWebsiteWarnings bool
-
- // WebviewPreferences contains preferences for the webview
- WebviewPreferences MacWebviewPreferences
-
- // Disables the minimise button
- DisableMinimiseButton bool
-
- // Disables the maximise button
- DisableMaximiseButton bool
-
- // Disables the close button
- DisableCloseButton bool
-}
-
-// MacWebviewPreferences contains preferences for the Mac webview
-type MacWebviewPreferences struct {
- // TabFocusesLinks will enable tabbing to links
- TabFocusesLinks u.Bool
- // TextInteractionEnabled will enable text interaction
- TextInteractionEnabled u.Bool
- // FullscreenEnabled will enable fullscreen
- FullscreenEnabled u.Bool
-}
-
-// MacTitleBar contains options for the Mac titlebar
-type MacTitleBar struct {
- // AppearsTransparent will make the titlebar transparent
- AppearsTransparent bool
- // Hide will hide the titlebar
- Hide bool
- // HideTitle will hide the title
- HideTitle bool
- // FullSizeContent will extend the window content to the full size of the window
- FullSizeContent bool
- // UseToolbar will use a toolbar instead of a titlebar
- UseToolbar bool
- // HideToolbarSeparator will hide the toolbar separator
- HideToolbarSeparator bool
- // ShowToolbarWhenFullscreen will keep the toolbar visible when the window is in fullscreen mode
- ShowToolbarWhenFullscreen bool
- // ToolbarStyle is the style of toolbar to use
- ToolbarStyle MacToolbarStyle
-}
-
-// MacTitleBarDefault results in the default Mac MacTitleBar
-var MacTitleBarDefault = MacTitleBar{
- AppearsTransparent: false,
- Hide: false,
- HideTitle: false,
- FullSizeContent: false,
- UseToolbar: false,
- HideToolbarSeparator: false,
-}
-
-// Credit: Comments from Electron site
-
-// MacTitleBarHidden results in a hidden title bar and a full size content window,
-// yet the title bar still has the standard window controls (“traffic lights”)
-// in the top left.
-var MacTitleBarHidden = MacTitleBar{
- AppearsTransparent: true,
- Hide: false,
- HideTitle: true,
- FullSizeContent: true,
- UseToolbar: false,
- HideToolbarSeparator: false,
-}
-
-// MacTitleBarHiddenInset results in a hidden title bar with an alternative look where
-// the traffic light buttons are slightly more inset from the window edge.
-var MacTitleBarHiddenInset = MacTitleBar{
- AppearsTransparent: true,
- Hide: false,
- HideTitle: true,
- FullSizeContent: true,
- UseToolbar: true,
- HideToolbarSeparator: true,
-}
-
-// MacTitleBarHiddenInsetUnified results in a hidden title bar with an alternative look where
-// the traffic light buttons are even more inset from the window edge.
-var MacTitleBarHiddenInsetUnified = MacTitleBar{
- AppearsTransparent: true,
- Hide: false,
- HideTitle: true,
- FullSizeContent: true,
- UseToolbar: true,
- HideToolbarSeparator: true,
- ToolbarStyle: MacToolbarStyleUnified,
-}
-
-// MacAppearanceType is a type of Appearance for Cocoa windows
-type MacAppearanceType string
-
-const (
- // DefaultAppearance uses the default system value
- DefaultAppearance MacAppearanceType = ""
- // NSAppearanceNameAqua - The standard light system appearance.
- NSAppearanceNameAqua MacAppearanceType = "NSAppearanceNameAqua"
- // NSAppearanceNameDarkAqua - The standard dark system appearance.
- NSAppearanceNameDarkAqua MacAppearanceType = "NSAppearanceNameDarkAqua"
- // NSAppearanceNameVibrantLight - The light vibrant appearance
- NSAppearanceNameVibrantLight MacAppearanceType = "NSAppearanceNameVibrantLight"
- // NSAppearanceNameAccessibilityHighContrastAqua - A high-contrast version of the standard light system appearance.
- NSAppearanceNameAccessibilityHighContrastAqua MacAppearanceType = "NSAppearanceNameAccessibilityHighContrastAqua"
- // NSAppearanceNameAccessibilityHighContrastDarkAqua - A high-contrast version of the standard dark system appearance.
- NSAppearanceNameAccessibilityHighContrastDarkAqua MacAppearanceType = "NSAppearanceNameAccessibilityHighContrastDarkAqua"
- // NSAppearanceNameAccessibilityHighContrastVibrantLight - A high-contrast version of the light vibrant appearance.
- NSAppearanceNameAccessibilityHighContrastVibrantLight MacAppearanceType = "NSAppearanceNameAccessibilityHighContrastVibrantLight"
- // NSAppearanceNameAccessibilityHighContrastVibrantDark - A high-contrast version of the dark vibrant appearance.
- NSAppearanceNameAccessibilityHighContrastVibrantDark MacAppearanceType = "NSAppearanceNameAccessibilityHighContrastVibrantDark"
-)
diff --git a/v3/pkg/application/options_webview_window.go b/v3/pkg/application/options_webview_window.go
deleted file mode 100644
index d2bccba4573..00000000000
--- a/v3/pkg/application/options_webview_window.go
+++ /dev/null
@@ -1,161 +0,0 @@
-package application
-
-type WindowState int
-
-const (
- WindowStateNormal WindowState = iota
- WindowStateMinimised
- WindowStateMaximised
- WindowStateFullscreen
-)
-
-type WebviewWindowOptions struct {
- // Name is a unique identifier that can be given to a window.
- Name string
-
- // Title is the title of the window.
- Title string
-
- // Width is the starting width of the window.
- Width int
-
- // Height is the starting height of the window.
- Height int
-
- // AlwaysOnTop will make the window float above other windows.
- AlwaysOnTop bool
-
- // URL is the URL to load in the window.
- URL string
-
- // DisableResize will disable the ability to resize the window.
- DisableResize bool
-
- // Frameless will remove the window frame.
- Frameless bool
-
- // MinWidth is the minimum width of the window.
- MinWidth int
-
- // MinHeight is the minimum height of the window.
- MinHeight int
-
- // MaxWidth is the maximum width of the window.
- MaxWidth int
-
- // MaxHeight is the maximum height of the window.
- MaxHeight int
-
- // StartState indicates the state of the window when it is first shown.
- // Default: WindowStateNormal
- StartState WindowState
-
- // Centered will center the window on the screen.
- Centered bool
-
- // BackgroundType is the type of background to use for the window.
- // Default: BackgroundTypeSolid
- BackgroundType BackgroundType
-
- // BackgroundColour is the colour to use for the window background.
- BackgroundColour RGBA
-
- // HTML is the HTML to load in the window.
- HTML string
-
- // JS is the JavaScript to load in the window.
- JS string
-
- // CSS is the CSS to load in the window.
- CSS string
-
- // X is the starting X position of the window.
- X int
-
- // Y is the starting Y position of the window.
- Y int
-
- // TransparentTitlebar will make the titlebar transparent.
- // TODO: Move to mac window options
- FullscreenButtonEnabled bool
-
- // Hidden will hide the window when it is first created.
- Hidden bool
-
- // Zoom is the zoom level of the window.
- Zoom float64
-
- // ZoomControlEnabled will enable the zoom control.
- ZoomControlEnabled bool
-
- // EnableDragAndDrop will enable drag and drop.
- EnableDragAndDrop bool
-
- // OpenInspectorOnStartup will open the inspector when the window is first shown.
- OpenInspectorOnStartup bool
-
- // Mac options
- Mac MacWindow
-
- // Windows options
- Windows WindowsWindow
-
- // ShouldClose is called when the window is about to close.
- // Return true to allow the window to close, or false to prevent it from closing.
- ShouldClose func(window *WebviewWindow) bool
-
- // If true, the window's devtools will be available (default true in builds without the `production` build tag)
- DevToolsEnabled bool
-
- // If true, the window's default context menu will be disabled (default false)
- DefaultContextMenuDisabled bool
-
- // KeyBindings is a map of key bindings to functions
- KeyBindings map[string]func(window *WebviewWindow)
-
- // IgnoreMouseEvents will ignore mouse events in the window
- IgnoreMouseEvents bool
-}
-
-var WebviewWindowDefaults = &WebviewWindowOptions{
- Title: "",
- Width: 800,
- Height: 600,
- URL: "",
- BackgroundColour: RGBA{
- Red: 255,
- Green: 255,
- Blue: 255,
- Alpha: 255,
- },
-}
-
-type RGBA struct {
- Red, Green, Blue, Alpha uint8
-}
-
-func NewRGBA(red, green, blue, alpha uint8) RGBA {
- return RGBA{
- Red: red,
- Green: green,
- Blue: blue,
- Alpha: alpha,
- }
-}
-
-func NewRGB(red, green, blue uint8) RGBA {
- return RGBA{
- Red: red,
- Green: green,
- Blue: blue,
- Alpha: 255,
- }
-}
-
-type BackgroundType int
-
-const (
- BackgroundTypeSolid BackgroundType = iota
- BackgroundTypeTransparent
- BackgroundTypeTranslucent
-)
diff --git a/v3/pkg/application/options_webview_window_win.go b/v3/pkg/application/options_webview_window_win.go
deleted file mode 100644
index 9c51219a481..00000000000
--- a/v3/pkg/application/options_webview_window_win.go
+++ /dev/null
@@ -1,154 +0,0 @@
-package application
-
-import (
- "github.com/wailsapp/wails/v3/pkg/events"
-)
-
-type BackdropType int32
-type DragEffect int32
-
-const (
- // DragEffectNone is used to indicate that the drop target cannot accept the data.
- DragEffectNone DragEffect = 1
- // DragEffectCopy is used to indicate that the data is copied to the drop target.
- DragEffectCopy DragEffect = 2
- // DragEffectMove is used to indicate that the data is removed from the drag source.
- DragEffectMove DragEffect = 3
- // DragEffectLink is used to indicate that a link to the original data is established.
- DragEffectLink DragEffect = 4
- // DragEffectScroll is used to indicate that the target can be scrolled while dragging to locate a drop position that is not currently visible in the target.
-
-)
-
-const (
- Auto BackdropType = 0
- None BackdropType = 1
- Mica BackdropType = 2
- Acrylic BackdropType = 3
- Tabbed BackdropType = 4
-)
-
-type CoreWebView2PermissionKind uint32
-
-const (
- CoreWebView2PermissionKindUnknownPermission CoreWebView2PermissionKind = iota
- CoreWebView2PermissionKindMicrophone
- CoreWebView2PermissionKindCamera
- CoreWebView2PermissionKindGeolocation
- CoreWebView2PermissionKindNotifications
- CoreWebView2PermissionKindOtherSensors
- CoreWebView2PermissionKindClipboardRead
-)
-
-type CoreWebView2PermissionState uint32
-
-const (
- CoreWebView2PermissionStateDefault CoreWebView2PermissionState = iota
- CoreWebView2PermissionStateAllow
- CoreWebView2PermissionStateDeny
-)
-
-type WindowsWindow struct {
- // Select the type of translucent backdrop. Requires Windows 11 22621 or later.
- // Only used when window's `BackgroundType` is set to `BackgroundTypeTranslucent`.
- // Default: Auto
- BackdropType BackdropType
-
- // Disable the icon in the titlebar
- // Default: false
- DisableIcon bool
-
- // Theme (Dark / Light / SystemDefault)
- // Default: SystemDefault - The application will follow system theme changes.
- Theme Theme
-
- // Specify custom colours to use for dark/light mode
- // Default: nil
- CustomTheme *ThemeSettings
-
- // Disable all window decorations in Frameless mode, which means no "Aero Shadow" and no "Rounded Corner" will be shown.
- // "Rounded Corners" are only available on Windows 11.
- // Default: false
- DisableFramelessWindowDecorations bool
-
- // WindowMask is used to set the window shape. Use a PNG with an alpha channel to create a custom shape.
- // Default: nil
- WindowMask []byte
-
- // WindowMaskDraggable is used to make the window draggable by clicking on the window mask.
- // Default: false
- WindowMaskDraggable bool
-
- // WebviewGpuIsDisabled is used to enable / disable GPU acceleration for the webview
- // Default: false
- WebviewGpuIsDisabled bool
-
- // ResizeDebounceMS is the amount of time to debounce redraws of webview2
- // when resizing the window
- // Default: 0
- ResizeDebounceMS uint16
-
- // Disable the menu bar for this window
- // Default: false
- DisableMenu bool
-
- // Event mapping for the window. This allows you to define a translation from one event to another.
- // Default: nil
- EventMapping map[events.WindowEventType]events.WindowEventType
-
- // HiddenOnTaskbar hides the window from the taskbar
- // Default: false
- HiddenOnTaskbar bool
-
- // EnableSwipeGestures enables swipe gestures for the window
- // Default: false
- EnableSwipeGestures bool
-
- // EnableFraudulentWebsiteWarnings will enable warnings for fraudulent websites.
- // Default: false
- EnableFraudulentWebsiteWarnings bool
-
- // Menu is the menu to use for the window.
- Menu *Menu
-
- // Drag Cursor Effects
- OnEnterEffect DragEffect
- OnOverEffect DragEffect
-
- // Permissions map for WebView2. If empty, default permissions will be granted.
- Permissions map[CoreWebView2PermissionKind]CoreWebView2PermissionState
-
- // Disables the minimise button
- DisableMinimiseButton bool
-
- // Disables the maximise button
- DisableMaximiseButton bool
-}
-
-type Theme int
-
-const (
- // SystemDefault will use whatever the system theme is. The application will follow system theme changes.
- SystemDefault Theme = 0
- // Dark Mode
- Dark Theme = 1
- // Light Mode
- Light Theme = 2
-)
-
-// ThemeSettings defines custom colours to use in dark or light mode.
-// They may be set using the hex values: 0x00BBGGRR
-type ThemeSettings struct {
- DarkModeTitleBar int32
- DarkModeTitleBarInactive int32
- DarkModeTitleText int32
- DarkModeTitleTextInactive int32
- DarkModeBorder int32
- DarkModeBorderInactive int32
- LightModeTitleBar int32
- LightModeTitleBarInactive int32
- LightModeTitleText int32
- LightModeTitleTextInactive int32
- LightModeBorder int32
- LightModeBorderInactive int32
-}
diff --git a/v3/pkg/application/roles.go b/v3/pkg/application/roles.go
index c096092735d..bce6b5c2c68 100644
--- a/v3/pkg/application/roles.go
+++ b/v3/pkg/application/roles.go
@@ -36,7 +36,7 @@ const (
Close Role = iota
Reload Role = iota
ForceReload Role = iota
- ShowDevTools Role = iota
+ OpenDevTools Role = iota
ResetZoom Role = iota
ZoomIn Role = iota
ZoomOut Role = iota
diff --git a/v3/pkg/application/roles_dev.go b/v3/pkg/application/roles_dev.go
index 6b0b1acc480..1c03e398dd7 100644
--- a/v3/pkg/application/roles_dev.go
+++ b/v3/pkg/application/roles_dev.go
@@ -3,5 +3,5 @@
package application
func addDevToolMenuItem(viewMenu *Menu) {
- viewMenu.AddRole(ShowDevTools)
+ viewMenu.AddRole(OpenDevTools)
}
diff --git a/v3/pkg/application/screen_linux.go b/v3/pkg/application/screen_linux.go
index 36411045486..f6dfdf59d36 100644
--- a/v3/pkg/application/screen_linux.go
+++ b/v3/pkg/application/screen_linux.go
@@ -3,21 +3,29 @@
package application
import (
- "fmt"
"sync"
)
-func (m *linuxApp) getPrimaryScreen() (*Screen, error) {
- return nil, fmt.Errorf("not implemented")
+func (a *linuxApp) getPrimaryScreen() (*Screen, error) {
+ var wg sync.WaitGroup
+ var screen *Screen
+ var err error
+ wg.Add(1)
+ InvokeSync(func() {
+ screen, err = getPrimaryScreen()
+ wg.Done()
+ })
+ wg.Wait()
+ return screen, err
}
-func (m *linuxApp) getScreens() ([]*Screen, error) {
+func (a *linuxApp) getScreens() ([]*Screen, error) {
var wg sync.WaitGroup
var screens []*Screen
var err error
wg.Add(1)
InvokeSync(func() {
- screens, err = getScreens(m.application)
+ screens, err = getScreens(a.application)
wg.Done()
})
wg.Wait()
diff --git a/v3/pkg/application/systemtray_linux.go b/v3/pkg/application/systemtray_linux.go
index 43501c95290..2468e7ff18a 100644
--- a/v3/pkg/application/systemtray_linux.go
+++ b/v3/pkg/application/systemtray_linux.go
@@ -24,6 +24,8 @@ const (
)
type linuxSystemTray struct {
+ parent *SystemTray
+
id uint
label string
icon []byte
@@ -41,6 +43,11 @@ type linuxSystemTray struct {
itemMap map[int32]*systrayMenuItem
}
+func (s *linuxSystemTray) getScreen() (*Screen, error) {
+ _, _, result := getMousePosition()
+ return result, nil
+}
+
// dbusMenu is a named struct to map into generated bindings.
// It represents the layout of a menu item
type dbusMenu = struct {
@@ -182,6 +189,22 @@ func (s *linuxSystemTray) refresh() {
}
func (s *linuxSystemTray) setMenu(menu *Menu) {
+ if s.parent.attachedWindow.Window != nil {
+ temp := menu
+ menu = NewMenu()
+ title := "Open"
+ if s.parent.attachedWindow.Window.Name() != "" {
+ title += " " + s.parent.attachedWindow.Window.Name()
+ } else {
+ title += " window"
+ }
+ openMenuItem := menu.Add(title)
+ openMenuItem.OnClick(func(*Context) {
+ s.parent.clickHandler()
+ })
+ menu.AddSeparator()
+ menu.Append(temp)
+ }
s.itemMap = map[int32]*systrayMenuItem{}
// our root menu element
s.itemMap[0] = &systrayMenuItem{
@@ -198,16 +221,47 @@ func (s *linuxSystemTray) setMenu(menu *Menu) {
}
func (s *linuxSystemTray) positionWindow(window *WebviewWindow, offset int) error {
- return nil
-}
+ // Get the mouse location on the screen
+ mouseX, mouseY, currentScreen := getMousePosition()
+ screenBounds := currentScreen.Size
-func (s *linuxSystemTray) getScreen() (*Screen, error) {
- // FIXME: How do we get the screen we are on?
- return &Screen{}, nil
+ // Calculate new X position
+ newX := mouseX - (window.Width() / 2)
+
+ // Check if the window goes out of the screen bounds on the left side
+ if newX < 0 {
+ newX = 0
+ }
+
+ // Check if the window goes out of the screen bounds on the right side
+ if newX+window.Width() > screenBounds.Width {
+ newX = screenBounds.Width - window.Width()
+ }
+
+ // Calculate new Y position
+ newY := mouseY - (window.Height() / 2)
+
+ // Check if the window goes out of the screen bounds on the top
+ if newY < 0 {
+ newY = 0
+ }
+
+ // Check if the window goes out of the screen bounds on the bottom
+ if newY+window.Height() > screenBounds.Height {
+ newY = screenBounds.Height - window.Height() - offset
+ }
+
+ // Set the new position of the window
+ window.SetAbsolutePosition(newX, newY)
+ return nil
}
func (s *linuxSystemTray) bounds() (*Rect, error) {
+
+ // Best effort guess at the screen bounds
+
return &Rect{}, nil
+
}
func (s *linuxSystemTray) run() {
@@ -354,6 +408,7 @@ func newSystemTrayImpl(s *SystemTray) systemTrayImpl {
}
return &linuxSystemTray{
+ parent: s,
id: s.id,
label: label,
icon: s.icon,
@@ -572,6 +627,16 @@ func (s *linuxSystemTray) Event(id int32, eventID string, data dbus.Variant, tim
InvokeAsync(item.menuItem.handleClick)
}
}
+ if eventID == "opened" {
+ if s.parent.onMenuOpen != nil {
+ s.parent.onMenuOpen()
+ }
+ }
+ if eventID == "closed" {
+ if s.parent.onMenuClose != nil {
+ s.parent.onMenuClose()
+ }
+ }
return
}
@@ -583,6 +648,7 @@ func (s *linuxSystemTray) EventGroup(events []struct {
V3 uint32
}) (idErrors []int32, err *dbus.Error) {
for _, event := range events {
+ fmt.Printf("EventGroup: %v, %v, %v, %v\n", event.V0, event.V1, event.V2, event.V3)
if event.V1 == "clicked" {
item, ok := s.itemMap[event.V0]
if ok {
diff --git a/v3/pkg/application/webview_window.go b/v3/pkg/application/webview_window.go
index 833ba7a91d8..5503c29b744 100644
--- a/v3/pkg/application/webview_window.go
+++ b/v3/pkg/application/webview_window.go
@@ -40,7 +40,7 @@ type (
destroy()
reload()
forceReload()
- toggleDevTools()
+ openDevTools()
zoomReset()
zoomIn()
zoomOut()
@@ -64,6 +64,8 @@ type (
isVisible() bool
isFocused() bool
setFullscreenButtonEnabled(enabled bool)
+ setMinimiseButtonEnabled(enabled bool)
+ setMaximiseButtonEnabled(enabled bool)
focus()
show()
hide()
@@ -498,7 +500,7 @@ func (w *WebviewWindow) SetMaxSize(maxWidth, maxHeight int) Window {
}
// ExecJS executes the given javascript in the context of the window.
-func (w *WebviewWindow) ExecJS(_callID, js string) {
+func (w *WebviewWindow) ExecJS(js string) {
if w.impl == nil && !w.isDestroyed() {
return
}
@@ -532,6 +534,26 @@ func (w *WebviewWindow) SetFullscreenButtonEnabled(enabled bool) Window {
return w
}
+func (w *WebviewWindow) SetMinimiseButtonEnabled(enabled bool) Window {
+ w.options.FullscreenButtonEnabled = enabled
+ if w.impl != nil {
+ InvokeSync(func() {
+ w.impl.setMinimiseButtonEnabled(enabled)
+ })
+ }
+ return w
+}
+
+func (w *WebviewWindow) SetMaximiseButtonEnabled(enabled bool) Window {
+ w.options.FullscreenButtonEnabled = enabled
+ if w.impl != nil {
+ InvokeSync(func() {
+ w.impl.setMaximiseButtonEnabled(enabled)
+ })
+ }
+ return w
+}
+
// Flash flashes the window's taskbar button/icon.
// Useful to indicate that attention is required. Windows only.
func (w *WebviewWindow) Flash(enabled bool) {
@@ -635,7 +657,7 @@ func (w *WebviewWindow) HandleMessage(message string) {
w.runtimeLoaded = true
w.SetResizable(!w.options.DisableResize)
for _, js := range w.pendingJS {
- w.ExecJS("", js)
+ w.ExecJS(js)
}
}
}
@@ -817,11 +839,11 @@ func (w *WebviewWindow) ToggleMaximise() {
})
}
-func (w *WebviewWindow) ToggleDevTools() {
+func (w *WebviewWindow) OpenDevTools() {
if w.impl == nil && !w.isDestroyed() {
return
}
- InvokeSync(w.impl.toggleDevTools)
+ InvokeSync(w.impl.openDevTools)
}
// ZoomReset resets the zoom level of the webview content to 100%
@@ -1020,7 +1042,7 @@ func (w *WebviewWindow) SetFrameless(frameless bool) Window {
func (w *WebviewWindow) DispatchWailsEvent(event *WailsEvent) {
msg := fmt.Sprintf("_wails.dispatchWailsEvent(%s);", event.ToJSON())
- w.ExecJS("", msg)
+ w.ExecJS(msg)
}
func (w *WebviewWindow) dispatchWindowEvent(id uint) {
diff --git a/v3/pkg/application/webview_window_darwin.go b/v3/pkg/application/webview_window_darwin.go
index 156dba789f6..f6ba3038237 100644
--- a/v3/pkg/application/webview_window_darwin.go
+++ b/v3/pkg/application/webview_window_darwin.go
@@ -761,8 +761,6 @@ import (
"github.com/wailsapp/wails/v3/pkg/events"
)
-var showDevTools = func(window unsafe.Pointer) {}
-
type macosWebviewWindow struct {
nsWindow unsafe.Pointer
parent *WebviewWindow
@@ -906,10 +904,6 @@ func (w *macosWebviewWindow) zoomReset() {
C.windowZoomReset(w.nsWindow)
}
-func (w *macosWebviewWindow) toggleDevTools() {
- showDevTools(w.nsWindow)
-}
-
func (w *macosWebviewWindow) reload() {
//TODO: Implement
globalApplication.debug("reload called on WebviewWindow", "parentID", w.parent.id)
@@ -1134,13 +1128,13 @@ func (w *macosWebviewWindow) run() {
}
if macOptions.DisableMinimiseButton {
- C.enableMinimiseButton(w.nsWindow, C.bool(false))
+ w.setMinimiseButtonEnabled(false)
}
if macOptions.DisableMaximiseButton {
- C.enableMaximiseButton(w.nsWindow, C.bool(false))
+ w.setMaximiseButtonEnabled(false)
}
if macOptions.DisableCloseButton {
- C.enableCloseButton(w.nsWindow, C.bool(false))
+ w.setCloseButtonEnabled(false)
}
if options.IgnoreMouseEvents {
@@ -1271,3 +1265,15 @@ func (w *macosWebviewWindow) startDrag() error {
C.startDrag(w.nsWindow)
return nil
}
+
+func (w *macosWebviewWindow) setMinimiseButtonEnabled(enabled bool) {
+ C.enableMinimiseButton(w.nsWindow, C.bool(enabled))
+}
+
+func (w *macosWebviewWindow) setMaximiseButtonEnabled(enabled bool) {
+ C.enableMaximiseButton(w.nsWindow, C.bool(enabled))
+}
+
+func (w *macosWebviewWindow) setCloseButtonEnabled(enabled bool) {
+ C.enableCloseButton(w.nsWindow, C.bool(enabled))
+}
diff --git a/v3/pkg/application/webview_window_darwin_dev.go b/v3/pkg/application/webview_window_darwin_dev.go
index 4e76c5a57b0..c16746239ad 100644
--- a/v3/pkg/application/webview_window_darwin_dev.go
+++ b/v3/pkg/application/webview_window_darwin_dev.go
@@ -19,15 +19,7 @@ package application
- (_WKInspector *)_inspector;
@end
-//void showDevTools(void *window) {
-// // get main window
-// WebviewWindow* nsWindow = (WebviewWindow*)window;
-// dispatch_async(dispatch_get_main_queue(), ^{
-// [nsWindow.webView._inspector show];
-// });
-//}
-
-void showDevTools(void *window) {
+void openDevTools(void *window) {
#if MAC_OS_X_VERSION_MAX_ALLOWED >= 120000
dispatch_async(dispatch_get_main_queue(), ^{
if (@available(macOS 12.0, *)) {
@@ -55,12 +47,9 @@ void windowEnableDevTools(void* nsWindow) {
*/
import "C"
-import "unsafe"
-func init() {
- showDevTools = func(window unsafe.Pointer) {
- C.showDevTools(window)
- }
+func (w *macosWebviewWindow) openDevTools() {
+ C.openDevTools(w.nsWindow)
}
func (w *macosWebviewWindow) enableDevTools() {
diff --git a/v3/pkg/application/webview_window_darwin_production.go b/v3/pkg/application/webview_window_darwin_production.go
index e0a5576e5ac..96e2de74ce9 100644
--- a/v3/pkg/application/webview_window_darwin_production.go
+++ b/v3/pkg/application/webview_window_darwin_production.go
@@ -3,3 +3,4 @@
package application
func (w *macosWebviewWindow) enableDevTools() {}
+func (w *macosWebviewWindow) openDevTools() {}
diff --git a/v3/pkg/application/webview_window_linux.go b/v3/pkg/application/webview_window_linux.go
index 748d8a6a40e..a1a171e1b6e 100644
--- a/v3/pkg/application/webview_window_linux.go
+++ b/v3/pkg/application/webview_window_linux.go
@@ -2,15 +2,16 @@
package application
+import "C"
import (
"fmt"
+
"github.com/wailsapp/wails/v3/internal/assetserver"
"github.com/wailsapp/wails/v3/internal/capabilities"
+ "github.com/wailsapp/wails/v3/internal/runtime"
"github.com/wailsapp/wails/v3/pkg/events"
)
-var showDevTools = func(window pointer) {}
-
type dragInfo struct {
XRoot int
YRoot int
@@ -19,44 +20,37 @@ type dragInfo struct {
}
type linuxWebviewWindow struct {
- id uint
- application pointer
- window pointer
- webview pointer
- parent *WebviewWindow
- menubar pointer
- vbox pointer
- menu *Menu
- accels pointer
- lastWidth int
- lastHeight int
- drag dragInfo
+ id uint
+ application pointer
+ window pointer
+ webview pointer
+ parent *WebviewWindow
+ menubar pointer
+ vbox pointer
+ menu *Menu
+ accels pointer
+ lastWidth int
+ lastHeight int
+ drag dragInfo
+ lastX, lastY int
+ gtkmenu pointer
}
var (
registered bool = false // avoid 'already registered message' about 'wails://'
)
-func (w *linuxWebviewWindow) startDrag() error {
- windowStartDrag(w.window, w.drag.MouseButton, w.drag.XRoot, w.drag.YRoot, w.drag.DragTime)
- return nil
-}
-
func (w *linuxWebviewWindow) endDrag(button uint, x, y int) {
w.drag.XRoot = 0.0
w.drag.YRoot = 0.0
w.drag.DragTime = 0
}
-func (w *linuxWebviewWindow) enableDND() {
- windowEnableDND(w.parent.id, w.webview)
-}
-
func (w *linuxWebviewWindow) connectSignals() {
cb := func(e events.WindowEventType) {
w.parent.emit(e)
}
- windowSetupSignalHandlers(w.parent.id, w.window, w.webview, cb)
+ w.setupSignalHandlers(cb)
}
func (w *linuxWebviewWindow) openContextMenu(menu *Menu, data *ContextMenuData) {
@@ -70,109 +64,44 @@ func (w *linuxWebviewWindow) openContextMenu(menu *Menu, data *ContextMenuData)
}
native := ctxMenu.menu.impl.(*linuxMenu).native
- contextMenuShow(w.window, native, data)
-}
-
-func (w *linuxWebviewWindow) getZoom() float64 {
- return windowZoom(w.webview)
-}
-
-func (w *linuxWebviewWindow) setZoom(zoom float64) {
- windowZoomSet(w.webview, zoom)
-}
-
-func (w *linuxWebviewWindow) setFrameless(frameless bool) {
- windowSetFrameless(w.window, frameless)
-}
-
-func (w *linuxWebviewWindow) getScreen() (*Screen, error) {
- mx, my, width, height, scale := windowGetCurrentMonitorGeometry(w.window)
- return &Screen{
- ID: fmt.Sprintf("%d", w.id), // A unique identifier for the display
- Name: w.parent.Name(), // The name of the display
- Scale: float32(scale), // The scale factor of the display
- X: mx, // The x-coordinate of the top-left corner of the rectangle
- Y: my, // The y-coordinate of the top-left corner of the rectangle
- Size: Size{Width: width, Height: height}, // The size of the display
- Bounds: Rect{}, // The bounds of the display
- WorkArea: Rect{}, // The work area of the display
- IsPrimary: false, // Whether this is the primary display
- Rotation: 0.0, // The rotation of the display
- }, nil
+ w.contextMenuShow(native, data)
}
func (w *linuxWebviewWindow) focus() {
- windowPresent(w.window)
-}
-
-func (w *linuxWebviewWindow) show() {
- windowShow(w.window)
-}
-
-func (w *linuxWebviewWindow) hide() {
- windowHide(w.window)
+ w.present()
}
func (w *linuxWebviewWindow) isNormal() bool {
return !w.isMinimised() && !w.isMaximised() && !w.isFullscreen()
}
-func (w *linuxWebviewWindow) isVisible() bool {
- return windowIsVisible(w.window)
+func (w *linuxWebviewWindow) setCloseButtonEnabled(enabled bool) {
+ // C.enableCloseButton(w.nsWindow, C.bool(enabled))
}
func (w *linuxWebviewWindow) setFullscreenButtonEnabled(enabled bool) {
- // C.setFullscreenButtonEnabled(w.nsWindow, C.bool(enabled))
- fmt.Println("setFullscreenButtonEnabled - not implemented")
+ // Not implemented
}
-func (w *linuxWebviewWindow) disableSizeConstraints() {
- x, y, width, height, scale := windowGetCurrentMonitorGeometry(w.window)
- w.setMinMaxSize(x, y, width*scale, height*scale)
+func (w *linuxWebviewWindow) setMinimiseButtonEnabled(enabled bool) {
+ //C.enableMinimiseButton(w.nsWindow, C.bool(enabled))
}
-func (w *linuxWebviewWindow) unfullscreen() {
- windowUnfullscreen(w.window)
- w.unmaximise()
+func (w *linuxWebviewWindow) setMaximiseButtonEnabled(enabled bool) {
+ //C.enableMaximiseButton(w.nsWindow, C.bool(enabled))
}
-func (w *linuxWebviewWindow) fullscreen() {
- w.maximise()
- w.lastWidth, w.lastHeight = w.size()
- x, y, width, height, scale := windowGetCurrentMonitorGeometry(w.window)
- if x == -1 && y == -1 && width == -1 && height == -1 {
- return
- }
- w.setMinMaxSize(0, 0, width*scale, height*scale)
- w.setSize(width*scale, height*scale)
- windowFullscreen(w.window)
- w.setRelativePosition(0, 0)
+func (w *linuxWebviewWindow) disableSizeConstraints() {
+ x, y, width, height, scale := w.getCurrentMonitorGeometry()
+ w.setMinMaxSize(x, y, width*scale, height*scale)
}
func (w *linuxWebviewWindow) unminimise() {
- windowPresent(w.window)
-}
-
-func (w *linuxWebviewWindow) unmaximise() {
- windowUnmaximize(w.window)
-}
-
-func (w *linuxWebviewWindow) maximise() {
- windowMaximize(w.window)
-}
-
-func (w *linuxWebviewWindow) minimise() {
- windowMinimize(w.window)
-}
-
-func (w *linuxWebviewWindow) flash(enabled bool) {
- // Not supported on linux
+ w.present()
}
func (w *linuxWebviewWindow) on(eventID uint) {
- // Don't think this is correct!
- // GTK Events are strings
- fmt.Println("on()", eventID)
+ // TODO: Test register/unregister listener for linux events
//C.registerListener(C.uint(eventID))
}
@@ -184,58 +113,22 @@ func (w *linuxWebviewWindow) windowZoom() {
w.zoom() // FIXME> This should be removed
}
-func (w *linuxWebviewWindow) close() {
- windowClose(w.window)
-}
-
-func (w *linuxWebviewWindow) zoomIn() {
- windowZoomIn(w.webview)
-}
-
-func (w *linuxWebviewWindow) zoomOut() {
- windowZoomOut(w.webview)
-}
-
-func (w *linuxWebviewWindow) zoomReset() {
- windowZoomSet(w.webview, 1.0)
-}
-
-func (w *linuxWebviewWindow) reload() {
- windowReload(w.webview, "wails://")
-}
-
func (w *linuxWebviewWindow) forceReload() {
w.reload()
}
func (w *linuxWebviewWindow) center() {
- x, y, width, height, _ := windowGetCurrentMonitorGeometry(w.window)
+ x, y, width, height, _ := w.getCurrentMonitorGeometry()
if x == -1 && y == -1 && width == -1 && height == -1 {
return
}
- windowWidth, windowHeight := windowGetSize(w.window)
+ windowWidth, windowHeight := w.size()
- newX := ((width - int(windowWidth)) / 2) + x
- newY := ((height - int(windowHeight)) / 2) + y
+ newX := ((width - windowWidth) / 2) + x
+ newY := ((height - windowHeight) / 2) + y
// Place the window at the center of the monitor
- windowMove(w.window, newX, newY)
-}
-
-func (w *linuxWebviewWindow) isMinimised() bool {
- return windowIsMinimized(w.window)
-}
-
-func (w *linuxWebviewWindow) isMaximised() bool {
- return windowIsMaximized(w.window)
-}
-
-func (w *linuxWebviewWindow) isFocused() bool {
- return windowIsFocused(w.window)
-}
-
-func (w *linuxWebviewWindow) isFullscreen() bool {
- return windowIsFullscreen(w.window)
+ w.move(newX, newY)
}
func (w *linuxWebviewWindow) restore() {
@@ -243,50 +136,25 @@ func (w *linuxWebviewWindow) restore() {
// FIXME: never called! - remove from webviewImpl interface
}
-func (w *linuxWebviewWindow) execJS(js string) {
- windowExecJS(w.webview, js)
-}
-
-func (w *linuxWebviewWindow) setURL(uri string) {
- windowSetURL(w.webview, uri)
-}
-
-func (w *linuxWebviewWindow) setAlwaysOnTop(alwaysOnTop bool) {
- windowSetKeepAbove(w.window, alwaysOnTop)
-}
-
func newWindowImpl(parent *WebviewWindow) *linuxWebviewWindow {
// (*C.struct__GtkWidget)(m.native)
//var menubar *C.struct__GtkWidget
- return &linuxWebviewWindow{
+ result := &linuxWebviewWindow{
application: getNativeApplication().application,
parent: parent,
// menubar: menubar,
}
-}
-
-func (w *linuxWebviewWindow) setTitle(title string) {
- if !w.parent.options.Frameless {
- windowSetTitle(w.window, title)
- }
-}
-
-func (w *linuxWebviewWindow) setSize(width, height int) {
- windowResize(w.window, width, height)
+ return result
}
func (w *linuxWebviewWindow) setMinMaxSize(minWidth, minHeight, maxWidth, maxHeight int) {
- if minWidth == 0 {
- minWidth = -1
- }
- if minHeight == 0 {
- minHeight = -1
- }
+ // Get current screen for window
+ _, _, monitorwidth, monitorheight, _ := w.getCurrentMonitorGeometry()
if maxWidth == 0 {
- maxWidth = -1
+ maxWidth = monitorwidth
}
if maxHeight == 0 {
- maxHeight = -1
+ maxHeight = monitorheight
}
windowSetGeometryHints(w.window, minWidth, minHeight, maxWidth, maxHeight)
}
@@ -299,25 +167,9 @@ func (w *linuxWebviewWindow) setMaxSize(width, height int) {
w.setMinMaxSize(w.parent.options.MinWidth, w.parent.options.MinHeight, width, height)
}
-func (w *linuxWebviewWindow) setResizable(resizable bool) {
- windowSetResizable(w.window, resizable)
-}
-
-func (w *linuxWebviewWindow) showDevTools() {
- windowShowDevTools(w.webview)
-}
-
-func (w *linuxWebviewWindow) toggleDevTools() {
- showDevTools(w.webview)
-}
-
-func (w *linuxWebviewWindow) size() (int, int) {
- return windowGetSize(w.window)
-}
-
func (w *linuxWebviewWindow) setRelativePosition(x, y int) {
- mx, my, _, _, _ := windowGetCurrentMonitorGeometry(w.window)
- windowMove(w.window, x+mx, y+my)
+ mx, my, _, _, _ := w.getCurrentMonitorGeometry()
+ w.move(x+mx, y+my)
}
func (w *linuxWebviewWindow) width() int {
@@ -332,13 +184,7 @@ func (w *linuxWebviewWindow) height() int {
func (w *linuxWebviewWindow) setAbsolutePosition(x int, y int) {
// Set the window's absolute position
- windowMove(w.window, x, y)
-}
-
-func (w *linuxWebviewWindow) absolutePosition() (int, int) {
- var x, y int
- x, y = windowGetAbsolutePosition(w.window)
- return x, y
+ w.move(x, y)
}
func (w *linuxWebviewWindow) run() {
@@ -351,8 +197,19 @@ func (w *linuxWebviewWindow) run() {
app := getNativeApplication()
- menu := app.getApplicationMenu()
- w.window, w.webview, w.vbox = windowNew(app.application, menu, w.parent.id, 1)
+ var menu = w.menu
+ if menu == nil && globalApplication.ApplicationMenu != nil {
+ menu = globalApplication.ApplicationMenu.clone()
+ }
+ if menu != nil {
+ InvokeSync(func() {
+ menu.Update()
+ })
+ w.menu = menu
+ w.gtkmenu = (menu.impl).(*linuxMenu).native
+ }
+
+ w.window, w.webview, w.vbox = windowNew(app.application, w.gtkmenu, w.parent.id, w.parent.options.Linux.WebviewGpuPolicy)
app.registerWindow(w.window, w.parent.id) // record our mapping
w.connectSignals()
if w.parent.options.EnableDragAndDrop {
@@ -385,7 +242,6 @@ func (w *linuxWebviewWindow) run() {
if w.parent.options.X != 0 || w.parent.options.Y != 0 {
w.setRelativePosition(w.parent.options.X, w.parent.options.Y)
} else {
- fmt.Println("attempting to set in the center")
w.center()
}
switch w.parent.options.StartState {
@@ -395,17 +251,20 @@ func (w *linuxWebviewWindow) run() {
w.minimise()
case WindowStateFullscreen:
w.fullscreen()
+ case WindowStateNormal:
}
+ //if w.parent.options.IgnoreMouseEvents {
+ // windowIgnoreMouseEvents(w.window, w.webview, true)
+ //}
+
startURL, err := assetserver.GetStartURL(w.parent.options.URL)
if err != nil {
globalApplication.fatal(err.Error())
}
w.setURL(startURL)
- // We need to wait for the HTML to load before we can execute the javascript
- // FIXME: What event is this? DomReady?
- w.parent.On(events.Mac.WebViewDidFinishNavigation, func(_ *WindowEvent) {
+ w.parent.On(events.Linux.WindowLoadChanged, func(_ *WindowEvent) {
if w.parent.options.JS != "" {
w.execJS(w.parent.options.JS)
}
@@ -414,6 +273,18 @@ func (w *linuxWebviewWindow) run() {
w.execJS(js)
}
})
+ w.parent.On(events.Linux.WindowFocusIn, func(e *WindowEvent) {
+ w.parent.emit(events.Common.WindowFocus)
+ })
+ w.parent.On(events.Linux.WindowFocusOut, func(e *WindowEvent) {
+ w.parent.emit(events.Common.WindowLostFocus)
+ })
+ w.parent.On(events.Linux.WindowDeleteEvent, func(e *WindowEvent) {
+ w.parent.emit(events.Common.WindowClosing)
+ })
+ w.parent.RegisterHook(events.Linux.WindowLoadChanged, func(e *WindowEvent) {
+ w.execJS(runtime.Core())
+ })
if w.parent.options.HTML != "" {
w.setHTML(w.parent.options.HTML)
}
@@ -426,40 +297,13 @@ func (w *linuxWebviewWindow) run() {
}
}
if w.parent.options.DevToolsEnabled || globalApplication.isDebugMode {
- w.toggleDevTools()
+ w.enableDevTools()
if w.parent.options.OpenInspectorOnStartup {
- w.showDevTools()
+ w.openDevTools()
}
}
}
-func (w *linuxWebviewWindow) setTransparent() {
- windowSetTransparent(w.window)
-}
-
-func (w *linuxWebviewWindow) setBackgroundColour(colour RGBA) {
- windowSetBackgroundColour(w.vbox, w.webview, colour)
-}
-
-func (w *linuxWebviewWindow) relativePosition() (int, int) {
- var x, y int
- x, y = windowGetRelativePosition(w.window)
- return x, y
-}
-
-func (w *linuxWebviewWindow) destroy() {
- w.parent.markAsDestroyed()
- windowDestroy(w.window)
-}
-
-func (w *linuxWebviewWindow) setEnabled(enabled bool) {
- widgetSetSensitive(w.window, enabled)
-}
-
-func (w *linuxWebviewWindow) setHTML(html string) {
- windowSetHTML(w.webview, html)
-}
-
func (w *linuxWebviewWindow) startResize(border string) error {
// FIXME: what do we need to do here?
return nil
diff --git a/v3/pkg/application/webview_window_linux_dev.go b/v3/pkg/application/webview_window_linux_dev.go
new file mode 100644
index 00000000000..3f34a6e64b1
--- /dev/null
+++ b/v3/pkg/application/webview_window_linux_dev.go
@@ -0,0 +1,11 @@
+//go:build linux && !production
+
+package application
+
+func (w *linuxWebviewWindow) openDevTools() {
+ openDevTools(w.webview)
+}
+
+func (w *linuxWebviewWindow) enableDevTools() {
+ enableDevTools(w.webview)
+}
diff --git a/v3/pkg/application/webview_window_linux_devtools.go b/v3/pkg/application/webview_window_linux_devtools.go
deleted file mode 100644
index eb883ae24fc..00000000000
--- a/v3/pkg/application/webview_window_linux_devtools.go
+++ /dev/null
@@ -1,9 +0,0 @@
-//go:build linux && !production
-
-package application
-
-func init() {
- showDevTools = func(wv pointer) {
- windowToggleDevTools(wv)
- }
-}
diff --git a/v3/pkg/application/webview_window_linux_production.go b/v3/pkg/application/webview_window_linux_production.go
new file mode 100644
index 00000000000..c65520b8ee3
--- /dev/null
+++ b/v3/pkg/application/webview_window_linux_production.go
@@ -0,0 +1,7 @@
+//go:build linux && production && !devtools
+
+package application
+
+func (w *linuxWebviewWindow) openDevTools() {}
+
+func (w *linuxWebviewWindow) enableDevTools() {}
diff --git a/v3/pkg/application/webview_window_options.go b/v3/pkg/application/webview_window_options.go
new file mode 100644
index 00000000000..d84bce87443
--- /dev/null
+++ b/v3/pkg/application/webview_window_options.go
@@ -0,0 +1,525 @@
+package application
+
+import (
+ "github.com/leaanthony/u"
+ "github.com/wailsapp/wails/v3/pkg/events"
+)
+
+type WindowState int
+
+const (
+ WindowStateNormal WindowState = iota
+ WindowStateMinimised
+ WindowStateMaximised
+ WindowStateFullscreen
+)
+
+type WebviewWindowOptions struct {
+ // Name is a unique identifier that can be given to a window.
+ Name string
+
+ // Title is the title of the window.
+ Title string
+
+ // Width is the starting width of the window.
+ Width int
+
+ // Height is the starting height of the window.
+ Height int
+
+ // AlwaysOnTop will make the window float above other windows.
+ AlwaysOnTop bool
+
+ // URL is the URL to load in the window.
+ URL string
+
+ // DisableResize will disable the ability to resize the window.
+ DisableResize bool
+
+ // Frameless will remove the window frame.
+ Frameless bool
+
+ // MinWidth is the minimum width of the window.
+ MinWidth int
+
+ // MinHeight is the minimum height of the window.
+ MinHeight int
+
+ // MaxWidth is the maximum width of the window.
+ MaxWidth int
+
+ // MaxHeight is the maximum height of the window.
+ MaxHeight int
+
+ // StartState indicates the state of the window when it is first shown.
+ // Default: WindowStateNormal
+ StartState WindowState
+
+ // Centered will center the window on the screen.
+ Centered bool
+
+ // BackgroundType is the type of background to use for the window.
+ // Default: BackgroundTypeSolid
+ BackgroundType BackgroundType
+
+ // BackgroundColour is the colour to use for the window background.
+ BackgroundColour RGBA
+
+ // HTML is the HTML to load in the window.
+ HTML string
+
+ // JS is the JavaScript to load in the window.
+ JS string
+
+ // CSS is the CSS to load in the window.
+ CSS string
+
+ // X is the starting X position of the window.
+ X int
+
+ // Y is the starting Y position of the window.
+ Y int
+
+ // TransparentTitlebar will make the titlebar transparent.
+ // TODO: Move to mac window options
+ FullscreenButtonEnabled bool
+
+ // Hidden will hide the window when it is first created.
+ Hidden bool
+
+ // Zoom is the zoom level of the window.
+ Zoom float64
+
+ // ZoomControlEnabled will enable the zoom control.
+ ZoomControlEnabled bool
+
+ // EnableDragAndDrop will enable drag and drop.
+ EnableDragAndDrop bool
+
+ // OpenInspectorOnStartup will open the inspector when the window is first shown.
+ OpenInspectorOnStartup bool
+
+ // Mac options
+ Mac MacWindow
+
+ // Windows options
+ Windows WindowsWindow
+
+ // Linux options
+ Linux LinuxWindow
+
+ // ShouldClose is called when the window is about to close.
+ // Return true to allow the window to close, or false to prevent it from closing.
+ ShouldClose func(window *WebviewWindow) bool
+
+ // If true, the window's devtools will be available (default true in builds without the `production` build tag)
+ DevToolsEnabled bool
+
+ // If true, the window's default context menu will be disabled (default false)
+ DefaultContextMenuDisabled bool
+
+ // KeyBindings is a map of key bindings to functions
+ KeyBindings map[string]func(window *WebviewWindow)
+
+ // IgnoreMouseEvents will ignore mouse events in the window (Windows + Mac only)
+ IgnoreMouseEvents bool
+}
+
+var WebviewWindowDefaults = &WebviewWindowOptions{
+ Title: "",
+ Width: 800,
+ Height: 600,
+ URL: "",
+ BackgroundColour: RGBA{
+ Red: 255,
+ Green: 255,
+ Blue: 255,
+ Alpha: 255,
+ },
+}
+
+type RGBA struct {
+ Red, Green, Blue, Alpha uint8
+}
+
+func NewRGBA(red, green, blue, alpha uint8) RGBA {
+ return RGBA{
+ Red: red,
+ Green: green,
+ Blue: blue,
+ Alpha: alpha,
+ }
+}
+
+func NewRGB(red, green, blue uint8) RGBA {
+ return RGBA{
+ Red: red,
+ Green: green,
+ Blue: blue,
+ Alpha: 255,
+ }
+}
+
+type BackgroundType int
+
+const (
+ BackgroundTypeSolid BackgroundType = iota
+ BackgroundTypeTransparent
+ BackgroundTypeTranslucent
+)
+
+/******* Windows Options *******/
+
+type BackdropType int32
+type DragEffect int32
+
+const (
+ // DragEffectNone is used to indicate that the drop target cannot accept the data.
+ DragEffectNone DragEffect = 1
+ // DragEffectCopy is used to indicate that the data is copied to the drop target.
+ DragEffectCopy DragEffect = 2
+ // DragEffectMove is used to indicate that the data is removed from the drag source.
+ DragEffectMove DragEffect = 3
+ // DragEffectLink is used to indicate that a link to the original data is established.
+ DragEffectLink DragEffect = 4
+ // DragEffectScroll is used to indicate that the target can be scrolled while dragging to locate a drop position that is not currently visible in the target.
+
+)
+
+const (
+ Auto BackdropType = 0
+ None BackdropType = 1
+ Mica BackdropType = 2
+ Acrylic BackdropType = 3
+ Tabbed BackdropType = 4
+)
+
+type CoreWebView2PermissionKind uint32
+
+const (
+ CoreWebView2PermissionKindUnknownPermission CoreWebView2PermissionKind = iota
+ CoreWebView2PermissionKindMicrophone
+ CoreWebView2PermissionKindCamera
+ CoreWebView2PermissionKindGeolocation
+ CoreWebView2PermissionKindNotifications
+ CoreWebView2PermissionKindOtherSensors
+ CoreWebView2PermissionKindClipboardRead
+)
+
+type CoreWebView2PermissionState uint32
+
+const (
+ CoreWebView2PermissionStateDefault CoreWebView2PermissionState = iota
+ CoreWebView2PermissionStateAllow
+ CoreWebView2PermissionStateDeny
+)
+
+type WindowsWindow struct {
+ // Select the type of translucent backdrop. Requires Windows 11 22621 or later.
+ // Only used when window's `BackgroundType` is set to `BackgroundTypeTranslucent`.
+ // Default: Auto
+ BackdropType BackdropType
+
+ // Disable the icon in the titlebar
+ // Default: false
+ DisableIcon bool
+
+ // Theme (Dark / Light / SystemDefault)
+ // Default: SystemDefault - The application will follow system theme changes.
+ Theme Theme
+
+ // Specify custom colours to use for dark/light mode
+ // Default: nil
+ CustomTheme *ThemeSettings
+
+ // Disable all window decorations in Frameless mode, which means no "Aero Shadow" and no "Rounded Corner" will be shown.
+ // "Rounded Corners" are only available on Windows 11.
+ // Default: false
+ DisableFramelessWindowDecorations bool
+
+ // WindowMask is used to set the window shape. Use a PNG with an alpha channel to create a custom shape.
+ // Default: nil
+ WindowMask []byte
+
+ // WindowMaskDraggable is used to make the window draggable by clicking on the window mask.
+ // Default: false
+ WindowMaskDraggable bool
+
+ // WebviewGpuIsDisabled is used to enable / disable GPU acceleration for the webview
+ // Default: false
+ WebviewGpuIsDisabled bool
+
+ // ResizeDebounceMS is the amount of time to debounce redraws of webview2
+ // when resizing the window
+ // Default: 0
+ ResizeDebounceMS uint16
+
+ // Disable the menu bar for this window
+ // Default: false
+ DisableMenu bool
+
+ // Event mapping for the window. This allows you to define a translation from one event to another.
+ // Default: nil
+ EventMapping map[events.WindowEventType]events.WindowEventType
+
+ // HiddenOnTaskbar hides the window from the taskbar
+ // Default: false
+ HiddenOnTaskbar bool
+
+ // EnableSwipeGestures enables swipe gestures for the window
+ // Default: false
+ EnableSwipeGestures bool
+
+ // EnableFraudulentWebsiteWarnings will enable warnings for fraudulent websites.
+ // Default: false
+ EnableFraudulentWebsiteWarnings bool
+
+ // Menu is the menu to use for the window.
+ Menu *Menu
+
+ // Drag Cursor Effects
+ OnEnterEffect DragEffect
+ OnOverEffect DragEffect
+
+ // Permissions map for WebView2. If empty, default permissions will be granted.
+ Permissions map[CoreWebView2PermissionKind]CoreWebView2PermissionState
+
+ // Disables the minimise button
+ DisableMinimiseButton bool
+
+ // Disables the maximise button
+ DisableMaximiseButton bool
+}
+
+type Theme int
+
+const (
+ // SystemDefault will use whatever the system theme is. The application will follow system theme changes.
+ SystemDefault Theme = 0
+ // Dark Mode
+ Dark Theme = 1
+ // Light Mode
+ Light Theme = 2
+)
+
+// ThemeSettings defines custom colours to use in dark or light mode.
+// They may be set using the hex values: 0x00BBGGRR
+type ThemeSettings struct {
+ DarkModeTitleBar int32
+ DarkModeTitleBarInactive int32
+ DarkModeTitleText int32
+ DarkModeTitleTextInactive int32
+ DarkModeBorder int32
+ DarkModeBorderInactive int32
+ LightModeTitleBar int32
+ LightModeTitleBarInactive int32
+ LightModeTitleText int32
+ LightModeTitleTextInactive int32
+ LightModeBorder int32
+ LightModeBorderInactive int32
+}
+
+/****** Mac Options *******/
+
+// MacBackdrop is the backdrop type for macOS
+type MacBackdrop int
+
+const (
+ // MacBackdropNormal - The default value. The window will have a normal opaque background.
+ MacBackdropNormal MacBackdrop = iota
+ // MacBackdropTransparent - The window will have a transparent background, with the content underneath it being visible
+ MacBackdropTransparent
+ // MacBackdropTranslucent - The window will have a translucent background, with the content underneath it being "fuzzy" or "frosted"
+ MacBackdropTranslucent
+)
+
+// MacToolbarStyle is the style of toolbar for macOS
+type MacToolbarStyle int
+
+const (
+ // MacToolbarStyleAutomatic - The default value. The style will be determined by the window's given configuration
+ MacToolbarStyleAutomatic MacToolbarStyle = iota
+ // MacToolbarStyleExpanded - The toolbar will appear below the window title
+ MacToolbarStyleExpanded
+ // MacToolbarStylePreference - The toolbar will appear below the window title and the items in the toolbar will attempt to have equal widths when possible
+ MacToolbarStylePreference
+ // MacToolbarStyleUnified - The window title will appear inline with the toolbar when visible
+ MacToolbarStyleUnified
+ // MacToolbarStyleUnifiedCompact - Same as MacToolbarStyleUnified, but with reduced margins in the toolbar allowing more focus to be on the contents of the window
+ MacToolbarStyleUnifiedCompact
+)
+
+// MacWindow contains macOS specific options for Webview Windows
+type MacWindow struct {
+ // Backdrop is the backdrop type for the window
+ Backdrop MacBackdrop
+ // DisableShadow will disable the window shadow
+ DisableShadow bool
+ // TitleBar contains options for the Mac titlebar
+ TitleBar MacTitleBar
+ // Appearance is the appearance type for the window
+ Appearance MacAppearanceType
+ // InvisibleTitleBarHeight defines the height of an invisible titlebar which responds to dragging
+ InvisibleTitleBarHeight int
+ // Maps events from platform specific to common event types
+ EventMapping map[events.WindowEventType]events.WindowEventType
+
+ // EnableFraudulentWebsiteWarnings will enable warnings for fraudulent websites.
+ // Default: false
+ EnableFraudulentWebsiteWarnings bool
+
+ // WebviewPreferences contains preferences for the webview
+ WebviewPreferences MacWebviewPreferences
+
+ // Disables the minimise button
+ DisableMinimiseButton bool
+
+ // Disables the maximise button
+ DisableMaximiseButton bool
+
+ // Disables the close button
+ DisableCloseButton bool
+}
+
+// MacWebviewPreferences contains preferences for the Mac webview
+type MacWebviewPreferences struct {
+ // TabFocusesLinks will enable tabbing to links
+ TabFocusesLinks u.Bool
+ // TextInteractionEnabled will enable text interaction
+ TextInteractionEnabled u.Bool
+ // FullscreenEnabled will enable fullscreen
+ FullscreenEnabled u.Bool
+}
+
+// MacTitleBar contains options for the Mac titlebar
+type MacTitleBar struct {
+ // AppearsTransparent will make the titlebar transparent
+ AppearsTransparent bool
+ // Hide will hide the titlebar
+ Hide bool
+ // HideTitle will hide the title
+ HideTitle bool
+ // FullSizeContent will extend the window content to the full size of the window
+ FullSizeContent bool
+ // UseToolbar will use a toolbar instead of a titlebar
+ UseToolbar bool
+ // HideToolbarSeparator will hide the toolbar separator
+ HideToolbarSeparator bool
+ // ShowToolbarWhenFullscreen will keep the toolbar visible when the window is in fullscreen mode
+ ShowToolbarWhenFullscreen bool
+ // ToolbarStyle is the style of toolbar to use
+ ToolbarStyle MacToolbarStyle
+}
+
+// MacTitleBarDefault results in the default Mac MacTitleBar
+var MacTitleBarDefault = MacTitleBar{
+ AppearsTransparent: false,
+ Hide: false,
+ HideTitle: false,
+ FullSizeContent: false,
+ UseToolbar: false,
+ HideToolbarSeparator: false,
+}
+
+// Credit: Comments from Electron site
+
+// MacTitleBarHidden results in a hidden title bar and a full size content window,
+// yet the title bar still has the standard window controls (“traffic lights”)
+// in the top left.
+var MacTitleBarHidden = MacTitleBar{
+ AppearsTransparent: true,
+ Hide: false,
+ HideTitle: true,
+ FullSizeContent: true,
+ UseToolbar: false,
+ HideToolbarSeparator: false,
+}
+
+// MacTitleBarHiddenInset results in a hidden title bar with an alternative look where
+// the traffic light buttons are slightly more inset from the window edge.
+var MacTitleBarHiddenInset = MacTitleBar{
+ AppearsTransparent: true,
+ Hide: false,
+ HideTitle: true,
+ FullSizeContent: true,
+ UseToolbar: true,
+ HideToolbarSeparator: true,
+}
+
+// MacTitleBarHiddenInsetUnified results in a hidden title bar with an alternative look where
+// the traffic light buttons are even more inset from the window edge.
+var MacTitleBarHiddenInsetUnified = MacTitleBar{
+ AppearsTransparent: true,
+ Hide: false,
+ HideTitle: true,
+ FullSizeContent: true,
+ UseToolbar: true,
+ HideToolbarSeparator: true,
+ ToolbarStyle: MacToolbarStyleUnified,
+}
+
+// MacAppearanceType is a type of Appearance for Cocoa windows
+type MacAppearanceType string
+
+const (
+ // DefaultAppearance uses the default system value
+ DefaultAppearance MacAppearanceType = ""
+ // NSAppearanceNameAqua - The standard light system appearance.
+ NSAppearanceNameAqua MacAppearanceType = "NSAppearanceNameAqua"
+ // NSAppearanceNameDarkAqua - The standard dark system appearance.
+ NSAppearanceNameDarkAqua MacAppearanceType = "NSAppearanceNameDarkAqua"
+ // NSAppearanceNameVibrantLight - The light vibrant appearance
+ NSAppearanceNameVibrantLight MacAppearanceType = "NSAppearanceNameVibrantLight"
+ // NSAppearanceNameAccessibilityHighContrastAqua - A high-contrast version of the standard light system appearance.
+ NSAppearanceNameAccessibilityHighContrastAqua MacAppearanceType = "NSAppearanceNameAccessibilityHighContrastAqua"
+ // NSAppearanceNameAccessibilityHighContrastDarkAqua - A high-contrast version of the standard dark system appearance.
+ NSAppearanceNameAccessibilityHighContrastDarkAqua MacAppearanceType = "NSAppearanceNameAccessibilityHighContrastDarkAqua"
+ // NSAppearanceNameAccessibilityHighContrastVibrantLight - A high-contrast version of the light vibrant appearance.
+ NSAppearanceNameAccessibilityHighContrastVibrantLight MacAppearanceType = "NSAppearanceNameAccessibilityHighContrastVibrantLight"
+ // NSAppearanceNameAccessibilityHighContrastVibrantDark - A high-contrast version of the dark vibrant appearance.
+ NSAppearanceNameAccessibilityHighContrastVibrantDark MacAppearanceType = "NSAppearanceNameAccessibilityHighContrastVibrantDark"
+)
+
+/******** Linux Options ********/
+
+// WebviewGpuPolicy values used for determining the webview's hardware acceleration policy.
+type WebviewGpuPolicy int
+
+const (
+ // WebviewGpuPolicyAlways Hardware acceleration is always enabled.
+ WebviewGpuPolicyAlways WebviewGpuPolicy = iota
+ // WebviewGpuPolicyOnDemand Hardware acceleration is enabled/disabled as request by web contents.
+ WebviewGpuPolicyOnDemand
+ // WebviewGpuPolicyNever Hardware acceleration is always disabled.
+ WebviewGpuPolicyNever
+)
+
+// LinuxWindow specific to Linux windows
+type LinuxWindow struct {
+ // Icon Sets up the icon representing the window. This icon is used when the window is minimized
+ // (also known as iconified).
+ Icon []byte
+
+ // WindowIsTranslucent sets the window's background to transparent when enabled.
+ WindowIsTranslucent bool
+
+ // WebviewGpuPolicy used for determining the hardware acceleration policy for the webview.
+ // - WebviewGpuPolicyAlways
+ // - WebviewGpuPolicyOnDemand
+ // - WebviewGpuPolicyNever
+ //
+ // Due to https://github.com/wailsapp/wails/issues/2977, if options.Linux is nil
+ // in the call to wails.Run(), WebviewGpuPolicy is set by default to WebviewGpuPolicyNever.
+ // Client code may override this behavior by passing a non-nil Options and set
+ // WebviewGpuPolicy as needed.
+ WebviewGpuPolicy WebviewGpuPolicy
+
+ // ProgramName is used to set the program's name for the window manager via GTK's g_set_prgname().
+ //This name should not be localized. [see the docs]
+ //
+ //When a .desktop file is created this value helps with window grouping and desktop icons when the .desktop file's Name
+ //property differs form the executable's filename.
+ //
+ //[see the docs]: https://docs.gtk.org/glib/func.set_prgname.html
+ ProgramName string
+}
diff --git a/v3/pkg/application/webview_window_windows.go b/v3/pkg/application/webview_window_windows.go
index 642feef28f9..5d2e164945c 100644
--- a/v3/pkg/application/webview_window_windows.go
+++ b/v3/pkg/application/webview_window_windows.go
@@ -238,8 +238,12 @@ func (w *windowsWebviewWindow) run() {
w.setSize(options.Width, options.Height)
// Min/max buttons
- w.setStyle(!options.Windows.DisableMinimiseButton, w32.WS_MINIMIZEBOX)
- w.setStyle(!options.Windows.DisableMaximiseButton, w32.WS_MAXIMIZEBOX)
+ if !options.Windows.DisableMinimiseButton {
+ w.setMinimiseButtonEnabled(false)
+ }
+ if !options.Windows.DisableMaximiseButton {
+ w.setMaximiseButtonEnabled(false)
+ }
// Register the window with the application
getNativeApplication().registerWindow(w)
@@ -1626,6 +1630,14 @@ func (w *windowsWebviewWindow) processMessageWithAdditionalObjects(message strin
}
}
+func (w *windowsWebviewWindow) setMaximiseButtonEnabled(enabled bool) {
+ w.setStyle(enabled, w32.WS_MINIMIZEBOX)
+}
+
+func (w *windowsWebviewWindow) setMinimiseButtonEnabled(enabled bool) {
+ w.setStyle(enabled, w32.WS_MAXIMIZEBOX)
+}
+
func ScaleWithDPI(pixels int, dpi uint) int {
return (pixels * int(dpi)) / 96
}
diff --git a/v3/pkg/application/webview_window_windows_devtools.go b/v3/pkg/application/webview_window_windows_devtools.go
index 54a799bf94e..2ee7ea1a34b 100644
--- a/v3/pkg/application/webview_window_windows_devtools.go
+++ b/v3/pkg/application/webview_window_windows_devtools.go
@@ -4,7 +4,7 @@ package application
import "github.com/wailsapp/go-webview2/pkg/edge"
-func (w *windowsWebviewWindow) toggleDevTools() {
+func (w *windowsWebviewWindow) openDevTools() {
w.chromium.OpenDevToolsWindow()
}
diff --git a/v3/pkg/application/webview_window_windows_production.go b/v3/pkg/application/webview_window_windows_production.go
index 0dd2fff457b..55a9d2ad25e 100644
--- a/v3/pkg/application/webview_window_windows_production.go
+++ b/v3/pkg/application/webview_window_windows_production.go
@@ -4,7 +4,7 @@ package application
import "github.com/wailsapp/go-webview2/pkg/edge"
-func (w *windowsWebviewWindow) toggleDevTools() {}
+func (w *windowsWebviewWindow) openDevTools() {}
func (w *windowsWebviewWindow) enableDevTools(settings *edge.ICoreWebViewSettings) {
err := settings.PutAreDevToolsEnabled(false)
diff --git a/v3/pkg/application/window.go b/v3/pkg/application/window.go
index 2398cd3682b..303a23df0ab 100644
--- a/v3/pkg/application/window.go
+++ b/v3/pkg/application/window.go
@@ -21,7 +21,7 @@ type Window interface {
DispatchWailsEvent(event *WailsEvent)
EnableSizeConstraints()
Error(message string, args ...any)
- ExecJS(callID, js string)
+ ExecJS(js string)
Focus()
ForceReload()
Fullscreen() Window
@@ -65,7 +65,7 @@ type Window interface {
SetZoom(magnification float64) Window
Show() Window
Size() (width int, height int)
- ToggleDevTools()
+ OpenDevTools()
ToggleFullscreen()
ToggleMaximise()
UnFullscreen()
diff --git a/v3/pkg/events/events.go b/v3/pkg/events/events.go
index 505308c12b8..d3ce4f50cb7 100644
--- a/v3/pkg/events/events.go
+++ b/v3/pkg/events/events.go
@@ -31,27 +31,27 @@ type commonEvents struct {
func newCommonEvents() commonEvents {
return commonEvents{
- ApplicationStarted: 1174,
- WindowMaximise: 1175,
- WindowUnMaximise: 1176,
- WindowFullscreen: 1177,
- WindowUnFullscreen: 1178,
- WindowRestore: 1179,
- WindowMinimise: 1180,
- WindowUnMinimise: 1181,
- WindowClosing: 1182,
- WindowZoom: 1183,
- WindowZoomIn: 1184,
- WindowZoomOut: 1185,
- WindowZoomReset: 1186,
- WindowFocus: 1187,
- WindowLostFocus: 1188,
- WindowShow: 1189,
- WindowHide: 1190,
- WindowDPIChanged: 1191,
- WindowFilesDropped: 1192,
- WindowRuntimeReady: 1193,
- ThemeChanged: 1194,
+ ApplicationStarted: 1179,
+ WindowMaximise: 1180,
+ WindowUnMaximise: 1181,
+ WindowFullscreen: 1182,
+ WindowUnFullscreen: 1183,
+ WindowRestore: 1184,
+ WindowMinimise: 1185,
+ WindowUnMinimise: 1186,
+ WindowClosing: 1187,
+ WindowZoom: 1188,
+ WindowZoomIn: 1189,
+ WindowZoomOut: 1190,
+ WindowZoomReset: 1191,
+ WindowFocus: 1192,
+ WindowLostFocus: 1193,
+ WindowShow: 1194,
+ WindowHide: 1195,
+ WindowDPIChanged: 1196,
+ WindowFilesDropped: 1197,
+ WindowRuntimeReady: 1198,
+ ThemeChanged: 1199,
}
}
@@ -59,11 +59,21 @@ var Linux = newLinuxEvents()
type linuxEvents struct {
SystemThemeChanged ApplicationEventType
+ WindowLoadChanged WindowEventType
+ WindowDeleteEvent WindowEventType
+ WindowFocusIn WindowEventType
+ WindowFocusOut WindowEventType
+ ApplicationStartup ApplicationEventType
}
func newLinuxEvents() linuxEvents {
return linuxEvents{
SystemThemeChanged: 1024,
+ WindowLoadChanged: 1025,
+ WindowDeleteEvent: 1026,
+ WindowFocusIn: 1027,
+ WindowFocusOut: 1028,
+ ApplicationStartup: 1029,
}
}
@@ -198,130 +208,130 @@ type macEvents struct {
func newMacEvents() macEvents {
return macEvents{
- ApplicationDidBecomeActive: 1025,
- ApplicationDidChangeBackingProperties: 1026,
- ApplicationDidChangeEffectiveAppearance: 1027,
- ApplicationDidChangeIcon: 1028,
- ApplicationDidChangeOcclusionState: 1029,
- ApplicationDidChangeScreenParameters: 1030,
- ApplicationDidChangeStatusBarFrame: 1031,
- ApplicationDidChangeStatusBarOrientation: 1032,
- ApplicationDidFinishLaunching: 1033,
- ApplicationDidHide: 1034,
- ApplicationDidResignActiveNotification: 1035,
- ApplicationDidUnhide: 1036,
- ApplicationDidUpdate: 1037,
- ApplicationWillBecomeActive: 1038,
- ApplicationWillFinishLaunching: 1039,
- ApplicationWillHide: 1040,
- ApplicationWillResignActive: 1041,
- ApplicationWillTerminate: 1042,
- ApplicationWillUnhide: 1043,
- ApplicationWillUpdate: 1044,
- ApplicationDidChangeTheme: 1045,
- ApplicationShouldHandleReopen: 1046,
- WindowDidBecomeKey: 1047,
- WindowDidBecomeMain: 1048,
- WindowDidBeginSheet: 1049,
- WindowDidChangeAlpha: 1050,
- WindowDidChangeBackingLocation: 1051,
- WindowDidChangeBackingProperties: 1052,
- WindowDidChangeCollectionBehavior: 1053,
- WindowDidChangeEffectiveAppearance: 1054,
- WindowDidChangeOcclusionState: 1055,
- WindowDidChangeOrderingMode: 1056,
- WindowDidChangeScreen: 1057,
- WindowDidChangeScreenParameters: 1058,
- WindowDidChangeScreenProfile: 1059,
- WindowDidChangeScreenSpace: 1060,
- WindowDidChangeScreenSpaceProperties: 1061,
- WindowDidChangeSharingType: 1062,
- WindowDidChangeSpace: 1063,
- WindowDidChangeSpaceOrderingMode: 1064,
- WindowDidChangeTitle: 1065,
- WindowDidChangeToolbar: 1066,
- WindowDidChangeVisibility: 1067,
- WindowDidDeminiaturize: 1068,
- WindowDidEndSheet: 1069,
- WindowDidEnterFullScreen: 1070,
- WindowDidEnterVersionBrowser: 1071,
- WindowDidExitFullScreen: 1072,
- WindowDidExitVersionBrowser: 1073,
- WindowDidExpose: 1074,
- WindowDidFocus: 1075,
- WindowDidMiniaturize: 1076,
- WindowDidMove: 1077,
- WindowDidOrderOffScreen: 1078,
- WindowDidOrderOnScreen: 1079,
- WindowDidResignKey: 1080,
- WindowDidResignMain: 1081,
- WindowDidResize: 1082,
- WindowDidUpdate: 1083,
- WindowDidUpdateAlpha: 1084,
- WindowDidUpdateCollectionBehavior: 1085,
- WindowDidUpdateCollectionProperties: 1086,
- WindowDidUpdateShadow: 1087,
- WindowDidUpdateTitle: 1088,
- WindowDidUpdateToolbar: 1089,
- WindowDidUpdateVisibility: 1090,
- WindowShouldClose: 1091,
- WindowWillBecomeKey: 1092,
- WindowWillBecomeMain: 1093,
- WindowWillBeginSheet: 1094,
- WindowWillChangeOrderingMode: 1095,
- WindowWillClose: 1096,
- WindowWillDeminiaturize: 1097,
- WindowWillEnterFullScreen: 1098,
- WindowWillEnterVersionBrowser: 1099,
- WindowWillExitFullScreen: 1100,
- WindowWillExitVersionBrowser: 1101,
- WindowWillFocus: 1102,
- WindowWillMiniaturize: 1103,
- WindowWillMove: 1104,
- WindowWillOrderOffScreen: 1105,
- WindowWillOrderOnScreen: 1106,
- WindowWillResignMain: 1107,
- WindowWillResize: 1108,
- WindowWillUnfocus: 1109,
- WindowWillUpdate: 1110,
- WindowWillUpdateAlpha: 1111,
- WindowWillUpdateCollectionBehavior: 1112,
- WindowWillUpdateCollectionProperties: 1113,
- WindowWillUpdateShadow: 1114,
- WindowWillUpdateTitle: 1115,
- WindowWillUpdateToolbar: 1116,
- WindowWillUpdateVisibility: 1117,
- WindowWillUseStandardFrame: 1118,
- MenuWillOpen: 1119,
- MenuDidOpen: 1120,
- MenuDidClose: 1121,
- MenuWillSendAction: 1122,
- MenuDidSendAction: 1123,
- MenuWillHighlightItem: 1124,
- MenuDidHighlightItem: 1125,
- MenuWillDisplayItem: 1126,
- MenuDidDisplayItem: 1127,
- MenuWillAddItem: 1128,
- MenuDidAddItem: 1129,
- MenuWillRemoveItem: 1130,
- MenuDidRemoveItem: 1131,
- MenuWillBeginTracking: 1132,
- MenuDidBeginTracking: 1133,
- MenuWillEndTracking: 1134,
- MenuDidEndTracking: 1135,
- MenuWillUpdate: 1136,
- MenuDidUpdate: 1137,
- MenuWillPopUp: 1138,
- MenuDidPopUp: 1139,
- MenuWillSendActionToItem: 1140,
- MenuDidSendActionToItem: 1141,
- WebViewDidStartProvisionalNavigation: 1142,
- WebViewDidReceiveServerRedirectForProvisionalNavigation: 1143,
- WebViewDidFinishNavigation: 1144,
- WebViewDidCommitNavigation: 1145,
- WindowFileDraggingEntered: 1146,
- WindowFileDraggingPerformed: 1147,
- WindowFileDraggingExited: 1148,
+ ApplicationDidBecomeActive: 1030,
+ ApplicationDidChangeBackingProperties: 1031,
+ ApplicationDidChangeEffectiveAppearance: 1032,
+ ApplicationDidChangeIcon: 1033,
+ ApplicationDidChangeOcclusionState: 1034,
+ ApplicationDidChangeScreenParameters: 1035,
+ ApplicationDidChangeStatusBarFrame: 1036,
+ ApplicationDidChangeStatusBarOrientation: 1037,
+ ApplicationDidFinishLaunching: 1038,
+ ApplicationDidHide: 1039,
+ ApplicationDidResignActiveNotification: 1040,
+ ApplicationDidUnhide: 1041,
+ ApplicationDidUpdate: 1042,
+ ApplicationWillBecomeActive: 1043,
+ ApplicationWillFinishLaunching: 1044,
+ ApplicationWillHide: 1045,
+ ApplicationWillResignActive: 1046,
+ ApplicationWillTerminate: 1047,
+ ApplicationWillUnhide: 1048,
+ ApplicationWillUpdate: 1049,
+ ApplicationDidChangeTheme: 1050,
+ ApplicationShouldHandleReopen: 1051,
+ WindowDidBecomeKey: 1052,
+ WindowDidBecomeMain: 1053,
+ WindowDidBeginSheet: 1054,
+ WindowDidChangeAlpha: 1055,
+ WindowDidChangeBackingLocation: 1056,
+ WindowDidChangeBackingProperties: 1057,
+ WindowDidChangeCollectionBehavior: 1058,
+ WindowDidChangeEffectiveAppearance: 1059,
+ WindowDidChangeOcclusionState: 1060,
+ WindowDidChangeOrderingMode: 1061,
+ WindowDidChangeScreen: 1062,
+ WindowDidChangeScreenParameters: 1063,
+ WindowDidChangeScreenProfile: 1064,
+ WindowDidChangeScreenSpace: 1065,
+ WindowDidChangeScreenSpaceProperties: 1066,
+ WindowDidChangeSharingType: 1067,
+ WindowDidChangeSpace: 1068,
+ WindowDidChangeSpaceOrderingMode: 1069,
+ WindowDidChangeTitle: 1070,
+ WindowDidChangeToolbar: 1071,
+ WindowDidChangeVisibility: 1072,
+ WindowDidDeminiaturize: 1073,
+ WindowDidEndSheet: 1074,
+ WindowDidEnterFullScreen: 1075,
+ WindowDidEnterVersionBrowser: 1076,
+ WindowDidExitFullScreen: 1077,
+ WindowDidExitVersionBrowser: 1078,
+ WindowDidExpose: 1079,
+ WindowDidFocus: 1080,
+ WindowDidMiniaturize: 1081,
+ WindowDidMove: 1082,
+ WindowDidOrderOffScreen: 1083,
+ WindowDidOrderOnScreen: 1084,
+ WindowDidResignKey: 1085,
+ WindowDidResignMain: 1086,
+ WindowDidResize: 1087,
+ WindowDidUpdate: 1088,
+ WindowDidUpdateAlpha: 1089,
+ WindowDidUpdateCollectionBehavior: 1090,
+ WindowDidUpdateCollectionProperties: 1091,
+ WindowDidUpdateShadow: 1092,
+ WindowDidUpdateTitle: 1093,
+ WindowDidUpdateToolbar: 1094,
+ WindowDidUpdateVisibility: 1095,
+ WindowShouldClose: 1096,
+ WindowWillBecomeKey: 1097,
+ WindowWillBecomeMain: 1098,
+ WindowWillBeginSheet: 1099,
+ WindowWillChangeOrderingMode: 1100,
+ WindowWillClose: 1101,
+ WindowWillDeminiaturize: 1102,
+ WindowWillEnterFullScreen: 1103,
+ WindowWillEnterVersionBrowser: 1104,
+ WindowWillExitFullScreen: 1105,
+ WindowWillExitVersionBrowser: 1106,
+ WindowWillFocus: 1107,
+ WindowWillMiniaturize: 1108,
+ WindowWillMove: 1109,
+ WindowWillOrderOffScreen: 1110,
+ WindowWillOrderOnScreen: 1111,
+ WindowWillResignMain: 1112,
+ WindowWillResize: 1113,
+ WindowWillUnfocus: 1114,
+ WindowWillUpdate: 1115,
+ WindowWillUpdateAlpha: 1116,
+ WindowWillUpdateCollectionBehavior: 1117,
+ WindowWillUpdateCollectionProperties: 1118,
+ WindowWillUpdateShadow: 1119,
+ WindowWillUpdateTitle: 1120,
+ WindowWillUpdateToolbar: 1121,
+ WindowWillUpdateVisibility: 1122,
+ WindowWillUseStandardFrame: 1123,
+ MenuWillOpen: 1124,
+ MenuDidOpen: 1125,
+ MenuDidClose: 1126,
+ MenuWillSendAction: 1127,
+ MenuDidSendAction: 1128,
+ MenuWillHighlightItem: 1129,
+ MenuDidHighlightItem: 1130,
+ MenuWillDisplayItem: 1131,
+ MenuDidDisplayItem: 1132,
+ MenuWillAddItem: 1133,
+ MenuDidAddItem: 1134,
+ MenuWillRemoveItem: 1135,
+ MenuDidRemoveItem: 1136,
+ MenuWillBeginTracking: 1137,
+ MenuDidBeginTracking: 1138,
+ MenuWillEndTracking: 1139,
+ MenuDidEndTracking: 1140,
+ MenuWillUpdate: 1141,
+ MenuDidUpdate: 1142,
+ MenuWillPopUp: 1143,
+ MenuDidPopUp: 1144,
+ MenuWillSendActionToItem: 1145,
+ MenuDidSendActionToItem: 1146,
+ WebViewDidStartProvisionalNavigation: 1147,
+ WebViewDidReceiveServerRedirectForProvisionalNavigation: 1148,
+ WebViewDidFinishNavigation: 1149,
+ WebViewDidCommitNavigation: 1150,
+ WindowFileDraggingEntered: 1151,
+ WindowFileDraggingPerformed: 1152,
+ WindowFileDraggingExited: 1153,
}
}
@@ -357,31 +367,31 @@ type windowsEvents struct {
func newWindowsEvents() windowsEvents {
return windowsEvents{
- SystemThemeChanged: 1149,
- APMPowerStatusChange: 1150,
- APMSuspend: 1151,
- APMResumeAutomatic: 1152,
- APMResumeSuspend: 1153,
- APMPowerSettingChange: 1154,
- ApplicationStarted: 1155,
- WebViewNavigationCompleted: 1156,
- WindowInactive: 1157,
- WindowActive: 1158,
- WindowClickActive: 1159,
- WindowMaximise: 1160,
- WindowUnMaximise: 1161,
- WindowFullscreen: 1162,
- WindowUnFullscreen: 1163,
- WindowRestore: 1164,
- WindowMinimise: 1165,
- WindowUnMinimise: 1166,
- WindowClose: 1167,
- WindowSetFocus: 1168,
- WindowKillFocus: 1169,
- WindowDragDrop: 1170,
- WindowDragEnter: 1171,
- WindowDragLeave: 1172,
- WindowDragOver: 1173,
+ SystemThemeChanged: 1154,
+ APMPowerStatusChange: 1155,
+ APMSuspend: 1156,
+ APMResumeAutomatic: 1157,
+ APMResumeSuspend: 1158,
+ APMPowerSettingChange: 1159,
+ ApplicationStarted: 1160,
+ WebViewNavigationCompleted: 1161,
+ WindowInactive: 1162,
+ WindowActive: 1163,
+ WindowClickActive: 1164,
+ WindowMaximise: 1165,
+ WindowUnMaximise: 1166,
+ WindowFullscreen: 1167,
+ WindowUnFullscreen: 1168,
+ WindowRestore: 1169,
+ WindowMinimise: 1170,
+ WindowUnMinimise: 1171,
+ WindowClose: 1172,
+ WindowSetFocus: 1173,
+ WindowKillFocus: 1174,
+ WindowDragDrop: 1175,
+ WindowDragEnter: 1176,
+ WindowDragLeave: 1177,
+ WindowDragOver: 1178,
}
}
@@ -391,174 +401,179 @@ func JSEvent(event uint) string {
var eventToJS = map[uint]string{
1024: "linux:SystemThemeChanged",
- 1025: "mac:ApplicationDidBecomeActive",
- 1026: "mac:ApplicationDidChangeBackingProperties",
- 1027: "mac:ApplicationDidChangeEffectiveAppearance",
- 1028: "mac:ApplicationDidChangeIcon",
- 1029: "mac:ApplicationDidChangeOcclusionState",
- 1030: "mac:ApplicationDidChangeScreenParameters",
- 1031: "mac:ApplicationDidChangeStatusBarFrame",
- 1032: "mac:ApplicationDidChangeStatusBarOrientation",
- 1033: "mac:ApplicationDidFinishLaunching",
- 1034: "mac:ApplicationDidHide",
- 1035: "mac:ApplicationDidResignActiveNotification",
- 1036: "mac:ApplicationDidUnhide",
- 1037: "mac:ApplicationDidUpdate",
- 1038: "mac:ApplicationWillBecomeActive",
- 1039: "mac:ApplicationWillFinishLaunching",
- 1040: "mac:ApplicationWillHide",
- 1041: "mac:ApplicationWillResignActive",
- 1042: "mac:ApplicationWillTerminate",
- 1043: "mac:ApplicationWillUnhide",
- 1044: "mac:ApplicationWillUpdate",
- 1045: "mac:ApplicationDidChangeTheme!",
- 1046: "mac:ApplicationShouldHandleReopen!",
- 1047: "mac:WindowDidBecomeKey",
- 1048: "mac:WindowDidBecomeMain",
- 1049: "mac:WindowDidBeginSheet",
- 1050: "mac:WindowDidChangeAlpha",
- 1051: "mac:WindowDidChangeBackingLocation",
- 1052: "mac:WindowDidChangeBackingProperties",
- 1053: "mac:WindowDidChangeCollectionBehavior",
- 1054: "mac:WindowDidChangeEffectiveAppearance",
- 1055: "mac:WindowDidChangeOcclusionState",
- 1056: "mac:WindowDidChangeOrderingMode",
- 1057: "mac:WindowDidChangeScreen",
- 1058: "mac:WindowDidChangeScreenParameters",
- 1059: "mac:WindowDidChangeScreenProfile",
- 1060: "mac:WindowDidChangeScreenSpace",
- 1061: "mac:WindowDidChangeScreenSpaceProperties",
- 1062: "mac:WindowDidChangeSharingType",
- 1063: "mac:WindowDidChangeSpace",
- 1064: "mac:WindowDidChangeSpaceOrderingMode",
- 1065: "mac:WindowDidChangeTitle",
- 1066: "mac:WindowDidChangeToolbar",
- 1067: "mac:WindowDidChangeVisibility",
- 1068: "mac:WindowDidDeminiaturize",
- 1069: "mac:WindowDidEndSheet",
- 1070: "mac:WindowDidEnterFullScreen",
- 1071: "mac:WindowDidEnterVersionBrowser",
- 1072: "mac:WindowDidExitFullScreen",
- 1073: "mac:WindowDidExitVersionBrowser",
- 1074: "mac:WindowDidExpose",
- 1075: "mac:WindowDidFocus",
- 1076: "mac:WindowDidMiniaturize",
- 1077: "mac:WindowDidMove",
- 1078: "mac:WindowDidOrderOffScreen",
- 1079: "mac:WindowDidOrderOnScreen",
- 1080: "mac:WindowDidResignKey",
- 1081: "mac:WindowDidResignMain",
- 1082: "mac:WindowDidResize",
- 1083: "mac:WindowDidUpdate",
- 1084: "mac:WindowDidUpdateAlpha",
- 1085: "mac:WindowDidUpdateCollectionBehavior",
- 1086: "mac:WindowDidUpdateCollectionProperties",
- 1087: "mac:WindowDidUpdateShadow",
- 1088: "mac:WindowDidUpdateTitle",
- 1089: "mac:WindowDidUpdateToolbar",
- 1090: "mac:WindowDidUpdateVisibility",
- 1091: "mac:WindowShouldClose!",
- 1092: "mac:WindowWillBecomeKey",
- 1093: "mac:WindowWillBecomeMain",
- 1094: "mac:WindowWillBeginSheet",
- 1095: "mac:WindowWillChangeOrderingMode",
- 1096: "mac:WindowWillClose",
- 1097: "mac:WindowWillDeminiaturize",
- 1098: "mac:WindowWillEnterFullScreen",
- 1099: "mac:WindowWillEnterVersionBrowser",
- 1100: "mac:WindowWillExitFullScreen",
- 1101: "mac:WindowWillExitVersionBrowser",
- 1102: "mac:WindowWillFocus",
- 1103: "mac:WindowWillMiniaturize",
- 1104: "mac:WindowWillMove",
- 1105: "mac:WindowWillOrderOffScreen",
- 1106: "mac:WindowWillOrderOnScreen",
- 1107: "mac:WindowWillResignMain",
- 1108: "mac:WindowWillResize",
- 1109: "mac:WindowWillUnfocus",
- 1110: "mac:WindowWillUpdate",
- 1111: "mac:WindowWillUpdateAlpha",
- 1112: "mac:WindowWillUpdateCollectionBehavior",
- 1113: "mac:WindowWillUpdateCollectionProperties",
- 1114: "mac:WindowWillUpdateShadow",
- 1115: "mac:WindowWillUpdateTitle",
- 1116: "mac:WindowWillUpdateToolbar",
- 1117: "mac:WindowWillUpdateVisibility",
- 1118: "mac:WindowWillUseStandardFrame",
- 1119: "mac:MenuWillOpen",
- 1120: "mac:MenuDidOpen",
- 1121: "mac:MenuDidClose",
- 1122: "mac:MenuWillSendAction",
- 1123: "mac:MenuDidSendAction",
- 1124: "mac:MenuWillHighlightItem",
- 1125: "mac:MenuDidHighlightItem",
- 1126: "mac:MenuWillDisplayItem",
- 1127: "mac:MenuDidDisplayItem",
- 1128: "mac:MenuWillAddItem",
- 1129: "mac:MenuDidAddItem",
- 1130: "mac:MenuWillRemoveItem",
- 1131: "mac:MenuDidRemoveItem",
- 1132: "mac:MenuWillBeginTracking",
- 1133: "mac:MenuDidBeginTracking",
- 1134: "mac:MenuWillEndTracking",
- 1135: "mac:MenuDidEndTracking",
- 1136: "mac:MenuWillUpdate",
- 1137: "mac:MenuDidUpdate",
- 1138: "mac:MenuWillPopUp",
- 1139: "mac:MenuDidPopUp",
- 1140: "mac:MenuWillSendActionToItem",
- 1141: "mac:MenuDidSendActionToItem",
- 1142: "mac:WebViewDidStartProvisionalNavigation",
- 1143: "mac:WebViewDidReceiveServerRedirectForProvisionalNavigation",
- 1144: "mac:WebViewDidFinishNavigation",
- 1145: "mac:WebViewDidCommitNavigation",
- 1146: "mac:WindowFileDraggingEntered",
- 1147: "mac:WindowFileDraggingPerformed",
- 1148: "mac:WindowFileDraggingExited",
- 1149: "windows:SystemThemeChanged",
- 1150: "windows:APMPowerStatusChange",
- 1151: "windows:APMSuspend",
- 1152: "windows:APMResumeAutomatic",
- 1153: "windows:APMResumeSuspend",
- 1154: "windows:APMPowerSettingChange",
- 1155: "windows:ApplicationStarted",
- 1156: "windows:WebViewNavigationCompleted",
- 1157: "windows:WindowInactive",
- 1158: "windows:WindowActive",
- 1159: "windows:WindowClickActive",
- 1160: "windows:WindowMaximise",
- 1161: "windows:WindowUnMaximise",
- 1162: "windows:WindowFullscreen",
- 1163: "windows:WindowUnFullscreen",
- 1164: "windows:WindowRestore",
- 1165: "windows:WindowMinimise",
- 1166: "windows:WindowUnMinimise",
- 1167: "windows:WindowClose",
- 1168: "windows:WindowSetFocus",
- 1169: "windows:WindowKillFocus",
- 1170: "windows:WindowDragDrop",
- 1171: "windows:WindowDragEnter",
- 1172: "windows:WindowDragLeave",
- 1173: "windows:WindowDragOver",
- 1174: "common:ApplicationStarted",
- 1175: "common:WindowMaximise",
- 1176: "common:WindowUnMaximise",
- 1177: "common:WindowFullscreen",
- 1178: "common:WindowUnFullscreen",
- 1179: "common:WindowRestore",
- 1180: "common:WindowMinimise",
- 1181: "common:WindowUnMinimise",
- 1182: "common:WindowClosing",
- 1183: "common:WindowZoom",
- 1184: "common:WindowZoomIn",
- 1185: "common:WindowZoomOut",
- 1186: "common:WindowZoomReset",
- 1187: "common:WindowFocus",
- 1188: "common:WindowLostFocus",
- 1189: "common:WindowShow",
- 1190: "common:WindowHide",
- 1191: "common:WindowDPIChanged",
- 1192: "common:WindowFilesDropped",
- 1193: "common:WindowRuntimeReady",
- 1194: "common:ThemeChanged",
+ 1025: "linux:WindowLoadChanged",
+ 1026: "linux:WindowDeleteEvent",
+ 1027: "linux:WindowFocusIn",
+ 1028: "linux:WindowFocusOut",
+ 1029: "linux:ApplicationStartup",
+ 1030: "mac:ApplicationDidBecomeActive",
+ 1031: "mac:ApplicationDidChangeBackingProperties",
+ 1032: "mac:ApplicationDidChangeEffectiveAppearance",
+ 1033: "mac:ApplicationDidChangeIcon",
+ 1034: "mac:ApplicationDidChangeOcclusionState",
+ 1035: "mac:ApplicationDidChangeScreenParameters",
+ 1036: "mac:ApplicationDidChangeStatusBarFrame",
+ 1037: "mac:ApplicationDidChangeStatusBarOrientation",
+ 1038: "mac:ApplicationDidFinishLaunching",
+ 1039: "mac:ApplicationDidHide",
+ 1040: "mac:ApplicationDidResignActiveNotification",
+ 1041: "mac:ApplicationDidUnhide",
+ 1042: "mac:ApplicationDidUpdate",
+ 1043: "mac:ApplicationWillBecomeActive",
+ 1044: "mac:ApplicationWillFinishLaunching",
+ 1045: "mac:ApplicationWillHide",
+ 1046: "mac:ApplicationWillResignActive",
+ 1047: "mac:ApplicationWillTerminate",
+ 1048: "mac:ApplicationWillUnhide",
+ 1049: "mac:ApplicationWillUpdate",
+ 1050: "mac:ApplicationDidChangeTheme!",
+ 1051: "mac:ApplicationShouldHandleReopen!",
+ 1052: "mac:WindowDidBecomeKey",
+ 1053: "mac:WindowDidBecomeMain",
+ 1054: "mac:WindowDidBeginSheet",
+ 1055: "mac:WindowDidChangeAlpha",
+ 1056: "mac:WindowDidChangeBackingLocation",
+ 1057: "mac:WindowDidChangeBackingProperties",
+ 1058: "mac:WindowDidChangeCollectionBehavior",
+ 1059: "mac:WindowDidChangeEffectiveAppearance",
+ 1060: "mac:WindowDidChangeOcclusionState",
+ 1061: "mac:WindowDidChangeOrderingMode",
+ 1062: "mac:WindowDidChangeScreen",
+ 1063: "mac:WindowDidChangeScreenParameters",
+ 1064: "mac:WindowDidChangeScreenProfile",
+ 1065: "mac:WindowDidChangeScreenSpace",
+ 1066: "mac:WindowDidChangeScreenSpaceProperties",
+ 1067: "mac:WindowDidChangeSharingType",
+ 1068: "mac:WindowDidChangeSpace",
+ 1069: "mac:WindowDidChangeSpaceOrderingMode",
+ 1070: "mac:WindowDidChangeTitle",
+ 1071: "mac:WindowDidChangeToolbar",
+ 1072: "mac:WindowDidChangeVisibility",
+ 1073: "mac:WindowDidDeminiaturize",
+ 1074: "mac:WindowDidEndSheet",
+ 1075: "mac:WindowDidEnterFullScreen",
+ 1076: "mac:WindowDidEnterVersionBrowser",
+ 1077: "mac:WindowDidExitFullScreen",
+ 1078: "mac:WindowDidExitVersionBrowser",
+ 1079: "mac:WindowDidExpose",
+ 1080: "mac:WindowDidFocus",
+ 1081: "mac:WindowDidMiniaturize",
+ 1082: "mac:WindowDidMove",
+ 1083: "mac:WindowDidOrderOffScreen",
+ 1084: "mac:WindowDidOrderOnScreen",
+ 1085: "mac:WindowDidResignKey",
+ 1086: "mac:WindowDidResignMain",
+ 1087: "mac:WindowDidResize",
+ 1088: "mac:WindowDidUpdate",
+ 1089: "mac:WindowDidUpdateAlpha",
+ 1090: "mac:WindowDidUpdateCollectionBehavior",
+ 1091: "mac:WindowDidUpdateCollectionProperties",
+ 1092: "mac:WindowDidUpdateShadow",
+ 1093: "mac:WindowDidUpdateTitle",
+ 1094: "mac:WindowDidUpdateToolbar",
+ 1095: "mac:WindowDidUpdateVisibility",
+ 1096: "mac:WindowShouldClose!",
+ 1097: "mac:WindowWillBecomeKey",
+ 1098: "mac:WindowWillBecomeMain",
+ 1099: "mac:WindowWillBeginSheet",
+ 1100: "mac:WindowWillChangeOrderingMode",
+ 1101: "mac:WindowWillClose",
+ 1102: "mac:WindowWillDeminiaturize",
+ 1103: "mac:WindowWillEnterFullScreen",
+ 1104: "mac:WindowWillEnterVersionBrowser",
+ 1105: "mac:WindowWillExitFullScreen",
+ 1106: "mac:WindowWillExitVersionBrowser",
+ 1107: "mac:WindowWillFocus",
+ 1108: "mac:WindowWillMiniaturize",
+ 1109: "mac:WindowWillMove",
+ 1110: "mac:WindowWillOrderOffScreen",
+ 1111: "mac:WindowWillOrderOnScreen",
+ 1112: "mac:WindowWillResignMain",
+ 1113: "mac:WindowWillResize",
+ 1114: "mac:WindowWillUnfocus",
+ 1115: "mac:WindowWillUpdate",
+ 1116: "mac:WindowWillUpdateAlpha",
+ 1117: "mac:WindowWillUpdateCollectionBehavior",
+ 1118: "mac:WindowWillUpdateCollectionProperties",
+ 1119: "mac:WindowWillUpdateShadow",
+ 1120: "mac:WindowWillUpdateTitle",
+ 1121: "mac:WindowWillUpdateToolbar",
+ 1122: "mac:WindowWillUpdateVisibility",
+ 1123: "mac:WindowWillUseStandardFrame",
+ 1124: "mac:MenuWillOpen",
+ 1125: "mac:MenuDidOpen",
+ 1126: "mac:MenuDidClose",
+ 1127: "mac:MenuWillSendAction",
+ 1128: "mac:MenuDidSendAction",
+ 1129: "mac:MenuWillHighlightItem",
+ 1130: "mac:MenuDidHighlightItem",
+ 1131: "mac:MenuWillDisplayItem",
+ 1132: "mac:MenuDidDisplayItem",
+ 1133: "mac:MenuWillAddItem",
+ 1134: "mac:MenuDidAddItem",
+ 1135: "mac:MenuWillRemoveItem",
+ 1136: "mac:MenuDidRemoveItem",
+ 1137: "mac:MenuWillBeginTracking",
+ 1138: "mac:MenuDidBeginTracking",
+ 1139: "mac:MenuWillEndTracking",
+ 1140: "mac:MenuDidEndTracking",
+ 1141: "mac:MenuWillUpdate",
+ 1142: "mac:MenuDidUpdate",
+ 1143: "mac:MenuWillPopUp",
+ 1144: "mac:MenuDidPopUp",
+ 1145: "mac:MenuWillSendActionToItem",
+ 1146: "mac:MenuDidSendActionToItem",
+ 1147: "mac:WebViewDidStartProvisionalNavigation",
+ 1148: "mac:WebViewDidReceiveServerRedirectForProvisionalNavigation",
+ 1149: "mac:WebViewDidFinishNavigation",
+ 1150: "mac:WebViewDidCommitNavigation",
+ 1151: "mac:WindowFileDraggingEntered",
+ 1152: "mac:WindowFileDraggingPerformed",
+ 1153: "mac:WindowFileDraggingExited",
+ 1154: "windows:SystemThemeChanged",
+ 1155: "windows:APMPowerStatusChange",
+ 1156: "windows:APMSuspend",
+ 1157: "windows:APMResumeAutomatic",
+ 1158: "windows:APMResumeSuspend",
+ 1159: "windows:APMPowerSettingChange",
+ 1160: "windows:ApplicationStarted",
+ 1161: "windows:WebViewNavigationCompleted",
+ 1162: "windows:WindowInactive",
+ 1163: "windows:WindowActive",
+ 1164: "windows:WindowClickActive",
+ 1165: "windows:WindowMaximise",
+ 1166: "windows:WindowUnMaximise",
+ 1167: "windows:WindowFullscreen",
+ 1168: "windows:WindowUnFullscreen",
+ 1169: "windows:WindowRestore",
+ 1170: "windows:WindowMinimise",
+ 1171: "windows:WindowUnMinimise",
+ 1172: "windows:WindowClose",
+ 1173: "windows:WindowSetFocus",
+ 1174: "windows:WindowKillFocus",
+ 1175: "windows:WindowDragDrop",
+ 1176: "windows:WindowDragEnter",
+ 1177: "windows:WindowDragLeave",
+ 1178: "windows:WindowDragOver",
+ 1179: "common:ApplicationStarted",
+ 1180: "common:WindowMaximise",
+ 1181: "common:WindowUnMaximise",
+ 1182: "common:WindowFullscreen",
+ 1183: "common:WindowUnFullscreen",
+ 1184: "common:WindowRestore",
+ 1185: "common:WindowMinimise",
+ 1186: "common:WindowUnMinimise",
+ 1187: "common:WindowClosing",
+ 1188: "common:WindowZoom",
+ 1189: "common:WindowZoomIn",
+ 1190: "common:WindowZoomOut",
+ 1191: "common:WindowZoomReset",
+ 1192: "common:WindowFocus",
+ 1193: "common:WindowLostFocus",
+ 1194: "common:WindowShow",
+ 1195: "common:WindowHide",
+ 1196: "common:WindowDPIChanged",
+ 1197: "common:WindowFilesDropped",
+ 1198: "common:WindowRuntimeReady",
+ 1199: "common:ThemeChanged",
}
diff --git a/v3/pkg/events/events.txt b/v3/pkg/events/events.txt
index 76406a8dc56..455170c3995 100644
--- a/v3/pkg/events/events.txt
+++ b/v3/pkg/events/events.txt
@@ -1,4 +1,9 @@
linux:SystemThemeChanged
+linux:WindowLoadChanged
+linux:WindowDeleteEvent
+linux:WindowFocusIn
+linux:WindowFocusOut
+linux:ApplicationStartup
mac:ApplicationDidBecomeActive
mac:ApplicationDidChangeBackingProperties
mac:ApplicationDidChangeEffectiveAppearance
diff --git a/v3/pkg/events/events_darwin.h b/v3/pkg/events/events_darwin.h
index c2c74116d6f..f8ee81be2b1 100644
--- a/v3/pkg/events/events_darwin.h
+++ b/v3/pkg/events/events_darwin.h
@@ -6,132 +6,132 @@
extern void processApplicationEvent(unsigned int, void* data);
extern void processWindowEvent(unsigned int, unsigned int);
-#define EventApplicationDidBecomeActive 1025
-#define EventApplicationDidChangeBackingProperties 1026
-#define EventApplicationDidChangeEffectiveAppearance 1027
-#define EventApplicationDidChangeIcon 1028
-#define EventApplicationDidChangeOcclusionState 1029
-#define EventApplicationDidChangeScreenParameters 1030
-#define EventApplicationDidChangeStatusBarFrame 1031
-#define EventApplicationDidChangeStatusBarOrientation 1032
-#define EventApplicationDidFinishLaunching 1033
-#define EventApplicationDidHide 1034
-#define EventApplicationDidResignActiveNotification 1035
-#define EventApplicationDidUnhide 1036
-#define EventApplicationDidUpdate 1037
-#define EventApplicationWillBecomeActive 1038
-#define EventApplicationWillFinishLaunching 1039
-#define EventApplicationWillHide 1040
-#define EventApplicationWillResignActive 1041
-#define EventApplicationWillTerminate 1042
-#define EventApplicationWillUnhide 1043
-#define EventApplicationWillUpdate 1044
-#define EventApplicationDidChangeTheme 1045
-#define EventApplicationShouldHandleReopen 1046
-#define EventWindowDidBecomeKey 1047
-#define EventWindowDidBecomeMain 1048
-#define EventWindowDidBeginSheet 1049
-#define EventWindowDidChangeAlpha 1050
-#define EventWindowDidChangeBackingLocation 1051
-#define EventWindowDidChangeBackingProperties 1052
-#define EventWindowDidChangeCollectionBehavior 1053
-#define EventWindowDidChangeEffectiveAppearance 1054
-#define EventWindowDidChangeOcclusionState 1055
-#define EventWindowDidChangeOrderingMode 1056
-#define EventWindowDidChangeScreen 1057
-#define EventWindowDidChangeScreenParameters 1058
-#define EventWindowDidChangeScreenProfile 1059
-#define EventWindowDidChangeScreenSpace 1060
-#define EventWindowDidChangeScreenSpaceProperties 1061
-#define EventWindowDidChangeSharingType 1062
-#define EventWindowDidChangeSpace 1063
-#define EventWindowDidChangeSpaceOrderingMode 1064
-#define EventWindowDidChangeTitle 1065
-#define EventWindowDidChangeToolbar 1066
-#define EventWindowDidChangeVisibility 1067
-#define EventWindowDidDeminiaturize 1068
-#define EventWindowDidEndSheet 1069
-#define EventWindowDidEnterFullScreen 1070
-#define EventWindowDidEnterVersionBrowser 1071
-#define EventWindowDidExitFullScreen 1072
-#define EventWindowDidExitVersionBrowser 1073
-#define EventWindowDidExpose 1074
-#define EventWindowDidFocus 1075
-#define EventWindowDidMiniaturize 1076
-#define EventWindowDidMove 1077
-#define EventWindowDidOrderOffScreen 1078
-#define EventWindowDidOrderOnScreen 1079
-#define EventWindowDidResignKey 1080
-#define EventWindowDidResignMain 1081
-#define EventWindowDidResize 1082
-#define EventWindowDidUpdate 1083
-#define EventWindowDidUpdateAlpha 1084
-#define EventWindowDidUpdateCollectionBehavior 1085
-#define EventWindowDidUpdateCollectionProperties 1086
-#define EventWindowDidUpdateShadow 1087
-#define EventWindowDidUpdateTitle 1088
-#define EventWindowDidUpdateToolbar 1089
-#define EventWindowDidUpdateVisibility 1090
-#define EventWindowShouldClose 1091
-#define EventWindowWillBecomeKey 1092
-#define EventWindowWillBecomeMain 1093
-#define EventWindowWillBeginSheet 1094
-#define EventWindowWillChangeOrderingMode 1095
-#define EventWindowWillClose 1096
-#define EventWindowWillDeminiaturize 1097
-#define EventWindowWillEnterFullScreen 1098
-#define EventWindowWillEnterVersionBrowser 1099
-#define EventWindowWillExitFullScreen 1100
-#define EventWindowWillExitVersionBrowser 1101
-#define EventWindowWillFocus 1102
-#define EventWindowWillMiniaturize 1103
-#define EventWindowWillMove 1104
-#define EventWindowWillOrderOffScreen 1105
-#define EventWindowWillOrderOnScreen 1106
-#define EventWindowWillResignMain 1107
-#define EventWindowWillResize 1108
-#define EventWindowWillUnfocus 1109
-#define EventWindowWillUpdate 1110
-#define EventWindowWillUpdateAlpha 1111
-#define EventWindowWillUpdateCollectionBehavior 1112
-#define EventWindowWillUpdateCollectionProperties 1113
-#define EventWindowWillUpdateShadow 1114
-#define EventWindowWillUpdateTitle 1115
-#define EventWindowWillUpdateToolbar 1116
-#define EventWindowWillUpdateVisibility 1117
-#define EventWindowWillUseStandardFrame 1118
-#define EventMenuWillOpen 1119
-#define EventMenuDidOpen 1120
-#define EventMenuDidClose 1121
-#define EventMenuWillSendAction 1122
-#define EventMenuDidSendAction 1123
-#define EventMenuWillHighlightItem 1124
-#define EventMenuDidHighlightItem 1125
-#define EventMenuWillDisplayItem 1126
-#define EventMenuDidDisplayItem 1127
-#define EventMenuWillAddItem 1128
-#define EventMenuDidAddItem 1129
-#define EventMenuWillRemoveItem 1130
-#define EventMenuDidRemoveItem 1131
-#define EventMenuWillBeginTracking 1132
-#define EventMenuDidBeginTracking 1133
-#define EventMenuWillEndTracking 1134
-#define EventMenuDidEndTracking 1135
-#define EventMenuWillUpdate 1136
-#define EventMenuDidUpdate 1137
-#define EventMenuWillPopUp 1138
-#define EventMenuDidPopUp 1139
-#define EventMenuWillSendActionToItem 1140
-#define EventMenuDidSendActionToItem 1141
-#define EventWebViewDidStartProvisionalNavigation 1142
-#define EventWebViewDidReceiveServerRedirectForProvisionalNavigation 1143
-#define EventWebViewDidFinishNavigation 1144
-#define EventWebViewDidCommitNavigation 1145
-#define EventWindowFileDraggingEntered 1146
-#define EventWindowFileDraggingPerformed 1147
-#define EventWindowFileDraggingExited 1148
+#define EventApplicationDidBecomeActive 1030
+#define EventApplicationDidChangeBackingProperties 1031
+#define EventApplicationDidChangeEffectiveAppearance 1032
+#define EventApplicationDidChangeIcon 1033
+#define EventApplicationDidChangeOcclusionState 1034
+#define EventApplicationDidChangeScreenParameters 1035
+#define EventApplicationDidChangeStatusBarFrame 1036
+#define EventApplicationDidChangeStatusBarOrientation 1037
+#define EventApplicationDidFinishLaunching 1038
+#define EventApplicationDidHide 1039
+#define EventApplicationDidResignActiveNotification 1040
+#define EventApplicationDidUnhide 1041
+#define EventApplicationDidUpdate 1042
+#define EventApplicationWillBecomeActive 1043
+#define EventApplicationWillFinishLaunching 1044
+#define EventApplicationWillHide 1045
+#define EventApplicationWillResignActive 1046
+#define EventApplicationWillTerminate 1047
+#define EventApplicationWillUnhide 1048
+#define EventApplicationWillUpdate 1049
+#define EventApplicationDidChangeTheme 1050
+#define EventApplicationShouldHandleReopen 1051
+#define EventWindowDidBecomeKey 1052
+#define EventWindowDidBecomeMain 1053
+#define EventWindowDidBeginSheet 1054
+#define EventWindowDidChangeAlpha 1055
+#define EventWindowDidChangeBackingLocation 1056
+#define EventWindowDidChangeBackingProperties 1057
+#define EventWindowDidChangeCollectionBehavior 1058
+#define EventWindowDidChangeEffectiveAppearance 1059
+#define EventWindowDidChangeOcclusionState 1060
+#define EventWindowDidChangeOrderingMode 1061
+#define EventWindowDidChangeScreen 1062
+#define EventWindowDidChangeScreenParameters 1063
+#define EventWindowDidChangeScreenProfile 1064
+#define EventWindowDidChangeScreenSpace 1065
+#define EventWindowDidChangeScreenSpaceProperties 1066
+#define EventWindowDidChangeSharingType 1067
+#define EventWindowDidChangeSpace 1068
+#define EventWindowDidChangeSpaceOrderingMode 1069
+#define EventWindowDidChangeTitle 1070
+#define EventWindowDidChangeToolbar 1071
+#define EventWindowDidChangeVisibility 1072
+#define EventWindowDidDeminiaturize 1073
+#define EventWindowDidEndSheet 1074
+#define EventWindowDidEnterFullScreen 1075
+#define EventWindowDidEnterVersionBrowser 1076
+#define EventWindowDidExitFullScreen 1077
+#define EventWindowDidExitVersionBrowser 1078
+#define EventWindowDidExpose 1079
+#define EventWindowDidFocus 1080
+#define EventWindowDidMiniaturize 1081
+#define EventWindowDidMove 1082
+#define EventWindowDidOrderOffScreen 1083
+#define EventWindowDidOrderOnScreen 1084
+#define EventWindowDidResignKey 1085
+#define EventWindowDidResignMain 1086
+#define EventWindowDidResize 1087
+#define EventWindowDidUpdate 1088
+#define EventWindowDidUpdateAlpha 1089
+#define EventWindowDidUpdateCollectionBehavior 1090
+#define EventWindowDidUpdateCollectionProperties 1091
+#define EventWindowDidUpdateShadow 1092
+#define EventWindowDidUpdateTitle 1093
+#define EventWindowDidUpdateToolbar 1094
+#define EventWindowDidUpdateVisibility 1095
+#define EventWindowShouldClose 1096
+#define EventWindowWillBecomeKey 1097
+#define EventWindowWillBecomeMain 1098
+#define EventWindowWillBeginSheet 1099
+#define EventWindowWillChangeOrderingMode 1100
+#define EventWindowWillClose 1101
+#define EventWindowWillDeminiaturize 1102
+#define EventWindowWillEnterFullScreen 1103
+#define EventWindowWillEnterVersionBrowser 1104
+#define EventWindowWillExitFullScreen 1105
+#define EventWindowWillExitVersionBrowser 1106
+#define EventWindowWillFocus 1107
+#define EventWindowWillMiniaturize 1108
+#define EventWindowWillMove 1109
+#define EventWindowWillOrderOffScreen 1110
+#define EventWindowWillOrderOnScreen 1111
+#define EventWindowWillResignMain 1112
+#define EventWindowWillResize 1113
+#define EventWindowWillUnfocus 1114
+#define EventWindowWillUpdate 1115
+#define EventWindowWillUpdateAlpha 1116
+#define EventWindowWillUpdateCollectionBehavior 1117
+#define EventWindowWillUpdateCollectionProperties 1118
+#define EventWindowWillUpdateShadow 1119
+#define EventWindowWillUpdateTitle 1120
+#define EventWindowWillUpdateToolbar 1121
+#define EventWindowWillUpdateVisibility 1122
+#define EventWindowWillUseStandardFrame 1123
+#define EventMenuWillOpen 1124
+#define EventMenuDidOpen 1125
+#define EventMenuDidClose 1126
+#define EventMenuWillSendAction 1127
+#define EventMenuDidSendAction 1128
+#define EventMenuWillHighlightItem 1129
+#define EventMenuDidHighlightItem 1130
+#define EventMenuWillDisplayItem 1131
+#define EventMenuDidDisplayItem 1132
+#define EventMenuWillAddItem 1133
+#define EventMenuDidAddItem 1134
+#define EventMenuWillRemoveItem 1135
+#define EventMenuDidRemoveItem 1136
+#define EventMenuWillBeginTracking 1137
+#define EventMenuDidBeginTracking 1138
+#define EventMenuWillEndTracking 1139
+#define EventMenuDidEndTracking 1140
+#define EventMenuWillUpdate 1141
+#define EventMenuDidUpdate 1142
+#define EventMenuWillPopUp 1143
+#define EventMenuDidPopUp 1144
+#define EventMenuWillSendActionToItem 1145
+#define EventMenuDidSendActionToItem 1146
+#define EventWebViewDidStartProvisionalNavigation 1147
+#define EventWebViewDidReceiveServerRedirectForProvisionalNavigation 1148
+#define EventWebViewDidFinishNavigation 1149
+#define EventWebViewDidCommitNavigation 1150
+#define EventWindowFileDraggingEntered 1151
+#define EventWindowFileDraggingPerformed 1152
+#define EventWindowFileDraggingExited 1153
-#define MAX_EVENTS 1149
+#define MAX_EVENTS 1154
#endif
\ No newline at end of file
diff --git a/v3/pkg/events/events_linux.go b/v3/pkg/events/events_linux.go
new file mode 100644
index 00000000000..2782beb8acd
--- /dev/null
+++ b/v3/pkg/events/events_linux.go
@@ -0,0 +1,22 @@
+//go:build linux
+
+package events
+
+/*
+#include "events_linux.h"
+#include
+#include
+
+bool hasListener[MAX_EVENTS] = {false};
+
+void registerListener(unsigned int event) {
+ hasListener[event] = true;
+}
+
+bool hasListeners(unsigned int event) {
+ //return hasListener[event];
+ return true;
+}
+
+*/
+import "C"
diff --git a/v3/pkg/events/events_linux.h b/v3/pkg/events/events_linux.h
new file mode 100644
index 00000000000..21b6f32eee0
--- /dev/null
+++ b/v3/pkg/events/events_linux.h
@@ -0,0 +1,19 @@
+//go:build linux
+
+#ifndef _events_h
+#define _events_h
+
+extern void processApplicationEvent(unsigned int, void* data);
+extern void processWindowEvent(unsigned int, unsigned int);
+
+#define EventSystemThemeChanged 1024
+#define EventWindowLoadChanged 1025
+#define EventWindowDeleteEvent 1026
+#define EventWindowFocusIn 1027
+#define EventWindowFocusOut 1028
+#define EventApplicationStartup 1029
+
+#define MAX_EVENTS 1030
+
+
+#endif
\ No newline at end of file
diff --git a/v3/tasks/events/generate.go b/v3/tasks/events/generate.go
index 9518036f88e..4772a1ef8d9 100644
--- a/v3/tasks/events/generate.go
+++ b/v3/tasks/events/generate.go
@@ -61,7 +61,19 @@ $$EVENTTOJS}
`
-var eventsH = `//go:build darwin
+var darwinEventsH = `//go:build darwin
+
+#ifndef _events_h
+#define _events_h
+
+extern void processApplicationEvent(unsigned int, void* data);
+extern void processWindowEvent(unsigned int, unsigned int);
+
+$$CHEADEREVENTS
+
+#endif`
+
+var linuxEventsH = `//go:build linux
#ifndef _events_h
#define _events_h
@@ -108,10 +120,11 @@ func main() {
linuxEventsDecl := bytes.NewBufferString("")
linuxEventsValues := bytes.NewBufferString("")
+ linuxCHeaderEvents := bytes.NewBufferString("")
macEventsDecl := bytes.NewBufferString("")
macEventsValues := bytes.NewBufferString("")
- cHeaderEvents := bytes.NewBufferString("")
+ macCHeaderEvents := bytes.NewBufferString("")
windowDelegateEvents := bytes.NewBufferString("")
applicationDelegateEvents := bytes.NewBufferString("")
webviewDelegateEvents := bytes.NewBufferString("")
@@ -137,6 +150,7 @@ func main() {
var id int
// var maxLinuxEvents int
var maxMacEvents int
+ var maxLinuxEvents int
var line []byte
// Loop over each line in the file
for id, line = range bytes.Split(eventNames, []byte{'\n'}) {
@@ -179,7 +193,8 @@ func main() {
linuxJSEvents.WriteString("\t\t" + event + ": \"" + strings.TrimSpace(string(line)) + "\",\n")
linuxTSEvents.WriteString("\t\t" + event + ": string,\n")
eventToJS.WriteString("\t" + strconv.Itoa(id) + ": \"" + strings.TrimSpace(string(line)) + "\",\n")
- //maxLinuxEvents = id
+ maxLinuxEvents = id
+ linuxCHeaderEvents.WriteString("#define Event" + eventTitle + " " + strconv.Itoa(id) + "\n")
case "mac":
eventType := "ApplicationEventType"
if strings.HasPrefix(event, "Window") {
@@ -192,7 +207,7 @@ func main() {
macEventsValues.WriteString("\t\t" + event + ": " + strconv.Itoa(id) + ",\n")
macJSEvents.WriteString("\t\t" + event + ": \"" + strings.TrimSpace(string(line)) + "\",\n")
macTSEvents.WriteString("\t\t" + event + ": string,\n")
- cHeaderEvents.WriteString("#define Event" + eventTitle + " " + strconv.Itoa(id) + "\n")
+ macCHeaderEvents.WriteString("#define Event" + eventTitle + " " + strconv.Itoa(id) + "\n")
eventToJS.WriteString("\t" + strconv.Itoa(id) + ": \"" + strings.TrimSpace(string(line)) + "\",\n")
maxMacEvents = id
if ignoreEvent {
@@ -258,7 +273,8 @@ func main() {
}
}
- cHeaderEvents.WriteString("\n#define MAX_EVENTS " + strconv.Itoa(maxMacEvents+1) + "\n")
+ macCHeaderEvents.WriteString("\n#define MAX_EVENTS " + strconv.Itoa(maxMacEvents+1) + "\n")
+ linuxCHeaderEvents.WriteString("\n#define MAX_EVENTS " + strconv.Itoa(maxLinuxEvents+1) + "\n")
// Save the eventsGo template substituting the values and decls
templateToWrite := strings.ReplaceAll(eventsGo, "$$LINUXEVENTSDECL", linuxEventsDecl.String())
@@ -296,13 +312,20 @@ func main() {
panic(err)
}
- // Save the eventsH template substituting the values and decls
- templateToWrite = strings.ReplaceAll(eventsH, "$$CHEADEREVENTS", cHeaderEvents.String())
+ // Save the darwinEventsH template substituting the values and decls
+ templateToWrite = strings.ReplaceAll(darwinEventsH, "$$CHEADEREVENTS", macCHeaderEvents.String())
err = os.WriteFile("../../pkg/events/events_darwin.h", []byte(templateToWrite), 0644)
if err != nil {
panic(err)
}
+ // Save the linuxEventsH template substituting the values and decls
+ templateToWrite = strings.ReplaceAll(linuxEventsH, "$$CHEADEREVENTS", linuxCHeaderEvents.String())
+ err = os.WriteFile("../../pkg/events/events_linux.h", []byte(templateToWrite), 0644)
+ if err != nil {
+ panic(err)
+ }
+
// Load the window_delegate.m file
windowDelegate, err := os.ReadFile("../../pkg/application/webview_window_darwin.m")
if err != nil {