{"id":3713,"date":"2026-06-14T14:29:49","date_gmt":"2026-06-14T14:29:49","guid":{"rendered":"https:\/\/allenglish4u.com\/cambridge-movers-4-test-2-listening\/"},"modified":"2026-07-05T02:44:29","modified_gmt":"2026-07-05T02:44:29","slug":"cambridge-movers-4-test-2-listening","status":"publish","type":"page","link":"https:\/\/allenglish4u.com\/vi\/cambridge-movers-4-test-2-listening\/","title":{"rendered":"Movers 4 Test 2 Listening"},"content":{"rendered":"\n<!--\n================================================================\nAE4U &#183; YLE STARTERS LISTENING &#8212; TEMPLATE\n4 parts &#183; 20 questions &#183; ~20 mins\nPart 1: Pair \/ Draw lines (SVG)\nPart 2: Listen and write a name or a number (input blanks)\nPart 3: Listen and tick the box (MCQ 3 picture options)\nPart 4: Listen and colour (SVG colour palette)\n\nINPUT placeholders to replace per test (search-and-replace):\n  {{TEST_NUM}}        e.g. 1\n  {{TEST_TITLE}}      e.g. \"Movers 1 &#8212; Test 1\"\n  {{YT_VIDEO_ID}}     e.g. \"PKs0mV9yCkw\"\n  {{YT_PLAYLIST}}     optional list= param (or empty)\n  {{P1_IMG_URL}}      scene image URL for Part 1 (with example line)\n  {{P1_NAMES}}        array of {n, name, ans} &#8212; 5 questions + example\n  {{P1_TARGETS}}      array of {key, label, x, y} &#8212; items in scene (anchor points in %)\n  {{P2_INTRO}}        intro line for Part 2 (e.g. \"Listen to Sam talking...\")\n  {{P2_EXAMPLES}}     example rows (e.g. name=Sam, age=10)\n  {{P2_QUESTIONS}}    array of {n, label, prefix?, suffix?, accepted[], display}\n  {{P3_INTRO}}        intro line for Part 3 (e.g. \"What's Bill doing? Example: B\")\n  {{P3_EXAMPLE_IMG}}  example row image (or split A\/B\/C)\n  {{P3_QUESTIONS}}    array of {n, q, opts:[{letter,img,alt}], ans}\n  {{P4_INTRO}}        intro line for Part 4 (e.g. scene description)\n  {{P4_SVG}}          inline SVG of scene with <g data-region=\"key\"> regions\n  {{P4_ITEMS}}        array of {n, instruction, region, colour}\n  {{P4_COLOURS}}      palette array of colours (default: 8 YLE colours)\n  {{TRANSCRIPT_P1}}..{{TRANSCRIPT_P4}}  transcript text per part\n================================================================\n-->\n<style>\n@import url('https:\/\/fonts.googleapis.com\/css2?family=Plus+Jakarta+Sans:wght@400;500;600;700;800&family=Fraunces:opsz,wght@9..144,700&display=swap');\n\n.entry-content,.wp-block-post-content,.is-layout-constrained{max-width:none !important;width:auto !important;margin-left:0 !important;margin-right:0 !important;padding-left:0 !important;padding-right:0 !important;}\n.wp-block-post-title{display:none !important;}\n\n:root{\n  --accent-1:#8B5CF6; --accent-2:#EC4899; --purple:#8B5CF6;\n  --gold:#FBBF24; --green:#10B981; --red:#EF4444;\n  --light-1:#ECFEFF; --light-2:#F0F9FF; --white:#FFFFFF;\n  --text:#0F172A; --muted:#475569; --subtle:#64748B; --border:#E2E8F0;\n  --dark-1:#0C1322;\n  --r-10:10px; --r-16:16px; --r-22:22px;\n  --sh-card:0 2px 8px rgba(0,0,0,.06); --sh-lg:0 12px 40px rgba(0,0,0,.12);\n}\n*{margin:0;padding:0;box-sizing:border-box}\nhtml{scroll-behavior:smooth}\nbody{font-family:'Plus Jakarta Sans',system-ui,sans-serif;color:var(--text);background:var(--light-2);-webkit-font-smoothing:antialiased;overflow-x:hidden}\n.serif{font-family:'Fraunces',Georgia,serif;font-weight:700;letter-spacing:-.01em}\n.wrap{max-width:1080px;margin:0 auto;padding:0 24px}\na{color:inherit;text-decoration:none}\nbutton{font-family:inherit;cursor:pointer;border:none;background:none}\n\n.header{position:fixed;top:0;left:0;right:0;z-index:100;transition:background .28s ease;border-bottom:1px solid transparent}\n.header.solid{background:rgba(255,255,255,.92);backdrop-filter:saturate(180%) blur(16px);border-bottom:1px solid var(--border)}\n.header-inner{display:flex;align-items:center;gap:28px;height:72px;max-width:1200px;margin:0 auto;padding:0 24px}\n.brand{display:flex;align-items:center;gap:11px;flex-shrink:0}\n.brand img{width:40px;height:40px;border-radius:11px;object-fit:cover;box-shadow:var(--sh-card)}\n.brand-name{font-weight:800;font-size:18px;color:#fff;transition:color .28s ease}\n.header.solid .brand-name{color:var(--text)}\n.nav{display:flex;align-items:center;gap:4px;margin-left:8px}\n.nav a{padding:9px 13px;font-size:14.5px;font-weight:600;color:rgba(255,255,255,.82);border-radius:var(--r-10);transition:all .16s ease}\n.nav a:hover{color:#fff;background:rgba(255,255,255,.08)}\n.header.solid .nav a{color:var(--muted)}\n.header.solid .nav a:hover{color:var(--text);background:var(--light-1)}\n.header-right{margin-left:auto;display:flex;align-items:center;gap:10px}\n.btn-back{display:inline-flex;align-items:center;gap:7px;padding:9px 16px;border-radius:999px;font-weight:700;font-size:14px;background:rgba(255,255,255,.14);color:#fff;border:1px solid rgba(255,255,255,.22)}\n.header.solid .btn-back{background:linear-gradient(100deg,var(--accent-1),var(--accent-2));color:#fff;border-color:transparent}\n.hamburger{display:none;width:40px;height:40px;border-radius:50%;color:#fff;align-items:center;justify-content:center}\n.header.solid .hamburger{color:var(--text)}\n\n.hero{position:relative;min-height:300px;padding:110px 0 40px;background:linear-gradient(135deg,#8B5CF6 0%,#EC4899 55%,#7C2D12 100%);color:#fff;overflow:hidden}\n.hero::before{content:\"\";position:absolute;inset:0;background-image:radial-gradient(circle at 20% 30%,rgba(255,255,255,.15) 0%,transparent 50%),radial-gradient(circle at 80% 70%,rgba(255,255,255,.10) 0%,transparent 50%);pointer-events:none}\n.hero .wrap{position:relative;z-index:1}\n.kicker{display:inline-block;font-size:12px;letter-spacing:.18em;text-transform:uppercase;font-weight:700;opacity:.92;margin-bottom:14px}\n.hero h1{font-size:clamp(32px,5vw,48px);line-height:1.05;margin-bottom:14px}\n.hero h1 span{font-style:italic;color:var(--gold)}\n.hero p.sub{font-size:16px;line-height:1.6;max-width:680px;opacity:.95;margin-bottom:18px}\n.hero-meta{display:flex;flex-wrap:wrap;gap:10px;margin-bottom:20px}\n.meta-pill{display:inline-flex;align-items:center;gap:6px;padding:7px 14px;border-radius:999px;background:rgba(255,255,255,.18);backdrop-filter:blur(6px);border:1px solid rgba(255,255,255,.24);font-size:13px;font-weight:600}\n.meta-pill .dot{width:6px;height:6px;border-radius:50%;background:var(--gold)}\n\n.player-bar{position:sticky;top:72px;z-index:50;background:#0F172A;color:#fff;box-shadow:0 4px 16px rgba(0,0,0,.2)}\n.player-inner{display:grid;grid-template-columns:340px 1fr;gap:20px;align-items:center;padding:14px 24px;max-width:1200px;margin:0 auto}\n.player-vid{aspect-ratio:16\/9;background:#000;border-radius:10px;overflow:hidden;width:340px;min-height:191px}\n.player-vid iframe{width:100%;height:100%;border:0;display:block}\n.player-controls h4{font-family:'Fraunces',serif;font-size:18px;margin-bottom:4px}\n.player-controls .pc-sub{font-size:13px;opacity:.75;margin-bottom:12px}\n.part-jumps{display:flex;flex-wrap:wrap;gap:8px}\n.jump-btn{display:inline-flex;align-items:center;gap:6px;padding:8px 14px;border-radius:999px;background:rgba(255,255,255,.1);color:#fff;font-weight:600;font-size:13px;border:1px solid rgba(255,255,255,.2);transition:all .15s ease;cursor:pointer}\n.jump-btn:hover{background:linear-gradient(100deg,var(--accent-1),var(--accent-2));border-color:transparent;transform:translateY(-1px)}\n.jump-btn .jt{font-weight:800;color:var(--gold);font-size:12px}\n.jump-btn.active{background:linear-gradient(100deg,var(--accent-1),var(--accent-2));border-color:transparent}\n.player-actions{display:flex;gap:8px;margin-top:10px;flex-wrap:wrap}\n.player-actions .ctrl-btn{display:inline-flex;align-items:center;gap:5px;padding:7px 12px;border-radius:8px;background:rgba(255,255,255,.08);color:#fff;font-size:12px;font-weight:600;border:1px solid rgba(255,255,255,.14);cursor:pointer}\n.player-actions .ctrl-btn:hover{background:rgba(255,255,255,.18)}\n\n.mini-prog{position:sticky;top:262px;z-index:40;background:rgba(255,255,255,.95);backdrop-filter:blur(10px);border-bottom:1px solid var(--border);padding:8px 0}\n.mini-prog-inner{display:flex;align-items:center;gap:14px}\n.mini-prog-bar{flex:1;height:6px;background:var(--light-1);border-radius:999px;overflow:hidden}\n.mini-prog-fill{height:100%;background:linear-gradient(90deg,var(--accent-1),var(--accent-2));border-radius:999px;transition:width .3s ease;width:0}\n.mini-prog-label{font-size:12px;color:var(--muted);font-weight:700;min-width:120px}\n.mini-prog-score{font-weight:800;color:var(--accent-1);font-size:14px;min-width:80px}\n\n.part-section{padding:48px 0;border-bottom:1px solid var(--border)}\n.part-section:nth-of-type(even){background:#fff}\n.part-head{display:flex;align-items:flex-start;gap:18px;margin-bottom:24px}\n.part-num{flex-shrink:0;width:60px;height:60px;border-radius:18px;background:linear-gradient(135deg,var(--accent-1),var(--accent-2));color:#fff;display:grid;place-items:center;font-family:'Fraunces',serif;font-weight:700;font-size:26px;box-shadow:0 8px 22px rgba(6,182,212,.3)}\n.part-head-text h2{font-size:26px;line-height:1.15;margin-bottom:6px}\n.part-head-text .qrange{display:inline-block;font-size:12.5px;font-weight:700;color:var(--accent-1);background:var(--light-1);padding:4px 10px;border-radius:999px;letter-spacing:.04em;margin-bottom:8px}\n.part-head-text p{color:var(--muted);font-size:15px;line-height:1.55;max-width:740px}\n.part-actions{display:flex;gap:10px;margin:0 0 16px 78px;flex-wrap:wrap}\n.act-pill{display:inline-flex;align-items:center;gap:6px;padding:7px 14px;border-radius:999px;background:#fff;border:1.5px solid var(--border);font-weight:600;font-size:13px;color:var(--text);cursor:pointer;transition:all .15s ease}\n.act-pill:hover{border-color:var(--accent-1);color:var(--accent-1)}\n\n\/* Common Q-item (used Part 3) *\/\n.q-list{display:flex;flex-direction:column;gap:18px;margin-top:8px}\n.q-item{background:#fff;border:1px solid var(--border);border-radius:16px;padding:18px 20px;display:flex;flex-direction:column;gap:12px;transition:all .2s ease;scroll-margin-top:330px}\n.q-item.correct{border-color:var(--green);box-shadow:0 0 0 3px rgba(16,185,129,.12)}\n.q-item.wrong{border-color:var(--red);box-shadow:0 0 0 3px rgba(239,68,68,.12)}\n.q-item.revealed{background:linear-gradient(180deg,#FEF3C7 0%,#FFFBF5 100%);border-color:var(--gold)}\n.q-text{font-size:15.5px;line-height:1.55;color:var(--text);display:flex;gap:10px;align-items:flex-start}\n.q-text b.qn{color:var(--accent-1);font-weight:800;min-width:30px}\n.feedback{font-size:13px;font-weight:600;display:none;padding:8px 12px;border-radius:8px;margin-top:4px}\n.q-item.answered .feedback,.q-item.revealed .feedback{display:block}\n.q-item.correct .feedback{background:rgba(16,185,129,.12);color:#065F46}\n.q-item.wrong .feedback{background:rgba(239,68,68,.10);color:#991B1B}\n.q-item.revealed .feedback{background:#FEF3C7;color:#7B5B00;border-left:3px solid var(--gold);padding-left:10px}\n.q-bottom{display:flex;justify-content:flex-end;gap:8px;margin-top:2px}\n.show-ans-btn{display:inline-flex;align-items:center;gap:6px;padding:6px 13px;border-radius:999px;background:#FEF3C7;color:#7B5B00;font-weight:700;font-size:12px;border:1px solid #E8D88E;cursor:pointer;transition:all .15s ease}\n.show-ans-btn:hover{background:#FDE68A;transform:translateY(-1px)}\n\n\/* Part 3 &#8212; picture MCQ (3 boxes) *\/\n.pic-mcq{display:grid;grid-template-columns:repeat(3,1fr);gap:14px;margin-top:8px}\n.pic-opt{position:relative;border:2px solid var(--border);border-radius:14px;background:#fff;padding:8px;cursor:pointer;transition:all .15s ease;text-align:center}\n.pic-opt:hover{border-color:var(--accent-1);transform:translateY(-2px)}\n.pic-opt img{width:100%;height:auto;border-radius:8px;display:block;aspect-ratio:1\/1;object-fit:cover;background:#F8FAFC}\n.pic-opt .pic-letter{display:inline-flex;align-items:center;gap:6px;margin-top:8px;font-weight:700;color:var(--text);font-size:14px}\n.pic-opt .pic-letter b{display:grid;place-items:center;width:24px;height:24px;border-radius:6px;background:var(--light-1);color:var(--accent-1);font-size:13px;border:1px solid var(--border)}\n.pic-opt .pic-tick{width:18px;height:18px;border-radius:5px;border:2px solid var(--border);display:inline-grid;place-items:center;font-size:12px;color:transparent;background:#fff}\n.pic-opt.selected{border-color:var(--accent-1);background:linear-gradient(180deg,#fff,var(--light-1))}\n.pic-opt.selected .pic-tick{background:linear-gradient(100deg,var(--accent-1),var(--accent-2));color:#fff;border-color:transparent}\n.pic-opt.correct-opt{border-color:var(--green) !important;background:rgba(16,185,129,.08) !important}\n.pic-opt.correct-opt .pic-tick{background:var(--green) !important;color:#fff !important;border-color:transparent !important}\n.pic-opt.wrong-opt{border-color:var(--red) !important;background:rgba(239,68,68,.08) !important}\n\n\/* Example row (smaller, opacity .7) *\/\n.ex-row{display:flex;gap:8px;align-items:center;background:var(--light-1);border:1.5px dashed var(--gold);border-radius:12px;padding:8px 12px;margin-bottom:10px;font-size:13px;font-weight:600;color:#7B5B00}\n.ex-row .ex-tag{background:var(--gold);color:#fff;padding:2px 8px;border-radius:6px;font-size:11px;letter-spacing:.06em}\n\n\/* Input blanks (Part 2) *\/\n.input-blank{display:inline-block;min-width:140px;border:none;border-bottom:2px dashed var(--accent-1);background:transparent;font-family:inherit;font-size:15.5px;color:var(--text);font-weight:600;padding:2px 8px;margin:0 4px;text-align:center;outline:none}\n.input-blank:focus{border-bottom-style:solid;background:var(--light-1)}\n.input-blank.correct{border-bottom-color:var(--green);color:#065F46;background:rgba(16,185,129,.10)}\n.input-blank.wrong{border-bottom-color:var(--red);color:#991B1B;background:rgba(239,68,68,.08)}\n.input-blank.revealed{border-bottom-color:var(--gold);background:#FEF3C7;color:#7B5B00}\n\n.form-card{background:#fff;border:1.5px solid var(--border);border-radius:16px;padding:22px;margin-top:14px;max-width:640px}\n.form-card h4{font-family:'Fraunces',serif;font-size:18px;color:var(--accent-2);margin-bottom:6px;border-bottom:2px solid var(--accent-1);padding-bottom:8px;display:inline-block;width:100%;text-align:center}\n.form-row{display:flex;gap:12px;align-items:center;margin-top:12px;flex-wrap:wrap}\n.form-row label{flex:0 0 240px;font-weight:600;color:var(--text);font-size:14.5px}\n.form-row .input-blank{flex:1;min-width:180px;text-align:left;font-size:14.5px}\n.form-row .show-ans-btn{flex-shrink:0;margin-left:auto}\n.form-row.example{opacity:.7}\n.form-row.example .ex-tag{background:var(--gold);color:#fff;padding:2px 8px;border-radius:6px;font-size:11px;letter-spacing:.06em;margin-left:6px}\n\n\/* PART 1 &#8212; Pair \/ Draw Lines *\/\n.pair-wrap{position:relative;background:#fff;border:1.5px solid var(--border);border-radius:16px;padding:14px;margin-top:14px;display:grid;grid-template-columns:200px 1fr;gap:18px;align-items:stretch;min-height:520px}\n.pair-names{display:flex;flex-direction:column;gap:10px;padding-right:6px;border-right:1px dashed var(--border)}\n.pair-name{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:10px 12px;background:#F8FAFC;border:2px solid var(--border);border-radius:10px;cursor:pointer;font-weight:700;color:var(--text);transition:all .15s ease;user-select:none}\n.pair-name:hover{border-color:var(--accent-1);background:var(--light-1)}\n.pair-name.selected{border-color:var(--accent-1);background:linear-gradient(100deg,rgba(6,182,212,.12),rgba(14,165,233,.12));box-shadow:0 0 0 3px rgba(6,182,212,.18)}\n.pair-name.example{opacity:.55;cursor:default;border-style:dashed}\n.pair-name.example:hover{border-color:var(--gold);background:#FEF3C7}\n.pair-name.matched{border-color:var(--green);background:rgba(16,185,129,.08)}\n.pair-name .pn-dot{width:14px;height:14px;border-radius:50%;background:#fff;border:2px solid currentColor;flex-shrink:0}\n.pair-name .pn-num{font-size:13px;color:var(--accent-1);background:var(--light-1);width:22px;height:22px;border-radius:6px;display:grid;place-items:center;border:1px solid var(--border);flex-shrink:0}\n.pair-scene{position:relative;border:1px solid var(--border);border-radius:12px;overflow:hidden;background:#FAFBFC}\n.pair-scene img{width:100%;height:auto;display:block}\n.pair-targets,.pair-lines{position:absolute;inset:0;pointer-events:none}\n.pair-targets .tgt{position:absolute;width:32px;height:32px;border-radius:50%;background:rgba(6,182,212,.2);border:2px solid var(--accent-1);transform:translate(-50%,-50%);pointer-events:auto;cursor:pointer;transition:all .15s ease}\n.pair-targets .tgt:hover{background:rgba(6,182,212,.5);transform:translate(-50%,-50%) scale(1.15)}\n.pair-targets .tgt.example{background:rgba(251,191,36,.3);border-color:var(--gold);cursor:default}\n.pair-targets .tgt.matched{background:rgba(16,185,129,.45);border-color:var(--green)}\n.pair-targets .tgt .tlabel{position:absolute;left:50%;top:100%;transform:translate(-50%,4px);background:#0F172A;color:#fff;font-size:10px;padding:2px 6px;border-radius:4px;white-space:nowrap;opacity:0;pointer-events:none;transition:opacity .15s ease}\n.pair-targets .tgt:hover .tlabel{opacity:1}\n.pair-lines{z-index:2}\n.pair-hint{font-size:12.5px;color:var(--muted);text-align:center;margin-top:10px;background:var(--light-1);border:1px solid var(--border);border-radius:8px;padding:8px 12px}\n.pair-bottom-actions{display:flex;gap:8px;margin-top:12px;flex-wrap:wrap;justify-content:flex-end}\n@media (max-width:720px){\n  .pair-wrap{grid-template-columns:1fr;min-height:auto}\n  .pair-names{border-right:none;border-bottom:1px dashed var(--border);padding-right:0;padding-bottom:10px}\n}\n\n\/* PART 4 &#8212; Colour palette + SVG scene *\/\n.colour-wrap{background:#fff;border:1.5px solid var(--border);border-radius:16px;padding:14px;margin-top:14px}\n.colour-palette{display:flex;flex-wrap:wrap;gap:8px;justify-content:center;padding:10px;background:var(--light-1);border-radius:10px;margin-bottom:12px}\n.swatch{width:42px;height:42px;border-radius:50%;border:3px solid #fff;box-shadow:0 0 0 2px var(--border);cursor:pointer;transition:all .15s ease;position:relative}\n.swatch:hover{transform:translateY(-2px)}\n.swatch.selected{box-shadow:0 0 0 3px var(--accent-1),0 6px 16px rgba(6,182,212,.4);transform:scale(1.1)}\n.swatch.eraser{background:repeating-conic-gradient(#fff 0% 25%,#E2E8F0 25% 50%) 50% \/ 16px 16px}\n.swatch .sw-label{position:absolute;left:50%;top:100%;transform:translate(-50%,4px);font-size:11px;font-weight:700;color:var(--muted);white-space:nowrap;text-transform:capitalize}\n.colour-scene{position:relative;text-align:center;background:#FAFBFC;border-radius:10px;padding:14px;border:1px solid var(--border)}\n.colour-scene svg{max-width:100%;height:auto}\n.colour-scene svg [data-region]{cursor:pointer;transition:fill .15s ease;stroke:#0F172A;stroke-width:1.5}\n.colour-scene svg [data-region]:hover{filter:brightness(0.9)}\n.colour-scene svg [data-region][data-locked=\"1\"]{cursor:not-allowed}\n.colour-instructions{display:grid;grid-template-columns:repeat(auto-fit,minmax(280px,1fr));gap:10px;margin-top:14px}\n.col-ins{display:flex;align-items:center;gap:10px;padding:10px 14px;background:#fff;border:1.5px solid var(--border);border-radius:12px;font-size:13.5px;color:var(--text);font-weight:600}\n.col-ins.example{opacity:.7;border-style:dashed;background:#FEF3C7;border-color:var(--gold)}\n.col-ins .ci-num{display:grid;place-items:center;width:26px;height:26px;border-radius:8px;background:var(--light-1);color:var(--accent-1);font-weight:800;font-size:13px;border:1px solid var(--border);flex-shrink:0}\n.col-ins .ci-dot{width:18px;height:18px;border-radius:50%;border:2px solid #fff;box-shadow:0 0 0 2px var(--border);flex-shrink:0;margin-left:auto}\n.col-ins.correct{border-color:var(--green);background:rgba(16,185,129,.06)}\n.col-ins.wrong{border-color:var(--red);background:rgba(239,68,68,.06)}\n.col-ins.revealed{background:#FEF3C7;border-color:var(--gold);color:#7B5B00}\n\n\/* Transcript *\/\n.transcript-card{margin-top:18px;background:#FAFBFC;border:1.5px solid var(--border);border-radius:14px;padding:0;overflow:hidden;max-width:840px}\n.transcript-card.collapsed .ts-body{display:none}\n.transcript-card .ts-head{display:flex;justify-content:space-between;align-items:center;padding:12px 18px;background:#fff;cursor:pointer;font-weight:700;font-size:14px;color:var(--accent-2);border-bottom:1px solid var(--border)}\n.transcript-card.collapsed .ts-head{border-bottom:none}\n.transcript-card .ts-head .chev{transition:transform .2s ease}\n.transcript-card.collapsed .ts-head .chev{transform:rotate(-90deg)}\n.transcript-card .ts-body{padding:16px 22px;font-size:14.5px;line-height:1.75;color:var(--text);max-height:380px;overflow-y:auto;background:#FAFBFC;font-family:'Courier New',monospace}\n.transcript-card .ts-body b{color:var(--accent-2);font-family:'Plus Jakarta Sans',sans-serif}\n.transcript-card .ts-body i{color:var(--muted);font-size:12.5px}\n\n\/* Notes pad *\/\n.notes-pad{background:#FEF9E7;border:1.5px solid var(--gold);border-radius:14px;padding:14px 18px;margin-top:14px;max-width:640px}\n.notes-pad label{display:block;font-weight:700;font-size:13px;color:#7B5B00;margin-bottom:6px;text-transform:uppercase;letter-spacing:.05em}\n.notes-pad textarea{width:100%;min-height:80px;padding:10px;font-family:inherit;font-size:14px;line-height:1.5;border:1px solid #E8D88E;border-radius:8px;background:rgba(255,255,255,.7);color:var(--text);outline:none;resize:vertical}\n.notes-pad textarea:focus{border-color:var(--accent-1);background:#fff}\n\n\/* Submit panel *\/\n.submit-panel{margin:40px auto 24px;background:linear-gradient(135deg,#8B5CF6 0%,#EC4899 100%);color:#fff;padding:30px;border-radius:22px;text-align:center;max-width:720px;box-shadow:0 16px 50px rgba(6,182,212,.3)}\n.submit-panel h3{font-family:'Fraunces',serif;font-size:24px;margin-bottom:8px}\n.submit-panel p.intro{opacity:.95;margin-bottom:18px;font-size:14.5px}\n.submit-panel .sp-buttons{display:flex;gap:14px;justify-content:center;flex-wrap:wrap}\n.btn-submit-big{display:inline-flex;align-items:center;gap:8px;padding:14px 28px;border-radius:999px;background:#fff;color:var(--accent-2);font-weight:800;font-size:16px;box-shadow:0 8px 24px rgba(0,0,0,.2);cursor:pointer;transition:transform .15s ease}\n.btn-submit-big:hover{transform:translateY(-2px)}\n.btn-reset-big{padding:14px 24px;border-radius:999px;background:rgba(255,255,255,.18);color:#fff;font-weight:700;font-size:14.5px;border:1px solid rgba(255,255,255,.4);cursor:pointer}\n.btn-reset-big:hover{background:rgba(255,255,255,.3)}\n\n.results-banner{display:none;margin:24px auto;padding:30px;border-radius:22px;background:#fff;color:var(--text);text-align:center;max-width:720px;box-shadow:var(--sh-lg);border:2px solid var(--accent-1)}\n.results-banner.show{display:block}\n.results-banner h3{font-size:28px;font-family:'Fraunces',serif;margin-bottom:8px;color:var(--accent-2)}\n.results-banner .score-big{font-size:60px;font-weight:800;line-height:1;margin:14px 0;font-family:'Fraunces',serif;background:linear-gradient(100deg,var(--accent-1),var(--accent-2));-webkit-background-clip:text;background-clip:text;-webkit-text-fill-color:transparent}\n.results-banner p{font-size:15px;color:var(--muted)}\n.score-parts{display:grid;grid-template-columns:repeat(5,1fr);gap:8px;margin-top:16px;background:var(--light-1);padding:12px;border-radius:12px}\n.score-parts .sp-item{text-align:center;font-size:12px;font-weight:600;color:var(--text)}\n.score-parts .sp-item b{display:block;font-size:18px;font-family:'Fraunces',serif;margin-bottom:2px;color:var(--accent-1)}\n\n.footer{background:var(--dark-1);color:#9CA3AF;padding:36px 0;text-align:center;font-size:13.5px}\n.footer a{color:var(--gold);font-weight:600}\n\n@media (max-width:880px){\n  .nav{display:none}\n  .hamburger{display:flex}\n  .player-inner{grid-template-columns:1fr;padding:12px 18px}\n  .player-vid{width:100%;min-height:0}\n  .hero{padding:110px 0 30px}\n  .part-actions{margin-left:0}\n  .form-row label{flex:1 1 100%}\n  .form-row .input-blank{width:100%}\n  .mini-prog{top:auto;position:relative}\n  .part-head{flex-direction:column;gap:10px}\n  .part-num{width:50px;height:50px;font-size:22px}\n  .pic-mcq{grid-template-columns:1fr 1fr 1fr;gap:8px}\n}\n\n.drawer{position:fixed;inset:0;background:rgba(15,23,42,.65);z-index:200;display:none;align-items:flex-start;justify-content:flex-end}\n.drawer.open{display:flex}\n.drawer-panel{width:280px;background:#fff;height:100%;padding:24px;display:flex;flex-direction:column;gap:8px}\n.drawer-panel a{padding:12px 14px;border-radius:10px;font-weight:600;color:var(--text)}\n.drawer-panel a:hover{background:var(--light-1)}\n.drawer-close{align-self:flex-end;width:40px;height:40px;border-radius:50%;display:grid;place-items:center;color:var(--muted)}\n\n\/* PART 3 &#8212; match days *\/\n.match-card-wrap{background:#fff;border:1.5px solid var(--border);border-radius:16px;padding:16px;margin-top:14px}\n.match-bank{display:flex;flex-wrap:wrap;gap:8px;justify-content:center;padding:10px;background:var(--light-1);border-radius:10px}\n.day-chip{display:inline-flex;align-items:center;gap:6px;padding:10px 16px;border-radius:999px;background:#fff;border:2px solid var(--border);font-weight:700;font-size:14px;cursor:pointer;transition:all .15s ease;min-height:44px}\n.day-chip:hover{border-color:var(--accent-1);color:var(--accent-1)}\n.day-chip.selected{border-color:var(--accent-1);background:linear-gradient(100deg,rgba(139,92,246,.12),rgba(236,72,153,.12));box-shadow:0 0 0 3px rgba(139,92,246,.18)}\n.day-chip.used{opacity:.35;pointer-events:none;text-decoration:line-through}\n.day-chip.example{opacity:.55;border-style:dashed;border-color:var(--gold);background:#FEF3C7;pointer-events:none}\n.match-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:14px;margin-top:14px}\n.match-card{position:relative;border:2px solid var(--border);border-radius:14px;background:#fff;padding:8px;transition:all .15s ease;cursor:pointer}\n.match-card:hover{border-color:var(--accent-1)}\n.match-card img{width:100%;height:auto;border-radius:8px;display:block;aspect-ratio:1\/1;object-fit:contain;background:#F8FAFC}\n.match-card .mc-foot{display:flex;align-items:center;gap:8px;margin-top:8px;min-height:34px}\n.match-card .mc-num{display:grid;place-items:center;width:26px;height:26px;border-radius:8px;background:var(--light-1);color:var(--accent-1);font-weight:800;font-size:13px;border:1px solid var(--border);flex-shrink:0}\n.match-card .mc-day{flex:1;text-align:center;padding:6px 10px;border-radius:999px;border:2px dashed var(--border);font-weight:700;font-size:13px;color:var(--subtle);min-height:34px;display:flex;align-items:center;justify-content:center}\n.match-card .mc-day.set{border-style:solid;border-color:var(--accent-1);color:var(--text);background:var(--light-1);cursor:pointer}\n.match-card.example{border-style:dashed;border-color:var(--gold);background:#FFFBEB;cursor:default}\n.match-card.example .mc-day{border-style:solid;border-color:var(--gold);background:#FEF3C7;color:#7B5B00;cursor:default}\n.match-card.correct{border-color:var(--green);box-shadow:0 0 0 3px rgba(16,185,129,.12)}\n.match-card.wrong{border-color:var(--red);box-shadow:0 0 0 3px rgba(239,68,68,.12)}\n.match-card .mc-fb{font-size:12px;font-weight:700;text-align:center;margin-top:4px;display:none}\n.match-card.correct .mc-fb{display:block;color:#065F46}\n.match-card.wrong .mc-fb{display:block;color:#991B1B}\n@media (max-width:720px){.match-grid{grid-template-columns:repeat(2,1fr);gap:8px}}\n\/* PART 5 &#8212; PNG + overlay *\/\n.p5-scene{position:relative;max-width:760px;margin:0 auto;overflow:hidden;border-radius:10px;border:1px solid var(--border);line-height:0;background:#fff}\n.p5-scene img{display:block;width:100%;height:auto}\n.p5-scene svg{position:absolute;inset:0;width:100%;height:100%}\n.p5-scene svg [data-region]{cursor:pointer;mix-blend-mode:multiply;stroke:none}\n.p5-scene svg .draw-zone{stroke:#94A3B8;stroke-width:3;stroke-dasharray:10 8;pointer-events:none}\n.col-ins .ci-dots{display:flex;gap:4px;margin-left:auto}\n.col-ins .ci-dots .ci-dot{margin-left:0}\n.draw-ins .draw-check{margin-left:auto;display:inline-flex;align-items:center;gap:6px;padding:7px 12px;border-radius:999px;border:2px solid var(--border);background:#fff;font-weight:700;font-size:12.5px;cursor:pointer;min-height:40px}\n.draw-ins .draw-check.on{border-color:var(--green);background:rgba(16,185,129,.10);color:#065F46}\n.ans-reveal{margin-top:14px;border:2px dashed var(--gold);background:#FFFBEB;border-radius:12px;padding:14px;text-align:center}\n.ans-reveal h5{font-family:'Fraunces',serif;font-size:15px;color:#7B5B00;margin-bottom:8px}\n.ans-reveal img{max-width:560px;width:100%;height:auto;border-radius:8px}\n\n<\/style>\n\n<header class=\"header\" id=\"hdr\">\n  <div class=\"header-inner\">\n    <a href=\"https:\/\/allenglish4u.com\" class=\"brand\">\n      <img decoding=\"async\" src=\"https:\/\/allenglish4u.com\/wp-content\/uploads\/2026\/04\/Transparent-background-MacBook-Pro-cua-Hang.png\" alt=\"AE4U\">\n      <span class=\"brand-name\">All English 4U<\/span>\n    <\/a>\n    <nav class=\"nav\">\n      <a href=\"https:\/\/allenglish4u.com\/grammar\/\">Grammar<\/a>\n      <a href=\"https:\/\/allenglish4u.com\/ielts\/\">IELTS<\/a>\n      <a href=\"https:\/\/allenglish4u.com\/toefl\/\">TOEFL<\/a>\n      <a href=\"https:\/\/allenglish4u.com\/cambridge\/\" class=\"active\">Cambridge<\/a>\n      <a href=\"https:\/\/allenglish4u.com\/celpip\/\">CELPIP<\/a>\n      <a href=\"https:\/\/allenglish4u.com\/dictation\/\">Dictation<\/a>\n      <\/nav>\n    <div class=\"header-right\">\n      <a href=\"https:\/\/allenglish4u.com\/cambridge\/\" class=\"btn-back\">\n        <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.6\" stroke-linecap=\"round\"><path d=\"M19 12H5M11 18l-6-6 6-6\"\/><\/svg>\n        Back\n      <\/a>\n      <button class=\"hamburger\" id=\"hamb\" aria-label=\"Menu\">\n        <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.3\" stroke-linecap=\"round\"><path d=\"M3 6h18M3 12h18M3 18h18\"\/><\/svg>\n      <\/button>\n    <\/div>\n  <\/div>\n<\/header>\n\n<div class=\"drawer\" id=\"drawer\">\n  <div class=\"drawer-panel\">\n    <button class=\"drawer-close\" id=\"drawerClose\" aria-label=\"Close\">\n      <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.3\" stroke-linecap=\"round\"><path d=\"M18 6L6 18M6 6l12 12\"\/><\/svg>\n    <\/button>\n    <a href=\"https:\/\/allenglish4u.com\/grammar\/\">Grammar<\/a>\n    <a href=\"https:\/\/allenglish4u.com\/ielts\/\">IELTS<\/a>\n    <a href=\"https:\/\/allenglish4u.com\/toefl\/\">TOEFL<\/a>\n    <a href=\"https:\/\/allenglish4u.com\/cambridge\/\">Cambridge<\/a>\n    <a href=\"https:\/\/allenglish4u.com\/celpip\/\">CELPIP<\/a>\n    <a href=\"https:\/\/allenglish4u.com\/dictation\/\">Dictation<\/a>\n    <\/div>\n<\/div>\n\n<section class=\"hero\">\n  <div class=\"wrap\">\n    <span class=\"kicker\">Cambridge YLE &#183; Movers<\/span>\n    <h1 class=\"serif\">Movers 4 &mdash; Test 2 <span>Listening<\/span><\/h1>\n    <p class=\"sub\">Listen to 5 parts with 25 questions. Use YouTube audio, jump to each part, take notes. Each question has its own <b>Show Answer<\/b> button &mdash; submit panel is at the <b>bottom<\/b>.<\/p>\n    <div class=\"hero-meta\">\n      <span class=\"meta-pill\"><span class=\"dot\"><\/span>~15 minutes<\/span>\n      <span class=\"meta-pill\"><span class=\"dot\"><\/span>5 Parts &middot; 25 Questions<\/span>\n      <span class=\"meta-pill\"><span class=\"dot\"><\/span>Auto-grade + Show Answer<\/span>\n      <span class=\"meta-pill\"><span class=\"dot\"><\/span>Pair &middot; Write &middot; Match &middot; Tick &middot; Colour &amp; Draw<\/span>\n    <\/div>\n  <\/div>\n<\/section>\n\n<div class=\"player-bar\" id=\"playerBar\">\n  <div class=\"player-inner\">\n    <div class=\"player-vid\">\n      <iframe id=\"ytPlayer\" src=\"https:\/\/www.youtube.com\/embed\/hxKsqJvcwXI?enablejsapi=1&#038;rel=0\" title=\"YLE Movers Listening\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture\" allowfullscreen><\/iframe>\n    <\/div>\n    <div class=\"player-controls\">\n      <h4>&#127911; Audio &mdash; Movers 1 Test 1 Listening<\/h4>\n      <div class=\"pc-sub\">Click a part to jump in audio. Submit panel is at the bottom of this page.<\/div>\n      <div class=\"part-jumps\">\n        <button class=\"jump-btn\" data-time=\"0\" data-part=\"intro\"><span class=\"jt\">0:00<\/span> Intro<\/button>\n        <button class=\"jump-btn\" data-time=\"20\" data-part=\"1\"><span class=\"jt\">0:20<\/span> Part 1<\/button>\n        <button class=\"jump-btn\" data-time=\"200\" data-part=\"2\"><span class=\"jt\">3:20<\/span> Part 2<\/button>\n        <button class=\"jump-btn\" data-time=\"370\" data-part=\"3\"><span class=\"jt\">6:10<\/span> Part 3<\/button>\n        <button class=\"jump-btn\" data-time=\"530\" data-part=\"4\"><span class=\"jt\">8:50<\/span> Part 4<\/button>\n        <button class=\"jump-btn\" data-time=\"700\" data-part=\"5\"><span class=\"jt\">11:40<\/span> Part 5<\/button>\n      <\/div>\n      <div class=\"player-actions\">\n        <button class=\"ctrl-btn\" id=\"btnPause\">&#9208; Pause<\/button>\n        <button class=\"ctrl-btn\" id=\"btnPlay\">&#9654; Play<\/button>\n        <button class=\"ctrl-btn\" id=\"btnRewind\">&#9194; -10s<\/button>\n        <button class=\"ctrl-btn\" id=\"btnSlower\">&#128034; Slower<\/button>\n        <button class=\"ctrl-btn\" id=\"btnNormal\">&#9889; Normal<\/button>\n      <\/div>\n    <\/div>\n  <\/div>\n<\/div>\n\n<div class=\"mini-prog\" id=\"miniProg\">\n  <div class=\"wrap mini-prog-inner\">\n    <div class=\"mini-prog-score\">Score <span id=\"scoreNow\">0<\/span>\/25<\/div>\n    <div class=\"mini-prog-bar\"><div class=\"mini-prog-fill\" id=\"progFill\"><\/div><\/div>\n    <div class=\"mini-prog-label\"><span id=\"answeredCount\">0<\/span> of 25 answered<\/div>\n  <\/div>\n<\/div>\n\n<!-- ============ PART 1 &#8212; Pair \/ Draw Lines ============ -->\n<section class=\"part-section\" id=\"part1\">\n  <div class=\"wrap\">\n    <div class=\"part-head\">\n      <div class=\"part-num\">1<\/div>\n      <div class=\"part-head-text\">\n        <span class=\"qrange\">Questions 1&#8211;5 &#183; Pair \/ Draw lines<\/span>\n        <h2 class=\"serif\">Listen and draw lines<\/h2>\n        <p>Listen and draw lines between names and items in the picture. There is one example.<\/p>\n      <\/div>\n    <\/div>\n    <div class=\"part-actions\">\n      <button class=\"act-pill\" data-time=\"30\"><svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.4\" stroke-linecap=\"round\"><polygon points=\"5 3 19 12 5 21 5 3\"\/><\/svg> Replay Part 1<\/button>\n      <button class=\"act-pill ts-toggle\" data-target=\"ts1\">&#128220; Transcript<\/button>\n      <button class=\"act-pill\" id=\"p1Clear\">&#129529; Clear my lines<\/button>\n    <\/div>\n\n    <div class=\"pair-wrap\" id=\"pairWrap\">\n      <div class=\"pair-names\" id=\"pairNames\"><\/div>\n      <div class=\"pair-scene\" id=\"pairScene\">\n        <img decoding=\"async\" id=\"pairImg\" src=\"https:\/\/allenglish4u.com\/wp-content\/uploads\/2026\/06\/m4t2_p1_scene.png\" alt=\"Part 1 scene\" draggable=\"false\">\n        <svg class=\"pair-lines\" id=\"pairLines\" preserveAspectRatio=\"none\"><defs><\/defs><\/svg>\n        <div class=\"pair-targets\" id=\"pairTargets\"><\/div>\n      <\/div>\n    <\/div>\n    <div class=\"pair-hint\">&#128161; Click a name on the left, then click the matching item in the picture. Click a line again to erase it.<\/div>\n    <div class=\"pair-bottom-actions\">\n      <button class=\"show-ans-btn\" data-show=\"P1ALL\">&#128065; Show All Answers (Part 1)<\/button>\n    <\/div>\n\n    <div class=\"transcript-card collapsed\" id=\"ts1\">\n      <div class=\"ts-head\" data-toggle=\"ts1\"><span>&#128220; Part 1 transcript<\/span><span class=\"chev\">&#9662;<\/span><\/div>\n      <div class=\"ts-body\" id=\"tsBody1\"><p><b>Ex<\/b> Fred is the boy in the red sweater, buying sausages.<\/p><p><b>1<\/b> Sally is the girl buying fruit at the stall.<\/p><p><b>2<\/b> John is the boy in the orange shirt, sitting under the tree.<\/p><p><b>3<\/b> Jim is the boy on the bike, eating an apple.<\/p><p><b>4<\/b> Daisy is the girl in the pink dress, giving an ice cream to a boy.<\/p><p><b>5<\/b> Jill is the girl looking in her bag, wearing a hat.<\/p><\/div>\n    <\/div>\n  <\/div>\n<\/section>\n\n<!-- ============ PART 2 &#8212; Listen and write ============ -->\n<section class=\"part-section\" id=\"part2\">\n  <div class=\"wrap\">\n    <div class=\"part-head\">\n      <div class=\"part-num\">2<\/div>\n      <div class=\"part-head-text\">\n        <span class=\"qrange\">Questions 6&#8211;10 &#183; Listen and write<\/span>\n        <h2 class=\"serif\">Listen and write a name or a number<\/h2>\n        <p id=\"p2Intro\">Listen to Emma at the swimming pool. Write a name or a number. There is one example.<\/p>\n      <\/div>\n    <\/div>\n    <div class=\"part-actions\">\n      <button class=\"act-pill\" data-time=\"300\"><svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.4\" stroke-linecap=\"round\"><polygon points=\"5 3 19 12 5 21 5 3\"\/><\/svg> Replay Part 2<\/button>\n      <button class=\"act-pill ts-toggle\" data-target=\"ts2\">&#128220; Transcript<\/button>\n    <\/div>\n\n    <div class=\"form-card\" id=\"p2Form\">\n      <h4>&#128221; Star City Swimming Pool<\/h4>\n      <div id=\"p2Examples\"><\/div>\n      <div id=\"p2Questions\"><\/div>\n    <\/div>\n\n    <div class=\"notes-pad\">\n      <label>&#9999;&#65039; My notes for Part 2 (not graded)<\/label>\n      <textarea placeholder=\"Take notes while listening...\"><\/textarea>\n    <\/div>\n\n    <div class=\"transcript-card collapsed\" id=\"ts2\">\n      <div class=\"ts-head\" data-toggle=\"ts2\"><span>&#128220; Part 2 transcript<\/span><span class=\"chev\">&#9662;<\/span><\/div>\n      <div class=\"ts-body\" id=\"tsBody2\"><p><b>Ex<\/b> Name: <b>Emma Garey<\/b> (G&ndash;A&ndash;R&ndash;E&ndash;Y).<\/p><p><b>6<\/b> She is <b>eleven<\/b> years old.<\/p><p><b>7<\/b> She lives in <b>Lowe<\/b> Street (L&ndash;O&ndash;W&ndash;E).<\/p><p><b>8<\/b> Her swimming class is <b>Dolphins<\/b>.<\/p><p><b>9<\/b> Her teacher is Paul <b>Cane<\/b> (C&ndash;A&ndash;N&ndash;E).<\/p><p><b>10<\/b> She buys <b>a sandwich<\/b> at the caf&eacute;.<\/p><\/div>\n    <\/div>\n  <\/div>\n<\/section>\n\n<!-- ============ PART 3 &#8212; Match days ============ -->\n<section class=\"part-section\" id=\"part3\">\n  <div class=\"wrap\">\n    <div class=\"part-head\">\n      <div class=\"part-num\">3<\/div>\n      <div class=\"part-head-text\">\n        <span class=\"qrange\">Questions 11&ndash;15 &middot; Match day &rarr; picture<\/span>\n        <h2 class=\"serif\">What did Jane do last week?<\/h2>\n        <p id=\"p3Intro\">Listen and match each <b>day<\/b> to the correct <b>picture<\/b>. There is one example (Thursday). One day is not used.<\/p>\n      <\/div>\n    <\/div>\n    <div class=\"part-actions\">\n      <button class=\"act-pill\" data-time=\"370\"><svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.4\" stroke-linecap=\"round\"><polygon points=\"5 3 19 12 5 21 5 3\"\/><\/svg> Replay Part 3<\/button>\n      <button class=\"act-pill ts-toggle\" data-target=\"ts3\">&#128220; Transcript<\/button>\n      <button class=\"act-pill\" id=\"p3Clear\">&#129529; Clear my matches<\/button>\n    <\/div>\n\n    <div class=\"match-card-wrap\">\n      <div class=\"match-bank\" id=\"dayBank\"><\/div>\n      <div class=\"pair-hint\">&#128161; Click a <b>day<\/b>, then click the matching <b>picture<\/b>. Click the day badge on a picture to remove it.<\/div>\n      <div class=\"match-grid\" id=\"matchGrid\"><\/div>\n      <div class=\"pair-bottom-actions\">\n        <button class=\"show-ans-btn\" data-show=\"P3ALL\">&#128065; Show All Answers (Part 3)<\/button>\n      <\/div>\n    <\/div>\n\n    <div class=\"transcript-card collapsed\" id=\"ts3\">\n      <div class=\"ts-head\" data-toggle=\"ts3\"><span>&#128220; Part 3 transcript<\/span><span class=\"chev\">&#9662;<\/span><\/div>\n      <div class=\"ts-body\" id=\"tsBody3\"><p><b>Ex<\/b> On <b>Monday<\/b> (his birthday) Peter got a new kite with a shark on it.<\/p><p><b>11<\/b> On <b>Wednesday<\/b> he sailed a toy boat on the lake.<\/p><p><b>12<\/b> On <b>Thursday<\/b> he went to an island and fished from a boat.<\/p><p><b>13<\/b> On <b>Friday<\/b> it was wet, so he watched an old film on television.<\/p><p><b>14<\/b> On <b>Saturday<\/b> he went to the cinema (a film about a boy and a whale).<\/p><p><b>15<\/b> On <b>Sunday<\/b> he went to the zoo and liked the sharks.<\/p><p><i>(Tuesday is not used.)<\/i><\/p><\/div>\n    <\/div>\n  <\/div>\n<\/section>\n\n<!-- ============ PART 4 &#8212; Listen and tick ============ -->\n<section class=\"part-section\" id=\"part4\">\n  <div class=\"wrap\">\n    <div class=\"part-head\">\n      <div class=\"part-num\">4<\/div>\n      <div class=\"part-head-text\">\n        <span class=\"qrange\">Questions 16&ndash;20 &middot; Listen and tick (&#10003;)<\/span>\n        <h2 class=\"serif\">Listen and tick (&#10003;) the box<\/h2>\n        <p id=\"p4Intro\">Look at the pictures. Listen and tick the correct box. There is one example.<\/p>\n      <\/div>\n    <\/div>\n    <div class=\"part-actions\">\n      <button class=\"act-pill\" data-time=\"530\"><svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.4\" stroke-linecap=\"round\"><polygon points=\"5 3 19 12 5 21 5 3\"\/><\/svg> Replay Part 4<\/button>\n      <button class=\"act-pill ts-toggle\" data-target=\"ts4\">&#128220; Transcript<\/button>\n    <\/div>\n\n    <div class=\"q-list\" id=\"part4List\"><\/div>\n\n    <div class=\"transcript-card collapsed\" id=\"ts4\">\n      <div class=\"ts-head\" data-toggle=\"ts4\"><span>&#128220; Part 4 transcript<\/span><span class=\"chev\">&#9662;<\/span><\/div>\n      <div class=\"ts-body\" id=\"tsBody4\"><p><b>Ex<\/b> Kim has got a <b>temperature<\/b>. <b>B<\/b><\/p><p><b>16<\/b> Jane had a <b>cheese sandwich<\/b> for lunch. <b>B<\/b><\/p><p><b>17<\/b> Ann is the girl <b>choosing a CD<\/b>. <b>C<\/b><\/p><p><b>18<\/b> Mary chooses to go to the <b>supermarket<\/b> (to buy a cake). <b>A<\/b><\/p><p><b>19<\/b> Nick&#8217;s dad chooses the photo of the <b>waterfall<\/b>. <b>B<\/b><\/p><p><b>20<\/b> Sue&#8217;s mum goes to work <b>by bus<\/b>. <b>A<\/b><\/p><\/div>\n    <\/div>\n  <\/div>\n<\/section>\n\n<!-- ============ PART 5 &#8212; Listen, colour and draw ============ -->\n<section class=\"part-section\" id=\"part5\">\n  <div class=\"wrap\">\n    <div class=\"part-head\">\n      <div class=\"part-num\">5<\/div>\n      <div class=\"part-head-text\">\n        <span class=\"qrange\">Questions 21&ndash;25 &middot; Listen, colour and draw<\/span>\n        <h2 class=\"serif\">Listen, colour and draw<\/h2>\n        <p id=\"p5Intro\">Listen and colour the items. Two questions ask you to <b>draw<\/b> &mdash; draw on paper, then tick &ldquo;I drew it&rdquo; and compare with the answer. There is one example (the monster on the bed is already blue).<\/p>\n      <\/div>\n    <\/div>\n    <div class=\"part-actions\">\n      <button class=\"act-pill\" data-time=\"700\"><svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.4\" stroke-linecap=\"round\"><polygon points=\"5 3 19 12 5 21 5 3\"\/><\/svg> Replay Part 5<\/button>\n      <button class=\"act-pill ts-toggle\" data-target=\"ts5\">&#128220; Transcript<\/button>\n      <button class=\"act-pill\" id=\"p5Clear\">&#129529; Clear my colours<\/button>\n    <\/div>\n\n    <div class=\"colour-wrap\">\n      <div class=\"colour-palette\" id=\"colourPalette\"><\/div>\n      <div class=\"p5-scene\" id=\"colourScene\">\n        <img decoding=\"async\" src=\"https:\/\/allenglish4u.com\/wp-content\/uploads\/2026\/06\/m4t2_p5_scene.png\" alt=\"Part 5 scene: children ice-skating on a frozen lake with a bearded man watching\" draggable=\"false\">\n        <svg viewBox=\"0 0 2157 2677\" preserveAspectRatio=\"xMidYMid meet\"><defs><\/defs>\n          <g style=\"pointer-events:auto\">\n            <circle data-region=\"rock\" cx=\"1553\" cy=\"1151\" r=\"95\" fill=\"rgba(0,0,0,0.001)\"\/>\n            <circle data-region=\"coat\" cx=\"1467\" cy=\"1553\" r=\"100\" fill=\"rgba(0,0,0,0.001)\"\/>\n            <circle data-region=\"hat\" cx=\"647\" cy=\"1285\" r=\"85\" fill=\"rgba(0,0,0,0.001)\"\/>\n            <circle data-region=\"scarf\" cx=\"1014\" cy=\"723\" r=\"85\" fill=\"rgba(0,0,0,0.001)\"\/>\n            <circle class=\"draw-zone\" cx=\"367\" cy=\"669\" r=\"95\" fill=\"none\"\/>\n          <\/g>\n        <\/svg>\n      <\/div>\n      <div class=\"pair-hint\">&#128161; Click a colour, then click an item in the picture. Dashed circles show where to <b>draw<\/b> (on your paper).<\/div>\n      <div class=\"colour-instructions\" id=\"colourInstructions\"><\/div>\n      <div class=\"pair-bottom-actions\">\n        <button class=\"show-ans-btn\" data-show=\"P5ALL\">&#128065; Show All Answers (Part 5)<\/button>\n      <\/div>\n      <div class=\"ans-reveal\" id=\"p5AnswerBox\" style=\"display:none\">\n        <h5>&#9989; Completed picture (answer)<\/h5>\n        <img decoding=\"async\" src=\"https:\/\/allenglish4u.com\/wp-content\/uploads\/2026\/06\/m4t2_p5_scene.png\" alt=\"Part 5 completed answer scene\" loading=\"lazy\">\n      <\/div>\n    <\/div>\n\n    <div class=\"notes-pad\">\n      <label>&#9999;&#65039; My notes for Part 5 (not graded)<\/label>\n      <textarea placeholder=\"Take notes while listening...\"><\/textarea>\n    <\/div>\n\n    <div class=\"transcript-card collapsed\" id=\"ts5\">\n      <div class=\"ts-head\" data-toggle=\"ts5\"><span>&#128220; Part 5 transcript<\/span><span class=\"chev\">&#9662;<\/span><\/div>\n      <div class=\"ts-body\" id=\"tsBody5\"><p><b>Ex<\/b> The sweater of the woman by the lake is <b>blue<\/b> (already done).<\/p><p><b>21<\/b> Colour the <b>rock<\/b> (the girl is standing on it) <b>brown<\/b>.<\/p><p><b>22<\/b> Colour the <b>coat<\/b> of the person skating on the lake <b>green<\/b>.<\/p><p><b>23<\/b> Colour the <b>hat<\/b> of the boy sitting on the ice <b>orange<\/b>.<\/p><p><b>24<\/b> <b>Draw a cup of coffee<\/b> in the hand of the bearded man.<\/p><p><b>25<\/b> Colour the <b>scarf<\/b> of the boy carrying his skates <b>yellow<\/b>.<\/p><\/div>\n    <\/div>\n  <\/div>\n<\/section>\n\n<!-- SUBMIT PANEL -->\n<div class=\"wrap\">\n  <div class=\"submit-panel\">\n    <h3>&#127919; Finished all 25 questions?<\/h3>\n    <p class=\"intro\">Submit to grade your whole test, OR use &#128065; Show Answer per part \/ per question.<\/p>\n    <div class=\"sp-buttons\">\n      <button class=\"btn-submit-big\" id=\"submitBtn\">\n        <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.8\" stroke-linecap=\"round\"><path d=\"M20 6L9 17l-5-5\"\/><\/svg>\n        Submit &amp; Grade All\n      <\/button>\n      <button class=\"btn-reset-big\" id=\"resetBtn\">&#128260; Reset Test<\/button>\n    <\/div>\n  <\/div>\n\n  <div class=\"results-banner\" id=\"resultsBanner\">\n    <h3>&#127911; Your Movers 1 Test 1 Listening score<\/h3>\n    <div class=\"score-big\"><span id=\"finalScore\">0<\/span>\/25<\/div>\n    <p id=\"resultsMsg\">Great work!<\/p>\n    <div class=\"score-parts\" id=\"scoreParts\"><\/div>\n  <\/div>\n<\/div>\n\n<footer class=\"footer\">\n  <div class=\"wrap\">\n    <p>&#169; 2026 All English 4U &#183; <a href=\"https:\/\/allenglish4u.com\/cambridge\/\">All Cambridge Tests<\/a> &#183; <a href=\"https:\/\/allenglish4u.com\/contact\/\">Contact<\/a><\/p>\n  <\/div>\n<\/footer>\n\n<script>(function(){var s=atob(\"KGZ1bmN0aW9uKCl7Ci8qIEFFNFUgWUxFIE1PVkVSUyA0IFRFU1QgMiBMSVNURU5JTkcgKG9sZCBDVVAgZm9ybWF0OiBQYWlyL1dyaXRlL01hdGNoL1RpY2svQ29sb3VyK0RyYXcpICovCnZhciBJTUc9J2h0dHBzOi8vYWxsZW5nbGlzaDR1LmNvbS93cC1jb250ZW50L3VwbG9hZHMvMjAyNi8wNi8nOwoKLyogPT09PT0gREFUQSA9PT09PSAqLwp2YXIgUDFfTkFNRVMgPSBbCiAge246J0V4JywgbmFtZTonRnJlZCcsIGFuczonZnJlZF9zYXVzYWdlcycsIGlzRXhhbXBsZTp0cnVlfSwKICB7bjoxLCBuYW1lOidTYWxseScsIGFuczonc2FsbHlfZnJ1aXQnfSwKICB7bjoyLCBuYW1lOidKb2huJywgYW5zOidqb2huX3RyZWUnfSwKICB7bjozLCBuYW1lOidKaW0nLCBhbnM6J2ppbV9iaWtlJ30sCiAge246NCwgbmFtZTonRGFpc3knLCBhbnM6J2RhaXN5X2ljZWNyZWFtJ30sCiAge246NSwgbmFtZTonSmlsbCcsIGFuczonamlsbF9iYWcnfSwKICB7bjon4oCTJywgbmFtZTonUGV0ZXInLCBhbnM6bnVsbCwgZGlzdHJhY3Rvcjp0cnVlfQpdOwp2YXIgUDFfVEFSR0VUUyA9IFsKICB7a2V5OidmcmVkX3NhdXNhZ2VzJywgbGFiZWw6J2JveSBpbiByZWQgc3dlYXRlciBidXlpbmcgc2F1c2FnZXMgKGV4YW1wbGUpJywgeDo2OCwgeTo0MiwgaXNFeGFtcGxlOnRydWV9LAogIHtrZXk6J3NhbGx5X2ZydWl0JywgbGFiZWw6J2dpcmwgYnV5aW5nIGZydWl0JywgeDozMywgeTozM30sCiAge2tleTonam9obl90cmVlJywgbGFiZWw6J2JveSBpbiBvcmFuZ2Ugc2hpcnQgdW5kZXIgdGhlIHRyZWUnLCB4OjIyLCB5OjU4fSwKICB7a2V5OidqaW1fYmlrZScsIGxhYmVsOidib3kgb24gdGhlIGJpa2UgZWF0aW5nIGFuIGFwcGxlJywgeDo0MiwgeTo4NX0sCiAge2tleTonZGFpc3lfaWNlY3JlYW0nLCBsYWJlbDonZ2lybCBpbiBwaW5rIGdpdmluZyBhbiBpY2UgY3JlYW0nLCB4OjUyLCB5OjUyfSwKICB7a2V5OidqaWxsX2JhZycsIGxhYmVsOidnaXJsIGxvb2tpbmcgaW4gaGVyIGJhZywgd2VhcmluZyBhIGhhdCcsIHg6NzYsIHk6Nzh9Cl07CnZhciBQMl9FWEFNUExFUyA9IFsKICB7bGFiZWw6J05hbWU6JywgZGlzcGxheTonRW1tYSBHYXJleSd9Cl07CnZhciBQMl9RVUVTVElPTlMgPSBbCiAge246NiwgIGxhYmVsOidIb3cgb2xkOicsIGFjY2VwdGVkOlsnZWxldmVuJywnMTEnXSwgZGlzcGxheTonZWxldmVuJ30sCiAge246NywgIGxhYmVsOidMaXZlcyBpbjonLCBzdWZmaXg6J1N0cmVldCcsIGFjY2VwdGVkOlsnbG93ZSddLCBkaXNwbGF5OidMb3dlJ30sCiAge246OCwgIGxhYmVsOidOYW1lIG9mIHN3aW1taW5nIGNsYXNzOicsIGFjY2VwdGVkOlsnZG9scGhpbnMnLCd0aGUgZG9scGhpbnMnXSwgZGlzcGxheTonRG9scGhpbnMnfSwKICB7bjo5LCAgbGFiZWw6J1RlYWNoZXJcJ3MgbmFtZTonLCBwcmVmaXg6J1BhdWwnLCBhY2NlcHRlZDpbJ2NhbmUnXSwgZGlzcGxheTonQ2FuZSd9LAogIHtuOjEwLCBsYWJlbDonQnV5czonLCBhY2NlcHRlZDpbJ2Egc2FuZHdpY2gnLCdzYW5kd2ljaCddLCBkaXNwbGF5OidhIHNhbmR3aWNoJ30KXTsKdmFyIFAzX1BST01QVD0nV2hhdCBkaWQgUGV0ZXIgZG8gbGFzdCB3ZWVrPyc7CnZhciBQM19EQVlTPVsnTW9uZGF5JywnVHVlc2RheScsJ1dlZG5lc2RheScsJ1RodXJzZGF5JywnRnJpZGF5JywnU2F0dXJkYXknLCdTdW5kYXknXTsKdmFyIFAzX1BJQ1MgPSBbCiAge246J0V4Jywga2V5Oidtb24nLCBpbWc6SU1HKydtNHQyX3AzX21vbl9leC5qcGcnLCBhbHQ6J2V4YW1wbGU6IGJpcnRoZGF5LCBuZXcga2l0ZScsIGRheTonTW9uZGF5JywgaXNFeGFtcGxlOnRydWV9LAogIHtuOjExLCBrZXk6J3dlZCcsIGltZzpJTUcrJ200dDJfcDNfd2VkLmpwZycsIGFsdDonbGFrZSwgc2FpbGVkIGEgdG95IGJvYXQnLCBkYXk6J1dlZG5lc2RheSd9LAogIHtuOjEyLCBrZXk6J3RodScsIGltZzpJTUcrJ200dDJfcDNfdGh1LmpwZycsIGFsdDonaXNsYW5kLCBmaXNoaW5nIGluIGEgYm9hdCcsIGRheTonVGh1cnNkYXknfSwKICB7bjoxMywga2V5OidmcmknLCBpbWc6SU1HKydtNHQyX3AzX2ZyaS5qcGcnLCBhbHQ6J3dhdGNoZWQgdGVsZXZpc2lvbicsIGRheTonRnJpZGF5J30sCiAge246MTQsIGtleTonc2F0JywgaW1nOklNRysnbTR0Ml9wM19zYXQuanBnJywgYWx0OidjaW5lbWEsIGZpbG0gYWJvdXQgYSB3aGFsZScsIGRheTonU2F0dXJkYXknfSwKICB7bjoxNSwga2V5OidzdW4nLCBpbWc6SU1HKydtNHQyX3AzX3N1bi5qcGcnLCBhbHQ6J3pvbywgc2hhcmtzJywgZGF5OidTdW5kYXknfQpdOwp2YXIgUDRfRVhBTVBMRV9NQ1EgPSB7CiAgcTonRXhhbXBsZSDigJQgV2hhdFwncyB0aGUgbWF0dGVyIHdpdGggS2ltPycsCiAgb3B0czpbe2xldHRlcjonQScsaW1nOklNRysnbTR0Ml9wNF9leF9BLmpwZyd9LHtsZXR0ZXI6J0InLGltZzpJTUcrJ200dDJfcDRfZXhfQi5qcGcnLGlzQW5zd2VyOnRydWV9LHtsZXR0ZXI6J0MnLGltZzpJTUcrJ200dDJfcDRfZXhfQy5qcGcnfV0sCiAgYW5zOidCJwp9Owp2YXIgUDRfTUNRID0gWwogIHtuOjE2LCBxOidXaGF0IGRpZCBKYW5lIGhhdmUgZm9yIGx1bmNoIHRvZGF5PycsICBvcHRzOlt7bGV0dGVyOidBJyxpbWc6SU1HKydtNHQyX3A0X3ExX0EuanBnJ30se2xldHRlcjonQicsaW1nOklNRysnbTR0Ml9wNF9xMV9CLmpwZyd9LHtsZXR0ZXI6J0MnLGltZzpJTUcrJ200dDJfcDRfcTFfQy5qcGcnfV0sIGFuczonQid9LAogIHtuOjE3LCBxOidXaGljaCBnaXJsIGlzIEFubj8nLCAgICAgICAgICAgICAgICAgICBvcHRzOlt7bGV0dGVyOidBJyxpbWc6SU1HKydtNHQyX3A0X3EyX0EuanBnJ30se2xldHRlcjonQicsaW1nOklNRysnbTR0Ml9wNF9xMl9CLmpwZyd9LHtsZXR0ZXI6J0MnLGltZzpJTUcrJ200dDJfcDRfcTJfQy5qcGcnfV0sIGFuczonQyd9LAogIHtuOjE4LCBxOidXaGF0IGRvZXMgTWFyeSBjaG9vc2UgdG8gZG8\/JywgICAgICAgICAgb3B0czpbe2xldHRlcjonQScsaW1nOklNRysnbTR0Ml9wNF9xM19BLmpwZyd9LHtsZXR0ZXI6J0InLGltZzpJTUcrJ200dDJfcDRfcTNfQi5qcGcnfSx7bGV0dGVyOidDJyxpbWc6SU1HKydtNHQyX3A0X3EzX0MuanBnJ31dLCBhbnM6J0EnfSwKICB7bjoxOSwgcTonV2hpY2ggcGhvdG8gZG9lcyBOaWNrXCdzIGRhZCBjaG9vc2U\/JywgIG9wdHM6W3tsZXR0ZXI6J0EnLGltZzpJTUcrJ200dDJfcDRfcTRfQS5qcGcnfSx7bGV0dGVyOidCJyxpbWc6SU1HKydtNHQyX3A0X3E0X0IuanBnJ30se2xldHRlcjonQycsaW1nOklNRysnbTR0Ml9wNF9xNF9DLmpwZyd9XSwgYW5zOidCJ30sCiAge246MjAsIHE6J0hvdyBkb2VzIFN1ZVwncyBtdW0gZ28gdG8gd29yaz8nLCAgICAgICAgb3B0czpbe2xldHRlcjonQScsaW1nOklNRysnbTR0Ml9wNF9xNV9BLmpwZyd9LHtsZXR0ZXI6J0InLGltZzpJTUcrJ200dDJfcDRfcTVfQi5qcGcnfSx7bGV0dGVyOidDJyxpbWc6SU1HKydtNHQyX3A0X3E1X0MuanBnJ31dLCBhbnM6J0EnfQpdOwp2YXIgUDRfQ09MT1VSUyA9IFsKICB7a2V5OidyZWQnLGhleDonI0VGNDQ0NCd9LHtrZXk6J2JsdWUnLGhleDonIzNCODJGNid9LHtrZXk6J2dyZWVuJyxoZXg6JyMxMEI5ODEnfSwKICB7a2V5Oid5ZWxsb3cnLGhleDonI0ZBQ0MxNSd9LHtrZXk6J29yYW5nZScsaGV4OicjRjk3MzE2J30se2tleToncHVycGxlJyxoZXg6JyM4QjVDRjYnfSwKICB7a2V5OidwaW5rJyxoZXg6JyNFQzQ4OTknfSx7a2V5Oidicm93bicsaGV4OicjOTI0MDBFJ30se2tleTonYmxhY2snLGhleDonIzBGMTcyQSd9Cl07CnZhciBQNV9FWEFNUExFX05PVEU9J0V4YW1wbGUg4oCUIHRoZSBzd2VhdGVyIG9mIHRoZSB3b21hbiBzdGFuZGluZyBieSB0aGUgbGFrZSBpcyBCTFVFIChhbHJlYWR5IGNvbG91cmVkIGluIHRoZSBwaWN0dXJlKS4nOwp2YXIgUDVfSVRFTVMgPSBbCiAge246MjEsIHR5cGU6J2NvbG91cicsIHJlZ2lvbjoncm9jaycsIGNvbG91cjonYnJvd24nLCBpbnN0cnVjdGlvbjonQ29sb3VyIHRoZSBST0NLIHdpdGggdGhlIGdpcmwgc3RhbmRpbmcgb24gaXQgQlJPV04uJ30sCiAge246MjIsIHR5cGU6J2NvbG91cicsIHJlZ2lvbjonY29hdCcsIGNvbG91cjonZ3JlZW4nLCBpbnN0cnVjdGlvbjonQ29sb3VyIHRoZSBDT0FUIG9mIHRoZSBwZXJzb24gc2thdGluZyBvbiB0aGUgbGFrZSBHUkVFTi4nfSwKICB7bjoyMywgdHlwZTonY29sb3VyJywgcmVnaW9uOidoYXQnLCBjb2xvdXI6J29yYW5nZScsIGluc3RydWN0aW9uOidDb2xvdXIgdGhlIEhBVCBvZiB0aGUgYm95IHNpdHRpbmcgZG93biBvbiB0aGUgaWNlIE9SQU5HRS4nfSwKICB7bjoyNCwgdHlwZTonZHJhdycsIGluc3RydWN0aW9uOidEcmF3IGEgQ1VQIE9GIENPRkZFRSBpbiB0aGUgaGFuZCBvZiB0aGUgYmVhcmRlZCBtYW4gKGRyYXcgb24geW91ciBwYXBlcikuJ30sCiAge246MjUsIHR5cGU6J2NvbG91cicsIHJlZ2lvbjonc2NhcmYnLCBjb2xvdXI6J3llbGxvdycsIGluc3RydWN0aW9uOidDb2xvdXIgdGhlIFNDQVJGIG9mIHRoZSBib3kgY2FycnlpbmcgaGlzIHNrYXRlcyBZRUxMT1cuJ30KXTsKdmFyIFRPVEFMPTI1OwoKLyogPT09PT0gVVRJTElUSUVTID09PT09ICovCmZ1bmN0aW9uIGVzYyhzKXtyZXR1cm4gU3RyaW5nKHMpLnJlcGxhY2UoL1smPD4iJ10vZyxmdW5jdGlvbihjKXtyZXR1cm57JyYnOicmYW1wOycsJzwnOicmbHQ7JywnPic6JyZndDsnLCciJzonJnF1b3Q7JywiJyI6JyYjMzk7J31bY119KX0KZnVuY3Rpb24gJCQoc2VsLGN0eCl7cmV0dXJuIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKChjdHh8fGRvY3VtZW50KS5xdWVyeVNlbGVjdG9yQWxsKHNlbCkpfQpmdW5jdGlvbiAkKHNlbCxjdHgpe3JldHVybiAoY3R4fHxkb2N1bWVudCkucXVlcnlTZWxlY3RvcihzZWwpfQoKLyogPT09PT0gSEVBREVSICsgRFJBV0VSID09PT09ICovCnZhciBoZHI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hkcicpOwpmdW5jdGlvbiBzZXRTb2xpZCgpe2lmKHdpbmRvdy5zY3JvbGxZPjQwKWhkci5jbGFzc0xpc3QuYWRkKCdzb2xpZCcpO2Vsc2UgaGRyLmNsYXNzTGlzdC5yZW1vdmUoJ3NvbGlkJyl9CndpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLHNldFNvbGlkLHtwYXNzaXZlOnRydWV9KTtzZXRTb2xpZCgpOwp2YXIgaGFtYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaGFtYicpLGRyYXdlcj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZHJhd2VyJyksZENsb3NlPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkcmF3ZXJDbG9zZScpOwppZihoYW1iKWhhbWIuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLGZ1bmN0aW9uKCl7ZHJhd2VyLmNsYXNzTGlzdC5hZGQoJ29wZW4nKX0pOwppZihkQ2xvc2UpZENsb3NlLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxmdW5jdGlvbigpe2RyYXdlci5jbGFzc0xpc3QucmVtb3ZlKCdvcGVuJyl9KTsKaWYoZHJhd2VyKWRyYXdlci5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsZnVuY3Rpb24oZSl7aWYoZS50YXJnZXQ9PT1kcmF3ZXIpZHJhd2VyLmNsYXNzTGlzdC5yZW1vdmUoJ29wZW4nKX0pOwoKLyogPT09PT0gWU9VVFVCRSA9PT09PSAqLwp2YXIgeXRSZWFkeT1mYWxzZSwgeXRQbGF5ZXI9bnVsbDsKdmFyIHRhZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTsgdGFnLnNyYz0naHR0cHM6Ly93d3cueW91dHViZS5jb20vaWZyYW1lX2FwaSc7CmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQodGFnKTsKd2luZG93Lm9uWW91VHViZUlmcmFtZUFQSVJlYWR5PWZ1bmN0aW9uKCl7CiAgeXRQbGF5ZXI9bmV3IFlULlBsYXllcigneXRQbGF5ZXInLHtldmVudHM6e29uUmVhZHk6ZnVuY3Rpb24oKXt5dFJlYWR5PXRydWV9fX0pOwp9OwpmdW5jdGlvbiB5dFNlZWsoc2VjKXsKICBpZih5dFJlYWR5KXsgeXRQbGF5ZXIuc2Vla1RvKHNlYywgdHJ1ZSk7IHl0UGxheWVyLnBsYXlWaWRlbygpOyB9CiAgZWxzZXsgdmFyIGY9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3l0UGxheWVyJyk7IGYuc3JjPWYuc3JjLnNwbGl0KCc\/JylbMF0rJz9lbmFibGVqc2FwaT0xJnJlbD0wJmF1dG9wbGF5PTEmc3RhcnQ9JytzZWM7IH0KfQpmdW5jdGlvbiB5dFBhdXNlKCl7IGlmKHl0UmVhZHkpeXRQbGF5ZXIucGF1c2VWaWRlbygpOyB9CmZ1bmN0aW9uIHl0UGxheSgpeyBpZih5dFJlYWR5KXl0UGxheWVyLnBsYXlWaWRlbygpOyB9CmZ1bmN0aW9uIHl0UmV3aW5kKCl7IGlmKHl0UmVhZHkpeyB2YXIgdD15dFBsYXllci5nZXRDdXJyZW50VGltZSgpOyB5dFBsYXllci5zZWVrVG8oTWF0aC5tYXgoMCx0LTEwKSx0cnVlKTsgfSB9CmZ1bmN0aW9uIHl0UmF0ZShyKXsgaWYoeXRSZWFkeSl5dFBsYXllci5zZXRQbGF5YmFja1JhdGUocik7IH0KJCQoJy5qdW1wLWJ0bicpLmZvckVhY2goZnVuY3Rpb24oYil7CiAgYi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsZnVuY3Rpb24oKXsKICAgIHl0U2VlayhwYXJzZUludChiLmRhdGFzZXQudGltZSkpOwogICAgJCQoJy5qdW1wLWJ0bicpLmZvckVhY2goZnVuY3Rpb24oeCl7eC5jbGFzc0xpc3QucmVtb3ZlKCdhY3RpdmUnKX0pOwogICAgYi5jbGFzc0xpc3QuYWRkKCdhY3RpdmUnKTsKICAgIGlmKGIuZGF0YXNldC5wYXJ0ICYmIGIuZGF0YXNldC5wYXJ0IT09J2ludHJvJyl7CiAgICAgIHZhciBzZWM9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3BhcnQnK2IuZGF0YXNldC5wYXJ0KTsKICAgICAgaWYoc2VjKXNlYy5zY3JvbGxJbnRvVmlldyh7YmVoYXZpb3I6J3Ntb290aCcsYmxvY2s6J3N0YXJ0J30pOwogICAgfQogIH0pOwp9KTsKJCQoJy5hY3QtcGlsbFtkYXRhLXRpbWVdJykuZm9yRWFjaChmdW5jdGlvbihiKXsKICBiLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxmdW5jdGlvbigpeyB5dFNlZWsocGFyc2VJbnQoYi5kYXRhc2V0LnRpbWUpKTsgfSk7Cn0pOwpkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYnRuUGF1c2UnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycseXRQYXVzZSk7CmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdidG5QbGF5JykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLHl0UGxheSk7CmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdidG5SZXdpbmQnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycseXRSZXdpbmQpOwpkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYnRuU2xvd2VyJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLGZ1bmN0aW9uKCl7eXRSYXRlKDAuNzUpfSk7CmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdidG5Ob3JtYWwnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsZnVuY3Rpb24oKXt5dFJhdGUoMSl9KTsKJCQoJy50cy10b2dnbGUsIC50cy1oZWFkJykuZm9yRWFjaChmdW5jdGlvbihiKXsKICBiLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxmdW5jdGlvbigpewogICAgdmFyIHRhcmdldD1iLmRhdGFzZXQudGFyZ2V0fHxiLmRhdGFzZXQudG9nZ2xlOwogICAgaWYoIXRhcmdldCl7IHZhciBjYXJkPWIuY2xvc2VzdCgnLnRyYW5zY3JpcHQtY2FyZCcpOyBpZihjYXJkKXRhcmdldD1jYXJkLmlkOyB9CiAgICB2YXIgY2FyZD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0YXJnZXQpOwogICAgaWYoY2FyZCljYXJkLmNsYXNzTGlzdC50b2dnbGUoJ2NvbGxhcHNlZCcpOwogIH0pOwp9KTsKCi8qID09PT09IFBBUlQgMSDigJQgRFJBVyBMSU5FUyA9PT09PSAqLwp2YXIgUDFfdXNlck1hdGNoZXMgPSB7fTsKdmFyIFAxX3NlbGVjdGVkTmFtZSA9IG51bGw7CnZhciBwYWlyTmFtZXNFbD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncGFpck5hbWVzJyk7CnZhciBwYWlyVGFyZ2V0c0VsPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwYWlyVGFyZ2V0cycpOwp2YXIgcGFpckxpbmVzRWw9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3BhaXJMaW5lcycpOwp2YXIgcGFpckltZz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncGFpckltZycpOwp2YXIgcGFpclNjZW5lPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwYWlyU2NlbmUnKTsKCmZ1bmN0aW9uIHJlbmRlclAxTmFtZXMoKXsKICBwYWlyTmFtZXNFbC5pbm5lckhUTUw9Jyc7CiAgUDFfTkFNRVMuZm9yRWFjaChmdW5jdGlvbihuYW1lKXsKICAgIHZhciBkaXY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICBkaXYuY2xhc3NOYW1lPSdwYWlyLW5hbWUnKyhuYW1lLmlzRXhhbXBsZT8nIGV4YW1wbGUnOicnKTsKICAgIGRpdi5kYXRhc2V0Lm49bmFtZS5uOwogICAgZGl2LmlubmVySFRNTD0nPHNwYW4gY2xhc3M9InBuLW51bSI+Jytlc2MoU3RyaW5nKG5hbWUubikpKyc8L3NwYW4+PHNwYW4+Jytlc2MobmFtZS5uYW1lKSsnPC9zcGFuPjxzcGFuIGNsYXNzPSJwbi1kb3QiPjwvc3Bhbj4nOwogICAgaWYoIW5hbWUuaXNFeGFtcGxlKXsKICAgICAgZGl2LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxmdW5jdGlvbigpewogICAgICAgICQkKCcucGFpci1uYW1lJyxwYWlyTmFtZXNFbCkuZm9yRWFjaChmdW5jdGlvbih4KXt4LmNsYXNzTGlzdC5yZW1vdmUoJ3NlbGVjdGVkJyl9KTsKICAgICAgICBpZihQMV9zZWxlY3RlZE5hbWU9PT1uYW1lLm4peyBQMV9zZWxlY3RlZE5hbWU9bnVsbDsgfQogICAgICAgIGVsc2UgeyBkaXYuY2xhc3NMaXN0LmFkZCgnc2VsZWN0ZWQnKTsgUDFfc2VsZWN0ZWROYW1lPW5hbWUubjsgfQogICAgICB9KTsKICAgIH0KICAgIHBhaXJOYW1lc0VsLmFwcGVuZENoaWxkKGRpdik7CiAgfSk7Cn0KZnVuY3Rpb24gcmVuZGVyUDFUYXJnZXRzKCl7CiAgcGFpclRhcmdldHNFbC5pbm5lckhUTUw9Jyc7CiAgUDFfVEFSR0VUUy5mb3JFYWNoKGZ1bmN0aW9uKHQpewogICAgdmFyIGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICBkLmNsYXNzTmFtZT0ndGd0JysodC5pc0V4YW1wbGU\/JyBleGFtcGxlJzonJyk7CiAgICBkLnN0eWxlLmxlZnQ9dC54KyclJzsgZC5zdHlsZS50b3A9dC55KyclJzsKICAgIGQuZGF0YXNldC5rZXk9dC5rZXk7CiAgICBkLmlubmVySFRNTD0nPHNwYW4gY2xhc3M9InRsYWJlbCI+Jytlc2ModC5sYWJlbCkrJzwvc3Bhbj4nOwogICAgaWYoIXQuaXNFeGFtcGxlKXsKICAgICAgZC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsZnVuY3Rpb24oKXsKICAgICAgICBpZighUDFfc2VsZWN0ZWROYW1lKXJldHVybjsKICAgICAgICBkZWxldGUgUDFfdXNlck1hdGNoZXNbUDFfc2VsZWN0ZWROYW1lXTsKICAgICAgICBPYmplY3Qua2V5cyhQMV91c2VyTWF0Y2hlcykuZm9yRWFjaChmdW5jdGlvbihrKXsKICAgICAgICAgIGlmKFAxX3VzZXJNYXRjaGVzW2tdPT09dC5rZXkpIGRlbGV0ZSBQMV91c2VyTWF0Y2hlc1trXTsKICAgICAgICB9KTsKICAgICAgICBQMV91c2VyTWF0Y2hlc1tQMV9zZWxlY3RlZE5hbWVdPXQua2V5OwogICAgICAgIHZhciBuYW1lRWw9cGFpck5hbWVzRWwucXVlcnlTZWxlY3RvcignW2RhdGEtbj0iJytQMV9zZWxlY3RlZE5hbWUrJyJdJyk7CiAgICAgICAgaWYobmFtZUVsKXtuYW1lRWwuY2xhc3NMaXN0LnJlbW92ZSgnc2VsZWN0ZWQnKTtuYW1lRWwuY2xhc3NMaXN0LmFkZCgnbWF0Y2hlZCcpO30KICAgICAgICBQMV9zZWxlY3RlZE5hbWU9bnVsbDsKICAgICAgICBkcmF3UDFMaW5lcygpOyB1cGRhdGVQcm9ncmVzcygpOwogICAgICB9KTsKICAgIH0KICAgIHBhaXJUYXJnZXRzRWwuYXBwZW5kQ2hpbGQoZCk7CiAgfSk7Cn0KZnVuY3Rpb24gZHJhd1AxTGluZXMob3B0cyl7CiAgb3B0cz1vcHRzfHx7fTsKICB2YXIgc2hvd0NvcnJlY3Q9b3B0cy5zaG93Q29ycmVjdDsKICB2YXIgc2NlbmVCYm94PXBhaXJTY2VuZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKICBwYWlyTGluZXNFbC5zZXRBdHRyaWJ1dGUoJ3dpZHRoJyxzY2VuZUJib3gud2lkdGgpOwogIHBhaXJMaW5lc0VsLnNldEF0dHJpYnV0ZSgnaGVpZ2h0JyxzY2VuZUJib3guaGVpZ2h0KTsKICBwYWlyTGluZXNFbC5zZXRBdHRyaWJ1dGUoJ3ZpZXdCb3gnLCcwIDAgJytzY2VuZUJib3gud2lkdGgrJyAnK3NjZW5lQmJveC5oZWlnaHQpOwogIHZhciBzdmducz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnOwogIHBhaXJMaW5lc0VsLmlubmVySFRNTD0nPGRlZnM+PC9kZWZzPic7CiAgdmFyIGV4TmFtZT1QMV9OQU1FUy5maW5kKGZ1bmN0aW9uKG4pe3JldHVybiBuLmlzRXhhbXBsZX0pOwogIHZhciBleFRndD1QMV9UQVJHRVRTLmZpbmQoZnVuY3Rpb24odCl7cmV0dXJuIHQuaXNFeGFtcGxlfSk7CiAgaWYoZXhOYW1lJiZleFRndCkgZHJhd0xpbmUoZXhOYW1lLm4sZXhUZ3QsJyNGQkJGMjQnLDMsdHJ1ZSk7CiAgUDFfTkFNRVMuZm9yRWFjaChmdW5jdGlvbihuYW1lKXsKICAgIGlmKG5hbWUuaXNFeGFtcGxlfHxuYW1lLmRpc3RyYWN0b3IpcmV0dXJuOwogICAgdmFyIHRndEtleSA9IHNob3dDb3JyZWN0ID8gbmFtZS5hbnMgOiBQMV91c2VyTWF0Y2hlc1tuYW1lLm5dOwogICAgaWYoIXRndEtleSlyZXR1cm47CiAgICB2YXIgdGd0PVAxX1RBUkdFVFMuZmluZChmdW5jdGlvbih0KXtyZXR1cm4gdC5rZXk9PT10Z3RLZXl9KTsKICAgIGlmKCF0Z3QpcmV0dXJuOwogICAgZHJhd0xpbmUobmFtZS5uLHRndCxzaG93Q29ycmVjdD8nIzEwQjk4MSc6JyM4QjVDRjYnLDIuNSxmYWxzZSk7CiAgfSk7CiAgZnVuY3Rpb24gZHJhd0xpbmUobmFtZU4sdGd0LGNvbG91cix3LGlzRXhhbXBsZSl7CiAgICB2YXIgbmFtZUVsPXBhaXJOYW1lc0VsLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLW49IicrbmFtZU4rJyJdJyk7CiAgICBpZighbmFtZUVsKXJldHVybjsKICAgIHZhciBuYj1uYW1lRWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CiAgICB2YXIgeDE9bmIucmlnaHQtc2NlbmVCYm94LmxlZnQ7CiAgICB2YXIgeTE9bmIudG9wK25iLmhlaWdodC8yLXNjZW5lQmJveC50b3A7CiAgICB2YXIgeDI9dGd0LngvMTAwKnNjZW5lQmJveC53aWR0aDsKICAgIHZhciB5Mj10Z3QueS8xMDAqc2NlbmVCYm94LmhlaWdodDsKICAgIHZhciBsaW5lPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhzdmducywnbGluZScpOwogICAgbGluZS5zZXRBdHRyaWJ1dGUoJ3gxJyx4MSk7bGluZS5zZXRBdHRyaWJ1dGUoJ3kxJyx5MSk7CiAgICBsaW5lLnNldEF0dHJpYnV0ZSgneDInLHgyKTtsaW5lLnNldEF0dHJpYnV0ZSgneTInLHkyKTsKICAgIGxpbmUuc2V0QXR0cmlidXRlKCdzdHJva2UnLGNvbG91cik7bGluZS5zZXRBdHRyaWJ1dGUoJ3N0cm9rZS13aWR0aCcsdyk7CiAgICBsaW5lLnNldEF0dHJpYnV0ZSgnc3Ryb2tlLWxpbmVjYXAnLCdyb3VuZCcpOwogICAgaWYoaXNFeGFtcGxlKWxpbmUuc2V0QXR0cmlidXRlKCdzdHJva2UtZGFzaGFycmF5JywnNiA0Jyk7CiAgICBsaW5lLnN0eWxlLnBvaW50ZXJFdmVudHM9aXNFeGFtcGxlPydub25lJzonc3Ryb2tlJzsKICAgIGxpbmUuc3R5bGUuY3Vyc29yPWlzRXhhbXBsZT8nZGVmYXVsdCc6J3BvaW50ZXInOwogICAgaWYoIWlzRXhhbXBsZSl7CiAgICAgIGxpbmUuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLGZ1bmN0aW9uKCl7CiAgICAgICAgZGVsZXRlIFAxX3VzZXJNYXRjaGVzW25hbWVOXTsKICAgICAgICB2YXIgbmU9cGFpck5hbWVzRWwucXVlcnlTZWxlY3RvcignW2RhdGEtbj0iJytuYW1lTisnIl0nKTsKICAgICAgICBpZihuZSluZS5jbGFzc0xpc3QucmVtb3ZlKCdtYXRjaGVkJyk7CiAgICAgICAgZHJhd1AxTGluZXMoKTsgdXBkYXRlUHJvZ3Jlc3MoKTsKICAgICAgfSk7CiAgICB9CiAgICBwYWlyTGluZXNFbC5hcHBlbmRDaGlsZChsaW5lKTsKICB9Cn0KZnVuY3Rpb24gcDFSZXZlYWwoKXsKICBkcmF3UDFMaW5lcyh7c2hvd0NvcnJlY3Q6dHJ1ZX0pOwogICQkKCcucGFpci1uYW1lJyxwYWlyTmFtZXNFbCkuZm9yRWFjaChmdW5jdGlvbihlbCl7ZWwuc3R5bGUub3BhY2l0eT0nLjcnO2VsLnN0eWxlLnBvaW50ZXJFdmVudHM9J25vbmUnO30pOwogICQkKCcudGd0JyxwYWlyVGFyZ2V0c0VsKS5mb3JFYWNoKGZ1bmN0aW9uKGVsKXtpZighZWwuY2xhc3NMaXN0LmNvbnRhaW5zKCdleGFtcGxlJykpZWwuc3R5bGUucG9pbnRlckV2ZW50cz0nbm9uZSc7fSk7Cn0KZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3AxQ2xlYXInKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsZnVuY3Rpb24oKXsKICBpZighY29uZmlybSgnQ2xlYXIgYWxsIHlvdXIgUGFydCAxIGxpbmVzPycpKXJldHVybjsKICBQMV91c2VyTWF0Y2hlcz17fTsKICAkJCgnLnBhaXItbmFtZScscGFpck5hbWVzRWwpLmZvckVhY2goZnVuY3Rpb24oeCl7eC5jbGFzc0xpc3QucmVtb3ZlKCdtYXRjaGVkJywnc2VsZWN0ZWQnKX0pOwogIGRyYXdQMUxpbmVzKCk7IHVwZGF0ZVByb2dyZXNzKCk7Cn0pOwp3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJyxmdW5jdGlvbigpe2RyYXdQMUxpbmVzKCl9KTsKcmVuZGVyUDFOYW1lcygpOyByZW5kZXJQMVRhcmdldHMoKTsKcGFpckltZy5hZGRFdmVudExpc3RlbmVyKCdsb2FkJyxmdW5jdGlvbigpe2RyYXdQMUxpbmVzKCl9KTsKc2V0VGltZW91dChkcmF3UDFMaW5lcywyMDApOwpzZXRUaW1lb3V0KGRyYXdQMUxpbmVzLDgwMCk7CgovKiA9PT09PSBQQVJUIDIg4oCUIElOUFVUIEJMQU5LUyA9PT09PSAqLwooZnVuY3Rpb24oKXsKICB2YXIgZXhhbXBsZXNFbD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncDJFeGFtcGxlcycpOwogIFAyX0VYQU1QTEVTLmZvckVhY2goZnVuY3Rpb24oZXgpewogICAgZXhhbXBsZXNFbC5pbnNlcnRBZGphY2VudEhUTUwoJ2JlZm9yZWVuZCcsCiAgICAgICc8ZGl2IGNsYXNzPSJmb3JtLXJvdyBleGFtcGxlIj48bGFiZWw+Jytlc2MoZXgubGFiZWwpKycgPHNwYW4gY2xhc3M9ImV4LXRhZyI+RXg8L3NwYW4+PC9sYWJlbD48c3BhbiBzdHlsZT0iY29sb3I6IzdCNUIwMDtmb250LXdlaWdodDo3MDAiPicrZXNjKGV4LmRpc3BsYXkpKyc8L3NwYW4+PC9kaXY+Jyk7CiAgfSk7CiAgdmFyIHF1ZXN0RWw9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3AyUXVlc3Rpb25zJyk7CiAgUDJfUVVFU1RJT05TLmZvckVhY2goZnVuY3Rpb24ocSl7CiAgICB2YXIgcHJlZml4SHRtbD1xLnByZWZpeD9lc2MocS5wcmVmaXgpKycgJzonJzsKICAgIHZhciBzdWZmaXhIdG1sPXEuc3VmZml4PycgJytlc2MocS5zdWZmaXgpOicnOwogICAgcXVlc3RFbC5pbnNlcnRBZGphY2VudEhUTUwoJ2JlZm9yZWVuZCcsCiAgICAgICc8ZGl2IGNsYXNzPSJmb3JtLXJvdyI+PGxhYmVsPjxiPicrcS5uKycuPC9iPiAnK2VzYyhxLmxhYmVsKSsnPC9sYWJlbD4nKwogICAgICAnPHNwYW4gc3R5bGU9ImRpc3BsYXk6aW5saW5lLWZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2dhcDo0cHgiPicrcHJlZml4SHRtbCsKICAgICAgJzxpbnB1dCBjbGFzcz0iaW5wdXQtYmxhbmsiIGRhdGEtcT0iJytxLm4rJyIgdHlwZT0idGV4dCIgcGxhY2Vob2xkZXI9Ii4uLiI+JytzdWZmaXhIdG1sKyc8L3NwYW4+JysKICAgICAgJzxidXR0b24gY2xhc3M9InNob3ctYW5zLWJ0biIgZGF0YS1zaG93PSInK3EubisnIj7wn5GBIFNob3c8L2J1dHRvbj48L2Rpdj4nKTsKICB9KTsKfSkoKTsKCi8qID09PT09IFBBUlQgMyDigJQgTUFUQ0ggREFZUyA9PT09PSAqLwp2YXIgUDNfc2VsZWN0ZWREYXk9bnVsbDsKdmFyIFAzX3VzZXJEYXlzPXt9OyAvLyB7cGljS2V5OiBkYXl9CihmdW5jdGlvbigpewogIHZhciBiYW5rPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkYXlCYW5rJyk7CiAgUDNfREFZUy5mb3JFYWNoKGZ1bmN0aW9uKGRheSl7CiAgICB2YXIgaXNFeCA9IFAzX1BJQ1Muc29tZShmdW5jdGlvbihwKXtyZXR1cm4gcC5pc0V4YW1wbGUmJnAuZGF5PT09ZGF5fSk7CiAgICB2YXIgY2hpcD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdidXR0b24nKTsKICAgIGNoaXAudHlwZT0nYnV0dG9uJzsKICAgIGNoaXAuY2xhc3NOYW1lPSdkYXktY2hpcCcrKGlzRXg\/JyBleGFtcGxlJzonJyk7CiAgICBjaGlwLmRhdGFzZXQuZGF5PWRheTsKICAgIGNoaXAudGV4dENvbnRlbnQ9ZGF5Kyhpc0V4PycgKEV4KSc6JycpOwogICAgaWYoIWlzRXgpewogICAgICBjaGlwLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxmdW5jdGlvbigpewogICAgICAgICQkKCcuZGF5LWNoaXAnLGJhbmspLmZvckVhY2goZnVuY3Rpb24oYyl7Yy5jbGFzc0xpc3QucmVtb3ZlKCdzZWxlY3RlZCcpfSk7CiAgICAgICAgaWYoUDNfc2VsZWN0ZWREYXk9PT1kYXkpe1AzX3NlbGVjdGVkRGF5PW51bGw7fQogICAgICAgIGVsc2V7Y2hpcC5jbGFzc0xpc3QuYWRkKCdzZWxlY3RlZCcpO1AzX3NlbGVjdGVkRGF5PWRheTt9CiAgICAgIH0pOwogICAgfQogICAgYmFuay5hcHBlbmRDaGlsZChjaGlwKTsKICB9KTsKICB2YXIgZ3JpZD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWF0Y2hHcmlkJyk7CiAgUDNfUElDUy5mb3JFYWNoKGZ1bmN0aW9uKHApewogICAgdmFyIGNhcmQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICBjYXJkLmNsYXNzTmFtZT0nbWF0Y2gtY2FyZCcrKHAuaXNFeGFtcGxlPycgZXhhbXBsZSc6JycpOwogICAgY2FyZC5kYXRhc2V0LmtleT1wLmtleTsKICAgIGNhcmQuaW5uZXJIVE1MPSc8aW1nIHNyYz0iJytwLmltZysnIiBhbHQ9IicrZXNjKHAuYWx0KSsnIiBsb2FkaW5nPSJsYXp5IiBkcmFnZ2FibGU9ImZhbHNlIj4nKwogICAgICAnPGRpdiBjbGFzcz0ibWMtZm9vdCI+PHNwYW4gY2xhc3M9Im1jLW51bSI+Jytlc2MoU3RyaW5nKHAubikpKyc8L3NwYW4+JysKICAgICAgJzxzcGFuIGNsYXNzPSJtYy1kYXknKyhwLmlzRXhhbXBsZT8nIHNldCc6JycpKyciIGRhdGEtZGF5Zm9yPSInK3Aua2V5KyciPicrKHAuaXNFeGFtcGxlP2VzYyhwLmRheSk6JyZtZGFzaDsnKSsnPC9zcGFuPjwvZGl2PicrCiAgICAgICc8ZGl2IGNsYXNzPSJtYy1mYiI+PC9kaXY+JzsKICAgIGlmKCFwLmlzRXhhbXBsZSl7CiAgICAgIGNhcmQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLGZ1bmN0aW9uKGUpewogICAgICAgIHZhciBkYXlFbD1jYXJkLnF1ZXJ5U2VsZWN0b3IoJy5tYy1kYXknKTsKICAgICAgICAvLyBjbGljayBvbiBhc3NpZ25lZCBiYWRnZSAtPiByZW1vdmUKICAgICAgICBpZihlLnRhcmdldD09PWRheUVsICYmIFAzX3VzZXJEYXlzW3Aua2V5XSl7CiAgICAgICAgICB2YXIgcm09UDNfdXNlckRheXNbcC5rZXldOwogICAgICAgICAgZGVsZXRlIFAzX3VzZXJEYXlzW3Aua2V5XTsKICAgICAgICAgIGRheUVsLnRleHRDb250ZW50PSfigJQnOyBkYXlFbC5jbGFzc0xpc3QucmVtb3ZlKCdzZXQnKTsKICAgICAgICAgIHZhciBjPWJhbmsucXVlcnlTZWxlY3RvcignW2RhdGEtZGF5PSInK3JtKyciXScpOyBpZihjKWMuY2xhc3NMaXN0LnJlbW92ZSgndXNlZCcpOwogICAgICAgICAgdXBkYXRlUHJvZ3Jlc3MoKTsgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBpZighUDNfc2VsZWN0ZWREYXkpcmV0dXJuOwogICAgICAgIC8vIHVuYXNzaWduIGV4aXN0aW5nIG9uIHRoaXMgY2FyZAogICAgICAgIGlmKFAzX3VzZXJEYXlzW3Aua2V5XSl7CiAgICAgICAgICB2YXIgb2xkPVAzX3VzZXJEYXlzW3Aua2V5XTsKICAgICAgICAgIHZhciBvYz1iYW5rLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLWRheT0iJytvbGQrJyJdJyk7IGlmKG9jKW9jLmNsYXNzTGlzdC5yZW1vdmUoJ3VzZWQnKTsKICAgICAgICB9CiAgICAgICAgUDNfdXNlckRheXNbcC5rZXldPVAzX3NlbGVjdGVkRGF5OwogICAgICAgIGRheUVsLnRleHRDb250ZW50PVAzX3NlbGVjdGVkRGF5OyBkYXlFbC5jbGFzc0xpc3QuYWRkKCdzZXQnKTsKICAgICAgICB2YXIgY2hpcD1iYW5rLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLWRheT0iJytQM19zZWxlY3RlZERheSsnIl0nKTsKICAgICAgICBpZihjaGlwKXtjaGlwLmNsYXNzTGlzdC5yZW1vdmUoJ3NlbGVjdGVkJyk7Y2hpcC5jbGFzc0xpc3QuYWRkKCd1c2VkJyk7fQogICAgICAgIFAzX3NlbGVjdGVkRGF5PW51bGw7CiAgICAgICAgdXBkYXRlUHJvZ3Jlc3MoKTsKICAgICAgfSk7CiAgICB9CiAgICBncmlkLmFwcGVuZENoaWxkKGNhcmQpOwogIH0pOwp9KSgpOwpmdW5jdGlvbiBwM1JldmVhbCgpewogIHZhciBiYW5rPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkYXlCYW5rJyk7CiAgUDNfUElDUy5mb3JFYWNoKGZ1bmN0aW9uKHApewogICAgaWYocC5pc0V4YW1wbGUpcmV0dXJuOwogICAgUDNfdXNlckRheXNbcC5rZXldPXAuZGF5OwogICAgdmFyIGNhcmQ9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLm1hdGNoLWNhcmRbZGF0YS1rZXk9IicrcC5rZXkrJyJdJyk7CiAgICB2YXIgZGF5RWw9Y2FyZC5xdWVyeVNlbGVjdG9yKCcubWMtZGF5Jyk7CiAgICBkYXlFbC50ZXh0Q29udGVudD1wLmRheTsgZGF5RWwuY2xhc3NMaXN0LmFkZCgnc2V0Jyk7CiAgICBjYXJkLmNsYXNzTGlzdC5hZGQoJ2NvcnJlY3QnKTsKICAgIGNhcmQucXVlcnlTZWxlY3RvcignLm1jLWZiJykudGV4dENvbnRlbnQ9J0Fuc3dlcjogJytwLmRheTsKICAgIGNhcmQuc3R5bGUucG9pbnRlckV2ZW50cz0nbm9uZSc7CiAgfSk7CiAgJCQoJy5kYXktY2hpcCcsYmFuaykuZm9yRWFjaChmdW5jdGlvbihjKXtpZighYy5jbGFzc0xpc3QuY29udGFpbnMoJ2V4YW1wbGUnKSljLmNsYXNzTGlzdC5hZGQoJ3VzZWQnKX0pOwogIHVwZGF0ZVByb2dyZXNzKCk7Cn0KZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3AzQ2xlYXInKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsZnVuY3Rpb24oKXsKICBpZighY29uZmlybSgnQ2xlYXIgYWxsIHlvdXIgUGFydCAzIG1hdGNoZXM\/JykpcmV0dXJuOwogIFAzX3VzZXJEYXlzPXt9OwogICQkKCcubWF0Y2gtY2FyZCcpLmZvckVhY2goZnVuY3Rpb24oY2FyZCl7CiAgICBpZihjYXJkLmNsYXNzTGlzdC5jb250YWlucygnZXhhbXBsZScpKXJldHVybjsKICAgIGNhcmQuY2xhc3NMaXN0LnJlbW92ZSgnY29ycmVjdCcsJ3dyb25nJyk7CiAgICB2YXIgZD1jYXJkLnF1ZXJ5U2VsZWN0b3IoJy5tYy1kYXknKTsgZC50ZXh0Q29udGVudD0n4oCUJzsgZC5jbGFzc0xpc3QucmVtb3ZlKCdzZXQnKTsKICAgIGNhcmQucXVlcnlTZWxlY3RvcignLm1jLWZiJykudGV4dENvbnRlbnQ9Jyc7CiAgICBjYXJkLnN0eWxlLnBvaW50ZXJFdmVudHM9Jyc7CiAgfSk7CiAgJCQoJy5kYXktY2hpcCcpLmZvckVhY2goZnVuY3Rpb24oYyl7aWYoIWMuY2xhc3NMaXN0LmNvbnRhaW5zKCdleGFtcGxlJykpYy5jbGFzc0xpc3QucmVtb3ZlKCd1c2VkJywnc2VsZWN0ZWQnKX0pOwogIFAzX3NlbGVjdGVkRGF5PW51bGw7CiAgdXBkYXRlUHJvZ3Jlc3MoKTsKfSk7CgovKiA9PT09PSBQQVJUIDQg4oCUIFBJQ1RVUkUgTUNRID09PT09ICovCihmdW5jdGlvbigpewogIHZhciBsaXN0PWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwYXJ0NExpc3QnKTsKICB2YXIgZXhIdG1sPSc8ZGl2IGNsYXNzPSJxLWl0ZW0gcmV2ZWFsZWQiIHN0eWxlPSJvcGFjaXR5Oi44NSI+PGRpdiBjbGFzcz0icS10ZXh0Ij48YiBjbGFzcz0icW4iPkV4LjwvYj48c3Bhbj4nK2VzYyhQNF9FWEFNUExFX01DUS5xKSsnICZtZGFzaDsgYW5zd2VyOiA8Yj4nK2VzYyhQNF9FWEFNUExFX01DUS5hbnMpKyc8L2I+PC9zcGFuPjwvZGl2PjxkaXYgY2xhc3M9InBpYy1tY3EiPic7CiAgUDRfRVhBTVBMRV9NQ1Eub3B0cy5mb3JFYWNoKGZ1bmN0aW9uKG8pewogICAgdmFyIHNlbD1vLmlzQW5zd2VyPycgc2VsZWN0ZWQgY29ycmVjdC1vcHQnOicnOwogICAgZXhIdG1sKz0nPGRpdiBjbGFzcz0icGljLW9wdCcrc2VsKyciPjxpbWcgc3JjPSInK28uaW1nKyciIGFsdD0iZXhhbXBsZSAnK28ubGV0dGVyKyciPjxkaXYgY2xhc3M9InBpYy1sZXR0ZXIiPjxiPicrby5sZXR0ZXIrJzwvYj48c3BhbiBjbGFzcz0icGljLXRpY2siPicrKG8uaXNBbnN3ZXI\/J+Kckyc6JycpKyc8L3NwYW4+PC9kaXY+PC9kaXY+JzsKICB9KTsKICBleEh0bWwrPSc8L2Rpdj48L2Rpdj4nOwogIGxpc3QuaW5zZXJ0QWRqYWNlbnRIVE1MKCdiZWZvcmVlbmQnLGV4SHRtbCk7CiAgUDRfTUNRLmZvckVhY2goZnVuY3Rpb24ocSl7CiAgICB2YXIgaD0nPGRpdiBjbGFzcz0icS1pdGVtIiBpZD0icScrcS5uKyciIGRhdGEtcWlkPSInK3EubisnIj48ZGl2IGNsYXNzPSJxLXRleHQiPjxiIGNsYXNzPSJxbiI+JytxLm4rJy48L2I+PHNwYW4+Jytlc2MocS5xKSsnPC9zcGFuPjwvZGl2PjxkaXYgY2xhc3M9InBpYy1tY3EiPic7CiAgICBxLm9wdHMuZm9yRWFjaChmdW5jdGlvbihvKXsKICAgICAgaCs9JzxkaXYgY2xhc3M9InBpYy1vcHQiIGRhdGEtbGV0dGVyPSInK28ubGV0dGVyKyciIGRhdGEtcT0iJytxLm4rJyI+PGltZyBzcmM9Iicrby5pbWcrJyIgYWx0PSJRJytxLm4rJyBvcHRpb24gJytvLmxldHRlcisnIiBsb2FkaW5nPSJsYXp5Ij48ZGl2IGNsYXNzPSJwaWMtbGV0dGVyIj48Yj4nK28ubGV0dGVyKyc8L2I+PHNwYW4gY2xhc3M9InBpYy10aWNrIj7inJM8L3NwYW4+PC9kaXY+PC9kaXY+JzsKICAgIH0pOwogICAgaCs9JzwvZGl2PjxkaXYgY2xhc3M9ImZlZWRiYWNrIj48L2Rpdj48ZGl2IGNsYXNzPSJxLWJvdHRvbSI+PGJ1dHRvbiBjbGFzcz0ic2hvdy1hbnMtYnRuIiBkYXRhLXNob3c9IicrcS5uKyciPvCfkYEgU2hvdyBBbnN3ZXI8L2J1dHRvbj48L2Rpdj48L2Rpdj4nOwogICAgbGlzdC5pbnNlcnRBZGphY2VudEhUTUwoJ2JlZm9yZWVuZCcsaCk7CiAgfSk7CiAgJCQoJy5waWMtb3B0W2RhdGEtcV0nKS5mb3JFYWNoKGZ1bmN0aW9uKG9wdCl7CiAgICBvcHQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLGZ1bmN0aW9uKCl7CiAgICAgIHZhciBxaWQ9b3B0LmRhdGFzZXQucTsKICAgICAgJCQoJy5waWMtb3B0W2RhdGEtcT0iJytxaWQrJyJdJykuZm9yRWFjaChmdW5jdGlvbihvKXtvLmNsYXNzTGlzdC5yZW1vdmUoJ3NlbGVjdGVkJyl9KTsKICAgICAgb3B0LmNsYXNzTGlzdC5hZGQoJ3NlbGVjdGVkJyk7CiAgICAgIHVwZGF0ZVByb2dyZXNzKCk7CiAgICB9KTsKICB9KTsKfSkoKTsKCi8qID09PT09IFBBUlQgNSDigJQgQ09MT1VSICsgRFJBVyA9PT09PSAqLwp2YXIgUDVfc2VsZWN0ZWRDb2xvdXI9bnVsbDsKdmFyIFA1X3VzZXJDb2xvdXJzPXt9OyAvLyB7cmVnaW9uOiBjb2xvdXJLZXl9CnZhciBQNV9kcmF3RG9uZT17fTsgICAgLy8ge246IHRydWV9CmZ1bmN0aW9uIGdldEhleChrKXt2YXIgYz1QNF9DT0xPVVJTLmZpbmQoZnVuY3Rpb24oeCl7cmV0dXJuIHgua2V5PT09a30pO3JldHVybiBjP2MuaGV4OicjRkZGRkZGJ30KZnVuY3Rpb24gYXBwbHlDb2xvdXJUb1JlZ2lvbihyZWdpb24saGV4KXsKICAkJCgnI2NvbG91clNjZW5lIFtkYXRhLXJlZ2lvbj0iJytyZWdpb24rJyJdJykuZm9yRWFjaChmdW5jdGlvbihlbCl7CiAgICBpZihoZXg9PT0nX19jbGVhcicpeyBlbC5zZXRBdHRyaWJ1dGUoJ2ZpbGwnLCdyZ2JhKDAsMCwwLDAuMDAxKScpOyBlbC5zdHlsZS5maWxsT3BhY2l0eT0nJzsgfQogICAgZWxzZSB7IGVsLnNldEF0dHJpYnV0ZSgnZmlsbCcsaGV4KTsgZWwuc3R5bGUuZmlsbE9wYWNpdHk9JzAuNzInOyB9CiAgfSk7Cn0KKGZ1bmN0aW9uKCl7CiAgdmFyIHBhbD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29sb3VyUGFsZXR0ZScpOwogIHZhciBlcj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICBlci5jbGFzc05hbWU9J3N3YXRjaCBlcmFzZXInOyBlci5kYXRhc2V0LmNvbG91cj0nX19lcmFzZSc7CiAgZXIuaW5uZXJIVE1MPSc8c3BhbiBjbGFzcz0ic3ctbGFiZWwiPmVyYXNlcjwvc3Bhbj4nOwogIGVyLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxmdW5jdGlvbigpe3NlbGVjdFN3YXRjaChlciwnX19lcmFzZScpfSk7CiAgcGFsLmFwcGVuZENoaWxkKGVyKTsKICBQNF9DT0xPVVJTLmZvckVhY2goZnVuY3Rpb24oYyl7CiAgICB2YXIgc2dsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogICAgc2dsLmNsYXNzTmFtZT0nc3dhdGNoJzsgc2dsLnN0eWxlLmJhY2tncm91bmQ9Yy5oZXg7IHNnbC5kYXRhc2V0LmNvbG91cj1jLmtleTsKICAgIHNnbC5pbm5lckhUTUw9JzxzcGFuIGNsYXNzPSJzdy1sYWJlbCI+JytjLmtleSsnPC9zcGFuPic7CiAgICBzZ2wuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLGZ1bmN0aW9uKCl7c2VsZWN0U3dhdGNoKHNnbCxjLmtleSl9KTsKICAgIHBhbC5hcHBlbmRDaGlsZChzZ2wpOwogIH0pOwogIGZ1bmN0aW9uIHNlbGVjdFN3YXRjaChlbCxrZXkpewogICAgJCQoJy5zd2F0Y2gnLHBhbCkuZm9yRWFjaChmdW5jdGlvbih4KXt4LmNsYXNzTGlzdC5yZW1vdmUoJ3NlbGVjdGVkJyl9KTsKICAgIGVsLmNsYXNzTGlzdC5hZGQoJ3NlbGVjdGVkJyk7IFA1X3NlbGVjdGVkQ29sb3VyPWtleTsKICB9CiAgLy8gaW5zdHJ1Y3Rpb25zCiAgdmFyIGlucz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29sb3VySW5zdHJ1Y3Rpb25zJyk7CiAgaW5zLmluc2VydEFkamFjZW50SFRNTCgnYmVmb3JlZW5kJywKICAgICc8ZGl2IGNsYXNzPSJjb2wtaW5zIGV4YW1wbGUiPjxzcGFuIGNsYXNzPSJjaS1udW0iPkV4PC9zcGFuPjxzcGFuPicrZXNjKFA1X0VYQU1QTEVfTk9URSkrJzwvc3Bhbj48c3BhbiBjbGFzcz0iY2ktZG90IiBzdHlsZT0iYmFja2dyb3VuZDojM0I4MkY2Ij48L3NwYW4+PC9kaXY+Jyk7CiAgUDVfSVRFTVMuZm9yRWFjaChmdW5jdGlvbihpdCl7CiAgICBpZihpdC50eXBlPT09J3dyaXRlJyl7CiAgICAgIGlucy5pbnNlcnRBZGphY2VudEhUTUwoJ2JlZm9yZWVuZCcsCiAgICAgICAgJzxkaXYgY2xhc3M9ImNvbC1pbnMgd3JpdGUtaW5zIiBkYXRhLXFuPSInK2l0Lm4rJyI+PHNwYW4gY2xhc3M9ImNpLW51bSI+JytpdC5uKyc8L3NwYW4+PHNwYW4+XHUyNzBEXHVGRTBGICcrZXNjKGl0Lmluc3RydWN0aW9uKSsnPC9zcGFuPicrCiAgICAgICAgJzxzcGFuIHN0eWxlPSJtYXJnaW4tbGVmdDphdXRvO2Rpc3BsYXk6aW5saW5lLWZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2dhcDo2cHgiPicrKGl0LnByZWZpeD9lc2MoaXQucHJlZml4KSsnICc6JycpKwogICAgICAgICc8aW5wdXQgY2xhc3M9ImlucHV0LWJsYW5rIiBkYXRhLXE9IicraXQubisnIiB0eXBlPSJ0ZXh0IiBwbGFjZWhvbGRlcj0iLi4uIiBzdHlsZT0ibWluLXdpZHRoOjExMHB4Ij4nKwogICAgICAgICc8L3NwYW4+PGJ1dHRvbiBjbGFzcz0ic2hvdy1hbnMtYnRuIiBkYXRhLXNob3c9IicraXQubisnIj5cdUQ4M0RcdURDNDEgU2hvdzwvYnV0dG9uPjwvZGl2PicpOwogICAgICByZXR1cm47CiAgICB9CiAgICBpZihpdC50eXBlPT09J2RyYXcnKXsKICAgICAgaW5zLmluc2VydEFkamFjZW50SFRNTCgnYmVmb3JlZW5kJywKICAgICAgICAnPGRpdiBjbGFzcz0iY29sLWlucyBkcmF3LWlucyIgZGF0YS1xbj0iJytpdC5uKyciPjxzcGFuIGNsYXNzPSJjaS1udW0iPicraXQubisnPC9zcGFuPjxzcGFuPuKcj++4jyAnK2VzYyhpdC5pbnN0cnVjdGlvbikrJzwvc3Bhbj4nKwogICAgICAgICc8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImRyYXctY2hlY2siIGRhdGEtZHJhd249IicraXQubisnIj7imJAgSSBkcmV3IGl0IDxzbWFsbD4oc2VsZi1jaGVjayk8L3NtYWxsPjwvYnV0dG9uPjwvZGl2PicpOwogICAgfSBlbHNlIHsKICAgICAgdmFyIGRvdHM9Jyc7CiAgICAgIHZhciByZWdzID0gaXQudHlwZT09PSdjb2xvdXIyJyA\/IGl0LnJlZ2lvbnMgOiBbe3JlZ2lvbjppdC5yZWdpb24sY29sb3VyOml0LmNvbG91cn1dOwogICAgICByZWdzLmZvckVhY2goZnVuY3Rpb24ocil7IGRvdHMrPSc8c3BhbiBjbGFzcz0iY2ktZG90IiBkYXRhLWRvdGZvcj0iJytyLnJlZ2lvbisnIiBzdHlsZT0iYmFja2dyb3VuZDojZmZmIj48L3NwYW4+JzsgfSk7CiAgICAgIGlucy5pbnNlcnRBZGphY2VudEhUTUwoJ2JlZm9yZWVuZCcsCiAgICAgICAgJzxkaXYgY2xhc3M9ImNvbC1pbnMiIGRhdGEtcW49IicraXQubisnIj48c3BhbiBjbGFzcz0iY2ktbnVtIj4nK2l0Lm4rJzwvc3Bhbj48c3Bhbj4nK2VzYyhpdC5pbnN0cnVjdGlvbikrJzwvc3Bhbj48c3BhbiBjbGFzcz0iY2ktZG90cyI+Jytkb3RzKyc8L3NwYW4+PC9kaXY+Jyk7CiAgICB9CiAgfSk7CiAgLy8gZHJhdyBjaGVja3MKICAkJCgnLmRyYXctY2hlY2snKS5mb3JFYWNoKGZ1bmN0aW9uKGJ0bil7CiAgICBidG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLGZ1bmN0aW9uKCl7CiAgICAgIHZhciBuPWJ0bi5kYXRhc2V0LmRyYXduOwogICAgICBQNV9kcmF3RG9uZVtuXT0hUDVfZHJhd0RvbmVbbl07CiAgICAgIGJ0bi5jbGFzc0xpc3QudG9nZ2xlKCdvbicsISFQNV9kcmF3RG9uZVtuXSk7CiAgICAgIGJ0bi5pbm5lckhUTUw9KFA1X2RyYXdEb25lW25dPyfimJEnOifimJAnKSsnIEkgZHJldyBpdCA8c21hbGw+KHNlbGYtY2hlY2spPC9zbWFsbD4nOwogICAgICB1cGRhdGVQcm9ncmVzcygpOwogICAgfSk7CiAgfSk7CiAgLy8gd2lyZSByZWdpb25zCiAgJCQoJyNjb2xvdXJTY2VuZSBbZGF0YS1yZWdpb25dJykuZm9yRWFjaChmdW5jdGlvbihyZWcpewogICAgcmVnLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxmdW5jdGlvbigpewogICAgICBpZighUDVfc2VsZWN0ZWRDb2xvdXIpe2FsZXJ0KCdQbGVhc2UgcGljayBhIGNvbG91ciBmaXJzdCDwn46oJyk7cmV0dXJufQogICAgICB2YXIgcmtleT1yZWcuZGF0YXNldC5yZWdpb247CiAgICAgIGlmKFA1X3NlbGVjdGVkQ29sb3VyPT09J19fZXJhc2UnKXsKICAgICAgICBhcHBseUNvbG91clRvUmVnaW9uKHJrZXksJ19fY2xlYXInKTsgZGVsZXRlIFA1X3VzZXJDb2xvdXJzW3JrZXldOwogICAgICB9IGVsc2UgewogICAgICAgIGFwcGx5Q29sb3VyVG9SZWdpb24ocmtleSxnZXRIZXgoUDVfc2VsZWN0ZWRDb2xvdXIpKTsgUDVfdXNlckNvbG91cnNbcmtleV09UDVfc2VsZWN0ZWRDb2xvdXI7CiAgICAgIH0KICAgICAgdmFyIGRvdD1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1kb3Rmb3I9IicrcmtleSsnIl0nKTsKICAgICAgaWYoZG90KWRvdC5zdHlsZS5iYWNrZ3JvdW5kPShQNV9zZWxlY3RlZENvbG91cj09PSdfX2VyYXNlJz8nI2ZmZic6Z2V0SGV4KFA1X3NlbGVjdGVkQ29sb3VyKSk7CiAgICAgIHVwZGF0ZVByb2dyZXNzKCk7CiAgICB9KTsKICB9KTsKfSkoKTsKZnVuY3Rpb24gcDVSZXZlYWwoKXsKICBQNV9JVEVNUy5mb3JFYWNoKGZ1bmN0aW9uKGl0KXsKICAgIGlmKGl0LnR5cGU9PT0nZHJhdycpewogICAgICB2YXIgcm93PWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5kcmF3LWluc1tkYXRhLXFuPSInK2l0Lm4rJyJdJyk7CiAgICAgIGlmKHJvdylyb3cuY2xhc3NMaXN0LmFkZCgncmV2ZWFsZWQnKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgaWYoaXQudHlwZT09PSd3cml0ZScpewogICAgICB2YXIgZWw9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmlucHV0LWJsYW5rW2RhdGEtcT0iJytpdC5uKyciXScpOwogICAgICBpZihlbCl7ZWwudmFsdWU9aXQuZGlzcGxheTtlbC5jbGFzc0xpc3QuYWRkKCdyZXZlYWxlZCcpO30KICAgICAgdmFyIHJvdzI9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLndyaXRlLWluc1tkYXRhLXFuPSInK2l0Lm4rJyJdJyk7CiAgICAgIGlmKHJvdzIpcm93Mi5jbGFzc0xpc3QuYWRkKCdyZXZlYWxlZCcpOwogICAgICByZXR1cm47CiAgICB9CiAgICB2YXIgcmVncyA9IGl0LnR5cGU9PT0nY29sb3VyMicgPyBpdC5yZWdpb25zIDogW3tyZWdpb246aXQucmVnaW9uLGNvbG91cjppdC5jb2xvdXJ9XTsKICAgIHJlZ3MuZm9yRWFjaChmdW5jdGlvbihyKXsKICAgICAgYXBwbHlDb2xvdXJUb1JlZ2lvbihyLnJlZ2lvbixnZXRIZXgoci5jb2xvdXIpKTsKICAgICAgUDVfdXNlckNvbG91cnNbci5yZWdpb25dPXIuY29sb3VyOwogICAgICB2YXIgZG90PWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLWRvdGZvcj0iJytyLnJlZ2lvbisnIl0nKTsKICAgICAgaWYoZG90KWRvdC5zdHlsZS5iYWNrZ3JvdW5kPWdldEhleChyLmNvbG91cik7CiAgICB9KTsKICAgIHZhciBpbnNSb3c9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmNvbC1pbnNbZGF0YS1xbj0iJytpdC5uKyciXScpOwogICAgaWYoaW5zUm93KWluc1Jvdy5jbGFzc0xpc3QuYWRkKCdyZXZlYWxlZCcpOwogIH0pOwogICQkKCcuc3dhdGNoJykuZm9yRWFjaChmdW5jdGlvbihzdyl7c3cuc3R5bGUucG9pbnRlckV2ZW50cz0nbm9uZSc7c3cuc3R5bGUub3BhY2l0eT0nLjYnfSk7CiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3A1QW5zd2VyQm94Jykuc3R5bGUuZGlzcGxheT0nYmxvY2snOwogIHVwZGF0ZVByb2dyZXNzKCk7Cn0KZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3A1Q2xlYXInKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsZnVuY3Rpb24oKXsKICBpZighY29uZmlybSgnQ2xlYXIgYWxsIHlvdXIgUGFydCA1IGNvbG91cnM\/JykpcmV0dXJuOwogIE9iamVjdC5rZXlzKFA1X3VzZXJDb2xvdXJzKS5mb3JFYWNoKGZ1bmN0aW9uKHIpe2FwcGx5Q29sb3VyVG9SZWdpb24ociwnX19jbGVhcicpfSk7CiAgUDVfdXNlckNvbG91cnM9e307CiAgJCQoJy5jaS1kb3RbZGF0YS1kb3Rmb3JdJykuZm9yRWFjaChmdW5jdGlvbihkKXtkLnN0eWxlLmJhY2tncm91bmQ9JyNmZmYnfSk7CiAgdXBkYXRlUHJvZ3Jlc3MoKTsKfSk7CgovKiA9PT09PSBQUk9HUkVTUyAvIFNIT1cgLyBTVUJNSVQgPT09PT0gKi8KZnVuY3Rpb24gYW5zd2VyZWQoKXsKICB2YXIgbj0wOwogIFAxX05BTUVTLmZvckVhY2goZnVuY3Rpb24obm0peyBpZihubS5pc0V4YW1wbGV8fG5tLmRpc3RyYWN0b3IpcmV0dXJuOyBpZihQMV91c2VyTWF0Y2hlc1tubS5uXSluKys7IH0pOwogIFAyX1FVRVNUSU9OUy5mb3JFYWNoKGZ1bmN0aW9uKHEpewogICAgdmFyIGVsPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5pbnB1dC1ibGFua1tkYXRhLXE9IicrcS5uKyciXScpOwogICAgaWYoZWwmJmVsLnZhbHVlLnRyaW0oKSE9PScnKW4rKzsKICB9KTsKICBQM19QSUNTLmZvckVhY2goZnVuY3Rpb24ocCl7IGlmKHAuaXNFeGFtcGxlKXJldHVybjsgaWYoUDNfdXNlckRheXNbcC5rZXldKW4rKzsgfSk7CiAgUDRfTUNRLmZvckVhY2goZnVuY3Rpb24ocSl7CiAgICBpZihkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcucGljLW9wdC5zZWxlY3RlZFtkYXRhLXE9IicrcS5uKyciXScpKW4rKzsKICB9KTsKICBQNV9JVEVNUy5mb3JFYWNoKGZ1bmN0aW9uKGl0KXsKICAgIGlmKGl0LnR5cGU9PT0nZHJhdycpeyBpZihQNV9kcmF3RG9uZVtpdC5uXSluKys7IHJldHVybjsgfQogICAgaWYoaXQudHlwZT09PSd3cml0ZScpeyB2YXIgZWw9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmlucHV0LWJsYW5rW2RhdGEtcT0iJytpdC5uKyciXScpOyBpZihlbCYmZWwudmFsdWUudHJpbSgpIT09JycpbisrOyByZXR1cm47IH0KICAgIHZhciByZWdzPWl0LnR5cGU9PT0nY29sb3VyMic\/aXQucmVnaW9uczpbe3JlZ2lvbjppdC5yZWdpb259XTsKICAgIGlmKHJlZ3MuZXZlcnkoZnVuY3Rpb24ocil7cmV0dXJuIFA1X3VzZXJDb2xvdXJzW3IucmVnaW9uXX0pKW4rKzsKICB9KTsKICByZXR1cm4gbjsKfQpmdW5jdGlvbiB1cGRhdGVQcm9ncmVzcygpewogIHZhciBhPWFuc3dlcmVkKCk7CiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Fuc3dlcmVkQ291bnQnKS50ZXh0Q29udGVudD1hOwogIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwcm9nRmlsbCcpLnN0eWxlLndpZHRoPShhL1RPVEFMKjEwMCkrJyUnOwp9CmRvY3VtZW50LmJvZHkuYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLGZ1bmN0aW9uKGUpewogIGlmKGUudGFyZ2V0LmNsYXNzTGlzdCYmZS50YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCdpbnB1dC1ibGFuaycpKXVwZGF0ZVByb2dyZXNzKCk7Cn0pOwpkb2N1bWVudC5ib2R5LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxmdW5jdGlvbihlKXsKICB2YXIgYnRuPWUudGFyZ2V0LmNsb3Nlc3QoJy5zaG93LWFucy1idG4nKTsKICBpZighYnRuKXJldHVybjsKICB2YXIga2V5PWJ0bi5kYXRhc2V0LnNob3c7CiAgaWYoa2V5PT09J1AxQUxMJyl7cDFSZXZlYWwoKTtyZXR1cm47fQogIGlmKGtleT09PSdQM0FMTCcpe3AzUmV2ZWFsKCk7cmV0dXJuO30KICBpZihrZXk9PT0nUDVBTEwnKXtwNVJldmVhbCgpO3JldHVybjt9CiAgdmFyIHFpZD1wYXJzZUludChrZXkpOwogIGlmKHFpZD49NiYmcWlkPD0xMCl7CiAgICB2YXIgcT1QMl9RVUVTVElPTlMuZmluZChmdW5jdGlvbih4KXtyZXR1cm4geC5uPT09cWlkfSk7CiAgICB2YXIgZWw9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmlucHV0LWJsYW5rW2RhdGEtcT0iJytxaWQrJyJdJyk7CiAgICBpZihxJiZlbCl7ZWwudmFsdWU9cS5kaXNwbGF5O2VsLmNsYXNzTGlzdC5hZGQoJ3JldmVhbGVkJyk7dXBkYXRlUHJvZ3Jlc3MoKTt9CiAgfSBlbHNlIGlmKHFpZD49MjEmJnFpZDw9MjUpewogICAgdmFyIHE1PVA1X0lURU1TLmZpbmQoZnVuY3Rpb24oeCl7cmV0dXJuIHgubj09PXFpZCYmeC50eXBlPT09J3dyaXRlJ30pOwogICAgdmFyIGVsNT1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuaW5wdXQtYmxhbmtbZGF0YS1xPSInK3FpZCsnIl0nKTsKICAgIGlmKHE1JiZlbDUpe2VsNS52YWx1ZT1xNS5kaXNwbGF5O2VsNS5jbGFzc0xpc3QuYWRkKCdyZXZlYWxlZCcpO3VwZGF0ZVByb2dyZXNzKCk7fQogIH0gZWxzZSBpZihxaWQ+PTE2JiZxaWQ8PTIwKXsKICAgIHZhciBxND1QNF9NQ1EuZmluZChmdW5jdGlvbih4KXtyZXR1cm4geC5uPT09cWlkfSk7CiAgICB2YXIgaXRlbT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncScrcWlkKTsKICAgIGlmKHE0JiZpdGVtKXsKICAgICAgaXRlbS5jbGFzc0xpc3QuYWRkKCdyZXZlYWxlZCcpOwogICAgICAkJCgnLnBpYy1vcHRbZGF0YS1xPSInK3FpZCsnIl0nLGl0ZW0pLmZvckVhY2goZnVuY3Rpb24obyl7CiAgICAgICAgaWYoby5kYXRhc2V0LmxldHRlcj09PXE0LmFucylvLmNsYXNzTGlzdC5hZGQoJ2NvcnJlY3Qtb3B0Jyk7CiAgICAgIH0pOwogICAgICB2YXIgZmI9aXRlbS5xdWVyeVNlbGVjdG9yKCcuZmVlZGJhY2snKTsKICAgICAgaWYoZmIpZmIudGV4dENvbnRlbnQ9J0Fuc3dlcjogJytxNC5hbnM7CiAgICB9CiAgfQp9KTsKZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N1Ym1pdEJ0bicpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxmdW5jdGlvbigpewogIHZhciBzY29yZT0wLCBwYXJ0cz17MTowLDI6MCwzOjAsNDowLDU6MH07CiAgLy8gUDEKICBQMV9OQU1FUy5mb3JFYWNoKGZ1bmN0aW9uKG5tKXsKICAgIGlmKG5tLmlzRXhhbXBsZXx8bm0uZGlzdHJhY3RvcilyZXR1cm47CiAgICB2YXIgbmFtZUVsPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5wYWlyLW5hbWVbZGF0YS1uPSInK25tLm4rJyJdJyk7CiAgICBpZihQMV91c2VyTWF0Y2hlc1tubS5uXT09PW5tLmFucyl7CiAgICAgIHNjb3JlKys7cGFydHNbMV0rKzsKICAgICAgaWYobmFtZUVsKXtuYW1lRWwuY2xhc3NMaXN0LmFkZCgnbWF0Y2hlZCcpO25hbWVFbC5zdHlsZS5ib3JkZXJDb2xvcj0ndmFyKC0tZ3JlZW4pJztuYW1lRWwuc3R5bGUuYmFja2dyb3VuZD0ncmdiYSgxNiwxODUsMTI5LC4xMiknO30KICAgIH0gZWxzZSBpZihuYW1lRWwpe25hbWVFbC5zdHlsZS5ib3JkZXJDb2xvcj0ndmFyKC0tcmVkKSc7bmFtZUVsLnN0eWxlLmJhY2tncm91bmQ9J3JnYmEoMjM5LDY4LDY4LC4xMCknO30KICB9KTsKICBkcmF3UDFMaW5lcygpOwogIC8vIFAyCiAgUDJfUVVFU1RJT05TLmZvckVhY2goZnVuY3Rpb24ocSl7CiAgICB2YXIgZWw9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmlucHV0LWJsYW5rW2RhdGEtcT0iJytxLm4rJyJdJyk7CiAgICBpZighZWx8fGVsLmNsYXNzTGlzdC5jb250YWlucygncmV2ZWFsZWQnKSlyZXR1cm47CiAgICB2YXIgdj1lbC52YWx1ZS50cmltKCkudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9bLiwhP10kLywnJykucmVwbGFjZSgvXHMrL2csJyAnKTsKICAgIGlmKHEuYWNjZXB0ZWQuaW5kZXhPZih2KT49MCl7c2NvcmUrKztwYXJ0c1syXSsrO2VsLmNsYXNzTGlzdC5hZGQoJ2NvcnJlY3QnKTt9CiAgICBlbHNle2VsLmNsYXNzTGlzdC5hZGQoJ3dyb25nJyk7ZWwudGl0bGU9J0NvcnJlY3Q6ICcrcS5kaXNwbGF5O30KICB9KTsKICAvLyBQMwogIFAzX1BJQ1MuZm9yRWFjaChmdW5jdGlvbihwKXsKICAgIGlmKHAuaXNFeGFtcGxlKXJldHVybjsKICAgIHZhciBjYXJkPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5tYXRjaC1jYXJkW2RhdGEta2V5PSInK3Aua2V5KyciXScpOwogICAgdmFyIGZiPWNhcmQucXVlcnlTZWxlY3RvcignLm1jLWZiJyk7CiAgICBpZihQM191c2VyRGF5c1twLmtleV09PT1wLmRheSl7CiAgICAgIHNjb3JlKys7cGFydHNbM10rKztjYXJkLmNsYXNzTGlzdC5yZW1vdmUoJ3dyb25nJyk7Y2FyZC5jbGFzc0xpc3QuYWRkKCdjb3JyZWN0Jyk7CiAgICAgIGlmKGZiKWZiLnRleHRDb250ZW50PSdDb3JyZWN0IOKAlCAnK3AuZGF5OwogICAgfSBlbHNlIHsKICAgICAgY2FyZC5jbGFzc0xpc3QucmVtb3ZlKCdjb3JyZWN0Jyk7Y2FyZC5jbGFzc0xpc3QuYWRkKCd3cm9uZycpOwogICAgICBpZihmYilmYi50ZXh0Q29udGVudD0nQ29ycmVjdDogJytwLmRheSsoUDNfdXNlckRheXNbcC5rZXldPycgKHlvdTogJytQM191c2VyRGF5c1twLmtleV0rJyknOicgKG5vIGFuc3dlciknKTsKICAgIH0KICB9KTsKICAvLyBQNAogIFA0X01DUS5mb3JFYWNoKGZ1bmN0aW9uKHEpewogICAgdmFyIGl0ZW09ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3EnK3Eubik7CiAgICBpZighaXRlbSlyZXR1cm47CiAgICB2YXIgc2VsPWl0ZW0ucXVlcnlTZWxlY3RvcignLnBpYy1vcHQuc2VsZWN0ZWQnKTsKICAgIHZhciBsZXR0ZXI9c2VsP3NlbC5kYXRhc2V0LmxldHRlcjpudWxsOwogICAgaXRlbS5jbGFzc0xpc3QuYWRkKCdhbnN3ZXJlZCcpOwogICAgJCQoJy5waWMtb3B0JyxpdGVtKS5mb3JFYWNoKGZ1bmN0aW9uKG8pewogICAgICB2YXIgTD1vLmRhdGFzZXQubGV0dGVyOwogICAgICBpZihMPT09cS5hbnMpby5jbGFzc0xpc3QuYWRkKCdjb3JyZWN0LW9wdCcpOwogICAgICBpZihsZXR0ZXI9PT1MJiZMIT09cS5hbnMpby5jbGFzc0xpc3QuYWRkKCd3cm9uZy1vcHQnKTsKICAgIH0pOwogICAgdmFyIGZiPWl0ZW0ucXVlcnlTZWxlY3RvcignLmZlZWRiYWNrJyk7CiAgICBpZihsZXR0ZXI9PT1xLmFucyl7c2NvcmUrKztwYXJ0c1s0XSsrO2l0ZW0uY2xhc3NMaXN0LmFkZCgnY29ycmVjdCcpO2lmKGZiKWZiLnRleHRDb250ZW50PSdDb3JyZWN0IOKAlCAnK3EuYW5zO30KICAgIGVsc2V7aXRlbS5jbGFzc0xpc3QuYWRkKCd3cm9uZycpO2lmKGZiKWZiLnRleHRDb250ZW50PSdXcm9uZyDigJQgY29ycmVjdDogJytxLmFucysobGV0dGVyPycgKHlvdSBjaG9zZSAnK2xldHRlcisnKSc6JyAobm8gYW5zd2VyKScpO30KICB9KTsKICAvLyBQNQogIFA1X0lURU1TLmZvckVhY2goZnVuY3Rpb24oaXQpewogICAgdmFyIGluc1Jvdz1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuY29sLWluc1tkYXRhLXFuPSInK2l0Lm4rJyJdJyk7CiAgICBpZihpdC50eXBlPT09J3dyaXRlJyl7CiAgICAgIHZhciBlbD1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuaW5wdXQtYmxhbmtbZGF0YS1xPSInK2l0Lm4rJyJdJyk7CiAgICAgIGlmKGVsJiYhZWwuY2xhc3NMaXN0LmNvbnRhaW5zKCdyZXZlYWxlZCcpKXsKICAgICAgICB2YXIgdj1lbC52YWx1ZS50cmltKCkudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9bLiwhP10kLywnJykucmVwbGFjZSgvXHMrL2csJyAnKTsKICAgICAgICBpZihpdC5hY2NlcHRlZC5pbmRleE9mKHYpPj0wKXtzY29yZSsrO3BhcnRzWzVdKys7ZWwuY2xhc3NMaXN0LmFkZCgnY29ycmVjdCcpO2lmKGluc1JvdylpbnNSb3cuY2xhc3NMaXN0LmFkZCgnY29ycmVjdCcpO30KICAgICAgICBlbHNle2VsLmNsYXNzTGlzdC5hZGQoJ3dyb25nJyk7ZWwudGl0bGU9J0NvcnJlY3Q6ICcraXQuZGlzcGxheTtpZihpbnNSb3cpaW5zUm93LmNsYXNzTGlzdC5hZGQoJ3dyb25nJyk7fQogICAgICB9CiAgICAgIHJldHVybjsKICAgIH0KICAgIGlmKGl0LnR5cGU9PT0nZHJhdycpewogICAgICBpZihQNV9kcmF3RG9uZVtpdC5uXSl7c2NvcmUrKztwYXJ0c1s1XSsrO2lmKGluc1JvdylpbnNSb3cuY2xhc3NMaXN0LmFkZCgnY29ycmVjdCcpO30KICAgICAgZWxzZSBpZihpbnNSb3cpaW5zUm93LmNsYXNzTGlzdC5hZGQoJ3dyb25nJyk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIHZhciByZWdzPWl0LnR5cGU9PT0nY29sb3VyMic\/aXQucmVnaW9uczpbe3JlZ2lvbjppdC5yZWdpb24sY29sb3VyOml0LmNvbG91cn1dOwogICAgdmFyIG9rPXJlZ3MuZXZlcnkoZnVuY3Rpb24ocil7cmV0dXJuIFA1X3VzZXJDb2xvdXJzW3IucmVnaW9uXT09PXIuY29sb3VyfSk7CiAgICBpZihvayl7c2NvcmUrKztwYXJ0c1s1XSsrO2lmKGluc1JvdylpbnNSb3cuY2xhc3NMaXN0LmFkZCgnY29ycmVjdCcpO30KICAgIGVsc2UgaWYoaW5zUm93KWluc1Jvdy5jbGFzc0xpc3QuYWRkKCd3cm9uZycpOwogIH0pOwogIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzY29yZU5vdycpLnRleHRDb250ZW50PXNjb3JlOwogIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmaW5hbFNjb3JlJykudGV4dENvbnRlbnQ9c2NvcmU7CiAgdmFyIHBjdD1NYXRoLnJvdW5kKHNjb3JlL1RPVEFMKjEwMCk7CiAgdmFyIG1zZyA9IHBjdD49ODU\/J0V4Y2VsbGVudCEgWW91ciBsaXN0ZW5pbmcgaXMgc3Ryb25nLicKICAgICAgICAgIDogcGN0Pj03MD8nR29vZCBqb2IhIEEgZmV3IG1vcmUgdGVzdHMgYW5kIHlvdSB3aWxsIGJlIHJlYWR5LicKICAgICAgICAgIDogcGN0Pj01MD8nS2VlcCBwcmFjdGlzaW5nIOKAlCByZS1saXN0ZW4gdG8gdGhlIHBhcnRzIHdoZXJlIHlvdSBtaXNzZWQgYW5zd2Vycy4nCiAgICAgICAgICA6ICdUcnkgc2xvd2luZyB0aGUgYXVkaW8gYW5kIHVzZSB0aGUgdHJhbnNjcmlwdCB0byBzdHVkeS4nOwogIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZXN1bHRzTXNnJykudGV4dENvbnRlbnQ9bXNnOwogIHZhciBzcD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2NvcmVQYXJ0cycpOwogIHNwLmlubmVySFRNTD0nJzsKICBbJ1BhaXInLCdXcml0ZScsJ01hdGNoJywnVGljaycsJ0NvbG91ciAmIERyYXcnXS5mb3JFYWNoKGZ1bmN0aW9uKGxhYmVsLGkpewogICAgc3AuaW5uZXJIVE1MKz0nPGRpdiBjbGFzcz0ic3AtaXRlbSI+PGI+JytwYXJ0c1tpKzFdKycvNTwvYj5QYXJ0ICcrKGkrMSkrJyDigJQgJytsYWJlbCsnPC9kaXY+JzsKICB9KTsKICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVzdWx0c0Jhbm5lcicpLmNsYXNzTGlzdC5hZGQoJ3Nob3cnKTsKICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Jlc3VsdHNCYW5uZXInKS5zY3JvbGxJbnRvVmlldyh7YmVoYXZpb3I6J3Ntb290aCcsYmxvY2s6J2NlbnRlcid9KX0sMTIwKTsKfSk7CmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZXNldEJ0bicpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxmdW5jdGlvbigpewogIGlmKCFjb25maXJtKCdSZXNldCBhbGwgYW5zd2Vycz8gWW91ciBub3RlcyB3aWxsIGFsc28gYmUgY2xlYXJlZC4nKSlyZXR1cm47CiAgbG9jYXRpb24ucmVsb2FkKCk7Cn0pOwp1cGRhdGVQcm9ncmVzcygpOwp9KSgpOw==\");try{var b=Uint8Array.from(s,function(c){return c.charCodeAt(0)});var d=new TextDecoder(\"utf-8\").decode(b);(new Function(d))();}catch(e){console.error(\"AEPENGINE\",e);}})();<\/script>\n\n","protected":false},"excerpt":{"rendered":"<p>All English 4U Grammar IELTS TOEFL Cambridge CELPIP Dictation Back Grammar IELTS TOEFL Cambridge CELPIP Dictation Cambridge YLE &#183; Movers Movers 4 &mdash; Test 2 Listening Listen to 5 parts with 25 questions. Use YouTube audio, jump to each part, take notes. Each question has its own Show Answer button &mdash; submit panel is at [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"page-with-title","meta":{"footnotes":""},"class_list":["post-3713","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/allenglish4u.com\/vi\/wp-json\/wp\/v2\/pages\/3713","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/allenglish4u.com\/vi\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/allenglish4u.com\/vi\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/allenglish4u.com\/vi\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/allenglish4u.com\/vi\/wp-json\/wp\/v2\/comments?post=3713"}],"version-history":[{"count":3,"href":"https:\/\/allenglish4u.com\/vi\/wp-json\/wp\/v2\/pages\/3713\/revisions"}],"predecessor-version":[{"id":5922,"href":"https:\/\/allenglish4u.com\/vi\/wp-json\/wp\/v2\/pages\/3713\/revisions\/5922"}],"wp:attachment":[{"href":"https:\/\/allenglish4u.com\/vi\/wp-json\/wp\/v2\/media?parent=3713"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}