# wifi-qr.ps1 - QR-Karten fuer alle gespeicherten WLAN-Profile dieses Rechners. # # Aufruf von irgendeinem Windows-Rechner (PowerShell, Admin nicht noetig, fragt per UAC nach): # irm https:///wifi-qr/wifi-qr.ps1 | iex (oder /wifi-qr/ im Browser oeffnen) # oder lokal: # powershell -ExecutionPolicy Bypass -File .\wifi-qr.ps1 # # Die Datei ist bewusst reines ASCII ohne BOM, damit irm|iex unter PS 5.1 nicht an der # Zeichensatz-Erkennung scheitert. qrcode.js (Kazuhiko Arase, MIT) steckt als Base64 drin. # Die erzeugte HTML-Seite liegt in %TEMP% und wird nach 60 s automatisch geloescht. $WifiQrMain = { param([switch]$Elevated, [string]$SelfFile) $ErrorActionPreference = 'Stop' try { $isAdmin = ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent() ).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator) if (-not $isAdmin) { # Selbst-Elevation: eigenen Code in eine Temp-Datei schreiben und per UAC neu starten. # Funktioniert auch bei irm|iex, weil wir den Scriptblock selbst kennen. $f = Join-Path $env:TEMP ('wifi-qr-' + [guid]::NewGuid() + '.ps1') $src = '$WifiQrMain = {' + $WifiQrMain.ToString() + '}' + "`r`n" + "`$QRCODE_B64 = @'`r`n" + $QRCODE_B64 + "`r`n'@`r`n" + '& $WifiQrMain -Elevated -SelfFile ''' + $f + '''' [IO.File]::WriteAllText($f, $src, (New-Object Text.UTF8Encoding $false)) Write-Host 'Starte mit Administratorrechten neu (UAC) ...' try { Start-Process powershell -Verb RunAs -ArgumentList @( '-NoProfile', '-ExecutionPolicy', 'Bypass', '-File', "`"$f`"") } catch { Remove-Item $f -Force -ErrorAction SilentlyContinue Write-Warning 'UAC abgelehnt - ohne Adminrechte fehlen die Kennwoerter.' } return } if ($SelfFile) { Remove-Item -LiteralPath $SelfFile -Force -ErrorAction SilentlyContinue } # Profile als XML exportieren: sprachunabhaengig, keine Codepage-Probleme $tmp = Join-Path $env:TEMP ('wifi-qr-' + [guid]::NewGuid()) New-Item -ItemType Directory -Path $tmp | Out-Null try { netsh wlan export profile key=clear folder="$tmp" | Out-Null $nets = foreach ($xf in Get-ChildItem $tmp -Filter *.xml) { [xml]$x = Get-Content -LiteralPath $xf.FullName -Raw -Encoding UTF8 $ssid = $x.WLANProfile.SSIDConfig.SSID.name if (-not $ssid) { $ssid = $x.WLANProfile.name } $sec = $x.WLANProfile.MSM.security $auth = [string]$sec.authEncryption.authentication $key = [string]$sec.sharedKey.keyMaterial $type = switch -Regex ($auth) { '^open$' { if ($sec.authEncryption.encryption -eq 'WEP') {'WEP'} else {'nopass'} } '^shared$' { 'WEP' } 'SAE|PSK' { 'WPA' } default { 'ENT' } # WPA2/3-Enterprise: kein QR-faehiger Schluessel } [pscustomobject]@{ ssid = [string]$ssid key = $key type = $type auth = $auth hidden = ([string]$x.WLANProfile.SSIDConfig.nonBroadcast -eq 'true') } } } finally { Remove-Item $tmp -Recurse -Force -ErrorAction SilentlyContinue # Klartext-XMLs weg } $nets = @($nets | Sort-Object ssid) Write-Host ('{0} Profile gefunden, davon {1} mit Kennwort.' -f $nets.Count, @($nets | Where-Object key).Count) $json = (ConvertTo-Json -InputObject $nets -Compress) -replace ' WLAN-Zugänge - $pc

WLAN-Zugänge

