{"id":863,"date":"2026-10-24T15:25:27","date_gmt":"2026-10-24T14:25:27","guid":{"rendered":"https:\/\/expertive.hr\/?page_id=863"},"modified":"2026-10-27T15:50:36","modified_gmt":"2026-10-27T14:50:36","slug":"skills-matrix","status":"publish","type":"page","link":"https:\/\/expertive.hr\/en\/skills-matrix\/","title":{"rendered":"Skills Matrix"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"863\" class=\"elementor elementor-863 elementor-736\" data-elementor-post-type=\"page\">\n\t\t\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-70f20180 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"70f20180\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-5536598\" data-id=\"5536598\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-74af717c elementor-widget elementor-widget-text-editor\" data-id=\"74af717c\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\n\n<div id=\"expertive-matrica\" lang=\"en\">\n<style>\n#expertive-matrica{\n  --ground:#F4F6FA; --surface:#FFFFFF; --ink:#1A1A1A; --muted:#5A6477;\n  --line:#D9E1EE; --accent:#1F3864; --accent-ink:#FFFFFF; --pale:#B9CDE9;\n  --pale-soft:#E8EFF8; --warn:#9A5B00; --warn-bg:#FFF4E0; --good:#1E6B45; --bad:#A3302A; --below:#B4572A;\n  --serif:Georgia,\"Times New Roman\",serif;\n  --sans:system-ui,-apple-system,\"Segoe UI\",Roboto,Arial,sans-serif;\n  background:var(--ground);color:var(--ink);font-family:var(--sans);font-size:15px;line-height:1.55;\n  padding:24px 16px 48px;border-radius:12px;text-align:left;\n}\n#expertive-matrica *{box-sizing:border-box;letter-spacing:normal;text-transform:none}\n#expertive-matrica .xm-wrap{max-width:760px;margin:0 auto;display:flex;flex-direction:column;gap:20px}\n#expertive-matrica .xm-brand{display:flex;justify-content:space-between;align-items:baseline;gap:12px;flex-wrap:wrap;border-bottom:1px solid var(--line);padding-bottom:12px}\n#expertive-matrica .xm-brand .xm-name{font-family:var(--serif);font-size:20px;font-weight:600;color:var(--accent)}\n#expertive-matrica .xm-right{display:flex;gap:14px;align-items:baseline;flex-wrap:wrap}\n#expertive-matrica .xm-lang{font-size:12px;letter-spacing:.08em;color:var(--muted)}\n#expertive-matrica .xm-lang a{color:var(--accent);font-weight:600;text-decoration:none}\n#expertive-matrica .xm-lang b{color:var(--ink)}\n#expertive-matrica .xm-tag,#expertive-matrica .xm-eyebrow{font-size:12px;letter-spacing:.08em;text-transform:uppercase;color:var(--muted)}\n#expertive-matrica h1,#expertive-matrica h2,#expertive-matrica h3{font-family:var(--serif);font-weight:600;margin:0;line-height:1.2;color:var(--ink);padding:0;border:0;background:none}\n#expertive-matrica h1{font-size:30px}\n#expertive-matrica h2{font-size:24px}\n#expertive-matrica p{margin:0;padding:0;color:inherit;font-size:inherit;line-height:inherit}\n#expertive-matrica .xm-lede{color:var(--muted);max-width:62ch}\n#expertive-matrica .xm-panel{background:var(--surface);border:1px solid var(--line);border-radius:10px;padding:20px;display:flex;flex-direction:column;gap:14px}\n#expertive-matrica .xm-note{font-size:13px;color:var(--muted);border-left:3px solid var(--pale);padding-left:12px}\n#expertive-matrica .xm-note a{color:var(--accent);font-weight:bold;text-decoration:underline}\n#expertive-matrica .xm-roles{display:grid;grid-template-columns:repeat(auto-fit,minmax(160px,1fr));gap:10px}\n#expertive-matrica button{font-family:var(--sans)!important;font-size:15px!important;line-height:1.3!important;text-shadow:none!important;min-height:0!important;margin:0!important;width:auto!important;text-transform:none!important;letter-spacing:normal!important}\n#expertive-matrica button.xm-role,#expertive-matrica button.xm-role:hover,#expertive-matrica button.xm-role:focus{background:var(--surface)!important;color:var(--ink)!important;border:1px solid var(--line)!important;border-radius:8px!important;padding:14px!important}\n#expertive-matrica button.xm-role[aria-pressed=\"true\"]{background:var(--pale-soft)!important;border-color:var(--accent)!important}\n#expertive-matrica button.xm-role{border:1px solid var(--line);background:var(--surface);color:var(--ink);border-radius:8px;padding:14px;text-align:left;cursor:pointer;display:flex;flex-direction:column;gap:2px;white-space:normal}\n#expertive-matrica .xm-role b{font-size:15px;color:var(--ink)}\n#expertive-matrica .xm-role span{font-size:13px;color:var(--muted)}\n#expertive-matrica button.xm-role[aria-pressed=\"true\"]{border-color:var(--accent);box-shadow:inset 0 0 0 1px var(--accent);background:var(--pale-soft)}\n#expertive-matrica button.xm-primary,#expertive-matrica button.xm-primary:hover,#expertive-matrica button.xm-primary:focus{background:var(--accent)!important;color:var(--accent-ink)!important;border:0!important;border-radius:8px!important;padding:12px 18px!important;font-weight:600!important;cursor:pointer}\n#expertive-matrica button.xm-ghost,#expertive-matrica button.xm-ghost:hover,#expertive-matrica button.xm-ghost:focus{background:transparent!important;color:var(--accent)!important;border:1px solid var(--line)!important;border-radius:8px!important;padding:11px 16px!important;font-weight:500!important;cursor:pointer}\n#expertive-matrica button:disabled{opacity:.45;cursor:not-allowed}\n#expertive-matrica .xm-seg-v{flex-direction:column;gap:6px}\n#expertive-matrica .xm-seg-v label{text-align:left}\n#expertive-matrica button:focus-visible,#expertive-matrica .xm-seg input:focus-visible+span{outline:2px solid var(--accent);outline-offset:2px}\n#expertive-matrica .xm-progress{display:flex;align-items:center;gap:12px;font-size:13px;color:var(--muted);font-variant-numeric:tabular-nums}\n#expertive-matrica .xm-bar{flex:1;height:4px;background:var(--line);border-radius:2px;overflow:hidden}\n#expertive-matrica .xm-bar i{display:block;height:100%;background:var(--accent)}\n#expertive-matrica .xm-intro-q{font-family:var(--serif);font-size:19px;font-style:italic}\n#expertive-matrica [hidden]{display:none !important}\n#expertive-matrica .xm-legend-s{font-size:12px;color:var(--muted)}\n#expertive-matrica .xm-reminder{display:block;margin-top:2px;font-style:italic;color:var(--accent)}\n#expertive-matrica .xm-stmt{display:flex;flex-direction:column;gap:8px;padding:14px 0;border-top:1px solid var(--line)}\n#expertive-matrica .xm-stmt:first-child{border-top:0}\n#expertive-matrica .xm-seg{display:grid;grid-template-columns:repeat(4,1fr);gap:6px}\n#expertive-matrica .xm-seg label{position:relative;margin:0;padding:0;display:block;font-weight:400}\n#expertive-matrica .xm-seg input{position:absolute;opacity:0;inset:0;width:100%;height:100%;margin:0;cursor:pointer}\n#expertive-matrica .xm-seg span{display:block;text-align:center;border:1px solid var(--line);border-radius:6px;padding:8px 4px;font-size:13px;cursor:pointer;background:var(--surface);color:var(--ink)}\n#expertive-matrica .xm-seg input:checked+span{background:var(--accent);color:var(--accent-ink);border-color:var(--accent);font-weight:600}\n#expertive-matrica .xm-seg.xm-seg-v{grid-template-columns:1fr}\n#expertive-matrica .xm-seg.xm-seg-v span{text-align:left;padding:10px 12px;font-size:14px}\n#expertive-matrica .xm-check{background:var(--pale-soft);border-radius:8px;padding:14px;display:flex;flex-direction:column;gap:8px}\n#expertive-matrica .xm-check .xm-eyebrow{color:var(--accent)}\n#expertive-matrica .xm-nav{display:flex;justify-content:space-between;gap:10px;flex-wrap:wrap}\n#expertive-matrica .xm-row{display:flex;gap:10px;flex-wrap:wrap;align-items:center}\n#expertive-matrica .xm-hint{font-size:13px;color:var(--bad)}\n#expertive-matrica .xm-warn{font-size:15px;font-weight:600;color:#B4572A;background:#FBF1EC;border-left:3px solid #B4572A;padding:8px 12px;border-radius:4px;margin-top:10px}\n#expertive-matrica .xm-flash{outline:3px solid #B4572A;outline-offset:4px;border-radius:8px;transition:outline-color .3s}\n#expertive-matrica .xm-headline{font-family:var(--serif);font-size:22px;line-height:1.35}\n#expertive-matrica .xm-scroll{overflow-x:auto}\n#expertive-matrica table{border-collapse:collapse;width:100%;font-size:14px;margin:0;border:0;background:transparent}\n#expertive-matrica th,#expertive-matrica td{text-align:left;padding:10px 8px;border:0;border-bottom:1px solid var(--line);vertical-align:middle;background:transparent;color:var(--ink)}\n#expertive-matrica th{font-size:12px;letter-spacing:.06em;text-transform:uppercase;color:var(--muted);font-weight:600}\n#expertive-matrica td.xm-num{text-align:center;width:52px;font-variant-numeric:tabular-nums}\n#expertive-matrica td.xm-gap{font-weight:700}\n#expertive-matrica td.xm-pos{color:var(--accent)} #expertive-matrica td.xm-neg{color:var(--below)}\n#expertive-matrica .xm-mark{font-size:11px;color:var(--warn);font-weight:600;white-space:nowrap}\n#expertive-matrica .xm-track{position:relative;height:14px;min-width:140px;background:linear-gradient(var(--line),var(--line)) left center\/100% 2px no-repeat}\n#expertive-matrica .xm-dot{position:absolute;top:1px;width:12px;height:12px;border-radius:50%;background:var(--accent);transform:translateX(-50%)}\n#expertive-matrica .xm-dot.xm-lo{background:var(--below)}\n#expertive-matrica .xm-req{position:absolute;top:-2px;width:2px;height:18px;background:var(--ink);transform:translateX(-50%)}\n#expertive-matrica .xm-ten{position:absolute;right:0;top:-2px;width:2px;height:18px;background:var(--line)}\n#expertive-matrica .xm-legend{display:flex;gap:16px;flex-wrap:wrap;font-size:12px;color:var(--muted)}\n#expertive-matrica .xm-legend i{display:inline-block;vertical-align:middle;margin-right:6px}\n#expertive-matrica .xm-flag{background:var(--warn-bg);border-radius:8px;padding:12px 14px;font-size:14px;border-left:3px solid var(--warn)}\n#expertive-matrica .xm-okmsg{background:var(--pale-soft);border-radius:8px;padding:12px 14px;font-size:14px;border-left:3px solid var(--good)}\n#expertive-matrica .xm-field{display:flex;flex-direction:column;gap:4px}\n#expertive-matrica .xm-field label{font-size:13px;font-weight:600;margin:0;color:var(--ink)}\n#expertive-matrica .xm-field select{font-family:var(--sans);font-size:15px;color:var(--ink);background:var(--surface);border:1px solid var(--line);border-radius:6px;padding:9px 10px;width:100%;margin:0}\n#expertive-matrica .xm-ctx{margin-top:14px}\n#expertive-matrica .xm-ctxnote{font-size:13px;color:var(--muted);margin:0 0 8px}\n#expertive-matrica .xm-field input{font-family:var(--sans);font-size:15px;color:var(--ink);background:var(--surface);border:1px solid var(--line);border-radius:6px;padding:10px 12px;width:100%;height:auto;margin:0;box-shadow:none}\n#expertive-matrica .xm-fields{display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:12px}\n#expertive-matrica label.xm-consent{display:flex;gap:10px;align-items:flex-start;font-size:14px;font-weight:400;margin:0;color:var(--ink)}\n#expertive-matrica .xm-consent input{margin:4px 0 0;width:18px;height:18px;flex:none;accent-color:var(--accent);position:static;opacity:1}\n#expertive-matrica details.xm-privacy{font-size:13px;color:var(--muted);border-top:1px solid var(--line);padding-top:10px;margin:0}\n#expertive-matrica details.xm-privacy summary{cursor:pointer;color:var(--accent);font-weight:500}\n#expertive-matrica details.xm-privacy div{margin-top:6px}\n#expertive-matrica details.xm-privacy div p{font-size:12px;line-height:1.4;color:var(--muted)}\n#expertive-matrica .xm-howto-h{font-family:var(--sans);font-size:14px;font-weight:700;color:var(--accent)}\n#expertive-matrica ol.xm-howto{margin:0;padding-left:20px;display:flex;flex-direction:column;gap:6px;max-width:65ch;list-style:decimal}\n#expertive-matrica ol.xm-howto li{margin:0;padding:0}\n#expertive-matrica .xm-limits{background:var(--pale-soft);border-radius:8px;padding:12px 14px;display:flex;flex-direction:column;gap:6px}\n#expertive-matrica .xm-limits p{font-size:13px;line-height:1.45;color:var(--muted)}\n#expertive-matrica .xm-offer{border-color:var(--pale);background:var(--pale-soft)}\n#expertive-matrica .xm-wink{font-size:14px;font-style:italic;color:var(--muted)}\n#expertive-matrica .xm-action{background:var(--pale-soft);border-left:3px solid var(--accent);border-radius:8px;padding:12px 14px;font-size:15px}\n#expertive-matrica .xm-reflect{font-size:15px;color:var(--ink);border-left:3px solid var(--pale);padding-left:12px}\n#expertive-matrica a.xm-cta,#expertive-matrica a.xm-cta:hover,#expertive-matrica a.xm-cta:focus{display:inline-block;background:var(--accent)!important;color:var(--accent-ink)!important;text-decoration:none!important;border-radius:8px;padding:12px 18px;font-weight:600}\n#expertive-matrica .xm-cta-note{font-size:14px;color:var(--muted)}\n#expertive-matrica .xm-offer-lead{font-family:var(--serif);font-size:19px;font-weight:600;color:var(--accent)}\n#expertive-matrica .xm-pattern{display:flex;flex-direction:column;gap:6px;padding:6px 0}\n#expertive-matrica .xm-pattern+.xm-pattern{border-top:1px solid var(--line);padding-top:14px}\n#expertive-matrica .xm-pattern-name{font-family:var(--serif);font-size:20px;font-weight:600;color:var(--accent)}\n#expertive-matrica .xm-admin{background:#FDECEA;color:#7A1F1A;border:1px solid #F3B8B2;border-radius:8px;padding:10px 14px;font-size:13px}\n#expertive-matrica .xm-hp{position:absolute!important;left:-9999px!important;width:1px;height:1px;overflow:hidden}\n@media (max-width:480px){ #expertive-matrica h1{font-size:25px} #expertive-matrica .xm-seg span{font-size:12px;padding:8px 2px} }\n<\/style>\n\n<div class=\"xm-wrap\">\n  <div class=\"xm-brand\"><span class=\"xm-name\">Expertive<\/span><span class=\"xm-right\"><span class=\"xm-tag\">Skills Matrix \u00b7 self-assessment<\/span><span class=\"xm-lang\"><a href=\"\/matrica-vjestina\/\" hreflang=\"hr\" lang=\"hr\" title=\"Hrvatski\">HR<\/a> <span aria-hidden=\"true\">|<\/span> <b aria-current=\"true\">EN<\/b><\/span><\/span><\/div>\n  <div id=\"xm-app\"><\/div>\n<\/div>\n\n<script>(function(){var b=\"CihmdW5jdGlvbigpewpjb25zdCBWRVJaSUpBID0gIk1BVFJJQ0Egd2ViIDIuMy44LUVOIChza2FsYSB1xI1lc3RhbG9zdGksIGJvZG92YW5qZSB2My45KSI7CmNvbnN0IFNFTkRfVVJMID0gIi8\/cmVzdF9yb3V0ZT0vZXhwZXJ0aXZlL3YxL21hdHJpY2EtZW4iOwoKY29uc3QgUk9MRVMgPSBbCiAge2lkOjAsazoiQSIsdDoiVGVhbSBsZWFkIC8gc3BlY2lhbGlzdCIsZDoiWW91IGxlYWQgb25lIHRlYW0gb3IgcHJvamVjdCwgb3IgeW91J3JlIGEgc3BlY2lhbGlzdCB3aXRob3V0IGEgdGVhbS4gVGhlIHBlb3BsZSB5b3UgbGVhZCBkb24ndCBsZWFkIG90aGVycy4ifSwKICB7aWQ6MSxrOiJCIix0OiJEaXJlY3RvciAoQi0xLCBvbmUgbGV2ZWwgYmVsb3cgdGhlIGV4ZWN1dGl2ZSB0ZWFtIG9yIG1hbmFnZW1lbnQgYm9hcmQpIixkOiJZb3UgcnVuIGEgZGl2aXNpb24sIGEgZnVuY3Rpb24gb3Igc2V2ZXJhbCBwcm9qZWN0cywgYW5kIGF0IGxlYXN0IHNvbWUgb2YgeW91ciBwZW9wbGUgbGVhZCB0ZWFtcyB0aGVtc2VsdmVzLiBZb3UgcmVwb3J0IHRvIHRoZSBleGVjdXRpdmUgdGVhbSBvciBtYW5hZ2VtZW50IGJvYXJkLiJ9LAogIHtpZDoyLGs6IkMiLHQ6IkV4ZWN1dGl2ZSB0ZWFtIG9yIG1hbmFnZW1lbnQgYm9hcmQgLyBDLWxldmVsIixkOiJZb3UncmUgYSBtZW1iZXIgb2YgdGhlIGV4ZWN1dGl2ZSB0ZWFtIG9yIG1hbmFnZW1lbnQgYm9hcmQsIG9yIHlvdSBydW4gdGhlIHdob2xlIGNvbXBhbnkuIFlvdSByZXBvcnQgdG8gdGhlIHN1cGVydmlzb3J5IGJvYXJkIG9yIHRoZSBvd25lcnMuIn0sCiAge2lkOjMsazoiRCIsdDoiT3duZXIiLGQ6IllvdSBydW4gYSBjb21wYW55IHRoYXQgaXMgYWxzbyB5b3VycywgYXMgaXRzIG93bmVyIG9yIGZvdW5kZXIgYXQgdGhlIGhlYWQgb2YgdGhlIGV4ZWN1dGl2ZSB0ZWFtIG9yIG1hbmFnZW1lbnQgYm9hcmQuIn0KXTsKLy8gSFIgbmF6aXZpIHVsb2dhIHNhbW8gemEgaW50ZXJuaSBzYcW+ZXRhayAob3N0YWplIG5hIGhydmF0c2tvbSkKY29uc3QgUk9MRVNfSFIgPSBbCiAge2lkOjAsazoiQSIsdDoiVm9kaXRlbGovaWNhIHRpbWEgLyBzcGVjaWphbGlzdC9pY2EiLGQ6IlZvZGl0ZSBqZWRhbiB0aW0gaWxpIHByb2pla3QsIGlsaSBzdGUgc3RydcSNbmphay9pbmphIGJleiB0aW1hLiBManVkaSBrb2plIHZvZGl0ZSBuZSB2b2RlIGRydWdlLiJ9LAogIHtpZDoxLGs6IkIiLHQ6IkRpcmVrdG9yL2ljYSAoQi0xKSIsZDoiVm9kaXRlIHNla3RvciwgZnVua2NpanUgaWxpIHZpxaFlIHByb2pla2F0YSwgYSBiYXJlbSBkaW8gdmHFoWloIGxqdWRpIGkgc2FtIHZvZGkgdGltLiBPZGdvdmFyYXRlIHVwcmF2aS4ifSwKICB7aWQ6MixrOiJDIix0OiJVcHJhdmEgLyBDLWxldmVsIixkOiLEjGxhbi9pY2Egc3RlIHVwcmF2ZSBpbGkgdm9kaXRlIGNpamVsdSB0dnJ0a3UuIE9kZ292YXJhdGUgbmFkem9ybm9tIG9kYm9ydSBpbGkgdmxhc25pY2ltYS4ifSwKICB7aWQ6MyxrOiJEIix0OiJWbGFzbmlrL2ljYSIsZDoiVm9kaXRlIHR2cnRrdSBrb2phIGplIGkgdmHFoWEsIGthbyB2bGFzbmlrL2ljYSBpbGkgb3NuaXZhxI0vaWNhIG5hIMSNZWx1IHVwcmF2ZS4ifQpdOwpjb25zdCBGUkVRX0FMTCA9IFsiYWxtb3N0IG5ldmVyIiwicmFyZWx5Iiwib2Z0ZW4iLCJhbG1vc3QgYWx3YXlzIl07CmNvbnN0IEJMT0NLX01BSiA9IDM7ICAgICAgICAgICAgIC8vIHdlYiAyLjMuMSAodjMuNyk6IGJsb2thZGUgdmnFoWUgbmVtYTsgMysgdHZyZG5qaSAixI1lc3RvIiBpbGkgdmnFoWUgc2FtbyBqZSBpbnRlcm5hIG96bmFrYSAiMysgxIxFU1RPIgpjb25zdCBDSEVDS09QVFMgPSB7CiAgY291bnQ6WyIwIHRpbWVzIiwiMeKAkzIgdGltZXMiLCIz4oCTNSB0aW1lcyIsIm1vcmUgdGhhbiA1Il0sCiAgaG91cnM6WyIwIGhvdXJzIiwiMeKAkzIgaG91cnMiLCIz4oCTNSBob3VycyIsIm1vcmUgdGhhbiA1Il0sCiAgd2hlbjpbInRoaXMgbW9udGgiLCJ0aGlzIHF1YXJ0ZXIiLCJ0aGlzIHllYXIiLCJsb25nZXIgYWdvIC8gbmV2ZXIiXQp9OwovLyBIUiBvZGdvdm9yaSBuYSBwcm92amVydSBzYW1vIHphIGludGVybmkgc2HFvmV0YWsKY29uc3QgQ0hFQ0tPUFRTX0hSID0gewogIGNvdW50OlsiMCBwdXRhIiwiMeKAkzIgcHV0YSIsIjPigJM1IHB1dGEiLCJ2acWhZSBvZCA1Il0sCiAgaG91cnM6WyIwIHNhdGkiLCIx4oCTMiBzYXRhIiwiM+KAkzUgc2F0aSIsInZpxaFlIG9kIDUiXSwKICB3aGVuOlsib3ZhaiBtamVzZWMiLCJvdmFqIGt2YXJ0YWwiLCJvdmUgZ29kaW5lIiwiZHXFvmUgLyBuaWthZCJdCn07Ci8vIHNbXSB1IHJlZG9zbGlqZWR1IHJhemluYSAxLi41OyBvcmRbXSBqZSBpem1pamXFoWFuaSByZWRvc2xpamVkIHByaWthemEgKGJyb2pldmkgcmF6aW5hKQovLyBwYyhMLCB2KTogcHJvdmplcmEgbmUgcG90dnLEkXVqZSBvY2plbnUgKEwgPSB1dHZyxJFlbmEgcmF6aW5hLCB2ID0gaW5kZWtzIG9kZ292b3JhIG5hIHByb3ZqZXJ1KQpjb25zdCBDID0gWwoge246IkRlbGVnYXRpb24gYW5kIHN0ZXBwaW5nIGJhY2sgZnJvbSBkYXktdG8tZGF5IG9wZXJhdGlvbnMiLCBuaDoiRGVsZWdpcmFuamUgaSBvZG1hayBvZCBvcGVyYXRpdmUiLCBxOiJXaGF0IGNhbid0IGhhcHBlbiBvbiB5b3VyIHRlYW0gd2l0aG91dCB5b3U\/IiwKICBzOlsiSSBrZWVwIGtleSBtYXR0ZXJzIGluIG15IG93biBoYW5kcyBiZWNhdXNlIEknbSB1bHRpbWF0ZWx5IGFjY291bnRhYmxlIGZvciB0aGUgb3V0Y29tZS4iLAogICAgICJJIGhhbmQgdGFza3Mgb2ZmLCBhbmQgSSBlbnN1cmUgcXVhbGl0eSB0aHJvdWdoIG15IG93biByZXZpZXcgYmVmb3JlIGFueXRoaW5nIGdvZXMgb3V0LiIsCiAgICAgIkkgaGFuZCBvZmYgdGFza3MgYW5kIHNvbWUgZGVjaXNpb25zLCBhbmQgSSBnZXQgaW50byB0aGUgZGV0YWlscyB3aGVyZSB0aGUgcmlzayBpcyB0b28gaGlnaC4iLAogICAgICJJIGRlbGVnYXRlIHJlc3BvbnNpYmlsaXR5IHdpdGhpbiBhIGNsZWFybHkgZGVmaW5lZCBmcmFtZXdvcmsgYW5kIGRvbid0IGludGVydmVuZSB3aXRoaW4gaXQgdW5sZXNzIGludml0ZWQuIiwKICAgICAiVGhlIHRlYW0gbWFrZXMgZGVjaXNpb25zIHdpdGhpbiB0aGUgYWdyZWVkIGZyYW1ld29yaywgYW5kIHdoZW4gcmVzdWx0cyBmYWxsIHNob3J0LCBJIGRvbid0IGJsYW1lIHRlYW0gbWVtYmVycyBmb3IgdGhvc2UgZGVjaXNpb25zLiJdLAogIG9yZDpbMyw1LDEsNCwyXSwKICBzaXQ6IlRoaW5rIG9mIHNpdHVhdGlvbnMgd2hlcmUgYW4gaW1wb3J0YW50IHRhc2sgb3IgZGVjaXNpb24gaGFkIHRvIGJlIGhhbmRlZCB0byBzb21lb25lIG9uIHlvdXIgdGVhbS4iLAogIHA6IkluIHRoZSBsYXN0IHRocmVlIG1vbnRocywgaG93IG1hbnkgdGltZXMgZGlkIHlvdSBkbyBhIHRhc2sgc29tZW9uZSBlbHNlIGNvdWxkIGhhdmUgZG9uZSwgYmVjYXVzZSBpdCB3YXMgZmFzdGVyIGFuZCBtb3JlIGFjY3VyYXRlIHRvIGRvIGl0IHlvdXJzZWxmPyIsIHB0OiJjb3VudCIsCiAgcGM6KEwsdik9Pkw+PTQmJnY+PTIsIHJlcTpbNSw3LDgsOF19LAoge246IkVtcGF0aHkgYW5kIHVuZGVyc3RhbmRpbmcgdGhlIG90aGVyIHBlcnNvbidzIHBlcnNwZWN0aXZlIiwgbmg6IkVtcGF0aWphIGkgcmF6dW1pamV2YW5qZSBwZXJzcGVrdGl2ZSBzdWdvdm9ybmlrYSIsIHE6IkhvdyBtdWNoIGRvIHlvdSBsZWFybiBhYm91dCB0aGUgb3RoZXIgcGVyc29uIGJlZm9yZSB5b3Ugb2ZmZXIgYSBzb2x1dGlvbj8iLAogIHM6WyJJIGxpc3RlbiwgdGFrZSBpdCBpbiBxdWlja2x5LCBhbmQgbW92ZSBvbiB0byBhIHNvbHV0aW9uLiBJJ20gZXhwZWN0ZWQgdG8gbW92ZSB0aGluZ3MgZm9yd2FyZC4iLAogICAgICJJIGhlYXIgcGVvcGxlIG91dCBhbmQgcmVzcG9uZCB3aXRoIGFuIGFyZ3VtZW50IEkndmUgcHJlcGFyZWQgaW4gYWR2YW5jZS4gRmFjdHMgc2V0dGxlIG1vc3QgZGlzYWdyZWVtZW50cy4iLAogICAgICJJIGFzayBvdGhlcnMgZm9yIHRoZWlyIG9waW5pb24gYW5kIHRha2UgaXQgaW50byBhY2NvdW50IHdoZW4gdGhleSBvZmZlciBhIGJldHRlciBzb2x1dGlvbiB0aGFuIG1pbmUuIiwKICAgICAiQmVmb3JlIEkgcmVzcG9uZCwgSSBjaGVjayBob3cgdGhlIG90aGVyIHBlcnNvbiBzZWVzIHRoZSBzaXR1YXRpb24gYW5kIHdoYXQgdGhlaXIgaW50ZXJlc3RzIGFyZSBpbiBpdC4iLAogICAgICJJIGFzayBxdWVzdGlvbnMgZXZlbiB3aGVuIEkgYWxyZWFkeSBrbm93IHRoZSBhbnN3ZXIsIHVudGlsIEkgaGVhciB3aGF0IHJlYWxseSBjb25jZXJucyB0aGUgb3RoZXIgcGVyc29uLiJdLAogIG9yZDpbNCwxLDUsMiwzXSwKICBzaXQ6IlRoaW5rIG9mIGltcG9ydGFudCBjb252ZXJzYXRpb25zIHdoZXJlIHRoZSBvdGhlciBwZXJzb24gZGlkbid0IGFncmVlIHdpdGggeW91ciBwcm9wb3NhbC4iLAogIHA6IldoZW4gZGlkIHlvdSBsYXN0IGxldCBnbyBvZiBhIHNvbHV0aW9uIHlvdSBrbmV3IHdhcyBiZXR0ZXIsIGJlY2F1c2UgdGhlIG90aGVyIHNpZGUgY291bGRuJ3QgYWNjZXB0IGl0IGFzIHRoZWlyIG93bj8iLCBwdDoid2hlbiIsCiAgcGM6KEwsdik9Pkw+PTQmJnY+PTMsIHJlcTpbNSw2LDgsN119LAoge246IkRldmVsb3BpbmcgcGVvcGxlIiwgbmg6IlJhenZvaiBsanVkaSIsIHE6IkhvdyBtdWNoIG9mIHlvdXIgdGltZSBnb2VzIGludG8gaGVscGluZyB5b3VyIHBlb3BsZSBpbXByb3ZlPyIsCiAgczpbIkkgbGVhdmUgcGVvcGxlIGRldmVsb3BtZW50IHRvIEhSIGFuZCB0aGUgZXhwZXJ0cywgYW5kIHB1dCBteSB0aW1lIGludG8gdGhlIHJlc3VsdHMgZXhwZWN0ZWQgb2YgbWUuIiwKICAgICAiSSBoZWxwIHdoZW4gc29tZW9uZSBnZXRzIHN0dWNrOyBsb25nLXRlcm0gZGV2ZWxvcG1lbnQgaXMgdXAgdG8gSFIgYW5kIGVhY2ggcGVyc29uJ3Mgb3duIGFtYml0aW9uLiIsCiAgICAgIkkga25vdyB3aG8gY2FuIGRvIHdoYXQgYW5kIHdoZXJlIGVhY2ggcGVyc29uIGdldHMgc3R1Y2ssIGFuZCBJIGJyaW5nIGl0IHVwIHdoZW4gdGhlIG9wcG9ydHVuaXR5IGFyaXNlcy4iLAogICAgICJGb3IgbXkga2V5IHBlb3BsZSwgSSBrbm93IHR3byBzdHJvbmcgc2tpbGxzIGFuZCB0d28gd2VhayBvbmVzLCBhbmQgd2UgZGlzY3VzcyB0aGVtIGluIG1lZXRpbmdzIHNldCBhc2lkZSBmb3IgdGhhdCBwdXJwb3NlLiIsCiAgICAgIkkgZGV2b3RlIGhvdXJzIGV2ZXJ5IHdlZWsgdG8gZGV2ZWxvcGluZyBteSBrZXkgcGVvcGxlLCBhbmQgSSBhY2NlcHQgdGhhdCBzb21lIHJlc3VsdHMgYXJlIGRlbGF5ZWQgYmVjYXVzZSBvZiBpdC4iXSwKICBvcmQ6WzIsNCwxLDUsM10sCiAgc2l0OiJUaGluayBvZiBzaXR1YXRpb25zIHdoZXJlIHNvbWVvbmUgb24geW91ciB0ZWFtIGdvdCBzdHVjayBvciB3YXMgbG9va2luZyBmb3IgYSBjaGFuY2UgdG8gZ3Jvdy4iLAogIHA6IkluIHRoZSBsYXN0IHRocmVlIG1vbnRocywgaG93IG1hbnkgaG91cnMgZGlkIHlvdSBzcGVuZCBpbiBjb252ZXJzYXRpb25zIGZvY3VzZWQgc29sZWx5IG9uIGFuIGluZGl2aWR1YWwncyBkZXZlbG9wbWVudD8iLCBwdDoiaG91cnMiLAogIHBjOihMLHYpPT4oTD49NSYmdjw9Mil8fChMPT09NCYmdjw9MSksIHJlcTpbNSw3LDcsN119LAoge246IkdpdmluZyBmZWVkYmFjaywgaW5jbHVkaW5nIHRoZSB1bmNvbWZvcnRhYmxlIGtpbmQiLCBuaDoiRGF2YW5qZSBmZWVkYmFja2EsIHVrbGp1xI11anXEh2kgbmV1Z29kYW4iLCBxOiJIb3cgbXVjaCB0aW1lIHBhc3NlcyBiZXR3ZWVuIG5vdGljaW5nIHNvbWV0aGluZyBhbmQgYnJpbmdpbmcgaXQgdXA\/IiwKICBzOlsiSSBhdm9pZCB1bm5lY2Vzc2FyeSBjb25mcm9udGF0aW9uLiBNb3N0IHRoaW5ncyBzb3J0IHRoZW1zZWx2ZXMgb3V0IG92ZXIgdGltZSwgb3IgSFIgaGFuZGxlcyB0aGVtLiIsCiAgICAgIkkgcmVhY3QgY2xlYXJseSBhbmQgZmlybWx5IG9uY2UgYSBwcm9ibGVtIHJlYWNoZXMgdGhlIHBvaW50IHdoZXJlIGl0IGNhbid0IHdhaXQgYW55IGxvbmdlci4iLAogICAgICJJIGdpdmUgZmVlZGJhY2sgaW4gc2NoZWR1bGVkIGZlZWRiYWNrIGRpc2N1c3Npb25zLCBhbmQgbWFpbmx5IHN1cHBvcnQgcGVvcGxlIGluIGJldHdlZW4uIiwKICAgICAiSSBnaXZlIHVuY29tZm9ydGFibGUgZmVlZGJhY2sgd2l0aGluIGEgZmV3IGRheXMsIG9uY2UgZW1vdGlvbnMgaGF2ZSBzZXR0bGVkIGFuZCBJIGhhdmUgYSBjb25jcmV0ZSBleGFtcGxlLiIsCiAgICAgIkkgZ2l2ZSB1bmNvbWZvcnRhYmxlIGZlZWRiYWNrIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBldmVudCwgYW5kIEkgYWNjZXB0IHRoYXQgcGVvcGxlIHNvbWV0aW1lcyBkb24ndCBsaWtlIG1lIGZvciBpdC4iXSwKICBvcmQ6WzUsMywxLDIsNF0sCiAgc2l0OiJUaGluayBvZiBzaXR1YXRpb25zIHdoZXJlIHlvdSBub3RpY2VkIHNvbWVvbmUgd29ya2luZyBiZWxvdyB0aGUgYWdyZWVkIHN0YW5kYXJkLiIsCiAgcDoiV2hlbiBkaWQgeW91IGxhc3QgdGVsbCBzb21lb25lIG9uIHlvdXIgdGVhbSBzb21ldGhpbmcgdW5jb21mb3J0YWJsZSB0aGF0IHRoZXkgbmVlZGVkIHRvIGhlYXIgaW4gb3JkZXIgdG8gZ3Jvdz8iLCBwdDoid2hlbiIsCiAgcGM6KEwsdik9Pkw+PTQmJnY+PTIsIHJlcTpbNSw3LDcsN119LAoge246IkRlY2lzaW9uLW1ha2luZyB1bmRlciB1bmNlcnRhaW50eSIsIG5oOiJPZGx1xI1pdmFuamUgdSBuZWl6dmplc25vc3RpIiwgcToiRG8geW91IG1ha2UgaW1wb3J0YW50IGRlY2lzaW9ucyB3aXRoIHRoZSBpbmZvcm1hdGlvbiB5b3UgaGF2ZSwgb3Igd2FpdCB1bnRpbCB5b3UgaGF2ZSBlbm91Z2ggaW5mb3JtYXRpb24gdG8gYmUgY2VydGFpbj8iLAogIHM6WyJGb3IgZGVjaXNpb25zIHRoYXQgYXJlbid0IGNyaXRpY2FsLCBJIHJlZmVyIHRoZW0gdG8gYSBoaWdoZXIgbGV2ZWwgb3IgZ2l2ZSB0aGVtIHRpbWUgdG8gbWF0dXJlLiIsCiAgICAgIkkgZGVjaWRlIHdoZW4gSSBoYXZlIHRoZSBkYXRhIHRoYXQgbWFrZXMgdGhlIGRlY2lzaW9uIGRlZmVuc2libGUgdG8gYW55b25lIHdobyBtaWdodCBxdWVzdGlvbiBpdC4iLAogICAgICJJIG1ha2UgZGVjaXNpb25zIGluIHRpbWUsIGFuZCBJIHJldmlzaXQgdGhlbSBhcyBzb29uIGFzIG5ldyBpbmZvcm1hdGlvbiBjaGFuZ2VzIHRoZSBwaWN0dXJlLiIsCiAgICAgIkkgZGVjaWRlIGFzIHNvb24gYXMgSSBoYXZlIGVub3VnaCBmb3IgYSByZWFzb25hYmxlIGRlY2lzaW9uLCBhbmQgSSBhY2NlcHQgdGhhdCBzb21lIHdpbGwgYmUgd3JvbmcuIiwKICAgICAiSW4gYSBjcmlzaXMgSSBkZWNpZGUgaW1tZWRpYXRlbHksIG9mdGVuIHdpdGhvdXQgY29uc3VsdGluZyBwZW9wbGUgd2hvIGV4cGVjdCB0byBiZSBjb25zdWx0ZWQuIl0sCiAgb3JkOlszLDEsNCw1LDJdLAogIHNpdDoiVGhpbmsgb2YgZGVjaXNpb25zIHRoYXQgd2VyZSB3YWl0aW5nIG9uIHlvdSBhbmQgd2VyZW4ndCByb3V0aW5lLiIsCiAgcDoiTGFzdCBxdWFydGVyLCBob3cgbWFueSBkZWNpc2lvbnMgZGlkIHlvdSBwdXQgb2ZmIHdoaWxlIHdhaXRpbmcgZm9yIGluZm9ybWF0aW9uIHRoYXQgaW4gdGhlIGVuZCBkaWRuJ3QgY2hhbmdlIHRoZSBkZWNpc2lvbj8iLCBwdDoiY291bnQiLAogIHBjOihMLHYpPT5MPj00JiZ2Pj0yLCByZXE6WzUsNyw4LDhdfSwKIHtuOiJQcmlvcml0aXppbmcgYW5kIGFjY2VwdGluZyBpbXBlcmZlY3Rpb24iLCBuaDoiUHJpb3JpdGl6YWNpamEgaSBwcmlodmHEh2FuamUgbmVzYXZyxaFlbm9nIiwgcToiV2hhdCBoYXZlIHlvdSBkZWNpZGVkIG5vdCB0byBkbyB0aGlzIHllYXI\/IiwKICBzOlsiRXZlcnl0aGluZyBvbiBteSBkZXNrIGlzIGltcG9ydGFudC4gQXMgbG9uZyBhcyBJIGNhbiBnZXQgaXQgYWxsIGRvbmUsIEkgc2VlIG5vIHJlYXNvbiB0byBkcm9wIGFueXRoaW5nLiIsCiAgICAgIkkgaGF2ZSBhIHByaW9yaXR5IGxpc3QgdGhhdCBJIHF1aWNrbHkgYWRqdXN0IGFzIHNvb24gYXMgc29tZXRoaW5nIGNvbWVzIHVwIHRoYXQgY2FuJ3Qgd2FpdC4iLAogICAgICJJIHN0aWNrIHRvIG15IHByaW9yaXRpZXMsIGFuZCBJIGRvbid0IGxvd2VyIG15IHF1YWxpdHkgc3RhbmRhcmQsIGV2ZW4gb24gdGhpbmdzIHRoYXQgYXJlbid0IGNyaXRpY2FsLiIsCiAgICAgIkkgY2hvb3NlIHdoZXJlIG15IGVuZXJneSBnb2VzIGFuZCBsZXQgc29tZSB0aGluZ3MgYmUganVzdCBnb29kIGVub3VnaC4iLAogICAgICJXZSd2ZSBkZWZpbmVkIHdoYXQgd2Ugd29uJ3QgZG8sIGFuZCBJIHN0aWNrIHRvIGl0IGV2ZW4gd2hlbiBpdCBtZWFucyBtaXNzaW5nIGEgZ29vZCBvcHBvcnR1bml0eS4iXSwKICBvcmQ6WzQsMiw1LDEsM10sCiAgc2l0OiJUaGluayBvZiBzaXR1YXRpb25zIHdoZXJlIHNvbWV0aGluZyBuZXcgbGFuZGVkIG9uIHlvdXIgZGVzayB3aGVuIHlvdSB3ZXJlIGFscmVhZHkgYXQgZnVsbCBjYXBhY2l0eS4iLAogIHA6IkluIHRoZSBsYXN0IDEyIG1vbnRocywgaG93IG1hbnkgcHJvamVjdHMgb3IgaW5pdGlhdGl2ZXMgdGhhdCB3ZXJlIHdvcnRod2hpbGUgZGlkIHlvdSBkZWxpYmVyYXRlbHkgc3RvcCBvciB0dXJuIGRvd24\/IiwgcHQ6ImNvdW50IiwKICBwYzooTCx2KT0+TD49NCYmdj09PTAsIHJlcTpbNSw2LDcsOF19LAoge246IlNlbGYtbWFuYWdlbWVudCB1bmRlciBwcmVzc3VyZSIsIG5oOiJVcHJhdmxqYW5qZSBzb2JvbSBwb2QgcHJpdGlza29tIiwgcToiV2hhdCBoYXBwZW5zIGJldHdlZW4gc29tZXRoaW5nIGdldHRpbmcgdG8geW91IGFuZCB3aGF0IHlvdSBzYXkgbmV4dD8iLAogIHM6WyJJIHJlYWN0IHJpZ2h0IGF3YXkgYW5kIG91dCBsb3VkLiBQZW9wbGUgbmVlZCB0byBrbm93IHdoZW4gc29tZXRoaW5nJ3Mgd3JvbmcsIHdpdGhvdXQgZGVsYXkuIiwKICAgICAiSSBob2xkIGJhY2sgaW4gZnJvbnQgb2Ygb3RoZXJzIGFuZCBzYXkgd2hhdCBJIHRoaW5rIG9ubHkgbGF0ZXIsIGluIGEgc21hbGxlciBncm91cCBvciBpbiB3cml0aW5nLiIsCiAgICAgIkkgbW9zdGx5IGtlZXAgbXlzZWxmIGluIGNoZWNrLCBidXQgdW5kZXIgcHJlc3N1cmUgSSBsZXQgaXQgc2hvdyBob3cgbXVjaCBJIGNhcmUuIiwKICAgICAiV2hlbiBzb21ldGhpbmcgZ2V0cyB0byBtZSwgSSBkb24ndCByZXNwb25kIHJpZ2h0IGF3YXk7IEkgc2F5IHdoZW4gSSdsbCBnZXQgYmFjayB3aXRoIGEgcmVzcG9uc2UuIiwKICAgICAiSW4gYSB0ZW5zZSBzaXR1YXRpb24gSSBkZWxpYmVyYXRlbHkgYnJpbmcgdGhlIHRlbXBlcmF0dXJlIGRvd24sIGV2ZW4gd2hlbiBpdCdzIGhhcmRlc3QgZm9yIG1lIG5vdCB0byBzYXkgd2hhdCBJIHRoaW5rLiJdLAogIG9yZDpbMiw1LDMsMSw0XSwKICBzaXQ6IlRoaW5rIG9mIHNpdHVhdGlvbnMgYXQgd29yayB3aGVyZSBzb21ldGhpbmcgYW5nZXJlZCwgdXBzZXQgb3IgZGlzYXBwb2ludGVkIHlvdSwgb3Igd2hlcmUgeW91IHdlcmUgdW5kZXIgaW50ZW5zZSBwcmVzc3VyZS4iLAogIHA6IkluIHRoZSBsYXN0IHRocmVlIG1vbnRocywgaG93IG1hbnkgdGltZXMgZGlkIHlvdSBzZW5kIGEgbWVzc2FnZSBvciBzYXkgc29tZXRoaW5nIHlvdSByZWdyZXR0ZWQgdGhlIHNhbWUgZGF5PyIsIHB0OiJjb3VudCIsCiAgcGM6KEwsdik9Pkw+PTQmJnY+PTIsIHJlcTpbNSw2LDcsN119LAoge246IlNwZWFraW5nIHVwIHRvIHRob3NlIGluIGF1dGhvcml0eSIsIG5oOiJaYXN0dXBhbmplIHN0YXZhIHByZW1hIGF1dG9yaXRldHUiLCBxOiJXaGF0IGRvZXMgeW91ciBib3NzIG9yIHRoZSBleGVjdXRpdmUgdGVhbSBvciBtYW5hZ2VtZW50IGJvYXJkIGhlYXIgZnJvbSB5b3UsIGFuZCB3aGF0IGRvbid0IHRoZXk\/IiwKICBzOlsiSSBwYXNzIG9uIHRoZSBpbmZvcm1hdGlvbiByZXF1ZXN0ZWQgYnkgdGhvc2UgYWJvdmUgbWUgYW5kIHJlc29sdmUgZGlzYWdyZWVtZW50cyB3aXRoaW4gbXkgb3duIHRlYW0uIiwKICAgICAiSSBzaGFyZSBteSBvcGluaW9uIHdoZW4gSSdtIGFza2VkLCBhbmQgYWRqdXN0IGl0IHdoZW4gY2lyY3Vtc3RhbmNlcyBjYWxsIGZvciBpdC4iLAogICAgICJJIG1ha2UgbXkgcG9zaXRpb24gY2xlYXIgb25jZSwgdGhlbiBsZWF2ZSB0aGUgZGVjaXNpb24gdG8gdGhvc2UgYWNjb3VudGFibGUgZm9yIGl0LiIsCiAgICAgIkkgc3RhbmQgdXAgZm9yIG15c2VsZiBhbmQgbXkgdGVhbSwgd2l0aCBhIHByZXBhcmVkIGFyZ3VtZW50IGFuZCBhIGNsZWFyIHByb3Bvc2VkIGRlY2lzaW9uLiIsCiAgICAgIkkgYXNrIHRoZSB1bmNvbWZvcnRhYmxlIHF1ZXN0aW9uIG5vIG9uZSBlbHNlIGluIHRoZSByb29tIGlzIGFza2luZywgYW5kIEkga25vdyBpdCBjb21lcyBhdCBhIGNvc3QgdG8gbWUuIl0sCiAgb3JkOls1LDEsMyw0LDJdLAogIHNpdDoiVGhpbmsgb2Ygc2l0dWF0aW9ucyB3aGVyZSB5b3VyIHZpZXcgZGlmZmVyZWQgZnJvbSB0aGF0IG9mIHlvdXIgYm9zcywgdGhlIGV4ZWN1dGl2ZSB0ZWFtIG9yIG1hbmFnZW1lbnQgYm9hcmQsIG9yIHNvbWVvbmUgd2l0aCBtb3JlIHBvd2VyIHRoYW4geW91LiIsCiAgcDoiV2hlbiBkaWQgeW91IGxhc3QgdGVsbCB5b3VyIGJvc3Mgb3IgdGhlIGV4ZWN1dGl2ZSB0ZWFtIG9yIG1hbmFnZW1lbnQgYm9hcmQgc29tZXRoaW5nIHRoZXkgZGlkbid0IHdhbnQgdG8gaGVhciwgYW5kIGl0IHdhcyB0cnVlPyIsIHB0OiJ3aGVuIiwKICBwYzooTCx2KT0+TD49NCYmdj49MiwgcmVxOls0LDcsNyw0XX0sCiB7bjoiU3RyYXRlZ2ljIHBlcnNwZWN0aXZlIGFuZCB0aGUgYmlnZ2VyIHBpY3R1cmUiLCBuaDoiU3RyYXRlxaFrYSBzbGlrYSBpIMWhaXJpIGtvbnRla3N0IiwgcToiSG93IGZhciBkb2VzIHlvdXIgcmVzcG9uc2liaWxpdHkgZm9yIHJlc3VsdHMgZXh0ZW5kPyIsCiAgczpbIk15IGpvYiBpcyB0byBtYWtlIHN1cmUgbXkgYXJlYSBwZXJmb3JtcyBleGNlcHRpb25hbGx5IHdlbGw7IHRoZSBleGVjdXRpdmUgdGVhbSBvciBtYW5hZ2VtZW50IGJvYXJkIGlzIHJlc3BvbnNpYmxlIGZvciB0aGUgY29tcGFueSBhcyBhIHdob2xlLiIsCiAgICAgIkkgYXNzZXNzIGRlY2lzaW9ucyBieSB0aGVpciBpbXBhY3Qgb24gbXkgZGVwYXJ0bWVudCwgYmVjYXVzZSBJJ20gYWNjb3VudGFibGUgZm9yIGl0OyB0aG9zZSBhY2NvdW50YWJsZSBmb3IgdGhlIHJlc3Qgb2YgdGhlIGNvbXBhbnkgYXNzZXNzIHRoZSBpbXBhY3QgdGhlcmUuIiwKICAgICAiSSBrbm93IHdoZXJlIHRoZSBjb21wYW55IHJlYWxseSBtYWtlcyBpdHMgbW9uZXksIGFuZCBJIHRpZSBkZWNpc2lvbnMgdG8gdGhhdCwgbm90IHRvIG15IG93biBtZXRyaWNzLiIsCiAgICAgIkkgbWFrZSBkZWNpc2lvbnMgaW4gbXkgYXJlYSBpbiB0aGUgaW50ZXJlc3Qgb2YgdGhlIHdob2xlIGNvbXBhbnksIGV2ZW4gd2hlbiBpdCBjb3N0cyBteSBkZXBhcnRtZW50IHNvbWV0aGluZy4iLAogICAgICJJIHJhaXNlIGlzc3VlcyBjb21pbmcgZG93biB0aGUgcm9hZCBmb3IgdGhlIGNvbXBhbnkgZWFybHkgKG1hcmtldCwgY29tcGV0aXRvcnMsIG93bmVycyksIGFuZCBJIGFjY2VwdCB0aGF0IHRvIHNvbWUgaXQgbG9va3MgbGlrZSBzdGVwcGluZyBpbnRvIG90aGVyIHBlb3BsZSdzIHRlcnJpdG9yeS4iXSwKICBvcmQ6WzQsMiw1LDMsMV0sCiAgc2l0OiJUaGluayBvZiBpbXBvcnRhbnQgZGVjaXNpb25zIGluIHlvdXIgYXJlYSB0aGF0IGhhZCBjb25zZXF1ZW5jZXMgYmV5b25kIGl0LiIsCiAgcDoiSW4gdGhlIGxhc3QgdGhyZWUgbW9udGhzLCBob3cgbWFueSB0aW1lcyBkaWQgeW91IGV4cGxpY2l0bHkgc3RhdGUgdGhlIGltcGFjdCBvbiBvdGhlciBwYXJ0cyBvZiB0aGUgY29tcGFueSBpbiBhIHByb3Bvc2FsIG9yIGRlY2lzaW9uPyIsIHB0OiJjb3VudCIsCiAgcGM6KEwsdik9Pkw+PTQmJnY9PT0wLCByZXE6WzQsNiw4LDhdfQpdOwpjb25zdCBCQVNFID0gWzAsMSwzLDUsNyw5XTsKY29uc3QgRU1BSUxfUkUgPSAvXlteXHNAXStAW15cc0BdK1wuW15cc0BdKyQvOwoKLyogd2ViIDIuMyDigJQga2xqdcSNbmUgcmlqZcSNaSAocG9kZWJsamFuZSB1IHR2cmRuamFtYSksIMWhYWxhIHV6IHBpdGFuamUsIHJhZG5qYSB6YSBvdmFqIHRqZWRhbiBbbmlza2EgMeKAkzQsIHNyZWRuamEgNeKAkzddICovCmNvbnN0IEtXID0gWwogWyJrZWVwIGtleSBtYXR0ZXJzIGluIG15IG93biBoYW5kcyIsICJteSBvd24gcmV2aWV3IiwgImdldCBpbnRvIHRoZSBkZXRhaWxzIiwgImNsZWFybHkgZGVmaW5lZCBmcmFtZXdvcmsiLCAiVGhlIHRlYW0gbWFrZXMgZGVjaXNpb25zIl0sCiBbIm1vdmUgb24gdG8gYSBzb2x1dGlvbiIsICJhcmd1bWVudCBJJ3ZlIHByZXBhcmVkIiwgIkkgYXNrIG90aGVycyBmb3IgdGhlaXIgb3BpbmlvbiIsICJob3cgdGhlIG90aGVyIHBlcnNvbiBzZWVzIHRoZSBzaXR1YXRpb24iLCAiSSBhc2sgcXVlc3Rpb25zIGV2ZW4gd2hlbiBJIGFscmVhZHkga25vdyB0aGUgYW5zd2VyIl0sCiBbImxlYXZlIHBlb3BsZSBkZXZlbG9wbWVudCB0byBIUiBhbmQgdGhlIGV4cGVydHMiLCAiSSBoZWxwIHdoZW4gc29tZW9uZSBnZXRzIHN0dWNrIiwgIndoZW4gdGhlIG9wcG9ydHVuaXR5IGFyaXNlcyIsICJpbiBtZWV0aW5ncyBzZXQgYXNpZGUgZm9yIHRoYXQgcHVycG9zZSIsICJJIGRldm90ZSBob3VycyBldmVyeSB3ZWVrIl0sCiBbIkkgYXZvaWQgdW5uZWNlc3NhcnkgY29uZnJvbnRhdGlvbiIsICJvbmNlIGEgcHJvYmxlbSByZWFjaGVzIHRoZSBwb2ludCIsICJpbiBzY2hlZHVsZWQgZmVlZGJhY2sgZGlzY3Vzc2lvbnMiLCAid2l0aGluIGEgZmV3IGRheXMiLCAiaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIGV2ZW50Il0sCiBbInJlZmVyIHRoZW0gdG8gYSBoaWdoZXIgbGV2ZWwiLCAiZGVmZW5zaWJsZSIsICJJIG1ha2UgZGVjaXNpb25zIGluIHRpbWUiLCAiYXMgc29vbiBhcyBJIGhhdmUgZW5vdWdoIiwgIkluIGEgY3Jpc2lzIEkgZGVjaWRlIGltbWVkaWF0ZWx5Il0sCiBbIkV2ZXJ5dGhpbmcgb24gbXkgZGVzayBpcyBpbXBvcnRhbnQiLCAicXVpY2tseSBhZGp1c3QiLCAiZG9uJ3QgbG93ZXIgbXkgcXVhbGl0eSBzdGFuZGFyZCIsICJqdXN0IGdvb2QgZW5vdWdoIiwgIndoYXQgd2Ugd29uJ3QgZG8iXSwKIFsiSSByZWFjdCByaWdodCBhd2F5IGFuZCBvdXQgbG91ZCIsICJJIGhvbGQgYmFjayBpbiBmcm9udCBvZiBvdGhlcnMiLCAiSSBtb3N0bHkga2VlcCBteXNlbGYgaW4gY2hlY2siLCAiSSBkb24ndCByZXNwb25kIHJpZ2h0IGF3YXkiLCAiZGVsaWJlcmF0ZWx5IGJyaW5nIHRoZSB0ZW1wZXJhdHVyZSBkb3duIl0sCiBbInRoZSBpbmZvcm1hdGlvbiByZXF1ZXN0ZWQiLCAid2hlbiBJJ20gYXNrZWQiLCAibWFrZSBteSBwb3NpdGlvbiBjbGVhciBvbmNlIiwgIkkgc3RhbmQgdXAgZm9yIG15c2VsZiBhbmQgbXkgdGVhbSIsICJ0aGUgdW5jb21mb3J0YWJsZSBxdWVzdGlvbiJdLAogWyJyZXNwb25zaWJsZSBmb3IgdGhlIGNvbXBhbnkgYXMgYSB3aG9sZSIsICJieSB0aGVpciBpbXBhY3Qgb24gbXkgZGVwYXJ0bWVudCIsICJ3aGVyZSB0aGUgY29tcGFueSByZWFsbHkgbWFrZXMgaXRzIG1vbmV5IiwgImluIHRoZSBpbnRlcmVzdCBvZiB0aGUgd2hvbGUgY29tcGFueSIsICJpc3N1ZXMgY29taW5nIGRvd24gdGhlIHJvYWQiXQpdOwpjb25zdCBIVU0gPSBbIihPdGhlciB0aGFuIHlvdXIgdmFjYXRpb24uKSIsICIoTmFtZSBhbmQgam9iIHRpdGxlIGNvdW50LikiLCAiKEEg4oCcZ3JlYXQgam9iLCBrZWVwIGl0IHVw4oCdIGVtYWlsIGRvZXNuJ3QgY291bnQuKSIsICIoQSBxdWVzdGlvbiBmb3IgYW55b25lIHdobyBoYXMgZXZlciB0aG91Z2h0LCDigJxJJ2xsIGJyaW5nIGl0IHVwIHRvbW9ycm93LuKAnSkiLCAiKEl0J3Mgbm90IGEgcmhldG9yaWNhbCBxdWVzdGlvbiwgaG93ZXZlciBtdWNoIGl0IHNvdW5kcyBsaWtlIG9uZS4pIiwgIihUaGUgZ3ltIGRvZXNuJ3QgY291bnQuKSIsICIoRm9yIHNvbWUgcGVvcGxlIHRoYXQncyBoYWxmIGEgc2Vjb25kLiBGb3Igb3RoZXJzLCBhIHdlZWtlbmQuKSIsICIoSW5jbHVkaW5nIHdoYXQgdGhleSBoZWFyIGF0IHRoZSBjb2ZmZWUgbWFjaGluZS4pIiwgIihUbyB5b3VyIGRlcGFydG1lbnQncyBkb29yLCB0byB0aGUgZnJvbnQgZGVzaywgb3IgYWxsIHRoZSB3YXkgdG8gdGhlIHNoYXJlaG9sZGVycz8pIl07CmNvbnN0IEFDVCA9IFsKIFsiVGhpcyB3ZWVrLCBwaWNrIG9uZSB0YXNrIHlvdSdkIG5vcm1hbGx5IGtlZXAgb3IgcmV2aWV3IGJlZm9yZSBpdCBnb2VzIG91dCDigJQgYW5kIGxldCBpdCBnbyB3aXRob3V0IHJldmlld2luZyBpdC4gSW4gYSB3ZWVrLCBjaGVjayB3aGV0aGVyIGFueW9uZSBub3RpY2VkIHRoZSBkaWZmZXJlbmNlLiIsICJUaGlzIHdlZWssIGdpdmUgb25lIHBlcnNvbiByZXNwb25zaWJpbGl0eSBmb3IgYSBkZWNpc2lvbiBhbG9uZyB3aXRoIGEgZnJhbWV3b3JrOiB0aGUgZ29hbCwgdGhlIGRlYWRsaW5lLCB0aGUgYnVkZ2V0IGFuZCB3aGF0J3Mgb2ZmLWxpbWl0cy4gRG9uJ3QgaW50ZXJ2ZW5lIHdpdGhpbiB0aGF0IGZyYW1ld29yayB1bmxlc3MgdGhleSBpbnZpdGUgeW91LiJdLAogWyJJbiB5b3VyIG5leHQgdGhyZWUgY29udmVyc2F0aW9ucyB3aGVyZSB5b3UnZCBub3JtYWxseSBvZmZlciBhIHNvbHV0aW9uIHJpZ2h0IGF3YXksIGFzayB0d28gcXVlc3Rpb25zIGZpcnN0LiBUaGUgc29sdXRpb24gY2FuIGNvbWUgb25seSBhZnRlciB0aGF0LiIsICJCZWZvcmUgeW91ciBuZXh0IGltcG9ydGFudCBjb252ZXJzYXRpb24sIHdyaXRlIGRvd24gb25lIHNlbnRlbmNlIGFib3V0IHdoYXQgdGhlIG90aGVyIHBlcnNvbiBnYWlucyBhbmQgd2hhdCB0aGV5IGxvc2UgaW4gdGhhdCBzaXR1YXRpb24uIEFmdGVyIHRoZSBjb252ZXJzYXRpb24sIGNoZWNrIHdoZXRoZXIgeW91IHdlcmUgcmlnaHQuIl0sCiBbIlRoaXMgd2Vlaywgc2V0IGFzaWRlIDMwIG1pbnV0ZXMgd2l0aCBvbmUgcGVyc29uIG9uIHlvdXIgdGVhbSBmb3IgYSBzaW5nbGUgcXVlc3Rpb246IOKAnFdoYXQgd291bGQgeW91IG5lZWQgaW4gb3JkZXIgdG8gZG8gYSBqb2Igb25lIGxldmVsIGhpZ2hlciBhIHllYXIgZnJvbSBub3c\/4oCdIiwgIkZvciB0aHJlZSBrZXkgcGVvcGxlLCB3cml0ZSBkb3duIHR3byBzdHJvbmcgc2tpbGxzIGFuZCB0d28gd2VhayBvbmVzIGVhY2guIFRoaXMgd2Vlaywgc2V0IHVwIGEgbWVldGluZyB3aXRoIG9uZSBvZiB0aGVtIHRvIHRhbGsgYWJvdXQgbm90aGluZyBidXQgdGhhdC4iXSwKIFsiUGljayBvbmUgdGhpbmcgeW91J3ZlIGJlZW4gcHV0dGluZyBvZmYgc2F5aW5nIGZvciBhIHdoaWxlIGFuZCBzYXkgaXQgdGhpcyB3ZWVrLCB3aXRoIG9uZSBjb25jcmV0ZSBleGFtcGxlLiBQZXJzb25hbGx5LCB3aXRob3V0IGludm9sdmluZyBIUi4iLCAiVGhpcyB3ZWVrLCBnaXZlIHVuY29tZm9ydGFibGUgZmVlZGJhY2sgd2l0aGluIHRocmVlIGRheXMgb2YgdGhlIGV2ZW50LCBub3QgYXQgdGhlIG5leHQgc2NoZWR1bGVkIGNvbnZlcnNhdGlvbi4iXSwKIFsiUGljayBvbmUgZGVjaXNpb24gdGhhdCBoYXMgYmVlbiB3YWl0aW5nIGZvciBtb3JlIHRoYW4gdHdvIHdlZWtzIGFuZCBtYWtlIGl0IGJ5IEZyaWRheSB3aXRoIHRoZSBpbmZvcm1hdGlvbiB5b3UgaGF2ZSBub3cuIFdyaXRlIGRvd24gd2hhdCB3b3VsZCBtYWtlIHlvdSBjaGFuZ2UgaXQuIiwgIkZvciB5b3VyIG5leHQgaW1wb3J0YW50IGRlY2lzaW9uLCB3cml0ZSBkb3duIHdoYXQgaW5mb3JtYXRpb24geW91J3JlIHdhaXRpbmcgZm9yIGFuZCB3aGF0IHdvdWxkIGNoYW5nZSBpZiB5b3UgaGFkIGl0LiBJZiB0aGUgYW5zd2VyIGlzIOKAnG5vdGhpbmcgbXVjaCzigJ0gZGVjaWRlIG5vdy4iXSwKIFsiTWFrZSBhIGxpc3Qgb2YgZXZlcnl0aGluZyBvbiB5b3VyIGRlc2sgdGhpcyB3ZWVrIGFuZCBjcm9zcyBvZmYgb25lIHRoaW5nIHlvdSB3b24ndCBkby4gVGVsbCB0aGUgcGVyc29uIHdobydzIHdhaXRpbmcgZm9yIGl0LiIsICJQaWNrIG9uZSB0aGluZyB0aGF0IGlzbid0IGNyaXRpY2FsIGFuZCBoYW5kIGl0IGluIHRoaXMgd2VlayB3aGVuIGl0J3MgZ29vZCBlbm91Z2gsIG5vdCB3aGVuIGl0J3MgcGVyZmVjdC4iXSwKIFsiVGhlIG5leHQgdGltZSBzb21ldGhpbmcgZ2V0cyB0byB5b3UsIGhvbGQgb2ZmIG9uIHJlc3BvbmRpbmcgdW50aWwgdGhlIGVuZCBvZiB0aGUgZGF5IOKAlCB3aGV0aGVyIGJ5IG1lc3NhZ2Ugb3IgaW4gY29udmVyc2F0aW9uLiBXcml0ZSBkb3duIHdoYXQgeW91IHdvdWxkIGhhdmUgc2FpZCByaWdodCBhd2F5LCBhbmQgd2hhdCB5b3Ugc2FpZCB0aGF0IGV2ZW5pbmcuIiwgIldoZW4gc29tZXRoaW5nIGdldHMgdG8geW91IHRoaXMgd2Vlaywgc2F5IHNvIGNhbG1seSBhbmQgaW4gb25lIHNlbnRlbmNlOiB3aGF0IGhhcHBlbmVkIGFuZCB3aGF0IHlvdSBuZWVkLiBTbyBwZW9wbGUgZG9uJ3QgaGF2ZSB0byBndWVzcy4iXSwKIFsiQXQgeW91ciBuZXh0IG1lZXRpbmcgd2l0aCB5b3VyIGJvc3Mgb3IgdGhlIGV4ZWN1dGl2ZSB0ZWFtIG9yIG1hbmFnZW1lbnQgYm9hcmQsIHJhaXNlIG9uZSBkaXNhZ3JlZW1lbnQgeW91J2Qgbm9ybWFsbHkgcmVzb2x2ZSB3aXRoaW4geW91ciBvd24gdGVhbS4gT25jZSwgY2xlYXJseSBhbmQgd2l0aCBhIHJlYXNvbi4iLCAiRm9yIHlvdXIgbmV4dCBtZWV0aW5nIHdpdGggdGhlIGV4ZWN1dGl2ZSB0ZWFtIG9yIG1hbmFnZW1lbnQgYm9hcmQsIHByZXBhcmUgb25lIHByb3Bvc2VkIGRlY2lzaW9uIHdpdGggb25lIGFyZ3VtZW50IGFuZCBvbmUgbnVtYmVyIOKAlCBhbmQgYXNrIGZvciBhIGRlY2lzaW9uLCBub3QgYW4gb3Bpbmlvbi4iXSwKIFsiVGhpcyB3ZWVrLCBhc2sgc29tZW9uZSBpbiBmaW5hbmNlIG9yIHNhbGVzIHdoZXJlIHRoZSBjb21wYW55IHJlYWxseSBtYWtlcyBtb25leSBhbmQgd2hlcmUgaXQgbG9zZXMgaXQuIFRoZW4gc2VlIHdoaWNoIG9mIHlvdXIgZGVjaXNpb25zIHRoYXQgY2hhbmdlcy4iLCAiRm9yIHlvdXIgbmV4dCBkZWNpc2lvbiBpbiB5b3VyIGFyZWEsIHdyaXRlIGRvd24gd2hhdCBpdCBtZWFucyBmb3IgdGhlIHdob2xlIGNvbXBhbnksIG5vdCBqdXN0IGZvciB5b3VyIGRlcGFydG1lbnQuIElmIHRoZSB0d28gZGlmZmVyLCBkZWNpZGUgaW4gdGhlIGNvbXBhbnkncyBmYXZvciBhbmQgZXhwbGFpbiBpdCB0byB5b3VyIHRlYW0uIl0KXTsKZnVuY3Rpb24gYWN0VGV4dChpLCBzYyl7IHJldHVybiBBQ1RbaV1bc2M8PTQ\/MDoxXTsgfQpmdW5jdGlvbiBzdG10SFRNTChpLCBsdmwpewogIGNvbnN0IHQ9Q1tpXS5zW2x2bC0xXSwgaz1LV1tpXSYmS1dbaV1bbHZsLTFdLCBlPWVzYyh0KTsKICBpZighayB8fCB0LmluZGV4T2Yoayk8MCkgcmV0dXJuIGU7CiAgY29uc3QgZWs9ZXNjKGspOyByZXR1cm4gZS5yZXBsYWNlKGVrLCAiPHN0cm9uZz4iK2VrKyI8L3N0cm9uZz4iKTsKfQpjb25zdCBCT09LX01BSUwgPSAibWlyb3NsYXYua2xlcGFjQGV4cGVydGl2ZS5ociI7CmZ1bmN0aW9uIGV2KG5hbWUpeyB0cnl7IHNlbmQoe3R5cGU6ImV2ZW50IiwgZXY6bmFtZX0pOyB9Y2F0Y2goZSl7fSB9Cgpjb25zdCBLRVk9ImV4cGVydGl2ZS1tYXRyaWNhLXdlYi1lbi12MiI7CmZ1bmN0aW9uIGZyZXNoKCl7IHJldHVybiB7cm9sZTpudWxsLCBzaXplOiIiLCB0ZWFtOiIiLCBzdGVwOi0xLCBlbWFpbDoiIiwgY29uc2VudDE6ZmFsc2UsIGE6Qy5tYXAoKCk9PltudWxsLG51bGwsbnVsbCxudWxsLG51bGxdKSwgcDpDLm1hcCgoKT0+bnVsbCksIG5hOkMubWFwKCgpPT5mYWxzZSksIHRiOkMubWFwKCgpPT5udWxsKSwgdGJvOkMubWFwKCgpPT5udWxsKSwgdGJrOkMubWFwKCgpPT5udWxsKSwgYmg6Qy5tYXAoKCk9PjApLCBzZW50Ont9LCB0MDpudWxsLCB0RW5kOm51bGwsIHRjOkMubWFwKCgpPT4wKSwgZXZzOnt9fTsgfQpsZXQgc3QgPSBmcmVzaCgpOwp0cnl7IGNvbnN0IHJhdz1sb2NhbFN0b3JhZ2UuZ2V0SXRlbShLRVkpOyBpZihyYXcpeyBjb25zdCBvPUpTT04ucGFyc2UocmF3KTsgaWYobyYmby5hJiZvLmEubGVuZ3RoPT09Qy5sZW5ndGgpIHN0PU9iamVjdC5hc3NpZ24oZnJlc2goKSxvKTsgfSB9Y2F0Y2goZSl7fQppZighQXJyYXkuaXNBcnJheShzdC5uYSl8fHN0Lm5hLmxlbmd0aCE9PUMubGVuZ3RoKSBzdC5uYT1DLm1hcCgoKT0+ZmFsc2UpOwppZighQXJyYXkuaXNBcnJheShzdC50Yil8fHN0LnRiLmxlbmd0aCE9PUMubGVuZ3RoKSBzdC50Yj1DLm1hcCgoKT0+bnVsbCk7CmlmKCFBcnJheS5pc0FycmF5KHN0LnRibyl8fHN0LnRiby5sZW5ndGghPT1DLmxlbmd0aCkgc3QudGJvPUMubWFwKCgpPT5udWxsKTsKaWYoIUFycmF5LmlzQXJyYXkoc3QudGJrKXx8c3QudGJrLmxlbmd0aCE9PUMubGVuZ3RoKSBzdC50Yms9Qy5tYXAoKCk9Pm51bGwpOwppZighQXJyYXkuaXNBcnJheShzdC5iaCl8fHN0LmJoLmxlbmd0aCE9PUMubGVuZ3RoKSBzdC5iaD1DLm1hcCgoKT0+MCk7CmlmKCFBcnJheS5pc0FycmF5KHN0LnRjKXx8c3QudGMubGVuZ3RoIT09Qy5sZW5ndGgpIHN0LnRjPUMubWFwKCgpPT4wKTsKaWYoIXN0LmV2c3x8dHlwZW9mIHN0LmV2cyE9PSdvYmplY3QnKSBzdC5ldnM9e307CmxldCB0U3RlcD1udWxsOyAgIC8vIHdlYiAyLjM6IHBvxI1ldGFrIG1qZXJlbmphIHRyZW51dG5vZyBla3JhbmEKZnVuY3Rpb24gdGlja1N0ZXAoKXsgaWYodFN0ZXAhPW51bGwgJiYgc3Quc3RlcD49MCAmJiBzdC5zdGVwPEMubGVuZ3RoKXsgc3QudGNbc3Quc3RlcF09KHN0LnRjW3N0LnN0ZXBdfHwwKStNYXRoLm1pbihEYXRlLm5vdygpLXRTdGVwLCAzMCo2MCoxMDAwKTsgfSB0U3RlcD1udWxsOyB9CmZ1bmN0aW9uIHNhdmUoKXsgdHJ5eyBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShLRVksIEpTT04uc3RyaW5naWZ5KHN0KSk7IH1jYXRjaChlKXt9IH0KCmNvbnN0IHJvb3Q9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImV4cGVydGl2ZS1tYXRyaWNhIik7CmNvbnN0IGFwcD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgieG0tYXBwIik7CmZ1bmN0aW9uIGgoaHRtbCl7CiAgYXBwLmlubmVySFRNTD1odG1sOwogIHRyeXsgY29uc3QgeT1yb290LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcCt3aW5kb3cucGFnZVlPZmZzZXQtOTA7IGlmKHdpbmRvdy5wYWdlWU9mZnNldD55KSB3aW5kb3cuc2Nyb2xsVG8oe3RvcDpNYXRoLm1heCgwLHkpfSk7IH1jYXRjaChlKXt9Cn0KZnVuY3Rpb24gZXNjKHMpeyByZXR1cm4gU3RyaW5nKHMpLnJlcGxhY2UoL1smPD4iXS9nLGM9Pih7IiYiOiImYW1wOyIsIjwiOiImbHQ7IiwiPiI6IiZndDsiLCciJzoiJnF1b3Q7In1bY10pKTsgfQpmdW5jdGlvbiBjYXAocyl7IHJldHVybiBzLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpK3Muc2xpY2UoMSk7IH0KCi8qIEJvZG92YW5qZSB2My40IChuZXByb21pamVuamVubyB1IHYzLjUpCiAgIDEuIFV0dnLEkWVuYSByYXppbmEgPSBuYWp2acWhYSByYXppbmEgcG90dnLEkWVuYSBrYW8gcmVkb3ZpdGEgKDPigJM1IHB1dGEgaWxpIHZpxaFlKS4KICAgMi4gU25pxb5hdmFqdSBzYW1vIHJlZG92aXRvIHBvdHZyxJFlbmUgcmF6aW5lIDEgaSAyICjiiJIxIGJvZCBzdmFrYSkuCiAgIDMuIE5lc3VnbGFzamUgKHJlZG92aXRvIDEgaWxpIDIgaSByZWRvdml0byA0IGlsaSA1KTogb2NqZW5hIHBvIG5pxb5lbSBvYnJhc2N1OyBuaWthZCBwcmVrb21qZXJuYS4KICAgNC4gUHJvdmplcmEga29qYSBuZSBwb3R2csSRdWplIHJhemludSA0IGlsaSA1OiBvY2plbmEgbmFqdmnFoWUgNi4KICAgNS4gVHJpIGlsaSB2acWhZSBuZXN1Z2xhc2phOiBwcm9maWwgbmVrb256aXN0ZW50YW4uCiAgIFJhemluYSA1OiA5IHNhbW8gdXogInZpxaFlIG9kIDUiLCBpbmHEjWUgOC4gRGVzZXRrYSBzZSBuZSBkb2RqZWxqdWplLiAqLwovKiBCb2RvdmFuamUgdjMuNiAod2ViIDIuMiwgb2RsdcSNaW8gTWlybyAyOS45LjIwMjYuKToKICAg4oCUICJuaWplIGJpbG8gc2l0dWFjaWphIiBqZWRpbm8gamUgc3RhbmplIGJleiBvY2plbmU7CiAgIOKAlCBuaWplZG5hIHR2cmRuamEgIsSNZXN0byIgaWxpIHZpxaFlOiBzdmUgImdvdG92byBuaWthZCIg4oaSIDEsIGJhcmVtIGplZG5vICJyaWpldGtvIiDihpIgMiAob3puYWthICJuacWhdGEgcmVkb3ZpdG8iKTsKICAg4oCUIG1qZcWhb3ZpdCBvYnJhemFjICh2My43KTogcGl0YW5qZSAia29qYSBuYWrEjWXFocSHZSIgbWXEkXUgcmVkb3ZpdGltYTogMeKAkzIg4oaSIDMsIDMg4oaSIDUsIDTigJM1IOKGkiA2LCBiZXogb2Rnb3ZvcmEg4oaSIDUuCiAgIOKAlCBibG9rYWRlIG5lbWEgKHYzLjcpOiAixI1lc3RvIiBzZSBzbWlqZSBvem5hxI1pdGkga29saWtvIGdvZCBwdXRhLiAqLwovKiB2My43OiBzdC50YltpXSA9IHJhemluYSAoMeKAkzUpIHR2cmRuamUga29qdSBqZSBvc29iYSBpemFicmFsYSBrYW8gbmFqxI1lxaHEh3U7IG1vcmEgYml0aSBtZcSRdSByZWRvdml0aW1hLgogICBTdGFyaSB6YXBpcyAoImxvdyIvImhpZ2giLCBpc3B1bmphdmFuamEgemFwb8SNZXRhIHByaWplIDIuMy4xKSBwcmVzbGlrYXZhIHNlIG5hIG5ham5pxb51L25hanZpxaF1IHJlZG92aXR1LiAqLwovKiBCb2RvdmFuamUgdjMuOCAod2ViIDIuMy42LCBNaXJvIDE0LjEwLiBpIDIxLjEwLjIwMjYuLCB0b8SNa2EgMzUpOgogICDigJQgbWplxaFvdml0IG9icmF6YWMgKGkgZG9kYXRubyBwaXRhbmplKSBzYW1vIGthZCBqZSByYXppbmEgMSBpbGkgMiAiZ290b3ZvIHV2aWplayIsIGEgcmF6aW5hIDQgaWxpIDUgcmVkb3ZpdGE7CiAgICAgcmF6aW5hIDEgaWxpIDIgc2FtbyAixI1lc3RvIiDihpIgbmlqZSBtamXFoW92aXQgb2JyYXphYywgbmVnbyBwb3N0b2plxIdlIHByYXZpbG8g4oiSMSBib2QgcG8gcmVkb3ZpdG9qIG5pxb5vaiByYXppbmk7CiAgIOKAlCBtamXFoW92aXQgb2JyYXphYzogbmFqxI1lxaHEh2EgMeKAkzIg4oaSIDMsIDMg4oaSIDUsIDTigJM1IOKGkiA3IChiaWxvIDYpLCBiZXogb2Rnb3ZvcmEg4oaSIDU7CiAgIOKAlCBwcm92amVyYSBrb2phIG5lIHBvdHZyxJF1amUgaSBkYWxqZSBvZ3JhbmnEjWF2YSBuYSBuYWp2acWhZSA2LgogICBBbmFsaXphIDkgaXNwdW5qYXZhbmphICg4LuKAkzE0LjEwLik6IG1qZcWhb3ZpdGloIDY5IG9kIDgwIOKGkiAzMywgaXNwb2Qgb8SNZWtpdmFub2cgNjIgJSDihpIgMzYgJS4gKi8KLyogd2ViIDIuMy44IChNaXJvIDI3LjEwLjIwMjYuKTogbmVvYmF2ZXpuYSBrb3Jla2NpamEgb8SNZWtpdmFuaWggcmF6aW5hIChwcmF2aWxvIEIpLCBuYWp2acWhZSDCsTEsIGdyYW5pY2UgM+KAkzguCiAgIEJyb2ogbGp1ZGkgMOKAkzMg4oaSIOKIkjEgemEgZGVsZWdpcmFuamUgKDApIGkgcmF6dm9qIGxqdWRpICgyKTsgdHZydGthIGRvIDI0OSDihpIg4oiSMSwgNS4wMDArIOKGkiArMSB6YSBzdHJhdGXFoWt1IHNsaWt1ICg4KS4gKi8KZnVuY3Rpb24gYWRqT2YoaSl7CiAgbGV0IGQ9MDsKICBpZigoaT09PTB8fGk9PT0yKSAmJiBzdC50ZWFtPT09IjAiKSBkPS0xOwogIGlmKGk9PT04KXsgaWYoc3Quc2l6ZT09PSJzIikgZD0tMTsgZWxzZSBpZihzdC5zaXplPT09ImwiKSBkPTE7IH0KICByZXR1cm4gZDsKfQpmdW5jdGlvbiByZXFPZihpLHIpeyBjb25zdCBiPUNbaV0ucmVxW3JdLCBkPWFkak9mKGkpOyByZXR1cm4gZCA\/IE1hdGgubWF4KDMsTWF0aC5taW4oOCxiK2QpKSA6IGI7IH0KZnVuY3Rpb24gYWRqV2h5KCl7CiAgY29uc3Qgdz1bXTsgaWYoQy5zb21lKChjLGkpPT5pPT09OCYmYWRqT2YoOCkpKSB3LnB1c2goJ3RoZSBzaXplIG9mIHRoZSBjb21wYW55Jyk7IGlmKGFkak9mKDApKSB3LnB1c2goJ3RoZSBudW1iZXIgb2YgcGVvcGxlIHlvdSBsZWFkJyk7CiAgcmV0dXJuIHcuam9pbignIGFuZCAnKTsKfQpmdW5jdGlvbiBjaG9zZW5PZihjaSwgcmVnLCBMbWluLCBMKXsKICBjb25zdCB2PXN0LnRiW2NpXTsKICBpZih0eXBlb2Ygdj09PSJudW1iZXIiKSByZXR1cm4gcmVnLmluY2x1ZGVzKHYpID8gdiA6IG51bGw7CiAgaWYodj09PSJsb3ciKSByZXR1cm4gTG1pbjsgaWYodj09PSJoaWdoIikgcmV0dXJuIEw7CiAgcmV0dXJuIG51bGw7Cn0KZnVuY3Rpb24gc2NvcmUoY2kpewogIGlmKHN0Lm5hW2NpXSkgcmV0dXJuIHtuZDp0cnVlLCB3aHk6Im5lbWEgc2l0dWFjaWphIiwgczpudWxsLCBMOm51bGwsIGNvbnRyYTpmYWxzZSwgcGZhaWw6ZmFsc2UsIHB3ZWFrOmZhbHNlLCBucjpmYWxzZX07CiAgY29uc3QgYSA9IHN0LmFbY2ldLm1hcCh2PT52PT1udWxsPzA6dik7CiAgY29uc3QgcmVnID0gWzEsMiwzLDQsNV0uZmlsdGVyKGw9PmFbbC0xXT49Mik7CiAgY29uc3QgcHYwID0gc3QucFtjaV07CiAgaWYoIXJlZy5sZW5ndGgpewogICAgY29uc3QgcyA9IGEuc29tZSh2PT52Pj0xKSA\/IDIgOiAxOwogICAgcmV0dXJuIHtuZDpmYWxzZSwgbnI6dHJ1ZSwgTDowLCBMbWluOjAsIExlZmY6MSwgcywgcGVuOjAsIGNvbnRyYTpmYWxzZSwgdGI6bnVsbCwgcGZhaWw6ZmFsc2UsCiAgICAgICAgICAgIHB3ZWFrOiBwdjAhPW51bGwgJiYgQ1tjaV0ucGMoNCxwdjApLCBzcHJlYWQ6MH07CiAgfQogIGNvbnN0IEwgPSBNYXRoLm1heCguLi5yZWcpLCBMbWluID0gTWF0aC5taW4oLi4ucmVnKTsKICBjb25zdCBjb250cmEgPSAoYVswXT49M3x8YVsxXT49MykgJiYgKGFbM10+PTJ8fGFbNF0+PTIpOyAgICAgICAgICAgICAgICAvLyB2My44OiBuacW+YSByYXppbmEgImdvdG92byB1dmlqZWsiCiAgY29uc3QgZnVsbCA9IGwgPT4gbD09PTUgPyAoYVs0XT49MyA\/IDkgOiA4KSA6IEJBU0VbbF0gKyAoYVtsXT49MSA\/IDEgOiAwKTsKICBsZXQgcywgcGVuPTAsIExlZmY9TCwgdGI9bnVsbDsKICBpZihjb250cmEpewogICAgdGIgPSBjaG9zZW5PZihjaSwgcmVnLCBMbWluLCBMKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHYzLjc6IHJhemluYSB0dnJkbmplIGl6YWJyYW5lIGthbyBuYWrEjWXFocSHYQogICAgaWYodGIhPW51bGwpeyBMZWZmPXRiOyBzID0gdGI8PTIgPyA0IDogdGI9PT0zID8gNiA6IDc7IH0gICAgICAgICAgIC8vIHYzLjk6IDHigJMyIOKGkiA0IMK3IDMg4oaSIDYgwrcgNOKAkzUg4oaSIDcKICAgIGVsc2UgeyBMZWZmPU1hdGguZmxvb3IoKExtaW4rTCkvMik7IHM9NTsgfSAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiZXogb2Rnb3ZvcmEgKG5lIGJpIHNlIHNtamVsbyBkb2dvZGl0aSkKICB9IGVsc2UgewogICAgcyA9IGZ1bGwoTCk7CiAgICBbMSwyXS5mb3JFYWNoKGw9PnsgaWYobDxMICYmIGFbbC0xXT49MikgcGVuKys7IH0pOwogICAgcGVuID0gTWF0aC5taW4oMSwgcGVuKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdjMuOTogb2RiaXRhayBuYWp2acWhZSAxIGJvZAogICAgcyA9IE1hdGgubWF4KDEsIHMtcGVuKTsKICB9CiAgY29uc3QgcHYgPSBzdC5wW2NpXTsKICBjb25zdCBwZmFpbCA9IHB2IT1udWxsICYmIENbY2ldLnBjKExlZmYscHYpOwogIGlmKHBmYWlsKSBzID0gTWF0aC5taW4ocyw2KTsKICBjb25zdCBwd2VhayA9IHB2IT1udWxsICYmIENbY2ldLnBjKDQscHYpOwogIHJldHVybiB7TCwgTG1pbiwgTGVmZiwgcywgcGVuLCBjb250cmEsIHRiLCBwZmFpbCwgcHdlYWssIG5kOmZhbHNlLCBucjpmYWxzZSwgc3ByZWFkOmNvbnRyYT9MLUxtaW46MH07Cn0KCi8vIHdlYiAyLjI6IGRvZGF0bm8gcGl0YW5qZSBwb3N0YXZsamEgc2UgbmEgaXN0b20gZWtyYW51IGkgb2JhdmV6bm8gamU7IG92YWogcG9waXMgamUgc2FtbyByZXplcnZhCi8vIChucHIuIHphIGlzcHVuamF2YW5qZSBzcHJlbWxqZW5vIHUgcHJlZ2xlZG5pa3UgcHJpamUgMi4yKSDigJQgbWplxaFvdml0aSBvYnJhc2NpIGJleiBvZGdvdm9yYQpmdW5jdGlvbiB0aWVMaXN0KCl7CiAgcmV0dXJuIEMubWFwKChjLGkpPT4oe2ksIHNjOnNjb3JlKGkpfSkpLmZpbHRlcih4PT54LnNjLmNvbnRyYSAmJiB4LnNjLnRiPT1udWxsKQogICAgLnNvcnQoKHgseSk9Pih5LnNjLnNwcmVhZC14LnNjLnNwcmVhZCl8fCh4LmkteS5pKSk7Cn0KCi8qIFBvdmV6bmljZSBuYSBMaW5rZWRJbiB0ZWtzdG92ZSDigJQgSkVESU5PIG1qZXN0byB6YSB6YW1qZW51IHRla3N0YSBpbGkgYWRyZXNlLgogICBQcmF6bmEgYWRyZXNhICh1OiIiKSA9IHByaWthenVqZSBzZSBzYW1vIG5hc2xvdiwgYmV6IHBvdmV6bmljZTsgcHJhemFuIG5hc2xvdiA9IG5pxaF0YS4gKi8KY29uc3QgUE9TVFMgPSB7CiAgbmV6YW1qZW5qaXZpOnt0OiJJZiB5b3UncmUgaW5kaXNwZW5zYWJsZSwgeW91J3JlIHByb2JhYmx5IG5vdCByZWFkeSBmb3IgYSBtb3JlIHNlbmlvciByb2xlIiwgdToiaHR0cHM6Ly93d3cubGlua2VkaW4uY29tL3Bvc3RzL21pcm9zbGF2LWtsZXBhYy0xNjUwMTQyN19ha28tc3RlLW5lemFtamVuaml2aS12amVyb2phdG5vLW5pc3RlLXNwcmVtbmktYWN0aXZpdHktNzQ5Njk1NzE2NTE0OTI0MTM0NC00T1lfIn0sCiAgcHNpaG86ICAgICAgIHt0OiJXaHkgc29tZSBsZWFkZXJzIGxvdmUg4oCccHN5Y2hvbG9naWNhbCBzYWZldHnigJ0iLCB1OiJodHRwczovL3d3dy5saW5rZWRpbi5jb20vcG9zdHMvbWlyb3NsYXYta2xlcGFjLTE2NTAxNDI3X2V4ZWN1dGl2ZWNvYWNoaW5nLW1hbmFnZW1lbnRjb2FjaGluZy1jb2FjaGluZy1hY3Rpdml0eS03NDE5NzE3ODA0MzE0MTY1MjQ4LTRwQkwifSwKICBuYWpzbGFiaWphOiAge3Q6IkZvciBhIGxvbmcgdGltZSwgbXkgd2Vha2VzdCBza2lsbCBsb29rZWQgbGlrZSBhIHN0cmVuZ3RoIiwgdToiaHR0cHM6Ly93d3cubGlua2VkaW4uY29tL3Bvc3RzL21pcm9zbGF2LWtsZXBhYy0xNjUwMTQyN19tb2phLW5hanNsYWJpamEtdmplJUM1JUExdGluYS1kdWdvLWplLWl6Z2xlZGFsYS1hY3Rpdml0eS03NTAxMTk2NzI5NTMxMjY5MTIwLXFDbkEifSwKICBmZWVkYmFjazogICAge3Q6IklmIGZlZWRiYWNrIG5ldmVyIGh1cnRzLi4uIHNvbWVvbmUncyBseWluZyEiLCB1OiJodHRwczovL3d3dy5saW5rZWRpbi5jb20vcG9zdHMvbWlyb3NsYXYta2xlcGFjLTE2NTAxNDI3X2V4ZWN1dGl2ZWNvYWNoaW5nLWZlZWRiYWNrLWFjdGl2aXR5LTc0NDIyMDE3NTkxNjAzNzczNDQta01CQiJ9LAogIGl6ZGFvOiAgICAgICB7dDoiTXkgYm9zcyBiZXRyYXllZCBtZS4iLCB1OiJodHRwczovL3d3dy5saW5rZWRpbi5jb20vcG9zdHMvbWlyb3NsYXYta2xlcGFjLTE2NTAxNDI3X2V4ZWN1dGl2ZWNvYWNoaW5nLWxlYWRlcnNoaXAtbWFuYWdlbWVudC1hY3Rpdml0eS03NDUyMzI0NDkyODU4NTg1MDg4LVBPUUsifSwKICBzb2JhOiAgICAgICAge3Q6Ikkgd2Fsa2VkIGludG8gYSByb29tIHdpdGggYWJvdXQgdHdlbnR5IG1hbmFnZXJz4oCmIiwgdToiaHR0cHM6Ly93d3cubGlua2VkaW4uY29tL3Bvc3RzL21pcm9zbGF2LWtsZXBhYy0xNjUwMTQyN191JUM1JUExYW8tc2FtLXUtc29idS1zLWR2YWRlc2V0YWstbWFuYWdlcmEtamVkbmUtYWN0aXZpdHktNzQ0ODA1NDY1NTUxMjg0NjMzNi1hZzh6In0sCiAgemFnb25ldGthOiAgIHt0OiJTb2x2ZSB0aGUgcmlkZGxlOiA3LjUgwrEgMS41ID0gNiBvciA5IiwgdToiaHR0cHM6Ly93d3cubGlua2VkaW4uY29tL3Bvc3RzL21pcm9zbGF2LWtsZXBhYy0xNjUwMTQyN19yaWplJUM1JUExaXRlLXphZ29uZXRrdS1hY3Rpdml0eS03NDg3ODcwNTIzOTk4Mzg4MjI1LWhIdDgifSwKICBwcnZlbnN0dm86ICAge3Q6IkJpbGxpb25zIG9mIHBlb3BsZSB3YXRjaCB0aGUgV29ybGQgQ3VwIiwgdToiaHR0cHM6Ly93d3cubGlua2VkaW4uY29tL3Bvc3RzL21pcm9zbGF2LWtsZXBhYy0xNjUwMTQyN19taWxpamFyZGUtbGp1ZGktcHJhdGUtbm9nb21lbnRvLXN2amV0c2tvLWFjdGl2aXR5LTc0NzIyNjI4OTI5NDg2MTUxNjgtbElXXyJ9LAogIHNhYm90YXphOiAgICB7dDoiU2ltcGxlIFNhYm90YWdlIEZpZWxkIE1hbnVhbCIsIHU6Imh0dHBzOi8vd3d3LmxpbmtlZGluLmNvbS9wb3N0cy9taXJvc2xhdi1rbGVwYWMtMTY1MDE0MjdfYW1lcmklQzQlOERrYS10YWpuYS1zbHUlQzUlQkViYS1vc3MtcHJldGUlQzQlOERhLWNpYS1lLWFjdGl2aXR5LTc0Mzk2MzY1NTExMTYxNDQ2NDAtTU5iQyJ9LAogIHNsb246ICAgICAgICB7dDoiVGhlIG1vc3QgZXhwZW5zaXZlIHRoaW5nIGluIGFuIG9yZ2FuaXphdGlvbiBpcyB0aGUg4oCcZWxlcGhhbnQgaW4gdGhlIHJvb23igJ0iLCB1OiJodHRwczovL3d3dy5saW5rZWRpbi5jb20vcG9zdHMvbWlyb3NsYXYta2xlcGFjLTE2NTAxNDI3X2V4ZWN1dGl2ZWNvYWNoaW5nLW1hbmFnZW1lbnRjb2FjaGluZy1sZWFkZXJzaGlwLWFjdGl2aXR5LTc0MjE4OTExMTM3MTc5NzI5OTItT0R2VyJ9LAogIHRtb2JpbGU6ICAgICB7dDoiSW4gMjAwMiwgSSB3YXMgZGlyZWN0b3Igb2Ygc3RyYXRlZ3kgYXQgVC1Nb2JpbGUiLCB1OiJodHRwczovL3d3dy5saW5rZWRpbi5jb20vcG9zdHMvbWlyb3NsYXYta2xlcGFjLTE2NTAxNDI3X2dvZGluZS0yMDAyLXJhZGlvLXNhbS1rYW8tZGlyZWt0b3Itc3RyYXRlZ2lqZS1hY3Rpdml0eS03NDc4NDIxOTc1MDcwMDQwMDY0LW5oVjYifQp9Owpjb25zdCBQQVRfUE9TVCA9IHsiTmV6YW1qZW5qaXZpIjoibmV6YW1qZW5qaXZpIiwiVWdvZG5pIGRpcmVrdG9yIjoicHNpaG8iLCJTdHJ1xI1uamFrIGtvamkgbmFkamHEjWF2YSI6Im5hanNsYWJpamEiLAogICAgICAgICAgICAgICAgICAiSFIga2FvIHNrcm92acWhdGUiOiJmZWVkYmFjayIsIlZhdHJvZ2FzYWMiOiJpemRhbyIsIk9wcmV6bmkgaXp2csWhaXRlbGoiOiJzb2JhIiwiQnLFvmUgb2Qgc29iZSI6Im5hanNsYWJpamEifTsKY29uc3QgQ09NUF9QT1NUID0gWyJuZXphbWplbmppdmkiLCJ6YWdvbmV0a2EiLCJwcnZlbnN0dm8iLCJmZWVkYmFjayIsInNvYmEiLCJzYWJvdGF6YSIsIml6ZGFvIiwic2xvbiIsInRtb2JpbGUiXTsKZnVuY3Rpb24gcG9zdEhUTUwoa2V5KXsKICBjb25zdCBQID0gUE9TVFNba2V5XTsgaWYoIVAgfHwgIVAudCkgcmV0dXJuICIiOwogIGNvbnN0IHQgPSAi4oCcIiArIGVzYyhQLnQpICsgIuKAnSI7CiAgcmV0dXJuIGA8cCBjbGFzcz0ieG0tbm90ZSI+TW9yZSBvbiB0aGlzOiAke1AudSA\/IGA8YSBocmVmPSIke2VzYyhQLnUpfSIgdGFyZ2V0PSJfYmxhbmsiIHJlbD0ibm9vcGVuZXIiIGhyZWZsYW5nPSJociI+JHt0fTwvYT5gIDogdH0gKGluIENyb2F0aWFuKSDigJQgTWlyb3NsYXYgS2xlcGHEjSwgTGlua2VkSW48L3A+YDsKfQoKLyogT2JyYXNjaSAoemFrbGp1xI1lbm8gMjEuOS4yMDI2Likg4oCUIG5lIG1pamVuamFqdSBvY2plbmU7IG5hanZpxaFlIGR2YS4KICAgdjMuNSAoQSk6IHBydm8gb2JyYXNjaSBrb2plIHBvamHEjWF2YSBwcm92amVyYSwgemF0aW0gcmVkb3NsaWplZCBpeiBkb2t1bWVudGEuICovCmNvbnN0IFBBVFRFUk5TID0gWwoge2lkOiJOZXphbWplbmppdmkiLCBjbGllbnQ6IkJlaW5nIGluZGlzcGVuc2FibGUiLCBycToiV2hvIGNvdWxkIHN0ZXAgaW4gZm9yIHlvdSBmb3IgdGhyZWUgbW9udGhzIHN0YXJ0aW5nIHRvbW9ycm93IOKAlCBhbmQgd2h5IGhhdmVuJ3QgeW91IHN0YXJ0ZWQgcHJlcGFyaW5nIHRoYXQgcGVyc29uIHlldD8iLAogIHRlc3Q6KFIscm93cyk9PltSKDAsMSl8fFIoMCwyKSwgUig1LDEpLCBSKDIsMSl8fFIoMiwyKV0uZmlsdGVyKEJvb2xlYW4pLmxlbmd0aD49MiwKICB0ZXh0OiJZb3VyIGFuc3dlcnMgZGVzY3JpYmUgc29tZW9uZSB0aGUgd29yayBjYW4ndCBnbyBvbiB3aXRob3V0IOKAlCBhbmQgd2hvLCBmb3IgdGhhdCB2ZXJ5IHJlYXNvbiwgaGFzIGEgaGFyZCB0aW1lIG1vdmluZyB1cC4gT3JnYW5pemF0aW9ucyByZWxpYWJseSByZXdhcmQgdGhpcyB3aXRoIGV2ZW4gbW9yZSBwcm9ibGVtcyBhbmQgcHV0IG9mZiB0aGUgcHJvbW90aW9uIGJlY2F1c2Ug4oCcd2UgaGF2ZSBubyBvbmUgd2hvIGNvdWxkIHJlcGxhY2UgeW91LuKAnSBUaGUgbmV4dCBsZXZlbCBpc24ndCBsb29raW5nIGZvciBzb21lb25lIHdobyBzb2x2ZXMgZXZlcnl0aGluZyBhbG9uZSwgYnV0IGZvciBzb21lb25lIHdobyBtYWtlcyB0aGUgc3lzdGVtIHdvcmsgZXZlbiB3aGVuIHRoZXkncmUgbm90IGluIHRoZSByb29tLiIsCiAgcG9zdDoiSWYgeW91J3JlIGluZGlzcGVuc2FibGUsIHlvdSdyZSBwcm9iYWJseSBub3QgcmVhZHkgZm9yIGEgbW9yZSBzZW5pb3Igcm9sZSJ9LAoge2lkOiJVZ29kbmkgZGlyZWt0b3IiLCBjbGllbnQ6IktlZXBpbmcgdGhlIHBlYWNlIiwgcnE6IldobyBvbiB5b3VyIHRlYW0gYXJlIHlvdSBzaGllbGRpbmcgZnJvbSBhIGRpZmZpY3VsdCBjb252ZXJzYXRpb24g4oCUIGFuZCB3aG8gYXJlIHlvdSByZWFsbHkgcHJvdGVjdGluZz8iLAogIHRlc3Q6KFIscm93cyk9PnJvd3NbMV0ucz49cm93c1sxXS5yZXEgJiYgcm93c1szXS5zPHJvd3NbM10ucmVxICYmIHJvd3NbNF0uczxyb3dzWzRdLnJlcSwKICB0ZXh0OiJQZW9wbGUgbGlrZSB3b3JraW5nIHdpdGggeW91OiB5b3UgbGlzdGVuLCB5b3UgdW5kZXJzdGFuZCwgYW5kIHlvdSBkb24ndCBjcmVhdGUgdW5uZWNlc3NhcnkgdGVuc2lvbi4gRGVjaXNpb25zIGFuZCBkaWZmaWN1bHQgY29udmVyc2F0aW9ucyBwYXkgdGhlIHByaWNlOiB0aGV5IGdldCBwdXQgb2ZmIHdoaWxlIHlvdSB3YWl0IGZvciB0aGluZ3MgdG8gdGFrZSB0aGVpciBvd24gY291cnNlLiBBIGdvb2QgYXRtb3NwaGVyZSBhbmQgY2xhcml0eSBhcmVuJ3Qgb3Bwb3NpdGVzLCBidXQgdGhlIGZpcnN0IHdpdGhvdXQgdGhlIHNlY29uZCBnZXRzIGV4cGVuc2l2ZSBvdmVyIHRpbWUuIiwKICBwb3N0OiJXaHkgc29tZSBsZWFkZXJzIGxvdmUg4oCccHN5Y2hvbG9naWNhbCBzYWZldHnigJ0ifSwKIHtpZDoiU3RydcSNbmphayBrb2ppIG5hZGphxI1hdmEiLCBjbGllbnQ6Ildpbm5pbmcgdGhlIGFyZ3VtZW50IiwgcnE6IldoaWNoIG9mIHlvdXIgcmVjZW50IGRlY2lzaW9ucyB3YXMgY29tcGxldGVseSByaWdodCDigJQgYW5kIG5ldmVyIGNhcnJpZWQgb3V0PyIsCiAgdGVzdDooUixyb3dzKT0+UigxLDIpICYmICFSKDEsNCkgJiYgIVIoMSw1KSAmJiAoUig4LDEpfHxSKDUsMyl8fFIoNyw0KXx8Uig3LDUpKSwKICB0ZXh0OiJZb3VyIHN0cmVuZ3RoIGlzIHRoYXQgeW91J3JlIHVzdWFsbHkgcmlnaHQgYW5kIHlvdSBjYW4gcHJvdmUgaXQuIFRoZSB0cmFwIGlzIHRoYXQgYSBjb3JyZWN0IGFuc3dlciBhbmQgYSBjb252aW5jaW5nIGFuc3dlciBhcmUgbm90IHRoZSBzYW1lIHNraWxsIOKAlCBhbmQgb25seSBvbmUgb2YgdGhlbSBtb3ZlcyBkZWNpc2lvbnMuIFdoZW4gb3RoZXJzIGRvbid0IGZlZWwgdGhlIGRlY2lzaW9uIGlzIHRoZWlycyB0b28sIGl0IGRvZXNuJ3QgaGFwcGVuLCBubyBtYXR0ZXIgaG93IHNvbGlkIHRoZSBhcmd1bWVudC4iLAogIHBvc3Q6IkZvciBhIGxvbmcgdGltZSwgbXkgd2Vha2VzdCBza2lsbCBsb29rZWQgbGlrZSBhIHN0cmVuZ3RoIn0sCiB7aWQ6IkhSIGthbyBza3JvdmnFoXRlIiwgY2xpZW50OiJEZWxlZ2F0ZWQgZGlzY29tZm9ydCIsIHJxOiJXaGF0IHdhcyB0aGUgbGFzdCBjb252ZXJzYXRpb24geW91IGhhbmRlZCBvdmVyIHRvIEhSIHRoYXQgeW91IHNob3VsZCBoYXZlIGhhZCB5b3Vyc2VsZj8iLAogIHRlc3Q6KFIscm93cyk9PlIoMywxKSAmJiBSKDIsMSksCiAgdGV4dDoiSW4gdHdvIGRpZmZlcmVudCBhcmVhcyDigJQgZGlmZmljdWx0IGZlZWRiYWNrIGFuZCBkZXZlbG9waW5nIHBlb3BsZSDigJQgeW91IG1ha2UgdGhlIHNhbWUgbW92ZTogdGhlIGlzc3VlIGdvZXMgdG8gdGhlIHBlcnNvbiBvciBmdW5jdGlvbiBmb3JtYWxseSByZXNwb25zaWJsZSBmb3IgaXQuIFRoYXQncyByZWFzb25hYmxlIHdoZW4gdGhlIHByb2JsZW0gaXMgc3lzdGVtaWMuIFdoZW4gaXQncyBwZXJzb25hbCwgdGhlIG1lc3NhZ2UgdGhlIHRlYW0gaGVhcnMgaXNuJ3Qg4oCcSFIgd2lsbCB0YWtlIGNhcmUgb2YgaXQs4oCdIGJ1dCDigJx0aGV5IGRvbid0IHdhbnQgdG8gZGlzY3VzcyB0aGlzIHdpdGggdXMu4oCdIiwKICBwb3N0OiJJZiBmZWVkYmFjayBuZXZlciBodXJ0cy4uLiBzb21lb25lJ3MgbHlpbmchIn0sCiB7aWQ6IlZhdHJvZ2FzYWMiLCBjbGllbnQ6IkZpcmVmaWdodGluZyIsIHJxOiJXaGF0IGRpZCB5b3Ugc2F5IHVuZGVyIHByZXNzdXJlIGluIHRoZSBsYXN0IG1vbnRoIHRoYXQgeW91J2QgaGF2ZSBwdXQgZGlmZmVyZW50bHkgdGhlIHNhbWUgZGF5PyIsCiAgdGVzdDooUixyb3dzKT0+Uig2LDEpICYmIChSKDMsMil8fFIoNSwyKSksCiAgdGV4dDoiV2hlbiB0aGluZ3MgYXJlIG9uIGZpcmUsIHBlb3BsZSBjYW4gY291bnQgb24geW91OiB5b3UgcmVhY3QgcXVpY2tseSwgY2xlYXJseSBhbmQgd2l0aG91dCBoZXNpdGF0aW9uLiBUaGUgcHJvYmxlbSBpcyB0aGF0IHBlb3BsZSBsZWFybiB0byB3YWl0IHVudGlsIHNvbWV0aGluZyBjYXRjaGVzIGZpcmUg4oCUIGJlY2F1c2UgdGhhdCdzIHdoZW4gdGhleSBnZXQgeW91ciBmdWxsIGF0dGVudGlvbiwgYW5kIG5vdCBiZWZvcmUuIEFuIG9yZ2FuaXphdGlvbiBydW4gYnkgZmlyZWZpZ2h0aW5nIGV2ZW50dWFsbHkgc3RhcnRzIGl0cyBvd24gZmlyZXMuIiwKICBwb3N0OiJNeSBib3NzIGJldHJheWVkIG1lLiJ9LAoge2lkOiJPcHJlem5pIGl6dnLFoWl0ZWxqIiwgY2xpZW50OiJUaGUgZGVjaXNpb24gZ29lcyB1cHN0YWlycyIsIHJxOiJXaGF0IGRlY2lzaW9uIHdvdWxkIHlvdSBtYWtlIHRvbW9ycm93IG1vcm5pbmcgaWYgeW91IGtuZXcgbm8gb25lIHdvdWxkIGFzayB5b3UgZm9yIG1vcmUgYW5hbHlzaXM\/IiwKICB0ZXN0OihSLHJvd3MpPT4oUig0LDEpfHxSKDQsMikpICYmIChSKDcsMSl8fFIoNywyKSksCiAgdGV4dDoiWW91IHdvcmsgcmVsaWFibHkgYW5kIHJhcmVseSBtYWtlIG1pc3Rha2VzIOKAlCBwYXJ0bHkgYmVjYXVzZSBpbXBvcnRhbnQgZGVjaXNpb25zIHdhaXQgZm9yIGVub3VnaCBkYXRhIG9yIGZvciBhbiBhbnN3ZXIgZnJvbSBoaWdoZXIgdXAuIFRoYXQgcHJvdGVjdHMgeW91IGZyb20gbWlzdGFrZXMsIGJ1dCBub3QgZnJvbSBkZWxheXMuIEF0IHRoZSBuZXh0IGxldmVsLCBub2JvZHkgd2lsbCBhc2sgeW91IGZvciBhIHJlcG9ydCBvbiB0aGUgb3B0aW9uczsgdGhleSdsbCBhc2sgeW91IGZvciBhIGRlY2lzaW9uLiIsCiAgcG9zdDoiSSB3YWxrZWQgaW50byBhIHJvb20gd2l0aCBhYm91dCB0d2VudHkgbWFuYWdlcnPigKYifSwKIHtpZDoiQnLFvmUgb2Qgc29iZSIsIGNsaWVudDoiQWhlYWQgb2YgdGhlIHJvb20iLCBycToiV2hvIG9uIHlvdXIgdGVhbSBuZWVkcyB0ZW4gc2Vjb25kcyBsb25nZXIgdGhhbiB5b3UgdG8gdm9pY2UgYSBnb29kIGlkZWEg4oCUIGFuZCBkbyB5b3UgaGVhciBpdD8iLAogIHRlc3Q6KFIscm93cyk9PihzdC5yb2xlPT1udWxsPzE6c3Qucm9sZSk+PTEgJiYgIXJvd3NbNF0ubmQgJiYgcm93c1s0XS5zPj1yb3dzWzRdLnJlcSAmJiBSKDEsMSkgJiYgKFIoNiwyKXx8UigzLDIpKSwKICB0ZXh0OiJUaGUg4oCccm9vbeKAnSBpcyB0aGUgcGVvcGxlIHlvdSBtYWtlIGRlY2lzaW9ucyB3aXRoOiB5b3VyIHRlYW0sIGNvbGxlYWd1ZXMsIHRoZSBleGVjdXRpdmUgdGVhbSBvciBtYW5hZ2VtZW50IGJvYXJkLiBZb3UgaGF2ZSB0aGUgZGVjaXNpb24gYmVmb3JlIHRoZSByb29tIGV2ZW4gZ2V0cyB0byB0aGUgcXVlc3Rpb24g4oCUIGFuZCBpdCdzIHVzdWFsbHkgYSBnb29kIG9uZSwgd2hpY2ggaXMgd2h5IHBlb3BsZSB0cnVzdCB5b3UuIFRoZSBjb3N0IGlzIHRoYXQgcGVvcGxlIHNlZSB0aGUgZGVjaXNpb24gYnV0IG5vdCB0aGUgcGF0aCB0byBpdCwgc28gdGhleSBkb24ndCBmZWVsIGl0J3MgdGhlaXJzLiBBdCB0aGUgbmV4dCBsZXZlbCwgc3BlZWQgc3RheXMgYSB2aXJ0dWUgb25seSBpZiB0aGUgcm9vbSBjb21lcyB3aXRoIHlvdS4iLAogIHBvc3Q6IkZvciBhIGxvbmcgdGltZSwgbXkgd2Vha2VzdCBza2lsbCBsb29rZWQgbGlrZSBhIHN0cmVuZ3RoIn0KXTsKY29uc3QgQk9PU1QgPSB7CiAgIk5lemFtamVuaml2aSI6ICgpPT4oc3QucFswXT8\/LTEpPj0yLAogICJIUiBrYW8gc2tyb3ZpxaF0ZSI6ICgpPT4oc3QucFszXT8\/LTEpPj0yLAogICJWYXRyb2dhc2FjIjogKCk9PihzdC5wWzZdPz8tMSk+PTEsCiAgIk9wcmV6bmkgaXp2csWhaXRlbGoiOiAoKT0+KHN0LnBbNF0\/Py0xKT49Mgp9Owpjb25zdCBMSU5LID0gezA6WyJOZXphbWplbmppdmkiXSwxOlsiVWdvZG5pIGRpcmVrdG9yIiwiU3RydcSNbmphayBrb2ppIG5hZGphxI1hdmEiLCJCcsW+ZSBvZCBzb2JlIl0sMjpbIk5lemFtamVuaml2aSIsIkhSIGthbyBza3JvdmnFoXRlIl0sMzpbIlVnb2RuaSBkaXJla3RvciIsIkhSIGthbyBza3JvdmnFoXRlIiwiVmF0cm9nYXNhYyIsIkJyxb5lIG9kIHNvYmUiXSw0OlsiVWdvZG5pIGRpcmVrdG9yIiwiT3ByZXpuaSBpenZyxaFpdGVsaiJdLDU6WyJOZXphbWplbmppdmkiLCJWYXRyb2dhc2FjIl0sNjpbIlZhdHJvZ2FzYWMiLCJCcsW+ZSBvZCBzb2JlIl0sNzpbIk9wcmV6bmkgaXp2csWhaXRlbGoiXSw4OltdfTsKLyogdjMuNyAodmFyaWphbnRhIEIsIE1pcm8gMi4xMC4pOiB1IG1qZcWhb3ZpdG9qIGtvbXBldGVuY2lqaSBwcmF2aWxhIHZpZGUgc2FtbyB0dnJkbmp1IGl6YWJyYW51IGthbyBuYWrEjWXFocSHdS4KICAgIkJyxb5lIG9kIHNvYmUiICg3LiwgTWlybyAyLjEwLik6IHNhbW8gdWxvZ2UgQiwgQyBpIEQuICovCmZ1bmN0aW9uIHBhdHRlcm5zKHJvd3MpewogIGNvbnN0IFI9KGssbCk9PnsgaWYoKHN0LmFba11bbC0xXT8\/MCk8MikgcmV0dXJuIGZhbHNlOyBjb25zdCB4PXJvd3Nba107IHJldHVybiAhKHggJiYgeC5jb250cmEgJiYgeC50YiE9bnVsbCkgfHwgeC50Yj09PWw7IH07CiAgcmV0dXJuIFBBVFRFUk5TLm1hcCgocCxpKT0+KHtwLGksYjohIShCT09TVFtwLmlkXSYmQk9PU1RbcC5pZF0oKSl9KSkKICAgIC5maWx0ZXIoeD0+eC5wLnRlc3QoUixyb3dzKSkKICAgIC5zb3J0KCh4LHkpPT4oeS5iLXguYil8fCh4LmkteS5pKSkKICAgIC5tYXAoeD0+T2JqZWN0LmFzc2lnbih7fSx4LnAse2Jvb3N0ZWQ6eC5ifSkpOwp9Ci8qIHYzLjUgKEIpOiByZWRvc2xpamVkIHBvZHJ1xI1qYSByYXp2b2phIGtvZCBqZWRuYWtvZyBqYXphOgogICBiZXogbmVzdWdsYXNqYSDihpIgcHJvdmplcmEgcG90dnLEkXVqZSBzbGFiaWp1IHN0cmFudSDihpIgdmV6YW5vIHV6IGFrdGl2bmkgb2JyYXphYyDihpIgcmVkb3NsaWplZCBrb21wZXRlbmNpamEgKi8KZnVuY3Rpb24gZGV2T3JkZXIocm93cywgcGF0cyl7CiAgY29uc3QgYWN0ID0gcGF0cy5tYXAocD0+cC5pZCk7CiAgcmV0dXJuIHJvd3MuZmlsdGVyKHg9PiF4Lm5kICYmIHguZ2FwPjApLm1hcCh4PT5PYmplY3QuYXNzaWduKHt9LHgse2xwOkxJTktbeC5pXS5zb21lKGlkPT5hY3QuaW5jbHVkZXMoaWQpKX0pKQogICAgLnNvcnQoKGEsYik9PihiLmdhcC1hLmdhcCl8fChhLmNvbnRyYS1iLmNvbnRyYSl8fChiLnB3ZWFrLWEucHdlYWspfHwoYi5scC1hLmxwKXx8KGEuaS1iLmkpKTsKfQpmdW5jdGlvbiBzdHJvbmdlc3Qocm93cyl7CiAgcmV0dXJuIHJvd3MuZmlsdGVyKHg9PiF4Lm5kICYmIHguZ2FwPD0wICYmICF4LmNvbnRyYSAmJiAheC5wZmFpbCkuc29ydCgoYSxiKT0+KGEuZ2FwLWIuZ2FwKXx8KGIucy1hLnMpfHwoYS5pLWIuaSkpOwp9Ci8qIEludGVybmEgb3puYWthICJzdmltYSBrYcW+ZW0gZGEiOgogICB2My41IOKAlCB1IDMgaWxpIHZpxaFlIGtvbXBldGVuY2lqYSByYXppbmUgMSwgMiBpIDMgc3ZlIHJlZG92aXRlOwogICB3ZWIgMi4wIOKAlCBwYWxpIHNlIGkga2FkIHN1IHUgamVkbm9qIGtvbXBldGVuY2lqaSBzdmUgdHZyZG5qZSByZWRvdml0ZS4gKi8KZnVuY3Rpb24gZmxhdENvdW50KCl7IHJldHVybiBzdC5hLmZpbHRlcigocixpKT0+IXN0Lm5hW2ldJiYoclswXT8\/MCk+PTImJihyWzFdPz8wKT49MiYmKHJbMl0\/PzApPj0yKS5sZW5ndGg7IH0KZnVuY3Rpb24gYWxsUmVnQ291bnQoKXsgcmV0dXJuIHN0LmEuZmlsdGVyKChyLGkpPT4hc3QubmFbaV0mJnIuZXZlcnkodj0+KHY\/PzApPj0yKSkubGVuZ3RoOyB9CmZ1bmN0aW9uIGFjcXVpZXNjZSgpeyByZXR1cm4gZmxhdENvdW50KCk+PTMgfHwgYWxsUmVnQ291bnQoKT49MTsgfQoKLyogT3puYWthICJtb2d1xIdlIGRvYnJvIG1pamVuamFuamUgc3RpbGEiIOKAlCB3ZWIgMi4yOiBTQU1PIHUgTWlyb3Z1IGludGVybm9tIHNhxb5ldGt1LCBrbGlqZW50IGplIG5lIHZpZGkuCiAgIFV2amV0aTogbWplxaFvdml0IG9icmF6YWMgdSAzKyBrb21wZXRlbmNpamEsIHUgdmXEh2luaSByYXptYWsgbmFqdmnFoWUgMiByYXppbmUsCiAgIGJleiBvem5ha2UgInN2aW1hIGthxb5lbSBkYSIgaSBiZXogcGFsZSBwcm92amVyZS4gKi8KZnVuY3Rpb24gYWRhcHRpdmUocm93cyl7CiAgY29uc3QgbWl4ID0gcm93cy5maWx0ZXIoeD0+eC5jb250cmEpOwogIGlmKG1peC5sZW5ndGg8MyB8fCBhY3F1aWVzY2UoKSkgcmV0dXJuIG51bGw7CiAgY29uc3QgY2xvc2UgPSBtaXguZmlsdGVyKHg9Pnguc3ByZWFkPD0yKS5sZW5ndGg7CiAgaWYoY2xvc2UgPCBNYXRoLmNlaWwobWl4Lmxlbmd0aC8yKSkgcmV0dXJuIG51bGw7CiAgaWYobWl4LnNvbWUoeD0+eC5wZmFpbCkpIHJldHVybiBudWxsOwogIHJldHVybiBtaXg7Cn0KCi8qIEtvbnRyb2xhICh3ZWIgMi4yKTogcGV0IHR2cmRuamkgb3Bpc3VqZSBpc3R1IHNpdHVhY2lqdSwgcGEgbmFqdmnFoWUgZHZpamUgbW9ndSBiaXRpCiAgICLEjWVzdG8iIGlsaSAiZ290b3ZvIHV2aWplayIuIFRyaSBpbGkgdmnFoWUg4oaSIGJsb2thZGEgIkRhbGplIi4gVXBvem9yZW5qYSB2acWhZSBuZW1hLgogICBTdmFraSB1bGF6YWsgdSBibG9rYWR1IGJyb2ppIHNlIHUgc3QuYmggKGludGVybmkgc2lnbmFsIGJyem9nL25laXNrcmVub2cgaXNwdW5qYXZhbmphKS4gKi8KZnVuY3Rpb24gY250TWFqKGkpeyByZXR1cm4gc3QuYVtpXS5maWx0ZXIodj0+KHY\/PzApPj0yKS5sZW5ndGg7IH0KZnVuY3Rpb24gYmxvY2tTdW0oaSl7IHJldHVybiAhc3QubmFbaV0gJiYgY250TWFqKGkpID49IEJMT0NLX01BSjsgfQoKZnVuY3Rpb24gcHJpdmFjeUhUTUwoKXsKICByZXR1cm4gYDxkZXRhaWxzIGNsYXNzPSJ4bS1wcml2YWN5Ij4KICAgIDxzdW1tYXJ5PlByaXZhY3kgbm90aWNlPC9zdW1tYXJ5PgogICAgPGRpdj4KICAgICAgPHA+RGF0YSBjb250cm9sbGVyOiBFeHBlcnRpdmUgZC5vLm8uLCBCaXN0cmFjIDYsIDEwNDMwIFNhbW9ib3IsIENyb2F0aWEsIE9JQiAoQ3JvYXRpYW4gdGF4IElEKSA2MDIyMDAyOTAwNSDCtyBtaXJvc2xhdi5rbGVwYWNAZXhwZXJ0aXZlLmhyPC9wPgogICAgICA8cD5EYXRhOiBlbWFpbCBhZGRyZXNzOyB5b3VyIGFuc3dlcnMgYW5kIHRlc3QgcmVzdWx0OyB5b3VyIGZ1bGwgbmFtZSwgY29tcGFueSBhbmQgcG9zaXRpb24gb25seSBpZiB5b3UgcmVxdWVzdCBhIHBlcnNvbmFsIGNvbW1lbnQuPC9wPgogICAgICA8cD5QdXJwb3NlIGFuZCBsZWdhbCBiYXNpczogc2VuZGluZyB0aGUgdGVzdCByZXN1bHQgdG8geW91ciBlbWFpbDsgcHJlcGFyaW5nIGFuZCBzZW5kaW5nIGEgcGVyc29uYWwgY29tbWVudCBpZiB5b3UgcmVxdWVzdCBvbmU7IG9jY2FzaW9uYWwgdXBkYXRlcyBpZiB5b3Ugc3BlY2lmaWNhbGx5IG9wdCBpbi4gQW5zd2VycyBhbmQgcmVzdWx0cywgd2l0aG91dCB5b3VyIGVtYWlsIGFkZHJlc3Mgb3IgYW55IG90aGVyIGRhdGEgdGhhdCBjb3VsZCBpZGVudGlmeSB5b3UsIGFyZSBhbHNvIHVzZWQgZm9yIHN0YXRpc3RpY2FsIGFuYWx5c2lzIGFuZCB0byBpbXByb3ZlIHRoZSBpbnN0cnVtZW50LiBUaGUgbGVnYWwgYmFzaXMgaXMgeW91ciBjb25zZW50IChBcnRpY2xlIDYoMSkoYSkgb2YgdGhlIEdlbmVyYWwgRGF0YSBQcm90ZWN0aW9uIFJlZ3VsYXRpb24pLiBFYWNoIGNvbnNlbnQgaXMgc2VwYXJhdGUsIGFuZCB5b3UgY2FuIHdpdGhkcmF3IGVhY2ggb25lIGluZGl2aWR1YWxseS48L3A+CiAgICAgIDxwPkRhdGEgcHJvY2Vzc2luZzogYW5zd2VycyBhcmUgcHJvY2Vzc2VkIG9uIHRoZSBleHBlcnRpdmUuaHIgd2ViIHNlcnZlciwgYW5kIGVtYWlscyBhcmUgc2VudCB0aHJvdWdoIE1pY3Jvc29mdCAzNjUsIHdoaWNoIEV4cGVydGl2ZSBkLm8uby4gdXNlcyBmb3IgYnVzaW5lc3MgZW1haWwuPC9wPgogICAgICA8cD5BSSB0b29sczogdG8gcHJlcGFyZSBjb21tZW50cywgcmVzdWx0cyBtYXkgYmUgYW5hbHl6ZWQgd2l0aCB0aGUgaGVscCBvZiBBSSB0b29scywgYWx3YXlzIHdpdGhvdXQgeW91ciBuYW1lLCBlbWFpbCBvciBjb21wYW55IG5hbWUuIEFsbCBjb21tZW50cyBhbmQgcmVzdWx0cyBhcmUgd3JpdHRlbiBhbmQgY2hlY2tlZCBieSBNaXJvc2xhdiBLbGVwYcSNLjwvcD4KICAgICAgPHA+UmV0ZW50aW9uOiAyNCBtb250aHMgZnJvbSBjb21wbGV0aW9uIG9yIHVudGlsIHlvdSB3aXRoZHJhdyBjb25zZW50LCB3aGljaGV2ZXIgY29tZXMgZmlyc3QuIERhdGEgaXMgbm90IHNoYXJlZCB3aXRoIHRoaXJkIHBhcnRpZXMgZm9yIG1hcmtldGluZyBwdXJwb3Nlcy48L3A+CiAgICAgIDxwPllvdXIgcmlnaHRzOiBhY2Nlc3MsIGNvcnJlY3Rpb24sIGVyYXN1cmUsIHJlc3RyaWN0aW9uIG9mIHByb2Nlc3NpbmcgYW5kIHdpdGhkcmF3YWwgb2YgY29uc2VudCBhdCBhbnkgdGltZSwgd2l0aG91dCBhZmZlY3RpbmcgdGhlIGxhd2Z1bG5lc3Mgb2YgcHJvY2Vzc2luZyBiZWZvcmUgd2l0aGRyYXdhbCDigJQgYW4gZW1haWwgdG8gdGhlIGFkZHJlc3MgYWJvdmUgaXMgYWxsIGl0IHRha2VzLiBZb3UgaGF2ZSB0aGUgcmlnaHQgdG8gbG9kZ2UgYSBjb21wbGFpbnQgd2l0aCB0aGUgQ3JvYXRpYW4gUGVyc29uYWwgRGF0YSBQcm90ZWN0aW9uIEFnZW5jeSAoQVpPUCkuPC9wPgogICAgPC9kaXY+CiAgPC9kZXRhaWxzPmA7Cn0KCmZ1bmN0aW9uIHNlbmQoZmllbGRzKXsKICByZXR1cm4gZmV0Y2goU0VORF9VUkwse21ldGhvZDoiUE9TVCIsY3JlZGVudGlhbHM6InNhbWUtb3JpZ2luIixoZWFkZXJzOnsiQ29udGVudC1UeXBlIjoiYXBwbGljYXRpb24vanNvbiIsIkFjY2VwdCI6ImFwcGxpY2F0aW9uL2pzb24ifSxib2R5OkpTT04uc3RyaW5naWZ5KGZpZWxkcyl9KQogICAgLnRoZW4ocj0+ci5qc29uKCkuY2F0Y2goKCk9Pih7fSkpLnRoZW4oaj0+KHtvazpyLm9rICYmIGouc3VjY2Vzcz09PXRydWUsIGNsaWVudDpqLmNsaWVudCE9PWZhbHNlLCBsaW1pdDpyLnN0YXR1cz09PTQyOX0pKSkKICAgIC5jYXRjaCgoKT0+KHtvazpmYWxzZX0pKTsKfQoKZnVuY3Rpb24gc3RhcnRSZWFkeSgpeyByZXR1cm4gc3Qucm9sZSE9bnVsbCAmJiBFTUFJTF9SRS50ZXN0KHN0LmVtYWlsLnRyaW0oKSkgJiYgc3QuY29uc2VudDE7IH0KZnVuY3Rpb24gd2h5QmxvY2tlZCgpewogIGlmKHN0LnJvbGU9PW51bGwpIHJldHVybiAiUGxlYXNlIGNob29zZSB5b3VyIHJvbGUgKFN0ZXAgMSkuIjsKICBpZighRU1BSUxfUkUudGVzdChzdC5lbWFpbC50cmltKCkpKSByZXR1cm4gIlBsZWFzZSBlbnRlciBhIHZhbGlkIGVtYWlsIGFkZHJlc3MuIjsKICBpZighc3QuY29uc2VudDEpIHJldHVybiAiUGxlYXNlIGNvbmZpcm0geW91ciBjb25zZW50LiI7CiAgcmV0dXJuICIiOwp9CgpmdW5jdGlvbiByZW5kZXJTdGFydCgpewogIGNvbnN0IHN0YXJ0ZWQgPSBzdC5hLnNvbWUocj0+ci5zb21lKHY9PnYhPW51bGwpKTsKICBoKGAKICA8c2VjdGlvbiBjbGFzcz0ieG0tcGFuZWwiPgogICAgPGgxPlNraWxscyBNYXRyaXg8L2gxPgogICAgPHAgY2xhc3M9InhtLWxlZGUiPk5pbmUgc2tpbGxzLCBmaXZlIHN0YXRlbWVudHMgZWFjaC4gRm9yIGVhY2ggb25lLCB0aGluayBvZiBhIHBhcnRpY3VsYXIgdHlwZSBvZiBzaXR1YXRpb24gYW5kIGVzdGltYXRlIGhvdyBvZnRlbiB5b3UgYWN0IGluIGVhY2ggb2YgdGhlIHdheXMgZGVzY3JpYmVkLiBBYm91dCBlaWdodCBtaW51dGVzLjwvcD4KICAgIDxoMyBjbGFzcz0ieG0taG93dG8taCI+SG93IHRvIGFuc3dlcjwvaDM+CiAgICA8b2wgY2xhc3M9InhtLWhvd3RvIj4KICAgICAgPGxpPjxzdHJvbmc+UmVhZCBhbGwgZml2ZSBmaXJzdC48L3N0cm9uZz4gVGhlIHN0YXRlbWVudHMgZGVzY3JpYmUgZGlmZmVyZW50IHdheXMgb2YgaGFuZGxpbmcgdGhlIHNhbWUgc2l0dWF0aW9uLCBzbyB0aGV5J3JlIGVhc2llciB0byByYXRlIHNpZGUgYnkgc2lkZS4gSWYgYSBsYXRlciBzdGF0ZW1lbnQgZGVzY3JpYmVzIHdoYXQgeW91IGFjdHVhbGx5IGRvIGJldHRlciwgZmVlbCBmcmVlIHRvIGNoYW5nZSB5b3VyIGVhcmxpZXIgYW5zd2VycyBvbiB0aGF0IHNjcmVlbi4gRG9uJ3Qgb3ZlcnRoaW5rIGl0OiB5b3VyIGZpcnN0IGltcHJlc3Npb24sIG9uY2UgeW91J3ZlIHJlYWQgYWxsIGZpdmUsIGlzIHVzdWFsbHkgdGhlIG1vc3QgYWNjdXJhdGUuPC9saT4KICAgICAgPGxpPjxzdHJvbmc+SG93IGl0IGlzLCBub3QgaG93IHlvdSdkIGxpa2UgaXQgdG8gYmUuPC9zdHJvbmc+IFdlJ3JlIGFza2luZyB3aGF0IHlvdSBhY3R1YWxseSBkaWQsIG5vdCB3aGF0IHlvdSB0aGluayBpcyByaWdodC4gSXQgaGVscHMgdG8gcmVjYWxsIHNwZWNpZmljIHNpdHVhdGlvbnMgZnJvbSB0aGUgcGFzdCBmZXcgd2Vla3MuPC9saT4KICAgICAgPGxpPjxzdHJvbmc+SG9sZCBub3RoaW5nIGJhY2suPC9zdHJvbmc+IFRoZXJlIGFyZSBubyByaWdodCBvciB3cm9uZyBhbnN3ZXJzLCBiZWNhdXNlIGV2ZXJ5IHN0YXRlbWVudCBkZXNjcmliZXMgYW4gYXBwcm9hY2ggc29tZW9uZSBjb3VsZCBkZWZlbmQuIFRoZSB2YWx1ZSBvZiB0aGUgcmVzdWx0IGRlcGVuZHMgZW50aXJlbHkgb24gaG93IGhvbmVzdGx5IHlvdSBhbnN3ZXIuPC9saT4KICAgICAgPGxpPjxzdHJvbmc+RXN0aW1hdGUsIGRvbid0IGNvdW50Ljwvc3Ryb25nPiBOb2JvZHkga2VlcHMgYSByZWNvcmQgb2YgZXZlcnkgaW5zdGFuY2UsIHNvIGFuIGVzdGltYXRlIGJhc2VkIG9uIHlvdXIgZXhwZXJpZW5jZSBpcyBwZXJmZWN0bHkgZmluZS4gSWYgc2V2ZXJhbCBiZWhhdmlvcnMgYXJlIGZyZXF1ZW50IGZvciB5b3UsIGFuc3dlciBhY2NvcmRpbmdseSDigJQgd2UnbGwgYXNrIHdoaWNoIG9uZSB5b3UgZG8gbW9zdCBvZnRlbi48L2xpPgogICAgPC9vbD4KICAgIDxkaXYgY2xhc3M9InhtLWxpbWl0cyI+CiAgICAgIDxwPlRoaXMgaXMgYSBzZWxmLWFzc2Vzc21lbnQ6IGl0IHNob3dzIGhvdyB5b3Ugc2VlIHlvdXJzZWxmLCBub3QgaG93IG90aGVycyBzZWUgeW91LCBzbyB0aGUgcmVzdWx0IGlzIGluZGljYXRpdmUsIG5vdCBmaW5hbC4gSXQgaXNuJ3QgYSBwc3ljaG9tZXRyaWMgaW5zdHJ1bWVudDsgdGhlIGV4cGVjdGVkIGxldmVscyBmb3IgZWFjaCByb2xlIGFyZSBiYXNlZCBvbiAyLDUwMCBob3VycyBvZiBjb2FjaGluZyB3aXRoIDEwMCsgbWFuYWdlcnMuPC9wPgogICAgICA8cD5UaGUgbW9zdCB2YWx1YWJsZSBmaW5kaW5nIGlzIHVzdWFsbHkgdGhlIGdhcCBiZXR3ZWVuIGhvdyB5b3UgcmF0ZSB5b3Vyc2VsZiBhbmQgaG93IG90aGVycyByYXRlIHlvdSDigJQgd2hpY2ggaXMgd2h5IHRoZXJlJ3MgYWxzbyB0aGUgPGEgaHJlZj0iaHR0cHM6Ly9leHBlcnRpdmUuaHIvZW4vc2tpbGxzLW1hdHJpeC0zNjAvIiB0YXJnZXQ9Il9ibGFuayIgcmVsPSJub29wZW5lciI+U2tpbGxzIE1hdHJpeCAzNjA8L2E+LCB3aXRoIDIgdG8gMTAgcmF0ZXJzLCBhcyBhIHNlcGFyYXRlLCBhZGRpdGlvbmFsIHNlcnZpY2UuPC9wPgogICAgPC9kaXY+CiAgPC9zZWN0aW9uPgogIDxzZWN0aW9uIGNsYXNzPSJ4bS1wYW5lbCI+CiAgICA8c3BhbiBjbGFzcz0ieG0tZXllYnJvdyI+U3RlcCAxIMK3IHlvdXIgcm9sZTwvc3Bhbj4KICAgIDxoMj5XaGF0IGxldmVsIGFyZSB5b3UgYXQ\/PC9oMj4KICAgIDxwIGNsYXNzPSJ4bS1sZWRlIj5UaGUgdG9vbCB1c2VzIHRoaXMgdG8gc2V0IHRoZSBleHBlY3RlZCBsZXZlbHMgZm9yIHlvdXIgcG9zaXRpb24uIENob29zZSBieSB0aGUgc2NvcGUgb2YgeW91ciBqb2IsIG5vdCBieSB0aGUgdGl0bGUgb24geW91ciBidXNpbmVzcyBjYXJkLjwvcD4KICAgIDxkaXYgY2xhc3M9InhtLXJvbGVzIiByb2xlPSJncm91cCIgYXJpYS1sYWJlbD0iUm9sZSBsZXZlbCI+CiAgICAgICR7Uk9MRVMubWFwKHI9PmA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9InhtLXJvbGUiIGRhdGEtcj0iJHtyLmlkfSIgYXJpYS1wcmVzc2VkPSIke3N0LnJvbGU9PT1yLmlkfSI+PGI+JHtyLmt9IMK3ICR7ZXNjKHIudCl9PC9iPjxzcGFuPiR7ZXNjKHIuZCl9PC9zcGFuPjwvYnV0dG9uPmApLmpvaW4oIiIpfQogICAgPC9kaXY+CiAgICA8ZGl2IGNsYXNzPSJ4bS1jdHgiPgogICAgICA8cCBjbGFzcz0ieG0tY3R4bm90ZSI+T3B0aW9uYWw6IHRoZSBleHBlY3RlZCBsZXZlbCBvZiBzb21lIHNraWxscyBkZXBlbmRzIG9uIHRoZSBzaXplIG9mIHRoZSBjb21wYW55IGFuZCBvbiBob3cgbWFueSBwZW9wbGUgeW91IGxlYWQuIElmIHlvdSB0ZWxsIHVzLCB3ZSdsbCBhZGp1c3QgaXQgYnkgb25lIHN0ZXAgYXQgbW9zdC48L3A+CiAgICAgIDxkaXYgY2xhc3M9InhtLWZpZWxkcyI+CiAgICAgICAgPGRpdiBjbGFzcz0ieG0tZmllbGQiPjxsYWJlbCBmb3I9InhtLXNpemUiPk51bWJlciBvZiBlbXBsb3llZXMgaW4gdGhlIGNvbXBhbnk8L2xhYmVsPjxzZWxlY3QgaWQ9InhtLXNpemUiPjxvcHRpb24gdmFsdWU9IiI+4oCUIEknZCByYXRoZXIgbm90IHNheTwvb3B0aW9uPjxvcHRpb24gdmFsdWU9InMiJHtzdC5zaXplPT09InMiPyIgc2VsZWN0ZWQiOiIifT51cCB0byAyNDk8L29wdGlvbj48b3B0aW9uIHZhbHVlPSJtIiR7c3Quc2l6ZT09PSJtIj8iIHNlbGVjdGVkIjoiIn0+MjUwIHRvIDQsOTk5PC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0ibCIke3N0LnNpemU9PT0ibCI\/IiBzZWxlY3RlZCI6IiJ9PjUsMDAwIG9yIG1vcmU8L29wdGlvbj48L3NlbGVjdD48L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJ4bS1maWVsZCI+PGxhYmVsIGZvcj0ieG0tdGVhbSI+TnVtYmVyIG9mIHBlb3BsZSB5b3UgbGVhZDwvbGFiZWw+PHNlbGVjdCBpZD0ieG0tdGVhbSI+PG9wdGlvbiB2YWx1ZT0iIj7igJQgSSdkIHJhdGhlciBub3Qgc2F5PC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0iMCIke3N0LnRlYW09PT0iMCI\/IiBzZWxlY3RlZCI6IiJ9PjAgdG8gMzwvb3B0aW9uPjxvcHRpb24gdmFsdWU9IjQiJHtzdC50ZWFtPT09IjQiPyIgc2VsZWN0ZWQiOiIifT40IG9yIG1vcmU8L29wdGlvbj48L3NlbGVjdD48L2Rpdj4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICA8L3NlY3Rpb24+CiAgPHNlY3Rpb24gY2xhc3M9InhtLXBhbmVsIj4KICAgIDxzcGFuIGNsYXNzPSJ4bS1leWVicm93Ij5TdGVwIDIgwrcgeW91ciBlbWFpbDwvc3Bhbj4KICAgIDxoMj5XaGVyZSBzaG91bGQgd2Ugc2VuZCB5b3VyIHJlc3VsdD88L2gyPgogICAgPHAgY2xhc3M9InhtLWxlZGUiPllvdSdsbCBzZWUgeW91ciByZXN1bHQgb24gc2NyZWVuIGFzIHNvb24gYXMgeW91IGZpbmlzaCwgYW5kIHdlJ2xsIGFsc28gc2VuZCBpdCB0byB0aGlzIGFkZHJlc3MuPC9wPgogICAgPGRpdiBjbGFzcz0ieG0tZmllbGQiPjxsYWJlbCBmb3I9InhtLWVtYWlsIj5FbWFpbDwvbGFiZWw+PGlucHV0IGlkPSJ4bS1lbWFpbCIgdHlwZT0iZW1haWwiIGF1dG9jb21wbGV0ZT0iZW1haWwiIHZhbHVlPSIke2VzYyhzdC5lbWFpbCl9Ij48L2Rpdj4KICAgIDxsYWJlbCBjbGFzcz0ieG0tY29uc2VudCI+PGlucHV0IHR5cGU9ImNoZWNrYm94IiBpZD0ieG0tY29uc2VudDEiICR7c3QuY29uc2VudDE\/ImNoZWNrZWQiOiIifT48c3Bhbj5JIGFncmVlIHRoYXQgRXhwZXJ0aXZlIGQuby5vLiBtYXkgcHJvY2VzcyBteSBlbWFpbCBhZGRyZXNzIGFuZCB0ZXN0IHJlc3VsdHMgaW4gb3JkZXIgdG8gc2VuZCBtZSBteSByZXN1bHQsIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgcHJpdmFjeSBub3RpY2UuPC9zcGFuPjwvbGFiZWw+CiAgICAke3ByaXZhY3lIVE1MKCl9CiAgICA8ZGl2IGNsYXNzPSJ4bS1uYXYiPgogICAgICAke3N0YXJ0ZWQ\/YDxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0ieG0tZ2hvc3QiIGlkPSJ4bS1yZXNldCI+U3RhcnQgb3ZlcjwvYnV0dG9uPmA6IjxzcGFuPjwvc3Bhbj4ifQogICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9InhtLXByaW1hcnkiIGlkPSJ4bS1nbyI+JHtzdGFydGVkPyJDb250aW51ZSI6IlN0YXJ0In08L2J1dHRvbj4KICAgIDwvZGl2PgogICAgPHAgY2xhc3M9InhtLWhpbnQgeG0td2FybiIgaWQ9InhtLXdoeSIgcm9sZT0iYWxlcnQiIGhpZGRlbj48L3A+CiAgICA8cCBzdHlsZT0ibWFyZ2luOjE0cHggMCAwO2ZvbnQtc2l6ZToxNHB4Ij48YSBocmVmPSJodHRwczovL2V4cGVydGl2ZS5oci9lbi93aGF0LWlzLWEtc2tpbGxzLW1hdHJpeC8iIHRhcmdldD0iX2JsYW5rIiByZWw9Im5vb3BlbmVyIj5XaGF0IGlzIGEgc2tpbGxzIG1hdHJpeCBhbmQgaG93IHRvIHVzZSBpdCDihpI8L2E+PC9wPgogIDwvc2VjdGlvbj5gKTsKICBjb25zdCBnbz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgieG0tZ28iKTsKICBjb25zdCB3aHk9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInhtLXdoeSIpOwogIC8vIDIuMy42IChNaXJvIDIxLjEwLik6IGJvZG92YW5qZSB2My44ICh0b8SNa2EgMzUpOyBwcml0aXNhayDigJQgbm92ZSB0dnJkbmplIHJhemluYSAyIGkgNCAodG\/EjWthIDExKS4KICAvLyAyLjMuNSAoTWlybyAxMi4xMC4pOiBzdHJhdGXFoWthIHNsaWthIOKAlCBub3ZlIHR2cmRuamUgcmF6aW5hIDIsIDQsIDUgaSBwcm92amVyYTsgcmF6dm9qIGxqdWRpIHphIHZsYXNuaWthIG\/EjWVraXZhbm8gNyAoaXN0byBrYW8gTWF0cmljYSAzNjAgdjAuOC4xKS4KICAvLyAyLjMuNCAoTWlybyA4LjEwLik6IGd1bWIgamUgdXZpamVrIGFrdGl2YW47IHVwb3pvcmVuamUgc2UgcG9rYcW+ZSB0ZWsgbmEga2xpayAoaSBuZXN0YW5lIGthZCBqZSBzdmUgaXNwdW5qZW5vKS4KICBjb25zdCBlbWFpbEVsPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ4bS1lbWFpbCIpOwogIGNvbnN0IHJlYWRFbWFpbD0oKT0+eyBpZihlbWFpbEVsICYmIGVtYWlsRWwudmFsdWUhPT1zdC5lbWFpbCl7IHN0LmVtYWlsPWVtYWlsRWwudmFsdWU7IHNhdmUoKTsgfSB9OwogIGNvbnN0IHN5bmM9KCk9PnsgaWYoIXdoeS5oaWRkZW4peyBjb25zdCB3PXdoeUJsb2NrZWQoKTsgd2h5LnRleHRDb250ZW50PXc7IHdoeS5oaWRkZW49IXc7IH0gfTsKICBbInNpemUiLCJ0ZWFtIl0uZm9yRWFjaChrPT57IGNvbnN0IGVsPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ4bS0iK2spOyBpZihlbCkgZWwub25jaGFuZ2U9ZT0+eyBzdFtrXT1lLnRhcmdldC52YWx1ZTsgc2F2ZSgpOyB9OyB9KTsgICAvLyAyLjMuOAogIGFwcC5xdWVyeVNlbGVjdG9yQWxsKCIueG0tcm9sZSIpLmZvckVhY2goYj0+Yi5vbmNsaWNrPSgpPT57CiAgICBzdC5yb2xlPStiLmRhdGFzZXQucjsgZGVsZXRlIHN0LmRvbmVBdDsgc2F2ZSgpOwogICAgYXBwLnF1ZXJ5U2VsZWN0b3JBbGwoIi54bS1yb2xlIikuZm9yRWFjaCh4PT54LnNldEF0dHJpYnV0ZSgiYXJpYS1wcmVzc2VkIiwgU3RyaW5nKCt4LmRhdGFzZXQucj09PXN0LnJvbGUpKSk7CiAgICBzeW5jKCk7CiAgfSk7CiAgZW1haWxFbC5vbmlucHV0PWU9Pnsgc3QuZW1haWw9ZS50YXJnZXQudmFsdWU7IHNhdmUoKTsgc3luYygpOyB9OwogIGVtYWlsRWwub25jaGFuZ2U9ZT0+eyBzdC5lbWFpbD1lLnRhcmdldC52YWx1ZTsgc2F2ZSgpOyBzeW5jKCk7IH07IC8vIGF1dG9tYXRza28gcG9wdW5qYXZhbmplIHByZWdsZWRuaWthCiAgZW1haWxFbC5vbmJsdXI9KCk9PnsgcmVhZEVtYWlsKCk7IHN5bmMoKTsgfTsKICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgieG0tY29uc2VudDEiKS5vbmNoYW5nZT1lPT57IHN0LmNvbnNlbnQxPWUudGFyZ2V0LmNoZWNrZWQ7IHNhdmUoKTsgc3luYygpOyB9OwogIGdvLm9uY2xpY2s9KCk9PnsKICAgIHJlYWRFbWFpbCgpOwogICAgaWYoIXN0YXJ0UmVhZHkoKSl7CiAgICAgIHdoeS50ZXh0Q29udGVudD13aHlCbG9ja2VkKCk7IHdoeS5oaWRkZW49ZmFsc2U7CiAgICAgIGNvbnN0IHRndCA9IHN0LnJvbGU9PW51bGwgPyBhcHAucXVlcnlTZWxlY3RvcigiLnhtLXJvbGVzIikgOiAoIUVNQUlMX1JFLnRlc3Qoc3QuZW1haWwudHJpbSgpKSA\/IGVtYWlsRWwgOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgieG0tY29uc2VudDEiKSk7CiAgICAgIGlmKHRndCl7IHRndC5zY3JvbGxJbnRvVmlldyh7YmVoYXZpb3I6InNtb290aCIsYmxvY2s6ImNlbnRlciJ9KTsgaWYodGd0LmNsYXNzTGlzdCkgeyB0Z3QuY2xhc3NMaXN0LmFkZCgieG0tZmxhc2giKTsgc2V0VGltZW91dCgoKT0+dGd0LmNsYXNzTGlzdC5yZW1vdmUoInhtLWZsYXNoIiksMTYwMCk7IH0gaWYodGd0LmZvY3VzICYmIHRndCE9PWFwcC5xdWVyeVNlbGVjdG9yKCIueG0tcm9sZXMiKSkgc2V0VGltZW91dCgoKT0+dGd0LmZvY3VzKCksNDAwKTsgfQogICAgICByZXR1cm47CiAgICB9CiAgICBpZighc3QudDApeyBzdC50MD1EYXRlLm5vdygpOyB9CiAgICBpZighc3QuZXZzLnN0YXJ0KXsgc3QuZXZzLnN0YXJ0PTE7IGV2KCJzdGFydCIpOyB9CiAgICBjb25zdCBpPXN0LmEuZmluZEluZGV4KChyLGspPT4hc3QubmFba10mJihyLnNvbWUodj0+dj09bnVsbCl8fHN0LnBba109PW51bGwpKTsKICAgIGlmKGk8MCl7IGFmdGVyU3RlcHMoKTsgcmV0dXJuOyB9CiAgICBzdC5zdGVwPWk7IHNhdmUoKTsgcmVuZGVyU3RlcCgpOwogIH07CiAgY29uc3QgcnM9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInhtLXJlc2V0Iik7IGlmKHJzKSBycy5vbmNsaWNrPSgpPT57IHN0PWZyZXNoKCk7IHNhdmUoKTsgcmVuZGVyU3RhcnQoKTsgfTsKfQoKZnVuY3Rpb24gcmVuZGVyU3RlcCgpewogIGNvbnN0IGk9c3Quc3RlcCwgYz1DW2ldOwogIHRTdGVwPURhdGUubm93KCk7CiAgY29uc3QgcGN0ID0gTWF0aC5yb3VuZChpL0MubGVuZ3RoKjEwMCk7CiAgY29uc3Qgb3B0cyA9IENIRUNLT1BUU1tjLnB0XTsKICBjb25zdCBvcHAgPSAhIWMuc2l0OwogIGNvbnN0IFNDQUxFID0gRlJFUV9BTEw7CiAgY29uc3QgbmEgPSAhIXN0Lm5hW2ldOwogIGNvbnN0IGxlZ2VuZCA9IGAke2VzYyhjLnNpdCl9IDxzdHJvbmc+SW4gdGhvc2Ugc2l0dWF0aW9ucywgaG93IG9mdGVuIGRvZXMgZWFjaCBzdGF0ZW1lbnQgZGVzY3JpYmUgd2hhdCB5b3UgZG8\/PC9zdHJvbmc+YDsKICBoKGAKICA8ZGl2IGNsYXNzPSJ4bS1wcm9ncmVzcyI+PHNwYW4+JHtpKzF9IG9mICR7Qy5sZW5ndGh9PC9zcGFuPjxkaXYgY2xhc3M9InhtLWJhciI+PGkgc3R5bGU9IndpZHRoOiR7cGN0fSUiPjwvaT48L2Rpdj48L2Rpdj4KICA8c2VjdGlvbiBjbGFzcz0ieG0tcGFuZWwiPgogICAgPHNwYW4gY2xhc3M9InhtLWV5ZWJyb3ciPlNraWxsICR7aSsxfTwvc3Bhbj4KICAgIDxoMj4ke2VzYyhjLm4pfTwvaDI+CiAgICA8cCBjbGFzcz0ieG0taW50cm8tcSI+JHtlc2MoYy5xKX0gPHNwYW4gY2xhc3M9InhtLXdpbmsiPiR7ZXNjKEhVTVtpXXx8IiIpfTwvc3Bhbj48L3A+CiAgICAke29wcD9gPGxhYmVsIGNsYXNzPSJ4bS1jb25zZW50Ij48aW5wdXQgdHlwZT0iY2hlY2tib3giIGlkPSJ4bS1uYSIgJHtuYT8iY2hlY2tlZCI6IiJ9PjxzcGFuPlRoZXNlIHNpdHVhdGlvbnMgaGF2ZW4ndCBjb21lIHVwIGluIG15IHdvcmsuPC9zcGFuPjwvbGFiZWw+YDoiIn0KICAgIDxwIGNsYXNzPSJ4bS1sZWdlbmQtcyIgJHtuYT8naGlkZGVuJzonJ30+JHtsZWdlbmR9IDxzcGFuIGNsYXNzPSJ4bS1yZW1pbmRlciI+VGhlc2UgZml2ZSBzdGF0ZW1lbnRzIGRlc2NyaWJlIGRpZmZlcmVudCB3YXlzIG9mIGhhbmRsaW5nIHRoZSBzYW1lIHNpdHVhdGlvbi4gRm9yIG1vc3QgcGVvcGxlLCB0d28gYXJlIGZyZXF1ZW50IGFuZCB0aGUgcmVzdCBhcmUgcmFyZS4gUmVhZCBhbGwgZml2ZSwgdGhlbiBhbnN3ZXIgYXMgdGhpbmdzIGFyZSwgbm90IGFzIHlvdSdkIGxpa2UgdGhlbSB0byBiZS48L3NwYW4+PC9wPgogICAgPGRpdiBpZD0ieG0tc3RtdHMiICR7bmE\/J2hpZGRlbic6Jyd9PgogICAgICAke2Mub3JkLm1hcChsdmw9PmAKICAgICAgICA8ZGl2IGNsYXNzPSJ4bS1zdG10Ij4KICAgICAgICAgIDxwPiR7c3RtdEhUTUwoaSxsdmwpfTwvcD4KICAgICAgICAgIDxkaXYgY2xhc3M9InhtLXNlZyIgcm9sZT0icmFkaW9ncm91cCIgYXJpYS1sYWJlbD0iRnJlcXVlbmN5Ij4KICAgICAgICAgICAgJHtTQ0FMRS5tYXAoKGYsdik9PmA8bGFiZWw+PGlucHV0IHR5cGU9InJhZGlvIiBuYW1lPSJ4bS1jJHtpfS1sJHtsdmx9IiB2YWx1ZT0iJHt2fSIgZGF0YS1sPSIke2x2bH0iICR7c3QuYVtpXVtsdmwtMV09PT12PyJjaGVja2VkIjoiIn0+PHNwYW4+JHtmfTwvc3Bhbj48L2xhYmVsPmApLmpvaW4oIiIpfQogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+YCkuam9pbigiIil9CiAgICAgIDxkaXYgY2xhc3M9InhtLWNoZWNrIiBpZD0ieG0tdGJib3giIGhpZGRlbj48L2Rpdj4KICAgIDwvZGl2PgogICAgPGRpdiBjbGFzcz0ieG0tY2hlY2siIGlkPSJ4bS1jaGVja2JveCIgJHtuYT8naGlkZGVuJzonJ30+CiAgICAgIDxzcGFuIGNsYXNzPSJ4bS1leWVicm93Ij5DaGVjazwvc3Bhbj4KICAgICAgPHA+JHtlc2MoYy5wKX08L3A+CiAgICAgIDxkaXYgY2xhc3M9InhtLXNlZyIgcm9sZT0icmFkaW9ncm91cCIgYXJpYS1sYWJlbD0iQ2hlY2siPgogICAgICAgICR7b3B0cy5tYXAoKGYsdik9PmA8bGFiZWw+PGlucHV0IHR5cGU9InJhZGlvIiBuYW1lPSJ4bS1wJHtpfSIgdmFsdWU9IiR7dn0iICR7c3QucFtpXT09PXY\/ImNoZWNrZWQiOiIifT48c3Bhbj4ke2Z9PC9zcGFuPjwvbGFiZWw+YCkuam9pbigiIil9CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CiAgICA8cCBjbGFzcz0ieG0taGludCIgaWQ9InhtLWhpbnQiIGhpZGRlbj48L3A+CiAgICA8ZGl2IGNsYXNzPSJ4bS1uYXYiPgogICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9InhtLWdob3N0IiBpZD0ieG0tYmFjayI+JHtpPT09MD8iU3RhcnQiOiJCYWNrIn08L2J1dHRvbj4KICAgICAgPGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJ4bS1wcmltYXJ5IiBpZD0ieG0tbmV4dCI+TmV4dDwvYnV0dG9uPgogICAgPC9kaXY+CiAgPC9zZWN0aW9uPmApOwogIGNvbnN0IHRiQm94PWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ4bS10YmJveCIpOwogIGNvbnN0IGhpbnQ9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInhtLWhpbnQiKTsKICAvKiB2My43OiBibG9rYWRlIG5lbWEuIFBydmkgcHV0IGthZCBrb21wZXRlbmNpamEgZG9iaWplIDMrICLEjWVzdG8iIGJyb2ppIHNlIGFub25pbW5pIGRvZ2HEkWFqICJtdWx0aSIuCiAgICAgRG9kYXRubyBwaXRhbmplIGtvZCBtamXFoW92aXRvZyBvYnJhc2NhIOKAlCBuYSBpc3RvbSBla3JhbnUsIG9iYXZlem5vIHphICJEYWxqZSIuCiAgICAgTnVkZSBzZSBzYW1vIHR2cmRuamUgb3puYcSNZW5lIGthbyByZWRvdml0ZTsgYWtvIHNlIHRhaiBza3VwIHByb21pamVuaSwgcHJldGhvZG5pIG9kZ292b3Igc2UgYnJpxaFlLiAqLwogIGNvbnN0IHN5bmNNdWx0aT0oKT0+eyBpZighc3QubmFbaV0gJiYgY250TWFqKGkpPj1CTE9DS19NQUogJiYgIXN0LmV2cy5tdWx0aSl7IHN0LmV2cy5tdWx0aT0xOyBzYXZlKCk7IGV2KCJtdWx0aSIpOyB9IH07CiAgY29uc3Qgc3luY1RCPSgpPT57CiAgICBjb25zdCBzYyA9IHNjb3JlKGkpOwogICAgY29uc3Qgc2hvdyA9ICFzdC5uYVtpXSAmJiBzYy5jb250cmEgJiYgc3QuYVtpXS5ldmVyeSh2PT52IT1udWxsKTsKICAgIGlmKCFzaG93KXsKICAgICAgdGJCb3guaGlkZGVuPXRydWU7IHRiQm94LmlubmVySFRNTD0iIjsKICAgICAgaWYoIXNjLmNvbnRyYSAmJiBzdC50YltpXSE9bnVsbCl7IHN0LnRiW2ldPW51bGw7IHN0LnRia1tpXT1udWxsOyBzYXZlKCk7IH0KICAgICAgcmV0dXJuOwogICAgfQogICAgY29uc3QgcmVnPVsxLDIsMyw0LDVdLmZpbHRlcihsPT4oc3QuYVtpXVtsLTFdPz8wKT49MiksIGtleT1yZWcuam9pbigiIik7CiAgICBpZihzdC50YmtbaV0hPT1rZXkpeyBzdC50YltpXT1udWxsOyBzdC50YmtbaV09a2V5OyB9CiAgICBzYXZlKCk7CiAgICBjb25zdCBvcHRzPWMub3JkLmZpbHRlcihsPT5yZWcuaW5jbHVkZXMobCkpOwogICAgdGJCb3guaW5uZXJIVE1MID0gYDxzcGFuIGNsYXNzPSJ4bS1leWVicm93Ij5FeHRyYSBxdWVzdGlvbjwvc3Bhbj4KICAgICAgPHA+WW91IG1hcmtlZCBzZXZlcmFsIG9mIHRoZXNlIGFzIGZyZXF1ZW50LCBhbmQgd2UgYmVsaWV2ZSB5b3UuIFdoaWNoIG9uZSBoYXBwZW5zIDxzdHJvbmc+bW9zdCBvZnRlbjwvc3Ryb25nPj88L3A+CiAgICAgIDxkaXYgY2xhc3M9InhtLXNlZyB4bS1zZWctdiIgcm9sZT0icmFkaW9ncm91cCIgYXJpYS1sYWJlbD0iQ2hvaWNlIj4KICAgICAgICAke29wdHMubWFwKGw9PmA8bGFiZWw+PGlucHV0IHR5cGU9InJhZGlvIiBuYW1lPSJ4bS10YiR7aX0iIHZhbHVlPSIke2x9IiAke3N0LnRiW2ldPT09bD8iY2hlY2tlZCI6IiJ9PjxzcGFuPiR7ZXNjKGMuc1tsLTFdKX08L3NwYW4+PC9sYWJlbD5gKS5qb2luKCIiKX0KICAgICAgPC9kaXY+YDsKICAgIHRiQm94LmhpZGRlbj1mYWxzZTsKICAgIHRiQm94LnF1ZXJ5U2VsZWN0b3JBbGwoYGlucHV0W25hbWU9InhtLXRiJHtpfSJdYCkuZm9yRWFjaChyPT5yLm9uY2hhbmdlPSgpPT57IHN0LnRiW2ldPStyLnZhbHVlOyBkZWxldGUgc3QuZG9uZUF0OyBzYXZlKCk7IGhpbnQuaGlkZGVuPXRydWU7IH0pOwogIH07CiAgc3luY1RCKCk7CiAgYXBwLnF1ZXJ5U2VsZWN0b3JBbGwoJ2lucHV0W2RhdGEtbF0nKS5mb3JFYWNoKHI9PnIub25jaGFuZ2U9KCk9Pnsgc3QuYVtpXVsrci5kYXRhc2V0LmwtMV09K3IudmFsdWU7IGRlbGV0ZSBzdC5kb25lQXQ7IHNhdmUoKTsgc3luY011bHRpKCk7IHN5bmNUQigpOyB9KTsKICBhcHAucXVlcnlTZWxlY3RvckFsbChgaW5wdXRbbmFtZT0ieG0tcCR7aX0iXWApLmZvckVhY2gocj0+ci5vbmNoYW5nZT0oKT0+eyBzdC5wW2ldPStyLnZhbHVlOyBkZWxldGUgc3QuZG9uZUF0OyBzYXZlKCk7IH0pOwogIGNvbnN0IG5hRWw9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInhtLW5hIik7CiAgaWYobmFFbCkgbmFFbC5vbmNoYW5nZT1lPT57IHN0Lm5hW2ldPWUudGFyZ2V0LmNoZWNrZWQ7IGlmKHN0Lm5hW2ldKXsgc3QuYVtpXT1bbnVsbCxudWxsLG51bGwsbnVsbCxudWxsXTsgc3QucFtpXT1udWxsOyBzdC50YltpXT1udWxsOyBzdC50YmtbaV09bnVsbDsgfSBkZWxldGUgc3QuZG9uZUF0OyBzYXZlKCk7IHJlbmRlclN0ZXAoKTsgfTsKICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgieG0tYmFjayIpLm9uY2xpY2s9KCk9PnsgdGlja1N0ZXAoKTsgc2F2ZSgpOyBpZihpPT09MCl7IHJlbmRlclN0YXJ0KCk7IH0gZWxzZSB7IHN0LnN0ZXA9aS0xOyBzYXZlKCk7IHJlbmRlclN0ZXAoKTsgfSB9OwogIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ4bS1uZXh0Iikub25jbGljaz0oKT0+ewogICAgaWYoIXN0Lm5hW2ldICYmIChzdC5hW2ldLnNvbWUodj0+dj09bnVsbCkgfHwgc3QucFtpXT09bnVsbCkpewogICAgICBoaW50LnRleHRDb250ZW50PSJBbnN3ZXIgYWxsIGZpdmUgc3RhdGVtZW50cyBhbmQgdGhlIGNoZWNrIHRvIGNvbnRpbnVlLiI7IGhpbnQuaGlkZGVuPWZhbHNlOyByZXR1cm47CiAgICB9CiAgICBjb25zdCBzYz1zY29yZShpKTsKICAgIGlmKCFzdC5uYVtpXSAmJiBzYy5jb250cmEgJiYgc2MudGI9PW51bGwpewogICAgICBzeW5jVEIoKTsgaGludC50ZXh0Q29udGVudD0iUGxlYXNlIGFsc28gYW5zd2VyIHRoZSBleHRyYSBxdWVzdGlvbiBiZWxvdyB0aGUgc3RhdGVtZW50cy4iOyBoaW50LmhpZGRlbj1mYWxzZTsKICAgICAgdGJCb3guc2Nyb2xsSW50b1ZpZXcoe2Jsb2NrOiJjZW50ZXIifSk7IHJldHVybjsKICAgIH0KICAgIHRpY2tTdGVwKCk7CiAgICBpZihpPT09Qy5sZW5ndGgtMSl7IHNhdmUoKTsgYWZ0ZXJTdGVwcygpOyB9IGVsc2UgeyBzdC5zdGVwPWkrMTsgc2F2ZSgpOyByZW5kZXJTdGVwKCk7IH0KICB9Owp9CgovKiBSZXplcnZhICh3ZWIgMi4yKTogYWtvIG5la2kgbWplxaFvdml0aSBvYnJhemFjIGlwYWsgbmVtYSBvZGdvdm9yIG5hIGRvZGF0bm8gcGl0YW5qZQogICAobnByLiBpc3B1bmphdmFuamUgemFwb8SNZXRvIHByaWplIDIuMiksIHBpdGFuamEgc2UgcG9zdGF2bGphanUgb3ZkamUsIG5hIGtyYWp1LgogICBOdWRlIHNlIHNhbW8gcmVkb3ZpdGUgdHZyZG5qZSwgaXN0aW0gcmVkb3NsaWplZG9tIGthbyBuYSBla3JhbnUga29tcGV0ZW5jaWplLiAqLwpmdW5jdGlvbiBhZnRlclN0ZXBzKCl7CiAgY29uc3QgbGlzdCA9IHRpZUxpc3QoKTsKICBpZighbGlzdC5sZW5ndGgpeyByZW5kZXJSZXN1bHQoKTsgcmV0dXJuOyB9CiAgY29uc3QgcmVnT2YgPSBpID0+IFsxLDIsMyw0LDVdLmZpbHRlcihsPT4oc3QuYVtpXVtsLTFdPz8wKT49Mik7CiAgY29uc3QgY2FyZCA9IHggPT4gewogICAgY29uc3QgaT14LmksIGM9Q1tpXSwgcmVnPXJlZ09mKGkpLCBvcHRzPWMub3JkLmZpbHRlcihsPT5yZWcuaW5jbHVkZXMobCkpOwogICAgcmV0dXJuIGA8ZGl2IGNsYXNzPSJ4bS1zdG10Ij4KICAgICAgPHAgY2xhc3M9InhtLWludHJvLXEiPiR7ZXNjKGMubil9PC9wPgogICAgICA8cD5Zb3UgbWFya2VkIHNldmVyYWwgb2YgdGhlc2UgYXMgZnJlcXVlbnQsIGFuZCB3ZSBiZWxpZXZlIHlvdS4gV2hpY2ggb25lIGhhcHBlbnMgPHN0cm9uZz5tb3N0IG9mdGVuPC9zdHJvbmc+PzwvcD4KICAgICAgPGRpdiBjbGFzcz0ieG0tc2VnIHhtLXNlZy12IiByb2xlPSJyYWRpb2dyb3VwIiBhcmlhLWxhYmVsPSJDaG9pY2UiPgogICAgICAgICR7b3B0cy5tYXAobD0+YDxsYWJlbD48aW5wdXQgdHlwZT0icmFkaW8iIG5hbWU9InhtLXRiJHtpfSIgdmFsdWU9IiR7bH0iICR7c3QudGJbaV09PT1sPyJjaGVja2VkIjoiIn0+PHNwYW4+JHtlc2MoYy5zW2wtMV0pfTwvc3Bhbj48L2xhYmVsPmApLmpvaW4oIiIpfQogICAgICA8L2Rpdj4KICAgIDwvZGl2PmA7CiAgfTsKICBoKGAKICA8c2VjdGlvbiBjbGFzcz0ieG0tcGFuZWwiPgogICAgPHNwYW4gY2xhc3M9InhtLWV5ZWJyb3ciPiR7bGlzdC5sZW5ndGg9PT0xPyJPbmUgbW9yZSBxdWljayBxdWVzdGlvbiI6bGlzdC5sZW5ndGgrIiBtb3JlIHF1aWNrIHF1ZXN0aW9ucyJ9PC9zcGFuPgogICAgPGgyPldoaWNoIG9uZSBwcmV2YWlscz88L2gyPgogICAgPHAgY2xhc3M9InhtLWxlZGUiPkluIHNldmVyYWwgc2tpbGxzLCB5b3VyIGFuc3dlcnMgZGVzY3JpYmUgbW9yZSB0aGFuIG9uZSBiZWhhdmlvci4gVGhhdCdzIGNvbW1vbiBhbmQgbm90IGEgbWlzdGFrZS4gU28gdGhlIHJlc3VsdCBkb2Vzbid0IGVuZCB1cCBzdHVjayBpbiB0aGUgbWlkZGxlLCB0ZWxsIHVzIHdoaWNoIG9uZSBoYXBwZW5zIG1vc3Qgb2Z0ZW4uPC9wPgogICAgJHtsaXN0Lm1hcChjYXJkKS5qb2luKCIiKX0KICAgIDxwIGNsYXNzPSJ4bS1oaW50IiBpZD0ieG0tdGJoaW50IiBoaWRkZW4+QW5zd2VyIGFsbCB0aGUgcXVlc3Rpb25zIG9yIHNraXAgdGhpcyBzdGVwLjwvcD4KICAgIDxkaXYgY2xhc3M9InhtLW5hdiI+CiAgICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0ieG0tZ2hvc3QiIGlkPSJ4bS10YnNraXAiPlNraXA8L2J1dHRvbj4KICAgICAgPGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJ4bS1wcmltYXJ5IiBpZD0ieG0tdGJuZXh0Ij5TaG93IHJlc3VsdDwvYnV0dG9uPgogICAgPC9kaXY+CiAgPC9zZWN0aW9uPmApOwogIGxpc3QuZm9yRWFjaCh4PT57CiAgICBhcHAucXVlcnlTZWxlY3RvckFsbChgaW5wdXRbbmFtZT0ieG0tdGIke3guaX0iXWApLmZvckVhY2gocj0+ci5vbmNoYW5nZT0oKT0+eyBzdC50Ylt4LmldPStyLnZhbHVlOyBzdC50YmtbeC5pXT1yZWdPZih4LmkpLmpvaW4oIiIpOyBkZWxldGUgc3QuZG9uZUF0OyBzYXZlKCk7IH0pOwogIH0pOwogIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ4bS10YnNraXAiKS5vbmNsaWNrPSgpPT57IHJlbmRlclJlc3VsdCgpOyB9OwogIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ4bS10Ym5leHQiKS5vbmNsaWNrPSgpPT57CiAgICBpZihsaXN0LnNvbWUoeD0+c3QudGJbeC5pXT09bnVsbCkpeyBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgieG0tdGJoaW50IikuaGlkZGVuPWZhbHNlOyByZXR1cm47IH0KICAgIHJlbmRlclJlc3VsdCgpOwogIH07Cn0KCmZ1bmN0aW9uIG1peFR4dCh0Yil7CiAgaWYodGI9PW51bGwpIHJldHVybiAiV2UgZGlkbid0IGFzayB3aGljaCBvbmUgcHJldmFpbHMsIHNvIHRoZSBzY29yZSB3YXMgc2V0IGJldHdlZW4gdGhlbS4iOwogIHJldHVybiB0Yj49NCA\/ICJZb3UgbWFya2VkIHRoZSBtb3JlIGRlbWFuZGluZyBiZWhhdmlvciBhcyB0aGUgbW9zdCBmcmVxdWVudCwgd2hpbGUgdGhlIGxlc3MgZGVtYW5kaW5nIG9uZSBhbHNvIG9jY3VycyByZWd1bGFybHkuIgogICAgICAgOiB0Yj09PTMgPyAiWW91IG1hcmtlZCBhIGJlaGF2aW9yIGZyb20gdGhlIG1pZGRsZSBvZiB0aGUgc2NhbGUgYXMgdGhlIG1vc3QgZnJlcXVlbnQuIgogICAgICAgOiAiWW91IG1hcmtlZCBhIGJlaGF2aW9yIHRoYXQgZGVzY3JpYmVzIGEgbG93ZXIgbGV2ZWwgYXMgdGhlIG1vc3QgZnJlcXVlbnQuIjsKfQovLyBFTjogZGF0dW0gemEgcHJpa2F6IChJRCBpc3B1bmphdmFuamEgb3N0YWplIHUgdGVobmnEjWtvbSBvYmxpa3UgZGQubW0uZ2dnZy4gaGg6bW06c3MpCmZ1bmN0aW9uIGVuRGF0ZSgpewogIGNvbnN0IGQ9bmV3IERhdGUoc3QuZG9uZUF0fHxEYXRlLm5vdygpKTsKICBjb25zdCBNPVsiSmFudWFyeSIsIkZlYnJ1YXJ5IiwiTWFyY2giLCJBcHJpbCIsIk1heSIsIkp1bmUiLCJKdWx5IiwiQXVndXN0IiwiU2VwdGVtYmVyIiwiT2N0b2JlciIsIk5vdmVtYmVyIiwiRGVjZW1iZXIiXTsKICBjb25zdCBoPWQuZ2V0SG91cnMoKSwgaDEyPWglMTJ8fDEyOwogIHJldHVybiBgJHtNW2QuZ2V0TW9udGgoKV19ICR7ZC5nZXREYXRlKCl9LCAke2QuZ2V0RnVsbFllYXIoKX0sICR7aDEyfToke1N0cmluZyhkLmdldE1pbnV0ZXMoKSkucGFkU3RhcnQoMiwiMCIpfSAke2g8MTI\/IkFNIjoiUE0ifWA7Cn0KZnVuY3Rpb24gc3RhbXAoKXsKICBpZighc3QuZG9uZUF0KXsgc3QuZG9uZUF0PW5ldyBEYXRlKCkudG9JU09TdHJpbmcoKTsgc2F2ZSgpOyB9CiAgY29uc3QgZD1uZXcgRGF0ZShzdC5kb25lQXQpLCBwPW49PlN0cmluZyhuKS5wYWRTdGFydCgyLCIwIik7CiAgcmV0dXJuIGAke3AoZC5nZXREYXRlKCkpfS4ke3AoZC5nZXRNb250aCgpKzEpfS4ke2QuZ2V0RnVsbFllYXIoKX0uICR7cChkLmdldEhvdXJzKCkpfToke3AoZC5nZXRNaW51dGVzKCkpfToke3AoZC5nZXRTZWNvbmRzKCkpfWA7Cn0KCmZ1bmN0aW9uIHJlbmRlclJlc3VsdCgpewogIGNvbnN0IHIgPSBzdC5yb2xlPT1udWxsPzE6c3Qucm9sZTsKICBjb25zdCBzaWQgPSBzdGFtcCgpOwogIGNvbnN0IHJvd3MgPSBDLm1hcCgoYyxpKT0+eyBjb25zdCBzYz1zY29yZShpKSwgcnE9cmVxT2YoaSxyKTsgcmV0dXJuIE9iamVjdC5hc3NpZ24oe2ksIG46Yy5uLCByZXE6cnEsIGJhc2U6Yy5yZXFbcl19LCBzYywge2dhcDpzYy5uZD9udWxsOnJxLXNjLnN9KTsgfSk7CiAgY29uc3QgYWRqTGlzdCA9IHJvd3MuZmlsdGVyKHg9PngucmVxIT09eC5iYXNlKTsgICAvLyAyLjMuOAogIC8vIHdlYiAyLjI6IG9jamVuZSBzZSBwcmlrYXp1anUgVVZJSkVLOyBtamXFoW92aXRhIHBvZHJ1xI1qYSBuZSBtb2d1IGJpdGkgIm5hamphxI1hIHN0cmFuYSIKICBjb25zdCBvdmVyID0gcm93cy5maWx0ZXIoeD0+IXgubmQgJiYgeC5nYXA8MCAmJiAheC5jb250cmEgJiYgIXgucGZhaWwpLnNvcnQoKGEsYik9PmEuZ2FwLWIuZ2FwKVswXTsKICBjb25zdCBub2RhdGEgPSByb3dzLmZpbHRlcih4PT54Lm5kKTsKICBjb25zdCBub3JlZyA9IHJvd3MuZmlsdGVyKHg9PngubnIpOwogIGNvbnN0IHBhdHMgPSBwYXR0ZXJucyhyb3dzKTsKICBjb25zdCBkZXYgPSBkZXZPcmRlcihyb3dzLCBwYXRzKTsKICBjb25zdCB1bmRlciA9IGRldlswXTsKICAvLyB3ZWIgMi4zOiBnbGF2bmEgcmXEjWVuaWNhID0gbmFqamHEjWEgc3RyYW5hICsgbmFqdmXEh2kgamF6ICh2acWhYWsgc2Ugc3BvbWluamUgemFzZWJubywgc2FtbyBrYWQgamUgMysgaSBuaWplIHJhenZvaiBsanVkaSkKICBjb25zdCBzdHJvbmcgPSByb3dzLmZpbHRlcih4PT4heC5uZCAmJiB4LmdhcDw9MCAmJiAheC5jb250cmEgJiYgIXgucGZhaWwpLnNvcnQoKGEsYik9PihiLnMtYS5zKXx8KGIucmVxLWEucmVxKXx8KGEuaS1iLmkpKVswXTsKICBsZXQgaGVhZDsKICBjb25zdCBzVHh0ID0gc3Ryb25nID8gYFlvdXIgc3Ryb25nZXN0IHNraWxsIGlzIDxzdHJvbmc+JHtlc2Moc3Ryb25nLm4udG9Mb3dlckNhc2UoKSl9PC9zdHJvbmc+IOKAlCAke3N0cm9uZy5zfSB3aGVyZSAke3N0cm9uZy5yZXF9IGlzIGV4cGVjdGVkLmAgOiAiIjsKICBpZih1bmRlcil7CiAgICBoZWFkID0gYCR7c1R4dD9zVHh0KyIgIjoiIn1Zb3VyIGdyZWF0ZXN0IG9wcG9ydHVuaXR5IGZvciBncm93dGg6ICR7dW5kZXIuc30gd2hlcmUgJHt1bmRlci5yZXF9IGlzIGV4cGVjdGVkIOKAlCA8c3Ryb25nPiR7ZXNjKHVuZGVyLm4udG9Mb3dlckNhc2UoKSl9PC9zdHJvbmc+LmA7CiAgfSBlbHNlIGlmKHN0cm9uZyl7CiAgICBoZWFkID0gYCR7c1R4dH0gTm8gc2tpbGwgaXMgYmVsb3cgdGhlIGV4cGVjdGVkIGxldmVsLmA7CiAgfSBlbHNlIGhlYWQgPSAiQWxsIHNraWxscyBhcmUgZXhhY3RseSBhdCB0aGUgZXhwZWN0ZWQgbGV2ZWwuIjsKICBjb25zdCBzaG93T3ZlciA9IG92ZXIgJiYgdW5kZXIgJiYgKG92ZXIucy1vdmVyLnJlcSk+PTMgJiYgb3Zlci5pIT09MiAmJiB1bmRlci5nYXA+PTI7ICAgLy8gMi4zLjE6IHNhbW8gdXogamF6IOKIkjIgaWxpIHZlxIdpCiAgY29uc3QgY29udHJhID0gcm93cy5maWx0ZXIoeD0+eC5jb250cmEpOwogIGNvbnN0IHBmYWlsID0gcm93cy5maWx0ZXIoeD0+eC5wZmFpbCk7CiAgY29uc3Qgc2hvd24gPSBwYXRzLnNsaWNlKDAsMik7CiAgLy8gcG92ZXpuaWNlOiB1eiBvYnJhemFjIGkgdXogcHJ2byBwb2RydcSNamUgcmF6dm9qYTsgbmFqdmnFoWUgZHZpamUsIGlzdGkgdGVrc3Qgc2FtbyBqZWRub20KICBjb25zdCBwYXRLZXlzID0gc2hvd24ubWFwKHA9PlBBVF9QT1NUW3AuaWRdKS5maWx0ZXIoQm9vbGVhbik7CiAgY29uc3QgZGV2S2V5ID0gdW5kZXIgPyBDT01QX1BPU1RbdW5kZXIuaV0gOiBudWxsOwogIGNvbnN0IGRldkxpbmsgPSBkZXZLZXkgJiYgIXBhdEtleXMuaW5jbHVkZXMoZGV2S2V5KSA\/IHBvc3RIVE1MKGRldktleSkgOiAiIjsKICBjb25zdCByb2xlID0gUk9MRVNbcl07CiAgaWYoIXN0LnRFbmQpeyBzdC50RW5kPURhdGUubm93KCk7IHNhdmUoKTsgfQogIGlmKCFzdC5ldnNbImRvbmVfIitzaWRdKXsgc3QuZXZzWyJkb25lXyIrc2lkXT0xOyBzYXZlKCk7IGV2KCJkb25lIik7IH0KICBjb25zdCBzdW0gPSBzdW1tYXJ5KHJvd3MsIHJvbGUsIHNpZCwgcGF0cywgZGV2KTsKICBjb25zdCBNSVhfRkVXID0gIkluIHNldmVyYWwgYXJlYXMsIHlvdXIgYW5zd2VycyBkZXNjcmliZSB0d28gZGlmZmVyZW50IHdheXMgb2YgaGFuZGxpbmcgdGhlIHNhbWUgdHlwZSBvZiBzaXR1YXRpb24uIFRoZSBzY29yZXMgdGhlcmUgYXJlIGJhc2VkIG9uIHdoYXQgeW91IG1hcmtlZCBhcyBwcmV2YWlsaW5nLiBJZiBhbnkgb2YgdGhlbSBkb2Vzbid0IHNlZW0gYWNjdXJhdGUgdG8geW91LCBnZXQgaW4gdG91Y2ggYXQgbWlyb3NsYXYua2xlcGFjQGV4cGVydGl2ZS5ociDigJQgZGlmZmVyZW5jZXMgbGlrZSB0aGlzIGFyZSBiZXN0IGNsZWFyZWQgdXAgaW4gYSBzaG9ydCBjb252ZXJzYXRpb24uIjsKICBjb25zdCBNSVhfT05FID0gIkluIG9uZSBhcmVhLCB5b3VyIGFuc3dlcnMgZGVzY3JpYmUgdHdvIGRpZmZlcmVudCB3YXlzIG9mIGhhbmRsaW5nIHRoZSBzYW1lIHR5cGUgb2Ygc2l0dWF0aW9uLiBUaGUgc2NvcmUgdGhlcmUgaXMgYmFzZWQgb24gd2hhdCB5b3UgbWFya2VkIGFzIHByZXZhaWxpbmcuIElmIGl0IGRvZXNuJ3Qgc2VlbSBhY2N1cmF0ZSB0byB5b3UsIGdldCBpbiB0b3VjaCBhdCBtaXJvc2xhdi5rbGVwYWNAZXhwZXJ0aXZlLmhyIOKAlCBkaWZmZXJlbmNlcyBsaWtlIHRoaXMgYXJlIGJlc3QgY2xlYXJlZCB1cCBpbiBhIHNob3J0IGNvbnZlcnNhdGlvbi4iOwogIGNvbnN0IE1JWF9NQU5ZID0gIkluIG1vcmUgdGhhbiBoYWxmIG9mIHRoZSBhcmVhcywgeW91IGFjdCBpbiB0d28gZGlmZmVyZW50IHdheXMgZGVwZW5kaW5nIG9uIHRoZSBzaXR1YXRpb24gb3IgdGhlIHBlcnNvbi4gVGhhdCdzIG5vdCBhIG1pc3Rha2UsIGJ1dCBpdCBtZWFucyB0aGlzIHJlc3VsdCBzaG93cyBhIGRpcmVjdGlvbiwgbm90IGEgdmVyZGljdC4gVGhlIHBlb3BsZSBhcm91bmQgeW91IHByb2JhYmx5IHNlZSBib3RoIHZlcnNpb25zIOKAlCBhbmQgdGhhdCdzIHVzdWFsbHkgdGhlIG1vc3QgaW50ZXJlc3RpbmcgcGFydCBvZiB0aGUgY29udmVyc2F0aW9uLiBHZXQgaW4gdG91Y2ggYXQgbWlyb3NsYXYua2xlcGFjQGV4cGVydGl2ZS5ociBpZiB5b3UnZCBsaWtlIHRvIHNlZSB3aGF0J3MgYmVoaW5kIGl0LiI7CiAgY29uc3QgbnJOYW1lcyA9IG5vcmVnLm1hcCh4PT5gPHN0cm9uZz4ke2VzYyh4Lm4pfTwvc3Ryb25nPmApOwogIGNvbnN0IG5yTGlzdCA9IG5yTmFtZXMubGVuZ3RoPD0xID8gbnJOYW1lcy5qb2luKCIiKSA6IG5yTmFtZXMubGVuZ3RoPT09MiA\/IG5yTmFtZXMuam9pbigiIGFuZCAiKSA6IG5yTmFtZXMuc2xpY2UoMCwtMSkuam9pbigiLCAiKSsiLCBhbmQgIituck5hbWVzW25yTmFtZXMubGVuZ3RoLTFdOwogIGNvbnN0IE5SX1RYVCA9IGBJbiAke25yTGlzdH0sIHlvdSBkaWRuJ3QgbWFyayBhbnkgb2YgdGhlIGJlaGF2aW9ycyBkZXNjcmliZWQgYXMgc29tZXRoaW5nIHlvdSBkbyBvZnRlbi4gVGhlIE1hdHJpeCBtZWFzdXJlcyB3aGF0IHlvdSBkbyByZWd1bGFybHksIHNvIHRoZSBzY29yZSBoZXJlIGlzIDEgKGFsbCBzdGF0ZW1lbnRzIOKAnGFsbW9zdCBuZXZlcuKAnSkgb3IgMiAoc29tZSDigJxyYXJlbHnigJ0pLiBUaGUgc2NvcmUgZm9sbG93cyBkaXJlY3RseSBmcm9tIHlvdXIgYW5zd2Vycy4gSWYgdGhlc2Ugc2l0dWF0aW9ucyBzaW1wbHkgaGF2ZW4ndCBjb21lIHVwIGxhdGVseSwgaXQgZG9lc24ndCBkZXNjcmliZSB5b3Ug4oCUIGdldCBpbiB0b3VjaCBhdCBtaXJvc2xhdi5rbGVwYWNAZXhwZXJ0aXZlLmhyIGFuZCB3ZSdsbCBzb3J0IGl0IG91dCBpbiB0d28gc2VudGVuY2VzLmA7CiAgaChgCiAgPHNlY3Rpb24gY2xhc3M9InhtLXBhbmVsIj4KICAgIDxzcGFuIGNsYXNzPSJ4bS1leWVicm93Ij5SZXN1bHQgwrcgJHtyb2xlLmt9IMK3ICR7ZXNjKHJvbGUudCl9IMK3IGNvbXBsZXRlZCAke2VuRGF0ZSgpfTwvc3Bhbj4KICAgIDxwIGNsYXNzPSJ4bS1oZWFkbGluZSI+JHtoZWFkfTwvcD4KICAgICR7dW5kZXI\/YDxwIGNsYXNzPSJ4bS1hY3Rpb24iPjxzdHJvbmc+T25lIGNvbmNyZXRlIHN0ZXA6PC9zdHJvbmc+ICR7ZXNjKGFjdFRleHQodW5kZXIuaSwgdW5kZXIucykpfTwvcD5gOiIifQogICAgJHtkZXZMaW5rfQogICAgJHtub2RhdGEubGVuZ3RoP2A8cCBjbGFzcz0ieG0tbGVkZSI+JHtub2RhdGEubGVuZ3RoPT09MT8iT25lIHNraWxsIHdhc24ndCBzY29yZWQgYmVjYXVzZSB5b3UgbWFya2VkIHRoYXQgdGhlc2Ugc2l0dWF0aW9ucyBoYXZlbid0IGNvbWUgdXAgaW4geW91ciB3b3JrLiI6IlNvbWUgc2tpbGxzIHdlcmVuJ3Qgc2NvcmVkIGJlY2F1c2UgeW91IG1hcmtlZCB0aGF0IHRoZXNlIHNpdHVhdGlvbnMgaGF2ZW4ndCBjb21lIHVwIGluIHlvdXIgd29yay4ifTwvcD5gOiIifQogICAgJHtzaG93T3Zlcj9gPHAgY2xhc3M9InhtLWxlZGUiPllvdSdyZSBpbnZlc3RpbmcgaW4gYSBza2lsbCB0aGF0IG5vIGxvbmdlciBwYXlzIG9mZiDigJQgJHtlc2Mob3Zlci5uLnRvTG93ZXJDYXNlKCkpfSwgJHtvdmVyLnN9IHdoZXJlICR7b3Zlci5yZXF9IGlzIGV4cGVjdGVkIOKAlCB3aGlsZSB0aGUgb25lIHRoYXQgZGVjaWRlcyB5b3VyIG5leHQgc3RlcCBpcyBzaXR0aW5nIGF0ICR7dW5kZXIuc30uPC9wPmA6IiJ9CiAgICA8cCBjbGFzcz0ieG0tbm90ZSIgaWQ9InhtLXNlbmRzdGF0ZSI+U2VuZGluZyB5b3VyIHJlc3VsdOKApjwvcD4KICA8L3NlY3Rpb24+CiAgPHNlY3Rpb24gY2xhc3M9InhtLXBhbmVsIj4KICAgIDxoMj5NYXRyaXg8L2gyPgogICAgPGRpdiBjbGFzcz0ieG0tbGVnZW5kIj48c3Bhbj48aSBzdHlsZT0id2lkdGg6MTBweDtoZWlnaHQ6MTBweDtib3JkZXItcmFkaXVzOjUwJTtiYWNrZ3JvdW5kOnZhcigtLWFjY2VudCkiPjwvaT5hY2hpZXZlZDwvc3Bhbj48c3Bhbj48aSBzdHlsZT0id2lkdGg6MTBweDtoZWlnaHQ6MTBweDtib3JkZXItcmFkaXVzOjUwJTtiYWNrZ3JvdW5kOnZhcigtLWJlbG93KSI+PC9pPmJlbG93IGV4cGVjdGVkPC9zcGFuPjxzcGFuPjxpIHN0eWxlPSJ3aWR0aDoycHg7aGVpZ2h0OjEycHg7YmFja2dyb3VuZDp2YXIoLS1pbmspIj48L2k+ZXhwZWN0ZWQgZm9yIHRoZSByb2xlPC9zcGFuPjxzcGFuPlNjYWxlIDHigJMxMCDCtyB0aGlzIGluc3RydW1lbnQgbmV2ZXIgYXdhcmRzIGEgMTA8L3NwYW4+PC9kaXY+CiAgICA8ZGl2IGNsYXNzPSJ4bS1zY3JvbGwiPgogICAgICA8dGFibGU+CiAgICAgICAgPHRoZWFkPjx0cj48dGg+U2tpbGw8L3RoPjx0aD5BY2hpZXZlZDwvdGg+PHRoPkV4cGVjdGVkPC90aD48dGg+R2FwPC90aD48dGg+MSDigJQgMTA8L3RoPjwvdHI+PC90aGVhZD4KICAgICAgICA8dGJvZHk+CiAgICAgICAgJHtyb3dzLm1hcCh4PT57IGNvbnN0IGhpZGUgPSB4Lm5kOyByZXR1cm4gYDx0cj4KICAgICAgICAgIDx0ZD4ke2VzYyh4Lm4pfSR7eC5uZD8nIDxzcGFuIGNsYXNzPSJ4bS1tYXJrIj7impEgbm8gc3VjaCBzaXR1YXRpb25zPC9zcGFuPic6Jyd9JHt4Lm5yPycgPHNwYW4gY2xhc3M9InhtLW1hcmsiPuKakSBubyByZWd1bGFyIGJlaGF2aW9yPC9zcGFuPic6Jyd9JHt4LmNvbnRyYT8nIDxzcGFuIGNsYXNzPSJ4bS1tYXJrIj7impEgbWl4ZWQgcGF0dGVybjwvc3Bhbj4nOicnfSR7eC5wZmFpbD8nIDxzcGFuIGNsYXNzPSJ4bS1tYXJrIj7impEgY2hlY2s8L3NwYW4+JzonJ308L3RkPgogICAgICAgICAgPHRkIGNsYXNzPSJ4bS1udW0iPiR7aGlkZT8n4oCUJzp4LnN9PC90ZD48dGQgY2xhc3M9InhtLW51bSI+JHt4LnJlcX08L3RkPgogICAgICAgICAgPHRkIGNsYXNzPSJ4bS1udW0geG0tZ2FwICR7aGlkZT8nJzp4LmdhcD4wPyd4bS1uZWcnOnguZ2FwPDA\/J3htLXBvcyc6Jyd9Ij4ke2hpZGU\/J+KAlCc6eC5nYXA+MD8n4oiSJyt4LmdhcDp4LmdhcDwwPycrJysoLXguZ2FwKTonMCd9PC90ZD4KICAgICAgICAgIDx0ZD48ZGl2IGNsYXNzPSJ4bS10cmFjayI+PHNwYW4gY2xhc3M9InhtLXJlcSIgc3R5bGU9ImxlZnQ6JHsoeC5yZXEtMSkvOSoxMDB9JSI+PC9zcGFuPiR7aGlkZT8nJzpgPHNwYW4gY2xhc3M9InhtLWRvdCR7eC5nYXA+MD8nIHhtLWxvJzonJ30iIHN0eWxlPSJsZWZ0OiR7KHgucy0xKS85KjEwMH0lIj48L3NwYW4+YH08c3BhbiBjbGFzcz0ieG0tdGVuIj48L3NwYW4+PC9kaXY+PC90ZD4KICAgICAgICA8L3RyPmA7IH0pLmpvaW4oIiIpfQogICAgICAgIDwvdGJvZHk+CiAgICAgIDwvdGFibGU+CiAgICA8L2Rpdj4KICAgICR7YWRqTGlzdC5sZW5ndGg\/YDxwIGNsYXNzPSJ4bS1ub3RlIj5FeHBlY3RlZCBsZXZlbHMgYWRqdXN0ZWQgZm9yICR7YWRqV2h5KCl9OiAke2Fkakxpc3QubWFwKHg9PmAke2VzYyh4Lm4udG9Mb3dlckNhc2UoKSl9ICgke3gucmVxfSBpbnN0ZWFkIG9mICR7eC5iYXNlfSlgKS5qb2luKCIsICIpfS48L3A+YDoiIn0KICAgIDxwIGNsYXNzPSJ4bS1ub3RlIj5HYXAgPSBhY2hpZXZlZCBjb21wYXJlZCB3aXRoIGV4cGVjdGVkLiBPcmFuZ2UgbWVhbnMgYmVsb3cgZXhwZWN0ZWQsIGJsdWUgbWVhbnMgYWJvdmUg4oCUIHdoaWNoLCBpZiBpdCdzIHdlbGwgYWJvdmUsIGlzIGEgaGlkZGVuIGNvc3Q6IGVuZXJneSBpbnZlc3RlZCB3aGVyZSBpdCBubyBsb25nZXIgcGF5cyBvZmYuPC9wPgogIDwvc2VjdGlvbj4KICAke2NvbnRyYS5sZW5ndGg\/YDxzZWN0aW9uIGNsYXNzPSJ4bS1wYW5lbCI+CiAgICA8aDI+TWl4ZWQgcGF0dGVybjwvaDI+CiAgICA8cCBjbGFzcz0ieG0tbGVkZSI+JHtjb250cmEubGVuZ3RoPj01P01JWF9NQU5ZOmNvbnRyYS5sZW5ndGg9PT0xP01JWF9PTkU6TUlYX0ZFV308L3A+CiAgICAke2NvbnRyYS5tYXAoeD0+YDxwIGNsYXNzPSJ4bS1mbGFnIj48c3Ryb25nPiR7ZXNjKHgubil9Ljwvc3Ryb25nPiAke21peFR4dCh4LnRiKX08L3A+YCkuam9pbigiIil9CiAgPC9zZWN0aW9uPmA6IiJ9CiAgJHtub3JlZy5sZW5ndGg\/YDxzZWN0aW9uIGNsYXNzPSJ4bS1wYW5lbCI+CiAgICA8aDI+Tm9uZSBvZiB0aGVzZSBiZWhhdmlvcnMgb2NjdXJzIHJlZ3VsYXJseTwvaDI+CiAgICA8cCBjbGFzcz0ieG0tbGVkZSI+JHtOUl9UWFR9PC9wPgogIDwvc2VjdGlvbj5gOiIifQogICR7c2hvd24ubGVuZ3RoP2A8c2VjdGlvbiBjbGFzcz0ieG0tcGFuZWwiPgogICAgPGgyPiR7c2hvd24ubGVuZ3RoPjE\/IllvdXIgcGF0dGVybnMiOiJZb3VyIHBhdHRlcm4ifTwvaDI+CiAgICAke3Nob3duLm1hcChwPT5gPGRpdiBjbGFzcz0ieG0tcGF0dGVybiI+PHAgY2xhc3M9InhtLXBhdHRlcm4tbmFtZSI+JHtlc2MocC5jbGllbnQpfTwvcD48cD4ke2VzYyhwLnRleHQpfTwvcD4ke3AucnE\/YDxwIGNsYXNzPSJ4bS1yZWZsZWN0Ij48ZW0+Rm9vZCBmb3IgdGhvdWdodDo8L2VtPiAke2VzYyhwLnJxKX08L3A+YDoiIn0ke3Bvc3RIVE1MKFBBVF9QT1NUW3AuaWRdKX08L2Rpdj5gKS5qb2luKCIiKX0KICA8L3NlY3Rpb24+YDoiIn0KICAke3BmYWlsLmxlbmd0aD9gPHNlY3Rpb24gY2xhc3M9InhtLXBhbmVsIj4KICAgIDxoMj5UaGUgY2hlY2sgZG9lcyBub3Qgc3VwcG9ydCB0aGlzIGxldmVsPC9oMj4KICAgIDxwIGNsYXNzPSJ4bS1sZWRlIj5IZXJlLCB5b3VyIGFuc3dlciB0byB0aGUgY2hlY2sgZG9lc24ndCBzdXBwb3J0IHRoZSBsZXZlbCBkZXNjcmliZWQgYnkgeW91ciBvdGhlciBhbnN3ZXJzLCBzbyB0aGUgc2NvcmUgaXMgY2FwcGVkIGF0IDYuPC9wPgogICAgJHtwZmFpbC5tYXAoeD0+YDxwIGNsYXNzPSJ4bS1mbGFnIj48c3Ryb25nPiR7ZXNjKHgubil9Ljwvc3Ryb25nPiBDaGVjazog4oCcJHtlc2MoQ1t4LmldLnApfeKAnSDigJQgeW91ciBhbnN3ZXI6ICR7ZXNjKENIRUNLT1BUU1tDW3guaV0ucHRdW3N0LnBbeC5pXV0pfS48L3A+YCkuam9pbigiIil9CiAgPC9zZWN0aW9uPmA6IiJ9CiAgPHNlY3Rpb24gY2xhc3M9InhtLXBhbmVsIHhtLW9mZmVyIj4KICAgIDxwIGNsYXNzPSJ4bS1vZmZlci1sZWFkIj5UaGlzIGlzIGhvdyB5b3Ugc2VlIHlvdXJzZWxmIOKAlCBhbmQgdGhhdCdzIG9ubHkgaGFsZiB0aGUgcGljdHVyZS48L3A+CiAgICA8cCBjbGFzcz0ieG0tbGVkZSI+VGhlIG90aGVyIGhhbGYgaXMgc2VlbiBieSB0aGUgcGVvcGxlIHlvdSB3b3JrIHdpdGguIElmIHlvdSdyZSBjdXJpb3VzIGhvdyB0aGUgdHdvIGhhbHZlcyBmaXQgdG9nZXRoZXIsIGJvb2sgYSBzaG9ydCBjb252ZXJzYXRpb24uPC9wPgogICAgPHA+PGEgY2xhc3M9InhtLWN0YSIgaHJlZj0ibWFpbHRvOiR7Qk9PS19NQUlMfT9zdWJqZWN0PSR7ZW5jb2RlVVJJQ29tcG9uZW50KCJDb252ZXJzYXRpb24gYWJvdXQgbXkgU2tpbGxzIE1hdHJpeCByZXN1bHQgKCIrc2lkKyIpIil9JmJvZHk9JHtlbmNvZGVVUklDb21wb25lbnQoIkhlbGxvLFxuXG5JJ2QgbGlrZSB0byBzdWdnZXN0IGEgdGltZSB0byB0YWxrIGFib3V0IG15IFNraWxscyBNYXRyaXggcmVzdWx0IChJRCAiK3NpZCsiKTpcblxuIil9Ij5Cb29rIDMwIG1pbnV0ZXMgdG8gdGFsayBhYm91dCB5b3VyIHJlc3VsdDwvYT4gPHNwYW4gY2xhc3M9InhtLWN0YS1ub3RlIj7igJQgZnJlZSBhbmQgd2l0aCBubyBvYmxpZ2F0aW9uLjwvc3Bhbj48L3A+CiAgICA8cCBjbGFzcz0ieG0tbm90ZSI+VGhlIDxhIGhyZWY9Imh0dHBzOi8vZXhwZXJ0aXZlLmhyL2VuL3NraWxscy1tYXRyaXgtMzYwLyIgdGFyZ2V0PSJfYmxhbmsiIHJlbD0ibm9vcGVuZXIiPlNraWxscyBNYXRyaXggMzYwPC9hPiBpcyBhIHNlcGFyYXRlLCBhZGRpdGlvbmFsIHNlcnZpY2U6IHRlbiBza2lsbHMgY2hvc2VuIGZvciB5b3VyIHJvbGUgYXJlIHJhdGVkIGJ5IDIgdG8gMTAgcGVvcGxlOiB5b3VyIG1hbmFnZXJzLCBwZWVycyBhbmQgcGVvcGxlIHlvdSBsZWFkLiBXZSBnbyB0aHJvdWdoIHRoZSByZXN1bHQgdG9nZXRoZXIgaW4gYSBjb252ZXJzYXRpb24uPC9wPgogIDwvc2VjdGlvbj4KICA8c2VjdGlvbiBjbGFzcz0ieG0tcGFuZWwiIGlkPSJ4bS1jb21tZW50Ij4KICAgIDxoMj5Xb3VsZCB5b3UgbGlrZSBhIHBlcnNvbmFsIGNvbW1lbnQgb24geW91ciByZXN1bHQ\/PC9oMj4KICAgIDxwIGNsYXNzPSJ4bS1sZWRlIj5NaXJvc2xhdiBLbGVwYcSNIHBlcnNvbmFsbHkgcmV2aWV3cyByZXN1bHRzIGFuZCBzZW5kcyBhIHNob3J0IGNvbW1lbnQgZXhwbGFpbmluZyB3aGF0IHlvdXIgcmVzdWx0IHRlbGxzIHlvdSBhbmQgd2hlcmUgeW91IGhhdmUgdGhlIG1vc3Qgcm9vbSBmb3IgZ3Jvd3RoLjwvcD4KICAgIDxkaXYgY2xhc3M9InhtLWZpZWxkcyI+CiAgICAgIDxkaXYgY2xhc3M9InhtLWZpZWxkIj48bGFiZWwgZm9yPSJ4bS1uYW1lIj5GdWxsIG5hbWU8L2xhYmVsPjxpbnB1dCBpZD0ieG0tbmFtZSIgYXV0b2NvbXBsZXRlPSJuYW1lIj48L2Rpdj4KICAgICAgPGRpdiBjbGFzcz0ieG0tZmllbGQiPjxsYWJlbCBmb3I9InhtLWVtYWlsMiI+RW1haWw8L2xhYmVsPjxpbnB1dCBpZD0ieG0tZW1haWwyIiB0eXBlPSJlbWFpbCIgYXV0b2NvbXBsZXRlPSJlbWFpbCIgdmFsdWU9IiR7ZXNjKHN0LmVtYWlsLnRyaW0oKSl9Ij48L2Rpdj4KICAgICAgPGRpdiBjbGFzcz0ieG0tZmllbGQiPjxsYWJlbCBmb3I9InhtLWNvbXBhbnkiPkNvbXBhbnkgYW5kIHBvc2l0aW9uIDxzcGFuIHN0eWxlPSJmb250LXdlaWdodDo0MDA7Y29sb3I6dmFyKC0tbXV0ZWQpIj4ob3B0aW9uYWwpPC9zcGFuPjwvbGFiZWw+PGlucHV0IGlkPSJ4bS1jb21wYW55IiBhdXRvY29tcGxldGU9Im9yZ2FuaXphdGlvbiI+PC9kaXY+CiAgICA8L2Rpdj4KICAgIDxkaXYgY2xhc3M9InhtLWhwIiBhcmlhLWhpZGRlbj0idHJ1ZSI+PGxhYmVsPkxlYXZlIHRoaXMgYmxhbms8aW5wdXQgaWQ9InhtLWhwIiB0YWJpbmRleD0iLTEiIGF1dG9jb21wbGV0ZT0ib2ZmIj48L2xhYmVsPjwvZGl2PgogICAgPGxhYmVsIGNsYXNzPSJ4bS1jb25zZW50Ij48aW5wdXQgdHlwZT0iY2hlY2tib3giIGlkPSJ4bS1jb25zZW50MiI+PHNwYW4+SSdkIGxpa2UgYSBwZXJzb25hbCBjb21tZW50IG9uIG15IHJlc3VsdC4gSSBhZ3JlZSB0aGF0IEV4cGVydGl2ZSBkLm8uby4gbWF5IHByb2Nlc3MgbXkgbmFtZSwgZW1haWwgYW5kIHRlc3QgcmVzdWx0cyBmb3IgdGhpcyBwdXJwb3NlIGFuZCBjb250YWN0IG1lIHRvIGRlbGl2ZXIgdGhlIGNvbW1lbnQuPC9zcGFuPjwvbGFiZWw+CiAgICA8bGFiZWwgY2xhc3M9InhtLWNvbnNlbnQiPjxpbnB1dCB0eXBlPSJjaGVja2JveCIgaWQ9InhtLW5ld3MiPjxzcGFuPllvdSBtYXkgb2NjYXNpb25hbGx5IHNlbmQgbWUgYXJ0aWNsZXMgYW5kIGludml0YXRpb25zIHJlbGF0ZWQgdG8gbGVhZGVyc2hpcCBhbmQgZXhlY3V0aXZlIGNvYWNoaW5nLiBJIGNhbiB1bnN1YnNjcmliZSBhdCBhbnkgdGltZS4gPGVtIHN0eWxlPSJjb2xvcjp2YXIoLS1tdXRlZCkiPihvcHRpb25hbCk8L2VtPjwvc3Bhbj48L2xhYmVsPgogICAgPGRpdiBjbGFzcz0ieG0tcm93Ij48YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9InhtLXByaW1hcnkiIGlkPSJ4bS1zZW5kIj5SZXF1ZXN0IGEgcGVyc29uYWwgY29tbWVudDwvYnV0dG9uPjwvZGl2PgogICAgPHAgY2xhc3M9InhtLWhpbnQiIGlkPSJ4bS1lcnIiIGhpZGRlbj48L3A+CiAgICA8cCBjbGFzcz0ieG0tb2ttc2ciIGlkPSJ4bS1vayIgaGlkZGVuPlRoYW5rIHlvdS4gWW91ciByZXF1ZXN0IGhhcyBiZWVuIHJlY2VpdmVkIOKAlCB5b3UnbGwgZ2V0IHRoZSBjb21tZW50IGF0IHRoZSBlbWFpbCB5b3UgcHJvdmlkZWQuPC9wPgogICAgJHtwcml2YWN5SFRNTCgpfQogIDwvc2VjdGlvbj4KICA8ZGl2IGNsYXNzPSJ4bS1uYXYiPjxzcGFuPjwvc3Bhbj48YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9InhtLWdob3N0IiBpZD0ieG0tcmVzdGFydCI+U3RhcnQgb3ZlcjwvYnV0dG9uPjwvZGl2PmApOwoKICBjb25zdCBzdGF0ZUVsPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ4bS1zZW5kc3RhdGUiKTsKICBjb25zdCBtYWlsID0gc3QuZW1haWwudHJpbSgpOwogIGZ1bmN0aW9uIHNlbmRSZXN1bHQoKXsKICAgIGNvbnN0IG9rVGV4dD1gV2UndmUgc2VudCB5b3VyIHJlc3VsdCB0byAke21haWx9LiBJZiB5b3UgZG9uJ3Qgc2VlIGl0IHdpdGhpbiBhIGZldyBtaW51dGVzLCBjaGVjayB5b3VyIHNwYW0gZm9sZGVyLmA7CiAgICBpZihzdC5zZW50W3NpZF0peyBzdGF0ZUVsLnRleHRDb250ZW50PW9rVGV4dDsgcmV0dXJuOyB9CiAgICBzdGF0ZUVsLnRleHRDb250ZW50PSJTZW5kaW5nIHlvdXIgcmVzdWx0IHRvIHlvdXIgZW1haWzigKYiOwogICAgc2VuZCh7dHlwZToicmVzdWx0Iiwgcm9sZTpyLCBzaXplOnN0LnNpemV8fCIiLCB0ZWFtOnN0LnRlYW18fCIiLCBlbWFpbDptYWlsLCBjb25zZW50MTp0cnVlLCBzaWQ6c2lkLCBhOnN0LmEsIHA6c3QucCwgbmE6c3QubmEsIHRiOnN0LnRiLCBwYXR0ZXJuczpzaG93bi5tYXAocD0+cC5pZCksIGRldjE6KHVuZGVyP3VuZGVyLmk6bnVsbCksIHN1bW1hcnk6c3VtLCBocDoiIn0pCiAgICAgIC50aGVuKHJlcz0+ewogICAgICAgIGlmKHJlcy5vayl7IHN0LnNlbnRbc2lkXT10cnVlOyBzYXZlKCk7IHN0YXRlRWwudGV4dENvbnRlbnQgPSByZXMuY2xpZW50ID8gb2tUZXh0IDogYFlvdXIgcmVzdWx0IGhhcyBiZWVuIHJlY2VpdmVkLiBXZSdsbCBzZW5kIGEgY29weSB0byAke21haWx9LmA7IH0KICAgICAgICBlbHNlIGlmKHJlcy5saW1pdCl7IHN0YXRlRWwudGV4dENvbnRlbnQ9IllvdXIgcmVzdWx0IGhhcyBhbHJlYWR5IGJlZW4gc2VudCBzZXZlcmFsIHRpbWVzLiBJZiB5b3UgZGlkbid0IGdldCBpdCwgd3JpdGUgdG8gbWlyb3NsYXYua2xlcGFjQGV4cGVydGl2ZS5oci4iOyB9CiAgICAgICAgZWxzZSB7IHN0YXRlRWwuaW5uZXJIVE1MPWBTZW5kaW5nIHlvdXIgcmVzdWx0IGZhaWxlZC4gPGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJ4bS1naG9zdCIgaWQ9InhtLXJldHJ5Ij5UcnkgYWdhaW48L2J1dHRvbj5gOyBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgieG0tcmV0cnkiKS5vbmNsaWNrPXNlbmRSZXN1bHQ7IH0KICAgICAgfSk7CiAgfQogIHNlbmRSZXN1bHQoKTsKCiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInhtLXNlbmQiKS5vbmNsaWNrPSgpPT57CiAgICBjb25zdCBlcnI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInhtLWVyciIpLCBvaz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgieG0tb2siKSwgYnRuPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ4bS1zZW5kIik7CiAgICBjb25zdCBuYW1lPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ4bS1uYW1lIikudmFsdWUudHJpbSgpOwogICAgY29uc3QgZW1haWw9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInhtLWVtYWlsMiIpLnZhbHVlLnRyaW0oKTsKICAgIGNvbnN0IGNvbXBhbnk9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInhtLWNvbXBhbnkiKS52YWx1ZS50cmltKCk7CiAgICBjb25zdCBjb25zZW50PWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ4bS1jb25zZW50MiIpLmNoZWNrZWQ7CiAgICBjb25zdCBuZXdzPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ4bS1uZXdzIikuY2hlY2tlZDsKICAgIGxldCBtc2c9IiI7CiAgICBpZighbmFtZSkgbXNnPSJFbnRlciB5b3VyIGZ1bGwgbmFtZS4iOwogICAgZWxzZSBpZighRU1BSUxfUkUudGVzdChlbWFpbCkpIG1zZz0iRW50ZXIgYSB2YWxpZCBlbWFpbCBhZGRyZXNzLiI7CiAgICBlbHNlIGlmKCFjb25zZW50KSBtc2c9IlRvIGdldCBhIHBlcnNvbmFsIGNvbW1lbnQsIHBsZWFzZSBjaGVjayB0aGUgY29uc2VudCBib3guIjsKICAgIGVyci50ZXh0Q29udGVudD1tc2c7IGVyci5oaWRkZW49IW1zZzsgb2suaGlkZGVuPXRydWU7CiAgICBpZihtc2cpIHJldHVybjsKICAgIGlmKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ4bS1ocCIpLnZhbHVlKXsgb2suaGlkZGVuPWZhbHNlOyByZXR1cm47IH0KICAgIGJ0bi5kaXNhYmxlZD10cnVlOyBidG4udGV4dENvbnRlbnQ9IlNlbmRpbmfigKYiOwogICAgc2VuZCh7dHlwZToiY29tbWVudCIsIHJvbGU6ciwgc2lkOnNpZCwgbmFtZTpuYW1lLCBlbWFpbDplbWFpbCwgY29tcGFueTpjb21wYW55LCBjb25zZW50Mjp0cnVlLCBuZXdzOm5ld3MsIGhwOmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ4bS1ocCIpLnZhbHVlfSkKICAgICAgLnRoZW4ocmVzPT57CiAgICAgICAgYnRuLmRpc2FibGVkPWZhbHNlOyBidG4udGV4dENvbnRlbnQ9IlJlcXVlc3QgYSBwZXJzb25hbCBjb21tZW50IjsKICAgICAgICBpZihyZXMub2speyBvay5oaWRkZW49ZmFsc2U7IGJ0bi5oaWRkZW49dHJ1ZTsgfQogICAgICAgIGVsc2UgeyBlcnIudGV4dENvbnRlbnQgPSAiU2VuZGluZyBmYWlsZWQuIFBsZWFzZSB0cnkgYWdhaW4gb3Igd3JpdGUgdG8gbWlyb3NsYXYua2xlcGFjQGV4cGVydGl2ZS5oci4iOyBlcnIuaGlkZGVuPWZhbHNlOyB9CiAgICAgIH0pOwogIH07CiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInhtLXJlc3RhcnQiKS5vbmNsaWNrPSgpPT57IHN0PWZyZXNoKCk7IHNhdmUoKTsgcmVuZGVyU3RhcnQoKTsgfTsKfQoKZnVuY3Rpb24gc3VtbWFyeShyb3dzLCByb2xlLCBzaWQsIHBhdHMsIGRldil7CiAgLy8gRU46IHNhxb5ldGFrIG9zdGFqZSBuYSBocnZhdHNrb20gKEhSIG5heml2aSB2amXFoXRpbmEsIHVsb2dhIGkgb2Rnb3ZvcmEgbmEgcHJvdmplcnUpCiAgcm93cyA9IHJvd3MubWFwKHg9Pk9iamVjdC5hc3NpZ24oe30seCx7bjpDW3guaV0ubmh9KSk7CiAgZGV2ID0gZGV2Lm1hcCh4PT5PYmplY3QuYXNzaWduKHt9LHgse246Q1t4LmldLm5ofSkpOwogIGNvbnN0IEw9W107CiAgTC5wdXNoKGAke1ZFUlpJSkF9IMK3IEpFWklLOiBFTiDCtyBJRCBpc3B1bmphdmFuamE6ICR7c2lkfSDCtyB1bG9nYSAke3JvbGUua30gKCR7Uk9MRVNfSFJbcm9sZS5pZF0udH0pYCk7CiAgY29uc3QgbmMgPSByb3dzLmZpbHRlcih4PT54LmNvbnRyYSkubGVuZ3RoOwogIGNvbnN0IG51ID0gcm93cy5maWx0ZXIoeD0+eC5jb250cmEgJiYgIXgudGIpLmxlbmd0aDsKICBMLnB1c2goYEtvbnRla3N0IChuZW9iYXZlem5vKTogemFwb3NsZW5paCAkeyh7czoiZG8gMjQ5IixtOiIyNTDigJM0Ljk5OSIsbDoiNS4wMDArIn0pW3N0LnNpemVdfHwibmlqZSBuYXZlZGVubyJ9IMK3IHZvZGkgbGp1ZGkgJHsoeyIwIjoiMOKAkzMiLCI0IjoiNCsifSlbc3QudGVhbV18fCJuaWplIG5hdmVkZW5vIn0gwrcgcHJpbGFnb8SRZW5vOiAke3Jvd3MuZmlsdGVyKHg9PngucmVxIT09eC5iYXNlKS5tYXAoeD0+YCR7eC5ufSAke3guYmFzZX3ihpIke3gucmVxfWApLmpvaW4oIjsgIil8fCJuacWhdGEifWApOwogIEwucHVzaChgTWplxaFvdml0aSBvYnJhc2NpOiAke25jfSBvZCA5JHtudT9gIChiZXogb2Rnb3ZvcmEgbmEgZG9kYXRubyBwaXRhbmplOiAke251fSlgOiIifSDCtyBrbGlqZW50IHZpZGkgc3ZlIG9jamVuZWApOwogIGlmKG51Pj01KSBMLnB1c2goYFBST0ZJTCBORUtPTlpJU1RFTlRBTiDigJQgJHtudX0gbWplxaFvdml0aWggb2JyYXphY2EgYmV6IG9kZ292b3JhIG5hIGRvZGF0bm8gcGl0YW5qZWApOwogIHJvd3MuZm9yRWFjaCgoeCxpKT0+ewogICAgY29uc3QgYT1zdC5hW2ldLm1hcCh2PT52PT1udWxsPyItIjp2KS5qb2luKCIgIik7CiAgICBpZih4Lm5kKXsKICAgICAgTC5wdXNoKGAke2krMX0uICR7Q1tpXS5uaH06IEJFWiBPQ0pFTkUgKCR7eC53aHl9KSB8IG9kZ292b3JpIFIx4oCTUjUgWyR7c3QubmFbaV0\/Im5pamUgYmlsbyBzaXR1YWNpamEiOmF9XSB8IG\/EjWVraXZhbm8gJHt4LnJlcX1gKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgY29uc3Qgbm90ZXM9W3gubnI\/InJhemluYSDigJQiOmByYXppbmEgJHt4Lkx9YF07CiAgICBpZih4Lm5yKSBub3Rlcy5wdXNoKGBOScWgVEEgUkVET1ZJVE8g4oaSICR7eC5zPT09MT8ic3ZlIGdvdG92byBuaWthZCwgMSI6ImJhcmVtIGplZG5vIHJpamV0a28sIDIifWApOwogICAgaWYoeC5jb250cmEpIG5vdGVzLnB1c2goYE1KRcWgT1ZJVCBPQlJBWkFDIHJhemluZSAke3guTG1pbn3igJMke3guTH0g4oaSICR7eC50YiE9bnVsbD9gbmFqxI1lxaHEh2UgUiR7eC50Yn0sICR7eC5zfWA6ImJleiBvZGdvdm9yYSwgNSJ9YCk7CiAgICBpZih4LnBlbikgbm90ZXMucHVzaChgdW1hbmplbm8gJHt4LnBlbn1gKTsKICAgIGlmKHgucGZhaWwpIG5vdGVzLnB1c2goIlBST1ZKRVJBIE5FIFBPVFZSxJBVSkUg4oaSIG5hanZpxaFlIDYiKTsKICAgIGNvbnN0IG5tPWNudE1haihpKTsgaWYobm0+PUJMT0NLX01BSikgbm90ZXMucHVzaChgMysgxIxFU1RPICgke25tfSlgKTsKICAgIEwucHVzaChgJHtpKzF9LiAke3gubn06IHBvc3RpZ251dG8gJHt4LnN9LCBvxI1la2l2YW5vICR7eC5yZXF9LCByYXpsaWthICR7eC5nYXA+MD8nLScreC5nYXA6eC5nYXA8MD8nKycrKC14LmdhcCk6JzAnfSB8ICR7bm90ZXMuam9pbigiLCAiKX0gfCBvZGdvdm9yaSBSMeKAk1I1IFske2F9XSB8IHByb3ZqZXJhOiAke3N0LnBbaV09PW51bGw\/J+KAlCc6Q0hFQ0tPUFRTX0hSW0NbaV0ucHRdW3N0LnBbaV1dfWApOwogIH0pOwogIEwucHVzaChgT2JyYXNjaTogJHtwYXRzLmxlbmd0aD9wYXRzLm1hcCgocCxrKT0+cC5pZCsocC5ib29zdGVkPyIgKHBvamHEjWFuKSI6IiIpKyhrPDI\/IiI6IiAobmlqZSBwcmlrYXphbikiKSkuam9pbigiLCAiKToibmlqZWRhbiJ9YCk7CiAgY29uc3Qgc2cgPSBzdHJvbmdlc3Qocm93cykuc2xpY2UoMCwyKS5tYXAoeD0+eC5uKTsKICBMLnB1c2goYE5hamphxI1lOiAke3NnLmxlbmd0aD9zZy5qb2luKCI7ICIpOiJuZW1hIGJleiBvem5ha2UifWApOwogIEwucHVzaChgUG9kcnXEjWphIHJhenZvamEgKHJlZG9zbGlqZWQgdjMuNSk6ICR7ZGV2Lmxlbmd0aD9kZXYuc2xpY2UoMCwzKS5tYXAoKHgsayk9PmAke2srMX0pICR7eC5ufSAoJHsteC5nYXB9KWApLmpvaW4oIjsgIik6Im5lbWEgamF6YSJ9YCk7CiAgY29uc3QgbTMgPSBDLm1hcCgoYyxpKT0+KHtuOmMubmgsIGs6c3QubmFbaV0\/MDpjbnRNYWooaSl9KSkuZmlsdGVyKHg9Pnguaz49QkxPQ0tfTUFKKTsKICBpZihtMy5sZW5ndGgpIEwucHVzaChgMysgxIxFU1RPICh1ICR7bTMubGVuZ3RofSBrb21wZXRlbmNpamEpOiAke20zLm1hcCh4PT5gJHt4Lm59ICgke3gua30pYCkuam9pbigiOyAiKX1gKTsKICBjb25zdCBmYyA9IGZsYXRDb3VudCgpLCBhciA9IGFsbFJlZ0NvdW50KCk7CiAgaWYoYWNxdWllc2NlKCkpIEwucHVzaChgT1pOQUtBICJTVklNQSBLQcW9RU0gREEiOiAke2ZjPj0zP2B1ICR7ZmN9IGtvbXBldGVuY2lqYSByYXppbmUgMSwgMiBpIDMgc3ZlIHJlZG92aXRlYDoiIn0ke2ZjPj0zJiZhcj8iOyAiOiIifSR7YXI\/YHUgJHthcn0ga29tcGV0ZW5jaWphIHN2ZSB0dnJkbmplIHJlZG92aXRlYDoiIn0g4oCUIHByb3ZqZXJpdGkgdSByYXpnb3ZvcnVgKTsKICBpZihhZGFwdGl2ZShyb3dzKSkgTC5wdXNoKGBPWk5BS0EgIk1PR1XEhkUgRE9CUk8gTUlKRU5KQU5KRSBTVElMQSIgKHNhbW8gaW50ZXJubywga2xpamVudCBqZSBuZSB2aWRpKTogbWplxaFvdml0IG9icmF6YWMgdSAke25jfSBrb21wZXRlbmNpamEsIHJhem1hY2kgbWFsaSwgYmV6IHByaXN0YWphbmphIGkgYmV6IHBhbGUgcHJvdmplcmVgKTsKICBjb25zdCBuciA9IHJvd3MuZmlsdGVyKHg9PngubnIpOwogIGlmKG5yLmxlbmd0aCkgTC5wdXNoKGBOScWgVEEgUkVET1ZJVE86ICR7bnIubWFwKHg9PmAke3gubn0gKCR7eC5zfSlgKS5qb2luKCI7ICIpfWApOwogIGNvbnN0IG5kID0gcm93cy5maWx0ZXIoeD0+eC5uZCk7CiAgaWYobmQubGVuZ3RoKSBMLnB1c2goYEJFWiBPQ0pFTkU6ICR7bmQubWFwKHg9PmAke3gubn0gKCR7eC53aHl9KWApLmpvaW4oIjsgIil9YCk7CiAgaWYoc3QudDAgJiYgc3QudEVuZCAmJiBzdC50RW5kPnN0LnQwKXsKICAgIGNvbnN0IGZtdD10PT5gJHtNYXRoLmZsb29yKHQvNjApfSBtaW4gJHt0JTYwfSBzYDsKICAgIGNvbnN0IHNlYz1NYXRoLnJvdW5kKChzdC50RW5kLXN0LnQwKS8xMDAwKSwgYWN0PU1hdGgucm91bmQoQy5yZWR1Y2UoKHQsYyxpKT0+dCsoc3QudGNbaV18fDApLDApLzEwMDApOwogICAgTC5wdXNoKGBUUkFKQU5KRTogdWt1cG5vICR7Zm10KHNlYyl9IChvZCDigJ5LcmVuaeKAnSBkbyByZXp1bHRhdGEpIMK3IGFrdGl2bm8gJHtmbXQoYWN0KX0gKHpicm9qIGVrcmFuYSBrb21wZXRlbmNpamEpJHthY3Q8MzYwPyIgwrcgQlJaTyAoYWt0aXZubyBpc3BvZCA2IG1pbikiOiIifSDCtyBwbyBrb21wZXRlbmNpamkgKHMpOiAke0MubWFwKChjLGkpPT5gJHtpKzF9KSAke01hdGgucm91bmQoKHN0LnRjW2ldfHwwKS8xMDAwKX1gKS5qb2luKCIsICIpfWApOwogIH0gZWxzZSBMLnB1c2goIlRSQUpBTkpFOiBuaWplIGl6bWplcmVubyAoaXNwdW5qYXZhbmplIHphcG\/EjWV0byBwcmlqZSB3ZWIgMi4zKSIpOwogIEwucHVzaChgU2thbGEgKHN2aWggOSk6IDA9Z290b3ZvIG5pa2FkLCAxPXJpamV0a28sIDI9xI1lc3RvLCAzPWdvdG92byB1dmlqZWtgKTsKICByZXR1cm4gTC5qb2luKCJcbiIpOwp9Cgp0cnl7IHdpbmRvdy5fX3htID0ge0MsIFJPTEVTX0hSLCBDSEVDS09QVFNfSFIsIGdldCBzdCgpe3JldHVybiBzdH0sIHNldCBzdCh2KXtzdD12fSwgc2NvcmUsIHRpZUxpc3QsIGJsb2NrU3VtLCBhZGFwdGl2ZSwgYWNxdWllc2NlLCBzdW1tYXJ5LCBwYXR0ZXJucywgZGV2T3JkZXIsIHN0cm9uZ2VzdCwgUk9MRVMsIFBPU1RTLCBQQVRfUE9TVCwgQ09NUF9QT1NUfTsgfWNhdGNoKGUpe30KY29uc3QgY29tcGxldGUgPSBzdC5hLmV2ZXJ5KChyLGkpPT5zdC5uYVtpXXx8ci5ldmVyeSh2PT52IT1udWxsKSkgJiYgc3QucC5ldmVyeSgodixpKT0+c3QubmFbaV18fHYhPW51bGwpOwppZihzdGFydFJlYWR5KCkgJiYgY29tcGxldGUgJiYgc3QuZG9uZUF0KSByZW5kZXJSZXN1bHQoKTsKZWxzZSBpZihzdGFydFJlYWR5KCkgJiYgc3Quc3RlcD49MCAmJiAhY29tcGxldGUpIHJlbmRlclN0ZXAoKTsKZWxzZSByZW5kZXJTdGFydCgpOwp9KSgpOwo=\";var s=document.createElement(\"script\");s.textContent=new TextDecoder(\"utf-8\").decode(Uint8Array.from(atob(b),function(c){return c.charCodeAt(0)}));document.getElementById(\"expertive-matrica\").appendChild(s);})();<\/script>\n<\/div>\n\n\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>ExpertiveSkills Matrix \u00b7 self-assessmentHR | EN<\/p>\n","protected":false},"author":3,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"nf_dc_page":"","_jetpack_hide_featured_image":false,"_jetpack_featured_image_duplicate_dismissed":0,"nfd_onboarding_generated":"","footnotes":""},"class_list":["post-863","page","type-page","status-publish","hentry"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.8 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Skills Matrix - Expertive<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/expertive.hr\/en\/skills-matrix\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Skills Matrix - Expertive\" \/>\n<meta property=\"og:description\" content=\"ExpertiveSkills Matrix \u00b7 self-assessmentHR | EN\" \/>\n<meta property=\"og:url\" content=\"https:\/\/expertive.hr\/en\/skills-matrix\/\" \/>\n<meta property=\"og:site_name\" content=\"Expertive\" \/>\n<meta property=\"article:modified_time\" content=\"2026-10-27T14:50:36+00:00\" \/>\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=\"4 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/expertive.hr\\\/en\\\/skills-matrix\\\/\",\"url\":\"https:\\\/\\\/expertive.hr\\\/en\\\/skills-matrix\\\/\",\"name\":\"Skills Matrix - Expertive\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/expertive.hr\\\/en\\\/#website\"},\"datePublished\":\"2026-10-24T14:25:27+00:00\",\"dateModified\":\"2026-10-27T14:50:36+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/expertive.hr\\\/en\\\/skills-matrix\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/expertive.hr\\\/en\\\/skills-matrix\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/expertive.hr\\\/en\\\/skills-matrix\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/expertive.hr\\\/en\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Skills Matrix\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/expertive.hr\\\/en\\\/#website\",\"url\":\"https:\\\/\\\/expertive.hr\\\/en\\\/\",\"name\":\"Expertive\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/expertive.hr\\\/en\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/expertive.hr\\\/en\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/expertive.hr\\\/en\\\/#organization\",\"name\":\"Expertive\",\"url\":\"https:\\\/\\\/expertive.hr\\\/en\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/expertive.hr\\\/en\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/i0.wp.com\\\/expertive.hr\\\/wp-content\\\/uploads\\\/2022\\\/12\\\/expertive-logo-bijeli.png?fit=456%2C248&ssl=1\",\"contentUrl\":\"https:\\\/\\\/i0.wp.com\\\/expertive.hr\\\/wp-content\\\/uploads\\\/2022\\\/12\\\/expertive-logo-bijeli.png?fit=456%2C248&ssl=1\",\"width\":456,\"height\":248,\"caption\":\"Expertive\"},\"image\":{\"@id\":\"https:\\\/\\\/expertive.hr\\\/en\\\/#\\\/schema\\\/logo\\\/image\\\/\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Skills Matrix - Expertive","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:\/\/expertive.hr\/en\/skills-matrix\/","og_locale":"en_US","og_type":"article","og_title":"Skills Matrix - Expertive","og_description":"ExpertiveSkills Matrix \u00b7 self-assessmentHR | EN","og_url":"https:\/\/expertive.hr\/en\/skills-matrix\/","og_site_name":"Expertive","article_modified_time":"2026-10-27T14:50:36+00:00","twitter_card":"summary_large_image","twitter_misc":{"Est. reading time":"4 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/expertive.hr\/en\/skills-matrix\/","url":"https:\/\/expertive.hr\/en\/skills-matrix\/","name":"Skills Matrix - Expertive","isPartOf":{"@id":"https:\/\/expertive.hr\/en\/#website"},"datePublished":"2026-10-24T14:25:27+00:00","dateModified":"2026-10-27T14:50:36+00:00","breadcrumb":{"@id":"https:\/\/expertive.hr\/en\/skills-matrix\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/expertive.hr\/en\/skills-matrix\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/expertive.hr\/en\/skills-matrix\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/expertive.hr\/en\/"},{"@type":"ListItem","position":2,"name":"Skills Matrix"}]},{"@type":"WebSite","@id":"https:\/\/expertive.hr\/en\/#website","url":"https:\/\/expertive.hr\/en\/","name":"Expertive","description":"","publisher":{"@id":"https:\/\/expertive.hr\/en\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/expertive.hr\/en\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/expertive.hr\/en\/#organization","name":"Expertive","url":"https:\/\/expertive.hr\/en\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/expertive.hr\/en\/#\/schema\/logo\/image\/","url":"https:\/\/i0.wp.com\/expertive.hr\/wp-content\/uploads\/2022\/12\/expertive-logo-bijeli.png?fit=456%2C248&ssl=1","contentUrl":"https:\/\/i0.wp.com\/expertive.hr\/wp-content\/uploads\/2022\/12\/expertive-logo-bijeli.png?fit=456%2C248&ssl=1","width":456,"height":248,"caption":"Expertive"},"image":{"@id":"https:\/\/expertive.hr\/en\/#\/schema\/logo\/image\/"}}]}},"jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/expertive.hr\/en\/wp-json\/wp\/v2\/pages\/863","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/expertive.hr\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/expertive.hr\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/expertive.hr\/en\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/expertive.hr\/en\/wp-json\/wp\/v2\/comments?post=863"}],"version-history":[{"count":8,"href":"https:\/\/expertive.hr\/en\/wp-json\/wp\/v2\/pages\/863\/revisions"}],"predecessor-version":[{"id":953,"href":"https:\/\/expertive.hr\/en\/wp-json\/wp\/v2\/pages\/863\/revisions\/953"}],"wp:attachment":[{"href":"https:\/\/expertive.hr\/en\/wp-json\/wp\/v2\/media?parent=863"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}