{"id":5559,"date":"2026-07-01T21:25:27","date_gmt":"2026-07-01T21:25:27","guid":{"rendered":"https:\/\/allenglish4u.com\/cambridge-flyers-3-test-3-listening\/"},"modified":"2026-07-05T02:43:09","modified_gmt":"2026-07-05T02:43:09","slug":"cambridge-flyers-3-test-3-listening","status":"publish","type":"page","link":"https:\/\/allenglish4u.com\/vi\/cambridge-flyers-3-test-3-listening\/","title":{"rendered":"Cambridge Flyers 3 \u2013 Test 3 \u2013 Listening"},"content":{"rendered":"\n<!--\n================================================================\nAE4U \u00b7 YLE STARTERS LISTENING \u2014 TEMPLATE\n4 parts \u00b7 20 questions \u00b7 ~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. \"Flyers 1 \u2014 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} \u2014 5 questions + example\n  {{P1_TARGETS}}      array of {key, label, x, y} \u2014 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:#10B981; --accent-2:#0EA5E9; --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,#10B981 0%,#0EA5E9 55%,#1E3A8A 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 \u2014 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 \u2014 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\n.match-letter{display:flex;align-items:center;gap:10px;padding:12px 14px;background:#fff;border:1.5px solid var(--border);border-radius:12px;font-size:14px;font-weight:600;color:var(--text)}\n.match-letter b{color:var(--accent-1);background:var(--light-1);width:26px;height:26px;border-radius:8px;display:grid;place-items:center;flex-shrink:0;font-weight:800}\n.q-opts{display:flex;flex-wrap:wrap;gap:8px;margin-top:4px}\n.opt{display:inline-flex;align-items:center;gap:7px;padding:10px 16px;border-radius:12px;background:#F8FAFF;border:1.5px solid var(--border);font-weight:600;font-size:14px;color:var(--text);cursor:pointer;transition:all .15s ease;user-select:none}\n.opt input{display:none}\n.opt .opt-letter{font-weight:800;color:var(--accent-1);background:#fff;width:22px;height:22px;border-radius:6px;display:grid;place-items:center;font-size:12.5px;border:1px solid var(--border);flex-shrink:0}\n.opt.selected{background:linear-gradient(100deg,rgba(16,185,129,.12),rgba(14,165,233,.12));border-color:var(--accent-1)}\n.opt.selected .opt-letter{background:linear-gradient(100deg,var(--accent-1),var(--accent-2));color:#fff;border-color:transparent}\n.opt.correct-opt{background:rgba(16,185,129,.12) !important;border-color:var(--green) !important}\n.opt.correct-opt .opt-letter{background:var(--green) !important;color:#fff !important;border-color:transparent !important}\n.opt.wrong-opt{background:rgba(239,68,68,.10) !important;border-color:var(--red) !important}\n\n\/* PART 4 \u2014 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-scene .p5real{position:relative;display:inline-block;max-width:700px;width:100%}\n.colour-scene .p5img{display:block;width:100%;height:auto;border-radius:10px;border:1px solid var(--border)}\n.colour-scene .p5ovl{position:absolute;inset:0;width:100%;height:100%;max-width:none}\n.colour-scene .p5ovl [data-region]{cursor:pointer;fill-opacity:.5;stroke:#2563EB;stroke-width:.5;stroke-dasharray:2 1.4;transition:fill-opacity .15s,stroke-width .15s}\n.colour-scene .p5ovl [data-region]:hover{stroke-width:1;fill-opacity:.32}\n.colour-scene .p5ovl [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,#10B981 0%,#0EA5E9 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<\/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 \u00b7 Flyers<\/span>\n    <h1 class=\"serif\">Flyers 3 &mdash; Test 3 <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>~20 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; Tick &middot; Write &middot; Colour<\/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\/mrLj44r9ntE?enablejsapi=1&#038;rel=0\" title=\"YLE Flyers Listening\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture\" allowfullscreen><\/iframe>\n    <\/div>\n    <div class=\"player-controls\">\n      <h4>\ud83c\udfa7 Audio &mdash; Flyers 3 Test 3 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=\"9\" data-part=\"1\"><span class=\"jt\">0:09<\/span> Part 1<\/button>\n        <button class=\"jump-btn\" data-time=\"231\" data-part=\"2\"><span class=\"jt\">3:51<\/span> Part 2<\/button>\n        <button class=\"jump-btn\" data-time=\"432\" data-part=\"3\"><span class=\"jt\">7:12<\/span> Part 3<\/button>\n        <button class=\"jump-btn\" data-time=\"700\" data-part=\"4\"><span class=\"jt\">11:40<\/span> Part 4<\/button>\n        <button class=\"jump-btn\" data-time=\"1000\" data-part=\"5\"><span class=\"jt\">16:40<\/span> Part 5<\/button>\n      <\/div>\n      <div class=\"player-actions\">\n        <button class=\"ctrl-btn\" id=\"btnPause\">\u23f8 Pause<\/button>\n        <button class=\"ctrl-btn\" id=\"btnPlay\">\u25b6 Play<\/button>\n        <button class=\"ctrl-btn\" id=\"btnRewind\">\u23ea -10s<\/button>\n        <button class=\"ctrl-btn\" id=\"btnSlower\">\ud83d\udc22 Slower<\/button>\n        <button class=\"ctrl-btn\" id=\"btnNormal\">\u26a1 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 \u2014 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\u20135 \u00b7 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=\"9\"><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\">\ud83d\udcdc Transcript<\/button>\n      <button class=\"act-pill\" id=\"p1Clear\">\ud83e\uddf9 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=\"\/wp-content\/uploads\/2026\/07\/f3t3-p1-scene-1.jpg\" alt=\"Part 1 scene\" draggable=\"false\">\n        <svg class=\"pair-lines\" id=\"pairLines\" preserveAspectRatio=\"none\"><\/svg>\n        <div class=\"pair-targets\" id=\"pairTargets\"><\/div>\n      <\/div>\n    <\/div>\n    <div class=\"pair-hint\">\ud83d\udca1 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\">\ud83d\udc41 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>\ud83d\udcdc Part 1 transcript<\/span><span class=\"chev\">\u25be<\/span><\/div>\n      <div class=\"ts-body\" id=\"tsBody1\"><p>A family visits a restaurant and points out the people they know.<\/p><p><b>Example:<\/b> &ldquo;Who&rsquo;s playing the piano over there?&rdquo; &ldquo;That&rsquo;s <b>Michael<\/b>.&rdquo; &rarr; Michael = the man playing the piano.<\/p><p><b>1<\/b> &ldquo;Look at William &mdash; he&rsquo;s wearing a chef&rsquo;s hat.&rdquo; &ldquo;Is he cooking?&rdquo; &ldquo;Yes, in the kitchen.&rdquo; &rarr; William = the man in the kitchen, cooking.<\/p><p><b>2<\/b> &ldquo;And who&rsquo;s Katy?&rdquo; &ldquo;She&rsquo;s the other cook &mdash; you can see her through the kitchen window.&rdquo; &rarr; Katy = the woman in the kitchen.<\/p><p><b>3<\/b> &ldquo;Is that Helen at the table by the window?&rdquo; &ldquo;Yes, she&rsquo;s eating a pizza.&rdquo; &rarr; Helen = the woman eating pizza.<\/p><p><b>4<\/b> &ldquo;Who&rsquo;s carrying the plates, over by the door?&rdquo; &ldquo;That&rsquo;s Sarah.&rdquo; &rarr; Sarah = the woman carrying plates.<\/p><p><b>5<\/b> &ldquo;Richard looks a bit sad, sitting at the front table.&rdquo; &ldquo;Yes, he&rsquo;s still waiting for his food.&rdquo; &rarr; Richard = the sad man at the front table.<\/p><p><i>(Harry is not used.)<\/i><\/p><\/div>\n    <\/div>\n  <\/div>\n<\/section>\n\n<!-- ============ PART 2 \u2014 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\u201310 \u00b7 Listen and write<\/span>\n        <h2 class=\"serif\">Listen and write a name or a number<\/h2>\n        <p id=\"p2Intro\">Listen and write about Mr Powers and his job. There is one example.<\/p>\n      <\/div>\n    <\/div>\n    <div class=\"part-actions\">\n      <button class=\"act-pill\" data-time=\"231\"><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\">\ud83d\udcdc Transcript<\/button>\n    <\/div>\n\n    <div class=\"form-card\" id=\"p2Form\">\n      <h4>\ud83d\udcdd Listen and write<\/h4>\n      <div id=\"p2Examples\"><\/div>\n      <div id=\"p2Questions\"><\/div>\n    <\/div>\n\n    <div class=\"notes-pad\">\n      <label>\u270f\ufe0f 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>\ud83d\udcdc Part 2 transcript<\/span><span class=\"chev\">\u25be<\/span><\/div>\n      <div class=\"ts-body\" id=\"tsBody2\"><p>A boy asks his friend about her uncle, Mr Powers, who works at an airport.<\/p><p><b>Example:<\/b> Name: &ldquo;That&rsquo;s my uncle, <b>Mr Powers<\/b>.&rdquo;<\/p><p><b>1<\/b> Job: &ldquo;He&rsquo;s an <b>engineer<\/b> &mdash; he fixes the planes.&rdquo;<\/p><p><b>2<\/b> Works at: &ldquo;<b>London<\/b> Airport, the big one.&rdquo;<\/p><p><b>3<\/b> How he goes to work: &ldquo;He goes <b>by train<\/b> every morning.&rdquo;<\/p><p><b>4<\/b> Starts work at: &ldquo;<b>Half-past six<\/b> &mdash; even on Saturdays!&rdquo;<\/p><p><b>5<\/b> Favourite sport: &ldquo;He loves playing <b>golf<\/b> on his day off.&rdquo;<\/p><\/div>\n    <\/div>\n  <\/div>\n<\/section>\n\n\n<!-- ============ PART 3 \u2014 Multiple matching (Flyers) ============ -->\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\u201315 \u00b7 Multiple matching<\/span>\n        <h2 class=\"serif\">Which animal is on each of Robert&#8217;s things?<\/h2>\n        <p id=\"p3Intro\">Robert loves animals. Look at the pictures A\u2013H. Listen and write a letter in each box. There is one example.<\/p>\n      <\/div>\n    <\/div>\n    <div class=\"part-actions\">\n      <button class=\"act-pill\" data-time=\"432\"><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\">\ud83d\udcdc Transcript<\/button>\n    <\/div>\n\n    <div class=\"match-grid\" id=\"p3LetterBank\" style=\"display:grid;grid-template-columns:repeat(auto-fill,minmax(220px,1fr));gap:10px;margin:18px 0\"><\/div>\n\n    <div class=\"q-list\" id=\"part3List\"><\/div>\n\n    <div class=\"transcript-card collapsed\" id=\"ts3\">\n      <div class=\"ts-head\" data-toggle=\"ts3\"><span>\ud83d\udcdc Part 3 transcript<\/span><span class=\"chev\">\u25be<\/span><\/div>\n      <div class=\"ts-body\" id=\"tsBody3\"><p>Robert shows his things &mdash; each one has a different animal on it.<\/p><p><b>Example:<\/b> &ldquo;What animal is on your jacket?&rdquo; &ldquo;A <b>panda<\/b>.&rdquo; &rarr; jacket = <b>D<\/b> (panda).<\/p><p><b>11<\/b> &ldquo;What about your toy box?&rdquo; &ldquo;That has a <b>dolphin<\/b> on it.&rdquo; &rarr; toy box = <b>H<\/b> (dolphin).<\/p><p><b>12<\/b> &ldquo;And your address book?&rdquo; &ldquo;There&#8217;s an <b>octopus<\/b> on the cover.&rdquo; &rarr; address book = <b>E<\/b> (octopus).<\/p><p><b>13<\/b> &ldquo;What animal is on your socks?&rdquo; &ldquo;A <b>hippo<\/b>!&rdquo; &rarr; socks = <b>B<\/b> (hippo).<\/p><p><b>14<\/b> &ldquo;And your gloves?&rdquo; &ldquo;They&#8217;ve got a <b>dinosaur<\/b> on them.&rdquo; &rarr; gloves = <b>F<\/b> (dinosaur).<\/p><p><b>15<\/b> &ldquo;And the umbrella?&rdquo; &ldquo;That one has a <b>butterfly<\/b>.&rdquo; &rarr; umbrella = <b>C<\/b> (butterfly).<\/p><\/div>\n    <\/div>\n  <\/div>\n<\/section>\n\n\n<!-- ============ PART 4 \u2014 Picture MCQ (Flyers) ============ -->\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\u201320 \u00b7 Listen and tick (\u2713)<\/span>\n        <h2 class=\"serif\">Listen and tick (\u2713) the box<\/h2>\n        <p id=\"p4Intro\">Sarah went to the circus for her birthday. Look at the pictures, listen and tick (\u2713) the box. There is one example.<\/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 4<\/button>\n      <button class=\"act-pill ts-toggle\" data-target=\"ts4\">\ud83d\udcdc 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>\ud83d\udcdc Part 4 transcript<\/span><span class=\"chev\">\u25be<\/span><\/div>\n      <div class=\"ts-body\" id=\"tsBody4\"><p>Sarah tells her friend about her birthday at the circus.<\/p><p><b>Example:<\/b> Where did you go for your birthday? &ldquo;We went to the <b>circus<\/b>.&rdquo; &rarr; <b>C<\/b><\/p><p><b>16<\/b> Who went with you? &ldquo;<b>My mum and dad<\/b> came too.&rdquo; &rarr; <b>A<\/b><\/p><p><b>17<\/b> What was your favourite present? &ldquo;I loved the <b>hairbrush and comb set<\/b>.&rdquo; &rarr; <b>C<\/b><\/p><p><b>18<\/b> What did you like most at the circus? &ldquo;The <b>elephant<\/b> was amazing.&rdquo; &rarr; <b>B<\/b><\/p><p><b>19<\/b> How did you get there? &ldquo;We went <b>by car<\/b>.&rdquo; &rarr; <b>A<\/b><\/p><p><b>20<\/b> What did you eat at the circus? &ldquo;We had <b>ice cream<\/b>.&rdquo; &rarr; <b>B<\/b><\/p><\/div>\n    <\/div>\n  <\/div>\n<\/section>\n\n<!-- ============ PART 5 \u2014 Listen, colour and write ============ -->\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\u201325 \u00b7 Listen, colour and write<\/span>\n        <h2 class=\"serif\">Listen, colour and write<\/h2>\n        <p id=\"p5Intro\">Listen and colour, write and draw on the camping picture. Use the form below for the write \/ draw questions. There is one example.<\/p>\n      <\/div>\n    <\/div>\n    <div class=\"part-actions\">\n      <button class=\"act-pill\" data-time=\"1000\"><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\">\ud83d\udcdc Transcript<\/button>\n      <button class=\"act-pill\" id=\"p5Clear\">\ud83e\uddf9 Clear my colours<\/button>\n    <\/div>\n\n    <div class=\"colour-wrap\">\n      <div class=\"colour-palette\" id=\"colourPalette\"><\/div>\n      <div class=\"colour-scene\" id=\"colourScene\">\n<div class=\"p5real\">\n<img decoding=\"async\" class=\"p5img\" src=\"\/wp-content\/uploads\/2026\/07\/f3t3-p5-scene.jpg\" alt=\"Part 5 colouring scene\" draggable=\"false\">\n<svg class=\"p5ovl\" viewBox=\"0 0 100 100\" preserveAspectRatio=\"none\">\n<rect data-region=\"rucksack\" x=\"18\" y=\"79\" width=\"10\" height=\"12\" rx=\"1.5\" fill=\"none\"><\/rect>\n<rect data-region=\"drum\" x=\"64\" y=\"60\" width=\"10\" height=\"15\" rx=\"1.5\" fill=\"none\"><\/rect>\n<rect data-region=\"torch\" x=\"29\" y=\"55\" width=\"11\" height=\"11\" rx=\"1.5\" fill=\"none\"><\/rect>\n<\/svg>\n<\/div>\n      <\/div>\n      <div class=\"pair-hint\">\ud83d\udca1 Click a colour, then click an item to fill. Use the form below for write-questions.<\/div>\n      <div class=\"colour-instructions\" id=\"colourInstructions\"><\/div>\n      <div class=\"pair-bottom-actions\">\n        <button class=\"show-ans-btn\" data-show=\"P5ALL\">\ud83d\udc41 Show All Answers (Part 5)<\/button>\n      <\/div>\n    <\/div>\n\n    <div class=\"form-card\" id=\"p5Form\">\n      <h4>\ud83d\udcdd Write words \/ numbers<\/h4>\n      <div id=\"p5Questions\"><\/div>\n    <\/div>\n\n    <div class=\"notes-pad\">\n      <label>\u270f\ufe0f 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>\ud83d\udcdc Part 5 transcript<\/span><span class=\"chev\">\u25be<\/span><\/div>\n      <div class=\"ts-body\" id=\"tsBody5\"><p>A parent asks a child to colour, write and draw on the camping picture.<\/p><p><b>Example:<\/b> &ldquo;The swing seat &mdash; can you colour it <b>red<\/b>?&rdquo; &rarr; swing seat = red (already done).<\/p><p><b>21<\/b> &ldquo;Colour the rucksack &mdash; the tall boy at the front is wearing it.&rdquo; &ldquo;<b>Orange<\/b>?&rdquo; &ldquo;Yes.&rdquo; &rarr; rucksack = orange.<\/p><p><b>22<\/b> &ldquo;Colour the drum &mdash; the boy who&#8217;s standing up is holding it.&rdquo; &ldquo;<b>Yellow<\/b>.&rdquo; &rarr; standing boy&#8217;s drum = yellow.<\/p><p><b>23<\/b> &ldquo;Can you draw two stars on the big flag?&rdquo; &ldquo;OK &mdash; and colour them <b>blue<\/b>?&rdquo; &ldquo;Yes.&rdquo; &rarr; two blue stars on the flag.<\/p><p><b>24<\/b> &ldquo;Can you write the word &lsquo;tent&rsquo; above the number 3, on the side of the tent?&rdquo; &ldquo;OK, easy!&rdquo; &rarr; write &ldquo;tent&rdquo;.<\/p><p><b>25<\/b> &ldquo;Colour the torch &mdash; the boy inside the tent is holding it.&rdquo; &ldquo;<b>Purple<\/b>.&rdquo; &rarr; torch = purple.<\/p><\/div>\n    <\/div>\n  <\/div>\n<\/section>\n\n<!-- SUBMIT PANEL -->\n<div class=\"wrap\">\n  <div class=\"submit-panel\">\n    <h3>\ud83c\udfaf Finished all 25 questions?<\/h3>\n    <p class=\"intro\">Submit to grade your whole test, OR use \ud83d\udc41 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\">\ud83d\udd04 Reset Test<\/button>\n    <\/div>\n  <\/div>\n\n  <div class=\"results-banner\" id=\"resultsBanner\">\n    <h3>\ud83c\udfa7 Your Flyers 3 Listening &mdash; Test 3 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>\u00a9 2026 All English 4U \u00b7 <a href=\"https:\/\/allenglish4u.com\/cambridge\/\">All Cambridge Tests<\/a> \u00b7 <a href=\"https:\/\/allenglish4u.com\/contact\/\">Contact<\/a><\/p>\n  <\/div>\n<\/footer>\n\n<script>eval(decodeURIComponent(escape(window.atob('CihmdW5jdGlvbigpewovKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqIEFFNFUgWUxFIFNUQVJURVJTIExJU1RFTklORwogKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCgovKiA9PT09PSBEQVRBID09PT09ICovCi8qIFBlci10ZXN0IGRhdGEg4oCUIEZseWVycyAzIFRlc3QgMyBMaXN0ZW5pbmcgKi8KdmFyIElNRyA9ICcvd3AtY29udGVudC91cGxvYWRzLzIwMjYvMDcvJzsKLy8gUGFydCAxOiBkcmF3IGxpbmVzIC0tIHJlc3RhdXJhbnQgc2NlbmUKLy8gTWljaGFlbD1FeChwaWFubyksIFdpbGxpYW0oUTEga2l0Y2hlbiBjb29rKSwgS2F0eShRMiBraXRjaGVuIHdvbWFuKSwgSGVsZW4oUTMgZWF0aW5nIHBpenphKSwKLy8gU2FyYWgoUTQgY2FycnlpbmcgcGxhdGVzKSwgUmljaGFyZChRNSBzYWQgbWFuIGZyb250IHRhYmxlKS4gSGFycnkgPSBkaXN0cmFjdG9yLgp2YXIgUDFfTkFNRVMgPSBbCiAge246J0V4JywgbmFtZTonTWljaGFlbCcsIGFuczondGFyZ2V0X21pY2hhZWwnLCBpc0V4YW1wbGU6dHJ1ZX0sCiAge246MSwgICAgbmFtZTonV2lsbGlhbScsIGFuczondGFyZ2V0X3dpbGxpYW0nfSwKICB7bjoyLCAgICBuYW1lOidLYXR5JywgICAgYW5zOid0YXJnZXRfa2F0eSd9LAogIHtuOjMsICAgIG5hbWU6J0hlbGVuJywgICBhbnM6J3RhcmdldF9oZWxlbid9LAogIHtuOjQsICAgIG5hbWU6J1NhcmFoJywgICBhbnM6J3RhcmdldF9zYXJhaCd9LAogIHtuOjUsICAgIG5hbWU6J1JpY2hhcmQnLCBhbnM6J3RhcmdldF9yaWNoYXJkJ30sCiAge246Jy0nLCBuYW1lOidIYXJyeScsICAgYW5zOid0YXJnZXRfaGFycnknLCBkaXN0cmFjdG9yOnRydWV9Cl07CnZhciBQMV9UQVJHRVRTID0gWwogIHtrZXk6J3RhcmdldF9taWNoYWVsJywgbGFiZWw6J01pY2hhZWwgLS0gbWFuIHBsYXlpbmcgdGhlIHBpYW5vIChleGFtcGxlKScsIHg6MTIsIHk6ODAsIGlzRXhhbXBsZTp0cnVlfSwKICB7a2V5Oid0YXJnZXRfd2lsbGlhbScsIGxhYmVsOidXaWxsaWFtIC0tIHRoZSBtYW4gaW4gdGhlIGtpdGNoZW4sIGNvb2tpbmcnLCB4OjEwLCB5OjM1fSwKICB7a2V5Oid0YXJnZXRfa2F0eScsICAgIGxhYmVsOidLYXR5IC0tIHRoZSB3b21hbiBpbiB0aGUga2l0Y2hlbicsICAgICAgICAgICB4OjMyLCB5OjI1fSwKICB7a2V5Oid0YXJnZXRfaGVsZW4nLCAgIGxhYmVsOidIZWxlbiAtLSB0aGUgd29tYW4gZWF0aW5nIHBpenphJywgICAgICAgICAgICB4OjkzLCB5OjU1fSwKICB7a2V5Oid0YXJnZXRfc2FyYWgnLCAgIGxhYmVsOidTYXJhaCAtLSB0aGUgd29tYW4gY2FycnlpbmcgcGxhdGVzJywgICAgICAgICB4OjUzLCB5OjQwfSwKICB7a2V5Oid0YXJnZXRfcmljaGFyZCcsIGxhYmVsOidSaWNoYXJkIC0tIHRoZSBzYWQgbWFuIGF0IHRoZSBmcm9udCB0YWJsZScsICB4OjYwLCB5OjgwfSwKICB7a2V5Oid0YXJnZXRfaGFycnknLCAgIGxhYmVsOidIYXJyeSAtLSBtYW4gcGxheWluZyB0aGUgZ3VpdGFyJywgICAgICAgICAgICB4OjI1LCB5Ojc1fQpdOwovLyBQYXJ0IDI6IE1yIFBvd2VycyAoYWlycG9ydCBqb2IpIGZvcm0KdmFyIFAyX0VYQU1QTEVTID0gWwogIHtsYWJlbDonTmFtZTonLCBkaXNwbGF5OidNciBQb3dlcnMnfQpdOwp2YXIgUDJfUVVFU1RJT05TID0gWwogIHtuOjYsICBsYWJlbDonSm9iOicsICAgICAgICAgICAgYWNjZXB0ZWQ6WydlbmdpbmVlciddLCAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheTonZW5naW5lZXInfSwKICB7bjo3LCAgbGFiZWw6J1dvcmtzIGF0OicsICAgICAgIHN1ZmZpeDonIEFpcnBvcnQnLCBhY2NlcHRlZDpbJ2xvbmRvbiddLCAgICAgICAgIGRpc3BsYXk6J0xvbmRvbid9LAogIHtuOjgsICBsYWJlbDonSG93IGhlIGdvZXMgdG8gd29yazonLCBhY2NlcHRlZDpbJ3RyYWluJywnYnkgdHJhaW4nXSwgICAgICAgICAgICAgZGlzcGxheTonYnkgdHJhaW4nfSwKICB7bjo5LCAgbGFiZWw6J1N0YXJ0cyB3b3JrIGF0OicsIHN1ZmZpeDonIG9uIFNhdHVyZGF5cycsIGFjY2VwdGVkOlsnaGFsZi1wYXN0IHNpeCcsJ2hhbGYgcGFzdCBzaXgnLCc2LjMwJywnc2l4IHRoaXJ0eScsJ2hhbGYgc2l4J10sIGRpc3BsYXk6J2hhbGYtcGFzdCBzaXgnfSwKICB7bjoxMCwgbGFiZWw6J0Zhdm91cml0ZSBzcG9ydDonLCBhY2NlcHRlZDpbJ2dvbGYnXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXk6J2dvbGYnfQpdOwovLyBQYXJ0IDM6IFJvYmVydCdzIGFuaW1hbCB0aGluZ3MgKEEtSCkKdmFyIFAzX0xFVFRFUl9CQU5LID0gWwogIHtMOidBJywgbGFiZWw6J2NhbWVsJ30sCiAge0w6J0InLCBsYWJlbDonaGlwcG8nfSwKICB7TDonQycsIGxhYmVsOididXR0ZXJmbHknfSwKICB7TDonRCcsIGxhYmVsOidwYW5kYSd9LAogIHtMOidFJywgbGFiZWw6J29jdG9wdXMnfSwKICB7TDonRicsIGxhYmVsOidkaW5vc2F1cid9LAogIHtMOidHJywgbGFiZWw6J2JhdCd9LAogIHtMOidIJywgbGFiZWw6J2RvbHBoaW4nfQpdOwp2YXIgUDNfRVhBTVBMRV9NQVRDSCA9IHtuOidFeCcsIHBlcnNvbjonamFja2V0JywgYW5zOidEJywgd2h5OidwYW5kYSd9Owp2YXIgUDNfUVVFU1RJT05TX01BVENIID0gWwogIHtuOjExLCBwZXJzb246J3RveSBib3gnLCAgICAgYW5zOidIJywgd2h5Oidkb2xwaGluJ30sCiAge246MTIsIHBlcnNvbjonYWRkcmVzcyBib29rJyxhbnM6J0UnLCB3aHk6J29jdG9wdXMnfSwKICB7bjoxMywgcGVyc29uOidzb2NrcycsICAgICAgIGFuczonQicsIHdoeTonaGlwcG8nfSwKICB7bjoxNCwgcGVyc29uOidnbG92ZXMnLCAgICAgIGFuczonRicsIHdoeTonZGlub3NhdXInfSwKICB7bjoxNSwgcGVyc29uOid1bWJyZWxsYScsICAgIGFuczonQycsIHdoeTonYnV0dGVyZmx5J30KXTsKLy8gU3RhcnRlcnMtc3R5bGUgUDMgTUNRIGRpc2FibGVkIGZvciBGbHllcnMgKFAzID0gQS1IIG1hdGNoaW5nIGFib3ZlKQp2YXIgUDNfRVhBTVBMRSA9IG51bGw7CnZhciBQM19RVUVTVElPTlMgPSBbXTsKLy8gUGFydCA1OiBjb2xvdXIgcGFsZXR0ZSArIGNhbXBpbmcgc2NlbmUgKFA0X0VYQU1QTEUgPSB0aGUgY29sb3VyIGV4YW1wbGUgPSBzd2luZyBzZWF0KQp2YXIgUDRfRVhBTVBMRSA9IHtpbnN0cnVjdGlvbjonRXhhbXBsZSAtLSB0aGUgc3dpbmcgc2VhdCBpcyBhbHJlYWR5IGNvbG91cmVkIHJlZC4nLCByZWdpb246J3N3aW5nX3NlYXQnLCBjb2xvdXI6J3JlZCd9Owp2YXIgUDVfRVhBTVBMRVMgPSBbXTsKdmFyIFA1X0lURU1TX0NPTE9VUiA9IFsKICB7bjoyMSwgaW5zdHJ1Y3Rpb246J0NvbG91ciB0aGUgcnVja3NhY2sgb2YgdGhlIHRhbGwgYm95IGluIHRoZSBmb3JlZ3JvdW5kIE9SQU5HRS4nLCByZWdpb246J3J1Y2tzYWNrJywgY29sb3VyOidvcmFuZ2UnfSwKICB7bjoyMiwgaW5zdHJ1Y3Rpb246J0NvbG91ciB0aGUgc3RhbmRpbmcgYm954oCZcyBkcnVtIFlFTExPVy4nLCAgICAgICAgICAgICAgICAgICByZWdpb246J2RydW0nLCAgICAgY29sb3VyOid5ZWxsb3cnfSwKICB7bjoyNSwgaW5zdHJ1Y3Rpb246J0NvbG91ciB0aGUgdG9yY2ggb2YgdGhlIGJveSBpbiB0aGUgdGVudCBQVVJQTEUuJywgICAgICAgICAgICAgIHJlZ2lvbjondG9yY2gnLCAgICBjb2xvdXI6J3B1cnBsZSd9Cl07CnZhciBQNV9RVUVTVElPTlMgPSBbCiAge246MjMsIGxhYmVsOidEcmF3IHR3byBzdGFycyBvbiB0aGUgYmlnIGZsYWcgYW5kIGNvbG91ciB0aGVtLicsIGFjY2VwdGVkOlsnYmx1ZScsJ3R3byBibHVlIHN0YXJzJywnZHJhdyB0d28gc3RhcnMgYW5kIGNvbG91ciB0aGVtIGJsdWUnLCd0d28gc3RhcnMgYmx1ZScsJ3N0YXJzIGJsdWUnXSwgZGlzcGxheTondHdvIGJsdWUgc3RhcnMnfSwKICB7bjoyNCwgbGFiZWw6J1dyaXRlIHRoZSB3b3JkIOKAmHRlbnTigJkgYWJvdmUgdGhlIG51bWJlciAzIG9uIHRoZSBzaWRlIG9mIHRoZSB0ZW50LicsIGFjY2VwdGVkOlsndGVudCddLCBkaXNwbGF5Oid0ZW50J30KXTsKdmFyIFA0X0lURU1TID0gUDVfSVRFTVNfQ09MT1VSOwovLyBGbHllcnMgUGFydCA0OiBwaWN0dXJlIE1DUSA1IHF1ZXN0aW9ucyB4IDMgb3B0aW9ucyAoU2FyYWgncyBiaXJ0aGRheSBhdCB0aGUgY2lyY3VzKQp2YXIgUDRfRVhBTVBMRV9QSUMgPSB7CiAgcToiV2hlcmUgZGlkIFNhcmFoIGdvIGZvciBoZXIgYmlydGhkYXk\/IiwKICBvcHRzOlsKICAgIHtsZXR0ZXI6J0EnLCBpbWc6SU1HKydmM3QzLXA0LWV4LWEuanBnJ30sCiAgICB7bGV0dGVyOidCJywgaW1nOklNRysnZjN0My1wNC1leC1iLmpwZyd9LAogICAge2xldHRlcjonQycsIGltZzpJTUcrJ2YzdDMtcDQtZXgtYy5qcGcnLCBpc0Fuc3dlcjp0cnVlfQogIF0sCiAgYW5zOidDJwp9Owp2YXIgUDRfUVVFU1RJT05TX1BJQyA9IFsKICB7bjoxNiwgcTonV2hvIHdlbnQgd2l0aCBTYXJhaD8nLAogICBvcHRzOlt7bGV0dGVyOidBJyxpbWc6SU1HKydmM3QzLXA0LXExNi1hLmpwZycsaXNBbnN3ZXI6dHJ1ZX0se2xldHRlcjonQicsaW1nOklNRysnZjN0My1wNC1xMTYtYi5qcGcnfSx7bGV0dGVyOidDJyxpbWc6SU1HKydmM3QzLXA0LXExNi1jLmpwZyd9XSwKICAgYW5zOidBJ30sCiAge246MTcsIHE6J1doaWNoIGlzIFNhcmFo4oCZcyBmYXZvdXJpdGUgcHJlc2VudD8nLAogICBvcHRzOlt7bGV0dGVyOidBJyxpbWc6SU1HKydmM3QzLXA0LXExNy1hLmpwZyd9LHtsZXR0ZXI6J0InLGltZzpJTUcrJ2YzdDMtcDQtcTE3LWIuanBnJ30se2xldHRlcjonQycsaW1nOklNRysnZjN0My1wNC1xMTctYy5qcGcnLGlzQW5zd2VyOnRydWV9XSwKICAgYW5zOidDJ30sCiAge246MTgsIHE6J1doYXQgZG9lcyBTYXJhaCBsaWtlIG1vc3QgYXQgdGhlIGNpcmN1cz8nLAogICBvcHRzOlt7bGV0dGVyOidBJyxpbWc6SU1HKydmM3QzLXA0LXExOC1hLmpwZyd9LHtsZXR0ZXI6J0InLGltZzpJTUcrJ2YzdDMtcDQtcTE4LWIuanBnJyxpc0Fuc3dlcjp0cnVlfSx7bGV0dGVyOidDJyxpbWc6SU1HKydmM3QzLXA0LXExOC1jLmpwZyd9XSwKICAgYW5zOidCJ30sCiAge246MTksIHE6J0hvdyBhcmUgdGhleSBnb2luZyB0byBnZXQgdGhlcmU\/JywKICAgb3B0czpbe2xldHRlcjonQScsaW1nOklNRysnZjN0My1wNC1xMTktYS5qcGcnLGlzQW5zd2VyOnRydWV9LHtsZXR0ZXI6J0InLGltZzpJTUcrJ2YzdDMtcDQtcTE5LWIuanBnJ30se2xldHRlcjonQycsaW1nOklNRysnZjN0My1wNC1xMTktYy5qcGcnfV0sCiAgIGFuczonQSd9LAogIHtuOjIwLCBxOidXaGF0IGFyZSB0aGV5IGdvaW5nIHRvIGVhdCBhdCB0aGUgY2lyY3VzPycsCiAgIG9wdHM6W3tsZXR0ZXI6J0EnLGltZzpJTUcrJ2YzdDMtcDQtcTIwLWEuanBnJ30se2xldHRlcjonQicsaW1nOklNRysnZjN0My1wNC1xMjAtYi5qcGcnLGlzQW5zd2VyOnRydWV9LHtsZXR0ZXI6J0MnLGltZzpJTUcrJ2YzdDMtcDQtcTIwLWMuanBnJ31dLAogICBhbnM6J0InfQpdOwp2YXIgUDRfQ09MT1VSUyA9IFsKICB7a2V5OidyZWQnLCAgICBoZXg6JyNFRjQ0NDQnfSwKICB7a2V5OidibHVlJywgICBoZXg6JyMzQjgyRjYnfSwKICB7a2V5OidncmVlbicsICBoZXg6JyMxMEI5ODEnfSwKICB7a2V5Oid5ZWxsb3cnLCBoZXg6JyNGQUNDMTUnfSwKICB7a2V5OidvcmFuZ2UnLCBoZXg6JyNGOTczMTYnfSwKICB7a2V5OidwdXJwbGUnLCBoZXg6JyM4QjVDRjYnfSwKICB7a2V5OidwaW5rJywgICBoZXg6JyNFQzQ4OTknfSwKICB7a2V5Oidicm93bicsICBoZXg6JyM5MjQwMEUnfSwKICB7a2V5OidibGFjaycsICBoZXg6JyMwRjE3MkEnfQpdOwp2YXIgVE9UQUw9MjU7CgovKiA9PT09PSBVVElMSVRJRVMgPT09PT0gKi8KZnVuY3Rpb24gZXNjKHMpe3JldHVybiBTdHJpbmcocykucmVwbGFjZSgvWyY8PiInXS9nLGZ1bmN0aW9uKGMpe3JldHVybnsnJic6JyZhbXA7JywnPCc6JyZsdDsnLCc+JzonJmd0OycsJyInOicmcXVvdDsnLCInIjonJiMzOTsnfVtjXX0pfQpmdW5jdGlvbiAkJChzZWwsY3R4KXtyZXR1cm4gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoKGN0eHx8ZG9jdW1lbnQpLnF1ZXJ5U2VsZWN0b3JBbGwoc2VsKSl9CmZ1bmN0aW9uICQoc2VsLGN0eCl7cmV0dXJuIChjdHh8fGRvY3VtZW50KS5xdWVyeVNlbGVjdG9yKHNlbCl9CgovKiA9PT09PSBIRUFERVIgKyBEUkFXRVIgPT09PT0gKi8KdmFyIGhkcj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaGRyJyk7CmZ1bmN0aW9uIHNldFNvbGlkKCl7aWYod2luZG93LnNjcm9sbFk+NDApaGRyLmNsYXNzTGlzdC5hZGQoJ3NvbGlkJyk7ZWxzZSBoZHIuY2xhc3NMaXN0LnJlbW92ZSgnc29saWQnKX0Kd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsc2V0U29saWQse3Bhc3NpdmU6dHJ1ZX0pO3NldFNvbGlkKCk7CnZhciBoYW1iPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdoYW1iJyksZHJhd2VyPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkcmF3ZXInKSxkQ2xvc2U9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RyYXdlckNsb3NlJyk7CmlmKGhhbWIpaGFtYi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsZnVuY3Rpb24oKXtkcmF3ZXIuY2xhc3NMaXN0LmFkZCgnb3BlbicpfSk7CmlmKGRDbG9zZSlkQ2xvc2UuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLGZ1bmN0aW9uKCl7ZHJhd2VyLmNsYXNzTGlzdC5yZW1vdmUoJ29wZW4nKX0pOwppZihkcmF3ZXIpZHJhd2VyLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxmdW5jdGlvbihlKXtpZihlLnRhcmdldD09PWRyYXdlcilkcmF3ZXIuY2xhc3NMaXN0LnJlbW92ZSgnb3BlbicpfSk7CgovKiA9PT09PSBZT1VUVUJFID09PT09ICovCnZhciB5dFJlYWR5PWZhbHNlLCB5dFBsYXllcj1udWxsOwp2YXIgdGFnPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpOyB0YWcuc3JjPSdodHRwczovL3d3dy55b3V0dWJlLmNvbS9pZnJhbWVfYXBpJzsKZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZCh0YWcpOwp3aW5kb3cub25Zb3VUdWJlSWZyYW1lQVBJUmVhZHk9ZnVuY3Rpb24oKXsKICB5dFBsYXllcj1uZXcgWVQuUGxheWVyKCd5dFBsYXllcicse2V2ZW50czp7b25SZWFkeTpmdW5jdGlvbigpe3l0UmVhZHk9dHJ1ZX19fSk7Cn07CmZ1bmN0aW9uIHl0U2VlayhzZWMpewogIGlmKHl0UmVhZHkpeyB5dFBsYXllci5zZWVrVG8oc2VjLCB0cnVlKTsgeXRQbGF5ZXIucGxheVZpZGVvKCk7IH0KICBlbHNleyB2YXIgZj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgneXRQbGF5ZXInKTsgZi5zcmM9Zi5zcmMuc3BsaXQoJz8nKVswXSsnP2VuYWJsZWpzYXBpPTEmcmVsPTAmYXV0b3BsYXk9MSZzdGFydD0nK3NlYzsgfQp9CmZ1bmN0aW9uIHl0UGF1c2UoKXsgaWYoeXRSZWFkeSl5dFBsYXllci5wYXVzZVZpZGVvKCk7IH0KZnVuY3Rpb24geXRQbGF5KCl7IGlmKHl0UmVhZHkpeXRQbGF5ZXIucGxheVZpZGVvKCk7IH0KZnVuY3Rpb24geXRSZXdpbmQoKXsgaWYoeXRSZWFkeSl7IHZhciB0PXl0UGxheWVyLmdldEN1cnJlbnRUaW1lKCk7IHl0UGxheWVyLnNlZWtUbyhNYXRoLm1heCgwLHQtMTApLHRydWUpOyB9IH0KZnVuY3Rpb24geXRSYXRlKHIpeyBpZih5dFJlYWR5KXl0UGxheWVyLnNldFBsYXliYWNrUmF0ZShyKTsgfQoKJCQoJy5qdW1wLWJ0bicpLmZvckVhY2goZnVuY3Rpb24oYil7CiAgYi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsZnVuY3Rpb24oKXsKICAgIHZhciB0PXBhcnNlSW50KGIuZGF0YXNldC50aW1lKTsKICAgIHl0U2Vlayh0KTsKICAgICQkKCcuanVtcC1idG4nKS5mb3JFYWNoKGZ1bmN0aW9uKHgpe3guY2xhc3NMaXN0LnJlbW92ZSgnYWN0aXZlJyl9KTsKICAgIGIuY2xhc3NMaXN0LmFkZCgnYWN0aXZlJyk7CiAgICBpZihiLmRhdGFzZXQucGFydCAmJiBiLmRhdGFzZXQucGFydCE9PSdpbnRybycpewogICAgICB2YXIgc2VjPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwYXJ0JytiLmRhdGFzZXQucGFydCk7CiAgICAgIGlmKHNlYylzZWMuc2Nyb2xsSW50b1ZpZXcoe2JlaGF2aW9yOidzbW9vdGgnLGJsb2NrOidzdGFydCd9KTsKICAgIH0KICB9KTsKfSk7CiQkKCcuYWN0LXBpbGxbZGF0YS10aW1lXScpLmZvckVhY2goZnVuY3Rpb24oYil7CiAgYi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsZnVuY3Rpb24oKXsgeXRTZWVrKHBhcnNlSW50KGIuZGF0YXNldC50aW1lKSk7IH0pOwp9KTsKZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2J0blBhdXNlJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLHl0UGF1c2UpOwpkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYnRuUGxheScpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyx5dFBsYXkpOwpkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYnRuUmV3aW5kJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLHl0UmV3aW5kKTsKZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2J0blNsb3dlcicpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxmdW5jdGlvbigpe3l0UmF0ZSgwLjc1KX0pOwpkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYnRuTm9ybWFsJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLGZ1bmN0aW9uKCl7eXRSYXRlKDEpfSk7CgokJCgnLnRzLXRvZ2dsZSwgLnRzLWhlYWQnKS5mb3JFYWNoKGZ1bmN0aW9uKGIpewogIGIuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLGZ1bmN0aW9uKCl7CiAgICB2YXIgdGFyZ2V0PWIuZGF0YXNldC50YXJnZXR8fGIuZGF0YXNldC50b2dnbGU7CiAgICBpZighdGFyZ2V0KXsgdmFyIGNhcmQ9Yi5jbG9zZXN0KCcudHJhbnNjcmlwdC1jYXJkJyk7IGlmKGNhcmQpdGFyZ2V0PWNhcmQuaWQ7IH0KICAgIHZhciBjYXJkPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRhcmdldCk7CiAgICBpZihjYXJkKWNhcmQuY2xhc3NMaXN0LnRvZ2dsZSgnY29sbGFwc2VkJyk7CiAgfSk7Cn0pOwoKLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqIFBBUlQgMSDigJQgRFJBVyBMSU5FUwogKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KdmFyIFAxX3VzZXJNYXRjaGVzID0ge307IC8vIHsgbmFtZU46IHRndEtleSB9CnZhciBQMV9zZWxlY3RlZE5hbWUgPSBudWxsOwp2YXIgcGFpck5hbWVzRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncGFpck5hbWVzJyk7CnZhciBwYWlyVGFyZ2V0c0VsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3BhaXJUYXJnZXRzJyk7CnZhciBwYWlyTGluZXNFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwYWlyTGluZXMnKTsKdmFyIHBhaXJJbWcgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncGFpckltZycpOwp2YXIgcGFpclNjZW5lID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3BhaXJTY2VuZScpOwoKZnVuY3Rpb24gcmVuZGVyUDFOYW1lcygpewogIHBhaXJOYW1lc0VsLmlubmVySFRNTCA9ICcnOwogIFAxX05BTUVTLmZvckVhY2goZnVuY3Rpb24obmFtZSl7CiAgICB2YXIgZGl2PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogICAgZGl2LmNsYXNzTmFtZT0ncGFpci1uYW1lJyArIChuYW1lLmlzRXhhbXBsZT8nIGV4YW1wbGUnOicnKTsKICAgIGRpdi5kYXRhc2V0Lm4gPSBuYW1lLm47CiAgICBkaXYuaW5uZXJIVE1MID0gJzxzcGFuIGNsYXNzPSJwbi1udW0iPicrZXNjKFN0cmluZyhuYW1lLm4pKSsnPC9zcGFuPjxzcGFuPicrZXNjKG5hbWUubmFtZSkrJzwvc3Bhbj48c3BhbiBjbGFzcz0icG4tZG90Ij48L3NwYW4+JzsKICAgIGlmKCFuYW1lLmlzRXhhbXBsZSl7CiAgICAgIGRpdi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsZnVuY3Rpb24oKXsKICAgICAgICAkJCgnLnBhaXItbmFtZScscGFpck5hbWVzRWwpLmZvckVhY2goZnVuY3Rpb24oeCl7eC5jbGFzc0xpc3QucmVtb3ZlKCdzZWxlY3RlZCcpfSk7CiAgICAgICAgaWYoUDFfc2VsZWN0ZWROYW1lPT09bmFtZS5uKXsgUDFfc2VsZWN0ZWROYW1lPW51bGw7IH0KICAgICAgICBlbHNlIHsgZGl2LmNsYXNzTGlzdC5hZGQoJ3NlbGVjdGVkJyk7IFAxX3NlbGVjdGVkTmFtZT1uYW1lLm47IH0KICAgICAgfSk7CiAgICB9CiAgICBwYWlyTmFtZXNFbC5hcHBlbmRDaGlsZChkaXYpOwogIH0pOwp9CgpmdW5jdGlvbiByZW5kZXJQMVRhcmdldHMoKXsKICBwYWlyVGFyZ2V0c0VsLmlubmVySFRNTD0nJzsKICBQMV9UQVJHRVRTLmZvckVhY2goZnVuY3Rpb24odCl7CiAgICB2YXIgZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgIGQuY2xhc3NOYW1lPSd0Z3QnKyh0LmlzRXhhbXBsZT8nIGV4YW1wbGUnOicnKTsKICAgIGQuc3R5bGUubGVmdD10LngrJyUnOwogICAgZC5zdHlsZS50b3A9dC55KyclJzsKICAgIGQuZGF0YXNldC5rZXk9dC5rZXk7CiAgICBkLmlubmVySFRNTD0nPHNwYW4gY2xhc3M9InRsYWJlbCI+Jytlc2ModC5sYWJlbCkrJzwvc3Bhbj4nOwogICAgaWYoIXQuaXNFeGFtcGxlKXsKICAgICAgZC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsZnVuY3Rpb24oKXsKICAgICAgICBpZighUDFfc2VsZWN0ZWROYW1lKXJldHVybjsKICAgICAgICAvLyByZW1vdmUgZXhpc3RpbmcgbWF0Y2ggZm9yIHRoaXMgbmFtZQogICAgICAgIGRlbGV0ZSBQMV91c2VyTWF0Y2hlc1tQMV9zZWxlY3RlZE5hbWVdOwogICAgICAgIC8vIHJlbW92ZSBhbnkgbmFtZSB0aGF0IG1hcHMgdG8gdGhpcyB0YXJnZXQKICAgICAgICBPYmplY3Qua2V5cyhQMV91c2VyTWF0Y2hlcykuZm9yRWFjaChmdW5jdGlvbihrKXsKICAgICAgICAgIGlmKFAxX3VzZXJNYXRjaGVzW2tdPT09dC5rZXkpIGRlbGV0ZSBQMV91c2VyTWF0Y2hlc1trXTsKICAgICAgICB9KTsKICAgICAgICBQMV91c2VyTWF0Y2hlc1tQMV9zZWxlY3RlZE5hbWVdID0gdC5rZXk7CiAgICAgICAgdmFyIG5hbWVFbCA9IHBhaXJOYW1lc0VsLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLW49IicrUDFfc2VsZWN0ZWROYW1lKyciXScpOwogICAgICAgIGlmKG5hbWVFbCl7bmFtZUVsLmNsYXNzTGlzdC5yZW1vdmUoJ3NlbGVjdGVkJyk7bmFtZUVsLmNsYXNzTGlzdC5hZGQoJ21hdGNoZWQnKTt9CiAgICAgICAgUDFfc2VsZWN0ZWROYW1lPW51bGw7CiAgICAgICAgZHJhd1AxTGluZXMoKTsKICAgICAgICB1cGRhdGVQcm9ncmVzcygpOwogICAgICB9KTsKICAgIH0KICAgIHBhaXJUYXJnZXRzRWwuYXBwZW5kQ2hpbGQoZCk7CiAgfSk7Cn0KCmZ1bmN0aW9uIGRyYXdQMUxpbmVzKG9wdHMpewogIG9wdHMgPSBvcHRzIHx8IHt9OwogIHZhciBzaG93Q29ycmVjdCA9IG9wdHMuc2hvd0NvcnJlY3Q7CiAgdmFyIGJib3ggPSBwYWlySW1nLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogIHZhciBzY2VuZUJib3ggPSBwYWlyU2NlbmUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CiAgcGFpckxpbmVzRWwuc2V0QXR0cmlidXRlKCd3aWR0aCcsIHNjZW5lQmJveC53aWR0aCk7CiAgcGFpckxpbmVzRWwuc2V0QXR0cmlidXRlKCdoZWlnaHQnLCBzY2VuZUJib3guaGVpZ2h0KTsKICBwYWlyTGluZXNFbC5zZXRBdHRyaWJ1dGUoJ3ZpZXdCb3gnLCAnMCAwICcrc2NlbmVCYm94LndpZHRoKycgJytzY2VuZUJib3guaGVpZ2h0KTsKICB2YXIgc3ZnbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJzsKICBwYWlyTGluZXNFbC5pbm5lckhUTUw9Jyc7CgogIC8vIGV4YW1wbGUgbGluZSAoYWx3YXlzIHNob3cpCiAgdmFyIGV4TmFtZSA9IFAxX05BTUVTLmZpbmQoZnVuY3Rpb24obil7cmV0dXJuIG4uaXNFeGFtcGxlfSk7CiAgdmFyIGV4VGd0ID0gUDFfVEFSR0VUUy5maW5kKGZ1bmN0aW9uKHQpe3JldHVybiB0LmlzRXhhbXBsZX0pOwogIGlmKGV4TmFtZSAmJiBleFRndCl7CiAgICBkcmF3TGluZShleE5hbWUubiwgZXhUZ3QsICcjRkJCRjI0JywgMywgdHJ1ZSk7CiAgfQoKICAvLyB1c2VyIGxpbmVzIChvciBjb3JyZWN0IGxpbmVzIGlmIHNob3dDb3JyZWN0KQogIFAxX05BTUVTLmZvckVhY2goZnVuY3Rpb24obmFtZSl7CiAgICBpZihuYW1lLmlzRXhhbXBsZSlyZXR1cm47CiAgICB2YXIgdGd0S2V5OwogICAgaWYoc2hvd0NvcnJlY3QpIHRndEtleSA9IG5hbWUuYW5zOwogICAgZWxzZSB0Z3RLZXkgPSBQMV91c2VyTWF0Y2hlc1tuYW1lLm5dOwogICAgaWYoIXRndEtleSlyZXR1cm47CiAgICB2YXIgdGd0ID0gUDFfVEFSR0VUUy5maW5kKGZ1bmN0aW9uKHQpe3JldHVybiB0LmtleT09PXRndEtleX0pOwogICAgaWYoIXRndClyZXR1cm47CiAgICB2YXIgY29sb3VyID0gc2hvd0NvcnJlY3QgPyAnIzEwQjk4MScgOiAnIzA2QjZENCc7CiAgICBkcmF3TGluZShuYW1lLm4sIHRndCwgY29sb3VyLCAyLjUsIGZhbHNlKTsKICB9KTsKCiAgZnVuY3Rpb24gZHJhd0xpbmUobmFtZU4sIHRndCwgY29sb3VyLCB3LCBpc0V4YW1wbGUpewogICAgdmFyIG5hbWVFbCA9IHBhaXJOYW1lc0VsLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLW49IicrbmFtZU4rJyJdJyk7CiAgICBpZighbmFtZUVsKXJldHVybjsKICAgIHZhciBuYiA9IG5hbWVFbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKICAgIHZhciB4MSA9IG5iLnJpZ2h0IC0gc2NlbmVCYm94LmxlZnQ7CiAgICB2YXIgeTEgPSBuYi50b3AgKyBuYi5oZWlnaHQvMiAtIHNjZW5lQmJveC50b3A7CiAgICB2YXIgeDIgPSB0Z3QueC8xMDAgKiBzY2VuZUJib3gud2lkdGg7CiAgICB2YXIgeTIgPSB0Z3QueS8xMDAgKiBzY2VuZUJib3guaGVpZ2h0OwogICAgdmFyIGxpbmUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoc3ZnbnMsJ2xpbmUnKTsKICAgIGxpbmUuc2V0QXR0cmlidXRlKCd4MScseDEpOwogICAgbGluZS5zZXRBdHRyaWJ1dGUoJ3kxJyx5MSk7CiAgICBsaW5lLnNldEF0dHJpYnV0ZSgneDInLHgyKTsKICAgIGxpbmUuc2V0QXR0cmlidXRlKCd5MicseTIpOwogICAgbGluZS5zZXRBdHRyaWJ1dGUoJ3N0cm9rZScsY29sb3VyKTsKICAgIGxpbmUuc2V0QXR0cmlidXRlKCdzdHJva2Utd2lkdGgnLHcpOwogICAgbGluZS5zZXRBdHRyaWJ1dGUoJ3N0cm9rZS1saW5lY2FwJywncm91bmQnKTsKICAgIGlmKGlzRXhhbXBsZSkgbGluZS5zZXRBdHRyaWJ1dGUoJ3N0cm9rZS1kYXNoYXJyYXknLCc2IDQnKTsKICAgIGxpbmUuc3R5bGUucG9pbnRlckV2ZW50cyA9IGlzRXhhbXBsZSA\/ICdub25lJyA6ICdzdHJva2UnOwogICAgbGluZS5zdHlsZS5jdXJzb3IgPSBpc0V4YW1wbGUgPyAnZGVmYXVsdCcgOiAncG9pbnRlcic7CiAgICBpZighaXNFeGFtcGxlKXsKICAgICAgbGluZS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsZnVuY3Rpb24oKXsKICAgICAgICAvLyBlcmFzZSB0aGlzIGxpbmUKICAgICAgICBkZWxldGUgUDFfdXNlck1hdGNoZXNbbmFtZU5dOwogICAgICAgIHZhciBuYW1lRWwyID0gcGFpck5hbWVzRWwucXVlcnlTZWxlY3RvcignW2RhdGEtbj0iJytuYW1lTisnIl0nKTsKICAgICAgICBpZihuYW1lRWwyKSBuYW1lRWwyLmNsYXNzTGlzdC5yZW1vdmUoJ21hdGNoZWQnKTsKICAgICAgICBkcmF3UDFMaW5lcygpOwogICAgICAgIHVwZGF0ZVByb2dyZXNzKCk7CiAgICAgIH0pOwogICAgfQogICAgcGFpckxpbmVzRWwuYXBwZW5kQ2hpbGQobGluZSk7CiAgfQp9CgpmdW5jdGlvbiBwMVJldmVhbCgpewogIC8vIHNob3cgY29ycmVjdCBsaW5lcywgbG9jayBpbnRlcmFjdGlvbnMKICBkcmF3UDFMaW5lcyh7c2hvd0NvcnJlY3Q6dHJ1ZX0pOwogICQkKCcucGFpci1uYW1lJyxwYWlyTmFtZXNFbCkuZm9yRWFjaChmdW5jdGlvbihlbCl7CiAgICBlbC5zdHlsZS5vcGFjaXR5PScuNyc7CiAgICBlbC5zdHlsZS5wb2ludGVyRXZlbnRzPSdub25lJzsKICB9KTsKICAkJCgnLnRndCcscGFpclRhcmdldHNFbCkuZm9yRWFjaChmdW5jdGlvbihlbCl7CiAgICBpZighZWwuY2xhc3NMaXN0LmNvbnRhaW5zKCdleGFtcGxlJykpZWwuc3R5bGUucG9pbnRlckV2ZW50cz0nbm9uZSc7CiAgfSk7Cn0KCmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwMUNsZWFyJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLGZ1bmN0aW9uKCl7CiAgaWYoIWNvbmZpcm0oJ0NsZWFyIGFsbCB5b3VyIFBhcnQgMSBsaW5lcz8nKSlyZXR1cm47CiAgUDFfdXNlck1hdGNoZXM9e307CiAgJCQoJy5wYWlyLW5hbWUnLHBhaXJOYW1lc0VsKS5mb3JFYWNoKGZ1bmN0aW9uKHgpe3guY2xhc3NMaXN0LnJlbW92ZSgnbWF0Y2hlZCcsJ3NlbGVjdGVkJyl9KTsKICBkcmF3UDFMaW5lcygpOwogIHVwZGF0ZVByb2dyZXNzKCk7Cn0pOwoKd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsZnVuY3Rpb24oKXtkcmF3UDFMaW5lcygpfSk7CgpyZW5kZXJQMU5hbWVzKCk7CnJlbmRlclAxVGFyZ2V0cygpOwpwYWlySW1nLmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWQnLGRyYXdQMUxpbmVzKTsKLy8gYWxzbyBkcmF3IGFmdGVyIGEgdGljayAoaW4gY2FzZSBjYWNoZWQpCnNldFRpbWVvdXQoZHJhd1AxTGluZXMsIDIwMCk7CgovKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT0KICogUEFSVCAyIOKAlCBJTlBVVCBCTEFOS1MKICogPT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCihmdW5jdGlvbigpewogIHZhciBleGFtcGxlc0VsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3AyRXhhbXBsZXMnKTsKICBQMl9FWEFNUExFUy5mb3JFYWNoKGZ1bmN0aW9uKGV4KXsKICAgIGV4YW1wbGVzRWwuaW5zZXJ0QWRqYWNlbnRIVE1MKCdiZWZvcmVlbmQnLAogICAgICAnPGRpdiBjbGFzcz0iZm9ybS1yb3cgZXhhbXBsZSI+PGxhYmVsPicrZXNjKGV4LmxhYmVsKSsnIDxzcGFuIGNsYXNzPSJleC10YWciPkV4PC9zcGFuPjwvbGFiZWw+PHNwYW4gc3R5bGU9ImNvbG9yOiM3QjVCMDA7Zm9udC13ZWlnaHQ6NzAwIj4nK2VzYyhleC5kaXNwbGF5KSsnPC9zcGFuPjwvZGl2PicKICAgICk7CiAgfSk7CiAgdmFyIHF1ZXN0RWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncDJRdWVzdGlvbnMnKTsKICBQMl9RVUVTVElPTlMuZm9yRWFjaChmdW5jdGlvbihxKXsKICAgIHZhciBwcmVmaXhIdG1sID0gcS5wcmVmaXggPyBlc2MocS5wcmVmaXgpKycgJyA6ICcnOwogICAgcXVlc3RFbC5pbnNlcnRBZGphY2VudEhUTUwoJ2JlZm9yZWVuZCcsCiAgICAgICc8ZGl2IGNsYXNzPSJmb3JtLXJvdyI+PGxhYmVsPjxiPicrcS5uKycuPC9iPiAnK2VzYyhxLmxhYmVsKSsnPC9sYWJlbD4nKwogICAgICAnPHNwYW4gc3R5bGU9ImRpc3BsYXk6aW5saW5lLWZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2dhcDo0cHgiPicrcHJlZml4SHRtbCsKICAgICAgJzxpbnB1dCBjbGFzcz0iaW5wdXQtYmxhbmsiIGRhdGEtcT0iJytxLm4rJyIgdHlwZT0idGV4dCIgcGxhY2Vob2xkZXI9Ii4uLiI+PC9zcGFuPicrCiAgICAgICc8YnV0dG9uIGNsYXNzPSJzaG93LWFucy1idG4iIGRhdGEtc2hvdz0iJytxLm4rJyI+8J+RgSBTaG93PC9idXR0b24+PC9kaXY+JwogICAgKTsKICB9KTsKfSkoKTsKCi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PQogKiBQQVJUIDMg4oCUIFBJQ1RVUkUgTUNRCiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwooZnVuY3Rpb24oKXsKICB2YXIgbGlzdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwYXJ0M0xpc3QnKTsKICAvLyBleGFtcGxlCiAgaWYoUDNfRVhBTVBMRSl7CiAgICB2YXIgZXhIdG1sID0gJzxkaXYgY2xhc3M9InEtaXRlbSByZXZlYWxlZCIgc3R5bGU9Im9wYWNpdHk6LjgiPjxkaXYgY2xhc3M9InEtdGV4dCI+PGIgY2xhc3M9InFuIj5FeC48L2I+PHNwYW4+Jytlc2MoUDNfRVhBTVBMRS5xKSsnICZtZGFzaDsgYW5zd2VyOiA8Yj4nK2VzYyhQM19FWEFNUExFLmFucykrJzwvYj48L3NwYW4+PC9kaXY+PGRpdiBjbGFzcz0icGljLW1jcSI+JzsKICAgIFAzX0VYQU1QTEUub3B0cy5mb3JFYWNoKGZ1bmN0aW9uKG8pewogICAgICB2YXIgc2VsID0gby5pc0Fuc3dlciA\/ICcgc2VsZWN0ZWQgY29ycmVjdC1vcHQnIDogJyc7CiAgICAgIGV4SHRtbCArPSAnPGRpdiBjbGFzcz0icGljLW9wdCcrc2VsKyciPjxpbWcgc3JjPSInK28uaW1nKyciIGFsdD0iZXhhbXBsZSAnK28ubGV0dGVyKyciPjxkaXYgY2xhc3M9InBpYy1sZXR0ZXIiPjxiPicrby5sZXR0ZXIrJzwvYj48c3BhbiBjbGFzcz0icGljLXRpY2siPicrKG8uaXNBbnN3ZXI\/J+Kckyc6JycpKyc8L3NwYW4+PC9kaXY+PC9kaXY+JzsKICAgIH0pOwogICAgZXhIdG1sICs9ICc8L2Rpdj48L2Rpdj4nOwogICAgbGlzdC5pbnNlcnRBZGphY2VudEhUTUwoJ2JlZm9yZWVuZCcsIGV4SHRtbCk7CiAgfQogIFAzX1FVRVNUSU9OUy5mb3JFYWNoKGZ1bmN0aW9uKHEpewogICAgdmFyIGggPSAnPGRpdiBjbGFzcz0icS1pdGVtIiBpZD0icScrcS5uKyciIGRhdGEtcWlkPSInK3EubisnIj48ZGl2IGNsYXNzPSJxLXRleHQiPjxiIGNsYXNzPSJxbiI+JytxLm4rJy48L2I+PHNwYW4+Jytlc2MocS5xKSsnPC9zcGFuPjwvZGl2PjxkaXYgY2xhc3M9InBpYy1tY3EiPic7CiAgICBxLm9wdHMuZm9yRWFjaChmdW5jdGlvbihvKXsKICAgICAgaCArPSAnPGRpdiBjbGFzcz0icGljLW9wdCIgZGF0YS1sZXR0ZXI9Iicrby5sZXR0ZXIrJyIgZGF0YS1xPSInK3EubisnIj48aW1nIHNyYz0iJytvLmltZysnIiBhbHQ9IlEnK3EubisnIG9wdGlvbiAnK28ubGV0dGVyKyciIGxvYWRpbmc9ImxhenkiPjxkaXYgY2xhc3M9InBpYy1sZXR0ZXIiPjxiPicrby5sZXR0ZXIrJzwvYj48c3BhbiBjbGFzcz0icGljLXRpY2siPuKckzwvc3Bhbj48L2Rpdj48L2Rpdj4nOwogICAgfSk7CiAgICBoICs9ICc8L2Rpdj48ZGl2IGNsYXNzPSJmZWVkYmFjayI+PC9kaXY+PGRpdiBjbGFzcz0icS1ib3R0b20iPjxidXR0b24gY2xhc3M9InNob3ctYW5zLWJ0biIgZGF0YS1zaG93PSInK3EubisnIj7wn5GBIFNob3cgQW5zd2VyPC9idXR0b24+PC9kaXY+PC9kaXY+JzsKICAgIGxpc3QuaW5zZXJ0QWRqYWNlbnRIVE1MKCdiZWZvcmVlbmQnLCBoKTsKICB9KTsKICAvLyB3aXJlIHBpYyBjbGlja3MKICAkJCgnLnBpYy1vcHRbZGF0YS1xXScpLmZvckVhY2goZnVuY3Rpb24ob3B0KXsKICAgIG9wdC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsZnVuY3Rpb24oKXsKICAgICAgdmFyIHFpZCA9IG9wdC5kYXRhc2V0LnE7CiAgICAgICQkKCcucGljLW9wdFtkYXRhLXE9IicrcWlkKyciXScpLmZvckVhY2goZnVuY3Rpb24obyl7by5jbGFzc0xpc3QucmVtb3ZlKCdzZWxlY3RlZCcpfSk7CiAgICAgIG9wdC5jbGFzc0xpc3QuYWRkKCdzZWxlY3RlZCcpOwogICAgICB1cGRhdGVQcm9ncmVzcygpOwogICAgfSk7CiAgfSk7Cn0pKCk7CgovKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT0KICogUEFSVCA0IOKAlCBDT0xPVVIgUEFMRVRURQogKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KdmFyIFA0X3NlbGVjdGVkQ29sb3VyID0gbnVsbDsKdmFyIFA0X3VzZXJDb2xvdXJzID0ge307IC8vIHsgcmVnaW9uOiBjb2xvdXJLZXkgfQp2YXIgUDRfUkVHSU9OX1RPX1FOID0ge307ClA0X0lURU1TLmZvckVhY2goZnVuY3Rpb24oaXQpeyBQNF9SRUdJT05fVE9fUU5baXQucmVnaW9uXT1pdC5uOyB9KTsKCihmdW5jdGlvbigpewogIHZhciBwYWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29sb3VyUGFsZXR0ZScpOwogIC8vIGVyYXNlciBmaXJzdAogIHZhciBlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogIGVyLmNsYXNzTmFtZT0nc3dhdGNoIGVyYXNlcic7CiAgZXIuZGF0YXNldC5jb2xvdXI9J19fZXJhc2UnOwogIGVyLmlubmVySFRNTD0nPHNwYW4gY2xhc3M9InN3LWxhYmVsIj5lcmFzZXI8L3NwYW4+JzsKICBlci5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsZnVuY3Rpb24oKXtzZWxlY3RTd2F0Y2goZXIsJ19fZXJhc2UnKX0pOwogIHBhbC5hcHBlbmRDaGlsZChlcik7CiAgUDRfQ09MT1VSUy5mb3JFYWNoKGZ1bmN0aW9uKGMpewogICAgdmFyIHM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICBzLmNsYXNzTmFtZT0nc3dhdGNoJzsKICAgIHMuc3R5bGUuYmFja2dyb3VuZD1jLmhleDsKICAgIHMuZGF0YXNldC5jb2xvdXI9Yy5rZXk7CiAgICBzLmlubmVySFRNTD0nPHNwYW4gY2xhc3M9InN3LWxhYmVsIj4nK2Mua2V5Kyc8L3NwYW4+JzsKICAgIHMuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLGZ1bmN0aW9uKCl7c2VsZWN0U3dhdGNoKHMsYy5rZXkpfSk7CiAgICBwYWwuYXBwZW5kQ2hpbGQocyk7CiAgfSk7CgogIGZ1bmN0aW9uIHNlbGVjdFN3YXRjaChlbCxrZXkpewogICAgJCQoJy5zd2F0Y2gnLHBhbCkuZm9yRWFjaChmdW5jdGlvbih4KXt4LmNsYXNzTGlzdC5yZW1vdmUoJ3NlbGVjdGVkJyl9KTsKICAgIGVsLmNsYXNzTGlzdC5hZGQoJ3NlbGVjdGVkJyk7CiAgICBQNF9zZWxlY3RlZENvbG91cj1rZXk7CiAgfQoKICAvLyBpbnN0cnVjdGlvbnMKICB2YXIgaW5zID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbG91ckluc3RydWN0aW9ucycpOwogIGlmKFA0X0VYQU1QTEUpewogICAgaW5zLmluc2VydEFkamFjZW50SFRNTCgnYmVmb3JlZW5kJywKICAgICAgJzxkaXYgY2xhc3M9ImNvbC1pbnMgZXhhbXBsZSI+PHNwYW4gY2xhc3M9ImNpLW51bSI+RXg8L3NwYW4+PHNwYW4+Jytlc2MoUDRfRVhBTVBMRS5pbnN0cnVjdGlvbikrJzwvc3Bhbj48c3BhbiBjbGFzcz0iY2ktZG90IiBzdHlsZT0iYmFja2dyb3VuZDonK2dldEhleChQNF9FWEFNUExFLmNvbG91cikrJyI+PC9zcGFuPjwvZGl2PicKICAgICk7CiAgICAvLyBwcmUtY29sb3VyIGV4YW1wbGUgcmVnaW9uCiAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7YXBwbHlDb2xvdXJUb1JlZ2lvbihQNF9FWEFNUExFLnJlZ2lvbixnZXRIZXgoUDRfRVhBTVBMRS5jb2xvdXIpLHRydWUpfSwxNTApOwogIH0KICBQNF9JVEVNUy5mb3JFYWNoKGZ1bmN0aW9uKGl0KXsKICAgIGlucy5pbnNlcnRBZGphY2VudEhUTUwoJ2JlZm9yZWVuZCcsCiAgICAgICc8ZGl2IGNsYXNzPSJjb2wtaW5zIiBkYXRhLXFuPSInK2l0Lm4rJyI+PHNwYW4gY2xhc3M9ImNpLW51bSI+JytpdC5uKyc8L3NwYW4+PHNwYW4+Jytlc2MoaXQuaW5zdHJ1Y3Rpb24pKyc8L3NwYW4+PHNwYW4gY2xhc3M9ImNpLWRvdCIgZGF0YS1kb3Rmb3I9IicraXQubisnIiBzdHlsZT0iYmFja2dyb3VuZDojZmZmIj48L3NwYW4+PC9kaXY+JwogICAgKTsKICB9KTsKCiAgLy8gd2lyZSBTVkcgcmVnaW9ucwogIHZhciBzY2VuZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb2xvdXJTY2VuZScpOwogICQkKCdbZGF0YS1yZWdpb25dJyxzY2VuZSkuZm9yRWFjaChmdW5jdGlvbihyZWcpewogICAgcmVnLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxmdW5jdGlvbigpewogICAgICBpZighUDRfc2VsZWN0ZWRDb2xvdXIpe2FsZXJ0KCdQbGVhc2UgcGljayBhIGNvbG91ciBmaXJzdCDwn46oJyk7cmV0dXJufQogICAgICBpZihyZWcuZGF0YXNldC5sb2NrZWQ9PT0nMScpcmV0dXJuOwogICAgICB2YXIgcmtleSA9IHJlZy5kYXRhc2V0LnJlZ2lvbjsKICAgICAgaWYoUDRfc2VsZWN0ZWRDb2xvdXI9PT0nX19lcmFzZScpewogICAgICAgIGFwcGx5Q29sb3VyVG9SZWdpb24ocmtleSwnI0ZGRkZGRicsZmFsc2UpOwogICAgICAgIGRlbGV0ZSBQNF91c2VyQ29sb3Vyc1tya2V5XTsKICAgICAgfSBlbHNlIHsKICAgICAgICBhcHBseUNvbG91clRvUmVnaW9uKHJrZXksZ2V0SGV4KFA0X3NlbGVjdGVkQ29sb3VyKSxmYWxzZSk7CiAgICAgICAgUDRfdXNlckNvbG91cnNbcmtleV09UDRfc2VsZWN0ZWRDb2xvdXI7CiAgICAgIH0KICAgICAgLy8gdXBkYXRlIGRvdAogICAgICB2YXIgcW4gPSBQNF9SRUdJT05fVE9fUU5bcmtleV07CiAgICAgIGlmKHFuKXsKICAgICAgICB2YXIgZG90ID0gc2NlbmUucGFyZW50RWxlbWVudC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1kb3Rmb3I9IicrcW4rJyJdJyk7CiAgICAgICAgaWYoZG90KSBkb3Quc3R5bGUuYmFja2dyb3VuZCA9IChQNF9zZWxlY3RlZENvbG91cj09PSdfX2VyYXNlJz8nI2ZmZic6Z2V0SGV4KFA0X3NlbGVjdGVkQ29sb3VyKSk7CiAgICAgIH0KICAgICAgdXBkYXRlUHJvZ3Jlc3MoKTsKICAgIH0pOwogIH0pOwoKLyogRkxZRVJTIFBBUlQgMyDigJQgTXVsdGlwbGUgbWF0Y2hpbmcgQS1IICovCihmdW5jdGlvbigpewogIHZhciBiYW5rID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3AzTGV0dGVyQmFuaycpOwogIGlmKGJhbmspewogICAgUDNfTEVUVEVSX0JBTksuZm9yRWFjaChmdW5jdGlvbihiKXsKICAgICAgYmFuay5pbnNlcnRBZGphY2VudEhUTUwoJ2JlZm9yZWVuZCcsCiAgICAgICAgJzxkaXYgY2xhc3M9Im1hdGNoLWxldHRlciI+PGI+JytiLkwrJzwvYj4gJytiLmxhYmVsKyc8L2Rpdj4nKTsKICAgIH0pOwogIH0KICB2YXIgbGlzdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwYXJ0M0xpc3QnKTsKICBpZihsaXN0KXsKICAgIC8vIGV4YW1wbGUgcm93CiAgICBpZihQM19FWEFNUExFX01BVENIKXsKICAgICAgdmFyIGV4PSc8ZGl2IGNsYXNzPSJxLWl0ZW0gcmV2ZWFsZWQiIHN0eWxlPSJvcGFjaXR5Oi44NSI+PGRpdiBjbGFzcz0icS10ZXh0Ij48YiBjbGFzcz0icW4iPkV4LjwvYj48c3Bhbj4nK1AzX0VYQU1QTEVfTUFUQ0gucGVyc29uKycgJm1kYXNoOyBhbnN3ZXI6IDxiPicrUDNfRVhBTVBMRV9NQVRDSC5hbnMrJzwvYj4gKCcrUDNfRVhBTVBMRV9NQVRDSC53aHkrJyk8L3NwYW4+PC9kaXY+PC9kaXY+JzsKICAgICAgbGlzdC5pbnNlcnRBZGphY2VudEhUTUwoJ2JlZm9yZWVuZCcsIGV4KTsKICAgIH0KICAgIFAzX1FVRVNUSU9OU19NQVRDSC5mb3JFYWNoKGZ1bmN0aW9uKHEpewogICAgICB2YXIgb3B0c0hUTUw9Jyc7CiAgICAgIFsnQScsJ0InLCdDJywnRCcsJ0UnLCdGJywnRycsJ0gnXS5mb3JFYWNoKGZ1bmN0aW9uKEwpewogICAgICAgIG9wdHNIVE1MICs9ICc8bGFiZWwgY2xhc3M9Im9wdCIgZGF0YS1sZXR0ZXI9IicrTCsnIiBkYXRhLXE9IicrcS5uKyciPjxpbnB1dCB0eXBlPSJyYWRpbyIgbmFtZT0icScrcS5uKyciIHZhbHVlPSInK0wrJyI+PHNwYW4gY2xhc3M9Im9wdC1sZXR0ZXIiPicrTCsnPC9zcGFuPjwvbGFiZWw+JzsKICAgICAgfSk7CiAgICAgIGxpc3QuaW5zZXJ0QWRqYWNlbnRIVE1MKCdiZWZvcmVlbmQnLAogICAgICAgICc8ZGl2IGNsYXNzPSJxLWl0ZW0iIGlkPSJxJytxLm4rJyIgZGF0YS1xaWQ9IicrcS5uKyciPjxkaXYgY2xhc3M9InEtdGV4dCI+PGIgY2xhc3M9InFuIj4nK3EubisnLjwvYj48c3Bhbj4nK3EucGVyc29uKyc8L3NwYW4+PC9kaXY+PGRpdiBjbGFzcz0icS1vcHRzIj4nK29wdHNIVE1MKyc8L2Rpdj48ZGl2IGNsYXNzPSJmZWVkYmFjayI+PC9kaXY+PGRpdiBjbGFzcz0icS1ib3R0b20iPjxidXR0b24gY2xhc3M9InNob3ctYW5zLWJ0biIgZGF0YS1zaG93PSInK3EubisnIj7wn5GBIFNob3cgQW5zd2VyPC9idXR0b24+PC9kaXY+PC9kaXY+Jyk7CiAgICB9KTsKICAgIC8vIHdpcmUgY2xpY2tzCiAgICBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcub3B0W2RhdGEtcV0nKSkuZm9yRWFjaChmdW5jdGlvbihvcHQpewogICAgICBvcHQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLGZ1bmN0aW9uKGUpewogICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICB2YXIgcWlkPW9wdC5kYXRhc2V0LnE7CiAgICAgICAgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLm9wdFtkYXRhLXE9IicrcWlkKyciXScpKS5mb3JFYWNoKGZ1bmN0aW9uKG8pe28uY2xhc3NMaXN0LnJlbW92ZSgnc2VsZWN0ZWQnKX0pOwogICAgICAgIG9wdC5jbGFzc0xpc3QuYWRkKCdzZWxlY3RlZCcpOwogICAgICAgIHZhciBpbnB1dD1vcHQucXVlcnlTZWxlY3RvcignaW5wdXQnKTsgaWYoaW5wdXQpaW5wdXQuY2hlY2tlZD10cnVlOwogICAgICAgIHVwZGF0ZVByb2dyZXNzKCk7CiAgICAgIH0pOwogICAgfSk7CiAgfQp9KSgpOwoKCi8qIEZMWUVSUyBQQVJUIDQg4oCUIFBpY3R1cmUgTUNRICovCihmdW5jdGlvbigpewogIHZhciBsaXN0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3BhcnQ0TGlzdCcpOwogIGlmKCFsaXN0KXJldHVybjsKICBpZihQNF9FWEFNUExFX1BJQyl7CiAgICB2YXIgZXg9JzxkaXYgY2xhc3M9InEtaXRlbSByZXZlYWxlZCIgc3R5bGU9Im9wYWNpdHk6LjgiPjxkaXYgY2xhc3M9InEtdGV4dCI+PGIgY2xhc3M9InFuIj5FeC48L2I+PHNwYW4+JytQNF9FWEFNUExFX1BJQy5xKycgJm1kYXNoOyBhbnN3ZXI6IDxiPicrUDRfRVhBTVBMRV9QSUMuYW5zKyc8L2I+PC9zcGFuPjwvZGl2PjxkaXYgY2xhc3M9InBpYy1tY3EiPic7CiAgICBQNF9FWEFNUExFX1BJQy5vcHRzLmZvckVhY2goZnVuY3Rpb24obyl7CiAgICAgIHZhciBzZWwgPSBvLmlzQW5zd2VyID8gJyBzZWxlY3RlZCBjb3JyZWN0LW9wdCcgOiAnJzsKICAgICAgZXggKz0gJzxkaXYgY2xhc3M9InBpYy1vcHQnK3NlbCsnIj48aW1nIHNyYz0iJytvLmltZysnIiBhbHQ9ImV4YW1wbGUgJytvLmxldHRlcisnIj48ZGl2IGNsYXNzPSJwaWMtbGV0dGVyIj48Yj4nK28ubGV0dGVyKyc8L2I+PHNwYW4gY2xhc3M9InBpYy10aWNrIj4nKyhvLmlzQW5zd2VyPyfinJMnOicnKSsnPC9zcGFuPjwvZGl2PjwvZGl2Pic7CiAgICB9KTsKICAgIGV4ICs9ICc8L2Rpdj48L2Rpdj4nOwogICAgbGlzdC5pbnNlcnRBZGphY2VudEhUTUwoJ2JlZm9yZWVuZCcsIGV4KTsKICB9CiAgUDRfUVVFU1RJT05TX1BJQy5mb3JFYWNoKGZ1bmN0aW9uKHEpewogICAgdmFyIGg9JzxkaXYgY2xhc3M9InEtaXRlbSIgaWQ9InEnK3EubisnIiBkYXRhLXFpZD0iJytxLm4rJyI+PGRpdiBjbGFzcz0icS10ZXh0Ij48YiBjbGFzcz0icW4iPicrcS5uKycuPC9iPjxzcGFuPicrcS5xKyc8L3NwYW4+PC9kaXY+PGRpdiBjbGFzcz0icGljLW1jcSI+JzsKICAgIHEub3B0cy5mb3JFYWNoKGZ1bmN0aW9uKG8pewogICAgICBoICs9ICc8ZGl2IGNsYXNzPSJwaWMtb3B0IiBkYXRhLWxldHRlcj0iJytvLmxldHRlcisnIiBkYXRhLXE9IicrcS5uKyciPjxpbWcgc3JjPSInK28uaW1nKyciIGFsdD0iUScrcS5uKycgb3B0aW9uICcrby5sZXR0ZXIrJyIgbG9hZGluZz0ibGF6eSI+PGRpdiBjbGFzcz0icGljLWxldHRlciI+PGI+JytvLmxldHRlcisnPC9iPjxzcGFuIGNsYXNzPSJwaWMtdGljayI+4pyTPC9zcGFuPjwvZGl2PjwvZGl2Pic7CiAgICB9KTsKICAgIGggKz0gJzwvZGl2PjxkaXYgY2xhc3M9ImZlZWRiYWNrIj48L2Rpdj48ZGl2IGNsYXNzPSJxLWJvdHRvbSI+PGJ1dHRvbiBjbGFzcz0ic2hvdy1hbnMtYnRuIiBkYXRhLXNob3c9IicrcS5uKyciPvCfkYEgU2hvdyBBbnN3ZXI8L2J1dHRvbj48L2Rpdj48L2Rpdj4nOwogICAgbGlzdC5pbnNlcnRBZGphY2VudEhUTUwoJ2JlZm9yZWVuZCcsIGgpOwogIH0pOwogIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5waWMtb3B0W2RhdGEtcV0nKSkuZm9yRWFjaChmdW5jdGlvbihvcHQpewogICAgb3B0LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxmdW5jdGlvbigpewogICAgICB2YXIgcWlkPW9wdC5kYXRhc2V0LnE7CiAgICAgIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5waWMtb3B0W2RhdGEtcT0iJytxaWQrJyJdJykpLmZvckVhY2goZnVuY3Rpb24obyl7by5jbGFzc0xpc3QucmVtb3ZlKCdzZWxlY3RlZCcpfSk7CiAgICAgIG9wdC5jbGFzc0xpc3QuYWRkKCdzZWxlY3RlZCcpOwogICAgICB1cGRhdGVQcm9ncmVzcygpOwogICAgfSk7CiAgfSk7Cn0pKCk7CgovKiBGTFlFUlMgUEFSVCA1IOKAlCBXcml0ZSBxdWVzdGlvbnMgKi8KKGZ1bmN0aW9uKCl7CiAgdmFyIHA1cXVlc3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncDVRdWVzdGlvbnMnKTsKICBpZihwNXF1ZXN0KXsKICAgIFA1X1FVRVNUSU9OUy5mb3JFYWNoKGZ1bmN0aW9uKHEpewogICAgICBwNXF1ZXN0Lmluc2VydEFkamFjZW50SFRNTCgnYmVmb3JlZW5kJywKICAgICAgICAnPGRpdiBjbGFzcz0iZm9ybS1yb3ciPjxsYWJlbD48Yj4nK3EubisnLjwvYj4gJytxLmxhYmVsKyc8L2xhYmVsPicrCiAgICAgICAgJzxpbnB1dCBjbGFzcz0iaW5wdXQtYmxhbmsiIGRhdGEtcT0iJytxLm4rJyIgdHlwZT0idGV4dCIgcGxhY2Vob2xkZXI9Ii4uLiI+JysKICAgICAgICAnPGJ1dHRvbiBjbGFzcz0ic2hvdy1hbnMtYnRuIiBkYXRhLXNob3c9IicrcS5uKyciPvCfkYEgU2hvdzwvYnV0dG9uPjwvZGl2PicpOwogICAgfSk7CiAgfQp9KSgpOwoKfSkoKTsKCmZ1bmN0aW9uIGdldEhleChjb2xvdXJLZXkpewogIHZhciBjID0gUDRfQ09MT1VSUy5maW5kKGZ1bmN0aW9uKHgpe3JldHVybiB4LmtleT09PWNvbG91cktleX0pOwogIHJldHVybiBjP2MuaGV4OicjRkZGRkZGJzsKfQpmdW5jdGlvbiBhcHBseUNvbG91clRvUmVnaW9uKHJlZ2lvbixoZXgsbG9jayl7CiAgdmFyIHNjZW5lPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb2xvdXJTY2VuZScpOwogICQkKCdbZGF0YS1yZWdpb249IicrcmVnaW9uKyciXScsc2NlbmUpLmZvckVhY2goZnVuY3Rpb24oZWwpewogICAgZWwuc2V0QXR0cmlidXRlKCdmaWxsJyxoZXgpOwogICAgaWYobG9jaykgZWwuZGF0YXNldC5sb2NrZWQ9JzEnOwogIH0pOwp9Cgp2YXIgX3A1Q2xlYXJCdG49ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3A1Q2xlYXInKXx8ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3A0Q2xlYXInKTsKaWYoX3A1Q2xlYXJCdG4pX3A1Q2xlYXJCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLGZ1bmN0aW9uKCl7CiAgaWYoIWNvbmZpcm0oJ0NsZWFyIGFsbCB5b3VyIFBhcnQgNCBjb2xvdXJzPycpKXJldHVybjsKICBQNF9JVEVNUy5mb3JFYWNoKGZ1bmN0aW9uKGl0KXsKICAgIGFwcGx5Q29sb3VyVG9SZWdpb24oaXQucmVnaW9uLCcjRkZGRkZGJyxmYWxzZSk7CiAgICB2YXIgZG90PWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLWRvdGZvcj0iJytpdC5uKyciXScpOwogICAgaWYoZG90KWRvdC5zdHlsZS5iYWNrZ3JvdW5kPScjZmZmJzsKICB9KTsKICBQNF91c2VyQ29sb3Vycz17fTsKICB1cGRhdGVQcm9ncmVzcygpOwp9KTsKCi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PQogKiBQUk9HUkVTUywgU0hPVywgU1VCTUlUCiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwpmdW5jdGlvbiBhbnN3ZXJlZCgpewogIHZhciBuPTA7CiAgLy8gUDEKICBmb3IodmFyIGk9MDtpPFAxX05BTUVTLmxlbmd0aDtpKyspe3ZhciBubT1QMV9OQU1FU1tpXTsgaWYobm0uaXNFeGFtcGxlKWNvbnRpbnVlOyBpZihQMV91c2VyTWF0Y2hlc1tubS5uXSluKys7fQogIC8vIFAyCiAgUDJfUVVFU1RJT05TLmZvckVhY2goZnVuY3Rpb24ocSl7CiAgICB2YXIgZWw9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmlucHV0LWJsYW5rW2RhdGEtcT0iJytxLm4rJyJdJyk7CiAgICBpZihlbCAmJiBlbC52YWx1ZS50cmltKCkhPT0nJyluKys7CiAgfSk7CiAgLy8gUDMKICBQM19RVUVTVElPTlMuZm9yRWFjaChmdW5jdGlvbihxKXsKICAgIHZhciBzPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5waWMtb3B0LnNlbGVjdGVkW2RhdGEtcT0iJytxLm4rJyJdJyk7CiAgICBpZihzKW4rKzsKICB9KTsKICAvLyBQMyBtYXRjaGluZyAoRmx5ZXJzIHVzZXMgLm9wdCBpbnN0ZWFkIG9mIC5waWMtb3B0KQogIGlmKHR5cGVvZiBQM19RVUVTVElPTlNfTUFUQ0ggIT09ICd1bmRlZmluZWQnKXsKICAgIFAzX1FVRVNUSU9OU19NQVRDSC5mb3JFYWNoKGZ1bmN0aW9uKHEpewogICAgICB2YXIgc2VsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLm9wdC5zZWxlY3RlZFtkYXRhLXE9IicrcS5uKyciXScpOwogICAgICBpZihzZWwpbisrOwogICAgfSk7CiAgfQogIC8vIFA0IHBpY3R1cmUgTUNRIChGbHllcnMpCiAgaWYodHlwZW9mIFA0X1FVRVNUSU9OU19QSUMgIT09ICd1bmRlZmluZWQnKXsKICAgIFA0X1FVRVNUSU9OU19QSUMuZm9yRWFjaChmdW5jdGlvbihxKXsKICAgICAgdmFyIHNlbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5waWMtb3B0LnNlbGVjdGVkW2RhdGEtcT0iJytxLm4rJyJdJyk7CiAgICAgIGlmKHNlbCluKys7CiAgICB9KTsKICB9CiAgLy8gUDUgY29sb3VyICsgd3JpdGUKICBpZih0eXBlb2YgUDVfSVRFTVNfQ09MT1VSICE9PSAndW5kZWZpbmVkJyl7CiAgICBQNV9JVEVNU19DT0xPVVIuZm9yRWFjaChmdW5jdGlvbihpdCl7IGlmKFA0X3VzZXJDb2xvdXJzW2l0LnJlZ2lvbl0pbisrOyB9KTsKICB9CiAgaWYodHlwZW9mIFA1X1FVRVNUSU9OUyAhPT0gJ3VuZGVmaW5lZCcpewogICAgUDVfUVVFU1RJT05TLmZvckVhY2goZnVuY3Rpb24ocSl7CiAgICAgIHZhciBlbD1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuaW5wdXQtYmxhbmtbZGF0YS1xPSInK3EubisnIl0nKTsKICAgICAgaWYoZWwgJiYgZWwudmFsdWUudHJpbSgpIT09JycpbisrOwogICAgfSk7CiAgfQogIHJldHVybiBuOwp9CmZ1bmN0aW9uIHVwZGF0ZVByb2dyZXNzKCl7CiAgdmFyIGE9YW5zd2VyZWQoKTsKICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYW5zd2VyZWRDb3VudCcpLnRleHRDb250ZW50PWE7CiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Byb2dGaWxsJykuc3R5bGUud2lkdGg9KGEvMjUqMTAwKSsnJSc7Cn0KCmRvY3VtZW50LmJvZHkuYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLGZ1bmN0aW9uKGUpewogIGlmKGUudGFyZ2V0LmNsYXNzTGlzdCAmJiBlLnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoJ2lucHV0LWJsYW5rJykpdXBkYXRlUHJvZ3Jlc3MoKTsKfSk7Cgpkb2N1bWVudC5ib2R5LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxmdW5jdGlvbihlKXsKICB2YXIgYnRuPWUudGFyZ2V0LmNsb3Nlc3QoJy5zaG93LWFucy1idG4nKTsKICBpZighYnRuKXJldHVybjsKICB2YXIga2V5PWJ0bi5kYXRhc2V0LnNob3c7CiAgaWYoa2V5PT09J1AxQUxMJyl7IHAxUmV2ZWFsKCk7IHJldHVybjsgfQogIGlmKGtleT09PSdQNEFMTCcgfHwga2V5PT09J1A1QUxMJyl7IHA0UmV2ZWFsKCk7IHJldHVybjsgfQogIHZhciBxaWQ9cGFyc2VJbnQoa2V5KTsKICAvLyB3cml0ZS1xdWVzdGlvbiByZXZlYWwgKFAyICsgUDUgd3JpdGVzKQogIGlmKChxaWQ+PTYgJiYgcWlkPD0xMCkgfHwgKHFpZD49MjEgJiYgcWlkPD0yNSkpewogICAgdmFyIHEgPSAodHlwZW9mIFAyX1FVRVNUSU9OUyE9PSd1bmRlZmluZWQnICYmIFAyX1FVRVNUSU9OUy5maW5kKGZ1bmN0aW9uKHgpe3JldHVybiB4Lm49PT1xaWR9KSkgfHwKICAgICAgICAgICAgKHR5cGVvZiBQNV9RVUVTVElPTlMhPT0ndW5kZWZpbmVkJyAmJiBQNV9RVUVTVElPTlMuZmluZChmdW5jdGlvbih4KXtyZXR1cm4geC5uPT09cWlkfSkpOwogICAgdmFyIGVsPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5pbnB1dC1ibGFua1tkYXRhLXE9IicrcWlkKyciXScpOwogICAgaWYocSAmJiBlbCl7CiAgICAgIGVsLnZhbHVlPXEuZGlzcGxheTsKICAgICAgZWwuY2xhc3NMaXN0LmFkZCgncmV2ZWFsZWQnKTsKICAgICAgdXBkYXRlUHJvZ3Jlc3MoKTsKICAgIH0KICB9IGVsc2UgaWYocWlkPj0xMSAmJiBxaWQ8PTE1KXsKICAgIC8vIFAzIG11bHRpcGxlIG1hdGNoaW5nCiAgICB2YXIgcTMgPSAodHlwZW9mIFAzX1FVRVNUSU9OU19NQVRDSCE9PSd1bmRlZmluZWQnKT9QM19RVUVTVElPTlNfTUFUQ0guZmluZChmdW5jdGlvbih4KXtyZXR1cm4geC5uPT09cWlkfSk6bnVsbDsKICAgIHZhciBpdGVtPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdxJytxaWQpOwogICAgaWYocTMgJiYgaXRlbSl7CiAgICAgIGl0ZW0uY2xhc3NMaXN0LmFkZCgncmV2ZWFsZWQnKTsKICAgICAgJCQoJy5vcHRbZGF0YS1xPSInK3FpZCsnIl0nLGl0ZW0pLmZvckVhY2goZnVuY3Rpb24obyl7CiAgICAgICAgaWYoby5kYXRhc2V0LmxldHRlcj09PXEzLmFucylvLmNsYXNzTGlzdC5hZGQoJ2NvcnJlY3Qtb3B0Jyk7CiAgICAgIH0pOwogICAgICB2YXIgZmI9aXRlbS5xdWVyeVNlbGVjdG9yKCcuZmVlZGJhY2snKTsKICAgICAgaWYoZmIpe2ZiLnRleHRDb250ZW50PSdBbnN3ZXI6ICcrcTMuYW5zKyhxMy53aHk\/JyAoJytxMy53aHkrJyknOicnKTt9CiAgICB9CiAgfSBlbHNlIGlmKHFpZD49MTYgJiYgcWlkPD0yMCl7CiAgICAvLyBQNCBwaWN0dXJlIE1DUQogICAgdmFyIHFwID0gKHR5cGVvZiBQNF9RVUVTVElPTlNfUElDIT09J3VuZGVmaW5lZCcpP1A0X1FVRVNUSU9OU19QSUMuZmluZChmdW5jdGlvbih4KXtyZXR1cm4geC5uPT09cWlkfSk6bnVsbDsKICAgIHZhciBpdGVtMj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncScrcWlkKTsKICAgIGlmKHFwICYmIGl0ZW0yKXsKICAgICAgaXRlbTIuY2xhc3NMaXN0LmFkZCgncmV2ZWFsZWQnKTsKICAgICAgJCQoJy5waWMtb3B0W2RhdGEtcT0iJytxaWQrJyJdJyxpdGVtMikuZm9yRWFjaChmdW5jdGlvbihvKXsKICAgICAgICBpZihvLmRhdGFzZXQubGV0dGVyPT09cXAuYW5zKW8uY2xhc3NMaXN0LmFkZCgnY29ycmVjdC1vcHQnKTsKICAgICAgfSk7CiAgICAgIHZhciBmYjI9aXRlbTIucXVlcnlTZWxlY3RvcignLmZlZWRiYWNrJyk7CiAgICAgIGlmKGZiMil7ZmIyLnRleHRDb250ZW50PSdBbnN3ZXI6ICcrcXAuYW5zO30KICAgIH0KICB9Cn0pOwoKZnVuY3Rpb24gcDRSZXZlYWwoKXsKICBpZih0eXBlb2YgUDVfSVRFTVNfQ09MT1VSID09PSAndW5kZWZpbmVkJykgcmV0dXJuOwogIFA1X0lURU1TX0NPTE9VUi5mb3JFYWNoKGZ1bmN0aW9uKGl0KXsKICAgIGFwcGx5Q29sb3VyVG9SZWdpb24oaXQucmVnaW9uLGdldEhleChpdC5jb2xvdXIpLHRydWUpOwogICAgdmFyIGRvdD1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1kb3Rmb3I9IicraXQubisnIl0nKTsKICAgIGlmKGRvdClkb3Quc3R5bGUuYmFja2dyb3VuZD1nZXRIZXgoaXQuY29sb3VyKTsKICAgIHZhciBpbnNSb3c9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmNvbC1pbnNbZGF0YS1xbj0iJytpdC5uKyciXScpOwogICAgaWYoaW5zUm93KWluc1Jvdy5jbGFzc0xpc3QuYWRkKCdyZXZlYWxlZCcpOwogIH0pOwogICQkKCcuc3dhdGNoJykuZm9yRWFjaChmdW5jdGlvbihzKXtzLnN0eWxlLnBvaW50ZXJFdmVudHM9J25vbmUnO3Muc3R5bGUub3BhY2l0eT0nLjYnfSk7CiAgUDRfdXNlckNvbG91cnMgPSB7fTsKICBQNV9JVEVNU19DT0xPVVIuZm9yRWFjaChmdW5jdGlvbihpdCl7IFA0X3VzZXJDb2xvdXJzW2l0LnJlZ2lvbl09aXQuY29sb3VyOyB9KTsKICB1cGRhdGVQcm9ncmVzcygpOwp9Cgpkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3VibWl0QnRuJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLGZ1bmN0aW9uKCl7CiAgdmFyIHNjb3JlPTAsIHBhcnRzPXsxOjAsMjowLDM6MCw0OjAsNTowfTsKCiAgUDFfTkFNRVMuZm9yRWFjaChmdW5jdGlvbihubSl7CiAgICBpZihubS5pc0V4YW1wbGUpcmV0dXJuOwogICAgdmFyIG5hbWVFbD1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcucGFpci1uYW1lW2RhdGEtbj0iJytubS5uKyciXScpOwogICAgaWYoUDFfdXNlck1hdGNoZXNbbm0ubl09PT1ubS5hbnMpewogICAgICBzY29yZSsrOyBwYXJ0c1sxXSsrOwogICAgICBpZihuYW1lRWwpe25hbWVFbC5jbGFzc0xpc3QuYWRkKCdtYXRjaGVkJyk7bmFtZUVsLnN0eWxlLmJvcmRlckNvbG9yPSd2YXIoLS1ncmVlbiknO25hbWVFbC5zdHlsZS5iYWNrZ3JvdW5kPSdyZ2JhKDE2LDE4NSwxMjksLjEyKSc7fQogICAgfSBlbHNlIHsKICAgICAgaWYobmFtZUVsKXtuYW1lRWwuc3R5bGUuYm9yZGVyQ29sb3I9J3ZhcigtLXJlZCknO25hbWVFbC5zdHlsZS5iYWNrZ3JvdW5kPSdyZ2JhKDIzOSw2OCw2OCwuMTApJzt9CiAgICB9CiAgfSk7CiAgZHJhd1AxTGluZXMoKTsKCiAgUDJfUVVFU1RJT05TLmZvckVhY2goZnVuY3Rpb24ocSl7CiAgICB2YXIgZWw9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmlucHV0LWJsYW5rW2RhdGEtcT0iJytxLm4rJyJdJyk7CiAgICBpZighZWwpcmV0dXJuOwogICAgaWYoZWwuY2xhc3NMaXN0LmNvbnRhaW5zKCdyZXZlYWxlZCcpKXJldHVybjsKICAgIHZhciB2ID0gZWwudmFsdWUudHJpbSgpLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvWy4sXSQvLCcnKTsKICAgIHZhciBvayA9IHEuYWNjZXB0ZWQuaW5kZXhPZih2KT49MDsKICAgIGlmKG9rKXtzY29yZSsrO3BhcnRzWzJdKys7ZWwuY2xhc3NMaXN0LmFkZCgnY29ycmVjdCcpO30KICAgIGVsc2Uge2VsLmNsYXNzTGlzdC5hZGQoJ3dyb25nJyk7IGVsLnRpdGxlPSdDb3JyZWN0OiAnK3EuZGlzcGxheTt9CiAgfSk7CgogIC8vIFBBUlQgMyBtdWx0aXBsZSBtYXRjaGluZwogIGlmKHR5cGVvZiBQM19RVUVTVElPTlNfTUFUQ0ghPT0ndW5kZWZpbmVkJyl7CiAgICBQM19RVUVTVElPTlNfTUFUQ0guZm9yRWFjaChmdW5jdGlvbihxKXsKICAgICAgdmFyIGl0ZW09ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3EnK3Eubik7CiAgICAgIGlmKCFpdGVtKXJldHVybjsKICAgICAgdmFyIHNlbD1pdGVtLnF1ZXJ5U2VsZWN0b3IoJy5vcHQuc2VsZWN0ZWQnKTsKICAgICAgdmFyIGxldHRlcj1zZWw\/c2VsLmRhdGFzZXQubGV0dGVyOm51bGw7CiAgICAgIGl0ZW0uY2xhc3NMaXN0LmFkZCgnYW5zd2VyZWQnKTsKICAgICAgJCQoJy5vcHQnLGl0ZW0pLmZvckVhY2goZnVuY3Rpb24obyl7CiAgICAgICAgdmFyIEw9by5kYXRhc2V0LmxldHRlcjsKICAgICAgICBpZihMPT09cS5hbnMpby5jbGFzc0xpc3QuYWRkKCdjb3JyZWN0LW9wdCcpOwogICAgICAgIGlmKGxldHRlcj09PUwgJiYgTCE9PXEuYW5zKW8uY2xhc3NMaXN0LmFkZCgnd3Jvbmctb3B0Jyk7CiAgICAgIH0pOwogICAgICB2YXIgZmI9aXRlbS5xdWVyeVNlbGVjdG9yKCcuZmVlZGJhY2snKTsKICAgICAgaWYobGV0dGVyPT09cS5hbnMpe3Njb3JlKys7IHBhcnRzWzNdKys7IGl0ZW0uY2xhc3NMaXN0LmFkZCgnY29ycmVjdCcpOyBpZihmYilmYi50ZXh0Q29udGVudD0nQ29ycmVjdCAtICcrcS5hbnMrKHEud2h5PycgKCcrcS53aHkrJyknOicnKTt9CiAgICAgIGVsc2V7aXRlbS5jbGFzc0xpc3QuYWRkKCd3cm9uZycpOyBpZihmYilmYi50ZXh0Q29udGVudD0nV3JvbmcgLSBjb3JyZWN0OiAnK3EuYW5zKyhxLndoeT8nICgnK3Eud2h5KycpJzonJykrKGxldHRlcj8nICh5b3UgY2hvc2UgJytsZXR0ZXIrJyknOicgKG5vIGFuc3dlciknKTt9CiAgICB9KTsKICB9CgogIC8vIFBBUlQgNCBwaWN0dXJlIE1DUQogIGlmKHR5cGVvZiBQNF9RVUVTVElPTlNfUElDIT09J3VuZGVmaW5lZCcpewogICAgUDRfUVVFU1RJT05TX1BJQy5mb3JFYWNoKGZ1bmN0aW9uKHEpewogICAgICB2YXIgaXRlbT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncScrcS5uKTsKICAgICAgaWYoIWl0ZW0pcmV0dXJuOwogICAgICB2YXIgc2VsPWl0ZW0ucXVlcnlTZWxlY3RvcignLnBpYy1vcHQuc2VsZWN0ZWQnKTsKICAgICAgdmFyIGxldHRlcj1zZWw\/c2VsLmRhdGFzZXQubGV0dGVyOm51bGw7CiAgICAgIGl0ZW0uY2xhc3NMaXN0LmFkZCgnYW5zd2VyZWQnKTsKICAgICAgJCQoJy5waWMtb3B0JyxpdGVtKS5mb3JFYWNoKGZ1bmN0aW9uKG8pewogICAgICAgIHZhciBMPW8uZGF0YXNldC5sZXR0ZXI7CiAgICAgICAgaWYoTD09PXEuYW5zKW8uY2xhc3NMaXN0LmFkZCgnY29ycmVjdC1vcHQnKTsKICAgICAgICBpZihsZXR0ZXI9PT1MICYmIEwhPT1xLmFucylvLmNsYXNzTGlzdC5hZGQoJ3dyb25nLW9wdCcpOwogICAgICB9KTsKICAgICAgdmFyIGZiPWl0ZW0ucXVlcnlTZWxlY3RvcignLmZlZWRiYWNrJyk7CiAgICAgIGlmKGxldHRlcj09PXEuYW5zKXtzY29yZSsrOyBwYXJ0c1s0XSsrOyBpdGVtLmNsYXNzTGlzdC5hZGQoJ2NvcnJlY3QnKTsgaWYoZmIpZmIudGV4dENvbnRlbnQ9J0NvcnJlY3QgLSAnK3EuYW5zO30KICAgICAgZWxzZXtpdGVtLmNsYXNzTGlzdC5hZGQoJ3dyb25nJyk7IGlmKGZiKWZiLnRleHRDb250ZW50PSdXcm9uZyAtIGNvcnJlY3Q6ICcrcS5hbnMrKGxldHRlcj8nICh5b3UgY2hvc2UgJytsZXR0ZXIrJyknOicgKG5vIGFuc3dlciknKTt9CiAgICB9KTsKICB9CgogIC8vIFBBUlQgNSBjb2xvdXIgKyB3cml0ZQogIGlmKHR5cGVvZiBQNV9JVEVNU19DT0xPVVIhPT0ndW5kZWZpbmVkJyl7CiAgICBQNV9JVEVNU19DT0xPVVIuZm9yRWFjaChmdW5jdGlvbihpdCl7CiAgICAgIHZhciBpbnNSb3c9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmNvbC1pbnNbZGF0YS1xbj0iJytpdC5uKyciXScpOwogICAgICB2YXIgdXNlckNvbCA9IFA0X3VzZXJDb2xvdXJzW2l0LnJlZ2lvbl07CiAgICAgIGlmKHVzZXJDb2wgPT09IGl0LmNvbG91cil7CiAgICAgICAgc2NvcmUrKzsgcGFydHNbNV0rKzsKICAgICAgICBpZihpbnNSb3cpaW5zUm93LmNsYXNzTGlzdC5hZGQoJ2NvcnJlY3QnKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBpZihpbnNSb3cpaW5zUm93LmNsYXNzTGlzdC5hZGQoJ3dyb25nJyk7CiAgICAgIH0KICAgIH0pOwogIH0KICBpZih0eXBlb2YgUDVfUVVFU1RJT05TIT09J3VuZGVmaW5lZCcpewogICAgUDVfUVVFU1RJT05TLmZvckVhY2goZnVuY3Rpb24ocSl7CiAgICAgIHZhciBlbD1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuaW5wdXQtYmxhbmtbZGF0YS1xPSInK3EubisnIl0nKTsKICAgICAgaWYoIWVsKXJldHVybjsKICAgICAgaWYoZWwuY2xhc3NMaXN0LmNvbnRhaW5zKCdyZXZlYWxlZCcpKXJldHVybjsKICAgICAgdmFyIHYgPSBlbC52YWx1ZS50cmltKCkudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9bLixdJC8sJycpOwogICAgICB2YXIgb2sgPSBxLmFjY2VwdGVkLmluZGV4T2Yodik+PTA7CiAgICAgIGlmKG9rKXtzY29yZSsrO3BhcnRzWzVdKys7ZWwuY2xhc3NMaXN0LmFkZCgnY29ycmVjdCcpO30KICAgICAgZWxzZSB7ZWwuY2xhc3NMaXN0LmFkZCgnd3JvbmcnKTsgZWwudGl0bGU9J0NvcnJlY3Q6ICcrcS5kaXNwbGF5O30KICAgIH0pOwogIH0KCiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Njb3JlTm93JykudGV4dENvbnRlbnQ9c2NvcmU7CiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ZpbmFsU2NvcmUnKS50ZXh0Q29udGVudD1zY29yZTsKICB2YXIgcGN0PU1hdGgucm91bmQoc2NvcmUvMjUqMTAwKTsKICB2YXIgbXNnID0gcGN0Pj04NSA\/ICdFeGNlbGxlbnQhIFlvdXIgbGlzdGVuaW5nIGlzIHN0cm9uZy4nCiAgICAgICAgICA6IHBjdD49NzAgPyAnR29vZCBqb2IhIEEgZmV3IG1vcmUgdGVzdHMgYW5kIHlvdSB3aWxsIGJlIHJlYWR5LicKICAgICAgICAgIDogcGN0Pj01MCA\/ICdLZWVwIHByYWN0aXNpbmcgLSByZS1saXN0ZW4gdG8gdGhlIHBhcnRzIHdoZXJlIHlvdSBtaXNzZWQgYW5zd2Vycy4nCiAgICAgICAgICA6ICdUcnkgc2xvd2luZyB0aGUgYXVkaW8gYW5kIHVzZSB0aGUgdHJhbnNjcmlwdCB0byBzdHVkeS4nOwogIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZXN1bHRzTXNnJykudGV4dENvbnRlbnQ9bXNnOwogIHZhciBzcCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzY29yZVBhcnRzJyk7CiAgc3AuaW5uZXJIVE1MPScnOwogIFsnUGFpcicsJ1dyaXRlJywnTWF0Y2gnLCdUaWNrJywnQ29sb3VyJ10uZm9yRWFjaChmdW5jdGlvbihsYWJlbCxpKXsKICAgIHNwLmlubmVySFRNTCArPSAnPGRpdiBjbGFzcz0ic3AtaXRlbSI+PGI+JytwYXJ0c1tpKzFdKycvNTwvYj5QYXJ0ICcrKGkrMSkrJyAtICcrbGFiZWwrJzwvZGl2Pic7CiAgfSk7CiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Jlc3VsdHNCYW5uZXInKS5jbGFzc0xpc3QuYWRkKCdzaG93Jyk7CiAgc2V0VGltZW91dChmdW5jdGlvbigpe2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZXN1bHRzQmFubmVyJykuc2Nyb2xsSW50b1ZpZXcoe2JlaGF2aW9yOidzbW9vdGgnLGJsb2NrOidjZW50ZXInfSl9LDEyMCk7Cn0pOwoKZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Jlc2V0QnRuJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLGZ1bmN0aW9uKCl7CiAgaWYoIWNvbmZpcm0oJ1Jlc2V0IGFsbCBhbnN3ZXJzPyBZb3VyIG5vdGVzIHdpbGwgYWxzbyBiZSBjbGVhcmVkLicpKXJldHVybjsKICBsb2NhdGlvbi5yZWxvYWQoKTsKfSk7Cgp9KSgpOwo='))));<\/script>\n","protected":false},"excerpt":{"rendered":"<p>All English 4U Grammar IELTS TOEFL Cambridge CELPIP Dictation Back Grammar IELTS TOEFL Cambridge CELPIP Dictation Cambridge YLE \u00b7 Flyers Flyers 3 &mdash; Test 3 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-5559","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/allenglish4u.com\/vi\/wp-json\/wp\/v2\/pages\/5559","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=5559"}],"version-history":[{"count":3,"href":"https:\/\/allenglish4u.com\/vi\/wp-json\/wp\/v2\/pages\/5559\/revisions"}],"predecessor-version":[{"id":5821,"href":"https:\/\/allenglish4u.com\/vi\/wp-json\/wp\/v2\/pages\/5559\/revisions\/5821"}],"wp:attachment":[{"href":"https:\/\/allenglish4u.com\/vi\/wp-json\/wp\/v2\/media?parent=5559"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}