$pc · erzeugt $date · enthält Klartext-Kennwörter
"@ $out = Join-Path $env:TEMP ('wifi-qr-' + $pc + '.html') [IO.File]::WriteAllText($out, $html, (New-Object Text.UTF8Encoding $false)) Start-Process $out # Klartext-HTML nach 60 s wegraeumen (Seite ist dann laengst im Browser geladen) Start-Process powershell -WindowStyle Hidden -ArgumentList @( '-NoProfile', '-Command', "Start-Sleep 60; Remove-Item -LiteralPath '$out' -Force") Write-Host 'Seite geoeffnet. Die HTML-Datei wird in 60 s geloescht - vorher drucken oder im Browser lassen.' if ($Elevated) { Start-Sleep 3 } } catch { Write-Host ('FEHLER: ' + $_) -ForegroundColor Red if ($Elevated) { Read-Host 'Enter zum Schliessen' } } } $QRCODE_B64 = @' Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8KLy8gUVIgQ29kZSBHZW5l cmF0b3IgZm9yIEphdmFTY3JpcHQKLy8KLy8gQ29weXJpZ2h0IChjKSAyMDA5IEthenVoaWtvIEFyYXNlCi8vCi8vIFVSTDogaHR0cDovL3d3dy5kLXByb2pl Y3QuY29tLwovLwovLyBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2U6Ci8vICBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL21pdC1s aWNlbnNlLnBocAovLwovLyBUaGUgd29yZCAnUVIgQ29kZScgaXMgcmVnaXN0ZXJlZCB0cmFkZW1hcmsgb2YKLy8gREVOU08gV0FWRSBJTkNPUlBPUkFURUQK Ly8gIGh0dHA6Ly93d3cuZGVuc28td2F2ZS5jb20vcXJjb2RlL2ZhcXBhdGVudC1lLmh0bWwKLy8KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCnZhciBxcmNvZGUgPSBmdW5jdGlvbigpIHsKCiAgLy8tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAvLyBxcmNvZGUKICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAvKioKICAgKiBxcmNvZGUKICAgKiBAcGFyYW0gdHlwZU51bWJlciAx IHRvIDQwCiAgICogQHBhcmFtIGVycm9yQ29ycmVjdGlvbkxldmVsICdMJywnTScsJ1EnLCdIJwogICAqLwogIHZhciBxcmNvZGUgPSBmdW5jdGlvbih0eXBl TnVtYmVyLCBlcnJvckNvcnJlY3Rpb25MZXZlbCkgewoKICAgIHZhciBQQUQwID0gMHhFQzsKICAgIHZhciBQQUQxID0gMHgxMTsKCiAgICB2YXIgX3R5cGVO dW1iZXIgPSB0eXBlTnVtYmVyOwogICAgdmFyIF9lcnJvckNvcnJlY3Rpb25MZXZlbCA9IFFSRXJyb3JDb3JyZWN0aW9uTGV2ZWxbZXJyb3JDb3JyZWN0aW9u TGV2ZWxdOwogICAgdmFyIF9tb2R1bGVzID0gbnVsbDsKICAgIHZhciBfbW9kdWxlQ291bnQgPSAwOwogICAgdmFyIF9kYXRhQ2FjaGUgPSBudWxsOwogICAg dmFyIF9kYXRhTGlzdCA9IFtdOwoKICAgIHZhciBfdGhpcyA9IHt9OwoKICAgIHZhciBtYWtlSW1wbCA9IGZ1bmN0aW9uKHRlc3QsIG1hc2tQYXR0ZXJuKSB7 CgogICAgICBfbW9kdWxlQ291bnQgPSBfdHlwZU51bWJlciAqIDQgKyAxNzsKICAgICAgX21vZHVsZXMgPSBmdW5jdGlvbihtb2R1bGVDb3VudCkgewogICAg ICAgIHZhciBtb2R1bGVzID0gbmV3IEFycmF5KG1vZHVsZUNvdW50KTsKICAgICAgICBmb3IgKHZhciByb3cgPSAwOyByb3cgPCBtb2R1bGVDb3VudDsgcm93 ICs9IDEpIHsKICAgICAgICAgIG1vZHVsZXNbcm93XSA9IG5ldyBBcnJheShtb2R1bGVDb3VudCk7CiAgICAgICAgICBmb3IgKHZhciBjb2wgPSAwOyBjb2wg PCBtb2R1bGVDb3VudDsgY29sICs9IDEpIHsKICAgICAgICAgICAgbW9kdWxlc1tyb3ddW2NvbF0gPSBudWxsOwogICAgICAgICAgfQogICAgICAgIH0KICAg ICAgICByZXR1cm4gbW9kdWxlczsKICAgICAgfShfbW9kdWxlQ291bnQpOwoKICAgICAgc2V0dXBQb3NpdGlvblByb2JlUGF0dGVybigwLCAwKTsKICAgICAg c2V0dXBQb3NpdGlvblByb2JlUGF0dGVybihfbW9kdWxlQ291bnQgLSA3LCAwKTsKICAgICAgc2V0dXBQb3NpdGlvblByb2JlUGF0dGVybigwLCBfbW9kdWxl Q291bnQgLSA3KTsKICAgICAgc2V0dXBQb3NpdGlvbkFkanVzdFBhdHRlcm4oKTsKICAgICAgc2V0dXBUaW1pbmdQYXR0ZXJuKCk7CiAgICAgIHNldHVwVHlw ZUluZm8odGVzdCwgbWFza1BhdHRlcm4pOwoKICAgICAgaWYgKF90eXBlTnVtYmVyID49IDcpIHsKICAgICAgICBzZXR1cFR5cGVOdW1iZXIodGVzdCk7CiAg ICAgIH0KCiAgICAgIGlmIChfZGF0YUNhY2hlID09IG51bGwpIHsKICAgICAgICBfZGF0YUNhY2hlID0gY3JlYXRlRGF0YShfdHlwZU51bWJlciwgX2Vycm9y Q29ycmVjdGlvbkxldmVsLCBfZGF0YUxpc3QpOwogICAgICB9CgogICAgICBtYXBEYXRhKF9kYXRhQ2FjaGUsIG1hc2tQYXR0ZXJuKTsKICAgIH07CgogICAg dmFyIHNldHVwUG9zaXRpb25Qcm9iZVBhdHRlcm4gPSBmdW5jdGlvbihyb3csIGNvbCkgewoKICAgICAgZm9yICh2YXIgciA9IC0xOyByIDw9IDc7IHIgKz0g MSkgewoKICAgICAgICBpZiAocm93ICsgciA8PSAtMSB8fCBfbW9kdWxlQ291bnQgPD0gcm93ICsgcikgY29udGludWU7CgogICAgICAgIGZvciAodmFyIGMg PSAtMTsgYyA8PSA3OyBjICs9IDEpIHsKCiAgICAgICAgICBpZiAoY29sICsgYyA8PSAtMSB8fCBfbW9kdWxlQ291bnQgPD0gY29sICsgYykgY29udGludWU7 CgogICAgICAgICAgaWYgKCAoMCA8PSByICYmIHIgPD0gNiAmJiAoYyA9PSAwIHx8IGMgPT0gNikgKQogICAgICAgICAgICAgIHx8ICgwIDw9IGMgJiYgYyA8 PSA2ICYmIChyID09IDAgfHwgciA9PSA2KSApCiAgICAgICAgICAgICAgfHwgKDIgPD0gciAmJiByIDw9IDQgJiYgMiA8PSBjICYmIGMgPD0gNCkgKSB7CiAg ICAgICAgICAgIF9tb2R1bGVzW3JvdyArIHJdW2NvbCArIGNdID0gdHJ1ZTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIF9tb2R1bGVzW3JvdyAr IHJdW2NvbCArIGNdID0gZmFsc2U7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9OwoKICAgIHZhciBnZXRCZXN0TWFza1BhdHRlcm4gPSBm dW5jdGlvbigpIHsKCiAgICAgIHZhciBtaW5Mb3N0UG9pbnQgPSAwOwogICAgICB2YXIgcGF0dGVybiA9IDA7CgogICAgICBmb3IgKHZhciBpID0gMDsgaSA8 IDg7IGkgKz0gMSkgewoKICAgICAgICBtYWtlSW1wbCh0cnVlLCBpKTsKCiAgICAgICAgdmFyIGxvc3RQb2ludCA9IFFSVXRpbC5nZXRMb3N0UG9pbnQoX3Ro aXMpOwoKICAgICAgICBpZiAoaSA9PSAwIHx8IG1pbkxvc3RQb2ludCA+IGxvc3RQb2ludCkgewogICAgICAgICAgbWluTG9zdFBvaW50ID0gbG9zdFBvaW50 OwogICAgICAgICAgcGF0dGVybiA9IGk7CiAgICAgICAgfQogICAgICB9CgogICAgICByZXR1cm4gcGF0dGVybjsKICAgIH07CgogICAgdmFyIHNldHVwVGlt aW5nUGF0dGVybiA9IGZ1bmN0aW9uKCkgewoKICAgICAgZm9yICh2YXIgciA9IDg7IHIgPCBfbW9kdWxlQ291bnQgLSA4OyByICs9IDEpIHsKICAgICAgICBp ZiAoX21vZHVsZXNbcl1bNl0gIT0gbnVsbCkgewogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIF9tb2R1bGVzW3JdWzZdID0gKHIgJSAy ID09IDApOwogICAgICB9CgogICAgICBmb3IgKHZhciBjID0gODsgYyA8IF9tb2R1bGVDb3VudCAtIDg7IGMgKz0gMSkgewogICAgICAgIGlmIChfbW9kdWxl c1s2XVtjXSAhPSBudWxsKSB7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgX21vZHVsZXNbNl1bY10gPSAoYyAlIDIgPT0gMCk7CiAg ICAgIH0KICAgIH07CgogICAgdmFyIHNldHVwUG9zaXRpb25BZGp1c3RQYXR0ZXJuID0gZnVuY3Rpb24oKSB7CgogICAgICB2YXIgcG9zID0gUVJVdGlsLmdl dFBhdHRlcm5Qb3NpdGlvbihfdHlwZU51bWJlcik7CgogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBvcy5sZW5ndGg7IGkgKz0gMSkgewoKICAgICAgICBm b3IgKHZhciBqID0gMDsgaiA8IHBvcy5sZW5ndGg7IGogKz0gMSkgewoKICAgICAgICAgIHZhciByb3cgPSBwb3NbaV07CiAgICAgICAgICB2YXIgY29sID0g cG9zW2pdOwoKICAgICAgICAgIGlmIChfbW9kdWxlc1tyb3ddW2NvbF0gIT0gbnVsbCkgewogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgIH0KCiAg ICAgICAgICBmb3IgKHZhciByID0gLTI7IHIgPD0gMjsgciArPSAxKSB7CgogICAgICAgICAgICBmb3IgKHZhciBjID0gLTI7IGMgPD0gMjsgYyArPSAxKSB7 CgogICAgICAgICAgICAgIGlmIChyID09IC0yIHx8IHIgPT0gMiB8fCBjID09IC0yIHx8IGMgPT0gMgogICAgICAgICAgICAgICAgICB8fCAociA9PSAwICYm IGMgPT0gMCkgKSB7CiAgICAgICAgICAgICAgICBfbW9kdWxlc1tyb3cgKyByXVtjb2wgKyBjXSA9IHRydWU7CiAgICAgICAgICAgICAgfSBlbHNlIHsKICAg ICAgICAgICAgICAgIF9tb2R1bGVzW3JvdyArIHJdW2NvbCArIGNdID0gZmFsc2U7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9 CiAgICAgICAgfQogICAgICB9CiAgICB9OwoKICAgIHZhciBzZXR1cFR5cGVOdW1iZXIgPSBmdW5jdGlvbih0ZXN0KSB7CgogICAgICB2YXIgYml0cyA9IFFS VXRpbC5nZXRCQ0hUeXBlTnVtYmVyKF90eXBlTnVtYmVyKTsKCiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgMTg7IGkgKz0gMSkgewogICAgICAgIHZhciBt b2QgPSAoIXRlc3QgJiYgKCAoYml0cyA+PiBpKSAmIDEpID09IDEpOwogICAgICAgIF9tb2R1bGVzW01hdGguZmxvb3IoaSAvIDMpXVtpICUgMyArIF9tb2R1 bGVDb3VudCAtIDggLSAzXSA9IG1vZDsKICAgICAgfQoKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCAxODsgaSArPSAxKSB7CiAgICAgICAgdmFyIG1vZCA9 ICghdGVzdCAmJiAoIChiaXRzID4+IGkpICYgMSkgPT0gMSk7CiAgICAgICAgX21vZHVsZXNbaSAlIDMgKyBfbW9kdWxlQ291bnQgLSA4IC0gM11bTWF0aC5m bG9vcihpIC8gMyldID0gbW9kOwogICAgICB9CiAgICB9OwoKICAgIHZhciBzZXR1cFR5cGVJbmZvID0gZnVuY3Rpb24odGVzdCwgbWFza1BhdHRlcm4pIHsK CiAgICAgIHZhciBkYXRhID0gKF9lcnJvckNvcnJlY3Rpb25MZXZlbCA8PCAzKSB8IG1hc2tQYXR0ZXJuOwogICAgICB2YXIgYml0cyA9IFFSVXRpbC5nZXRC Q0hUeXBlSW5mbyhkYXRhKTsKCiAgICAgIC8vIHZlcnRpY2FsCiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgMTU7IGkgKz0gMSkgewoKICAgICAgICB2YXIg bW9kID0gKCF0ZXN0ICYmICggKGJpdHMgPj4gaSkgJiAxKSA9PSAxKTsKCiAgICAgICAgaWYgKGkgPCA2KSB7CiAgICAgICAgICBfbW9kdWxlc1tpXVs4XSA9 IG1vZDsKICAgICAgICB9IGVsc2UgaWYgKGkgPCA4KSB7CiAgICAgICAgICBfbW9kdWxlc1tpICsgMV1bOF0gPSBtb2Q7CiAgICAgICAgfSBlbHNlIHsKICAg ICAgICAgIF9tb2R1bGVzW19tb2R1bGVDb3VudCAtIDE1ICsgaV1bOF0gPSBtb2Q7CiAgICAgICAgfQogICAgICB9CgogICAgICAvLyBob3Jpem9udGFsCiAg ICAgIGZvciAodmFyIGkgPSAwOyBpIDwgMTU7IGkgKz0gMSkgewoKICAgICAgICB2YXIgbW9kID0gKCF0ZXN0ICYmICggKGJpdHMgPj4gaSkgJiAxKSA9PSAx KTsKCiAgICAgICAgaWYgKGkgPCA4KSB7CiAgICAgICAgICBfbW9kdWxlc1s4XVtfbW9kdWxlQ291bnQgLSBpIC0gMV0gPSBtb2Q7CiAgICAgICAgfSBlbHNl IGlmIChpIDwgOSkgewogICAgICAgICAgX21vZHVsZXNbOF1bMTUgLSBpIC0gMSArIDFdID0gbW9kOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBfbW9k dWxlc1s4XVsxNSAtIGkgLSAxXSA9IG1vZDsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8vIGZpeGVkIG1vZHVsZQogICAgICBfbW9kdWxlc1tfbW9kdWxl Q291bnQgLSA4XVs4XSA9ICghdGVzdCk7CiAgICB9OwoKICAgIHZhciBtYXBEYXRhID0gZnVuY3Rpb24oZGF0YSwgbWFza1BhdHRlcm4pIHsKCiAgICAgIHZh ciBpbmMgPSAtMTsKICAgICAgdmFyIHJvdyA9IF9tb2R1bGVDb3VudCAtIDE7CiAgICAgIHZhciBiaXRJbmRleCA9IDc7CiAgICAgIHZhciBieXRlSW5kZXgg PSAwOwogICAgICB2YXIgbWFza0Z1bmMgPSBRUlV0aWwuZ2V0TWFza0Z1bmN0aW9uKG1hc2tQYXR0ZXJuKTsKCiAgICAgIGZvciAodmFyIGNvbCA9IF9tb2R1 bGVDb3VudCAtIDE7IGNvbCA+IDA7IGNvbCAtPSAyKSB7CgogICAgICAgIGlmIChjb2wgPT0gNikgY29sIC09IDE7CgogICAgICAgIHdoaWxlICh0cnVlKSB7 CgogICAgICAgICAgZm9yICh2YXIgYyA9IDA7IGMgPCAyOyBjICs9IDEpIHsKCiAgICAgICAgICAgIGlmIChfbW9kdWxlc1tyb3ddW2NvbCAtIGNdID09IG51 bGwpIHsKCiAgICAgICAgICAgICAgdmFyIGRhcmsgPSBmYWxzZTsKCiAgICAgICAgICAgICAgaWYgKGJ5dGVJbmRleCA8IGRhdGEubGVuZ3RoKSB7CiAgICAg ICAgICAgICAgICBkYXJrID0gKCAoIChkYXRhW2J5dGVJbmRleF0gPj4+IGJpdEluZGV4KSAmIDEpID09IDEpOwogICAgICAgICAgICAgIH0KCiAgICAgICAg ICAgICAgdmFyIG1hc2sgPSBtYXNrRnVuYyhyb3csIGNvbCAtIGMpOwoKICAgICAgICAgICAgICBpZiAobWFzaykgewogICAgICAgICAgICAgICAgZGFyayA9 ICFkYXJrOwogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgX21vZHVsZXNbcm93XVtjb2wgLSBjXSA9IGRhcms7CiAgICAgICAgICAgICAgYml0SW5k ZXggLT0gMTsKCiAgICAgICAgICAgICAgaWYgKGJpdEluZGV4ID09IC0xKSB7CiAgICAgICAgICAgICAgICBieXRlSW5kZXggKz0gMTsKICAgICAgICAgICAg ICAgIGJpdEluZGV4ID0gNzsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KCiAgICAgICAgICByb3cgKz0gaW5jOwoKICAgICAg ICAgIGlmIChyb3cgPCAwIHx8IF9tb2R1bGVDb3VudCA8PSByb3cpIHsKICAgICAgICAgICAgcm93IC09IGluYzsKICAgICAgICAgICAgaW5jID0gLWluYzsK ICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9OwoKICAgIHZhciBjcmVhdGVCeXRlcyA9IGZ1bmN0aW9uKGJ1 ZmZlciwgcnNCbG9ja3MpIHsKCiAgICAgIHZhciBvZmZzZXQgPSAwOwoKICAgICAgdmFyIG1heERjQ291bnQgPSAwOwogICAgICB2YXIgbWF4RWNDb3VudCA9 IDA7CgogICAgICB2YXIgZGNkYXRhID0gbmV3IEFycmF5KHJzQmxvY2tzLmxlbmd0aCk7CiAgICAgIHZhciBlY2RhdGEgPSBuZXcgQXJyYXkocnNCbG9ja3Mu bGVuZ3RoKTsKCiAgICAgIGZvciAodmFyIHIgPSAwOyByIDwgcnNCbG9ja3MubGVuZ3RoOyByICs9IDEpIHsKCiAgICAgICAgdmFyIGRjQ291bnQgPSByc0Js b2Nrc1tyXS5kYXRhQ291bnQ7CiAgICAgICAgdmFyIGVjQ291bnQgPSByc0Jsb2Nrc1tyXS50b3RhbENvdW50IC0gZGNDb3VudDsKCiAgICAgICAgbWF4RGND b3VudCA9IE1hdGgubWF4KG1heERjQ291bnQsIGRjQ291bnQpOwogICAgICAgIG1heEVjQ291bnQgPSBNYXRoLm1heChtYXhFY0NvdW50LCBlY0NvdW50KTsK CiAgICAgICAgZGNkYXRhW3JdID0gbmV3IEFycmF5KGRjQ291bnQpOwoKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRjZGF0YVtyXS5sZW5ndGg7IGkg Kz0gMSkgewogICAgICAgICAgZGNkYXRhW3JdW2ldID0gMHhmZiAmIGJ1ZmZlci5nZXRCdWZmZXIoKVtpICsgb2Zmc2V0XTsKICAgICAgICB9CiAgICAgICAg b2Zmc2V0ICs9IGRjQ291bnQ7CgogICAgICAgIHZhciByc1BvbHkgPSBRUlV0aWwuZ2V0RXJyb3JDb3JyZWN0UG9seW5vbWlhbChlY0NvdW50KTsKICAgICAg ICB2YXIgcmF3UG9seSA9IHFyUG9seW5vbWlhbChkY2RhdGFbcl0sIHJzUG9seS5nZXRMZW5ndGgoKSAtIDEpOwoKICAgICAgICB2YXIgbW9kUG9seSA9IHJh d1BvbHkubW9kKHJzUG9seSk7CiAgICAgICAgZWNkYXRhW3JdID0gbmV3IEFycmF5KHJzUG9seS5nZXRMZW5ndGgoKSAtIDEpOwogICAgICAgIGZvciAodmFy IGkgPSAwOyBpIDwgZWNkYXRhW3JdLmxlbmd0aDsgaSArPSAxKSB7CiAgICAgICAgICB2YXIgbW9kSW5kZXggPSBpICsgbW9kUG9seS5nZXRMZW5ndGgoKSAt IGVjZGF0YVtyXS5sZW5ndGg7CiAgICAgICAgICBlY2RhdGFbcl1baV0gPSAobW9kSW5kZXggPj0gMCk/IG1vZFBvbHkuZ2V0QXQobW9kSW5kZXgpIDogMDsK ICAgICAgICB9CiAgICAgIH0KCiAgICAgIHZhciB0b3RhbENvZGVDb3VudCA9IDA7CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcnNCbG9ja3MubGVuZ3Ro OyBpICs9IDEpIHsKICAgICAgICB0b3RhbENvZGVDb3VudCArPSByc0Jsb2Nrc1tpXS50b3RhbENvdW50OwogICAgICB9CgogICAgICB2YXIgZGF0YSA9IG5l dyBBcnJheSh0b3RhbENvZGVDb3VudCk7CiAgICAgIHZhciBpbmRleCA9IDA7CgogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1heERjQ291bnQ7IGkgKz0g MSkgewogICAgICAgIGZvciAodmFyIHIgPSAwOyByIDwgcnNCbG9ja3MubGVuZ3RoOyByICs9IDEpIHsKICAgICAgICAgIGlmIChpIDwgZGNkYXRhW3JdLmxl bmd0aCkgewogICAgICAgICAgICBkYXRhW2luZGV4XSA9IGRjZGF0YVtyXVtpXTsKICAgICAgICAgICAgaW5kZXggKz0gMTsKICAgICAgICAgIH0KICAgICAg ICB9CiAgICAgIH0KCiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbWF4RWNDb3VudDsgaSArPSAxKSB7CiAgICAgICAgZm9yICh2YXIgciA9IDA7IHIgPCBy c0Jsb2Nrcy5sZW5ndGg7IHIgKz0gMSkgewogICAgICAgICAgaWYgKGkgPCBlY2RhdGFbcl0ubGVuZ3RoKSB7CiAgICAgICAgICAgIGRhdGFbaW5kZXhdID0g ZWNkYXRhW3JdW2ldOwogICAgICAgICAgICBpbmRleCArPSAxOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQoKICAgICAgcmV0dXJuIGRhdGE7CiAg ICB9OwoKICAgIHZhciBjcmVhdGVEYXRhID0gZnVuY3Rpb24odHlwZU51bWJlciwgZXJyb3JDb3JyZWN0aW9uTGV2ZWwsIGRhdGFMaXN0KSB7CgogICAgICB2 YXIgcnNCbG9ja3MgPSBRUlJTQmxvY2suZ2V0UlNCbG9ja3ModHlwZU51bWJlciwgZXJyb3JDb3JyZWN0aW9uTGV2ZWwpOwoKICAgICAgdmFyIGJ1ZmZlciA9 IHFyQml0QnVmZmVyKCk7CgogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRhdGFMaXN0Lmxlbmd0aDsgaSArPSAxKSB7CiAgICAgICAgdmFyIGRhdGEgPSBk YXRhTGlzdFtpXTsKICAgICAgICBidWZmZXIucHV0KGRhdGEuZ2V0TW9kZSgpLCA0KTsKICAgICAgICBidWZmZXIucHV0KGRhdGEuZ2V0TGVuZ3RoKCksIFFS VXRpbC5nZXRMZW5ndGhJbkJpdHMoZGF0YS5nZXRNb2RlKCksIHR5cGVOdW1iZXIpICk7CiAgICAgICAgZGF0YS53cml0ZShidWZmZXIpOwogICAgICB9Cgog ICAgICAvLyBjYWxjIG51bSBtYXggZGF0YS4KICAgICAgdmFyIHRvdGFsRGF0YUNvdW50ID0gMDsKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCByc0Jsb2Nr cy5sZW5ndGg7IGkgKz0gMSkgewogICAgICAgIHRvdGFsRGF0YUNvdW50ICs9IHJzQmxvY2tzW2ldLmRhdGFDb3VudDsKICAgICAgfQoKICAgICAgaWYgKGJ1 ZmZlci5nZXRMZW5ndGhJbkJpdHMoKSA+IHRvdGFsRGF0YUNvdW50ICogOCkgewogICAgICAgIHRocm93ICdjb2RlIGxlbmd0aCBvdmVyZmxvdy4gKCcKICAg ICAgICAgICsgYnVmZmVyLmdldExlbmd0aEluQml0cygpCiAgICAgICAgICArICc+JwogICAgICAgICAgKyB0b3RhbERhdGFDb3VudCAqIDgKICAgICAgICAg ICsgJyknOwogICAgICB9CgogICAgICAvLyBlbmQgY29kZQogICAgICBpZiAoYnVmZmVyLmdldExlbmd0aEluQml0cygpICsgNCA8PSB0b3RhbERhdGFDb3Vu dCAqIDgpIHsKICAgICAgICBidWZmZXIucHV0KDAsIDQpOwogICAgICB9CgogICAgICAvLyBwYWRkaW5nCiAgICAgIHdoaWxlIChidWZmZXIuZ2V0TGVuZ3Ro SW5CaXRzKCkgJSA4ICE9IDApIHsKICAgICAgICBidWZmZXIucHV0Qml0KGZhbHNlKTsKICAgICAgfQoKICAgICAgLy8gcGFkZGluZwogICAgICB3aGlsZSAo dHJ1ZSkgewoKICAgICAgICBpZiAoYnVmZmVyLmdldExlbmd0aEluQml0cygpID49IHRvdGFsRGF0YUNvdW50ICogOCkgewogICAgICAgICAgYnJlYWs7CiAg ICAgICAgfQogICAgICAgIGJ1ZmZlci5wdXQoUEFEMCwgOCk7CgogICAgICAgIGlmIChidWZmZXIuZ2V0TGVuZ3RoSW5CaXRzKCkgPj0gdG90YWxEYXRhQ291 bnQgKiA4KSB7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgYnVmZmVyLnB1dChQQUQxLCA4KTsKICAgICAgfQoKICAgICAgcmV0dXJuIGNy ZWF0ZUJ5dGVzKGJ1ZmZlciwgcnNCbG9ja3MpOwogICAgfTsKCiAgICBfdGhpcy5hZGREYXRhID0gZnVuY3Rpb24oZGF0YSwgbW9kZSkgewoKICAgICAgbW9k ZSA9IG1vZGUgfHwgJ0J5dGUnOwoKICAgICAgdmFyIG5ld0RhdGEgPSBudWxsOwoKICAgICAgc3dpdGNoKG1vZGUpIHsKICAgICAgY2FzZSAnTnVtZXJpYycg OgogICAgICAgIG5ld0RhdGEgPSBxck51bWJlcihkYXRhKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSAnQWxwaGFudW1lcmljJyA6CiAgICAgICAgbmV3 RGF0YSA9IHFyQWxwaGFOdW0oZGF0YSk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgJ0J5dGUnIDoKICAgICAgICBuZXdEYXRhID0gcXI4Qml0Qnl0ZShk YXRhKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSAnS2FuamknIDoKICAgICAgICBuZXdEYXRhID0gcXJLYW5qaShkYXRhKTsKICAgICAgICBicmVhazsK ICAgICAgZGVmYXVsdCA6CiAgICAgICAgdGhyb3cgJ21vZGU6JyArIG1vZGU7CiAgICAgIH0KCiAgICAgIF9kYXRhTGlzdC5wdXNoKG5ld0RhdGEpOwogICAg ICBfZGF0YUNhY2hlID0gbnVsbDsKICAgIH07CgogICAgX3RoaXMuaXNEYXJrID0gZnVuY3Rpb24ocm93LCBjb2wpIHsKICAgICAgaWYgKHJvdyA8IDAgfHwg X21vZHVsZUNvdW50IDw9IHJvdyB8fCBjb2wgPCAwIHx8IF9tb2R1bGVDb3VudCA8PSBjb2wpIHsKICAgICAgICB0aHJvdyByb3cgKyAnLCcgKyBjb2w7CiAg ICAgIH0KICAgICAgcmV0dXJuIF9tb2R1bGVzW3Jvd11bY29sXTsKICAgIH07CgogICAgX3RoaXMuZ2V0TW9kdWxlQ291bnQgPSBmdW5jdGlvbigpIHsKICAg ICAgcmV0dXJuIF9tb2R1bGVDb3VudDsKICAgIH07CgogICAgX3RoaXMubWFrZSA9IGZ1bmN0aW9uKCkgewogICAgICBpZiAoX3R5cGVOdW1iZXIgPCAxKSB7 CiAgICAgICAgdmFyIHR5cGVOdW1iZXIgPSAxOwoKICAgICAgICBmb3IgKDsgdHlwZU51bWJlciA8IDQwOyB0eXBlTnVtYmVyKyspIHsKICAgICAgICAgIHZh ciByc0Jsb2NrcyA9IFFSUlNCbG9jay5nZXRSU0Jsb2Nrcyh0eXBlTnVtYmVyLCBfZXJyb3JDb3JyZWN0aW9uTGV2ZWwpOwogICAgICAgICAgdmFyIGJ1ZmZl ciA9IHFyQml0QnVmZmVyKCk7CgogICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBfZGF0YUxpc3QubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgdmFy IGRhdGEgPSBfZGF0YUxpc3RbaV07CiAgICAgICAgICAgIGJ1ZmZlci5wdXQoZGF0YS5nZXRNb2RlKCksIDQpOwogICAgICAgICAgICBidWZmZXIucHV0KGRh dGEuZ2V0TGVuZ3RoKCksIFFSVXRpbC5nZXRMZW5ndGhJbkJpdHMoZGF0YS5nZXRNb2RlKCksIHR5cGVOdW1iZXIpICk7CiAgICAgICAgICAgIGRhdGEud3Jp dGUoYnVmZmVyKTsKICAgICAgICAgIH0KCiAgICAgICAgICB2YXIgdG90YWxEYXRhQ291bnQgPSAwOwogICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBy c0Jsb2Nrcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICB0b3RhbERhdGFDb3VudCArPSByc0Jsb2Nrc1tpXS5kYXRhQ291bnQ7CiAgICAgICAgICB9Cgog ICAgICAgICAgaWYgKGJ1ZmZlci5nZXRMZW5ndGhJbkJpdHMoKSA8PSB0b3RhbERhdGFDb3VudCAqIDgpIHsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAg ICB9CiAgICAgICAgfQoKICAgICAgICBfdHlwZU51bWJlciA9IHR5cGVOdW1iZXI7CiAgICAgIH0KCiAgICAgIG1ha2VJbXBsKGZhbHNlLCBnZXRCZXN0TWFz a1BhdHRlcm4oKSApOwogICAgfTsKCiAgICBfdGhpcy5jcmVhdGVUYWJsZVRhZyA9IGZ1bmN0aW9uKGNlbGxTaXplLCBtYXJnaW4pIHsKCiAgICAgIGNlbGxT aXplID0gY2VsbFNpemUgfHwgMjsKICAgICAgbWFyZ2luID0gKHR5cGVvZiBtYXJnaW4gPT0gJ3VuZGVmaW5lZCcpPyBjZWxsU2l6ZSAqIDQgOiBtYXJnaW47 CgogICAgICB2YXIgcXJIdG1sID0gJyc7CgogICAgICBxckh0bWwgKz0gJzx0YWJsZSBzdHlsZT0iJzsKICAgICAgcXJIdG1sICs9ICcgYm9yZGVyLXdpZHRo OiAwcHg7IGJvcmRlci1zdHlsZTogbm9uZTsnOwogICAgICBxckh0bWwgKz0gJyBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOyc7CiAgICAgIHFySHRtbCAr PSAnIHBhZGRpbmc6IDBweDsgbWFyZ2luOiAnICsgbWFyZ2luICsgJ3B4Oyc7CiAgICAgIHFySHRtbCArPSAnIj4nOwogICAgICBxckh0bWwgKz0gJzx0Ym9k eT4nOwoKICAgICAgZm9yICh2YXIgciA9IDA7IHIgPCBfdGhpcy5nZXRNb2R1bGVDb3VudCgpOyByICs9IDEpIHsKCiAgICAgICAgcXJIdG1sICs9ICc8dHI+ JzsKCiAgICAgICAgZm9yICh2YXIgYyA9IDA7IGMgPCBfdGhpcy5nZXRNb2R1bGVDb3VudCgpOyBjICs9IDEpIHsKICAgICAgICAgIHFySHRtbCArPSAnPHRk IHN0eWxlPSInOwogICAgICAgICAgcXJIdG1sICs9ICcgYm9yZGVyLXdpZHRoOiAwcHg7IGJvcmRlci1zdHlsZTogbm9uZTsnOwogICAgICAgICAgcXJIdG1s ICs9ICcgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsnOwogICAgICAgICAgcXJIdG1sICs9ICcgcGFkZGluZzogMHB4OyBtYXJnaW46IDBweDsnOwogICAg ICAgICAgcXJIdG1sICs9ICcgd2lkdGg6ICcgKyBjZWxsU2l6ZSArICdweDsnOwogICAgICAgICAgcXJIdG1sICs9ICcgaGVpZ2h0OiAnICsgY2VsbFNpemUg KyAncHg7JzsKICAgICAgICAgIHFySHRtbCArPSAnIGJhY2tncm91bmQtY29sb3I6ICc7CiAgICAgICAgICBxckh0bWwgKz0gX3RoaXMuaXNEYXJrKHIsIGMp PyAnIzAwMDAwMCcgOiAnI2ZmZmZmZic7CiAgICAgICAgICBxckh0bWwgKz0gJzsnOwogICAgICAgICAgcXJIdG1sICs9ICciLz4nOwogICAgICAgIH0KCiAg ICAgICAgcXJIdG1sICs9ICc8L3RyPic7CiAgICAgIH0KCiAgICAgIHFySHRtbCArPSAnPC90Ym9keT4nOwogICAgICBxckh0bWwgKz0gJzwvdGFibGU+JzsK CiAgICAgIHJldHVybiBxckh0bWw7CiAgICB9OwoKICAgIF90aGlzLmNyZWF0ZVN2Z1RhZyA9IGZ1bmN0aW9uKGNlbGxTaXplLCBtYXJnaW4sIGFsdCwgdGl0 bGUpIHsKCiAgICAgIHZhciBvcHRzID0ge307CiAgICAgIGlmICh0eXBlb2YgYXJndW1lbnRzWzBdID09ICdvYmplY3QnKSB7CiAgICAgICAgLy8gQ2FsbGVk IGJ5IG9wdGlvbnMuCiAgICAgICAgb3B0cyA9IGFyZ3VtZW50c1swXTsKICAgICAgICAvLyBvdmVyd3JpdGUgY2VsbFNpemUgYW5kIG1hcmdpbi4KICAgICAg ICBjZWxsU2l6ZSA9IG9wdHMuY2VsbFNpemU7CiAgICAgICAgbWFyZ2luID0gb3B0cy5tYXJnaW47CiAgICAgICAgYWx0ID0gb3B0cy5hbHQ7CiAgICAgICAg dGl0bGUgPSBvcHRzLnRpdGxlOwogICAgICB9CgogICAgICBjZWxsU2l6ZSA9IGNlbGxTaXplIHx8IDI7CiAgICAgIG1hcmdpbiA9ICh0eXBlb2YgbWFyZ2lu ID09ICd1bmRlZmluZWQnKT8gY2VsbFNpemUgKiA0IDogbWFyZ2luOwoKICAgICAgLy8gQ29tcG9zZSBhbHQgcHJvcGVydHkgc3Vycm9nYXRlCiAgICAgIGFs dCA9ICh0eXBlb2YgYWx0ID09PSAnc3RyaW5nJykgPyB7dGV4dDogYWx0fSA6IGFsdCB8fCB7fTsKICAgICAgYWx0LnRleHQgPSBhbHQudGV4dCB8fCBudWxs OwogICAgICBhbHQuaWQgPSAoYWx0LnRleHQpID8gYWx0LmlkIHx8ICdxcmNvZGUtZGVzY3JpcHRpb24nIDogbnVsbDsKCiAgICAgIC8vIENvbXBvc2UgdGl0 bGUgcHJvcGVydHkgc3Vycm9nYXRlCiAgICAgIHRpdGxlID0gKHR5cGVvZiB0aXRsZSA9PT0gJ3N0cmluZycpID8ge3RleHQ6IHRpdGxlfSA6IHRpdGxlIHx8 IHt9OwogICAgICB0aXRsZS50ZXh0ID0gdGl0bGUudGV4dCB8fCBudWxsOwogICAgICB0aXRsZS5pZCA9ICh0aXRsZS50ZXh0KSA/IHRpdGxlLmlkIHx8ICdx cmNvZGUtdGl0bGUnIDogbnVsbDsKCiAgICAgIHZhciBzaXplID0gX3RoaXMuZ2V0TW9kdWxlQ291bnQoKSAqIGNlbGxTaXplICsgbWFyZ2luICogMjsKICAg ICAgdmFyIGMsIG1jLCByLCBtciwgcXJTdmc9JycsIHJlY3Q7CgogICAgICByZWN0ID0gJ2wnICsgY2VsbFNpemUgKyAnLDAgMCwnICsgY2VsbFNpemUgKwog ICAgICAgICcgLScgKyBjZWxsU2l6ZSArICcsMCAwLC0nICsgY2VsbFNpemUgKyAneiAnOwoKICAgICAgcXJTdmcgKz0gJzxzdmcgdmVyc2lvbj0iMS4xIiB4 bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciJzsKICAgICAgcXJTdmcgKz0gIW9wdHMuc2NhbGFibGUgPyAnIHdpZHRoPSInICsgc2l6ZSArICdw eCIgaGVpZ2h0PSInICsgc2l6ZSArICdweCInIDogJyc7CiAgICAgIHFyU3ZnICs9ICcgdmlld0JveD0iMCAwICcgKyBzaXplICsgJyAnICsgc2l6ZSArICci ICc7CiAgICAgIHFyU3ZnICs9ICcgcHJlc2VydmVBc3BlY3RSYXRpbz0ieE1pbllNaW4gbWVldCInOwogICAgICBxclN2ZyArPSAodGl0bGUudGV4dCB8fCBh bHQudGV4dCkgPyAnIHJvbGU9ImltZyIgYXJpYS1sYWJlbGxlZGJ5PSInICsKICAgICAgICAgIGVzY2FwZVhtbChbdGl0bGUuaWQsIGFsdC5pZF0uam9pbign ICcpLnRyaW0oKSApICsgJyInIDogJyc7CiAgICAgIHFyU3ZnICs9ICc+JzsKICAgICAgcXJTdmcgKz0gKHRpdGxlLnRleHQpID8gJzx0aXRsZSBpZD0iJyAr IGVzY2FwZVhtbCh0aXRsZS5pZCkgKyAnIj4nICsKICAgICAgICAgIGVzY2FwZVhtbCh0aXRsZS50ZXh0KSArICc8L3RpdGxlPicgOiAnJzsKICAgICAgcXJT dmcgKz0gKGFsdC50ZXh0KSA/ICc8ZGVzY3JpcHRpb24gaWQ9IicgKyBlc2NhcGVYbWwoYWx0LmlkKSArICciPicgKwogICAgICAgICAgZXNjYXBlWG1sKGFs dC50ZXh0KSArICc8L2Rlc2NyaXB0aW9uPicgOiAnJzsKICAgICAgcXJTdmcgKz0gJzxyZWN0IHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9Indo aXRlIiBjeD0iMCIgY3k9IjAiLz4nOwogICAgICBxclN2ZyArPSAnPHBhdGggZD0iJzsKCiAgICAgIGZvciAociA9IDA7IHIgPCBfdGhpcy5nZXRNb2R1bGVD b3VudCgpOyByICs9IDEpIHsKICAgICAgICBtciA9IHIgKiBjZWxsU2l6ZSArIG1hcmdpbjsKICAgICAgICBmb3IgKGMgPSAwOyBjIDwgX3RoaXMuZ2V0TW9k dWxlQ291bnQoKTsgYyArPSAxKSB7CiAgICAgICAgICBpZiAoX3RoaXMuaXNEYXJrKHIsIGMpICkgewogICAgICAgICAgICBtYyA9IGMqY2VsbFNpemUrbWFy Z2luOwogICAgICAgICAgICBxclN2ZyArPSAnTScgKyBtYyArICcsJyArIG1yICsgcmVjdDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAg IHFyU3ZnICs9ICciIHN0cm9rZT0idHJhbnNwYXJlbnQiIGZpbGw9ImJsYWNrIi8+JzsKICAgICAgcXJTdmcgKz0gJzwvc3ZnPic7CgogICAgICByZXR1cm4g cXJTdmc7CiAgICB9OwoKICAgIF90aGlzLmNyZWF0ZURhdGFVUkwgPSBmdW5jdGlvbihjZWxsU2l6ZSwgbWFyZ2luKSB7CgogICAgICBjZWxsU2l6ZSA9IGNl bGxTaXplIHx8IDI7CiAgICAgIG1hcmdpbiA9ICh0eXBlb2YgbWFyZ2luID09ICd1bmRlZmluZWQnKT8gY2VsbFNpemUgKiA0IDogbWFyZ2luOwoKICAgICAg dmFyIHNpemUgPSBfdGhpcy5nZXRNb2R1bGVDb3VudCgpICogY2VsbFNpemUgKyBtYXJnaW4gKiAyOwogICAgICB2YXIgbWluID0gbWFyZ2luOwogICAgICB2 YXIgbWF4ID0gc2l6ZSAtIG1hcmdpbjsKCiAgICAgIHJldHVybiBjcmVhdGVEYXRhVVJMKHNpemUsIHNpemUsIGZ1bmN0aW9uKHgsIHkpIHsKICAgICAgICBp ZiAobWluIDw9IHggJiYgeCA8IG1heCAmJiBtaW4gPD0geSAmJiB5IDwgbWF4KSB7CiAgICAgICAgICB2YXIgYyA9IE1hdGguZmxvb3IoICh4IC0gbWluKSAv IGNlbGxTaXplKTsKICAgICAgICAgIHZhciByID0gTWF0aC5mbG9vciggKHkgLSBtaW4pIC8gY2VsbFNpemUpOwogICAgICAgICAgcmV0dXJuIF90aGlzLmlz RGFyayhyLCBjKT8gMCA6IDE7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJldHVybiAxOwogICAgICAgIH0KICAgICAgfSApOwogICAgfTsKCiAgICBf dGhpcy5jcmVhdGVJbWdUYWcgPSBmdW5jdGlvbihjZWxsU2l6ZSwgbWFyZ2luLCBhbHQpIHsKCiAgICAgIGNlbGxTaXplID0gY2VsbFNpemUgfHwgMjsKICAg ICAgbWFyZ2luID0gKHR5cGVvZiBtYXJnaW4gPT0gJ3VuZGVmaW5lZCcpPyBjZWxsU2l6ZSAqIDQgOiBtYXJnaW47CgogICAgICB2YXIgc2l6ZSA9IF90aGlz LmdldE1vZHVsZUNvdW50KCkgKiBjZWxsU2l6ZSArIG1hcmdpbiAqIDI7CgogICAgICB2YXIgaW1nID0gJyc7CiAgICAgIGltZyArPSAnPGltZyc7CiAgICAg IGltZyArPSAnXHUwMDIwc3JjPSInOwogICAgICBpbWcgKz0gX3RoaXMuY3JlYXRlRGF0YVVSTChjZWxsU2l6ZSwgbWFyZ2luKTsKICAgICAgaW1nICs9ICci JzsKICAgICAgaW1nICs9ICdcdTAwMjB3aWR0aD0iJzsKICAgICAgaW1nICs9IHNpemU7CiAgICAgIGltZyArPSAnIic7CiAgICAgIGltZyArPSAnXHUwMDIw aGVpZ2h0PSInOwogICAgICBpbWcgKz0gc2l6ZTsKICAgICAgaW1nICs9ICciJzsKICAgICAgaWYgKGFsdCkgewogICAgICAgIGltZyArPSAnXHUwMDIwYWx0 PSInOwogICAgICAgIGltZyArPSBlc2NhcGVYbWwoYWx0KTsKICAgICAgICBpbWcgKz0gJyInOwogICAgICB9CiAgICAgIGltZyArPSAnLz4nOwoKICAgICAg cmV0dXJuIGltZzsKICAgIH07CgogICAgdmFyIGVzY2FwZVhtbCA9IGZ1bmN0aW9uKHMpIHsKICAgICAgdmFyIGVzY2FwZWQgPSAnJzsKICAgICAgZm9yICh2 YXIgaSA9IDA7IGkgPCBzLmxlbmd0aDsgaSArPSAxKSB7CiAgICAgICAgdmFyIGMgPSBzLmNoYXJBdChpKTsKICAgICAgICBzd2l0Y2goYykgewogICAgICAg IGNhc2UgJzwnOiBlc2NhcGVkICs9ICcmbHQ7JzsgYnJlYWs7CiAgICAgICAgY2FzZSAnPic6IGVzY2FwZWQgKz0gJyZndDsnOyBicmVhazsKICAgICAgICBj YXNlICcmJzogZXNjYXBlZCArPSAnJmFtcDsnOyBicmVhazsKICAgICAgICBjYXNlICciJzogZXNjYXBlZCArPSAnJnF1b3Q7JzsgYnJlYWs7CiAgICAgICAg ZGVmYXVsdCA6IGVzY2FwZWQgKz0gYzsgYnJlYWs7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBlc2NhcGVkOwogICAgfTsKCiAgICB2YXIgX2Ny ZWF0ZUhhbGZBU0NJSSA9IGZ1bmN0aW9uKG1hcmdpbikgewogICAgICB2YXIgY2VsbFNpemUgPSAxOwogICAgICBtYXJnaW4gPSAodHlwZW9mIG1hcmdpbiA9 PSAndW5kZWZpbmVkJyk/IGNlbGxTaXplICogMiA6IG1hcmdpbjsKCiAgICAgIHZhciBzaXplID0gX3RoaXMuZ2V0TW9kdWxlQ291bnQoKSAqIGNlbGxTaXpl ICsgbWFyZ2luICogMjsKICAgICAgdmFyIG1pbiA9IG1hcmdpbjsKICAgICAgdmFyIG1heCA9IHNpemUgLSBtYXJnaW47CgogICAgICB2YXIgeSwgeCwgcjEs IHIyLCBwOwoKICAgICAgdmFyIGJsb2NrcyA9IHsKICAgICAgICAn4paI4paIJzogJ+KWiCcsCiAgICAgICAgJ+KWiCAnOiAn4paAJywKICAgICAgICAnIOKW iCc6ICfiloQnLAogICAgICAgICcgICc6ICcgJwogICAgICB9OwoKICAgICAgdmFyIGJsb2Nrc0xhc3RMaW5lTm9NYXJnaW4gPSB7CiAgICAgICAgJ+KWiOKW iCc6ICfiloAnLAogICAgICAgICfiloggJzogJ+KWgCcsCiAgICAgICAgJyDilognOiAnICcsCiAgICAgICAgJyAgJzogJyAnCiAgICAgIH07CgogICAgICB2 YXIgYXNjaWkgPSAnJzsKICAgICAgZm9yICh5ID0gMDsgeSA8IHNpemU7IHkgKz0gMikgewogICAgICAgIHIxID0gTWF0aC5mbG9vcigoeSAtIG1pbikgLyBj ZWxsU2l6ZSk7CiAgICAgICAgcjIgPSBNYXRoLmZsb29yKCh5ICsgMSAtIG1pbikgLyBjZWxsU2l6ZSk7CiAgICAgICAgZm9yICh4ID0gMDsgeCA8IHNpemU7 IHggKz0gMSkgewogICAgICAgICAgcCA9ICfilognOwoKICAgICAgICAgIGlmIChtaW4gPD0geCAmJiB4IDwgbWF4ICYmIG1pbiA8PSB5ICYmIHkgPCBtYXgg JiYgX3RoaXMuaXNEYXJrKHIxLCBNYXRoLmZsb29yKCh4IC0gbWluKSAvIGNlbGxTaXplKSkpIHsKICAgICAgICAgICAgcCA9ICcgJzsKICAgICAgICAgIH0K CiAgICAgICAgICBpZiAobWluIDw9IHggJiYgeCA8IG1heCAmJiBtaW4gPD0geSsxICYmIHkrMSA8IG1heCAmJiBfdGhpcy5pc0RhcmsocjIsIE1hdGguZmxv b3IoKHggLSBtaW4pIC8gY2VsbFNpemUpKSkgewogICAgICAgICAgICBwICs9ICcgJzsKICAgICAgICAgIH0KICAgICAgICAgIGVsc2UgewogICAgICAgICAg ICBwICs9ICfilognOwogICAgICAgICAgfQoKICAgICAgICAgIC8vIE91dHB1dCAyIGNoYXJhY3RlcnMgcGVyIHBpeGVsLCB0byBjcmVhdGUgZnVsbCBzcXVh cmUuIDEgY2hhcmFjdGVyIHBlciBwaXhlbHMgZ2l2ZXMgb25seSBoYWxmIHdpZHRoIG9mIHNxdWFyZS4KICAgICAgICAgIGFzY2lpICs9IChtYXJnaW4gPCAx ICYmIHkrMSA+PSBtYXgpID8gYmxvY2tzTGFzdExpbmVOb01hcmdpbltwXSA6IGJsb2Nrc1twXTsKICAgICAgICB9CgogICAgICAgIGFzY2lpICs9ICdcbic7 CiAgICAgIH0KCiAgICAgIGlmIChzaXplICUgMiAmJiBtYXJnaW4gPiAwKSB7CiAgICAgICAgcmV0dXJuIGFzY2lpLnN1YnN0cmluZygwLCBhc2NpaS5sZW5n dGggLSBzaXplIC0gMSkgKyBBcnJheShzaXplKzEpLmpvaW4oJ+KWgCcpOwogICAgICB9CgogICAgICByZXR1cm4gYXNjaWkuc3Vic3RyaW5nKDAsIGFzY2lp Lmxlbmd0aC0xKTsKICAgIH07CgogICAgX3RoaXMuY3JlYXRlQVNDSUkgPSBmdW5jdGlvbihjZWxsU2l6ZSwgbWFyZ2luKSB7CiAgICAgIGNlbGxTaXplID0g Y2VsbFNpemUgfHwgMTsKCiAgICAgIGlmIChjZWxsU2l6ZSA8IDIpIHsKICAgICAgICByZXR1cm4gX2NyZWF0ZUhhbGZBU0NJSShtYXJnaW4pOwogICAgICB9 CgogICAgICBjZWxsU2l6ZSAtPSAxOwogICAgICBtYXJnaW4gPSAodHlwZW9mIG1hcmdpbiA9PSAndW5kZWZpbmVkJyk/IGNlbGxTaXplICogMiA6IG1hcmdp bjsKCiAgICAgIHZhciBzaXplID0gX3RoaXMuZ2V0TW9kdWxlQ291bnQoKSAqIGNlbGxTaXplICsgbWFyZ2luICogMjsKICAgICAgdmFyIG1pbiA9IG1hcmdp bjsKICAgICAgdmFyIG1heCA9IHNpemUgLSBtYXJnaW47CgogICAgICB2YXIgeSwgeCwgciwgcDsKCiAgICAgIHZhciB3aGl0ZSA9IEFycmF5KGNlbGxTaXpl KzEpLmpvaW4oJ+KWiOKWiCcpOwogICAgICB2YXIgYmxhY2sgPSBBcnJheShjZWxsU2l6ZSsxKS5qb2luKCcgICcpOwoKICAgICAgdmFyIGFzY2lpID0gJyc7 CiAgICAgIHZhciBsaW5lID0gJyc7CiAgICAgIGZvciAoeSA9IDA7IHkgPCBzaXplOyB5ICs9IDEpIHsKICAgICAgICByID0gTWF0aC5mbG9vciggKHkgLSBt aW4pIC8gY2VsbFNpemUpOwogICAgICAgIGxpbmUgPSAnJzsKICAgICAgICBmb3IgKHggPSAwOyB4IDwgc2l6ZTsgeCArPSAxKSB7CiAgICAgICAgICBwID0g MTsKCiAgICAgICAgICBpZiAobWluIDw9IHggJiYgeCA8IG1heCAmJiBtaW4gPD0geSAmJiB5IDwgbWF4ICYmIF90aGlzLmlzRGFyayhyLCBNYXRoLmZsb29y KCh4IC0gbWluKSAvIGNlbGxTaXplKSkpIHsKICAgICAgICAgICAgcCA9IDA7CiAgICAgICAgICB9CgogICAgICAgICAgLy8gT3V0cHV0IDIgY2hhcmFjdGVy cyBwZXIgcGl4ZWwsIHRvIGNyZWF0ZSBmdWxsIHNxdWFyZS4gMSBjaGFyYWN0ZXIgcGVyIHBpeGVscyBnaXZlcyBvbmx5IGhhbGYgd2lkdGggb2Ygc3F1YXJl LgogICAgICAgICAgbGluZSArPSBwID8gd2hpdGUgOiBibGFjazsKICAgICAgICB9CgogICAgICAgIGZvciAociA9IDA7IHIgPCBjZWxsU2l6ZTsgciArPSAx KSB7CiAgICAgICAgICBhc2NpaSArPSBsaW5lICsgJ1xuJzsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIHJldHVybiBhc2NpaS5zdWJzdHJpbmcoMCwgYXNj aWkubGVuZ3RoLTEpOwogICAgfTsKCiAgICBfdGhpcy5yZW5kZXJUbzJkQ29udGV4dCA9IGZ1bmN0aW9uKGNvbnRleHQsIGNlbGxTaXplKSB7CiAgICAgIGNl bGxTaXplID0gY2VsbFNpemUgfHwgMjsKICAgICAgdmFyIGxlbmd0aCA9IF90aGlzLmdldE1vZHVsZUNvdW50KCk7CiAgICAgIGZvciAodmFyIHJvdyA9IDA7 IHJvdyA8IGxlbmd0aDsgcm93KyspIHsKICAgICAgICBmb3IgKHZhciBjb2wgPSAwOyBjb2wgPCBsZW5ndGg7IGNvbCsrKSB7CiAgICAgICAgICBjb250ZXh0 LmZpbGxTdHlsZSA9IF90aGlzLmlzRGFyayhyb3csIGNvbCkgPyAnYmxhY2snIDogJ3doaXRlJzsKICAgICAgICAgIGNvbnRleHQuZmlsbFJlY3Qocm93ICog Y2VsbFNpemUsIGNvbCAqIGNlbGxTaXplLCBjZWxsU2l6ZSwgY2VsbFNpemUpOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIHJldHVybiBfdGhpczsK ICB9OwoKICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIC8vIHFyY29k ZS5zdHJpbmdUb0J5dGVzCiAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0K CiAgcXJjb2RlLnN0cmluZ1RvQnl0ZXNGdW5jcyA9IHsKICAgICdkZWZhdWx0JyA6IGZ1bmN0aW9uKHMpIHsKICAgICAgdmFyIGJ5dGVzID0gW107CiAgICAg IGZvciAodmFyIGkgPSAwOyBpIDwgcy5sZW5ndGg7IGkgKz0gMSkgewogICAgICAgIHZhciBjID0gcy5jaGFyQ29kZUF0KGkpOwogICAgICAgIGJ5dGVzLnB1 c2goYyAmIDB4ZmYpOwogICAgICB9CiAgICAgIHJldHVybiBieXRlczsKICAgIH0KICB9OwoKICBxcmNvZGUuc3RyaW5nVG9CeXRlcyA9IHFyY29kZS5zdHJp bmdUb0J5dGVzRnVuY3NbJ2RlZmF1bHQnXTsKCiAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0KICAvLyBxcmNvZGUuY3JlYXRlU3RyaW5nVG9CeXRlcwogIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogIC8qKgogICAqIEBwYXJhbSB1bmljb2RlRGF0YSBiYXNlNjQgc3RyaW5nIG9mIGJ5dGUgYXJyYXkuCiAg ICogWzE2Yml0IFVuaWNvZGVdLFsxNmJpdCBCeXRlc10sIC4uLgogICAqIEBwYXJhbSBudW1DaGFycwogICAqLwogIHFyY29kZS5jcmVhdGVTdHJpbmdUb0J5 dGVzID0gZnVuY3Rpb24odW5pY29kZURhdGEsIG51bUNoYXJzKSB7CgogICAgLy8gY3JlYXRlIGNvbnZlcnNpb24gbWFwLgoKICAgIHZhciB1bmljb2RlTWFw ID0gZnVuY3Rpb24oKSB7CgogICAgICB2YXIgYmluID0gYmFzZTY0RGVjb2RlSW5wdXRTdHJlYW0odW5pY29kZURhdGEpOwogICAgICB2YXIgcmVhZCA9IGZ1 bmN0aW9uKCkgewogICAgICAgIHZhciBiID0gYmluLnJlYWQoKTsKICAgICAgICBpZiAoYiA9PSAtMSkgdGhyb3cgJ2VvZic7CiAgICAgICAgcmV0dXJuIGI7 CiAgICAgIH07CgogICAgICB2YXIgY291bnQgPSAwOwogICAgICB2YXIgdW5pY29kZU1hcCA9IHt9OwogICAgICB3aGlsZSAodHJ1ZSkgewogICAgICAgIHZh ciBiMCA9IGJpbi5yZWFkKCk7CiAgICAgICAgaWYgKGIwID09IC0xKSBicmVhazsKICAgICAgICB2YXIgYjEgPSByZWFkKCk7CiAgICAgICAgdmFyIGIyID0g cmVhZCgpOwogICAgICAgIHZhciBiMyA9IHJlYWQoKTsKICAgICAgICB2YXIgayA9IFN0cmluZy5mcm9tQ2hhckNvZGUoIChiMCA8PCA4KSB8IGIxKTsKICAg ICAgICB2YXIgdiA9IChiMiA8PCA4KSB8IGIzOwogICAgICAgIHVuaWNvZGVNYXBba10gPSB2OwogICAgICAgIGNvdW50ICs9IDE7CiAgICAgIH0KICAgICAg aWYgKGNvdW50ICE9IG51bUNoYXJzKSB7CiAgICAgICAgdGhyb3cgY291bnQgKyAnICE9ICcgKyBudW1DaGFyczsKICAgICAgfQoKICAgICAgcmV0dXJuIHVu aWNvZGVNYXA7CiAgICB9KCk7CgogICAgdmFyIHVua25vd25DaGFyID0gJz8nLmNoYXJDb2RlQXQoMCk7CgogICAgcmV0dXJuIGZ1bmN0aW9uKHMpIHsKICAg ICAgdmFyIGJ5dGVzID0gW107CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcy5sZW5ndGg7IGkgKz0gMSkgewogICAgICAgIHZhciBjID0gcy5jaGFyQ29k ZUF0KGkpOwogICAgICAgIGlmIChjIDwgMTI4KSB7CiAgICAgICAgICBieXRlcy5wdXNoKGMpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB2YXIgYiA9 IHVuaWNvZGVNYXBbcy5jaGFyQXQoaSldOwogICAgICAgICAgaWYgKHR5cGVvZiBiID09ICdudW1iZXInKSB7CiAgICAgICAgICAgIGlmICggKGIgJiAweGZm KSA9PSBiKSB7CiAgICAgICAgICAgICAgLy8gMWJ5dGUKICAgICAgICAgICAgICBieXRlcy5wdXNoKGIpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAg ICAgICAgIC8vIDJieXRlcwogICAgICAgICAgICAgIGJ5dGVzLnB1c2goYiA+Pj4gOCk7CiAgICAgICAgICAgICAgYnl0ZXMucHVzaChiICYgMHhmZik7CiAg ICAgICAgICAgIH0KICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGJ5dGVzLnB1c2godW5rbm93bkNoYXIpOwogICAgICAgICAgfQogICAgICAgIH0K ICAgICAgfQogICAgICByZXR1cm4gYnl0ZXM7CiAgICB9OwogIH07CgogIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgLy8gUVJNb2RlCiAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgdmFyIFFSTW9kZSA9IHsKICAgIE1PREVfTlVNQkVSIDogICAgMSA8PCAwLAogICAgTU9ERV9BTFBIQV9OVU0gOiAx IDw8IDEsCiAgICBNT0RFXzhCSVRfQllURSA6IDEgPDwgMiwKICAgIE1PREVfS0FOSkkgOiAgICAgMSA8PCAzCiAgfTsKCiAgLy8tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAvLyBRUkVycm9yQ29ycmVjdGlvbkxldmVsCiAgLy8tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgdmFyIFFSRXJyb3JDb3JyZWN0aW9u TGV2ZWwgPSB7CiAgICBMIDogMSwKICAgIE0gOiAwLAogICAgUSA6IDMsCiAgICBIIDogMgogIH07CgogIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgLy8gUVJNYXNrUGF0dGVybgogIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogIHZhciBRUk1hc2tQYXR0ZXJuID0gewogICAgUEFUVEVSTjAwMCA6IDAs CiAgICBQQVRURVJOMDAxIDogMSwKICAgIFBBVFRFUk4wMTAgOiAyLAogICAgUEFUVEVSTjAxMSA6IDMsCiAgICBQQVRURVJOMTAwIDogNCwKICAgIFBBVFRF Uk4xMDEgOiA1LAogICAgUEFUVEVSTjExMCA6IDYsCiAgICBQQVRURVJOMTExIDogNwogIH07CgogIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgLy8gUVJVdGlsCiAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgdmFyIFFSVXRpbCA9IGZ1bmN0aW9uKCkgewoKICAgIHZhciBQQVRURVJOX1BPU0lUSU9O X1RBQkxFID0gWwogICAgICBbXSwKICAgICAgWzYsIDE4XSwKICAgICAgWzYsIDIyXSwKICAgICAgWzYsIDI2XSwKICAgICAgWzYsIDMwXSwKICAgICAgWzYs IDM0XSwKICAgICAgWzYsIDIyLCAzOF0sCiAgICAgIFs2LCAyNCwgNDJdLAogICAgICBbNiwgMjYsIDQ2XSwKICAgICAgWzYsIDI4LCA1MF0sCiAgICAgIFs2 LCAzMCwgNTRdLAogICAgICBbNiwgMzIsIDU4XSwKICAgICAgWzYsIDM0LCA2Ml0sCiAgICAgIFs2LCAyNiwgNDYsIDY2XSwKICAgICAgWzYsIDI2LCA0OCwg NzBdLAogICAgICBbNiwgMjYsIDUwLCA3NF0sCiAgICAgIFs2LCAzMCwgNTQsIDc4XSwKICAgICAgWzYsIDMwLCA1NiwgODJdLAogICAgICBbNiwgMzAsIDU4 LCA4Nl0sCiAgICAgIFs2LCAzNCwgNjIsIDkwXSwKICAgICAgWzYsIDI4LCA1MCwgNzIsIDk0XSwKICAgICAgWzYsIDI2LCA1MCwgNzQsIDk4XSwKICAgICAg WzYsIDMwLCA1NCwgNzgsIDEwMl0sCiAgICAgIFs2LCAyOCwgNTQsIDgwLCAxMDZdLAogICAgICBbNiwgMzIsIDU4LCA4NCwgMTEwXSwKICAgICAgWzYsIDMw LCA1OCwgODYsIDExNF0sCiAgICAgIFs2LCAzNCwgNjIsIDkwLCAxMThdLAogICAgICBbNiwgMjYsIDUwLCA3NCwgOTgsIDEyMl0sCiAgICAgIFs2LCAzMCwg NTQsIDc4LCAxMDIsIDEyNl0sCiAgICAgIFs2LCAyNiwgNTIsIDc4LCAxMDQsIDEzMF0sCiAgICAgIFs2LCAzMCwgNTYsIDgyLCAxMDgsIDEzNF0sCiAgICAg IFs2LCAzNCwgNjAsIDg2LCAxMTIsIDEzOF0sCiAgICAgIFs2LCAzMCwgNTgsIDg2LCAxMTQsIDE0Ml0sCiAgICAgIFs2LCAzNCwgNjIsIDkwLCAxMTgsIDE0 Nl0sCiAgICAgIFs2LCAzMCwgNTQsIDc4LCAxMDIsIDEyNiwgMTUwXSwKICAgICAgWzYsIDI0LCA1MCwgNzYsIDEwMiwgMTI4LCAxNTRdLAogICAgICBbNiwg MjgsIDU0LCA4MCwgMTA2LCAxMzIsIDE1OF0sCiAgICAgIFs2LCAzMiwgNTgsIDg0LCAxMTAsIDEzNiwgMTYyXSwKICAgICAgWzYsIDI2LCA1NCwgODIsIDEx MCwgMTM4LCAxNjZdLAogICAgICBbNiwgMzAsIDU4LCA4NiwgMTE0LCAxNDIsIDE3MF0KICAgIF07CiAgICB2YXIgRzE1ID0gKDEgPDwgMTApIHwgKDEgPDwg OCkgfCAoMSA8PCA1KSB8ICgxIDw8IDQpIHwgKDEgPDwgMikgfCAoMSA8PCAxKSB8ICgxIDw8IDApOwogICAgdmFyIEcxOCA9ICgxIDw8IDEyKSB8ICgxIDw8 IDExKSB8ICgxIDw8IDEwKSB8ICgxIDw8IDkpIHwgKDEgPDwgOCkgfCAoMSA8PCA1KSB8ICgxIDw8IDIpIHwgKDEgPDwgMCk7CiAgICB2YXIgRzE1X01BU0sg PSAoMSA8PCAxNCkgfCAoMSA8PCAxMikgfCAoMSA8PCAxMCkgfCAoMSA8PCA0KSB8ICgxIDw8IDEpOwoKICAgIHZhciBfdGhpcyA9IHt9OwoKICAgIHZhciBn ZXRCQ0hEaWdpdCA9IGZ1bmN0aW9uKGRhdGEpIHsKICAgICAgdmFyIGRpZ2l0ID0gMDsKICAgICAgd2hpbGUgKGRhdGEgIT0gMCkgewogICAgICAgIGRpZ2l0 ICs9IDE7CiAgICAgICAgZGF0YSA+Pj49IDE7CiAgICAgIH0KICAgICAgcmV0dXJuIGRpZ2l0OwogICAgfTsKCiAgICBfdGhpcy5nZXRCQ0hUeXBlSW5mbyA9 IGZ1bmN0aW9uKGRhdGEpIHsKICAgICAgdmFyIGQgPSBkYXRhIDw8IDEwOwogICAgICB3aGlsZSAoZ2V0QkNIRGlnaXQoZCkgLSBnZXRCQ0hEaWdpdChHMTUp ID49IDApIHsKICAgICAgICBkIF49IChHMTUgPDwgKGdldEJDSERpZ2l0KGQpIC0gZ2V0QkNIRGlnaXQoRzE1KSApICk7CiAgICAgIH0KICAgICAgcmV0dXJu ICggKGRhdGEgPDwgMTApIHwgZCkgXiBHMTVfTUFTSzsKICAgIH07CgogICAgX3RoaXMuZ2V0QkNIVHlwZU51bWJlciA9IGZ1bmN0aW9uKGRhdGEpIHsKICAg ICAgdmFyIGQgPSBkYXRhIDw8IDEyOwogICAgICB3aGlsZSAoZ2V0QkNIRGlnaXQoZCkgLSBnZXRCQ0hEaWdpdChHMTgpID49IDApIHsKICAgICAgICBkIF49 IChHMTggPDwgKGdldEJDSERpZ2l0KGQpIC0gZ2V0QkNIRGlnaXQoRzE4KSApICk7CiAgICAgIH0KICAgICAgcmV0dXJuIChkYXRhIDw8IDEyKSB8IGQ7CiAg ICB9OwoKICAgIF90aGlzLmdldFBhdHRlcm5Qb3NpdGlvbiA9IGZ1bmN0aW9uKHR5cGVOdW1iZXIpIHsKICAgICAgcmV0dXJuIFBBVFRFUk5fUE9TSVRJT05f VEFCTEVbdHlwZU51bWJlciAtIDFdOwogICAgfTsKCiAgICBfdGhpcy5nZXRNYXNrRnVuY3Rpb24gPSBmdW5jdGlvbihtYXNrUGF0dGVybikgewoKICAgICAg c3dpdGNoIChtYXNrUGF0dGVybikgewoKICAgICAgY2FzZSBRUk1hc2tQYXR0ZXJuLlBBVFRFUk4wMDAgOgogICAgICAgIHJldHVybiBmdW5jdGlvbihpLCBq KSB7IHJldHVybiAoaSArIGopICUgMiA9PSAwOyB9OwogICAgICBjYXNlIFFSTWFza1BhdHRlcm4uUEFUVEVSTjAwMSA6CiAgICAgICAgcmV0dXJuIGZ1bmN0 aW9uKGksIGopIHsgcmV0dXJuIGkgJSAyID09IDA7IH07CiAgICAgIGNhc2UgUVJNYXNrUGF0dGVybi5QQVRURVJOMDEwIDoKICAgICAgICByZXR1cm4gZnVu Y3Rpb24oaSwgaikgeyByZXR1cm4gaiAlIDMgPT0gMDsgfTsKICAgICAgY2FzZSBRUk1hc2tQYXR0ZXJuLlBBVFRFUk4wMTEgOgogICAgICAgIHJldHVybiBm dW5jdGlvbihpLCBqKSB7IHJldHVybiAoaSArIGopICUgMyA9PSAwOyB9OwogICAgICBjYXNlIFFSTWFza1BhdHRlcm4uUEFUVEVSTjEwMCA6CiAgICAgICAg cmV0dXJuIGZ1bmN0aW9uKGksIGopIHsgcmV0dXJuIChNYXRoLmZsb29yKGkgLyAyKSArIE1hdGguZmxvb3IoaiAvIDMpICkgJSAyID09IDA7IH07CiAgICAg IGNhc2UgUVJNYXNrUGF0dGVybi5QQVRURVJOMTAxIDoKICAgICAgICByZXR1cm4gZnVuY3Rpb24oaSwgaikgeyByZXR1cm4gKGkgKiBqKSAlIDIgKyAoaSAq IGopICUgMyA9PSAwOyB9OwogICAgICBjYXNlIFFSTWFza1BhdHRlcm4uUEFUVEVSTjExMCA6CiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKGksIGopIHsgcmV0 dXJuICggKGkgKiBqKSAlIDIgKyAoaSAqIGopICUgMykgJSAyID09IDA7IH07CiAgICAgIGNhc2UgUVJNYXNrUGF0dGVybi5QQVRURVJOMTExIDoKICAgICAg ICByZXR1cm4gZnVuY3Rpb24oaSwgaikgeyByZXR1cm4gKCAoaSAqIGopICUgMyArIChpICsgaikgJSAyKSAlIDIgPT0gMDsgfTsKCiAgICAgIGRlZmF1bHQg OgogICAgICAgIHRocm93ICdiYWQgbWFza1BhdHRlcm46JyArIG1hc2tQYXR0ZXJuOwogICAgICB9CiAgICB9OwoKICAgIF90aGlzLmdldEVycm9yQ29ycmVj dFBvbHlub21pYWwgPSBmdW5jdGlvbihlcnJvckNvcnJlY3RMZW5ndGgpIHsKICAgICAgdmFyIGEgPSBxclBvbHlub21pYWwoWzFdLCAwKTsKICAgICAgZm9y ICh2YXIgaSA9IDA7IGkgPCBlcnJvckNvcnJlY3RMZW5ndGg7IGkgKz0gMSkgewogICAgICAgIGEgPSBhLm11bHRpcGx5KHFyUG9seW5vbWlhbChbMSwgUVJN YXRoLmdleHAoaSldLCAwKSApOwogICAgICB9CiAgICAgIHJldHVybiBhOwogICAgfTsKCiAgICBfdGhpcy5nZXRMZW5ndGhJbkJpdHMgPSBmdW5jdGlvbiht b2RlLCB0eXBlKSB7CgogICAgICBpZiAoMSA8PSB0eXBlICYmIHR5cGUgPCAxMCkgewoKICAgICAgICAvLyAxIC0gOQoKICAgICAgICBzd2l0Y2gobW9kZSkg ewogICAgICAgIGNhc2UgUVJNb2RlLk1PREVfTlVNQkVSICAgIDogcmV0dXJuIDEwOwogICAgICAgIGNhc2UgUVJNb2RlLk1PREVfQUxQSEFfTlVNIDogcmV0 dXJuIDk7CiAgICAgICAgY2FzZSBRUk1vZGUuTU9ERV84QklUX0JZVEUgOiByZXR1cm4gODsKICAgICAgICBjYXNlIFFSTW9kZS5NT0RFX0tBTkpJICAgICA6 IHJldHVybiA4OwogICAgICAgIGRlZmF1bHQgOgogICAgICAgICAgdGhyb3cgJ21vZGU6JyArIG1vZGU7CiAgICAgICAgfQoKICAgICAgfSBlbHNlIGlmICh0 eXBlIDwgMjcpIHsKCiAgICAgICAgLy8gMTAgLSAyNgoKICAgICAgICBzd2l0Y2gobW9kZSkgewogICAgICAgIGNhc2UgUVJNb2RlLk1PREVfTlVNQkVSICAg IDogcmV0dXJuIDEyOwogICAgICAgIGNhc2UgUVJNb2RlLk1PREVfQUxQSEFfTlVNIDogcmV0dXJuIDExOwogICAgICAgIGNhc2UgUVJNb2RlLk1PREVfOEJJ VF9CWVRFIDogcmV0dXJuIDE2OwogICAgICAgIGNhc2UgUVJNb2RlLk1PREVfS0FOSkkgICAgIDogcmV0dXJuIDEwOwogICAgICAgIGRlZmF1bHQgOgogICAg ICAgICAgdGhyb3cgJ21vZGU6JyArIG1vZGU7CiAgICAgICAgfQoKICAgICAgfSBlbHNlIGlmICh0eXBlIDwgNDEpIHsKCiAgICAgICAgLy8gMjcgLSA0MAoK ICAgICAgICBzd2l0Y2gobW9kZSkgewogICAgICAgIGNhc2UgUVJNb2RlLk1PREVfTlVNQkVSICAgIDogcmV0dXJuIDE0OwogICAgICAgIGNhc2UgUVJNb2Rl Lk1PREVfQUxQSEFfTlVNIDogcmV0dXJuIDEzOwogICAgICAgIGNhc2UgUVJNb2RlLk1PREVfOEJJVF9CWVRFIDogcmV0dXJuIDE2OwogICAgICAgIGNhc2Ug UVJNb2RlLk1PREVfS0FOSkkgICAgIDogcmV0dXJuIDEyOwogICAgICAgIGRlZmF1bHQgOgogICAgICAgICAgdGhyb3cgJ21vZGU6JyArIG1vZGU7CiAgICAg ICAgfQoKICAgICAgfSBlbHNlIHsKICAgICAgICB0aHJvdyAndHlwZTonICsgdHlwZTsKICAgICAgfQogICAgfTsKCiAgICBfdGhpcy5nZXRMb3N0UG9pbnQg PSBmdW5jdGlvbihxcmNvZGUpIHsKCiAgICAgIHZhciBtb2R1bGVDb3VudCA9IHFyY29kZS5nZXRNb2R1bGVDb3VudCgpOwoKICAgICAgdmFyIGxvc3RQb2lu dCA9IDA7CgogICAgICAvLyBMRVZFTDEKCiAgICAgIGZvciAodmFyIHJvdyA9IDA7IHJvdyA8IG1vZHVsZUNvdW50OyByb3cgKz0gMSkgewogICAgICAgIGZv ciAodmFyIGNvbCA9IDA7IGNvbCA8IG1vZHVsZUNvdW50OyBjb2wgKz0gMSkgewoKICAgICAgICAgIHZhciBzYW1lQ291bnQgPSAwOwogICAgICAgICAgdmFy IGRhcmsgPSBxcmNvZGUuaXNEYXJrKHJvdywgY29sKTsKCiAgICAgICAgICBmb3IgKHZhciByID0gLTE7IHIgPD0gMTsgciArPSAxKSB7CgogICAgICAgICAg ICBpZiAocm93ICsgciA8IDAgfHwgbW9kdWxlQ291bnQgPD0gcm93ICsgcikgewogICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CgogICAg ICAgICAgICBmb3IgKHZhciBjID0gLTE7IGMgPD0gMTsgYyArPSAxKSB7CgogICAgICAgICAgICAgIGlmIChjb2wgKyBjIDwgMCB8fCBtb2R1bGVDb3VudCA8 PSBjb2wgKyBjKSB7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgIGlmIChyID09IDAgJiYgYyA9PSAw KSB7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgIGlmIChkYXJrID09IHFyY29kZS5pc0Rhcmsocm93 ICsgciwgY29sICsgYykgKSB7CiAgICAgICAgICAgICAgICBzYW1lQ291bnQgKz0gMTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAg IH0KCiAgICAgICAgICBpZiAoc2FtZUNvdW50ID4gNSkgewogICAgICAgICAgICBsb3N0UG9pbnQgKz0gKDMgKyBzYW1lQ291bnQgLSA1KTsKICAgICAgICAg IH0KICAgICAgICB9CiAgICAgIH07CgogICAgICAvLyBMRVZFTDIKCiAgICAgIGZvciAodmFyIHJvdyA9IDA7IHJvdyA8IG1vZHVsZUNvdW50IC0gMTsgcm93 ICs9IDEpIHsKICAgICAgICBmb3IgKHZhciBjb2wgPSAwOyBjb2wgPCBtb2R1bGVDb3VudCAtIDE7IGNvbCArPSAxKSB7CiAgICAgICAgICB2YXIgY291bnQg PSAwOwogICAgICAgICAgaWYgKHFyY29kZS5pc0Rhcmsocm93LCBjb2wpICkgY291bnQgKz0gMTsKICAgICAgICAgIGlmIChxcmNvZGUuaXNEYXJrKHJvdyAr IDEsIGNvbCkgKSBjb3VudCArPSAxOwogICAgICAgICAgaWYgKHFyY29kZS5pc0Rhcmsocm93LCBjb2wgKyAxKSApIGNvdW50ICs9IDE7CiAgICAgICAgICBp ZiAocXJjb2RlLmlzRGFyayhyb3cgKyAxLCBjb2wgKyAxKSApIGNvdW50ICs9IDE7CiAgICAgICAgICBpZiAoY291bnQgPT0gMCB8fCBjb3VudCA9PSA0KSB7 CiAgICAgICAgICAgIGxvc3RQb2ludCArPSAzOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQoKICAgICAgLy8gTEVWRUwzCgogICAgICBmb3IgKHZh ciByb3cgPSAwOyByb3cgPCBtb2R1bGVDb3VudDsgcm93ICs9IDEpIHsKICAgICAgICBmb3IgKHZhciBjb2wgPSAwOyBjb2wgPCBtb2R1bGVDb3VudCAtIDY7 IGNvbCArPSAxKSB7CiAgICAgICAgICBpZiAocXJjb2RlLmlzRGFyayhyb3csIGNvbCkKICAgICAgICAgICAgICAmJiAhcXJjb2RlLmlzRGFyayhyb3csIGNv bCArIDEpCiAgICAgICAgICAgICAgJiYgIHFyY29kZS5pc0Rhcmsocm93LCBjb2wgKyAyKQogICAgICAgICAgICAgICYmICBxcmNvZGUuaXNEYXJrKHJvdywg Y29sICsgMykKICAgICAgICAgICAgICAmJiAgcXJjb2RlLmlzRGFyayhyb3csIGNvbCArIDQpCiAgICAgICAgICAgICAgJiYgIXFyY29kZS5pc0Rhcmsocm93 LCBjb2wgKyA1KQogICAgICAgICAgICAgICYmICBxcmNvZGUuaXNEYXJrKHJvdywgY29sICsgNikgKSB7CiAgICAgICAgICAgIGxvc3RQb2ludCArPSA0MDsK ICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIGZvciAodmFyIGNvbCA9IDA7IGNvbCA8IG1vZHVsZUNvdW50OyBjb2wgKz0gMSkgewogICAg ICAgIGZvciAodmFyIHJvdyA9IDA7IHJvdyA8IG1vZHVsZUNvdW50IC0gNjsgcm93ICs9IDEpIHsKICAgICAgICAgIGlmIChxcmNvZGUuaXNEYXJrKHJvdywg Y29sKQogICAgICAgICAgICAgICYmICFxcmNvZGUuaXNEYXJrKHJvdyArIDEsIGNvbCkKICAgICAgICAgICAgICAmJiAgcXJjb2RlLmlzRGFyayhyb3cgKyAy LCBjb2wpCiAgICAgICAgICAgICAgJiYgIHFyY29kZS5pc0Rhcmsocm93ICsgMywgY29sKQogICAgICAgICAgICAgICYmICBxcmNvZGUuaXNEYXJrKHJvdyAr IDQsIGNvbCkKICAgICAgICAgICAgICAmJiAhcXJjb2RlLmlzRGFyayhyb3cgKyA1LCBjb2wpCiAgICAgICAgICAgICAgJiYgIHFyY29kZS5pc0Rhcmsocm93 ICsgNiwgY29sKSApIHsKICAgICAgICAgICAgbG9zdFBvaW50ICs9IDQwOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQoKICAgICAgLy8gTEVWRUw0 CgogICAgICB2YXIgZGFya0NvdW50ID0gMDsKCiAgICAgIGZvciAodmFyIGNvbCA9IDA7IGNvbCA8IG1vZHVsZUNvdW50OyBjb2wgKz0gMSkgewogICAgICAg IGZvciAodmFyIHJvdyA9IDA7IHJvdyA8IG1vZHVsZUNvdW50OyByb3cgKz0gMSkgewogICAgICAgICAgaWYgKHFyY29kZS5pc0Rhcmsocm93LCBjb2wpICkg ewogICAgICAgICAgICBkYXJrQ291bnQgKz0gMTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIHZhciByYXRpbyA9IE1hdGguYWJzKDEw MCAqIGRhcmtDb3VudCAvIG1vZHVsZUNvdW50IC8gbW9kdWxlQ291bnQgLSA1MCkgLyA1OwogICAgICBsb3N0UG9pbnQgKz0gcmF0aW8gKiAxMDsKCiAgICAg IHJldHVybiBsb3N0UG9pbnQ7CiAgICB9OwoKICAgIHJldHVybiBfdGhpczsKICB9KCk7CgogIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgLy8gUVJNYXRoCiAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgdmFyIFFSTWF0aCA9IGZ1bmN0aW9uKCkgewoKICAgIHZhciBFWFBfVEFCTEUgPSBuZXcgQXJy YXkoMjU2KTsKICAgIHZhciBMT0dfVEFCTEUgPSBuZXcgQXJyYXkoMjU2KTsKCiAgICAvLyBpbml0aWFsaXplIHRhYmxlcwogICAgZm9yICh2YXIgaSA9IDA7 IGkgPCA4OyBpICs9IDEpIHsKICAgICAgRVhQX1RBQkxFW2ldID0gMSA8PCBpOwogICAgfQogICAgZm9yICh2YXIgaSA9IDg7IGkgPCAyNTY7IGkgKz0gMSkg ewogICAgICBFWFBfVEFCTEVbaV0gPSBFWFBfVEFCTEVbaSAtIDRdCiAgICAgICAgXiBFWFBfVEFCTEVbaSAtIDVdCiAgICAgICAgXiBFWFBfVEFCTEVbaSAt IDZdCiAgICAgICAgXiBFWFBfVEFCTEVbaSAtIDhdOwogICAgfQogICAgZm9yICh2YXIgaSA9IDA7IGkgPCAyNTU7IGkgKz0gMSkgewogICAgICBMT0dfVEFC TEVbRVhQX1RBQkxFW2ldIF0gPSBpOwogICAgfQoKICAgIHZhciBfdGhpcyA9IHt9OwoKICAgIF90aGlzLmdsb2cgPSBmdW5jdGlvbihuKSB7CgogICAgICBp ZiAobiA8IDEpIHsKICAgICAgICB0aHJvdyAnZ2xvZygnICsgbiArICcpJzsKICAgICAgfQoKICAgICAgcmV0dXJuIExPR19UQUJMRVtuXTsKICAgIH07Cgog ICAgX3RoaXMuZ2V4cCA9IGZ1bmN0aW9uKG4pIHsKCiAgICAgIHdoaWxlIChuIDwgMCkgewogICAgICAgIG4gKz0gMjU1OwogICAgICB9CgogICAgICB3aGls ZSAobiA+PSAyNTYpIHsKICAgICAgICBuIC09IDI1NTsKICAgICAgfQoKICAgICAgcmV0dXJuIEVYUF9UQUJMRVtuXTsKICAgIH07CgogICAgcmV0dXJuIF90 aGlzOwogIH0oKTsKCiAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAv LyBxclBvbHlub21pYWwKICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoK ICBmdW5jdGlvbiBxclBvbHlub21pYWwobnVtLCBzaGlmdCkgewoKICAgIGlmICh0eXBlb2YgbnVtLmxlbmd0aCA9PSAndW5kZWZpbmVkJykgewogICAgICB0 aHJvdyBudW0ubGVuZ3RoICsgJy8nICsgc2hpZnQ7CiAgICB9CgogICAgdmFyIF9udW0gPSBmdW5jdGlvbigpIHsKICAgICAgdmFyIG9mZnNldCA9IDA7CiAg ICAgIHdoaWxlIChvZmZzZXQgPCBudW0ubGVuZ3RoICYmIG51bVtvZmZzZXRdID09IDApIHsKICAgICAgICBvZmZzZXQgKz0gMTsKICAgICAgfQogICAgICB2 YXIgX251bSA9IG5ldyBBcnJheShudW0ubGVuZ3RoIC0gb2Zmc2V0ICsgc2hpZnQpOwogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG51bS5sZW5ndGggLSBv ZmZzZXQ7IGkgKz0gMSkgewogICAgICAgIF9udW1baV0gPSBudW1baSArIG9mZnNldF07CiAgICAgIH0KICAgICAgcmV0dXJuIF9udW07CiAgICB9KCk7Cgog ICAgdmFyIF90aGlzID0ge307CgogICAgX3RoaXMuZ2V0QXQgPSBmdW5jdGlvbihpbmRleCkgewogICAgICByZXR1cm4gX251bVtpbmRleF07CiAgICB9OwoK ICAgIF90aGlzLmdldExlbmd0aCA9IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gX251bS5sZW5ndGg7CiAgICB9OwoKICAgIF90aGlzLm11bHRpcGx5ID0g ZnVuY3Rpb24oZSkgewoKICAgICAgdmFyIG51bSA9IG5ldyBBcnJheShfdGhpcy5nZXRMZW5ndGgoKSArIGUuZ2V0TGVuZ3RoKCkgLSAxKTsKCiAgICAgIGZv ciAodmFyIGkgPSAwOyBpIDwgX3RoaXMuZ2V0TGVuZ3RoKCk7IGkgKz0gMSkgewogICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgZS5nZXRMZW5ndGgoKTsg aiArPSAxKSB7CiAgICAgICAgICBudW1baSArIGpdIF49IFFSTWF0aC5nZXhwKFFSTWF0aC5nbG9nKF90aGlzLmdldEF0KGkpICkgKyBRUk1hdGguZ2xvZyhl LmdldEF0KGopICkgKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIHJldHVybiBxclBvbHlub21pYWwobnVtLCAwKTsKICAgIH07CgogICAgX3RoaXMubW9k ID0gZnVuY3Rpb24oZSkgewoKICAgICAgaWYgKF90aGlzLmdldExlbmd0aCgpIC0gZS5nZXRMZW5ndGgoKSA8IDApIHsKICAgICAgICByZXR1cm4gX3RoaXM7 CiAgICAgIH0KCiAgICAgIHZhciByYXRpbyA9IFFSTWF0aC5nbG9nKF90aGlzLmdldEF0KDApICkgLSBRUk1hdGguZ2xvZyhlLmdldEF0KDApICk7CgogICAg ICB2YXIgbnVtID0gbmV3IEFycmF5KF90aGlzLmdldExlbmd0aCgpICk7CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgX3RoaXMuZ2V0TGVuZ3RoKCk7IGkg Kz0gMSkgewogICAgICAgIG51bVtpXSA9IF90aGlzLmdldEF0KGkpOwogICAgICB9CgogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGUuZ2V0TGVuZ3RoKCk7 IGkgKz0gMSkgewogICAgICAgIG51bVtpXSBePSBRUk1hdGguZ2V4cChRUk1hdGguZ2xvZyhlLmdldEF0KGkpICkgKyByYXRpbyk7CiAgICAgIH0KCiAgICAg IC8vIHJlY3Vyc2l2ZSBjYWxsCiAgICAgIHJldHVybiBxclBvbHlub21pYWwobnVtLCAwKS5tb2QoZSk7CiAgICB9OwoKICAgIHJldHVybiBfdGhpczsKICB9 OwoKICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIC8vIFFSUlNCbG9j awogIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogIHZhciBRUlJTQmxv Y2sgPSBmdW5jdGlvbigpIHsKCiAgICB2YXIgUlNfQkxPQ0tfVEFCTEUgPSBbCgogICAgICAvLyBMCiAgICAgIC8vIE0KICAgICAgLy8gUQogICAgICAvLyBI CgogICAgICAvLyAxCiAgICAgIFsxLCAyNiwgMTldLAogICAgICBbMSwgMjYsIDE2XSwKICAgICAgWzEsIDI2LCAxM10sCiAgICAgIFsxLCAyNiwgOV0sCgog ICAgICAvLyAyCiAgICAgIFsxLCA0NCwgMzRdLAogICAgICBbMSwgNDQsIDI4XSwKICAgICAgWzEsIDQ0LCAyMl0sCiAgICAgIFsxLCA0NCwgMTZdLAoKICAg ICAgLy8gMwogICAgICBbMSwgNzAsIDU1XSwKICAgICAgWzEsIDcwLCA0NF0sCiAgICAgIFsyLCAzNSwgMTddLAogICAgICBbMiwgMzUsIDEzXSwKCiAgICAg IC8vIDQKICAgICAgWzEsIDEwMCwgODBdLAogICAgICBbMiwgNTAsIDMyXSwKICAgICAgWzIsIDUwLCAyNF0sCiAgICAgIFs0LCAyNSwgOV0sCgogICAgICAv LyA1CiAgICAgIFsxLCAxMzQsIDEwOF0sCiAgICAgIFsyLCA2NywgNDNdLAogICAgICBbMiwgMzMsIDE1LCAyLCAzNCwgMTZdLAogICAgICBbMiwgMzMsIDEx LCAyLCAzNCwgMTJdLAoKICAgICAgLy8gNgogICAgICBbMiwgODYsIDY4XSwKICAgICAgWzQsIDQzLCAyN10sCiAgICAgIFs0LCA0MywgMTldLAogICAgICBb NCwgNDMsIDE1XSwKCiAgICAgIC8vIDcKICAgICAgWzIsIDk4LCA3OF0sCiAgICAgIFs0LCA0OSwgMzFdLAogICAgICBbMiwgMzIsIDE0LCA0LCAzMywgMTVd LAogICAgICBbNCwgMzksIDEzLCAxLCA0MCwgMTRdLAoKICAgICAgLy8gOAogICAgICBbMiwgMTIxLCA5N10sCiAgICAgIFsyLCA2MCwgMzgsIDIsIDYxLCAz OV0sCiAgICAgIFs0LCA0MCwgMTgsIDIsIDQxLCAxOV0sCiAgICAgIFs0LCA0MCwgMTQsIDIsIDQxLCAxNV0sCgogICAgICAvLyA5CiAgICAgIFsyLCAxNDYs IDExNl0sCiAgICAgIFszLCA1OCwgMzYsIDIsIDU5LCAzN10sCiAgICAgIFs0LCAzNiwgMTYsIDQsIDM3LCAxN10sCiAgICAgIFs0LCAzNiwgMTIsIDQsIDM3 LCAxM10sCgogICAgICAvLyAxMAogICAgICBbMiwgODYsIDY4LCAyLCA4NywgNjldLAogICAgICBbNCwgNjksIDQzLCAxLCA3MCwgNDRdLAogICAgICBbNiwg NDMsIDE5LCAyLCA0NCwgMjBdLAogICAgICBbNiwgNDMsIDE1LCAyLCA0NCwgMTZdLAoKICAgICAgLy8gMTEKICAgICAgWzQsIDEwMSwgODFdLAogICAgICBb MSwgODAsIDUwLCA0LCA4MSwgNTFdLAogICAgICBbNCwgNTAsIDIyLCA0LCA1MSwgMjNdLAogICAgICBbMywgMzYsIDEyLCA4LCAzNywgMTNdLAoKICAgICAg Ly8gMTIKICAgICAgWzIsIDExNiwgOTIsIDIsIDExNywgOTNdLAogICAgICBbNiwgNTgsIDM2LCAyLCA1OSwgMzddLAogICAgICBbNCwgNDYsIDIwLCA2LCA0 NywgMjFdLAogICAgICBbNywgNDIsIDE0LCA0LCA0MywgMTVdLAoKICAgICAgLy8gMTMKICAgICAgWzQsIDEzMywgMTA3XSwKICAgICAgWzgsIDU5LCAzNywg MSwgNjAsIDM4XSwKICAgICAgWzgsIDQ0LCAyMCwgNCwgNDUsIDIxXSwKICAgICAgWzEyLCAzMywgMTEsIDQsIDM0LCAxMl0sCgogICAgICAvLyAxNAogICAg ICBbMywgMTQ1LCAxMTUsIDEsIDE0NiwgMTE2XSwKICAgICAgWzQsIDY0LCA0MCwgNSwgNjUsIDQxXSwKICAgICAgWzExLCAzNiwgMTYsIDUsIDM3LCAxN10s CiAgICAgIFsxMSwgMzYsIDEyLCA1LCAzNywgMTNdLAoKICAgICAgLy8gMTUKICAgICAgWzUsIDEwOSwgODcsIDEsIDExMCwgODhdLAogICAgICBbNSwgNjUs IDQxLCA1LCA2NiwgNDJdLAogICAgICBbNSwgNTQsIDI0LCA3LCA1NSwgMjVdLAogICAgICBbMTEsIDM2LCAxMiwgNywgMzcsIDEzXSwKCiAgICAgIC8vIDE2 CiAgICAgIFs1LCAxMjIsIDk4LCAxLCAxMjMsIDk5XSwKICAgICAgWzcsIDczLCA0NSwgMywgNzQsIDQ2XSwKICAgICAgWzE1LCA0MywgMTksIDIsIDQ0LCAy MF0sCiAgICAgIFszLCA0NSwgMTUsIDEzLCA0NiwgMTZdLAoKICAgICAgLy8gMTcKICAgICAgWzEsIDEzNSwgMTA3LCA1LCAxMzYsIDEwOF0sCiAgICAgIFsx MCwgNzQsIDQ2LCAxLCA3NSwgNDddLAogICAgICBbMSwgNTAsIDIyLCAxNSwgNTEsIDIzXSwKICAgICAgWzIsIDQyLCAxNCwgMTcsIDQzLCAxNV0sCgogICAg ICAvLyAxOAogICAgICBbNSwgMTUwLCAxMjAsIDEsIDE1MSwgMTIxXSwKICAgICAgWzksIDY5LCA0MywgNCwgNzAsIDQ0XSwKICAgICAgWzE3LCA1MCwgMjIs IDEsIDUxLCAyM10sCiAgICAgIFsyLCA0MiwgMTQsIDE5LCA0MywgMTVdLAoKICAgICAgLy8gMTkKICAgICAgWzMsIDE0MSwgMTEzLCA0LCAxNDIsIDExNF0s CiAgICAgIFszLCA3MCwgNDQsIDExLCA3MSwgNDVdLAogICAgICBbMTcsIDQ3LCAyMSwgNCwgNDgsIDIyXSwKICAgICAgWzksIDM5LCAxMywgMTYsIDQwLCAx NF0sCgogICAgICAvLyAyMAogICAgICBbMywgMTM1LCAxMDcsIDUsIDEzNiwgMTA4XSwKICAgICAgWzMsIDY3LCA0MSwgMTMsIDY4LCA0Ml0sCiAgICAgIFsx NSwgNTQsIDI0LCA1LCA1NSwgMjVdLAogICAgICBbMTUsIDQzLCAxNSwgMTAsIDQ0LCAxNl0sCgogICAgICAvLyAyMQogICAgICBbNCwgMTQ0LCAxMTYsIDQs IDE0NSwgMTE3XSwKICAgICAgWzE3LCA2OCwgNDJdLAogICAgICBbMTcsIDUwLCAyMiwgNiwgNTEsIDIzXSwKICAgICAgWzE5LCA0NiwgMTYsIDYsIDQ3LCAx N10sCgogICAgICAvLyAyMgogICAgICBbMiwgMTM5LCAxMTEsIDcsIDE0MCwgMTEyXSwKICAgICAgWzE3LCA3NCwgNDZdLAogICAgICBbNywgNTQsIDI0LCAx NiwgNTUsIDI1XSwKICAgICAgWzM0LCAzNywgMTNdLAoKICAgICAgLy8gMjMKICAgICAgWzQsIDE1MSwgMTIxLCA1LCAxNTIsIDEyMl0sCiAgICAgIFs0LCA3 NSwgNDcsIDE0LCA3NiwgNDhdLAogICAgICBbMTEsIDU0LCAyNCwgMTQsIDU1LCAyNV0sCiAgICAgIFsxNiwgNDUsIDE1LCAxNCwgNDYsIDE2XSwKCiAgICAg IC8vIDI0CiAgICAgIFs2LCAxNDcsIDExNywgNCwgMTQ4LCAxMThdLAogICAgICBbNiwgNzMsIDQ1LCAxNCwgNzQsIDQ2XSwKICAgICAgWzExLCA1NCwgMjQs IDE2LCA1NSwgMjVdLAogICAgICBbMzAsIDQ2LCAxNiwgMiwgNDcsIDE3XSwKCiAgICAgIC8vIDI1CiAgICAgIFs4LCAxMzIsIDEwNiwgNCwgMTMzLCAxMDdd LAogICAgICBbOCwgNzUsIDQ3LCAxMywgNzYsIDQ4XSwKICAgICAgWzcsIDU0LCAyNCwgMjIsIDU1LCAyNV0sCiAgICAgIFsyMiwgNDUsIDE1LCAxMywgNDYs IDE2XSwKCiAgICAgIC8vIDI2CiAgICAgIFsxMCwgMTQyLCAxMTQsIDIsIDE0MywgMTE1XSwKICAgICAgWzE5LCA3NCwgNDYsIDQsIDc1LCA0N10sCiAgICAg IFsyOCwgNTAsIDIyLCA2LCA1MSwgMjNdLAogICAgICBbMzMsIDQ2LCAxNiwgNCwgNDcsIDE3XSwKCiAgICAgIC8vIDI3CiAgICAgIFs4LCAxNTIsIDEyMiwg NCwgMTUzLCAxMjNdLAogICAgICBbMjIsIDczLCA0NSwgMywgNzQsIDQ2XSwKICAgICAgWzgsIDUzLCAyMywgMjYsIDU0LCAyNF0sCiAgICAgIFsxMiwgNDUs IDE1LCAyOCwgNDYsIDE2XSwKCiAgICAgIC8vIDI4CiAgICAgIFszLCAxNDcsIDExNywgMTAsIDE0OCwgMTE4XSwKICAgICAgWzMsIDczLCA0NSwgMjMsIDc0 LCA0Nl0sCiAgICAgIFs0LCA1NCwgMjQsIDMxLCA1NSwgMjVdLAogICAgICBbMTEsIDQ1LCAxNSwgMzEsIDQ2LCAxNl0sCgogICAgICAvLyAyOQogICAgICBb NywgMTQ2LCAxMTYsIDcsIDE0NywgMTE3XSwKICAgICAgWzIxLCA3MywgNDUsIDcsIDc0LCA0Nl0sCiAgICAgIFsxLCA1MywgMjMsIDM3LCA1NCwgMjRdLAog ICAgICBbMTksIDQ1LCAxNSwgMjYsIDQ2LCAxNl0sCgogICAgICAvLyAzMAogICAgICBbNSwgMTQ1LCAxMTUsIDEwLCAxNDYsIDExNl0sCiAgICAgIFsxOSwg NzUsIDQ3LCAxMCwgNzYsIDQ4XSwKICAgICAgWzE1LCA1NCwgMjQsIDI1LCA1NSwgMjVdLAogICAgICBbMjMsIDQ1LCAxNSwgMjUsIDQ2LCAxNl0sCgogICAg ICAvLyAzMQogICAgICBbMTMsIDE0NSwgMTE1LCAzLCAxNDYsIDExNl0sCiAgICAgIFsyLCA3NCwgNDYsIDI5LCA3NSwgNDddLAogICAgICBbNDIsIDU0LCAy NCwgMSwgNTUsIDI1XSwKICAgICAgWzIzLCA0NSwgMTUsIDI4LCA0NiwgMTZdLAoKICAgICAgLy8gMzIKICAgICAgWzE3LCAxNDUsIDExNV0sCiAgICAgIFsx MCwgNzQsIDQ2LCAyMywgNzUsIDQ3XSwKICAgICAgWzEwLCA1NCwgMjQsIDM1LCA1NSwgMjVdLAogICAgICBbMTksIDQ1LCAxNSwgMzUsIDQ2LCAxNl0sCgog ICAgICAvLyAzMwogICAgICBbMTcsIDE0NSwgMTE1LCAxLCAxNDYsIDExNl0sCiAgICAgIFsxNCwgNzQsIDQ2LCAyMSwgNzUsIDQ3XSwKICAgICAgWzI5LCA1 NCwgMjQsIDE5LCA1NSwgMjVdLAogICAgICBbMTEsIDQ1LCAxNSwgNDYsIDQ2LCAxNl0sCgogICAgICAvLyAzNAogICAgICBbMTMsIDE0NSwgMTE1LCA2LCAx NDYsIDExNl0sCiAgICAgIFsxNCwgNzQsIDQ2LCAyMywgNzUsIDQ3XSwKICAgICAgWzQ0LCA1NCwgMjQsIDcsIDU1LCAyNV0sCiAgICAgIFs1OSwgNDYsIDE2 LCAxLCA0NywgMTddLAoKICAgICAgLy8gMzUKICAgICAgWzEyLCAxNTEsIDEyMSwgNywgMTUyLCAxMjJdLAogICAgICBbMTIsIDc1LCA0NywgMjYsIDc2LCA0 OF0sCiAgICAgIFszOSwgNTQsIDI0LCAxNCwgNTUsIDI1XSwKICAgICAgWzIyLCA0NSwgMTUsIDQxLCA0NiwgMTZdLAoKICAgICAgLy8gMzYKICAgICAgWzYs IDE1MSwgMTIxLCAxNCwgMTUyLCAxMjJdLAogICAgICBbNiwgNzUsIDQ3LCAzNCwgNzYsIDQ4XSwKICAgICAgWzQ2LCA1NCwgMjQsIDEwLCA1NSwgMjVdLAog ICAgICBbMiwgNDUsIDE1LCA2NCwgNDYsIDE2XSwKCiAgICAgIC8vIDM3CiAgICAgIFsxNywgMTUyLCAxMjIsIDQsIDE1MywgMTIzXSwKICAgICAgWzI5LCA3 NCwgNDYsIDE0LCA3NSwgNDddLAogICAgICBbNDksIDU0LCAyNCwgMTAsIDU1LCAyNV0sCiAgICAgIFsyNCwgNDUsIDE1LCA0NiwgNDYsIDE2XSwKCiAgICAg IC8vIDM4CiAgICAgIFs0LCAxNTIsIDEyMiwgMTgsIDE1MywgMTIzXSwKICAgICAgWzEzLCA3NCwgNDYsIDMyLCA3NSwgNDddLAogICAgICBbNDgsIDU0LCAy NCwgMTQsIDU1LCAyNV0sCiAgICAgIFs0MiwgNDUsIDE1LCAzMiwgNDYsIDE2XSwKCiAgICAgIC8vIDM5CiAgICAgIFsyMCwgMTQ3LCAxMTcsIDQsIDE0OCwg MTE4XSwKICAgICAgWzQwLCA3NSwgNDcsIDcsIDc2LCA0OF0sCiAgICAgIFs0MywgNTQsIDI0LCAyMiwgNTUsIDI1XSwKICAgICAgWzEwLCA0NSwgMTUsIDY3 LCA0NiwgMTZdLAoKICAgICAgLy8gNDAKICAgICAgWzE5LCAxNDgsIDExOCwgNiwgMTQ5LCAxMTldLAogICAgICBbMTgsIDc1LCA0NywgMzEsIDc2LCA0OF0s CiAgICAgIFszNCwgNTQsIDI0LCAzNCwgNTUsIDI1XSwKICAgICAgWzIwLCA0NSwgMTUsIDYxLCA0NiwgMTZdCiAgICBdOwoKICAgIHZhciBxclJTQmxvY2sg PSBmdW5jdGlvbih0b3RhbENvdW50LCBkYXRhQ291bnQpIHsKICAgICAgdmFyIF90aGlzID0ge307CiAgICAgIF90aGlzLnRvdGFsQ291bnQgPSB0b3RhbENv dW50OwogICAgICBfdGhpcy5kYXRhQ291bnQgPSBkYXRhQ291bnQ7CiAgICAgIHJldHVybiBfdGhpczsKICAgIH07CgogICAgdmFyIF90aGlzID0ge307Cgog ICAgdmFyIGdldFJzQmxvY2tUYWJsZSA9IGZ1bmN0aW9uKHR5cGVOdW1iZXIsIGVycm9yQ29ycmVjdGlvbkxldmVsKSB7CgogICAgICBzd2l0Y2goZXJyb3JD b3JyZWN0aW9uTGV2ZWwpIHsKICAgICAgY2FzZSBRUkVycm9yQ29ycmVjdGlvbkxldmVsLkwgOgogICAgICAgIHJldHVybiBSU19CTE9DS19UQUJMRVsodHlw ZU51bWJlciAtIDEpICogNCArIDBdOwogICAgICBjYXNlIFFSRXJyb3JDb3JyZWN0aW9uTGV2ZWwuTSA6CiAgICAgICAgcmV0dXJuIFJTX0JMT0NLX1RBQkxF Wyh0eXBlTnVtYmVyIC0gMSkgKiA0ICsgMV07CiAgICAgIGNhc2UgUVJFcnJvckNvcnJlY3Rpb25MZXZlbC5RIDoKICAgICAgICByZXR1cm4gUlNfQkxPQ0tf VEFCTEVbKHR5cGVOdW1iZXIgLSAxKSAqIDQgKyAyXTsKICAgICAgY2FzZSBRUkVycm9yQ29ycmVjdGlvbkxldmVsLkggOgogICAgICAgIHJldHVybiBSU19C TE9DS19UQUJMRVsodHlwZU51bWJlciAtIDEpICogNCArIDNdOwogICAgICBkZWZhdWx0IDoKICAgICAgICByZXR1cm4gdW5kZWZpbmVkOwogICAgICB9CiAg ICB9OwoKICAgIF90aGlzLmdldFJTQmxvY2tzID0gZnVuY3Rpb24odHlwZU51bWJlciwgZXJyb3JDb3JyZWN0aW9uTGV2ZWwpIHsKCiAgICAgIHZhciByc0Js b2NrID0gZ2V0UnNCbG9ja1RhYmxlKHR5cGVOdW1iZXIsIGVycm9yQ29ycmVjdGlvbkxldmVsKTsKCiAgICAgIGlmICh0eXBlb2YgcnNCbG9jayA9PSAndW5k ZWZpbmVkJykgewogICAgICAgIHRocm93ICdiYWQgcnMgYmxvY2sgQCB0eXBlTnVtYmVyOicgKyB0eXBlTnVtYmVyICsKICAgICAgICAgICAgJy9lcnJvckNv cnJlY3Rpb25MZXZlbDonICsgZXJyb3JDb3JyZWN0aW9uTGV2ZWw7CiAgICAgIH0KCiAgICAgIHZhciBsZW5ndGggPSByc0Jsb2NrLmxlbmd0aCAvIDM7Cgog ICAgICB2YXIgbGlzdCA9IFtdOwoKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkgKz0gMSkgewoKICAgICAgICB2YXIgY291bnQgPSByc0Js b2NrW2kgKiAzICsgMF07CiAgICAgICAgdmFyIHRvdGFsQ291bnQgPSByc0Jsb2NrW2kgKiAzICsgMV07CiAgICAgICAgdmFyIGRhdGFDb3VudCA9IHJzQmxv Y2tbaSAqIDMgKyAyXTsKCiAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBjb3VudDsgaiArPSAxKSB7CiAgICAgICAgICBsaXN0LnB1c2gocXJSU0Jsb2Nr KHRvdGFsQ291bnQsIGRhdGFDb3VudCkgKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIHJldHVybiBsaXN0OwogICAgfTsKCiAgICByZXR1cm4gX3RoaXM7 CiAgfSgpOwoKICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIC8vIHFy Qml0QnVmZmVyCiAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgdmFy IHFyQml0QnVmZmVyID0gZnVuY3Rpb24oKSB7CgogICAgdmFyIF9idWZmZXIgPSBbXTsKICAgIHZhciBfbGVuZ3RoID0gMDsKCiAgICB2YXIgX3RoaXMgPSB7 fTsKCiAgICBfdGhpcy5nZXRCdWZmZXIgPSBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIF9idWZmZXI7CiAgICB9OwoKICAgIF90aGlzLmdldEF0ID0gZnVu Y3Rpb24oaW5kZXgpIHsKICAgICAgdmFyIGJ1ZkluZGV4ID0gTWF0aC5mbG9vcihpbmRleCAvIDgpOwogICAgICByZXR1cm4gKCAoX2J1ZmZlcltidWZJbmRl eF0gPj4+ICg3IC0gaW5kZXggJSA4KSApICYgMSkgPT0gMTsKICAgIH07CgogICAgX3RoaXMucHV0ID0gZnVuY3Rpb24obnVtLCBsZW5ndGgpIHsKICAgICAg Zm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkgKz0gMSkgewogICAgICAgIF90aGlzLnB1dEJpdCggKCAobnVtID4+PiAobGVuZ3RoIC0gaSAtIDEpICkg JiAxKSA9PSAxKTsKICAgICAgfQogICAgfTsKCiAgICBfdGhpcy5nZXRMZW5ndGhJbkJpdHMgPSBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIF9sZW5ndGg7 CiAgICB9OwoKICAgIF90aGlzLnB1dEJpdCA9IGZ1bmN0aW9uKGJpdCkgewoKICAgICAgdmFyIGJ1ZkluZGV4ID0gTWF0aC5mbG9vcihfbGVuZ3RoIC8gOCk7 CiAgICAgIGlmIChfYnVmZmVyLmxlbmd0aCA8PSBidWZJbmRleCkgewogICAgICAgIF9idWZmZXIucHVzaCgwKTsKICAgICAgfQoKICAgICAgaWYgKGJpdCkg ewogICAgICAgIF9idWZmZXJbYnVmSW5kZXhdIHw9ICgweDgwID4+PiAoX2xlbmd0aCAlIDgpICk7CiAgICAgIH0KCiAgICAgIF9sZW5ndGggKz0gMTsKICAg IH07CgogICAgcmV0dXJuIF90aGlzOwogIH07CgogIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tCiAgLy8gcXJOdW1iZXIKICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLQoKICB2YXIgcXJOdW1iZXIgPSBmdW5jdGlvbihkYXRhKSB7CgogICAgdmFyIF9tb2RlID0gUVJNb2RlLk1PREVfTlVNQkVSOwogICAgdmFy IF9kYXRhID0gZGF0YTsKCiAgICB2YXIgX3RoaXMgPSB7fTsKCiAgICBfdGhpcy5nZXRNb2RlID0gZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiBfbW9kZTsK ICAgIH07CgogICAgX3RoaXMuZ2V0TGVuZ3RoID0gZnVuY3Rpb24oYnVmZmVyKSB7CiAgICAgIHJldHVybiBfZGF0YS5sZW5ndGg7CiAgICB9OwoKICAgIF90 aGlzLndyaXRlID0gZnVuY3Rpb24oYnVmZmVyKSB7CgogICAgICB2YXIgZGF0YSA9IF9kYXRhOwoKICAgICAgdmFyIGkgPSAwOwoKICAgICAgd2hpbGUgKGkg KyAyIDwgZGF0YS5sZW5ndGgpIHsKICAgICAgICBidWZmZXIucHV0KHN0clRvTnVtKGRhdGEuc3Vic3RyaW5nKGksIGkgKyAzKSApLCAxMCk7CiAgICAgICAg aSArPSAzOwogICAgICB9CgogICAgICBpZiAoaSA8IGRhdGEubGVuZ3RoKSB7CiAgICAgICAgaWYgKGRhdGEubGVuZ3RoIC0gaSA9PSAxKSB7CiAgICAgICAg ICBidWZmZXIucHV0KHN0clRvTnVtKGRhdGEuc3Vic3RyaW5nKGksIGkgKyAxKSApLCA0KTsKICAgICAgICB9IGVsc2UgaWYgKGRhdGEubGVuZ3RoIC0gaSA9 PSAyKSB7CiAgICAgICAgICBidWZmZXIucHV0KHN0clRvTnVtKGRhdGEuc3Vic3RyaW5nKGksIGkgKyAyKSApLCA3KTsKICAgICAgICB9CiAgICAgIH0KICAg IH07CgogICAgdmFyIHN0clRvTnVtID0gZnVuY3Rpb24ocykgewogICAgICB2YXIgbnVtID0gMDsKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzLmxlbmd0 aDsgaSArPSAxKSB7CiAgICAgICAgbnVtID0gbnVtICogMTAgKyBjaGF0VG9OdW0ocy5jaGFyQXQoaSkgKTsKICAgICAgfQogICAgICByZXR1cm4gbnVtOwog ICAgfTsKCiAgICB2YXIgY2hhdFRvTnVtID0gZnVuY3Rpb24oYykgewogICAgICBpZiAoJzAnIDw9IGMgJiYgYyA8PSAnOScpIHsKICAgICAgICByZXR1cm4g Yy5jaGFyQ29kZUF0KDApIC0gJzAnLmNoYXJDb2RlQXQoMCk7CiAgICAgIH0KICAgICAgdGhyb3cgJ2lsbGVnYWwgY2hhciA6JyArIGM7CiAgICB9OwoKICAg IHJldHVybiBfdGhpczsKICB9OwoKICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLQogIC8vIHFyQWxwaGFOdW0KICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLQoKICB2YXIgcXJBbHBoYU51bSA9IGZ1bmN0aW9uKGRhdGEpIHsKCiAgICB2YXIgX21vZGUgPSBRUk1vZGUuTU9ERV9BTFBIQV9OVU07CiAgICB2YXIg X2RhdGEgPSBkYXRhOwoKICAgIHZhciBfdGhpcyA9IHt9OwoKICAgIF90aGlzLmdldE1vZGUgPSBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIF9tb2RlOwog ICAgfTsKCiAgICBfdGhpcy5nZXRMZW5ndGggPSBmdW5jdGlvbihidWZmZXIpIHsKICAgICAgcmV0dXJuIF9kYXRhLmxlbmd0aDsKICAgIH07CgogICAgX3Ro aXMud3JpdGUgPSBmdW5jdGlvbihidWZmZXIpIHsKCiAgICAgIHZhciBzID0gX2RhdGE7CgogICAgICB2YXIgaSA9IDA7CgogICAgICB3aGlsZSAoaSArIDEg PCBzLmxlbmd0aCkgewogICAgICAgIGJ1ZmZlci5wdXQoCiAgICAgICAgICBnZXRDb2RlKHMuY2hhckF0KGkpICkgKiA0NSArCiAgICAgICAgICBnZXRDb2Rl KHMuY2hhckF0KGkgKyAxKSApLCAxMSk7CiAgICAgICAgaSArPSAyOwogICAgICB9CgogICAgICBpZiAoaSA8IHMubGVuZ3RoKSB7CiAgICAgICAgYnVmZmVy LnB1dChnZXRDb2RlKHMuY2hhckF0KGkpICksIDYpOwogICAgICB9CiAgICB9OwoKICAgIHZhciBnZXRDb2RlID0gZnVuY3Rpb24oYykgewoKICAgICAgaWYg KCcwJyA8PSBjICYmIGMgPD0gJzknKSB7CiAgICAgICAgcmV0dXJuIGMuY2hhckNvZGVBdCgwKSAtICcwJy5jaGFyQ29kZUF0KDApOwogICAgICB9IGVsc2Ug aWYgKCdBJyA8PSBjICYmIGMgPD0gJ1onKSB7CiAgICAgICAgcmV0dXJuIGMuY2hhckNvZGVBdCgwKSAtICdBJy5jaGFyQ29kZUF0KDApICsgMTA7CiAgICAg IH0gZWxzZSB7CiAgICAgICAgc3dpdGNoIChjKSB7CiAgICAgICAgY2FzZSAnICcgOiByZXR1cm4gMzY7CiAgICAgICAgY2FzZSAnJCcgOiByZXR1cm4gMzc7 CiAgICAgICAgY2FzZSAnJScgOiByZXR1cm4gMzg7CiAgICAgICAgY2FzZSAnKicgOiByZXR1cm4gMzk7CiAgICAgICAgY2FzZSAnKycgOiByZXR1cm4gNDA7 CiAgICAgICAgY2FzZSAnLScgOiByZXR1cm4gNDE7CiAgICAgICAgY2FzZSAnLicgOiByZXR1cm4gNDI7CiAgICAgICAgY2FzZSAnLycgOiByZXR1cm4gNDM7 CiAgICAgICAgY2FzZSAnOicgOiByZXR1cm4gNDQ7CiAgICAgICAgZGVmYXVsdCA6CiAgICAgICAgICB0aHJvdyAnaWxsZWdhbCBjaGFyIDonICsgYzsKICAg ICAgICB9CiAgICAgIH0KICAgIH07CgogICAgcmV0dXJuIF90aGlzOwogIH07CgogIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgLy8gcXI4Qml0Qnl0ZQogIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogIHZhciBxcjhCaXRCeXRlID0gZnVuY3Rpb24oZGF0YSkgewoKICAgIHZhciBfbW9kZSA9IFFSTW9k ZS5NT0RFXzhCSVRfQllURTsKICAgIHZhciBfZGF0YSA9IGRhdGE7CiAgICB2YXIgX2J5dGVzID0gcXJjb2RlLnN0cmluZ1RvQnl0ZXMoZGF0YSk7CgogICAg dmFyIF90aGlzID0ge307CgogICAgX3RoaXMuZ2V0TW9kZSA9IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gX21vZGU7CiAgICB9OwoKICAgIF90aGlzLmdl dExlbmd0aCA9IGZ1bmN0aW9uKGJ1ZmZlcikgewogICAgICByZXR1cm4gX2J5dGVzLmxlbmd0aDsKICAgIH07CgogICAgX3RoaXMud3JpdGUgPSBmdW5jdGlv bihidWZmZXIpIHsKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBfYnl0ZXMubGVuZ3RoOyBpICs9IDEpIHsKICAgICAgICBidWZmZXIucHV0KF9ieXRlc1tp XSwgOCk7CiAgICAgIH0KICAgIH07CgogICAgcmV0dXJuIF90aGlzOwogIH07CgogIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgLy8gcXJLYW5qaQogIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogIHZhciBxckthbmppID0gZnVuY3Rpb24oZGF0YSkgewoKICAgIHZhciBfbW9kZSA9IFFSTW9kZS5NT0RF X0tBTkpJOwogICAgdmFyIF9kYXRhID0gZGF0YTsKCiAgICB2YXIgc3RyaW5nVG9CeXRlcyA9IHFyY29kZS5zdHJpbmdUb0J5dGVzRnVuY3NbJ1NKSVMnXTsK ICAgIGlmICghc3RyaW5nVG9CeXRlcykgewogICAgICB0aHJvdyAnc2ppcyBub3Qgc3VwcG9ydGVkLic7CiAgICB9CiAgICAhZnVuY3Rpb24oYywgY29kZSkg ewogICAgICAvLyBzZWxmIHRlc3QgZm9yIHNqaXMgc3VwcG9ydC4KICAgICAgdmFyIHRlc3QgPSBzdHJpbmdUb0J5dGVzKGMpOwogICAgICBpZiAodGVzdC5s ZW5ndGggIT0gMiB8fCAoICh0ZXN0WzBdIDw8IDgpIHwgdGVzdFsxXSkgIT0gY29kZSkgewogICAgICAgIHRocm93ICdzamlzIG5vdCBzdXBwb3J0ZWQuJzsK ICAgICAgfQogICAgfSgnXHU1M2NiJywgMHg5NzQ2KTsKCiAgICB2YXIgX2J5dGVzID0gc3RyaW5nVG9CeXRlcyhkYXRhKTsKCiAgICB2YXIgX3RoaXMgPSB7 fTsKCiAgICBfdGhpcy5nZXRNb2RlID0gZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiBfbW9kZTsKICAgIH07CgogICAgX3RoaXMuZ2V0TGVuZ3RoID0gZnVu Y3Rpb24oYnVmZmVyKSB7CiAgICAgIHJldHVybiB+fihfYnl0ZXMubGVuZ3RoIC8gMik7CiAgICB9OwoKICAgIF90aGlzLndyaXRlID0gZnVuY3Rpb24oYnVm ZmVyKSB7CgogICAgICB2YXIgZGF0YSA9IF9ieXRlczsKCiAgICAgIHZhciBpID0gMDsKCiAgICAgIHdoaWxlIChpICsgMSA8IGRhdGEubGVuZ3RoKSB7Cgog ICAgICAgIHZhciBjID0gKCAoMHhmZiAmIGRhdGFbaV0pIDw8IDgpIHwgKDB4ZmYgJiBkYXRhW2kgKyAxXSk7CgogICAgICAgIGlmICgweDgxNDAgPD0gYyAm JiBjIDw9IDB4OUZGQykgewogICAgICAgICAgYyAtPSAweDgxNDA7CiAgICAgICAgfSBlbHNlIGlmICgweEUwNDAgPD0gYyAmJiBjIDw9IDB4RUJCRikgewog ICAgICAgICAgYyAtPSAweEMxNDA7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRocm93ICdpbGxlZ2FsIGNoYXIgYXQgJyArIChpICsgMSkgKyAnLycg KyBjOwogICAgICAgIH0KCiAgICAgICAgYyA9ICggKGMgPj4+IDgpICYgMHhmZikgKiAweEMwICsgKGMgJiAweGZmKTsKCiAgICAgICAgYnVmZmVyLnB1dChj LCAxMyk7CgogICAgICAgIGkgKz0gMjsKICAgICAgfQoKICAgICAgaWYgKGkgPCBkYXRhLmxlbmd0aCkgewogICAgICAgIHRocm93ICdpbGxlZ2FsIGNoYXIg YXQgJyArIChpICsgMSk7CiAgICAgIH0KICAgIH07CgogICAgcmV0dXJuIF90aGlzOwogIH07CgogIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgLy8gR0lGIFN1cHBvcnQgZXRjLgogIC8vCgogIC8vLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgLy8gYnl0ZUFycmF5T3V0cHV0U3RyZWFtCiAgLy8tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgdmFyIGJ5dGVBcnJheU91dHB1dFN0cmVh bSA9IGZ1bmN0aW9uKCkgewoKICAgIHZhciBfYnl0ZXMgPSBbXTsKCiAgICB2YXIgX3RoaXMgPSB7fTsKCiAgICBfdGhpcy53cml0ZUJ5dGUgPSBmdW5jdGlv bihiKSB7CiAgICAgIF9ieXRlcy5wdXNoKGIgJiAweGZmKTsKICAgIH07CgogICAgX3RoaXMud3JpdGVTaG9ydCA9IGZ1bmN0aW9uKGkpIHsKICAgICAgX3Ro aXMud3JpdGVCeXRlKGkpOwogICAgICBfdGhpcy53cml0ZUJ5dGUoaSA+Pj4gOCk7CiAgICB9OwoKICAgIF90aGlzLndyaXRlQnl0ZXMgPSBmdW5jdGlvbihi LCBvZmYsIGxlbikgewogICAgICBvZmYgPSBvZmYgfHwgMDsKICAgICAgbGVuID0gbGVuIHx8IGIubGVuZ3RoOwogICAgICBmb3IgKHZhciBpID0gMDsgaSA8 IGxlbjsgaSArPSAxKSB7CiAgICAgICAgX3RoaXMud3JpdGVCeXRlKGJbaSArIG9mZl0pOwogICAgICB9CiAgICB9OwoKICAgIF90aGlzLndyaXRlU3RyaW5n ID0gZnVuY3Rpb24ocykgewogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHMubGVuZ3RoOyBpICs9IDEpIHsKICAgICAgICBfdGhpcy53cml0ZUJ5dGUocy5j aGFyQ29kZUF0KGkpICk7CiAgICAgIH0KICAgIH07CgogICAgX3RoaXMudG9CeXRlQXJyYXkgPSBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIF9ieXRlczsK ICAgIH07CgogICAgX3RoaXMudG9TdHJpbmcgPSBmdW5jdGlvbigpIHsKICAgICAgdmFyIHMgPSAnJzsKICAgICAgcyArPSAnWyc7CiAgICAgIGZvciAodmFy IGkgPSAwOyBpIDwgX2J5dGVzLmxlbmd0aDsgaSArPSAxKSB7CiAgICAgICAgaWYgKGkgPiAwKSB7CiAgICAgICAgICBzICs9ICcsJzsKICAgICAgICB9CiAg ICAgICAgcyArPSBfYnl0ZXNbaV07CiAgICAgIH0KICAgICAgcyArPSAnXSc7CiAgICAgIHJldHVybiBzOwogICAgfTsKCiAgICByZXR1cm4gX3RoaXM7CiAg fTsKCiAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAvLyBiYXNlNjRF bmNvZGVPdXRwdXRTdHJlYW0KICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LQoKICB2YXIgYmFzZTY0RW5jb2RlT3V0cHV0U3RyZWFtID0gZnVuY3Rpb24oKSB7CgogICAgdmFyIF9idWZmZXIgPSAwOwogICAgdmFyIF9idWZsZW4gPSAw OwogICAgdmFyIF9sZW5ndGggPSAwOwogICAgdmFyIF9iYXNlNjQgPSAnJzsKCiAgICB2YXIgX3RoaXMgPSB7fTsKCiAgICB2YXIgd3JpdGVFbmNvZGVkID0g ZnVuY3Rpb24oYikgewogICAgICBfYmFzZTY0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoZW5jb2RlKGIgJiAweDNmKSApOwogICAgfTsKCiAgICB2YXIgZW5j b2RlID0gZnVuY3Rpb24obikgewogICAgICBpZiAobiA8IDApIHsKICAgICAgICAvLyBlcnJvci4KICAgICAgfSBlbHNlIGlmIChuIDwgMjYpIHsKICAgICAg ICByZXR1cm4gMHg0MSArIG47CiAgICAgIH0gZWxzZSBpZiAobiA8IDUyKSB7CiAgICAgICAgcmV0dXJuIDB4NjEgKyAobiAtIDI2KTsKICAgICAgfSBlbHNl IGlmIChuIDwgNjIpIHsKICAgICAgICByZXR1cm4gMHgzMCArIChuIC0gNTIpOwogICAgICB9IGVsc2UgaWYgKG4gPT0gNjIpIHsKICAgICAgICByZXR1cm4g MHgyYjsKICAgICAgfSBlbHNlIGlmIChuID09IDYzKSB7CiAgICAgICAgcmV0dXJuIDB4MmY7CiAgICAgIH0KICAgICAgdGhyb3cgJ246JyArIG47CiAgICB9 OwoKICAgIF90aGlzLndyaXRlQnl0ZSA9IGZ1bmN0aW9uKG4pIHsKCiAgICAgIF9idWZmZXIgPSAoX2J1ZmZlciA8PCA4KSB8IChuICYgMHhmZik7CiAgICAg IF9idWZsZW4gKz0gODsKICAgICAgX2xlbmd0aCArPSAxOwoKICAgICAgd2hpbGUgKF9idWZsZW4gPj0gNikgewogICAgICAgIHdyaXRlRW5jb2RlZChfYnVm ZmVyID4+PiAoX2J1ZmxlbiAtIDYpICk7CiAgICAgICAgX2J1ZmxlbiAtPSA2OwogICAgICB9CiAgICB9OwoKICAgIF90aGlzLmZsdXNoID0gZnVuY3Rpb24o KSB7CgogICAgICBpZiAoX2J1ZmxlbiA+IDApIHsKICAgICAgICB3cml0ZUVuY29kZWQoX2J1ZmZlciA8PCAoNiAtIF9idWZsZW4pICk7CiAgICAgICAgX2J1 ZmZlciA9IDA7CiAgICAgICAgX2J1ZmxlbiA9IDA7CiAgICAgIH0KCiAgICAgIGlmIChfbGVuZ3RoICUgMyAhPSAwKSB7CiAgICAgICAgLy8gcGFkZGluZwog ICAgICAgIHZhciBwYWRsZW4gPSAzIC0gX2xlbmd0aCAlIDM7CiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYWRsZW47IGkgKz0gMSkgewogICAgICAg ICAgX2Jhc2U2NCArPSAnPSc7CiAgICAgICAgfQogICAgICB9CiAgICB9OwoKICAgIF90aGlzLnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7CiAgICAgIHJldHVy biBfYmFzZTY0OwogICAgfTsKCiAgICByZXR1cm4gX3RoaXM7CiAgfTsKCiAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAvLyBiYXNlNjREZWNvZGVJbnB1dFN0cmVhbQogIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogIHZhciBiYXNlNjREZWNvZGVJbnB1dFN0cmVhbSA9IGZ1bmN0aW9uKHN0cikgewoK ICAgIHZhciBfc3RyID0gc3RyOwogICAgdmFyIF9wb3MgPSAwOwogICAgdmFyIF9idWZmZXIgPSAwOwogICAgdmFyIF9idWZsZW4gPSAwOwoKICAgIHZhciBf dGhpcyA9IHt9OwoKICAgIF90aGlzLnJlYWQgPSBmdW5jdGlvbigpIHsKCiAgICAgIHdoaWxlIChfYnVmbGVuIDwgOCkgewoKICAgICAgICBpZiAoX3BvcyA+ PSBfc3RyLmxlbmd0aCkgewogICAgICAgICAgaWYgKF9idWZsZW4gPT0gMCkgewogICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgICB9CiAgICAgICAg ICB0aHJvdyAndW5leHBlY3RlZCBlbmQgb2YgZmlsZS4vJyArIF9idWZsZW47CiAgICAgICAgfQoKICAgICAgICB2YXIgYyA9IF9zdHIuY2hhckF0KF9wb3Mp OwogICAgICAgIF9wb3MgKz0gMTsKCiAgICAgICAgaWYgKGMgPT0gJz0nKSB7CiAgICAgICAgICBfYnVmbGVuID0gMDsKICAgICAgICAgIHJldHVybiAtMTsK ICAgICAgICB9IGVsc2UgaWYgKGMubWF0Y2goL15ccyQvKSApIHsKICAgICAgICAgIC8vIGlnbm9yZSBpZiB3aGl0ZXNwYWNlLgogICAgICAgICAgY29udGlu dWU7CiAgICAgICAgfQoKICAgICAgICBfYnVmZmVyID0gKF9idWZmZXIgPDwgNikgfCBkZWNvZGUoYy5jaGFyQ29kZUF0KDApICk7CiAgICAgICAgX2J1Zmxl biArPSA2OwogICAgICB9CgogICAgICB2YXIgbiA9IChfYnVmZmVyID4+PiAoX2J1ZmxlbiAtIDgpICkgJiAweGZmOwogICAgICBfYnVmbGVuIC09IDg7CiAg ICAgIHJldHVybiBuOwogICAgfTsKCiAgICB2YXIgZGVjb2RlID0gZnVuY3Rpb24oYykgewogICAgICBpZiAoMHg0MSA8PSBjICYmIGMgPD0gMHg1YSkgewog ICAgICAgIHJldHVybiBjIC0gMHg0MTsKICAgICAgfSBlbHNlIGlmICgweDYxIDw9IGMgJiYgYyA8PSAweDdhKSB7CiAgICAgICAgcmV0dXJuIGMgLSAweDYx ICsgMjY7CiAgICAgIH0gZWxzZSBpZiAoMHgzMCA8PSBjICYmIGMgPD0gMHgzOSkgewogICAgICAgIHJldHVybiBjIC0gMHgzMCArIDUyOwogICAgICB9IGVs c2UgaWYgKGMgPT0gMHgyYikgewogICAgICAgIHJldHVybiA2MjsKICAgICAgfSBlbHNlIGlmIChjID09IDB4MmYpIHsKICAgICAgICByZXR1cm4gNjM7CiAg ICAgIH0gZWxzZSB7CiAgICAgICAgdGhyb3cgJ2M6JyArIGM7CiAgICAgIH0KICAgIH07CgogICAgcmV0dXJuIF90aGlzOwogIH07CgogIC8vLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgLy8gZ2lmSW1hZ2UgKEIvVykKICAvLy0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICB2YXIgZ2lmSW1hZ2UgPSBmdW5jdGlv bih3aWR0aCwgaGVpZ2h0KSB7CgogICAgdmFyIF93aWR0aCA9IHdpZHRoOwogICAgdmFyIF9oZWlnaHQgPSBoZWlnaHQ7CiAgICB2YXIgX2RhdGEgPSBuZXcg QXJyYXkod2lkdGggKiBoZWlnaHQpOwoKICAgIHZhciBfdGhpcyA9IHt9OwoKICAgIF90aGlzLnNldFBpeGVsID0gZnVuY3Rpb24oeCwgeSwgcGl4ZWwpIHsK ICAgICAgX2RhdGFbeSAqIF93aWR0aCArIHhdID0gcGl4ZWw7CiAgICB9OwoKICAgIF90aGlzLndyaXRlID0gZnVuY3Rpb24ob3V0KSB7CgogICAgICAvLy0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAvLyBHSUYgU2lnbmF0dXJlCgogICAgICBvdXQud3JpdGVTdHJpbmcoJ0dJRjg3YScpOwoK ICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgLy8gU2NyZWVuIERlc2NyaXB0b3IKCiAgICAgIG91dC53cml0ZVNob3J0 KF93aWR0aCk7CiAgICAgIG91dC53cml0ZVNob3J0KF9oZWlnaHQpOwoKICAgICAgb3V0LndyaXRlQnl0ZSgweDgwKTsgLy8gMmJpdAogICAgICBvdXQud3Jp dGVCeXRlKDApOwogICAgICBvdXQud3JpdGVCeXRlKDApOwoKICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgLy8gR2xv YmFsIENvbG9yIE1hcAoKICAgICAgLy8gYmxhY2sKICAgICAgb3V0LndyaXRlQnl0ZSgweDAwKTsKICAgICAgb3V0LndyaXRlQnl0ZSgweDAwKTsKICAgICAg b3V0LndyaXRlQnl0ZSgweDAwKTsKCiAgICAgIC8vIHdoaXRlCiAgICAgIG91dC53cml0ZUJ5dGUoMHhmZik7CiAgICAgIG91dC53cml0ZUJ5dGUoMHhmZik7 CiAgICAgIG91dC53cml0ZUJ5dGUoMHhmZik7CgogICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAvLyBJbWFnZSBEZXNj cmlwdG9yCgogICAgICBvdXQud3JpdGVTdHJpbmcoJywnKTsKICAgICAgb3V0LndyaXRlU2hvcnQoMCk7CiAgICAgIG91dC53cml0ZVNob3J0KDApOwogICAg ICBvdXQud3JpdGVTaG9ydChfd2lkdGgpOwogICAgICBvdXQud3JpdGVTaG9ydChfaGVpZ2h0KTsKICAgICAgb3V0LndyaXRlQnl0ZSgwKTsKCiAgICAgIC8v LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgIC8vIExvY2FsIENvbG9yIE1hcAoKICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0KICAgICAgLy8gUmFzdGVyIERhdGEKCiAgICAgIHZhciBsendNaW5Db2RlU2l6ZSA9IDI7CiAgICAgIHZhciByYXN0ZXIgPSBnZXRMWldS YXN0ZXIobHp3TWluQ29kZVNpemUpOwoKICAgICAgb3V0LndyaXRlQnl0ZShsendNaW5Db2RlU2l6ZSk7CgogICAgICB2YXIgb2Zmc2V0ID0gMDsKCiAgICAg IHdoaWxlIChyYXN0ZXIubGVuZ3RoIC0gb2Zmc2V0ID4gMjU1KSB7CiAgICAgICAgb3V0LndyaXRlQnl0ZSgyNTUpOwogICAgICAgIG91dC53cml0ZUJ5dGVz KHJhc3Rlciwgb2Zmc2V0LCAyNTUpOwogICAgICAgIG9mZnNldCArPSAyNTU7CiAgICAgIH0KCiAgICAgIG91dC53cml0ZUJ5dGUocmFzdGVyLmxlbmd0aCAt IG9mZnNldCk7CiAgICAgIG91dC53cml0ZUJ5dGVzKHJhc3Rlciwgb2Zmc2V0LCByYXN0ZXIubGVuZ3RoIC0gb2Zmc2V0KTsKICAgICAgb3V0LndyaXRlQnl0 ZSgweDAwKTsKCiAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgIC8vIEdJRiBUZXJtaW5hdG9yCiAgICAgIG91dC53cml0 ZVN0cmluZygnOycpOwogICAgfTsKCiAgICB2YXIgYml0T3V0cHV0U3RyZWFtID0gZnVuY3Rpb24ob3V0KSB7CgogICAgICB2YXIgX291dCA9IG91dDsKICAg ICAgdmFyIF9iaXRMZW5ndGggPSAwOwogICAgICB2YXIgX2JpdEJ1ZmZlciA9IDA7CgogICAgICB2YXIgX3RoaXMgPSB7fTsKCiAgICAgIF90aGlzLndyaXRl ID0gZnVuY3Rpb24oZGF0YSwgbGVuZ3RoKSB7CgogICAgICAgIGlmICggKGRhdGEgPj4+IGxlbmd0aCkgIT0gMCkgewogICAgICAgICAgdGhyb3cgJ2xlbmd0 aCBvdmVyJzsKICAgICAgICB9CgogICAgICAgIHdoaWxlIChfYml0TGVuZ3RoICsgbGVuZ3RoID49IDgpIHsKICAgICAgICAgIF9vdXQud3JpdGVCeXRlKDB4 ZmYgJiAoIChkYXRhIDw8IF9iaXRMZW5ndGgpIHwgX2JpdEJ1ZmZlcikgKTsKICAgICAgICAgIGxlbmd0aCAtPSAoOCAtIF9iaXRMZW5ndGgpOwogICAgICAg ICAgZGF0YSA+Pj49ICg4IC0gX2JpdExlbmd0aCk7CiAgICAgICAgICBfYml0QnVmZmVyID0gMDsKICAgICAgICAgIF9iaXRMZW5ndGggPSAwOwogICAgICAg IH0KCiAgICAgICAgX2JpdEJ1ZmZlciA9IChkYXRhIDw8IF9iaXRMZW5ndGgpIHwgX2JpdEJ1ZmZlcjsKICAgICAgICBfYml0TGVuZ3RoID0gX2JpdExlbmd0 aCArIGxlbmd0aDsKICAgICAgfTsKCiAgICAgIF90aGlzLmZsdXNoID0gZnVuY3Rpb24oKSB7CiAgICAgICAgaWYgKF9iaXRMZW5ndGggPiAwKSB7CiAgICAg ICAgICBfb3V0LndyaXRlQnl0ZShfYml0QnVmZmVyKTsKICAgICAgICB9CiAgICAgIH07CgogICAgICByZXR1cm4gX3RoaXM7CiAgICB9OwoKICAgIHZhciBn ZXRMWldSYXN0ZXIgPSBmdW5jdGlvbihsendNaW5Db2RlU2l6ZSkgewoKICAgICAgdmFyIGNsZWFyQ29kZSA9IDEgPDwgbHp3TWluQ29kZVNpemU7CiAgICAg IHZhciBlbmRDb2RlID0gKDEgPDwgbHp3TWluQ29kZVNpemUpICsgMTsKICAgICAgdmFyIGJpdExlbmd0aCA9IGx6d01pbkNvZGVTaXplICsgMTsKCiAgICAg IC8vIFNldHVwIExaV1RhYmxlCiAgICAgIHZhciB0YWJsZSA9IGx6d1RhYmxlKCk7CgogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNsZWFyQ29kZTsgaSAr PSAxKSB7CiAgICAgICAgdGFibGUuYWRkKFN0cmluZy5mcm9tQ2hhckNvZGUoaSkgKTsKICAgICAgfQogICAgICB0YWJsZS5hZGQoU3RyaW5nLmZyb21DaGFy Q29kZShjbGVhckNvZGUpICk7CiAgICAgIHRhYmxlLmFkZChTdHJpbmcuZnJvbUNoYXJDb2RlKGVuZENvZGUpICk7CgogICAgICB2YXIgYnl0ZU91dCA9IGJ5 dGVBcnJheU91dHB1dFN0cmVhbSgpOwogICAgICB2YXIgYml0T3V0ID0gYml0T3V0cHV0U3RyZWFtKGJ5dGVPdXQpOwoKICAgICAgLy8gY2xlYXIgY29kZQog ICAgICBiaXRPdXQud3JpdGUoY2xlYXJDb2RlLCBiaXRMZW5ndGgpOwoKICAgICAgdmFyIGRhdGFJbmRleCA9IDA7CgogICAgICB2YXIgcyA9IFN0cmluZy5m cm9tQ2hhckNvZGUoX2RhdGFbZGF0YUluZGV4XSk7CiAgICAgIGRhdGFJbmRleCArPSAxOwoKICAgICAgd2hpbGUgKGRhdGFJbmRleCA8IF9kYXRhLmxlbmd0 aCkgewoKICAgICAgICB2YXIgYyA9IFN0cmluZy5mcm9tQ2hhckNvZGUoX2RhdGFbZGF0YUluZGV4XSk7CiAgICAgICAgZGF0YUluZGV4ICs9IDE7CgogICAg ICAgIGlmICh0YWJsZS5jb250YWlucyhzICsgYykgKSB7CgogICAgICAgICAgcyA9IHMgKyBjOwoKICAgICAgICB9IGVsc2UgewoKICAgICAgICAgIGJpdE91 dC53cml0ZSh0YWJsZS5pbmRleE9mKHMpLCBiaXRMZW5ndGgpOwoKICAgICAgICAgIGlmICh0YWJsZS5zaXplKCkgPCAweGZmZikgewoKICAgICAgICAgICAg aWYgKHRhYmxlLnNpemUoKSA9PSAoMSA8PCBiaXRMZW5ndGgpICkgewogICAgICAgICAgICAgIGJpdExlbmd0aCArPSAxOwogICAgICAgICAgICB9CgogICAg ICAgICAgICB0YWJsZS5hZGQocyArIGMpOwogICAgICAgICAgfQoKICAgICAgICAgIHMgPSBjOwogICAgICAgIH0KICAgICAgfQoKICAgICAgYml0T3V0Lndy aXRlKHRhYmxlLmluZGV4T2YocyksIGJpdExlbmd0aCk7CgogICAgICAvLyBlbmQgY29kZQogICAgICBiaXRPdXQud3JpdGUoZW5kQ29kZSwgYml0TGVuZ3Ro KTsKCiAgICAgIGJpdE91dC5mbHVzaCgpOwoKICAgICAgcmV0dXJuIGJ5dGVPdXQudG9CeXRlQXJyYXkoKTsKICAgIH07CgogICAgdmFyIGx6d1RhYmxlID0g ZnVuY3Rpb24oKSB7CgogICAgICB2YXIgX21hcCA9IHt9OwogICAgICB2YXIgX3NpemUgPSAwOwoKICAgICAgdmFyIF90aGlzID0ge307CgogICAgICBfdGhp cy5hZGQgPSBmdW5jdGlvbihrZXkpIHsKICAgICAgICBpZiAoX3RoaXMuY29udGFpbnMoa2V5KSApIHsKICAgICAgICAgIHRocm93ICdkdXAga2V5OicgKyBr ZXk7CiAgICAgICAgfQogICAgICAgIF9tYXBba2V5XSA9IF9zaXplOwogICAgICAgIF9zaXplICs9IDE7CiAgICAgIH07CgogICAgICBfdGhpcy5zaXplID0g ZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIF9zaXplOwogICAgICB9OwoKICAgICAgX3RoaXMuaW5kZXhPZiA9IGZ1bmN0aW9uKGtleSkgewogICAgICAg IHJldHVybiBfbWFwW2tleV07CiAgICAgIH07CgogICAgICBfdGhpcy5jb250YWlucyA9IGZ1bmN0aW9uKGtleSkgewogICAgICAgIHJldHVybiB0eXBlb2Yg X21hcFtrZXldICE9ICd1bmRlZmluZWQnOwogICAgICB9OwoKICAgICAgcmV0dXJuIF90aGlzOwogICAgfTsKCiAgICByZXR1cm4gX3RoaXM7CiAgfTsKCiAg dmFyIGNyZWF0ZURhdGFVUkwgPSBmdW5jdGlvbih3aWR0aCwgaGVpZ2h0LCBnZXRQaXhlbCkgewogICAgdmFyIGdpZiA9IGdpZkltYWdlKHdpZHRoLCBoZWln aHQpOwogICAgZm9yICh2YXIgeSA9IDA7IHkgPCBoZWlnaHQ7IHkgKz0gMSkgewogICAgICBmb3IgKHZhciB4ID0gMDsgeCA8IHdpZHRoOyB4ICs9IDEpIHsK ICAgICAgICBnaWYuc2V0UGl4ZWwoeCwgeSwgZ2V0UGl4ZWwoeCwgeSkgKTsKICAgICAgfQogICAgfQoKICAgIHZhciBiID0gYnl0ZUFycmF5T3V0cHV0U3Ry ZWFtKCk7CiAgICBnaWYud3JpdGUoYik7CgogICAgdmFyIGJhc2U2NCA9IGJhc2U2NEVuY29kZU91dHB1dFN0cmVhbSgpOwogICAgdmFyIGJ5dGVzID0gYi50 b0J5dGVBcnJheSgpOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBieXRlcy5sZW5ndGg7IGkgKz0gMSkgewogICAgICBiYXNlNjQud3JpdGVCeXRlKGJ5dGVz W2ldKTsKICAgIH0KICAgIGJhc2U2NC5mbHVzaCgpOwoKICAgIHJldHVybiAnZGF0YTppbWFnZS9naWY7YmFzZTY0LCcgKyBiYXNlNjQ7CiAgfTsKCiAgLy8t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAvLyByZXR1cm5zIHFyY29kZSBm dW5jdGlvbi4KCiAgcmV0dXJuIHFyY29kZTsKfSgpOwoKLy8gbXVsdGlieXRlIHN1cHBvcnQKIWZ1bmN0aW9uKCkgewoKICBxcmNvZGUuc3RyaW5nVG9CeXRl c0Z1bmNzWydVVEYtOCddID0gZnVuY3Rpb24ocykgewogICAgLy8gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8xODcyOTQwNS9ob3ctdG8t Y29udmVydC11dGY4LXN0cmluZy10by1ieXRlLWFycmF5CiAgICBmdW5jdGlvbiB0b1VURjhBcnJheShzdHIpIHsKICAgICAgdmFyIHV0ZjggPSBbXTsKICAg ICAgZm9yICh2YXIgaT0wOyBpIDwgc3RyLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgdmFyIGNoYXJjb2RlID0gc3RyLmNoYXJDb2RlQXQoaSk7CiAgICAgICAg aWYgKGNoYXJjb2RlIDwgMHg4MCkgdXRmOC5wdXNoKGNoYXJjb2RlKTsKICAgICAgICBlbHNlIGlmIChjaGFyY29kZSA8IDB4ODAwKSB7CiAgICAgICAgICB1 dGY4LnB1c2goMHhjMCB8IChjaGFyY29kZSA+PiA2KSwKICAgICAgICAgICAgICAweDgwIHwgKGNoYXJjb2RlICYgMHgzZikpOwogICAgICAgIH0KICAgICAg ICBlbHNlIGlmIChjaGFyY29kZSA8IDB4ZDgwMCB8fCBjaGFyY29kZSA+PSAweGUwMDApIHsKICAgICAgICAgIHV0ZjgucHVzaCgweGUwIHwgKGNoYXJjb2Rl ID4+IDEyKSwKICAgICAgICAgICAgICAweDgwIHwgKChjaGFyY29kZT4+NikgJiAweDNmKSwKICAgICAgICAgICAgICAweDgwIHwgKGNoYXJjb2RlICYgMHgz ZikpOwogICAgICAgIH0KICAgICAgICAvLyBzdXJyb2dhdGUgcGFpcgogICAgICAgIGVsc2UgewogICAgICAgICAgaSsrOwogICAgICAgICAgLy8gVVRGLTE2 IGVuY29kZXMgMHgxMDAwMC0weDEwRkZGRiBieQogICAgICAgICAgLy8gc3VidHJhY3RpbmcgMHgxMDAwMCBhbmQgc3BsaXR0aW5nIHRoZQogICAgICAgICAg Ly8gMjAgYml0cyBvZiAweDAtMHhGRkZGRiBpbnRvIHR3byBoYWx2ZXMKICAgICAgICAgIGNoYXJjb2RlID0gMHgxMDAwMCArICgoKGNoYXJjb2RlICYgMHgz ZmYpPDwxMCkKICAgICAgICAgICAgfCAoc3RyLmNoYXJDb2RlQXQoaSkgJiAweDNmZikpOwogICAgICAgICAgdXRmOC5wdXNoKDB4ZjAgfCAoY2hhcmNvZGUg Pj4xOCksCiAgICAgICAgICAgICAgMHg4MCB8ICgoY2hhcmNvZGU+PjEyKSAmIDB4M2YpLAogICAgICAgICAgICAgIDB4ODAgfCAoKGNoYXJjb2RlPj42KSAm IDB4M2YpLAogICAgICAgICAgICAgIDB4ODAgfCAoY2hhcmNvZGUgJiAweDNmKSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiB1dGY4OwogICAg fQogICAgcmV0dXJuIHRvVVRGOEFycmF5KHMpOwogIH07Cgp9KCk7CgooZnVuY3Rpb24gKGZhY3RvcnkpIHsKICBpZiAodHlwZW9mIGRlZmluZSA9PT0gJ2Z1 bmN0aW9uJyAmJiBkZWZpbmUuYW1kKSB7CiAgICAgIGRlZmluZShbXSwgZmFjdG9yeSk7CiAgfSBlbHNlIGlmICh0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVj dCcpIHsKICAgICAgbW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCk7CiAgfQp9KGZ1bmN0aW9uICgpIHsKICAgIHJldHVybiBxcmNvZGU7Cn0pKTsK '@ & $WifiQrMain