{"id":29739,"date":"2026-06-22T18:30:24","date_gmt":"2026-06-22T17:30:24","guid":{"rendered":"https:\/\/beyoga.pt\/mapa-de-alunos\/"},"modified":"2026-07-16T21:09:41","modified_gmt":"2026-07-16T20:09:41","slug":"graduate-map","status":"publish","type":"page","link":"https:\/\/beyoga.pt\/en\/graduate-map\/","title":{"rendered":"Community Map | Teachers Trained by BeYoga"},"content":{"rendered":"\n<script id=\"mapa-desc\">(function(){var m=document.createElement(\"meta\");m.name=\"description\";m.content=\"Meet the BeYoga community on the map: graduates of the 200H Yoga Teacher Training, spread across Portugal and beyond. Find a teacher near you.\";document.head.appendChild(m);})();<\/script>\n<style id=\"leaflet-css\">.leaflet-image-layer,.leaflet-layer,.leaflet-marker-icon,.leaflet-marker-shadow,.leaflet-pane,.leaflet-pane>canvas,.leaflet-pane>svg,.leaflet-tile,.leaflet-tile-container,.leaflet-zoom-box{position:absolute;left:0;top:0}.leaflet-container{overflow:hidden}.leaflet-marker-icon,.leaflet-marker-shadow,.leaflet-tile{-webkit-user-select:none;-moz-user-select:none;user-select:none;-webkit-user-drag:none}.leaflet-tile::selection{background:0 0}.leaflet-safari .leaflet-tile{image-rendering:-webkit-optimize-contrast}.leaflet-safari .leaflet-tile-container{width:1600px;height:1600px;-webkit-transform-origin:0 0}.leaflet-marker-icon,.leaflet-marker-shadow{display:block}.leaflet-container .leaflet-overlay-pane svg{max-width:none!important;max-height:none!important}.leaflet-container .leaflet-marker-pane img,.leaflet-container .leaflet-shadow-pane img,.leaflet-container .leaflet-tile,.leaflet-container .leaflet-tile-pane img,.leaflet-container img.leaflet-image-layer{max-width:none!important;max-height:none!important;width:auto;padding:0}.leaflet-container img.leaflet-tile{mix-blend-mode:plus-lighter}.leaflet-container.leaflet-touch-zoom{-ms-touch-action:pan-x pan-y;touch-action:pan-x pan-y}.leaflet-container.leaflet-touch-drag{-ms-touch-action:pinch-zoom;touch-action:none;touch-action:pinch-zoom}.leaflet-container.leaflet-touch-drag.leaflet-touch-zoom{-ms-touch-action:none;touch-action:none}.leaflet-container{-webkit-tap-highlight-color:transparent}.leaflet-container a{-webkit-tap-highlight-color:rgba(51,181,229,.4)}.leaflet-tile{filter:inherit;visibility:hidden}.leaflet-tile-loaded{visibility:inherit}.leaflet-zoom-box{width:0;height:0;-moz-box-sizing:border-box;box-sizing:border-box;z-index:800}.leaflet-overlay-pane svg{-moz-user-select:none}.leaflet-pane{z-index:400}.leaflet-tile-pane{z-index:200}.leaflet-overlay-pane{z-index:400}.leaflet-shadow-pane{z-index:500}.leaflet-marker-pane{z-index:600}.leaflet-tooltip-pane{z-index:650}.leaflet-popup-pane{z-index:700}.leaflet-map-pane canvas{z-index:100}.leaflet-map-pane svg{z-index:200}.leaflet-vml-shape{width:1px;height:1px}.lvml{behavior:url(#default#VML);display:inline-block;position:absolute}.leaflet-control{position:relative;z-index:800;pointer-events:visiblePainted;pointer-events:auto}.leaflet-bottom,.leaflet-top{position:absolute;z-index:1000;pointer-events:none}.leaflet-top{top:0}.leaflet-right{right:0}.leaflet-bottom{bottom:0}.leaflet-left{left:0}.leaflet-control{float:left;clear:both}.leaflet-right .leaflet-control{float:right}.leaflet-top .leaflet-control{margin-top:10px}.leaflet-bottom .leaflet-control{margin-bottom:10px}.leaflet-left .leaflet-control{margin-left:10px}.leaflet-right .leaflet-control{margin-right:10px}.leaflet-fade-anim .leaflet-popup{opacity:0;-webkit-transition:opacity .2s linear;-moz-transition:opacity .2s linear;transition:opacity .2s linear}.leaflet-fade-anim .leaflet-map-pane .leaflet-popup{opacity:1}.leaflet-zoom-animated{-webkit-transform-origin:0 0;-ms-transform-origin:0 0;transform-origin:0 0}svg.leaflet-zoom-animated{will-change:transform}.leaflet-zoom-anim .leaflet-zoom-animated{-webkit-transition:-webkit-transform .25s cubic-bezier(0,0,.25,1);-moz-transition:-moz-transform .25s cubic-bezier(0,0,.25,1);transition:transform .25s cubic-bezier(0,0,.25,1)}.leaflet-pan-anim .leaflet-tile,.leaflet-zoom-anim .leaflet-tile{-webkit-transition:none;-moz-transition:none;transition:none}.leaflet-zoom-anim .leaflet-zoom-hide{visibility:hidden}.leaflet-interactive{cursor:pointer}.leaflet-grab{cursor:-webkit-grab;cursor:-moz-grab;cursor:grab}.leaflet-crosshair,.leaflet-crosshair .leaflet-interactive{cursor:crosshair}.leaflet-control,.leaflet-popup-pane{cursor:auto}.leaflet-dragging .leaflet-grab,.leaflet-dragging .leaflet-grab .leaflet-interactive,.leaflet-dragging .leaflet-marker-draggable{cursor:move;cursor:-webkit-grabbing;cursor:-moz-grabbing;cursor:grabbing}.leaflet-image-layer,.leaflet-marker-icon,.leaflet-marker-shadow,.leaflet-pane>svg path,.leaflet-tile-container{pointer-events:none}.leaflet-image-layer.leaflet-interactive,.leaflet-marker-icon.leaflet-interactive,.leaflet-pane>svg path.leaflet-interactive,svg.leaflet-image-layer.leaflet-interactive path{pointer-events:visiblePainted;pointer-events:auto}.leaflet-container{background:#ddd;outline-offset:1px}.leaflet-container a{color:#0078a8}.leaflet-zoom-box{border:2px dotted #38f;background:rgba(255,255,255,.5)}.leaflet-container{font-family:\"Helvetica Neue\",Arial,Helvetica,sans-serif;font-size:12px;font-size:.75rem;line-height:1.5}.leaflet-bar{box-shadow:0 1px 5px rgba(0,0,0,.65);border-radius:4px}.leaflet-bar a{background-color:#fff;border-bottom:1px solid #ccc;width:26px;height:26px;line-height:26px;display:block;text-align:center;text-decoration:none;color:#000}.leaflet-bar a,.leaflet-control-layers-toggle{background-position:50% 50%;background-repeat:no-repeat;display:block}.leaflet-bar a:focus,.leaflet-bar a:hover{background-color:#f4f4f4}.leaflet-bar a:first-child{border-top-left-radius:4px;border-top-right-radius:4px}.leaflet-bar a:last-child{border-bottom-left-radius:4px;border-bottom-right-radius:4px;border-bottom:none}.leaflet-bar a.leaflet-disabled{cursor:default;background-color:#f4f4f4;color:#bbb}.leaflet-touch .leaflet-bar a{width:30px;height:30px;line-height:30px}.leaflet-touch .leaflet-bar a:first-child{border-top-left-radius:2px;border-top-right-radius:2px}.leaflet-touch .leaflet-bar a:last-child{border-bottom-left-radius:2px;border-bottom-right-radius:2px}.leaflet-control-zoom-in,.leaflet-control-zoom-out{font:bold 18px 'Lucida Console',Monaco,monospace;text-indent:1px}.leaflet-touch .leaflet-control-zoom-in,.leaflet-touch .leaflet-control-zoom-out{font-size:22px}.leaflet-control-layers{box-shadow:0 1px 5px rgba(0,0,0,.4);background:#fff;border-radius:5px}.leaflet-control-layers-toggle{background-image:url(images\/layers.png);width:36px;height:36px}.leaflet-retina .leaflet-control-layers-toggle{background-image:url(images\/layers-2x.png);background-size:26px 26px}.leaflet-touch .leaflet-control-layers-toggle{width:44px;height:44px}.leaflet-control-layers .leaflet-control-layers-list,.leaflet-control-layers-expanded .leaflet-control-layers-toggle{display:none}.leaflet-control-layers-expanded .leaflet-control-layers-list{display:block;position:relative}.leaflet-control-layers-expanded{padding:6px 10px 6px 6px;color:#333;background:#fff}.leaflet-control-layers-scrollbar{overflow-y:scroll;overflow-x:hidden;padding-right:5px}.leaflet-control-layers-selector{margin-top:2px;position:relative;top:1px}.leaflet-control-layers label{display:block;font-size:13px;font-size:1.08333em}.leaflet-control-layers-separator{height:0;border-top:1px solid #ddd;margin:5px -10px 5px -6px}.leaflet-default-icon-path{background-image:url(images\/marker-icon.png)}.leaflet-container .leaflet-control-attribution{background:#fff;background:rgba(255,255,255,.8);margin:0}.leaflet-control-attribution,.leaflet-control-scale-line{padding:0 5px;color:#333;line-height:1.4}.leaflet-control-attribution a{text-decoration:none}.leaflet-control-attribution a:focus,.leaflet-control-attribution a:hover{text-decoration:underline}.leaflet-attribution-flag{display:inline!important;vertical-align:baseline!important;width:1em;height:.6669em}.leaflet-left .leaflet-control-scale{margin-left:5px}.leaflet-bottom .leaflet-control-scale{margin-bottom:5px}.leaflet-control-scale-line{border:2px solid #777;border-top:none;line-height:1.1;padding:2px 5px 1px;white-space:nowrap;-moz-box-sizing:border-box;box-sizing:border-box;background:rgba(255,255,255,.8);text-shadow:1px 1px #fff}.leaflet-control-scale-line:not(:first-child){border-top:2px solid #777;border-bottom:none;margin-top:-2px}.leaflet-control-scale-line:not(:first-child):not(:last-child){border-bottom:2px solid #777}.leaflet-touch .leaflet-bar,.leaflet-touch .leaflet-control-attribution,.leaflet-touch .leaflet-control-layers{box-shadow:none}.leaflet-touch .leaflet-bar,.leaflet-touch .leaflet-control-layers{border:2px solid rgba(0,0,0,.2);background-clip:padding-box}.leaflet-popup{position:absolute;text-align:center;margin-bottom:20px}.leaflet-popup-content-wrapper{padding:1px;text-align:left;border-radius:12px}.leaflet-popup-content{margin:13px 24px 13px 20px;line-height:1.3;font-size:13px;font-size:1.08333em;min-height:1px}.leaflet-popup-content p{margin:17px 0;margin:1.3em 0}.leaflet-popup-tip-container{width:40px;height:20px;position:absolute;left:50%;margin-top:-1px;margin-left:-20px;overflow:hidden;pointer-events:none}.leaflet-popup-tip{width:17px;height:17px;padding:1px;margin:-10px auto 0;pointer-events:auto;-webkit-transform:rotate(45deg);-moz-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg)}.leaflet-popup-content-wrapper,.leaflet-popup-tip{background:#fff;color:#333;box-shadow:0 3px 14px rgba(0,0,0,.4)}.leaflet-container a.leaflet-popup-close-button{position:absolute;top:0;right:0;border:none;text-align:center;width:24px;height:24px;font:16px\/24px Tahoma,Verdana,sans-serif;color:#757575;text-decoration:none;background:0 0}.leaflet-container a.leaflet-popup-close-button:focus,.leaflet-container a.leaflet-popup-close-button:hover{color:#585858}.leaflet-popup-scrolled{overflow:auto}.leaflet-oldie .leaflet-popup-content-wrapper{-ms-zoom:1}.leaflet-oldie .leaflet-popup-tip{width:24px;margin:0 auto}.leaflet-oldie .leaflet-control-layers,.leaflet-oldie .leaflet-control-zoom,.leaflet-oldie .leaflet-popup-content-wrapper,.leaflet-oldie .leaflet-popup-tip{border:1px solid #999}.leaflet-div-icon{background:#fff;border:1px solid #666}.leaflet-tooltip{position:absolute;padding:6px;background-color:#fff;border:1px solid #fff;border-radius:3px;color:#222;white-space:nowrap;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;pointer-events:none;box-shadow:0 1px 3px rgba(0,0,0,.4)}.leaflet-tooltip.leaflet-interactive{cursor:pointer;pointer-events:auto}.leaflet-tooltip-bottom:before,.leaflet-tooltip-left:before,.leaflet-tooltip-right:before,.leaflet-tooltip-top:before{position:absolute;pointer-events:none;border:6px solid transparent;background:0 0;content:\"\"}.leaflet-tooltip-bottom{margin-top:6px}.leaflet-tooltip-top{margin-top:-6px}.leaflet-tooltip-bottom:before,.leaflet-tooltip-top:before{left:50%;margin-left:-6px}.leaflet-tooltip-top:before{bottom:0;margin-bottom:-12px;border-top-color:#fff}.leaflet-tooltip-bottom:before{top:0;margin-top:-12px;margin-left:-6px;border-bottom-color:#fff}.leaflet-tooltip-left{margin-left:-6px}.leaflet-tooltip-right{margin-left:6px}.leaflet-tooltip-left:before,.leaflet-tooltip-right:before{top:50%;margin-top:-6px}.leaflet-tooltip-left:before{right:0;margin-right:-12px;border-left-color:#fff}.leaflet-tooltip-right:before{left:0;margin-left:-12px;border-right-color:#fff}@media print{.leaflet-control{-webkit-print-color-adjust:exact;print-color-adjust:exact}}\n\/* === Carta de Fundadora (terracota holografica) === *\/\n.by-card:has(.by-eryt-img){position:relative;background:linear-gradient(160deg,#d2715a 0%,#C4614A 48%,#a84d39 100%) !important;border:2px solid transparent;box-shadow:0 12px 36px rgba(120,50,35,.42);overflow:hidden}\n.by-card:has(.by-eryt-img)>*{position:relative;z-index:3}\n.by-card:has(.by-eryt-img)::before{content:\"\";position:absolute;inset:0;border-radius:inherit;padding:2px;background:linear-gradient(135deg,#f8e6a8,#d8a93f,#fbe9b0,#b8862f,#f8e6a8);-webkit-mask:linear-gradient(#000 0 0) content-box,linear-gradient(#000 0 0);-webkit-mask-composite:xor;mask-composite:exclude;pointer-events:none;z-index:1}\n.by-card:has(.by-eryt-img)::after{content:\"\";position:absolute;top:0;left:-55%;width:55%;height:100%;background:linear-gradient(115deg,rgba(255,255,255,0) 0%,rgba(255,255,255,.12) 38%,rgba(255,245,220,.42) 50%,rgba(255,255,255,.12) 62%,rgba(255,255,255,0) 100%);transform:skewX(-12deg);pointer-events:none;z-index:2;animation:byFoilSweep 5.5s ease-in-out infinite}\n@keyframes byFoilSweep{0%{left:-55%}55%{left:130%}100%{left:130%}}\n@media (prefers-reduced-motion:reduce){.by-card:has(.by-eryt-img)::after{animation:none;opacity:.3}}\n.by-fhead{display:flex;align-items:center;justify-content:space-between;gap:10px;margin-bottom:2px}\n.by-fkick{display:inline-block;font-family:var(--font-body);font-size:10px;font-weight:600;letter-spacing:.2em;text-transform:uppercase;color:#5a2417;background:linear-gradient(135deg,#fbe9b0,#e6c46a);padding:5px 12px;border-radius:200px;white-space:nowrap}\n.by-eryt-img{width:54px;height:54px;flex:0 0 auto;border-radius:50%;background:#fff;padding:3px;box-shadow:0 2px 8px rgba(0,0,0,.25),0 0 0 2px #f3d27a;object-fit:contain}\n.by-mapa-page .by-card .by-eryt-img{position:absolute;top:16px;right:16px;width:48px;height:48px;z-index:5}\n.by-mapa-page .by-card:has(.by-eryt-img) .head{padding-right:54px}\n.by-mapa-page .by-card:has(.by-eryt-img) h3{color:#fff !important}\n.by-mapa-page .by-card:has(.by-eryt-img) .city{color:#fdeee7 !important}\n.by-mapa-page .by-card:has(.by-eryt-img) .prof{color:#ffe9b0 !important;font-weight:600;letter-spacing:.02em}\n.by-mapa-page .by-card:has(.by-eryt-img) .by-badge{background:rgba(255,255,255,.16) !important;color:#fff !important;border:1px solid rgba(255,245,220,.45) !important}\n.by-mapa-page .by-card:has(.by-eryt-img) .by-quote{color:rgba(255,255,255,.95) !important}\n.by-mapa-page .by-card:has(.by-eryt-img) .by-link{color:#fff !important;border-color:rgba(255,255,255,.5) !important}\n.by-mapa-page .by-card:has(.by-eryt-img) .by-avatar{box-shadow:0 0 0 2px #f3d27a,0 0 0 4px rgba(255,255,255,.25)}\n.leaflet-popup:has(.by-pop-founder) .leaflet-popup-content-wrapper{background:linear-gradient(160deg,#d2715a 0%,#C4614A 48%,#a84d39 100%);border:2px solid #d8a93f;box-shadow:0 12px 30px rgba(120,50,35,.45);overflow:hidden;position:relative}\n.leaflet-popup:has(.by-pop-founder) .leaflet-popup-tip{background:#a84d39;border:2px solid #d8a93f}\n.leaflet-popup:has(.by-pop-founder) .leaflet-popup-close-button{color:#fff !important}\n.leaflet-popup:has(.by-pop-founder) .leaflet-popup-content-wrapper::after{content:\"\";position:absolute;top:0;left:-55%;width:55%;height:100%;background:linear-gradient(115deg,rgba(255,255,255,0),rgba(255,255,255,.12) 38%,rgba(255,245,220,.42) 50%,rgba(255,255,255,.12) 62%,rgba(255,255,255,0));transform:skewX(-12deg);pointer-events:none;z-index:1;animation:byFoilSweep 5.5s ease-in-out infinite}\n.leaflet-popup:has(.by-pop-founder) .leaflet-popup-content{position:relative;z-index:2}\n.by-pop-founder{position:relative}\n.by-pop-founder .by-eryt-img{position:absolute;top:30px;right:8px;width:44px;height:44px;border-radius:50%;background:#fff;padding:3px;box-shadow:0 2px 8px rgba(0,0,0,.25),0 0 0 2px #f3d27a;object-fit:contain;z-index:3}\n.by-pop-founder .top{padding-right:50px}\n.by-pop-founder h3{color:#fff !important}\n.by-pop-founder .city{color:#fdeee7 !important}\n.by-pop-founder .prof{color:#ffe9b0 !important;font-weight:600}\n.by-pop-founder .by-badge{background:rgba(255,255,255,.16) !important;color:#fff !important;border:1px solid rgba(255,245,220,.45) !important}\n.by-pop-founder .by-link{color:#fff !important;border-color:rgba(255,255,255,.5) !important}\n.by-pop-founder .by-avatar{box-shadow:0 0 0 2px #f3d27a,0 0 0 3px rgba(255,255,255,.25)}\n.by-pin.founder{background:radial-gradient(circle at 35% 30%,#fbe9b0,#d8a93f 60%,#9c6b1f 100%) !important;border-color:#f3d27a !important;box-shadow:0 3px 11px rgba(0,0,0,.45),0 0 0 3px rgba(243,210,122,.45) !important}\n.by-pin.founder span{color:#5a2417 !important}\n<\/style>\n<style id=\"mc-css\">.leaflet-cluster-anim .leaflet-marker-icon,.leaflet-cluster-anim .leaflet-marker-shadow{-webkit-transition:-webkit-transform .3s ease-out,opacity .3s ease-in;-moz-transition:-moz-transform .3s ease-out,opacity .3s ease-in;-o-transition:-o-transform .3s ease-out,opacity .3s ease-in;transition:transform .3s ease-out,opacity .3s ease-in}.leaflet-cluster-spider-leg{-webkit-transition:-webkit-stroke-dashoffset .3s ease-out,-webkit-stroke-opacity .3s ease-in;-moz-transition:-moz-stroke-dashoffset .3s ease-out,-moz-stroke-opacity .3s ease-in;-o-transition:-o-stroke-dashoffset .3s ease-out,-o-stroke-opacity .3s ease-in;transition:stroke-dashoffset .3s ease-out,stroke-opacity .3s ease-in}<\/style>\n<style>\n.by-mapa-page{margin:0}\n.by-mapa-page .by-hero{display:block !important;width:100% !important;text-align:center !important}\n.by-mapa-page h1,.by-mapa-page h2,.by-mapa-page h3,.by-mapa-page p{max-width:none;padding:0}\n.by-mapa-page .by-hero h1{margin:0 0 16px;line-height:1.05 !important}\n.by-mapa-page .by-hero .label{margin:0 0 16px;display:block}\n.by-mapa-page .by-hero p{max-width:560px !important;margin:0 auto !important}\n.by-mapa-page .by-section p{max-width:760px;margin:0 0 16px}\n.by-mapa-page .by-stats{display:flex !important;justify-content:center !important;margin-top:48px}\n.by-mapa-page summary{margin:0}\n.by-mapa-page details{margin:0 0 12px}\n.by-mapa-page .by-hero{margin-top:0}\n\n:root{\n  --by-green:#2d3a2e; --by-terra:#C4614A; --by-sage:#caddc0; --by-cream:#faf8f5;\n  --by-taupe:#8f7d71; --by-dark:#2c2422; --by-body-txt:#66615c;\n  --font-heading:'Bebas Neue',sans-serif; --font-body:'Poppins',sans-serif;\n}\n*{margin:0;padding:0;box-sizing:border-box}\nbody{font-family:var(--font-body);background:var(--by-cream);color:var(--by-body-txt);font-size:16px;line-height:1.6}\n\n\/* ===== HERO ===== *\/\n.by-hero{background:var(--by-green);padding:96px 24px 120px;text-align:center;position:relative;overflow:hidden}\n.by-hero::after{content:\"COMMUNITY\";position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);font-family:var(--font-heading);font-size:clamp(120px,22vw,280px);color:#fff;opacity:.04;letter-spacing:.05em;pointer-events:none;white-space:nowrap}\n.by-hero .label{font-size:12px;font-weight:600;letter-spacing:.3em;text-transform:uppercase;color:var(--by-sage);margin-bottom:16px}\n.by-hero h1{font-family:var(--font-heading);font-size:clamp(42px,7vw,72px);color:#fff;font-weight:400;letter-spacing:.02em;line-height:1.05;margin-bottom:16px}\n.by-hero p{color:rgba(255,255,255,.65);max-width:560px;margin:0 auto;font-size:16px}\n.by-rating{display:inline-flex;align-items:center;gap:8px;margin-top:22px;background:rgba(202,221,192,.12);border:1px solid rgba(202,221,192,.35);color:var(--by-sage);font-size:13px;padding:9px 20px;border-radius:200px;text-decoration:none;position:relative;z-index:1}\n.by-rating strong{color:#fff;font-weight:600}\n.by-rating:hover{border-color:var(--by-sage)}\n.by-stats{display:flex;justify-content:center;gap:64px;margin-top:48px;flex-wrap:wrap;position:relative;z-index:1}\n.by-stats .stat .num{font-family:var(--font-heading);font-size:56px;color:var(--by-sage);line-height:1}\n.by-stats .stat .lbl{font-size:11px;font-weight:600;letter-spacing:.2em;text-transform:uppercase;color:rgba(255,255,255,.5);margin-top:6px}\n\n\/* ===== FILTERS ===== *\/\n.by-filters{max-width:1200px;margin:-48px auto 0;padding:0 24px;position:relative;z-index:5}\n.by-filters-inner{background:#fff;border:1px solid rgba(45,58,46,.12);border-radius:16px;padding:20px 24px;display:flex;gap:12px;align-items:center;flex-wrap:wrap;box-shadow:0 12px 40px rgba(44,36,34,.10)}\n.by-chip{font-family:var(--font-body);font-size:13px;font-weight:600;padding:10px 22px;border-radius:200px;border:1.5px solid var(--by-green);background:transparent;color:var(--by-green);cursor:pointer;transition:all .2s;min-height:44px}\n.by-chip:hover{background:rgba(45,58,46,.06)}\n.by-chip.active{background:var(--by-green);color:#fff}\n.by-chip:focus-visible{outline:2px solid var(--by-terra);outline-offset:2px}\n.by-chip.teach{border-color:var(--by-terra);color:var(--by-terra)}\n.by-chip.teach.active{background:var(--by-terra);color:#fff}\n.by-search{flex:1;min-width:200px;border:1px solid rgba(45,58,46,.2);border-radius:200px;padding:11px 20px;font-family:var(--font-body);font-size:14px;color:var(--by-dark);background:var(--by-cream);min-height:44px}\n.by-search:focus{outline:2px solid var(--by-terra);border-color:var(--by-terra)}\n.by-count{font-size:12px;font-weight:600;letter-spacing:.15em;text-transform:uppercase;color:var(--by-taupe);white-space:nowrap}\n\n\/* ===== MAP ===== *\/\n.by-map-wrap{max-width:1200px;margin:32px auto 0;padding:0 24px}\n#map{height:600px;border-radius:16px;border:1px solid rgba(45,58,46,.12);position:relative;z-index:1;isolation:isolate}\n.by-pin{width:34px;height:34px;border-radius:50% 50% 50% 0;transform:rotate(-45deg);background:var(--by-terra);border:2.5px solid #fff;box-shadow:0 3px 10px rgba(44,36,34,.35);display:flex;align-items:center;justify-content:center}\n.by-pin.teach{background:var(--by-green)}\n.by-legend{display:flex;gap:20px;justify-content:center;margin-top:14px;font-size:12px;color:var(--by-taupe);font-weight:500}\n.by-legend span{display:inline-flex;align-items:center;gap:6px}\n.by-legend i{width:12px;height:12px;border-radius:50%;display:inline-block}\n.by-pin span{transform:rotate(45deg);color:#fff;font-weight:700;font-size:12px;font-family:var(--font-body)}\n.by-cluster{background:var(--by-green);color:#fff;border:3px solid var(--by-sage);border-radius:50%;display:flex;align-items:center;justify-content:center;font-family:var(--font-heading);font-size:18px;letter-spacing:.05em;box-shadow:0 3px 10px rgba(44,36,34,.3)}\n.leaflet-popup-content-wrapper{border-radius:12px;box-shadow:0 12px 40px rgba(44,36,34,.18);font-family:var(--font-body)}\n.leaflet-popup-content{margin:0;width:280px !important}\n.by-pop{padding:18px}\n.by-pop .top{display:flex;gap:14px;align-items:center;margin-bottom:10px}\n.by-pop h3{font-size:16px;font-weight:600;color:var(--by-dark);line-height:1.3}\n.by-pop .city{font-size:12px;color:var(--by-taupe);font-weight:500}\n.by-pop .prof{font-size:13px;color:var(--by-body-txt);margin:8px 0;line-height:1.5}\n.by-pop .links{display:flex;gap:8px;margin-top:12px;flex-wrap:wrap}\n.by-pop .badges{display:flex;flex-wrap:wrap;gap:8px;margin:2px 0 4px}\n\n\/* ===== AVATARS \/ BADGES \/ LINKS ===== *\/\n.by-avatar{width:52px;height:52px;border-radius:50%;background:var(--by-green);color:var(--by-sage);display:flex;align-items:center;justify-content:center;font-family:var(--font-heading);font-size:20px;letter-spacing:.03em;flex-shrink:0;background-size:cover;background-position:center}\n.by-badge{display:inline-block;font-size:10px;font-weight:600;letter-spacing:.12em;text-transform:uppercase;padding:4px 12px;border-radius:200px;background:var(--by-sage);color:var(--by-green)}\n.by-badge.teaching{background:rgba(196,97,74,.12);color:var(--by-terra)}\n.by-link{display:inline-flex;align-items:center;gap:6px;font-size:12px;font-weight:600;color:var(--by-green);text-decoration:none;border:1.5px solid rgba(45,58,46,.25);border-radius:200px;padding:7px 14px;transition:all .2s;min-height:32px}\n.by-link:hover{border-color:var(--by-terra);color:var(--by-terra)}\n.by-link svg{width:13px;height:13px;stroke-width:1.5}\n\n\/* ===== CARDS GRID ===== *\/\n.by-grid-section{max-width:1200px;margin:0 auto;padding:80px 24px 96px}\n.by-grid-section .label{font-size:12px;font-weight:600;letter-spacing:.3em;text-transform:uppercase;color:var(--by-taupe);text-align:center;margin-bottom:12px}\n.by-grid-section h2{font-family:var(--font-heading);font-size:clamp(32px,5vw,48px);font-weight:400;color:var(--by-dark);text-align:center;letter-spacing:.02em;margin-bottom:48px}\n.by-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(320px,1fr));gap:20px}\n.by-card{background:#fff;border:1px solid rgba(45,58,46,.12);border-radius:8px;padding:24px;display:flex;flex-direction:column;gap:12px;transition:box-shadow .25s,transform .25s}\n.by-card:hover{box-shadow:0 10px 32px rgba(44,36,34,.10);transform:translateY(-2px)}\n.by-card .head{display:flex;gap:14px;align-items:center}\n.by-card h3{font-size:16px;font-weight:600;color:var(--by-dark);line-height:1.3;text-transform:none;letter-spacing:0;margin:0;font-family:'Poppins',sans-serif}\n.by-card .city{font-size:12px;color:var(--by-taupe);font-weight:500;display:flex;align-items:center;gap:5px}\n.by-card .city svg{width:12px;height:12px;stroke-width:1.5}\n.by-card .prof{font-size:13.5px;line-height:1.55;color:var(--by-body-txt)}\n.by-card .badges{display:flex;gap:8px;flex-wrap:wrap}\n.by-card .links{display:flex;gap:8px;flex-wrap:wrap;margin-top:auto;padding-top:8px}\n.by-quote{font-size:13px;font-style:italic;color:var(--by-taupe);line-height:1.6;border-left:3px solid var(--by-sage);padding-left:12px}\n.by-quote a{color:var(--by-terra);font-weight:600;font-style:normal;text-decoration:none;font-size:11.5px;display:block;margin-top:4px}\n.by-empty{text-align:center;padding:64px 24px;color:var(--by-taupe);font-size:15px;display:none}\n\n\n\/* ===== DIRET\u00d3RIO A-Z ===== *\/\n.by-aznav{display:flex;flex-wrap:wrap;gap:6px;justify-content:center;margin-bottom:28px}\n.by-aznav a{font-size:12.5px;font-weight:600;color:var(--by-green);text-decoration:none;border:1px solid rgba(45,58,46,.2);border-radius:6px;min-width:30px;min-height:30px;display:inline-flex;align-items:center;justify-content:center;padding:4px}\n.by-aznav a:hover{background:var(--by-sage)}\n.by-azgroup{margin-bottom:8px}\n.by-azletter{font-family:var(--font-heading);font-size:26px;color:var(--by-terra);margin:24px 0 10px;border-bottom:1px solid rgba(45,58,46,.12);padding-bottom:4px;scroll-margin-top:20px}\n.by-row{background:#fff;border:1px solid rgba(45,58,46,.12);border-radius:8px;margin-bottom:8px;overflow:hidden}\n.by-row summary{list-style:none;cursor:pointer;display:flex;align-items:center;gap:14px;padding:12px 18px;min-height:44px}\n.by-row summary::-webkit-details-marker{display:none}\n.by-row summary .by-avatar{width:38px;height:38px;font-size:15px}\n.by-row .rn{font-weight:600;font-size:14.5px;color:var(--by-dark)}\n.by-row .rc{font-size:12px;color:var(--by-taupe)}\n.by-row .rdot{width:8px;height:8px;border-radius:50%;background:var(--by-terra);margin-left:auto;flex-shrink:0}\n.by-row .rdot.teach{background:var(--by-green)}\n.by-row summary::after{content:\"+\";font-family:var(--font-heading);font-size:20px;color:var(--by-terra);margin-left:10px}\n.by-row[open] summary::after{content:\"\u2013\"}\n.by-row .rbody{padding:4px 18px 18px;display:flex;flex-direction:column;gap:12px}\n.by-row .rbody.by-card{border:0;border-radius:0;background:transparent}\n.by-row .rbody.by-card:hover{box-shadow:none;transform:none}\n.by-mapa-page .city svg{width:12px;height:12px;flex-shrink:0}\n.by-mapa-page .by-link svg{width:13px;height:13px;flex-shrink:0}\n.by-mapa-page .by-avatar{flex-shrink:0}\n.by-row .rbody .head{display:none}\n.by-row summary .by-avatar{transition:width .25s,height .25s,font-size .25s}\n.by-row[open] summary .by-avatar{width:64px;height:64px;font-size:22px}\n.by-row[open] summary .rn{font-size:16px}\n.by-feat{margin-bottom:56px}\n.by-feat h3{font-family:var(--font-heading);font-size:24px;font-weight:400;color:var(--by-dark);letter-spacing:.02em;text-align:center;margin-bottom:24px}\n\n\/* ===== NOTE \/ FOOTER ===== *\/\n.by-note{max-width:760px;margin:0 auto;padding:0 24px 80px;text-align:center;font-size:13px;color:var(--by-taupe);line-height:1.7}\n.by-note a{color:var(--by-terra);font-weight:600;text-decoration:none}\n\n\n\/* ===== SEC\u00c7\u00d5ES SEO \/ SOBRE \/ FAQ \/ CTA ===== *\/\n.by-section{padding:80px 24px}\n.by-section .inner{max-width:1080px;margin:0 auto}\n.by-section .label{font-size:12px;font-weight:600;letter-spacing:.3em;text-transform:uppercase;color:var(--by-taupe);margin-bottom:12px}\n.by-section h2{font-family:var(--font-heading);font-size:clamp(32px,5vw,48px);font-weight:400;color:var(--by-dark);letter-spacing:.02em;line-height:1.1;margin-bottom:20px}\n.by-section p{max-width:760px;line-height:1.75;margin-bottom:16px}\n.by-white{background:#fff}\n.by-creds{display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:16px;margin-top:36px}\n.by-cred{background:var(--by-cream);border:1px solid rgba(45,58,46,.12);border-radius:8px;padding:22px}\n.by-cred .k{font-family:var(--font-heading);font-size:26px;color:var(--by-terra);margin-bottom:8px}\n.by-cred p{font-size:13px;line-height:1.6;margin:0}\n.by-certlogos{display:block;max-width:680px;width:100%;height:auto;margin:44px auto 0}\n.by-faq details{background:#fff;border:1px solid rgba(45,58,46,.12);border-radius:8px;margin-bottom:12px;overflow:hidden}\n.by-faq summary{cursor:pointer;padding:20px 24px;font-weight:600;font-size:15.5px;color:var(--by-dark);list-style:none;display:flex;justify-content:space-between;align-items:center;gap:16px}\n.by-faq summary::after{content:\"+\";font-family:var(--font-heading);font-size:24px;color:var(--by-terra);flex-shrink:0}\n.by-faq details[open] summary::after{content:\"\u2013\"}\n.by-faq .a{padding:0 24px 20px;font-size:14.5px;line-height:1.7}\n.by-cta{background:var(--by-green);text-align:center;padding:96px 24px}\n.by-cta .label{color:var(--by-sage)}\n.by-cta h2{color:#fff}\n.by-cta p{color:rgba(255,255,255,.65);margin:0 auto 32px}\n.by-btn{display:inline-block;background:var(--by-terra);color:#fff;font-weight:600;font-size:14px;padding:15px 34px;border-radius:200px;text-decoration:none;margin:6px;transition:background .2s;min-height:44px}\n.by-btn:hover{background:#ad5340}\n.by-btn.outline{background:transparent;border:1.5px solid rgba(255,255,255,.35);color:rgba(255,255,255,.85)}\n.by-btn.outline:hover{border-color:#fff;color:#fff;background:transparent}\n\n@media(max-width:600px){\n  .by-hero{padding:64px 20px 96px}\n  .by-stats{gap:32px}\n  .by-stats .stat .num{font-size:42px}\n  #map{height:440px}\n  .by-filters-inner{padding:16px}\n}\n\n\/* ===== FIDELIDADE A MAQUETA DENTRO DO TEMA ===== *\/\n.by-mapa-page{width:100vw;margin-left:calc(50% - 50vw);margin-right:calc(50% - 50vw);background:var(--by-cream)}\n.by-mapa-page .by-chip{background:transparent !important;color:var(--by-green) !important;border:1.5px solid var(--by-green) !important;border-radius:200px !important;text-transform:none !important;letter-spacing:0 !important;font-size:13px !important;font-weight:600 !important;font-family:'Poppins',sans-serif !important;padding:10px 22px !important;box-shadow:none !important;line-height:1.2 !important}\n.by-mapa-page .by-chip:hover{background:rgba(45,58,46,.06) !important;color:var(--by-green) !important}\n.by-mapa-page .by-chip.active,.by-mapa-page .by-chip.active:hover{background:var(--by-green) !important;color:#fff !important}\n.by-mapa-page .by-chip.teach{border-color:var(--by-terra) !important;color:var(--by-terra) !important}\n.by-mapa-page .by-chip.teach:hover{background:rgba(196,97,74,.08) !important}\n.by-mapa-page .by-chip.teach.active,.by-mapa-page .by-chip.teach.active:hover{background:var(--by-terra) !important;color:#fff !important}\n.by-mapa-page .by-search{background:var(--by-cream) !important;border:1px solid rgba(45,58,46,.2) !important;border-radius:200px !important;color:var(--by-dark) !important;font-size:14px !important;font-family:'Poppins',sans-serif !important;padding:11px 20px !important;box-shadow:none !important}\n.by-mapa-page .by-btn{background:var(--by-terra) !important;color:#fff !important;border-radius:200px !important;text-decoration:none !important;font-size:14px !important;font-weight:600 !important;padding:15px 34px !important;border:0 !important;text-transform:none !important;letter-spacing:0 !important}\n.by-mapa-page .by-btn:hover{background:#ad5340 !important}\n.by-mapa-page .by-btn.outline{background:transparent !important;border:1.5px solid rgba(255,255,255,.35) !important;color:rgba(255,255,255,.85) !important}\n.by-mapa-page .by-btn.outline:hover{border-color:#fff !important;color:#fff !important;background:transparent !important}\n.by-mapa-page .by-rating{border-radius:200px !important;text-decoration:none !important}\n\n\/* hierarquia de cor do hero *\/\n.by-mapa-page .by-hero .label{color:var(--by-sage) !important}\n.by-mapa-page .by-hero h1{color:#fff !important}\n.by-mapa-page .by-hero p:not(.label){color:rgba(255,255,255,.65) !important}\n.by-mapa-page .by-hero p strong{color:#fff !important}\n.by-mapa-page .by-stats .stat .num{color:var(--by-sage) !important}\n.by-mapa-page .by-stats .stat .lbl{color:rgba(255,255,255,.5) !important}\n.by-mapa-page .by-rating{color:var(--by-sage) !important}\n.by-mapa-page .by-rating strong{color:#fff !important}\n.by-mapa-page .by-cta .label{color:var(--by-sage) !important}\n.by-mapa-page .by-cta h2{color:#fff !important}\n.by-mapa-page .by-cta p:not(.label){color:rgba(255,255,255,.65) !important}\n.by-mapa-page .by-cta .label,.by-mapa-page .by-cta p{margin-left:auto !important;margin-right:auto !important} \/*by-cta-center-fix*\/\n\n\/* cartoes: nome alinhado com a foto + respiro no testemunho *\/\n.by-mapa-page .by-card h3{font-family:'Poppins',sans-serif !important;font-size:16px !important;font-weight:600 !important;color:var(--by-dark) !important;line-height:1.3 !important;text-align:left !important;text-transform:none !important;letter-spacing:0 !important;margin:0 0 3px !important;padding:0 !important}\n.by-mapa-page .by-card .head{display:flex !important;gap:14px !important;align-items:center !important;text-align:left !important}\n.by-mapa-page .by-card .city{justify-content:flex-start !important;margin:0 !important}\n.by-mapa-page .by-quote{border-left:3px solid var(--by-sage) !important;padding:2px 0 2px 16px !important;margin:4px 0 !important;text-align:left !important}\n\n.by-mapa-page .by-row .rbody .head{display:none !important}\n\n\/* nota final + espacamento entre seccoes *\/\n.by-mapa-page .by-note{max-width:760px !important;margin:0 auto !important;padding:48px 24px 80px !important;text-align:center !important;font-size:13px !important;color:var(--by-taupe) !important;line-height:1.7 !important}\n.by-mapa-page .by-note a{color:var(--by-terra) !important;font-weight:600 !important;text-decoration:none !important}\n.by-mapa-page section,.by-mapa-page .by-section,.by-mapa-page .by-cta{margin-top:0 !important;margin-bottom:0 !important}\n<\/style>\n<script type=\"application\/ld+json\">\n{\"@context\":\"https:\/\/schema.org\",\"@type\":\"FAQPage\",\"mainEntity\":[\n{\"@type\":\"Question\",\"name\":\"What is the BeYoga School graduate map?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"It is the official directory of BeYoga School graduates \u2014 a yoga teacher training school in Lisbon. Each pin represents a real person who completed a certified training, with their city, courses, profession and yoga projects.\"}},\n{\"@type\":\"Question\",\"name\":\"How do I find a yoga teacher near me?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"Use the Teaching filter and navigate the map to your area. BeYoga-trained teachers are in more than 100 cities across Portugal and also in Spain, France, Switzerland and Germany. Many have Instagram and website links on their profiles for direct contact.\"}},\n{\"@type\":\"Question\",\"name\":\"What trainings did these people take?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"The 200H Yoga Teacher Training (YTT 200H), certified by Yoga Alliance, DGERT and IPDJ, and specialisation courses: Yin Yoga, Yoga Nidra, Restorative Yoga, Meditation, Pranayama, Chair Yoga and Therapeutic Yoga.\"}},\n{\"@type\":\"Question\",\"name\":\"How can I appear on this map?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"Complete a training at BeYoga School and your place on the map is guaranteed. If you are already a graduate and not yet listed, or want to update your details and photo, contact us at geral@beyoga.pt.\"}},\n{\"@type\":\"Question\",\"name\":\"Is BeYoga School certified?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"Yes. BeYoga School is a Registered Yoga School with Yoga Alliance (RYS 200 and RYS 300), certified by DGERT and recognised by IPDJ. Since 2018 it has trained more than 200 teachers, with over 3,700 certified hours.\"}},\n{\"@type\":\"Question\",\"name\":\"Are these teachers\u2019 classes run by BeYoga?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"No. Each teacher develops their own project independently: their own studios, classes in gyms and schools, online or at home. BeYoga proudly showcases these projects, because our graduates\u2019 success is the best proof of the quality of the training.\"}}\n]}\n<\/script>\n<div class=\"by-mapa-page\">\n<script type=\"application\/ld+json\" id=\"mapa-itemlist\">{\"@context\":\"https:\/\/schema.org\",\"@type\":\"ItemList\",\"name\":\"Alunos formados pela BeYoga\",\"numberOfItems\":176,\"itemListOrder\":\"https:\/\/schema.org\/ItemListUnordered\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"item\":{\"@type\":\"Person\",\"name\":\"Ana Rita Serra Lopes\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"Set\u00fabal\",\"addressCountry\":\"Portugal\"},\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"},\"jobTitle\":\"Professora de Hatha Yoga e Yoga Kids\"}},{\"@type\":\"ListItem\",\"position\":2,\"item\":{\"@type\":\"Person\",\"name\":\"Anna Balejko\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"Lisboa\",\"addressCountry\":\"Portugal\"},\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"},\"jobTitle\":\"Gestora financeira\",\"sameAs\":[\"https:\/\/instagram.com\/ayanama.yogi\"]}},{\"@type\":\"ListItem\",\"position\":3,\"item\":{\"@type\":\"Person\",\"name\":\"Joana Alves\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"Cascais\",\"addressCountry\":\"Portugal\"},\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"},\"jobTitle\":\"Professora de Yoga e Consultora Imobili\u00e1ria\"}},{\"@type\":\"ListItem\",\"position\":4,\"item\":{\"@type\":\"Person\",\"name\":\"Rita Mestre\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"Corroios\",\"addressCountry\":\"Portugal\"},\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"},\"jobTitle\":\"T\u00e9cnica de Cardiopneumologia\",\"sameAs\":[\"https:\/\/instagram.com\/aritamestre\"]}},{\"@type\":\"ListItem\",\"position\":5,\"item\":{\"@type\":\"Person\",\"name\":\"Adriana Teixeira\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"Aveiro\",\"addressCountry\":\"Portugal\"},\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"},\"jobTitle\":\"Professora de F\u00edsica\/Qu\u00edmica e de Yoga \u00b7 Sleeping Code\"}},{\"@type\":\"ListItem\",\"position\":6,\"item\":{\"@type\":\"Person\",\"name\":\"Rita Sousa\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"Schweinfurt\",\"addressCountry\":\"Alemanha\"},\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"},\"jobTitle\":\"Massagista\"}},{\"@type\":\"ListItem\",\"position\":7,\"item\":{\"@type\":\"Person\",\"name\":\"Odete Lopes\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"Coimbra\",\"addressCountry\":\"Portugal\"},\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"},\"jobTitle\":\"Formadora na \u00e1rea de Restaura\u00e7\u00e3o\"}},{\"@type\":\"ListItem\",\"position\":8,\"item\":{\"@type\":\"Person\",\"name\":\"Elsa Costa\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"Guimar\u00e3es\",\"addressCountry\":\"Portugal\"},\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"},\"jobTitle\":\"Fisioterapeuta e Professora de Yoga\",\"sameAs\":[\"https:\/\/instagram.com\/yoga.com.alma\"]}},{\"@type\":\"ListItem\",\"position\":9,\"item\":{\"@type\":\"Person\",\"name\":\"Teresa Arcanjo\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"Rio Tinto\",\"addressCountry\":\"Portugal\"},\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"},\"jobTitle\":\"Atriz \u00b7 Yoga e Yoga Facial\",\"sameAs\":[\"https:\/\/instagram.com\/yogibi.arcanjo\"]}},{\"@type\":\"ListItem\",\"position\":10,\"item\":{\"@type\":\"Person\",\"name\":\"Anabela Oliveira\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"Lourosa\",\"addressCountry\":\"Portugal\"},\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"},\"jobTitle\":\"Professora de Yoga \u00b7 Psic\u00f3loga\"}},{\"@type\":\"ListItem\",\"position\":11,\"item\":{\"@type\":\"Person\",\"name\":\"Sabrina Ruan\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"Lisboa\",\"addressCountry\":\"Portugal\"},\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"},\"jobTitle\":\"Personal Trainer e Instrutora de Yoga \u00b7 Yoga Vita Qualis\",\"sameAs\":[\"https:\/\/instagram.com\/sabrina.italia.16\"]}},{\"@type\":\"ListItem\",\"position\":12,\"item\":{\"@type\":\"Person\",\"name\":\"Claudia Barbeiro\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"Leiria\",\"addressCountry\":\"Portugal\"},\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"},\"jobTitle\":\"Gerontologia\"}},{\"@type\":\"ListItem\",\"position\":13,\"item\":{\"@type\":\"Person\",\"name\":\"Alexandra Mendes\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"Lisboa\",\"addressCountry\":\"Portugal\"},\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"},\"jobTitle\":\"Professora de Yoga e Personal Trainer\",\"sameAs\":[\"https:\/\/instagram.com\/alexa_yoga_fitness\"]}},{\"@type\":\"ListItem\",\"position\":14,\"item\":{\"@type\":\"Person\",\"name\":\"Marta Castanho\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"Lisboa\",\"addressCountry\":\"Portugal\"},\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"},\"jobTitle\":\"Professora\",\"sameAs\":[\"https:\/\/instagram.com\/mpcastanho\"]}},{\"@type\":\"ListItem\",\"position\":15,\"item\":{\"@type\":\"Person\",\"name\":\"Luis Silvestre\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"Pa\u00e7o de Arcos\",\"addressCountry\":\"Portugal\"},\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"},\"jobTitle\":\"Professor de Dan\u00e7a\",\"sameAs\":[\"https:\/\/instagram.com\/luis_p_sillvestre\"]}},{\"@type\":\"ListItem\",\"position\":16,\"item\":{\"@type\":\"Person\",\"name\":\"In\u00eas Guerreiro\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"Lisboa \u00b7 Oeiras\",\"addressCountry\":\"Portugal\"},\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"},\"jobTitle\":\"Professora de Yoga e Tradutora\/Revisora \u00b7 Yoga da In\u00eas\",\"sameAs\":[\"https:\/\/instagram.com\/guerreiroi_\"]}},{\"@type\":\"ListItem\",\"position\":17,\"item\":{\"@type\":\"Person\",\"name\":\"Paulo Vieira\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"Amadora \u00b7 Lisboa \u00b7 Oeiras\",\"addressCountry\":\"Portugal\"},\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"},\"jobTitle\":\"Professor de Yoga e Instrutor de Breathwork \u00b7 UNO Yoga e Breathwork\",\"sameAs\":[\"https:\/\/instagram.com\/uno.yogabreathwork\",\"https:\/\/uno-yogaebreathwork.softr.app\/\"]}},{\"@type\":\"ListItem\",\"position\":18,\"item\":{\"@type\":\"Person\",\"name\":\"Lu\u00edsa Caldeira\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"Porto Santo\",\"addressCountry\":\"Portugal\"},\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"},\"jobTitle\":\"T\u00e9cnica de tr\u00e1fego de assist\u00eancia em escala\"}},{\"@type\":\"ListItem\",\"position\":19,\"item\":{\"@type\":\"Person\",\"name\":\"C\u00e1tia Sebasti\u00e3o\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"P\u00f3voa de Santa Iria\",\"addressCountry\":\"Portugal\"},\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"},\"jobTitle\":\"Professora de Yoga, Baby Yoga e Yoga Kids\",\"sameAs\":[\"https:\/\/instagram.com\/reikiyoga_reequilibra\"]}},{\"@type\":\"ListItem\",\"position\":20,\"item\":{\"@type\":\"Person\",\"name\":\"Edgar Cardoso\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"Ovar\",\"addressCountry\":\"Portugal\"},\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"},\"jobTitle\":\"Terapeuta hol\u00edstico e massagista \u00b7 Portal 777\",\"sameAs\":[\"https:\/\/instagram.com\/portaldo777\",\"https:\/\/www.portal-777.com\/\"]}},{\"@type\":\"ListItem\",\"position\":21,\"item\":{\"@type\":\"Person\",\"name\":\"Marta Carmo\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"Aveiro\",\"addressCountry\":\"Portugal\"},\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"},\"jobTitle\":\"Professora de Yoga\",\"sameAs\":[\"https:\/\/instagram.com\/martaalexandracarmo\"]}},{\"@type\":\"ListItem\",\"position\":22,\"item\":{\"@type\":\"Person\",\"name\":\"Silvia Maganinho\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"Esmoriz\",\"addressCountry\":\"Portugal\"},\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"},\"jobTitle\":\"Professora de Yoga \u00b7 Maitri Yoga\"}},{\"@type\":\"ListItem\",\"position\":23,\"item\":{\"@type\":\"Person\",\"name\":\"Danahe Garrido\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"Vila Nova de Gaia\",\"addressCountry\":\"Portugal\"},\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"},\"jobTitle\":\"Professora de Yoga  e  Medita\u00e7\u00e3o \u00b7 Fundadora do espa\u00e7o YogArte\",\"sameAs\":[\"https:\/\/instagram.com\/yogarte.oficial\",\"https:\/\/www.yogarte.pt\"]}},{\"@type\":\"ListItem\",\"position\":24,\"item\":{\"@type\":\"Person\",\"name\":\"Val\u00e9ria Guimar\u00e3es\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"Oliveira do Bairro\",\"addressCountry\":\"Portugal\"},\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"},\"jobTitle\":\"Fisioterapeuta\"}},{\"@type\":\"ListItem\",\"position\":25,\"item\":{\"@type\":\"Person\",\"name\":\"Rita Marafuz\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"Maia\",\"addressCountry\":\"Portugal\"},\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"},\"jobTitle\":\"Terapeuta de Medicina Chinesa e Acupuntura \u00b7 Zhi Studio\",\"sameAs\":[\"https:\/\/instagram.com\/zhistudio.pt\",\"https:\/\/zhistudio.pt\/\"]}},{\"@type\":\"ListItem\",\"position\":26,\"item\":{\"@type\":\"Person\",\"name\":\"Maria de F\u00e1tima Gomes\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"Braga\",\"addressCountry\":\"Portugal\"},\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"},\"jobTitle\":\"Enfermeira\"}},{\"@type\":\"ListItem\",\"position\":27,\"item\":{\"@type\":\"Person\",\"name\":\"Paulo Costa\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"Vila Nova de Cerveira\",\"addressCountry\":\"Portugal\"},\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"},\"jobTitle\":\"Arquitecto e Instrutor de Yoga \u00b7 Casa do Lento\",\"sameAs\":[\"https:\/\/instagram.com\/casadolento\",\"https:\/\/casadolento.com\"]}},{\"@type\":\"ListItem\",\"position\":28,\"item\":{\"@type\":\"Person\",\"name\":\"Paula Silva\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"Espinho\",\"addressCountry\":\"Portugal\"},\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"},\"jobTitle\":\"Animadora Sociocultural e Professora de Yoga\"}},{\"@type\":\"ListItem\",\"position\":29,\"item\":{\"@type\":\"Person\",\"name\":\"Ana Pardal\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"P\u00f3voa de Santa Iria\",\"addressCountry\":\"Portugal\"},\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"},\"jobTitle\":\"Tradutora e Consultora Imobili\u00e1ria\"}},{\"@type\":\"ListItem\",\"position\":30,\"item\":{\"@type\":\"Person\",\"name\":\"Sofia Luz\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"Alc\u00e1cer do Sal\",\"addressCountry\":\"Portugal\"},\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"},\"jobTitle\":\"Engenharia de Dados\",\"sameAs\":[\"https:\/\/instagram.com\/csofiaflz\"]}},{\"@type\":\"ListItem\",\"position\":31,\"item\":{\"@type\":\"Person\",\"name\":\"S\u00f3nia Galv\u00e3o\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"Belas\",\"addressCountry\":\"Portugal\"},\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"},\"jobTitle\":\"Contabilista Certificada \u00b7 Aromaterapia e Yoga Facial\",\"sameAs\":[\"https:\/\/instagram.com\/soniagalvao.faceyoga\"]}},{\"@type\":\"ListItem\",\"position\":32,\"item\":{\"@type\":\"Person\",\"name\":\"Cristina Valente\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"Moura\",\"addressCountry\":\"Portugal\"},\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"},\"jobTitle\":\"Centro de bem-estar e terapias \u00b7 Reiki, TFT e aulas privadas de yoga\",\"sameAs\":[\"https:\/\/instagram.com\/cristina_valente22\"]}},{\"@type\":\"ListItem\",\"position\":33,\"item\":{\"@type\":\"Person\",\"name\":\"Joana D'E\u00e7a Leal\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"Alg\u00e9s\",\"addressCountry\":\"Portugal\"},\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"},\"jobTitle\":\"Auditoria Financeira\"}},{\"@type\":\"ListItem\",\"position\":34,\"item\":{\"@type\":\"Person\",\"name\":\"Carla Caba\u00e7a\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"Torres Vedras\",\"addressCountry\":\"Portugal\"},\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"},\"jobTitle\":\"Professora de Yoga \u00b7 Pausa Yoga\",\"sameAs\":[\"https:\/\/instagram.com\/pausa__yoga\"]}},{\"@type\":\"ListItem\",\"position\":35,\"item\":{\"@type\":\"Person\",\"name\":\"Cec\u00edlia Caba\u00e7a\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"Alcanena\",\"addressCountry\":\"Portugal\"},\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"},\"jobTitle\":\"Docente de Educa\u00e7\u00e3o F\u00edsica e Yoga\"}},{\"@type\":\"ListItem\",\"position\":36,\"item\":{\"@type\":\"Person\",\"name\":\"F\u00e1tima Moreno\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"Santiago do Cac\u00e9m\",\"addressCountry\":\"Portugal\"},\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"},\"jobTitle\":\"Professora\"}},{\"@type\":\"ListItem\",\"position\":37,\"item\":{\"@type\":\"Person\",\"name\":\"Eduarda Saraiva\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"\u00c1gueda\",\"addressCountry\":\"Portugal\"},\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"},\"jobTitle\":\"Professora de Yoga a tempo inteiro\",\"sameAs\":[\"https:\/\/instagram.com\/estrelasirius2023\"]}},{\"@type\":\"ListItem\",\"position\":38,\"item\":{\"@type\":\"Person\",\"name\":\"Dora Pedro\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"Maia\",\"addressCountry\":\"Portugal\"},\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"},\"jobTitle\":\"Ambiente, Seguran\u00e7a e Sa\u00fade\"}},{\"@type\":\"ListItem\",\"position\":39,\"item\":{\"@type\":\"Person\",\"name\":\"Catarina Gra\u00e7a\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"Porto\",\"addressCountry\":\"Portugal\"},\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"},\"jobTitle\":\"Professora de Yoga, Medita\u00e7\u00e3o e Barre\",\"sameAs\":[\"https:\/\/instagram.com\/catedricas\"]}},{\"@type\":\"ListItem\",\"position\":40,\"item\":{\"@type\":\"Person\",\"name\":\"Sebasti\u00e3o Medeiros\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"\u00c1gueda\",\"addressCountry\":\"Portugal\"},\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"},\"jobTitle\":\"T\u00e9cnico Auxiliar de Farm\u00e1cia \u00b7 Yoga\",\"sameAs\":[\"https:\/\/instagram.com\/sebastiao_dharana\"]}},{\"@type\":\"ListItem\",\"position\":41,\"item\":{\"@type\":\"Person\",\"name\":\"Jo\u00e3o Pedro Alves\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"Lausanne\",\"addressCountry\":\"Su\u00ed\u00e7a\"},\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"},\"jobTitle\":\"Personal Trainer\",\"sameAs\":[\"https:\/\/instagram.com\/joao_alvesss_pt\"]}},{\"@type\":\"ListItem\",\"position\":42,\"item\":{\"@type\":\"Person\",\"name\":\"Maria Grifo Ramos\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"Peniche\",\"addressCountry\":\"Portugal\"},\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"},\"jobTitle\":\"MARYOGA \u2014 Vinyasa Flow by the Sea\",\"sameAs\":[\"https:\/\/instagram.com\/_maryoga\"]}},{\"@type\":\"ListItem\",\"position\":43,\"item\":{\"@type\":\"Person\",\"name\":\"Vanessa Sanona\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"Moita\",\"addressCountry\":\"Portugal\"},\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"},\"jobTitle\":\"Pricing Specialist\",\"sameAs\":[\"https:\/\/instagram.com\/vanessasanona\"]}},{\"@type\":\"ListItem\",\"position\":44,\"item\":{\"@type\":\"Person\",\"name\":\"Kateryna Goriachenko\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"Arma\u00e7\u00e3o de P\u00eara\",\"addressCountry\":\"Portugal\"},\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"},\"jobTitle\":\"Est\u00e9tica e Professora de Yoga\"}},{\"@type\":\"ListItem\",\"position\":45,\"item\":{\"@type\":\"Person\",\"name\":\"Carla Sofia Pereira\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"Barreiro\",\"addressCountry\":\"Portugal\"},\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"},\"jobTitle\":\"Bodywork \u00b7 Pr\u00e1ticas de toque e respira\u00e7\u00e3o consciente\",\"sameAs\":[\"https:\/\/instagram.com\/desperta.a.essencia\"]}},{\"@type\":\"ListItem\",\"position\":46,\"item\":{\"@type\":\"Person\",\"name\":\"Carina Batista\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"Montijo\",\"addressCountry\":\"Portugal\"},\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"},\"jobTitle\":\"Militar \u00b7 Aulas de Yoga\",\"sameAs\":[\"https:\/\/instagram.com\/yoga.acarina\"]}},{\"@type\":\"ListItem\",\"position\":47,\"item\":{\"@type\":\"Person\",\"name\":\"In\u00eas Antunes\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"Lisboa\",\"addressCountry\":\"Portugal\"},\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"},\"jobTitle\":\"Advogada\"}},{\"@type\":\"ListItem\",\"position\":48,\"item\":{\"@type\":\"Person\",\"name\":\"Cristiana Vieira\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"Porto de M\u00f3s\",\"addressCountry\":\"Portugal\"},\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"},\"jobTitle\":\"Gestora de Redes Sociais \u00b7 Yoga com Cristiana\",\"sameAs\":[\"https:\/\/instagram.com\/yogacomcristiana\",\"https:\/\/yogacomcristiana.pt\"]}},{\"@type\":\"ListItem\",\"position\":49,\"item\":{\"@type\":\"Person\",\"name\":\"Marisa Silva\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"Olh\u00e3o\",\"addressCountry\":\"Portugal\"},\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"},\"jobTitle\":\"Motorista TVDE\",\"sameAs\":[\"https:\/\/instagram.com\/marisa.silva81\"]}},{\"@type\":\"ListItem\",\"position\":50,\"item\":{\"@type\":\"Person\",\"name\":\"Cristina Catita\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"Vila Franca de Xira\",\"addressCountry\":\"Portugal\"},\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"},\"jobTitle\":\"Docente Universit\u00e1ria\"}},{\"@type\":\"ListItem\",\"position\":51,\"item\":{\"@type\":\"Person\",\"name\":\"S\u00f3nia Isabel da Costa\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"Braga\",\"addressCountry\":\"Portugal\"},\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"},\"jobTitle\":\"Beleza e Est\u00e9tica\"}},{\"@type\":\"ListItem\",\"position\":52,\"item\":{\"@type\":\"Person\",\"name\":\"B\u00e1rbara Silva\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"Vila Nova de Gaia\",\"addressCountry\":\"Portugal\"},\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"},\"jobTitle\":\"Administrativa\",\"sameAs\":[\"https:\/\/instagram.com\/barbara_o_silva\"]}},{\"@type\":\"ListItem\",\"position\":53,\"item\":{\"@type\":\"Person\",\"name\":\"Maria Neves\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"Aveiro\",\"addressCountry\":\"Portugal\"},\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"},\"jobTitle\":\"Analista de Dados\",\"sameAs\":[\"https:\/\/instagram.com\/mariacdasneves\"]}},{\"@type\":\"ListItem\",\"position\":54,\"item\":{\"@type\":\"Person\",\"name\":\"Mariana Rosa\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"Coimbra\",\"addressCountry\":\"Portugal\"},\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"},\"jobTitle\":\"Professora de Yoga e Terapeuta Emocional\",\"sameAs\":[\"https:\/\/instagram.com\/marianarosa.pt\",\"https:\/\/linktr.ee\/Marianarosa.terapeuta\"]}},{\"@type\":\"ListItem\",\"position\":55,\"item\":{\"@type\":\"Person\",\"name\":\"Andreia Amaral\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"Ermesinde\",\"addressCountry\":\"Portugal\"},\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"},\"jobTitle\":\"T\u00e9cnica Administrativa \u00b7 Ankora Yoga\",\"sameAs\":[\"https:\/\/instagram.com\/ankora_yoga\"]}},{\"@type\":\"ListItem\",\"position\":56,\"item\":{\"@type\":\"Person\",\"name\":\"Dorinda da Costa\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"Vila Nova de Gaia\",\"addressCountry\":\"Portugal\"},\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"},\"jobTitle\":\"Professora de Yoga \u00b7 Espa\u00e7o YUCCA \u2014 Artes, Of\u00edcios e Bem-Estar\"}},{\"@type\":\"ListItem\",\"position\":57,\"item\":{\"@type\":\"Person\",\"name\":\"Mariane Bunn\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"Castres\",\"addressCountry\":\"Fran\u00e7a\"},\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"},\"jobTitle\":\"Professora de Yoga \u00b7 Yoga com Mari\",\"sameAs\":[\"https:\/\/instagram.com\/marianebunn\"]}},{\"@type\":\"ListItem\",\"position\":58,\"item\":{\"@type\":\"Person\",\"name\":\"Alexandra dos Santos\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"Porto\",\"addressCountry\":\"Portugal\"},\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"},\"jobTitle\":\"Uniyoga \u2014 Conex\u00e3o e Harmonia\",\"sameAs\":[\"https:\/\/instagram.com\/uniyoga.conexaoeharmonia\"]}},{\"@type\":\"ListItem\",\"position\":59,\"item\":{\"@type\":\"Person\",\"name\":\"Ana Jo\u00e3o Mateus\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"Vila Real\",\"addressCountry\":\"Portugal\"},\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"},\"jobTitle\":\"Artesanato\",\"sameAs\":[\"https:\/\/instagram.com\/anajoaomateus\"]}},{\"@type\":\"ListItem\",\"position\":60,\"item\":{\"@type\":\"Person\",\"name\":\"Leonor Silva\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"Serzedelo, Guimar\u00e3es\",\"addressCountry\":\"Portugal\"},\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"},\"jobTitle\":\"Enfermeira\",\"sameAs\":[\"https:\/\/instagram.com\/nono.almeida\"]}},{\"@type\":\"ListItem\",\"position\":61,\"item\":{\"@type\":\"Person\",\"name\":\"Clara Quaresma\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"Porto\",\"addressCountry\":\"Portugal\"},\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"},\"jobTitle\":\"Professora de Yoga\",\"sameAs\":[\"https:\/\/instagram.com\/girassois30\"]}},{\"@type\":\"ListItem\",\"position\":62,\"item\":{\"@type\":\"Person\",\"name\":\"M\u00e1rcia Ribeiro\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"Ermesinde\",\"addressCountry\":\"Portugal\"},\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"},\"jobTitle\":\"Gest\u00e3o da Forma\u00e7\u00e3o\",\"sameAs\":[\"https:\/\/instagram.com\/marcia.ribeiro.100\"]}},{\"@type\":\"ListItem\",\"position\":63,\"item\":{\"@type\":\"Person\",\"name\":\"Elisabete da Silva Ribeiro\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"Porto\",\"addressCountry\":\"Portugal\"},\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"},\"jobTitle\":\"Gestora de Alojamento Local\",\"sameAs\":[\"https:\/\/instagram.com\/elisabete.silvarib\"]}},{\"@type\":\"ListItem\",\"position\":64,\"item\":{\"@type\":\"Person\",\"name\":\"Caroline Ribeiro\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"Bragan\u00e7a\",\"addressCountry\":\"Portugal\"},\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"},\"jobTitle\":\"Investigadora em Produtos Naturais \u00b7 Professora de Yoga\"}},{\"@type\":\"ListItem\",\"position\":65,\"item\":{\"@type\":\"Person\",\"name\":\"Ivete Moutinho\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"Vila Nova de Famalic\u00e3o\",\"addressCountry\":\"Portugal\"},\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"},\"jobTitle\":\"Docente de Educa\u00e7\u00e3o Especial \u00b7 Brinca Yoga\",\"sameAs\":[\"https:\/\/instagram.com\/ivecpm\"]}},{\"@type\":\"ListItem\",\"position\":66,\"item\":{\"@type\":\"Person\",\"name\":\"Susana Melo\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"Viseu\",\"addressCountry\":\"Portugal\"},\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"},\"jobTitle\":\"Professora de Yoga e Engenheira Civil \u00b7 SuYoga\",\"sameAs\":[\"https:\/\/instagram.com\/suyoga80\"]}},{\"@type\":\"ListItem\",\"position\":67,\"item\":{\"@type\":\"Person\",\"name\":\"Ana Santos\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"Queluz\",\"addressCountry\":\"Portugal\"},\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"},\"jobTitle\":\"Designer Multim\u00e9dia \u00b7 Pr\u00e1tica Yoga\",\"sameAs\":[\"https:\/\/instagram.com\/praticayoga.pt\",\"https:\/\/praticayoga.pt\/\"]}},{\"@type\":\"ListItem\",\"position\":68,\"item\":{\"@type\":\"Person\",\"name\":\"Solange Morais\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"\u00c9vora\",\"addressCountry\":\"Portugal\"},\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"},\"jobTitle\":\"Professora de Yoga \u00b7 Sol Yoga Vibes\",\"sameAs\":[\"https:\/\/instagram.com\/sol.yogavibes\"]}},{\"@type\":\"ListItem\",\"position\":69,\"item\":{\"@type\":\"Person\",\"name\":\"Carla Nogueira\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"Valongo \u00b7 Albufeira\",\"addressCountry\":\"Portugal\"},\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"},\"jobTitle\":\"Educa\u00e7\u00e3o e Yoga\",\"sameAs\":[\"https:\/\/instagram.com\/carlanogu3ira\"]}},{\"@type\":\"ListItem\",\"position\":70,\"item\":{\"@type\":\"Person\",\"name\":\"Clara Fuster\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"Vale de Cambra\",\"addressCountry\":\"Portugal\"},\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"},\"jobTitle\":\"Enfermeira\"}},{\"@type\":\"ListItem\",\"position\":71,\"item\":{\"@type\":\"Person\",\"name\":\"Susana Patr\u00edcio\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"Sintra\",\"addressCountry\":\"Portugal\"},\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"},\"jobTitle\":\"Professora de Yoga \u00b7 Su Yoga Classes\"}},{\"@type\":\"ListItem\",\"position\":72,\"item\":{\"@type\":\"Person\",\"name\":\"Ana Oliveira\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"P\u00f3voa de Varzim\",\"addressCountry\":\"Portugal\"},\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"},\"jobTitle\":\"Instrutora de Fitness e Yoga\",\"sameAs\":[\"https:\/\/instagram.com\/ana_oliveira_112\"]}},{\"@type\":\"ListItem\",\"position\":73,\"item\":{\"@type\":\"Person\",\"name\":\"Anabela Rodrigues\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"Pedras Salgadas\",\"addressCountry\":\"Portugal\"},\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"},\"jobTitle\":\"Empres\u00e1ria \u00b7 Quinta do Lameiro\",\"sameAs\":[\"https:\/\/instagram.com\/aquintadolameiro\"]}},{\"@type\":\"ListItem\",\"position\":74,\"item\":{\"@type\":\"Person\",\"name\":\"Sara Teixeira\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"Torres Vedras \u00b7 Lisboa\",\"addressCountry\":\"Portugal\"},\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"},\"jobTitle\":\"Professora de Yoga e Administrativa \u00b7 Slow Vibe Tribe\",\"sameAs\":[\"https:\/\/instagram.com\/saravieirateixeira\",\"https:\/\/www.youtube.com\/@SlowVibeTribe\"]}},{\"@type\":\"ListItem\",\"position\":75,\"item\":{\"@type\":\"Person\",\"name\":\"Olga Chvaiko\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"Azeit\u00e3o\",\"addressCountry\":\"Portugal\"},\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"},\"jobTitle\":\"Assistente Administrativa\"}},{\"@type\":\"ListItem\",\"position\":76,\"item\":{\"@type\":\"Person\",\"name\":\"C\u00e1tia Gomes\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"Figueira da Foz\",\"addressCountry\":\"Portugal\"},\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"},\"jobTitle\":\"T\u00e9cnica de Sa\u00fade Ambiental\"}},{\"@type\":\"ListItem\",\"position\":77,\"item\":{\"@type\":\"Person\",\"name\":\"S\u00f3nia Vieira\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"Mondim de Basto\",\"addressCountry\":\"Portugal\"},\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"},\"jobTitle\":\"Terapeuta\"}},{\"@type\":\"ListItem\",\"position\":78,\"item\":{\"@type\":\"Person\",\"name\":\"In\u00eas do Vale\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"Caramulo, Tondela\",\"addressCountry\":\"Portugal\"},\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"},\"jobTitle\":\"Rececionista\"}},{\"@type\":\"ListItem\",\"position\":79,\"item\":{\"@type\":\"Person\",\"name\":\"Ana Belchiorinho\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"Almeirim\",\"addressCountry\":\"Portugal\"},\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"},\"jobTitle\":\"Psic\u00f3loga\"}},{\"@type\":\"ListItem\",\"position\":80,\"item\":{\"@type\":\"Person\",\"name\":\"Beatriz Forjaz\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"Lisboa\",\"addressCountry\":\"Portugal\"},\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"},\"jobTitle\":\"Atriz\"}},{\"@type\":\"ListItem\",\"position\":81,\"item\":{\"@type\":\"Person\",\"name\":\"Rita Calejo Pires\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"Vila Real de Santo Ant\u00f3nio\",\"addressCountry\":\"Portugal\"},\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"},\"jobTitle\":\"Professora e Instrutora de Yoga\"}},{\"@type\":\"ListItem\",\"position\":82,\"item\":{\"@type\":\"Person\",\"name\":\"Raquel Martins\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"Almada\",\"addressCountry\":\"Portugal\"},\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"},\"jobTitle\":\"Professora de Yoga e Pilates \u00b7 ay\u00fcn yoga\",\"sameAs\":[\"https:\/\/instagram.com\/ayun.yoga\",\"https:\/\/www.ayun.pt\"]}},{\"@type\":\"ListItem\",\"position\":83,\"item\":{\"@type\":\"Person\",\"name\":\"Andreia de Brito Soares\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"Quinta do Anjo, Palmela\",\"addressCountry\":\"Portugal\"},\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"},\"jobTitle\":\"Bartender\"}},{\"@type\":\"ListItem\",\"position\":84,\"item\":{\"@type\":\"Person\",\"name\":\"Ingrid Rodrigues\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"Lisboa\",\"addressCountry\":\"Portugal\"},\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"},\"jobTitle\":\"Barista\"}},{\"@type\":\"ListItem\",\"position\":85,\"item\":{\"@type\":\"Person\",\"name\":\"Jo\u00e3o Amaro\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"\u00c9vora\",\"addressCountry\":\"Portugal\"},\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"},\"jobTitle\":\"Professor de Yoga e Designer\",\"sameAs\":[\"https:\/\/instagram.com\/alfaceman\"]}},{\"@type\":\"ListItem\",\"position\":86,\"item\":{\"@type\":\"Person\",\"name\":\"Marla Pais\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"Pa\u00e7os de Brand\u00e3o\",\"addressCountry\":\"Portugal\"},\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"},\"jobTitle\":\"Empregada de Escrit\u00f3rio\"}},{\"@type\":\"ListItem\",\"position\":87,\"item\":{\"@type\":\"Person\",\"name\":\"Alice Deise Souza\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"Valongo\",\"addressCountry\":\"Portugal\"},\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"},\"jobTitle\":\"Designer Freelancer\"}},{\"@type\":\"ListItem\",\"position\":88,\"item\":{\"@type\":\"Person\",\"name\":\"Ekaterina Goncalves\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"Rio Tinto\",\"addressCountry\":\"Portugal\"},\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"}}},{\"@type\":\"ListItem\",\"position\":89,\"item\":{\"@type\":\"Person\",\"name\":\"Ana Patr\u00edcia Leit\u00e3o\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"Senhora da Hora\",\"addressCountry\":\"Portugal\"},\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"}}},{\"@type\":\"ListItem\",\"position\":90,\"item\":{\"@type\":\"Person\",\"name\":\"Joana Neiva\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"Braga\",\"addressCountry\":\"Portugal\"},\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"},\"jobTitle\":\"Terapeuta Ocupacional\"}},{\"@type\":\"ListItem\",\"position\":91,\"item\":{\"@type\":\"Person\",\"name\":\"Andreia Costa\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"Amadora\",\"addressCountry\":\"Portugal\"},\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"},\"jobTitle\":\"Enfermeira e Coach em Sa\u00fade\"}},{\"@type\":\"ListItem\",\"position\":92,\"item\":{\"@type\":\"Person\",\"name\":\"Ana Dias\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"Belas\",\"addressCountry\":\"Portugal\"},\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"},\"jobTitle\":\"Enfermeira\"}},{\"@type\":\"ListItem\",\"position\":93,\"item\":{\"@type\":\"Person\",\"name\":\"F\u00e1tima Sousa\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"Torres Vedras\",\"addressCountry\":\"Portugal\"},\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"},\"jobTitle\":\"Personal Trainer\"}},{\"@type\":\"ListItem\",\"position\":94,\"item\":{\"@type\":\"Person\",\"name\":\"Carlos Gomes\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"Madrid\",\"addressCountry\":\"Espanha\"},\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"},\"jobTitle\":\"Banc\u00e1rio\"}},{\"@type\":\"ListItem\",\"position\":95,\"item\":{\"@type\":\"Person\",\"name\":\"C\u00e1tia Rodrigues Gomes\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"Madrid\",\"addressCountry\":\"Espanha\"},\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"},\"jobTitle\":\"Consultora\"}},{\"@type\":\"ListItem\",\"position\":96,\"item\":{\"@type\":\"Person\",\"name\":\"Lays Monteiro\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"Charneca de Caparica\",\"addressCountry\":\"Portugal\"},\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"},\"jobTitle\":\"Analista Financeira\"}},{\"@type\":\"ListItem\",\"position\":97,\"item\":{\"@type\":\"Person\",\"name\":\"Joana Ramos\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"Lisboa\",\"addressCountry\":\"Portugal\"},\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"},\"jobTitle\":\"T\u00e9cnica Superior de Psicologia\"}},{\"@type\":\"ListItem\",\"position\":98,\"item\":{\"@type\":\"Person\",\"name\":\"Ana Veiga\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"Lisboa\",\"addressCountry\":\"Portugal\"},\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"},\"jobTitle\":\"T\u00e9cnica de Inform\u00e1tica\"}},{\"@type\":\"ListItem\",\"position\":99,\"item\":{\"@type\":\"Person\",\"name\":\"Ana Maria Branco\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"Ericeira\",\"addressCountry\":\"Portugal\"},\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"},\"jobTitle\":\"Analista de Constru\u00e7\u00e3o\"}},{\"@type\":\"ListItem\",\"position\":100,\"item\":{\"@type\":\"Person\",\"name\":\"Ana Sofia Sim\u00f5es\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"Torres Vedras\",\"addressCountry\":\"Portugal\"},\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"},\"jobTitle\":\"Professora de Yoga\",\"sameAs\":[\"https:\/\/instagram.com\/asofiapsimoes\",\"https:\/\/www.aemovimento.eu\/\"]}},{\"@type\":\"ListItem\",\"position\":101,\"item\":{\"@type\":\"Person\",\"name\":\"Ana Rita Granja Novo\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"Caparica, Almada\",\"addressCountry\":\"Portugal\"},\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"},\"jobTitle\":\"Tem est\u00fadio pr\u00f3prio de yoga\"}},{\"@type\":\"ListItem\",\"position\":102,\"item\":{\"@type\":\"Person\",\"name\":\"Madalena Oliveira\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"Caldas da Rainha\",\"addressCountry\":\"Portugal\"},\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"}}},{\"@type\":\"ListItem\",\"position\":103,\"item\":{\"@type\":\"Person\",\"name\":\"Caroline de Moraes\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"Lisboa\",\"addressCountry\":\"Portugal\"},\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"},\"jobTitle\":\"Fisioterapeuta\"}},{\"@type\":\"ListItem\",\"position\":104,\"item\":{\"@type\":\"Person\",\"name\":\"Rita Brinca\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"Set\u00fabal\",\"addressCountry\":\"Portugal\"},\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"},\"jobTitle\":\"Instrutora de Yoga\"}},{\"@type\":\"ListItem\",\"position\":105,\"item\":{\"@type\":\"Person\",\"name\":\"Ana Cristina Oliveira\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"Porto\",\"addressCountry\":\"Portugal\"},\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"},\"jobTitle\":\"M\u00e9dica\"}},{\"@type\":\"ListItem\",\"position\":106,\"item\":{\"@type\":\"Person\",\"name\":\"Elisabete Cardoso\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"Vila Verde, Braga\",\"addressCountry\":\"Portugal\"},\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"}}},{\"@type\":\"ListItem\",\"position\":107,\"item\":{\"@type\":\"Person\",\"name\":\"Isabel Cristina Miranda\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"Braga\",\"addressCountry\":\"Portugal\"},\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"},\"jobTitle\":\"Consultora\"}},{\"@type\":\"ListItem\",\"position\":108,\"item\":{\"@type\":\"Person\",\"name\":\"Marisa Ribeiro\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"Vila Real\",\"addressCountry\":\"Portugal\"},\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"},\"jobTitle\":\"Tem est\u00fadio pr\u00f3prio de yoga\"}},{\"@type\":\"ListItem\",\"position\":109,\"item\":{\"@type\":\"Person\",\"name\":\"L\u00facia Guerreiro\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"Lisboa\",\"addressCountry\":\"Portugal\"},\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"},\"jobTitle\":\"Fisioterapeuta\"}},{\"@type\":\"ListItem\",\"position\":110,\"item\":{\"@type\":\"Person\",\"name\":\"Susana Marques\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"Corroios\",\"addressCountry\":\"Portugal\"},\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"},\"jobTitle\":\"Assistente T\u00e9cnica\"}},{\"@type\":\"ListItem\",\"position\":111,\"item\":{\"@type\":\"Person\",\"name\":\"Marta Aguileira\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"Oeiras\",\"addressCountry\":\"Portugal\"},\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"},\"jobTitle\":\"Gestora de Eventos\"}},{\"@type\":\"ListItem\",\"position\":112,\"item\":{\"@type\":\"Person\",\"name\":\"Miguela Fernandes\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"Alcanede, Santar\u00e9m\",\"addressCountry\":\"Portugal\"},\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"},\"jobTitle\":\"Professora \u00b7 Yoga para Crian\u00e7as e Seniores\"}},{\"@type\":\"ListItem\",\"position\":113,\"item\":{\"@type\":\"Person\",\"name\":\"Juliana Silva\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"Carnaxide, Oeiras\",\"addressCountry\":\"Portugal\"},\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"},\"jobTitle\":\"Administrativa\"}},{\"@type\":\"ListItem\",\"position\":114,\"item\":{\"@type\":\"Person\",\"name\":\"Sandra de Almeida\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"Lisboa\",\"addressCountry\":\"Portugal\"},\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"}}},{\"@type\":\"ListItem\",\"position\":115,\"item\":{\"@type\":\"Person\",\"name\":\"Carolina Machado\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"Maia\",\"addressCountry\":\"Portugal\"},\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"}}},{\"@type\":\"ListItem\",\"position\":116,\"item\":{\"@type\":\"Person\",\"name\":\"Ana Martins\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"Miranda do Douro\",\"addressCountry\":\"Portugal\"},\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"},\"jobTitle\":\"Auditora\"}},{\"@type\":\"ListItem\",\"position\":117,\"item\":{\"@type\":\"Person\",\"name\":\"Sylvia Mota\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"Gafanha da Encarna\u00e7\u00e3o, \u00cdlhavo\",\"addressCountry\":\"Portugal\"},\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"},\"jobTitle\":\"Esteticista e T\u00e9cnica de Ayurveda\"}},{\"@type\":\"ListItem\",\"position\":118,\"item\":{\"@type\":\"Person\",\"name\":\"Silvia Filipe\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"Torres Novas\",\"addressCountry\":\"Portugal\"},\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"},\"jobTitle\":\"Professora do Ensino Secund\u00e1rio\"}},{\"@type\":\"ListItem\",\"position\":119,\"item\":{\"@type\":\"Person\",\"name\":\"Carolina Prates\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"Aveiro\",\"addressCountry\":\"Portugal\"},\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"},\"jobTitle\":\"Professora de Canto\"}},{\"@type\":\"ListItem\",\"position\":120,\"item\":{\"@type\":\"Person\",\"name\":\"Angelina Borges\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"Chaves\",\"addressCountry\":\"Portugal\"},\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"}}},{\"@type\":\"ListItem\",\"position\":121,\"item\":{\"@type\":\"Person\",\"name\":\"F\u00e1tima Lopes\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"Braga\",\"addressCountry\":\"Portugal\"},\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"}}},{\"@type\":\"ListItem\",\"position\":122,\"item\":{\"@type\":\"Person\",\"name\":\"Susana Silva\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"Arma\u00e7\u00e3o de P\u00eara\",\"addressCountry\":\"Portugal\"},\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"}}},{\"@type\":\"ListItem\",\"position\":123,\"item\":{\"@type\":\"Person\",\"name\":\"Susete Martins\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"Alcabideche, Cascais\",\"addressCountry\":\"Portugal\"},\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"}}},{\"@type\":\"ListItem\",\"position\":124,\"item\":{\"@type\":\"Person\",\"name\":\"Sandra S\u00e1\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"Silves\",\"addressCountry\":\"Portugal\"},\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"}}},{\"@type\":\"ListItem\",\"position\":125,\"item\":{\"@type\":\"Person\",\"name\":\"Rodrigo Marques\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"Odivelas\",\"addressCountry\":\"Portugal\"},\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"}}},{\"@type\":\"ListItem\",\"position\":126,\"item\":{\"@type\":\"Person\",\"name\":\"Carlota Lourido\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"Oeiras\",\"addressCountry\":\"Portugal\"},\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"}}},{\"@type\":\"ListItem\",\"position\":127,\"item\":{\"@type\":\"Person\",\"name\":\"Milena Coppi\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"Porto\",\"addressCountry\":\"Portugal\"},\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"}}},{\"@type\":\"ListItem\",\"position\":128,\"item\":{\"@type\":\"Person\",\"name\":\"Fernanda F\u00e9lix\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"Lisboa\",\"addressCountry\":\"Portugal\"},\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"}}},{\"@type\":\"ListItem\",\"position\":129,\"item\":{\"@type\":\"Person\",\"name\":\"Silvia Almeida\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"Portalegre\",\"addressCountry\":\"Portugal\"},\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"}}},{\"@type\":\"ListItem\",\"position\":130,\"item\":{\"@type\":\"Person\",\"name\":\"Ana Roriz\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"Santo Tirso\",\"addressCountry\":\"Portugal\"},\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"}}},{\"@type\":\"ListItem\",\"position\":131,\"item\":{\"@type\":\"Person\",\"name\":\"Sandra Tote Borges\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"Praia da Vit\u00f3ria, A\u00e7ores\",\"addressCountry\":\"Portugal\"},\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"}}},{\"@type\":\"ListItem\",\"position\":132,\"item\":{\"@type\":\"Person\",\"name\":\"Paula Ladeira\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"Proen\u00e7a-a-Nova\",\"addressCountry\":\"Portugal\"},\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"}}},{\"@type\":\"ListItem\",\"position\":133,\"item\":{\"@type\":\"Person\",\"name\":\"Maria Salvaterra\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"Alter do Ch\u00e3o\",\"addressCountry\":\"Portugal\"},\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"}}},{\"@type\":\"ListItem\",\"position\":134,\"item\":{\"@type\":\"Person\",\"name\":\"Mariana Serra\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"Maia\",\"addressCountry\":\"Portugal\"},\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"},\"jobTitle\":\"Professora de Yoga e Terapeuta de Constela\u00e7\u00f5es Sist\u00e9micas\",\"sameAs\":[\"https:\/\/instagram.com\/raizesdami_bymarianaserra\"]}},{\"@type\":\"ListItem\",\"position\":135,\"item\":{\"@type\":\"Person\",\"name\":\"N\u00e9lia Rodrigues\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"Caldas da Rainha\",\"addressCountry\":\"Portugal\"},\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"},\"jobTitle\":\"Professora de Yoga e Formadora\",\"sameAs\":[\"https:\/\/instagram.com\/neliar.yoga\"]}},{\"@type\":\"ListItem\",\"position\":136,\"item\":{\"@type\":\"Person\",\"name\":\"Lu\u00eds Sanchez\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"Pernes, Santar\u00e9m\",\"addressCountry\":\"Portugal\"},\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"},\"jobTitle\":\"Instrutor de Yoga\",\"sameAs\":[\"https:\/\/instagram.com\/iam_luissanchez\"]}},{\"@type\":\"ListItem\",\"position\":137,\"item\":{\"@type\":\"Person\",\"name\":\"In\u00eas Afflalo\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"Cascais\",\"addressCountry\":\"Portugal\"},\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"},\"jobTitle\":\"Professora de Yoga e InnerMovement\",\"sameAs\":[\"https:\/\/instagram.com\/inesafflalo\",\"linker.ee\/inesafflalo\"]}},{\"@type\":\"ListItem\",\"position\":138,\"item\":{\"@type\":\"Person\",\"name\":\"Carla Gon\u00e7alves\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"Alc\u00e2ntara, Lisboa\",\"addressCountry\":\"Portugal\"},\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"},\"jobTitle\":\"Fundadora BeYoga\",\"sameAs\":[\"https:\/\/instagram.com\/carla.goncalves_beyoga\"]}},{\"@type\":\"ListItem\",\"position\":139,\"item\":{\"@type\":\"Person\",\"name\":\"Raquel Gon\u00e7alves\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"Amadora\",\"addressCountry\":\"Portugal\"},\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"},\"jobTitle\":\"Professora de Yoga e Enfermeira\",\"sameAs\":[\"https:\/\/instagram.com\/raquelgoncalves.yoga\",\"https:\/\/raquelgoncalves.com\"]}},{\"@type\":\"ListItem\",\"position\":140,\"item\":{\"@type\":\"Person\",\"name\":\"\u00c2ngela Costa\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"Alcoba\u00e7a\",\"addressCountry\":\"Portugal\"},\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"}}},{\"@type\":\"ListItem\",\"position\":141,\"item\":{\"@type\":\"Person\",\"name\":\"Luany de Castro\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"Bragan\u00e7a\",\"addressCountry\":\"Portugal\"},\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"},\"jobTitle\":\"Professora de Yoga e Pilates\",\"sameAs\":[\"https:\/\/instagram.com\/luanycastroyoga\"]}},{\"@type\":\"ListItem\",\"position\":142,\"item\":{\"@type\":\"Person\",\"name\":\"Mafalda Silva\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"Porto\",\"addressCountry\":\"Portugal\"},\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"}}},{\"@type\":\"ListItem\",\"position\":143,\"item\":{\"@type\":\"Person\",\"name\":\"Leonor Almeida\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"Guimar\u00e3es\",\"addressCountry\":\"Portugal\"},\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"},\"jobTitle\":\"Enfermeira e Professora de Yoga\"}},{\"@type\":\"ListItem\",\"position\":144,\"item\":{\"@type\":\"Person\",\"name\":\"Joaquim Guerreiro\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"Santar\u00e9m\",\"addressCountry\":\"Portugal\"},\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"},\"sameAs\":[\"https:\/\/instagram.com\/raizdovento\"]}},{\"@type\":\"ListItem\",\"position\":145,\"item\":{\"@type\":\"Person\",\"name\":\"Rita Moreira\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"Azeit\u00e3o\",\"addressCountry\":\"Portugal\"},\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"},\"sameAs\":[\"https:\/\/instagram.com\/rita_moreira03\"]}},{\"@type\":\"ListItem\",\"position\":146,\"item\":{\"@type\":\"Person\",\"name\":\"Thaisa Andrade\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"Lisboa\",\"addressCountry\":\"Portugal\"},\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"},\"sameAs\":[\"https:\/\/instagram.com\/thaisagradim\"]}},{\"@type\":\"ListItem\",\"position\":147,\"item\":{\"@type\":\"Person\",\"name\":\"June Mainardi\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"Set\u00fabal\",\"addressCountry\":\"Portugal\"},\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"},\"sameAs\":[\"https:\/\/instagram.com\/junemainardi\"]}},{\"@type\":\"ListItem\",\"position\":148,\"item\":{\"@type\":\"Person\",\"name\":\"Ana Paula Carvalho\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"Lisboa\",\"addressCountry\":\"Portugal\"},\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"},\"sameAs\":[\"https:\/\/instagram.com\/anacarvalho.carvalho\"]}},{\"@type\":\"ListItem\",\"position\":149,\"item\":{\"@type\":\"Person\",\"name\":\"Maria Jo\u00e3o Silva\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"Ramada\",\"addressCountry\":\"Portugal\"},\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"}}},{\"@type\":\"ListItem\",\"position\":150,\"item\":{\"@type\":\"Person\",\"name\":\"Ana Rita Afonso\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"Massam\u00e1\",\"addressCountry\":\"Portugal\"},\"jobTitle\":\"Professora de Yoga \u00b7 Administrativa\",\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"},\"sameAs\":[\"https:\/\/instagram.com\/ritakali.yoga\"]}},{\"@type\":\"ListItem\",\"position\":151,\"item\":{\"@type\":\"Person\",\"name\":\"Iolanda Santos\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"Aroeira\",\"addressCountry\":\"Portugal\"},\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"}}},{\"@type\":\"ListItem\",\"position\":152,\"item\":{\"@type\":\"Person\",\"name\":\"Ana Leonardo\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"Alenquer\",\"addressCountry\":\"Portugal\"},\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"}}},{\"@type\":\"ListItem\",\"position\":153,\"item\":{\"@type\":\"Person\",\"name\":\"M\u00f3nica Bar\u00e3o\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"P\u00earo Pinheiro\",\"addressCountry\":\"Portugal\"},\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"}}},{\"@type\":\"ListItem\",\"position\":154,\"item\":{\"@type\":\"Person\",\"name\":\"Manuela Albuquerque\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"Agualva-Cac\u00e9m\",\"addressCountry\":\"Portugal\"},\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"}}},{\"@type\":\"ListItem\",\"position\":155,\"item\":{\"@type\":\"Person\",\"name\":\"Gina Pinho\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"\u00c1gueda\",\"addressCountry\":\"Portugal\"},\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"},\"sameAs\":[\"https:\/\/instagram.com\/gina_pinho\"]}},{\"@type\":\"ListItem\",\"position\":156,\"item\":{\"@type\":\"Person\",\"name\":\"Louane Mattos\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"Figueira da Foz\",\"addressCountry\":\"Portugal\"},\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"},\"sameAs\":[\"https:\/\/instagram.com\/louanemattos\"]}},{\"@type\":\"ListItem\",\"position\":157,\"item\":{\"@type\":\"Person\",\"name\":\"Raquel Correia\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"Maia\",\"addressCountry\":\"Portugal\"},\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"},\"sameAs\":[\"https:\/\/instagram.com\/araqueltc\",\"https:\/\/instagram.com\/flyoga_raquelcorreia\"]}},{\"@type\":\"ListItem\",\"position\":158,\"item\":{\"@type\":\"Person\",\"name\":\"B\u00e1rbara Ferreira\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"Vizela\",\"addressCountry\":\"Portugal\"},\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"}}},{\"@type\":\"ListItem\",\"position\":159,\"item\":{\"@type\":\"Person\",\"name\":\"Elsa Dam\u00e1sio\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"Leiria\",\"addressCountry\":\"Portugal\"},\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"}}},{\"@type\":\"ListItem\",\"position\":160,\"item\":{\"@type\":\"Person\",\"name\":\"Carolina Apar\u00edcio\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"Vila do Conde\",\"addressCountry\":\"Portugal\"},\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"}}},{\"@type\":\"ListItem\",\"position\":161,\"item\":{\"@type\":\"Person\",\"name\":\"Rita Oliveira Santos\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"Santa Maria da Feira\",\"addressCountry\":\"Portugal\"},\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"},\"sameAs\":[\"https:\/\/instagram.com\/champagneritsa\"]}},{\"@type\":\"ListItem\",\"position\":162,\"item\":{\"@type\":\"Person\",\"name\":\"St\u00e9phanie de Oliveira\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"Vila Nova de Famalic\u00e3o\",\"addressCountry\":\"Portugal\"},\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"},\"sameAs\":[\"https:\/\/instagram.com\/ste.canario\"]}},{\"@type\":\"ListItem\",\"position\":163,\"item\":{\"@type\":\"Person\",\"name\":\"Beatriz Aguiar\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"Ovar\",\"addressCountry\":\"Portugal\"},\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"},\"jobTitle\":\"Professora de Yoga\"}},{\"@type\":\"ListItem\",\"position\":164,\"item\":{\"@type\":\"Person\",\"name\":\"Gabriela Mircea\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"Aveiro\",\"addressCountry\":\"Portugal\"},\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"},\"sameAs\":[\"https:\/\/instagram.com\/veginlove.pt\"]}},{\"@type\":\"ListItem\",\"position\":165,\"item\":{\"@type\":\"Person\",\"name\":\"Maria Jo\u00e3o Cabral\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"Porto\",\"addressCountry\":\"Portugal\"},\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"}}},{\"@type\":\"ListItem\",\"position\":166,\"item\":{\"@type\":\"Person\",\"name\":\"Luciana Sanchez\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"Freamunde\",\"addressCountry\":\"Portugal\"},\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"}}},{\"@type\":\"ListItem\",\"position\":167,\"item\":{\"@type\":\"Person\",\"name\":\"Eduarda Maia\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"\u00c1gueda\",\"addressCountry\":\"Portugal\"},\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"}}},{\"@type\":\"ListItem\",\"position\":168,\"item\":{\"@type\":\"Person\",\"name\":\"Beatriz Gomes\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"Lourinh\u00e3\",\"addressCountry\":\"Portugal\"},\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"},\"jobTitle\":\"Assistente de instrutor de surf\"}},{\"@type\":\"ListItem\",\"position\":169,\"item\":{\"@type\":\"Person\",\"name\":\"Laurinda Isabel Mota\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"Celorico de Basto\",\"addressCountry\":\"Portugal\"},\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"},\"jobTitle\":\"Esteticista\"}},{\"@type\":\"ListItem\",\"position\":170,\"item\":{\"@type\":\"Person\",\"name\":\"Maria Cord\u00e9lia Santos\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"C\u00e2mara de Lobos\",\"addressCountry\":\"Portugal\"},\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"},\"jobTitle\":\"Professora de yoga\"}},{\"@type\":\"ListItem\",\"position\":171,\"item\":{\"@type\":\"Person\",\"name\":\"Marina Fernandes\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"Lisboa\",\"addressCountry\":\"Portugal\"},\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"},\"jobTitle\":\"Professora de yoga e pilates\"}},{\"@type\":\"ListItem\",\"position\":172,\"item\":{\"@type\":\"Person\",\"name\":\"Marisa Costa\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"Mafra\",\"addressCountry\":\"Portugal\"},\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"},\"jobTitle\":\"Fisioterapeuta\"}},{\"@type\":\"ListItem\",\"position\":173,\"item\":{\"@type\":\"Person\",\"name\":\"Andrea Soares\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"Quinta do Anjo\",\"addressCountry\":\"Portugal\"},\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"},\"jobTitle\":\"Professora de yoga, cantora, artes\u00e3 e stylist\"}},{\"@type\":\"ListItem\",\"position\":174,\"item\":{\"@type\":\"Person\",\"name\":\"Daniela Salgueiro\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"Barcelos\",\"addressCountry\":\"Portugal\"},\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"},\"jobTitle\":\"Professora de Yoga\"}},{\"@type\":\"ListItem\",\"position\":175,\"item\":{\"@type\":\"Person\",\"name\":\"Maria Rui\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"Peniche\",\"addressCountry\":\"Portugal\"},\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"},\"jobTitle\":\"Professora de Yoga e Surf Yoga\",\"sameAs\":[\"https:\/\/instagram.com\/_maryoga\"]}},{\"@type\":\"ListItem\",\"position\":176,\"item\":{\"@type\":\"Person\",\"name\":\"Maria Apolin\u00e1rio\",\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"Lourinh\u00e3\",\"addressCountry\":\"Portugal\"},\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"BeYoga\",\"url\":\"https:\/\/beyoga.pt\/\"},\"jobTitle\":\"Especialista de Medicina Tradicional Chinesa \u00b7 (A)mar\",\"sameAs\":[\"https:\/\/instagram.com\/maria_apolinario_a_mar\"]}}]}<\/script>\n\n<section class=\"by-hero\">\n  <p class=\"label\">BeYoga Community<\/p>\n  <h1>BeYoga<br>spread across the map<\/h1>\n  <p>Every pin is someone who trained at BeYoga and carries yoga with them. Some teach in <strong>studios, schools and practices<\/strong>, and some live yoga day to day, at work and in their community. <strong>They are all part of this story.<\/strong> Looking for classes? Filter by &#8220;Teaching&#8221; and find a teacher near you.<\/p>\n  <a class=\"by-rating\" href=\"https:\/\/www.google.com\/maps\/place\/BeYoga+School\/@38.7059254,-9.1810641,17z\/data=!4m6!3m5!1s0xad91f2e9228ae25b:0x97b0824fcce5b7de!8m2!3d38.7059254!4d-9.1810641!16s%2Fg%2F11vy_f9vb2\" target=\"_blank\" rel=\"noopener\">\u2605\u2605\u2605\u2605\u2605 <strong>5.0 on Google<\/strong> \u00b7 114 reviews<\/a>\n  <div class=\"by-stats\">\n    <div class=\"stat\"><div class=\"num\" id=\"stat-alunos\">176<\/div><div class=\"lbl\">Graduates<\/div><\/div>\n    <div class=\"stat\"><div class=\"num\" id=\"stat-cidades\">110<\/div><div class=\"lbl\">Cities<\/div><\/div>\n    <div class=\"stat\"><div class=\"num\" id=\"stat-paises\">5<\/div><div class=\"lbl\">Countries<\/div><\/div>\n    <div class=\"stat\"><div class=\"num\" id=\"stat-aulas\">80<\/div><div class=\"lbl\">Teaching<\/div><\/div>\n  <\/div>\n<\/section>\n\n<section class=\"by-filters\" aria-label=\"Filtros\">\n  <div class=\"by-filters-inner\">\n    <button class=\"by-chip active\" data-course=\"all\">All<\/button>\n    <button class=\"by-chip\" data-course=\"Forma\u00e7\u00e3o 200H\">200H<\/button>\n    <button class=\"by-chip\" data-course=\"Yin Yoga\">Yin Yoga<\/button>\n    <button class=\"by-chip\" data-course=\"Yoga Nidra\">Yoga Nidra<\/button>\n    <button class=\"by-chip\" data-course=\"Medita\u00e7\u00e3o\">Meditation<\/button>\n    <button class=\"by-chip\" data-course=\"Yoga Restaurativo\">Restorative<\/button>\n    <button class=\"by-chip\" data-course=\"Pranayamas\">Pranayama<\/button>\n    <button class=\"by-chip\" data-course=\"Yoga na Cadeira\">Chair<\/button>\n    <button class=\"by-chip\" data-course=\"Yoga Terap\u00eautico\">Therapeutic<\/button>\n    <button class=\"by-chip teach\" id=\"chip-teaching\">Teaching<\/button>\n    <input class=\"by-search\" id=\"search\" type=\"search\" placeholder=\"Search by name, city\u2026\" aria-label=\"Procurar aluno\">\n    <span class=\"by-count\" id=\"count\"><\/span>\n  <\/div>\n<\/section>\n\n<div class=\"by-map-wrap\"><div id=\"map\" role=\"application\" aria-label=\"Mapa de alunos BeYoga\"><\/div>\n<div class=\"by-legend\"><span><i style=\"background:var(--by-green)\"><\/i> Teaching<\/span><span><i style=\"background:var(--by-terra)\"><\/i> BeYoga graduates<\/span><\/div>\n<\/div>\n\n<section class=\"by-grid-section\">\n  <p class=\"label\">Directory<\/p>\n  <h2>The community, profile by profile<\/h2>\n  <div class=\"by-feat\"><h3>Featured<\/h3><div class=\"by-grid\" id=\"featured\"><\/div><\/div>\n  <nav class=\"by-aznav\" id=\"aznav\" aria-label=\"Navega\u00e7\u00e3o alfab\u00e9tica\"><\/nav>\n  <div id=\"grid\"><div class=\"by-static-dir\"><p>The complete directory of the 176 BeYoga-trained graduates, in alphabetical order.<\/p><article class=\"by-static-card\"><h3>Adriana Teixeira<\/h3><p>Aveiro, Portugal \u00b7 Professora de F\u00edsica\/Qu\u00edmica e de Yoga \u00b7 Sleeping Code<\/p><p>Training: Forma\u00e7\u00e3o 200H | Yoga Restaurativo | Yoga na Cadeira | Yoga Terap\u00eautico<\/p><p>Teaching<\/p><blockquote>\u201cO Yoga fez-me apaixonar pela pr\u00e1tica, mas o BeYoga transformou por completo a minha forma de estar na vida.\u201d<\/blockquote><\/article><article class=\"by-static-card\"><h3>Alexandra dos Santos<\/h3><p>Porto, Portugal \u00b7 Uniyoga \u2014 Conex\u00e3o e Harmonia<\/p><p>Training: Forma\u00e7\u00e3o 200H | Medita\u00e7\u00e3o<\/p><p>Teaching<\/p><\/article><article class=\"by-static-card\"><h3>Alexandra Mendes<\/h3><p>Lisboa, Portugal \u00b7 Professora de Yoga e Personal Trainer<\/p><p>Training: Forma\u00e7\u00e3o 200H | Medita\u00e7\u00e3o | Pranayamas<\/p><p>Teaching<\/p><\/article><article class=\"by-static-card\"><h3>Alice Deise Souza<\/h3><p>Valongo, Portugal \u00b7 Designer Freelancer<\/p><p>Training: Forma\u00e7\u00e3o 200H<\/p><\/article><article class=\"by-static-card\"><h3>Ana Belchiorinho<\/h3><p>Almeirim, Portugal \u00b7 Psic\u00f3loga<\/p><p>Training: Yin Yoga | Yoga Restaurativo | Medita\u00e7\u00e3o | Pranayamas | Yoga Nidra<\/p><\/article><article class=\"by-static-card\"><h3>Ana Cristina Oliveira<\/h3><p>Porto, Portugal \u00b7 M\u00e9dica<\/p><p>Training: Forma\u00e7\u00e3o 200H<\/p><blockquote>\u201cEste curso foi uma experi\u00eancia maravilhosa. A Carla \u00e9 uma excelente professora, met\u00f3dica, perfecionista mas af\u00e1vel e divertida.\u201d<\/blockquote><\/article><article class=\"by-static-card\"><h3>Ana Dias<\/h3><p>Belas, Portugal \u00b7 Enfermeira<\/p><p>Training: Forma\u00e7\u00e3o 200H<\/p><\/article><article class=\"by-static-card\"><h3>Ana Jo\u00e3o Mateus<\/h3><p>Vila Real, Portugal \u00b7 Artesanato<\/p><p>Training: Forma\u00e7\u00e3o 200H<\/p><blockquote>\u201cA forma\u00e7\u00e3o \u00e9 transformadora, muito completa, e \u00e9 a ferramenta ideal para come\u00e7ar ou solidificar a pr\u00e1tica de yoga.\u201d<\/blockquote><\/article><article class=\"by-static-card\"><h3>Ana Leonardo<\/h3><p>Alenquer, Portugal<\/p><p>Training: Forma\u00e7\u00e3o 200H<\/p><\/article><article class=\"by-static-card\"><h3>Ana Maria Branco<\/h3><p>Ericeira, Portugal \u00b7 Analista de Constru\u00e7\u00e3o<\/p><p>Training: Forma\u00e7\u00e3o 200H<\/p><\/article><article class=\"by-static-card\"><h3>Ana Martins<\/h3><p>Miranda do Douro, Portugal \u00b7 Auditora<\/p><p>Training: Forma\u00e7\u00e3o 200H<\/p><p>Teaching<\/p><blockquote>\u201cFoi uma jornada de autoconhecimento que me permitiu compreender o Yoga como um caminho de transforma\u00e7\u00e3o, dentro e fora do tapete.\u201d<\/blockquote><\/article><article class=\"by-static-card\"><h3>Ana Oliveira<\/h3><p>P\u00f3voa de Varzim, Portugal \u00b7 Instrutora de Fitness e Yoga<\/p><p>Training: Yoga Nidra<\/p><\/article><article class=\"by-static-card\"><h3>Ana Pardal<\/h3><p>P\u00f3voa de Santa Iria, Portugal \u00b7 Tradutora e Consultora Imobili\u00e1ria<\/p><p>Training: Forma\u00e7\u00e3o 200H<\/p><\/article><article class=\"by-static-card\"><h3>Ana Patr\u00edcia Leit\u00e3o<\/h3><p>Senhora da Hora, Portugal<\/p><p>Training: Forma\u00e7\u00e3o 200H<\/p><\/article><article class=\"by-static-card\"><h3>Ana Paula Carvalho<\/h3><p>Lisboa, Portugal<\/p><p>Training: Forma\u00e7\u00e3o 200H<\/p><\/article><article class=\"by-static-card\"><h3>Ana Rita Afonso<\/h3><p>Massam\u00e1, Portugal \u00b7 Professora de Yoga \u00b7 Administrativa<\/p><p>Training: Forma\u00e7\u00e3o 200H<\/p><p>Aulas pontuais<\/p><blockquote>\u201cFoi sem d\u00favida uma viagem incr\u00edvel. O curso est\u00e1 muito bem estruturado e senti-me acompanhada desde o primeiro dia.\u201d<\/blockquote><\/article><article class=\"by-static-card\"><h3>Ana Rita Granja Novo<\/h3><p>Caparica, Almada, Portugal \u00b7 Tem est\u00fadio pr\u00f3prio de yoga<\/p><p>Training: Forma\u00e7\u00e3o 200H | Yin Yoga | Yoga Nidra<\/p><\/article><article class=\"by-static-card\"><h3>Ana Rita Serra Lopes<\/h3><p>Set\u00fabal, Portugal \u00b7 Professora de Hatha Yoga e Yoga Kids<\/p><p>Training: Forma\u00e7\u00e3o 200H<\/p><p>Teaching<\/p><blockquote>\u201cA forma\u00e7\u00e3o de professora de yoga foi uma jornada de aprendizagem profunda sobre a pr\u00e1tica do yoga, incluindo posturas, t\u00e9cnicas de respira\u00e7\u00e3o (pranayama), filosofia e anatomia. Esta forma\u00e7\u00e3o deu-me as bases necess\u00e1rias para orientar aulas de forma segura, consciente e adaptada \u00e0s necessidades de cada aluno.\u201d<\/blockquote><\/article><article class=\"by-static-card\"><h3>Ana Roriz<\/h3><p>Santo Tirso, Portugal<\/p><p>Training: Medita\u00e7\u00e3o | Pranayamas<\/p><\/article><article class=\"by-static-card\"><h3>Ana Santos<\/h3><p>Queluz, Portugal \u00b7 Designer Multim\u00e9dia \u00b7 Pr\u00e1tica Yoga<\/p><p>Training: Yin Yoga<\/p><p>Teaching<\/p><blockquote>\u201c5 estrelas! Realizei o Curso de Yin Yoga na BeYoga School e n\u00e3o poderia estar mais satisfeita.\u201d<\/blockquote><\/article><article class=\"by-static-card\"><h3>Ana Sofia Sim\u00f5es<\/h3><p>Torres Vedras, Portugal \u00b7 Professora de Yoga \u00b7 Associa\u00e7\u00e3o de Educa\u00e7\u00e3o do Movimento<\/p><p>Training: Forma\u00e7\u00e3o 200H<\/p><p>Teaching<\/p><\/article><article class=\"by-static-card\"><h3>Ana Veiga<\/h3><p>Lisboa, Portugal \u00b7 T\u00e9cnica de Inform\u00e1tica<\/p><p>Training: Forma\u00e7\u00e3o 200H<\/p><blockquote>\u201cFrequentar este curso de yoga foi das melhores decis\u00f5es que tomei nos \u00faltimos tempos.\u201d<\/blockquote><\/article><article class=\"by-static-card\"><h3>Anabela Oliveira<\/h3><p>Lourosa, Portugal \u00b7 Professora de Yoga \u00b7 Psic\u00f3loga<\/p><p>Training: Forma\u00e7\u00e3o 200H<\/p><p>Teaching<\/p><\/article><article class=\"by-static-card\"><h3>Anabela Rodrigues<\/h3><p>Pedras Salgadas, Portugal \u00b7 Empres\u00e1ria \u00b7 Quinta do Lameiro<\/p><p>Training: Yoga Nidra<\/p><p>Teaching<\/p><\/article><article class=\"by-static-card\"><h3>Andreia Amaral<\/h3><p>Ermesinde, Portugal \u00b7 T\u00e9cnica Administrativa \u00b7 Ankora Yoga<\/p><p>Training: Forma\u00e7\u00e3o 200H<\/p><p>Teaching<\/p><blockquote>\u201cFalar sobre este curso de yoga \u00e9 falar sobre um processo profundamente enriquecedor e transformador.\u201d<\/blockquote><\/article><article class=\"by-static-card\"><h3>Andreia Costa<\/h3><p>Amadora, Portugal \u00b7 Enfermeira e Coach em Sa\u00fade<\/p><p>Training: Forma\u00e7\u00e3o 200H<\/p><\/article><article class=\"by-static-card\"><h3>Andreia de Brito Soares<\/h3><p>Quinta do Anjo, Palmela, Portugal \u00b7 Bartender<\/p><p>Training: Forma\u00e7\u00e3o 200H<\/p><\/article><article class=\"by-static-card\"><h3>\u00c2ngela Costa<\/h3><p>Alcoba\u00e7a, Portugal<\/p><p>Training: Forma\u00e7\u00e3o 200H<\/p><p>Teaching<\/p><\/article><article class=\"by-static-card\"><h3>Angelina Borges<\/h3><p>Chaves, Portugal<\/p><p>Training: Yoga Restaurativo | Medita\u00e7\u00e3o<\/p><\/article><article class=\"by-static-card\"><h3>Anna Balejko<\/h3><p>Lisboa, Portugal \u00b7 Gestora financeira<\/p><p>Training: Forma\u00e7\u00e3o 200H | Yin Yoga | Yoga Nidra | Yoga na Cadeira | Yoga Terap\u00eautico<\/p><p>Teaching<\/p><\/article><article class=\"by-static-card\"><h3>B\u00e1rbara Ferreira<\/h3><p>Vizela, Portugal<\/p><p>Training: Forma\u00e7\u00e3o 200H<\/p><blockquote>\u201cIntegrei o curso da BeYoga e concluo-o com imenso orgulho pelo meu trajeto. Est\u00e1 muito bem estruturado nos seus m\u00f3dulos.\u201d<\/blockquote><\/article><article class=\"by-static-card\"><h3>B\u00e1rbara Silva<\/h3><p>Vila Nova de Gaia, Portugal \u00b7 Administrativa<\/p><p>Training: Forma\u00e7\u00e3o 200H<\/p><p>Teaching<\/p><blockquote>\u201cMuito mais que uma simples forma\u00e7\u00e3o. Foi um lugar de crescimento pessoal e transforma\u00e7\u00e3o.\u201d<\/blockquote><\/article><article class=\"by-static-card\"><h3>Beatriz Aguiar<\/h3><p>Ovar, Portugal \u00b7 Professora de Yoga<\/p><p>Training: Forma\u00e7\u00e3o 200H<\/p><p>Teaching<\/p><\/article><article class=\"by-static-card\"><h3>Beatriz Forjaz<\/h3><p>Lisboa, Portugal \u00b7 Atriz<\/p><p>Training: Yin Yoga<\/p><blockquote>\u201cA Carla \u00e9 uma excelente professora: conjuga o lado profissional e estudioso da pr\u00e1tica com o lado emocional e emp\u00e1tico.\u201d<\/blockquote><\/article><article class=\"by-static-card\"><h3>Carina Batista<\/h3><p>Montijo, Portugal \u00b7 Militar \u00b7 Aulas de Yoga<\/p><p>Training: Forma\u00e7\u00e3o 200H<\/p><p>Teaching<\/p><blockquote>\u201cUm novo cap\u00edtulo do yoga aberto com muito boa energia, carinho e presen\u00e7a.\u201d<\/blockquote><\/article><article class=\"by-static-card\"><h3>Carla Caba\u00e7a<\/h3><p>Torres Vedras, Portugal \u00b7 Professora de Yoga \u00b7 Pausa Yoga<\/p><p>Training: Forma\u00e7\u00e3o 200H | Yoga Nidra<\/p><p>Teaching<\/p><\/article><article class=\"by-static-card\"><h3>Carla Gon\u00e7alves<\/h3><p>Alc\u00e2ntara, Lisboa, Portugal \u00b7 Fundadora BeYoga<\/p><p>Training: Forma\u00e7\u00e3o 200H | Forma\u00e7\u00e3o 300H | Yin Yoga | Yoga Nidra | Medita\u00e7\u00e3o | Yoga Restaurativo | Pranayamas | Yoga na Cadeira | Yoga Terap\u00eautico<\/p><p>Teaching<\/p><\/article><article class=\"by-static-card\"><h3>Carla Nogueira<\/h3><p>Valongo \u00b7 Albufeira, Portugal \u00b7 Educa\u00e7\u00e3o e Yoga<\/p><p>Training: Forma\u00e7\u00e3o 200H | Yin Yoga | Yoga Restaurativo<\/p><p>Teaching<\/p><blockquote>\u201cA forma\u00e7\u00e3o em yoga marca uma jornada de educa\u00e7\u00e3o do corpo e da mente. Aprendi a escutar melhor o corpo, a respeitar os seus ritmos e a encontrar mais equil\u00edbrio no dia a dia. \u00c9 com gratid\u00e3o que continuo a aprender e a partilhar esta pr\u00e1tica.\u201d<\/blockquote><\/article><article class=\"by-static-card\"><h3>Carla Sofia Pereira<\/h3><p>Barreiro, Portugal \u00b7 Bodywork \u00b7 Pr\u00e1ticas de toque e respira\u00e7\u00e3o consciente<\/p><p>Training: Forma\u00e7\u00e3o 200H<\/p><\/article><article class=\"by-static-card\"><h3>Carlos Gomes<\/h3><p>Madrid, Espanha \u00b7 Banc\u00e1rio<\/p><p>Training: Forma\u00e7\u00e3o 200H<\/p><\/article><article class=\"by-static-card\"><h3>Carlota Lourido<\/h3><p>Oeiras, Portugal<\/p><p>Training: Yin Yoga<\/p><blockquote>\u201cUma experi\u00eancia completa e enriquecedora. Saio desta forma\u00e7\u00e3o preparada e com confian\u00e7a para ministrar aulas de Yin Yoga.\u201d<\/blockquote><\/article><article class=\"by-static-card\"><h3>Carolina Apar\u00edcio<\/h3><p>Vila do Conde, Portugal<\/p><p>Training: Forma\u00e7\u00e3o 200H<\/p><\/article><article class=\"by-static-card\"><h3>Carolina Machado<\/h3><p>Maia, Portugal<\/p><p>Training: Forma\u00e7\u00e3o 200H<\/p><\/article><article class=\"by-static-card\"><h3>Carolina Prates<\/h3><p>Aveiro, Portugal \u00b7 Professora de Canto<\/p><p>Training: Yin Yoga<\/p><\/article><article class=\"by-static-card\"><h3>Caroline de Moraes<\/h3><p>Lisboa, Portugal \u00b7 Fisioterapeuta<\/p><p>Training: Forma\u00e7\u00e3o 200H<\/p><\/article><article class=\"by-static-card\"><h3>Caroline Ribeiro<\/h3><p>Bragan\u00e7a, Portugal \u00b7 Investigadora em Produtos Naturais \u00b7 Professora de Yoga<\/p><p>Training: Forma\u00e7\u00e3o 200H<\/p><p>Teaching<\/p><\/article><article class=\"by-static-card\"><h3>Catarina Gra\u00e7a<\/h3><p>Porto, Portugal \u00b7 Professora de Yoga, Medita\u00e7\u00e3o e Barre<\/p><p>Training: Forma\u00e7\u00e3o 200H | Medita\u00e7\u00e3o | Pranayamas<\/p><p>Teaching<\/p><blockquote>\u201cExcelente! Superou todas as minhas expectativas. Conte\u00fados muito valiosos e apoio incans\u00e1vel da Carla.\u201d<\/blockquote><\/article><article class=\"by-static-card\"><h3>C\u00e1tia Gomes<\/h3><p>Figueira da Foz, Portugal \u00b7 T\u00e9cnica de Sa\u00fade Ambiental<\/p><p>Training: Forma\u00e7\u00e3o 200H<\/p><\/article><article class=\"by-static-card\"><h3>C\u00e1tia Rodrigues Gomes<\/h3><p>Madrid, Espanha \u00b7 Consultora<\/p><p>Training: Forma\u00e7\u00e3o 200H | Yin Yoga<\/p><\/article><article class=\"by-static-card\"><h3>C\u00e1tia Sebasti\u00e3o<\/h3><p>P\u00f3voa de Santa Iria, Portugal \u00b7 Professora de Yoga, Baby Yoga e Yoga Kids<\/p><p>Training: Forma\u00e7\u00e3o 200H<\/p><p>Teaching<\/p><blockquote>\u201cCheia de medos, receios e inseguran\u00e7as embarquei neste grandioso e prazeroso mergulho de 8 meses.\u201d<\/blockquote><\/article><article class=\"by-static-card\"><h3>Cec\u00edlia Caba\u00e7a<\/h3><p>Alcanena, Portugal \u00b7 Docente de Educa\u00e7\u00e3o F\u00edsica e Yoga<\/p><p>Training: Forma\u00e7\u00e3o 200H<\/p><p>Teaching<\/p><blockquote>\u201cA escola BeYoga e a querida Carla marcaram este per\u00edodo da minha vida.\u201d<\/blockquote><\/article><article class=\"by-static-card\"><h3>Clara Fuster<\/h3><p>Vale de Cambra, Portugal \u00b7 Enfermeira<\/p><p>Training: Yin Yoga<\/p><p>Teaching<\/p><\/article><article class=\"by-static-card\"><h3>Clara Quaresma<\/h3><p>Porto, Portugal \u00b7 Professora de Yoga<\/p><p>Training: Forma\u00e7\u00e3o 200H<\/p><p>Teaching<\/p><\/article><article class=\"by-static-card\"><h3>Claudia Barbeiro<\/h3><p>Leiria, Portugal \u00b7 Gerontologia<\/p><p>Training: Forma\u00e7\u00e3o 200H | Yin Yoga<\/p><p>Teaching<\/p><\/article><article class=\"by-static-card\"><h3>Cristiana Vieira<\/h3><p>Porto de M\u00f3s, Portugal \u00b7 Gestora de Redes Sociais \u00b7 Yoga com Cristiana<\/p><p>Training: Forma\u00e7\u00e3o 200H<\/p><p>Teaching<\/p><blockquote>\u201cTirei a forma\u00e7\u00e3o de professores de yoga e recomendo imenso! Gostei muito da estrutura do curso e de todas as aprendizagens.\u201d<\/blockquote><\/article><article class=\"by-static-card\"><h3>Cristina Catita<\/h3><p>Vila Franca de Xira, Portugal \u00b7 Docente Universit\u00e1ria<\/p><p>Training: Forma\u00e7\u00e3o 200H<\/p><p>Teaching<\/p><blockquote>\u201cDecidir pela forma\u00e7\u00e3o de formadores com a BeYoga foi uma das melhores decis\u00f5es que tomei na minha vida.\u201d<\/blockquote><\/article><article class=\"by-static-card\"><h3>Cristina Valente<\/h3><p>Moura, Portugal \u00b7 Centro de bem-estar e terapias \u00b7 Reiki, TFT e aulas privadas de yoga<\/p><p>Training: Forma\u00e7\u00e3o 200H<\/p><p>Teaching<\/p><\/article><article class=\"by-static-card\"><h3>Danahe Garrido<\/h3><p>Vila Nova de Gaia, Portugal \u00b7 Professora de Yoga  e  Medita\u00e7\u00e3o \u00b7 Fundadora do espa\u00e7o YogArte<\/p><p>Training: Forma\u00e7\u00e3o 200H | Yin Yoga | Pranayamas<\/p><p>Teaching<\/p><blockquote>\u201cA forma\u00e7\u00e3o na BeYoga marcou profundamente o meu percurso. Deu-me ferramentas para ensinar, mas, sobretudo, ensinou-me a viver o yoga com mais consci\u00eancia, humanidade e autenticidade.\u201d<\/blockquote><\/article><article class=\"by-static-card\"><h3>Dora Pedro<\/h3><p>Maia, Portugal \u00b7 Ambiente, Seguran\u00e7a e Sa\u00fade<\/p><p>Training: Forma\u00e7\u00e3o 200H | Yoga Nidra<\/p><p>Teaching<\/p><\/article><article class=\"by-static-card\"><h3>Dorinda da Costa<\/h3><p>Vila Nova de Gaia, Portugal \u00b7 Professora de Yoga \u00b7 Espa\u00e7o YUCCA \u2014 Artes, Of\u00edcios e Bem-Estar<\/p><p>Training: Forma\u00e7\u00e3o 200H | Yoga Nidra<\/p><p>Teaching<\/p><\/article><article class=\"by-static-card\"><h3>Edgar Cardoso<\/h3><p>Ovar, Portugal \u00b7 Terapeuta hol\u00edstico e massagista \u00b7 Portal 777<\/p><p>Training: Forma\u00e7\u00e3o 200H<\/p><blockquote>\u201cUma professora com uma capacidade inata de transmitir o seu conhecimento sobre o Yoga. Uma escola que trabalha com muita exig\u00eancia.\u201d<\/blockquote><\/article><article class=\"by-static-card\"><h3>Eduarda Maia<\/h3><p>\u00c1gueda, Portugal<\/p><p>Training: Forma\u00e7\u00e3o 200H<\/p><blockquote>\u201cFazer um curso na BeYoga \u00e9 um verdadeiro caminho de autoconhecimento e descoberta. Saio daqui com o cora\u00e7\u00e3o cheio e grata por ter escolhido esta escola.\u201d<\/blockquote><\/article><article class=\"by-static-card\"><h3>Eduarda Saraiva<\/h3><p>\u00c1gueda, Portugal \u00b7 Professora de Yoga a tempo inteiro<\/p><p>Training: Forma\u00e7\u00e3o 200H<\/p><p>Teaching<\/p><blockquote>\u201cUma forma\u00e7\u00e3o aprofundada e estruturada que nos prepara para que possamos levar aos outros o melhor que o yoga tem para oferecer.\u201d<\/blockquote><\/article><article class=\"by-static-card\"><h3>Ekaterina Goncalves<\/h3><p>Rio Tinto, Portugal<\/p><p>Training: Forma\u00e7\u00e3o 200H<\/p><\/article><article class=\"by-static-card\"><h3>Elisabete Cardoso<\/h3><p>Vila Verde, Braga, Portugal<\/p><p>Training: Forma\u00e7\u00e3o 200H<\/p><blockquote>\u201cA Carla \u00e9 uma formadora excelente, um ser humano incr\u00edvel.\u201d<\/blockquote><\/article><article class=\"by-static-card\"><h3>Elisabete da Silva Ribeiro<\/h3><p>Porto, Portugal \u00b7 Gestora de Alojamento Local<\/p><p>Training: Forma\u00e7\u00e3o 200H<\/p><\/article><article class=\"by-static-card\"><h3>Elsa Costa<\/h3><p>Guimar\u00e3es, Portugal \u00b7 Fisioterapeuta e Professora de Yoga<\/p><p>Training: Forma\u00e7\u00e3o 200H<\/p><p>Teaching<\/p><blockquote>\u201cUma forma\u00e7\u00e3o que nos muda de dentro para fora! Adorei! A Carla e toda a equipa s\u00e3o 5 estrelas!\u201d<\/blockquote><\/article><article class=\"by-static-card\"><h3>Elsa Dam\u00e1sio<\/h3><p>Leiria, Portugal<\/p><p>Training: Forma\u00e7\u00e3o 200H<\/p><\/article><article class=\"by-static-card\"><h3>F\u00e1tima Lopes<\/h3><p>Braga, Portugal<\/p><p>Training: Yoga Restaurativo<\/p><\/article><article class=\"by-static-card\"><h3>F\u00e1tima Moreno<\/h3><p>Santiago do Cac\u00e9m, Portugal \u00b7 Professora<\/p><p>Training: Forma\u00e7\u00e3o 200H<\/p><p>Teaching<\/p><\/article><article class=\"by-static-card\"><h3>F\u00e1tima Sousa<\/h3><p>Torres Vedras, Portugal \u00b7 Personal Trainer<\/p><p>Training: Forma\u00e7\u00e3o 200H<\/p><\/article><article class=\"by-static-card\"><h3>Fernanda F\u00e9lix<\/h3><p>Lisboa, Portugal<\/p><p>Training: Pranayamas<\/p><\/article><article class=\"by-static-card\"><h3>Gabriela Mircea<\/h3><p>Aveiro, Portugal<\/p><p>Training: Forma\u00e7\u00e3o 200H<\/p><\/article><article class=\"by-static-card\"><h3>Gina Pinho<\/h3><p>\u00c1gueda, Portugal<\/p><p>Training: Forma\u00e7\u00e3o 200H<\/p><blockquote>\u201cEscola muito madura no seu m\u00e9todo. Com rigor e consist\u00eancia, permitiram uma aprendizagem com tempo para a compreens\u00e3o e integra\u00e7\u00e3o dos conte\u00fados.\u201d<\/blockquote><\/article><article class=\"by-static-card\"><h3>In\u00eas Afflalo<\/h3><p>Cascais, Portugal \u00b7 Professora de Yoga e InnerMovement<\/p><p>Training: Forma\u00e7\u00e3o 200H<\/p><p>Teaching<\/p><blockquote>\u201cA melhor mudan\u00e7a na minha vida.\u201d<\/blockquote><\/article><article class=\"by-static-card\"><h3>In\u00eas Antunes<\/h3><p>Lisboa, Portugal \u00b7 Advogada<\/p><p>Training: Forma\u00e7\u00e3o 200H<\/p><p>Teaching<\/p><blockquote>\u201cUma experi\u00eancia espetacular, com muita orienta\u00e7\u00e3o e entrega de todos os profissionais da estrutura BeYoga!\u201d<\/blockquote><\/article><article class=\"by-static-card\"><h3>In\u00eas do Vale<\/h3><p>Caramulo, Tondela, Portugal \u00b7 Rececionista<\/p><p>Training: Yin Yoga | Yoga Nidra<\/p><\/article><article class=\"by-static-card\"><h3>In\u00eas Guerreiro<\/h3><p>Lisboa \u00b7 Oeiras, Portugal \u00b7 Professora de Yoga e Tradutora\/Revisora \u00b7 Yoga da In\u00eas<\/p><p>Training: Forma\u00e7\u00e3o 200H | Medita\u00e7\u00e3o | Yoga Nidra | Pranayamas<\/p><p>Teaching<\/p><blockquote>\u201cBeYoga trouxe solidez, prop\u00f3sito e sentido de miss\u00e3o ao meu velho amor pelo yoga. Hoje, desejo contagiar o mundo com esta paix\u00e3o e os seus benef\u00edcios. Mais do que meu, sei que yoga \u00e9 para todos.\u201d<\/blockquote><\/article><article class=\"by-static-card\"><h3>Ingrid Rodrigues<\/h3><p>Lisboa, Portugal \u00b7 Barista<\/p><p>Training: Forma\u00e7\u00e3o 200H<\/p><blockquote>\u201cSinto-me profundamente feliz e grata por ter-me formado na melhor escola de forma\u00e7\u00e3o de professores de yoga em Portugal.\u201d<\/blockquote><\/article><article class=\"by-static-card\"><h3>Iolanda Santos<\/h3><p>Aroeira, Portugal<\/p><p>Training: Forma\u00e7\u00e3o 200H<\/p><\/article><article class=\"by-static-card\"><h3>Isabel Cristina Miranda<\/h3><p>Braga, Portugal \u00b7 Consultora<\/p><p>Training: Forma\u00e7\u00e3o 200H<\/p><\/article><article class=\"by-static-card\"><h3>Ivete Moutinho<\/h3><p>Vila Nova de Famalic\u00e3o, Portugal \u00b7 Docente de Educa\u00e7\u00e3o Especial \u00b7 Brinca Yoga<\/p><p>Training: Yin Yoga | Yoga Restaurativo | Medita\u00e7\u00e3o | Yoga Nidra | Pranayamas<\/p><p>Teaching<\/p><\/article><article class=\"by-static-card\"><h3>Joana Alves<\/h3><p>Cascais, Portugal \u00b7 Professora de Yoga e Consultora Imobili\u00e1ria<\/p><p>Training: Forma\u00e7\u00e3o 200H | Yin Yoga<\/p><p>Teaching<\/p><blockquote>\u201cAs forma\u00e7\u00f5es da BeYoga School s\u00e3o excelentes! Recomendo a quem queira dar aulas e a quem quer aprofundar conhecimentos. Vale mesmo a pena!\u201d<\/blockquote><\/article><article class=\"by-static-card\"><h3>Joana D&#8217;E\u00e7a Leal<\/h3><p>Alg\u00e9s, Portugal \u00b7 Auditoria Financeira<\/p><p>Training: Forma\u00e7\u00e3o 200H | Medita\u00e7\u00e3o<\/p><\/article><article class=\"by-static-card\"><h3>Joana Neiva<\/h3><p>Braga, Portugal \u00b7 Terapeuta Ocupacional<\/p><p>Training: Forma\u00e7\u00e3o 200H<\/p><blockquote>\u201cAdorei frequentar o Curso de Professores de Yoga na escola BeYoga! A formadora tem um alto n\u00edvel de conhecimento sobre os conte\u00fados e pr\u00e1ticas.\u201d<\/blockquote><\/article><article class=\"by-static-card\"><h3>Joana Ramos<\/h3><p>Lisboa, Portugal \u00b7 T\u00e9cnica Superior de Psicologia<\/p><p>Training: Forma\u00e7\u00e3o 200H<\/p><\/article><article class=\"by-static-card\"><h3>Jo\u00e3o Amaro<\/h3><p>\u00c9vora, Portugal \u00b7 Professor de Yoga e Designer<\/p><p>Training: Forma\u00e7\u00e3o 200H | Yin Yoga<\/p><p>Teaching<\/p><blockquote>\u201cA forma\u00e7\u00e3o BeYoga mudou a minha vida. Aprendi que o Yoga \u00e9 fisicamente exigente, mas o que tem de mais valioso \u00e9 ensinar algo raro hoje: o estar quieto.\u201d<\/blockquote><\/article><article class=\"by-static-card\"><h3>Jo\u00e3o Pedro Alves<\/h3><p>Lausanne, Su\u00ed\u00e7a \u00b7 Personal Trainer<\/p><p>Training: Forma\u00e7\u00e3o 200H | Yoga Nidra<\/p><\/article><article class=\"by-static-card\"><h3>Joaquim Guerreiro<\/h3><p>Santar\u00e9m, Portugal<\/p><p>Training: Forma\u00e7\u00e3o 200H<\/p><\/article><article class=\"by-static-card\"><h3>Juliana Silva<\/h3><p>Carnaxide, Oeiras, Portugal \u00b7 Administrativa<\/p><p>Training: Forma\u00e7\u00e3o 200H<\/p><\/article><article class=\"by-static-card\"><h3>June Mainardi<\/h3><p>Set\u00fabal, Portugal<\/p><p>Training: Forma\u00e7\u00e3o 200H<\/p><blockquote>\u201cA forma\u00e7\u00e3o BeYoga \u00e9 muito mais que uma forma\u00e7\u00e3o. Profissionais super competentes e, acima de tudo, humanas. Foi uma experi\u00eancia maravilhosa.\u201d<\/blockquote><\/article><article class=\"by-static-card\"><h3>Kateryna Goriachenko<\/h3><p>Arma\u00e7\u00e3o de P\u00eara, Portugal \u00b7 Est\u00e9tica e Professora de Yoga<\/p><p>Training: Forma\u00e7\u00e3o 200H | Yoga na Cadeira | Yoga Terap\u00eautico<\/p><p>Teaching<\/p><\/article><article class=\"by-static-card\"><h3>Lays Monteiro<\/h3><p>Charneca de Caparica, Portugal \u00b7 Analista Financeira<\/p><p>Training: Forma\u00e7\u00e3o 200H<\/p><p>Teaching<\/p><blockquote>\u201cEu amei tanto a forma\u00e7\u00e3o. Hoje sou professora de yoga gra\u00e7as \u00e0 BeYoga. Gratid\u00e3o.\u201d<\/blockquote><\/article><article class=\"by-static-card\"><h3>Leonor Almeida<\/h3><p>Guimar\u00e3es, Portugal \u00b7 Enfermeira e Professora de Yoga<\/p><p>Training: Forma\u00e7\u00e3o 200H<\/p><\/article><article class=\"by-static-card\"><h3>Leonor Silva<\/h3><p>Serzedelo, Guimar\u00e3es, Portugal \u00b7 Enfermeira<\/p><p>Training: Forma\u00e7\u00e3o 200H<\/p><\/article><article class=\"by-static-card\"><h3>Louane Mattos<\/h3><p>Figueira da Foz, Portugal<\/p><p>Training: Forma\u00e7\u00e3o 200H<\/p><blockquote>\u201cExcelente experi\u00eancia com a BeYoga.\u201d<\/blockquote><\/article><article class=\"by-static-card\"><h3>Luany de Castro<\/h3><p>Bragan\u00e7a, Portugal \u00b7 Professora de Yoga e Pilates<\/p><p>Training: Forma\u00e7\u00e3o 200H<\/p><p>Teaching<\/p><blockquote>\u201cA forma\u00e7\u00e3o do BeYoga significou para mim que estamos em constante evolu\u00e7\u00e3o, aprendendo e crescendo como pessoas, e a busca pelo conhecimento n\u00e3o tem fim. A import\u00e2ncia de dedicar tempo ao que acreditamos e o profissionalismo.\u201d<\/blockquote><\/article><article class=\"by-static-card\"><h3>L\u00facia Guerreiro<\/h3><p>Lisboa, Portugal \u00b7 Fisioterapeuta<\/p><p>Training: Forma\u00e7\u00e3o 200H<\/p><\/article><article class=\"by-static-card\"><h3>Luciana Sanchez<\/h3><p>Freamunde, Portugal<\/p><p>Training: Forma\u00e7\u00e3o 200H<\/p><blockquote>\u201cEstou muito feliz com esta forma\u00e7\u00e3o de yoga. A equipa \u00e9 incr\u00edvel, muito profissional e humana, sempre a acompanhar o processo de aprendizagem com proximidade e dedica\u00e7\u00e3o.\u201d<\/blockquote><\/article><article class=\"by-static-card\"><h3>Lu\u00eds Sanchez<\/h3><p>Pernes, Santar\u00e9m, Portugal \u00b7 Instrutor de Yoga<\/p><p>Training: Forma\u00e7\u00e3o 200H | Yoga Restaurativo<\/p><p>Teaching<\/p><blockquote>\u201cUma forma\u00e7\u00e3o extremamente completa, com um acompanhamento sempre presente. Uma experi\u00eancia verdadeiramente transformadora. A Carla Gon\u00e7alves \u00e9 um ser humano fant\u00e1stico, que nos faz acreditar em n\u00f3s mesmos!\u201d<\/blockquote><\/article><article class=\"by-static-card\"><h3>Luis Silvestre<\/h3><p>Pa\u00e7o de Arcos, Portugal \u00b7 Professor de Dan\u00e7a<\/p><p>Training: Forma\u00e7\u00e3o 200H<\/p><blockquote>\u201cSem d\u00favida \u00e9 uma excelente escola de forma\u00e7\u00e3o em Yoga, estou muito satisfeito.\u201d<\/blockquote><\/article><article class=\"by-static-card\"><h3>Lu\u00edsa Caldeira<\/h3><p>Porto Santo, Portugal \u00b7 T\u00e9cnica de tr\u00e1fego de assist\u00eancia em escala<\/p><p>Training: Forma\u00e7\u00e3o 200H<\/p><\/article><article class=\"by-static-card\"><h3>Madalena Oliveira<\/h3><p>Caldas da Rainha, Portugal<\/p><p>Training: Forma\u00e7\u00e3o 200H<\/p><blockquote>\u201cFiz a forma\u00e7\u00e3o de Professores de Yoga com a BeYoga e posso dizer que foi uma experi\u00eancia transformadora!\u201d<\/blockquote><\/article><article class=\"by-static-card\"><h3>Mafalda Silva<\/h3><p>Porto, Portugal<\/p><p>Training: Forma\u00e7\u00e3o 200H<\/p><p>Teaching<\/p><\/article><article class=\"by-static-card\"><h3>Manuela Albuquerque<\/h3><p>Agualva-Cac\u00e9m, Portugal<\/p><p>Training: Forma\u00e7\u00e3o 200H<\/p><blockquote>\u201cA forma\u00e7\u00e3o na BeYoga ofereceu-me crescimento pessoal e autoconhecimento. Bem estruturada e desafiante, com a exig\u00eancia necess\u00e1ria.\u201d<\/blockquote><\/article><article class=\"by-static-card\"><h3>M\u00e1rcia Ribeiro<\/h3><p>Ermesinde, Portugal \u00b7 Gest\u00e3o da Forma\u00e7\u00e3o<\/p><p>Training: Forma\u00e7\u00e3o 200H<\/p><\/article><article class=\"by-static-card\"><h3>Maria de F\u00e1tima Gomes<\/h3><p>Braga, Portugal \u00b7 Enfermeira<\/p><p>Training: Forma\u00e7\u00e3o 200H<\/p><p>Teaching<\/p><\/article><article class=\"by-static-card\"><h3>Maria Grifo Ramos<\/h3><p>Peniche, Portugal \u00b7 MARYOGA \u2014 Vinyasa Flow by the Sea<\/p><p>Training: Forma\u00e7\u00e3o 200H<\/p><p>Teaching<\/p><\/article><article class=\"by-static-card\"><h3>Maria Jo\u00e3o Cabral<\/h3><p>Porto, Portugal<\/p><p>Training: Forma\u00e7\u00e3o 200H<\/p><\/article><article class=\"by-static-card\"><h3>Maria Jo\u00e3o Silva<\/h3><p>Ramada, Portugal<\/p><p>Training: Forma\u00e7\u00e3o 200H<\/p><\/article><article class=\"by-static-card\"><h3>Maria Neves<\/h3><p>Aveiro, Portugal \u00b7 Analista de Dados<\/p><p>Training: Forma\u00e7\u00e3o 200H<\/p><\/article><article class=\"by-static-card\"><h3>Maria Salvaterra<\/h3><p>Alter do Ch\u00e3o, Portugal<\/p><p>Training: Yoga na Cadeira<\/p><\/article><article class=\"by-static-card\"><h3>Mariana Rosa<\/h3><p>Coimbra, Portugal \u00b7 Professora de Yoga e Terapeuta Emocional<\/p><p>Training: Forma\u00e7\u00e3o 200H | Medita\u00e7\u00e3o<\/p><p>Teaching<\/p><\/article><article class=\"by-static-card\"><h3>Mariana Serra<\/h3><p>Maia, Portugal \u00b7 Professora de Yoga e Terapeuta de Constela\u00e7\u00f5es Sist\u00e9micas<\/p><p>Training: Forma\u00e7\u00e3o 200H<\/p><p>Teaching<\/p><blockquote>\u201cFoi uma forma\u00e7\u00e3o rica de conte\u00fado, a professora Carla \u00e9 maravilhosa, e super dispon\u00edveis.\u201d<\/blockquote><\/article><article class=\"by-static-card\"><h3>Mariane Bunn<\/h3><p>Castres, Fran\u00e7a \u00b7 Professora de Yoga \u00b7 Yoga com Mari<\/p><p>Training: Forma\u00e7\u00e3o 200H<\/p><p>Teaching<\/p><blockquote>\u201cExcelente escola. Fiz o curso de forma online e o cuidado com os alunos online faz bastante diferen\u00e7a.\u201d<\/blockquote><\/article><article class=\"by-static-card\"><h3>Marisa Ribeiro<\/h3><p>Vila Real, Portugal \u00b7 Tem est\u00fadio pr\u00f3prio de yoga<\/p><p>Training: Forma\u00e7\u00e3o 200H<\/p><p>Teaching<\/p><\/article><article class=\"by-static-card\"><h3>Marisa Silva<\/h3><p>Olh\u00e3o, Portugal \u00b7 Motorista TVDE<\/p><p>Training: Forma\u00e7\u00e3o 200H<\/p><\/article><article class=\"by-static-card\"><h3>Marla Pais<\/h3><p>Pa\u00e7os de Brand\u00e3o, Portugal \u00b7 Empregada de Escrit\u00f3rio<\/p><p>Training: Forma\u00e7\u00e3o 200H | Medita\u00e7\u00e3o | Pranayamas<\/p><\/article><article class=\"by-static-card\"><h3>Marta Aguileira<\/h3><p>Oeiras, Portugal \u00b7 Gestora de Eventos<\/p><p>Training: Forma\u00e7\u00e3o 200H<\/p><\/article><article class=\"by-static-card\"><h3>Marta Carmo<\/h3><p>Aveiro, Portugal \u00b7 Professora de Yoga<\/p><p>Training: Forma\u00e7\u00e3o 200H | Yoga Restaurativo<\/p><p>Teaching<\/p><blockquote>\u201cA forma\u00e7\u00e3o foi excelente! A Prof. Carla, organizada e exigente, proporciona uma abordagem sintetizada e clara dos conte\u00fados.\u201d<\/blockquote><\/article><article class=\"by-static-card\"><h3>Marta Castanho<\/h3><p>Lisboa, Portugal \u00b7 Professora<\/p><p>Training: Forma\u00e7\u00e3o 200H<\/p><\/article><article class=\"by-static-card\"><h3>Miguela Fernandes<\/h3><p>Alcanede, Santar\u00e9m, Portugal \u00b7 Professora \u00b7 Yoga para Crian\u00e7as e Seniores<\/p><p>Training: Forma\u00e7\u00e3o 200H<\/p><p>Teaching<\/p><blockquote>\u201cFoi um ano de aprendizagens e crescimento pessoal. A Carla \u00e9 uma professora com um enorme conhecimento, uma pr\u00e1tica fluida e uma agilidade fabulosa.\u201d<\/blockquote><\/article><article class=\"by-static-card\"><h3>Milena Coppi<\/h3><p>Porto, Portugal<\/p><p>Training: Yin Yoga<\/p><\/article><article class=\"by-static-card\"><h3>M\u00f3nica Bar\u00e3o<\/h3><p>P\u00earo Pinheiro, Portugal<\/p><p>Training: Forma\u00e7\u00e3o 200H<\/p><\/article><article class=\"by-static-card\"><h3>N\u00e9lia Rodrigues<\/h3><p>Caldas da Rainha, Portugal \u00b7 Professora de Yoga e Formadora<\/p><p>Training: Forma\u00e7\u00e3o 200H | Yin Yoga | Medita\u00e7\u00e3o<\/p><p>Teaching<\/p><blockquote>\u201cEncontrei um espa\u00e7o de aprendizagem profunda, apoio e inspira\u00e7\u00e3o, que me deu as bases para construir o meu caminho. Sou profundamente grata pela qualidade da forma\u00e7\u00e3o, pela humaniza\u00e7\u00e3o e pelos valores que me foram transmitidos ao longo do percurso.\u201d<\/blockquote><\/article><article class=\"by-static-card\"><h3>Odete Lopes<\/h3><p>Coimbra, Portugal \u00b7 Formadora na \u00e1rea de Restaura\u00e7\u00e3o<\/p><p>Training: Forma\u00e7\u00e3o 200H<\/p><p>Teaching<\/p><\/article><article class=\"by-static-card\"><h3>Olga Chvaiko<\/h3><p>Azeit\u00e3o, Portugal \u00b7 Assistente Administrativa<\/p><p>Training: Yin Yoga<\/p><\/article><article class=\"by-static-card\"><h3>Paula Ladeira<\/h3><p>Proen\u00e7a-a-Nova, Portugal<\/p><p>Training: Yoga na Cadeira | Yoga Terap\u00eautico<\/p><\/article><article class=\"by-static-card\"><h3>Paula Silva<\/h3><p>Espinho, Portugal \u00b7 Animadora Sociocultural e Professora de Yoga<\/p><p>Training: Forma\u00e7\u00e3o 200H | Yin Yoga<\/p><p>Teaching<\/p><blockquote>\u201cA forma\u00e7\u00e3o de yoga da BeYoga School foi fant\u00e1stica!\u201d<\/blockquote><\/article><article class=\"by-static-card\"><h3>Paulo Costa<\/h3><p>Vila Nova de Cerveira, Portugal \u00b7 Arquitecto e Instrutor de Yoga \u00b7 Casa do Lento<\/p><p>Training: Forma\u00e7\u00e3o 200H<\/p><p>Teaching<\/p><blockquote>\u201cFiquei encantado com a elevada qualidade do curso de professores da BeYoga. A Carla e a sua equipa foram incans\u00e1veis a ajudar os alunos a atingir os seus objetivos.\u201d<\/blockquote><\/article><article class=\"by-static-card\"><h3>Paulo Vieira<\/h3><p>Amadora \u00b7 Lisboa \u00b7 Oeiras, Portugal \u00b7 Professor de Yoga e Instrutor de Breathwork \u00b7 UNO Yoga e Breathwork<\/p><p>Training: Forma\u00e7\u00e3o 200H | Yoga Nidra<\/p><p>Teaching<\/p><\/article><article class=\"by-static-card\"><h3>Raquel Correia<\/h3><p>Maia, Portugal<\/p><p>Training: Forma\u00e7\u00e3o 200H<\/p><blockquote>\u201cUma imers\u00e3o \u00fanica e aut\u00eantica, acompanhada por pessoas que inspiram e nos d\u00e3o uma vis\u00e3o contempor\u00e2nea de como o Yoga pode ser ajustado aos dias de hoje.\u201d<\/blockquote><\/article><article class=\"by-static-card\"><h3>Raquel Gon\u00e7alves<\/h3><p>Amadora, Portugal \u00b7 Professora de Yoga e Enfermeira<\/p><p>Training: Forma\u00e7\u00e3o 200H<\/p><p>Teaching<\/p><\/article><article class=\"by-static-card\"><h3>Raquel Martins<\/h3><p>Almada, Portugal \u00b7 Professora de Yoga e Pilates \u00b7 ay\u00fcn yoga<\/p><p>Training: Forma\u00e7\u00e3o 200H<\/p><p>Teaching<\/p><blockquote>\u201cUma transforma\u00e7\u00e3o e um encontro com a minha ess\u00eancia!\u201d<\/blockquote><\/article><article class=\"by-static-card\"><h3>Rita Brinca<\/h3><p>Set\u00fabal, Portugal \u00b7 Instrutora de Yoga<\/p><p>Training: Forma\u00e7\u00e3o 200H | Yin Yoga | Yoga na Cadeira<\/p><p>Teaching<\/p><\/article><article class=\"by-static-card\"><h3>Rita Calejo Pires<\/h3><p>Vila Real de Santo Ant\u00f3nio, Portugal \u00b7 Professora e Instrutora de Yoga<\/p><p>Training: Yin Yoga<\/p><p>Teaching<\/p><\/article><article class=\"by-static-card\"><h3>Rita Marafuz<\/h3><p>Maia, Portugal \u00b7 Terapeuta de Medicina Chinesa e Acupuntura \u00b7 Zhi Studio<\/p><p>Training: Forma\u00e7\u00e3o 200H<\/p><p>Teaching<\/p><\/article><article class=\"by-static-card\"><h3>Rita Mestre<\/h3><p>Corroios, Portugal \u00b7 T\u00e9cnica de Cardiopneumologia<\/p><p>Training: Forma\u00e7\u00e3o 200H | Yin Yoga | Yoga na Cadeira | Yoga Terap\u00eautico<\/p><p>Teaching<\/p><\/article><article class=\"by-static-card\"><h3>Rita Moreira<\/h3><p>Azeit\u00e3o, Portugal<\/p><p>Training: Forma\u00e7\u00e3o 200H<\/p><\/article><article class=\"by-static-card\"><h3>Rita Oliveira Santos<\/h3><p>Santa Maria da Feira, Portugal<\/p><p>Training: Forma\u00e7\u00e3o 200H<\/p><\/article><article class=\"by-static-card\"><h3>Rita Sousa<\/h3><p>Schweinfurt, Alemanha \u00b7 Massagista<\/p><p>Training: Forma\u00e7\u00e3o 200H<\/p><\/article><article class=\"by-static-card\"><h3>Rodrigo Marques<\/h3><p>Odivelas, Portugal<\/p><p>Training: Yin Yoga<\/p><\/article><article class=\"by-static-card\"><h3>Sabrina Ruan<\/h3><p>Lisboa, Portugal \u00b7 Personal Trainer e Instrutora de Yoga \u00b7 Yoga Vita Qualis<\/p><p>Training: Forma\u00e7\u00e3o 200H | Yin Yoga | Yoga Restaurativo | Medita\u00e7\u00e3o | Yoga Nidra<\/p><p>Teaching<\/p><blockquote>\u201cA forma\u00e7\u00e3o de Yoga ensinou-me muito mais do que t\u00e9cnicas. Ensinou-me a viver com mais consci\u00eancia, equil\u00edbrio e presen\u00e7a, e a partilhar esse caminho com os outros.\u201d<\/blockquote><\/article><article class=\"by-static-card\"><h3>Sandra de Almeida<\/h3><p>Lisboa, Portugal<\/p><p>Training: Forma\u00e7\u00e3o 200H<\/p><\/article><article class=\"by-static-card\"><h3>Sandra S\u00e1<\/h3><p>Silves, Portugal<\/p><p>Training: Yin Yoga<\/p><\/article><article class=\"by-static-card\"><h3>Sandra Tote Borges<\/h3><p>Praia da Vit\u00f3ria, A\u00e7ores, Portugal<\/p><p>Training: Medita\u00e7\u00e3o<\/p><\/article><article class=\"by-static-card\"><h3>Sara Teixeira<\/h3><p>Torres Vedras \u00b7 Lisboa, Portugal \u00b7 Professora de Yoga e Administrativa \u00b7 Slow Vibe Tribe<\/p><p>Training: Forma\u00e7\u00e3o 200H | Yin Yoga | Pranayamas<\/p><p>Teaching<\/p><blockquote>\u201cFazer a forma\u00e7\u00e3o de yoga mudou a forma como eu me vejo, e como me movo no mundo. Adquiri conhecimentos e mecanismos que me ajudam a criar mais equil\u00edbrio na minha vida, e que me aproximaram da pessoa que realmente quero ser. Sou muito grata por ter tido a possibilidade de fazer esta forma\u00e7\u00e3o.\u201d<\/blockquote><\/article><article class=\"by-static-card\"><h3>Sebasti\u00e3o Medeiros<\/h3><p>\u00c1gueda, Portugal \u00b7 T\u00e9cnico Auxiliar de Farm\u00e1cia \u00b7 Yoga<\/p><p>Training: Forma\u00e7\u00e3o 200H | Yoga Nidra | Medita\u00e7\u00e3o | Pranayamas<\/p><blockquote>\u201cProporcionou-me um entendimento aprofundado sobre estar presente sem julgamento.\u201d<\/blockquote><\/article><article class=\"by-static-card\"><h3>Silvia Almeida<\/h3><p>Portalegre, Portugal<\/p><p>Training: Pranayamas<\/p><\/article><article class=\"by-static-card\"><h3>Silvia Filipe<\/h3><p>Torres Novas, Portugal \u00b7 Professora do Ensino Secund\u00e1rio<\/p><p>Training: Yin Yoga | Yoga Restaurativo | Medita\u00e7\u00e3o | Pranayamas | Yoga Nidra<\/p><\/article><article class=\"by-static-card\"><h3>Silvia Maganinho<\/h3><p>Esmoriz, Portugal \u00b7 Professora de Yoga \u00b7 Maitri Yoga<\/p><p>Training: Forma\u00e7\u00e3o 200H<\/p><p>Teaching<\/p><\/article><article class=\"by-static-card\"><h3>Sofia Luz<\/h3><p>Alc\u00e1cer do Sal, Portugal \u00b7 Engenharia de Dados<\/p><p>Training: Forma\u00e7\u00e3o 200H<\/p><\/article><article class=\"by-static-card\"><h3>Solange Morais<\/h3><p>\u00c9vora, Portugal \u00b7 Professora de Yoga \u00b7 Sol Yoga Vibes<\/p><p>Training: Yin Yoga<\/p><p>Teaching<\/p><\/article><article class=\"by-static-card\"><h3>S\u00f3nia Galv\u00e3o<\/h3><p>Belas, Portugal \u00b7 Contabilista Certificada \u00b7 Aromaterapia e Yoga Facial<\/p><p>Training: Forma\u00e7\u00e3o 200H | Yin Yoga | Yoga Nidra | Medita\u00e7\u00e3o | Pranayamas | Yoga na Cadeira | Yoga Terap\u00eautico<\/p><p>Teaching<\/p><blockquote>\u201cForma\u00e7\u00e3o excelente, muito bem estruturada. Sa\u00edmos muito bem preparados e temos muito apoio.\u201d<\/blockquote><\/article><article class=\"by-static-card\"><h3>S\u00f3nia Isabel da Costa<\/h3><p>Braga, Portugal \u00b7 Beleza e Est\u00e9tica<\/p><p>Training: Forma\u00e7\u00e3o 200H<\/p><p>Teaching<\/p><\/article><article class=\"by-static-card\"><h3>S\u00f3nia Vieira<\/h3><p>Mondim de Basto, Portugal \u00b7 Terapeuta<\/p><p>Training: Forma\u00e7\u00e3o 200H | Yin Yoga | Medita\u00e7\u00e3o<\/p><\/article><article class=\"by-static-card\"><h3>St\u00e9phanie de Oliveira<\/h3><p>Vila Nova de Famalic\u00e3o, Portugal<\/p><p>Training: Forma\u00e7\u00e3o 200H<\/p><\/article><article class=\"by-static-card\"><h3>Susana Marques<\/h3><p>Corroios, Portugal \u00b7 Assistente T\u00e9cnica<\/p><p>Training: Forma\u00e7\u00e3o 200H<\/p><\/article><article class=\"by-static-card\"><h3>Susana Melo<\/h3><p>Viseu, Portugal \u00b7 Professora de Yoga e Engenheira Civil \u00b7 SuYoga<\/p><p>Training: Yin Yoga<\/p><p>Teaching<\/p><\/article><article class=\"by-static-card\"><h3>Susana Patr\u00edcio<\/h3><p>Sintra, Portugal \u00b7 Professora de Yoga \u00b7 Su Yoga Classes<\/p><p>Training: Yin Yoga<\/p><p>Teaching<\/p><blockquote>\u201cFoi uma \u00f3tima experi\u00eancia. A Prof. Carla \u00e9 excelente, muito acess\u00edvel e entusiasta.\u201d<\/blockquote><\/article><article class=\"by-static-card\"><h3>Susana Silva<\/h3><p>Arma\u00e7\u00e3o de P\u00eara, Portugal<\/p><p>Training: Yoga Nidra<\/p><\/article><article class=\"by-static-card\"><h3>Susete Martins<\/h3><p>Alcabideche, Cascais, Portugal<\/p><p>Training: Medita\u00e7\u00e3o<\/p><\/article><article class=\"by-static-card\"><h3>Sylvia Mota<\/h3><p>Gafanha da Encarna\u00e7\u00e3o, \u00cdlhavo, Portugal \u00b7 Esteticista e T\u00e9cnica de Ayurveda<\/p><p>Training: Yin Yoga<\/p><\/article><article class=\"by-static-card\"><h3>Teresa Arcanjo<\/h3><p>Rio Tinto, Portugal \u00b7 Atriz \u00b7 Yoga e Yoga Facial<\/p><p>Training: Forma\u00e7\u00e3o 200H<\/p><p>Teaching<\/p><blockquote>\u201cAdorei cada momento do percurso, desde a partilha de conhecimentos at\u00e9 \u00e0 liga\u00e7\u00e3o que se criou no grupo. Sa\u00ed desta experi\u00eancia n\u00e3o apenas de cora\u00e7\u00e3o cheio mas tamb\u00e9m a sentir-me preparada para partilhar o que aprendi. Estou profundamente grata por tudo o que aprendi e vivenciei. Namast\u00e9. \ud83d\ude4f\u201d<\/blockquote><\/article><article class=\"by-static-card\"><h3>Thaisa Andrade<\/h3><p>Lisboa, Portugal<\/p><p>Training: Forma\u00e7\u00e3o 200H<\/p><blockquote>\u201cAo longo desta jornada com a BeYoga compreendi que o Yoga \u00e9 viv\u00eancia integrada, n\u00e3o apenas aprendizado. Sou grata \u00e0 Carla e \u00e0 Sabrina pelo cuidado e condu\u00e7\u00e3o na forma\u00e7\u00e3o.\u201d<\/blockquote><\/article><article class=\"by-static-card\"><h3>Val\u00e9ria Guimar\u00e3es<\/h3><p>Oliveira do Bairro, Portugal \u00b7 Fisioterapeuta<\/p><p>Training: Forma\u00e7\u00e3o 200H<\/p><blockquote>\u201cExcelente! A Carla \u00e9 muito competente, estimula imenso os alunos e est\u00e1 sempre atenta \u00e0s nossas d\u00favidas. Adorei o curso.\u201d<\/blockquote><\/article><article class=\"by-static-card\"><h3>Vanessa Sanona<\/h3><p>Moita, Portugal \u00b7 Pricing Specialist<\/p><p>Training: Forma\u00e7\u00e3o 200H<\/p><\/article><article class=\"by-static-card\"><h3>Beatriz Gomes<\/h3><p>Lourinh\u00e3, Portugal \u00b7 Assistente de instrutor de surf<\/p><p>Training: Forma\u00e7\u00e3o 200H<\/p><\/article><article class=\"by-static-card\"><h3>Laurinda Isabel Mota<\/h3><p>Celorico de Basto, Portugal \u00b7 Esteticista<\/p><p>Training: Forma\u00e7\u00e3o 200H<\/p><\/article><article class=\"by-static-card\"><h3>Maria Cord\u00e9lia Santos<\/h3><p>C\u00e2mara de Lobos, Portugal \u00b7 Professora de yoga<\/p><p>Training: Forma\u00e7\u00e3o 200H<\/p><p>Teaching<\/p><blockquote>\u201cTer feito o curso na BeYoga foi uma experi\u00eancia transformadora do ponto de vista da aquisi\u00e7\u00e3o de conhecimentos t\u00e9cnicos e tamb\u00e9m de crescimento e desenvolvimento humano. A prof Carla e a equipa d\u00e3o literalmente tudo e isso faz a diferen\u00e7a no modo como somos acolhidos, instru\u00eddos, incentivados e envolvidos.\u201d<\/blockquote><\/article><article class=\"by-static-card\"><h3>Marina Fernandes<\/h3><p>Lisboa, Portugal \u00b7 Professora de yoga e pilates<\/p><p>Training: Forma\u00e7\u00e3o 200H<\/p><p>Teaching<\/p><blockquote>\u201cA forma\u00e7\u00e3o de yoga foi incr\u00edvel, desde o conte\u00fado, que foi muito interessante e relevante, \u00e0 forma leve e did\u00e1tica como foi lecionado. Foi-nos dado sempre apoio mesmo fora dos momentos de encontros, o que ajudou bastante a tirar d\u00favidas e a evoluir na nossa aprendizagem. A entrega da professora Carla fez toda a diferen\u00e7a, foi f\u00e1cil aprender e ficar cada vez mais apaixonada pelo yoga.\u201d<\/blockquote><\/article><article class=\"by-static-card\"><h3>Marisa Costa<\/h3><p>Mafra, Portugal \u00b7 Fisioterapeuta<\/p><p>Training: Forma\u00e7\u00e3o 200H<\/p><\/article><article class=\"by-static-card\"><h3>Andrea Soares<\/h3><p>Quinta do Anjo, Portugal \u00b7 Professora de yoga, cantora, artes\u00e3 e stylist<\/p><p>Training: Forma\u00e7\u00e3o 200H<\/p><p>Teaching<\/p><blockquote>\u201cA forma\u00e7\u00e3o BeYoga mudou a minha vida. A Carla \u00e9 a melhor mentora, que mesmo depois de terminada a forma\u00e7\u00e3o continua a apoiar e abra\u00e7ar. Muito grata\u201d<\/blockquote><\/article><article class=\"by-static-card\"><h3>Daniela Salgueiro<\/h3><p>Barcelos, Portugal \u00b7 Professora de Yoga \u00b7 Os Salgueirinhos<\/p><p>Training: Forma\u00e7\u00e3o 200H<\/p><p>Teaching<\/p><\/article><article class=\"by-static-card\"><h3>Maria Rui<\/h3><p>Peniche, Portugal \u00b7 Professora de Yoga e Surf Yoga \u00b7 MARYOGA<\/p><p>Training: Forma\u00e7\u00e3o 200H<\/p><p>Teaching<\/p><blockquote>\u201cUm sonho tornado realidade! Uma forma\u00e7\u00e3o super enriquecedora, super completa, com uma equipa incr\u00edvel, em especial a minha prof Carla. Superou as minhas expectativas!\u201d<\/blockquote><\/article><article class=\"by-static-card\"><h3>Maria Apolin\u00e1rio<\/h3><p>Lourinh\u00e3, Portugal \u00b7 Especialista de Medicina Tradicional Chinesa \u00b7 (A)mar<\/p><p>Training: Forma\u00e7\u00e3o 200H<\/p><p>Teaching<\/p><\/article><\/div><\/div>\n  <div class=\"by-empty\" id=\"empty\">No graduates found with these filters.<\/div>\n<\/section>\n\n\n<section class=\"by-section by-white\" id=\"sobre\">\n  <div class=\"inner\">\n    <p class=\"label\">Yoga teachers trained in Portugal<\/p>\n    <h2>A community growing city by city<\/h2>\n    <p>Each pin on this map is a real person who completed a <strong>certified yoga teacher training<\/strong> at BeYoga School. They are nurses, designers, physiotherapists, military officers and managers who now teach yoga in <strong>more than 100 cities<\/strong>, from Bragan\u00e7a to the Algarve, from Madeira to the Azores, and also in Spain, France, Switzerland and Germany.<\/p>\n    <p><strong>BeYoga School<\/strong> is a yoga teacher training school founded in 2018 by <strong>Carla Gon\u00e7alves<\/strong> (E-RYT 500, Sports Science graduate from FMH Lisbon). In 7 years it has trained <strong>more than 200 teachers<\/strong>, with <strong>over 3,700 hours certified<\/strong> by Yoga Alliance.<\/p>\n    <div class=\"by-creds\">\n      <div class=\"by-cred\"><div class=\"k\">RYS 200<\/div><p><strong>Yoga Alliance<\/strong> Registered Yoga School: internationally recognised 200-hour training.<\/p><\/div>\n      <div class=\"by-cred\"><div class=\"k\">RYS 300<\/div><p><strong>Yoga Alliance<\/strong>: 300 hours of advanced study in anatomy, philosophy and methodology.<\/p><\/div>\n      <div class=\"by-cred\"><div class=\"k\">DGERT<\/div><p>Certification guaranteeing <strong>professional training<\/strong> standards in Portugal.<\/p><\/div>\n      <div class=\"by-cred\"><div class=\"k\">IPDJ<\/div><p>Official sports validation of yoga teaching by the <strong>Portuguese Institute of Sport and Youth<\/strong>.<\/p><\/div>\n    <\/div>\n    <img decoding=\"async\" class=\"by-certlogos\" src=\"https:\/\/beyoga.pt\/wp-content\/uploads\/2026\/05\/Logos-novos-scaled.png\" alt=\"BeYoga School certification seals: Yoga Alliance RYS 200, Yoga Alliance RYS 300, DGERT and IPDJ\" loading=\"lazy\">\n  <\/div>\n<\/section>\n\n<section class=\"by-section by-faq\" id=\"faq\">\n  <div class=\"inner\">\n    <p class=\"label\">Perguntas frequentes<\/p>\n    <h2>O que precisas de saber<\/h2>\n    <details><summary>What is the BeYoga School graduate map?<\/summary><div class=\"a\">It is the <strong>official directory of BeYoga School graduates<\/strong>. Each pin represents a real person who completed a certified training, with their city, courses, profession and yoga projects.<\/div><\/details>\n    <details><summary>How do I find a yoga teacher near me?<\/summary><div class=\"a\">Use the <strong>&#8220;Teaching&#8221;<\/strong> filter and navigate the map to your area. BeYoga-trained teachers are in more than 100 cities across Portugal and also in Spain, France, Switzerland and Germany. Many have <strong>Instagram and website<\/strong> links on their profile for direct contact.<\/div><\/details>\n    <details><summary>What trainings did these people take?<\/summary><div class=\"a\">The <strong>200H Yoga Teacher Training<\/strong> (YTT 200H), certified by Yoga Alliance, DGERT and IPDJ, and specialisation courses: <strong>Yin Yoga, Yoga Nidra, Restorative Yoga, Meditation, Pranayama, Chair Yoga and Therapeutic Yoga<\/strong>.<\/div><\/details>\n    <details><summary>How can I appear on this map?<\/summary><div class=\"a\">Complete a <strong>training at BeYoga School<\/strong> and your place is guaranteed. If you are already a graduate and not yet listed, or want to update your details and photo, write to us at <strong>geral@beyoga.pt<\/strong>.<\/div><\/details>\n    <details><summary>Is BeYoga School certified?<\/summary><div class=\"a\">Sim. \u00c9 <strong>Registered Yoga School pela Yoga Alliance<\/strong> (RYS 200 e RYS 300), certificada pela <strong>DGERT<\/strong> e reconhecida pelo <strong>IPDJ<\/strong>. Desde 2018 formou mais de 200 professores, com mais de 3700 horas certificadas.<\/div><\/details>\n    <details><summary>Are these teachers\u2019 classes run by BeYoga?<\/summary><div class=\"a\">No. Each teacher develops their own project <strong>independently<\/strong>: their own studios, gyms, schools, online or at home. BeYoga proudly showcases these projects, because our graduates\u2019 success is the best proof of the quality of the training.<\/div><\/details>\n  <\/div>\n<\/section>\n\n<section class=\"by-cta by-section\">\n  <div class=\"inner\">\n    <p class=\"label\">O pr\u00f3ximo pin podes ser tu<\/p>\n    <h2>Queres aparecer neste mapa?<\/h2>\n    <p>Come\u00e7a pela <strong>Forma\u00e7\u00e3o de Professores de Yoga 200H<\/strong>, certificada pela Yoga Alliance, DGERT e IPDJ, ou aprofunda a tua pr\u00e1tica com um curso de especializa\u00e7\u00e3o.<\/p>\n    <a class=\"by-btn\" href=\"https:\/\/beyoga.pt\/en\/200-hour-yoga-teacher-training\/\">Conhecer a Forma\u00e7\u00e3o 200H<\/a>\n    <a class=\"by-btn outline\" href=\"https:\/\/beyoga.pt\/en\/yoga-courses\/\">See the specialisation courses<\/a>\n  <\/div>\n<\/section>\n\n<p class=\"by-note\">Fazes parte da comunidade BeYoga e queres <strong>atualizar o teu perfil<\/strong> neste mapa? <a href=\"https:\/\/beyoga.pt\/quero-aparecer-no-mapa\/\">Diz-nos aqui<\/a>. Os dados apresentados foram partilhados pelos pr\u00f3prios alunos.<\/p>\n\n<script id=\"leaflet-js\">(function(){var c=decodeURIComponent(escape(atob(\"IWZ1bmN0aW9uKHQsZSl7Im9iamVjdCI9PXR5cGVvZiBleHBvcnRzJiYidW5kZWZpbmVkIiE9dHlwZW9mIG1vZHVsZT9lKGV4cG9ydHMpOiJmdW5jdGlvbiI9PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQ\/ZGVmaW5lKFsiZXhwb3J0cyJdLGUpOmUoKHQ9InVuZGVmaW5lZCIhPXR5cGVvZiBnbG9iYWxUaGlzP2dsb2JhbFRoaXM6dHx8c2VsZikubGVhZmxldD17fSl9KHRoaXMsZnVuY3Rpb24odCl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIGwodCl7Zm9yKHZhciBlLGksbj0xLG89YXJndW1lbnRzLmxlbmd0aDtuPG87bisrKWZvcihlIGluIGk9YXJndW1lbnRzW25dKXRbZV09aVtlXTtyZXR1cm4gdH12YXIgUj1PYmplY3QuY3JlYXRlfHxmdW5jdGlvbih0KXtyZXR1cm4gTi5wcm90b3R5cGU9dCxuZXcgTn07ZnVuY3Rpb24gTigpe31mdW5jdGlvbiBhKHQsZSl7dmFyIGksbj1BcnJheS5wcm90b3R5cGUuc2xpY2U7cmV0dXJuIHQuYmluZD90LmJpbmQuYXBwbHkodCxuLmNhbGwoYXJndW1lbnRzLDEpKTooaT1uLmNhbGwoYXJndW1lbnRzLDIpLGZ1bmN0aW9uKCl7cmV0dXJuIHQuYXBwbHkoZSxpLmxlbmd0aD9pLmNvbmNhdChuLmNhbGwoYXJndW1lbnRzKSk6YXJndW1lbnRzKX0pfXZhciBEPTA7ZnVuY3Rpb24gZCh0KXtyZXR1cm4iX2xlYWZsZXRfaWQiaW4gdHx8KHQuX2xlYWZsZXRfaWQ9KytEKSx0Ll9sZWFmbGV0X2lkfWZ1bmN0aW9uIGoodCxlLGkpe2Z1bmN0aW9uIG4oKXtvPSExLHMmJihyLmFwcGx5KGkscykscz0hMSl9dmFyIG8scyxyPWZ1bmN0aW9uKCl7bz9zPWFyZ3VtZW50czoodC5hcHBseShpLGFyZ3VtZW50cyksc2V0VGltZW91dChuLGUpLG89ITApfTtyZXR1cm4gcn1mdW5jdGlvbiBIKHQsZSxpKXt2YXIgbj1lWzFdLG89bi0oZT1lWzBdKTtyZXR1cm4gdD09PW4mJmk\/dDooKHQtZSklbytvKSVvK2V9ZnVuY3Rpb24gXygpe3JldHVybiExfWZ1bmN0aW9uIGkodCxlKXtyZXR1cm4hMT09PWU\/dDooZT1NYXRoLnBvdygxMCx2b2lkIDA9PT1lPzY6ZSksTWF0aC5yb3VuZCh0KmUpL2UpfWZ1bmN0aW9uIFcodCl7cmV0dXJuIHQudHJpbT90LnRyaW0oKTp0LnJlcGxhY2UoL15ccyt8XHMrJC9nLCIiKX1mdW5jdGlvbiBGKHQpe3JldHVybiBXKHQpLnNwbGl0KC9ccysvKX1mdW5jdGlvbiBoKHQsZSl7Zm9yKHZhciBpIGluIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LCJvcHRpb25zIil8fCh0Lm9wdGlvbnM9dC5vcHRpb25zP1IodC5vcHRpb25zKTp7fSksZSl0Lm9wdGlvbnNbaV09ZVtpXTtyZXR1cm4gdC5vcHRpb25zfWZ1bmN0aW9uIFUodCxlLGkpe3ZhciBuLG89W107Zm9yKG4gaW4gdClvLnB1c2goZW5jb2RlVVJJQ29tcG9uZW50KGk\/bi50b1VwcGVyQ2FzZSgpOm4pKyI9IitlbmNvZGVVUklDb21wb25lbnQodFtuXSkpO3JldHVybihlJiYtMSE9PWUuaW5kZXhPZigiPyIpPyImIjoiPyIpK28uam9pbigiJiIpfXZhciBWPS9ceyAqKFtcd18gLV0rKSAqXH0vZztmdW5jdGlvbiBxKHQsaSl7cmV0dXJuIHQucmVwbGFjZShWLGZ1bmN0aW9uKHQsZSl7aWYodm9pZCAwPT09KGU9aVtlXSkpdGhyb3cgbmV3IEVycm9yKCJObyB2YWx1ZSBwcm92aWRlZCBmb3IgdmFyaWFibGUgIit0KTtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgZT9lKGkpOmV9KX12YXIgdT1BcnJheS5pc0FycmF5fHxmdW5jdGlvbih0KXtyZXR1cm4iW29iamVjdCBBcnJheV0iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpfTtmdW5jdGlvbiBHKHQsZSl7Zm9yKHZhciBpPTA7aTx0Lmxlbmd0aDtpKyspaWYodFtpXT09PWUpcmV0dXJuIGk7cmV0dXJuLTF9dmFyIEs9ImRhdGE6aW1hZ2UvZ2lmO2Jhc2U2NCxSMGxHT0RsaEFRQUJBQUQvQUN3QUFBQUFBUUFCQUFBQ0FEcz0iO2Z1bmN0aW9uIFkodCl7cmV0dXJuIHdpbmRvd1sid2Via2l0Iit0XXx8d2luZG93WyJtb3oiK3RdfHx3aW5kb3dbIm1zIit0XX12YXIgWD0wO2Z1bmN0aW9uIEoodCl7dmFyIGU9K25ldyBEYXRlLGk9TWF0aC5tYXgoMCwxNi0oZS1YKSk7cmV0dXJuIFg9ZStpLHdpbmRvdy5zZXRUaW1lb3V0KHQsaSl9dmFyICQ9d2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZXx8WSgiUmVxdWVzdEFuaW1hdGlvbkZyYW1lIil8fEosUT13aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWV8fFkoIkNhbmNlbEFuaW1hdGlvbkZyYW1lIil8fFkoIkNhbmNlbFJlcXVlc3RBbmltYXRpb25GcmFtZSIpfHxmdW5jdGlvbih0KXt3aW5kb3cuY2xlYXJUaW1lb3V0KHQpfTtmdW5jdGlvbiB5KHQsZSxpKXtpZighaXx8JCE9PUopcmV0dXJuICQuY2FsbCh3aW5kb3csYSh0LGUpKTt0LmNhbGwoZSl9ZnVuY3Rpb24gcih0KXt0JiZRLmNhbGwod2luZG93LHQpfXZhciB0dD17X19wcm90b19fOm51bGwsZXh0ZW5kOmwsY3JlYXRlOlIsYmluZDphLGdldCBsYXN0SWQoKXtyZXR1cm4gRH0sc3RhbXA6ZCx0aHJvdHRsZTpqLHdyYXBOdW06SCxmYWxzZUZuOl8sZm9ybWF0TnVtOmksdHJpbTpXLHNwbGl0V29yZHM6RixzZXRPcHRpb25zOmgsZ2V0UGFyYW1TdHJpbmc6VSx0ZW1wbGF0ZTpxLGlzQXJyYXk6dSxpbmRleE9mOkcsZW1wdHlJbWFnZVVybDpLLHJlcXVlc3RGbjokLGNhbmNlbEZuOlEscmVxdWVzdEFuaW1GcmFtZTp5LGNhbmNlbEFuaW1GcmFtZTpyfTtmdW5jdGlvbiBldCgpe31ldC5leHRlbmQ9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe2godGhpcyksdGhpcy5pbml0aWFsaXplJiZ0aGlzLmluaXRpYWxpemUuYXBwbHkodGhpcyxhcmd1bWVudHMpLHRoaXMuY2FsbEluaXRIb29rcygpfXZhciBpLG49ZS5fX3N1cGVyX189dGhpcy5wcm90b3R5cGUsbz1SKG4pO2ZvcihpIGluKG8uY29uc3RydWN0b3I9ZSkucHJvdG90eXBlPW8sdGhpcylPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodGhpcyxpKSYmInByb3RvdHlwZSIhPT1pJiYiX19zdXBlcl9fIiE9PWkmJihlW2ldPXRoaXNbaV0pO2lmKHQuc3RhdGljcyYmbChlLHQuc3RhdGljcyksdC5pbmNsdWRlcyl7dmFyIHM9dC5pbmNsdWRlcztpZigidW5kZWZpbmVkIiE9dHlwZW9mIEwmJkwmJkwuTWl4aW4pZm9yKHZhciBzPXUocyk\/czpbc10scj0wO3I8cy5sZW5ndGg7cisrKXNbcl09PT1MLk1peGluLkV2ZW50cyYmY29uc29sZS53YXJuKCJEZXByZWNhdGVkIGluY2x1ZGUgb2YgTC5NaXhpbi5FdmVudHM6IHRoaXMgcHJvcGVydHkgd2lsbCBiZSByZW1vdmVkIGluIGZ1dHVyZSByZWxlYXNlcywgcGxlYXNlIGluaGVyaXQgZnJvbSBMLkV2ZW50ZWQgaW5zdGVhZC4iLChuZXcgRXJyb3IpLnN0YWNrKTtsLmFwcGx5KG51bGwsW29dLmNvbmNhdCh0LmluY2x1ZGVzKSl9cmV0dXJuIGwobyx0KSxkZWxldGUgby5zdGF0aWNzLGRlbGV0ZSBvLmluY2x1ZGVzLG8ub3B0aW9ucyYmKG8ub3B0aW9ucz1uLm9wdGlvbnM\/UihuLm9wdGlvbnMpOnt9LGwoby5vcHRpb25zLHQub3B0aW9ucykpLG8uX2luaXRIb29rcz1bXSxvLmNhbGxJbml0SG9va3M9ZnVuY3Rpb24oKXtpZighdGhpcy5faW5pdEhvb2tzQ2FsbGVkKXtuLmNhbGxJbml0SG9va3MmJm4uY2FsbEluaXRIb29rcy5jYWxsKHRoaXMpLHRoaXMuX2luaXRIb29rc0NhbGxlZD0hMDtmb3IodmFyIHQ9MCxlPW8uX2luaXRIb29rcy5sZW5ndGg7dDxlO3QrKylvLl9pbml0SG9va3NbdF0uY2FsbCh0aGlzKX19LGV9LGV0LmluY2x1ZGU9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5wcm90b3R5cGUub3B0aW9ucztyZXR1cm4gbCh0aGlzLnByb3RvdHlwZSx0KSx0Lm9wdGlvbnMmJih0aGlzLnByb3RvdHlwZS5vcHRpb25zPWUsdGhpcy5tZXJnZU9wdGlvbnModC5vcHRpb25zKSksdGhpc30sZXQubWVyZ2VPcHRpb25zPWZ1bmN0aW9uKHQpe3JldHVybiBsKHRoaXMucHJvdG90eXBlLm9wdGlvbnMsdCksdGhpc30sZXQuYWRkSW5pdEhvb2s9ZnVuY3Rpb24odCl7dmFyIGU9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEpLGk9ImZ1bmN0aW9uIj09dHlwZW9mIHQ\/dDpmdW5jdGlvbigpe3RoaXNbdF0uYXBwbHkodGhpcyxlKX07cmV0dXJuIHRoaXMucHJvdG90eXBlLl9pbml0SG9va3M9dGhpcy5wcm90b3R5cGUuX2luaXRIb29rc3x8W10sdGhpcy5wcm90b3R5cGUuX2luaXRIb29rcy5wdXNoKGkpLHRoaXN9O3ZhciBlPXtvbjpmdW5jdGlvbih0LGUsaSl7aWYoIm9iamVjdCI9PXR5cGVvZiB0KWZvcih2YXIgbiBpbiB0KXRoaXMuX29uKG4sdFtuXSxlKTtlbHNlIGZvcih2YXIgbz0wLHM9KHQ9Rih0KSkubGVuZ3RoO288cztvKyspdGhpcy5fb24odFtvXSxlLGkpO3JldHVybiB0aGlzfSxvZmY6ZnVuY3Rpb24odCxlLGkpe2lmKGFyZ3VtZW50cy5sZW5ndGgpaWYoIm9iamVjdCI9PXR5cGVvZiB0KWZvcih2YXIgbiBpbiB0KXRoaXMuX29mZihuLHRbbl0sZSk7ZWxzZXt0PUYodCk7Zm9yKHZhciBvPTE9PT1hcmd1bWVudHMubGVuZ3RoLHM9MCxyPXQubGVuZ3RoO3M8cjtzKyspbz90aGlzLl9vZmYodFtzXSk6dGhpcy5fb2ZmKHRbc10sZSxpKX1lbHNlIGRlbGV0ZSB0aGlzLl9ldmVudHM7cmV0dXJuIHRoaXN9LF9vbjpmdW5jdGlvbih0LGUsaSxuKXsiZnVuY3Rpb24iIT10eXBlb2YgZT9jb25zb2xlLndhcm4oIndyb25nIGxpc3RlbmVyIHR5cGU6ICIrdHlwZW9mIGUpOiExPT09dGhpcy5fbGlzdGVucyh0LGUsaSkmJihlPXtmbjplLGN0eDppPWk9PT10aGlzP3ZvaWQgMDppfSxuJiYoZS5vbmNlPSEwKSx0aGlzLl9ldmVudHM9dGhpcy5fZXZlbnRzfHx7fSx0aGlzLl9ldmVudHNbdF09dGhpcy5fZXZlbnRzW3RdfHxbXSx0aGlzLl9ldmVudHNbdF0ucHVzaChlKSl9LF9vZmY6ZnVuY3Rpb24odCxlLGkpe3ZhciBuLG8scztpZih0aGlzLl9ldmVudHMmJihuPXRoaXMuX2V2ZW50c1t0XSkpaWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe2lmKHRoaXMuX2ZpcmluZ0NvdW50KWZvcihvPTAscz1uLmxlbmd0aDtvPHM7bysrKW5bb10uZm49XztkZWxldGUgdGhpcy5fZXZlbnRzW3RdfWVsc2UiZnVuY3Rpb24iIT10eXBlb2YgZT9jb25zb2xlLndhcm4oIndyb25nIGxpc3RlbmVyIHR5cGU6ICIrdHlwZW9mIGUpOiExIT09KGU9dGhpcy5fbGlzdGVucyh0LGUsaSkpJiYoaT1uW2VdLHRoaXMuX2ZpcmluZ0NvdW50JiYoaS5mbj1fLHRoaXMuX2V2ZW50c1t0XT1uPW4uc2xpY2UoKSksbi5zcGxpY2UoZSwxKSl9LGZpcmU6ZnVuY3Rpb24odCxlLGkpe2lmKHRoaXMubGlzdGVucyh0LGkpKXt2YXIgbj1sKHt9LGUse3R5cGU6dCx0YXJnZXQ6dGhpcyxzb3VyY2VUYXJnZXQ6ZSYmZS5zb3VyY2VUYXJnZXR8fHRoaXN9KTtpZih0aGlzLl9ldmVudHMpe3ZhciBvPXRoaXMuX2V2ZW50c1t0XTtpZihvKXt0aGlzLl9maXJpbmdDb3VudD10aGlzLl9maXJpbmdDb3VudCsxfHwxO2Zvcih2YXIgcz0wLHI9by5sZW5ndGg7czxyO3MrKyl7dmFyIGE9b1tzXSxoPWEuZm47YS5vbmNlJiZ0aGlzLm9mZih0LGgsYS5jdHgpLGguY2FsbChhLmN0eHx8dGhpcyxuKX10aGlzLl9maXJpbmdDb3VudC0tfX1pJiZ0aGlzLl9wcm9wYWdhdGVFdmVudChuKX1yZXR1cm4gdGhpc30sbGlzdGVuczpmdW5jdGlvbih0LGUsaSxuKXsic3RyaW5nIiE9dHlwZW9mIHQmJmNvbnNvbGUud2FybignInN0cmluZyIgdHlwZSBhcmd1bWVudCBleHBlY3RlZCcpO3ZhciBvPWUscz0oImZ1bmN0aW9uIiE9dHlwZW9mIGUmJihuPSEhZSxpPW89dm9pZCAwKSx0aGlzLl9ldmVudHMmJnRoaXMuX2V2ZW50c1t0XSk7aWYocyYmcy5sZW5ndGgmJiExIT09dGhpcy5fbGlzdGVucyh0LG8saSkpcmV0dXJuITA7aWYobilmb3IodmFyIHIgaW4gdGhpcy5fZXZlbnRQYXJlbnRzKWlmKHRoaXMuX2V2ZW50UGFyZW50c1tyXS5saXN0ZW5zKHQsZSxpLG4pKXJldHVybiEwO3JldHVybiExfSxfbGlzdGVuczpmdW5jdGlvbih0LGUsaSl7aWYodGhpcy5fZXZlbnRzKXt2YXIgbj10aGlzLl9ldmVudHNbdF18fFtdO2lmKCFlKXJldHVybiEhbi5sZW5ndGg7aT09PXRoaXMmJihpPXZvaWQgMCk7Zm9yKHZhciBvPTAscz1uLmxlbmd0aDtvPHM7bysrKWlmKG5bb10uZm49PT1lJiZuW29dLmN0eD09PWkpcmV0dXJuIG99cmV0dXJuITF9LG9uY2U6ZnVuY3Rpb24odCxlLGkpe2lmKCJvYmplY3QiPT10eXBlb2YgdClmb3IodmFyIG4gaW4gdCl0aGlzLl9vbihuLHRbbl0sZSwhMCk7ZWxzZSBmb3IodmFyIG89MCxzPSh0PUYodCkpLmxlbmd0aDtvPHM7bysrKXRoaXMuX29uKHRbb10sZSxpLCEwKTtyZXR1cm4gdGhpc30sYWRkRXZlbnRQYXJlbnQ6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2V2ZW50UGFyZW50cz10aGlzLl9ldmVudFBhcmVudHN8fHt9LHRoaXMuX2V2ZW50UGFyZW50c1tkKHQpXT10LHRoaXN9LHJlbW92ZUV2ZW50UGFyZW50OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9ldmVudFBhcmVudHMmJmRlbGV0ZSB0aGlzLl9ldmVudFBhcmVudHNbZCh0KV0sdGhpc30sX3Byb3BhZ2F0ZUV2ZW50OmZ1bmN0aW9uKHQpe2Zvcih2YXIgZSBpbiB0aGlzLl9ldmVudFBhcmVudHMpdGhpcy5fZXZlbnRQYXJlbnRzW2VdLmZpcmUodC50eXBlLGwoe2xheWVyOnQudGFyZ2V0LHByb3BhZ2F0ZWRGcm9tOnQudGFyZ2V0fSx0KSwhMCl9fSxpdD0oZS5hZGRFdmVudExpc3RlbmVyPWUub24sZS5yZW1vdmVFdmVudExpc3RlbmVyPWUuY2xlYXJBbGxFdmVudExpc3RlbmVycz1lLm9mZixlLmFkZE9uZVRpbWVFdmVudExpc3RlbmVyPWUub25jZSxlLmZpcmVFdmVudD1lLmZpcmUsZS5oYXNFdmVudExpc3RlbmVycz1lLmxpc3RlbnMsZXQuZXh0ZW5kKGUpKTtmdW5jdGlvbiBwKHQsZSxpKXt0aGlzLng9aT9NYXRoLnJvdW5kKHQpOnQsdGhpcy55PWk\/TWF0aC5yb3VuZChlKTplfXZhciBudD1NYXRoLnRydW5jfHxmdW5jdGlvbih0KXtyZXR1cm4gMDx0P01hdGguZmxvb3IodCk6TWF0aC5jZWlsKHQpfTtmdW5jdGlvbiBtKHQsZSxpKXtyZXR1cm4gdCBpbnN0YW5jZW9mIHA\/dDp1KHQpP25ldyBwKHRbMF0sdFsxXSk6bnVsbD09dD90OiJvYmplY3QiPT10eXBlb2YgdCYmIngiaW4gdCYmInkiaW4gdD9uZXcgcCh0LngsdC55KTpuZXcgcCh0LGUsaSl9ZnVuY3Rpb24gZih0LGUpe2lmKHQpZm9yKHZhciBpPWU\/W3QsZV06dCxuPTAsbz1pLmxlbmd0aDtuPG87bisrKXRoaXMuZXh0ZW5kKGlbbl0pfWZ1bmN0aW9uIGModCxlKXtyZXR1cm4hdHx8dCBpbnN0YW5jZW9mIGY\/dDpuZXcgZih0LGUpfWZ1bmN0aW9uIHModCxlKXtpZih0KWZvcih2YXIgaT1lP1t0LGVdOnQsbj0wLG89aS5sZW5ndGg7bjxvO24rKyl0aGlzLmV4dGVuZChpW25dKX1mdW5jdGlvbiBnKHQsZSl7cmV0dXJuIHQgaW5zdGFuY2VvZiBzP3Q6bmV3IHModCxlKX1mdW5jdGlvbiB2KHQsZSxpKXtpZihpc05hTih0KXx8aXNOYU4oZSkpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIExhdExuZyBvYmplY3Q6ICgiK3QrIiwgIitlKyIpIik7dGhpcy5sYXQ9K3QsdGhpcy5sbmc9K2Usdm9pZCAwIT09aSYmKHRoaXMuYWx0PStpKX1mdW5jdGlvbiB4KHQsZSxpKXtyZXR1cm4gdCBpbnN0YW5jZW9mIHY\/dDp1KHQpJiYib2JqZWN0IiE9dHlwZW9mIHRbMF0\/Mz09PXQubGVuZ3RoP25ldyB2KHRbMF0sdFsxXSx0WzJdKToyPT09dC5sZW5ndGg\/bmV3IHYodFswXSx0WzFdKTpudWxsOm51bGw9PXQ\/dDoib2JqZWN0Ij09dHlwZW9mIHQmJiJsYXQiaW4gdD9uZXcgdih0LmxhdCwibG5nImluIHQ\/dC5sbmc6dC5sb24sdC5hbHQpOnZvaWQgMD09PWU\/bnVsbDpuZXcgdih0LGUsaSl9cC5wcm90b3R5cGU9e2Nsb25lOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBwKHRoaXMueCx0aGlzLnkpfSxhZGQ6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuY2xvbmUoKS5fYWRkKG0odCkpfSxfYWRkOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLngrPXQueCx0aGlzLnkrPXQueSx0aGlzfSxzdWJ0cmFjdDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5jbG9uZSgpLl9zdWJ0cmFjdChtKHQpKX0sX3N1YnRyYWN0OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLngtPXQueCx0aGlzLnktPXQueSx0aGlzfSxkaXZpZGVCeTpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5jbG9uZSgpLl9kaXZpZGVCeSh0KX0sX2RpdmlkZUJ5OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLngvPXQsdGhpcy55Lz10LHRoaXN9LG11bHRpcGx5Qnk6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuY2xvbmUoKS5fbXVsdGlwbHlCeSh0KX0sX211bHRpcGx5Qnk6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMueCo9dCx0aGlzLnkqPXQsdGhpc30sc2NhbGVCeTpmdW5jdGlvbih0KXtyZXR1cm4gbmV3IHAodGhpcy54KnQueCx0aGlzLnkqdC55KX0sdW5zY2FsZUJ5OmZ1bmN0aW9uKHQpe3JldHVybiBuZXcgcCh0aGlzLngvdC54LHRoaXMueS90LnkpfSxyb3VuZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmNsb25lKCkuX3JvdW5kKCl9LF9yb3VuZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLng9TWF0aC5yb3VuZCh0aGlzLngpLHRoaXMueT1NYXRoLnJvdW5kKHRoaXMueSksdGhpc30sZmxvb3I6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jbG9uZSgpLl9mbG9vcigpfSxfZmxvb3I6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy54PU1hdGguZmxvb3IodGhpcy54KSx0aGlzLnk9TWF0aC5mbG9vcih0aGlzLnkpLHRoaXN9LGNlaWw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jbG9uZSgpLl9jZWlsKCl9LF9jZWlsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMueD1NYXRoLmNlaWwodGhpcy54KSx0aGlzLnk9TWF0aC5jZWlsKHRoaXMueSksdGhpc30sdHJ1bmM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jbG9uZSgpLl90cnVuYygpfSxfdHJ1bmM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy54PW50KHRoaXMueCksdGhpcy55PW50KHRoaXMueSksdGhpc30sZGlzdGFuY2VUbzpmdW5jdGlvbih0KXt2YXIgZT0odD1tKHQpKS54LXRoaXMueCx0PXQueS10aGlzLnk7cmV0dXJuIE1hdGguc3FydChlKmUrdCp0KX0sZXF1YWxzOmZ1bmN0aW9uKHQpe3JldHVybih0PW0odCkpLng9PT10aGlzLngmJnQueT09PXRoaXMueX0sY29udGFpbnM6ZnVuY3Rpb24odCl7cmV0dXJuIHQ9bSh0KSxNYXRoLmFicyh0LngpPD1NYXRoLmFicyh0aGlzLngpJiZNYXRoLmFicyh0LnkpPD1NYXRoLmFicyh0aGlzLnkpfSx0b1N0cmluZzpmdW5jdGlvbigpe3JldHVybiJQb2ludCgiK2kodGhpcy54KSsiLCAiK2kodGhpcy55KSsiKSJ9fSxmLnByb3RvdHlwZT17ZXh0ZW5kOmZ1bmN0aW9uKHQpe3ZhciBlLGk7aWYodCl7aWYodCBpbnN0YW5jZW9mIHB8fCJudW1iZXIiPT10eXBlb2YgdFswXXx8IngiaW4gdCllPWk9bSh0KTtlbHNlIGlmKGU9KHQ9Yyh0KSkubWluLGk9dC5tYXgsIWV8fCFpKXJldHVybiB0aGlzO3RoaXMubWlufHx0aGlzLm1heD8odGhpcy5taW4ueD1NYXRoLm1pbihlLngsdGhpcy5taW4ueCksdGhpcy5tYXgueD1NYXRoLm1heChpLngsdGhpcy5tYXgueCksdGhpcy5taW4ueT1NYXRoLm1pbihlLnksdGhpcy5taW4ueSksdGhpcy5tYXgueT1NYXRoLm1heChpLnksdGhpcy5tYXgueSkpOih0aGlzLm1pbj1lLmNsb25lKCksdGhpcy5tYXg9aS5jbG9uZSgpKX1yZXR1cm4gdGhpc30sZ2V0Q2VudGVyOmZ1bmN0aW9uKHQpe3JldHVybiBtKCh0aGlzLm1pbi54K3RoaXMubWF4LngpLzIsKHRoaXMubWluLnkrdGhpcy5tYXgueSkvMix0KX0sZ2V0Qm90dG9tTGVmdDpmdW5jdGlvbigpe3JldHVybiBtKHRoaXMubWluLngsdGhpcy5tYXgueSl9LGdldFRvcFJpZ2h0OmZ1bmN0aW9uKCl7cmV0dXJuIG0odGhpcy5tYXgueCx0aGlzLm1pbi55KX0sZ2V0VG9wTGVmdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1pbn0sZ2V0Qm90dG9tUmlnaHQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tYXh9LGdldFNpemU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tYXguc3VidHJhY3QodGhpcy5taW4pfSxjb250YWluczpmdW5jdGlvbih0KXt2YXIgZSxpO3JldHVybih0PSgibnVtYmVyIj09dHlwZW9mIHRbMF18fHQgaW5zdGFuY2VvZiBwP206YykodCkpaW5zdGFuY2VvZiBmPyhlPXQubWluLGk9dC5tYXgpOmU9aT10LGUueD49dGhpcy5taW4ueCYmaS54PD10aGlzLm1heC54JiZlLnk+PXRoaXMubWluLnkmJmkueTw9dGhpcy5tYXgueX0saW50ZXJzZWN0czpmdW5jdGlvbih0KXt0PWModCk7dmFyIGU9dGhpcy5taW4saT10aGlzLm1heCxuPXQubWluLG89KHQ9dC5tYXgpLng+PWUueCYmbi54PD1pLngsdD10Lnk+PWUueSYmbi55PD1pLnk7cmV0dXJuIG8mJnR9LG92ZXJsYXBzOmZ1bmN0aW9uKHQpe3Q9Yyh0KTt2YXIgZT10aGlzLm1pbixpPXRoaXMubWF4LG49dC5taW4sbz0odD10Lm1heCkueD5lLngmJm4ueDxpLngsdD10Lnk+ZS55JiZuLnk8aS55O3JldHVybiBvJiZ0fSxpc1ZhbGlkOmZ1bmN0aW9uKCl7cmV0dXJuISghdGhpcy5taW58fCF0aGlzLm1heCl9LHBhZDpmdW5jdGlvbih0KXt2YXIgZT10aGlzLm1pbixpPXRoaXMubWF4LG49TWF0aC5hYnMoZS54LWkueCkqdCx0PU1hdGguYWJzKGUueS1pLnkpKnQ7cmV0dXJuIGMobShlLngtbixlLnktdCksbShpLngrbixpLnkrdCkpfSxlcXVhbHM6ZnVuY3Rpb24odCl7cmV0dXJuISF0JiYodD1jKHQpLHRoaXMubWluLmVxdWFscyh0LmdldFRvcExlZnQoKSkmJnRoaXMubWF4LmVxdWFscyh0LmdldEJvdHRvbVJpZ2h0KCkpKX19LHMucHJvdG90eXBlPXtleHRlbmQ6ZnVuY3Rpb24odCl7dmFyIGUsaSxuPXRoaXMuX3NvdXRoV2VzdCxvPXRoaXMuX25vcnRoRWFzdDtpZih0IGluc3RhbmNlb2YgdilpPWU9dDtlbHNle2lmKCEodCBpbnN0YW5jZW9mIHMpKXJldHVybiB0P3RoaXMuZXh0ZW5kKHgodCl8fGcodCkpOnRoaXM7aWYoZT10Ll9zb3V0aFdlc3QsaT10Ll9ub3J0aEVhc3QsIWV8fCFpKXJldHVybiB0aGlzfXJldHVybiBufHxvPyhuLmxhdD1NYXRoLm1pbihlLmxhdCxuLmxhdCksbi5sbmc9TWF0aC5taW4oZS5sbmcsbi5sbmcpLG8ubGF0PU1hdGgubWF4KGkubGF0LG8ubGF0KSxvLmxuZz1NYXRoLm1heChpLmxuZyxvLmxuZykpOih0aGlzLl9zb3V0aFdlc3Q9bmV3IHYoZS5sYXQsZS5sbmcpLHRoaXMuX25vcnRoRWFzdD1uZXcgdihpLmxhdCxpLmxuZykpLHRoaXN9LHBhZDpmdW5jdGlvbih0KXt2YXIgZT10aGlzLl9zb3V0aFdlc3QsaT10aGlzLl9ub3J0aEVhc3Qsbj1NYXRoLmFicyhlLmxhdC1pLmxhdCkqdCx0PU1hdGguYWJzKGUubG5nLWkubG5nKSp0O3JldHVybiBuZXcgcyhuZXcgdihlLmxhdC1uLGUubG5nLXQpLG5ldyB2KGkubGF0K24saS5sbmcrdCkpfSxnZXRDZW50ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IHYoKHRoaXMuX3NvdXRoV2VzdC5sYXQrdGhpcy5fbm9ydGhFYXN0LmxhdCkvMiwodGhpcy5fc291dGhXZXN0LmxuZyt0aGlzLl9ub3J0aEVhc3QubG5nKS8yKX0sZ2V0U291dGhXZXN0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3NvdXRoV2VzdH0sZ2V0Tm9ydGhFYXN0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX25vcnRoRWFzdH0sZ2V0Tm9ydGhXZXN0OmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyB2KHRoaXMuZ2V0Tm9ydGgoKSx0aGlzLmdldFdlc3QoKSl9LGdldFNvdXRoRWFzdDpmdW5jdGlvbigpe3JldHVybiBuZXcgdih0aGlzLmdldFNvdXRoKCksdGhpcy5nZXRFYXN0KCkpfSxnZXRXZXN0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3NvdXRoV2VzdC5sbmd9LGdldFNvdXRoOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3NvdXRoV2VzdC5sYXR9LGdldEVhc3Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbm9ydGhFYXN0LmxuZ30sZ2V0Tm9ydGg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbm9ydGhFYXN0LmxhdH0sY29udGFpbnM6ZnVuY3Rpb24odCl7dD0oIm51bWJlciI9PXR5cGVvZiB0WzBdfHx0IGluc3RhbmNlb2Ygdnx8ImxhdCJpbiB0P3g6ZykodCk7dmFyIGUsaSxuPXRoaXMuX3NvdXRoV2VzdCxvPXRoaXMuX25vcnRoRWFzdDtyZXR1cm4gdCBpbnN0YW5jZW9mIHM\/KGU9dC5nZXRTb3V0aFdlc3QoKSxpPXQuZ2V0Tm9ydGhFYXN0KCkpOmU9aT10LGUubGF0Pj1uLmxhdCYmaS5sYXQ8PW8ubGF0JiZlLmxuZz49bi5sbmcmJmkubG5nPD1vLmxuZ30saW50ZXJzZWN0czpmdW5jdGlvbih0KXt0PWcodCk7dmFyIGU9dGhpcy5fc291dGhXZXN0LGk9dGhpcy5fbm9ydGhFYXN0LG49dC5nZXRTb3V0aFdlc3QoKSxvPSh0PXQuZ2V0Tm9ydGhFYXN0KCkpLmxhdD49ZS5sYXQmJm4ubGF0PD1pLmxhdCx0PXQubG5nPj1lLmxuZyYmbi5sbmc8PWkubG5nO3JldHVybiBvJiZ0fSxvdmVybGFwczpmdW5jdGlvbih0KXt0PWcodCk7dmFyIGU9dGhpcy5fc291dGhXZXN0LGk9dGhpcy5fbm9ydGhFYXN0LG49dC5nZXRTb3V0aFdlc3QoKSxvPSh0PXQuZ2V0Tm9ydGhFYXN0KCkpLmxhdD5lLmxhdCYmbi5sYXQ8aS5sYXQsdD10LmxuZz5lLmxuZyYmbi5sbmc8aS5sbmc7cmV0dXJuIG8mJnR9LHRvQkJveFN0cmluZzpmdW5jdGlvbigpe3JldHVyblt0aGlzLmdldFdlc3QoKSx0aGlzLmdldFNvdXRoKCksdGhpcy5nZXRFYXN0KCksdGhpcy5nZXROb3J0aCgpXS5qb2luKCIsIil9LGVxdWFsczpmdW5jdGlvbih0LGUpe3JldHVybiEhdCYmKHQ9Zyh0KSx0aGlzLl9zb3V0aFdlc3QuZXF1YWxzKHQuZ2V0U291dGhXZXN0KCksZSkmJnRoaXMuX25vcnRoRWFzdC5lcXVhbHModC5nZXROb3J0aEVhc3QoKSxlKSl9LGlzVmFsaWQ6ZnVuY3Rpb24oKXtyZXR1cm4hKCF0aGlzLl9zb3V0aFdlc3R8fCF0aGlzLl9ub3J0aEVhc3QpfX07dmFyIG90PXtsYXRMbmdUb1BvaW50OmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQ9dGhpcy5wcm9qZWN0aW9uLnByb2plY3QodCksZT10aGlzLnNjYWxlKGUpLHRoaXMudHJhbnNmb3JtYXRpb24uX3RyYW5zZm9ybSh0LGUpfSxwb2ludFRvTGF0TG5nOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIGU9dGhpcy5zY2FsZShlKSx0PXRoaXMudHJhbnNmb3JtYXRpb24udW50cmFuc2Zvcm0odCxlKSx0aGlzLnByb2plY3Rpb24udW5wcm9qZWN0KHQpfSxwcm9qZWN0OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnByb2plY3Rpb24ucHJvamVjdCh0KX0sdW5wcm9qZWN0OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnByb2plY3Rpb24udW5wcm9qZWN0KHQpfSxzY2FsZTpmdW5jdGlvbih0KXtyZXR1cm4gMjU2Kk1hdGgucG93KDIsdCl9LHpvb206ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGgubG9nKHQvMjU2KS9NYXRoLkxOMn0sZ2V0UHJvamVjdGVkQm91bmRzOmZ1bmN0aW9uKHQpe3ZhciBlO3JldHVybiB0aGlzLmluZmluaXRlP251bGw6KGU9dGhpcy5wcm9qZWN0aW9uLmJvdW5kcyx0PXRoaXMuc2NhbGUodCksbmV3IGYodGhpcy50cmFuc2Zvcm1hdGlvbi50cmFuc2Zvcm0oZS5taW4sdCksdGhpcy50cmFuc2Zvcm1hdGlvbi50cmFuc2Zvcm0oZS5tYXgsdCkpKX0saW5maW5pdGU6ISh2LnByb3RvdHlwZT17ZXF1YWxzOmZ1bmN0aW9uKHQsZSl7cmV0dXJuISF0JiYodD14KHQpLE1hdGgubWF4KE1hdGguYWJzKHRoaXMubGF0LXQubGF0KSxNYXRoLmFicyh0aGlzLmxuZy10LmxuZykpPD0odm9pZCAwPT09ZT8xZS05OmUpKX0sdG9TdHJpbmc6ZnVuY3Rpb24odCl7cmV0dXJuIkxhdExuZygiK2kodGhpcy5sYXQsdCkrIiwgIitpKHRoaXMubG5nLHQpKyIpIn0sZGlzdGFuY2VUbzpmdW5jdGlvbih0KXtyZXR1cm4gc3QuZGlzdGFuY2UodGhpcyx4KHQpKX0sd3JhcDpmdW5jdGlvbigpe3JldHVybiBzdC53cmFwTGF0TG5nKHRoaXMpfSx0b0JvdW5kczpmdW5jdGlvbih0KXt2YXIgZT0odD0xODAqdC80MDA3NTAxNykvTWF0aC5jb3MoTWF0aC5QSS8xODAqdGhpcy5sYXQpO3JldHVybiBnKFt0aGlzLmxhdC10LHRoaXMubG5nLWVdLFt0aGlzLmxhdCt0LHRoaXMubG5nK2VdKX0sY2xvbmU6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IHYodGhpcy5sYXQsdGhpcy5sbmcsdGhpcy5hbHQpfX0pLHdyYXBMYXRMbmc6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy53cmFwTG5nP0godC5sbmcsdGhpcy53cmFwTG5nLCEwKTp0LmxuZztyZXR1cm4gbmV3IHYodGhpcy53cmFwTGF0P0godC5sYXQsdGhpcy53cmFwTGF0LCEwKTp0LmxhdCxlLHQuYWx0KX0sd3JhcExhdExuZ0JvdW5kczpmdW5jdGlvbih0KXt2YXIgZT10LmdldENlbnRlcigpLGk9dGhpcy53cmFwTGF0TG5nKGUpLG49ZS5sYXQtaS5sYXQsZT1lLmxuZy1pLmxuZztyZXR1cm4gMD09biYmMD09ZT90OihpPXQuZ2V0U291dGhXZXN0KCksdD10LmdldE5vcnRoRWFzdCgpLG5ldyBzKG5ldyB2KGkubGF0LW4saS5sbmctZSksbmV3IHYodC5sYXQtbix0LmxuZy1lKSkpfX0sc3Q9bCh7fSxvdCx7d3JhcExuZzpbLTE4MCwxODBdLFI6NjM3MWUzLGRpc3RhbmNlOmZ1bmN0aW9uKHQsZSl7dmFyIGk9TWF0aC5QSS8xODAsbj10LmxhdCppLG89ZS5sYXQqaSxzPU1hdGguc2luKChlLmxhdC10LmxhdCkqaS8yKSxlPU1hdGguc2luKChlLmxuZy10LmxuZykqaS8yKSx0PXMqcytNYXRoLmNvcyhuKSpNYXRoLmNvcyhvKSplKmUsaT0yKk1hdGguYXRhbjIoTWF0aC5zcXJ0KHQpLE1hdGguc3FydCgxLXQpKTtyZXR1cm4gdGhpcy5SKml9fSkscnQ9e1I6cnQ9NjM3ODEzNyxNQVhfTEFUSVRVREU6ODUuMDUxMTI4Nzc5OCxwcm9qZWN0OmZ1bmN0aW9uKHQpe3ZhciBlPU1hdGguUEkvMTgwLGk9dGhpcy5NQVhfTEFUSVRVREUsaT1NYXRoLm1heChNYXRoLm1pbihpLHQubGF0KSwtaSksaT1NYXRoLnNpbihpKmUpO3JldHVybiBuZXcgcCh0aGlzLlIqdC5sbmcqZSx0aGlzLlIqTWF0aC5sb2coKDEraSkvKDEtaSkpLzIpfSx1bnByb2plY3Q6ZnVuY3Rpb24odCl7dmFyIGU9MTgwL01hdGguUEk7cmV0dXJuIG5ldyB2KCgyKk1hdGguYXRhbihNYXRoLmV4cCh0LnkvdGhpcy5SKSktTWF0aC5QSS8yKSplLHQueCplL3RoaXMuUil9LGJvdW5kczpuZXcgZihbLShydCo9TWF0aC5QSSksLXJ0XSxbcnQscnRdKX07ZnVuY3Rpb24gYXQodCxlLGksbil7dSh0KT8odGhpcy5fYT10WzBdLHRoaXMuX2I9dFsxXSx0aGlzLl9jPXRbMl0sdGhpcy5fZD10WzNdKToodGhpcy5fYT10LHRoaXMuX2I9ZSx0aGlzLl9jPWksdGhpcy5fZD1uKX1mdW5jdGlvbiBodCh0LGUsaSxuKXtyZXR1cm4gbmV3IGF0KHQsZSxpLG4pfWF0LnByb3RvdHlwZT17dHJhbnNmb3JtOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuX3RyYW5zZm9ybSh0LmNsb25lKCksZSl9LF90cmFuc2Zvcm06ZnVuY3Rpb24odCxlKXtyZXR1cm4gdC54PShlPWV8fDEpKih0aGlzLl9hKnQueCt0aGlzLl9iKSx0Lnk9ZSoodGhpcy5fYyp0LnkrdGhpcy5fZCksdH0sdW50cmFuc2Zvcm06ZnVuY3Rpb24odCxlKXtyZXR1cm4gbmV3IHAoKHQueC8oZT1lfHwxKS10aGlzLl9iKS90aGlzLl9hLCh0LnkvZS10aGlzLl9kKS90aGlzLl9jKX19O3ZhciBsdD1sKHt9LHN0LHtjb2RlOiJFUFNHOjM4NTciLHByb2plY3Rpb246cnQsdHJhbnNmb3JtYXRpb246aHQobHQ9LjUvKE1hdGguUEkqcnQuUiksLjUsLWx0LC41KX0pLHV0PWwoe30sbHQse2NvZGU6IkVQU0c6OTAwOTEzIn0pO2Z1bmN0aW9uIGN0KHQpe3JldHVybiBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIix0KX1mdW5jdGlvbiBkdCh0LGUpe2Zvcih2YXIgaSxuLG8scyxyPSIiLGE9MCxoPXQubGVuZ3RoO2E8aDthKyspe2ZvcihpPTAsbj0obz10W2FdKS5sZW5ndGg7aTxuO2krKylyKz0oaT8iTCI6Ik0iKSsocz1vW2ldKS54KyIgIitzLnk7cis9ZT9iLnN2Zz8ieiI6IngiOiIifXJldHVybiByfHwiTTAgMCJ9dmFyIF90PWRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZSxwdD0oTWU9IkFjdGl2ZVhPYmplY3QiaW4gd2luZG93KSYmIWRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIsbj0ibXNMYXVuY2hVcmkiaW4gbmF2aWdhdG9yJiYhKCJkb2N1bWVudE1vZGUiaW4gZG9jdW1lbnQpLG10PXcoIndlYmtpdCIpLGZ0PXcoImFuZHJvaWQiKSxndD13KCJhbmRyb2lkIDIiKXx8dygiYW5kcm9pZCAzIiksdnQ9cGFyc2VJbnQoL1dlYktpdFwvKFswLTldKyl8JC8uZXhlYyhuYXZpZ2F0b3IudXNlckFnZW50KVsxXSwxMCksdnQ9ZnQmJncoIkdvb2dsZSIpJiZ2dDw1MzcmJiEoIkF1ZGlvTm9kZSJpbiB3aW5kb3cpLHl0PSEhd2luZG93Lm9wZXJhLHh0PSFuJiZ3KCJjaHJvbWUiKSx3dD13KCJnZWNrbyIpJiYhbXQmJiF5dCYmIU1lLGJ0PSF4dCYmdygic2FmYXJpIiksUHQ9dygicGhhbnRvbSIpLG89Ik9UcmFuc2l0aW9uImluIF90LEx0PTA9PT1uYXZpZ2F0b3IucGxhdGZvcm0uaW5kZXhPZigiV2luIiksVHQ9TWUmJiJ0cmFuc2l0aW9uImluIF90LE10PSJXZWJLaXRDU1NNYXRyaXgiaW4gd2luZG93JiYibTExImluIG5ldyB3aW5kb3cuV2ViS2l0Q1NTTWF0cml4JiYhZ3QsX3Q9Ik1velBlcnNwZWN0aXZlImluIF90LHp0PSF3aW5kb3cuTF9ESVNBQkxFXzNEJiYoVHR8fE10fHxfdCkmJiFvJiYhUHQsQ3Q9KEdpPSJ1bmRlZmluZWQiIT10eXBlb2Ygb3JpZW50YXRpb258fHcoIm1vYmlsZSIpKSYmbXQsWnQ9R2kmJk10LFN0PSF3aW5kb3cuUG9pbnRlckV2ZW50JiZ3aW5kb3cuTVNQb2ludGVyRXZlbnQsRXQ9ISghd2luZG93LlBvaW50ZXJFdmVudCYmIVN0KSxrdD0ib250b3VjaHN0YXJ0ImluIHdpbmRvd3x8ISF3aW5kb3cuVG91Y2hFdmVudCxPdD0hd2luZG93LkxfTk9fVE9VQ0gmJihrdHx8RXQpLEF0PUdpJiZ5dCxCdD1HaSYmd3QsSXQ9MTwod2luZG93LmRldmljZVBpeGVsUmF0aW98fHdpbmRvdy5zY3JlZW4uZGV2aWNlWERQSS93aW5kb3cuc2NyZWVuLmxvZ2ljYWxYRFBJKSxSdD1mdW5jdGlvbigpe3ZhciB0PSExO3RyeXt2YXIgZT1PYmplY3QuZGVmaW5lUHJvcGVydHkoe30sInBhc3NpdmUiLHtnZXQ6ZnVuY3Rpb24oKXt0PSEwfX0pO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0ZXN0UGFzc2l2ZUV2ZW50U3VwcG9ydCIsXyxlKSx3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidGVzdFBhc3NpdmVFdmVudFN1cHBvcnQiLF8sZSl9Y2F0Y2godCl7fXJldHVybiB0fSgpLE50PSEhZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiY2FudmFzIikuZ2V0Q29udGV4dCxEdD0hKCFkb2N1bWVudC5jcmVhdGVFbGVtZW50TlN8fCFjdCgic3ZnIikuY3JlYXRlU1ZHUmVjdCksanQ9ISFEdCYmKChqdD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSkuaW5uZXJIVE1MPSI8c3ZnLz4iLCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI9PT0oanQuZmlyc3RDaGlsZCYmanQuZmlyc3RDaGlsZC5uYW1lc3BhY2VVUkkpKTtmdW5jdGlvbiB3KHQpe3JldHVybiAwPD1uYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCkuaW5kZXhPZih0KX12YXIgYj17aWU6TWUsaWVsdDk6cHQsZWRnZTpuLHdlYmtpdDptdCxhbmRyb2lkOmZ0LGFuZHJvaWQyMzpndCxhbmRyb2lkU3RvY2s6dnQsb3BlcmE6eXQsY2hyb21lOnh0LGdlY2tvOnd0LHNhZmFyaTpidCxwaGFudG9tOlB0LG9wZXJhMTI6byx3aW46THQsaWUzZDpUdCx3ZWJraXQzZDpNdCxnZWNrbzNkOl90LGFueTNkOnp0LG1vYmlsZTpHaSxtb2JpbGVXZWJraXQ6Q3QsbW9iaWxlV2Via2l0M2Q6WnQsbXNQb2ludGVyOlN0LHBvaW50ZXI6RXQsdG91Y2g6T3QsdG91Y2hOYXRpdmU6a3QsbW9iaWxlT3BlcmE6QXQsbW9iaWxlR2Vja286QnQscmV0aW5hOkl0LHBhc3NpdmVFdmVudHM6UnQsY2FudmFzOk50LHN2ZzpEdCx2bWw6IUR0JiZmdW5jdGlvbigpe3RyeXt2YXIgdD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxlPSh0LmlubmVySFRNTD0nPHY6c2hhcGUgYWRqPSIxIi8+Jyx0LmZpcnN0Q2hpbGQpO3JldHVybiBlLnN0eWxlLmJlaGF2aW9yPSJ1cmwoI2RlZmF1bHQjVk1MKSIsZSYmIm9iamVjdCI9PXR5cGVvZiBlLmFkan1jYXRjaCh0KXtyZXR1cm4hMX19KCksaW5saW5lU3ZnOmp0LG1hYzowPT09bmF2aWdhdG9yLnBsYXRmb3JtLmluZGV4T2YoIk1hYyIpLGxpbnV4OjA9PT1uYXZpZ2F0b3IucGxhdGZvcm0uaW5kZXhPZigiTGludXgiKX0sSHQ9Yi5tc1BvaW50ZXI\/Ik1TUG9pbnRlckRvd24iOiJwb2ludGVyZG93biIsV3Q9Yi5tc1BvaW50ZXI\/Ik1TUG9pbnRlck1vdmUiOiJwb2ludGVybW92ZSIsRnQ9Yi5tc1BvaW50ZXI\/Ik1TUG9pbnRlclVwIjoicG9pbnRlcnVwIixVdD1iLm1zUG9pbnRlcj8iTVNQb2ludGVyQ2FuY2VsIjoicG9pbnRlcmNhbmNlbCIsVnQ9e3RvdWNoc3RhcnQ6SHQsdG91Y2htb3ZlOld0LHRvdWNoZW5kOkZ0LHRvdWNoY2FuY2VsOlV0fSxxdD17dG91Y2hzdGFydDpmdW5jdGlvbih0LGUpe2UuTVNQT0lOVEVSX1RZUEVfVE9VQ0gmJmUucG9pbnRlclR5cGU9PT1lLk1TUE9JTlRFUl9UWVBFX1RPVUNIJiZPKGUpLCR0KHQsZSl9LHRvdWNobW92ZTokdCx0b3VjaGVuZDokdCx0b3VjaGNhbmNlbDokdH0sR3Q9e30sS3Q9ITE7ZnVuY3Rpb24gWXQodCl7R3RbdC5wb2ludGVySWRdPXR9ZnVuY3Rpb24gWHQodCl7R3RbdC5wb2ludGVySWRdJiYoR3RbdC5wb2ludGVySWRdPXQpfWZ1bmN0aW9uIEp0KHQpe2RlbGV0ZSBHdFt0LnBvaW50ZXJJZF19ZnVuY3Rpb24gJHQodCxlKXtpZihlLnBvaW50ZXJUeXBlIT09KGUuTVNQT0lOVEVSX1RZUEVfTU9VU0V8fCJtb3VzZSIpKXtmb3IodmFyIGkgaW4gZS50b3VjaGVzPVtdLEd0KWUudG91Y2hlcy5wdXNoKEd0W2ldKTtlLmNoYW5nZWRUb3VjaGVzPVtlXSx0KGUpfX12YXIgUXQ9MjAwO3ZhciB0ZSxlZSxpZSxuZSxvZSxzZT1mZShbInRyYW5zZm9ybSIsIndlYmtpdFRyYW5zZm9ybSIsIk9UcmFuc2Zvcm0iLCJNb3pUcmFuc2Zvcm0iLCJtc1RyYW5zZm9ybSJdKSxyZT1mZShbIndlYmtpdFRyYW5zaXRpb24iLCJ0cmFuc2l0aW9uIiwiT1RyYW5zaXRpb24iLCJNb3pUcmFuc2l0aW9uIiwibXNUcmFuc2l0aW9uIl0pLGFlPSJ3ZWJraXRUcmFuc2l0aW9uIj09PXJlfHwiT1RyYW5zaXRpb24iPT09cmU\/cmUrIkVuZCI6InRyYW5zaXRpb25lbmQiO2Z1bmN0aW9uIGhlKHQpe3JldHVybiJzdHJpbmciPT10eXBlb2YgdD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0KTp0fWZ1bmN0aW9uIGxlKHQsZSl7dmFyIGk9dC5zdHlsZVtlXXx8dC5jdXJyZW50U3R5bGUmJnQuY3VycmVudFN0eWxlW2VdO3JldHVybiJhdXRvIj09PShpPWkmJiJhdXRvIiE9PWl8fCFkb2N1bWVudC5kZWZhdWx0Vmlldz9pOih0PWRvY3VtZW50LmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUodCxudWxsKSk\/dFtlXTpudWxsKT9udWxsOml9ZnVuY3Rpb24gUCh0LGUsaSl7cmV0dXJuKHQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0KSkuY2xhc3NOYW1lPWV8fCIiLGkmJmkuYXBwZW5kQ2hpbGQodCksdH1mdW5jdGlvbiBUKHQpe3ZhciBlPXQucGFyZW50Tm9kZTtlJiZlLnJlbW92ZUNoaWxkKHQpfWZ1bmN0aW9uIHVlKHQpe2Zvcig7dC5maXJzdENoaWxkOyl0LnJlbW92ZUNoaWxkKHQuZmlyc3RDaGlsZCl9ZnVuY3Rpb24gY2UodCl7dmFyIGU9dC5wYXJlbnROb2RlO2UmJmUubGFzdENoaWxkIT09dCYmZS5hcHBlbmRDaGlsZCh0KX1mdW5jdGlvbiBkZSh0KXt2YXIgZT10LnBhcmVudE5vZGU7ZSYmZS5maXJzdENoaWxkIT09dCYmZS5pbnNlcnRCZWZvcmUodCxlLmZpcnN0Q2hpbGQpfWZ1bmN0aW9uIF9lKHQsZSl7cmV0dXJuIHZvaWQgMCE9PXQuY2xhc3NMaXN0P3QuY2xhc3NMaXN0LmNvbnRhaW5zKGUpOjA8KHQ9bWUodCkpLmxlbmd0aCYmbmV3IFJlZ0V4cCgiKF58XFxzKSIrZSsiKFxcc3wkKSIpLnRlc3QodCl9ZnVuY3Rpb24gTSh0LGUpe3ZhciBpO2lmKHZvaWQgMCE9PXQuY2xhc3NMaXN0KWZvcih2YXIgbj1GKGUpLG89MCxzPW4ubGVuZ3RoO288cztvKyspdC5jbGFzc0xpc3QuYWRkKG5bb10pO2Vsc2UgX2UodCxlKXx8cGUodCwoKGk9bWUodCkpP2krIiAiOiIiKStlKX1mdW5jdGlvbiB6KHQsZSl7dm9pZCAwIT09dC5jbGFzc0xpc3Q\/dC5jbGFzc0xpc3QucmVtb3ZlKGUpOnBlKHQsVygoIiAiK21lKHQpKyIgIikucmVwbGFjZSgiICIrZSsiICIsIiAiKSkpfWZ1bmN0aW9uIHBlKHQsZSl7dm9pZCAwPT09dC5jbGFzc05hbWUuYmFzZVZhbD90LmNsYXNzTmFtZT1lOnQuY2xhc3NOYW1lLmJhc2VWYWw9ZX1mdW5jdGlvbiBtZSh0KXtyZXR1cm4gdm9pZCAwPT09KHQ9dC5jb3JyZXNwb25kaW5nRWxlbWVudHx8dCkuY2xhc3NOYW1lLmJhc2VWYWw\/dC5jbGFzc05hbWU6dC5jbGFzc05hbWUuYmFzZVZhbH1mdW5jdGlvbiBDKHQsZSl7aWYoIm9wYWNpdHkiaW4gdC5zdHlsZSl0LnN0eWxlLm9wYWNpdHk9ZTtlbHNlIGlmKCJmaWx0ZXIiaW4gdC5zdHlsZSl7dmFyIGk9ITEsbj0iRFhJbWFnZVRyYW5zZm9ybS5NaWNyb3NvZnQuQWxwaGEiO3RyeXtpPXQuZmlsdGVycy5pdGVtKG4pfWNhdGNoKHQpe2lmKDE9PT1lKXJldHVybn1lPU1hdGgucm91bmQoMTAwKmUpLGk\/KGkuRW5hYmxlZD0xMDAhPT1lLGkuT3BhY2l0eT1lKTp0LnN0eWxlLmZpbHRlcis9IiBwcm9naWQ6IituKyIob3BhY2l0eT0iK2UrIikifX1mdW5jdGlvbiBmZSh0KXtmb3IodmFyIGU9ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlLGk9MDtpPHQubGVuZ3RoO2krKylpZih0W2ldaW4gZSlyZXR1cm4gdFtpXTtyZXR1cm4hMX1mdW5jdGlvbiBnZSh0LGUsaSl7ZT1lfHxuZXcgcCgwLDApLHQuc3R5bGVbc2VdPShiLmllM2Q\/InRyYW5zbGF0ZSgiK2UueCsicHgsIitlLnkrInB4KSI6InRyYW5zbGF0ZTNkKCIrZS54KyJweCwiK2UueSsicHgsMCkiKSsoaT8iIHNjYWxlKCIraSsiKSI6IiIpfWZ1bmN0aW9uIFoodCxlKXt0Ll9sZWFmbGV0X3Bvcz1lLGIuYW55M2Q\/Z2UodCxlKToodC5zdHlsZS5sZWZ0PWUueCsicHgiLHQuc3R5bGUudG9wPWUueSsicHgiKX1mdW5jdGlvbiB2ZSh0KXtyZXR1cm4gdC5fbGVhZmxldF9wb3N8fG5ldyBwKDAsMCl9ZnVuY3Rpb24geWUoKXtTKHdpbmRvdywiZHJhZ3N0YXJ0IixPKX1mdW5jdGlvbiB4ZSgpe2sod2luZG93LCJkcmFnc3RhcnQiLE8pfWZ1bmN0aW9uIHdlKHQpe2Zvcig7LTE9PT10LnRhYkluZGV4Oyl0PXQucGFyZW50Tm9kZTt0LnN0eWxlJiYoYmUoKSxvZT0obmU9dCkuc3R5bGUub3V0bGluZVN0eWxlLHQuc3R5bGUub3V0bGluZVN0eWxlPSJub25lIixTKHdpbmRvdywia2V5ZG93biIsYmUpKX1mdW5jdGlvbiBiZSgpe25lJiYobmUuc3R5bGUub3V0bGluZVN0eWxlPW9lLG9lPW5lPXZvaWQgMCxrKHdpbmRvdywia2V5ZG93biIsYmUpKX1mdW5jdGlvbiBQZSh0KXtmb3IoOyEoKHQ9dC5wYXJlbnROb2RlKS5vZmZzZXRXaWR0aCYmdC5vZmZzZXRIZWlnaHR8fHQ9PT1kb2N1bWVudC5ib2R5KTspO3JldHVybiB0fWZ1bmN0aW9uIExlKHQpe3ZhciBlPXQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7cmV0dXJue3g6ZS53aWR0aC90Lm9mZnNldFdpZHRofHwxLHk6ZS5oZWlnaHQvdC5vZmZzZXRIZWlnaHR8fDEsYm91bmRpbmdDbGllbnRSZWN0OmV9fWZ1bmN0aW9uIFModCxlLGksbil7aWYoZSYmIm9iamVjdCI9PXR5cGVvZiBlKWZvcih2YXIgbyBpbiBlKVplKHQsbyxlW29dLGkpO2Vsc2UgZm9yKHZhciBzPTAscj0oZT1GKGUpKS5sZW5ndGg7czxyO3MrKylaZSh0LGVbc10saSxuKTtyZXR1cm4gdGhpc312YXIgVGU9Im9uc2VsZWN0c3RhcnQiaW4gZG9jdW1lbnQ\/KGllPWZ1bmN0aW9uKCl7Uyh3aW5kb3csInNlbGVjdHN0YXJ0IixPKX0sZnVuY3Rpb24oKXtrKHdpbmRvdywic2VsZWN0c3RhcnQiLE8pfSk6KGVlPWZlKFsidXNlclNlbGVjdCIsIldlYmtpdFVzZXJTZWxlY3QiLCJPVXNlclNlbGVjdCIsIk1velVzZXJTZWxlY3QiLCJtc1VzZXJTZWxlY3QiXSksaWU9ZnVuY3Rpb24oKXt2YXIgdDtlZSYmKHQ9ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlLHRlPXRbZWVdLHRbZWVdPSJub25lIil9LGZ1bmN0aW9uKCl7ZWUmJihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGVbZWVdPXRlLHRlPXZvaWQgMCl9KSxNZT17X19wcm90b19fOm51bGwsVFJBTlNGT1JNOnNlLFRSQU5TSVRJT046cmUsVFJBTlNJVElPTl9FTkQ6YWUsZ2V0OmhlLGdldFN0eWxlOmxlLGNyZWF0ZTpQLHJlbW92ZTpULGVtcHR5OnVlLHRvRnJvbnQ6Y2UsdG9CYWNrOmRlLGhhc0NsYXNzOl9lLGFkZENsYXNzOk0scmVtb3ZlQ2xhc3M6eixzZXRDbGFzczpwZSxnZXRDbGFzczptZSxzZXRPcGFjaXR5OkMsdGVzdFByb3A6ZmUsc2V0VHJhbnNmb3JtOmdlLHNldFBvc2l0aW9uOlosZ2V0UG9zaXRpb246dmUsZ2V0IGRpc2FibGVUZXh0U2VsZWN0aW9uKCl7cmV0dXJuIGllfSxnZXQgZW5hYmxlVGV4dFNlbGVjdGlvbigpe3JldHVybiBUZX0sZGlzYWJsZUltYWdlRHJhZzp5ZSxlbmFibGVJbWFnZURyYWc6eGUscHJldmVudE91dGxpbmU6d2UscmVzdG9yZU91dGxpbmU6YmUsZ2V0U2l6ZWRQYXJlbnROb2RlOlBlLGdldFNjYWxlOkxlfSxFPSJfbGVhZmxldF9ldmVudHMiO2Z1bmN0aW9uIGsodCxlLGksbil7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpemUodCksZGVsZXRlIHRbRV07ZWxzZSBpZihlJiYib2JqZWN0Ij09dHlwZW9mIGUpZm9yKHZhciBvIGluIGUpU2UodCxvLGVbb10saSk7ZWxzZSBpZihlPUYoZSksMj09PWFyZ3VtZW50cy5sZW5ndGgpemUodCxmdW5jdGlvbih0KXtyZXR1cm4tMSE9PUcoZSx0KX0pO2Vsc2UgZm9yKHZhciBzPTAscj1lLmxlbmd0aDtzPHI7cysrKVNlKHQsZVtzXSxpLG4pO3JldHVybiB0aGlzfWZ1bmN0aW9uIHplKHQsZSl7Zm9yKHZhciBpIGluIHRbRV0pe3ZhciBuPWkuc3BsaXQoL1xkLylbMF07ZSYmIWUobil8fFNlKHQsbixudWxsLG51bGwsaSl9fXZhciBDZT17bW91c2VlbnRlcjoibW91c2VvdmVyIixtb3VzZWxlYXZlOiJtb3VzZW91dCIsd2hlZWw6ISgib253aGVlbCJpbiB3aW5kb3cpJiYibW91c2V3aGVlbCJ9O2Z1bmN0aW9uIFplKGUsdCxpLG4pe3ZhciBvLHMscixhLGgsbCx1PXQrZChpKSsobj8iXyIrZChuKToiIik7ZnVuY3Rpb24gYyh0KXt2YXIgZTsxIT09dC5kZXRhaWw\/aD10LmRldGFpbDoibW91c2UiPT09dC5wb2ludGVyVHlwZXx8dC5zb3VyY2VDYXBhYmlsaXRpZXMmJiF0LnNvdXJjZUNhcGFiaWxpdGllcy5maXJlc1RvdWNoRXZlbnRzfHwoZT1CZSh0KSkuc29tZShmdW5jdGlvbih0KXtyZXR1cm4gdCBpbnN0YW5jZW9mIEhUTUxMYWJlbEVsZW1lbnQmJnQuYXR0cmlidXRlcy5mb3J9KSYmIWUuc29tZShmdW5jdGlvbih0KXtyZXR1cm4gdCBpbnN0YW5jZW9mIEhUTUxJbnB1dEVsZW1lbnR8fHQgaW5zdGFuY2VvZiBIVE1MU2VsZWN0RWxlbWVudH0pfHwoKGU9RGF0ZS5ub3coKSktbDw9UXQ\/Mj09KytoJiZhKGZ1bmN0aW9uKHQpe3ZhciBlLGksbj17fTtmb3IoaSBpbiB0KWU9dFtpXSxuW2ldPWUmJmUuYmluZD9lLmJpbmQodCk6ZTtyZXR1cm4odD1uKS50eXBlPSJkYmxjbGljayIsbi5kZXRhaWw9MixuLmlzVHJ1c3RlZD0hMSxuLl9zaW11bGF0ZWQ9ITAsbn0odCkpOmg9MSxsPWUpfWVbRV0mJmVbRV1bdV18fChzPW89ZnVuY3Rpb24odCl7cmV0dXJuIGkuY2FsbChufHxlLHR8fHdpbmRvdy5ldmVudCl9LCFiLnRvdWNoTmF0aXZlJiZiLnBvaW50ZXImJjA9PT10LmluZGV4T2YoInRvdWNoIik\/bz1mdW5jdGlvbih0LGUsaSl7cmV0dXJuInRvdWNoc3RhcnQiIT09ZXx8S3R8fChkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKEh0LFl0LCEwKSxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFd0LFh0LCEwKSxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKEZ0LEp0LCEwKSxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFV0LEp0LCEwKSxLdD0hMCkscXRbZV0\/KGk9cXRbZV0uYmluZCh0aGlzLGkpLHQuYWRkRXZlbnRMaXN0ZW5lcihWdFtlXSxpLCExKSxpKTooY29uc29sZS53YXJuKCJ3cm9uZyBldmVudCBzcGVjaWZpZWQ6IixlKSxfKX0oZSx0LG8pOmIudG91Y2gmJiJkYmxjbGljayI9PT10PyhhPW8sKHI9ZSkuYWRkRXZlbnRMaXN0ZW5lcigiZGJsY2xpY2siLGEpLGw9MCxyLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixjKSxvPXtkYmxjbGljazphLHNpbURibGNsaWNrOmN9KToiYWRkRXZlbnRMaXN0ZW5lciJpbiBlPyJ0b3VjaHN0YXJ0Ij09PXR8fCJ0b3VjaG1vdmUiPT09dHx8IndoZWVsIj09PXR8fCJtb3VzZXdoZWVsIj09PXQ\/ZS5hZGRFdmVudExpc3RlbmVyKENlW3RdfHx0LG8sISFiLnBhc3NpdmVFdmVudHMmJntwYXNzaXZlOiExfSk6Im1vdXNlZW50ZXIiPT09dHx8Im1vdXNlbGVhdmUiPT09dD9lLmFkZEV2ZW50TGlzdGVuZXIoQ2VbdF0sbz1mdW5jdGlvbih0KXt0PXR8fHdpbmRvdy5ldmVudCxEZShlLHQpJiZzKHQpfSwhMSk6ZS5hZGRFdmVudExpc3RlbmVyKHQscywhMSk6ZS5hdHRhY2hFdmVudCgib24iK3QsbyksZVtFXT1lW0VdfHx7fSxlW0VdW3VdPW8pfWZ1bmN0aW9uIFNlKHQsZSxpLG4sbyl7dmFyIHMscjtvPW98fGUrZChpKSsobj8iXyIrZChuKToiIiksKGk9dFtFXSYmdFtFXVtvXSkmJighYi50b3VjaE5hdGl2ZSYmYi5wb2ludGVyJiYwPT09ZS5pbmRleE9mKCJ0b3VjaCIpPyhuPXQscj1pLFZ0W3M9ZV0\/bi5yZW1vdmVFdmVudExpc3RlbmVyKFZ0W3NdLHIsITEpOmNvbnNvbGUud2Fybigid3JvbmcgZXZlbnQgc3BlY2lmaWVkOiIscykpOmIudG91Y2gmJiJkYmxjbGljayI9PT1lPygocj10KS5yZW1vdmVFdmVudExpc3RlbmVyKCJkYmxjbGljayIsKG49aSkuZGJsY2xpY2spLHIucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY2xpY2siLG4uc2ltRGJsY2xpY2spKToicmVtb3ZlRXZlbnRMaXN0ZW5lciJpbiB0P3QucmVtb3ZlRXZlbnRMaXN0ZW5lcihDZVtlXXx8ZSxpLCExKTp0LmRldGFjaEV2ZW50KCJvbiIrZSxpKSx0W0VdW29dPW51bGwpfWZ1bmN0aW9uIEVlKHQpe3JldHVybiB0LnN0b3BQcm9wYWdhdGlvbj90LnN0b3BQcm9wYWdhdGlvbigpOnQub3JpZ2luYWxFdmVudD90Lm9yaWdpbmFsRXZlbnQuX3N0b3BwZWQ9ITA6dC5jYW5jZWxCdWJibGU9ITAsdGhpc31mdW5jdGlvbiBrZSh0KXtyZXR1cm4gWmUodCwid2hlZWwiLEVlKSx0aGlzfWZ1bmN0aW9uIE9lKHQpe3JldHVybiBTKHQsIm1vdXNlZG93biB0b3VjaHN0YXJ0IGRibGNsaWNrIGNvbnRleHRtZW51IixFZSksdC5fbGVhZmxldF9kaXNhYmxlX2NsaWNrPSEwLHRoaXN9ZnVuY3Rpb24gTyh0KXtyZXR1cm4gdC5wcmV2ZW50RGVmYXVsdD90LnByZXZlbnREZWZhdWx0KCk6dC5yZXR1cm5WYWx1ZT0hMSx0aGlzfWZ1bmN0aW9uIEFlKHQpe3JldHVybiBPKHQpLEVlKHQpLHRoaXN9ZnVuY3Rpb24gQmUodCl7aWYodC5jb21wb3NlZFBhdGgpcmV0dXJuIHQuY29tcG9zZWRQYXRoKCk7Zm9yKHZhciBlPVtdLGk9dC50YXJnZXQ7aTspZS5wdXNoKGkpLGk9aS5wYXJlbnROb2RlO3JldHVybiBlfWZ1bmN0aW9uIEllKHQsZSl7dmFyIGksbjtyZXR1cm4gZT8obj0oaT1MZShlKSkuYm91bmRpbmdDbGllbnRSZWN0LG5ldyBwKCh0LmNsaWVudFgtbi5sZWZ0KS9pLngtZS5jbGllbnRMZWZ0LCh0LmNsaWVudFktbi50b3ApL2kueS1lLmNsaWVudFRvcCkpOm5ldyBwKHQuY2xpZW50WCx0LmNsaWVudFkpfXZhciBSZT1iLmxpbnV4JiZiLmNocm9tZT93aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbzpiLm1hYz8zKndpbmRvdy5kZXZpY2VQaXhlbFJhdGlvOjA8d2luZG93LmRldmljZVBpeGVsUmF0aW8\/Mip3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbzoxO2Z1bmN0aW9uIE5lKHQpe3JldHVybiBiLmVkZ2U\/dC53aGVlbERlbHRhWS8yOnQuZGVsdGFZJiYwPT09dC5kZWx0YU1vZGU\/LXQuZGVsdGFZL1JlOnQuZGVsdGFZJiYxPT09dC5kZWx0YU1vZGU\/MjAqLXQuZGVsdGFZOnQuZGVsdGFZJiYyPT09dC5kZWx0YU1vZGU\/NjAqLXQuZGVsdGFZOnQuZGVsdGFYfHx0LmRlbHRhWj8wOnQud2hlZWxEZWx0YT8odC53aGVlbERlbHRhWXx8dC53aGVlbERlbHRhKS8yOnQuZGV0YWlsJiZNYXRoLmFicyh0LmRldGFpbCk8MzI3NjU\/MjAqLXQuZGV0YWlsOnQuZGV0YWlsP3QuZGV0YWlsLy0zMjc2NSo2MDowfWZ1bmN0aW9uIERlKHQsZSl7dmFyIGk9ZS5yZWxhdGVkVGFyZ2V0O2lmKCFpKXJldHVybiEwO3RyeXtmb3IoO2kmJmkhPT10OylpPWkucGFyZW50Tm9kZX1jYXRjaCh0KXtyZXR1cm4hMX1yZXR1cm4gaSE9PXR9dmFyIHB0PXtfX3Byb3RvX186bnVsbCxvbjpTLG9mZjprLHN0b3BQcm9wYWdhdGlvbjpFZSxkaXNhYmxlU2Nyb2xsUHJvcGFnYXRpb246a2UsZGlzYWJsZUNsaWNrUHJvcGFnYXRpb246T2UscHJldmVudERlZmF1bHQ6TyxzdG9wOkFlLGdldFByb3BhZ2F0aW9uUGF0aDpCZSxnZXRNb3VzZVBvc2l0aW9uOkllLGdldFdoZWVsRGVsdGE6TmUsaXNFeHRlcm5hbFRhcmdldDpEZSxhZGRMaXN0ZW5lcjpTLHJlbW92ZUxpc3RlbmVyOmt9LGplPWl0LmV4dGVuZCh7cnVuOmZ1bmN0aW9uKHQsZSxpLG4pe3RoaXMuc3RvcCgpLHRoaXMuX2VsPXQsdGhpcy5faW5Qcm9ncmVzcz0hMCx0aGlzLl9kdXJhdGlvbj1pfHwuMjUsdGhpcy5fZWFzZU91dFBvd2VyPTEvTWF0aC5tYXgobnx8LjUsLjIpLHRoaXMuX3N0YXJ0UG9zPXZlKHQpLHRoaXMuX29mZnNldD1lLnN1YnRyYWN0KHRoaXMuX3N0YXJ0UG9zKSx0aGlzLl9zdGFydFRpbWU9K25ldyBEYXRlLHRoaXMuZmlyZSgic3RhcnQiKSx0aGlzLl9hbmltYXRlKCl9LHN0b3A6ZnVuY3Rpb24oKXt0aGlzLl9pblByb2dyZXNzJiYodGhpcy5fc3RlcCghMCksdGhpcy5fY29tcGxldGUoKSl9LF9hbmltYXRlOmZ1bmN0aW9uKCl7dGhpcy5fYW5pbUlkPXkodGhpcy5fYW5pbWF0ZSx0aGlzKSx0aGlzLl9zdGVwKCl9LF9zdGVwOmZ1bmN0aW9uKHQpe3ZhciBlPStuZXcgRGF0ZS10aGlzLl9zdGFydFRpbWUsaT0xZTMqdGhpcy5fZHVyYXRpb247ZTxpP3RoaXMuX3J1bkZyYW1lKHRoaXMuX2Vhc2VPdXQoZS9pKSx0KToodGhpcy5fcnVuRnJhbWUoMSksdGhpcy5fY29tcGxldGUoKSl9LF9ydW5GcmFtZTpmdW5jdGlvbih0LGUpe3Q9dGhpcy5fc3RhcnRQb3MuYWRkKHRoaXMuX29mZnNldC5tdWx0aXBseUJ5KHQpKSxlJiZ0Ll9yb3VuZCgpLFoodGhpcy5fZWwsdCksdGhpcy5maXJlKCJzdGVwIil9LF9jb21wbGV0ZTpmdW5jdGlvbigpe3IodGhpcy5fYW5pbUlkKSx0aGlzLl9pblByb2dyZXNzPSExLHRoaXMuZmlyZSgiZW5kIil9LF9lYXNlT3V0OmZ1bmN0aW9uKHQpe3JldHVybiAxLU1hdGgucG93KDEtdCx0aGlzLl9lYXNlT3V0UG93ZXIpfX0pLEE9aXQuZXh0ZW5kKHtvcHRpb25zOntjcnM6bHQsY2VudGVyOnZvaWQgMCx6b29tOnZvaWQgMCxtaW5ab29tOnZvaWQgMCxtYXhab29tOnZvaWQgMCxsYXllcnM6W10sbWF4Qm91bmRzOnZvaWQgMCxyZW5kZXJlcjp2b2lkIDAsem9vbUFuaW1hdGlvbjohMCx6b29tQW5pbWF0aW9uVGhyZXNob2xkOjQsZmFkZUFuaW1hdGlvbjohMCxtYXJrZXJab29tQW5pbWF0aW9uOiEwLHRyYW5zZm9ybTNETGltaXQ6ODM4ODYwOCx6b29tU25hcDoxLHpvb21EZWx0YToxLHRyYWNrUmVzaXplOiEwfSxpbml0aWFsaXplOmZ1bmN0aW9uKHQsZSl7ZT1oKHRoaXMsZSksdGhpcy5faGFuZGxlcnM9W10sdGhpcy5fbGF5ZXJzPXt9LHRoaXMuX3pvb21Cb3VuZExheWVycz17fSx0aGlzLl9zaXplQ2hhbmdlZD0hMCx0aGlzLl9pbml0Q29udGFpbmVyKHQpLHRoaXMuX2luaXRMYXlvdXQoKSx0aGlzLl9vblJlc2l6ZT1hKHRoaXMuX29uUmVzaXplLHRoaXMpLHRoaXMuX2luaXRFdmVudHMoKSxlLm1heEJvdW5kcyYmdGhpcy5zZXRNYXhCb3VuZHMoZS5tYXhCb3VuZHMpLHZvaWQgMCE9PWUuem9vbSYmKHRoaXMuX3pvb209dGhpcy5fbGltaXRab29tKGUuem9vbSkpLGUuY2VudGVyJiZ2b2lkIDAhPT1lLnpvb20mJnRoaXMuc2V0Vmlldyh4KGUuY2VudGVyKSxlLnpvb20se3Jlc2V0OiEwfSksdGhpcy5jYWxsSW5pdEhvb2tzKCksdGhpcy5fem9vbUFuaW1hdGVkPXJlJiZiLmFueTNkJiYhYi5tb2JpbGVPcGVyYSYmdGhpcy5vcHRpb25zLnpvb21BbmltYXRpb24sdGhpcy5fem9vbUFuaW1hdGVkJiYodGhpcy5fY3JlYXRlQW5pbVByb3h5KCksUyh0aGlzLl9wcm94eSxhZSx0aGlzLl9jYXRjaFRyYW5zaXRpb25FbmQsdGhpcykpLHRoaXMuX2FkZExheWVycyh0aGlzLm9wdGlvbnMubGF5ZXJzKX0sc2V0VmlldzpmdW5jdGlvbih0LGUsaSl7cmV0dXJuIGU9dm9pZCAwPT09ZT90aGlzLl96b29tOnRoaXMuX2xpbWl0Wm9vbShlKSx0PXRoaXMuX2xpbWl0Q2VudGVyKHgodCksZSx0aGlzLm9wdGlvbnMubWF4Qm91bmRzKSxpPWl8fHt9LHRoaXMuX3N0b3AoKSx0aGlzLl9sb2FkZWQmJiFpLnJlc2V0JiYhMCE9PWkmJih2b2lkIDAhPT1pLmFuaW1hdGUmJihpLnpvb209bCh7YW5pbWF0ZTppLmFuaW1hdGV9LGkuem9vbSksaS5wYW49bCh7YW5pbWF0ZTppLmFuaW1hdGUsZHVyYXRpb246aS5kdXJhdGlvbn0saS5wYW4pKSx0aGlzLl96b29tIT09ZT90aGlzLl90cnlBbmltYXRlZFpvb20mJnRoaXMuX3RyeUFuaW1hdGVkWm9vbSh0LGUsaS56b29tKTp0aGlzLl90cnlBbmltYXRlZFBhbih0LGkucGFuKSk\/Y2xlYXJUaW1lb3V0KHRoaXMuX3NpemVUaW1lcik6dGhpcy5fcmVzZXRWaWV3KHQsZSxpLnBhbiYmaS5wYW4ubm9Nb3ZlU3RhcnQpLHRoaXN9LHNldFpvb206ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5fbG9hZGVkP3RoaXMuc2V0Vmlldyh0aGlzLmdldENlbnRlcigpLHQse3pvb206ZX0pOih0aGlzLl96b29tPXQsdGhpcyl9LHpvb21JbjpmdW5jdGlvbih0LGUpe3JldHVybiB0PXR8fChiLmFueTNkP3RoaXMub3B0aW9ucy56b29tRGVsdGE6MSksdGhpcy5zZXRab29tKHRoaXMuX3pvb20rdCxlKX0sem9vbU91dDpmdW5jdGlvbih0LGUpe3JldHVybiB0PXR8fChiLmFueTNkP3RoaXMub3B0aW9ucy56b29tRGVsdGE6MSksdGhpcy5zZXRab29tKHRoaXMuX3pvb20tdCxlKX0sc2V0Wm9vbUFyb3VuZDpmdW5jdGlvbih0LGUsaSl7dmFyIG49dGhpcy5nZXRab29tU2NhbGUoZSksbz10aGlzLmdldFNpemUoKS5kaXZpZGVCeSgyKSx0PSh0IGluc3RhbmNlb2YgcD90OnRoaXMubGF0TG5nVG9Db250YWluZXJQb2ludCh0KSkuc3VidHJhY3QobykubXVsdGlwbHlCeSgxLTEvbiksbj10aGlzLmNvbnRhaW5lclBvaW50VG9MYXRMbmcoby5hZGQodCkpO3JldHVybiB0aGlzLnNldFZpZXcobixlLHt6b29tOml9KX0sX2dldEJvdW5kc0NlbnRlclpvb206ZnVuY3Rpb24odCxlKXtlPWV8fHt9LHQ9dC5nZXRCb3VuZHM\/dC5nZXRCb3VuZHMoKTpnKHQpO3ZhciBpPW0oZS5wYWRkaW5nVG9wTGVmdHx8ZS5wYWRkaW5nfHxbMCwwXSksbj1tKGUucGFkZGluZ0JvdHRvbVJpZ2h0fHxlLnBhZGRpbmd8fFswLDBdKSxvPXRoaXMuZ2V0Qm91bmRzWm9vbSh0LCExLGkuYWRkKG4pKTtyZXR1cm4obz0ibnVtYmVyIj09dHlwZW9mIGUubWF4Wm9vbT9NYXRoLm1pbihlLm1heFpvb20sbyk6byk9PT0xLzA\/e2NlbnRlcjp0LmdldENlbnRlcigpLHpvb206b306KGU9bi5zdWJ0cmFjdChpKS5kaXZpZGVCeSgyKSxuPXRoaXMucHJvamVjdCh0LmdldFNvdXRoV2VzdCgpLG8pLGk9dGhpcy5wcm9qZWN0KHQuZ2V0Tm9ydGhFYXN0KCksbykse2NlbnRlcjp0aGlzLnVucHJvamVjdChuLmFkZChpKS5kaXZpZGVCeSgyKS5hZGQoZSksbyksem9vbTpvfSl9LGZpdEJvdW5kczpmdW5jdGlvbih0LGUpe2lmKCh0PWcodCkpLmlzVmFsaWQoKSlyZXR1cm4gdD10aGlzLl9nZXRCb3VuZHNDZW50ZXJab29tKHQsZSksdGhpcy5zZXRWaWV3KHQuY2VudGVyLHQuem9vbSxlKTt0aHJvdyBuZXcgRXJyb3IoIkJvdW5kcyBhcmUgbm90IHZhbGlkLiIpfSxmaXRXb3JsZDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5maXRCb3VuZHMoW1stOTAsLTE4MF0sWzkwLDE4MF1dLHQpfSxwYW5UbzpmdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLnNldFZpZXcodCx0aGlzLl96b29tLHtwYW46ZX0pfSxwYW5CeTpmdW5jdGlvbih0LGUpe3ZhciBpO3JldHVybiBlPWV8fHt9LCh0PW0odCkucm91bmQoKSkueHx8dC55PyghMD09PWUuYW5pbWF0ZXx8dGhpcy5nZXRTaXplKCkuY29udGFpbnModCk\/KHRoaXMuX3BhbkFuaW18fCh0aGlzLl9wYW5BbmltPW5ldyBqZSx0aGlzLl9wYW5BbmltLm9uKHtzdGVwOnRoaXMuX29uUGFuVHJhbnNpdGlvblN0ZXAsZW5kOnRoaXMuX29uUGFuVHJhbnNpdGlvbkVuZH0sdGhpcykpLGUubm9Nb3ZlU3RhcnR8fHRoaXMuZmlyZSgibW92ZXN0YXJ0IiksITEhPT1lLmFuaW1hdGU\/KE0odGhpcy5fbWFwUGFuZSwibGVhZmxldC1wYW4tYW5pbSIpLGk9dGhpcy5fZ2V0TWFwUGFuZVBvcygpLnN1YnRyYWN0KHQpLnJvdW5kKCksdGhpcy5fcGFuQW5pbS5ydW4odGhpcy5fbWFwUGFuZSxpLGUuZHVyYXRpb258fC4yNSxlLmVhc2VMaW5lYXJpdHkpKToodGhpcy5fcmF3UGFuQnkodCksdGhpcy5maXJlKCJtb3ZlIikuZmlyZSgibW92ZWVuZCIpKSk6dGhpcy5fcmVzZXRWaWV3KHRoaXMudW5wcm9qZWN0KHRoaXMucHJvamVjdCh0aGlzLmdldENlbnRlcigpKS5hZGQodCkpLHRoaXMuZ2V0Wm9vbSgpKSx0aGlzKTp0aGlzLmZpcmUoIm1vdmVlbmQiKX0sZmx5VG86ZnVuY3Rpb24obyxzLHQpe2lmKCExPT09KHQ9dHx8e30pLmFuaW1hdGV8fCFiLmFueTNkKXJldHVybiB0aGlzLnNldFZpZXcobyxzLHQpO3RoaXMuX3N0b3AoKTt2YXIgcj10aGlzLnByb2plY3QodGhpcy5nZXRDZW50ZXIoKSksYT10aGlzLnByb2plY3QobyksZT10aGlzLmdldFNpemUoKSxoPXRoaXMuX3pvb20sbD0obz14KG8pLHM9dm9pZCAwPT09cz9oOnMsTWF0aC5tYXgoZS54LGUueSkpLGk9bCp0aGlzLmdldFpvb21TY2FsZShoLHMpLHU9YS5kaXN0YW5jZVRvKHIpfHwxLGM9MS40MixkPWMqYztmdW5jdGlvbiBuKHQpe3JldHVybiB0PShpKmktbCpsKyh0Py0xOjEpKmQqZCp1KnUpLygyKih0P2k6bCkqZCp1KSwodD1NYXRoLnNxcnQodCp0KzEpLXQpPDFlLTk\/LTE4Ok1hdGgubG9nKHQpfWZ1bmN0aW9uIF8odCl7cmV0dXJuKE1hdGguZXhwKHQpLU1hdGguZXhwKC10KSkvMn1mdW5jdGlvbiBwKHQpe3JldHVybihNYXRoLmV4cCh0KStNYXRoLmV4cCgtdCkpLzJ9dmFyIG09bigwKTt2YXIgZj1EYXRlLm5vdygpLGc9KG4oMSktbSkvYyx2PXQuZHVyYXRpb24\/MWUzKnQuZHVyYXRpb246MWUzKmcqLjg7cmV0dXJuIHRoaXMuX21vdmVTdGFydCghMCx0Lm5vTW92ZVN0YXJ0KSxmdW5jdGlvbiB0KCl7dmFyIGUsaT0oRGF0ZS5ub3coKS1mKS92LG49KDEtTWF0aC5wb3coMS1pLDEuNSkpKmc7aTw9MT8odGhpcy5fZmx5VG9GcmFtZT15KHQsdGhpcyksdGhpcy5fbW92ZSh0aGlzLnVucHJvamVjdChyLmFkZChhLnN1YnRyYWN0KHIpLm11bHRpcGx5QnkoKGU9bixsKihwKG0pKihfKGU9bStjKmUpL3AoZSkpLV8obSkpL2QvdSkpKSxoKSx0aGlzLmdldFNjYWxlWm9vbShsLyhpPW4sbCoocChtKS9wKG0rYyppKSkpLGgpLHtmbHlUbzohMH0pKTp0aGlzLl9tb3ZlKG8scykuX21vdmVFbmQoITApfS5jYWxsKHRoaXMpLHRoaXN9LGZseVRvQm91bmRzOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQ9dGhpcy5fZ2V0Qm91bmRzQ2VudGVyWm9vbSh0LGUpLHRoaXMuZmx5VG8odC5jZW50ZXIsdC56b29tLGUpfSxzZXRNYXhCb3VuZHM6ZnVuY3Rpb24odCl7cmV0dXJuIHQ9Zyh0KSx0aGlzLmxpc3RlbnMoIm1vdmVlbmQiLHRoaXMuX3Bhbkluc2lkZU1heEJvdW5kcykmJnRoaXMub2ZmKCJtb3ZlZW5kIix0aGlzLl9wYW5JbnNpZGVNYXhCb3VuZHMpLHQuaXNWYWxpZCgpPyh0aGlzLm9wdGlvbnMubWF4Qm91bmRzPXQsdGhpcy5fbG9hZGVkJiZ0aGlzLl9wYW5JbnNpZGVNYXhCb3VuZHMoKSx0aGlzLm9uKCJtb3ZlZW5kIix0aGlzLl9wYW5JbnNpZGVNYXhCb3VuZHMpKToodGhpcy5vcHRpb25zLm1heEJvdW5kcz1udWxsLHRoaXMpfSxzZXRNaW5ab29tOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMub3B0aW9ucy5taW5ab29tO3JldHVybiB0aGlzLm9wdGlvbnMubWluWm9vbT10LHRoaXMuX2xvYWRlZCYmZSE9PXQmJih0aGlzLmZpcmUoInpvb21sZXZlbHNjaGFuZ2UiKSx0aGlzLmdldFpvb20oKTx0aGlzLm9wdGlvbnMubWluWm9vbSk\/dGhpcy5zZXRab29tKHQpOnRoaXN9LHNldE1heFpvb206ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5vcHRpb25zLm1heFpvb207cmV0dXJuIHRoaXMub3B0aW9ucy5tYXhab29tPXQsdGhpcy5fbG9hZGVkJiZlIT09dCYmKHRoaXMuZmlyZSgiem9vbWxldmVsc2NoYW5nZSIpLHRoaXMuZ2V0Wm9vbSgpPnRoaXMub3B0aW9ucy5tYXhab29tKT90aGlzLnNldFpvb20odCk6dGhpc30scGFuSW5zaWRlQm91bmRzOmZ1bmN0aW9uKHQsZSl7dGhpcy5fZW5mb3JjaW5nQm91bmRzPSEwO3ZhciBpPXRoaXMuZ2V0Q2VudGVyKCksdD10aGlzLl9saW1pdENlbnRlcihpLHRoaXMuX3pvb20sZyh0KSk7cmV0dXJuIGkuZXF1YWxzKHQpfHx0aGlzLnBhblRvKHQsZSksdGhpcy5fZW5mb3JjaW5nQm91bmRzPSExLHRoaXN9LHBhbkluc2lkZTpmdW5jdGlvbih0LGUpe3ZhciBpPW0oKGU9ZXx8e30pLnBhZGRpbmdUb3BMZWZ0fHxlLnBhZGRpbmd8fFswLDBdKSxuPW0oZS5wYWRkaW5nQm90dG9tUmlnaHR8fGUucGFkZGluZ3x8WzAsMF0pLG89dGhpcy5wcm9qZWN0KHRoaXMuZ2V0Q2VudGVyKCkpLHQ9dGhpcy5wcm9qZWN0KHQpLHM9KGk9YyhbKHM9dGhpcy5nZXRQaXhlbEJvdW5kcygpKS5taW4uYWRkKGkpLHMubWF4LnN1YnRyYWN0KG4pXSkpLmdldFNpemUoKTtyZXR1cm4gaS5jb250YWlucyh0KXx8KHRoaXMuX2VuZm9yY2luZ0JvdW5kcz0hMCxuPXQuc3VidHJhY3QoaS5nZXRDZW50ZXIoKSksaT1pLmV4dGVuZCh0KS5nZXRTaXplKCkuc3VidHJhY3Qocyksby54Kz1uLng8MD8taS54OmkueCxvLnkrPW4ueTwwPy1pLnk6aS55LHRoaXMucGFuVG8odGhpcy51bnByb2plY3QobyksZSksdGhpcy5fZW5mb3JjaW5nQm91bmRzPSExKSx0aGlzfSxpbnZhbGlkYXRlU2l6ZTpmdW5jdGlvbih0KXtpZighdGhpcy5fbG9hZGVkKXJldHVybiB0aGlzO3Q9bCh7YW5pbWF0ZTohMSxwYW46ITB9LCEwPT09dD97YW5pbWF0ZTohMH06dCk7dmFyIGU9dGhpcy5nZXRTaXplKCksaT0odGhpcy5fc2l6ZUNoYW5nZWQ9ITAsdGhpcy5fbGFzdENlbnRlcj1udWxsLHRoaXMuZ2V0U2l6ZSgpKSxuPWUuZGl2aWRlQnkoMikucm91bmQoKSxvPWkuZGl2aWRlQnkoMikucm91bmQoKTtyZXR1cm4obj1uLnN1YnRyYWN0KG8pKS54fHxuLnk\/KHQuYW5pbWF0ZSYmdC5wYW4\/dGhpcy5wYW5CeShuKToodC5wYW4mJnRoaXMuX3Jhd1BhbkJ5KG4pLHRoaXMuZmlyZSgibW92ZSIpLHQuZGVib3VuY2VNb3ZlZW5kPyhjbGVhclRpbWVvdXQodGhpcy5fc2l6ZVRpbWVyKSx0aGlzLl9zaXplVGltZXI9c2V0VGltZW91dChhKHRoaXMuZmlyZSx0aGlzLCJtb3ZlZW5kIiksMjAwKSk6dGhpcy5maXJlKCJtb3ZlZW5kIikpLHRoaXMuZmlyZSgicmVzaXplIix7b2xkU2l6ZTplLG5ld1NpemU6aX0pKTp0aGlzfSxzdG9wOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc2V0Wm9vbSh0aGlzLl9saW1pdFpvb20odGhpcy5fem9vbSkpLHRoaXMub3B0aW9ucy56b29tU25hcHx8dGhpcy5maXJlKCJ2aWV3cmVzZXQiKSx0aGlzLl9zdG9wKCl9LGxvY2F0ZTpmdW5jdGlvbih0KXt2YXIgZSxpO3JldHVybiB0PXRoaXMuX2xvY2F0ZU9wdGlvbnM9bCh7dGltZW91dDoxZTQsd2F0Y2g6ITF9LHQpLCJnZW9sb2NhdGlvbiJpbiBuYXZpZ2F0b3I\/KGU9YSh0aGlzLl9oYW5kbGVHZW9sb2NhdGlvblJlc3BvbnNlLHRoaXMpLGk9YSh0aGlzLl9oYW5kbGVHZW9sb2NhdGlvbkVycm9yLHRoaXMpLHQud2F0Y2g\/dGhpcy5fbG9jYXRpb25XYXRjaElkPW5hdmlnYXRvci5nZW9sb2NhdGlvbi53YXRjaFBvc2l0aW9uKGUsaSx0KTpuYXZpZ2F0b3IuZ2VvbG9jYXRpb24uZ2V0Q3VycmVudFBvc2l0aW9uKGUsaSx0KSk6dGhpcy5faGFuZGxlR2VvbG9jYXRpb25FcnJvcih7Y29kZTowLG1lc3NhZ2U6Ikdlb2xvY2F0aW9uIG5vdCBzdXBwb3J0ZWQuIn0pLHRoaXN9LHN0b3BMb2NhdGU6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLmdlb2xvY2F0aW9uJiZuYXZpZ2F0b3IuZ2VvbG9jYXRpb24uY2xlYXJXYXRjaCYmbmF2aWdhdG9yLmdlb2xvY2F0aW9uLmNsZWFyV2F0Y2godGhpcy5fbG9jYXRpb25XYXRjaElkKSx0aGlzLl9sb2NhdGVPcHRpb25zJiYodGhpcy5fbG9jYXRlT3B0aW9ucy5zZXRWaWV3PSExKSx0aGlzfSxfaGFuZGxlR2VvbG9jYXRpb25FcnJvcjpmdW5jdGlvbih0KXt2YXIgZTt0aGlzLl9jb250YWluZXIuX2xlYWZsZXRfaWQmJihlPXQuY29kZSx0PXQubWVzc2FnZXx8KDE9PT1lPyJwZXJtaXNzaW9uIGRlbmllZCI6Mj09PWU\/InBvc2l0aW9uIHVuYXZhaWxhYmxlIjoidGltZW91dCIpLHRoaXMuX2xvY2F0ZU9wdGlvbnMuc2V0VmlldyYmIXRoaXMuX2xvYWRlZCYmdGhpcy5maXRXb3JsZCgpLHRoaXMuZmlyZSgibG9jYXRpb25lcnJvciIse2NvZGU6ZSxtZXNzYWdlOiJHZW9sb2NhdGlvbiBlcnJvcjogIit0KyIuIn0pKX0sX2hhbmRsZUdlb2xvY2F0aW9uUmVzcG9uc2U6ZnVuY3Rpb24odCl7aWYodGhpcy5fY29udGFpbmVyLl9sZWFmbGV0X2lkKXt2YXIgZSxpLG49bmV3IHYodC5jb29yZHMubGF0aXR1ZGUsdC5jb29yZHMubG9uZ2l0dWRlKSxvPW4udG9Cb3VuZHMoMip0LmNvb3Jkcy5hY2N1cmFjeSkscz10aGlzLl9sb2NhdGVPcHRpb25zLHI9KHMuc2V0VmlldyYmKGU9dGhpcy5nZXRCb3VuZHNab29tKG8pLHRoaXMuc2V0VmlldyhuLHMubWF4Wm9vbT9NYXRoLm1pbihlLHMubWF4Wm9vbSk6ZSkpLHtsYXRsbmc6bixib3VuZHM6byx0aW1lc3RhbXA6dC50aW1lc3RhbXB9KTtmb3IoaSBpbiB0LmNvb3JkcykibnVtYmVyIj09dHlwZW9mIHQuY29vcmRzW2ldJiYocltpXT10LmNvb3Jkc1tpXSk7dGhpcy5maXJlKCJsb2NhdGlvbmZvdW5kIixyKX19LGFkZEhhbmRsZXI6ZnVuY3Rpb24odCxlKXtyZXR1cm4gZSYmKGU9dGhpc1t0XT1uZXcgZSh0aGlzKSx0aGlzLl9oYW5kbGVycy5wdXNoKGUpLHRoaXMub3B0aW9uc1t0XSYmZS5lbmFibGUoKSksdGhpc30scmVtb3ZlOmZ1bmN0aW9uKCl7aWYodGhpcy5faW5pdEV2ZW50cyghMCksdGhpcy5vcHRpb25zLm1heEJvdW5kcyYmdGhpcy5vZmYoIm1vdmVlbmQiLHRoaXMuX3Bhbkluc2lkZU1heEJvdW5kcyksdGhpcy5fY29udGFpbmVySWQhPT10aGlzLl9jb250YWluZXIuX2xlYWZsZXRfaWQpdGhyb3cgbmV3IEVycm9yKCJNYXAgY29udGFpbmVyIGlzIGJlaW5nIHJldXNlZCBieSBhbm90aGVyIGluc3RhbmNlIik7dHJ5e2RlbGV0ZSB0aGlzLl9jb250YWluZXIuX2xlYWZsZXRfaWQsZGVsZXRlIHRoaXMuX2NvbnRhaW5lcklkfWNhdGNoKHQpe3RoaXMuX2NvbnRhaW5lci5fbGVhZmxldF9pZD12b2lkIDAsdGhpcy5fY29udGFpbmVySWQ9dm9pZCAwfWZvcih2YXIgdCBpbiB2b2lkIDAhPT10aGlzLl9sb2NhdGlvbldhdGNoSWQmJnRoaXMuc3RvcExvY2F0ZSgpLHRoaXMuX3N0b3AoKSxUKHRoaXMuX21hcFBhbmUpLHRoaXMuX2NsZWFyQ29udHJvbFBvcyYmdGhpcy5fY2xlYXJDb250cm9sUG9zKCksdGhpcy5fcmVzaXplUmVxdWVzdCYmKHIodGhpcy5fcmVzaXplUmVxdWVzdCksdGhpcy5fcmVzaXplUmVxdWVzdD1udWxsKSx0aGlzLl9jbGVhckhhbmRsZXJzKCksdGhpcy5fbG9hZGVkJiZ0aGlzLmZpcmUoInVubG9hZCIpLHRoaXMuX2xheWVycyl0aGlzLl9sYXllcnNbdF0ucmVtb3ZlKCk7Zm9yKHQgaW4gdGhpcy5fcGFuZXMpVCh0aGlzLl9wYW5lc1t0XSk7cmV0dXJuIHRoaXMuX2xheWVycz1bXSx0aGlzLl9wYW5lcz1bXSxkZWxldGUgdGhpcy5fbWFwUGFuZSxkZWxldGUgdGhpcy5fcmVuZGVyZXIsdGhpc30sY3JlYXRlUGFuZTpmdW5jdGlvbih0LGUpe3JldHVybiBlPVAoImRpdiIsImxlYWZsZXQtcGFuZSIrKHQ\/IiBsZWFmbGV0LSIrdC5yZXBsYWNlKCJQYW5lIiwiIikrIi1wYW5lIjoiIiksZXx8dGhpcy5fbWFwUGFuZSksdCYmKHRoaXMuX3BhbmVzW3RdPWUpLGV9LGdldENlbnRlcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9jaGVja0lmTG9hZGVkKCksdGhpcy5fbGFzdENlbnRlciYmIXRoaXMuX21vdmVkKCk\/dGhpcy5fbGFzdENlbnRlci5jbG9uZSgpOnRoaXMubGF5ZXJQb2ludFRvTGF0TG5nKHRoaXMuX2dldENlbnRlckxheWVyUG9pbnQoKSl9LGdldFpvb206ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fem9vbX0sZ2V0Qm91bmRzOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5nZXRQaXhlbEJvdW5kcygpO3JldHVybiBuZXcgcyh0aGlzLnVucHJvamVjdCh0LmdldEJvdHRvbUxlZnQoKSksdGhpcy51bnByb2plY3QodC5nZXRUb3BSaWdodCgpKSl9LGdldE1pblpvb206ZnVuY3Rpb24oKXtyZXR1cm4gdm9pZCAwPT09dGhpcy5vcHRpb25zLm1pblpvb20\/dGhpcy5fbGF5ZXJzTWluWm9vbXx8MDp0aGlzLm9wdGlvbnMubWluWm9vbX0sZ2V0TWF4Wm9vbTpmdW5jdGlvbigpe3JldHVybiB2b2lkIDA9PT10aGlzLm9wdGlvbnMubWF4Wm9vbT92b2lkIDA9PT10aGlzLl9sYXllcnNNYXhab29tPzEvMDp0aGlzLl9sYXllcnNNYXhab29tOnRoaXMub3B0aW9ucy5tYXhab29tfSxnZXRCb3VuZHNab29tOmZ1bmN0aW9uKHQsZSxpKXt0PWcodCksaT1tKGl8fFswLDBdKTt2YXIgbj10aGlzLmdldFpvb20oKXx8MCxvPXRoaXMuZ2V0TWluWm9vbSgpLHM9dGhpcy5nZXRNYXhab29tKCkscj10LmdldE5vcnRoV2VzdCgpLHQ9dC5nZXRTb3V0aEVhc3QoKSxpPXRoaXMuZ2V0U2l6ZSgpLnN1YnRyYWN0KGkpLHQ9Yyh0aGlzLnByb2plY3QodCxuKSx0aGlzLnByb2plY3QocixuKSkuZ2V0U2l6ZSgpLHI9Yi5hbnkzZD90aGlzLm9wdGlvbnMuem9vbVNuYXA6MSxhPWkueC90LngsaT1pLnkvdC55LHQ9ZT9NYXRoLm1heChhLGkpOk1hdGgubWluKGEsaSksbj10aGlzLmdldFNjYWxlWm9vbSh0LG4pO3JldHVybiByJiYobj1NYXRoLnJvdW5kKG4vKHIvMTAwKSkqKHIvMTAwKSxuPWU\/TWF0aC5jZWlsKG4vcikqcjpNYXRoLmZsb29yKG4vcikqciksTWF0aC5tYXgobyxNYXRoLm1pbihzLG4pKX0sZ2V0U2l6ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9zaXplJiYhdGhpcy5fc2l6ZUNoYW5nZWR8fCh0aGlzLl9zaXplPW5ldyBwKHRoaXMuX2NvbnRhaW5lci5jbGllbnRXaWR0aHx8MCx0aGlzLl9jb250YWluZXIuY2xpZW50SGVpZ2h0fHwwKSx0aGlzLl9zaXplQ2hhbmdlZD0hMSksdGhpcy5fc2l6ZS5jbG9uZSgpfSxnZXRQaXhlbEJvdW5kczpmdW5jdGlvbih0LGUpe3JldHVybiBuZXcgZih0PXRoaXMuX2dldFRvcExlZnRQb2ludCh0LGUpLHQuYWRkKHRoaXMuZ2V0U2l6ZSgpKSl9LGdldFBpeGVsT3JpZ2luOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2NoZWNrSWZMb2FkZWQoKSx0aGlzLl9waXhlbE9yaWdpbn0sZ2V0UGl4ZWxXb3JsZEJvdW5kczpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5vcHRpb25zLmNycy5nZXRQcm9qZWN0ZWRCb3VuZHModm9pZCAwPT09dD90aGlzLmdldFpvb20oKTp0KX0sZ2V0UGFuZTpmdW5jdGlvbih0KXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIHQ\/dGhpcy5fcGFuZXNbdF06dH0sZ2V0UGFuZXM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcGFuZXN9LGdldENvbnRhaW5lcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9jb250YWluZXJ9LGdldFpvb21TY2FsZTpmdW5jdGlvbih0LGUpe3ZhciBpPXRoaXMub3B0aW9ucy5jcnM7cmV0dXJuIGU9dm9pZCAwPT09ZT90aGlzLl96b29tOmUsaS5zY2FsZSh0KS9pLnNjYWxlKGUpfSxnZXRTY2FsZVpvb206ZnVuY3Rpb24odCxlKXt2YXIgaT10aGlzLm9wdGlvbnMuY3JzLHQ9KGU9dm9pZCAwPT09ZT90aGlzLl96b29tOmUsaS56b29tKHQqaS5zY2FsZShlKSkpO3JldHVybiBpc05hTih0KT8xLzA6dH0scHJvamVjdDpmdW5jdGlvbih0LGUpe3JldHVybiBlPXZvaWQgMD09PWU\/dGhpcy5fem9vbTplLHRoaXMub3B0aW9ucy5jcnMubGF0TG5nVG9Qb2ludCh4KHQpLGUpfSx1bnByb2plY3Q6ZnVuY3Rpb24odCxlKXtyZXR1cm4gZT12b2lkIDA9PT1lP3RoaXMuX3pvb206ZSx0aGlzLm9wdGlvbnMuY3JzLnBvaW50VG9MYXRMbmcobSh0KSxlKX0sbGF5ZXJQb2ludFRvTGF0TG5nOmZ1bmN0aW9uKHQpe3JldHVybiB0PW0odCkuYWRkKHRoaXMuZ2V0UGl4ZWxPcmlnaW4oKSksdGhpcy51bnByb2plY3QodCl9LGxhdExuZ1RvTGF5ZXJQb2ludDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5wcm9qZWN0KHgodCkpLl9yb3VuZCgpLl9zdWJ0cmFjdCh0aGlzLmdldFBpeGVsT3JpZ2luKCkpfSx3cmFwTGF0TG5nOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLm9wdGlvbnMuY3JzLndyYXBMYXRMbmcoeCh0KSl9LHdyYXBMYXRMbmdCb3VuZHM6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMub3B0aW9ucy5jcnMud3JhcExhdExuZ0JvdW5kcyhnKHQpKX0sZGlzdGFuY2U6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5vcHRpb25zLmNycy5kaXN0YW5jZSh4KHQpLHgoZSkpfSxjb250YWluZXJQb2ludFRvTGF5ZXJQb2ludDpmdW5jdGlvbih0KXtyZXR1cm4gbSh0KS5zdWJ0cmFjdCh0aGlzLl9nZXRNYXBQYW5lUG9zKCkpfSxsYXllclBvaW50VG9Db250YWluZXJQb2ludDpmdW5jdGlvbih0KXtyZXR1cm4gbSh0KS5hZGQodGhpcy5fZ2V0TWFwUGFuZVBvcygpKX0sY29udGFpbmVyUG9pbnRUb0xhdExuZzpmdW5jdGlvbih0KXtyZXR1cm4gdD10aGlzLmNvbnRhaW5lclBvaW50VG9MYXllclBvaW50KG0odCkpLHRoaXMubGF5ZXJQb2ludFRvTGF0TG5nKHQpfSxsYXRMbmdUb0NvbnRhaW5lclBvaW50OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmxheWVyUG9pbnRUb0NvbnRhaW5lclBvaW50KHRoaXMubGF0TG5nVG9MYXllclBvaW50KHgodCkpKX0sbW91c2VFdmVudFRvQ29udGFpbmVyUG9pbnQ6ZnVuY3Rpb24odCl7cmV0dXJuIEllKHQsdGhpcy5fY29udGFpbmVyKX0sbW91c2VFdmVudFRvTGF5ZXJQb2ludDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5jb250YWluZXJQb2ludFRvTGF5ZXJQb2ludCh0aGlzLm1vdXNlRXZlbnRUb0NvbnRhaW5lclBvaW50KHQpKX0sbW91c2VFdmVudFRvTGF0TG5nOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmxheWVyUG9pbnRUb0xhdExuZyh0aGlzLm1vdXNlRXZlbnRUb0xheWVyUG9pbnQodCkpfSxfaW5pdENvbnRhaW5lcjpmdW5jdGlvbih0KXtpZighKHQ9dGhpcy5fY29udGFpbmVyPWhlKHQpKSl0aHJvdyBuZXcgRXJyb3IoIk1hcCBjb250YWluZXIgbm90IGZvdW5kLiIpO2lmKHQuX2xlYWZsZXRfaWQpdGhyb3cgbmV3IEVycm9yKCJNYXAgY29udGFpbmVyIGlzIGFscmVhZHkgaW5pdGlhbGl6ZWQuIik7Uyh0LCJzY3JvbGwiLHRoaXMuX29uU2Nyb2xsLHRoaXMpLHRoaXMuX2NvbnRhaW5lcklkPWQodCl9LF9pbml0TGF5b3V0OmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fY29udGFpbmVyLGU9KHRoaXMuX2ZhZGVBbmltYXRlZD10aGlzLm9wdGlvbnMuZmFkZUFuaW1hdGlvbiYmYi5hbnkzZCxNKHQsImxlYWZsZXQtY29udGFpbmVyIisoYi50b3VjaD8iIGxlYWZsZXQtdG91Y2giOiIiKSsoYi5yZXRpbmE\/IiBsZWFmbGV0LXJldGluYSI6IiIpKyhiLmllbHQ5PyIgbGVhZmxldC1vbGRpZSI6IiIpKyhiLnNhZmFyaT8iIGxlYWZsZXQtc2FmYXJpIjoiIikrKHRoaXMuX2ZhZGVBbmltYXRlZD8iIGxlYWZsZXQtZmFkZS1hbmltIjoiIikpLGxlKHQsInBvc2l0aW9uIikpOyJhYnNvbHV0ZSIhPT1lJiYicmVsYXRpdmUiIT09ZSYmImZpeGVkIiE9PWUmJiJzdGlja3kiIT09ZSYmKHQuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIiksdGhpcy5faW5pdFBhbmVzKCksdGhpcy5faW5pdENvbnRyb2xQb3MmJnRoaXMuX2luaXRDb250cm9sUG9zKCl9LF9pbml0UGFuZXM6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9wYW5lcz17fTt0aGlzLl9wYW5lUmVuZGVyZXJzPXt9LHRoaXMuX21hcFBhbmU9dGhpcy5jcmVhdGVQYW5lKCJtYXBQYW5lIix0aGlzLl9jb250YWluZXIpLFoodGhpcy5fbWFwUGFuZSxuZXcgcCgwLDApKSx0aGlzLmNyZWF0ZVBhbmUoInRpbGVQYW5lIiksdGhpcy5jcmVhdGVQYW5lKCJvdmVybGF5UGFuZSIpLHRoaXMuY3JlYXRlUGFuZSgic2hhZG93UGFuZSIpLHRoaXMuY3JlYXRlUGFuZSgibWFya2VyUGFuZSIpLHRoaXMuY3JlYXRlUGFuZSgidG9vbHRpcFBhbmUiKSx0aGlzLmNyZWF0ZVBhbmUoInBvcHVwUGFuZSIpLHRoaXMub3B0aW9ucy5tYXJrZXJab29tQW5pbWF0aW9ufHwoTSh0Lm1hcmtlclBhbmUsImxlYWZsZXQtem9vbS1oaWRlIiksTSh0LnNoYWRvd1BhbmUsImxlYWZsZXQtem9vbS1oaWRlIikpfSxfcmVzZXRWaWV3OmZ1bmN0aW9uKHQsZSxpKXtaKHRoaXMuX21hcFBhbmUsbmV3IHAoMCwwKSk7dmFyIG49IXRoaXMuX2xvYWRlZCxvPSh0aGlzLl9sb2FkZWQ9ITAsZT10aGlzLl9saW1pdFpvb20oZSksdGhpcy5maXJlKCJ2aWV3cHJlcmVzZXQiKSx0aGlzLl96b29tIT09ZSk7dGhpcy5fbW92ZVN0YXJ0KG8saSkuX21vdmUodCxlKS5fbW92ZUVuZChvKSx0aGlzLmZpcmUoInZpZXdyZXNldCIpLG4mJnRoaXMuZmlyZSgibG9hZCIpfSxfbW92ZVN0YXJ0OmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQmJnRoaXMuZmlyZSgiem9vbXN0YXJ0IiksZXx8dGhpcy5maXJlKCJtb3Zlc3RhcnQiKSx0aGlzfSxfbW92ZTpmdW5jdGlvbih0LGUsaSxuKXt2b2lkIDA9PT1lJiYoZT10aGlzLl96b29tKTt2YXIgbz10aGlzLl96b29tIT09ZTtyZXR1cm4gdGhpcy5fem9vbT1lLHRoaXMuX2xhc3RDZW50ZXI9dCx0aGlzLl9waXhlbE9yaWdpbj10aGlzLl9nZXROZXdQaXhlbE9yaWdpbih0KSxuP2kmJmkucGluY2gmJnRoaXMuZmlyZSgiem9vbSIsaSk6KChvfHxpJiZpLnBpbmNoKSYmdGhpcy5maXJlKCJ6b29tIixpKSx0aGlzLmZpcmUoIm1vdmUiLGkpKSx0aGlzfSxfbW92ZUVuZDpmdW5jdGlvbih0KXtyZXR1cm4gdCYmdGhpcy5maXJlKCJ6b29tZW5kIiksdGhpcy5maXJlKCJtb3ZlZW5kIil9LF9zdG9wOmZ1bmN0aW9uKCl7cmV0dXJuIHIodGhpcy5fZmx5VG9GcmFtZSksdGhpcy5fcGFuQW5pbSYmdGhpcy5fcGFuQW5pbS5zdG9wKCksdGhpc30sX3Jhd1BhbkJ5OmZ1bmN0aW9uKHQpe1oodGhpcy5fbWFwUGFuZSx0aGlzLl9nZXRNYXBQYW5lUG9zKCkuc3VidHJhY3QodCkpfSxfZ2V0Wm9vbVNwYW46ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRNYXhab29tKCktdGhpcy5nZXRNaW5ab29tKCl9LF9wYW5JbnNpZGVNYXhCb3VuZHM6ZnVuY3Rpb24oKXt0aGlzLl9lbmZvcmNpbmdCb3VuZHN8fHRoaXMucGFuSW5zaWRlQm91bmRzKHRoaXMub3B0aW9ucy5tYXhCb3VuZHMpfSxfY2hlY2tJZkxvYWRlZDpmdW5jdGlvbigpe2lmKCF0aGlzLl9sb2FkZWQpdGhyb3cgbmV3IEVycm9yKCJTZXQgbWFwIGNlbnRlciBhbmQgem9vbSBmaXJzdC4iKX0sX2luaXRFdmVudHM6ZnVuY3Rpb24odCl7dGhpcy5fdGFyZ2V0cz17fTt2YXIgZT10P2s6UztlKCh0aGlzLl90YXJnZXRzW2QodGhpcy5fY29udGFpbmVyKV09dGhpcykuX2NvbnRhaW5lciwiY2xpY2sgZGJsY2xpY2sgbW91c2Vkb3duIG1vdXNldXAgbW91c2VvdmVyIG1vdXNlb3V0IG1vdXNlbW92ZSBjb250ZXh0bWVudSBrZXlwcmVzcyBrZXlkb3duIGtleXVwIix0aGlzLl9oYW5kbGVET01FdmVudCx0aGlzKSx0aGlzLm9wdGlvbnMudHJhY2tSZXNpemUmJmUod2luZG93LCJyZXNpemUiLHRoaXMuX29uUmVzaXplLHRoaXMpLGIuYW55M2QmJnRoaXMub3B0aW9ucy50cmFuc2Zvcm0zRExpbWl0JiYodD90aGlzLm9mZjp0aGlzLm9uKS5jYWxsKHRoaXMsIm1vdmVlbmQiLHRoaXMuX29uTW92ZUVuZCl9LF9vblJlc2l6ZTpmdW5jdGlvbigpe3IodGhpcy5fcmVzaXplUmVxdWVzdCksdGhpcy5fcmVzaXplUmVxdWVzdD15KGZ1bmN0aW9uKCl7dGhpcy5pbnZhbGlkYXRlU2l6ZSh7ZGVib3VuY2VNb3ZlZW5kOiEwfSl9LHRoaXMpfSxfb25TY3JvbGw6ZnVuY3Rpb24oKXt0aGlzLl9jb250YWluZXIuc2Nyb2xsVG9wPTAsdGhpcy5fY29udGFpbmVyLnNjcm9sbExlZnQ9MH0sX29uTW92ZUVuZDpmdW5jdGlvbigpe3ZhciB0PXRoaXMuX2dldE1hcFBhbmVQb3MoKTtNYXRoLm1heChNYXRoLmFicyh0LngpLE1hdGguYWJzKHQueSkpPj10aGlzLm9wdGlvbnMudHJhbnNmb3JtM0RMaW1pdCYmdGhpcy5fcmVzZXRWaWV3KHRoaXMuZ2V0Q2VudGVyKCksdGhpcy5nZXRab29tKCkpfSxfZmluZEV2ZW50VGFyZ2V0czpmdW5jdGlvbih0LGUpe2Zvcih2YXIgaSxuPVtdLG89Im1vdXNlb3V0Ij09PWV8fCJtb3VzZW92ZXIiPT09ZSxzPXQudGFyZ2V0fHx0LnNyY0VsZW1lbnQscj0hMTtzOyl7aWYoKGk9dGhpcy5fdGFyZ2V0c1tkKHMpXSkmJigiY2xpY2siPT09ZXx8InByZWNsaWNrIj09PWUpJiZ0aGlzLl9kcmFnZ2FibGVNb3ZlZChpKSl7cj0hMDticmVha31pZihpJiZpLmxpc3RlbnMoZSwhMCkpe2lmKG8mJiFEZShzLHQpKWJyZWFrO2lmKG4ucHVzaChpKSxvKWJyZWFrfWlmKHM9PT10aGlzLl9jb250YWluZXIpYnJlYWs7cz1zLnBhcmVudE5vZGV9cmV0dXJuIG4ubGVuZ3RofHxyfHxvfHwhdGhpcy5saXN0ZW5zKGUsITApP246W3RoaXNdfSxfaXNDbGlja0Rpc2FibGVkOmZ1bmN0aW9uKHQpe2Zvcig7dCYmdCE9PXRoaXMuX2NvbnRhaW5lcjspe2lmKHQuX2xlYWZsZXRfZGlzYWJsZV9jbGljaylyZXR1cm4hMDt0PXQucGFyZW50Tm9kZX19LF9oYW5kbGVET01FdmVudDpmdW5jdGlvbih0KXt2YXIgZSxpPXQudGFyZ2V0fHx0LnNyY0VsZW1lbnQ7IXRoaXMuX2xvYWRlZHx8aS5fbGVhZmxldF9kaXNhYmxlX2V2ZW50c3x8ImNsaWNrIj09PXQudHlwZSYmdGhpcy5faXNDbGlja0Rpc2FibGVkKGkpfHwoIm1vdXNlZG93biI9PT0oZT10LnR5cGUpJiZ3ZShpKSx0aGlzLl9maXJlRE9NRXZlbnQodCxlKSl9LF9tb3VzZUV2ZW50czpbImNsaWNrIiwiZGJsY2xpY2siLCJtb3VzZW92ZXIiLCJtb3VzZW91dCIsImNvbnRleHRtZW51Il0sX2ZpcmVET01FdmVudDpmdW5jdGlvbih0LGUsaSl7ImNsaWNrIj09PXQudHlwZSYmKChhPWwoe30sdCkpLnR5cGU9InByZWNsaWNrIix0aGlzLl9maXJlRE9NRXZlbnQoYSxhLnR5cGUsaSkpO3ZhciBuPXRoaXMuX2ZpbmRFdmVudFRhcmdldHModCxlKTtpZihpKXtmb3IodmFyIG89W10scz0wO3M8aS5sZW5ndGg7cysrKWlbc10ubGlzdGVucyhlLCEwKSYmby5wdXNoKGlbc10pO249by5jb25jYXQobil9aWYobi5sZW5ndGgpeyJjb250ZXh0bWVudSI9PT1lJiZPKHQpO3ZhciByLGE9blswXSxoPXtvcmlnaW5hbEV2ZW50OnR9O2Zvcigia2V5cHJlc3MiIT09dC50eXBlJiYia2V5ZG93biIhPT10LnR5cGUmJiJrZXl1cCIhPT10LnR5cGUmJihyPWEuZ2V0TGF0TG5nJiYoIWEuX3JhZGl1c3x8YS5fcmFkaXVzPD0xMCksaC5jb250YWluZXJQb2ludD1yP3RoaXMubGF0TG5nVG9Db250YWluZXJQb2ludChhLmdldExhdExuZygpKTp0aGlzLm1vdXNlRXZlbnRUb0NvbnRhaW5lclBvaW50KHQpLGgubGF5ZXJQb2ludD10aGlzLmNvbnRhaW5lclBvaW50VG9MYXllclBvaW50KGguY29udGFpbmVyUG9pbnQpLGgubGF0bG5nPXI\/YS5nZXRMYXRMbmcoKTp0aGlzLmxheWVyUG9pbnRUb0xhdExuZyhoLmxheWVyUG9pbnQpKSxzPTA7czxuLmxlbmd0aDtzKyspaWYobltzXS5maXJlKGUsaCwhMCksaC5vcmlnaW5hbEV2ZW50Ll9zdG9wcGVkfHwhMT09PW5bc10ub3B0aW9ucy5idWJibGluZ01vdXNlRXZlbnRzJiYtMSE9PUcodGhpcy5fbW91c2VFdmVudHMsZSkpcmV0dXJufX0sX2RyYWdnYWJsZU1vdmVkOmZ1bmN0aW9uKHQpe3JldHVybih0PXQuZHJhZ2dpbmcmJnQuZHJhZ2dpbmcuZW5hYmxlZCgpP3Q6dGhpcykuZHJhZ2dpbmcmJnQuZHJhZ2dpbmcubW92ZWQoKXx8dGhpcy5ib3hab29tJiZ0aGlzLmJveFpvb20ubW92ZWQoKX0sX2NsZWFySGFuZGxlcnM6ZnVuY3Rpb24oKXtmb3IodmFyIHQ9MCxlPXRoaXMuX2hhbmRsZXJzLmxlbmd0aDt0PGU7dCsrKXRoaXMuX2hhbmRsZXJzW3RdLmRpc2FibGUoKX0sd2hlblJlYWR5OmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuX2xvYWRlZD90LmNhbGwoZXx8dGhpcyx7dGFyZ2V0OnRoaXN9KTp0aGlzLm9uKCJsb2FkIix0LGUpLHRoaXN9LF9nZXRNYXBQYW5lUG9zOmZ1bmN0aW9uKCl7cmV0dXJuIHZlKHRoaXMuX21hcFBhbmUpfHxuZXcgcCgwLDApfSxfbW92ZWQ6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9nZXRNYXBQYW5lUG9zKCk7cmV0dXJuIHQmJiF0LmVxdWFscyhbMCwwXSl9LF9nZXRUb3BMZWZ0UG9pbnQ6ZnVuY3Rpb24odCxlKXtyZXR1cm4odCYmdm9pZCAwIT09ZT90aGlzLl9nZXROZXdQaXhlbE9yaWdpbih0LGUpOnRoaXMuZ2V0UGl4ZWxPcmlnaW4oKSkuc3VidHJhY3QodGhpcy5fZ2V0TWFwUGFuZVBvcygpKX0sX2dldE5ld1BpeGVsT3JpZ2luOmZ1bmN0aW9uKHQsZSl7dmFyIGk9dGhpcy5nZXRTaXplKCkuX2RpdmlkZUJ5KDIpO3JldHVybiB0aGlzLnByb2plY3QodCxlKS5fc3VidHJhY3QoaSkuX2FkZCh0aGlzLl9nZXRNYXBQYW5lUG9zKCkpLl9yb3VuZCgpfSxfbGF0TG5nVG9OZXdMYXllclBvaW50OmZ1bmN0aW9uKHQsZSxpKXtyZXR1cm4gaT10aGlzLl9nZXROZXdQaXhlbE9yaWdpbihpLGUpLHRoaXMucHJvamVjdCh0LGUpLl9zdWJ0cmFjdChpKX0sX2xhdExuZ0JvdW5kc1RvTmV3TGF5ZXJCb3VuZHM6ZnVuY3Rpb24odCxlLGkpe3JldHVybiBpPXRoaXMuX2dldE5ld1BpeGVsT3JpZ2luKGksZSksYyhbdGhpcy5wcm9qZWN0KHQuZ2V0U291dGhXZXN0KCksZSkuX3N1YnRyYWN0KGkpLHRoaXMucHJvamVjdCh0LmdldE5vcnRoV2VzdCgpLGUpLl9zdWJ0cmFjdChpKSx0aGlzLnByb2plY3QodC5nZXRTb3V0aEVhc3QoKSxlKS5fc3VidHJhY3QoaSksdGhpcy5wcm9qZWN0KHQuZ2V0Tm9ydGhFYXN0KCksZSkuX3N1YnRyYWN0KGkpXSl9LF9nZXRDZW50ZXJMYXllclBvaW50OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY29udGFpbmVyUG9pbnRUb0xheWVyUG9pbnQodGhpcy5nZXRTaXplKCkuX2RpdmlkZUJ5KDIpKX0sX2dldENlbnRlck9mZnNldDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5sYXRMbmdUb0xheWVyUG9pbnQodCkuc3VidHJhY3QodGhpcy5fZ2V0Q2VudGVyTGF5ZXJQb2ludCgpKX0sX2xpbWl0Q2VudGVyOmZ1bmN0aW9uKHQsZSxpKXt2YXIgbixvO3JldHVybiFpfHwobj10aGlzLnByb2plY3QodCxlKSxvPXRoaXMuZ2V0U2l6ZSgpLmRpdmlkZUJ5KDIpLG89bmV3IGYobi5zdWJ0cmFjdChvKSxuLmFkZChvKSksbz10aGlzLl9nZXRCb3VuZHNPZmZzZXQobyxpLGUpLE1hdGguYWJzKG8ueCk8PTEmJk1hdGguYWJzKG8ueSk8PTEpP3Q6dGhpcy51bnByb2plY3Qobi5hZGQobyksZSl9LF9saW1pdE9mZnNldDpmdW5jdGlvbih0LGUpe3ZhciBpO3JldHVybiBlPyhpPW5ldyBmKChpPXRoaXMuZ2V0UGl4ZWxCb3VuZHMoKSkubWluLmFkZCh0KSxpLm1heC5hZGQodCkpLHQuYWRkKHRoaXMuX2dldEJvdW5kc09mZnNldChpLGUpKSk6dH0sX2dldEJvdW5kc09mZnNldDpmdW5jdGlvbih0LGUsaSl7cmV0dXJuIGk9KGU9Yyh0aGlzLnByb2plY3QoZS5nZXROb3J0aEVhc3QoKSxpKSx0aGlzLnByb2plY3QoZS5nZXRTb3V0aFdlc3QoKSxpKSkpLm1pbi5zdWJ0cmFjdCh0Lm1pbiksZT1lLm1heC5zdWJ0cmFjdCh0Lm1heCksbmV3IHAodGhpcy5fcmVib3VuZChpLngsLWUueCksdGhpcy5fcmVib3VuZChpLnksLWUueSkpfSxfcmVib3VuZDpmdW5jdGlvbih0LGUpe3JldHVybiAwPHQrZT9NYXRoLnJvdW5kKHQtZSkvMjpNYXRoLm1heCgwLE1hdGguY2VpbCh0KSktTWF0aC5tYXgoMCxNYXRoLmZsb29yKGUpKX0sX2xpbWl0Wm9vbTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLmdldE1pblpvb20oKSxpPXRoaXMuZ2V0TWF4Wm9vbSgpLG49Yi5hbnkzZD90aGlzLm9wdGlvbnMuem9vbVNuYXA6MTtyZXR1cm4gbiYmKHQ9TWF0aC5yb3VuZCh0L24pKm4pLE1hdGgubWF4KGUsTWF0aC5taW4oaSx0KSl9LF9vblBhblRyYW5zaXRpb25TdGVwOmZ1bmN0aW9uKCl7dGhpcy5maXJlKCJtb3ZlIil9LF9vblBhblRyYW5zaXRpb25FbmQ6ZnVuY3Rpb24oKXt6KHRoaXMuX21hcFBhbmUsImxlYWZsZXQtcGFuLWFuaW0iKSx0aGlzLmZpcmUoIm1vdmVlbmQiKX0sX3RyeUFuaW1hdGVkUGFuOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQ9dGhpcy5fZ2V0Q2VudGVyT2Zmc2V0KHQpLl90cnVuYygpLCEoITAhPT0oZSYmZS5hbmltYXRlKSYmIXRoaXMuZ2V0U2l6ZSgpLmNvbnRhaW5zKHQpfHwodGhpcy5wYW5CeSh0LGUpLDApKX0sX2NyZWF0ZUFuaW1Qcm94eTpmdW5jdGlvbigpe3ZhciB0PXRoaXMuX3Byb3h5PVAoImRpdiIsImxlYWZsZXQtcHJveHkgbGVhZmxldC16b29tLWFuaW1hdGVkIik7dGhpcy5fcGFuZXMubWFwUGFuZS5hcHBlbmRDaGlsZCh0KSx0aGlzLm9uKCJ6b29tYW5pbSIsZnVuY3Rpb24odCl7dmFyIGU9c2UsaT10aGlzLl9wcm94eS5zdHlsZVtlXTtnZSh0aGlzLl9wcm94eSx0aGlzLnByb2plY3QodC5jZW50ZXIsdC56b29tKSx0aGlzLmdldFpvb21TY2FsZSh0Lnpvb20sMSkpLGk9PT10aGlzLl9wcm94eS5zdHlsZVtlXSYmdGhpcy5fYW5pbWF0aW5nWm9vbSYmdGhpcy5fb25ab29tVHJhbnNpdGlvbkVuZCgpfSx0aGlzKSx0aGlzLm9uKCJsb2FkIG1vdmVlbmQiLHRoaXMuX2FuaW1Nb3ZlRW5kLHRoaXMpLHRoaXMuX29uKCJ1bmxvYWQiLHRoaXMuX2Rlc3Ryb3lBbmltUHJveHksdGhpcyl9LF9kZXN0cm95QW5pbVByb3h5OmZ1bmN0aW9uKCl7VCh0aGlzLl9wcm94eSksdGhpcy5vZmYoImxvYWQgbW92ZWVuZCIsdGhpcy5fYW5pbU1vdmVFbmQsdGhpcyksZGVsZXRlIHRoaXMuX3Byb3h5fSxfYW5pbU1vdmVFbmQ6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmdldENlbnRlcigpLGU9dGhpcy5nZXRab29tKCk7Z2UodGhpcy5fcHJveHksdGhpcy5wcm9qZWN0KHQsZSksdGhpcy5nZXRab29tU2NhbGUoZSwxKSl9LF9jYXRjaFRyYW5zaXRpb25FbmQ6ZnVuY3Rpb24odCl7dGhpcy5fYW5pbWF0aW5nWm9vbSYmMDw9dC5wcm9wZXJ0eU5hbWUuaW5kZXhPZigidHJhbnNmb3JtIikmJnRoaXMuX29uWm9vbVRyYW5zaXRpb25FbmQoKX0sX25vdGhpbmdUb0FuaW1hdGU6ZnVuY3Rpb24oKXtyZXR1cm4hdGhpcy5fY29udGFpbmVyLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoImxlYWZsZXQtem9vbS1hbmltYXRlZCIpLmxlbmd0aH0sX3RyeUFuaW1hdGVkWm9vbTpmdW5jdGlvbih0LGUsaSl7aWYoIXRoaXMuX2FuaW1hdGluZ1pvb20pe2lmKGk9aXx8e30sIXRoaXMuX3pvb21BbmltYXRlZHx8ITE9PT1pLmFuaW1hdGV8fHRoaXMuX25vdGhpbmdUb0FuaW1hdGUoKXx8TWF0aC5hYnMoZS10aGlzLl96b29tKT50aGlzLm9wdGlvbnMuem9vbUFuaW1hdGlvblRocmVzaG9sZClyZXR1cm4hMTt2YXIgbj10aGlzLmdldFpvb21TY2FsZShlKSxuPXRoaXMuX2dldENlbnRlck9mZnNldCh0KS5fZGl2aWRlQnkoMS0xL24pO2lmKCEwIT09aS5hbmltYXRlJiYhdGhpcy5nZXRTaXplKCkuY29udGFpbnMobikpcmV0dXJuITE7eShmdW5jdGlvbigpe3RoaXMuX21vdmVTdGFydCghMCxpLm5vTW92ZVN0YXJ0fHwhMSkuX2FuaW1hdGVab29tKHQsZSwhMCl9LHRoaXMpfXJldHVybiEwfSxfYW5pbWF0ZVpvb206ZnVuY3Rpb24odCxlLGksbil7dGhpcy5fbWFwUGFuZSYmKGkmJih0aGlzLl9hbmltYXRpbmdab29tPSEwLHRoaXMuX2FuaW1hdGVUb0NlbnRlcj10LHRoaXMuX2FuaW1hdGVUb1pvb209ZSxNKHRoaXMuX21hcFBhbmUsImxlYWZsZXQtem9vbS1hbmltIikpLHRoaXMuZmlyZSgiem9vbWFuaW0iLHtjZW50ZXI6dCx6b29tOmUsbm9VcGRhdGU6bn0pLHRoaXMuX3RlbXBGaXJlWm9vbUV2ZW50fHwodGhpcy5fdGVtcEZpcmVab29tRXZlbnQ9dGhpcy5fem9vbSE9PXRoaXMuX2FuaW1hdGVUb1pvb20pLHRoaXMuX21vdmUodGhpcy5fYW5pbWF0ZVRvQ2VudGVyLHRoaXMuX2FuaW1hdGVUb1pvb20sdm9pZCAwLCEwKSxzZXRUaW1lb3V0KGEodGhpcy5fb25ab29tVHJhbnNpdGlvbkVuZCx0aGlzKSwyNTApKX0sX29uWm9vbVRyYW5zaXRpb25FbmQ6ZnVuY3Rpb24oKXt0aGlzLl9hbmltYXRpbmdab29tJiYodGhpcy5fbWFwUGFuZSYmeih0aGlzLl9tYXBQYW5lLCJsZWFmbGV0LXpvb20tYW5pbSIpLHRoaXMuX2FuaW1hdGluZ1pvb209ITEsdGhpcy5fbW92ZSh0aGlzLl9hbmltYXRlVG9DZW50ZXIsdGhpcy5fYW5pbWF0ZVRvWm9vbSx2b2lkIDAsITApLHRoaXMuX3RlbXBGaXJlWm9vbUV2ZW50JiZ0aGlzLmZpcmUoInpvb20iKSxkZWxldGUgdGhpcy5fdGVtcEZpcmVab29tRXZlbnQsdGhpcy5maXJlKCJtb3ZlIiksdGhpcy5fbW92ZUVuZCghMCkpfX0pO2Z1bmN0aW9uIEhlKHQpe3JldHVybiBuZXcgQih0KX12YXIgQj1ldC5leHRlbmQoe29wdGlvbnM6e3Bvc2l0aW9uOiJ0b3ByaWdodCJ9LGluaXRpYWxpemU6ZnVuY3Rpb24odCl7aCh0aGlzLHQpfSxnZXRQb3NpdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLm9wdGlvbnMucG9zaXRpb259LHNldFBvc2l0aW9uOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX21hcDtyZXR1cm4gZSYmZS5yZW1vdmVDb250cm9sKHRoaXMpLHRoaXMub3B0aW9ucy5wb3NpdGlvbj10LGUmJmUuYWRkQ29udHJvbCh0aGlzKSx0aGlzfSxnZXRDb250YWluZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fY29udGFpbmVyfSxhZGRUbzpmdW5jdGlvbih0KXt0aGlzLnJlbW92ZSgpLHRoaXMuX21hcD10O3ZhciBlPXRoaXMuX2NvbnRhaW5lcj10aGlzLm9uQWRkKHQpLGk9dGhpcy5nZXRQb3NpdGlvbigpLHQ9dC5fY29udHJvbENvcm5lcnNbaV07cmV0dXJuIE0oZSwibGVhZmxldC1jb250cm9sIiksLTEhPT1pLmluZGV4T2YoImJvdHRvbSIpP3QuaW5zZXJ0QmVmb3JlKGUsdC5maXJzdENoaWxkKTp0LmFwcGVuZENoaWxkKGUpLHRoaXMuX21hcC5vbigidW5sb2FkIix0aGlzLnJlbW92ZSx0aGlzKSx0aGlzfSxyZW1vdmU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbWFwJiYoVCh0aGlzLl9jb250YWluZXIpLHRoaXMub25SZW1vdmUmJnRoaXMub25SZW1vdmUodGhpcy5fbWFwKSx0aGlzLl9tYXAub2ZmKCJ1bmxvYWQiLHRoaXMucmVtb3ZlLHRoaXMpLHRoaXMuX21hcD1udWxsKSx0aGlzfSxfcmVmb2N1c09uTWFwOmZ1bmN0aW9uKHQpe3RoaXMuX21hcCYmdCYmMDx0LnNjcmVlblgmJjA8dC5zY3JlZW5ZJiZ0aGlzLl9tYXAuZ2V0Q29udGFpbmVyKCkuZm9jdXMoKX19KSxXZT0oQS5pbmNsdWRlKHthZGRDb250cm9sOmZ1bmN0aW9uKHQpe3JldHVybiB0LmFkZFRvKHRoaXMpLHRoaXN9LHJlbW92ZUNvbnRyb2w6ZnVuY3Rpb24odCl7cmV0dXJuIHQucmVtb3ZlKCksdGhpc30sX2luaXRDb250cm9sUG9zOmZ1bmN0aW9uKCl7dmFyIGk9dGhpcy5fY29udHJvbENvcm5lcnM9e30sbj0ibGVhZmxldC0iLG89dGhpcy5fY29udHJvbENvbnRhaW5lcj1QKCJkaXYiLG4rImNvbnRyb2wtY29udGFpbmVyIix0aGlzLl9jb250YWluZXIpO2Z1bmN0aW9uIHQodCxlKXtpW3QrZV09UCgiZGl2IixuK3QrIiAiK24rZSxvKX10KCJ0b3AiLCJsZWZ0IiksdCgidG9wIiwicmlnaHQiKSx0KCJib3R0b20iLCJsZWZ0IiksdCgiYm90dG9tIiwicmlnaHQiKX0sX2NsZWFyQ29udHJvbFBvczpmdW5jdGlvbigpe2Zvcih2YXIgdCBpbiB0aGlzLl9jb250cm9sQ29ybmVycylUKHRoaXMuX2NvbnRyb2xDb3JuZXJzW3RdKTtUKHRoaXMuX2NvbnRyb2xDb250YWluZXIpLGRlbGV0ZSB0aGlzLl9jb250cm9sQ29ybmVycyxkZWxldGUgdGhpcy5fY29udHJvbENvbnRhaW5lcn19KSxCLmV4dGVuZCh7b3B0aW9uczp7Y29sbGFwc2VkOiEwLHBvc2l0aW9uOiJ0b3ByaWdodCIsYXV0b1pJbmRleDohMCxoaWRlU2luZ2xlQmFzZTohMSxzb3J0TGF5ZXJzOiExLHNvcnRGdW5jdGlvbjpmdW5jdGlvbih0LGUsaSxuKXtyZXR1cm4gaTxuPy0xOm48aT8xOjB9fSxpbml0aWFsaXplOmZ1bmN0aW9uKHQsZSxpKXtmb3IodmFyIG4gaW4gaCh0aGlzLGkpLHRoaXMuX2xheWVyQ29udHJvbElucHV0cz1bXSx0aGlzLl9sYXllcnM9W10sdGhpcy5fbGFzdFpJbmRleD0wLHRoaXMuX2hhbmRsaW5nQ2xpY2s9ITEsdGhpcy5fcHJldmVudENsaWNrPSExLHQpdGhpcy5fYWRkTGF5ZXIodFtuXSxuKTtmb3IobiBpbiBlKXRoaXMuX2FkZExheWVyKGVbbl0sbiwhMCl9LG9uQWRkOmZ1bmN0aW9uKHQpe3RoaXMuX2luaXRMYXlvdXQoKSx0aGlzLl91cGRhdGUoKSwodGhpcy5fbWFwPXQpLm9uKCJ6b29tZW5kIix0aGlzLl9jaGVja0Rpc2FibGVkTGF5ZXJzLHRoaXMpO2Zvcih2YXIgZT0wO2U8dGhpcy5fbGF5ZXJzLmxlbmd0aDtlKyspdGhpcy5fbGF5ZXJzW2VdLmxheWVyLm9uKCJhZGQgcmVtb3ZlIix0aGlzLl9vbkxheWVyQ2hhbmdlLHRoaXMpO3JldHVybiB0aGlzLl9jb250YWluZXJ9LGFkZFRvOmZ1bmN0aW9uKHQpe3JldHVybiBCLnByb3RvdHlwZS5hZGRUby5jYWxsKHRoaXMsdCksdGhpcy5fZXhwYW5kSWZOb3RDb2xsYXBzZWQoKX0sb25SZW1vdmU6ZnVuY3Rpb24oKXt0aGlzLl9tYXAub2ZmKCJ6b29tZW5kIix0aGlzLl9jaGVja0Rpc2FibGVkTGF5ZXJzLHRoaXMpO2Zvcih2YXIgdD0wO3Q8dGhpcy5fbGF5ZXJzLmxlbmd0aDt0KyspdGhpcy5fbGF5ZXJzW3RdLmxheWVyLm9mZigiYWRkIHJlbW92ZSIsdGhpcy5fb25MYXllckNoYW5nZSx0aGlzKX0sYWRkQmFzZUxheWVyOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuX2FkZExheWVyKHQsZSksdGhpcy5fbWFwP3RoaXMuX3VwZGF0ZSgpOnRoaXN9LGFkZE92ZXJsYXk6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5fYWRkTGF5ZXIodCxlLCEwKSx0aGlzLl9tYXA\/dGhpcy5fdXBkYXRlKCk6dGhpc30scmVtb3ZlTGF5ZXI6ZnVuY3Rpb24odCl7cmV0dXJuIHQub2ZmKCJhZGQgcmVtb3ZlIix0aGlzLl9vbkxheWVyQ2hhbmdlLHRoaXMpLCh0PXRoaXMuX2dldExheWVyKGQodCkpKSYmdGhpcy5fbGF5ZXJzLnNwbGljZSh0aGlzLl9sYXllcnMuaW5kZXhPZih0KSwxKSx0aGlzLl9tYXA\/dGhpcy5fdXBkYXRlKCk6dGhpc30sZXhwYW5kOmZ1bmN0aW9uKCl7TSh0aGlzLl9jb250YWluZXIsImxlYWZsZXQtY29udHJvbC1sYXllcnMtZXhwYW5kZWQiKSx0aGlzLl9zZWN0aW9uLnN0eWxlLmhlaWdodD1udWxsO3ZhciB0PXRoaXMuX21hcC5nZXRTaXplKCkueS0odGhpcy5fY29udGFpbmVyLm9mZnNldFRvcCs1MCk7cmV0dXJuIHQ8dGhpcy5fc2VjdGlvbi5jbGllbnRIZWlnaHQ\/KE0odGhpcy5fc2VjdGlvbiwibGVhZmxldC1jb250cm9sLWxheWVycy1zY3JvbGxiYXIiKSx0aGlzLl9zZWN0aW9uLnN0eWxlLmhlaWdodD10KyJweCIpOnoodGhpcy5fc2VjdGlvbiwibGVhZmxldC1jb250cm9sLWxheWVycy1zY3JvbGxiYXIiKSx0aGlzLl9jaGVja0Rpc2FibGVkTGF5ZXJzKCksdGhpc30sY29sbGFwc2U6ZnVuY3Rpb24oKXtyZXR1cm4geih0aGlzLl9jb250YWluZXIsImxlYWZsZXQtY29udHJvbC1sYXllcnMtZXhwYW5kZWQiKSx0aGlzfSxfaW5pdExheW91dDpmdW5jdGlvbigpe3ZhciB0PSJsZWFmbGV0LWNvbnRyb2wtbGF5ZXJzIixlPXRoaXMuX2NvbnRhaW5lcj1QKCJkaXYiLHQpLGk9dGhpcy5vcHRpb25zLmNvbGxhcHNlZCxuPShlLnNldEF0dHJpYnV0ZSgiYXJpYS1oYXNwb3B1cCIsITApLE9lKGUpLGtlKGUpLHRoaXMuX3NlY3Rpb249UCgic2VjdGlvbiIsdCsiLWxpc3QiKSksbz0oaSYmKHRoaXMuX21hcC5vbigiY2xpY2siLHRoaXMuY29sbGFwc2UsdGhpcyksUyhlLHttb3VzZWVudGVyOnRoaXMuX2V4cGFuZFNhZmVseSxtb3VzZWxlYXZlOnRoaXMuY29sbGFwc2V9LHRoaXMpKSx0aGlzLl9sYXllcnNMaW5rPVAoImEiLHQrIi10b2dnbGUiLGUpKTtvLmhyZWY9IiMiLG8udGl0bGU9IkxheWVycyIsby5zZXRBdHRyaWJ1dGUoInJvbGUiLCJidXR0b24iKSxTKG8se2tleWRvd246ZnVuY3Rpb24odCl7MTM9PT10LmtleUNvZGUmJnRoaXMuX2V4cGFuZFNhZmVseSgpfSxjbGljazpmdW5jdGlvbih0KXtPKHQpLHRoaXMuX2V4cGFuZFNhZmVseSgpfX0sdGhpcyksaXx8dGhpcy5leHBhbmQoKSx0aGlzLl9iYXNlTGF5ZXJzTGlzdD1QKCJkaXYiLHQrIi1iYXNlIixuKSx0aGlzLl9zZXBhcmF0b3I9UCgiZGl2Iix0KyItc2VwYXJhdG9yIixuKSx0aGlzLl9vdmVybGF5c0xpc3Q9UCgiZGl2Iix0KyItb3ZlcmxheXMiLG4pLGUuYXBwZW5kQ2hpbGQobil9LF9nZXRMYXllcjpmdW5jdGlvbih0KXtmb3IodmFyIGU9MDtlPHRoaXMuX2xheWVycy5sZW5ndGg7ZSsrKWlmKHRoaXMuX2xheWVyc1tlXSYmZCh0aGlzLl9sYXllcnNbZV0ubGF5ZXIpPT09dClyZXR1cm4gdGhpcy5fbGF5ZXJzW2VdfSxfYWRkTGF5ZXI6ZnVuY3Rpb24odCxlLGkpe3RoaXMuX21hcCYmdC5vbigiYWRkIHJlbW92ZSIsdGhpcy5fb25MYXllckNoYW5nZSx0aGlzKSx0aGlzLl9sYXllcnMucHVzaCh7bGF5ZXI6dCxuYW1lOmUsb3ZlcmxheTppfSksdGhpcy5vcHRpb25zLnNvcnRMYXllcnMmJnRoaXMuX2xheWVycy5zb3J0KGEoZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5vcHRpb25zLnNvcnRGdW5jdGlvbih0LmxheWVyLGUubGF5ZXIsdC5uYW1lLGUubmFtZSl9LHRoaXMpKSx0aGlzLm9wdGlvbnMuYXV0b1pJbmRleCYmdC5zZXRaSW5kZXgmJih0aGlzLl9sYXN0WkluZGV4KyssdC5zZXRaSW5kZXgodGhpcy5fbGFzdFpJbmRleCkpLHRoaXMuX2V4cGFuZElmTm90Q29sbGFwc2VkKCl9LF91cGRhdGU6ZnVuY3Rpb24oKXtpZih0aGlzLl9jb250YWluZXIpe3VlKHRoaXMuX2Jhc2VMYXllcnNMaXN0KSx1ZSh0aGlzLl9vdmVybGF5c0xpc3QpLHRoaXMuX2xheWVyQ29udHJvbElucHV0cz1bXTtmb3IodmFyIHQsZSxpLG49MCxvPTA7bzx0aGlzLl9sYXllcnMubGVuZ3RoO28rKylpPXRoaXMuX2xheWVyc1tvXSx0aGlzLl9hZGRJdGVtKGkpLGU9ZXx8aS5vdmVybGF5LHQ9dHx8IWkub3ZlcmxheSxuKz1pLm92ZXJsYXk\/MDoxO3RoaXMub3B0aW9ucy5oaWRlU2luZ2xlQmFzZSYmKHRoaXMuX2Jhc2VMYXllcnNMaXN0LnN0eWxlLmRpc3BsYXk9KHQ9dCYmMTxuKT8iIjoibm9uZSIpLHRoaXMuX3NlcGFyYXRvci5zdHlsZS5kaXNwbGF5PWUmJnQ\/IiI6Im5vbmUifXJldHVybiB0aGlzfSxfb25MYXllckNoYW5nZTpmdW5jdGlvbih0KXt0aGlzLl9oYW5kbGluZ0NsaWNrfHx0aGlzLl91cGRhdGUoKTt2YXIgZT10aGlzLl9nZXRMYXllcihkKHQudGFyZ2V0KSk7KHQ9ZS5vdmVybGF5PyJhZGQiPT09dC50eXBlPyJvdmVybGF5YWRkIjoib3ZlcmxheXJlbW92ZSI6ImFkZCI9PT10LnR5cGU\/ImJhc2VsYXllcmNoYW5nZSI6bnVsbCkmJnRoaXMuX21hcC5maXJlKHQsZSl9LF9jcmVhdGVSYWRpb0VsZW1lbnQ6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdD0nPGlucHV0IHR5cGU9InJhZGlvIiBjbGFzcz0ibGVhZmxldC1jb250cm9sLWxheWVycy1zZWxlY3RvciIgbmFtZT0iJyt0KyciJysoZT8nIGNoZWNrZWQ9ImNoZWNrZWQiJzoiIikrIi8+IiwoZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSkuaW5uZXJIVE1MPXQsZS5maXJzdENoaWxkfSxfYWRkSXRlbTpmdW5jdGlvbih0KXt2YXIgZSxpPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImxhYmVsIiksbj10aGlzLl9tYXAuaGFzTGF5ZXIodC5sYXllcik7dC5vdmVybGF5PygoZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbnB1dCIpKS50eXBlPSJjaGVja2JveCIsZS5jbGFzc05hbWU9ImxlYWZsZXQtY29udHJvbC1sYXllcnMtc2VsZWN0b3IiLGUuZGVmYXVsdENoZWNrZWQ9bik6ZT10aGlzLl9jcmVhdGVSYWRpb0VsZW1lbnQoImxlYWZsZXQtYmFzZS1sYXllcnNfIitkKHRoaXMpLG4pLHRoaXMuX2xheWVyQ29udHJvbElucHV0cy5wdXNoKGUpLGUubGF5ZXJJZD1kKHQubGF5ZXIpLFMoZSwiY2xpY2siLHRoaXMuX29uSW5wdXRDbGljayx0aGlzKTsobj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzcGFuIikpLmlubmVySFRNTD0iICIrdC5uYW1lO3ZhciBvPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNwYW4iKTtyZXR1cm4gaS5hcHBlbmRDaGlsZChvKSxvLmFwcGVuZENoaWxkKGUpLG8uYXBwZW5kQ2hpbGQobiksKHQub3ZlcmxheT90aGlzLl9vdmVybGF5c0xpc3Q6dGhpcy5fYmFzZUxheWVyc0xpc3QpLmFwcGVuZENoaWxkKGkpLHRoaXMuX2NoZWNrRGlzYWJsZWRMYXllcnMoKSxpfSxfb25JbnB1dENsaWNrOmZ1bmN0aW9uKCl7aWYoIXRoaXMuX3ByZXZlbnRDbGljayl7dmFyIHQsZSxpPXRoaXMuX2xheWVyQ29udHJvbElucHV0cyxuPVtdLG89W107dGhpcy5faGFuZGxpbmdDbGljaz0hMDtmb3IodmFyIHM9aS5sZW5ndGgtMTswPD1zO3MtLSl0PWlbc10sZT10aGlzLl9nZXRMYXllcih0LmxheWVySWQpLmxheWVyLHQuY2hlY2tlZD9uLnB1c2goZSk6dC5jaGVja2VkfHxvLnB1c2goZSk7Zm9yKHM9MDtzPG8ubGVuZ3RoO3MrKyl0aGlzLl9tYXAuaGFzTGF5ZXIob1tzXSkmJnRoaXMuX21hcC5yZW1vdmVMYXllcihvW3NdKTtmb3Iocz0wO3M8bi5sZW5ndGg7cysrKXRoaXMuX21hcC5oYXNMYXllcihuW3NdKXx8dGhpcy5fbWFwLmFkZExheWVyKG5bc10pO3RoaXMuX2hhbmRsaW5nQ2xpY2s9ITEsdGhpcy5fcmVmb2N1c09uTWFwKCl9fSxfY2hlY2tEaXNhYmxlZExheWVyczpmdW5jdGlvbigpe2Zvcih2YXIgdCxlLGk9dGhpcy5fbGF5ZXJDb250cm9sSW5wdXRzLG49dGhpcy5fbWFwLmdldFpvb20oKSxvPWkubGVuZ3RoLTE7MDw9bztvLS0pdD1pW29dLGU9dGhpcy5fZ2V0TGF5ZXIodC5sYXllcklkKS5sYXllcix0LmRpc2FibGVkPXZvaWQgMCE9PWUub3B0aW9ucy5taW5ab29tJiZuPGUub3B0aW9ucy5taW5ab29tfHx2b2lkIDAhPT1lLm9wdGlvbnMubWF4Wm9vbSYmbj5lLm9wdGlvbnMubWF4Wm9vbX0sX2V4cGFuZElmTm90Q29sbGFwc2VkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX21hcCYmIXRoaXMub3B0aW9ucy5jb2xsYXBzZWQmJnRoaXMuZXhwYW5kKCksdGhpc30sX2V4cGFuZFNhZmVseTpmdW5jdGlvbigpe3ZhciB0PXRoaXMuX3NlY3Rpb24sZT0odGhpcy5fcHJldmVudENsaWNrPSEwLFModCwiY2xpY2siLE8pLHRoaXMuZXhwYW5kKCksdGhpcyk7c2V0VGltZW91dChmdW5jdGlvbigpe2sodCwiY2xpY2siLE8pLGUuX3ByZXZlbnRDbGljaz0hMX0pfX0pKSxGZT1CLmV4dGVuZCh7b3B0aW9uczp7cG9zaXRpb246InRvcGxlZnQiLHpvb21JblRleHQ6JzxzcGFuIGFyaWEtaGlkZGVuPSJ0cnVlIj4rPC9zcGFuPicsem9vbUluVGl0bGU6Ilpvb20gaW4iLHpvb21PdXRUZXh0Oic8c3BhbiBhcmlhLWhpZGRlbj0idHJ1ZSI+JiN4MjIxMjs8L3NwYW4+Jyx6b29tT3V0VGl0bGU6Ilpvb20gb3V0In0sb25BZGQ6ZnVuY3Rpb24odCl7dmFyIGU9ImxlYWZsZXQtY29udHJvbC16b29tIixpPVAoImRpdiIsZSsiIGxlYWZsZXQtYmFyIiksbj10aGlzLm9wdGlvbnM7cmV0dXJuIHRoaXMuX3pvb21JbkJ1dHRvbj10aGlzLl9jcmVhdGVCdXR0b24obi56b29tSW5UZXh0LG4uem9vbUluVGl0bGUsZSsiLWluIixpLHRoaXMuX3pvb21JbiksdGhpcy5fem9vbU91dEJ1dHRvbj10aGlzLl9jcmVhdGVCdXR0b24obi56b29tT3V0VGV4dCxuLnpvb21PdXRUaXRsZSxlKyItb3V0IixpLHRoaXMuX3pvb21PdXQpLHRoaXMuX3VwZGF0ZURpc2FibGVkKCksdC5vbigiem9vbWVuZCB6b29tbGV2ZWxzY2hhbmdlIix0aGlzLl91cGRhdGVEaXNhYmxlZCx0aGlzKSxpfSxvblJlbW92ZTpmdW5jdGlvbih0KXt0Lm9mZigiem9vbWVuZCB6b29tbGV2ZWxzY2hhbmdlIix0aGlzLl91cGRhdGVEaXNhYmxlZCx0aGlzKX0sZGlzYWJsZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9kaXNhYmxlZD0hMCx0aGlzLl91cGRhdGVEaXNhYmxlZCgpLHRoaXN9LGVuYWJsZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9kaXNhYmxlZD0hMSx0aGlzLl91cGRhdGVEaXNhYmxlZCgpLHRoaXN9LF96b29tSW46ZnVuY3Rpb24odCl7IXRoaXMuX2Rpc2FibGVkJiZ0aGlzLl9tYXAuX3pvb208dGhpcy5fbWFwLmdldE1heFpvb20oKSYmdGhpcy5fbWFwLnpvb21Jbih0aGlzLl9tYXAub3B0aW9ucy56b29tRGVsdGEqKHQuc2hpZnRLZXk\/MzoxKSl9LF96b29tT3V0OmZ1bmN0aW9uKHQpeyF0aGlzLl9kaXNhYmxlZCYmdGhpcy5fbWFwLl96b29tPnRoaXMuX21hcC5nZXRNaW5ab29tKCkmJnRoaXMuX21hcC56b29tT3V0KHRoaXMuX21hcC5vcHRpb25zLnpvb21EZWx0YSoodC5zaGlmdEtleT8zOjEpKX0sX2NyZWF0ZUJ1dHRvbjpmdW5jdGlvbih0LGUsaSxuLG8pe3JldHVybihpPVAoImEiLGksbikpLmlubmVySFRNTD10LGkuaHJlZj0iIyIsaS50aXRsZT1lLGkuc2V0QXR0cmlidXRlKCJyb2xlIiwiYnV0dG9uIiksaS5zZXRBdHRyaWJ1dGUoImFyaWEtbGFiZWwiLGUpLE9lKGkpLFMoaSwiY2xpY2siLEFlKSxTKGksImNsaWNrIixvLHRoaXMpLFMoaSwiY2xpY2siLHRoaXMuX3JlZm9jdXNPbk1hcCx0aGlzKSxpfSxfdXBkYXRlRGlzYWJsZWQ6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9tYXAsZT0ibGVhZmxldC1kaXNhYmxlZCI7eih0aGlzLl96b29tSW5CdXR0b24sZSkseih0aGlzLl96b29tT3V0QnV0dG9uLGUpLHRoaXMuX3pvb21JbkJ1dHRvbi5zZXRBdHRyaWJ1dGUoImFyaWEtZGlzYWJsZWQiLCJmYWxzZSIpLHRoaXMuX3pvb21PdXRCdXR0b24uc2V0QXR0cmlidXRlKCJhcmlhLWRpc2FibGVkIiwiZmFsc2UiKSwhdGhpcy5fZGlzYWJsZWQmJnQuX3pvb20hPT10LmdldE1pblpvb20oKXx8KE0odGhpcy5fem9vbU91dEJ1dHRvbixlKSx0aGlzLl96b29tT3V0QnV0dG9uLnNldEF0dHJpYnV0ZSgiYXJpYS1kaXNhYmxlZCIsInRydWUiKSksIXRoaXMuX2Rpc2FibGVkJiZ0Ll96b29tIT09dC5nZXRNYXhab29tKCl8fChNKHRoaXMuX3pvb21JbkJ1dHRvbixlKSx0aGlzLl96b29tSW5CdXR0b24uc2V0QXR0cmlidXRlKCJhcmlhLWRpc2FibGVkIiwidHJ1ZSIpKX19KSxVZT0oQS5tZXJnZU9wdGlvbnMoe3pvb21Db250cm9sOiEwfSksQS5hZGRJbml0SG9vayhmdW5jdGlvbigpe3RoaXMub3B0aW9ucy56b29tQ29udHJvbCYmKHRoaXMuem9vbUNvbnRyb2w9bmV3IEZlLHRoaXMuYWRkQ29udHJvbCh0aGlzLnpvb21Db250cm9sKSl9KSxCLmV4dGVuZCh7b3B0aW9uczp7cG9zaXRpb246ImJvdHRvbWxlZnQiLG1heFdpZHRoOjEwMCxtZXRyaWM6ITAsaW1wZXJpYWw6ITB9LG9uQWRkOmZ1bmN0aW9uKHQpe3ZhciBlPSJsZWFmbGV0LWNvbnRyb2wtc2NhbGUiLGk9UCgiZGl2IixlKSxuPXRoaXMub3B0aW9ucztyZXR1cm4gdGhpcy5fYWRkU2NhbGVzKG4sZSsiLWxpbmUiLGkpLHQub24obi51cGRhdGVXaGVuSWRsZT8ibW92ZWVuZCI6Im1vdmUiLHRoaXMuX3VwZGF0ZSx0aGlzKSx0LndoZW5SZWFkeSh0aGlzLl91cGRhdGUsdGhpcyksaX0sb25SZW1vdmU6ZnVuY3Rpb24odCl7dC5vZmYodGhpcy5vcHRpb25zLnVwZGF0ZVdoZW5JZGxlPyJtb3ZlZW5kIjoibW92ZSIsdGhpcy5fdXBkYXRlLHRoaXMpfSxfYWRkU2NhbGVzOmZ1bmN0aW9uKHQsZSxpKXt0Lm1ldHJpYyYmKHRoaXMuX21TY2FsZT1QKCJkaXYiLGUsaSkpLHQuaW1wZXJpYWwmJih0aGlzLl9pU2NhbGU9UCgiZGl2IixlLGkpKX0sX3VwZGF0ZTpmdW5jdGlvbigpe3ZhciB0PShlPXRoaXMuX21hcCkuZ2V0U2l6ZSgpLnkvMixlPWUuZGlzdGFuY2UoZS5jb250YWluZXJQb2ludFRvTGF0TG5nKFswLHRdKSxlLmNvbnRhaW5lclBvaW50VG9MYXRMbmcoW3RoaXMub3B0aW9ucy5tYXhXaWR0aCx0XSkpO3RoaXMuX3VwZGF0ZVNjYWxlcyhlKX0sX3VwZGF0ZVNjYWxlczpmdW5jdGlvbih0KXt0aGlzLm9wdGlvbnMubWV0cmljJiZ0JiZ0aGlzLl91cGRhdGVNZXRyaWModCksdGhpcy5vcHRpb25zLmltcGVyaWFsJiZ0JiZ0aGlzLl91cGRhdGVJbXBlcmlhbCh0KX0sX3VwZGF0ZU1ldHJpYzpmdW5jdGlvbih0KXt2YXIgZT10aGlzLl9nZXRSb3VuZE51bSh0KTt0aGlzLl91cGRhdGVTY2FsZSh0aGlzLl9tU2NhbGUsZTwxZTM\/ZSsiIG0iOmUvMWUzKyIga20iLGUvdCl9LF91cGRhdGVJbXBlcmlhbDpmdW5jdGlvbih0KXt2YXIgZSxpOzUyODA8KHQ9My4yODA4Mzk5KnQpPyhpPXRoaXMuX2dldFJvdW5kTnVtKGU9dC81MjgwKSx0aGlzLl91cGRhdGVTY2FsZSh0aGlzLl9pU2NhbGUsaSsiIG1pIixpL2UpKTooaT10aGlzLl9nZXRSb3VuZE51bSh0KSx0aGlzLl91cGRhdGVTY2FsZSh0aGlzLl9pU2NhbGUsaSsiIGZ0IixpL3QpKX0sX3VwZGF0ZVNjYWxlOmZ1bmN0aW9uKHQsZSxpKXt0LnN0eWxlLndpZHRoPU1hdGgucm91bmQodGhpcy5vcHRpb25zLm1heFdpZHRoKmkpKyJweCIsdC5pbm5lckhUTUw9ZX0sX2dldFJvdW5kTnVtOmZ1bmN0aW9uKHQpe3ZhciBlPU1hdGgucG93KDEwLChNYXRoLmZsb29yKHQpKyIiKS5sZW5ndGgtMSk7cmV0dXJuIGUqKDEwPD0odD10L2UpPzEwOjU8PXQ\/NTozPD10PzM6Mjw9dD8yOjEpfX0pKSxWZT1CLmV4dGVuZCh7b3B0aW9uczp7cG9zaXRpb246ImJvdHRvbXJpZ2h0IixwcmVmaXg6JzxhIGhyZWY9Imh0dHBzOi8vbGVhZmxldGpzLmNvbSIgdGl0bGU9IkEgSmF2YVNjcmlwdCBsaWJyYXJ5IGZvciBpbnRlcmFjdGl2ZSBtYXBzIj4nKyhiLmlubGluZVN2Zz8nPHN2ZyBhcmlhLWhpZGRlbj0idHJ1ZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB3aWR0aD0iMTIiIGhlaWdodD0iOCIgdmlld0JveD0iMCAwIDEyIDgiIGNsYXNzPSJsZWFmbGV0LWF0dHJpYnV0aW9uLWZsYWciPjxwYXRoIGZpbGw9IiM0QzdCRTEiIGQ9Ik0wIDBoMTJ2NEgweiIvPjxwYXRoIGZpbGw9IiNGRkQ1MDAiIGQ9Ik0wIDRoMTJ2M0gweiIvPjxwYXRoIGZpbGw9IiNFMEJDMDAiIGQ9Ik0wIDdoMTJ2MUgweiIvPjwvc3ZnPiAnOiIiKSsiTGVhZmxldDwvYT4ifSxpbml0aWFsaXplOmZ1bmN0aW9uKHQpe2godGhpcyx0KSx0aGlzLl9hdHRyaWJ1dGlvbnM9e319LG9uQWRkOmZ1bmN0aW9uKHQpe2Zvcih2YXIgZSBpbih0LmF0dHJpYnV0aW9uQ29udHJvbD10aGlzKS5fY29udGFpbmVyPVAoImRpdiIsImxlYWZsZXQtY29udHJvbC1hdHRyaWJ1dGlvbiIpLE9lKHRoaXMuX2NvbnRhaW5lciksdC5fbGF5ZXJzKXQuX2xheWVyc1tlXS5nZXRBdHRyaWJ1dGlvbiYmdGhpcy5hZGRBdHRyaWJ1dGlvbih0Ll9sYXllcnNbZV0uZ2V0QXR0cmlidXRpb24oKSk7cmV0dXJuIHRoaXMuX3VwZGF0ZSgpLHQub24oImxheWVyYWRkIix0aGlzLl9hZGRBdHRyaWJ1dGlvbix0aGlzKSx0aGlzLl9jb250YWluZXJ9LG9uUmVtb3ZlOmZ1bmN0aW9uKHQpe3Qub2ZmKCJsYXllcmFkZCIsdGhpcy5fYWRkQXR0cmlidXRpb24sdGhpcyl9LF9hZGRBdHRyaWJ1dGlvbjpmdW5jdGlvbih0KXt0LmxheWVyLmdldEF0dHJpYnV0aW9uJiYodGhpcy5hZGRBdHRyaWJ1dGlvbih0LmxheWVyLmdldEF0dHJpYnV0aW9uKCkpLHQubGF5ZXIub25jZSgicmVtb3ZlIixmdW5jdGlvbigpe3RoaXMucmVtb3ZlQXR0cmlidXRpb24odC5sYXllci5nZXRBdHRyaWJ1dGlvbigpKX0sdGhpcykpfSxzZXRQcmVmaXg6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMub3B0aW9ucy5wcmVmaXg9dCx0aGlzLl91cGRhdGUoKSx0aGlzfSxhZGRBdHRyaWJ1dGlvbjpmdW5jdGlvbih0KXtyZXR1cm4gdCYmKHRoaXMuX2F0dHJpYnV0aW9uc1t0XXx8KHRoaXMuX2F0dHJpYnV0aW9uc1t0XT0wKSx0aGlzLl9hdHRyaWJ1dGlvbnNbdF0rKyx0aGlzLl91cGRhdGUoKSksdGhpc30scmVtb3ZlQXR0cmlidXRpb246ZnVuY3Rpb24odCl7cmV0dXJuIHQmJnRoaXMuX2F0dHJpYnV0aW9uc1t0XSYmKHRoaXMuX2F0dHJpYnV0aW9uc1t0XS0tLHRoaXMuX3VwZGF0ZSgpKSx0aGlzfSxfdXBkYXRlOmZ1bmN0aW9uKCl7aWYodGhpcy5fbWFwKXt2YXIgdCxlPVtdO2Zvcih0IGluIHRoaXMuX2F0dHJpYnV0aW9ucyl0aGlzLl9hdHRyaWJ1dGlvbnNbdF0mJmUucHVzaCh0KTt2YXIgaT1bXTt0aGlzLm9wdGlvbnMucHJlZml4JiZpLnB1c2godGhpcy5vcHRpb25zLnByZWZpeCksZS5sZW5ndGgmJmkucHVzaChlLmpvaW4oIiwgIikpLHRoaXMuX2NvbnRhaW5lci5pbm5lckhUTUw9aS5qb2luKCcgPHNwYW4gYXJpYS1oaWRkZW49InRydWUiPnw8L3NwYW4+ICcpfX19KTtBLm1lcmdlT3B0aW9ucyh7YXR0cmlidXRpb25Db250cm9sOiEwfSksQS5hZGRJbml0SG9vayhmdW5jdGlvbigpe3RoaXMub3B0aW9ucy5hdHRyaWJ1dGlvbkNvbnRyb2wmJihuZXcgVmUpLmFkZFRvKHRoaXMpfSksQi5MYXllcnM9V2UsQi5ab29tPUZlLEIuU2NhbGU9VWUsQi5BdHRyaWJ1dGlvbj1WZSxIZS5sYXllcnM9ZnVuY3Rpb24odCxlLGkpe3JldHVybiBuZXcgV2UodCxlLGkpfSxIZS56b29tPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgRmUodCl9LEhlLnNjYWxlPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgVWUodCl9LEhlLmF0dHJpYnV0aW9uPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgVmUodCl9OyhuPWV0LmV4dGVuZCh7aW5pdGlhbGl6ZTpmdW5jdGlvbih0KXt0aGlzLl9tYXA9dH0sZW5hYmxlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2VuYWJsZWR8fCh0aGlzLl9lbmFibGVkPSEwLHRoaXMuYWRkSG9va3MoKSksdGhpc30sZGlzYWJsZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9lbmFibGVkJiYodGhpcy5fZW5hYmxlZD0hMSx0aGlzLnJlbW92ZUhvb2tzKCkpLHRoaXN9LGVuYWJsZWQ6ZnVuY3Rpb24oKXtyZXR1cm4hIXRoaXMuX2VuYWJsZWR9fSkpLmFkZFRvPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQuYWRkSGFuZGxlcihlLHRoaXMpLHRoaXN9O3ZhciBtdD17RXZlbnRzOmV9LHFlPWIudG91Y2g\/InRvdWNoc3RhcnQgbW91c2Vkb3duIjoibW91c2Vkb3duIixHZT1pdC5leHRlbmQoe29wdGlvbnM6e2NsaWNrVG9sZXJhbmNlOjN9LGluaXRpYWxpemU6ZnVuY3Rpb24odCxlLGksbil7aCh0aGlzLG4pLHRoaXMuX2VsZW1lbnQ9dCx0aGlzLl9kcmFnU3RhcnRUYXJnZXQ9ZXx8dCx0aGlzLl9wcmV2ZW50T3V0bGluZT1pfSxlbmFibGU6ZnVuY3Rpb24oKXt0aGlzLl9lbmFibGVkfHwoUyh0aGlzLl9kcmFnU3RhcnRUYXJnZXQscWUsdGhpcy5fb25Eb3duLHRoaXMpLHRoaXMuX2VuYWJsZWQ9ITApfSxkaXNhYmxlOmZ1bmN0aW9uKCl7dGhpcy5fZW5hYmxlZCYmKEdlLl9kcmFnZ2luZz09PXRoaXMmJnRoaXMuZmluaXNoRHJhZyghMCksayh0aGlzLl9kcmFnU3RhcnRUYXJnZXQscWUsdGhpcy5fb25Eb3duLHRoaXMpLHRoaXMuX2VuYWJsZWQ9ITEsdGhpcy5fbW92ZWQ9ITEpfSxfb25Eb3duOmZ1bmN0aW9uKHQpe3ZhciBlLGk7dGhpcy5fZW5hYmxlZCYmKHRoaXMuX21vdmVkPSExLF9lKHRoaXMuX2VsZW1lbnQsImxlYWZsZXQtem9vbS1hbmltIil8fCh0LnRvdWNoZXMmJjEhPT10LnRvdWNoZXMubGVuZ3RoP0dlLl9kcmFnZ2luZz09PXRoaXMmJnRoaXMuZmluaXNoRHJhZygpOkdlLl9kcmFnZ2luZ3x8dC5zaGlmdEtleXx8MSE9PXQud2hpY2gmJjEhPT10LmJ1dHRvbiYmIXQudG91Y2hlc3x8KChHZS5fZHJhZ2dpbmc9dGhpcykuX3ByZXZlbnRPdXRsaW5lJiZ3ZSh0aGlzLl9lbGVtZW50KSx5ZSgpLGllKCksdGhpcy5fbW92aW5nfHwodGhpcy5maXJlKCJkb3duIiksaT10LnRvdWNoZXM\/dC50b3VjaGVzWzBdOnQsZT1QZSh0aGlzLl9lbGVtZW50KSx0aGlzLl9zdGFydFBvaW50PW5ldyBwKGkuY2xpZW50WCxpLmNsaWVudFkpLHRoaXMuX3N0YXJ0UG9zPXZlKHRoaXMuX2VsZW1lbnQpLHRoaXMuX3BhcmVudFNjYWxlPUxlKGUpLGk9Im1vdXNlZG93biI9PT10LnR5cGUsUyhkb2N1bWVudCxpPyJtb3VzZW1vdmUiOiJ0b3VjaG1vdmUiLHRoaXMuX29uTW92ZSx0aGlzKSxTKGRvY3VtZW50LGk\/Im1vdXNldXAiOiJ0b3VjaGVuZCB0b3VjaGNhbmNlbCIsdGhpcy5fb25VcCx0aGlzKSkpKSl9LF9vbk1vdmU6ZnVuY3Rpb24odCl7dmFyIGU7dGhpcy5fZW5hYmxlZCYmKHQudG91Y2hlcyYmMTx0LnRvdWNoZXMubGVuZ3RoP3RoaXMuX21vdmVkPSEwOiEoZT1uZXcgcCgoZT10LnRvdWNoZXMmJjE9PT10LnRvdWNoZXMubGVuZ3RoP3QudG91Y2hlc1swXTp0KS5jbGllbnRYLGUuY2xpZW50WSkuX3N1YnRyYWN0KHRoaXMuX3N0YXJ0UG9pbnQpKS54JiYhZS55fHxNYXRoLmFicyhlLngpK01hdGguYWJzKGUueSk8dGhpcy5vcHRpb25zLmNsaWNrVG9sZXJhbmNlfHwoZS54Lz10aGlzLl9wYXJlbnRTY2FsZS54LGUueS89dGhpcy5fcGFyZW50U2NhbGUueSxPKHQpLHRoaXMuX21vdmVkfHwodGhpcy5maXJlKCJkcmFnc3RhcnQiKSx0aGlzLl9tb3ZlZD0hMCxNKGRvY3VtZW50LmJvZHksImxlYWZsZXQtZHJhZ2dpbmciKSx0aGlzLl9sYXN0VGFyZ2V0PXQudGFyZ2V0fHx0LnNyY0VsZW1lbnQsd2luZG93LlNWR0VsZW1lbnRJbnN0YW5jZSYmdGhpcy5fbGFzdFRhcmdldCBpbnN0YW5jZW9mIHdpbmRvdy5TVkdFbGVtZW50SW5zdGFuY2UmJih0aGlzLl9sYXN0VGFyZ2V0PXRoaXMuX2xhc3RUYXJnZXQuY29ycmVzcG9uZGluZ1VzZUVsZW1lbnQpLE0odGhpcy5fbGFzdFRhcmdldCwibGVhZmxldC1kcmFnLXRhcmdldCIpKSx0aGlzLl9uZXdQb3M9dGhpcy5fc3RhcnRQb3MuYWRkKGUpLHRoaXMuX21vdmluZz0hMCx0aGlzLl9sYXN0RXZlbnQ9dCx0aGlzLl91cGRhdGVQb3NpdGlvbigpKSl9LF91cGRhdGVQb3NpdGlvbjpmdW5jdGlvbigpe3ZhciB0PXtvcmlnaW5hbEV2ZW50OnRoaXMuX2xhc3RFdmVudH07dGhpcy5maXJlKCJwcmVkcmFnIix0KSxaKHRoaXMuX2VsZW1lbnQsdGhpcy5fbmV3UG9zKSx0aGlzLmZpcmUoImRyYWciLHQpfSxfb25VcDpmdW5jdGlvbigpe3RoaXMuX2VuYWJsZWQmJnRoaXMuZmluaXNoRHJhZygpfSxmaW5pc2hEcmFnOmZ1bmN0aW9uKHQpe3ooZG9jdW1lbnQuYm9keSwibGVhZmxldC1kcmFnZ2luZyIpLHRoaXMuX2xhc3RUYXJnZXQmJih6KHRoaXMuX2xhc3RUYXJnZXQsImxlYWZsZXQtZHJhZy10YXJnZXQiKSx0aGlzLl9sYXN0VGFyZ2V0PW51bGwpLGsoZG9jdW1lbnQsIm1vdXNlbW92ZSB0b3VjaG1vdmUiLHRoaXMuX29uTW92ZSx0aGlzKSxrKGRvY3VtZW50LCJtb3VzZXVwIHRvdWNoZW5kIHRvdWNoY2FuY2VsIix0aGlzLl9vblVwLHRoaXMpLHhlKCksVGUoKTt2YXIgZT10aGlzLl9tb3ZlZCYmdGhpcy5fbW92aW5nO3RoaXMuX21vdmluZz0hMSxHZS5fZHJhZ2dpbmc9ITEsZSYmdGhpcy5maXJlKCJkcmFnZW5kIix7bm9JbmVydGlhOnQsZGlzdGFuY2U6dGhpcy5fbmV3UG9zLmRpc3RhbmNlVG8odGhpcy5fc3RhcnRQb3MpfSl9fSk7ZnVuY3Rpb24gS2UodCxlLGkpe2Zvcih2YXIgbixvLHMscixhLGgsbCx1PVsxLDQsMiw4XSxjPTAsZD10Lmxlbmd0aDtjPGQ7YysrKXRbY10uX2NvZGU9aWkodFtjXSxlKTtmb3Iocz0wO3M8NDtzKyspe2ZvcihoPXVbc10sbj1bXSxjPTAsbz0oZD10Lmxlbmd0aCktMTtjPGQ7bz1jKyspcj10W2NdLGE9dFtvXSxyLl9jb2RlJmg\/YS5fY29kZSZofHwoKGw9ZWkoYSxyLGgsZSxpKSkuX2NvZGU9aWkobCxlKSxuLnB1c2gobCkpOihhLl9jb2RlJmgmJigobD1laShhLHIsaCxlLGkpKS5fY29kZT1paShsLGUpLG4ucHVzaChsKSksbi5wdXNoKHIpKTt0PW59cmV0dXJuIHR9ZnVuY3Rpb24gWWUodCxlKXt2YXIgaSxuLG8scyxyLGEsaDtpZighdHx8MD09PXQubGVuZ3RoKXRocm93IG5ldyBFcnJvcigibGF0bG5ncyBub3QgcGFzc2VkIik7SSh0KXx8KGNvbnNvbGUud2FybigibGF0bG5ncyBhcmUgbm90IGZsYXQhIE9ubHkgdGhlIGZpcnN0IHJpbmcgd2lsbCBiZSB1c2VkIiksdD10WzBdKTtmb3IodmFyIGw9eChbMCwwXSksdT1nKHQpLGM9KHUuZ2V0Tm9ydGhXZXN0KCkuZGlzdGFuY2VUbyh1LmdldFNvdXRoV2VzdCgpKSp1LmdldE5vcnRoRWFzdCgpLmRpc3RhbmNlVG8odS5nZXROb3J0aFdlc3QoKSk8MTcwMCYmKGw9WGUodCkpLHQubGVuZ3RoKSxkPVtdLF89MDtfPGM7XysrKXt2YXIgcD14KHRbX10pO2QucHVzaChlLnByb2plY3QoeChbcC5sYXQtbC5sYXQscC5sbmctbC5sbmddKSkpfWZvcihfPXI9YT1oPTAsaT1jLTE7XzxjO2k9XysrKW49ZFtfXSxvPWRbaV0scz1uLnkqby54LW8ueSpuLngsYSs9KG4ueCtvLngpKnMsaCs9KG4ueStvLnkpKnMscis9MypzO3JldHVybiB1PTA9PT1yP2RbMF06W2EvcixoL3JdLHgoWyh1PWUudW5wcm9qZWN0KG0odSkpKS5sYXQrbC5sYXQsdS5sbmcrbC5sbmddKX1mdW5jdGlvbiBYZSh0KXtmb3IodmFyIGU9MCxpPTAsbj0wLG89MDtvPHQubGVuZ3RoO28rKyl7dmFyIHM9eCh0W29dKTtlKz1zLmxhdCxpKz1zLmxuZyxuKyt9cmV0dXJuIHgoW2UvbixpL25dKX12YXIgSmUsZnQ9e19fcHJvdG9fXzpudWxsLGNsaXBQb2x5Z29uOktlLHBvbHlnb25DZW50ZXI6WWUsY2VudHJvaWQ6WGV9O2Z1bmN0aW9uICRlKHQsZSl7aWYoZSYmdC5sZW5ndGgpe3ZhciBpPXQ9ZnVuY3Rpb24odCxlKXtmb3IodmFyIGksbixvLHM9W3RbMF1dLHI9MSxhPTAsaD10Lmxlbmd0aDtyPGg7cisrKWk9dFtyXSxuPXRbYV0sbz12b2lkIDAsKG89bi54LWkueCkqbysobj1uLnktaS55KSpuPmUmJihzLnB1c2godFtyXSksYT1yKTtyZXR1cm4gYTxoLTEmJnMucHVzaCh0W2gtMV0pLHN9KHQsZSo9ZSksbj1pLmxlbmd0aCxvPW5ldyh0eXBlb2YgVWludDhBcnJheSE9dm9pZCAwKyIiP1VpbnQ4QXJyYXk6QXJyYXkpKG4pO29bMF09b1tuLTFdPTEsZnVuY3Rpb24gdChlLGksbixvLHMpe2Zvcih2YXIgcixhLGg9MCxsPW8rMTtsPD1zLTE7bCsrKWg8KGE9bmkoZVtsXSxlW29dLGVbc10sITApKSYmKHI9bCxoPWEpO248aCYmKGlbcl09MSx0KGUsaSxuLG8sciksdChlLGksbixyLHMpKX0oaSxvLGUsMCxuLTEpO2Zvcih2YXIgcz1bXSxyPTA7cjxuO3IrKylvW3JdJiZzLnB1c2goaVtyXSk7cmV0dXJuIHN9cmV0dXJuIHQuc2xpY2UoKX1mdW5jdGlvbiBRZSh0LGUsaSl7cmV0dXJuIE1hdGguc3FydChuaSh0LGUsaSwhMCkpfWZ1bmN0aW9uIHRpKHQsZSxpLG4sbyl7dmFyIHMscixhLGg9bj9KZTppaSh0LGkpLGw9aWkoZSxpKTtmb3IoSmU9bDs7KXtpZighKGh8bCkpcmV0dXJuW3QsZV07aWYoaCZsKXJldHVybiExO2E9aWkocj1laSh0LGUscz1ofHxsLGksbyksaSkscz09PWg\/KHQ9cixoPWEpOihlPXIsbD1hKX19ZnVuY3Rpb24gZWkodCxlLGksbixvKXt2YXIgcyxyLGE9ZS54LXQueCxlPWUueS10LnksaD1uLm1pbixuPW4ubWF4O3JldHVybiA4Jmk\/KHM9dC54K2EqKG4ueS10LnkpL2Uscj1uLnkpOjQmaT8ocz10LngrYSooaC55LXQueSkvZSxyPWgueSk6MiZpPyhzPW4ueCxyPXQueStlKihuLngtdC54KS9hKToxJmkmJihzPWgueCxyPXQueStlKihoLngtdC54KS9hKSxuZXcgcChzLHIsbyl9ZnVuY3Rpb24gaWkodCxlKXt2YXIgaT0wO3JldHVybiB0Lng8ZS5taW4ueD9pfD0xOnQueD5lLm1heC54JiYoaXw9MiksdC55PGUubWluLnk\/aXw9NDp0Lnk+ZS5tYXgueSYmKGl8PTgpLGl9ZnVuY3Rpb24gbmkodCxlLGksbil7dmFyIG89ZS54LGU9ZS55LHM9aS54LW8scj1pLnktZSxhPXMqcytyKnI7cmV0dXJuIDA8YSYmKDE8KGE9KCh0LngtbykqcysodC55LWUpKnIpL2EpPyhvPWkueCxlPWkueSk6MDxhJiYobys9cyphLGUrPXIqYSkpLHM9dC54LW8scj10LnktZSxuP3MqcytyKnI6bmV3IHAobyxlKX1mdW5jdGlvbiBJKHQpe3JldHVybiF1KHRbMF0pfHwib2JqZWN0IiE9dHlwZW9mIHRbMF1bMF0mJnZvaWQgMCE9PXRbMF1bMF19ZnVuY3Rpb24gb2kodCl7cmV0dXJuIGNvbnNvbGUud2FybigiRGVwcmVjYXRlZCB1c2Ugb2YgX2ZsYXQsIHBsZWFzZSB1c2UgTC5MaW5lVXRpbC5pc0ZsYXQgaW5zdGVhZC4iKSxJKHQpfWZ1bmN0aW9uIHNpKHQsZSl7dmFyIGksbixvLHMscixhO2lmKCF0fHwwPT09dC5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJsYXRsbmdzIG5vdCBwYXNzZWQiKTtJKHQpfHwoY29uc29sZS53YXJuKCJsYXRsbmdzIGFyZSBub3QgZmxhdCEgT25seSB0aGUgZmlyc3QgcmluZyB3aWxsIGJlIHVzZWQiKSx0PXRbMF0pO2Zvcih2YXIgaD14KFswLDBdKSxsPWcodCksdT0obC5nZXROb3J0aFdlc3QoKS5kaXN0YW5jZVRvKGwuZ2V0U291dGhXZXN0KCkpKmwuZ2V0Tm9ydGhFYXN0KCkuZGlzdGFuY2VUbyhsLmdldE5vcnRoV2VzdCgpKTwxNzAwJiYoaD1YZSh0KSksdC5sZW5ndGgpLGM9W10sZD0wO2Q8dTtkKyspe3ZhciBfPXgodFtkXSk7Yy5wdXNoKGUucHJvamVjdCh4KFtfLmxhdC1oLmxhdCxfLmxuZy1oLmxuZ10pKSl9Zm9yKGk9ZD0wO2Q8dS0xO2QrKylpKz1jW2RdLmRpc3RhbmNlVG8oY1tkKzFdKS8yO2lmKDA9PT1pKWE9Y1swXTtlbHNlIGZvcihuPWQ9MDtkPHUtMTtkKyspaWYobz1jW2RdLHM9Y1tkKzFdLGk8KG4rPXI9by5kaXN0YW5jZVRvKHMpKSl7YT1bcy54LShyPShuLWkpL3IpKihzLngtby54KSxzLnktcioocy55LW8ueSldO2JyZWFrfXJldHVybiB4KFsobD1lLnVucHJvamVjdChtKGEpKSkubGF0K2gubGF0LGwubG5nK2gubG5nXSl9dmFyIGd0PXtfX3Byb3RvX186bnVsbCxzaW1wbGlmeTokZSxwb2ludFRvU2VnbWVudERpc3RhbmNlOlFlLGNsb3Nlc3RQb2ludE9uU2VnbWVudDpmdW5jdGlvbih0LGUsaSl7cmV0dXJuIG5pKHQsZSxpKX0sY2xpcFNlZ21lbnQ6dGksX2dldEVkZ2VJbnRlcnNlY3Rpb246ZWksX2dldEJpdENvZGU6aWksX3NxQ2xvc2VzdFBvaW50T25TZWdtZW50Om5pLGlzRmxhdDpJLF9mbGF0Om9pLHBvbHlsaW5lQ2VudGVyOnNpfSx4dD17X19wcm90b19fOm51bGwsTG9uTGF0OnZ0PXtwcm9qZWN0OmZ1bmN0aW9uKHQpe3JldHVybiBuZXcgcCh0LmxuZyx0LmxhdCl9LHVucHJvamVjdDpmdW5jdGlvbih0KXtyZXR1cm4gbmV3IHYodC55LHQueCl9LGJvdW5kczpuZXcgZihbLTE4MCwtOTBdLFsxODAsOTBdKX0sTWVyY2F0b3I6eXQ9e1I6NjM3ODEzNyxSX01JTk9SOjYzNTY3NTIuMzE0MjQ1MTc5LGJvdW5kczpuZXcgZihbLTIwMDM3NTA4LjM0Mjc5LC0xNTQ5NjU3MC43Mzk3Ml0sWzIwMDM3NTA4LjM0Mjc5LDE4NzY0NjU2LjIzMTM4XSkscHJvamVjdDpmdW5jdGlvbih0KXt2YXIgZT1NYXRoLlBJLzE4MCxpPXRoaXMuUixuPXQubGF0KmUsbz10aGlzLlJfTUlOT1IvaSxzPShvPU1hdGguc3FydCgxLW8qbykpKk1hdGguc2luKG4pLHM9TWF0aC50YW4oTWF0aC5QSS80LW4vMikvTWF0aC5wb3coKDEtcykvKDErcyksby8yKSxuPS1pKk1hdGgubG9nKE1hdGgubWF4KHMsMWUtMTApKTtyZXR1cm4gbmV3IHAodC5sbmcqZSppLG4pfSx1bnByb2plY3Q6ZnVuY3Rpb24odCl7Zm9yKHZhciBlLGk9MTgwL01hdGguUEksbj10aGlzLlIsbz10aGlzLlJfTUlOT1IvbixzPU1hdGguc3FydCgxLW8qbykscj1NYXRoLmV4cCgtdC55L24pLGE9TWF0aC5QSS8yLTIqTWF0aC5hdGFuKHIpLGg9MCxsPS4xO2g8MTUmJjFlLTc8TWF0aC5hYnMobCk7aCsrKWU9cypNYXRoLnNpbihhKSxlPU1hdGgucG93KCgxLWUpLygxK2UpLHMvMiksYSs9bD1NYXRoLlBJLzItMipNYXRoLmF0YW4ociplKS1hO3JldHVybiBuZXcgdihhKmksdC54Kmkvbil9fSxTcGhlcmljYWxNZXJjYXRvcjpydH0sYnQ9bCh7fSxzdCx7Y29kZToiRVBTRzozMzk1Iixwcm9qZWN0aW9uOnl0LHRyYW5zZm9ybWF0aW9uOmh0KHd0PS41LyhNYXRoLlBJKnl0LlIpLC41LC13dCwuNSl9KSxyaT1sKHt9LHN0LHtjb2RlOiJFUFNHOjQzMjYiLHByb2plY3Rpb246dnQsdHJhbnNmb3JtYXRpb246aHQoMS8xODAsMSwtMS8xODAsLjUpfSksUHQ9bCh7fSxvdCx7cHJvamVjdGlvbjp2dCx0cmFuc2Zvcm1hdGlvbjpodCgxLDAsLTEsMCksc2NhbGU6ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGgucG93KDIsdCl9LHpvb206ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGgubG9nKHQpL01hdGguTE4yfSxkaXN0YW5jZTpmdW5jdGlvbih0LGUpe3ZhciBpPWUubG5nLXQubG5nLGU9ZS5sYXQtdC5sYXQ7cmV0dXJuIE1hdGguc3FydChpKmkrZSplKX0saW5maW5pdGU6ITB9KSxvPShvdC5FYXJ0aD1zdCxvdC5FUFNHMzM5NT1idCxvdC5FUFNHMzg1Nz1sdCxvdC5FUFNHOTAwOTEzPXV0LG90LkVQU0c0MzI2PXJpLG90LlNpbXBsZT1QdCxpdC5leHRlbmQoe29wdGlvbnM6e3BhbmU6Im92ZXJsYXlQYW5lIixhdHRyaWJ1dGlvbjpudWxsLGJ1YmJsaW5nTW91c2VFdmVudHM6ITB9LGFkZFRvOmZ1bmN0aW9uKHQpe3JldHVybiB0LmFkZExheWVyKHRoaXMpLHRoaXN9LHJlbW92ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnJlbW92ZUZyb20odGhpcy5fbWFwfHx0aGlzLl9tYXBUb0FkZCl9LHJlbW92ZUZyb206ZnVuY3Rpb24odCl7cmV0dXJuIHQmJnQucmVtb3ZlTGF5ZXIodGhpcyksdGhpc30sZ2V0UGFuZTpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fbWFwLmdldFBhbmUodD90aGlzLm9wdGlvbnNbdF18fHQ6dGhpcy5vcHRpb25zLnBhbmUpfSxhZGRJbnRlcmFjdGl2ZVRhcmdldDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fbWFwLl90YXJnZXRzW2QodCldPXRoaXN9LHJlbW92ZUludGVyYWN0aXZlVGFyZ2V0OmZ1bmN0aW9uKHQpe3JldHVybiBkZWxldGUgdGhpcy5fbWFwLl90YXJnZXRzW2QodCldLHRoaXN9LGdldEF0dHJpYnV0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGlvbn0sX2xheWVyQWRkOmZ1bmN0aW9uKHQpe3ZhciBlLGk9dC50YXJnZXQ7aS5oYXNMYXllcih0aGlzKSYmKHRoaXMuX21hcD1pLHRoaXMuX3pvb21BbmltYXRlZD1pLl96b29tQW5pbWF0ZWQsdGhpcy5nZXRFdmVudHMmJihlPXRoaXMuZ2V0RXZlbnRzKCksaS5vbihlLHRoaXMpLHRoaXMub25jZSgicmVtb3ZlIixmdW5jdGlvbigpe2kub2ZmKGUsdGhpcyl9LHRoaXMpKSx0aGlzLm9uQWRkKGkpLHRoaXMuZmlyZSgiYWRkIiksaS5maXJlKCJsYXllcmFkZCIse2xheWVyOnRoaXN9KSl9fSkpLGFpPShBLmluY2x1ZGUoe2FkZExheWVyOmZ1bmN0aW9uKHQpe3ZhciBlO2lmKHQuX2xheWVyQWRkKXJldHVybiBlPWQodCksdGhpcy5fbGF5ZXJzW2VdfHwoKHRoaXMuX2xheWVyc1tlXT10KS5fbWFwVG9BZGQ9dGhpcyx0LmJlZm9yZUFkZCYmdC5iZWZvcmVBZGQodGhpcyksdGhpcy53aGVuUmVhZHkodC5fbGF5ZXJBZGQsdCkpLHRoaXM7dGhyb3cgbmV3IEVycm9yKCJUaGUgcHJvdmlkZWQgb2JqZWN0IGlzIG5vdCBhIExheWVyLiIpfSxyZW1vdmVMYXllcjpmdW5jdGlvbih0KXt2YXIgZT1kKHQpO3JldHVybiB0aGlzLl9sYXllcnNbZV0mJih0aGlzLl9sb2FkZWQmJnQub25SZW1vdmUodGhpcyksZGVsZXRlIHRoaXMuX2xheWVyc1tlXSx0aGlzLl9sb2FkZWQmJih0aGlzLmZpcmUoImxheWVycmVtb3ZlIix7bGF5ZXI6dH0pLHQuZmlyZSgicmVtb3ZlIikpLHQuX21hcD10Ll9tYXBUb0FkZD1udWxsKSx0aGlzfSxoYXNMYXllcjpmdW5jdGlvbih0KXtyZXR1cm4gZCh0KWluIHRoaXMuX2xheWVyc30sZWFjaExheWVyOmZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBpIGluIHRoaXMuX2xheWVycyl0LmNhbGwoZSx0aGlzLl9sYXllcnNbaV0pO3JldHVybiB0aGlzfSxfYWRkTGF5ZXJzOmZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0wLGk9KHQ9dD91KHQpP3Q6W3RdOltdKS5sZW5ndGg7ZTxpO2UrKyl0aGlzLmFkZExheWVyKHRbZV0pfSxfYWRkWm9vbUxpbWl0OmZ1bmN0aW9uKHQpe2lzTmFOKHQub3B0aW9ucy5tYXhab29tKSYmaXNOYU4odC5vcHRpb25zLm1pblpvb20pfHwodGhpcy5fem9vbUJvdW5kTGF5ZXJzW2QodCldPXQsdGhpcy5fdXBkYXRlWm9vbUxldmVscygpKX0sX3JlbW92ZVpvb21MaW1pdDpmdW5jdGlvbih0KXt0PWQodCksdGhpcy5fem9vbUJvdW5kTGF5ZXJzW3RdJiYoZGVsZXRlIHRoaXMuX3pvb21Cb3VuZExheWVyc1t0XSx0aGlzLl91cGRhdGVab29tTGV2ZWxzKCkpfSxfdXBkYXRlWm9vbUxldmVsczpmdW5jdGlvbigpe3ZhciB0LGU9MS8wLGk9LTEvMCxuPXRoaXMuX2dldFpvb21TcGFuKCk7Zm9yKHQgaW4gdGhpcy5fem9vbUJvdW5kTGF5ZXJzKXZhciBvPXRoaXMuX3pvb21Cb3VuZExheWVyc1t0XS5vcHRpb25zLGU9dm9pZCAwPT09by5taW5ab29tP2U6TWF0aC5taW4oZSxvLm1pblpvb20pLGk9dm9pZCAwPT09by5tYXhab29tP2k6TWF0aC5tYXgoaSxvLm1heFpvb20pO3RoaXMuX2xheWVyc01heFpvb209aT09PS0xLzA\/dm9pZCAwOmksdGhpcy5fbGF5ZXJzTWluWm9vbT1lPT09MS8wP3ZvaWQgMDplLG4hPT10aGlzLl9nZXRab29tU3BhbigpJiZ0aGlzLmZpcmUoInpvb21sZXZlbHNjaGFuZ2UiKSx2b2lkIDA9PT10aGlzLm9wdGlvbnMubWF4Wm9vbSYmdGhpcy5fbGF5ZXJzTWF4Wm9vbSYmdGhpcy5nZXRab29tKCk+dGhpcy5fbGF5ZXJzTWF4Wm9vbSYmdGhpcy5zZXRab29tKHRoaXMuX2xheWVyc01heFpvb20pLHZvaWQgMD09PXRoaXMub3B0aW9ucy5taW5ab29tJiZ0aGlzLl9sYXllcnNNaW5ab29tJiZ0aGlzLmdldFpvb20oKTx0aGlzLl9sYXllcnNNaW5ab29tJiZ0aGlzLnNldFpvb20odGhpcy5fbGF5ZXJzTWluWm9vbSl9fSksby5leHRlbmQoe2luaXRpYWxpemU6ZnVuY3Rpb24odCxlKXt2YXIgaSxuO2lmKGgodGhpcyxlKSx0aGlzLl9sYXllcnM9e30sdClmb3IoaT0wLG49dC5sZW5ndGg7aTxuO2krKyl0aGlzLmFkZExheWVyKHRbaV0pfSxhZGRMYXllcjpmdW5jdGlvbih0KXt2YXIgZT10aGlzLmdldExheWVySWQodCk7cmV0dXJuIHRoaXMuX2xheWVyc1tlXT10LHRoaXMuX21hcCYmdGhpcy5fbWFwLmFkZExheWVyKHQpLHRoaXN9LHJlbW92ZUxheWVyOmZ1bmN0aW9uKHQpe3JldHVybiB0PXQgaW4gdGhpcy5fbGF5ZXJzP3Q6dGhpcy5nZXRMYXllcklkKHQpLHRoaXMuX21hcCYmdGhpcy5fbGF5ZXJzW3RdJiZ0aGlzLl9tYXAucmVtb3ZlTGF5ZXIodGhpcy5fbGF5ZXJzW3RdKSxkZWxldGUgdGhpcy5fbGF5ZXJzW3RdLHRoaXN9LGhhc0xheWVyOmZ1bmN0aW9uKHQpe3JldHVybigibnVtYmVyIj09dHlwZW9mIHQ\/dDp0aGlzLmdldExheWVySWQodCkpaW4gdGhpcy5fbGF5ZXJzfSxjbGVhckxheWVyczpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVhY2hMYXllcih0aGlzLnJlbW92ZUxheWVyLHRoaXMpfSxpbnZva2U6ZnVuY3Rpb24odCl7dmFyIGUsaSxuPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywxKTtmb3IoZSBpbiB0aGlzLl9sYXllcnMpKGk9dGhpcy5fbGF5ZXJzW2VdKVt0XSYmaVt0XS5hcHBseShpLG4pO3JldHVybiB0aGlzfSxvbkFkZDpmdW5jdGlvbih0KXt0aGlzLmVhY2hMYXllcih0LmFkZExheWVyLHQpfSxvblJlbW92ZTpmdW5jdGlvbih0KXt0aGlzLmVhY2hMYXllcih0LnJlbW92ZUxheWVyLHQpfSxlYWNoTGF5ZXI6ZnVuY3Rpb24odCxlKXtmb3IodmFyIGkgaW4gdGhpcy5fbGF5ZXJzKXQuY2FsbChlLHRoaXMuX2xheWVyc1tpXSk7cmV0dXJuIHRoaXN9LGdldExheWVyOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9sYXllcnNbdF19LGdldExheWVyczpmdW5jdGlvbigpe3ZhciB0PVtdO3JldHVybiB0aGlzLmVhY2hMYXllcih0LnB1c2gsdCksdH0sc2V0WkluZGV4OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmludm9rZSgic2V0WkluZGV4Iix0KX0sZ2V0TGF5ZXJJZDpkfSkpLGhpPWFpLmV4dGVuZCh7YWRkTGF5ZXI6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuaGFzTGF5ZXIodCk\/dGhpczoodC5hZGRFdmVudFBhcmVudCh0aGlzKSxhaS5wcm90b3R5cGUuYWRkTGF5ZXIuY2FsbCh0aGlzLHQpLHRoaXMuZmlyZSgibGF5ZXJhZGQiLHtsYXllcjp0fSkpfSxyZW1vdmVMYXllcjpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5oYXNMYXllcih0KT8oKHQ9dCBpbiB0aGlzLl9sYXllcnM\/dGhpcy5fbGF5ZXJzW3RdOnQpLnJlbW92ZUV2ZW50UGFyZW50KHRoaXMpLGFpLnByb3RvdHlwZS5yZW1vdmVMYXllci5jYWxsKHRoaXMsdCksdGhpcy5maXJlKCJsYXllcnJlbW92ZSIse2xheWVyOnR9KSk6dGhpc30sc2V0U3R5bGU6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuaW52b2tlKCJzZXRTdHlsZSIsdCl9LGJyaW5nVG9Gcm9udDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmludm9rZSgiYnJpbmdUb0Zyb250Iil9LGJyaW5nVG9CYWNrOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaW52b2tlKCJicmluZ1RvQmFjayIpfSxnZXRCb3VuZHM6ZnVuY3Rpb24oKXt2YXIgdCxlPW5ldyBzO2Zvcih0IGluIHRoaXMuX2xheWVycyl7dmFyIGk9dGhpcy5fbGF5ZXJzW3RdO2UuZXh0ZW5kKGkuZ2V0Qm91bmRzP2kuZ2V0Qm91bmRzKCk6aS5nZXRMYXRMbmcoKSl9cmV0dXJuIGV9fSksbGk9ZXQuZXh0ZW5kKHtvcHRpb25zOntwb3B1cEFuY2hvcjpbMCwwXSx0b29sdGlwQW5jaG9yOlswLDBdLGNyb3NzT3JpZ2luOiExfSxpbml0aWFsaXplOmZ1bmN0aW9uKHQpe2godGhpcyx0KX0sY3JlYXRlSWNvbjpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fY3JlYXRlSWNvbigiaWNvbiIsdCl9LGNyZWF0ZVNoYWRvdzpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fY3JlYXRlSWNvbigic2hhZG93Iix0KX0sX2NyZWF0ZUljb246ZnVuY3Rpb24odCxlKXt2YXIgaT10aGlzLl9nZXRJY29uVXJsKHQpO2lmKGkpcmV0dXJuIGk9dGhpcy5fY3JlYXRlSW1nKGksZSYmIklNRyI9PT1lLnRhZ05hbWU\/ZTpudWxsKSx0aGlzLl9zZXRJY29uU3R5bGVzKGksdCksIXRoaXMub3B0aW9ucy5jcm9zc09yaWdpbiYmIiIhPT10aGlzLm9wdGlvbnMuY3Jvc3NPcmlnaW58fChpLmNyb3NzT3JpZ2luPSEwPT09dGhpcy5vcHRpb25zLmNyb3NzT3JpZ2luPyIiOnRoaXMub3B0aW9ucy5jcm9zc09yaWdpbiksaTtpZigiaWNvbiI9PT10KXRocm93IG5ldyBFcnJvcigiaWNvblVybCBub3Qgc2V0IGluIEljb24gb3B0aW9ucyAoc2VlIHRoZSBkb2NzKS4iKTtyZXR1cm4gbnVsbH0sX3NldEljb25TdHlsZXM6ZnVuY3Rpb24odCxlKXt2YXIgaT10aGlzLm9wdGlvbnMsbj1tKG49Im51bWJlciI9PXR5cGVvZihuPWlbZSsiU2l6ZSJdKT9bbixuXTpuKSxvPW0oInNoYWRvdyI9PT1lJiZpLnNoYWRvd0FuY2hvcnx8aS5pY29uQW5jaG9yfHxuJiZuLmRpdmlkZUJ5KDIsITApKTt0LmNsYXNzTmFtZT0ibGVhZmxldC1tYXJrZXItIitlKyIgIisoaS5jbGFzc05hbWV8fCIiKSxvJiYodC5zdHlsZS5tYXJnaW5MZWZ0PS1vLngrInB4Iix0LnN0eWxlLm1hcmdpblRvcD0tby55KyJweCIpLG4mJih0LnN0eWxlLndpZHRoPW4ueCsicHgiLHQuc3R5bGUuaGVpZ2h0PW4ueSsicHgiKX0sX2NyZWF0ZUltZzpmdW5jdGlvbih0LGUpe3JldHVybihlPWV8fGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImltZyIpKS5zcmM9dCxlfSxfZ2V0SWNvblVybDpmdW5jdGlvbih0KXtyZXR1cm4gYi5yZXRpbmEmJnRoaXMub3B0aW9uc1t0KyJSZXRpbmFVcmwiXXx8dGhpcy5vcHRpb25zW3QrIlVybCJdfX0pLHVpPWxpLmV4dGVuZCh7b3B0aW9uczp7aWNvblVybDoibWFya2VyLWljb24ucG5nIixpY29uUmV0aW5hVXJsOiJtYXJrZXItaWNvbi0yeC5wbmciLHNoYWRvd1VybDoibWFya2VyLXNoYWRvdy5wbmciLGljb25TaXplOlsyNSw0MV0saWNvbkFuY2hvcjpbMTIsNDFdLHBvcHVwQW5jaG9yOlsxLC0zNF0sdG9vbHRpcEFuY2hvcjpbMTYsLTI4XSxzaGFkb3dTaXplOls0MSw0MV19LF9nZXRJY29uVXJsOmZ1bmN0aW9uKHQpe3JldHVybiJzdHJpbmciIT10eXBlb2YgdWkuaW1hZ2VQYXRoJiYodWkuaW1hZ2VQYXRoPXRoaXMuX2RldGVjdEljb25QYXRoKCkpLCh0aGlzLm9wdGlvbnMuaW1hZ2VQYXRofHx1aS5pbWFnZVBhdGgpK2xpLnByb3RvdHlwZS5fZ2V0SWNvblVybC5jYWxsKHRoaXMsdCl9LF9zdHJpcFVybDpmdW5jdGlvbih0KXtmdW5jdGlvbiBlKHQsZSxpKXtyZXR1cm4oZT1lLmV4ZWModCkpJiZlW2ldfXJldHVybih0PWUodCwvXnVybFwoKFsnIl0pPyguKylcMVwpJC8sMikpJiZlKHQsL14oLiopbWFya2VyLWljb25cLnBuZyQvLDEpfSxfZGV0ZWN0SWNvblBhdGg6ZnVuY3Rpb24oKXt2YXIgdD1QKCJkaXYiLCJsZWFmbGV0LWRlZmF1bHQtaWNvbi1wYXRoIixkb2N1bWVudC5ib2R5KSxlPWxlKHQsImJhY2tncm91bmQtaW1hZ2UiKXx8bGUodCwiYmFja2dyb3VuZEltYWdlIik7cmV0dXJuIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQodCksKGU9dGhpcy5fc3RyaXBVcmwoZSkpP2U6KHQ9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcignbGlua1tocmVmJD0ibGVhZmxldC5jc3MiXScpKT90LmhyZWYuc3Vic3RyaW5nKDAsdC5ocmVmLmxlbmd0aC0ibGVhZmxldC5jc3MiLmxlbmd0aC0xKToiIn19KSxjaT1uLmV4dGVuZCh7aW5pdGlhbGl6ZTpmdW5jdGlvbih0KXt0aGlzLl9tYXJrZXI9dH0sYWRkSG9va3M6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9tYXJrZXIuX2ljb247dGhpcy5fZHJhZ2dhYmxlfHwodGhpcy5fZHJhZ2dhYmxlPW5ldyBHZSh0LHQsITApKSx0aGlzLl9kcmFnZ2FibGUub24oe2RyYWdzdGFydDp0aGlzLl9vbkRyYWdTdGFydCxwcmVkcmFnOnRoaXMuX29uUHJlRHJhZyxkcmFnOnRoaXMuX29uRHJhZyxkcmFnZW5kOnRoaXMuX29uRHJhZ0VuZH0sdGhpcykuZW5hYmxlKCksTSh0LCJsZWFmbGV0LW1hcmtlci1kcmFnZ2FibGUiKX0scmVtb3ZlSG9va3M6ZnVuY3Rpb24oKXt0aGlzLl9kcmFnZ2FibGUub2ZmKHtkcmFnc3RhcnQ6dGhpcy5fb25EcmFnU3RhcnQscHJlZHJhZzp0aGlzLl9vblByZURyYWcsZHJhZzp0aGlzLl9vbkRyYWcsZHJhZ2VuZDp0aGlzLl9vbkRyYWdFbmR9LHRoaXMpLmRpc2FibGUoKSx0aGlzLl9tYXJrZXIuX2ljb24mJnoodGhpcy5fbWFya2VyLl9pY29uLCJsZWFmbGV0LW1hcmtlci1kcmFnZ2FibGUiKX0sbW92ZWQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZHJhZ2dhYmxlJiZ0aGlzLl9kcmFnZ2FibGUuX21vdmVkfSxfYWRqdXN0UGFuOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX21hcmtlcixpPWUuX21hcCxuPXRoaXMuX21hcmtlci5vcHRpb25zLmF1dG9QYW5TcGVlZCxvPXRoaXMuX21hcmtlci5vcHRpb25zLmF1dG9QYW5QYWRkaW5nLHM9dmUoZS5faWNvbikscj1pLmdldFBpeGVsQm91bmRzKCksYT1pLmdldFBpeGVsT3JpZ2luKCk7KGE9YyhyLm1pbi5fc3VidHJhY3QoYSkuYWRkKG8pLHIubWF4Ll9zdWJ0cmFjdChhKS5zdWJ0cmFjdChvKSkpLmNvbnRhaW5zKHMpfHwobz1tKChNYXRoLm1heChhLm1heC54LHMueCktYS5tYXgueCkvKHIubWF4LngtYS5tYXgueCktKE1hdGgubWluKGEubWluLngscy54KS1hLm1pbi54KS8oci5taW4ueC1hLm1pbi54KSwoTWF0aC5tYXgoYS5tYXgueSxzLnkpLWEubWF4LnkpLyhyLm1heC55LWEubWF4LnkpLShNYXRoLm1pbihhLm1pbi55LHMueSktYS5taW4ueSkvKHIubWluLnktYS5taW4ueSkpLm11bHRpcGx5QnkobiksaS5wYW5CeShvLHthbmltYXRlOiExfSksdGhpcy5fZHJhZ2dhYmxlLl9uZXdQb3MuX2FkZChvKSx0aGlzLl9kcmFnZ2FibGUuX3N0YXJ0UG9zLl9hZGQobyksWihlLl9pY29uLHRoaXMuX2RyYWdnYWJsZS5fbmV3UG9zKSx0aGlzLl9vbkRyYWcodCksdGhpcy5fcGFuUmVxdWVzdD15KHRoaXMuX2FkanVzdFBhbi5iaW5kKHRoaXMsdCkpKX0sX29uRHJhZ1N0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5fb2xkTGF0TG5nPXRoaXMuX21hcmtlci5nZXRMYXRMbmcoKSx0aGlzLl9tYXJrZXIuY2xvc2VQb3B1cCYmdGhpcy5fbWFya2VyLmNsb3NlUG9wdXAoKSx0aGlzLl9tYXJrZXIuZmlyZSgibW92ZXN0YXJ0IikuZmlyZSgiZHJhZ3N0YXJ0Iil9LF9vblByZURyYWc6ZnVuY3Rpb24odCl7dGhpcy5fbWFya2VyLm9wdGlvbnMuYXV0b1BhbiYmKHIodGhpcy5fcGFuUmVxdWVzdCksdGhpcy5fcGFuUmVxdWVzdD15KHRoaXMuX2FkanVzdFBhbi5iaW5kKHRoaXMsdCkpKX0sX29uRHJhZzpmdW5jdGlvbih0KXt2YXIgZT10aGlzLl9tYXJrZXIsaT1lLl9zaGFkb3csbj12ZShlLl9pY29uKSxvPWUuX21hcC5sYXllclBvaW50VG9MYXRMbmcobik7aSYmWihpLG4pLGUuX2xhdGxuZz1vLHQubGF0bG5nPW8sdC5vbGRMYXRMbmc9dGhpcy5fb2xkTGF0TG5nLGUuZmlyZSgibW92ZSIsdCkuZmlyZSgiZHJhZyIsdCl9LF9vbkRyYWdFbmQ6ZnVuY3Rpb24odCl7cih0aGlzLl9wYW5SZXF1ZXN0KSxkZWxldGUgdGhpcy5fb2xkTGF0TG5nLHRoaXMuX21hcmtlci5maXJlKCJtb3ZlZW5kIikuZmlyZSgiZHJhZ2VuZCIsdCl9fSksZGk9by5leHRlbmQoe29wdGlvbnM6e2ljb246bmV3IHVpLGludGVyYWN0aXZlOiEwLGtleWJvYXJkOiEwLHRpdGxlOiIiLGFsdDoiTWFya2VyIix6SW5kZXhPZmZzZXQ6MCxvcGFjaXR5OjEscmlzZU9uSG92ZXI6ITEscmlzZU9mZnNldDoyNTAscGFuZToibWFya2VyUGFuZSIsc2hhZG93UGFuZToic2hhZG93UGFuZSIsYnViYmxpbmdNb3VzZUV2ZW50czohMSxhdXRvUGFuT25Gb2N1czohMCxkcmFnZ2FibGU6ITEsYXV0b1BhbjohMSxhdXRvUGFuUGFkZGluZzpbNTAsNTBdLGF1dG9QYW5TcGVlZDoxMH0saW5pdGlhbGl6ZTpmdW5jdGlvbih0LGUpe2godGhpcyxlKSx0aGlzLl9sYXRsbmc9eCh0KX0sb25BZGQ6ZnVuY3Rpb24odCl7dGhpcy5fem9vbUFuaW1hdGVkPXRoaXMuX3pvb21BbmltYXRlZCYmdC5vcHRpb25zLm1hcmtlclpvb21BbmltYXRpb24sdGhpcy5fem9vbUFuaW1hdGVkJiZ0Lm9uKCJ6b29tYW5pbSIsdGhpcy5fYW5pbWF0ZVpvb20sdGhpcyksdGhpcy5faW5pdEljb24oKSx0aGlzLnVwZGF0ZSgpfSxvblJlbW92ZTpmdW5jdGlvbih0KXt0aGlzLmRyYWdnaW5nJiZ0aGlzLmRyYWdnaW5nLmVuYWJsZWQoKSYmKHRoaXMub3B0aW9ucy5kcmFnZ2FibGU9ITAsdGhpcy5kcmFnZ2luZy5yZW1vdmVIb29rcygpKSxkZWxldGUgdGhpcy5kcmFnZ2luZyx0aGlzLl96b29tQW5pbWF0ZWQmJnQub2ZmKCJ6b29tYW5pbSIsdGhpcy5fYW5pbWF0ZVpvb20sdGhpcyksdGhpcy5fcmVtb3ZlSWNvbigpLHRoaXMuX3JlbW92ZVNoYWRvdygpfSxnZXRFdmVudHM6ZnVuY3Rpb24oKXtyZXR1cm57em9vbTp0aGlzLnVwZGF0ZSx2aWV3cmVzZXQ6dGhpcy51cGRhdGV9fSxnZXRMYXRMbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbGF0bG5nfSxzZXRMYXRMbmc6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fbGF0bG5nO3JldHVybiB0aGlzLl9sYXRsbmc9eCh0KSx0aGlzLnVwZGF0ZSgpLHRoaXMuZmlyZSgibW92ZSIse29sZExhdExuZzplLGxhdGxuZzp0aGlzLl9sYXRsbmd9KX0sc2V0WkluZGV4T2Zmc2V0OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLm9wdGlvbnMuekluZGV4T2Zmc2V0PXQsdGhpcy51cGRhdGUoKX0sZ2V0SWNvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLm9wdGlvbnMuaWNvbn0sc2V0SWNvbjpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5vcHRpb25zLmljb249dCx0aGlzLl9tYXAmJih0aGlzLl9pbml0SWNvbigpLHRoaXMudXBkYXRlKCkpLHRoaXMuX3BvcHVwJiZ0aGlzLmJpbmRQb3B1cCh0aGlzLl9wb3B1cCx0aGlzLl9wb3B1cC5vcHRpb25zKSx0aGlzfSxnZXRFbGVtZW50OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2ljb259LHVwZGF0ZTpmdW5jdGlvbigpe3ZhciB0O3JldHVybiB0aGlzLl9pY29uJiZ0aGlzLl9tYXAmJih0PXRoaXMuX21hcC5sYXRMbmdUb0xheWVyUG9pbnQodGhpcy5fbGF0bG5nKS5yb3VuZCgpLHRoaXMuX3NldFBvcyh0KSksdGhpc30sX2luaXRJY29uOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5vcHRpb25zLGU9ImxlYWZsZXQtem9vbS0iKyh0aGlzLl96b29tQW5pbWF0ZWQ\/ImFuaW1hdGVkIjoiaGlkZSIpLGk9dC5pY29uLmNyZWF0ZUljb24odGhpcy5faWNvbiksbj0hMTtpIT09dGhpcy5faWNvbiYmKHRoaXMuX2ljb24mJnRoaXMuX3JlbW92ZUljb24oKSxuPSEwLHQudGl0bGUmJihpLnRpdGxlPXQudGl0bGUpLCJJTUciPT09aS50YWdOYW1lJiYoaS5hbHQ9dC5hbHR8fCIiKSksTShpLGUpLHQua2V5Ym9hcmQmJihpLnRhYkluZGV4PSIwIixpLnNldEF0dHJpYnV0ZSgicm9sZSIsImJ1dHRvbiIpKSx0aGlzLl9pY29uPWksdC5yaXNlT25Ib3ZlciYmdGhpcy5vbih7bW91c2VvdmVyOnRoaXMuX2JyaW5nVG9Gcm9udCxtb3VzZW91dDp0aGlzLl9yZXNldFpJbmRleH0pLHRoaXMub3B0aW9ucy5hdXRvUGFuT25Gb2N1cyYmUyhpLCJmb2N1cyIsdGhpcy5fcGFuT25Gb2N1cyx0aGlzKTt2YXIgbz0hMTsoaT10Lmljb24uY3JlYXRlU2hhZG93KHRoaXMuX3NoYWRvdykpIT09dGhpcy5fc2hhZG93JiYodGhpcy5fcmVtb3ZlU2hhZG93KCksbz0hMCksaSYmKE0oaSxlKSxpLmFsdD0iIiksdGhpcy5fc2hhZG93PWksdC5vcGFjaXR5PDEmJnRoaXMuX3VwZGF0ZU9wYWNpdHkoKSxuJiZ0aGlzLmdldFBhbmUoKS5hcHBlbmRDaGlsZCh0aGlzLl9pY29uKSx0aGlzLl9pbml0SW50ZXJhY3Rpb24oKSxpJiZvJiZ0aGlzLmdldFBhbmUodC5zaGFkb3dQYW5lKS5hcHBlbmRDaGlsZCh0aGlzLl9zaGFkb3cpfSxfcmVtb3ZlSWNvbjpmdW5jdGlvbigpe3RoaXMub3B0aW9ucy5yaXNlT25Ib3ZlciYmdGhpcy5vZmYoe21vdXNlb3Zlcjp0aGlzLl9icmluZ1RvRnJvbnQsbW91c2VvdXQ6dGhpcy5fcmVzZXRaSW5kZXh9KSx0aGlzLm9wdGlvbnMuYXV0b1Bhbk9uRm9jdXMmJmsodGhpcy5faWNvbiwiZm9jdXMiLHRoaXMuX3Bhbk9uRm9jdXMsdGhpcyksVCh0aGlzLl9pY29uKSx0aGlzLnJlbW92ZUludGVyYWN0aXZlVGFyZ2V0KHRoaXMuX2ljb24pLHRoaXMuX2ljb249bnVsbH0sX3JlbW92ZVNoYWRvdzpmdW5jdGlvbigpe3RoaXMuX3NoYWRvdyYmVCh0aGlzLl9zaGFkb3cpLHRoaXMuX3NoYWRvdz1udWxsfSxfc2V0UG9zOmZ1bmN0aW9uKHQpe3RoaXMuX2ljb24mJloodGhpcy5faWNvbix0KSx0aGlzLl9zaGFkb3cmJloodGhpcy5fc2hhZG93LHQpLHRoaXMuX3pJbmRleD10LnkrdGhpcy5vcHRpb25zLnpJbmRleE9mZnNldCx0aGlzLl9yZXNldFpJbmRleCgpfSxfdXBkYXRlWkluZGV4OmZ1bmN0aW9uKHQpe3RoaXMuX2ljb24mJih0aGlzLl9pY29uLnN0eWxlLnpJbmRleD10aGlzLl96SW5kZXgrdCl9LF9hbmltYXRlWm9vbTpmdW5jdGlvbih0KXt0PXRoaXMuX21hcC5fbGF0TG5nVG9OZXdMYXllclBvaW50KHRoaXMuX2xhdGxuZyx0Lnpvb20sdC5jZW50ZXIpLnJvdW5kKCksdGhpcy5fc2V0UG9zKHQpfSxfaW5pdEludGVyYWN0aW9uOmZ1bmN0aW9uKCl7dmFyIHQ7dGhpcy5vcHRpb25zLmludGVyYWN0aXZlJiYoTSh0aGlzLl9pY29uLCJsZWFmbGV0LWludGVyYWN0aXZlIiksdGhpcy5hZGRJbnRlcmFjdGl2ZVRhcmdldCh0aGlzLl9pY29uKSxjaSYmKHQ9dGhpcy5vcHRpb25zLmRyYWdnYWJsZSx0aGlzLmRyYWdnaW5nJiYodD10aGlzLmRyYWdnaW5nLmVuYWJsZWQoKSx0aGlzLmRyYWdnaW5nLmRpc2FibGUoKSksdGhpcy5kcmFnZ2luZz1uZXcgY2kodGhpcyksdCYmdGhpcy5kcmFnZ2luZy5lbmFibGUoKSkpfSxzZXRPcGFjaXR5OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLm9wdGlvbnMub3BhY2l0eT10LHRoaXMuX21hcCYmdGhpcy5fdXBkYXRlT3BhY2l0eSgpLHRoaXN9LF91cGRhdGVPcGFjaXR5OmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5vcHRpb25zLm9wYWNpdHk7dGhpcy5faWNvbiYmQyh0aGlzLl9pY29uLHQpLHRoaXMuX3NoYWRvdyYmQyh0aGlzLl9zaGFkb3csdCl9LF9icmluZ1RvRnJvbnQ6ZnVuY3Rpb24oKXt0aGlzLl91cGRhdGVaSW5kZXgodGhpcy5vcHRpb25zLnJpc2VPZmZzZXQpfSxfcmVzZXRaSW5kZXg6ZnVuY3Rpb24oKXt0aGlzLl91cGRhdGVaSW5kZXgoMCl9LF9wYW5PbkZvY3VzOmZ1bmN0aW9uKCl7dmFyIHQsZSxpPXRoaXMuX21hcDtpJiYodD0oZT10aGlzLm9wdGlvbnMuaWNvbi5vcHRpb25zKS5pY29uU2l6ZT9tKGUuaWNvblNpemUpOm0oMCwwKSxlPWUuaWNvbkFuY2hvcj9tKGUuaWNvbkFuY2hvcik6bSgwLDApLGkucGFuSW5zaWRlKHRoaXMuX2xhdGxuZyx7cGFkZGluZ1RvcExlZnQ6ZSxwYWRkaW5nQm90dG9tUmlnaHQ6dC5zdWJ0cmFjdChlKX0pKX0sX2dldFBvcHVwQW5jaG9yOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub3B0aW9ucy5pY29uLm9wdGlvbnMucG9wdXBBbmNob3J9LF9nZXRUb29sdGlwQW5jaG9yOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub3B0aW9ucy5pY29uLm9wdGlvbnMudG9vbHRpcEFuY2hvcn19KSxfaT1vLmV4dGVuZCh7b3B0aW9uczp7c3Ryb2tlOiEwLGNvbG9yOiIjMzM4OGZmIix3ZWlnaHQ6MyxvcGFjaXR5OjEsbGluZUNhcDoicm91bmQiLGxpbmVKb2luOiJyb3VuZCIsZGFzaEFycmF5Om51bGwsZGFzaE9mZnNldDpudWxsLGZpbGw6ITEsZmlsbENvbG9yOm51bGwsZmlsbE9wYWNpdHk6LjIsZmlsbFJ1bGU6ImV2ZW5vZGQiLGludGVyYWN0aXZlOiEwLGJ1YmJsaW5nTW91c2VFdmVudHM6ITB9LGJlZm9yZUFkZDpmdW5jdGlvbih0KXt0aGlzLl9yZW5kZXJlcj10LmdldFJlbmRlcmVyKHRoaXMpfSxvbkFkZDpmdW5jdGlvbigpe3RoaXMuX3JlbmRlcmVyLl9pbml0UGF0aCh0aGlzKSx0aGlzLl9yZXNldCgpLHRoaXMuX3JlbmRlcmVyLl9hZGRQYXRoKHRoaXMpfSxvblJlbW92ZTpmdW5jdGlvbigpe3RoaXMuX3JlbmRlcmVyLl9yZW1vdmVQYXRoKHRoaXMpfSxyZWRyYXc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbWFwJiZ0aGlzLl9yZW5kZXJlci5fdXBkYXRlUGF0aCh0aGlzKSx0aGlzfSxzZXRTdHlsZTpmdW5jdGlvbih0KXtyZXR1cm4gaCh0aGlzLHQpLHRoaXMuX3JlbmRlcmVyJiYodGhpcy5fcmVuZGVyZXIuX3VwZGF0ZVN0eWxlKHRoaXMpLHRoaXMub3B0aW9ucy5zdHJva2UmJnQmJk9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LCJ3ZWlnaHQiKSYmdGhpcy5fdXBkYXRlQm91bmRzKCkpLHRoaXN9LGJyaW5nVG9Gcm9udDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9yZW5kZXJlciYmdGhpcy5fcmVuZGVyZXIuX2JyaW5nVG9Gcm9udCh0aGlzKSx0aGlzfSxicmluZ1RvQmFjazpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9yZW5kZXJlciYmdGhpcy5fcmVuZGVyZXIuX2JyaW5nVG9CYWNrKHRoaXMpLHRoaXN9LGdldEVsZW1lbnQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcGF0aH0sX3Jlc2V0OmZ1bmN0aW9uKCl7dGhpcy5fcHJvamVjdCgpLHRoaXMuX3VwZGF0ZSgpfSxfY2xpY2tUb2xlcmFuY2U6ZnVuY3Rpb24oKXtyZXR1cm4odGhpcy5vcHRpb25zLnN0cm9rZT90aGlzLm9wdGlvbnMud2VpZ2h0LzI6MCkrKHRoaXMuX3JlbmRlcmVyLm9wdGlvbnMudG9sZXJhbmNlfHwwKX19KSxwaT1faS5leHRlbmQoe29wdGlvbnM6e2ZpbGw6ITAscmFkaXVzOjEwfSxpbml0aWFsaXplOmZ1bmN0aW9uKHQsZSl7aCh0aGlzLGUpLHRoaXMuX2xhdGxuZz14KHQpLHRoaXMuX3JhZGl1cz10aGlzLm9wdGlvbnMucmFkaXVzfSxzZXRMYXRMbmc6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fbGF0bG5nO3JldHVybiB0aGlzLl9sYXRsbmc9eCh0KSx0aGlzLnJlZHJhdygpLHRoaXMuZmlyZSgibW92ZSIse29sZExhdExuZzplLGxhdGxuZzp0aGlzLl9sYXRsbmd9KX0sZ2V0TGF0TG5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2xhdGxuZ30sc2V0UmFkaXVzOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLm9wdGlvbnMucmFkaXVzPXRoaXMuX3JhZGl1cz10LHRoaXMucmVkcmF3KCl9LGdldFJhZGl1czpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9yYWRpdXN9LHNldFN0eWxlOmZ1bmN0aW9uKHQpe3ZhciBlPXQmJnQucmFkaXVzfHx0aGlzLl9yYWRpdXM7cmV0dXJuIF9pLnByb3RvdHlwZS5zZXRTdHlsZS5jYWxsKHRoaXMsdCksdGhpcy5zZXRSYWRpdXMoZSksdGhpc30sX3Byb2plY3Q6ZnVuY3Rpb24oKXt0aGlzLl9wb2ludD10aGlzLl9tYXAubGF0TG5nVG9MYXllclBvaW50KHRoaXMuX2xhdGxuZyksdGhpcy5fdXBkYXRlQm91bmRzKCl9LF91cGRhdGVCb3VuZHM6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9yYWRpdXMsZT10aGlzLl9yYWRpdXNZfHx0LGk9dGhpcy5fY2xpY2tUb2xlcmFuY2UoKSx0PVt0K2ksZStpXTt0aGlzLl9weEJvdW5kcz1uZXcgZih0aGlzLl9wb2ludC5zdWJ0cmFjdCh0KSx0aGlzLl9wb2ludC5hZGQodCkpfSxfdXBkYXRlOmZ1bmN0aW9uKCl7dGhpcy5fbWFwJiZ0aGlzLl91cGRhdGVQYXRoKCl9LF91cGRhdGVQYXRoOmZ1bmN0aW9uKCl7dGhpcy5fcmVuZGVyZXIuX3VwZGF0ZUNpcmNsZSh0aGlzKX0sX2VtcHR5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3JhZGl1cyYmIXRoaXMuX3JlbmRlcmVyLl9ib3VuZHMuaW50ZXJzZWN0cyh0aGlzLl9weEJvdW5kcyl9LF9jb250YWluc1BvaW50OmZ1bmN0aW9uKHQpe3JldHVybiB0LmRpc3RhbmNlVG8odGhpcy5fcG9pbnQpPD10aGlzLl9yYWRpdXMrdGhpcy5fY2xpY2tUb2xlcmFuY2UoKX19KSxtaT1waS5leHRlbmQoe2luaXRpYWxpemU6ZnVuY3Rpb24odCxlLGkpe2lmKGgodGhpcyxlPSJudW1iZXIiPT10eXBlb2YgZT9sKHt9LGkse3JhZGl1czplfSk6ZSksdGhpcy5fbGF0bG5nPXgodCksaXNOYU4odGhpcy5vcHRpb25zLnJhZGl1cykpdGhyb3cgbmV3IEVycm9yKCJDaXJjbGUgcmFkaXVzIGNhbm5vdCBiZSBOYU4iKTt0aGlzLl9tUmFkaXVzPXRoaXMub3B0aW9ucy5yYWRpdXN9LHNldFJhZGl1czpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fbVJhZGl1cz10LHRoaXMucmVkcmF3KCl9LGdldFJhZGl1czpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9tUmFkaXVzfSxnZXRCb3VuZHM6ZnVuY3Rpb24oKXt2YXIgdD1bdGhpcy5fcmFkaXVzLHRoaXMuX3JhZGl1c1l8fHRoaXMuX3JhZGl1c107cmV0dXJuIG5ldyBzKHRoaXMuX21hcC5sYXllclBvaW50VG9MYXRMbmcodGhpcy5fcG9pbnQuc3VidHJhY3QodCkpLHRoaXMuX21hcC5sYXllclBvaW50VG9MYXRMbmcodGhpcy5fcG9pbnQuYWRkKHQpKSl9LHNldFN0eWxlOl9pLnByb3RvdHlwZS5zZXRTdHlsZSxfcHJvamVjdDpmdW5jdGlvbigpe3ZhciB0LGUsaSxuLG8scz10aGlzLl9sYXRsbmcubG5nLHI9dGhpcy5fbGF0bG5nLmxhdCxhPXRoaXMuX21hcCxoPWEub3B0aW9ucy5jcnM7aC5kaXN0YW5jZT09PXN0LmRpc3RhbmNlPyhuPU1hdGguUEkvMTgwLG89dGhpcy5fbVJhZGl1cy9zdC5SL24sdD1hLnByb2plY3QoW3IrbyxzXSksZT1hLnByb2plY3QoW3ItbyxzXSksZT10LmFkZChlKS5kaXZpZGVCeSgyKSxpPWEudW5wcm9qZWN0KGUpLmxhdCxuPU1hdGguYWNvcygoTWF0aC5jb3MobypuKS1NYXRoLnNpbihyKm4pKk1hdGguc2luKGkqbikpLyhNYXRoLmNvcyhyKm4pKk1hdGguY29zKGkqbikpKS9uLCFpc05hTihuKSYmMCE9PW58fChuPW8vTWF0aC5jb3MoTWF0aC5QSS8xODAqcikpLHRoaXMuX3BvaW50PWUuc3VidHJhY3QoYS5nZXRQaXhlbE9yaWdpbigpKSx0aGlzLl9yYWRpdXM9aXNOYU4obik\/MDplLngtYS5wcm9qZWN0KFtpLHMtbl0pLngsdGhpcy5fcmFkaXVzWT1lLnktdC55KToobz1oLnVucHJvamVjdChoLnByb2plY3QodGhpcy5fbGF0bG5nKS5zdWJ0cmFjdChbdGhpcy5fbVJhZGl1cywwXSkpLHRoaXMuX3BvaW50PWEubGF0TG5nVG9MYXllclBvaW50KHRoaXMuX2xhdGxuZyksdGhpcy5fcmFkaXVzPXRoaXMuX3BvaW50LngtYS5sYXRMbmdUb0xheWVyUG9pbnQobykueCksdGhpcy5fdXBkYXRlQm91bmRzKCl9fSksZmk9X2kuZXh0ZW5kKHtvcHRpb25zOntzbW9vdGhGYWN0b3I6MSxub0NsaXA6ITF9LGluaXRpYWxpemU6ZnVuY3Rpb24odCxlKXtoKHRoaXMsZSksdGhpcy5fc2V0TGF0TG5ncyh0KX0sZ2V0TGF0TG5nczpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9sYXRsbmdzfSxzZXRMYXRMbmdzOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9zZXRMYXRMbmdzKHQpLHRoaXMucmVkcmF3KCl9LGlzRW1wdHk6ZnVuY3Rpb24oKXtyZXR1cm4hdGhpcy5fbGF0bG5ncy5sZW5ndGh9LGNsb3Nlc3RMYXllclBvaW50OmZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0xLzAsaT1udWxsLG49bmksbz0wLHM9dGhpcy5fcGFydHMubGVuZ3RoO288cztvKyspZm9yKHZhciByPXRoaXMuX3BhcnRzW29dLGE9MSxoPXIubGVuZ3RoO2E8aDthKyspe3ZhciBsLHUsYz1uKHQsbD1yW2EtMV0sdT1yW2FdLCEwKTtjPGUmJihlPWMsaT1uKHQsbCx1KSl9cmV0dXJuIGkmJihpLmRpc3RhbmNlPU1hdGguc3FydChlKSksaX0sZ2V0Q2VudGVyOmZ1bmN0aW9uKCl7aWYodGhpcy5fbWFwKXJldHVybiBzaSh0aGlzLl9kZWZhdWx0U2hhcGUoKSx0aGlzLl9tYXAub3B0aW9ucy5jcnMpO3Rocm93IG5ldyBFcnJvcigiTXVzdCBhZGQgbGF5ZXIgdG8gbWFwIGJlZm9yZSB1c2luZyBnZXRDZW50ZXIoKSIpfSxnZXRCb3VuZHM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fYm91bmRzfSxhZGRMYXRMbmc6ZnVuY3Rpb24odCxlKXtyZXR1cm4gZT1lfHx0aGlzLl9kZWZhdWx0U2hhcGUoKSx0PXgodCksZS5wdXNoKHQpLHRoaXMuX2JvdW5kcy5leHRlbmQodCksdGhpcy5yZWRyYXcoKX0sX3NldExhdExuZ3M6ZnVuY3Rpb24odCl7dGhpcy5fYm91bmRzPW5ldyBzLHRoaXMuX2xhdGxuZ3M9dGhpcy5fY29udmVydExhdExuZ3ModCl9LF9kZWZhdWx0U2hhcGU6ZnVuY3Rpb24oKXtyZXR1cm4gSSh0aGlzLl9sYXRsbmdzKT90aGlzLl9sYXRsbmdzOnRoaXMuX2xhdGxuZ3NbMF19LF9jb252ZXJ0TGF0TG5nczpmdW5jdGlvbih0KXtmb3IodmFyIGU9W10saT1JKHQpLG49MCxvPXQubGVuZ3RoO248bztuKyspaT8oZVtuXT14KHRbbl0pLHRoaXMuX2JvdW5kcy5leHRlbmQoZVtuXSkpOmVbbl09dGhpcy5fY29udmVydExhdExuZ3ModFtuXSk7cmV0dXJuIGV9LF9wcm9qZWN0OmZ1bmN0aW9uKCl7dmFyIHQ9bmV3IGY7dGhpcy5fcmluZ3M9W10sdGhpcy5fcHJvamVjdExhdGxuZ3ModGhpcy5fbGF0bG5ncyx0aGlzLl9yaW5ncyx0KSx0aGlzLl9ib3VuZHMuaXNWYWxpZCgpJiZ0LmlzVmFsaWQoKSYmKHRoaXMuX3Jhd1B4Qm91bmRzPXQsdGhpcy5fdXBkYXRlQm91bmRzKCkpfSxfdXBkYXRlQm91bmRzOmZ1bmN0aW9uKCl7dmFyIHQ9bmV3IHAodD10aGlzLl9jbGlja1RvbGVyYW5jZSgpLHQpO3RoaXMuX3Jhd1B4Qm91bmRzJiYodGhpcy5fcHhCb3VuZHM9bmV3IGYoW3RoaXMuX3Jhd1B4Qm91bmRzLm1pbi5zdWJ0cmFjdCh0KSx0aGlzLl9yYXdQeEJvdW5kcy5tYXguYWRkKHQpXSkpfSxfcHJvamVjdExhdGxuZ3M6ZnVuY3Rpb24odCxlLGkpe3ZhciBuLG8scz10WzBdaW5zdGFuY2VvZiB2LHI9dC5sZW5ndGg7aWYocyl7Zm9yKG89W10sbj0wO248cjtuKyspb1tuXT10aGlzLl9tYXAubGF0TG5nVG9MYXllclBvaW50KHRbbl0pLGkuZXh0ZW5kKG9bbl0pO2UucHVzaChvKX1lbHNlIGZvcihuPTA7bjxyO24rKyl0aGlzLl9wcm9qZWN0TGF0bG5ncyh0W25dLGUsaSl9LF9jbGlwUG9pbnRzOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fcmVuZGVyZXIuX2JvdW5kcztpZih0aGlzLl9wYXJ0cz1bXSx0aGlzLl9weEJvdW5kcyYmdGhpcy5fcHhCb3VuZHMuaW50ZXJzZWN0cyh0KSlpZih0aGlzLm9wdGlvbnMubm9DbGlwKXRoaXMuX3BhcnRzPXRoaXMuX3JpbmdzO2Vsc2UgZm9yKHZhciBlLGksbixvLHM9dGhpcy5fcGFydHMscj0wLGE9MCxoPXRoaXMuX3JpbmdzLmxlbmd0aDtyPGg7cisrKWZvcihlPTAsaT0obz10aGlzLl9yaW5nc1tyXSkubGVuZ3RoO2U8aS0xO2UrKykobj10aShvW2VdLG9bZSsxXSx0LGUsITApKSYmKHNbYV09c1thXXx8W10sc1thXS5wdXNoKG5bMF0pLG5bMV09PT1vW2UrMV0mJmUhPT1pLTJ8fChzW2FdLnB1c2goblsxXSksYSsrKSl9LF9zaW1wbGlmeVBvaW50czpmdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLl9wYXJ0cyxlPXRoaXMub3B0aW9ucy5zbW9vdGhGYWN0b3IsaT0wLG49dC5sZW5ndGg7aTxuO2krKyl0W2ldPSRlKHRbaV0sZSl9LF91cGRhdGU6ZnVuY3Rpb24oKXt0aGlzLl9tYXAmJih0aGlzLl9jbGlwUG9pbnRzKCksdGhpcy5fc2ltcGxpZnlQb2ludHMoKSx0aGlzLl91cGRhdGVQYXRoKCkpfSxfdXBkYXRlUGF0aDpmdW5jdGlvbigpe3RoaXMuX3JlbmRlcmVyLl91cGRhdGVQb2x5KHRoaXMpfSxfY29udGFpbnNQb2ludDpmdW5jdGlvbih0LGUpe3ZhciBpLG4sbyxzLHIsYSxoPXRoaXMuX2NsaWNrVG9sZXJhbmNlKCk7aWYodGhpcy5fcHhCb3VuZHMmJnRoaXMuX3B4Qm91bmRzLmNvbnRhaW5zKHQpKWZvcihpPTAscz10aGlzLl9wYXJ0cy5sZW5ndGg7aTxzO2krKylmb3Iobj0wLG89KHI9KGE9dGhpcy5fcGFydHNbaV0pLmxlbmd0aCktMTtuPHI7bz1uKyspaWYoKGV8fDAhPT1uKSYmUWUodCxhW29dLGFbbl0pPD1oKXJldHVybiEwO3JldHVybiExfX0pLGdpPShmaS5fZmxhdD1vaSxmaS5leHRlbmQoe29wdGlvbnM6e2ZpbGw6ITB9LGlzRW1wdHk6ZnVuY3Rpb24oKXtyZXR1cm4hdGhpcy5fbGF0bG5ncy5sZW5ndGh8fCF0aGlzLl9sYXRsbmdzWzBdLmxlbmd0aH0sZ2V0Q2VudGVyOmZ1bmN0aW9uKCl7aWYodGhpcy5fbWFwKXJldHVybiBZZSh0aGlzLl9kZWZhdWx0U2hhcGUoKSx0aGlzLl9tYXAub3B0aW9ucy5jcnMpO3Rocm93IG5ldyBFcnJvcigiTXVzdCBhZGQgbGF5ZXIgdG8gbWFwIGJlZm9yZSB1c2luZyBnZXRDZW50ZXIoKSIpfSxfY29udmVydExhdExuZ3M6ZnVuY3Rpb24odCl7dmFyIGU9KHQ9ZmkucHJvdG90eXBlLl9jb252ZXJ0TGF0TG5ncy5jYWxsKHRoaXMsdCkpLmxlbmd0aDtyZXR1cm4gMjw9ZSYmdFswXWluc3RhbmNlb2YgdiYmdFswXS5lcXVhbHModFtlLTFdKSYmdC5wb3AoKSx0fSxfc2V0TGF0TG5nczpmdW5jdGlvbih0KXtmaS5wcm90b3R5cGUuX3NldExhdExuZ3MuY2FsbCh0aGlzLHQpLEkodGhpcy5fbGF0bG5ncykmJih0aGlzLl9sYXRsbmdzPVt0aGlzLl9sYXRsbmdzXSl9LF9kZWZhdWx0U2hhcGU6ZnVuY3Rpb24oKXtyZXR1cm4oSSh0aGlzLl9sYXRsbmdzWzBdKT90aGlzLl9sYXRsbmdzOnRoaXMuX2xhdGxuZ3NbMF0pWzBdfSxfY2xpcFBvaW50czpmdW5jdGlvbigpe3ZhciB0PXRoaXMuX3JlbmRlcmVyLl9ib3VuZHMsZT1uZXcgcChlPXRoaXMub3B0aW9ucy53ZWlnaHQsZSksdD1uZXcgZih0Lm1pbi5zdWJ0cmFjdChlKSx0Lm1heC5hZGQoZSkpO2lmKHRoaXMuX3BhcnRzPVtdLHRoaXMuX3B4Qm91bmRzJiZ0aGlzLl9weEJvdW5kcy5pbnRlcnNlY3RzKHQpKWlmKHRoaXMub3B0aW9ucy5ub0NsaXApdGhpcy5fcGFydHM9dGhpcy5fcmluZ3M7ZWxzZSBmb3IodmFyIGksbj0wLG89dGhpcy5fcmluZ3MubGVuZ3RoO248bztuKyspKGk9S2UodGhpcy5fcmluZ3Nbbl0sdCwhMCkpLmxlbmd0aCYmdGhpcy5fcGFydHMucHVzaChpKX0sX3VwZGF0ZVBhdGg6ZnVuY3Rpb24oKXt0aGlzLl9yZW5kZXJlci5fdXBkYXRlUG9seSh0aGlzLCEwKX0sX2NvbnRhaW5zUG9pbnQ6ZnVuY3Rpb24odCl7dmFyIGUsaSxuLG8scyxyLGEsaCxsPSExO2lmKCF0aGlzLl9weEJvdW5kc3x8IXRoaXMuX3B4Qm91bmRzLmNvbnRhaW5zKHQpKXJldHVybiExO2ZvcihvPTAsYT10aGlzLl9wYXJ0cy5sZW5ndGg7bzxhO28rKylmb3Iocz0wLHI9KGg9KGU9dGhpcy5fcGFydHNbb10pLmxlbmd0aCktMTtzPGg7cj1zKyspaT1lW3NdLG49ZVtyXSxpLnk+dC55IT1uLnk+dC55JiZ0Lng8KG4ueC1pLngpKih0LnktaS55KS8obi55LWkueSkraS54JiYobD0hbCk7cmV0dXJuIGx8fGZpLnByb3RvdHlwZS5fY29udGFpbnNQb2ludC5jYWxsKHRoaXMsdCwhMCl9fSkpLHZpPWhpLmV4dGVuZCh7aW5pdGlhbGl6ZTpmdW5jdGlvbih0LGUpe2godGhpcyxlKSx0aGlzLl9sYXllcnM9e30sdCYmdGhpcy5hZGREYXRhKHQpfSxhZGREYXRhOmZ1bmN0aW9uKHQpe3ZhciBlLGksbixvPXUodCk\/dDp0LmZlYXR1cmVzO2lmKG8pe2ZvcihlPTAsaT1vLmxlbmd0aDtlPGk7ZSsrKSgobj1vW2VdKS5nZW9tZXRyaWVzfHxuLmdlb21ldHJ5fHxuLmZlYXR1cmVzfHxuLmNvb3JkaW5hdGVzKSYmdGhpcy5hZGREYXRhKG4pO3JldHVybiB0aGlzfXZhciBzLHI9dGhpcy5vcHRpb25zO3JldHVybiByLmZpbHRlciYmIXIuZmlsdGVyKHQpfHwhKHM9eWkodCxyKSk\/dGhpczoocy5mZWF0dXJlPU1pKHQpLHMuZGVmYXVsdE9wdGlvbnM9cy5vcHRpb25zLHRoaXMucmVzZXRTdHlsZShzKSxyLm9uRWFjaEZlYXR1cmUmJnIub25FYWNoRmVhdHVyZSh0LHMpLHRoaXMuYWRkTGF5ZXIocykpfSxyZXNldFN0eWxlOmZ1bmN0aW9uKHQpe3JldHVybiB2b2lkIDA9PT10P3RoaXMuZWFjaExheWVyKHRoaXMucmVzZXRTdHlsZSx0aGlzKToodC5vcHRpb25zPWwoe30sdC5kZWZhdWx0T3B0aW9ucyksdGhpcy5fc2V0TGF5ZXJTdHlsZSh0LHRoaXMub3B0aW9ucy5zdHlsZSksdGhpcyl9LHNldFN0eWxlOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmVhY2hMYXllcihmdW5jdGlvbih0KXt0aGlzLl9zZXRMYXllclN0eWxlKHQsZSl9LHRoaXMpfSxfc2V0TGF5ZXJTdHlsZTpmdW5jdGlvbih0LGUpe3Quc2V0U3R5bGUmJigiZnVuY3Rpb24iPT10eXBlb2YgZSYmKGU9ZSh0LmZlYXR1cmUpKSx0LnNldFN0eWxlKGUpKX19KTtmdW5jdGlvbiB5aSh0LGUpe3ZhciBpLG4sbyxzLHI9IkZlYXR1cmUiPT09dC50eXBlP3QuZ2VvbWV0cnk6dCxhPXI\/ci5jb29yZGluYXRlczpudWxsLGg9W10sbD1lJiZlLnBvaW50VG9MYXllcix1PWUmJmUuY29vcmRzVG9MYXRMbmd8fHdpO2lmKCFhJiYhcilyZXR1cm4gbnVsbDtzd2l0Y2goci50eXBlKXtjYXNlIlBvaW50IjpyZXR1cm4geGkobCx0LGk9dShhKSxlKTtjYXNlIk11bHRpUG9pbnQiOmZvcihvPTAscz1hLmxlbmd0aDtvPHM7bysrKWk9dShhW29dKSxoLnB1c2goeGkobCx0LGksZSkpO3JldHVybiBuZXcgaGkoaCk7Y2FzZSJMaW5lU3RyaW5nIjpjYXNlIk11bHRpTGluZVN0cmluZyI6cmV0dXJuIG49YmkoYSwiTGluZVN0cmluZyI9PT1yLnR5cGU\/MDoxLHUpLG5ldyBmaShuLGUpO2Nhc2UiUG9seWdvbiI6Y2FzZSJNdWx0aVBvbHlnb24iOnJldHVybiBuPWJpKGEsIlBvbHlnb24iPT09ci50eXBlPzE6Mix1KSxuZXcgZ2kobixlKTtjYXNlIkdlb21ldHJ5Q29sbGVjdGlvbiI6Zm9yKG89MCxzPXIuZ2VvbWV0cmllcy5sZW5ndGg7bzxzO28rKyl7dmFyIGM9eWkoe2dlb21ldHJ5OnIuZ2VvbWV0cmllc1tvXSx0eXBlOiJGZWF0dXJlIixwcm9wZXJ0aWVzOnQucHJvcGVydGllc30sZSk7YyYmaC5wdXNoKGMpfXJldHVybiBuZXcgaGkoaCk7Y2FzZSJGZWF0dXJlQ29sbGVjdGlvbiI6Zm9yKG89MCxzPXIuZmVhdHVyZXMubGVuZ3RoO288cztvKyspe3ZhciBkPXlpKHIuZmVhdHVyZXNbb10sZSk7ZCYmaC5wdXNoKGQpfXJldHVybiBuZXcgaGkoaCk7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgR2VvSlNPTiBvYmplY3QuIil9fWZ1bmN0aW9uIHhpKHQsZSxpLG4pe3JldHVybiB0P3QoZSxpKTpuZXcgZGkoaSxuJiZuLm1hcmtlcnNJbmhlcml0T3B0aW9ucyYmbil9ZnVuY3Rpb24gd2kodCl7cmV0dXJuIG5ldyB2KHRbMV0sdFswXSx0WzJdKX1mdW5jdGlvbiBiaSh0LGUsaSl7Zm9yKHZhciBuLG89W10scz0wLHI9dC5sZW5ndGg7czxyO3MrKyluPWU\/YmkodFtzXSxlLTEsaSk6KGl8fHdpKSh0W3NdKSxvLnB1c2gobik7cmV0dXJuIG99ZnVuY3Rpb24gUGkodCxlKXtyZXR1cm4gdm9pZCAwIT09KHQ9eCh0KSkuYWx0P1tpKHQubG5nLGUpLGkodC5sYXQsZSksaSh0LmFsdCxlKV06W2kodC5sbmcsZSksaSh0LmxhdCxlKV19ZnVuY3Rpb24gTGkodCxlLGksbil7Zm9yKHZhciBvPVtdLHM9MCxyPXQubGVuZ3RoO3M8cjtzKyspby5wdXNoKGU\/TGkodFtzXSxJKHRbc10pPzA6ZS0xLGksbik6UGkodFtzXSxuKSk7cmV0dXJuIWUmJmkmJjA8by5sZW5ndGgmJm8ucHVzaChvWzBdLnNsaWNlKCkpLG99ZnVuY3Rpb24gVGkodCxlKXtyZXR1cm4gdC5mZWF0dXJlP2woe30sdC5mZWF0dXJlLHtnZW9tZXRyeTplfSk6TWkoZSl9ZnVuY3Rpb24gTWkodCl7cmV0dXJuIkZlYXR1cmUiPT09dC50eXBlfHwiRmVhdHVyZUNvbGxlY3Rpb24iPT09dC50eXBlP3Q6e3R5cGU6IkZlYXR1cmUiLHByb3BlcnRpZXM6e30sZ2VvbWV0cnk6dH19ZnVuY3Rpb24gemkodCxlKXtyZXR1cm4gbmV3IHZpKHQsZSl9ZGkuaW5jbHVkZShMdD17dG9HZW9KU09OOmZ1bmN0aW9uKHQpe3JldHVybiBUaSh0aGlzLHt0eXBlOiJQb2ludCIsY29vcmRpbmF0ZXM6UGkodGhpcy5nZXRMYXRMbmcoKSx0KX0pfX0pLG1pLmluY2x1ZGUoTHQpLHBpLmluY2x1ZGUoTHQpLGZpLmluY2x1ZGUoe3RvR2VvSlNPTjpmdW5jdGlvbih0KXt2YXIgZT0hSSh0aGlzLl9sYXRsbmdzKTtyZXR1cm4gVGkodGhpcyx7dHlwZTooZT8iTXVsdGkiOiIiKSsiTGluZVN0cmluZyIsY29vcmRpbmF0ZXM6TGkodGhpcy5fbGF0bG5ncyxlPzE6MCwhMSx0KX0pfX0pLGdpLmluY2x1ZGUoe3RvR2VvSlNPTjpmdW5jdGlvbih0KXt2YXIgZT0hSSh0aGlzLl9sYXRsbmdzKSxpPWUmJiFJKHRoaXMuX2xhdGxuZ3NbMF0pLHQ9TGkodGhpcy5fbGF0bG5ncyxpPzI6ZT8xOjAsITAsdCk7cmV0dXJuIFRpKHRoaXMse3R5cGU6KGk\/Ik11bHRpIjoiIikrIlBvbHlnb24iLGNvb3JkaW5hdGVzOnQ9ZT90Olt0XX0pfX0pLGFpLmluY2x1ZGUoe3RvTXVsdGlQb2ludDpmdW5jdGlvbihlKXt2YXIgaT1bXTtyZXR1cm4gdGhpcy5lYWNoTGF5ZXIoZnVuY3Rpb24odCl7aS5wdXNoKHQudG9HZW9KU09OKGUpLmdlb21ldHJ5LmNvb3JkaW5hdGVzKX0pLFRpKHRoaXMse3R5cGU6Ik11bHRpUG9pbnQiLGNvb3JkaW5hdGVzOml9KX0sdG9HZW9KU09OOmZ1bmN0aW9uKGUpe3ZhciBpLG4sdD10aGlzLmZlYXR1cmUmJnRoaXMuZmVhdHVyZS5nZW9tZXRyeSYmdGhpcy5mZWF0dXJlLmdlb21ldHJ5LnR5cGU7cmV0dXJuIk11bHRpUG9pbnQiPT09dD90aGlzLnRvTXVsdGlQb2ludChlKTooaT0iR2VvbWV0cnlDb2xsZWN0aW9uIj09PXQsbj1bXSx0aGlzLmVhY2hMYXllcihmdW5jdGlvbih0KXt0LnRvR2VvSlNPTiYmKHQ9dC50b0dlb0pTT04oZSksaT9uLnB1c2godC5nZW9tZXRyeSk6IkZlYXR1cmVDb2xsZWN0aW9uIj09PSh0PU1pKHQpKS50eXBlP24ucHVzaC5hcHBseShuLHQuZmVhdHVyZXMpOm4ucHVzaCh0KSl9KSxpP1RpKHRoaXMse2dlb21ldHJpZXM6bix0eXBlOiJHZW9tZXRyeUNvbGxlY3Rpb24ifSk6e3R5cGU6IkZlYXR1cmVDb2xsZWN0aW9uIixmZWF0dXJlczpufSl9fSk7dmFyIFR0PXppLENpPW8uZXh0ZW5kKHtvcHRpb25zOntvcGFjaXR5OjEsYWx0OiIiLGludGVyYWN0aXZlOiExLGNyb3NzT3JpZ2luOiExLGVycm9yT3ZlcmxheVVybDoiIix6SW5kZXg6MSxjbGFzc05hbWU6IiJ9LGluaXRpYWxpemU6ZnVuY3Rpb24odCxlLGkpe3RoaXMuX3VybD10LHRoaXMuX2JvdW5kcz1nKGUpLGgodGhpcyxpKX0sb25BZGQ6ZnVuY3Rpb24oKXt0aGlzLl9pbWFnZXx8KHRoaXMuX2luaXRJbWFnZSgpLHRoaXMub3B0aW9ucy5vcGFjaXR5PDEmJnRoaXMuX3VwZGF0ZU9wYWNpdHkoKSksdGhpcy5vcHRpb25zLmludGVyYWN0aXZlJiYoTSh0aGlzLl9pbWFnZSwibGVhZmxldC1pbnRlcmFjdGl2ZSIpLHRoaXMuYWRkSW50ZXJhY3RpdmVUYXJnZXQodGhpcy5faW1hZ2UpKSx0aGlzLmdldFBhbmUoKS5hcHBlbmRDaGlsZCh0aGlzLl9pbWFnZSksdGhpcy5fcmVzZXQoKX0sb25SZW1vdmU6ZnVuY3Rpb24oKXtUKHRoaXMuX2ltYWdlKSx0aGlzLm9wdGlvbnMuaW50ZXJhY3RpdmUmJnRoaXMucmVtb3ZlSW50ZXJhY3RpdmVUYXJnZXQodGhpcy5faW1hZ2UpfSxzZXRPcGFjaXR5OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLm9wdGlvbnMub3BhY2l0eT10LHRoaXMuX2ltYWdlJiZ0aGlzLl91cGRhdGVPcGFjaXR5KCksdGhpc30sc2V0U3R5bGU6ZnVuY3Rpb24odCl7cmV0dXJuIHQub3BhY2l0eSYmdGhpcy5zZXRPcGFjaXR5KHQub3BhY2l0eSksdGhpc30sYnJpbmdUb0Zyb250OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX21hcCYmY2UodGhpcy5faW1hZ2UpLHRoaXN9LGJyaW5nVG9CYWNrOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX21hcCYmZGUodGhpcy5faW1hZ2UpLHRoaXN9LHNldFVybDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fdXJsPXQsdGhpcy5faW1hZ2UmJih0aGlzLl9pbWFnZS5zcmM9dCksdGhpc30sc2V0Qm91bmRzOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9ib3VuZHM9Zyh0KSx0aGlzLl9tYXAmJnRoaXMuX3Jlc2V0KCksdGhpc30sZ2V0RXZlbnRzOmZ1bmN0aW9uKCl7dmFyIHQ9e3pvb206dGhpcy5fcmVzZXQsdmlld3Jlc2V0OnRoaXMuX3Jlc2V0fTtyZXR1cm4gdGhpcy5fem9vbUFuaW1hdGVkJiYodC56b29tYW5pbT10aGlzLl9hbmltYXRlWm9vbSksdH0sc2V0WkluZGV4OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLm9wdGlvbnMuekluZGV4PXQsdGhpcy5fdXBkYXRlWkluZGV4KCksdGhpc30sZ2V0Qm91bmRzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2JvdW5kc30sZ2V0RWxlbWVudDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9pbWFnZX0sX2luaXRJbWFnZTpmdW5jdGlvbigpe3ZhciB0PSJJTUciPT09dGhpcy5fdXJsLnRhZ05hbWUsZT10aGlzLl9pbWFnZT10P3RoaXMuX3VybDpQKCJpbWciKTtNKGUsImxlYWZsZXQtaW1hZ2UtbGF5ZXIiKSx0aGlzLl96b29tQW5pbWF0ZWQmJk0oZSwibGVhZmxldC16b29tLWFuaW1hdGVkIiksdGhpcy5vcHRpb25zLmNsYXNzTmFtZSYmTShlLHRoaXMub3B0aW9ucy5jbGFzc05hbWUpLGUub25zZWxlY3RzdGFydD1fLGUub25tb3VzZW1vdmU9XyxlLm9ubG9hZD1hKHRoaXMuZmlyZSx0aGlzLCJsb2FkIiksZS5vbmVycm9yPWEodGhpcy5fb3ZlcmxheU9uRXJyb3IsdGhpcywiZXJyb3IiKSwhdGhpcy5vcHRpb25zLmNyb3NzT3JpZ2luJiYiIiE9PXRoaXMub3B0aW9ucy5jcm9zc09yaWdpbnx8KGUuY3Jvc3NPcmlnaW49ITA9PT10aGlzLm9wdGlvbnMuY3Jvc3NPcmlnaW4\/IiI6dGhpcy5vcHRpb25zLmNyb3NzT3JpZ2luKSx0aGlzLm9wdGlvbnMuekluZGV4JiZ0aGlzLl91cGRhdGVaSW5kZXgoKSx0P3RoaXMuX3VybD1lLnNyYzooZS5zcmM9dGhpcy5fdXJsLGUuYWx0PXRoaXMub3B0aW9ucy5hbHQpfSxfYW5pbWF0ZVpvb206ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fbWFwLmdldFpvb21TY2FsZSh0Lnpvb20pLHQ9dGhpcy5fbWFwLl9sYXRMbmdCb3VuZHNUb05ld0xheWVyQm91bmRzKHRoaXMuX2JvdW5kcyx0Lnpvb20sdC5jZW50ZXIpLm1pbjtnZSh0aGlzLl9pbWFnZSx0LGUpfSxfcmVzZXQ6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9pbWFnZSxlPW5ldyBmKHRoaXMuX21hcC5sYXRMbmdUb0xheWVyUG9pbnQodGhpcy5fYm91bmRzLmdldE5vcnRoV2VzdCgpKSx0aGlzLl9tYXAubGF0TG5nVG9MYXllclBvaW50KHRoaXMuX2JvdW5kcy5nZXRTb3V0aEVhc3QoKSkpLGk9ZS5nZXRTaXplKCk7Wih0LGUubWluKSx0LnN0eWxlLndpZHRoPWkueCsicHgiLHQuc3R5bGUuaGVpZ2h0PWkueSsicHgifSxfdXBkYXRlT3BhY2l0eTpmdW5jdGlvbigpe0ModGhpcy5faW1hZ2UsdGhpcy5vcHRpb25zLm9wYWNpdHkpfSxfdXBkYXRlWkluZGV4OmZ1bmN0aW9uKCl7dGhpcy5faW1hZ2UmJnZvaWQgMCE9PXRoaXMub3B0aW9ucy56SW5kZXgmJm51bGwhPT10aGlzLm9wdGlvbnMuekluZGV4JiYodGhpcy5faW1hZ2Uuc3R5bGUuekluZGV4PXRoaXMub3B0aW9ucy56SW5kZXgpfSxfb3ZlcmxheU9uRXJyb3I6ZnVuY3Rpb24oKXt0aGlzLmZpcmUoImVycm9yIik7dmFyIHQ9dGhpcy5vcHRpb25zLmVycm9yT3ZlcmxheVVybDt0JiZ0aGlzLl91cmwhPT10JiYodGhpcy5fdXJsPXQsdGhpcy5faW1hZ2Uuc3JjPXQpfSxnZXRDZW50ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fYm91bmRzLmdldENlbnRlcigpfX0pLFppPUNpLmV4dGVuZCh7b3B0aW9uczp7YXV0b3BsYXk6ITAsbG9vcDohMCxrZWVwQXNwZWN0UmF0aW86ITAsbXV0ZWQ6ITEscGxheXNJbmxpbmU6ITB9LF9pbml0SW1hZ2U6ZnVuY3Rpb24oKXt2YXIgdD0iVklERU8iPT09dGhpcy5fdXJsLnRhZ05hbWUsZT10aGlzLl9pbWFnZT10P3RoaXMuX3VybDpQKCJ2aWRlbyIpO2lmKE0oZSwibGVhZmxldC1pbWFnZS1sYXllciIpLHRoaXMuX3pvb21BbmltYXRlZCYmTShlLCJsZWFmbGV0LXpvb20tYW5pbWF0ZWQiKSx0aGlzLm9wdGlvbnMuY2xhc3NOYW1lJiZNKGUsdGhpcy5vcHRpb25zLmNsYXNzTmFtZSksZS5vbnNlbGVjdHN0YXJ0PV8sZS5vbm1vdXNlbW92ZT1fLGUub25sb2FkZWRkYXRhPWEodGhpcy5maXJlLHRoaXMsImxvYWQiKSx0KXtmb3IodmFyIGk9ZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgic291cmNlIiksbj1bXSxvPTA7bzxpLmxlbmd0aDtvKyspbi5wdXNoKGlbb10uc3JjKTt0aGlzLl91cmw9MDxpLmxlbmd0aD9uOltlLnNyY119ZWxzZXt1KHRoaXMuX3VybCl8fCh0aGlzLl91cmw9W3RoaXMuX3VybF0pLCF0aGlzLm9wdGlvbnMua2VlcEFzcGVjdFJhdGlvJiZPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZS5zdHlsZSwib2JqZWN0Rml0IikmJihlLnN0eWxlLm9iamVjdEZpdD0iZmlsbCIpLGUuYXV0b3BsYXk9ISF0aGlzLm9wdGlvbnMuYXV0b3BsYXksZS5sb29wPSEhdGhpcy5vcHRpb25zLmxvb3AsZS5tdXRlZD0hIXRoaXMub3B0aW9ucy5tdXRlZCxlLnBsYXlzSW5saW5lPSEhdGhpcy5vcHRpb25zLnBsYXlzSW5saW5lO2Zvcih2YXIgcz0wO3M8dGhpcy5fdXJsLmxlbmd0aDtzKyspe3ZhciByPVAoInNvdXJjZSIpO3Iuc3JjPXRoaXMuX3VybFtzXSxlLmFwcGVuZENoaWxkKHIpfX19fSksU2k9Q2kuZXh0ZW5kKHtfaW5pdEltYWdlOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5faW1hZ2U9dGhpcy5fdXJsO00odCwibGVhZmxldC1pbWFnZS1sYXllciIpLHRoaXMuX3pvb21BbmltYXRlZCYmTSh0LCJsZWFmbGV0LXpvb20tYW5pbWF0ZWQiKSx0aGlzLm9wdGlvbnMuY2xhc3NOYW1lJiZNKHQsdGhpcy5vcHRpb25zLmNsYXNzTmFtZSksdC5vbnNlbGVjdHN0YXJ0PV8sdC5vbm1vdXNlbW92ZT1ffX0pLEVpPW8uZXh0ZW5kKHtvcHRpb25zOntpbnRlcmFjdGl2ZTohMSxvZmZzZXQ6WzAsMF0sY2xhc3NOYW1lOiIiLHBhbmU6dm9pZCAwLGNvbnRlbnQ6IiJ9LGluaXRpYWxpemU6ZnVuY3Rpb24odCxlKXt0JiYodCBpbnN0YW5jZW9mIHZ8fHUodCkpPyh0aGlzLl9sYXRsbmc9eCh0KSxoKHRoaXMsZSkpOihoKHRoaXMsdCksdGhpcy5fc291cmNlPWUpLHRoaXMub3B0aW9ucy5jb250ZW50JiYodGhpcy5fY29udGVudD10aGlzLm9wdGlvbnMuY29udGVudCl9LG9wZW5PbjpmdW5jdGlvbih0KXtyZXR1cm4odD1hcmd1bWVudHMubGVuZ3RoP3Q6dGhpcy5fc291cmNlLl9tYXApLmhhc0xheWVyKHRoaXMpfHx0LmFkZExheWVyKHRoaXMpLHRoaXN9LGNsb3NlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX21hcCYmdGhpcy5fbWFwLnJlbW92ZUxheWVyKHRoaXMpLHRoaXN9LHRvZ2dsZTpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fbWFwP3RoaXMuY2xvc2UoKTooYXJndW1lbnRzLmxlbmd0aD90aGlzLl9zb3VyY2U9dDp0PXRoaXMuX3NvdXJjZSx0aGlzLl9wcmVwYXJlT3BlbigpLHRoaXMub3Blbk9uKHQuX21hcCkpLHRoaXN9LG9uQWRkOmZ1bmN0aW9uKHQpe3RoaXMuX3pvb21BbmltYXRlZD10Ll96b29tQW5pbWF0ZWQsdGhpcy5fY29udGFpbmVyfHx0aGlzLl9pbml0TGF5b3V0KCksdC5fZmFkZUFuaW1hdGVkJiZDKHRoaXMuX2NvbnRhaW5lciwwKSxjbGVhclRpbWVvdXQodGhpcy5fcmVtb3ZlVGltZW91dCksdGhpcy5nZXRQYW5lKCkuYXBwZW5kQ2hpbGQodGhpcy5fY29udGFpbmVyKSx0aGlzLnVwZGF0ZSgpLHQuX2ZhZGVBbmltYXRlZCYmQyh0aGlzLl9jb250YWluZXIsMSksdGhpcy5icmluZ1RvRnJvbnQoKSx0aGlzLm9wdGlvbnMuaW50ZXJhY3RpdmUmJihNKHRoaXMuX2NvbnRhaW5lciwibGVhZmxldC1pbnRlcmFjdGl2ZSIpLHRoaXMuYWRkSW50ZXJhY3RpdmVUYXJnZXQodGhpcy5fY29udGFpbmVyKSl9LG9uUmVtb3ZlOmZ1bmN0aW9uKHQpe3QuX2ZhZGVBbmltYXRlZD8oQyh0aGlzLl9jb250YWluZXIsMCksdGhpcy5fcmVtb3ZlVGltZW91dD1zZXRUaW1lb3V0KGEoVCx2b2lkIDAsdGhpcy5fY29udGFpbmVyKSwyMDApKTpUKHRoaXMuX2NvbnRhaW5lciksdGhpcy5vcHRpb25zLmludGVyYWN0aXZlJiYoeih0aGlzLl9jb250YWluZXIsImxlYWZsZXQtaW50ZXJhY3RpdmUiKSx0aGlzLnJlbW92ZUludGVyYWN0aXZlVGFyZ2V0KHRoaXMuX2NvbnRhaW5lcikpfSxnZXRMYXRMbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbGF0bG5nfSxzZXRMYXRMbmc6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2xhdGxuZz14KHQpLHRoaXMuX21hcCYmKHRoaXMuX3VwZGF0ZVBvc2l0aW9uKCksdGhpcy5fYWRqdXN0UGFuKCkpLHRoaXN9LGdldENvbnRlbnQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fY29udGVudH0sc2V0Q29udGVudDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fY29udGVudD10LHRoaXMudXBkYXRlKCksdGhpc30sZ2V0RWxlbWVudDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9jb250YWluZXJ9LHVwZGF0ZTpmdW5jdGlvbigpe3RoaXMuX21hcCYmKHRoaXMuX2NvbnRhaW5lci5zdHlsZS52aXNpYmlsaXR5PSJoaWRkZW4iLHRoaXMuX3VwZGF0ZUNvbnRlbnQoKSx0aGlzLl91cGRhdGVMYXlvdXQoKSx0aGlzLl91cGRhdGVQb3NpdGlvbigpLHRoaXMuX2NvbnRhaW5lci5zdHlsZS52aXNpYmlsaXR5PSIiLHRoaXMuX2FkanVzdFBhbigpKX0sZ2V0RXZlbnRzOmZ1bmN0aW9uKCl7dmFyIHQ9e3pvb206dGhpcy5fdXBkYXRlUG9zaXRpb24sdmlld3Jlc2V0OnRoaXMuX3VwZGF0ZVBvc2l0aW9ufTtyZXR1cm4gdGhpcy5fem9vbUFuaW1hdGVkJiYodC56b29tYW5pbT10aGlzLl9hbmltYXRlWm9vbSksdH0saXNPcGVuOmZ1bmN0aW9uKCl7cmV0dXJuISF0aGlzLl9tYXAmJnRoaXMuX21hcC5oYXNMYXllcih0aGlzKX0sYnJpbmdUb0Zyb250OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX21hcCYmY2UodGhpcy5fY29udGFpbmVyKSx0aGlzfSxicmluZ1RvQmFjazpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9tYXAmJmRlKHRoaXMuX2NvbnRhaW5lciksdGhpc30sX3ByZXBhcmVPcGVuOmZ1bmN0aW9uKHQpe2lmKCEoaT10aGlzLl9zb3VyY2UpLl9tYXApcmV0dXJuITE7aWYoaSBpbnN0YW5jZW9mIGhpKXt2YXIgZSxpPW51bGwsbj10aGlzLl9zb3VyY2UuX2xheWVycztmb3IoZSBpbiBuKWlmKG5bZV0uX21hcCl7aT1uW2VdO2JyZWFrfWlmKCFpKXJldHVybiExO3RoaXMuX3NvdXJjZT1pfWlmKCF0KWlmKGkuZ2V0Q2VudGVyKXQ9aS5nZXRDZW50ZXIoKTtlbHNlIGlmKGkuZ2V0TGF0TG5nKXQ9aS5nZXRMYXRMbmcoKTtlbHNle2lmKCFpLmdldEJvdW5kcyl0aHJvdyBuZXcgRXJyb3IoIlVuYWJsZSB0byBnZXQgc291cmNlIGxheWVyIExhdExuZy4iKTt0PWkuZ2V0Qm91bmRzKCkuZ2V0Q2VudGVyKCl9cmV0dXJuIHRoaXMuc2V0TGF0TG5nKHQpLHRoaXMuX21hcCYmdGhpcy51cGRhdGUoKSwhMH0sX3VwZGF0ZUNvbnRlbnQ6ZnVuY3Rpb24oKXtpZih0aGlzLl9jb250ZW50KXt2YXIgdD10aGlzLl9jb250ZW50Tm9kZSxlPSJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLl9jb250ZW50P3RoaXMuX2NvbnRlbnQodGhpcy5fc291cmNlfHx0aGlzKTp0aGlzLl9jb250ZW50O2lmKCJzdHJpbmciPT10eXBlb2YgZSl0LmlubmVySFRNTD1lO2Vsc2V7Zm9yKDt0Lmhhc0NoaWxkTm9kZXMoKTspdC5yZW1vdmVDaGlsZCh0LmZpcnN0Q2hpbGQpO3QuYXBwZW5kQ2hpbGQoZSl9dGhpcy5maXJlKCJjb250ZW50dXBkYXRlIil9fSxfdXBkYXRlUG9zaXRpb246ZnVuY3Rpb24oKXt2YXIgdCxlLGk7dGhpcy5fbWFwJiYoZT10aGlzLl9tYXAubGF0TG5nVG9MYXllclBvaW50KHRoaXMuX2xhdGxuZyksdD1tKHRoaXMub3B0aW9ucy5vZmZzZXQpLGk9dGhpcy5fZ2V0QW5jaG9yKCksdGhpcy5fem9vbUFuaW1hdGVkP1oodGhpcy5fY29udGFpbmVyLGUuYWRkKGkpKTp0PXQuYWRkKGUpLmFkZChpKSxlPXRoaXMuX2NvbnRhaW5lckJvdHRvbT0tdC55LGk9dGhpcy5fY29udGFpbmVyTGVmdD0tTWF0aC5yb3VuZCh0aGlzLl9jb250YWluZXJXaWR0aC8yKSt0LngsdGhpcy5fY29udGFpbmVyLnN0eWxlLmJvdHRvbT1lKyJweCIsdGhpcy5fY29udGFpbmVyLnN0eWxlLmxlZnQ9aSsicHgiKX0sX2dldEFuY2hvcjpmdW5jdGlvbigpe3JldHVyblswLDBdfX0pLGtpPShBLmluY2x1ZGUoe19pbml0T3ZlcmxheTpmdW5jdGlvbih0LGUsaSxuKXt2YXIgbz1lO3JldHVybiBvIGluc3RhbmNlb2YgdHx8KG89bmV3IHQobikuc2V0Q29udGVudChlKSksaSYmby5zZXRMYXRMbmcoaSksb319KSxvLmluY2x1ZGUoe19pbml0T3ZlcmxheTpmdW5jdGlvbih0LGUsaSxuKXt2YXIgbz1pO3JldHVybiBvIGluc3RhbmNlb2YgdD8oaChvLG4pLG8uX3NvdXJjZT10aGlzKToobz1lJiYhbj9lOm5ldyB0KG4sdGhpcykpLnNldENvbnRlbnQoaSksb319KSxFaS5leHRlbmQoe29wdGlvbnM6e3BhbmU6InBvcHVwUGFuZSIsb2Zmc2V0OlswLDddLG1heFdpZHRoOjMwMCxtaW5XaWR0aDo1MCxtYXhIZWlnaHQ6bnVsbCxhdXRvUGFuOiEwLGF1dG9QYW5QYWRkaW5nVG9wTGVmdDpudWxsLGF1dG9QYW5QYWRkaW5nQm90dG9tUmlnaHQ6bnVsbCxhdXRvUGFuUGFkZGluZzpbNSw1XSxrZWVwSW5WaWV3OiExLGNsb3NlQnV0dG9uOiEwLGF1dG9DbG9zZTohMCxjbG9zZU9uRXNjYXBlS2V5OiEwLGNsYXNzTmFtZToiIn0sb3Blbk9uOmZ1bmN0aW9uKHQpe3JldHVybiEodD1hcmd1bWVudHMubGVuZ3RoP3Q6dGhpcy5fc291cmNlLl9tYXApLmhhc0xheWVyKHRoaXMpJiZ0Ll9wb3B1cCYmdC5fcG9wdXAub3B0aW9ucy5hdXRvQ2xvc2UmJnQucmVtb3ZlTGF5ZXIodC5fcG9wdXApLHQuX3BvcHVwPXRoaXMsRWkucHJvdG90eXBlLm9wZW5Pbi5jYWxsKHRoaXMsdCl9LG9uQWRkOmZ1bmN0aW9uKHQpe0VpLnByb3RvdHlwZS5vbkFkZC5jYWxsKHRoaXMsdCksdC5maXJlKCJwb3B1cG9wZW4iLHtwb3B1cDp0aGlzfSksdGhpcy5fc291cmNlJiYodGhpcy5fc291cmNlLmZpcmUoInBvcHVwb3BlbiIse3BvcHVwOnRoaXN9LCEwKSx0aGlzLl9zb3VyY2UgaW5zdGFuY2VvZiBfaXx8dGhpcy5fc291cmNlLm9uKCJwcmVjbGljayIsRWUpKX0sb25SZW1vdmU6ZnVuY3Rpb24odCl7RWkucHJvdG90eXBlLm9uUmVtb3ZlLmNhbGwodGhpcyx0KSx0LmZpcmUoInBvcHVwY2xvc2UiLHtwb3B1cDp0aGlzfSksdGhpcy5fc291cmNlJiYodGhpcy5fc291cmNlLmZpcmUoInBvcHVwY2xvc2UiLHtwb3B1cDp0aGlzfSwhMCksdGhpcy5fc291cmNlIGluc3RhbmNlb2YgX2l8fHRoaXMuX3NvdXJjZS5vZmYoInByZWNsaWNrIixFZSkpfSxnZXRFdmVudHM6ZnVuY3Rpb24oKXt2YXIgdD1FaS5wcm90b3R5cGUuZ2V0RXZlbnRzLmNhbGwodGhpcyk7cmV0dXJuKHZvaWQgMCE9PXRoaXMub3B0aW9ucy5jbG9zZU9uQ2xpY2s\/dGhpcy5vcHRpb25zLmNsb3NlT25DbGljazp0aGlzLl9tYXAub3B0aW9ucy5jbG9zZVBvcHVwT25DbGljaykmJih0LnByZWNsaWNrPXRoaXMuY2xvc2UpLHRoaXMub3B0aW9ucy5rZWVwSW5WaWV3JiYodC5tb3ZlZW5kPXRoaXMuX2FkanVzdFBhbiksdH0sX2luaXRMYXlvdXQ6ZnVuY3Rpb24oKXt2YXIgdD0ibGVhZmxldC1wb3B1cCIsZT10aGlzLl9jb250YWluZXI9UCgiZGl2Iix0KyIgIisodGhpcy5vcHRpb25zLmNsYXNzTmFtZXx8IiIpKyIgbGVhZmxldC16b29tLWFuaW1hdGVkIiksaT10aGlzLl93cmFwcGVyPVAoImRpdiIsdCsiLWNvbnRlbnQtd3JhcHBlciIsZSk7dGhpcy5fY29udGVudE5vZGU9UCgiZGl2Iix0KyItY29udGVudCIsaSksT2UoZSksa2UodGhpcy5fY29udGVudE5vZGUpLFMoZSwiY29udGV4dG1lbnUiLEVlKSx0aGlzLl90aXBDb250YWluZXI9UCgiZGl2Iix0KyItdGlwLWNvbnRhaW5lciIsZSksdGhpcy5fdGlwPVAoImRpdiIsdCsiLXRpcCIsdGhpcy5fdGlwQ29udGFpbmVyKSx0aGlzLm9wdGlvbnMuY2xvc2VCdXR0b24mJigoaT10aGlzLl9jbG9zZUJ1dHRvbj1QKCJhIix0KyItY2xvc2UtYnV0dG9uIixlKSkuc2V0QXR0cmlidXRlKCJyb2xlIiwiYnV0dG9uIiksaS5zZXRBdHRyaWJ1dGUoImFyaWEtbGFiZWwiLCJDbG9zZSBwb3B1cCIpLGkuaHJlZj0iI2Nsb3NlIixpLmlubmVySFRNTD0nPHNwYW4gYXJpYS1oaWRkZW49InRydWUiPiYjMjE1Ozwvc3Bhbj4nLFMoaSwiY2xpY2siLGZ1bmN0aW9uKHQpe08odCksdGhpcy5jbG9zZSgpfSx0aGlzKSl9LF91cGRhdGVMYXlvdXQ6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9jb250ZW50Tm9kZSxlPXQuc3R5bGUsaT0oZS53aWR0aD0iIixlLndoaXRlU3BhY2U9Im5vd3JhcCIsdC5vZmZzZXRXaWR0aCksaT1NYXRoLm1pbihpLHRoaXMub3B0aW9ucy5tYXhXaWR0aCksaT0oaT1NYXRoLm1heChpLHRoaXMub3B0aW9ucy5taW5XaWR0aCksZS53aWR0aD1pKzErInB4IixlLndoaXRlU3BhY2U9IiIsZS5oZWlnaHQ9IiIsdC5vZmZzZXRIZWlnaHQpLG49dGhpcy5vcHRpb25zLm1heEhlaWdodDsobiYmbjxpPyhlLmhlaWdodD1uKyJweCIsTSk6eikodCwibGVhZmxldC1wb3B1cC1zY3JvbGxlZCIpLHRoaXMuX2NvbnRhaW5lcldpZHRoPXRoaXMuX2NvbnRhaW5lci5vZmZzZXRXaWR0aH0sX2FuaW1hdGVab29tOmZ1bmN0aW9uKHQpe3ZhciB0PXRoaXMuX21hcC5fbGF0TG5nVG9OZXdMYXllclBvaW50KHRoaXMuX2xhdGxuZyx0Lnpvb20sdC5jZW50ZXIpLGU9dGhpcy5fZ2V0QW5jaG9yKCk7Wih0aGlzLl9jb250YWluZXIsdC5hZGQoZSkpfSxfYWRqdXN0UGFuOmZ1bmN0aW9uKCl7dmFyIHQsZSxpLG4sbyxzLHIsYTt0aGlzLm9wdGlvbnMuYXV0b1BhbiYmKHRoaXMuX21hcC5fcGFuQW5pbSYmdGhpcy5fbWFwLl9wYW5BbmltLnN0b3AoKSx0aGlzLl9hdXRvcGFubmluZz90aGlzLl9hdXRvcGFubmluZz0hMToodD10aGlzLl9tYXAsZT1wYXJzZUludChsZSh0aGlzLl9jb250YWluZXIsIm1hcmdpbkJvdHRvbSIpLDEwKXx8MCxlPXRoaXMuX2NvbnRhaW5lci5vZmZzZXRIZWlnaHQrZSxhPXRoaXMuX2NvbnRhaW5lcldpZHRoLChpPW5ldyBwKHRoaXMuX2NvbnRhaW5lckxlZnQsLWUtdGhpcy5fY29udGFpbmVyQm90dG9tKSkuX2FkZCh2ZSh0aGlzLl9jb250YWluZXIpKSxpPXQubGF5ZXJQb2ludFRvQ29udGFpbmVyUG9pbnQoaSksbz1tKHRoaXMub3B0aW9ucy5hdXRvUGFuUGFkZGluZyksbj1tKHRoaXMub3B0aW9ucy5hdXRvUGFuUGFkZGluZ1RvcExlZnR8fG8pLG89bSh0aGlzLm9wdGlvbnMuYXV0b1BhblBhZGRpbmdCb3R0b21SaWdodHx8bykscz10LmdldFNpemUoKSxyPTAsaS54K2Erby54PnMueCYmKHI9aS54K2Etcy54K28ueCksaS54LXItbi54PChhPTApJiYocj1pLngtbi54KSxpLnkrZStvLnk+cy55JiYoYT1pLnkrZS1zLnkrby55KSxpLnktYS1uLnk8MCYmKGE9aS55LW4ueSksKHJ8fGEpJiYodGhpcy5vcHRpb25zLmtlZXBJblZpZXcmJih0aGlzLl9hdXRvcGFubmluZz0hMCksdC5maXJlKCJhdXRvcGFuc3RhcnQiKS5wYW5CeShbcixhXSkpKSl9LF9nZXRBbmNob3I6ZnVuY3Rpb24oKXtyZXR1cm4gbSh0aGlzLl9zb3VyY2UmJnRoaXMuX3NvdXJjZS5fZ2V0UG9wdXBBbmNob3I\/dGhpcy5fc291cmNlLl9nZXRQb3B1cEFuY2hvcigpOlswLDBdKX19KSksT2k9KEEubWVyZ2VPcHRpb25zKHtjbG9zZVBvcHVwT25DbGljazohMH0pLEEuaW5jbHVkZSh7b3BlblBvcHVwOmZ1bmN0aW9uKHQsZSxpKXtyZXR1cm4gdGhpcy5faW5pdE92ZXJsYXkoa2ksdCxlLGkpLm9wZW5Pbih0aGlzKSx0aGlzfSxjbG9zZVBvcHVwOmZ1bmN0aW9uKHQpe3JldHVybih0PWFyZ3VtZW50cy5sZW5ndGg\/dDp0aGlzLl9wb3B1cCkmJnQuY2xvc2UoKSx0aGlzfX0pLG8uaW5jbHVkZSh7YmluZFBvcHVwOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuX3BvcHVwPXRoaXMuX2luaXRPdmVybGF5KGtpLHRoaXMuX3BvcHVwLHQsZSksdGhpcy5fcG9wdXBIYW5kbGVyc0FkZGVkfHwodGhpcy5vbih7Y2xpY2s6dGhpcy5fb3BlblBvcHVwLGtleXByZXNzOnRoaXMuX29uS2V5UHJlc3MscmVtb3ZlOnRoaXMuY2xvc2VQb3B1cCxtb3ZlOnRoaXMuX21vdmVQb3B1cH0pLHRoaXMuX3BvcHVwSGFuZGxlcnNBZGRlZD0hMCksdGhpc30sdW5iaW5kUG9wdXA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcG9wdXAmJih0aGlzLm9mZih7Y2xpY2s6dGhpcy5fb3BlblBvcHVwLGtleXByZXNzOnRoaXMuX29uS2V5UHJlc3MscmVtb3ZlOnRoaXMuY2xvc2VQb3B1cCxtb3ZlOnRoaXMuX21vdmVQb3B1cH0pLHRoaXMuX3BvcHVwSGFuZGxlcnNBZGRlZD0hMSx0aGlzLl9wb3B1cD1udWxsKSx0aGlzfSxvcGVuUG9wdXA6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX3BvcHVwJiYodGhpcyBpbnN0YW5jZW9mIGhpfHwodGhpcy5fcG9wdXAuX3NvdXJjZT10aGlzKSx0aGlzLl9wb3B1cC5fcHJlcGFyZU9wZW4odHx8dGhpcy5fbGF0bG5nKSYmdGhpcy5fcG9wdXAub3Blbk9uKHRoaXMuX21hcCkpLHRoaXN9LGNsb3NlUG9wdXA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcG9wdXAmJnRoaXMuX3BvcHVwLmNsb3NlKCksdGhpc30sdG9nZ2xlUG9wdXA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcG9wdXAmJnRoaXMuX3BvcHVwLnRvZ2dsZSh0aGlzKSx0aGlzfSxpc1BvcHVwT3BlbjpmdW5jdGlvbigpe3JldHVybiEhdGhpcy5fcG9wdXAmJnRoaXMuX3BvcHVwLmlzT3BlbigpfSxzZXRQb3B1cENvbnRlbnQ6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX3BvcHVwJiZ0aGlzLl9wb3B1cC5zZXRDb250ZW50KHQpLHRoaXN9LGdldFBvcHVwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3BvcHVwfSxfb3BlblBvcHVwOmZ1bmN0aW9uKHQpe3ZhciBlO3RoaXMuX3BvcHVwJiZ0aGlzLl9tYXAmJihBZSh0KSxlPXQubGF5ZXJ8fHQudGFyZ2V0LHRoaXMuX3BvcHVwLl9zb3VyY2UhPT1lfHxlIGluc3RhbmNlb2YgX2k\/KHRoaXMuX3BvcHVwLl9zb3VyY2U9ZSx0aGlzLm9wZW5Qb3B1cCh0LmxhdGxuZykpOnRoaXMuX21hcC5oYXNMYXllcih0aGlzLl9wb3B1cCk\/dGhpcy5jbG9zZVBvcHVwKCk6dGhpcy5vcGVuUG9wdXAodC5sYXRsbmcpKX0sX21vdmVQb3B1cDpmdW5jdGlvbih0KXt0aGlzLl9wb3B1cC5zZXRMYXRMbmcodC5sYXRsbmcpfSxfb25LZXlQcmVzczpmdW5jdGlvbih0KXsxMz09PXQub3JpZ2luYWxFdmVudC5rZXlDb2RlJiZ0aGlzLl9vcGVuUG9wdXAodCl9fSksRWkuZXh0ZW5kKHtvcHRpb25zOntwYW5lOiJ0b29sdGlwUGFuZSIsb2Zmc2V0OlswLDBdLGRpcmVjdGlvbjoiYXV0byIscGVybWFuZW50OiExLHN0aWNreTohMSxvcGFjaXR5Oi45fSxvbkFkZDpmdW5jdGlvbih0KXtFaS5wcm90b3R5cGUub25BZGQuY2FsbCh0aGlzLHQpLHRoaXMuc2V0T3BhY2l0eSh0aGlzLm9wdGlvbnMub3BhY2l0eSksdC5maXJlKCJ0b29sdGlwb3BlbiIse3Rvb2x0aXA6dGhpc30pLHRoaXMuX3NvdXJjZSYmKHRoaXMuYWRkRXZlbnRQYXJlbnQodGhpcy5fc291cmNlKSx0aGlzLl9zb3VyY2UuZmlyZSgidG9vbHRpcG9wZW4iLHt0b29sdGlwOnRoaXN9LCEwKSl9LG9uUmVtb3ZlOmZ1bmN0aW9uKHQpe0VpLnByb3RvdHlwZS5vblJlbW92ZS5jYWxsKHRoaXMsdCksdC5maXJlKCJ0b29sdGlwY2xvc2UiLHt0b29sdGlwOnRoaXN9KSx0aGlzLl9zb3VyY2UmJih0aGlzLnJlbW92ZUV2ZW50UGFyZW50KHRoaXMuX3NvdXJjZSksdGhpcy5fc291cmNlLmZpcmUoInRvb2x0aXBjbG9zZSIse3Rvb2x0aXA6dGhpc30sITApKX0sZ2V0RXZlbnRzOmZ1bmN0aW9uKCl7dmFyIHQ9RWkucHJvdG90eXBlLmdldEV2ZW50cy5jYWxsKHRoaXMpO3JldHVybiB0aGlzLm9wdGlvbnMucGVybWFuZW50fHwodC5wcmVjbGljaz10aGlzLmNsb3NlKSx0fSxfaW5pdExheW91dDpmdW5jdGlvbigpe3ZhciB0PSJsZWFmbGV0LXRvb2x0aXAgIisodGhpcy5vcHRpb25zLmNsYXNzTmFtZXx8IiIpKyIgbGVhZmxldC16b29tLSIrKHRoaXMuX3pvb21BbmltYXRlZD8iYW5pbWF0ZWQiOiJoaWRlIik7dGhpcy5fY29udGVudE5vZGU9dGhpcy5fY29udGFpbmVyPVAoImRpdiIsdCksdGhpcy5fY29udGFpbmVyLnNldEF0dHJpYnV0ZSgicm9sZSIsInRvb2x0aXAiKSx0aGlzLl9jb250YWluZXIuc2V0QXR0cmlidXRlKCJpZCIsImxlYWZsZXQtdG9vbHRpcC0iK2QodGhpcykpfSxfdXBkYXRlTGF5b3V0OmZ1bmN0aW9uKCl7fSxfYWRqdXN0UGFuOmZ1bmN0aW9uKCl7fSxfc2V0UG9zaXRpb246ZnVuY3Rpb24odCl7dmFyIGUsaT10aGlzLl9tYXAsbj10aGlzLl9jb250YWluZXIsbz1pLmxhdExuZ1RvQ29udGFpbmVyUG9pbnQoaS5nZXRDZW50ZXIoKSksaT1pLmxheWVyUG9pbnRUb0NvbnRhaW5lclBvaW50KHQpLHM9dGhpcy5vcHRpb25zLmRpcmVjdGlvbixyPW4ub2Zmc2V0V2lkdGgsYT1uLm9mZnNldEhlaWdodCxoPW0odGhpcy5vcHRpb25zLm9mZnNldCksbD10aGlzLl9nZXRBbmNob3IoKSxpPSJ0b3AiPT09cz8oZT1yLzIsYSk6ImJvdHRvbSI9PT1zPyhlPXIvMiwwKTooZT0iY2VudGVyIj09PXM\/ci8yOiJyaWdodCI9PT1zPzA6ImxlZnQiPT09cz9yOmkueDxvLng\/KHM9InJpZ2h0IiwwKToocz0ibGVmdCIscisyKihoLngrbC54KSksYS8yKTt0PXQuc3VidHJhY3QobShlLGksITApKS5hZGQoaCkuYWRkKGwpLHoobiwibGVhZmxldC10b29sdGlwLXJpZ2h0IikseihuLCJsZWFmbGV0LXRvb2x0aXAtbGVmdCIpLHoobiwibGVhZmxldC10b29sdGlwLXRvcCIpLHoobiwibGVhZmxldC10b29sdGlwLWJvdHRvbSIpLE0obiwibGVhZmxldC10b29sdGlwLSIrcyksWihuLHQpfSxfdXBkYXRlUG9zaXRpb246ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9tYXAubGF0TG5nVG9MYXllclBvaW50KHRoaXMuX2xhdGxuZyk7dGhpcy5fc2V0UG9zaXRpb24odCl9LHNldE9wYWNpdHk6ZnVuY3Rpb24odCl7dGhpcy5vcHRpb25zLm9wYWNpdHk9dCx0aGlzLl9jb250YWluZXImJkModGhpcy5fY29udGFpbmVyLHQpfSxfYW5pbWF0ZVpvb206ZnVuY3Rpb24odCl7dD10aGlzLl9tYXAuX2xhdExuZ1RvTmV3TGF5ZXJQb2ludCh0aGlzLl9sYXRsbmcsdC56b29tLHQuY2VudGVyKSx0aGlzLl9zZXRQb3NpdGlvbih0KX0sX2dldEFuY2hvcjpmdW5jdGlvbigpe3JldHVybiBtKHRoaXMuX3NvdXJjZSYmdGhpcy5fc291cmNlLl9nZXRUb29sdGlwQW5jaG9yJiYhdGhpcy5vcHRpb25zLnN0aWNreT90aGlzLl9zb3VyY2UuX2dldFRvb2x0aXBBbmNob3IoKTpbMCwwXSl9fSkpLEFpPShBLmluY2x1ZGUoe29wZW5Ub29sdGlwOmZ1bmN0aW9uKHQsZSxpKXtyZXR1cm4gdGhpcy5faW5pdE92ZXJsYXkoT2ksdCxlLGkpLm9wZW5Pbih0aGlzKSx0aGlzfSxjbG9zZVRvb2x0aXA6ZnVuY3Rpb24odCl7cmV0dXJuIHQuY2xvc2UoKSx0aGlzfX0pLG8uaW5jbHVkZSh7YmluZFRvb2x0aXA6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5fdG9vbHRpcCYmdGhpcy5pc1Rvb2x0aXBPcGVuKCkmJnRoaXMudW5iaW5kVG9vbHRpcCgpLHRoaXMuX3Rvb2x0aXA9dGhpcy5faW5pdE92ZXJsYXkoT2ksdGhpcy5fdG9vbHRpcCx0LGUpLHRoaXMuX2luaXRUb29sdGlwSW50ZXJhY3Rpb25zKCksdGhpcy5fdG9vbHRpcC5vcHRpb25zLnBlcm1hbmVudCYmdGhpcy5fbWFwJiZ0aGlzLl9tYXAuaGFzTGF5ZXIodGhpcykmJnRoaXMub3BlblRvb2x0aXAoKSx0aGlzfSx1bmJpbmRUb29sdGlwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3Rvb2x0aXAmJih0aGlzLl9pbml0VG9vbHRpcEludGVyYWN0aW9ucyghMCksdGhpcy5jbG9zZVRvb2x0aXAoKSx0aGlzLl90b29sdGlwPW51bGwpLHRoaXN9LF9pbml0VG9vbHRpcEludGVyYWN0aW9uczpmdW5jdGlvbih0KXt2YXIgZSxpOyF0JiZ0aGlzLl90b29sdGlwSGFuZGxlcnNBZGRlZHx8KGU9dD8ib2ZmIjoib24iLGk9e3JlbW92ZTp0aGlzLmNsb3NlVG9vbHRpcCxtb3ZlOnRoaXMuX21vdmVUb29sdGlwfSx0aGlzLl90b29sdGlwLm9wdGlvbnMucGVybWFuZW50P2kuYWRkPXRoaXMuX29wZW5Ub29sdGlwOihpLm1vdXNlb3Zlcj10aGlzLl9vcGVuVG9vbHRpcCxpLm1vdXNlb3V0PXRoaXMuY2xvc2VUb29sdGlwLGkuY2xpY2s9dGhpcy5fb3BlblRvb2x0aXAsdGhpcy5fbWFwP3RoaXMuX2FkZEZvY3VzTGlzdGVuZXJzKCk6aS5hZGQ9dGhpcy5fYWRkRm9jdXNMaXN0ZW5lcnMpLHRoaXMuX3Rvb2x0aXAub3B0aW9ucy5zdGlja3kmJihpLm1vdXNlbW92ZT10aGlzLl9tb3ZlVG9vbHRpcCksdGhpc1tlXShpKSx0aGlzLl90b29sdGlwSGFuZGxlcnNBZGRlZD0hdCl9LG9wZW5Ub29sdGlwOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl90b29sdGlwJiYodGhpcyBpbnN0YW5jZW9mIGhpfHwodGhpcy5fdG9vbHRpcC5fc291cmNlPXRoaXMpLHRoaXMuX3Rvb2x0aXAuX3ByZXBhcmVPcGVuKHQpJiYodGhpcy5fdG9vbHRpcC5vcGVuT24odGhpcy5fbWFwKSx0aGlzLmdldEVsZW1lbnQ\/dGhpcy5fc2V0QXJpYURlc2NyaWJlZEJ5T25MYXllcih0aGlzKTp0aGlzLmVhY2hMYXllciYmdGhpcy5lYWNoTGF5ZXIodGhpcy5fc2V0QXJpYURlc2NyaWJlZEJ5T25MYXllcix0aGlzKSkpLHRoaXN9LGNsb3NlVG9vbHRpcDpmdW5jdGlvbigpe2lmKHRoaXMuX3Rvb2x0aXApcmV0dXJuIHRoaXMuX3Rvb2x0aXAuY2xvc2UoKX0sdG9nZ2xlVG9vbHRpcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl90b29sdGlwJiZ0aGlzLl90b29sdGlwLnRvZ2dsZSh0aGlzKSx0aGlzfSxpc1Rvb2x0aXBPcGVuOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3Rvb2x0aXAuaXNPcGVuKCl9LHNldFRvb2x0aXBDb250ZW50OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl90b29sdGlwJiZ0aGlzLl90b29sdGlwLnNldENvbnRlbnQodCksdGhpc30sZ2V0VG9vbHRpcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl90b29sdGlwfSxfYWRkRm9jdXNMaXN0ZW5lcnM6ZnVuY3Rpb24oKXt0aGlzLmdldEVsZW1lbnQ\/dGhpcy5fYWRkRm9jdXNMaXN0ZW5lcnNPbkxheWVyKHRoaXMpOnRoaXMuZWFjaExheWVyJiZ0aGlzLmVhY2hMYXllcih0aGlzLl9hZGRGb2N1c0xpc3RlbmVyc09uTGF5ZXIsdGhpcyl9LF9hZGRGb2N1c0xpc3RlbmVyc09uTGF5ZXI6ZnVuY3Rpb24odCl7dmFyIGU9ImZ1bmN0aW9uIj09dHlwZW9mIHQuZ2V0RWxlbWVudCYmdC5nZXRFbGVtZW50KCk7ZSYmKFMoZSwiZm9jdXMiLGZ1bmN0aW9uKCl7dGhpcy5fdG9vbHRpcC5fc291cmNlPXQsdGhpcy5vcGVuVG9vbHRpcCgpfSx0aGlzKSxTKGUsImJsdXIiLHRoaXMuY2xvc2VUb29sdGlwLHRoaXMpKX0sX3NldEFyaWFEZXNjcmliZWRCeU9uTGF5ZXI6ZnVuY3Rpb24odCl7KHQ9ImZ1bmN0aW9uIj09dHlwZW9mIHQuZ2V0RWxlbWVudCYmdC5nZXRFbGVtZW50KCkpJiZ0LnNldEF0dHJpYnV0ZSgiYXJpYS1kZXNjcmliZWRieSIsdGhpcy5fdG9vbHRpcC5fY29udGFpbmVyLmlkKX0sX29wZW5Ub29sdGlwOmZ1bmN0aW9uKHQpe3ZhciBlO3RoaXMuX3Rvb2x0aXAmJnRoaXMuX21hcCYmKHRoaXMuX21hcC5kcmFnZ2luZyYmdGhpcy5fbWFwLmRyYWdnaW5nLm1vdmluZygpJiYhdGhpcy5fb3Blbk9uY2VGbGFnPyh0aGlzLl9vcGVuT25jZUZsYWc9ITAsKGU9dGhpcykuX21hcC5vbmNlKCJtb3ZlZW5kIixmdW5jdGlvbigpe2UuX29wZW5PbmNlRmxhZz0hMSxlLl9vcGVuVG9vbHRpcCh0KX0pKToodGhpcy5fdG9vbHRpcC5fc291cmNlPXQubGF5ZXJ8fHQudGFyZ2V0LHRoaXMub3BlblRvb2x0aXAodGhpcy5fdG9vbHRpcC5vcHRpb25zLnN0aWNreT90LmxhdGxuZzp2b2lkIDApKSl9LF9tb3ZlVG9vbHRpcDpmdW5jdGlvbih0KXt2YXIgZT10LmxhdGxuZzt0aGlzLl90b29sdGlwLm9wdGlvbnMuc3RpY2t5JiZ0Lm9yaWdpbmFsRXZlbnQmJih0PXRoaXMuX21hcC5tb3VzZUV2ZW50VG9Db250YWluZXJQb2ludCh0Lm9yaWdpbmFsRXZlbnQpLHQ9dGhpcy5fbWFwLmNvbnRhaW5lclBvaW50VG9MYXllclBvaW50KHQpLGU9dGhpcy5fbWFwLmxheWVyUG9pbnRUb0xhdExuZyh0KSksdGhpcy5fdG9vbHRpcC5zZXRMYXRMbmcoZSl9fSksbGkuZXh0ZW5kKHtvcHRpb25zOntpY29uU2l6ZTpbMTIsMTJdLGh0bWw6ITEsYmdQb3M6bnVsbCxjbGFzc05hbWU6ImxlYWZsZXQtZGl2LWljb24ifSxjcmVhdGVJY29uOmZ1bmN0aW9uKHQpe3ZhciB0PXQmJiJESVYiPT09dC50YWdOYW1lP3Q6ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksZT10aGlzLm9wdGlvbnM7cmV0dXJuIGUuaHRtbCBpbnN0YW5jZW9mIEVsZW1lbnQ\/KHVlKHQpLHQuYXBwZW5kQ2hpbGQoZS5odG1sKSk6dC5pbm5lckhUTUw9ITEhPT1lLmh0bWw\/ZS5odG1sOiIiLGUuYmdQb3MmJihlPW0oZS5iZ1BvcyksdC5zdHlsZS5iYWNrZ3JvdW5kUG9zaXRpb249LWUueCsicHggIistZS55KyJweCIpLHRoaXMuX3NldEljb25TdHlsZXModCwiaWNvbiIpLHR9LGNyZWF0ZVNoYWRvdzpmdW5jdGlvbigpe3JldHVybiBudWxsfX0pKSxCaT0obGkuRGVmYXVsdD11aSxvLmV4dGVuZCh7b3B0aW9uczp7dGlsZVNpemU6MjU2LG9wYWNpdHk6MSx1cGRhdGVXaGVuSWRsZTpiLm1vYmlsZSx1cGRhdGVXaGVuWm9vbWluZzohMCx1cGRhdGVJbnRlcnZhbDoyMDAsekluZGV4OjEsYm91bmRzOm51bGwsbWluWm9vbTowLG1heFpvb206dm9pZCAwLG1heE5hdGl2ZVpvb206dm9pZCAwLG1pbk5hdGl2ZVpvb206dm9pZCAwLG5vV3JhcDohMSxwYW5lOiJ0aWxlUGFuZSIsY2xhc3NOYW1lOiIiLGtlZXBCdWZmZXI6Mn0saW5pdGlhbGl6ZTpmdW5jdGlvbih0KXtoKHRoaXMsdCl9LG9uQWRkOmZ1bmN0aW9uKCl7dGhpcy5faW5pdENvbnRhaW5lcigpLHRoaXMuX2xldmVscz17fSx0aGlzLl90aWxlcz17fSx0aGlzLl9yZXNldFZpZXcoKX0sYmVmb3JlQWRkOmZ1bmN0aW9uKHQpe3QuX2FkZFpvb21MaW1pdCh0aGlzKX0sb25SZW1vdmU6ZnVuY3Rpb24odCl7dGhpcy5fcmVtb3ZlQWxsVGlsZXMoKSxUKHRoaXMuX2NvbnRhaW5lciksdC5fcmVtb3ZlWm9vbUxpbWl0KHRoaXMpLHRoaXMuX2NvbnRhaW5lcj1udWxsLHRoaXMuX3RpbGVab29tPXZvaWQgMH0sYnJpbmdUb0Zyb250OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX21hcCYmKGNlKHRoaXMuX2NvbnRhaW5lciksdGhpcy5fc2V0QXV0b1pJbmRleChNYXRoLm1heCkpLHRoaXN9LGJyaW5nVG9CYWNrOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX21hcCYmKGRlKHRoaXMuX2NvbnRhaW5lciksdGhpcy5fc2V0QXV0b1pJbmRleChNYXRoLm1pbikpLHRoaXN9LGdldENvbnRhaW5lcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9jb250YWluZXJ9LHNldE9wYWNpdHk6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMub3B0aW9ucy5vcGFjaXR5PXQsdGhpcy5fdXBkYXRlT3BhY2l0eSgpLHRoaXN9LHNldFpJbmRleDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5vcHRpb25zLnpJbmRleD10LHRoaXMuX3VwZGF0ZVpJbmRleCgpLHRoaXN9LGlzTG9hZGluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9sb2FkaW5nfSxyZWRyYXc6ZnVuY3Rpb24oKXt2YXIgdDtyZXR1cm4gdGhpcy5fbWFwJiYodGhpcy5fcmVtb3ZlQWxsVGlsZXMoKSwodD10aGlzLl9jbGFtcFpvb20odGhpcy5fbWFwLmdldFpvb20oKSkpIT09dGhpcy5fdGlsZVpvb20mJih0aGlzLl90aWxlWm9vbT10LHRoaXMuX3VwZGF0ZUxldmVscygpKSx0aGlzLl91cGRhdGUoKSksdGhpc30sZ2V0RXZlbnRzOmZ1bmN0aW9uKCl7dmFyIHQ9e3ZpZXdwcmVyZXNldDp0aGlzLl9pbnZhbGlkYXRlQWxsLHZpZXdyZXNldDp0aGlzLl9yZXNldFZpZXcsem9vbTp0aGlzLl9yZXNldFZpZXcsbW92ZWVuZDp0aGlzLl9vbk1vdmVFbmR9O3JldHVybiB0aGlzLm9wdGlvbnMudXBkYXRlV2hlbklkbGV8fCh0aGlzLl9vbk1vdmV8fCh0aGlzLl9vbk1vdmU9aih0aGlzLl9vbk1vdmVFbmQsdGhpcy5vcHRpb25zLnVwZGF0ZUludGVydmFsLHRoaXMpKSx0Lm1vdmU9dGhpcy5fb25Nb3ZlKSx0aGlzLl96b29tQW5pbWF0ZWQmJih0Lnpvb21hbmltPXRoaXMuX2FuaW1hdGVab29tKSx0fSxjcmVhdGVUaWxlOmZ1bmN0aW9uKCl7cmV0dXJuIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpfSxnZXRUaWxlU2l6ZTpmdW5jdGlvbigpe3ZhciB0PXRoaXMub3B0aW9ucy50aWxlU2l6ZTtyZXR1cm4gdCBpbnN0YW5jZW9mIHA\/dDpuZXcgcCh0LHQpfSxfdXBkYXRlWkluZGV4OmZ1bmN0aW9uKCl7dGhpcy5fY29udGFpbmVyJiZ2b2lkIDAhPT10aGlzLm9wdGlvbnMuekluZGV4JiZudWxsIT09dGhpcy5vcHRpb25zLnpJbmRleCYmKHRoaXMuX2NvbnRhaW5lci5zdHlsZS56SW5kZXg9dGhpcy5vcHRpb25zLnpJbmRleCl9LF9zZXRBdXRvWkluZGV4OmZ1bmN0aW9uKHQpe2Zvcih2YXIgZSxpPXRoaXMuZ2V0UGFuZSgpLmNoaWxkcmVuLG49LXQoLTEvMCwxLzApLG89MCxzPWkubGVuZ3RoO288cztvKyspZT1pW29dLnN0eWxlLnpJbmRleCxpW29dIT09dGhpcy5fY29udGFpbmVyJiZlJiYobj10KG4sK2UpKTtpc0Zpbml0ZShuKSYmKHRoaXMub3B0aW9ucy56SW5kZXg9bit0KC0xLDEpLHRoaXMuX3VwZGF0ZVpJbmRleCgpKX0sX3VwZGF0ZU9wYWNpdHk6ZnVuY3Rpb24oKXtpZih0aGlzLl9tYXAmJiFiLmllbHQ5KXtDKHRoaXMuX2NvbnRhaW5lcix0aGlzLm9wdGlvbnMub3BhY2l0eSk7dmFyIHQsZT0rbmV3IERhdGUsaT0hMSxuPSExO2Zvcih0IGluIHRoaXMuX3RpbGVzKXt2YXIgbyxzPXRoaXMuX3RpbGVzW3RdO3MuY3VycmVudCYmcy5sb2FkZWQmJihvPU1hdGgubWluKDEsKGUtcy5sb2FkZWQpLzIwMCksQyhzLmVsLG8pLG88MT9pPSEwOihzLmFjdGl2ZT9uPSEwOnRoaXMuX29uT3BhcXVlVGlsZShzKSxzLmFjdGl2ZT0hMCkpfW4mJiF0aGlzLl9ub1BydW5lJiZ0aGlzLl9wcnVuZVRpbGVzKCksaSYmKHIodGhpcy5fZmFkZUZyYW1lKSx0aGlzLl9mYWRlRnJhbWU9eSh0aGlzLl91cGRhdGVPcGFjaXR5LHRoaXMpKX19LF9vbk9wYXF1ZVRpbGU6XyxfaW5pdENvbnRhaW5lcjpmdW5jdGlvbigpe3RoaXMuX2NvbnRhaW5lcnx8KHRoaXMuX2NvbnRhaW5lcj1QKCJkaXYiLCJsZWFmbGV0LWxheWVyICIrKHRoaXMub3B0aW9ucy5jbGFzc05hbWV8fCIiKSksdGhpcy5fdXBkYXRlWkluZGV4KCksdGhpcy5vcHRpb25zLm9wYWNpdHk8MSYmdGhpcy5fdXBkYXRlT3BhY2l0eSgpLHRoaXMuZ2V0UGFuZSgpLmFwcGVuZENoaWxkKHRoaXMuX2NvbnRhaW5lcikpfSxfdXBkYXRlTGV2ZWxzOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fdGlsZVpvb20sZT10aGlzLm9wdGlvbnMubWF4Wm9vbTtpZih2b2lkIDAhPT10KXtmb3IodmFyIGkgaW4gdGhpcy5fbGV2ZWxzKWk9TnVtYmVyKGkpLHRoaXMuX2xldmVsc1tpXS5lbC5jaGlsZHJlbi5sZW5ndGh8fGk9PT10Pyh0aGlzLl9sZXZlbHNbaV0uZWwuc3R5bGUuekluZGV4PWUtTWF0aC5hYnModC1pKSx0aGlzLl9vblVwZGF0ZUxldmVsKGkpKTooVCh0aGlzLl9sZXZlbHNbaV0uZWwpLHRoaXMuX3JlbW92ZVRpbGVzQXRab29tKGkpLHRoaXMuX29uUmVtb3ZlTGV2ZWwoaSksZGVsZXRlIHRoaXMuX2xldmVsc1tpXSk7dmFyIG49dGhpcy5fbGV2ZWxzW3RdLG89dGhpcy5fbWFwO3JldHVybiBufHwoKG49dGhpcy5fbGV2ZWxzW3RdPXt9KS5lbD1QKCJkaXYiLCJsZWFmbGV0LXRpbGUtY29udGFpbmVyIGxlYWZsZXQtem9vbS1hbmltYXRlZCIsdGhpcy5fY29udGFpbmVyKSxuLmVsLnN0eWxlLnpJbmRleD1lLG4ub3JpZ2luPW8ucHJvamVjdChvLnVucHJvamVjdChvLmdldFBpeGVsT3JpZ2luKCkpLHQpLnJvdW5kKCksbi56b29tPXQsdGhpcy5fc2V0Wm9vbVRyYW5zZm9ybShuLG8uZ2V0Q2VudGVyKCksby5nZXRab29tKCkpLF8obi5lbC5vZmZzZXRXaWR0aCksdGhpcy5fb25DcmVhdGVMZXZlbChuKSksdGhpcy5fbGV2ZWw9bn19LF9vblVwZGF0ZUxldmVsOl8sX29uUmVtb3ZlTGV2ZWw6Xyxfb25DcmVhdGVMZXZlbDpfLF9wcnVuZVRpbGVzOmZ1bmN0aW9uKCl7aWYodGhpcy5fbWFwKXt2YXIgdCxlLGksbj10aGlzLl9tYXAuZ2V0Wm9vbSgpO2lmKG4+dGhpcy5vcHRpb25zLm1heFpvb218fG48dGhpcy5vcHRpb25zLm1pblpvb20pdGhpcy5fcmVtb3ZlQWxsVGlsZXMoKTtlbHNle2Zvcih0IGluIHRoaXMuX3RpbGVzKShpPXRoaXMuX3RpbGVzW3RdKS5yZXRhaW49aS5jdXJyZW50O2Zvcih0IGluIHRoaXMuX3RpbGVzKShpPXRoaXMuX3RpbGVzW3RdKS5jdXJyZW50JiYhaS5hY3RpdmUmJihlPWkuY29vcmRzLHRoaXMuX3JldGFpblBhcmVudChlLngsZS55LGUueixlLnotNSl8fHRoaXMuX3JldGFpbkNoaWxkcmVuKGUueCxlLnksZS56LGUueisyKSk7Zm9yKHQgaW4gdGhpcy5fdGlsZXMpdGhpcy5fdGlsZXNbdF0ucmV0YWlufHx0aGlzLl9yZW1vdmVUaWxlKHQpfX19LF9yZW1vdmVUaWxlc0F0Wm9vbTpmdW5jdGlvbih0KXtmb3IodmFyIGUgaW4gdGhpcy5fdGlsZXMpdGhpcy5fdGlsZXNbZV0uY29vcmRzLno9PT10JiZ0aGlzLl9yZW1vdmVUaWxlKGUpfSxfcmVtb3ZlQWxsVGlsZXM6ZnVuY3Rpb24oKXtmb3IodmFyIHQgaW4gdGhpcy5fdGlsZXMpdGhpcy5fcmVtb3ZlVGlsZSh0KX0sX2ludmFsaWRhdGVBbGw6ZnVuY3Rpb24oKXtmb3IodmFyIHQgaW4gdGhpcy5fbGV2ZWxzKVQodGhpcy5fbGV2ZWxzW3RdLmVsKSx0aGlzLl9vblJlbW92ZUxldmVsKE51bWJlcih0KSksZGVsZXRlIHRoaXMuX2xldmVsc1t0XTt0aGlzLl9yZW1vdmVBbGxUaWxlcygpLHRoaXMuX3RpbGVab29tPXZvaWQgMH0sX3JldGFpblBhcmVudDpmdW5jdGlvbih0LGUsaSxuKXt2YXIgaT1pLTEsbz0oKG89bmV3IHAoKyh0PU1hdGguZmxvb3IodC8yKSksKyhlPU1hdGguZmxvb3IoZS8yKSkpKS56PWksdGhpcy5fdGlsZUNvb3Jkc1RvS2V5KG8pKTtyZXR1cm4obz10aGlzLl90aWxlc1tvXSkmJm8uYWN0aXZlP28ucmV0YWluPSEwOihvJiZvLmxvYWRlZCYmKG8ucmV0YWluPSEwKSxuPGkmJnRoaXMuX3JldGFpblBhcmVudCh0LGUsaSxuKSl9LF9yZXRhaW5DaGlsZHJlbjpmdW5jdGlvbih0LGUsaSxuKXtmb3IodmFyIG89Mip0O288Mip0KzI7bysrKWZvcih2YXIgcz0yKmU7czwyKmUrMjtzKyspeyhyPW5ldyBwKG8scykpLno9aSsxO3ZhciByPXRoaXMuX3RpbGVDb29yZHNUb0tleShyKTsocj10aGlzLl90aWxlc1tyXSkmJnIuYWN0aXZlP3IucmV0YWluPSEwOihyJiZyLmxvYWRlZCYmKHIucmV0YWluPSEwKSxpKzE8biYmdGhpcy5fcmV0YWluQ2hpbGRyZW4obyxzLGkrMSxuKSl9fSxfcmVzZXRWaWV3OmZ1bmN0aW9uKHQpe3Q9dCYmKHQucGluY2h8fHQuZmx5VG8pLHRoaXMuX3NldFZpZXcodGhpcy5fbWFwLmdldENlbnRlcigpLHRoaXMuX21hcC5nZXRab29tKCksdCx0KX0sX2FuaW1hdGVab29tOmZ1bmN0aW9uKHQpe3RoaXMuX3NldFZpZXcodC5jZW50ZXIsdC56b29tLCEwLHQubm9VcGRhdGUpfSxfY2xhbXBab29tOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMub3B0aW9ucztyZXR1cm4gdm9pZCAwIT09ZS5taW5OYXRpdmVab29tJiZ0PGUubWluTmF0aXZlWm9vbT9lLm1pbk5hdGl2ZVpvb206dm9pZCAwIT09ZS5tYXhOYXRpdmVab29tJiZlLm1heE5hdGl2ZVpvb208dD9lLm1heE5hdGl2ZVpvb206dH0sX3NldFZpZXc6ZnVuY3Rpb24odCxlLGksbil7dmFyIG89TWF0aC5yb3VuZChlKSxvPXZvaWQgMCE9PXRoaXMub3B0aW9ucy5tYXhab29tJiZvPnRoaXMub3B0aW9ucy5tYXhab29tfHx2b2lkIDAhPT10aGlzLm9wdGlvbnMubWluWm9vbSYmbzx0aGlzLm9wdGlvbnMubWluWm9vbT92b2lkIDA6dGhpcy5fY2xhbXBab29tKG8pLHM9dGhpcy5vcHRpb25zLnVwZGF0ZVdoZW5ab29taW5nJiZvIT09dGhpcy5fdGlsZVpvb207biYmIXN8fCh0aGlzLl90aWxlWm9vbT1vLHRoaXMuX2Fib3J0TG9hZGluZyYmdGhpcy5fYWJvcnRMb2FkaW5nKCksdGhpcy5fdXBkYXRlTGV2ZWxzKCksdGhpcy5fcmVzZXRHcmlkKCksdm9pZCAwIT09byYmdGhpcy5fdXBkYXRlKHQpLGl8fHRoaXMuX3BydW5lVGlsZXMoKSx0aGlzLl9ub1BydW5lPSEhaSksdGhpcy5fc2V0Wm9vbVRyYW5zZm9ybXModCxlKX0sX3NldFpvb21UcmFuc2Zvcm1zOmZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBpIGluIHRoaXMuX2xldmVscyl0aGlzLl9zZXRab29tVHJhbnNmb3JtKHRoaXMuX2xldmVsc1tpXSx0LGUpfSxfc2V0Wm9vbVRyYW5zZm9ybTpmdW5jdGlvbih0LGUsaSl7dmFyIG49dGhpcy5fbWFwLmdldFpvb21TY2FsZShpLHQuem9vbSksZT10Lm9yaWdpbi5tdWx0aXBseUJ5KG4pLnN1YnRyYWN0KHRoaXMuX21hcC5fZ2V0TmV3UGl4ZWxPcmlnaW4oZSxpKSkucm91bmQoKTtiLmFueTNkP2dlKHQuZWwsZSxuKTpaKHQuZWwsZSl9LF9yZXNldEdyaWQ6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9tYXAsZT10Lm9wdGlvbnMuY3JzLGk9dGhpcy5fdGlsZVNpemU9dGhpcy5nZXRUaWxlU2l6ZSgpLG49dGhpcy5fdGlsZVpvb20sbz10aGlzLl9tYXAuZ2V0UGl4ZWxXb3JsZEJvdW5kcyh0aGlzLl90aWxlWm9vbSk7byYmKHRoaXMuX2dsb2JhbFRpbGVSYW5nZT10aGlzLl9weEJvdW5kc1RvVGlsZVJhbmdlKG8pKSx0aGlzLl93cmFwWD1lLndyYXBMbmcmJiF0aGlzLm9wdGlvbnMubm9XcmFwJiZbTWF0aC5mbG9vcih0LnByb2plY3QoWzAsZS53cmFwTG5nWzBdXSxuKS54L2kueCksTWF0aC5jZWlsKHQucHJvamVjdChbMCxlLndyYXBMbmdbMV1dLG4pLngvaS55KV0sdGhpcy5fd3JhcFk9ZS53cmFwTGF0JiYhdGhpcy5vcHRpb25zLm5vV3JhcCYmW01hdGguZmxvb3IodC5wcm9qZWN0KFtlLndyYXBMYXRbMF0sMF0sbikueS9pLngpLE1hdGguY2VpbCh0LnByb2plY3QoW2Uud3JhcExhdFsxXSwwXSxuKS55L2kueSldfSxfb25Nb3ZlRW5kOmZ1bmN0aW9uKCl7dGhpcy5fbWFwJiYhdGhpcy5fbWFwLl9hbmltYXRpbmdab29tJiZ0aGlzLl91cGRhdGUoKX0sX2dldFRpbGVkUGl4ZWxCb3VuZHM6ZnVuY3Rpb24odCl7dmFyIGU9KGk9dGhpcy5fbWFwKS5fYW5pbWF0aW5nWm9vbT9NYXRoLm1heChpLl9hbmltYXRlVG9ab29tLGkuZ2V0Wm9vbSgpKTppLmdldFpvb20oKSxlPWkuZ2V0Wm9vbVNjYWxlKGUsdGhpcy5fdGlsZVpvb20pLHQ9aS5wcm9qZWN0KHQsdGhpcy5fdGlsZVpvb20pLmZsb29yKCksaT1pLmdldFNpemUoKS5kaXZpZGVCeSgyKmUpO3JldHVybiBuZXcgZih0LnN1YnRyYWN0KGkpLHQuYWRkKGkpKX0sX3VwZGF0ZTpmdW5jdGlvbih0KXtpZihuPXRoaXMuX21hcCl7dmFyIGU9dGhpcy5fY2xhbXBab29tKG4uZ2V0Wm9vbSgpKTtpZih2b2lkIDA9PT10JiYodD1uLmdldENlbnRlcigpKSx2b2lkIDAhPT10aGlzLl90aWxlWm9vbSl7dmFyIGksbj10aGlzLl9nZXRUaWxlZFBpeGVsQm91bmRzKHQpLG89dGhpcy5fcHhCb3VuZHNUb1RpbGVSYW5nZShuKSxzPW8uZ2V0Q2VudGVyKCkscj1bXSxuPXRoaXMub3B0aW9ucy5rZWVwQnVmZmVyLGE9bmV3IGYoby5nZXRCb3R0b21MZWZ0KCkuc3VidHJhY3QoW24sLW5dKSxvLmdldFRvcFJpZ2h0KCkuYWRkKFtuLC1uXSkpO2lmKCEoaXNGaW5pdGUoby5taW4ueCkmJmlzRmluaXRlKG8ubWluLnkpJiZpc0Zpbml0ZShvLm1heC54KSYmaXNGaW5pdGUoby5tYXgueSkpKXRocm93IG5ldyBFcnJvcigiQXR0ZW1wdGVkIHRvIGxvYWQgYW4gaW5maW5pdGUgbnVtYmVyIG9mIHRpbGVzIik7Zm9yKGkgaW4gdGhpcy5fdGlsZXMpe3ZhciBoPXRoaXMuX3RpbGVzW2ldLmNvb3JkcztoLno9PT10aGlzLl90aWxlWm9vbSYmYS5jb250YWlucyhuZXcgcChoLngsaC55KSl8fCh0aGlzLl90aWxlc1tpXS5jdXJyZW50PSExKX1pZigxPE1hdGguYWJzKGUtdGhpcy5fdGlsZVpvb20pKXRoaXMuX3NldFZpZXcodCxlKTtlbHNle2Zvcih2YXIgbD1vLm1pbi55O2w8PW8ubWF4Lnk7bCsrKWZvcih2YXIgdT1vLm1pbi54O3U8PW8ubWF4Lng7dSsrKXt2YXIgYyxkPW5ldyBwKHUsbCk7ZC56PXRoaXMuX3RpbGVab29tLHRoaXMuX2lzVmFsaWRUaWxlKGQpJiYoKGM9dGhpcy5fdGlsZXNbdGhpcy5fdGlsZUNvb3Jkc1RvS2V5KGQpXSk\/Yy5jdXJyZW50PSEwOnIucHVzaChkKSl9aWYoci5zb3J0KGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQuZGlzdGFuY2VUbyhzKS1lLmRpc3RhbmNlVG8ocyl9KSwwIT09ci5sZW5ndGgpe3RoaXMuX2xvYWRpbmd8fCh0aGlzLl9sb2FkaW5nPSEwLHRoaXMuZmlyZSgibG9hZGluZyIpKTtmb3IodmFyIF89ZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpLHU9MDt1PHIubGVuZ3RoO3UrKyl0aGlzLl9hZGRUaWxlKHJbdV0sXyk7dGhpcy5fbGV2ZWwuZWwuYXBwZW5kQ2hpbGQoXyl9fX19fSxfaXNWYWxpZFRpbGU6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fbWFwLm9wdGlvbnMuY3JzO2lmKCFlLmluZmluaXRlKXt2YXIgaT10aGlzLl9nbG9iYWxUaWxlUmFuZ2U7aWYoIWUud3JhcExuZyYmKHQueDxpLm1pbi54fHx0Lng+aS5tYXgueCl8fCFlLndyYXBMYXQmJih0Lnk8aS5taW4ueXx8dC55PmkubWF4LnkpKXJldHVybiExfXJldHVybiF0aGlzLm9wdGlvbnMuYm91bmRzfHwoZT10aGlzLl90aWxlQ29vcmRzVG9Cb3VuZHModCksZyh0aGlzLm9wdGlvbnMuYm91bmRzKS5vdmVybGFwcyhlKSl9LF9rZXlUb0JvdW5kczpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fdGlsZUNvb3Jkc1RvQm91bmRzKHRoaXMuX2tleVRvVGlsZUNvb3Jkcyh0KSl9LF90aWxlQ29vcmRzVG9Od1NlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX21hcCxpPXRoaXMuZ2V0VGlsZVNpemUoKSxuPXQuc2NhbGVCeShpKSxpPW4uYWRkKGkpO3JldHVybltlLnVucHJvamVjdChuLHQueiksZS51bnByb2plY3QoaSx0LnopXX0sX3RpbGVDb29yZHNUb0JvdW5kczpmdW5jdGlvbih0KXtyZXR1cm4gdD1uZXcgcygodD10aGlzLl90aWxlQ29vcmRzVG9Od1NlKHQpKVswXSx0WzFdKSx0aGlzLm9wdGlvbnMubm9XcmFwP3Q6dGhpcy5fbWFwLndyYXBMYXRMbmdCb3VuZHModCl9LF90aWxlQ29vcmRzVG9LZXk6ZnVuY3Rpb24odCl7cmV0dXJuIHQueCsiOiIrdC55KyI6Iit0Lnp9LF9rZXlUb1RpbGVDb29yZHM6ZnVuY3Rpb24odCl7dmFyIGU9bmV3IHAoKyh0PXQuc3BsaXQoIjoiKSlbMF0sK3RbMV0pO3JldHVybiBlLno9K3RbMl0sZX0sX3JlbW92ZVRpbGU6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fdGlsZXNbdF07ZSYmKFQoZS5lbCksZGVsZXRlIHRoaXMuX3RpbGVzW3RdLHRoaXMuZmlyZSgidGlsZXVubG9hZCIse3RpbGU6ZS5lbCxjb29yZHM6dGhpcy5fa2V5VG9UaWxlQ29vcmRzKHQpfSkpfSxfaW5pdFRpbGU6ZnVuY3Rpb24odCl7TSh0LCJsZWFmbGV0LXRpbGUiKTt2YXIgZT10aGlzLmdldFRpbGVTaXplKCk7dC5zdHlsZS53aWR0aD1lLngrInB4Iix0LnN0eWxlLmhlaWdodD1lLnkrInB4Iix0Lm9uc2VsZWN0c3RhcnQ9Xyx0Lm9ubW91c2Vtb3ZlPV8sYi5pZWx0OSYmdGhpcy5vcHRpb25zLm9wYWNpdHk8MSYmQyh0LHRoaXMub3B0aW9ucy5vcGFjaXR5KX0sX2FkZFRpbGU6ZnVuY3Rpb24odCxlKXt2YXIgaT10aGlzLl9nZXRUaWxlUG9zKHQpLG49dGhpcy5fdGlsZUNvb3Jkc1RvS2V5KHQpLG89dGhpcy5jcmVhdGVUaWxlKHRoaXMuX3dyYXBDb29yZHModCksYSh0aGlzLl90aWxlUmVhZHksdGhpcyx0KSk7dGhpcy5faW5pdFRpbGUobyksdGhpcy5jcmVhdGVUaWxlLmxlbmd0aDwyJiZ5KGEodGhpcy5fdGlsZVJlYWR5LHRoaXMsdCxudWxsLG8pKSxaKG8saSksdGhpcy5fdGlsZXNbbl09e2VsOm8sY29vcmRzOnQsY3VycmVudDohMH0sZS5hcHBlbmRDaGlsZChvKSx0aGlzLmZpcmUoInRpbGVsb2Fkc3RhcnQiLHt0aWxlOm8sY29vcmRzOnR9KX0sX3RpbGVSZWFkeTpmdW5jdGlvbih0LGUsaSl7ZSYmdGhpcy5maXJlKCJ0aWxlZXJyb3IiLHtlcnJvcjplLHRpbGU6aSxjb29yZHM6dH0pO3ZhciBuPXRoaXMuX3RpbGVDb29yZHNUb0tleSh0KTsoaT10aGlzLl90aWxlc1tuXSkmJihpLmxvYWRlZD0rbmV3IERhdGUsdGhpcy5fbWFwLl9mYWRlQW5pbWF0ZWQ\/KEMoaS5lbCwwKSxyKHRoaXMuX2ZhZGVGcmFtZSksdGhpcy5fZmFkZUZyYW1lPXkodGhpcy5fdXBkYXRlT3BhY2l0eSx0aGlzKSk6KGkuYWN0aXZlPSEwLHRoaXMuX3BydW5lVGlsZXMoKSksZXx8KE0oaS5lbCwibGVhZmxldC10aWxlLWxvYWRlZCIpLHRoaXMuZmlyZSgidGlsZWxvYWQiLHt0aWxlOmkuZWwsY29vcmRzOnR9KSksdGhpcy5fbm9UaWxlc1RvTG9hZCgpJiYodGhpcy5fbG9hZGluZz0hMSx0aGlzLmZpcmUoImxvYWQiKSxiLmllbHQ5fHwhdGhpcy5fbWFwLl9mYWRlQW5pbWF0ZWQ\/eSh0aGlzLl9wcnVuZVRpbGVzLHRoaXMpOnNldFRpbWVvdXQoYSh0aGlzLl9wcnVuZVRpbGVzLHRoaXMpLDI1MCkpKX0sX2dldFRpbGVQb3M6ZnVuY3Rpb24odCl7cmV0dXJuIHQuc2NhbGVCeSh0aGlzLmdldFRpbGVTaXplKCkpLnN1YnRyYWN0KHRoaXMuX2xldmVsLm9yaWdpbil9LF93cmFwQ29vcmRzOmZ1bmN0aW9uKHQpe3ZhciBlPW5ldyBwKHRoaXMuX3dyYXBYP0godC54LHRoaXMuX3dyYXBYKTp0LngsdGhpcy5fd3JhcFk\/SCh0LnksdGhpcy5fd3JhcFkpOnQueSk7cmV0dXJuIGUuej10LnosZX0sX3B4Qm91bmRzVG9UaWxlUmFuZ2U6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5nZXRUaWxlU2l6ZSgpO3JldHVybiBuZXcgZih0Lm1pbi51bnNjYWxlQnkoZSkuZmxvb3IoKSx0Lm1heC51bnNjYWxlQnkoZSkuY2VpbCgpLnN1YnRyYWN0KFsxLDFdKSl9LF9ub1RpbGVzVG9Mb2FkOmZ1bmN0aW9uKCl7Zm9yKHZhciB0IGluIHRoaXMuX3RpbGVzKWlmKCF0aGlzLl90aWxlc1t0XS5sb2FkZWQpcmV0dXJuITE7cmV0dXJuITB9fSkpLElpPUJpLmV4dGVuZCh7b3B0aW9uczp7bWluWm9vbTowLG1heFpvb206MTgsc3ViZG9tYWluczoiYWJjIixlcnJvclRpbGVVcmw6IiIsem9vbU9mZnNldDowLHRtczohMSx6b29tUmV2ZXJzZTohMSxkZXRlY3RSZXRpbmE6ITEsY3Jvc3NPcmlnaW46ITEscmVmZXJyZXJQb2xpY3k6ITF9LGluaXRpYWxpemU6ZnVuY3Rpb24odCxlKXt0aGlzLl91cmw9dCwoZT1oKHRoaXMsZSkpLmRldGVjdFJldGluYSYmYi5yZXRpbmEmJjA8ZS5tYXhab29tPyhlLnRpbGVTaXplPU1hdGguZmxvb3IoZS50aWxlU2l6ZS8yKSxlLnpvb21SZXZlcnNlPyhlLnpvb21PZmZzZXQtLSxlLm1pblpvb209TWF0aC5taW4oZS5tYXhab29tLGUubWluWm9vbSsxKSk6KGUuem9vbU9mZnNldCsrLGUubWF4Wm9vbT1NYXRoLm1heChlLm1pblpvb20sZS5tYXhab29tLTEpKSxlLm1pblpvb209TWF0aC5tYXgoMCxlLm1pblpvb20pKTplLnpvb21SZXZlcnNlP2UubWluWm9vbT1NYXRoLm1pbihlLm1heFpvb20sZS5taW5ab29tKTplLm1heFpvb209TWF0aC5tYXgoZS5taW5ab29tLGUubWF4Wm9vbSksInN0cmluZyI9PXR5cGVvZiBlLnN1YmRvbWFpbnMmJihlLnN1YmRvbWFpbnM9ZS5zdWJkb21haW5zLnNwbGl0KCIiKSksdGhpcy5vbigidGlsZXVubG9hZCIsdGhpcy5fb25UaWxlUmVtb3ZlKX0sc2V0VXJsOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuX3VybD09PXQmJnZvaWQgMD09PWUmJihlPSEwKSx0aGlzLl91cmw9dCxlfHx0aGlzLnJlZHJhdygpLHRoaXN9LGNyZWF0ZVRpbGU6ZnVuY3Rpb24odCxlKXt2YXIgaT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbWciKTtyZXR1cm4gUyhpLCJsb2FkIixhKHRoaXMuX3RpbGVPbkxvYWQsdGhpcyxlLGkpKSxTKGksImVycm9yIixhKHRoaXMuX3RpbGVPbkVycm9yLHRoaXMsZSxpKSksIXRoaXMub3B0aW9ucy5jcm9zc09yaWdpbiYmIiIhPT10aGlzLm9wdGlvbnMuY3Jvc3NPcmlnaW58fChpLmNyb3NzT3JpZ2luPSEwPT09dGhpcy5vcHRpb25zLmNyb3NzT3JpZ2luPyIiOnRoaXMub3B0aW9ucy5jcm9zc09yaWdpbiksInN0cmluZyI9PXR5cGVvZiB0aGlzLm9wdGlvbnMucmVmZXJyZXJQb2xpY3kmJihpLnJlZmVycmVyUG9saWN5PXRoaXMub3B0aW9ucy5yZWZlcnJlclBvbGljeSksaS5hbHQ9IiIsaS5zcmM9dGhpcy5nZXRUaWxlVXJsKHQpLGl9LGdldFRpbGVVcmw6ZnVuY3Rpb24odCl7dmFyIGU9e3I6Yi5yZXRpbmE\/IkAyeCI6IiIsczp0aGlzLl9nZXRTdWJkb21haW4odCkseDp0LngseTp0Lnksejp0aGlzLl9nZXRab29tRm9yVXJsKCl9O3JldHVybiB0aGlzLl9tYXAmJiF0aGlzLl9tYXAub3B0aW9ucy5jcnMuaW5maW5pdGUmJih0PXRoaXMuX2dsb2JhbFRpbGVSYW5nZS5tYXgueS10LnksdGhpcy5vcHRpb25zLnRtcyYmKGUueT10KSxlWyIteSJdPXQpLHEodGhpcy5fdXJsLGwoZSx0aGlzLm9wdGlvbnMpKX0sX3RpbGVPbkxvYWQ6ZnVuY3Rpb24odCxlKXtiLmllbHQ5P3NldFRpbWVvdXQoYSh0LHRoaXMsbnVsbCxlKSwwKTp0KG51bGwsZSl9LF90aWxlT25FcnJvcjpmdW5jdGlvbih0LGUsaSl7dmFyIG49dGhpcy5vcHRpb25zLmVycm9yVGlsZVVybDtuJiZlLmdldEF0dHJpYnV0ZSgic3JjIikhPT1uJiYoZS5zcmM9biksdChpLGUpfSxfb25UaWxlUmVtb3ZlOmZ1bmN0aW9uKHQpe3QudGlsZS5vbmxvYWQ9bnVsbH0sX2dldFpvb21Gb3JVcmw6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl90aWxlWm9vbSxlPXRoaXMub3B0aW9ucy5tYXhab29tO3JldHVybih0PXRoaXMub3B0aW9ucy56b29tUmV2ZXJzZT9lLXQ6dCkrdGhpcy5vcHRpb25zLnpvb21PZmZzZXR9LF9nZXRTdWJkb21haW46ZnVuY3Rpb24odCl7cmV0dXJuIHQ9TWF0aC5hYnModC54K3QueSkldGhpcy5vcHRpb25zLnN1YmRvbWFpbnMubGVuZ3RoLHRoaXMub3B0aW9ucy5zdWJkb21haW5zW3RdfSxfYWJvcnRMb2FkaW5nOmZ1bmN0aW9uKCl7dmFyIHQsZSxpO2Zvcih0IGluIHRoaXMuX3RpbGVzKXRoaXMuX3RpbGVzW3RdLmNvb3Jkcy56IT09dGhpcy5fdGlsZVpvb20mJigoaT10aGlzLl90aWxlc1t0XS5lbCkub25sb2FkPV8saS5vbmVycm9yPV8saS5jb21wbGV0ZXx8KGkuc3JjPUssZT10aGlzLl90aWxlc1t0XS5jb29yZHMsVChpKSxkZWxldGUgdGhpcy5fdGlsZXNbdF0sdGhpcy5maXJlKCJ0aWxlYWJvcnQiLHt0aWxlOmksY29vcmRzOmV9KSkpfSxfcmVtb3ZlVGlsZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLl90aWxlc1t0XTtpZihlKXJldHVybiBlLmVsLnNldEF0dHJpYnV0ZSgic3JjIixLKSxCaS5wcm90b3R5cGUuX3JlbW92ZVRpbGUuY2FsbCh0aGlzLHQpfSxfdGlsZVJlYWR5OmZ1bmN0aW9uKHQsZSxpKXtpZih0aGlzLl9tYXAmJighaXx8aS5nZXRBdHRyaWJ1dGUoInNyYyIpIT09SykpcmV0dXJuIEJpLnByb3RvdHlwZS5fdGlsZVJlYWR5LmNhbGwodGhpcyx0LGUsaSl9fSk7ZnVuY3Rpb24gUmkodCxlKXtyZXR1cm4gbmV3IElpKHQsZSl9dmFyIE5pPUlpLmV4dGVuZCh7ZGVmYXVsdFdtc1BhcmFtczp7c2VydmljZToiV01TIixyZXF1ZXN0OiJHZXRNYXAiLGxheWVyczoiIixzdHlsZXM6IiIsZm9ybWF0OiJpbWFnZS9qcGVnIix0cmFuc3BhcmVudDohMSx2ZXJzaW9uOiIxLjEuMSJ9LG9wdGlvbnM6e2NyczpudWxsLHVwcGVyY2FzZTohMX0saW5pdGlhbGl6ZTpmdW5jdGlvbih0LGUpe3RoaXMuX3VybD10O3ZhciBpLG49bCh7fSx0aGlzLmRlZmF1bHRXbXNQYXJhbXMpO2ZvcihpIGluIGUpaSBpbiB0aGlzLm9wdGlvbnN8fChuW2ldPWVbaV0pO3ZhciB0PShlPWgodGhpcyxlKSkuZGV0ZWN0UmV0aW5hJiZiLnJldGluYT8yOjEsbz10aGlzLmdldFRpbGVTaXplKCk7bi53aWR0aD1vLngqdCxuLmhlaWdodD1vLnkqdCx0aGlzLndtc1BhcmFtcz1ufSxvbkFkZDpmdW5jdGlvbih0KXt0aGlzLl9jcnM9dGhpcy5vcHRpb25zLmNyc3x8dC5vcHRpb25zLmNycyx0aGlzLl93bXNWZXJzaW9uPXBhcnNlRmxvYXQodGhpcy53bXNQYXJhbXMudmVyc2lvbik7dmFyIGU9MS4zPD10aGlzLl93bXNWZXJzaW9uPyJjcnMiOiJzcnMiO3RoaXMud21zUGFyYW1zW2VdPXRoaXMuX2Nycy5jb2RlLElpLnByb3RvdHlwZS5vbkFkZC5jYWxsKHRoaXMsdCl9LGdldFRpbGVVcmw6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fdGlsZUNvb3Jkc1RvTndTZSh0KSxlPShpPWMoKGk9dGhpcy5fY3JzKS5wcm9qZWN0KGVbMF0pLGkucHJvamVjdChlWzFdKSkpLm1pbixpPWkubWF4LGU9KDEuMzw9dGhpcy5fd21zVmVyc2lvbiYmdGhpcy5fY3JzPT09cmk\/W2UueSxlLngsaS55LGkueF06W2UueCxlLnksaS54LGkueV0pLmpvaW4oIiwiKTtyZXR1cm4oaT1JaS5wcm90b3R5cGUuZ2V0VGlsZVVybC5jYWxsKHRoaXMsdCkpK1UodGhpcy53bXNQYXJhbXMsaSx0aGlzLm9wdGlvbnMudXBwZXJjYXNlKSsodGhpcy5vcHRpb25zLnVwcGVyY2FzZT8iJkJCT1g9IjoiJmJib3g9IikrZX0sc2V0UGFyYW1zOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIGwodGhpcy53bXNQYXJhbXMsdCksZXx8dGhpcy5yZWRyYXcoKSx0aGlzfX0pLERpPShJaS5XTVM9TmksUmkud21zPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG5ldyBOaSh0LGUpfSxvLmV4dGVuZCh7b3B0aW9uczp7cGFkZGluZzouMX0saW5pdGlhbGl6ZTpmdW5jdGlvbih0KXtoKHRoaXMsdCksZCh0aGlzKSx0aGlzLl9sYXllcnM9dGhpcy5fbGF5ZXJzfHx7fX0sb25BZGQ6ZnVuY3Rpb24oKXt0aGlzLl9jb250YWluZXJ8fCh0aGlzLl9pbml0Q29udGFpbmVyKCksTSh0aGlzLl9jb250YWluZXIsImxlYWZsZXQtem9vbS1hbmltYXRlZCIpKSx0aGlzLmdldFBhbmUoKS5hcHBlbmRDaGlsZCh0aGlzLl9jb250YWluZXIpLHRoaXMuX3VwZGF0ZSgpLHRoaXMub24oInVwZGF0ZSIsdGhpcy5fdXBkYXRlUGF0aHMsdGhpcyl9LG9uUmVtb3ZlOmZ1bmN0aW9uKCl7dGhpcy5vZmYoInVwZGF0ZSIsdGhpcy5fdXBkYXRlUGF0aHMsdGhpcyksdGhpcy5fZGVzdHJveUNvbnRhaW5lcigpfSxnZXRFdmVudHM6ZnVuY3Rpb24oKXt2YXIgdD17dmlld3Jlc2V0OnRoaXMuX3Jlc2V0LHpvb206dGhpcy5fb25ab29tLG1vdmVlbmQ6dGhpcy5fdXBkYXRlLHpvb21lbmQ6dGhpcy5fb25ab29tRW5kfTtyZXR1cm4gdGhpcy5fem9vbUFuaW1hdGVkJiYodC56b29tYW5pbT10aGlzLl9vbkFuaW1ab29tKSx0fSxfb25BbmltWm9vbTpmdW5jdGlvbih0KXt0aGlzLl91cGRhdGVUcmFuc2Zvcm0odC5jZW50ZXIsdC56b29tKX0sX29uWm9vbTpmdW5jdGlvbigpe3RoaXMuX3VwZGF0ZVRyYW5zZm9ybSh0aGlzLl9tYXAuZ2V0Q2VudGVyKCksdGhpcy5fbWFwLmdldFpvb20oKSl9LF91cGRhdGVUcmFuc2Zvcm06ZnVuY3Rpb24odCxlKXt2YXIgaT10aGlzLl9tYXAuZ2V0Wm9vbVNjYWxlKGUsdGhpcy5fem9vbSksbj10aGlzLl9tYXAuZ2V0U2l6ZSgpLm11bHRpcGx5QnkoLjUrdGhpcy5vcHRpb25zLnBhZGRpbmcpLG89dGhpcy5fbWFwLnByb2plY3QodGhpcy5fY2VudGVyLGUpLG49bi5tdWx0aXBseUJ5KC1pKS5hZGQobykuc3VidHJhY3QodGhpcy5fbWFwLl9nZXROZXdQaXhlbE9yaWdpbih0LGUpKTtiLmFueTNkP2dlKHRoaXMuX2NvbnRhaW5lcixuLGkpOloodGhpcy5fY29udGFpbmVyLG4pfSxfcmVzZXQ6ZnVuY3Rpb24oKXtmb3IodmFyIHQgaW4gdGhpcy5fdXBkYXRlKCksdGhpcy5fdXBkYXRlVHJhbnNmb3JtKHRoaXMuX2NlbnRlcix0aGlzLl96b29tKSx0aGlzLl9sYXllcnMpdGhpcy5fbGF5ZXJzW3RdLl9yZXNldCgpfSxfb25ab29tRW5kOmZ1bmN0aW9uKCl7Zm9yKHZhciB0IGluIHRoaXMuX2xheWVycyl0aGlzLl9sYXllcnNbdF0uX3Byb2plY3QoKX0sX3VwZGF0ZVBhdGhzOmZ1bmN0aW9uKCl7Zm9yKHZhciB0IGluIHRoaXMuX2xheWVycyl0aGlzLl9sYXllcnNbdF0uX3VwZGF0ZSgpfSxfdXBkYXRlOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5vcHRpb25zLnBhZGRpbmcsZT10aGlzLl9tYXAuZ2V0U2l6ZSgpLGk9dGhpcy5fbWFwLmNvbnRhaW5lclBvaW50VG9MYXllclBvaW50KGUubXVsdGlwbHlCeSgtdCkpLnJvdW5kKCk7dGhpcy5fYm91bmRzPW5ldyBmKGksaS5hZGQoZS5tdWx0aXBseUJ5KDErMip0KSkucm91bmQoKSksdGhpcy5fY2VudGVyPXRoaXMuX21hcC5nZXRDZW50ZXIoKSx0aGlzLl96b29tPXRoaXMuX21hcC5nZXRab29tKCl9fSkpLGppPURpLmV4dGVuZCh7b3B0aW9uczp7dG9sZXJhbmNlOjB9LGdldEV2ZW50czpmdW5jdGlvbigpe3ZhciB0PURpLnByb3RvdHlwZS5nZXRFdmVudHMuY2FsbCh0aGlzKTtyZXR1cm4gdC52aWV3cHJlcmVzZXQ9dGhpcy5fb25WaWV3UHJlUmVzZXQsdH0sX29uVmlld1ByZVJlc2V0OmZ1bmN0aW9uKCl7dGhpcy5fcG9zdHBvbmVVcGRhdGVQYXRocz0hMH0sb25BZGQ6ZnVuY3Rpb24oKXtEaS5wcm90b3R5cGUub25BZGQuY2FsbCh0aGlzKSx0aGlzLl9kcmF3KCl9LF9pbml0Q29udGFpbmVyOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fY29udGFpbmVyPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImNhbnZhcyIpO1ModCwibW91c2Vtb3ZlIix0aGlzLl9vbk1vdXNlTW92ZSx0aGlzKSxTKHQsImNsaWNrIGRibGNsaWNrIG1vdXNlZG93biBtb3VzZXVwIGNvbnRleHRtZW51Iix0aGlzLl9vbkNsaWNrLHRoaXMpLFModCwibW91c2VvdXQiLHRoaXMuX2hhbmRsZU1vdXNlT3V0LHRoaXMpLHQuX2xlYWZsZXRfZGlzYWJsZV9ldmVudHM9ITAsdGhpcy5fY3R4PXQuZ2V0Q29udGV4dCgiMmQiKX0sX2Rlc3Ryb3lDb250YWluZXI6ZnVuY3Rpb24oKXtyKHRoaXMuX3JlZHJhd1JlcXVlc3QpLGRlbGV0ZSB0aGlzLl9jdHgsVCh0aGlzLl9jb250YWluZXIpLGsodGhpcy5fY29udGFpbmVyKSxkZWxldGUgdGhpcy5fY29udGFpbmVyfSxfdXBkYXRlUGF0aHM6ZnVuY3Rpb24oKXtpZighdGhpcy5fcG9zdHBvbmVVcGRhdGVQYXRocyl7Zm9yKHZhciB0IGluIHRoaXMuX3JlZHJhd0JvdW5kcz1udWxsLHRoaXMuX2xheWVycyl0aGlzLl9sYXllcnNbdF0uX3VwZGF0ZSgpO3RoaXMuX3JlZHJhdygpfX0sX3VwZGF0ZTpmdW5jdGlvbigpe3ZhciB0LGUsaSxuO3RoaXMuX21hcC5fYW5pbWF0aW5nWm9vbSYmdGhpcy5fYm91bmRzfHwoRGkucHJvdG90eXBlLl91cGRhdGUuY2FsbCh0aGlzKSx0PXRoaXMuX2JvdW5kcyxlPXRoaXMuX2NvbnRhaW5lcixpPXQuZ2V0U2l6ZSgpLG49Yi5yZXRpbmE\/MjoxLFooZSx0Lm1pbiksZS53aWR0aD1uKmkueCxlLmhlaWdodD1uKmkueSxlLnN0eWxlLndpZHRoPWkueCsicHgiLGUuc3R5bGUuaGVpZ2h0PWkueSsicHgiLGIucmV0aW5hJiZ0aGlzLl9jdHguc2NhbGUoMiwyKSx0aGlzLl9jdHgudHJhbnNsYXRlKC10Lm1pbi54LC10Lm1pbi55KSx0aGlzLmZpcmUoInVwZGF0ZSIpKX0sX3Jlc2V0OmZ1bmN0aW9uKCl7RGkucHJvdG90eXBlLl9yZXNldC5jYWxsKHRoaXMpLHRoaXMuX3Bvc3Rwb25lVXBkYXRlUGF0aHMmJih0aGlzLl9wb3N0cG9uZVVwZGF0ZVBhdGhzPSExLHRoaXMuX3VwZGF0ZVBhdGhzKCkpfSxfaW5pdFBhdGg6ZnVuY3Rpb24odCl7dGhpcy5fdXBkYXRlRGFzaEFycmF5KHQpLHQ9KHRoaXMuX2xheWVyc1tkKHQpXT10KS5fb3JkZXI9e2xheWVyOnQscHJldjp0aGlzLl9kcmF3TGFzdCxuZXh0Om51bGx9LHRoaXMuX2RyYXdMYXN0JiYodGhpcy5fZHJhd0xhc3QubmV4dD10KSx0aGlzLl9kcmF3TGFzdD10LHRoaXMuX2RyYXdGaXJzdD10aGlzLl9kcmF3Rmlyc3R8fHRoaXMuX2RyYXdMYXN0fSxfYWRkUGF0aDpmdW5jdGlvbih0KXt0aGlzLl9yZXF1ZXN0UmVkcmF3KHQpfSxfcmVtb3ZlUGF0aDpmdW5jdGlvbih0KXt2YXIgZT0oaT10Ll9vcmRlcikubmV4dCxpPWkucHJldjtlP2UucHJldj1pOnRoaXMuX2RyYXdMYXN0PWksaT9pLm5leHQ9ZTp0aGlzLl9kcmF3Rmlyc3Q9ZSxkZWxldGUgdC5fb3JkZXIsZGVsZXRlIHRoaXMuX2xheWVyc1tkKHQpXSx0aGlzLl9yZXF1ZXN0UmVkcmF3KHQpfSxfdXBkYXRlUGF0aDpmdW5jdGlvbih0KXt0aGlzLl9leHRlbmRSZWRyYXdCb3VuZHModCksdC5fcHJvamVjdCgpLHQuX3VwZGF0ZSgpLHRoaXMuX3JlcXVlc3RSZWRyYXcodCl9LF91cGRhdGVTdHlsZTpmdW5jdGlvbih0KXt0aGlzLl91cGRhdGVEYXNoQXJyYXkodCksdGhpcy5fcmVxdWVzdFJlZHJhdyh0KX0sX3VwZGF0ZURhc2hBcnJheTpmdW5jdGlvbih0KXtpZigic3RyaW5nIj09dHlwZW9mIHQub3B0aW9ucy5kYXNoQXJyYXkpe2Zvcih2YXIgZSxpPXQub3B0aW9ucy5kYXNoQXJyYXkuc3BsaXQoL1ssIF0rLyksbj1bXSxvPTA7bzxpLmxlbmd0aDtvKyspe2lmKGU9TnVtYmVyKGlbb10pLGlzTmFOKGUpKXJldHVybjtuLnB1c2goZSl9dC5vcHRpb25zLl9kYXNoQXJyYXk9bn1lbHNlIHQub3B0aW9ucy5fZGFzaEFycmF5PXQub3B0aW9ucy5kYXNoQXJyYXl9LF9yZXF1ZXN0UmVkcmF3OmZ1bmN0aW9uKHQpe3RoaXMuX21hcCYmKHRoaXMuX2V4dGVuZFJlZHJhd0JvdW5kcyh0KSx0aGlzLl9yZWRyYXdSZXF1ZXN0PXRoaXMuX3JlZHJhd1JlcXVlc3R8fHkodGhpcy5fcmVkcmF3LHRoaXMpKX0sX2V4dGVuZFJlZHJhd0JvdW5kczpmdW5jdGlvbih0KXt2YXIgZTt0Ll9weEJvdW5kcyYmKGU9KHQub3B0aW9ucy53ZWlnaHR8fDApKzEsdGhpcy5fcmVkcmF3Qm91bmRzPXRoaXMuX3JlZHJhd0JvdW5kc3x8bmV3IGYsdGhpcy5fcmVkcmF3Qm91bmRzLmV4dGVuZCh0Ll9weEJvdW5kcy5taW4uc3VidHJhY3QoW2UsZV0pKSx0aGlzLl9yZWRyYXdCb3VuZHMuZXh0ZW5kKHQuX3B4Qm91bmRzLm1heC5hZGQoW2UsZV0pKSl9LF9yZWRyYXc6ZnVuY3Rpb24oKXt0aGlzLl9yZWRyYXdSZXF1ZXN0PW51bGwsdGhpcy5fcmVkcmF3Qm91bmRzJiYodGhpcy5fcmVkcmF3Qm91bmRzLm1pbi5fZmxvb3IoKSx0aGlzLl9yZWRyYXdCb3VuZHMubWF4Ll9jZWlsKCkpLHRoaXMuX2NsZWFyKCksdGhpcy5fZHJhdygpLHRoaXMuX3JlZHJhd0JvdW5kcz1udWxsfSxfY2xlYXI6ZnVuY3Rpb24oKXt2YXIgdCxlPXRoaXMuX3JlZHJhd0JvdW5kcztlPyh0PWUuZ2V0U2l6ZSgpLHRoaXMuX2N0eC5jbGVhclJlY3QoZS5taW4ueCxlLm1pbi55LHQueCx0LnkpKToodGhpcy5fY3R4LnNhdmUoKSx0aGlzLl9jdHguc2V0VHJhbnNmb3JtKDEsMCwwLDEsMCwwKSx0aGlzLl9jdHguY2xlYXJSZWN0KDAsMCx0aGlzLl9jb250YWluZXIud2lkdGgsdGhpcy5fY29udGFpbmVyLmhlaWdodCksdGhpcy5fY3R4LnJlc3RvcmUoKSl9LF9kcmF3OmZ1bmN0aW9uKCl7dmFyIHQsZSxpPXRoaXMuX3JlZHJhd0JvdW5kczt0aGlzLl9jdHguc2F2ZSgpLGkmJihlPWkuZ2V0U2l6ZSgpLHRoaXMuX2N0eC5iZWdpblBhdGgoKSx0aGlzLl9jdHgucmVjdChpLm1pbi54LGkubWluLnksZS54LGUueSksdGhpcy5fY3R4LmNsaXAoKSksdGhpcy5fZHJhd2luZz0hMDtmb3IodmFyIG49dGhpcy5fZHJhd0ZpcnN0O247bj1uLm5leHQpdD1uLmxheWVyLCghaXx8dC5fcHhCb3VuZHMmJnQuX3B4Qm91bmRzLmludGVyc2VjdHMoaSkpJiZ0Ll91cGRhdGVQYXRoKCk7dGhpcy5fZHJhd2luZz0hMSx0aGlzLl9jdHgucmVzdG9yZSgpfSxfdXBkYXRlUG9seTpmdW5jdGlvbih0LGUpe2lmKHRoaXMuX2RyYXdpbmcpe3ZhciBpLG4sbyxzLHI9dC5fcGFydHMsYT1yLmxlbmd0aCxoPXRoaXMuX2N0eDtpZihhKXtmb3IoaC5iZWdpblBhdGgoKSxpPTA7aTxhO2krKyl7Zm9yKG49MCxvPXJbaV0ubGVuZ3RoO248bztuKyspcz1yW2ldW25dLGhbbj8ibGluZVRvIjoibW92ZVRvIl0ocy54LHMueSk7ZSYmaC5jbG9zZVBhdGgoKX10aGlzLl9maWxsU3Ryb2tlKGgsdCl9fX0sX3VwZGF0ZUNpcmNsZTpmdW5jdGlvbih0KXt2YXIgZSxpLG4sbzt0aGlzLl9kcmF3aW5nJiYhdC5fZW1wdHkoKSYmKGU9dC5fcG9pbnQsaT10aGlzLl9jdHgsbj1NYXRoLm1heChNYXRoLnJvdW5kKHQuX3JhZGl1cyksMSksMSE9KG89KE1hdGgubWF4KE1hdGgucm91bmQodC5fcmFkaXVzWSksMSl8fG4pL24pJiYoaS5zYXZlKCksaS5zY2FsZSgxLG8pKSxpLmJlZ2luUGF0aCgpLGkuYXJjKGUueCxlLnkvbyxuLDAsMipNYXRoLlBJLCExKSwxIT1vJiZpLnJlc3RvcmUoKSx0aGlzLl9maWxsU3Ryb2tlKGksdCkpfSxfZmlsbFN0cm9rZTpmdW5jdGlvbih0LGUpe3ZhciBpPWUub3B0aW9ucztpLmZpbGwmJih0Lmdsb2JhbEFscGhhPWkuZmlsbE9wYWNpdHksdC5maWxsU3R5bGU9aS5maWxsQ29sb3J8fGkuY29sb3IsdC5maWxsKGkuZmlsbFJ1bGV8fCJldmVub2RkIikpLGkuc3Ryb2tlJiYwIT09aS53ZWlnaHQmJih0LnNldExpbmVEYXNoJiZ0LnNldExpbmVEYXNoKGUub3B0aW9ucyYmZS5vcHRpb25zLl9kYXNoQXJyYXl8fFtdKSx0Lmdsb2JhbEFscGhhPWkub3BhY2l0eSx0LmxpbmVXaWR0aD1pLndlaWdodCx0LnN0cm9rZVN0eWxlPWkuY29sb3IsdC5saW5lQ2FwPWkubGluZUNhcCx0LmxpbmVKb2luPWkubGluZUpvaW4sdC5zdHJva2UoKSl9LF9vbkNsaWNrOmZ1bmN0aW9uKHQpe2Zvcih2YXIgZSxpLG49dGhpcy5fbWFwLm1vdXNlRXZlbnRUb0xheWVyUG9pbnQodCksbz10aGlzLl9kcmF3Rmlyc3Q7bztvPW8ubmV4dCkoZT1vLmxheWVyKS5vcHRpb25zLmludGVyYWN0aXZlJiZlLl9jb250YWluc1BvaW50KG4pJiYoKCJjbGljayI9PT10LnR5cGV8fCJwcmVjbGljayI9PT10LnR5cGUpJiZ0aGlzLl9tYXAuX2RyYWdnYWJsZU1vdmVkKGUpfHwoaT1lKSk7dGhpcy5fZmlyZUV2ZW50KCEhaSYmW2ldLHQpfSxfb25Nb3VzZU1vdmU6ZnVuY3Rpb24odCl7dmFyIGU7IXRoaXMuX21hcHx8dGhpcy5fbWFwLmRyYWdnaW5nLm1vdmluZygpfHx0aGlzLl9tYXAuX2FuaW1hdGluZ1pvb218fChlPXRoaXMuX21hcC5tb3VzZUV2ZW50VG9MYXllclBvaW50KHQpLHRoaXMuX2hhbmRsZU1vdXNlSG92ZXIodCxlKSl9LF9oYW5kbGVNb3VzZU91dDpmdW5jdGlvbih0KXt2YXIgZT10aGlzLl9ob3ZlcmVkTGF5ZXI7ZSYmKHoodGhpcy5fY29udGFpbmVyLCJsZWFmbGV0LWludGVyYWN0aXZlIiksdGhpcy5fZmlyZUV2ZW50KFtlXSx0LCJtb3VzZW91dCIpLHRoaXMuX2hvdmVyZWRMYXllcj1udWxsLHRoaXMuX21vdXNlSG92ZXJUaHJvdHRsZWQ9ITEpfSxfaGFuZGxlTW91c2VIb3ZlcjpmdW5jdGlvbih0LGUpe2lmKCF0aGlzLl9tb3VzZUhvdmVyVGhyb3R0bGVkKXtmb3IodmFyIGksbixvPXRoaXMuX2RyYXdGaXJzdDtvO289by5uZXh0KShpPW8ubGF5ZXIpLm9wdGlvbnMuaW50ZXJhY3RpdmUmJmkuX2NvbnRhaW5zUG9pbnQoZSkmJihuPWkpO24hPT10aGlzLl9ob3ZlcmVkTGF5ZXImJih0aGlzLl9oYW5kbGVNb3VzZU91dCh0KSxuJiYoTSh0aGlzLl9jb250YWluZXIsImxlYWZsZXQtaW50ZXJhY3RpdmUiKSx0aGlzLl9maXJlRXZlbnQoW25dLHQsIm1vdXNlb3ZlciIpLHRoaXMuX2hvdmVyZWRMYXllcj1uKSksdGhpcy5fZmlyZUV2ZW50KCEhdGhpcy5faG92ZXJlZExheWVyJiZbdGhpcy5faG92ZXJlZExheWVyXSx0KSx0aGlzLl9tb3VzZUhvdmVyVGhyb3R0bGVkPSEwLHNldFRpbWVvdXQoYShmdW5jdGlvbigpe3RoaXMuX21vdXNlSG92ZXJUaHJvdHRsZWQ9ITF9LHRoaXMpLDMyKX19LF9maXJlRXZlbnQ6ZnVuY3Rpb24odCxlLGkpe3RoaXMuX21hcC5fZmlyZURPTUV2ZW50KGUsaXx8ZS50eXBlLHQpfSxfYnJpbmdUb0Zyb250OmZ1bmN0aW9uKHQpe3ZhciBlLGksbj10Ll9vcmRlcjtuJiYoZT1uLm5leHQsaT1uLnByZXYsZSYmKChlLnByZXY9aSk\/aS5uZXh0PWU6ZSYmKHRoaXMuX2RyYXdGaXJzdD1lKSxuLnByZXY9dGhpcy5fZHJhd0xhc3QsKHRoaXMuX2RyYXdMYXN0Lm5leHQ9bikubmV4dD1udWxsLHRoaXMuX2RyYXdMYXN0PW4sdGhpcy5fcmVxdWVzdFJlZHJhdyh0KSkpfSxfYnJpbmdUb0JhY2s6ZnVuY3Rpb24odCl7dmFyIGUsaSxuPXQuX29yZGVyO24mJihlPW4ubmV4dCwoaT1uLnByZXYpJiYoKGkubmV4dD1lKT9lLnByZXY9aTppJiYodGhpcy5fZHJhd0xhc3Q9aSksbi5wcmV2PW51bGwsbi5uZXh0PXRoaXMuX2RyYXdGaXJzdCx0aGlzLl9kcmF3Rmlyc3QucHJldj1uLHRoaXMuX2RyYXdGaXJzdD1uLHRoaXMuX3JlcXVlc3RSZWRyYXcodCkpKX19KTtmdW5jdGlvbiBIaSh0KXtyZXR1cm4gYi5jYW52YXM\/bmV3IGppKHQpOm51bGx9dmFyIFdpPWZ1bmN0aW9uKCl7dHJ5e3JldHVybiBkb2N1bWVudC5uYW1lc3BhY2VzLmFkZCgibHZtbCIsInVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206dm1sIiksZnVuY3Rpb24odCl7cmV0dXJuIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIjxsdm1sOiIrdCsnIGNsYXNzPSJsdm1sIj4nKX19Y2F0Y2godCl7fXJldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiPCIrdCsnIHhtbG5zPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQuY29tOnZtbCIgY2xhc3M9Imx2bWwiPicpfX0oKSxNdD17X2luaXRDb250YWluZXI6ZnVuY3Rpb24oKXt0aGlzLl9jb250YWluZXI9UCgiZGl2IiwibGVhZmxldC12bWwtY29udGFpbmVyIil9LF91cGRhdGU6ZnVuY3Rpb24oKXt0aGlzLl9tYXAuX2FuaW1hdGluZ1pvb218fChEaS5wcm90b3R5cGUuX3VwZGF0ZS5jYWxsKHRoaXMpLHRoaXMuZmlyZSgidXBkYXRlIikpfSxfaW5pdFBhdGg6ZnVuY3Rpb24odCl7dmFyIGU9dC5fY29udGFpbmVyPVdpKCJzaGFwZSIpO00oZSwibGVhZmxldC12bWwtc2hhcGUgIisodGhpcy5vcHRpb25zLmNsYXNzTmFtZXx8IiIpKSxlLmNvb3Jkc2l6ZT0iMSAxIix0Ll9wYXRoPVdpKCJwYXRoIiksZS5hcHBlbmRDaGlsZCh0Ll9wYXRoKSx0aGlzLl91cGRhdGVTdHlsZSh0KSx0aGlzLl9sYXllcnNbZCh0KV09dH0sX2FkZFBhdGg6ZnVuY3Rpb24odCl7dmFyIGU9dC5fY29udGFpbmVyO3RoaXMuX2NvbnRhaW5lci5hcHBlbmRDaGlsZChlKSx0Lm9wdGlvbnMuaW50ZXJhY3RpdmUmJnQuYWRkSW50ZXJhY3RpdmVUYXJnZXQoZSl9LF9yZW1vdmVQYXRoOmZ1bmN0aW9uKHQpe3ZhciBlPXQuX2NvbnRhaW5lcjtUKGUpLHQucmVtb3ZlSW50ZXJhY3RpdmVUYXJnZXQoZSksZGVsZXRlIHRoaXMuX2xheWVyc1tkKHQpXX0sX3VwZGF0ZVN0eWxlOmZ1bmN0aW9uKHQpe3ZhciBlPXQuX3N0cm9rZSxpPXQuX2ZpbGwsbj10Lm9wdGlvbnMsbz10Ll9jb250YWluZXI7by5zdHJva2VkPSEhbi5zdHJva2Usby5maWxsZWQ9ISFuLmZpbGwsbi5zdHJva2U\/KGU9ZXx8KHQuX3N0cm9rZT1XaSgic3Ryb2tlIikpLG8uYXBwZW5kQ2hpbGQoZSksZS53ZWlnaHQ9bi53ZWlnaHQrInB4IixlLmNvbG9yPW4uY29sb3IsZS5vcGFjaXR5PW4ub3BhY2l0eSxuLmRhc2hBcnJheT9lLmRhc2hTdHlsZT11KG4uZGFzaEFycmF5KT9uLmRhc2hBcnJheS5qb2luKCIgIik6bi5kYXNoQXJyYXkucmVwbGFjZSgvKCAqLCAqKS9nLCIgIik6ZS5kYXNoU3R5bGU9IiIsZS5lbmRjYXA9bi5saW5lQ2FwLnJlcGxhY2UoImJ1dHQiLCJmbGF0IiksZS5qb2luc3R5bGU9bi5saW5lSm9pbik6ZSYmKG8ucmVtb3ZlQ2hpbGQoZSksdC5fc3Ryb2tlPW51bGwpLG4uZmlsbD8oaT1pfHwodC5fZmlsbD1XaSgiZmlsbCIpKSxvLmFwcGVuZENoaWxkKGkpLGkuY29sb3I9bi5maWxsQ29sb3J8fG4uY29sb3IsaS5vcGFjaXR5PW4uZmlsbE9wYWNpdHkpOmkmJihvLnJlbW92ZUNoaWxkKGkpLHQuX2ZpbGw9bnVsbCl9LF91cGRhdGVDaXJjbGU6ZnVuY3Rpb24odCl7dmFyIGU9dC5fcG9pbnQucm91bmQoKSxpPU1hdGgucm91bmQodC5fcmFkaXVzKSxuPU1hdGgucm91bmQodC5fcmFkaXVzWXx8aSk7dGhpcy5fc2V0UGF0aCh0LHQuX2VtcHR5KCk\/Ik0wIDAiOiJBTCAiK2UueCsiLCIrZS55KyIgIitpKyIsIituKyIgMCwyMzU5MjYwMCIpfSxfc2V0UGF0aDpmdW5jdGlvbih0LGUpe3QuX3BhdGgudj1lfSxfYnJpbmdUb0Zyb250OmZ1bmN0aW9uKHQpe2NlKHQuX2NvbnRhaW5lcil9LF9icmluZ1RvQmFjazpmdW5jdGlvbih0KXtkZSh0Ll9jb250YWluZXIpfX0sRmk9Yi52bWw\/V2k6Y3QsVWk9RGkuZXh0ZW5kKHtfaW5pdENvbnRhaW5lcjpmdW5jdGlvbigpe3RoaXMuX2NvbnRhaW5lcj1GaSgic3ZnIiksdGhpcy5fY29udGFpbmVyLnNldEF0dHJpYnV0ZSgicG9pbnRlci1ldmVudHMiLCJub25lIiksdGhpcy5fcm9vdEdyb3VwPUZpKCJnIiksdGhpcy5fY29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMuX3Jvb3RHcm91cCl9LF9kZXN0cm95Q29udGFpbmVyOmZ1bmN0aW9uKCl7VCh0aGlzLl9jb250YWluZXIpLGsodGhpcy5fY29udGFpbmVyKSxkZWxldGUgdGhpcy5fY29udGFpbmVyLGRlbGV0ZSB0aGlzLl9yb290R3JvdXAsZGVsZXRlIHRoaXMuX3N2Z1NpemV9LF91cGRhdGU6ZnVuY3Rpb24oKXt2YXIgdCxlLGk7dGhpcy5fbWFwLl9hbmltYXRpbmdab29tJiZ0aGlzLl9ib3VuZHN8fChEaS5wcm90b3R5cGUuX3VwZGF0ZS5jYWxsKHRoaXMpLGU9KHQ9dGhpcy5fYm91bmRzKS5nZXRTaXplKCksaT10aGlzLl9jb250YWluZXIsdGhpcy5fc3ZnU2l6ZSYmdGhpcy5fc3ZnU2l6ZS5lcXVhbHMoZSl8fCh0aGlzLl9zdmdTaXplPWUsaS5zZXRBdHRyaWJ1dGUoIndpZHRoIixlLngpLGkuc2V0QXR0cmlidXRlKCJoZWlnaHQiLGUueSkpLFooaSx0Lm1pbiksaS5zZXRBdHRyaWJ1dGUoInZpZXdCb3giLFt0Lm1pbi54LHQubWluLnksZS54LGUueV0uam9pbigiICIpKSx0aGlzLmZpcmUoInVwZGF0ZSIpKX0sX2luaXRQYXRoOmZ1bmN0aW9uKHQpe3ZhciBlPXQuX3BhdGg9RmkoInBhdGgiKTt0Lm9wdGlvbnMuY2xhc3NOYW1lJiZNKGUsdC5vcHRpb25zLmNsYXNzTmFtZSksdC5vcHRpb25zLmludGVyYWN0aXZlJiZNKGUsImxlYWZsZXQtaW50ZXJhY3RpdmUiKSx0aGlzLl91cGRhdGVTdHlsZSh0KSx0aGlzLl9sYXllcnNbZCh0KV09dH0sX2FkZFBhdGg6ZnVuY3Rpb24odCl7dGhpcy5fcm9vdEdyb3VwfHx0aGlzLl9pbml0Q29udGFpbmVyKCksdGhpcy5fcm9vdEdyb3VwLmFwcGVuZENoaWxkKHQuX3BhdGgpLHQuYWRkSW50ZXJhY3RpdmVUYXJnZXQodC5fcGF0aCl9LF9yZW1vdmVQYXRoOmZ1bmN0aW9uKHQpe1QodC5fcGF0aCksdC5yZW1vdmVJbnRlcmFjdGl2ZVRhcmdldCh0Ll9wYXRoKSxkZWxldGUgdGhpcy5fbGF5ZXJzW2QodCldfSxfdXBkYXRlUGF0aDpmdW5jdGlvbih0KXt0Ll9wcm9qZWN0KCksdC5fdXBkYXRlKCl9LF91cGRhdGVTdHlsZTpmdW5jdGlvbih0KXt2YXIgZT10Ll9wYXRoLHQ9dC5vcHRpb25zO2UmJih0LnN0cm9rZT8oZS5zZXRBdHRyaWJ1dGUoInN0cm9rZSIsdC5jb2xvciksZS5zZXRBdHRyaWJ1dGUoInN0cm9rZS1vcGFjaXR5Iix0Lm9wYWNpdHkpLGUuc2V0QXR0cmlidXRlKCJzdHJva2Utd2lkdGgiLHQud2VpZ2h0KSxlLnNldEF0dHJpYnV0ZSgic3Ryb2tlLWxpbmVjYXAiLHQubGluZUNhcCksZS5zZXRBdHRyaWJ1dGUoInN0cm9rZS1saW5lam9pbiIsdC5saW5lSm9pbiksdC5kYXNoQXJyYXk\/ZS5zZXRBdHRyaWJ1dGUoInN0cm9rZS1kYXNoYXJyYXkiLHQuZGFzaEFycmF5KTplLnJlbW92ZUF0dHJpYnV0ZSgic3Ryb2tlLWRhc2hhcnJheSIpLHQuZGFzaE9mZnNldD9lLnNldEF0dHJpYnV0ZSgic3Ryb2tlLWRhc2hvZmZzZXQiLHQuZGFzaE9mZnNldCk6ZS5yZW1vdmVBdHRyaWJ1dGUoInN0cm9rZS1kYXNob2Zmc2V0IikpOmUuc2V0QXR0cmlidXRlKCJzdHJva2UiLCJub25lIiksdC5maWxsPyhlLnNldEF0dHJpYnV0ZSgiZmlsbCIsdC5maWxsQ29sb3J8fHQuY29sb3IpLGUuc2V0QXR0cmlidXRlKCJmaWxsLW9wYWNpdHkiLHQuZmlsbE9wYWNpdHkpLGUuc2V0QXR0cmlidXRlKCJmaWxsLXJ1bGUiLHQuZmlsbFJ1bGV8fCJldmVub2RkIikpOmUuc2V0QXR0cmlidXRlKCJmaWxsIiwibm9uZSIpKX0sX3VwZGF0ZVBvbHk6ZnVuY3Rpb24odCxlKXt0aGlzLl9zZXRQYXRoKHQsZHQodC5fcGFydHMsZSkpfSxfdXBkYXRlQ2lyY2xlOmZ1bmN0aW9uKHQpe3ZhciBlPXQuX3BvaW50LGk9TWF0aC5tYXgoTWF0aC5yb3VuZCh0Ll9yYWRpdXMpLDEpLG49ImEiK2krIiwiKyhNYXRoLm1heChNYXRoLnJvdW5kKHQuX3JhZGl1c1kpLDEpfHxpKSsiIDAgMSwwICIsZT10Ll9lbXB0eSgpPyJNMCAwIjoiTSIrKGUueC1pKSsiLCIrZS55K24rMippKyIsMCAiK24rMiotaSsiLDAgIjt0aGlzLl9zZXRQYXRoKHQsZSl9LF9zZXRQYXRoOmZ1bmN0aW9uKHQsZSl7dC5fcGF0aC5zZXRBdHRyaWJ1dGUoImQiLGUpfSxfYnJpbmdUb0Zyb250OmZ1bmN0aW9uKHQpe2NlKHQuX3BhdGgpfSxfYnJpbmdUb0JhY2s6ZnVuY3Rpb24odCl7ZGUodC5fcGF0aCl9fSk7ZnVuY3Rpb24gVmkodCl7cmV0dXJuIGIuc3ZnfHxiLnZtbD9uZXcgVWkodCk6bnVsbH1iLnZtbCYmVWkuaW5jbHVkZShNdCksQS5pbmNsdWRlKHtnZXRSZW5kZXJlcjpmdW5jdGlvbih0KXtyZXR1cm4gdD0odD10Lm9wdGlvbnMucmVuZGVyZXJ8fHRoaXMuX2dldFBhbmVSZW5kZXJlcih0Lm9wdGlvbnMucGFuZSl8fHRoaXMub3B0aW9ucy5yZW5kZXJlcnx8dGhpcy5fcmVuZGVyZXIpfHwodGhpcy5fcmVuZGVyZXI9dGhpcy5fY3JlYXRlUmVuZGVyZXIoKSksdGhpcy5oYXNMYXllcih0KXx8dGhpcy5hZGRMYXllcih0KSx0fSxfZ2V0UGFuZVJlbmRlcmVyOmZ1bmN0aW9uKHQpe3ZhciBlO3JldHVybiJvdmVybGF5UGFuZSIhPT10JiZ2b2lkIDAhPT10JiYodm9pZCAwPT09KGU9dGhpcy5fcGFuZVJlbmRlcmVyc1t0XSkmJihlPXRoaXMuX2NyZWF0ZVJlbmRlcmVyKHtwYW5lOnR9KSx0aGlzLl9wYW5lUmVuZGVyZXJzW3RdPWUpLGUpfSxfY3JlYXRlUmVuZGVyZXI6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMub3B0aW9ucy5wcmVmZXJDYW52YXMmJkhpKHQpfHxWaSh0KX19KTt2YXIgcWk9Z2kuZXh0ZW5kKHtpbml0aWFsaXplOmZ1bmN0aW9uKHQsZSl7Z2kucHJvdG90eXBlLmluaXRpYWxpemUuY2FsbCh0aGlzLHRoaXMuX2JvdW5kc1RvTGF0TG5ncyh0KSxlKX0sc2V0Qm91bmRzOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnNldExhdExuZ3ModGhpcy5fYm91bmRzVG9MYXRMbmdzKHQpKX0sX2JvdW5kc1RvTGF0TG5nczpmdW5jdGlvbih0KXtyZXR1cm5bKHQ9Zyh0KSkuZ2V0U291dGhXZXN0KCksdC5nZXROb3J0aFdlc3QoKSx0LmdldE5vcnRoRWFzdCgpLHQuZ2V0U291dGhFYXN0KCldfX0pLF90PShVaS5jcmVhdGU9RmksVWkucG9pbnRzVG9QYXRoPWR0LHZpLmdlb21ldHJ5VG9MYXllcj15aSx2aS5jb29yZHNUb0xhdExuZz13aSx2aS5jb29yZHNUb0xhdExuZ3M9YmksdmkubGF0TG5nVG9Db29yZHM9UGksdmkubGF0TG5nc1RvQ29vcmRzPUxpLHZpLmdldEZlYXR1cmU9VGksdmkuYXNGZWF0dXJlPU1pLEEubWVyZ2VPcHRpb25zKHtib3hab29tOiEwfSksbi5leHRlbmQoe2luaXRpYWxpemU6ZnVuY3Rpb24odCl7dGhpcy5fbWFwPXQsdGhpcy5fY29udGFpbmVyPXQuX2NvbnRhaW5lcix0aGlzLl9wYW5lPXQuX3BhbmVzLm92ZXJsYXlQYW5lLHRoaXMuX3Jlc2V0U3RhdGVUaW1lb3V0PTAsdC5vbigidW5sb2FkIix0aGlzLl9kZXN0cm95LHRoaXMpfSxhZGRIb29rczpmdW5jdGlvbigpe1ModGhpcy5fY29udGFpbmVyLCJtb3VzZWRvd24iLHRoaXMuX29uTW91c2VEb3duLHRoaXMpfSxyZW1vdmVIb29rczpmdW5jdGlvbigpe2sodGhpcy5fY29udGFpbmVyLCJtb3VzZWRvd24iLHRoaXMuX29uTW91c2VEb3duLHRoaXMpfSxtb3ZlZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9tb3ZlZH0sX2Rlc3Ryb3k6ZnVuY3Rpb24oKXtUKHRoaXMuX3BhbmUpLGRlbGV0ZSB0aGlzLl9wYW5lfSxfcmVzZXRTdGF0ZTpmdW5jdGlvbigpe3RoaXMuX3Jlc2V0U3RhdGVUaW1lb3V0PTAsdGhpcy5fbW92ZWQ9ITF9LF9jbGVhckRlZmVycmVkUmVzZXRTdGF0ZTpmdW5jdGlvbigpezAhPT10aGlzLl9yZXNldFN0YXRlVGltZW91dCYmKGNsZWFyVGltZW91dCh0aGlzLl9yZXNldFN0YXRlVGltZW91dCksdGhpcy5fcmVzZXRTdGF0ZVRpbWVvdXQ9MCl9LF9vbk1vdXNlRG93bjpmdW5jdGlvbih0KXtpZighdC5zaGlmdEtleXx8MSE9PXQud2hpY2gmJjEhPT10LmJ1dHRvbilyZXR1cm4hMTt0aGlzLl9jbGVhckRlZmVycmVkUmVzZXRTdGF0ZSgpLHRoaXMuX3Jlc2V0U3RhdGUoKSxpZSgpLHllKCksdGhpcy5fc3RhcnRQb2ludD10aGlzLl9tYXAubW91c2VFdmVudFRvQ29udGFpbmVyUG9pbnQodCksUyhkb2N1bWVudCx7Y29udGV4dG1lbnU6QWUsbW91c2Vtb3ZlOnRoaXMuX29uTW91c2VNb3ZlLG1vdXNldXA6dGhpcy5fb25Nb3VzZVVwLGtleWRvd246dGhpcy5fb25LZXlEb3dufSx0aGlzKX0sX29uTW91c2VNb3ZlOmZ1bmN0aW9uKHQpe3RoaXMuX21vdmVkfHwodGhpcy5fbW92ZWQ9ITAsdGhpcy5fYm94PVAoImRpdiIsImxlYWZsZXQtem9vbS1ib3giLHRoaXMuX2NvbnRhaW5lciksTSh0aGlzLl9jb250YWluZXIsImxlYWZsZXQtY3Jvc3NoYWlyIiksdGhpcy5fbWFwLmZpcmUoImJveHpvb21zdGFydCIpKSx0aGlzLl9wb2ludD10aGlzLl9tYXAubW91c2VFdmVudFRvQ29udGFpbmVyUG9pbnQodCk7dmFyIGU9KHQ9bmV3IGYodGhpcy5fcG9pbnQsdGhpcy5fc3RhcnRQb2ludCkpLmdldFNpemUoKTtaKHRoaXMuX2JveCx0Lm1pbiksdGhpcy5fYm94LnN0eWxlLndpZHRoPWUueCsicHgiLHRoaXMuX2JveC5zdHlsZS5oZWlnaHQ9ZS55KyJweCJ9LF9maW5pc2g6ZnVuY3Rpb24oKXt0aGlzLl9tb3ZlZCYmKFQodGhpcy5fYm94KSx6KHRoaXMuX2NvbnRhaW5lciwibGVhZmxldC1jcm9zc2hhaXIiKSksVGUoKSx4ZSgpLGsoZG9jdW1lbnQse2NvbnRleHRtZW51OkFlLG1vdXNlbW92ZTp0aGlzLl9vbk1vdXNlTW92ZSxtb3VzZXVwOnRoaXMuX29uTW91c2VVcCxrZXlkb3duOnRoaXMuX29uS2V5RG93bn0sdGhpcyl9LF9vbk1vdXNlVXA6ZnVuY3Rpb24odCl7MSE9PXQud2hpY2gmJjEhPT10LmJ1dHRvbnx8KHRoaXMuX2ZpbmlzaCgpLHRoaXMuX21vdmVkJiYodGhpcy5fY2xlYXJEZWZlcnJlZFJlc2V0U3RhdGUoKSx0aGlzLl9yZXNldFN0YXRlVGltZW91dD1zZXRUaW1lb3V0KGEodGhpcy5fcmVzZXRTdGF0ZSx0aGlzKSwwKSx0PW5ldyBzKHRoaXMuX21hcC5jb250YWluZXJQb2ludFRvTGF0TG5nKHRoaXMuX3N0YXJ0UG9pbnQpLHRoaXMuX21hcC5jb250YWluZXJQb2ludFRvTGF0TG5nKHRoaXMuX3BvaW50KSksdGhpcy5fbWFwLmZpdEJvdW5kcyh0KS5maXJlKCJib3h6b29tZW5kIix7Ym94Wm9vbUJvdW5kczp0fSkpKX0sX29uS2V5RG93bjpmdW5jdGlvbih0KXsyNz09PXQua2V5Q29kZSYmKHRoaXMuX2ZpbmlzaCgpLHRoaXMuX2NsZWFyRGVmZXJyZWRSZXNldFN0YXRlKCksdGhpcy5fcmVzZXRTdGF0ZSgpKX19KSksenQ9KEEuYWRkSW5pdEhvb2soImFkZEhhbmRsZXIiLCJib3hab29tIixfdCksQS5tZXJnZU9wdGlvbnMoe2RvdWJsZUNsaWNrWm9vbTohMH0pLG4uZXh0ZW5kKHthZGRIb29rczpmdW5jdGlvbigpe3RoaXMuX21hcC5vbigiZGJsY2xpY2siLHRoaXMuX29uRG91YmxlQ2xpY2ssdGhpcyl9LHJlbW92ZUhvb2tzOmZ1bmN0aW9uKCl7dGhpcy5fbWFwLm9mZigiZGJsY2xpY2siLHRoaXMuX29uRG91YmxlQ2xpY2ssdGhpcyl9LF9vbkRvdWJsZUNsaWNrOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX21hcCxpPWUuZ2V0Wm9vbSgpLG49ZS5vcHRpb25zLnpvb21EZWx0YSxpPXQub3JpZ2luYWxFdmVudC5zaGlmdEtleT9pLW46aStuOyJjZW50ZXIiPT09ZS5vcHRpb25zLmRvdWJsZUNsaWNrWm9vbT9lLnNldFpvb20oaSk6ZS5zZXRab29tQXJvdW5kKHQuY29udGFpbmVyUG9pbnQsaSl9fSkpLEdpPShBLmFkZEluaXRIb29rKCJhZGRIYW5kbGVyIiwiZG91YmxlQ2xpY2tab29tIix6dCksQS5tZXJnZU9wdGlvbnMoe2RyYWdnaW5nOiEwLGluZXJ0aWE6ITAsaW5lcnRpYURlY2VsZXJhdGlvbjozNDAwLGluZXJ0aWFNYXhTcGVlZDoxLzAsZWFzZUxpbmVhcml0eTouMix3b3JsZENvcHlKdW1wOiExLG1heEJvdW5kc1Zpc2Nvc2l0eTowfSksbi5leHRlbmQoe2FkZEhvb2tzOmZ1bmN0aW9uKCl7dmFyIHQ7dGhpcy5fZHJhZ2dhYmxlfHwodD10aGlzLl9tYXAsdGhpcy5fZHJhZ2dhYmxlPW5ldyBHZSh0Ll9tYXBQYW5lLHQuX2NvbnRhaW5lciksdGhpcy5fZHJhZ2dhYmxlLm9uKHtkcmFnc3RhcnQ6dGhpcy5fb25EcmFnU3RhcnQsZHJhZzp0aGlzLl9vbkRyYWcsZHJhZ2VuZDp0aGlzLl9vbkRyYWdFbmR9LHRoaXMpLHRoaXMuX2RyYWdnYWJsZS5vbigicHJlZHJhZyIsdGhpcy5fb25QcmVEcmFnTGltaXQsdGhpcyksdC5vcHRpb25zLndvcmxkQ29weUp1bXAmJih0aGlzLl9kcmFnZ2FibGUub24oInByZWRyYWciLHRoaXMuX29uUHJlRHJhZ1dyYXAsdGhpcyksdC5vbigiem9vbWVuZCIsdGhpcy5fb25ab29tRW5kLHRoaXMpLHQud2hlblJlYWR5KHRoaXMuX29uWm9vbUVuZCx0aGlzKSkpLE0odGhpcy5fbWFwLl9jb250YWluZXIsImxlYWZsZXQtZ3JhYiBsZWFmbGV0LXRvdWNoLWRyYWciKSx0aGlzLl9kcmFnZ2FibGUuZW5hYmxlKCksdGhpcy5fcG9zaXRpb25zPVtdLHRoaXMuX3RpbWVzPVtdfSxyZW1vdmVIb29rczpmdW5jdGlvbigpe3oodGhpcy5fbWFwLl9jb250YWluZXIsImxlYWZsZXQtZ3JhYiIpLHoodGhpcy5fbWFwLl9jb250YWluZXIsImxlYWZsZXQtdG91Y2gtZHJhZyIpLHRoaXMuX2RyYWdnYWJsZS5kaXNhYmxlKCl9LG1vdmVkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2RyYWdnYWJsZSYmdGhpcy5fZHJhZ2dhYmxlLl9tb3ZlZH0sbW92aW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2RyYWdnYWJsZSYmdGhpcy5fZHJhZ2dhYmxlLl9tb3Zpbmd9LF9vbkRyYWdTdGFydDpmdW5jdGlvbigpe3ZhciB0LGU9dGhpcy5fbWFwO2UuX3N0b3AoKSx0aGlzLl9tYXAub3B0aW9ucy5tYXhCb3VuZHMmJnRoaXMuX21hcC5vcHRpb25zLm1heEJvdW5kc1Zpc2Nvc2l0eT8odD1nKHRoaXMuX21hcC5vcHRpb25zLm1heEJvdW5kcyksdGhpcy5fb2Zmc2V0TGltaXQ9Yyh0aGlzLl9tYXAubGF0TG5nVG9Db250YWluZXJQb2ludCh0LmdldE5vcnRoV2VzdCgpKS5tdWx0aXBseUJ5KC0xKSx0aGlzLl9tYXAubGF0TG5nVG9Db250YWluZXJQb2ludCh0LmdldFNvdXRoRWFzdCgpKS5tdWx0aXBseUJ5KC0xKS5hZGQodGhpcy5fbWFwLmdldFNpemUoKSkpLHRoaXMuX3Zpc2Nvc2l0eT1NYXRoLm1pbigxLE1hdGgubWF4KDAsdGhpcy5fbWFwLm9wdGlvbnMubWF4Qm91bmRzVmlzY29zaXR5KSkpOnRoaXMuX29mZnNldExpbWl0PW51bGwsZS5maXJlKCJtb3Zlc3RhcnQiKS5maXJlKCJkcmFnc3RhcnQiKSxlLm9wdGlvbnMuaW5lcnRpYSYmKHRoaXMuX3Bvc2l0aW9ucz1bXSx0aGlzLl90aW1lcz1bXSl9LF9vbkRyYWc6ZnVuY3Rpb24odCl7dmFyIGUsaTt0aGlzLl9tYXAub3B0aW9ucy5pbmVydGlhJiYoZT10aGlzLl9sYXN0VGltZT0rbmV3IERhdGUsaT10aGlzLl9sYXN0UG9zPXRoaXMuX2RyYWdnYWJsZS5fYWJzUG9zfHx0aGlzLl9kcmFnZ2FibGUuX25ld1Bvcyx0aGlzLl9wb3NpdGlvbnMucHVzaChpKSx0aGlzLl90aW1lcy5wdXNoKGUpLHRoaXMuX3BydW5lUG9zaXRpb25zKGUpKSx0aGlzLl9tYXAuZmlyZSgibW92ZSIsdCkuZmlyZSgiZHJhZyIsdCl9LF9wcnVuZVBvc2l0aW9uczpmdW5jdGlvbih0KXtmb3IoOzE8dGhpcy5fcG9zaXRpb25zLmxlbmd0aCYmNTA8dC10aGlzLl90aW1lc1swXTspdGhpcy5fcG9zaXRpb25zLnNoaWZ0KCksdGhpcy5fdGltZXMuc2hpZnQoKX0sX29uWm9vbUVuZDpmdW5jdGlvbigpe3ZhciB0PXRoaXMuX21hcC5nZXRTaXplKCkuZGl2aWRlQnkoMiksZT10aGlzLl9tYXAubGF0TG5nVG9MYXllclBvaW50KFswLDBdKTt0aGlzLl9pbml0aWFsV29ybGRPZmZzZXQ9ZS5zdWJ0cmFjdCh0KS54LHRoaXMuX3dvcmxkV2lkdGg9dGhpcy5fbWFwLmdldFBpeGVsV29ybGRCb3VuZHMoKS5nZXRTaXplKCkueH0sX3Zpc2NvdXNMaW1pdDpmdW5jdGlvbih0LGUpe3JldHVybiB0LSh0LWUpKnRoaXMuX3Zpc2Nvc2l0eX0sX29uUHJlRHJhZ0xpbWl0OmZ1bmN0aW9uKCl7dmFyIHQsZTt0aGlzLl92aXNjb3NpdHkmJnRoaXMuX29mZnNldExpbWl0JiYodD10aGlzLl9kcmFnZ2FibGUuX25ld1Bvcy5zdWJ0cmFjdCh0aGlzLl9kcmFnZ2FibGUuX3N0YXJ0UG9zKSxlPXRoaXMuX29mZnNldExpbWl0LHQueDxlLm1pbi54JiYodC54PXRoaXMuX3Zpc2NvdXNMaW1pdCh0LngsZS5taW4ueCkpLHQueTxlLm1pbi55JiYodC55PXRoaXMuX3Zpc2NvdXNMaW1pdCh0LnksZS5taW4ueSkpLHQueD5lLm1heC54JiYodC54PXRoaXMuX3Zpc2NvdXNMaW1pdCh0LngsZS5tYXgueCkpLHQueT5lLm1heC55JiYodC55PXRoaXMuX3Zpc2NvdXNMaW1pdCh0LnksZS5tYXgueSkpLHRoaXMuX2RyYWdnYWJsZS5fbmV3UG9zPXRoaXMuX2RyYWdnYWJsZS5fc3RhcnRQb3MuYWRkKHQpKX0sX29uUHJlRHJhZ1dyYXA6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl93b3JsZFdpZHRoLGU9TWF0aC5yb3VuZCh0LzIpLGk9dGhpcy5faW5pdGlhbFdvcmxkT2Zmc2V0LG49KChvPXRoaXMuX2RyYWdnYWJsZS5fbmV3UG9zLngpLWUraSkldCtlLWksbz0obytlK2kpJXQtZS1pLHQ9TWF0aC5hYnMobitpKTxNYXRoLmFicyhvK2kpP246bzt0aGlzLl9kcmFnZ2FibGUuX2Fic1Bvcz10aGlzLl9kcmFnZ2FibGUuX25ld1Bvcy5jbG9uZSgpLHRoaXMuX2RyYWdnYWJsZS5fbmV3UG9zLng9dH0sX29uRHJhZ0VuZDpmdW5jdGlvbih0KXt2YXIgZSxpLG4sbyxzPXRoaXMuX21hcCxyPXMub3B0aW9ucyxhPSFyLmluZXJ0aWF8fHQubm9JbmVydGlhfHx0aGlzLl90aW1lcy5sZW5ndGg8MjtzLmZpcmUoImRyYWdlbmQiLHQpLCFhJiYodGhpcy5fcHJ1bmVQb3NpdGlvbnMoK25ldyBEYXRlKSx0PXRoaXMuX2xhc3RQb3Muc3VidHJhY3QodGhpcy5fcG9zaXRpb25zWzBdKSxhPSh0aGlzLl9sYXN0VGltZS10aGlzLl90aW1lc1swXSkvMWUzLGU9ci5lYXNlTGluZWFyaXR5LGE9KHQ9dC5tdWx0aXBseUJ5KGUvYSkpLmRpc3RhbmNlVG8oWzAsMF0pLGk9TWF0aC5taW4oci5pbmVydGlhTWF4U3BlZWQsYSksdD10Lm11bHRpcGx5QnkoaS9hKSxuPWkvKHIuaW5lcnRpYURlY2VsZXJhdGlvbiplKSwobz10Lm11bHRpcGx5QnkoLW4vMikucm91bmQoKSkueHx8by55KT8obz1zLl9saW1pdE9mZnNldChvLHMub3B0aW9ucy5tYXhCb3VuZHMpLHkoZnVuY3Rpb24oKXtzLnBhbkJ5KG8se2R1cmF0aW9uOm4sZWFzZUxpbmVhcml0eTplLG5vTW92ZVN0YXJ0OiEwLGFuaW1hdGU6ITB9KX0pKTpzLmZpcmUoIm1vdmVlbmQiKX19KSksQ3Q9KEEuYWRkSW5pdEhvb2soImFkZEhhbmRsZXIiLCJkcmFnZ2luZyIsR2kpLEEubWVyZ2VPcHRpb25zKHtrZXlib2FyZDohMCxrZXlib2FyZFBhbkRlbHRhOjgwfSksbi5leHRlbmQoe2tleUNvZGVzOntsZWZ0OlszN10scmlnaHQ6WzM5XSxkb3duOls0MF0sdXA6WzM4XSx6b29tSW46WzE4NywxMDcsNjEsMTcxXSx6b29tT3V0OlsxODksMTA5LDU0LDE3M119LGluaXRpYWxpemU6ZnVuY3Rpb24odCl7dGhpcy5fbWFwPXQsdGhpcy5fc2V0UGFuRGVsdGEodC5vcHRpb25zLmtleWJvYXJkUGFuRGVsdGEpLHRoaXMuX3NldFpvb21EZWx0YSh0Lm9wdGlvbnMuem9vbURlbHRhKX0sYWRkSG9va3M6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9tYXAuX2NvbnRhaW5lcjt0LnRhYkluZGV4PD0wJiYodC50YWJJbmRleD0iMCIpLFModCx7Zm9jdXM6dGhpcy5fb25Gb2N1cyxibHVyOnRoaXMuX29uQmx1cixtb3VzZWRvd246dGhpcy5fb25Nb3VzZURvd259LHRoaXMpLHRoaXMuX21hcC5vbih7Zm9jdXM6dGhpcy5fYWRkSG9va3MsYmx1cjp0aGlzLl9yZW1vdmVIb29rc30sdGhpcyl9LHJlbW92ZUhvb2tzOmZ1bmN0aW9uKCl7dGhpcy5fcmVtb3ZlSG9va3MoKSxrKHRoaXMuX21hcC5fY29udGFpbmVyLHtmb2N1czp0aGlzLl9vbkZvY3VzLGJsdXI6dGhpcy5fb25CbHVyLG1vdXNlZG93bjp0aGlzLl9vbk1vdXNlRG93bn0sdGhpcyksdGhpcy5fbWFwLm9mZih7Zm9jdXM6dGhpcy5fYWRkSG9va3MsYmx1cjp0aGlzLl9yZW1vdmVIb29rc30sdGhpcyl9LF9vbk1vdXNlRG93bjpmdW5jdGlvbigpe3ZhciB0LGUsaTt0aGlzLl9mb2N1c2VkfHwoaT1kb2N1bWVudC5ib2R5LHQ9ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LGU9aS5zY3JvbGxUb3B8fHQuc2Nyb2xsVG9wLGk9aS5zY3JvbGxMZWZ0fHx0LnNjcm9sbExlZnQsdGhpcy5fbWFwLl9jb250YWluZXIuZm9jdXMoKSx3aW5kb3cuc2Nyb2xsVG8oaSxlKSl9LF9vbkZvY3VzOmZ1bmN0aW9uKCl7dGhpcy5fZm9jdXNlZD0hMCx0aGlzLl9tYXAuZmlyZSgiZm9jdXMiKX0sX29uQmx1cjpmdW5jdGlvbigpe3RoaXMuX2ZvY3VzZWQ9ITEsdGhpcy5fbWFwLmZpcmUoImJsdXIiKX0sX3NldFBhbkRlbHRhOmZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10aGlzLl9wYW5LZXlzPXt9LGk9dGhpcy5rZXlDb2RlcyxuPTAsbz1pLmxlZnQubGVuZ3RoO248bztuKyspZVtpLmxlZnRbbl1dPVstMSp0LDBdO2ZvcihuPTAsbz1pLnJpZ2h0Lmxlbmd0aDtuPG87bisrKWVbaS5yaWdodFtuXV09W3QsMF07Zm9yKG49MCxvPWkuZG93bi5sZW5ndGg7bjxvO24rKyllW2kuZG93bltuXV09WzAsdF07Zm9yKG49MCxvPWkudXAubGVuZ3RoO248bztuKyspZVtpLnVwW25dXT1bMCwtMSp0XX0sX3NldFpvb21EZWx0YTpmdW5jdGlvbih0KXtmb3IodmFyIGU9dGhpcy5fem9vbUtleXM9e30saT10aGlzLmtleUNvZGVzLG49MCxvPWkuem9vbUluLmxlbmd0aDtuPG87bisrKWVbaS56b29tSW5bbl1dPXQ7Zm9yKG49MCxvPWkuem9vbU91dC5sZW5ndGg7bjxvO24rKyllW2kuem9vbU91dFtuXV09LXR9LF9hZGRIb29rczpmdW5jdGlvbigpe1MoZG9jdW1lbnQsImtleWRvd24iLHRoaXMuX29uS2V5RG93bix0aGlzKX0sX3JlbW92ZUhvb2tzOmZ1bmN0aW9uKCl7ayhkb2N1bWVudCwia2V5ZG93biIsdGhpcy5fb25LZXlEb3duLHRoaXMpfSxfb25LZXlEb3duOmZ1bmN0aW9uKHQpe2lmKCEodC5hbHRLZXl8fHQuY3RybEtleXx8dC5tZXRhS2V5KSl7dmFyIGUsaSxuPXQua2V5Q29kZSxvPXRoaXMuX21hcDtpZihuIGluIHRoaXMuX3BhbktleXMpby5fcGFuQW5pbSYmby5fcGFuQW5pbS5faW5Qcm9ncmVzc3x8KGk9dGhpcy5fcGFuS2V5c1tuXSx0LnNoaWZ0S2V5JiYoaT1tKGkpLm11bHRpcGx5QnkoMykpLG8ub3B0aW9ucy5tYXhCb3VuZHMmJihpPW8uX2xpbWl0T2Zmc2V0KG0oaSksby5vcHRpb25zLm1heEJvdW5kcykpLG8ub3B0aW9ucy53b3JsZENvcHlKdW1wPyhlPW8ud3JhcExhdExuZyhvLnVucHJvamVjdChvLnByb2plY3Qoby5nZXRDZW50ZXIoKSkuYWRkKGkpKSksby5wYW5UbyhlKSk6by5wYW5CeShpKSk7ZWxzZSBpZihuIGluIHRoaXMuX3pvb21LZXlzKW8uc2V0Wm9vbShvLmdldFpvb20oKSsodC5zaGlmdEtleT8zOjEpKnRoaXMuX3pvb21LZXlzW25dKTtlbHNle2lmKDI3IT09bnx8IW8uX3BvcHVwfHwhby5fcG9wdXAub3B0aW9ucy5jbG9zZU9uRXNjYXBlS2V5KXJldHVybjtvLmNsb3NlUG9wdXAoKX1BZSh0KX19fSkpLFp0PShBLmFkZEluaXRIb29rKCJhZGRIYW5kbGVyIiwia2V5Ym9hcmQiLEN0KSxBLm1lcmdlT3B0aW9ucyh7c2Nyb2xsV2hlZWxab29tOiEwLHdoZWVsRGVib3VuY2VUaW1lOjQwLHdoZWVsUHhQZXJab29tTGV2ZWw6NjB9KSxuLmV4dGVuZCh7YWRkSG9va3M6ZnVuY3Rpb24oKXtTKHRoaXMuX21hcC5fY29udGFpbmVyLCJ3aGVlbCIsdGhpcy5fb25XaGVlbFNjcm9sbCx0aGlzKSx0aGlzLl9kZWx0YT0wfSxyZW1vdmVIb29rczpmdW5jdGlvbigpe2sodGhpcy5fbWFwLl9jb250YWluZXIsIndoZWVsIix0aGlzLl9vbldoZWVsU2Nyb2xsLHRoaXMpfSxfb25XaGVlbFNjcm9sbDpmdW5jdGlvbih0KXt2YXIgZT1OZSh0KSxpPXRoaXMuX21hcC5vcHRpb25zLndoZWVsRGVib3VuY2VUaW1lLGU9KHRoaXMuX2RlbHRhKz1lLHRoaXMuX2xhc3RNb3VzZVBvcz10aGlzLl9tYXAubW91c2VFdmVudFRvQ29udGFpbmVyUG9pbnQodCksdGhpcy5fc3RhcnRUaW1lfHwodGhpcy5fc3RhcnRUaW1lPStuZXcgRGF0ZSksTWF0aC5tYXgoaS0oK25ldyBEYXRlLXRoaXMuX3N0YXJ0VGltZSksMCkpO2NsZWFyVGltZW91dCh0aGlzLl90aW1lciksdGhpcy5fdGltZXI9c2V0VGltZW91dChhKHRoaXMuX3BlcmZvcm1ab29tLHRoaXMpLGUpLEFlKHQpfSxfcGVyZm9ybVpvb206ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9tYXAsZT10LmdldFpvb20oKSxpPXRoaXMuX21hcC5vcHRpb25zLnpvb21TbmFwfHwwLG49KHQuX3N0b3AoKSx0aGlzLl9kZWx0YS8oNCp0aGlzLl9tYXAub3B0aW9ucy53aGVlbFB4UGVyWm9vbUxldmVsKSksbj00Kk1hdGgubG9nKDIvKDErTWF0aC5leHAoLU1hdGguYWJzKG4pKSkpL01hdGguTE4yLGk9aT9NYXRoLmNlaWwobi9pKSppOm4sbj10Ll9saW1pdFpvb20oZSsoMDx0aGlzLl9kZWx0YT9pOi1pKSktZTt0aGlzLl9kZWx0YT0wLHRoaXMuX3N0YXJ0VGltZT1udWxsLG4mJigiY2VudGVyIj09PXQub3B0aW9ucy5zY3JvbGxXaGVlbFpvb20\/dC5zZXRab29tKGUrbik6dC5zZXRab29tQXJvdW5kKHRoaXMuX2xhc3RNb3VzZVBvcyxlK24pKX19KSksU3Q9KEEuYWRkSW5pdEhvb2soImFkZEhhbmRsZXIiLCJzY3JvbGxXaGVlbFpvb20iLFp0KSxBLm1lcmdlT3B0aW9ucyh7dGFwSG9sZDpiLnRvdWNoTmF0aXZlJiZiLnNhZmFyaSYmYi5tb2JpbGUsdGFwVG9sZXJhbmNlOjE1fSksbi5leHRlbmQoe2FkZEhvb2tzOmZ1bmN0aW9uKCl7Uyh0aGlzLl9tYXAuX2NvbnRhaW5lciwidG91Y2hzdGFydCIsdGhpcy5fb25Eb3duLHRoaXMpfSxyZW1vdmVIb29rczpmdW5jdGlvbigpe2sodGhpcy5fbWFwLl9jb250YWluZXIsInRvdWNoc3RhcnQiLHRoaXMuX29uRG93bix0aGlzKX0sX29uRG93bjpmdW5jdGlvbih0KXt2YXIgZTtjbGVhclRpbWVvdXQodGhpcy5faG9sZFRpbWVvdXQpLDE9PT10LnRvdWNoZXMubGVuZ3RoJiYoZT10LnRvdWNoZXNbMF0sdGhpcy5fc3RhcnRQb3M9dGhpcy5fbmV3UG9zPW5ldyBwKGUuY2xpZW50WCxlLmNsaWVudFkpLHRoaXMuX2hvbGRUaW1lb3V0PXNldFRpbWVvdXQoYShmdW5jdGlvbigpe3RoaXMuX2NhbmNlbCgpLHRoaXMuX2lzVGFwVmFsaWQoKSYmKFMoZG9jdW1lbnQsInRvdWNoZW5kIixPKSxTKGRvY3VtZW50LCJ0b3VjaGVuZCB0b3VjaGNhbmNlbCIsdGhpcy5fY2FuY2VsQ2xpY2tQcmV2ZW50KSx0aGlzLl9zaW11bGF0ZUV2ZW50KCJjb250ZXh0bWVudSIsZSkpfSx0aGlzKSw2MDApLFMoZG9jdW1lbnQsInRvdWNoZW5kIHRvdWNoY2FuY2VsIGNvbnRleHRtZW51Iix0aGlzLl9jYW5jZWwsdGhpcyksUyhkb2N1bWVudCwidG91Y2htb3ZlIix0aGlzLl9vbk1vdmUsdGhpcykpfSxfY2FuY2VsQ2xpY2tQcmV2ZW50OmZ1bmN0aW9uIHQoKXtrKGRvY3VtZW50LCJ0b3VjaGVuZCIsTyksayhkb2N1bWVudCwidG91Y2hlbmQgdG91Y2hjYW5jZWwiLHQpfSxfY2FuY2VsOmZ1bmN0aW9uKCl7Y2xlYXJUaW1lb3V0KHRoaXMuX2hvbGRUaW1lb3V0KSxrKGRvY3VtZW50LCJ0b3VjaGVuZCB0b3VjaGNhbmNlbCBjb250ZXh0bWVudSIsdGhpcy5fY2FuY2VsLHRoaXMpLGsoZG9jdW1lbnQsInRvdWNobW92ZSIsdGhpcy5fb25Nb3ZlLHRoaXMpfSxfb25Nb3ZlOmZ1bmN0aW9uKHQpe3Q9dC50b3VjaGVzWzBdLHRoaXMuX25ld1Bvcz1uZXcgcCh0LmNsaWVudFgsdC5jbGllbnRZKX0sX2lzVGFwVmFsaWQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbmV3UG9zLmRpc3RhbmNlVG8odGhpcy5fc3RhcnRQb3MpPD10aGlzLl9tYXAub3B0aW9ucy50YXBUb2xlcmFuY2V9LF9zaW11bGF0ZUV2ZW50OmZ1bmN0aW9uKHQsZSl7KHQ9bmV3IE1vdXNlRXZlbnQodCx7YnViYmxlczohMCxjYW5jZWxhYmxlOiEwLHZpZXc6d2luZG93LHNjcmVlblg6ZS5zY3JlZW5YLHNjcmVlblk6ZS5zY3JlZW5ZLGNsaWVudFg6ZS5jbGllbnRYLGNsaWVudFk6ZS5jbGllbnRZfSkpLl9zaW11bGF0ZWQ9ITAsZS50YXJnZXQuZGlzcGF0Y2hFdmVudCh0KX19KSksRXQ9KEEuYWRkSW5pdEhvb2soImFkZEhhbmRsZXIiLCJ0YXBIb2xkIixTdCksQS5tZXJnZU9wdGlvbnMoe3RvdWNoWm9vbTpiLnRvdWNoLGJvdW5jZUF0Wm9vbUxpbWl0czohMH0pLG4uZXh0ZW5kKHthZGRIb29rczpmdW5jdGlvbigpe00odGhpcy5fbWFwLl9jb250YWluZXIsImxlYWZsZXQtdG91Y2gtem9vbSIpLFModGhpcy5fbWFwLl9jb250YWluZXIsInRvdWNoc3RhcnQiLHRoaXMuX29uVG91Y2hTdGFydCx0aGlzKX0scmVtb3ZlSG9va3M6ZnVuY3Rpb24oKXt6KHRoaXMuX21hcC5fY29udGFpbmVyLCJsZWFmbGV0LXRvdWNoLXpvb20iKSxrKHRoaXMuX21hcC5fY29udGFpbmVyLCJ0b3VjaHN0YXJ0Iix0aGlzLl9vblRvdWNoU3RhcnQsdGhpcyl9LF9vblRvdWNoU3RhcnQ6ZnVuY3Rpb24odCl7dmFyIGUsaSxuPXRoaXMuX21hcDshdC50b3VjaGVzfHwyIT09dC50b3VjaGVzLmxlbmd0aHx8bi5fYW5pbWF0aW5nWm9vbXx8dGhpcy5fem9vbWluZ3x8KGU9bi5tb3VzZUV2ZW50VG9Db250YWluZXJQb2ludCh0LnRvdWNoZXNbMF0pLGk9bi5tb3VzZUV2ZW50VG9Db250YWluZXJQb2ludCh0LnRvdWNoZXNbMV0pLHRoaXMuX2NlbnRlclBvaW50PW4uZ2V0U2l6ZSgpLl9kaXZpZGVCeSgyKSx0aGlzLl9zdGFydExhdExuZz1uLmNvbnRhaW5lclBvaW50VG9MYXRMbmcodGhpcy5fY2VudGVyUG9pbnQpLCJjZW50ZXIiIT09bi5vcHRpb25zLnRvdWNoWm9vbSYmKHRoaXMuX3BpbmNoU3RhcnRMYXRMbmc9bi5jb250YWluZXJQb2ludFRvTGF0TG5nKGUuYWRkKGkpLl9kaXZpZGVCeSgyKSkpLHRoaXMuX3N0YXJ0RGlzdD1lLmRpc3RhbmNlVG8oaSksdGhpcy5fc3RhcnRab29tPW4uZ2V0Wm9vbSgpLHRoaXMuX21vdmVkPSExLHRoaXMuX3pvb21pbmc9ITAsbi5fc3RvcCgpLFMoZG9jdW1lbnQsInRvdWNobW92ZSIsdGhpcy5fb25Ub3VjaE1vdmUsdGhpcyksUyhkb2N1bWVudCwidG91Y2hlbmQgdG91Y2hjYW5jZWwiLHRoaXMuX29uVG91Y2hFbmQsdGhpcyksTyh0KSl9LF9vblRvdWNoTW92ZTpmdW5jdGlvbih0KXtpZih0LnRvdWNoZXMmJjI9PT10LnRvdWNoZXMubGVuZ3RoJiZ0aGlzLl96b29taW5nKXt2YXIgZT10aGlzLl9tYXAsaT1lLm1vdXNlRXZlbnRUb0NvbnRhaW5lclBvaW50KHQudG91Y2hlc1swXSksbj1lLm1vdXNlRXZlbnRUb0NvbnRhaW5lclBvaW50KHQudG91Y2hlc1sxXSksbz1pLmRpc3RhbmNlVG8obikvdGhpcy5fc3RhcnREaXN0O2lmKHRoaXMuX3pvb209ZS5nZXRTY2FsZVpvb20obyx0aGlzLl9zdGFydFpvb20pLCFlLm9wdGlvbnMuYm91bmNlQXRab29tTGltaXRzJiYodGhpcy5fem9vbTxlLmdldE1pblpvb20oKSYmbzwxfHx0aGlzLl96b29tPmUuZ2V0TWF4Wm9vbSgpJiYxPG8pJiYodGhpcy5fem9vbT1lLl9saW1pdFpvb20odGhpcy5fem9vbSkpLCJjZW50ZXIiPT09ZS5vcHRpb25zLnRvdWNoWm9vbSl7aWYodGhpcy5fY2VudGVyPXRoaXMuX3N0YXJ0TGF0TG5nLDE9PW8pcmV0dXJufWVsc2V7aWYoaT1pLl9hZGQobikuX2RpdmlkZUJ5KDIpLl9zdWJ0cmFjdCh0aGlzLl9jZW50ZXJQb2ludCksMT09byYmMD09PWkueCYmMD09PWkueSlyZXR1cm47dGhpcy5fY2VudGVyPWUudW5wcm9qZWN0KGUucHJvamVjdCh0aGlzLl9waW5jaFN0YXJ0TGF0TG5nLHRoaXMuX3pvb20pLnN1YnRyYWN0KGkpLHRoaXMuX3pvb20pfXRoaXMuX21vdmVkfHwoZS5fbW92ZVN0YXJ0KCEwLCExKSx0aGlzLl9tb3ZlZD0hMCkscih0aGlzLl9hbmltUmVxdWVzdCksbj1hKGUuX21vdmUsZSx0aGlzLl9jZW50ZXIsdGhpcy5fem9vbSx7cGluY2g6ITAscm91bmQ6ITF9LHZvaWQgMCksdGhpcy5fYW5pbVJlcXVlc3Q9eShuLHRoaXMsITApLE8odCl9fSxfb25Ub3VjaEVuZDpmdW5jdGlvbigpe3RoaXMuX21vdmVkJiZ0aGlzLl96b29taW5nPyh0aGlzLl96b29taW5nPSExLHIodGhpcy5fYW5pbVJlcXVlc3QpLGsoZG9jdW1lbnQsInRvdWNobW92ZSIsdGhpcy5fb25Ub3VjaE1vdmUsdGhpcyksayhkb2N1bWVudCwidG91Y2hlbmQgdG91Y2hjYW5jZWwiLHRoaXMuX29uVG91Y2hFbmQsdGhpcyksdGhpcy5fbWFwLm9wdGlvbnMuem9vbUFuaW1hdGlvbj90aGlzLl9tYXAuX2FuaW1hdGVab29tKHRoaXMuX2NlbnRlcix0aGlzLl9tYXAuX2xpbWl0Wm9vbSh0aGlzLl96b29tKSwhMCx0aGlzLl9tYXAub3B0aW9ucy56b29tU25hcCk6dGhpcy5fbWFwLl9yZXNldFZpZXcodGhpcy5fY2VudGVyLHRoaXMuX21hcC5fbGltaXRab29tKHRoaXMuX3pvb20pKSk6dGhpcy5fem9vbWluZz0hMX19KSksS2k9KEEuYWRkSW5pdEhvb2soImFkZEhhbmRsZXIiLCJ0b3VjaFpvb20iLEV0KSxBLkJveFpvb209X3QsQS5Eb3VibGVDbGlja1pvb209enQsQS5EcmFnPUdpLEEuS2V5Ym9hcmQ9Q3QsQS5TY3JvbGxXaGVlbFpvb209WnQsQS5UYXBIb2xkPVN0LEEuVG91Y2hab29tPUV0LHQuQm91bmRzPWYsdC5Ccm93c2VyPWIsdC5DUlM9b3QsdC5DYW52YXM9amksdC5DaXJjbGU9bWksdC5DaXJjbGVNYXJrZXI9cGksdC5DbGFzcz1ldCx0LkNvbnRyb2w9Qix0LkRpdkljb249QWksdC5EaXZPdmVybGF5PUVpLHQuRG9tRXZlbnQ9cHQsdC5Eb21VdGlsPU1lLHQuRHJhZ2dhYmxlPUdlLHQuRXZlbnRlZD1pdCx0LkZlYXR1cmVHcm91cD1oaSx0Lkdlb0pTT049dmksdC5HcmlkTGF5ZXI9QmksdC5IYW5kbGVyPW4sdC5JY29uPWxpLHQuSW1hZ2VPdmVybGF5PUNpLHQuTGF0TG5nPXYsdC5MYXRMbmdCb3VuZHM9cyx0LkxheWVyPW8sdC5MYXllckdyb3VwPWFpLHQuTGluZVV0aWw9Z3QsdC5NYXA9QSx0Lk1hcmtlcj1kaSx0Lk1peGluPW10LHQuUGF0aD1faSx0LlBvaW50PXAsdC5Qb2x5VXRpbD1mdCx0LlBvbHlnb249Z2ksdC5Qb2x5bGluZT1maSx0LlBvcHVwPWtpLHQuUG9zQW5pbWF0aW9uPWplLHQuUHJvamVjdGlvbj14dCx0LlJlY3RhbmdsZT1xaSx0LlJlbmRlcmVyPURpLHQuU1ZHPVVpLHQuU1ZHT3ZlcmxheT1TaSx0LlRpbGVMYXllcj1JaSx0LlRvb2x0aXA9T2ksdC5UcmFuc2Zvcm1hdGlvbj1hdCx0LlV0aWw9dHQsdC5WaWRlb092ZXJsYXk9WmksdC5iaW5kPWEsdC5ib3VuZHM9Yyx0LmNhbnZhcz1IaSx0LmNpcmNsZT1mdW5jdGlvbih0LGUsaSl7cmV0dXJuIG5ldyBtaSh0LGUsaSl9LHQuY2lyY2xlTWFya2VyPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG5ldyBwaSh0LGUpfSx0LmNvbnRyb2w9SGUsdC5kaXZJY29uPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgQWkodCl9LHQuZXh0ZW5kPWwsdC5mZWF0dXJlR3JvdXA9ZnVuY3Rpb24odCxlKXtyZXR1cm4gbmV3IGhpKHQsZSl9LHQuZ2VvSlNPTj16aSx0Lmdlb0pzb249VHQsdC5ncmlkTGF5ZXI9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBCaSh0KX0sdC5pY29uPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgbGkodCl9LHQuaW1hZ2VPdmVybGF5PWZ1bmN0aW9uKHQsZSxpKXtyZXR1cm4gbmV3IENpKHQsZSxpKX0sdC5sYXRMbmc9eCx0LmxhdExuZ0JvdW5kcz1nLHQubGF5ZXJHcm91cD1mdW5jdGlvbih0LGUpe3JldHVybiBuZXcgYWkodCxlKX0sdC5tYXA9ZnVuY3Rpb24odCxlKXtyZXR1cm4gbmV3IEEodCxlKX0sdC5tYXJrZXI9ZnVuY3Rpb24odCxlKXtyZXR1cm4gbmV3IGRpKHQsZSl9LHQucG9pbnQ9bSx0LnBvbHlnb249ZnVuY3Rpb24odCxlKXtyZXR1cm4gbmV3IGdpKHQsZSl9LHQucG9seWxpbmU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gbmV3IGZpKHQsZSl9LHQucG9wdXA9ZnVuY3Rpb24odCxlKXtyZXR1cm4gbmV3IGtpKHQsZSl9LHQucmVjdGFuZ2xlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG5ldyBxaSh0LGUpfSx0LnNldE9wdGlvbnM9aCx0LnN0YW1wPWQsdC5zdmc9VmksdC5zdmdPdmVybGF5PWZ1bmN0aW9uKHQsZSxpKXtyZXR1cm4gbmV3IFNpKHQsZSxpKX0sdC50aWxlTGF5ZXI9UmksdC50b29sdGlwPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG5ldyBPaSh0LGUpfSx0LnRyYW5zZm9ybWF0aW9uPWh0LHQudmVyc2lvbj0iMS45LjQiLHQudmlkZW9PdmVybGF5PWZ1bmN0aW9uKHQsZSxpKXtyZXR1cm4gbmV3IFppKHQsZSxpKX0sd2luZG93LkwpO3Qubm9Db25mbGljdD1mdW5jdGlvbigpe3JldHVybiB3aW5kb3cuTD1LaSx0aGlzfSx3aW5kb3cuTD10fSk7\")));var s=document.createElement(\"script\");s.text=c;document.head.appendChild(s);})();<\/script>\n<script id=\"mc-js\">(function(){var c=decodeURIComponent(escape(atob(\"IWZ1bmN0aW9uKGUsdCl7Im9iamVjdCI9PXR5cGVvZiBleHBvcnRzJiYidW5kZWZpbmVkIiE9dHlwZW9mIG1vZHVsZT90KGV4cG9ydHMpOiJmdW5jdGlvbiI9PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQ\/ZGVmaW5lKFsiZXhwb3J0cyJdLHQpOnQoKChlPWV8fHNlbGYpLkxlYWZsZXQ9ZS5MZWFmbGV0fHx7fSxlLkxlYWZsZXQubWFya2VyY2x1c3Rlcj17fSkpfSh0aGlzLGZ1bmN0aW9uKGUpeyJ1c2Ugc3RyaWN0Ijt2YXIgdD1MLk1hcmtlckNsdXN0ZXJHcm91cD1MLkZlYXR1cmVHcm91cC5leHRlbmQoe29wdGlvbnM6e21heENsdXN0ZXJSYWRpdXM6ODAsaWNvbkNyZWF0ZUZ1bmN0aW9uOm51bGwsY2x1c3RlclBhbmU6TC5NYXJrZXIucHJvdG90eXBlLm9wdGlvbnMucGFuZSxzcGlkZXJmeU9uRXZlcnlab29tOiExLHNwaWRlcmZ5T25NYXhab29tOiEwLHNob3dDb3ZlcmFnZU9uSG92ZXI6ITAsem9vbVRvQm91bmRzT25DbGljazohMCxzaW5nbGVNYXJrZXJNb2RlOiExLGRpc2FibGVDbHVzdGVyaW5nQXRab29tOm51bGwscmVtb3ZlT3V0c2lkZVZpc2libGVCb3VuZHM6ITAsYW5pbWF0ZTohMCxhbmltYXRlQWRkaW5nTWFya2VyczohMSxzcGlkZXJmeVNoYXBlUG9zaXRpb25zOm51bGwsc3BpZGVyZnlEaXN0YW5jZU11bHRpcGxpZXI6MSxzcGlkZXJMZWdQb2x5bGluZU9wdGlvbnM6e3dlaWdodDoxLjUsY29sb3I6IiMyMjIiLG9wYWNpdHk6LjV9LGNodW5rZWRMb2FkaW5nOiExLGNodW5rSW50ZXJ2YWw6MjAwLGNodW5rRGVsYXk6NTAsY2h1bmtQcm9ncmVzczpudWxsLHBvbHlnb25PcHRpb25zOnt9fSxpbml0aWFsaXplOmZ1bmN0aW9uKGUpe0wuVXRpbC5zZXRPcHRpb25zKHRoaXMsZSksdGhpcy5vcHRpb25zLmljb25DcmVhdGVGdW5jdGlvbnx8KHRoaXMub3B0aW9ucy5pY29uQ3JlYXRlRnVuY3Rpb249dGhpcy5fZGVmYXVsdEljb25DcmVhdGVGdW5jdGlvbiksdGhpcy5fZmVhdHVyZUdyb3VwPUwuZmVhdHVyZUdyb3VwKCksdGhpcy5fZmVhdHVyZUdyb3VwLmFkZEV2ZW50UGFyZW50KHRoaXMpLHRoaXMuX25vblBvaW50R3JvdXA9TC5mZWF0dXJlR3JvdXAoKSx0aGlzLl9ub25Qb2ludEdyb3VwLmFkZEV2ZW50UGFyZW50KHRoaXMpLHRoaXMuX2luWm9vbUFuaW1hdGlvbj0wLHRoaXMuX25lZWRzQ2x1c3RlcmluZz1bXSx0aGlzLl9uZWVkc1JlbW92aW5nPVtdLHRoaXMuX2N1cnJlbnRTaG93bkJvdW5kcz1udWxsLHRoaXMuX3F1ZXVlPVtdLHRoaXMuX2NoaWxkTWFya2VyRXZlbnRIYW5kbGVycz17ZHJhZ3N0YXJ0OnRoaXMuX2NoaWxkTWFya2VyRHJhZ1N0YXJ0LG1vdmU6dGhpcy5fY2hpbGRNYXJrZXJNb3ZlZCxkcmFnZW5kOnRoaXMuX2NoaWxkTWFya2VyRHJhZ0VuZH07ZT1MLkRvbVV0aWwuVFJBTlNJVElPTiYmdGhpcy5vcHRpb25zLmFuaW1hdGU7TC5leHRlbmQodGhpcyxlP3RoaXMuX3dpdGhBbmltYXRpb246dGhpcy5fbm9BbmltYXRpb24pLHRoaXMuX21hcmtlckNsdXN0ZXI9ZT9MLk1hcmtlckNsdXN0ZXI6TC5NYXJrZXJDbHVzdGVyTm9uQW5pbWF0ZWR9LGFkZExheWVyOmZ1bmN0aW9uKGUpe2lmKGUgaW5zdGFuY2VvZiBMLkxheWVyR3JvdXApcmV0dXJuIHRoaXMuYWRkTGF5ZXJzKFtlXSk7aWYoIWUuZ2V0TGF0TG5nKXJldHVybiB0aGlzLl9ub25Qb2ludEdyb3VwLmFkZExheWVyKGUpLHRoaXMuZmlyZSgibGF5ZXJhZGQiLHtsYXllcjplfSksdGhpcztpZighdGhpcy5fbWFwKXJldHVybiB0aGlzLl9uZWVkc0NsdXN0ZXJpbmcucHVzaChlKSx0aGlzLmZpcmUoImxheWVyYWRkIix7bGF5ZXI6ZX0pLHRoaXM7aWYodGhpcy5oYXNMYXllcihlKSlyZXR1cm4gdGhpczt0aGlzLl91bnNwaWRlcmZ5JiZ0aGlzLl91bnNwaWRlcmZ5KCksdGhpcy5fYWRkTGF5ZXIoZSx0aGlzLl9tYXhab29tKSx0aGlzLmZpcmUoImxheWVyYWRkIix7bGF5ZXI6ZX0pLHRoaXMuX3RvcENsdXN0ZXJMZXZlbC5fcmVjYWxjdWxhdGVCb3VuZHMoKSx0aGlzLl9yZWZyZXNoQ2x1c3RlcnNJY29ucygpO3ZhciB0PWUsaT10aGlzLl96b29tO2lmKGUuX19wYXJlbnQpZm9yKDt0Ll9fcGFyZW50Ll96b29tPj1pOyl0PXQuX19wYXJlbnQ7cmV0dXJuIHRoaXMuX2N1cnJlbnRTaG93bkJvdW5kcy5jb250YWlucyh0LmdldExhdExuZygpKSYmKHRoaXMub3B0aW9ucy5hbmltYXRlQWRkaW5nTWFya2Vycz90aGlzLl9hbmltYXRpb25BZGRMYXllcihlLHQpOnRoaXMuX2FuaW1hdGlvbkFkZExheWVyTm9uQW5pbWF0ZWQoZSx0KSksdGhpc30scmVtb3ZlTGF5ZXI6ZnVuY3Rpb24oZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiBMLkxheWVyR3JvdXA\/dGhpcy5yZW1vdmVMYXllcnMoW2VdKTooZS5nZXRMYXRMbmc\/dGhpcy5fbWFwP2UuX19wYXJlbnQmJih0aGlzLl91bnNwaWRlcmZ5JiYodGhpcy5fdW5zcGlkZXJmeSgpLHRoaXMuX3Vuc3BpZGVyZnlMYXllcihlKSksdGhpcy5fcmVtb3ZlTGF5ZXIoZSwhMCksdGhpcy5maXJlKCJsYXllcnJlbW92ZSIse2xheWVyOmV9KSx0aGlzLl90b3BDbHVzdGVyTGV2ZWwuX3JlY2FsY3VsYXRlQm91bmRzKCksdGhpcy5fcmVmcmVzaENsdXN0ZXJzSWNvbnMoKSxlLm9mZih0aGlzLl9jaGlsZE1hcmtlckV2ZW50SGFuZGxlcnMsdGhpcyksdGhpcy5fZmVhdHVyZUdyb3VwLmhhc0xheWVyKGUpJiYodGhpcy5fZmVhdHVyZUdyb3VwLnJlbW92ZUxheWVyKGUpLGUuY2x1c3RlclNob3cmJmUuY2x1c3RlclNob3coKSkpOighdGhpcy5fYXJyYXlTcGxpY2UodGhpcy5fbmVlZHNDbHVzdGVyaW5nLGUpJiZ0aGlzLmhhc0xheWVyKGUpJiZ0aGlzLl9uZWVkc1JlbW92aW5nLnB1c2goe2xheWVyOmUsbGF0bG5nOmUuX2xhdGxuZ30pLHRoaXMuZmlyZSgibGF5ZXJyZW1vdmUiLHtsYXllcjplfSkpOih0aGlzLl9ub25Qb2ludEdyb3VwLnJlbW92ZUxheWVyKGUpLHRoaXMuZmlyZSgibGF5ZXJyZW1vdmUiLHtsYXllcjplfSkpLHRoaXMpfSxhZGRMYXllcnM6ZnVuY3Rpb24oaSxyKXtpZighTC5VdGlsLmlzQXJyYXkoaSkpcmV0dXJuIHRoaXMuYWRkTGF5ZXIoaSk7dmFyIG4scz10aGlzLl9mZWF0dXJlR3JvdXAsbz10aGlzLl9ub25Qb2ludEdyb3VwLGE9dGhpcy5vcHRpb25zLmNodW5rZWRMb2FkaW5nLGg9dGhpcy5vcHRpb25zLmNodW5rSW50ZXJ2YWwsbD10aGlzLm9wdGlvbnMuY2h1bmtQcm9ncmVzcyx1PWkubGVuZ3RoLF89MCxkPSEwO2lmKHRoaXMuX21hcCl7dmFyIHA9KG5ldyBEYXRlKS5nZXRUaW1lKCksYz1MLmJpbmQoZnVuY3Rpb24oKXt2YXIgZT0obmV3IERhdGUpLmdldFRpbWUoKTtmb3IodGhpcy5fbWFwJiZ0aGlzLl91bnNwaWRlcmZ5JiZ0aGlzLl91bnNwaWRlcmZ5KCk7Xzx1O18rKyl7aWYoYSYmXyUyMDA9PTApe3ZhciB0PShuZXcgRGF0ZSkuZ2V0VGltZSgpLWU7aWYoaDx0KWJyZWFrfShuPWlbX10paW5zdGFuY2VvZiBMLkxheWVyR3JvdXA\/KGQmJihpPWkuc2xpY2UoKSxkPSExKSx0aGlzLl9leHRyYWN0Tm9uR3JvdXBMYXllcnMobixpKSx1PWkubGVuZ3RoKTpuLmdldExhdExuZz8hdGhpcy5oYXNMYXllcihuKSYmKHRoaXMuX2FkZExheWVyKG4sdGhpcy5fbWF4Wm9vbSkscnx8dGhpcy5maXJlKCJsYXllcmFkZCIse2xheWVyOm59KSxuLl9fcGFyZW50JiYyPT09bi5fX3BhcmVudC5nZXRDaGlsZENvdW50KCkpJiYodD0odD1uLl9fcGFyZW50LmdldEFsbENoaWxkTWFya2VycygpKVswXT09PW4\/dFsxXTp0WzBdLHMucmVtb3ZlTGF5ZXIodCkpOihvLmFkZExheWVyKG4pLHJ8fHRoaXMuZmlyZSgibGF5ZXJhZGQiLHtsYXllcjpufSkpfWwmJmwoXyx1LChuZXcgRGF0ZSkuZ2V0VGltZSgpLXApLF89PT11Pyh0aGlzLl90b3BDbHVzdGVyTGV2ZWwuX3JlY2FsY3VsYXRlQm91bmRzKCksdGhpcy5fcmVmcmVzaENsdXN0ZXJzSWNvbnMoKSx0aGlzLl90b3BDbHVzdGVyTGV2ZWwuX3JlY3Vyc2l2ZWx5QWRkQ2hpbGRyZW5Ub01hcChudWxsLHRoaXMuX3pvb20sdGhpcy5fY3VycmVudFNob3duQm91bmRzKSk6c2V0VGltZW91dChjLHRoaXMub3B0aW9ucy5jaHVua0RlbGF5KX0sdGhpcyk7YygpfWVsc2UgZm9yKHZhciBlPXRoaXMuX25lZWRzQ2x1c3RlcmluZztfPHU7XysrKShuPWlbX10paW5zdGFuY2VvZiBMLkxheWVyR3JvdXA\/KGQmJihpPWkuc2xpY2UoKSxkPSExKSx0aGlzLl9leHRyYWN0Tm9uR3JvdXBMYXllcnMobixpKSx1PWkubGVuZ3RoKTpuLmdldExhdExuZz90aGlzLmhhc0xheWVyKG4pfHxlLnB1c2gobik6by5hZGRMYXllcihuKTtyZXR1cm4gdGhpc30scmVtb3ZlTGF5ZXJzOmZ1bmN0aW9uKGUpe3ZhciB0LGk9ZS5sZW5ndGgscj10aGlzLl9mZWF0dXJlR3JvdXAsbj10aGlzLl9ub25Qb2ludEdyb3VwLHM9ITA7aWYoIXRoaXMuX21hcCl7Zm9yKGg9MDtoPGk7aCsrKSh0PWVbaF0paW5zdGFuY2VvZiBMLkxheWVyR3JvdXA\/KHMmJihlPWUuc2xpY2UoKSxzPSExKSx0aGlzLl9leHRyYWN0Tm9uR3JvdXBMYXllcnModCxlKSxpPWUubGVuZ3RoKToodGhpcy5fYXJyYXlTcGxpY2UodGhpcy5fbmVlZHNDbHVzdGVyaW5nLHQpLG4ucmVtb3ZlTGF5ZXIodCksdGhpcy5oYXNMYXllcih0KSYmdGhpcy5fbmVlZHNSZW1vdmluZy5wdXNoKHtsYXllcjp0LGxhdGxuZzp0Ll9sYXRsbmd9KSx0aGlzLmZpcmUoImxheWVycmVtb3ZlIix7bGF5ZXI6dH0pKTtyZXR1cm4gdGhpc31pZih0aGlzLl91bnNwaWRlcmZ5KXt0aGlzLl91bnNwaWRlcmZ5KCk7Zm9yKHZhciBvPWUuc2xpY2UoKSxhPWksaD0wO2g8YTtoKyspKHQ9b1toXSlpbnN0YW5jZW9mIEwuTGF5ZXJHcm91cD8odGhpcy5fZXh0cmFjdE5vbkdyb3VwTGF5ZXJzKHQsbyksYT1vLmxlbmd0aCk6dGhpcy5fdW5zcGlkZXJmeUxheWVyKHQpfWZvcihoPTA7aDxpO2grKykodD1lW2hdKWluc3RhbmNlb2YgTC5MYXllckdyb3VwPyhzJiYoZT1lLnNsaWNlKCkscz0hMSksdGhpcy5fZXh0cmFjdE5vbkdyb3VwTGF5ZXJzKHQsZSksaT1lLmxlbmd0aCk6dC5fX3BhcmVudD8odGhpcy5fcmVtb3ZlTGF5ZXIodCwhMCwhMCksdGhpcy5maXJlKCJsYXllcnJlbW92ZSIse2xheWVyOnR9KSxyLmhhc0xheWVyKHQpJiYoci5yZW1vdmVMYXllcih0KSx0LmNsdXN0ZXJTaG93JiZ0LmNsdXN0ZXJTaG93KCkpKToobi5yZW1vdmVMYXllcih0KSx0aGlzLmZpcmUoImxheWVycmVtb3ZlIix7bGF5ZXI6dH0pKTtyZXR1cm4gdGhpcy5fdG9wQ2x1c3RlckxldmVsLl9yZWNhbGN1bGF0ZUJvdW5kcygpLHRoaXMuX3JlZnJlc2hDbHVzdGVyc0ljb25zKCksdGhpcy5fdG9wQ2x1c3RlckxldmVsLl9yZWN1cnNpdmVseUFkZENoaWxkcmVuVG9NYXAobnVsbCx0aGlzLl96b29tLHRoaXMuX2N1cnJlbnRTaG93bkJvdW5kcyksdGhpc30sY2xlYXJMYXllcnM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbWFwfHwodGhpcy5fbmVlZHNDbHVzdGVyaW5nPVtdLHRoaXMuX25lZWRzUmVtb3Zpbmc9W10sZGVsZXRlIHRoaXMuX2dyaWRDbHVzdGVycyxkZWxldGUgdGhpcy5fZ3JpZFVuY2x1c3RlcmVkKSx0aGlzLl9ub2FuaW1hdGlvblVuc3BpZGVyZnkmJnRoaXMuX25vYW5pbWF0aW9uVW5zcGlkZXJmeSgpLHRoaXMuX2ZlYXR1cmVHcm91cC5jbGVhckxheWVycygpLHRoaXMuX25vblBvaW50R3JvdXAuY2xlYXJMYXllcnMoKSx0aGlzLmVhY2hMYXllcihmdW5jdGlvbihlKXtlLm9mZih0aGlzLl9jaGlsZE1hcmtlckV2ZW50SGFuZGxlcnMsdGhpcyksZGVsZXRlIGUuX19wYXJlbnR9LHRoaXMpLHRoaXMuX21hcCYmdGhpcy5fZ2VuZXJhdGVJbml0aWFsQ2x1c3RlcnMoKSx0aGlzfSxnZXRCb3VuZHM6ZnVuY3Rpb24oKXt2YXIgZT1uZXcgTC5MYXRMbmdCb3VuZHM7dGhpcy5fdG9wQ2x1c3RlckxldmVsJiZlLmV4dGVuZCh0aGlzLl90b3BDbHVzdGVyTGV2ZWwuX2JvdW5kcyk7Zm9yKHZhciB0PXRoaXMuX25lZWRzQ2x1c3RlcmluZy5sZW5ndGgtMTswPD10O3QtLSllLmV4dGVuZCh0aGlzLl9uZWVkc0NsdXN0ZXJpbmdbdF0uZ2V0TGF0TG5nKCkpO3JldHVybiBlLmV4dGVuZCh0aGlzLl9ub25Qb2ludEdyb3VwLmdldEJvdW5kcygpKSxlfSxlYWNoTGF5ZXI6ZnVuY3Rpb24oZSx0KXt2YXIgaSxyLG4scz10aGlzLl9uZWVkc0NsdXN0ZXJpbmcuc2xpY2UoKSxvPXRoaXMuX25lZWRzUmVtb3Zpbmc7Zm9yKHRoaXMuX3RvcENsdXN0ZXJMZXZlbCYmdGhpcy5fdG9wQ2x1c3RlckxldmVsLmdldEFsbENoaWxkTWFya2VycyhzKSxyPXMubGVuZ3RoLTE7MDw9cjtyLS0pe2ZvcihpPSEwLG49by5sZW5ndGgtMTswPD1uO24tLSlpZihvW25dLmxheWVyPT09c1tyXSl7aT0hMTticmVha31pJiZlLmNhbGwodCxzW3JdKX10aGlzLl9ub25Qb2ludEdyb3VwLmVhY2hMYXllcihlLHQpfSxnZXRMYXllcnM6ZnVuY3Rpb24oKXt2YXIgdD1bXTtyZXR1cm4gdGhpcy5lYWNoTGF5ZXIoZnVuY3Rpb24oZSl7dC5wdXNoKGUpfSksdH0sZ2V0TGF5ZXI6ZnVuY3Rpb24odCl7dmFyIGk9bnVsbDtyZXR1cm4gdD1wYXJzZUludCh0LDEwKSx0aGlzLmVhY2hMYXllcihmdW5jdGlvbihlKXtMLnN0YW1wKGUpPT09dCYmKGk9ZSl9KSxpfSxoYXNMYXllcjpmdW5jdGlvbihlKXtpZighZSlyZXR1cm4hMTtmb3IodmFyIHQ9dGhpcy5fbmVlZHNDbHVzdGVyaW5nLGk9dC5sZW5ndGgtMTswPD1pO2ktLSlpZih0W2ldPT09ZSlyZXR1cm4hMDtmb3IoaT0odD10aGlzLl9uZWVkc1JlbW92aW5nKS5sZW5ndGgtMTswPD1pO2ktLSlpZih0W2ldLmxheWVyPT09ZSlyZXR1cm4hMTtyZXR1cm4hKCFlLl9fcGFyZW50fHxlLl9fcGFyZW50Ll9ncm91cCE9PXRoaXMpfHx0aGlzLl9ub25Qb2ludEdyb3VwLmhhc0xheWVyKGUpfSx6b29tVG9TaG93TGF5ZXI6ZnVuY3Rpb24oZSx0KXt2YXIgaT10aGlzLl9tYXA7ImZ1bmN0aW9uIiE9dHlwZW9mIHQmJih0PWZ1bmN0aW9uKCl7fSk7dmFyIHI9ZnVuY3Rpb24oKXshaS5oYXNMYXllcihlKSYmIWkuaGFzTGF5ZXIoZS5fX3BhcmVudCl8fHRoaXMuX2luWm9vbUFuaW1hdGlvbnx8KHRoaXMuX21hcC5vZmYoIm1vdmVlbmQiLHIsdGhpcyksdGhpcy5vZmYoImFuaW1hdGlvbmVuZCIscix0aGlzKSxpLmhhc0xheWVyKGUpP3QoKTplLl9fcGFyZW50Ll9pY29uJiYodGhpcy5vbmNlKCJzcGlkZXJmaWVkIix0LHRoaXMpLGUuX19wYXJlbnQuc3BpZGVyZnkoKSkpfTtlLl9pY29uJiZ0aGlzLl9tYXAuZ2V0Qm91bmRzKCkuY29udGFpbnMoZS5nZXRMYXRMbmcoKSk\/dCgpOmUuX19wYXJlbnQuX3pvb208TWF0aC5yb3VuZCh0aGlzLl9tYXAuX3pvb20pPyh0aGlzLl9tYXAub24oIm1vdmVlbmQiLHIsdGhpcyksdGhpcy5fbWFwLnBhblRvKGUuZ2V0TGF0TG5nKCkpKToodGhpcy5fbWFwLm9uKCJtb3ZlZW5kIixyLHRoaXMpLHRoaXMub24oImFuaW1hdGlvbmVuZCIscix0aGlzKSxlLl9fcGFyZW50Lnpvb21Ub0JvdW5kcygpKX0sb25BZGQ6ZnVuY3Rpb24oZSl7dmFyIHQsaSxyO2lmKHRoaXMuX21hcD1lLCFpc0Zpbml0ZSh0aGlzLl9tYXAuZ2V0TWF4Wm9vbSgpKSl0aHJvdyJNYXAgaGFzIG5vIG1heFpvb20gc3BlY2lmaWVkIjtmb3IodGhpcy5fZmVhdHVyZUdyb3VwLmFkZFRvKGUpLHRoaXMuX25vblBvaW50R3JvdXAuYWRkVG8oZSksdGhpcy5fZ3JpZENsdXN0ZXJzfHx0aGlzLl9nZW5lcmF0ZUluaXRpYWxDbHVzdGVycygpLHRoaXMuX21heExhdD1lLm9wdGlvbnMuY3JzLnByb2plY3Rpb24uTUFYX0xBVElUVURFLHQ9MCxpPXRoaXMuX25lZWRzUmVtb3ZpbmcubGVuZ3RoO3Q8aTt0KyspKHI9dGhpcy5fbmVlZHNSZW1vdmluZ1t0XSkubmV3bGF0bG5nPXIubGF5ZXIuX2xhdGxuZyxyLmxheWVyLl9sYXRsbmc9ci5sYXRsbmc7Zm9yKHQ9MCxpPXRoaXMuX25lZWRzUmVtb3ZpbmcubGVuZ3RoO3Q8aTt0Kyspcj10aGlzLl9uZWVkc1JlbW92aW5nW3RdLHRoaXMuX3JlbW92ZUxheWVyKHIubGF5ZXIsITApLHIubGF5ZXIuX2xhdGxuZz1yLm5ld2xhdGxuZzt0aGlzLl9uZWVkc1JlbW92aW5nPVtdLHRoaXMuX3pvb209TWF0aC5yb3VuZCh0aGlzLl9tYXAuX3pvb20pLHRoaXMuX2N1cnJlbnRTaG93bkJvdW5kcz10aGlzLl9nZXRFeHBhbmRlZFZpc2libGVCb3VuZHMoKSx0aGlzLl9tYXAub24oInpvb21lbmQiLHRoaXMuX3pvb21FbmQsdGhpcyksdGhpcy5fbWFwLm9uKCJtb3ZlZW5kIix0aGlzLl9tb3ZlRW5kLHRoaXMpLHRoaXMuX3NwaWRlcmZpZXJPbkFkZCYmdGhpcy5fc3BpZGVyZmllck9uQWRkKCksdGhpcy5fYmluZEV2ZW50cygpLGk9dGhpcy5fbmVlZHNDbHVzdGVyaW5nLHRoaXMuX25lZWRzQ2x1c3RlcmluZz1bXSx0aGlzLmFkZExheWVycyhpLCEwKX0sb25SZW1vdmU6ZnVuY3Rpb24oZSl7ZS5vZmYoInpvb21lbmQiLHRoaXMuX3pvb21FbmQsdGhpcyksZS5vZmYoIm1vdmVlbmQiLHRoaXMuX21vdmVFbmQsdGhpcyksdGhpcy5fdW5iaW5kRXZlbnRzKCksdGhpcy5fbWFwLl9tYXBQYW5lLmNsYXNzTmFtZT10aGlzLl9tYXAuX21hcFBhbmUuY2xhc3NOYW1lLnJlcGxhY2UoIiBsZWFmbGV0LWNsdXN0ZXItYW5pbSIsIiIpLHRoaXMuX3NwaWRlcmZpZXJPblJlbW92ZSYmdGhpcy5fc3BpZGVyZmllck9uUmVtb3ZlKCksZGVsZXRlIHRoaXMuX21heExhdCx0aGlzLl9oaWRlQ292ZXJhZ2UoKSx0aGlzLl9mZWF0dXJlR3JvdXAucmVtb3ZlKCksdGhpcy5fbm9uUG9pbnRHcm91cC5yZW1vdmUoKSx0aGlzLl9mZWF0dXJlR3JvdXAuY2xlYXJMYXllcnMoKSx0aGlzLl9tYXA9bnVsbH0sZ2V0VmlzaWJsZVBhcmVudDpmdW5jdGlvbihlKXtmb3IodmFyIHQ9ZTt0JiYhdC5faWNvbjspdD10Ll9fcGFyZW50O3JldHVybiB0fHxudWxsfSxfYXJyYXlTcGxpY2U6ZnVuY3Rpb24oZSx0KXtmb3IodmFyIGk9ZS5sZW5ndGgtMTswPD1pO2ktLSlpZihlW2ldPT09dClyZXR1cm4gZS5zcGxpY2UoaSwxKSwhMH0sX3JlbW92ZUZyb21HcmlkVW5jbHVzdGVyZWQ6ZnVuY3Rpb24oZSx0KXtmb3IodmFyIGk9dGhpcy5fbWFwLHI9dGhpcy5fZ3JpZFVuY2x1c3RlcmVkLG49TWF0aC5mbG9vcih0aGlzLl9tYXAuZ2V0TWluWm9vbSgpKTtuPD10JiZyW3RdLnJlbW92ZU9iamVjdChlLGkucHJvamVjdChlLmdldExhdExuZygpLHQpKTt0LS0pO30sX2NoaWxkTWFya2VyRHJhZ1N0YXJ0OmZ1bmN0aW9uKGUpe2UudGFyZ2V0Ll9fZHJhZ1N0YXJ0PWUudGFyZ2V0Ll9sYXRsbmd9LF9jaGlsZE1hcmtlck1vdmVkOmZ1bmN0aW9uKGUpe3ZhciB0O3RoaXMuX2lnbm9yZU1vdmV8fGUudGFyZ2V0Ll9fZHJhZ1N0YXJ0fHwodD1lLnRhcmdldC5fcG9wdXAmJmUudGFyZ2V0Ll9wb3B1cC5pc09wZW4oKSx0aGlzLl9tb3ZlQ2hpbGQoZS50YXJnZXQsZS5vbGRMYXRMbmcsZS5sYXRsbmcpLHQmJmUudGFyZ2V0Lm9wZW5Qb3B1cCgpKX0sX21vdmVDaGlsZDpmdW5jdGlvbihlLHQsaSl7ZS5fbGF0bG5nPXQsdGhpcy5yZW1vdmVMYXllcihlKSxlLl9sYXRsbmc9aSx0aGlzLmFkZExheWVyKGUpfSxfY2hpbGRNYXJrZXJEcmFnRW5kOmZ1bmN0aW9uKGUpe3ZhciB0PWUudGFyZ2V0Ll9fZHJhZ1N0YXJ0O2RlbGV0ZSBlLnRhcmdldC5fX2RyYWdTdGFydCx0JiZ0aGlzLl9tb3ZlQ2hpbGQoZS50YXJnZXQsdCxlLnRhcmdldC5fbGF0bG5nKX0sX3JlbW92ZUxheWVyOmZ1bmN0aW9uKGUsdCxpKXt2YXIgcj10aGlzLl9ncmlkQ2x1c3RlcnMsbj10aGlzLl9ncmlkVW5jbHVzdGVyZWQscz10aGlzLl9mZWF0dXJlR3JvdXAsbz10aGlzLl9tYXAsYT1NYXRoLmZsb29yKHRoaXMuX21hcC5nZXRNaW5ab29tKCkpO3QmJnRoaXMuX3JlbW92ZUZyb21HcmlkVW5jbHVzdGVyZWQoZSx0aGlzLl9tYXhab29tKTt2YXIgaCxsPWUuX19wYXJlbnQsdT1sLl9tYXJrZXJzO2Zvcih0aGlzLl9hcnJheVNwbGljZSh1LGUpO2wmJihsLl9jaGlsZENvdW50LS0sbC5fYm91bmRzTmVlZFVwZGF0ZT0hMCwhKGwuX3pvb208YSkpOyl0JiZsLl9jaGlsZENvdW50PD0xPyhoPWwuX21hcmtlcnNbMF09PT1lP2wuX21hcmtlcnNbMV06bC5fbWFya2Vyc1swXSxyW2wuX3pvb21dLnJlbW92ZU9iamVjdChsLG8ucHJvamVjdChsLl9jTGF0TG5nLGwuX3pvb20pKSxuW2wuX3pvb21dLmFkZE9iamVjdChoLG8ucHJvamVjdChoLmdldExhdExuZygpLGwuX3pvb20pKSx0aGlzLl9hcnJheVNwbGljZShsLl9fcGFyZW50Ll9jaGlsZENsdXN0ZXJzLGwpLGwuX19wYXJlbnQuX21hcmtlcnMucHVzaChoKSxoLl9fcGFyZW50PWwuX19wYXJlbnQsbC5faWNvbiYmKHMucmVtb3ZlTGF5ZXIobCksaXx8cy5hZGRMYXllcihoKSkpOmwuX2ljb25OZWVkc1VwZGF0ZT0hMCxsPWwuX19wYXJlbnQ7ZGVsZXRlIGUuX19wYXJlbnR9LF9pc09ySXNQYXJlbnQ6ZnVuY3Rpb24oZSx0KXtmb3IoO3Q7KXtpZihlPT09dClyZXR1cm4hMDt0PXQucGFyZW50Tm9kZX1yZXR1cm4hMX0sZmlyZTpmdW5jdGlvbihlLHQsaSl7aWYodCYmdC5sYXllciBpbnN0YW5jZW9mIEwuTWFya2VyQ2x1c3Rlcil7aWYodC5vcmlnaW5hbEV2ZW50JiZ0aGlzLl9pc09ySXNQYXJlbnQodC5sYXllci5faWNvbix0Lm9yaWdpbmFsRXZlbnQucmVsYXRlZFRhcmdldCkpcmV0dXJuO2U9ImNsdXN0ZXIiK2V9TC5GZWF0dXJlR3JvdXAucHJvdG90eXBlLmZpcmUuY2FsbCh0aGlzLGUsdCxpKX0sbGlzdGVuczpmdW5jdGlvbihlLHQpe3JldHVybiBMLkZlYXR1cmVHcm91cC5wcm90b3R5cGUubGlzdGVucy5jYWxsKHRoaXMsZSx0KXx8TC5GZWF0dXJlR3JvdXAucHJvdG90eXBlLmxpc3RlbnMuY2FsbCh0aGlzLCJjbHVzdGVyIitlLHQpfSxfZGVmYXVsdEljb25DcmVhdGVGdW5jdGlvbjpmdW5jdGlvbihlKXt2YXIgdD1lLmdldENoaWxkQ291bnQoKSxlPSIgbWFya2VyLWNsdXN0ZXItIjtyZXR1cm4gZSs9dDwxMD8ic21hbGwiOnQ8MTAwPyJtZWRpdW0iOiJsYXJnZSIsbmV3IEwuRGl2SWNvbih7aHRtbDoiPGRpdj48c3Bhbj4iK3QrIjwvc3Bhbj48L2Rpdj4iLGNsYXNzTmFtZToibWFya2VyLWNsdXN0ZXIiK2UsaWNvblNpemU6bmV3IEwuUG9pbnQoNDAsNDApfSl9LF9iaW5kRXZlbnRzOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5fbWFwLHQ9dGhpcy5vcHRpb25zLnNwaWRlcmZ5T25NYXhab29tLGk9dGhpcy5vcHRpb25zLnNob3dDb3ZlcmFnZU9uSG92ZXIscj10aGlzLm9wdGlvbnMuem9vbVRvQm91bmRzT25DbGljayxuPXRoaXMub3B0aW9ucy5zcGlkZXJmeU9uRXZlcnlab29tOyh0fHxyfHxuKSYmdGhpcy5vbigiY2x1c3RlcmNsaWNrIGNsdXN0ZXJrZXlwcmVzcyIsdGhpcy5fem9vbU9yU3BpZGVyZnksdGhpcyksaSYmKHRoaXMub24oImNsdXN0ZXJtb3VzZW92ZXIiLHRoaXMuX3Nob3dDb3ZlcmFnZSx0aGlzKSx0aGlzLm9uKCJjbHVzdGVybW91c2VvdXQiLHRoaXMuX2hpZGVDb3ZlcmFnZSx0aGlzKSxlLm9uKCJ6b29tZW5kIix0aGlzLl9oaWRlQ292ZXJhZ2UsdGhpcykpfSxfem9vbU9yU3BpZGVyZnk6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5sYXllcixpPXQ7aWYoImNsdXN0ZXJrZXlwcmVzcyIhPT1lLnR5cGV8fCFlLm9yaWdpbmFsRXZlbnR8fDEzPT09ZS5vcmlnaW5hbEV2ZW50LmtleUNvZGUpe2Zvcig7MT09PWkuX2NoaWxkQ2x1c3RlcnMubGVuZ3RoOylpPWkuX2NoaWxkQ2x1c3RlcnNbMF07aS5fem9vbT09PXRoaXMuX21heFpvb20mJmkuX2NoaWxkQ291bnQ9PT10Ll9jaGlsZENvdW50JiZ0aGlzLm9wdGlvbnMuc3BpZGVyZnlPbk1heFpvb20\/dC5zcGlkZXJmeSgpOnRoaXMub3B0aW9ucy56b29tVG9Cb3VuZHNPbkNsaWNrJiZ0Lnpvb21Ub0JvdW5kcygpLHRoaXMub3B0aW9ucy5zcGlkZXJmeU9uRXZlcnlab29tJiZ0LnNwaWRlcmZ5KCksZS5vcmlnaW5hbEV2ZW50JiYxMz09PWUub3JpZ2luYWxFdmVudC5rZXlDb2RlJiZ0aGlzLl9tYXAuX2NvbnRhaW5lci5mb2N1cygpfX0sX3Nob3dDb3ZlcmFnZTpmdW5jdGlvbihlKXt2YXIgdD10aGlzLl9tYXA7dGhpcy5faW5ab29tQW5pbWF0aW9ufHwodGhpcy5fc2hvd25Qb2x5Z29uJiZ0LnJlbW92ZUxheWVyKHRoaXMuX3Nob3duUG9seWdvbiksMjxlLmxheWVyLmdldENoaWxkQ291bnQoKSYmZS5sYXllciE9PXRoaXMuX3NwaWRlcmZpZWQmJih0aGlzLl9zaG93blBvbHlnb249bmV3IEwuUG9seWdvbihlLmxheWVyLmdldENvbnZleEh1bGwoKSx0aGlzLm9wdGlvbnMucG9seWdvbk9wdGlvbnMpLHQuYWRkTGF5ZXIodGhpcy5fc2hvd25Qb2x5Z29uKSkpfSxfaGlkZUNvdmVyYWdlOmZ1bmN0aW9uKCl7dGhpcy5fc2hvd25Qb2x5Z29uJiYodGhpcy5fbWFwLnJlbW92ZUxheWVyKHRoaXMuX3Nob3duUG9seWdvbiksdGhpcy5fc2hvd25Qb2x5Z29uPW51bGwpfSxfdW5iaW5kRXZlbnRzOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5vcHRpb25zLnNwaWRlcmZ5T25NYXhab29tLHQ9dGhpcy5vcHRpb25zLnNob3dDb3ZlcmFnZU9uSG92ZXIsaT10aGlzLm9wdGlvbnMuem9vbVRvQm91bmRzT25DbGljayxyPXRoaXMub3B0aW9ucy5zcGlkZXJmeU9uRXZlcnlab29tLG49dGhpcy5fbWFwOyhlfHxpfHxyKSYmdGhpcy5vZmYoImNsdXN0ZXJjbGljayBjbHVzdGVya2V5cHJlc3MiLHRoaXMuX3pvb21PclNwaWRlcmZ5LHRoaXMpLHQmJih0aGlzLm9mZigiY2x1c3Rlcm1vdXNlb3ZlciIsdGhpcy5fc2hvd0NvdmVyYWdlLHRoaXMpLHRoaXMub2ZmKCJjbHVzdGVybW91c2VvdXQiLHRoaXMuX2hpZGVDb3ZlcmFnZSx0aGlzKSxuLm9mZigiem9vbWVuZCIsdGhpcy5faGlkZUNvdmVyYWdlLHRoaXMpKX0sX3pvb21FbmQ6ZnVuY3Rpb24oKXt0aGlzLl9tYXAmJih0aGlzLl9tZXJnZVNwbGl0Q2x1c3RlcnMoKSx0aGlzLl96b29tPU1hdGgucm91bmQodGhpcy5fbWFwLl96b29tKSx0aGlzLl9jdXJyZW50U2hvd25Cb3VuZHM9dGhpcy5fZ2V0RXhwYW5kZWRWaXNpYmxlQm91bmRzKCkpfSxfbW92ZUVuZDpmdW5jdGlvbigpe3ZhciBlO3RoaXMuX2luWm9vbUFuaW1hdGlvbnx8KGU9dGhpcy5fZ2V0RXhwYW5kZWRWaXNpYmxlQm91bmRzKCksdGhpcy5fdG9wQ2x1c3RlckxldmVsLl9yZWN1cnNpdmVseVJlbW92ZUNoaWxkcmVuRnJvbU1hcCh0aGlzLl9jdXJyZW50U2hvd25Cb3VuZHMsTWF0aC5mbG9vcih0aGlzLl9tYXAuZ2V0TWluWm9vbSgpKSx0aGlzLl96b29tLGUpLHRoaXMuX3RvcENsdXN0ZXJMZXZlbC5fcmVjdXJzaXZlbHlBZGRDaGlsZHJlblRvTWFwKG51bGwsTWF0aC5yb3VuZCh0aGlzLl9tYXAuX3pvb20pLGUpLHRoaXMuX2N1cnJlbnRTaG93bkJvdW5kcz1lKX0sX2dlbmVyYXRlSW5pdGlhbENsdXN0ZXJzOmZ1bmN0aW9uKCl7dmFyIGU9TWF0aC5jZWlsKHRoaXMuX21hcC5nZXRNYXhab29tKCkpLHQ9TWF0aC5mbG9vcih0aGlzLl9tYXAuZ2V0TWluWm9vbSgpKSxpPXRoaXMub3B0aW9ucy5tYXhDbHVzdGVyUmFkaXVzLHI9ImZ1bmN0aW9uIiE9dHlwZW9mIGk\/ZnVuY3Rpb24oKXtyZXR1cm4gaX06aTtudWxsIT09dGhpcy5vcHRpb25zLmRpc2FibGVDbHVzdGVyaW5nQXRab29tJiYoZT10aGlzLm9wdGlvbnMuZGlzYWJsZUNsdXN0ZXJpbmdBdFpvb20tMSksdGhpcy5fbWF4Wm9vbT1lLHRoaXMuX2dyaWRDbHVzdGVycz17fSx0aGlzLl9ncmlkVW5jbHVzdGVyZWQ9e307Zm9yKHZhciBuPWU7dDw9bjtuLS0pdGhpcy5fZ3JpZENsdXN0ZXJzW25dPW5ldyBMLkRpc3RhbmNlR3JpZChyKG4pKSx0aGlzLl9ncmlkVW5jbHVzdGVyZWRbbl09bmV3IEwuRGlzdGFuY2VHcmlkKHIobikpO3RoaXMuX3RvcENsdXN0ZXJMZXZlbD1uZXcgdGhpcy5fbWFya2VyQ2x1c3Rlcih0aGlzLHQtMSl9LF9hZGRMYXllcjpmdW5jdGlvbihlLHQpe3ZhciBpPXRoaXMuX2dyaWRDbHVzdGVycyxyPXRoaXMuX2dyaWRVbmNsdXN0ZXJlZCxuPU1hdGguZmxvb3IodGhpcy5fbWFwLmdldE1pblpvb20oKSk7Zm9yKHRoaXMub3B0aW9ucy5zaW5nbGVNYXJrZXJNb2RlJiZ0aGlzLl9vdmVycmlkZU1hcmtlckljb24oZSksZS5vbih0aGlzLl9jaGlsZE1hcmtlckV2ZW50SGFuZGxlcnMsdGhpcyk7bjw9dDt0LS0pe3ZhciBzPXRoaXMuX21hcC5wcm9qZWN0KGUuZ2V0TGF0TG5nKCksdCksbz1pW3RdLmdldE5lYXJPYmplY3Qocyk7aWYobylyZXR1cm4gby5fYWRkQ2hpbGQoZSksdm9pZChlLl9fcGFyZW50PW8pO2lmKG89clt0XS5nZXROZWFyT2JqZWN0KHMpKXt2YXIgYT1vLl9fcGFyZW50O2EmJnRoaXMuX3JlbW92ZUxheWVyKG8sITEpO3ZhciBoPW5ldyB0aGlzLl9tYXJrZXJDbHVzdGVyKHRoaXMsdCxvLGUpO2lbdF0uYWRkT2JqZWN0KGgsdGhpcy5fbWFwLnByb2plY3QoaC5fY0xhdExuZyx0KSksby5fX3BhcmVudD1oO2Zvcih2YXIgbD1lLl9fcGFyZW50PWgsdT10LTE7dT5hLl96b29tO3UtLSlsPW5ldyB0aGlzLl9tYXJrZXJDbHVzdGVyKHRoaXMsdSxsKSxpW3VdLmFkZE9iamVjdChsLHRoaXMuX21hcC5wcm9qZWN0KG8uZ2V0TGF0TG5nKCksdSkpO3JldHVybiBhLl9hZGRDaGlsZChsKSx2b2lkIHRoaXMuX3JlbW92ZUZyb21HcmlkVW5jbHVzdGVyZWQobyx0KX1yW3RdLmFkZE9iamVjdChlLHMpfXRoaXMuX3RvcENsdXN0ZXJMZXZlbC5fYWRkQ2hpbGQoZSksZS5fX3BhcmVudD10aGlzLl90b3BDbHVzdGVyTGV2ZWx9LF9yZWZyZXNoQ2x1c3RlcnNJY29uczpmdW5jdGlvbigpe3RoaXMuX2ZlYXR1cmVHcm91cC5lYWNoTGF5ZXIoZnVuY3Rpb24oZSl7ZSBpbnN0YW5jZW9mIEwuTWFya2VyQ2x1c3RlciYmZS5faWNvbk5lZWRzVXBkYXRlJiZlLl91cGRhdGVJY29uKCl9KX0sX2VucXVldWU6ZnVuY3Rpb24oZSl7dGhpcy5fcXVldWUucHVzaChlKSx0aGlzLl9xdWV1ZVRpbWVvdXR8fCh0aGlzLl9xdWV1ZVRpbWVvdXQ9c2V0VGltZW91dChMLmJpbmQodGhpcy5fcHJvY2Vzc1F1ZXVlLHRoaXMpLDMwMCkpfSxfcHJvY2Vzc1F1ZXVlOmZ1bmN0aW9uKCl7Zm9yKHZhciBlPTA7ZTx0aGlzLl9xdWV1ZS5sZW5ndGg7ZSsrKXRoaXMuX3F1ZXVlW2VdLmNhbGwodGhpcyk7dGhpcy5fcXVldWUubGVuZ3RoPTAsY2xlYXJUaW1lb3V0KHRoaXMuX3F1ZXVlVGltZW91dCksdGhpcy5fcXVldWVUaW1lb3V0PW51bGx9LF9tZXJnZVNwbGl0Q2x1c3RlcnM6ZnVuY3Rpb24oKXt2YXIgZT1NYXRoLnJvdW5kKHRoaXMuX21hcC5fem9vbSk7dGhpcy5fcHJvY2Vzc1F1ZXVlKCksdGhpcy5fem9vbTxlJiZ0aGlzLl9jdXJyZW50U2hvd25Cb3VuZHMuaW50ZXJzZWN0cyh0aGlzLl9nZXRFeHBhbmRlZFZpc2libGVCb3VuZHMoKSk\/KHRoaXMuX2FuaW1hdGlvblN0YXJ0KCksdGhpcy5fdG9wQ2x1c3RlckxldmVsLl9yZWN1cnNpdmVseVJlbW92ZUNoaWxkcmVuRnJvbU1hcCh0aGlzLl9jdXJyZW50U2hvd25Cb3VuZHMsTWF0aC5mbG9vcih0aGlzLl9tYXAuZ2V0TWluWm9vbSgpKSx0aGlzLl96b29tLHRoaXMuX2dldEV4cGFuZGVkVmlzaWJsZUJvdW5kcygpKSx0aGlzLl9hbmltYXRpb25ab29tSW4odGhpcy5fem9vbSxlKSk6dGhpcy5fem9vbT5lPyh0aGlzLl9hbmltYXRpb25TdGFydCgpLHRoaXMuX2FuaW1hdGlvblpvb21PdXQodGhpcy5fem9vbSxlKSk6dGhpcy5fbW92ZUVuZCgpfSxfZ2V0RXhwYW5kZWRWaXNpYmxlQm91bmRzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub3B0aW9ucy5yZW1vdmVPdXRzaWRlVmlzaWJsZUJvdW5kcz9MLkJyb3dzZXIubW9iaWxlP3RoaXMuX2NoZWNrQm91bmRzTWF4TGF0KHRoaXMuX21hcC5nZXRCb3VuZHMoKSk6dGhpcy5fY2hlY2tCb3VuZHNNYXhMYXQodGhpcy5fbWFwLmdldEJvdW5kcygpLnBhZCgxKSk6dGhpcy5fbWFwQm91bmRzSW5maW5pdGV9LF9jaGVja0JvdW5kc01heExhdDpmdW5jdGlvbihlKXt2YXIgdD10aGlzLl9tYXhMYXQ7cmV0dXJuIHZvaWQgMCE9PXQmJihlLmdldE5vcnRoKCk+PXQmJihlLl9ub3J0aEVhc3QubGF0PTEvMCksZS5nZXRTb3V0aCgpPD0tdCYmKGUuX3NvdXRoV2VzdC5sYXQ9LTEvMCkpLGV9LF9hbmltYXRpb25BZGRMYXllck5vbkFuaW1hdGVkOmZ1bmN0aW9uKGUsdCl7dD09PWU\/dGhpcy5fZmVhdHVyZUdyb3VwLmFkZExheWVyKGUpOjI9PT10Ll9jaGlsZENvdW50Pyh0Ll9hZGRUb01hcCgpLGU9dC5nZXRBbGxDaGlsZE1hcmtlcnMoKSx0aGlzLl9mZWF0dXJlR3JvdXAucmVtb3ZlTGF5ZXIoZVswXSksdGhpcy5fZmVhdHVyZUdyb3VwLnJlbW92ZUxheWVyKGVbMV0pKTp0Ll91cGRhdGVJY29uKCl9LF9leHRyYWN0Tm9uR3JvdXBMYXllcnM6ZnVuY3Rpb24oZSx0KXt2YXIgaSxyPWUuZ2V0TGF5ZXJzKCksbj0wO2Zvcih0PXR8fFtdO248ci5sZW5ndGg7bisrKShpPXJbbl0paW5zdGFuY2VvZiBMLkxheWVyR3JvdXA\/dGhpcy5fZXh0cmFjdE5vbkdyb3VwTGF5ZXJzKGksdCk6dC5wdXNoKGkpO3JldHVybiB0fSxfb3ZlcnJpZGVNYXJrZXJJY29uOmZ1bmN0aW9uKGUpe3JldHVybiBlLm9wdGlvbnMuaWNvbj10aGlzLm9wdGlvbnMuaWNvbkNyZWF0ZUZ1bmN0aW9uKHtnZXRDaGlsZENvdW50OmZ1bmN0aW9uKCl7cmV0dXJuIDF9LGdldEFsbENoaWxkTWFya2VyczpmdW5jdGlvbigpe3JldHVybltlXX19KX19KTtMLk1hcmtlckNsdXN0ZXJHcm91cC5pbmNsdWRlKHtfbWFwQm91bmRzSW5maW5pdGU6bmV3IEwuTGF0TG5nQm91bmRzKG5ldyBMLkxhdExuZygtMS8wLC0xLzApLG5ldyBMLkxhdExuZygxLzAsMS8wKSl9KSxMLk1hcmtlckNsdXN0ZXJHcm91cC5pbmNsdWRlKHtfbm9BbmltYXRpb246e19hbmltYXRpb25TdGFydDpmdW5jdGlvbigpe30sX2FuaW1hdGlvblpvb21JbjpmdW5jdGlvbihlLHQpe3RoaXMuX3RvcENsdXN0ZXJMZXZlbC5fcmVjdXJzaXZlbHlSZW1vdmVDaGlsZHJlbkZyb21NYXAodGhpcy5fY3VycmVudFNob3duQm91bmRzLE1hdGguZmxvb3IodGhpcy5fbWFwLmdldE1pblpvb20oKSksZSksdGhpcy5fdG9wQ2x1c3RlckxldmVsLl9yZWN1cnNpdmVseUFkZENoaWxkcmVuVG9NYXAobnVsbCx0LHRoaXMuX2dldEV4cGFuZGVkVmlzaWJsZUJvdW5kcygpKSx0aGlzLmZpcmUoImFuaW1hdGlvbmVuZCIpfSxfYW5pbWF0aW9uWm9vbU91dDpmdW5jdGlvbihlLHQpe3RoaXMuX3RvcENsdXN0ZXJMZXZlbC5fcmVjdXJzaXZlbHlSZW1vdmVDaGlsZHJlbkZyb21NYXAodGhpcy5fY3VycmVudFNob3duQm91bmRzLE1hdGguZmxvb3IodGhpcy5fbWFwLmdldE1pblpvb20oKSksZSksdGhpcy5fdG9wQ2x1c3RlckxldmVsLl9yZWN1cnNpdmVseUFkZENoaWxkcmVuVG9NYXAobnVsbCx0LHRoaXMuX2dldEV4cGFuZGVkVmlzaWJsZUJvdW5kcygpKSx0aGlzLmZpcmUoImFuaW1hdGlvbmVuZCIpfSxfYW5pbWF0aW9uQWRkTGF5ZXI6ZnVuY3Rpb24oZSx0KXt0aGlzLl9hbmltYXRpb25BZGRMYXllck5vbkFuaW1hdGVkKGUsdCl9fSxfd2l0aEFuaW1hdGlvbjp7X2FuaW1hdGlvblN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5fbWFwLl9tYXBQYW5lLmNsYXNzTmFtZSs9IiBsZWFmbGV0LWNsdXN0ZXItYW5pbSIsdGhpcy5faW5ab29tQW5pbWF0aW9uKyt9LF9hbmltYXRpb25ab29tSW46ZnVuY3Rpb24obixzKXt2YXIgbyxhPXRoaXMuX2dldEV4cGFuZGVkVmlzaWJsZUJvdW5kcygpLGg9dGhpcy5fZmVhdHVyZUdyb3VwLGU9TWF0aC5mbG9vcih0aGlzLl9tYXAuZ2V0TWluWm9vbSgpKTt0aGlzLl9pZ25vcmVNb3ZlPSEwLHRoaXMuX3RvcENsdXN0ZXJMZXZlbC5fcmVjdXJzaXZlbHkoYSxuLGUsZnVuY3Rpb24oZSl7dmFyIHQsaT1lLl9sYXRsbmcscj1lLl9tYXJrZXJzO2ZvcihhLmNvbnRhaW5zKGkpfHwoaT1udWxsKSxlLl9pc1NpbmdsZVBhcmVudCgpJiZuKzE9PT1zPyhoLnJlbW92ZUxheWVyKGUpLGUuX3JlY3Vyc2l2ZWx5QWRkQ2hpbGRyZW5Ub01hcChudWxsLHMsYSkpOihlLmNsdXN0ZXJIaWRlKCksZS5fcmVjdXJzaXZlbHlBZGRDaGlsZHJlblRvTWFwKGkscyxhKSksbz1yLmxlbmd0aC0xOzA8PW87by0tKXQ9cltvXSxhLmNvbnRhaW5zKHQuX2xhdGxuZyl8fGgucmVtb3ZlTGF5ZXIodCl9KSx0aGlzLl9mb3JjZUxheW91dCgpLHRoaXMuX3RvcENsdXN0ZXJMZXZlbC5fcmVjdXJzaXZlbHlCZWNvbWVWaXNpYmxlKGEscyksaC5lYWNoTGF5ZXIoZnVuY3Rpb24oZSl7ZSBpbnN0YW5jZW9mIEwuTWFya2VyQ2x1c3Rlcnx8IWUuX2ljb258fGUuY2x1c3RlclNob3coKX0pLHRoaXMuX3RvcENsdXN0ZXJMZXZlbC5fcmVjdXJzaXZlbHkoYSxuLHMsZnVuY3Rpb24oZSl7ZS5fcmVjdXJzaXZlbHlSZXN0b3JlQ2hpbGRQb3NpdGlvbnMocyl9KSx0aGlzLl9pZ25vcmVNb3ZlPSExLHRoaXMuX2VucXVldWUoZnVuY3Rpb24oKXt0aGlzLl90b3BDbHVzdGVyTGV2ZWwuX3JlY3Vyc2l2ZWx5KGEsbixlLGZ1bmN0aW9uKGUpe2gucmVtb3ZlTGF5ZXIoZSksZS5jbHVzdGVyU2hvdygpfSksdGhpcy5fYW5pbWF0aW9uRW5kKCl9KX0sX2FuaW1hdGlvblpvb21PdXQ6ZnVuY3Rpb24oZSx0KXt0aGlzLl9hbmltYXRpb25ab29tT3V0U2luZ2xlKHRoaXMuX3RvcENsdXN0ZXJMZXZlbCxlLTEsdCksdGhpcy5fdG9wQ2x1c3RlckxldmVsLl9yZWN1cnNpdmVseUFkZENoaWxkcmVuVG9NYXAobnVsbCx0LHRoaXMuX2dldEV4cGFuZGVkVmlzaWJsZUJvdW5kcygpKSx0aGlzLl90b3BDbHVzdGVyTGV2ZWwuX3JlY3Vyc2l2ZWx5UmVtb3ZlQ2hpbGRyZW5Gcm9tTWFwKHRoaXMuX2N1cnJlbnRTaG93bkJvdW5kcyxNYXRoLmZsb29yKHRoaXMuX21hcC5nZXRNaW5ab29tKCkpLGUsdGhpcy5fZ2V0RXhwYW5kZWRWaXNpYmxlQm91bmRzKCkpfSxfYW5pbWF0aW9uQWRkTGF5ZXI6ZnVuY3Rpb24oZSx0KXt2YXIgaT10aGlzLHI9dGhpcy5fZmVhdHVyZUdyb3VwO3IuYWRkTGF5ZXIoZSksdCE9PWUmJigyPHQuX2NoaWxkQ291bnQ\/KHQuX3VwZGF0ZUljb24oKSx0aGlzLl9mb3JjZUxheW91dCgpLHRoaXMuX2FuaW1hdGlvblN0YXJ0KCksZS5fc2V0UG9zKHRoaXMuX21hcC5sYXRMbmdUb0xheWVyUG9pbnQodC5nZXRMYXRMbmcoKSkpLGUuY2x1c3RlckhpZGUoKSx0aGlzLl9lbnF1ZXVlKGZ1bmN0aW9uKCl7ci5yZW1vdmVMYXllcihlKSxlLmNsdXN0ZXJTaG93KCksaS5fYW5pbWF0aW9uRW5kKCl9KSk6KHRoaXMuX2ZvcmNlTGF5b3V0KCksaS5fYW5pbWF0aW9uU3RhcnQoKSxpLl9hbmltYXRpb25ab29tT3V0U2luZ2xlKHQsdGhpcy5fbWFwLmdldE1heFpvb20oKSx0aGlzLl96b29tKSkpfX0sX2FuaW1hdGlvblpvb21PdXRTaW5nbGU6ZnVuY3Rpb24odCxpLHIpe3ZhciBuPXRoaXMuX2dldEV4cGFuZGVkVmlzaWJsZUJvdW5kcygpLHM9TWF0aC5mbG9vcih0aGlzLl9tYXAuZ2V0TWluWm9vbSgpKTt0Ll9yZWN1cnNpdmVseUFuaW1hdGVDaGlsZHJlbkluQW5kQWRkU2VsZlRvTWFwKG4scyxpKzEscik7dmFyIG89dGhpczt0aGlzLl9mb3JjZUxheW91dCgpLHQuX3JlY3Vyc2l2ZWx5QmVjb21lVmlzaWJsZShuLHIpLHRoaXMuX2VucXVldWUoZnVuY3Rpb24oKXt2YXIgZTsxPT09dC5fY2hpbGRDb3VudD8oZT10Ll9tYXJrZXJzWzBdLHRoaXMuX2lnbm9yZU1vdmU9ITAsZS5zZXRMYXRMbmcoZS5nZXRMYXRMbmcoKSksdGhpcy5faWdub3JlTW92ZT0hMSxlLmNsdXN0ZXJTaG93JiZlLmNsdXN0ZXJTaG93KCkpOnQuX3JlY3Vyc2l2ZWx5KG4scixzLGZ1bmN0aW9uKGUpe2UuX3JlY3Vyc2l2ZWx5UmVtb3ZlQ2hpbGRyZW5Gcm9tTWFwKG4scyxpKzEpfSksby5fYW5pbWF0aW9uRW5kKCl9KX0sX2FuaW1hdGlvbkVuZDpmdW5jdGlvbigpe3RoaXMuX21hcCYmKHRoaXMuX21hcC5fbWFwUGFuZS5jbGFzc05hbWU9dGhpcy5fbWFwLl9tYXBQYW5lLmNsYXNzTmFtZS5yZXBsYWNlKCIgbGVhZmxldC1jbHVzdGVyLWFuaW0iLCIiKSksdGhpcy5faW5ab29tQW5pbWF0aW9uLS0sdGhpcy5maXJlKCJhbmltYXRpb25lbmQiKX0sX2ZvcmNlTGF5b3V0OmZ1bmN0aW9uKCl7TC5VdGlsLmZhbHNlRm4oZG9jdW1lbnQuYm9keS5vZmZzZXRXaWR0aCl9fSksTC5tYXJrZXJDbHVzdGVyR3JvdXA9ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyBMLk1hcmtlckNsdXN0ZXJHcm91cChlKX07dmFyIGk9TC5NYXJrZXJDbHVzdGVyPUwuTWFya2VyLmV4dGVuZCh7b3B0aW9uczpMLkljb24ucHJvdG90eXBlLm9wdGlvbnMsaW5pdGlhbGl6ZTpmdW5jdGlvbihlLHQsaSxyKXtMLk1hcmtlci5wcm90b3R5cGUuaW5pdGlhbGl6ZS5jYWxsKHRoaXMsaT9pLl9jTGF0TG5nfHxpLmdldExhdExuZygpOm5ldyBMLkxhdExuZygwLDApLHtpY29uOnRoaXMscGFuZTplLm9wdGlvbnMuY2x1c3RlclBhbmV9KSx0aGlzLl9ncm91cD1lLHRoaXMuX3pvb209dCx0aGlzLl9tYXJrZXJzPVtdLHRoaXMuX2NoaWxkQ2x1c3RlcnM9W10sdGhpcy5fY2hpbGRDb3VudD0wLHRoaXMuX2ljb25OZWVkc1VwZGF0ZT0hMCx0aGlzLl9ib3VuZHNOZWVkVXBkYXRlPSEwLHRoaXMuX2JvdW5kcz1uZXcgTC5MYXRMbmdCb3VuZHMsaSYmdGhpcy5fYWRkQ2hpbGQoaSksciYmdGhpcy5fYWRkQ2hpbGQocil9LGdldEFsbENoaWxkTWFya2VyczpmdW5jdGlvbihlLHQpe2U9ZXx8W107Zm9yKHZhciBpPXRoaXMuX2NoaWxkQ2x1c3RlcnMubGVuZ3RoLTE7MDw9aTtpLS0pdGhpcy5fY2hpbGRDbHVzdGVyc1tpXS5nZXRBbGxDaGlsZE1hcmtlcnMoZSx0KTtmb3IodmFyIHI9dGhpcy5fbWFya2Vycy5sZW5ndGgtMTswPD1yO3ItLSl0JiZ0aGlzLl9tYXJrZXJzW3JdLl9fZHJhZ1N0YXJ0fHxlLnB1c2godGhpcy5fbWFya2Vyc1tyXSk7cmV0dXJuIGV9LGdldENoaWxkQ291bnQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fY2hpbGRDb3VudH0sem9vbVRvQm91bmRzOmZ1bmN0aW9uKGUpe2Zvcih2YXIgdD10aGlzLl9jaGlsZENsdXN0ZXJzLnNsaWNlKCksaT10aGlzLl9ncm91cC5fbWFwLHI9aS5nZXRCb3VuZHNab29tKHRoaXMuX2JvdW5kcyksbj10aGlzLl96b29tKzEsaT1pLmdldFpvb20oKTswPHQubGVuZ3RoJiZuPHI7KXtuKys7Zm9yKHZhciBzPVtdLG89MDtvPHQubGVuZ3RoO28rKylzPXMuY29uY2F0KHRbb10uX2NoaWxkQ2x1c3RlcnMpO3Q9c31uPHI\/dGhpcy5fZ3JvdXAuX21hcC5zZXRWaWV3KHRoaXMuX2xhdGxuZyxuKTpyPD1pP3RoaXMuX2dyb3VwLl9tYXAuc2V0Vmlldyh0aGlzLl9sYXRsbmcsaSsxKTp0aGlzLl9ncm91cC5fbWFwLmZpdEJvdW5kcyh0aGlzLl9ib3VuZHMsZSl9LGdldEJvdW5kczpmdW5jdGlvbigpe3ZhciBlPW5ldyBMLkxhdExuZ0JvdW5kcztyZXR1cm4gZS5leHRlbmQodGhpcy5fYm91bmRzKSxlfSxfdXBkYXRlSWNvbjpmdW5jdGlvbigpe3RoaXMuX2ljb25OZWVkc1VwZGF0ZT0hMCx0aGlzLl9pY29uJiZ0aGlzLnNldEljb24odGhpcyl9LGNyZWF0ZUljb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faWNvbk5lZWRzVXBkYXRlJiYodGhpcy5faWNvbk9iaj10aGlzLl9ncm91cC5vcHRpb25zLmljb25DcmVhdGVGdW5jdGlvbih0aGlzKSx0aGlzLl9pY29uTmVlZHNVcGRhdGU9ITEpLHRoaXMuX2ljb25PYmouY3JlYXRlSWNvbigpfSxjcmVhdGVTaGFkb3c6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faWNvbk9iai5jcmVhdGVTaGFkb3coKX0sX2FkZENoaWxkOmZ1bmN0aW9uKGUsdCl7dGhpcy5faWNvbk5lZWRzVXBkYXRlPSEwLHRoaXMuX2JvdW5kc05lZWRVcGRhdGU9ITAsdGhpcy5fc2V0Q2x1c3RlckNlbnRlcihlKSxlIGluc3RhbmNlb2YgTC5NYXJrZXJDbHVzdGVyPyh0fHwodGhpcy5fY2hpbGRDbHVzdGVycy5wdXNoKGUpLGUuX19wYXJlbnQ9dGhpcyksdGhpcy5fY2hpbGRDb3VudCs9ZS5fY2hpbGRDb3VudCk6KHR8fHRoaXMuX21hcmtlcnMucHVzaChlKSx0aGlzLl9jaGlsZENvdW50KyspLHRoaXMuX19wYXJlbnQmJnRoaXMuX19wYXJlbnQuX2FkZENoaWxkKGUsITApfSxfc2V0Q2x1c3RlckNlbnRlcjpmdW5jdGlvbihlKXt0aGlzLl9jTGF0TG5nfHwodGhpcy5fY0xhdExuZz1lLl9jTGF0TG5nfHxlLl9sYXRsbmcpfSxfcmVzZXRCb3VuZHM6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLl9ib3VuZHM7ZS5fc291dGhXZXN0JiYoZS5fc291dGhXZXN0LmxhdD0xLzAsZS5fc291dGhXZXN0LmxuZz0xLzApLGUuX25vcnRoRWFzdCYmKGUuX25vcnRoRWFzdC5sYXQ9LTEvMCxlLl9ub3J0aEVhc3QubG5nPS0xLzApfSxfcmVjYWxjdWxhdGVCb3VuZHM6ZnVuY3Rpb24oKXt2YXIgZSx0LGkscj10aGlzLl9tYXJrZXJzLG49dGhpcy5fY2hpbGRDbHVzdGVycyxzPTAsbz0wLGE9dGhpcy5fY2hpbGRDb3VudDtpZigwIT09YSl7Zm9yKHRoaXMuX3Jlc2V0Qm91bmRzKCksZT0wO2U8ci5sZW5ndGg7ZSsrKXQ9cltlXS5fbGF0bG5nLHRoaXMuX2JvdW5kcy5leHRlbmQodCkscys9dC5sYXQsbys9dC5sbmc7Zm9yKGU9MDtlPG4ubGVuZ3RoO2UrKykoaT1uW2VdKS5fYm91bmRzTmVlZFVwZGF0ZSYmaS5fcmVjYWxjdWxhdGVCb3VuZHMoKSx0aGlzLl9ib3VuZHMuZXh0ZW5kKGkuX2JvdW5kcyksdD1pLl93TGF0TG5nLGk9aS5fY2hpbGRDb3VudCxzKz10LmxhdCppLG8rPXQubG5nKmk7dGhpcy5fbGF0bG5nPXRoaXMuX3dMYXRMbmc9bmV3IEwuTGF0TG5nKHMvYSxvL2EpLHRoaXMuX2JvdW5kc05lZWRVcGRhdGU9ITF9fSxfYWRkVG9NYXA6ZnVuY3Rpb24oZSl7ZSYmKHRoaXMuX2JhY2t1cExhdGxuZz10aGlzLl9sYXRsbmcsdGhpcy5zZXRMYXRMbmcoZSkpLHRoaXMuX2dyb3VwLl9mZWF0dXJlR3JvdXAuYWRkTGF5ZXIodGhpcyl9LF9yZWN1cnNpdmVseUFuaW1hdGVDaGlsZHJlbkluOmZ1bmN0aW9uKGUsbix0KXt0aGlzLl9yZWN1cnNpdmVseShlLHRoaXMuX2dyb3VwLl9tYXAuZ2V0TWluWm9vbSgpLHQtMSxmdW5jdGlvbihlKXtmb3IodmFyIHQsaT1lLl9tYXJrZXJzLHI9aS5sZW5ndGgtMTswPD1yO3ItLSkodD1pW3JdKS5faWNvbiYmKHQuX3NldFBvcyhuKSx0LmNsdXN0ZXJIaWRlKCkpfSxmdW5jdGlvbihlKXtmb3IodmFyIHQsaT1lLl9jaGlsZENsdXN0ZXJzLHI9aS5sZW5ndGgtMTswPD1yO3ItLSkodD1pW3JdKS5faWNvbiYmKHQuX3NldFBvcyhuKSx0LmNsdXN0ZXJIaWRlKCkpfSl9LF9yZWN1cnNpdmVseUFuaW1hdGVDaGlsZHJlbkluQW5kQWRkU2VsZlRvTWFwOmZ1bmN0aW9uKHQsaSxyLG4pe3RoaXMuX3JlY3Vyc2l2ZWx5KHQsbixpLGZ1bmN0aW9uKGUpe2UuX3JlY3Vyc2l2ZWx5QW5pbWF0ZUNoaWxkcmVuSW4odCxlLl9ncm91cC5fbWFwLmxhdExuZ1RvTGF5ZXJQb2ludChlLmdldExhdExuZygpKS5yb3VuZCgpLHIpLGUuX2lzU2luZ2xlUGFyZW50KCkmJnItMT09PW4\/KGUuY2x1c3RlclNob3coKSxlLl9yZWN1cnNpdmVseVJlbW92ZUNoaWxkcmVuRnJvbU1hcCh0LGkscikpOmUuY2x1c3RlckhpZGUoKSxlLl9hZGRUb01hcCgpfSl9LF9yZWN1cnNpdmVseUJlY29tZVZpc2libGU6ZnVuY3Rpb24oZSx0KXt0aGlzLl9yZWN1cnNpdmVseShlLHRoaXMuX2dyb3VwLl9tYXAuZ2V0TWluWm9vbSgpLHQsbnVsbCxmdW5jdGlvbihlKXtlLmNsdXN0ZXJTaG93KCl9KX0sX3JlY3Vyc2l2ZWx5QWRkQ2hpbGRyZW5Ub01hcDpmdW5jdGlvbihyLG4scyl7dGhpcy5fcmVjdXJzaXZlbHkocyx0aGlzLl9ncm91cC5fbWFwLmdldE1pblpvb20oKS0xLG4sZnVuY3Rpb24oZSl7aWYobiE9PWUuX3pvb20pZm9yKHZhciB0PWUuX21hcmtlcnMubGVuZ3RoLTE7MDw9dDt0LS0pe3ZhciBpPWUuX21hcmtlcnNbdF07cy5jb250YWlucyhpLl9sYXRsbmcpJiYociYmKGkuX2JhY2t1cExhdGxuZz1pLmdldExhdExuZygpLGkuc2V0TGF0TG5nKHIpLGkuY2x1c3RlckhpZGUmJmkuY2x1c3RlckhpZGUoKSksZS5fZ3JvdXAuX2ZlYXR1cmVHcm91cC5hZGRMYXllcihpKSl9fSxmdW5jdGlvbihlKXtlLl9hZGRUb01hcChyKX0pfSxfcmVjdXJzaXZlbHlSZXN0b3JlQ2hpbGRQb3NpdGlvbnM6ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PXRoaXMuX21hcmtlcnMubGVuZ3RoLTE7MDw9dDt0LS0pe3ZhciBpPXRoaXMuX21hcmtlcnNbdF07aS5fYmFja3VwTGF0bG5nJiYoaS5zZXRMYXRMbmcoaS5fYmFja3VwTGF0bG5nKSxkZWxldGUgaS5fYmFja3VwTGF0bG5nKX1pZihlLTE9PT10aGlzLl96b29tKWZvcih2YXIgcj10aGlzLl9jaGlsZENsdXN0ZXJzLmxlbmd0aC0xOzA8PXI7ci0tKXRoaXMuX2NoaWxkQ2x1c3RlcnNbcl0uX3Jlc3RvcmVQb3NpdGlvbigpO2Vsc2UgZm9yKHZhciBuPXRoaXMuX2NoaWxkQ2x1c3RlcnMubGVuZ3RoLTE7MDw9bjtuLS0pdGhpcy5fY2hpbGRDbHVzdGVyc1tuXS5fcmVjdXJzaXZlbHlSZXN0b3JlQ2hpbGRQb3NpdGlvbnMoZSl9LF9yZXN0b3JlUG9zaXRpb246ZnVuY3Rpb24oKXt0aGlzLl9iYWNrdXBMYXRsbmcmJih0aGlzLnNldExhdExuZyh0aGlzLl9iYWNrdXBMYXRsbmcpLGRlbGV0ZSB0aGlzLl9iYWNrdXBMYXRsbmcpfSxfcmVjdXJzaXZlbHlSZW1vdmVDaGlsZHJlbkZyb21NYXA6ZnVuY3Rpb24oZSx0LGkscil7dmFyIG4sczt0aGlzLl9yZWN1cnNpdmVseShlLHQtMSxpLTEsZnVuY3Rpb24oZSl7Zm9yKHM9ZS5fbWFya2Vycy5sZW5ndGgtMTswPD1zO3MtLSluPWUuX21hcmtlcnNbc10sciYmci5jb250YWlucyhuLl9sYXRsbmcpfHwoZS5fZ3JvdXAuX2ZlYXR1cmVHcm91cC5yZW1vdmVMYXllcihuKSxuLmNsdXN0ZXJTaG93JiZuLmNsdXN0ZXJTaG93KCkpfSxmdW5jdGlvbihlKXtmb3Iocz1lLl9jaGlsZENsdXN0ZXJzLmxlbmd0aC0xOzA8PXM7cy0tKW49ZS5fY2hpbGRDbHVzdGVyc1tzXSxyJiZyLmNvbnRhaW5zKG4uX2xhdGxuZyl8fChlLl9ncm91cC5fZmVhdHVyZUdyb3VwLnJlbW92ZUxheWVyKG4pLG4uY2x1c3RlclNob3cmJm4uY2x1c3RlclNob3coKSl9KX0sX3JlY3Vyc2l2ZWx5OmZ1bmN0aW9uKGUsdCxpLHIsbil7dmFyIHMsbyxhPXRoaXMuX2NoaWxkQ2x1c3RlcnMsaD10aGlzLl96b29tO2lmKHQ8PWgmJihyJiZyKHRoaXMpLG4mJmg9PT1pJiZuKHRoaXMpKSxoPHR8fGg8aSlmb3Iocz1hLmxlbmd0aC0xOzA8PXM7cy0tKShvPWFbc10pLl9ib3VuZHNOZWVkVXBkYXRlJiZvLl9yZWNhbGN1bGF0ZUJvdW5kcygpLGUuaW50ZXJzZWN0cyhvLl9ib3VuZHMpJiZvLl9yZWN1cnNpdmVseShlLHQsaSxyLG4pfSxfaXNTaW5nbGVQYXJlbnQ6ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLl9jaGlsZENsdXN0ZXJzLmxlbmd0aCYmdGhpcy5fY2hpbGRDbHVzdGVyc1swXS5fY2hpbGRDb3VudD09PXRoaXMuX2NoaWxkQ291bnR9fSk7TC5NYXJrZXIuaW5jbHVkZSh7Y2x1c3RlckhpZGU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLm9wdGlvbnMub3BhY2l0eTtyZXR1cm4gdGhpcy5zZXRPcGFjaXR5KDApLHRoaXMub3B0aW9ucy5vcGFjaXR5PWUsdGhpc30sY2x1c3RlclNob3c6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zZXRPcGFjaXR5KHRoaXMub3B0aW9ucy5vcGFjaXR5KX19KSxMLkRpc3RhbmNlR3JpZD1mdW5jdGlvbihlKXt0aGlzLl9jZWxsU2l6ZT1lLHRoaXMuX3NxQ2VsbFNpemU9ZSplLHRoaXMuX2dyaWQ9e30sdGhpcy5fb2JqZWN0UG9pbnQ9e319LEwuRGlzdGFuY2VHcmlkLnByb3RvdHlwZT17YWRkT2JqZWN0OmZ1bmN0aW9uKGUsdCl7dmFyIGk9dGhpcy5fZ2V0Q29vcmQodC54KSxyPXRoaXMuX2dldENvb3JkKHQueSksbj10aGlzLl9ncmlkLHI9bltyXT1uW3JdfHx7fSxyPXJbaV09cltpXXx8W10saT1MLlV0aWwuc3RhbXAoZSk7dGhpcy5fb2JqZWN0UG9pbnRbaV09dCxyLnB1c2goZSl9LHVwZGF0ZU9iamVjdDpmdW5jdGlvbihlLHQpe3RoaXMucmVtb3ZlT2JqZWN0KGUpLHRoaXMuYWRkT2JqZWN0KGUsdCl9LHJlbW92ZU9iamVjdDpmdW5jdGlvbihlLHQpe3ZhciBpLHIsbj10aGlzLl9nZXRDb29yZCh0LngpLHM9dGhpcy5fZ2V0Q29vcmQodC55KSx0PXRoaXMuX2dyaWQsbz10W3NdPXRbc118fHt9LGE9b1tuXT1vW25dfHxbXTtmb3IoZGVsZXRlIHRoaXMuX29iamVjdFBvaW50W0wuVXRpbC5zdGFtcChlKV0saT0wLHI9YS5sZW5ndGg7aTxyO2krKylpZihhW2ldPT09ZSlyZXR1cm4gYS5zcGxpY2UoaSwxKSwxPT09ciYmZGVsZXRlIG9bbl0sITB9LGVhY2hPYmplY3Q6ZnVuY3Rpb24oZSx0KXt2YXIgaSxyLG4scyxvLGEsaD10aGlzLl9ncmlkO2ZvcihpIGluIGgpZm9yKHIgaW4gbz1oW2ldKWZvcihuPTAscz0oYT1vW3JdKS5sZW5ndGg7bjxzO24rKyllLmNhbGwodCxhW25dKSYmKG4tLSxzLS0pfSxnZXROZWFyT2JqZWN0OmZ1bmN0aW9uKGUpe2Zvcih2YXIgdCxpLHIsbixzLG8sYSxoPXRoaXMuX2dldENvb3JkKGUueCksbD10aGlzLl9nZXRDb29yZChlLnkpLHU9dGhpcy5fb2JqZWN0UG9pbnQsXz10aGlzLl9zcUNlbGxTaXplLGQ9bnVsbCxwPWwtMTtwPD1sKzE7cCsrKWlmKHI9dGhpcy5fZ3JpZFtwXSlmb3IodD1oLTE7dDw9aCsxO3QrKylpZihuPXJbdF0pZm9yKGk9MCxzPW4ubGVuZ3RoO2k8cztpKyspbz1uW2ldLCgoYT10aGlzLl9zcURpc3QodVtMLlV0aWwuc3RhbXAobyldLGUpKTxffHxhPD1fJiZudWxsPT09ZCkmJihfPWEsZD1vKTtyZXR1cm4gZH0sX2dldENvb3JkOmZ1bmN0aW9uKGUpe3ZhciB0PU1hdGguZmxvb3IoZS90aGlzLl9jZWxsU2l6ZSk7cmV0dXJuIGlzRmluaXRlKHQpP3Q6ZX0sX3NxRGlzdDpmdW5jdGlvbihlLHQpe3ZhciBpPXQueC1lLngsZT10LnktZS55O3JldHVybiBpKmkrZSplfX0sTC5RdWlja0h1bGw9e2dldERpc3RhbnQ6ZnVuY3Rpb24oZSx0KXt2YXIgaT10WzFdLmxhdC10WzBdLmxhdDtyZXR1cm4odFswXS5sbmctdFsxXS5sbmcpKihlLmxhdC10WzBdLmxhdCkraSooZS5sbmctdFswXS5sbmcpfSxmaW5kTW9zdERpc3RhbnRQb2ludEZyb21CYXNlTGluZTpmdW5jdGlvbihlLHQpe2Zvcih2YXIgaSxyLG49MCxzPW51bGwsbz1bXSxhPXQubGVuZ3RoLTE7MDw9YTthLS0paT10W2FdLDA8KHI9dGhpcy5nZXREaXN0YW50KGksZSkpJiYoby5wdXNoKGkpLG48ciYmKG49cixzPWkpKTtyZXR1cm57bWF4UG9pbnQ6cyxuZXdQb2ludHM6b319LGJ1aWxkQ29udmV4SHVsbDpmdW5jdGlvbihlLHQpe3ZhciBpPVtdLHQ9dGhpcy5maW5kTW9zdERpc3RhbnRQb2ludEZyb21CYXNlTGluZShlLHQpO3JldHVybiB0Lm1heFBvaW50PyhpPWkuY29uY2F0KHRoaXMuYnVpbGRDb252ZXhIdWxsKFtlWzBdLHQubWF4UG9pbnRdLHQubmV3UG9pbnRzKSkpLmNvbmNhdCh0aGlzLmJ1aWxkQ29udmV4SHVsbChbdC5tYXhQb2ludCxlWzFdXSx0Lm5ld1BvaW50cykpOltlWzBdXX0sZ2V0Q29udmV4SHVsbDpmdW5jdGlvbihlKXtmb3IodmFyIHQsaT0hMSxyPSExLG49ITEscz0hMSxvPW51bGwsYT1udWxsLGg9bnVsbCxsPW51bGwsdT1udWxsLF89ZS5sZW5ndGgtMTswPD1fO18tLSl7dmFyIGQ9ZVtfXTsoITE9PT1pfHxkLmxhdD5pKSYmKGk9KG89ZCkubGF0KSwoITE9PT1yfHxkLmxhdDxyKSYmKHI9KGE9ZCkubGF0KSwoITE9PT1ufHxkLmxuZz5uKSYmKG49KGg9ZCkubG5nKSwoITE9PT1zfHxkLmxuZzxzKSYmKHM9KGw9ZCkubG5nKX1yZXR1cm4gdD1yIT09aT8odT1hLG8pOih1PWwsaCksW10uY29uY2F0KHRoaXMuYnVpbGRDb252ZXhIdWxsKFt1LHRdLGUpLHRoaXMuYnVpbGRDb252ZXhIdWxsKFt0LHVdLGUpKX19LEwuTWFya2VyQ2x1c3Rlci5pbmNsdWRlKHtnZXRDb252ZXhIdWxsOmZ1bmN0aW9uKCl7Zm9yKHZhciBlLHQ9dGhpcy5nZXRBbGxDaGlsZE1hcmtlcnMoKSxpPVtdLHI9dC5sZW5ndGgtMTswPD1yO3ItLSllPXRbcl0uZ2V0TGF0TG5nKCksaS5wdXNoKGUpO3JldHVybiBMLlF1aWNrSHVsbC5nZXRDb252ZXhIdWxsKGkpfX0pLEwuTWFya2VyQ2x1c3Rlci5pbmNsdWRlKHtfMlBJOjIqTWF0aC5QSSxfY2lyY2xlRm9vdFNlcGFyYXRpb246MjUsX2NpcmNsZVN0YXJ0QW5nbGU6MCxfc3BpcmFsRm9vdFNlcGFyYXRpb246MjgsX3NwaXJhbExlbmd0aFN0YXJ0OjExLF9zcGlyYWxMZW5ndGhGYWN0b3I6NSxfY2lyY2xlU3BpcmFsU3dpdGNob3Zlcjo5LHNwaWRlcmZ5OmZ1bmN0aW9uKCl7dmFyIGUsdDt0aGlzLl9ncm91cC5fc3BpZGVyZmllZD09PXRoaXN8fHRoaXMuX2dyb3VwLl9pblpvb21BbmltYXRpb258fChlPXRoaXMuZ2V0QWxsQ2hpbGRNYXJrZXJzKG51bGwsITApLHQ9dGhpcy5fZ3JvdXAuX21hcC5sYXRMbmdUb0xheWVyUG9pbnQodGhpcy5fbGF0bG5nKSx0aGlzLl9ncm91cC5fdW5zcGlkZXJmeSgpLHQ9KHRoaXMuX2dyb3VwLl9zcGlkZXJmaWVkPXRoaXMpLl9ncm91cC5vcHRpb25zLnNwaWRlcmZ5U2hhcGVQb3NpdGlvbnM\/dGhpcy5fZ3JvdXAub3B0aW9ucy5zcGlkZXJmeVNoYXBlUG9zaXRpb25zKGUubGVuZ3RoLHQpOmUubGVuZ3RoPj10aGlzLl9jaXJjbGVTcGlyYWxTd2l0Y2hvdmVyP3RoaXMuX2dlbmVyYXRlUG9pbnRzU3BpcmFsKGUubGVuZ3RoLHQpOih0LnkrPTEwLHRoaXMuX2dlbmVyYXRlUG9pbnRzQ2lyY2xlKGUubGVuZ3RoLHQpKSx0aGlzLl9hbmltYXRpb25TcGlkZXJmeShlLHQpKX0sdW5zcGlkZXJmeTpmdW5jdGlvbihlKXt0aGlzLl9ncm91cC5faW5ab29tQW5pbWF0aW9ufHwodGhpcy5fYW5pbWF0aW9uVW5zcGlkZXJmeShlKSx0aGlzLl9ncm91cC5fc3BpZGVyZmllZD1udWxsKX0sX2dlbmVyYXRlUG9pbnRzQ2lyY2xlOmZ1bmN0aW9uKGUsdCl7dmFyIGkscixuPXRoaXMuX2dyb3VwLm9wdGlvbnMuc3BpZGVyZnlEaXN0YW5jZU11bHRpcGxpZXIqdGhpcy5fY2lyY2xlRm9vdFNlcGFyYXRpb24qKDIrZSkvdGhpcy5fMlBJLHM9dGhpcy5fMlBJL2Usbz1bXSxuPU1hdGgubWF4KG4sMzUpO2ZvcihvLmxlbmd0aD1lLGk9MDtpPGU7aSsrKXI9dGhpcy5fY2lyY2xlU3RhcnRBbmdsZStpKnMsb1tpXT1uZXcgTC5Qb2ludCh0LngrbipNYXRoLmNvcyhyKSx0LnkrbipNYXRoLnNpbihyKSkuX3JvdW5kKCk7cmV0dXJuIG99LF9nZW5lcmF0ZVBvaW50c1NwaXJhbDpmdW5jdGlvbihlLHQpe2Zvcih2YXIgaT10aGlzLl9ncm91cC5vcHRpb25zLnNwaWRlcmZ5RGlzdGFuY2VNdWx0aXBsaWVyLHI9aSp0aGlzLl9zcGlyYWxMZW5ndGhTdGFydCxuPWkqdGhpcy5fc3BpcmFsRm9vdFNlcGFyYXRpb24scz1pKnRoaXMuX3NwaXJhbExlbmd0aEZhY3Rvcip0aGlzLl8yUEksbz0wLGE9W10saD1hLmxlbmd0aD1lOzA8PWg7aC0tKWg8ZSYmKGFbaF09bmV3IEwuUG9pbnQodC54K3IqTWF0aC5jb3MobyksdC55K3IqTWF0aC5zaW4obykpLl9yb3VuZCgpKSxyKz1zLyhvKz1uL3IrNWUtNCpoKTtyZXR1cm4gYX0sX25vYW5pbWF0aW9uVW5zcGlkZXJmeTpmdW5jdGlvbigpe3ZhciBlLHQsaT10aGlzLl9ncm91cCxyPWkuX21hcCxuPWkuX2ZlYXR1cmVHcm91cCxzPXRoaXMuZ2V0QWxsQ2hpbGRNYXJrZXJzKG51bGwsITApO2ZvcihpLl9pZ25vcmVNb3ZlPSEwLHRoaXMuc2V0T3BhY2l0eSgxKSx0PXMubGVuZ3RoLTE7MDw9dDt0LS0pZT1zW3RdLG4ucmVtb3ZlTGF5ZXIoZSksZS5fcHJlU3BpZGVyZnlMYXRsbmcmJihlLnNldExhdExuZyhlLl9wcmVTcGlkZXJmeUxhdGxuZyksZGVsZXRlIGUuX3ByZVNwaWRlcmZ5TGF0bG5nKSxlLnNldFpJbmRleE9mZnNldCYmZS5zZXRaSW5kZXhPZmZzZXQoMCksZS5fc3BpZGVyTGVnJiYoci5yZW1vdmVMYXllcihlLl9zcGlkZXJMZWcpLGRlbGV0ZSBlLl9zcGlkZXJMZWcpO2kuZmlyZSgidW5zcGlkZXJmaWVkIix7Y2x1c3Rlcjp0aGlzLG1hcmtlcnM6c30pLGkuX2lnbm9yZU1vdmU9ITEsaS5fc3BpZGVyZmllZD1udWxsfX0pLEwuTWFya2VyQ2x1c3Rlck5vbkFuaW1hdGVkPUwuTWFya2VyQ2x1c3Rlci5leHRlbmQoe19hbmltYXRpb25TcGlkZXJmeTpmdW5jdGlvbihlLHQpe3ZhciBpLHIsbixzLG89dGhpcy5fZ3JvdXAsYT1vLl9tYXAsaD1vLl9mZWF0dXJlR3JvdXAsbD10aGlzLl9ncm91cC5vcHRpb25zLnNwaWRlckxlZ1BvbHlsaW5lT3B0aW9ucztmb3Ioby5faWdub3JlTW92ZT0hMCxpPTA7aTxlLmxlbmd0aDtpKyspcz1hLmxheWVyUG9pbnRUb0xhdExuZyh0W2ldKSxyPWVbaV0sbj1uZXcgTC5Qb2x5bGluZShbdGhpcy5fbGF0bG5nLHNdLGwpLGEuYWRkTGF5ZXIobiksci5fc3BpZGVyTGVnPW4sci5fcHJlU3BpZGVyZnlMYXRsbmc9ci5fbGF0bG5nLHIuc2V0TGF0TG5nKHMpLHIuc2V0WkluZGV4T2Zmc2V0JiZyLnNldFpJbmRleE9mZnNldCgxZTYpLGguYWRkTGF5ZXIocik7dGhpcy5zZXRPcGFjaXR5KC4zKSxvLl9pZ25vcmVNb3ZlPSExLG8uZmlyZSgic3BpZGVyZmllZCIse2NsdXN0ZXI6dGhpcyxtYXJrZXJzOmV9KX0sX2FuaW1hdGlvblVuc3BpZGVyZnk6ZnVuY3Rpb24oKXt0aGlzLl9ub2FuaW1hdGlvblVuc3BpZGVyZnkoKX19KSxMLk1hcmtlckNsdXN0ZXIuaW5jbHVkZSh7X2FuaW1hdGlvblNwaWRlcmZ5OmZ1bmN0aW9uKGUsdCl7dmFyIGkscixuLHMsbyxhLGg9dGhpcyxsPXRoaXMuX2dyb3VwLHU9bC5fbWFwLF89bC5fZmVhdHVyZUdyb3VwLGQ9dGhpcy5fbGF0bG5nLHA9dS5sYXRMbmdUb0xheWVyUG9pbnQoZCksYz1MLlBhdGguU1ZHLGY9TC5leHRlbmQoe30sdGhpcy5fZ3JvdXAub3B0aW9ucy5zcGlkZXJMZWdQb2x5bGluZU9wdGlvbnMpLG09Zi5vcGFjaXR5O2Zvcih2b2lkIDA9PT1tJiYobT1MLk1hcmtlckNsdXN0ZXJHcm91cC5wcm90b3R5cGUub3B0aW9ucy5zcGlkZXJMZWdQb2x5bGluZU9wdGlvbnMub3BhY2l0eSksYz8oZi5vcGFjaXR5PTAsZi5jbGFzc05hbWU9KGYuY2xhc3NOYW1lfHwiIikrIiBsZWFmbGV0LWNsdXN0ZXItc3BpZGVyLWxlZyIpOmYub3BhY2l0eT1tLGwuX2lnbm9yZU1vdmU9ITAsaT0wO2k8ZS5sZW5ndGg7aSsrKXI9ZVtpXSxhPXUubGF5ZXJQb2ludFRvTGF0TG5nKHRbaV0pLG49bmV3IEwuUG9seWxpbmUoW2QsYV0sZiksdS5hZGRMYXllcihuKSxyLl9zcGlkZXJMZWc9bixjJiYobz0ocz1uLl9wYXRoKS5nZXRUb3RhbExlbmd0aCgpKy4xLHMuc3R5bGUuc3Ryb2tlRGFzaGFycmF5PW8scy5zdHlsZS5zdHJva2VEYXNob2Zmc2V0PW8pLHIuc2V0WkluZGV4T2Zmc2V0JiZyLnNldFpJbmRleE9mZnNldCgxZTYpLHIuY2x1c3RlckhpZGUmJnIuY2x1c3RlckhpZGUoKSxfLmFkZExheWVyKHIpLHIuX3NldFBvcyYmci5fc2V0UG9zKHApO2ZvcihsLl9mb3JjZUxheW91dCgpLGwuX2FuaW1hdGlvblN0YXJ0KCksaT1lLmxlbmd0aC0xOzA8PWk7aS0tKWE9dS5sYXllclBvaW50VG9MYXRMbmcodFtpXSksKHI9ZVtpXSkuX3ByZVNwaWRlcmZ5TGF0bG5nPXIuX2xhdGxuZyxyLnNldExhdExuZyhhKSxyLmNsdXN0ZXJTaG93JiZyLmNsdXN0ZXJTaG93KCksYyYmKChzPShuPXIuX3NwaWRlckxlZykuX3BhdGgpLnN0eWxlLnN0cm9rZURhc2hvZmZzZXQ9MCxuLnNldFN0eWxlKHtvcGFjaXR5Om19KSk7dGhpcy5zZXRPcGFjaXR5KC4zKSxsLl9pZ25vcmVNb3ZlPSExLHNldFRpbWVvdXQoZnVuY3Rpb24oKXtsLl9hbmltYXRpb25FbmQoKSxsLmZpcmUoInNwaWRlcmZpZWQiLHtjbHVzdGVyOmgsbWFya2VyczplfSl9LDIwMCl9LF9hbmltYXRpb25VbnNwaWRlcmZ5OmZ1bmN0aW9uKGUpe3ZhciB0LGkscixuLHMsbz10aGlzLGE9dGhpcy5fZ3JvdXAsaD1hLl9tYXAsbD1hLl9mZWF0dXJlR3JvdXAsdT1lP2guX2xhdExuZ1RvTmV3TGF5ZXJQb2ludCh0aGlzLl9sYXRsbmcsZS56b29tLGUuY2VudGVyKTpoLmxhdExuZ1RvTGF5ZXJQb2ludCh0aGlzLl9sYXRsbmcpLF89dGhpcy5nZXRBbGxDaGlsZE1hcmtlcnMobnVsbCwhMCksZD1MLlBhdGguU1ZHO2ZvcihhLl9pZ25vcmVNb3ZlPSEwLGEuX2FuaW1hdGlvblN0YXJ0KCksdGhpcy5zZXRPcGFjaXR5KDEpLGk9Xy5sZW5ndGgtMTswPD1pO2ktLSkodD1fW2ldKS5fcHJlU3BpZGVyZnlMYXRsbmcmJih0LmNsb3NlUG9wdXAoKSx0LnNldExhdExuZyh0Ll9wcmVTcGlkZXJmeUxhdGxuZyksZGVsZXRlIHQuX3ByZVNwaWRlcmZ5TGF0bG5nLHM9ITAsdC5fc2V0UG9zJiYodC5fc2V0UG9zKHUpLHM9ITEpLHQuY2x1c3RlckhpZGUmJih0LmNsdXN0ZXJIaWRlKCkscz0hMSkscyYmbC5yZW1vdmVMYXllcih0KSxkJiYocz0obj0ocj10Ll9zcGlkZXJMZWcpLl9wYXRoKS5nZXRUb3RhbExlbmd0aCgpKy4xLG4uc3R5bGUuc3Ryb2tlRGFzaG9mZnNldD1zLHIuc2V0U3R5bGUoe29wYWNpdHk6MH0pKSk7YS5faWdub3JlTW92ZT0hMSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGU9MDtmb3IoaT1fLmxlbmd0aC0xOzA8PWk7aS0tKSh0PV9baV0pLl9zcGlkZXJMZWcmJmUrKztmb3IoaT1fLmxlbmd0aC0xOzA8PWk7aS0tKSh0PV9baV0pLl9zcGlkZXJMZWcmJih0LmNsdXN0ZXJTaG93JiZ0LmNsdXN0ZXJTaG93KCksdC5zZXRaSW5kZXhPZmZzZXQmJnQuc2V0WkluZGV4T2Zmc2V0KDApLDE8ZSYmbC5yZW1vdmVMYXllcih0KSxoLnJlbW92ZUxheWVyKHQuX3NwaWRlckxlZyksZGVsZXRlIHQuX3NwaWRlckxlZyk7YS5fYW5pbWF0aW9uRW5kKCksYS5maXJlKCJ1bnNwaWRlcmZpZWQiLHtjbHVzdGVyOm8sbWFya2VyczpffSl9LDIwMCl9fSksTC5NYXJrZXJDbHVzdGVyR3JvdXAuaW5jbHVkZSh7X3NwaWRlcmZpZWQ6bnVsbCx1bnNwaWRlcmZ5OmZ1bmN0aW9uKCl7dGhpcy5fdW5zcGlkZXJmeS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LF9zcGlkZXJmaWVyT25BZGQ6ZnVuY3Rpb24oKXt0aGlzLl9tYXAub24oImNsaWNrIix0aGlzLl91bnNwaWRlcmZ5V3JhcHBlcix0aGlzKSx0aGlzLl9tYXAub3B0aW9ucy56b29tQW5pbWF0aW9uJiZ0aGlzLl9tYXAub24oInpvb21zdGFydCIsdGhpcy5fdW5zcGlkZXJmeVpvb21TdGFydCx0aGlzKSx0aGlzLl9tYXAub24oInpvb21lbmQiLHRoaXMuX25vYW5pbWF0aW9uVW5zcGlkZXJmeSx0aGlzKSxMLkJyb3dzZXIudG91Y2h8fHRoaXMuX21hcC5nZXRSZW5kZXJlcih0aGlzKX0sX3NwaWRlcmZpZXJPblJlbW92ZTpmdW5jdGlvbigpe3RoaXMuX21hcC5vZmYoImNsaWNrIix0aGlzLl91bnNwaWRlcmZ5V3JhcHBlcix0aGlzKSx0aGlzLl9tYXAub2ZmKCJ6b29tc3RhcnQiLHRoaXMuX3Vuc3BpZGVyZnlab29tU3RhcnQsdGhpcyksdGhpcy5fbWFwLm9mZigiem9vbWFuaW0iLHRoaXMuX3Vuc3BpZGVyZnlab29tQW5pbSx0aGlzKSx0aGlzLl9tYXAub2ZmKCJ6b29tZW5kIix0aGlzLl9ub2FuaW1hdGlvblVuc3BpZGVyZnksdGhpcyksdGhpcy5fbm9hbmltYXRpb25VbnNwaWRlcmZ5KCl9LF91bnNwaWRlcmZ5Wm9vbVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5fbWFwJiZ0aGlzLl9tYXAub24oInpvb21hbmltIix0aGlzLl91bnNwaWRlcmZ5Wm9vbUFuaW0sdGhpcyl9LF91bnNwaWRlcmZ5Wm9vbUFuaW06ZnVuY3Rpb24oZSl7TC5Eb21VdGlsLmhhc0NsYXNzKHRoaXMuX21hcC5fbWFwUGFuZSwibGVhZmxldC10b3VjaGluZyIpfHwodGhpcy5fbWFwLm9mZigiem9vbWFuaW0iLHRoaXMuX3Vuc3BpZGVyZnlab29tQW5pbSx0aGlzKSx0aGlzLl91bnNwaWRlcmZ5KGUpKX0sX3Vuc3BpZGVyZnlXcmFwcGVyOmZ1bmN0aW9uKCl7dGhpcy5fdW5zcGlkZXJmeSgpfSxfdW5zcGlkZXJmeTpmdW5jdGlvbihlKXt0aGlzLl9zcGlkZXJmaWVkJiZ0aGlzLl9zcGlkZXJmaWVkLnVuc3BpZGVyZnkoZSl9LF9ub2FuaW1hdGlvblVuc3BpZGVyZnk6ZnVuY3Rpb24oKXt0aGlzLl9zcGlkZXJmaWVkJiZ0aGlzLl9zcGlkZXJmaWVkLl9ub2FuaW1hdGlvblVuc3BpZGVyZnkoKX0sX3Vuc3BpZGVyZnlMYXllcjpmdW5jdGlvbihlKXtlLl9zcGlkZXJMZWcmJih0aGlzLl9mZWF0dXJlR3JvdXAucmVtb3ZlTGF5ZXIoZSksZS5jbHVzdGVyU2hvdyYmZS5jbHVzdGVyU2hvdygpLGUuc2V0WkluZGV4T2Zmc2V0JiZlLnNldFpJbmRleE9mZnNldCgwKSx0aGlzLl9tYXAucmVtb3ZlTGF5ZXIoZS5fc3BpZGVyTGVnKSxkZWxldGUgZS5fc3BpZGVyTGVnKX19KSxMLk1hcmtlckNsdXN0ZXJHcm91cC5pbmNsdWRlKHtyZWZyZXNoQ2x1c3RlcnM6ZnVuY3Rpb24oZSl7cmV0dXJuIGU\/ZSBpbnN0YW5jZW9mIEwuTWFya2VyQ2x1c3Rlckdyb3VwP2U9ZS5fdG9wQ2x1c3RlckxldmVsLmdldEFsbENoaWxkTWFya2VycygpOmUgaW5zdGFuY2VvZiBMLkxheWVyR3JvdXA\/ZT1lLl9sYXllcnM6ZSBpbnN0YW5jZW9mIEwuTWFya2VyQ2x1c3Rlcj9lPWUuZ2V0QWxsQ2hpbGRNYXJrZXJzKCk6ZSBpbnN0YW5jZW9mIEwuTWFya2VyJiYoZT1bZV0pOmU9dGhpcy5fdG9wQ2x1c3RlckxldmVsLmdldEFsbENoaWxkTWFya2VycygpLHRoaXMuX2ZsYWdQYXJlbnRzSWNvbnNOZWVkVXBkYXRlKGUpLHRoaXMuX3JlZnJlc2hDbHVzdGVyc0ljb25zKCksdGhpcy5vcHRpb25zLnNpbmdsZU1hcmtlck1vZGUmJnRoaXMuX3JlZnJlc2hTaW5nbGVNYXJrZXJNb2RlTWFya2VycyhlKSx0aGlzfSxfZmxhZ1BhcmVudHNJY29uc05lZWRVcGRhdGU6ZnVuY3Rpb24oZSl7dmFyIHQsaTtmb3IodCBpbiBlKWZvcihpPWVbdF0uX19wYXJlbnQ7aTspaS5faWNvbk5lZWRzVXBkYXRlPSEwLGk9aS5fX3BhcmVudH0sX3JlZnJlc2hTaW5nbGVNYXJrZXJNb2RlTWFya2VyczpmdW5jdGlvbihlKXt2YXIgdCxpO2Zvcih0IGluIGUpaT1lW3RdLHRoaXMuaGFzTGF5ZXIoaSkmJmkuc2V0SWNvbih0aGlzLl9vdmVycmlkZU1hcmtlckljb24oaSkpfX0pLEwuTWFya2VyLmluY2x1ZGUoe3JlZnJlc2hJY29uT3B0aW9uczpmdW5jdGlvbihlLHQpe3ZhciBpPXRoaXMub3B0aW9ucy5pY29uO3JldHVybiBMLnNldE9wdGlvbnMoaSxlKSx0aGlzLnNldEljb24oaSksdCYmdGhpcy5fX3BhcmVudCYmdGhpcy5fX3BhcmVudC5fZ3JvdXAucmVmcmVzaENsdXN0ZXJzKHRoaXMpLHRoaXN9fSksZS5NYXJrZXJDbHVzdGVyR3JvdXA9dCxlLk1hcmtlckNsdXN0ZXI9aSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSl9KTs=\")));var s=document.createElement(\"script\");s.text=c;document.head.appendChild(s);})();<\/script>\n<script>\n\/* teaching: 2 = regular, 1 = pontual, 0 = n\u00e3o  |  photo: url opcional (avatar com iniciais por defeito) *\/\nconst ALUNOS = [\n {n:\"Maria Apolin\u00e1rio\",c:\"Lourinh\u00e3\",p:\"Portugal\",lat:39.2015,lng:-9.3315,prof:\"Especialista de Medicina Tradicional Chinesa \u00b7 (A)mar\",t:2,ig:[\"maria_apolinario_a_mar\"],web:\"\",course:\"Forma\u00e7\u00e3o 200H\",photo:\"https:\/\/beyoga.pt\/wp-content\/uploads\/2026\/07\/maria-apolinario-mapa.jpg\"}\n,\n {n:\"Ana Rita Serra Lopes\",c:\"Set\u00fabal\",p:\"Portugal\",lat:38.5244,lng:-8.8882,prof:\"Professora de Hatha Yoga e Yoga Kids\",t:1,ig:[],web:\"\",course:\"Forma\u00e7\u00e3o 200H\",photo:\"https:\/\/beyoga.pt\/wp-content\/uploads\/2026\/06\/ana-rita-lopes-mapa.jpg\",quote:\"A forma\u00e7\u00e3o de professora de yoga foi uma jornada de aprendizagem profunda sobre a pr\u00e1tica do yoga, incluindo posturas, t\u00e9cnicas de respira\u00e7\u00e3o (pranayama), filosofia e anatomia. Esta forma\u00e7\u00e3o deu-me as bases necess\u00e1rias para orientar aulas de forma segura, consciente e adaptada \u00e0s necessidades de cada aluno.\",fq:1},\n {n:\"Anna Balejko\",c:\"Lisboa\",p:\"Portugal\",lat:38.7223,lng:-9.1393,prof:\"Gestora financeira\",t:1,ig:[\"ayanama.yogi\"],web:\"\",course:\"Forma\u00e7\u00e3o 200H | Yin Yoga | Yoga Nidra | Yoga na Cadeira | Yoga Terap\u00eautico\"},\n {n:\"Joana Alves\",c:\"Cascais\",p:\"Portugal\",lat:38.6979,lng:-9.4215,prof:\"Professora de Yoga e Consultora Imobili\u00e1ria\",t:2,ig:[],web:\"\",course:\"Forma\u00e7\u00e3o 200H | Yin Yoga\",photo:\"https:\/\/beyoga.pt\/wp-content\/uploads\/2025\/01\/IMG20240317113927.jpg\",quote:\"As forma\u00e7\u00f5es da BeYoga School s\u00e3o excelentes! Recomendo a quem queira dar aulas e a quem quer aprofundar conhecimentos. Vale mesmo a pena!\"},\n {n:\"Rita Mestre\",c:\"Corroios\",p:\"Portugal\",lat:38.6358,lng:-9.1505,prof:\"T\u00e9cnica de Cardiopneumologia\",t:1,ig:[\"aritamestre\"],web:\"\",course:\"Forma\u00e7\u00e3o 200H | Yin Yoga | Yoga na Cadeira | Yoga Terap\u00eautico\"},\n {n:\"Adriana Teixeira\",c:\"Aveiro\",p:\"Portugal\",lat:40.6405,lng:-8.6538,prof:\"Professora de F\u00edsica\/Qu\u00edmica e de Yoga \u00b7 Sleeping Code\",t:2,ig:[],web:\"\",course:\"Forma\u00e7\u00e3o 200H | Yoga Restaurativo | Yoga na Cadeira | Yoga Terap\u00eautico\",quote:\"O Yoga fez-me apaixonar pela pr\u00e1tica, mas o BeYoga transformou por completo a minha forma de estar na vida.\",fq:1},\n {n:\"Rita Sousa\",c:\"Schweinfurt\",p:\"Alemanha\",lat:50.0499,lng:10.2342,prof:\"Massagista\",t:0,ig:[],web:\"\",course:\"Forma\u00e7\u00e3o 200H\",photo:\"https:\/\/beyoga.pt\/wp-content\/uploads\/2026\/06\/rita-sousa-mapa.jpg\"},\n {n:\"Odete Lopes\",c:\"Coimbra\",p:\"Portugal\",lat:40.2033,lng:-8.4103,prof:\"Formadora na \u00e1rea de Restaura\u00e7\u00e3o\",t:2,ig:[],web:\"\",course:\"Forma\u00e7\u00e3o 200H\"},\n {n:\"Elsa Costa\",c:\"Guimar\u00e3es\",p:\"Portugal\",lat:41.4425,lng:-8.2918,prof:\"Fisioterapeuta e Professora de Yoga\",t:1,ig:[\"yoga.com.alma\"],web:\"\",course:\"Forma\u00e7\u00e3o 200H\",quote:\"Uma forma\u00e7\u00e3o que nos muda de dentro para fora! Adorei! A Carla e toda a equipa s\u00e3o 5 estrelas!\"},\n {n:\"Teresa Arcanjo\",c:\"Rio Tinto\",p:\"Portugal\",lat:41.1804,lng:-8.5606,prof:\"Atriz \u00b7 Yoga e Yoga Facial\",t:2,ig:[\"yogibi.arcanjo\"],web:\"\",course:\"Forma\u00e7\u00e3o 200H\",photo:\"https:\/\/beyoga.pt\/wp-content\/uploads\/2026\/06\/teresa-arcanjo-mapa.jpg\",quote:\"Adorei cada momento do percurso, desde a partilha de conhecimentos at\u00e9 \u00e0 liga\u00e7\u00e3o que se criou no grupo. Sa\u00ed desta experi\u00eancia n\u00e3o apenas de cora\u00e7\u00e3o cheio mas tamb\u00e9m a sentir-me preparada para partilhar o que aprendi. Estou profundamente grata por tudo o que aprendi e vivenciei. Namast\u00e9. \ud83d\ude4f\",fq:1},\n {n:\"Anabela Oliveira\",c:\"Lourosa\",p:\"Portugal\",lat:40.9563,lng:-8.5497,prof:\"Professora de Yoga \u00b7 Psic\u00f3loga\",t:2,ig:[],web:\"\",course:\"Forma\u00e7\u00e3o 200H\",photo:\"https:\/\/beyoga.pt\/wp-content\/uploads\/2026\/07\/anabela-oliveira-mapa.jpg\"},\n {n:\"Sabrina Ruan\",c:\"Lisboa\",p:\"Portugal\",lat:38.7253,lng:-9.1500,prof:\"Personal Trainer e Instrutora de Yoga \u00b7 Yoga Vita Qualis\",t:2,ig:[\"sabrina.italia.16\"],web:\"\",course:\"Forma\u00e7\u00e3o 200H | Yin Yoga | Yoga Restaurativo | Medita\u00e7\u00e3o | Yoga Nidra\",photo:\"https:\/\/beyoga.pt\/wp-content\/uploads\/2026\/07\/sabrina-ruan-mapa.jpg\",quote:\"A forma\u00e7\u00e3o de Yoga ensinou-me muito mais do que t\u00e9cnicas. Ensinou-me a viver com mais consci\u00eancia, equil\u00edbrio e presen\u00e7a, e a partilhar esse caminho com os outros.\",fq:1},\n {n:\"Claudia Barbeiro\",c:\"Leiria\",p:\"Portugal\",lat:39.7436,lng:-8.8071,prof:\"Gerontologia\",t:1,ig:[],web:\"\",course:\"Forma\u00e7\u00e3o 200H | Yin Yoga\"},\n {n:\"Alexandra Mendes\",c:\"Lisboa\",p:\"Portugal\",lat:38.7190,lng:-9.1360,prof:\"Professora de Yoga e Personal Trainer\",t:2,ig:[\"alexa_yoga_fitness\"],web:\"\",course:\"Forma\u00e7\u00e3o 200H | Medita\u00e7\u00e3o | Pranayamas\",photo:\"https:\/\/beyoga.pt\/wp-content\/uploads\/2026\/06\/alexandra-mendes-mapa.jpg\"},\n {n:\"Marta Castanho\",c:\"Lisboa\",p:\"Portugal\",lat:38.7565,lng:-9.1546,prof:\"Professora\",t:0,ig:[\"mpcastanho\"],web:\"\",course:\"Forma\u00e7\u00e3o 200H\"},\n {n:\"Luis Silvestre\",c:\"Pa\u00e7o de Arcos\",p:\"Portugal\",lat:38.6950,lng:-9.2910,prof:\"Professor de Dan\u00e7a\",t:0,ig:[\"luis_p_sillvestre\"],web:\"\",course:\"Forma\u00e7\u00e3o 200H\",quote:\"Sem d\u00favida \u00e9 uma excelente escola de forma\u00e7\u00e3o em Yoga, estou muito satisfeito.\"},\n {n:\"In\u00eas Guerreiro\",c:\"Lisboa \u00b7 Oeiras\",p:\"Portugal\",lat:38.7186,lng:-9.2095,prof:\"Professora de Yoga e Tradutora\/Revisora \u00b7 Yoga da In\u00eas\",t:2,ig:[\"guerreiroi_\"],web:\"\",course:\"Forma\u00e7\u00e3o 200H | Medita\u00e7\u00e3o | Yoga Nidra | Pranayamas\",quote:\"BeYoga trouxe solidez, prop\u00f3sito e sentido de miss\u00e3o ao meu velho amor pelo yoga. Hoje, desejo contagiar o mundo com esta paix\u00e3o e os seus benef\u00edcios. Mais do que meu, sei que yoga \u00e9 para todos.\",photo:\"https:\/\/beyoga.pt\/wp-content\/uploads\/2026\/06\/ines-guerreiro-mapa.jpg\",fq:1},\n {n:\"Paulo Vieira\",c:\"Amadora \u00b7 Lisboa \u00b7 Oeiras\",p:\"Portugal\",lat:38.7536,lng:-9.2302,prof:\"Professor de Yoga e Instrutor de Breathwork \u00b7 UNO Yoga e Breathwork\",t:2,ig:[\"uno.yogabreathwork\"],web:\"https:\/\/uno-yogaebreathwork.softr.app\/\",course:\"Forma\u00e7\u00e3o 200H | Yoga Nidra\",photo:\"https:\/\/beyoga.pt\/wp-content\/uploads\/2025\/03\/IMG_20240722_223842.jpg\"},\n {n:\"Lu\u00edsa Caldeira\",c:\"Porto Santo\",p:\"Portugal\",lat:33.0608,lng:-16.3397,prof:\"T\u00e9cnica de tr\u00e1fego de assist\u00eancia em escala\",t:0,ig:[],web:\"\",course:\"Forma\u00e7\u00e3o 200H\"},\n {n:\"C\u00e1tia Sebasti\u00e3o\",c:\"P\u00f3voa de Santa Iria\",p:\"Portugal\",lat:38.859,lng:-9.0651,prof:\"Professora de Yoga, Baby Yoga e Yoga Kids\",t:2,ig:[\"reikiyoga_reequilibra\"],web:\"\",course:\"Forma\u00e7\u00e3o 200H\",photo:\"https:\/\/beyoga.pt\/wp-content\/uploads\/2026\/06\/catia-sebastiao-mapa.jpg\",quote:\"Cheia de medos, receios e inseguran\u00e7as embarquei neste grandioso e prazeroso mergulho de 8 meses.\"},\n {n:\"Edgar Cardoso\",c:\"Ovar\",p:\"Portugal\",lat:40.8597,lng:-8.6257,prof:\"Terapeuta hol\u00edstico e massagista \u00b7 Portal 777\",t:0,ig:[\"portaldo777\"],web:\"https:\/\/www.portal-777.com\/\",course:\"Forma\u00e7\u00e3o 200H\",photo:\"https:\/\/images.cdn-files-a.com\/uploads\/6677234\/800_6311d5eba083a_filter_6311d60c60e1f.jpg\",quote:\"Uma professora com uma capacidade inata de transmitir o seu conhecimento sobre o Yoga. Uma escola que trabalha com muita exig\u00eancia.\"},\n {n:\"Marta Carmo\",c:\"Aveiro\",p:\"Portugal\",lat:40.6440,lng:-8.6500,prof:\"Professora de Yoga\",t:2,ig:[\"martaalexandracarmo\"],web:\"\",course:\"Forma\u00e7\u00e3o 200H | Yoga Restaurativo\",quote:\"A forma\u00e7\u00e3o foi excelente! A Prof. Carla, organizada e exigente, proporciona uma abordagem sintetizada e clara dos conte\u00fados.\"},\n {n:\"Silvia Maganinho\",c:\"Esmoriz\",p:\"Portugal\",lat:40.9617,lng:-8.6306,prof:\"Professora de Yoga \u00b7 Maitri Yoga\",t:1,ig:[],web:\"\",course:\"Forma\u00e7\u00e3o 200H\",photo:\"https:\/\/beyoga.pt\/wp-content\/uploads\/2026\/06\/silvia-maganinho-mapa.jpg\"},\n {n:\"Danahe Garrido\",c:\"Vila Nova de Gaia\",p:\"Portugal\",lat:41.1333,lng:-8.6167,prof:\"Professora de Yoga & Medita\u00e7\u00e3o \u00b7 Fundadora do espa\u00e7o YogArte\",t:2,ig:[\"yogarte.oficial\"],web:\"https:\/\/www.yogarte.pt\",course:\"Forma\u00e7\u00e3o 200H | Yin Yoga | Pranayamas\",photo:\"https:\/\/static.wixstatic.com\/media\/bdb56a_1e926746395f42b7adf1d54ad70f2cc5~mv2.jpg\/v1\/fill\/w_400,h_400,al_c,q_80\/portrait.jpg\",quote:\"A forma\u00e7\u00e3o na BeYoga marcou profundamente o meu percurso. Deu-me ferramentas para ensinar, mas, sobretudo, ensinou-me a viver o yoga com mais consci\u00eancia, humanidade e autenticidade.\",fq:1},\n {n:\"Val\u00e9ria Guimar\u00e3es\",c:\"Oliveira do Bairro\",p:\"Portugal\",lat:40.5145,lng:-8.4926,prof:\"Fisioterapeuta\",t:0,ig:[],web:\"\",course:\"Forma\u00e7\u00e3o 200H\",quote:\"Excelente! A Carla \u00e9 muito competente, estimula imenso os alunos e est\u00e1 sempre atenta \u00e0s nossas d\u00favidas. Adorei o curso.\"},\n {n:\"Rita Marafuz\",c:\"Maia\",p:\"Portugal\",lat:41.2357,lng:-8.6199,prof:\"Terapeuta de Medicina Chinesa e Acupuntura \u00b7 Zhi Studio\",t:2,ig:[\"zhistudio.pt\"],web:\"https:\/\/zhistudio.pt\/\",course:\"Forma\u00e7\u00e3o 200H\",photo:\"https:\/\/static.wixstatic.com\/media\/7365b8_798e773721fc45beaf44431b128c2420~mv2.jpg\/v1\/fill\/w_400,h_460,al_c,q_80\/IMG_1330.jpg\"},\n {n:\"Maria de F\u00e1tima Gomes\",c:\"Braga\",p:\"Portugal\",lat:41.5454,lng:-8.4265,prof:\"Enfermeira\",t:1,ig:[],web:\"\",course:\"Forma\u00e7\u00e3o 200H\"},\n {n:\"Paulo Costa\",c:\"Vila Nova de Cerveira\",p:\"Portugal\",lat:41.9402,lng:-8.7444,prof:\"Arquitecto e Instrutor de Yoga \u00b7 Casa do Lento\",t:2,ig:[\"casadolento\"],web:\"https:\/\/casadolento.com\",course:\"Forma\u00e7\u00e3o 200H\",quote:\"Fiquei encantado com a elevada qualidade do curso de professores da BeYoga. A Carla e a sua equipa foram incans\u00e1veis a ajudar os alunos a atingir os seus objetivos.\"},\n {n:\"Paula Silva\",c:\"Espinho\",p:\"Portugal\",lat:41.0100,lng:-8.6380,prof:\"Animadora Sociocultural e Professora de Yoga\",t:2,ig:[],web:\"\",course:\"Forma\u00e7\u00e3o 200H | Yin Yoga\",quote:\"A forma\u00e7\u00e3o de yoga da BeYoga School foi fant\u00e1stica!\"},\n {n:\"Ana Pardal\",c:\"P\u00f3voa de Santa Iria\",p:\"Portugal\",lat:38.8610,lng:-9.0680,prof:\"Tradutora e Consultora Imobili\u00e1ria\",t:0,ig:[],web:\"\",course:\"Forma\u00e7\u00e3o 200H\"},\n {n:\"Sofia Luz\",c:\"Alc\u00e1cer do Sal\",p:\"Portugal\",lat:38.3725,lng:-8.5134,prof:\"Engenharia de Dados\",t:0,ig:[\"csofiaflz\"],web:\"\",course:\"Forma\u00e7\u00e3o 200H\",photo:\"https:\/\/beyoga.pt\/wp-content\/uploads\/nsl_avatars\/d34362c0c78adbe65a0d3f878699bc14.jpg\"},\n {n:\"S\u00f3nia Galv\u00e3o\",c:\"Belas\",p:\"Portugal\",lat:38.7773,lng:-9.3631,prof:\"Contabilista Certificada \u00b7 Aromaterapia e Yoga Facial\",t:2,ig:[\"soniagalvao.faceyoga\"],web:\"\",course:\"Forma\u00e7\u00e3o 200H | Yin Yoga | Yoga Nidra | Medita\u00e7\u00e3o | Pranayamas | Yoga na Cadeira | Yoga Terap\u00eautico\",quote:\"Forma\u00e7\u00e3o excelente, muito bem estruturada. Sa\u00edmos muito bem preparados e temos muito apoio.\"},\n {n:\"Cristina Valente\",c:\"Moura\",p:\"Portugal\",lat:38.1402,lng:-7.4475,prof:\"Centro de bem-estar e terapias \u00b7 Reiki, TFT e aulas privadas de yoga\",t:2,ig:[\"cristina_valente22\"],web:\"\",course:\"Forma\u00e7\u00e3o 200H\"},\n {n:\"Joana D'E\u00e7a Leal\",c:\"Alg\u00e9s\",p:\"Portugal\",lat:38.7016,lng:-9.2287,prof:\"Auditoria Financeira\",t:0,ig:[],web:\"\",course:\"Forma\u00e7\u00e3o 200H | Medita\u00e7\u00e3o\"},\n {n:\"Carla Caba\u00e7a\",c:\"Torres Vedras\",p:\"Portugal\",lat:39.0910,lng:-9.2588,prof:\"Professora de Yoga \u00b7 Pausa Yoga\",t:2,ig:[\"pausa__yoga\"],web:\"\",course:\"Forma\u00e7\u00e3o 200H | Yoga Nidra\",photo:\"https:\/\/beyoga.pt\/wp-content\/uploads\/2026\/07\/carla-cabaca-mapa.jpg\"},\n {n:\"Cec\u00edlia Caba\u00e7a\",c:\"Alcanena\",p:\"Portugal\",lat:39.4584,lng:-8.6679,prof:\"Docente de Educa\u00e7\u00e3o F\u00edsica e Yoga\",t:1,ig:[],web:\"\",course:\"Forma\u00e7\u00e3o 200H\",quote:\"A escola BeYoga e a querida Carla marcaram este per\u00edodo da minha vida.\"},\n {n:\"F\u00e1tima Moreno\",c:\"Santiago do Cac\u00e9m\",p:\"Portugal\",lat:38.0070,lng:-8.6963,prof:\"Professora\",t:2,ig:[],web:\"\",course:\"Forma\u00e7\u00e3o 200H\"},\n {n:\"Eduarda Saraiva\",c:\"\u00c1gueda\",p:\"Portugal\",lat:40.5772,lng:-8.4459,prof:\"Professora de Yoga a tempo inteiro\",t:2,ig:[\"estrelasirius2023\"],web:\"\",course:\"Forma\u00e7\u00e3o 200H\",photo:\"https:\/\/beyoga.pt\/wp-content\/uploads\/2026\/06\/eduarda-saraiva-mapa.jpg\",quote:\"Uma forma\u00e7\u00e3o aprofundada e estruturada que nos prepara para que possamos levar aos outros o melhor que o yoga tem para oferecer.\",fq:1},\n {n:\"Dora Pedro\",c:\"Maia\",p:\"Portugal\",lat:41.2380,lng:-8.6230,prof:\"Ambiente, Seguran\u00e7a e Sa\u00fade\",t:2,ig:[],web:\"\",course:\"Forma\u00e7\u00e3o 200H | Yoga Nidra\"},\n {n:\"Catarina Gra\u00e7a\",c:\"Porto\",p:\"Portugal\",lat:41.1600,lng:-8.6320,prof:\"Professora de Yoga, Medita\u00e7\u00e3o e Barre\",t:2,ig:[\"catedricas\"],web:\"\",course:\"Forma\u00e7\u00e3o 200H | Medita\u00e7\u00e3o | Pranayamas\",photo:\"https:\/\/beyoga.pt\/wp-content\/uploads\/nsl_avatars\/a1de03e3da2b13ec68bcd447c3f8c400.jpg\",quote:\"Excelente! Superou todas as minhas expectativas. Conte\u00fados muito valiosos e apoio incans\u00e1vel da Carla.\"},\n {n:\"Sebasti\u00e3o Medeiros\",c:\"\u00c1gueda\",p:\"Portugal\",lat:40.5790,lng:-8.4480,prof:\"T\u00e9cnico Auxiliar de Farm\u00e1cia \u00b7 Yoga\",t:0,ig:[\"sebastiao_dharana\"],web:\"\",course:\"Forma\u00e7\u00e3o 200H | Yoga Nidra | Medita\u00e7\u00e3o | Pranayamas\",quote:\"Proporcionou-me um entendimento aprofundado sobre estar presente sem julgamento.\",photo:\"https:\/\/beyoga.pt\/wp-content\/uploads\/2026\/06\/sebastiao-medeiros-mapa.jpg\",fq:1},\n {n:\"Jo\u00e3o Pedro Alves\",c:\"Lausanne\",p:\"Su\u00ed\u00e7a\",lat:46.5197,lng:6.6323,prof:\"Personal Trainer\",t:0,ig:[\"joao_alvesss_pt\"],web:\"\",course:\"Forma\u00e7\u00e3o 200H | Yoga Nidra\"},\n {n:\"Maria Grifo Ramos\",c:\"Peniche\",p:\"Portugal\",lat:39.3558,lng:-9.3811,prof:\"MARYOGA \u2014 Vinyasa Flow by the Sea\",t:2,ig:[\"_maryoga\"],web:\"\",course:\"Forma\u00e7\u00e3o 200H\"},\n {n:\"Vanessa Sanona\",c:\"Moita\",p:\"Portugal\",lat:38.6502,lng:-8.9882,prof:\"Pricing Specialist\",t:0,ig:[\"vanessasanona\"],web:\"\",course:\"Forma\u00e7\u00e3o 200H\"},\n {n:\"Kateryna Goriachenko\",c:\"Arma\u00e7\u00e3o de P\u00eara\",p:\"Portugal\",lat:37.1023,lng:-8.3567,prof:\"Est\u00e9tica e Professora de Yoga\",t:2,ig:[],web:\"\",course:\"Forma\u00e7\u00e3o 200H | Yoga na Cadeira | Yoga Terap\u00eautico\"},\n {n:\"Carla Sofia Pereira\",c:\"Barreiro\",p:\"Portugal\",lat:38.6633,lng:-9.0724,prof:\"Bodywork \u00b7 Pr\u00e1ticas de toque e respira\u00e7\u00e3o consciente\",t:0,ig:[\"desperta.a.essencia\"],web:\"\",course:\"Forma\u00e7\u00e3o 200H\",photo:\"https:\/\/beyoga.pt\/wp-content\/uploads\/2025\/01\/IMG_5349.jpeg\"},\n {n:\"Carina Batista\",c:\"Montijo\",p:\"Portugal\",lat:38.7067,lng:-8.9737,prof:\"Militar \u00b7 Aulas de Yoga\",t:2,ig:[\"yoga.acarina\"],web:\"\",course:\"Forma\u00e7\u00e3o 200H\",quote:\"Um novo cap\u00edtulo do yoga aberto com muito boa energia, carinho e presen\u00e7a.\",fq:1},\n {n:\"In\u00eas Antunes\",c:\"Lisboa\",p:\"Portugal\",lat:38.733,lng:-9.138,prof:\"Advogada\",t:1,ig:[],web:\"\",course:\"Forma\u00e7\u00e3o 200H\",photo:\"https:\/\/beyoga.pt\/wp-content\/uploads\/2026\/06\/ines-antunes-mapa.jpg\",quote:\"Uma experi\u00eancia espetacular, com muita orienta\u00e7\u00e3o e entrega de todos os profissionais da estrutura BeYoga!\"},\n {n:\"Cristiana Vieira\",c:\"Porto de M\u00f3s\",p:\"Portugal\",lat:39.6018,lng:-8.8174,prof:\"Gestora de Redes Sociais \u00b7 Yoga com Cristiana\",t:2,ig:[\"yogacomcristiana\"],web:\"https:\/\/yogacomcristiana.pt\",course:\"Forma\u00e7\u00e3o 200H\",photo:\"https:\/\/yogacomcristiana.pt\/wp-content\/uploads\/2026\/01\/CRSITIANA-13-scaled.jpg\",quote:\"Tirei a forma\u00e7\u00e3o de professores de yoga e recomendo imenso! Gostei muito da estrutura do curso e de todas as aprendizagens.\"},\n {n:\"Marisa Silva\",c:\"Olh\u00e3o\",p:\"Portugal\",lat:37.0286,lng:-7.8411,prof:\"Motorista TVDE\",t:0,ig:[\"marisa.silva81\"],web:\"\",course:\"Forma\u00e7\u00e3o 200H\"},\n {n:\"Cristina Catita\",c:\"Vila Franca de Xira\",p:\"Portugal\",lat:38.9552,lng:-8.9899,prof:\"Docente Universit\u00e1ria\",t:1,ig:[],web:\"\",course:\"Forma\u00e7\u00e3o 200H\",photo:\"https:\/\/beyoga.pt\/wp-content\/uploads\/2025\/01\/DSC_2784_v2.jpg\",quote:\"Decidir pela forma\u00e7\u00e3o de formadores com a BeYoga foi uma das melhores decis\u00f5es que tomei na minha vida.\"},\n {n:\"S\u00f3nia Isabel da Costa\",c:\"Braga\",p:\"Portugal\",lat:41.548,lng:-8.43,prof:\"Beleza e Est\u00e9tica\",t:2,ig:[],web:\"\",course:\"Forma\u00e7\u00e3o 200H\",photo:\"https:\/\/beyoga.pt\/wp-content\/uploads\/2026\/06\/sonia-costa-mapa.jpg\"},\n {n:\"B\u00e1rbara Silva\",c:\"Vila Nova de Gaia\",p:\"Portugal\",lat:41.1300,lng:-8.6120,prof:\"Administrativa\",t:2,ig:[\"barbara_o_silva\"],web:\"\",course:\"Forma\u00e7\u00e3o 200H\",photo:\"https:\/\/beyoga.pt\/wp-content\/uploads\/2025\/01\/IMG_20180310_203242.jpg\",quote:\"Muito mais que uma simples forma\u00e7\u00e3o. Foi um lugar de crescimento pessoal e transforma\u00e7\u00e3o.\"},\n {n:\"Maria Neves\",c:\"Aveiro\",p:\"Portugal\",lat:40.6370,lng:-8.6480,prof:\"Analista de Dados\",t:0,ig:[\"mariacdasneves\"],web:\"\",course:\"Forma\u00e7\u00e3o 200H\"},\n {n:\"Mariana Rosa\",c:\"Coimbra\",p:\"Portugal\",lat:40.2070,lng:-8.4150,prof:\"Professora de Yoga e Terapeuta Emocional\",t:2,ig:[\"marianarosa.pt\"],web:\"https:\/\/linktr.ee\/Marianarosa.terapeuta\",course:\"Forma\u00e7\u00e3o 200H | Medita\u00e7\u00e3o\",photo:\"https:\/\/ugc.production.linktr.ee\/879a161c-a299-4afe-8ce9-d8eb31d27cdb_PERFIL.jpeg\"},\n {n:\"Andreia Amaral\",c:\"Ermesinde\",p:\"Portugal\",lat:41.2167,lng:-8.5500,prof:\"T\u00e9cnica Administrativa \u00b7 Ankora Yoga\",t:1,ig:[\"ankora_yoga\"],web:\"\",course:\"Forma\u00e7\u00e3o 200H\",quote:\"Falar sobre este curso de yoga \u00e9 falar sobre um processo profundamente enriquecedor e transformador.\"},\n {n:\"Dorinda da Costa\",c:\"Vila Nova de Gaia\",p:\"Portugal\",lat:41.1360,lng:-8.6200,prof:\"Professora de Yoga \u00b7 Espa\u00e7o YUCCA \u2014 Artes, Of\u00edcios e Bem-Estar\",t:2,ig:[],web:\"\",course:\"Forma\u00e7\u00e3o 200H | Yoga Nidra\"},\n {n:\"Mariane Bunn\",c:\"Castres\",p:\"Fran\u00e7a\",lat:43.6045,lng:2.2410,prof:\"Professora de Yoga \u00b7 Yoga com Mari\",t:2,ig:[\"marianebunn\"],web:\"\",course:\"Forma\u00e7\u00e3o 200H\",photo:\"https:\/\/beyoga.pt\/wp-content\/uploads\/2025\/01\/1611867226084.jpg\",quote:\"Excelente escola. Fiz o curso de forma online e o cuidado com os alunos online faz bastante diferen\u00e7a.\"},\n {n:\"Alexandra dos Santos\",c:\"Porto\",p:\"Portugal\",lat:41.1550,lng:-8.6250,prof:\"Uniyoga \u2014 Conex\u00e3o e Harmonia\",t:2,ig:[\"uniyoga.conexaoeharmonia\"],web:\"\",course:\"Forma\u00e7\u00e3o 200H | Medita\u00e7\u00e3o\"},\n {n:\"Ana Jo\u00e3o Mateus\",c:\"Vila Real\",p:\"Portugal\",lat:41.3006,lng:-7.7441,prof:\"Artesanato\",t:0,ig:[\"anajoaomateus\"],web:\"\",course:\"Forma\u00e7\u00e3o 200H\",photo:\"https:\/\/beyoga.pt\/wp-content\/uploads\/nsl_avatars\/d8fdd125d6728b4c130d1509ccb99b47.jpg\",quote:\"A forma\u00e7\u00e3o \u00e9 transformadora, muito completa, e \u00e9 a ferramenta ideal para come\u00e7ar ou solidificar a pr\u00e1tica de yoga.\"},\n {n:\"Leonor Silva\",c:\"Serzedelo, Guimar\u00e3es\",p:\"Portugal\",lat:41.3766,lng:-8.3550,prof:\"Enfermeira\",t:0,ig:[\"nono.almeida\"],web:\"\",course:\"Forma\u00e7\u00e3o 200H\"},\n {n:\"Clara Quaresma\",c:\"Porto\",p:\"Portugal\",lat:41.1620,lng:-8.6200,prof:\"Professora de Yoga\",t:2,ig:[\"girassois30\"],web:\"\",course:\"Forma\u00e7\u00e3o 200H\",photo:\"https:\/\/beyoga.pt\/wp-content\/uploads\/2025\/01\/IMG_20240723_1005583.jpg\"},\n {n:\"M\u00e1rcia Ribeiro\",c:\"Ermesinde\",p:\"Portugal\",lat:41.2190,lng:-8.5530,prof:\"Gest\u00e3o da Forma\u00e7\u00e3o\",t:0,ig:[\"marcia.ribeiro.100\"],web:\"\",course:\"Forma\u00e7\u00e3o 200H\"},\n {n:\"Elisabete da Silva Ribeiro\",c:\"Porto\",p:\"Portugal\",lat:41.15,lng:-8.618,prof:\"Gestora de Alojamento Local\",t:0,ig:[\"elisabete.silvarib\"],web:\"\",course:\"Forma\u00e7\u00e3o 200H\",photo:\"https:\/\/beyoga.pt\/wp-content\/uploads\/2026\/06\/elisabete-ribeiro-mapa.jpg\"},\n {n:\"Caroline Ribeiro\",c:\"Bragan\u00e7a\",p:\"Portugal\",lat:41.8061,lng:-6.7567,prof:\"Investigadora em Produtos Naturais \u00b7 Professora de Yoga\",t:2,ig:[],web:\"\",course:\"Forma\u00e7\u00e3o 200H\"},\n {n:\"Ivete Moutinho\",c:\"Vila Nova de Famalic\u00e3o\",p:\"Portugal\",lat:41.4082,lng:-8.5204,prof:\"Docente de Educa\u00e7\u00e3o Especial \u00b7 Brinca Yoga\",t:2,ig:[\"ivecpm\"],web:\"\",course:\"Yin Yoga | Yoga Restaurativo | Medita\u00e7\u00e3o | Yoga Nidra | Pranayamas\"},\n {n:\"Susana Melo\",c:\"Viseu\",p:\"Portugal\",lat:40.6566,lng:-7.9125,prof:\"Professora de Yoga e Engenheira Civil \u00b7 SuYoga\",t:2,ig:[\"suyoga80\"],web:\"\",course:\"Yin Yoga\"},\n {n:\"Ana Santos\",c:\"Queluz\",p:\"Portugal\",lat:38.7566,lng:-9.2545,prof:\"Designer Multim\u00e9dia \u00b7 Pr\u00e1tica Yoga\",t:2,ig:[\"praticayoga.pt\"],web:\"https:\/\/praticayoga.pt\/\",course:\"Yin Yoga\",photo:\"https:\/\/praticayoga.pt\/wp-content\/uploads\/2023\/10\/IMG_20230815_081008-scaled-e1699544235410-995x1024.jpg\",quote:\"5 estrelas! Realizei o Curso de Yin Yoga na BeYoga School e n\u00e3o poderia estar mais satisfeita.\"},\n {n:\"Solange Morais\",c:\"\u00c9vora\",p:\"Portugal\",lat:38.5714,lng:-7.9135,prof:\"Professora de Yoga \u00b7 Sol Yoga Vibes\",t:2,ig:[\"sol.yogavibes\"],web:\"\",course:\"Yin Yoga\"},\n {n:\"Carla Nogueira\",c:\"Valongo \u00b7 Albufeira\",p:\"Portugal\",lat:41.1959,lng:-8.5026,prof:\"Educa\u00e7\u00e3o e Yoga\",t:1,ig:[\"carlanogu3ira\"],web:\"\",course:\"Forma\u00e7\u00e3o 200H | Yin Yoga | Yoga Restaurativo\",quote:\"A forma\u00e7\u00e3o em yoga marca uma jornada de educa\u00e7\u00e3o do corpo e da mente. Aprendi a escutar melhor o corpo, a respeitar os seus ritmos e a encontrar mais equil\u00edbrio no dia a dia. \u00c9 com gratid\u00e3o que continuo a aprender e a partilhar esta pr\u00e1tica.\",photo:\"https:\/\/beyoga.pt\/wp-content\/uploads\/2026\/06\/carla-nogueira-mapa.jpg\",fq:1},\n {n:\"Clara Fuster\",c:\"Vale de Cambra\",p:\"Portugal\",lat:40.846,lng:-8.3938,prof:\"Enfermeira\",t:1,ig:[],web:\"\",course:\"Yin Yoga\"},\n {n:\"Susana Patr\u00edcio\",c:\"Sintra\",p:\"Portugal\",lat:38.8029,lng:-9.3817,prof:\"Professora de Yoga \u00b7 Su Yoga Classes\",t:2,ig:[],web:\"\",course:\"Yin Yoga\",quote:\"Foi uma \u00f3tima experi\u00eancia. A Prof. Carla \u00e9 excelente, muito acess\u00edvel e entusiasta.\"},\n {n:\"Ana Oliveira\",c:\"P\u00f3voa de Varzim\",p:\"Portugal\",lat:41.3830,lng:-8.7608,prof:\"Instrutora de Fitness e Yoga\",t:0,ig:[\"ana_oliveira_112\"],web:\"\",course:\"Yoga Nidra\"},\n {n:\"Anabela Rodrigues\",c:\"Pedras Salgadas\",p:\"Portugal\",lat:41.5360,lng:-7.6010,prof:\"Empres\u00e1ria \u00b7 Quinta do Lameiro\",t:1,ig:[\"aquintadolameiro\"],web:\"\",course:\"Yoga Nidra\"},\n {n:\"Sara Teixeira\",c:\"Torres Vedras \u00b7 Lisboa\",p:\"Portugal\",lat:39.0910,lng:-9.2588,prof:\"Professora de Yoga e Administrativa \u00b7 Slow Vibe Tribe\",t:2,ig:[\"saravieirateixeira\"],web:\"https:\/\/www.youtube.com\/@SlowVibeTribe\",course:\"Forma\u00e7\u00e3o 200H | Yin Yoga | Pranayamas\",quote:\"Fazer a forma\u00e7\u00e3o de yoga mudou a forma como eu me vejo, e como me movo no mundo. Adquiri conhecimentos e mecanismos que me ajudam a criar mais equil\u00edbrio na minha vida, e que me aproximaram da pessoa que realmente quero ser. Sou muito grata por ter tido a possibilidade de fazer esta forma\u00e7\u00e3o.\",photo:\"https:\/\/beyoga.pt\/wp-content\/uploads\/2026\/06\/sara-teixeira-mapa.jpg\",fq:1},\n {n:\"Olga Chvaiko\",c:\"Azeit\u00e3o\",p:\"Portugal\",lat:38.5190,lng:-9.0130,prof:\"Assistente Administrativa\",t:0,ig:[],web:\"\",course:\"Yin Yoga\"},\n {n:\"C\u00e1tia Gomes\",c:\"Figueira da Foz\",p:\"Portugal\",lat:40.0330,lng:-8.7760,prof:\"T\u00e9cnica de Sa\u00fade Ambiental\",t:0,ig:[],web:\"\",course:\"Forma\u00e7\u00e3o 200H\"},\n {n:\"S\u00f3nia Vieira\",c:\"Mondim de Basto\",p:\"Portugal\",lat:41.4130,lng:-7.9540,prof:\"Terapeuta\",t:0,ig:[],web:\"\",course:\"Forma\u00e7\u00e3o 200H | Yin Yoga | Medita\u00e7\u00e3o\"},\n {n:\"In\u00eas do Vale\",c:\"Caramulo, Tondela\",p:\"Portugal\",lat:40.5700,lng:-8.1660,prof:\"Rececionista\",t:0,ig:[],web:\"\",course:\"Yin Yoga | Yoga Nidra\"},\n {n:\"Ana Belchiorinho\",c:\"Almeirim\",p:\"Portugal\",lat:39.208,lng:-8.626,prof:\"Psic\u00f3loga\",t:0,ig:[],web:\"\",course:\"Yin Yoga | Yoga Restaurativo | Medita\u00e7\u00e3o | Pranayamas | Yoga Nidra\"},\n {n:\"Beatriz Forjaz\",c:\"Lisboa\",p:\"Portugal\",lat:38.7139,lng:-9.1395,prof:\"Atriz\",t:0,ig:[],web:\"\",course:\"Yin Yoga\",photo:\"https:\/\/beyoga.pt\/wp-content\/uploads\/nsl_avatars\/99e2fd52c03557728f5ec957194ba514.png\",quote:\"A Carla \u00e9 uma excelente professora: conjuga o lado profissional e estudioso da pr\u00e1tica com o lado emocional e emp\u00e1tico.\"},\n {n:\"Rita Calejo Pires\",c:\"Vila Real de Santo Ant\u00f3nio\",p:\"Portugal\",lat:37.194,lng:-7.417,prof:\"Professora e Instrutora de Yoga\",t:1,ig:[],web:\"\",course:\"Yin Yoga\"},\n {n:\"Raquel Martins\",c:\"Almada\",p:\"Portugal\",lat:38.6790,lng:-9.1569,prof:\"Professora de Yoga e Pilates \u00b7 ay\u00fcn yoga\",t:2,ig:[\"ayun.yoga\"],web:\"https:\/\/www.ayun.pt\",course:\"Forma\u00e7\u00e3o 200H\",quote:\"Uma transforma\u00e7\u00e3o e um encontro com a minha ess\u00eancia!\",photo:\"https:\/\/beyoga.pt\/wp-content\/uploads\/2026\/06\/raquel-martins-mapa.jpg\",fq:1},\n {n:\"Andreia de Brito Soares\",c:\"Quinta do Anjo, Palmela\",p:\"Portugal\",lat:38.5670,lng:-8.9430,prof:\"Bartender\",t:0,ig:[],web:\"\",course:\"Forma\u00e7\u00e3o 200H\",photo:\"https:\/\/beyoga.pt\/wp-content\/uploads\/2024\/12\/78F9D711-A2BF-412C-8FF8-7BD210AE766F.jpeg\"},\n {n:\"Ingrid Rodrigues\",c:\"Lisboa\",p:\"Portugal\",lat:38.7310,lng:-9.1230,prof:\"Barista\",t:0,ig:[],web:\"\",course:\"Forma\u00e7\u00e3o 200H\",photo:\"https:\/\/beyoga.pt\/wp-content\/uploads\/2025\/02\/IMG_1026.jpeg\",quote:\"Sinto-me profundamente feliz e grata por ter-me formado na melhor escola de forma\u00e7\u00e3o de professores de yoga em Portugal.\"},\n {n:\"Jo\u00e3o Amaro\",c:\"\u00c9vora\",p:\"Portugal\",lat:38.5714,lng:-7.9135,prof:\"Professor de Yoga e Designer\",t:1,ig:[\"alfaceman\"],web:\"\",course:\"Forma\u00e7\u00e3o 200H | Yin Yoga\",photo:\"https:\/\/beyoga.pt\/wp-content\/uploads\/2026\/06\/joao-amaro-mapa.jpg\",quote:\"A forma\u00e7\u00e3o BeYoga mudou a minha vida. Aprendi que o Yoga \u00e9 fisicamente exigente, mas o que tem de mais valioso \u00e9 ensinar algo raro hoje: o estar quieto.\",fq:1},\n {n:\"Marla Pais\",c:\"Pa\u00e7os de Brand\u00e3o\",p:\"Portugal\",lat:40.9780,lng:-8.5820,prof:\"Empregada de Escrit\u00f3rio\",t:0,ig:[],web:\"\",course:\"Forma\u00e7\u00e3o 200H | Medita\u00e7\u00e3o | Pranayamas\",photo:\"https:\/\/beyoga.pt\/wp-content\/uploads\/2024\/11\/IMG_6529.jpg\"},\n {n:\"Alice Deise Souza\",c:\"Valongo\",p:\"Portugal\",lat:41.1910,lng:-8.4980,prof:\"Designer Freelancer\",t:0,ig:[],web:\"\",course:\"Forma\u00e7\u00e3o 200H\"},\n {n:\"Ekaterina Goncalves\",c:\"Rio Tinto\",p:\"Portugal\",lat:41.1780,lng:-8.5600,prof:\"\",t:0,ig:[],web:\"\",course:\"Forma\u00e7\u00e3o 200H\"},\n {n:\"Ana Patr\u00edcia Leit\u00e3o\",c:\"Senhora da Hora\",p:\"Portugal\",lat:41.1840,lng:-8.6510,prof:\"\",t:0,ig:[],web:\"\",course:\"Forma\u00e7\u00e3o 200H\"},\n {n:\"Joana Neiva\",c:\"Braga\",p:\"Portugal\",lat:41.5510,lng:-8.4230,prof:\"Terapeuta Ocupacional\",t:0,ig:[],web:\"\",course:\"Forma\u00e7\u00e3o 200H\",quote:\"Adorei frequentar o Curso de Professores de Yoga na escola BeYoga! A formadora tem um alto n\u00edvel de conhecimento sobre os conte\u00fados e pr\u00e1ticas.\"},\n {n:\"Andreia Costa\",c:\"Amadora\",p:\"Portugal\",lat:38.7580,lng:-9.2350,prof:\"Enfermeira e Coach em Sa\u00fade\",t:0,ig:[],web:\"\",course:\"Forma\u00e7\u00e3o 200H\"},\n {n:\"Ana Dias\",c:\"Belas\",p:\"Portugal\",lat:38.7800,lng:-9.3680,prof:\"Enfermeira\",t:0,ig:[],web:\"\",course:\"Forma\u00e7\u00e3o 200H\"},\n {n:\"F\u00e1tima Sousa\",c:\"Torres Vedras\",p:\"Portugal\",lat:39.0940,lng:-9.2620,prof:\"Personal Trainer\",t:0,ig:[],web:\"\",course:\"Forma\u00e7\u00e3o 200H\"},\n {n:\"Carlos Gomes\",c:\"Madrid\",p:\"Espanha\",lat:40.4168,lng:-3.7038,prof:\"Banc\u00e1rio\",t:0,ig:[],web:\"\",course:\"Forma\u00e7\u00e3o 200H\"},\n {n:\"C\u00e1tia Rodrigues Gomes\",c:\"Madrid\",p:\"Espanha\",lat:40.4180,lng:-3.7012,prof:\"Consultora\",t:0,ig:[],web:\"\",course:\"Forma\u00e7\u00e3o 200H | Yin Yoga\"},\n {n:\"Lays Monteiro\",c:\"Charneca de Caparica\",p:\"Portugal\",lat:38.6280,lng:-9.1920,prof:\"Analista Financeira\",t:2,ig:[],web:\"\",course:\"Forma\u00e7\u00e3o 200H\",quote:\"Eu amei tanto a forma\u00e7\u00e3o. Hoje sou professora de yoga gra\u00e7as \u00e0 BeYoga. Gratid\u00e3o.\"},\n {n:\"Joana Ramos\",c:\"Lisboa\",p:\"Portugal\",lat:38.7500,lng:-9.2030,prof:\"T\u00e9cnica Superior de Psicologia\",t:0,ig:[],web:\"\",course:\"Forma\u00e7\u00e3o 200H\"},\n {n:\"Ana Veiga\",c:\"Lisboa\",p:\"Portugal\",lat:38.7610,lng:-9.1830,prof:\"T\u00e9cnica de Inform\u00e1tica\",t:0,ig:[],web:\"\",course:\"Forma\u00e7\u00e3o 200H\",quote:\"Frequentar este curso de yoga foi das melhores decis\u00f5es que tomei nos \u00faltimos tempos.\"},\n {n:\"Ana Maria Branco\",c:\"Ericeira\",p:\"Portugal\",lat:38.9630,lng:-9.4160,prof:\"Analista de Constru\u00e7\u00e3o\",t:0,ig:[],web:\"\",course:\"Forma\u00e7\u00e3o 200H\"},\n {n:\"Ana Sofia Sim\u00f5es\",c:\"Torres Vedras\",p:\"Portugal\",lat:39.0910,lng:-9.2588,prof:\"Professora de Yoga \u00b7 Associa\u00e7\u00e3o de Educa\u00e7\u00e3o do Movimento\",t:2,ig:[\"asofiapsimoes\"],web:\"https:\/\/www.aemovimento.eu\/\",course:\"Forma\u00e7\u00e3o 200H\",photo:\"https:\/\/beyoga.pt\/wp-content\/uploads\/2026\/07\/ana-sofia-simoes-mapa.jpg\"},\n {n:\"Ana Rita Granja Novo\",c:\"Caparica, Almada\",p:\"Portugal\",lat:38.6440,lng:-9.1980,prof:\"Tem est\u00fadio pr\u00f3prio de yoga\",t:0,ig:[],web:\"\",course:\"Forma\u00e7\u00e3o 200H | Yin Yoga | Yoga Nidra\"},\n {n:\"Madalena Oliveira\",c:\"Caldas da Rainha\",p:\"Portugal\",lat:39.4030,lng:-9.1380,prof:\"\",t:0,ig:[],web:\"\",course:\"Forma\u00e7\u00e3o 200H\",quote:\"Fiz a forma\u00e7\u00e3o de Professores de Yoga com a BeYoga e posso dizer que foi uma experi\u00eancia transformadora!\"},\n {n:\"Caroline de Moraes\",c:\"Lisboa\",p:\"Portugal\",lat:38.7680,lng:-9.0970,prof:\"Fisioterapeuta\",t:0,ig:[],web:\"\",course:\"Forma\u00e7\u00e3o 200H\"},\n {n:\"Rita Brinca\",c:\"Set\u00fabal\",p:\"Portugal\",lat:38.5270,lng:-8.8920,prof:\"Instrutora de Yoga\",t:2,ig:[],web:\"\",course:\"Forma\u00e7\u00e3o 200H | Yin Yoga | Yoga na Cadeira\"},\n {n:\"Ana Cristina Oliveira\",c:\"Porto\",p:\"Portugal\",lat:41.1480,lng:-8.6400,prof:\"M\u00e9dica\",t:0,ig:[],web:\"\",course:\"Forma\u00e7\u00e3o 200H\",quote:\"Este curso foi uma experi\u00eancia maravilhosa. A Carla \u00e9 uma excelente professora, met\u00f3dica, perfecionista mas af\u00e1vel e divertida.\"},\n {n:\"Elisabete Cardoso\",c:\"Vila Verde, Braga\",p:\"Portugal\",lat:41.6490,lng:-8.4360,prof:\"\",t:0,ig:[],web:\"\",course:\"Forma\u00e7\u00e3o 200H\",quote:\"A Carla \u00e9 uma formadora excelente, um ser humano incr\u00edvel.\"},\n {n:\"Isabel Cristina Miranda\",c:\"Braga\",p:\"Portugal\",lat:41.5430,lng:-8.4200,prof:\"Consultora\",t:0,ig:[],web:\"\",course:\"Forma\u00e7\u00e3o 200H\"},\n {n:\"Marisa Ribeiro\",c:\"Vila Real\",p:\"Portugal\",lat:41.3010,lng:-7.7480,prof:\"Tem est\u00fadio pr\u00f3prio de yoga\",t:2,ig:[],web:\"\",course:\"Forma\u00e7\u00e3o 200H\"},\n {n:\"L\u00facia Guerreiro\",c:\"Lisboa\",p:\"Portugal\",lat:38.7660,lng:-9.0930,prof:\"Fisioterapeuta\",t:0,ig:[],web:\"\",course:\"Forma\u00e7\u00e3o 200H\"},\n {n:\"Susana Marques\",c:\"Corroios\",p:\"Portugal\",lat:38.6380,lng:-9.1530,prof:\"Assistente T\u00e9cnica\",t:0,ig:[],web:\"\",course:\"Forma\u00e7\u00e3o 200H\"},\n {n:\"Marta Aguileira\",c:\"Oeiras\",p:\"Portugal\",lat:38.6970,lng:-9.3100,prof:\"Gestora de Eventos\",t:0,ig:[],web:\"\",course:\"Forma\u00e7\u00e3o 200H\"},\n {n:\"Miguela Fernandes\",c:\"Alcanede, Santar\u00e9m\",p:\"Portugal\",lat:39.4090,lng:-8.8260,prof:\"Professora \u00b7 Yoga para Crian\u00e7as e Seniores\",t:2,ig:[],web:\"\",course:\"Forma\u00e7\u00e3o 200H\",photo:\"https:\/\/beyoga.pt\/wp-content\/uploads\/2025\/01\/Firefly-20241006225301.png\",quote:\"Foi um ano de aprendizagens e crescimento pessoal. A Carla \u00e9 uma professora com um enorme conhecimento, uma pr\u00e1tica fluida e uma agilidade fabulosa.\"},\n {n:\"Juliana Silva\",c:\"Carnaxide, Oeiras\",p:\"Portugal\",lat:38.7270,lng:-9.2420,prof:\"Administrativa\",t:0,ig:[],web:\"\",course:\"Forma\u00e7\u00e3o 200H\"},\n {n:\"Sandra de Almeida\",c:\"Lisboa\",p:\"Portugal\",lat:38.7350,lng:-9.1330,prof:\"\",t:0,ig:[],web:\"\",course:\"Forma\u00e7\u00e3o 200H\"},\n {n:\"Carolina Machado\",c:\"Maia\",p:\"Portugal\",lat:41.2330,lng:-8.6170,prof:\"\",t:0,ig:[],web:\"\",course:\"Forma\u00e7\u00e3o 200H\"},\n {n:\"Ana Martins\",c:\"Miranda do Douro\",p:\"Portugal\",lat:41.4956,lng:-6.274,prof:\"Auditora\",t:2,ig:[],web:\"\",course:\"Forma\u00e7\u00e3o 200H\",photo:\"https:\/\/beyoga.pt\/wp-content\/uploads\/2026\/06\/ana-martins-mapa.jpg\",quote:\"Foi uma jornada de autoconhecimento que me permitiu compreender o Yoga como um caminho de transforma\u00e7\u00e3o, dentro e fora do tapete.\",fq:1},\n {n:\"Sylvia Mota\",c:\"Gafanha da Encarna\u00e7\u00e3o, \u00cdlhavo\",p:\"Portugal\",lat:40.6180,lng:-8.7310,prof:\"Esteticista e T\u00e9cnica de Ayurveda\",t:0,ig:[],web:\"\",course:\"Yin Yoga\"},\n {n:\"Silvia Filipe\",c:\"Torres Novas\",p:\"Portugal\",lat:39.4800,lng:-8.5390,prof:\"Professora do Ensino Secund\u00e1rio\",t:0,ig:[],web:\"\",course:\"Yin Yoga | Yoga Restaurativo | Medita\u00e7\u00e3o | Pranayamas | Yoga Nidra\",photo:\"https:\/\/beyoga.pt\/wp-content\/uploads\/2025\/03\/IMG_1822.jpeg\"},\n {n:\"Carolina Prates\",c:\"Aveiro\",p:\"Portugal\",lat:40.6360,lng:-8.6450,prof:\"Professora de Canto\",t:0,ig:[],web:\"\",course:\"Yin Yoga\"},\n {n:\"Angelina Borges\",c:\"Chaves\",p:\"Portugal\",lat:41.7400,lng:-7.4690,prof:\"\",t:0,ig:[],web:\"\",course:\"Yoga Restaurativo | Medita\u00e7\u00e3o\"},\n {n:\"F\u00e1tima Lopes\",c:\"Braga\",p:\"Portugal\",lat:41.5530,lng:-8.4200,prof:\"\",t:0,ig:[],web:\"\",course:\"Yoga Restaurativo\"},\n {n:\"Susana Silva\",c:\"Arma\u00e7\u00e3o de P\u00eara\",p:\"Portugal\",lat:37.1040,lng:-8.3620,prof:\"\",t:0,ig:[],web:\"\",course:\"Yoga Nidra\"},\n {n:\"Susete Martins\",c:\"Alcabideche, Cascais\",p:\"Portugal\",lat:38.7330,lng:-9.4080,prof:\"\",t:0,ig:[],web:\"\",course:\"Medita\u00e7\u00e3o\"},\n {n:\"Sandra S\u00e1\",c:\"Silves\",p:\"Portugal\",lat:37.1900,lng:-8.4390,prof:\"\",t:0,ig:[],web:\"\",course:\"Yin Yoga\"},\n {n:\"Rodrigo Marques\",c:\"Odivelas\",p:\"Portugal\",lat:38.7930,lng:-9.1840,prof:\"\",t:0,ig:[],web:\"\",course:\"Yin Yoga\"},\n {n:\"Carlota Lourido\",c:\"Oeiras\",p:\"Portugal\",lat:38.6920,lng:-9.3140,prof:\"\",t:0,ig:[],web:\"\",course:\"Yin Yoga\",photo:\"https:\/\/beyoga.pt\/wp-content\/uploads\/2025\/09\/Carlota-Lourido_Foto.jpg\",quote:\"Uma experi\u00eancia completa e enriquecedora. Saio desta forma\u00e7\u00e3o preparada e com confian\u00e7a para ministrar aulas de Yin Yoga.\"},\n {n:\"Milena Coppi\",c:\"Porto\",p:\"Portugal\",lat:41.1650,lng:-8.6050,prof:\"\",t:0,ig:[],web:\"\",course:\"Yin Yoga\"},\n {n:\"Fernanda F\u00e9lix\",c:\"Lisboa\",p:\"Portugal\",lat:38.7620,lng:-9.0940,prof:\"\",t:0,ig:[],web:\"\",course:\"Pranayamas\",photo:\"https:\/\/beyoga.pt\/wp-content\/uploads\/nsl_avatars\/a8d2e88f954af9f68c092d796320bce7.jpg\"},\n {n:\"Silvia Almeida\",c:\"Portalegre\",p:\"Portugal\",lat:39.2910,lng:-7.4320,prof:\"\",t:0,ig:[],web:\"\",course:\"Pranayamas\"},\n {n:\"Ana Roriz\",c:\"Santo Tirso\",p:\"Portugal\",lat:41.3420,lng:-8.4750,prof:\"\",t:0,ig:[],web:\"\",course:\"Medita\u00e7\u00e3o | Pranayamas\",photo:\"https:\/\/beyoga.pt\/wp-content\/uploads\/2025\/12\/IMG_2308.jpeg\"},\n {n:\"Sandra Tote Borges\",c:\"Praia da Vit\u00f3ria, A\u00e7ores\",p:\"Portugal\",lat:38.7330,lng:-27.0660,prof:\"\",t:0,ig:[],web:\"\",course:\"Medita\u00e7\u00e3o\"},\n {n:\"Paula Ladeira\",c:\"Proen\u00e7a-a-Nova\",p:\"Portugal\",lat:39.7550,lng:-7.9220,prof:\"\",t:0,ig:[],web:\"\",course:\"Yoga na Cadeira | Yoga Terap\u00eautico\"},\n {n:\"Maria Salvaterra\",c:\"Alter do Ch\u00e3o\",p:\"Portugal\",lat:39.1990,lng:-7.6590,prof:\"\",t:0,ig:[],web:\"\",course:\"Yoga na Cadeira\"}\n,\n {n:\"Mariana Serra\",c:\"Maia\",p:\"Portugal\",lat:41.235,lng:-8.6199,prof:\"Professora de Yoga e Terapeuta de Constela\u00e7\u00f5es Sist\u00e9micas\",t:2,ig:[\"raizesdami_bymarianaserra\"],web:\"\",course:\"Forma\u00e7\u00e3o 200H\",photo:\"https:\/\/beyoga.pt\/wp-content\/uploads\/2026\/06\/mariana-serra-mapa.jpg\",quote:\"Foi uma forma\u00e7\u00e3o rica de conte\u00fado, a professora Carla \u00e9 maravilhosa, e super dispon\u00edveis.\",fq:1},\n {n:\"N\u00e9lia Rodrigues\",c:\"Caldas da Rainha\",p:\"Portugal\",lat:39.4036,lng:-9.1359,prof:\"Professora de Yoga e Formadora\",t:2,ig:[\"neliar.yoga\"],web:\"\",course:\"Forma\u00e7\u00e3o 200H | Yin Yoga | Medita\u00e7\u00e3o\",photo:\"https:\/\/beyoga.pt\/wp-content\/uploads\/2026\/06\/nelia-rodrigues-mapa.jpg\",quote:\"Encontrei um espa\u00e7o de aprendizagem profunda, apoio e inspira\u00e7\u00e3o, que me deu as bases para construir o meu caminho. Sou profundamente grata pela qualidade da forma\u00e7\u00e3o, pela humaniza\u00e7\u00e3o e pelos valores que me foram transmitidos ao longo do percurso.\",fq:1},\n {n:\"Lu\u00eds Sanchez\",c:\"Pernes, Santar\u00e9m\",p:\"Portugal\",lat:39.4253,lng:-8.7016,prof:\"Instrutor de Yoga\",t:2,ig:[\"iam_luissanchez\"],web:\"\",course:\"Forma\u00e7\u00e3o 200H | Yoga Restaurativo\",photo:\"https:\/\/beyoga.pt\/wp-content\/uploads\/2026\/06\/luis-sanchez-mapa.jpg\",quote:\"Uma forma\u00e7\u00e3o extremamente completa, com um acompanhamento sempre presente. Uma experi\u00eancia verdadeiramente transformadora. A Carla Gon\u00e7alves \u00e9 um ser humano fant\u00e1stico, que nos faz acreditar em n\u00f3s mesmos!\",fq:1},\n {n:\"In\u00eas Afflalo\",c:\"Cascais\",p:\"Portugal\",lat:38.6979,lng:-9.4215,prof:\"Professora de Yoga e InnerMovement\",t:2,ig:[\"inesafflalo\"],web:\"linker.ee\/inesafflalo\",course:\"Forma\u00e7\u00e3o 200H\",photo:\"https:\/\/beyoga.pt\/wp-content\/uploads\/2026\/06\/ines-afflalo-mapa.jpg\",quote:\"A melhor mudan\u00e7a na minha vida.\",fq:1},\n {n:\"Carla Gon\u00e7alves\",c:\"Alc\u00e2ntara, Lisboa\",p:\"Portugal\",lat:38.7036,lng:-9.1772,prof:\"Fundadora BeYoga\",t:2,founder:1,ig:[\"carla.goncalves_beyoga\"],web:\"\",course:\"Forma\u00e7\u00e3o 200H | Forma\u00e7\u00e3o 300H | Yin Yoga | Yoga Nidra | Medita\u00e7\u00e3o | Yoga Restaurativo | Pranayamas | Yoga na Cadeira | Yoga Terap\u00eautico\",photo:\"https:\/\/beyoga.pt\/wp-content\/uploads\/2026\/06\/carla-goncalves-mapa.jpg\"}\n,\n{n:\"Raquel Gon\u00e7alves\",c:\"Amadora\",p:\"Portugal\",lat:38.7597,lng:-9.2398,prof:\"Professora de Yoga e Enfermeira\",t:1,ig:[\"raquelgoncalves.yoga\"],web:\"https:\/\/raquelgoncalves.com\",course:\"Forma\u00e7\u00e3o 200H\",photo:\"https:\/\/beyoga.pt\/wp-content\/uploads\/2026\/06\/raquel-goncalves-mapa.jpg\"},\n{n:\"\u00c2ngela Costa\",c:\"Alcoba\u00e7a\",p:\"Portugal\",lat:39.5526,lng:-8.9770,prof:\"\",t:1,ig:[],web:\"\",course:\"Forma\u00e7\u00e3o 200H\"},\n{n:\"Luany de Castro\",c:\"Bragan\u00e7a\",p:\"Portugal\",lat:41.8058,lng:-6.7567,prof:\"Professora de Yoga e Pilates\",t:2,ig:[\"luanycastroyoga\"],web:\"\",course:\"Forma\u00e7\u00e3o 200H\",photo:\"https:\/\/beyoga.pt\/wp-content\/uploads\/2026\/06\/luany-castro-mapa.jpg\",quote:\"A forma\u00e7\u00e3o do BeYoga significou para mim que estamos em constante evolu\u00e7\u00e3o, aprendendo e crescendo como pessoas, e a busca pelo conhecimento n\u00e3o tem fim. A import\u00e2ncia de dedicar tempo ao que acreditamos e o profissionalismo.\",fq:1},\n{n:\"Mafalda Silva\",c:\"Porto\",p:\"Portugal\",lat:41.1530,lng:-8.6000,prof:\"\",t:2,ig:[],web:\"\",course:\"Forma\u00e7\u00e3o 200H\"},\n{n:\"Leonor Almeida\",c:\"Guimar\u00e3es\",p:\"Portugal\",lat:41.4425,lng:-8.2918,prof:\"Enfermeira e Professora de Yoga\",t:0,ig:[],web:\"\",course:\"Forma\u00e7\u00e3o 200H\",photo:\"https:\/\/beyoga.pt\/wp-content\/uploads\/2026\/06\/leonor-almeida-mapa.jpg\"},{n:\"Joaquim Guerreiro\",c:\"Santar\u00e9m\",p:\"Portugal\",lat:39.2363,lng:-8.685,prof:\"\",t:0,ig:[\"raizdovento\"],web:\"\",course:\"Forma\u00e7\u00e3o 200H\"},{n:\"Rita Moreira\",c:\"Azeit\u00e3o\",p:\"Portugal\",lat:38.517,lng:-9.01,prof:\"\",t:0,ig:[\"rita_moreira03\"],web:\"\",course:\"Forma\u00e7\u00e3o 200H\"},{n:\"Thaisa Andrade\",c:\"Lisboa\",p:\"Portugal\",lat:38.7223,lng:-9.1393,prof:\"\",t:0,ig:[\"thaisagradim\"],web:\"\",course:\"Forma\u00e7\u00e3o 200H\",quote:\"Ao longo desta jornada com a BeYoga compreendi que o Yoga \u00e9 viv\u00eancia integrada, n\u00e3o apenas aprendizado. Sou grata \u00e0 Carla e \u00e0 Sabrina pelo cuidado e condu\u00e7\u00e3o na forma\u00e7\u00e3o.\"},{n:\"June Mainardi\",c:\"Set\u00fabal\",p:\"Portugal\",lat:38.5244,lng:-8.8882,prof:\"\",t:0,ig:[\"junemainardi\"],web:\"\",course:\"Forma\u00e7\u00e3o 200H\",quote:\"A forma\u00e7\u00e3o BeYoga \u00e9 muito mais que uma forma\u00e7\u00e3o. Profissionais super competentes e, acima de tudo, humanas. Foi uma experi\u00eancia maravilhosa.\"},{n:\"Ana Paula Carvalho\",c:\"Lisboa\",p:\"Portugal\",lat:38.771,lng:-9.162,prof:\"\",t:0,ig:[\"anacarvalho.carvalho\"],web:\"\",course:\"Forma\u00e7\u00e3o 200H\",photo:\"https:\/\/beyoga.pt\/wp-content\/uploads\/2026\/06\/ana-paula-carvalho-mapa.webp\"},{n:\"Maria Jo\u00e3o Silva\",c:\"Ramada\",p:\"Portugal\",lat:38.7986,lng:-9.1969,prof:\"\",t:0,ig:[],web:\"\",course:\"Forma\u00e7\u00e3o 200H\"},{n:\"Ana Rita Afonso\",c:\"Massam\u00e1\",p:\"Portugal\",lat:38.757,lng:-9.265,prof:\"Professora de Yoga \u00b7 Administrativa\",t:1,ig:[\"ritakali.yoga\"],web:\"\",course:\"Forma\u00e7\u00e3o 200H\",photo:\"https:\/\/beyoga.pt\/wp-content\/uploads\/2026\/07\/rita-afonso-mapa.jpg\",quote:\"Foi sem d\u00favida uma viagem incr\u00edvel. O curso est\u00e1 muito bem estruturado e senti-me acompanhada desde o primeiro dia.\"},{n:\"Iolanda Santos\",c:\"Aroeira\",p:\"Portugal\",lat:38.584,lng:-9.166,prof:\"\",t:0,ig:[],web:\"\",course:\"Forma\u00e7\u00e3o 200H\"},{n:\"Ana Leonardo\",c:\"Alenquer\",p:\"Portugal\",lat:39.0535,lng:-9.0093,prof:\"\",t:0,ig:[],web:\"\",course:\"Forma\u00e7\u00e3o 200H\"},{n:\"M\u00f3nica Bar\u00e3o\",c:\"P\u00earo Pinheiro\",p:\"Portugal\",lat:38.833,lng:-9.333,prof:\"\",t:0,ig:[],web:\"\",course:\"Forma\u00e7\u00e3o 200H\"},{n:\"Manuela Albuquerque\",c:\"Agualva-Cac\u00e9m\",p:\"Portugal\",lat:38.77,lng:-9.3,prof:\"\",t:0,ig:[],web:\"\",course:\"Forma\u00e7\u00e3o 200H\",photo:\"https:\/\/beyoga.pt\/wp-content\/uploads\/2026\/06\/manuela-albuquerque-mapa.webp\",quote:\"A forma\u00e7\u00e3o na BeYoga ofereceu-me crescimento pessoal e autoconhecimento. Bem estruturada e desafiante, com a exig\u00eancia necess\u00e1ria.\"},{n:\"Gina Pinho\",c:\"\u00c1gueda\",p:\"Portugal\",lat:40.578,lng:-8.445,prof:\"\",t:0,ig:[\"gina_pinho\"],web:\"\",course:\"Forma\u00e7\u00e3o 200H\",photo:\"https:\/\/beyoga.pt\/wp-content\/uploads\/2026\/06\/gina-pinho-mapa.webp\",quote:\"Escola muito madura no seu m\u00e9todo. Com rigor e consist\u00eancia, permitiram uma aprendizagem com tempo para a compreens\u00e3o e integra\u00e7\u00e3o dos conte\u00fados.\"},{n:\"Louane Mattos\",c:\"Figueira da Foz\",p:\"Portugal\",lat:40.1505,lng:-8.862,prof:\"\",t:0,ig:[\"louanemattos\"],web:\"\",course:\"Forma\u00e7\u00e3o 200H\",photo:\"https:\/\/beyoga.pt\/wp-content\/uploads\/2026\/06\/louane-mattos-mapa.webp\",quote:\"Excelente experi\u00eancia com a BeYoga.\"},{n:\"Raquel Correia\",c:\"Maia\",p:\"Portugal\",lat:41.2354,lng:-8.62,prof:\"\",t:0,ig:[\"araqueltc\",\"flyoga_raquelcorreia\"],web:\"\",course:\"Forma\u00e7\u00e3o 200H\",quote:\"Uma imers\u00e3o \u00fanica e aut\u00eantica, acompanhada por pessoas que inspiram e nos d\u00e3o uma vis\u00e3o contempor\u00e2nea de como o Yoga pode ser ajustado aos dias de hoje.\"},{n:\"B\u00e1rbara Ferreira\",c:\"Vizela\",p:\"Portugal\",lat:41.373,lng:-8.292,prof:\"\",t:0,ig:[],web:\"\",course:\"Forma\u00e7\u00e3o 200H\",quote:\"Integrei o curso da BeYoga e concluo-o com imenso orgulho pelo meu trajeto. Est\u00e1 muito bem estruturado nos seus m\u00f3dulos.\"},{n:\"Elsa Dam\u00e1sio\",c:\"Leiria\",p:\"Portugal\",lat:39.7495,lng:-8.807,prof:\"\",t:0,ig:[],web:\"\",course:\"Forma\u00e7\u00e3o 200H\",photo:\"https:\/\/beyoga.pt\/wp-content\/uploads\/2026\/06\/elsa-damasio-mapa.webp\"},{n:\"Carolina Apar\u00edcio\",c:\"Vila do Conde\",p:\"Portugal\",lat:41.353,lng:-8.744,prof:\"\",t:0,ig:[],web:\"\",course:\"Forma\u00e7\u00e3o 200H\"},{n:\"Rita Oliveira Santos\",c:\"Santa Maria da Feira\",p:\"Portugal\",lat:40.927,lng:-8.544,prof:\"\",t:0,ig:[\"champagneritsa\"],web:\"\",course:\"Forma\u00e7\u00e3o 200H\"},{n:\"St\u00e9phanie de Oliveira\",c:\"Vila Nova de Famalic\u00e3o\",p:\"Portugal\",lat:41.4085,lng:-8.519,prof:\"\",t:0,ig:[\"ste.canario\"],web:\"\",course:\"Forma\u00e7\u00e3o 200H\"},{n:\"Beatriz Aguiar\",c:\"Ovar\",p:\"Portugal\",lat:40.859,lng:-8.625,prof:\"Professora de Yoga\",t:1,ig:[],web:\"\",course:\"Forma\u00e7\u00e3o 200H\"},{n:\"Gabriela Mircea\",c:\"Aveiro\",p:\"Portugal\",lat:40.6405,lng:-8.6538,prof:\"\",t:0,ig:[\"veginlove.pt\"],web:\"\",course:\"Forma\u00e7\u00e3o 200H\"},{n:\"Maria Jo\u00e3o Cabral\",c:\"Porto\",p:\"Portugal\",lat:41.1579,lng:-8.6291,prof:\"\",t:0,ig:[],web:\"\",course:\"Forma\u00e7\u00e3o 200H\"},{n:\"Luciana Sanchez\",c:\"Freamunde\",p:\"Portugal\",lat:41.287,lng:-8.336,prof:\"\",t:0,ig:[],web:\"\",course:\"Forma\u00e7\u00e3o 200H\",quote:\"Estou muito feliz com esta forma\u00e7\u00e3o de yoga. A equipa \u00e9 incr\u00edvel, muito profissional e humana, sempre a acompanhar o processo de aprendizagem com proximidade e dedica\u00e7\u00e3o.\"},{n:\"Eduarda Maia\",c:\"\u00c1gueda\",p:\"Portugal\",lat:40.602,lng:-8.406,prof:\"\",t:0,ig:[],web:\"\",course:\"Forma\u00e7\u00e3o 200H\",quote:\"Fazer um curso na BeYoga \u00e9 um verdadeiro caminho de autoconhecimento e descoberta. Saio daqui com o cora\u00e7\u00e3o cheio e grata por ter escolhido esta escola.\"},\n {n:\"Beatriz Gomes\",c:\"Lourinh\u00e3\",p:\"Portugal\",lat:39.2015,lng:-9.3315,prof:\"Assistente de instrutor de surf\",t:0,ig:[],web:\"\",course:\"Forma\u00e7\u00e3o 200H\"},\n {n:\"Laurinda Isabel Mota\",c:\"Celorico de Basto\",p:\"Portugal\",lat:41.3879,lng:-8.0002,prof:\"Esteticista\",t:0,ig:[],web:\"\",course:\"Forma\u00e7\u00e3o 200H\"},\n {n:\"Maria Cord\u00e9lia Santos\",c:\"C\u00e2mara de Lobos\",p:\"Portugal\",lat:32.6485,lng:-16.9752,prof:\"Professora de yoga\",t:1,ig:[],web:\"\",course:\"Forma\u00e7\u00e3o 200H\",quote:\"Ter feito o curso na BeYoga foi uma experi\u00eancia transformadora do ponto de vista da aquisi\u00e7\u00e3o de conhecimentos t\u00e9cnicos e tamb\u00e9m de crescimento e desenvolvimento humano. A prof Carla e a equipa d\u00e3o literalmente tudo e isso faz a diferen\u00e7a no modo como somos acolhidos, instru\u00eddos, incentivados e envolvidos.\"},\n {n:\"Marina Fernandes\",c:\"Lisboa\",p:\"Portugal\",lat:38.7223,lng:-9.1393,prof:\"Professora de yoga e pilates\",t:1,ig:[\"marinafernandes_yoga\"],web:\"\",course:\"Forma\u00e7\u00e3o 200H\",quote:\"A forma\u00e7\u00e3o de yoga foi incr\u00edvel, desde o conte\u00fado, que foi muito interessante e relevante, \u00e0 forma leve e did\u00e1tica como foi lecionado. Foi-nos dado sempre apoio mesmo fora dos momentos de encontros, o que ajudou bastante a tirar d\u00favidas e a evoluir na nossa aprendizagem. A entrega da professora Carla fez toda a diferen\u00e7a, foi f\u00e1cil aprender e ficar cada vez mais apaixonada pelo yoga.\"},\n {n:\"Marisa Costa\",c:\"Mafra\",p:\"Portugal\",lat:38.9179,lng:-9.3206,prof:\"Fisioterapeuta\",t:0,ig:[],web:\"\",course:\"Forma\u00e7\u00e3o 200H\"},\n \n {n:\"Andrea Soares\",c:\"Quinta do Anjo\",p:\"Portugal\",lat:38.5675,lng:-8.9419,prof:\"Professora de yoga, cantora, artes\u00e3 e stylist\",t:1,ig:[\"andyoga.flow\"],web:\"\",course:\"Forma\u00e7\u00e3o 200H\",quote:\"A forma\u00e7\u00e3o BeYoga mudou a minha vida. A Carla \u00e9 a melhor mentora, que mesmo depois de terminada a forma\u00e7\u00e3o continua a apoiar e abra\u00e7ar. Muito grata\",fq:1,photo:\"https:\/\/beyoga.pt\/wp-content\/uploads\/2026\/06\/andrea-soares-mapa.jpg\"}\n,{n:\"Daniela Salgueiro\",c:\"Barcelos\",p:\"Portugal\",lat:41.5388,lng:-8.6151,prof:\"Professora de Yoga \u00b7 Os Salgueirinhos\",t:2,ig:[],web:\"\",course:\"Forma\u00e7\u00e3o 200H\"},{n:\"Maria Rui\",c:\"Peniche\",p:\"Portugal\",lat:39.3567,lng:-9.3811,prof:\"Professora de Yoga e Surf Yoga \u00b7 MARYOGA\",t:2,ig:[\"_maryoga\"],web:\"\",course:\"Forma\u00e7\u00e3o 200H\",photo:\"https:\/\/beyoga.pt\/wp-content\/uploads\/2026\/07\/maria-rui-mapa.jpg\",quote:\"Um sonho tornado realidade! Uma forma\u00e7\u00e3o super enriquecedora, super completa, com uma equipa incr\u00edvel, em especial a minha prof Carla. Superou as minhas expectativas!\",fq:1}];\n\nconst TEACH_LBL = {2:\"Teaching\", 1:\"Aulas pontuais\", 0:\"\"};\nconst igUrl = h => \"https:\/\/www.instagram.com\/\" + h.replace(\/^@\/,\"\");\nconst initials = n => { const w = n.trim().split(\/\\s+\/); return (w[0][0] + (w.length>1 ? w[w.length-1][0] : \"\")).toUpperCase(); };\nconst esc = s => s.replace(\/&\/g,\"&amp;\").replace(\/<\/g,\"&lt;\").replace(\/\"\/g,\"&quot;\");\n\nconst ICON_IG = '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"2\" y=\"2\" width=\"20\" height=\"20\" rx=\"5\"\/><circle cx=\"12\" cy=\"12\" r=\"4\"\/><line x1=\"17.5\" y1=\"6.5\" x2=\"17.5\" y2=\"6.5\"\/><\/svg>';\nconst ICON_WEB = '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"10\"\/><line x1=\"2\" y1=\"12\" x2=\"22\" y2=\"12\"\/><path d=\"M12 2a15.3 15.3 0 0 1 4 10 15.3 15.3 0 0 1-4 10 15.3 15.3 0 0 1-4-10 15.3 15.3 0 0 1 4-10z\"\/><\/svg>';\nconst ICON_PIN = '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M21 10c0 7-9 13-9 13s-9-6-9-13a9 9 0 0 1 18 0z\"\/><circle cx=\"12\" cy=\"10\" r=\"3\"\/><\/svg>';\n\nfunction avatar(a){\n  const style = a.photo ? ` style=\"background-image:url('${esc(a.photo)}')\"` : \"\";\n  return `<div class=\"by-avatar\"${style} aria-hidden=\"true\">${a.photo ? \"\" : initials(a.n)}<\/div>`;\n}\nfunction linksHtml(a){\n  let h = \"\";\n  a.ig.forEach(g => h += `<a class=\"by-link\" href=\"${igUrl(g)}\" target=\"_blank\" rel=\"noopener\">${ICON_IG}@${esc(g.replace(\/^@\/,\"\"))}<\/a>`);\n  if(a.web) h += `<a class=\"by-link\" href=\"${esc(a.web)}\" target=\"_blank\" rel=\"noopener\">${ICON_WEB}Website<\/a>`;\n  return h;\n}\nfunction badgesHtml(a){\n  let h = a.course.split(\" | \").map(c=>`<span class=\"by-badge\">${({\"Forma\u00e7\u00e3o 200H\":\"200H Training\",\"Forma\u00e7\u00e3o 300H\":\"300H Training\",\"Medita\u00e7\u00e3o\":\"Meditation\",\"Yoga Restaurativo\":\"Restorative Yoga\",\"Restaurativo\":\"Restorative\",\"Yoga na Cadeira\":\"Chair Yoga\",\"Cadeira\":\"Chair\",\"Yoga Terap\u00eautico\":\"Therapeutic Yoga\",\"Terap\u00eautico\":\"Therapeutic\",\"Pranayamas\":\"Pranayama\"})[c]||c}<\/span>`).join(\"\");\n  if(a.t > 0) h += `<span class=\"by-badge teaching\">${TEACH_LBL[a.t]}<\/span>`;\n  return h;\n}\n\n\/* ===== MAP ===== *\/\nlet map=null,cluster=null,mkPin=null; try{ map = L.map(\"map\", {scrollWheelZoom:false}).setView([39.6, -8.5], 7);\nL.tileLayer(\"https:\/\/{s}.basemaps.cartocdn.com\/rastertiles\/voyager\/{z}\/{x}\/{y}{r}.png\",{\n  attribution:'&copy; <a href=\"https:\/\/www.openstreetmap.org\/copyright\">OpenStreetMap<\/a> &copy; <a href=\"https:\/\/carto.com\/\">CARTO<\/a>', maxZoom:18\n}).addTo(map);\n\ncluster = L.markerClusterGroup({\n  showCoverageOnHover:false, maxClusterRadius:45,\n  iconCreateFunction: c => L.divIcon({html:`<div class=\"by-cluster\" style=\"width:44px;height:44px\">${c.getChildCount()}<\/div>`, className:\"\", iconSize:[44,44]})\n});\nmap.addLayer(cluster);\n\nmkPin = (teach,founder) => L.divIcon({html:`<div class=\"by-pin${teach?\" teach\":\"\"}${founder?\" founder\":\"\"}\"><span>\u0950<\/span><\/div>`, className:\"\", iconSize:[34,34], iconAnchor:[17,34], popupAnchor:[0,-36]}); } catch(_e){ console.warn(\"Mapa indispon\u00edvel:\", _e); var _mE=document.getElementById(\"map\"); if(_mE){_mE.style.display=\"none\";} }\n\nlet markers = [];\nfunction buildMarkers(list){\n  if(!map||!cluster){return;} cluster.clearLayers(); markers = [];\n  list.forEach(a => {\n    const m = L.marker([a.lat, a.lng], {icon:mkPin(a.t>0,a.founder), alt:a.n});\n    m.bindPopup(`<div class=\"by-pop${a.founder?' by-pop-founder':''}\">${a.founder?'<img decoding=\"async\" class=\"by-eryt-img\" src=\"\/wp-content\/uploads\/2026\/04\/ERYT500.png\" alt=\"E-RYT 500 Yoga Alliance\">':''}\n      <div class=\"top\">${avatar(a)}<div><h3>${esc(a.n)}<\/h3><div class=\"city\">${esc(a.c)}${a.founder?\"\":\", \"+esc(a.p)}<\/div><\/div><\/div>\n      <div class=\"badges\">${badgesHtml(a)}<\/div>\n      ${a.prof ? `<p class=\"prof\">${esc(a.prof)}<\/p>` : \"\"}\n      <div class=\"links\">${linksHtml(a)}<\/div>\n    <\/div>`);\n    markers.push(m); cluster.addLayer(m);\n  });\n}\n\n\/* ===== CARDS ===== *\/\nconst grid = document.getElementById(\"grid\");\nfunction cardInner(a){\n  return `${a.founder?'<img decoding=\"async\" class=\"by-eryt-img\" src=\"\/wp-content\/uploads\/2026\/04\/ERYT500.png\" alt=\"E-RYT 500 Yoga Alliance\">':''}<div class=\"head\">${avatar(a)}<div><h3>${esc(a.n)}<\/h3><div class=\"city\">${ICON_PIN}${esc(a.c)}${a.founder?\"\":\", \"+esc(a.p)}<\/div><\/div><\/div>\n    <div class=\"badges\">${badgesHtml(a)}<\/div>\n    ${a.prof ? `<p class=\"prof\">${esc(a.prof)}<\/p>` : \"\"}\n    ${a.quote ? `<p class=\"by-quote\">\u201c${esc(a.quote)}\u201d${a.fq ? \"\" : '<a href=\"https:\/\/www.google.com\/maps\/place\/BeYoga+School\/@38.7059254,-9.1810641,17z\/data=!4m6!3m5!1s0xad91f2e9228ae25b:0x97b0824fcce5b7de!8m2!3d38.7059254!4d-9.1810641!16s%2Fg%2F11vy_f9vb2\" target=\"_blank\" rel=\"noopener\">\u2605 See the review on Google<\/a>'}<\/p>` : \"\"}\n    <div class=\"links\">${linksHtml(a)}<\/div>`;\n}\nfunction buildCards(list){\n  \/\/ destaques: foto + testemunho (fixos, independentes do filtro)\n  \/\/ Em destaque: sorteio rotativo entre todos os que t\u00eam testemunho (fotos primeiro)\n  const pool = ALUNOS.filter(a=>a.quote||a.founder);\n  const sorteio = pool.map(a=>[Math.random(),a]).sort((x,y)=>x[0]-y[0]).map(x=>x[1]).slice(0,6);\n  const feat = sorteio.filter(a=>a.photo).concat(sorteio.filter(a=>!a.photo));\n  document.getElementById(\"featured\").innerHTML = feat.map(a=>`<article class=\"by-card\">${cardInner(a)}<\/article>`).join(\"\");\n  \/\/ diret\u00f3rio A-Z\n  const sorted=[...list].sort((x,y)=>x.n.localeCompare(y.n,'pt'));\n  const groups={};\n  sorted.forEach(a=>{const L=a.n.normalize('NFD').replace(\/[\\u0300-\\u036f]\/g,'')[0].toUpperCase();(groups[L]=groups[L]||[]).push(a)});\n  const letters=Object.keys(groups).sort();\n  document.getElementById(\"aznav\").innerHTML=letters.map(L=>`<a href=\"#az-${L}\">${L}<\/a>`).join(\"\");\n  grid.innerHTML=letters.map(L=>`<div class=\"by-azgroup\"><div class=\"by-azletter\" id=\"az-${L}\">${L}<\/div>`+\n    groups[L].map(a=>`<details class=\"by-row\"><summary>${avatar(a)}<div><div class=\"rn\">${esc(a.n)}<\/div><div class=\"rc\">${esc(a.c)}<\/div><\/div><span class=\"rdot${a.t>0?\" teach\":\"\"}\" title=\"${a.t>0?\"Teaching\":\"\"}\"><\/span><\/summary><div class=\"rbody by-card\">${cardInner(a)}<\/div><\/details>`).join(\"\")+`<\/div>`).join(\"\");\n  document.getElementById(\"empty\").style.display = list.length ? \"none\" : \"block\";\n}\n\n\/* ===== FILTERS \/ STATE ===== *\/\nlet fCourse = \"all\", fTeaching = false, fSearch = \"\";\nfunction apply(){\n  const list = ALUNOS.filter(a =>\n    (fCourse === \"all\" || a.course.split(\" | \").includes(fCourse)) &&\n    (!fTeaching || a.t > 0) &&\n    (!fSearch || (a.n + \" \" + a.c + \" \" + a.prof).toLowerCase().includes(fSearch))\n  );\n  buildMarkers(list); buildCards(list);\n  document.getElementById(\"count\").textContent = list.length + \" \" + (list.length === 1 ? \"aluno\" : \"alunos\");\n}\ndocument.querySelectorAll(\".by-chip[data-course]\").forEach(b => b.addEventListener(\"click\", () => {\n  document.querySelectorAll(\".by-chip[data-course]\").forEach(x => x.classList.remove(\"active\"));\n  b.classList.add(\"active\"); fCourse = b.dataset.course; apply();\n}));\ndocument.getElementById(\"chip-teaching\").addEventListener(\"click\", e => { e.target.classList.toggle(\"active\"); fTeaching = !fTeaching; apply(); });\ndocument.getElementById(\"search\").addEventListener(\"input\", e => { fSearch = e.target.value.trim().toLowerCase(); apply(); });\n\n\/* ===== STATS ===== *\/\nfunction animate(el, target){\n  let cur = 0; const step = Math.max(1, Math.round(target\/40));\n  const t = setInterval(() => { cur = Math.min(target, cur + step); el.textContent = cur; if(cur >= target) clearInterval(t); }, 30);\n}\nanimate(document.getElementById(\"stat-alunos\"), ALUNOS.length);\nanimate(document.getElementById(\"stat-cidades\"), new Set(ALUNOS.map(a => a.c)).size);\nanimate(document.getElementById(\"stat-paises\"), new Set(ALUNOS.map(a => a.p)).size);\nanimate(document.getElementById(\"stat-aulas\"), ALUNOS.filter(a => a.t > 0).length);\n\napply();\n<\/script>\n<\/div>\n\n\n<style>\n.by-map-fallback{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;text-align:center;padding:24px;background:var(--by-sage,#eef0ea);color:var(--by-terra,#b15a3c);font-family:var(--font-heading,inherit);border-radius:inherit;z-index:600;line-height:1.5}\n.by-map-fallback strong{font-size:18px;display:block;margin-bottom:6px}\n.by-map-fallback a{color:var(--by-terra,#b15a3c);text-decoration:underline;font-weight:600}\n<\/style>\n<script>\n(function(){\n  var mapEl=document.getElementById('map');\n  if(!mapEl) return;\n  function nudge(){try{window.dispatchEvent(new Event('resize'));}catch(e){}}\n  window.addEventListener('load',function(){setTimeout(nudge,300);setTimeout(nudge,1200);});\n  document.addEventListener('visibilitychange',function(){if(!document.hidden)setTimeout(nudge,200);});\n  var shown=false;\n  function showFallback(){\n    if(shown||mapEl.querySelector('.leaflet-tile-loaded'))return;\n    shown=true;\n    var d=document.createElement('div');\n    d.className='by-map-fallback';\n    d.innerHTML='<div><strong>N\u00e3o foi poss\u00edvel carregar o mapa interativo.<\/strong>Pode estar a ser bloqueado pelo teu browser ou rede. A <a href=\"#aznav\">lista completa de professores<\/a> est\u00e1 logo abaixo.<\/div>';\n    mapEl.appendChild(d);\n  }\n  var errors=0;\n  mapEl.addEventListener('error',function(e){\n    var t=e.target;\n    if(t&&t.classList&&t.classList.contains('leaflet-tile')){errors++;if(errors>=4)showFallback();}\n  },true);\n  mapEl.addEventListener('load',function(e){\n    var t=e.target;\n    if(t&&t.classList&&t.classList.contains('leaflet-tile')){var f=mapEl.querySelector('.by-map-fallback');if(f){f.remove();shown=false;}}\n  },true);\n  setTimeout(function(){if(!mapEl.querySelector('.leaflet-tile-loaded'))showFallback();},9000);\n})();\n<\/script>","protected":false},"excerpt":{"rendered":"<p>BeYoga Community BeYogaspread across the map Every pin is someone who trained at BeYoga and carries yoga with them. Some teach in studios, schools and practices, and some live yoga day to day, at work and in their community. They are all part of this story. Looking for classes? Filter by &#8220;Teaching&#8221; and find a [&hellip;]<\/p>\n","protected":false},"author":24,"featured_media":29740,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"dificuldade":[],"tempo":[],"intensidade":[],"tema":[],"class_list":["post-29739","page","type-page","status-publish","has-post-thumbnail","hentry"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.0 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Community Map | Teachers Trained by BeYoga School<\/title>\n<meta name=\"description\" content=\"The official map of BeYoga graduates: 167 students across 103 cities and 5 countries. Find a certified yoga teacher near you.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/beyoga.pt\/en\/graduate-map\/\" \/>\n<meta property=\"og:locale\" content=\"pt_PT\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Community Map | Teachers Trained by BeYoga School\" \/>\n<meta property=\"og:description\" content=\"The official map of BeYoga graduates: 167 students across 103 cities and 5 countries. Find a certified yoga teacher near you.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/beyoga.pt\/en\/graduate-map\/\" \/>\n<meta property=\"og:site_name\" content=\"BeYoga\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/BeYogabyCarlaGoncalves\" \/>\n<meta property=\"article:modified_time\" content=\"2026-07-16T20:09:41+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/beyoga.pt\/wp-content\/uploads\/2026\/06\/mapa-comunidade-beyoga-og.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"630\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"17 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/beyoga.pt\\\/en\\\/graduate-map\\\/\",\"url\":\"https:\\\/\\\/beyoga.pt\\\/en\\\/graduate-map\\\/\",\"name\":\"Community Map | Teachers Trained by BeYoga School\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/beyoga.pt\\\/en\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/beyoga.pt\\\/en\\\/graduate-map\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/beyoga.pt\\\/en\\\/graduate-map\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/beyoga.pt\\\/wp-content\\\/uploads\\\/2026\\\/06\\\/mapa-comunidade-beyoga-og.jpg\",\"datePublished\":\"2026-06-22T17:30:24+00:00\",\"dateModified\":\"2026-07-16T20:09:41+00:00\",\"description\":\"The official map of BeYoga graduates: 167 students across 103 cities and 5 countries. Find a certified yoga teacher near you.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/beyoga.pt\\\/en\\\/graduate-map\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/beyoga.pt\\\/en\\\/graduate-map\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/beyoga.pt\\\/en\\\/graduate-map\\\/#primaryimage\",\"url\":\"https:\\\/\\\/beyoga.pt\\\/wp-content\\\/uploads\\\/2026\\\/06\\\/mapa-comunidade-beyoga-og.jpg\",\"contentUrl\":\"https:\\\/\\\/beyoga.pt\\\/wp-content\\\/uploads\\\/2026\\\/06\\\/mapa-comunidade-beyoga-og.jpg\",\"width\":1200,\"height\":630,\"caption\":\"Mapa de Portugal com os pins dos alunos formados pela BeYoga\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/beyoga.pt\\\/en\\\/graduate-map\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"In\u00edcio\",\"item\":\"https:\\\/\\\/beyoga.pt\\\/en\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Community Map | Teachers Trained by BeYoga\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/beyoga.pt\\\/en\\\/#website\",\"url\":\"https:\\\/\\\/beyoga.pt\\\/en\\\/\",\"name\":\"BeYoga School\",\"description\":\"Escola de Yoga em Portugal \u2014 Forma\u00e7\u00e3o Certificada Yoga Alliance, DGERT e IPDJ\",\"publisher\":{\"@id\":\"https:\\\/\\\/beyoga.pt\\\/en\\\/#organization\"},\"alternateName\":\"BeYoga\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/beyoga.pt\\\/en\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/beyoga.pt\\\/en\\\/#organization\",\"name\":\"BeYoga\",\"alternateName\":\"BeYoga\",\"url\":\"https:\\\/\\\/beyoga.pt\\\/en\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/beyoga.pt\\\/en\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/beyoga.pt\\\/wp-content\\\/uploads\\\/2026\\\/04\\\/logo-quadrado.jpg\",\"contentUrl\":\"https:\\\/\\\/beyoga.pt\\\/wp-content\\\/uploads\\\/2026\\\/04\\\/logo-quadrado.jpg\",\"width\":625,\"height\":621,\"caption\":\"BeYoga\"},\"image\":{\"@id\":\"https:\\\/\\\/beyoga.pt\\\/en\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.instagram.com\\\/beyoga.pt\",\"https:\\\/\\\/www.facebook.com\\\/BeYogabyCarlaGoncalves\",\"https:\\\/\\\/www.linkedin.com\\\/in\\\/carlabeyoga\\\/\",\"https:\\\/\\\/www.youtube.com\\\/@BeYogaSchool\"],\"foundingDate\":\"2018\",\"founder\":{\"@type\":\"Person\",\"name\":\"Carla Gon\u00e7alves\",\"jobTitle\":\"Fundadora e Professora Principal (E-RYT 500)\"},\"description\":\"Escola de forma\u00e7\u00e3o de professores de yoga em Portugal, certificada pela DGERT e reconhecida pelo IPDJ. Registered Yoga School (RYS 200 e RYS 300) pela Yoga Alliance. Mais de 200 professores formados desde 2018.\",\"knowsAbout\":[\"Yoga\",\"Forma\u00e7\u00e3o de professores de yoga\",\"Medita\u00e7\u00e3o\",\"Pranayama\",\"Yoga Nidra\",\"Yin Yoga\",\"Yoga Terap\u00eautico\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Community Map | Teachers Trained by BeYoga School","description":"The official map of BeYoga graduates: 167 students across 103 cities and 5 countries. Find a certified yoga teacher near you.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/beyoga.pt\/en\/graduate-map\/","og_locale":"pt_PT","og_type":"article","og_title":"Community Map | Teachers Trained by BeYoga School","og_description":"The official map of BeYoga graduates: 167 students across 103 cities and 5 countries. Find a certified yoga teacher near you.","og_url":"https:\/\/beyoga.pt\/en\/graduate-map\/","og_site_name":"BeYoga","article_publisher":"https:\/\/www.facebook.com\/BeYogabyCarlaGoncalves","article_modified_time":"2026-07-16T20:09:41+00:00","og_image":[{"width":1200,"height":630,"url":"https:\/\/beyoga.pt\/wp-content\/uploads\/2026\/06\/mapa-comunidade-beyoga-og.jpg","type":"image\/jpeg"}],"twitter_card":"summary_large_image","twitter_misc":{"Est. reading time":"17 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/beyoga.pt\/en\/graduate-map\/","url":"https:\/\/beyoga.pt\/en\/graduate-map\/","name":"Community Map | Teachers Trained by BeYoga School","isPartOf":{"@id":"https:\/\/beyoga.pt\/en\/#website"},"primaryImageOfPage":{"@id":"https:\/\/beyoga.pt\/en\/graduate-map\/#primaryimage"},"image":{"@id":"https:\/\/beyoga.pt\/en\/graduate-map\/#primaryimage"},"thumbnailUrl":"https:\/\/beyoga.pt\/wp-content\/uploads\/2026\/06\/mapa-comunidade-beyoga-og.jpg","datePublished":"2026-06-22T17:30:24+00:00","dateModified":"2026-07-16T20:09:41+00:00","description":"The official map of BeYoga graduates: 167 students across 103 cities and 5 countries. Find a certified yoga teacher near you.","breadcrumb":{"@id":"https:\/\/beyoga.pt\/en\/graduate-map\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/beyoga.pt\/en\/graduate-map\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/beyoga.pt\/en\/graduate-map\/#primaryimage","url":"https:\/\/beyoga.pt\/wp-content\/uploads\/2026\/06\/mapa-comunidade-beyoga-og.jpg","contentUrl":"https:\/\/beyoga.pt\/wp-content\/uploads\/2026\/06\/mapa-comunidade-beyoga-og.jpg","width":1200,"height":630,"caption":"Mapa de Portugal com os pins dos alunos formados pela BeYoga"},{"@type":"BreadcrumbList","@id":"https:\/\/beyoga.pt\/en\/graduate-map\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"In\u00edcio","item":"https:\/\/beyoga.pt\/en\/"},{"@type":"ListItem","position":2,"name":"Community Map | Teachers Trained by BeYoga"}]},{"@type":"WebSite","@id":"https:\/\/beyoga.pt\/en\/#website","url":"https:\/\/beyoga.pt\/en\/","name":"BeYoga School","description":"Escola de Yoga em Portugal \u2014 Forma\u00e7\u00e3o Certificada Yoga Alliance, DGERT e IPDJ","publisher":{"@id":"https:\/\/beyoga.pt\/en\/#organization"},"alternateName":"BeYoga","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/beyoga.pt\/en\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/beyoga.pt\/en\/#organization","name":"BeYoga","alternateName":"BeYoga","url":"https:\/\/beyoga.pt\/en\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/beyoga.pt\/en\/#\/schema\/logo\/image\/","url":"https:\/\/beyoga.pt\/wp-content\/uploads\/2026\/04\/logo-quadrado.jpg","contentUrl":"https:\/\/beyoga.pt\/wp-content\/uploads\/2026\/04\/logo-quadrado.jpg","width":625,"height":621,"caption":"BeYoga"},"image":{"@id":"https:\/\/beyoga.pt\/en\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.instagram.com\/beyoga.pt","https:\/\/www.facebook.com\/BeYogabyCarlaGoncalves","https:\/\/www.linkedin.com\/in\/carlabeyoga\/","https:\/\/www.youtube.com\/@BeYogaSchool"],"foundingDate":"2018","founder":{"@type":"Person","name":"Carla Gon\u00e7alves","jobTitle":"Fundadora e Professora Principal (E-RYT 500)"},"description":"Escola de forma\u00e7\u00e3o de professores de yoga em Portugal, certificada pela DGERT e reconhecida pelo IPDJ. Registered Yoga School (RYS 200 e RYS 300) pela Yoga Alliance. Mais de 200 professores formados desde 2018.","knowsAbout":["Yoga","Forma\u00e7\u00e3o de professores de yoga","Medita\u00e7\u00e3o","Pranayama","Yoga Nidra","Yin Yoga","Yoga Terap\u00eautico"]}]}},"_links":{"self":[{"href":"https:\/\/beyoga.pt\/en\/wp-json\/wp\/v2\/pages\/29739","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/beyoga.pt\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/beyoga.pt\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/beyoga.pt\/en\/wp-json\/wp\/v2\/users\/24"}],"replies":[{"embeddable":true,"href":"https:\/\/beyoga.pt\/en\/wp-json\/wp\/v2\/comments?post=29739"}],"version-history":[{"count":16,"href":"https:\/\/beyoga.pt\/en\/wp-json\/wp\/v2\/pages\/29739\/revisions"}],"predecessor-version":[{"id":31130,"href":"https:\/\/beyoga.pt\/en\/wp-json\/wp\/v2\/pages\/29739\/revisions\/31130"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/beyoga.pt\/en\/wp-json\/wp\/v2\/media\/29740"}],"wp:attachment":[{"href":"https:\/\/beyoga.pt\/en\/wp-json\/wp\/v2\/media?parent=29739"}],"wp:term":[{"taxonomy":"dificuldade","embeddable":true,"href":"https:\/\/beyoga.pt\/en\/wp-json\/wp\/v2\/dificuldade?post=29739"},{"taxonomy":"tempo","embeddable":true,"href":"https:\/\/beyoga.pt\/en\/wp-json\/wp\/v2\/tempo?post=29739"},{"taxonomy":"intensidade","embeddable":true,"href":"https:\/\/beyoga.pt\/en\/wp-json\/wp\/v2\/intensidade?post=29739"},{"taxonomy":"tema","embeddable":true,"href":"https:\/\/beyoga.pt\/en\/wp-json\/wp\/v2\/tema?post=29739"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}