moflo 4.13.0 → 4.13.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -920,10 +920,39 @@ function applyPromptStateReset(state, promptText, opts) {
920
920
  state.sddMode = detectSddMode(promptText);
921
921
  state.activeSddSlug = null;
922
922
  }
923
- // Match npm/yarn/pnpm/bun test, npx vitest|jest|..., bare runners at command-start only,
924
- // and language-native test commands. The bare-runner arm is anchored so that
925
- // `npm install jest`, `grep -r vitest src/`, and similar don't false-positive.
926
- var TEST_RUNNER_RE = /(?:^|[^a-z])(?:npm|yarn|pnpm|bun)\s+(?:run\s+)?(?:test|t)(?:[:\s]|$)|\b(?:npx|pnpx)\s+(?:vitest|jest|mocha|ava|tap|jasmine|pytest)\b|(?:^|;|&&|\|\|)\s*(?:vitest|jest|pytest|mocha|jasmine|tap|ava)\s|\b(?:cargo|go|deno|dotnet|mvn)\s+test\b|\bgradle\w*\s+test\b/i;
923
+ // Match npm/yarn/pnpm/bun/turbo/nx/lerna test, npx vitest|jest|..., bare runners
924
+ // at command-start only, and language-native test commands. The bare-runner arm
925
+ // is anchored so that `npm install jest`, `grep -r vitest src/`, and similar
926
+ // don't false-positive.
927
+ //
928
+ // #1484 — the package-manager arm allows a BOUNDED run of selector tokens
929
+ // between the tool and the script name. Every monorepo invocation puts the
930
+ // workspace selection there (`npm run --prefix packages/api test`,
931
+ // `pnpm --filter @acme/api test`, `yarn workspace @acme/api test`), and the old
932
+ // `<pm> [run] test` shape had no slot for it — so a green suite earned no
933
+ // credit and check-before-pr hard-blocked `gh pr create` with no way out.
934
+ //
935
+ // This arm credits the gate, so every way it can over-match is a way the gate
936
+ // fails OPEN. Four properties bound it, and each is pinned by a test:
937
+ // * separators are HORIZONTAL-only (`[ \t]`, not `\s`). Claude Code runs
938
+ // multi-line Bash blocks as one string, so a `\s` separator would let
939
+ // `npm run build\ntest -f dist/x` bridge a newline into the unrelated Unix
940
+ // `test` builtin and credit a suite that never ran.
941
+ // * the token class excludes shell separators (; & | < > ( ) $ `) so a match
942
+ // can never span `npm run build && rm -rf test`, and excludes `#` so a
943
+ // trailing comment (`npm run build # fix test later`) can't supply the
944
+ // keyword.
945
+ // * the class is NEGATED rather than a positive path class. `[-\w=/.:@]`
946
+ // would pass on POSIX and silently keep missing Windows' `--prefix
947
+ // C:\repo\pkg` form (Rule #1).
948
+ // * the `t` alias keeps its own NARROW arm below — reachable only directly
949
+ // after the package manager, never after selector tokens, so a stray bare
950
+ // `t` argument (`npm run build --env t`) can't credit the gate.
951
+ // The script name keeps its `(?:[:\s]|$)` terminator, so `test-utils`, `test/`
952
+ // and `dist-tags.test` still don't match. The repetition is bounded at 8 and its
953
+ // character classes are disjoint from the separator, so there is no backtracking
954
+ // blowup (27k-char pathological input: 0 ms).
955
+ var TEST_RUNNER_RE = /(?:^|[^a-z])(?:npm|yarn|pnpm|bun|turbo|nx|lerna)[ \t]+(?:[^\s;&|<>()$`#]+[ \t]+){0,8}test(?:[:\s]|$)|(?:^|[^a-z])(?:npm|yarn|pnpm|bun)[ \t]+(?:run[ \t]+)?t(?:[:\s]|$)|\b(?:npx|pnpx)\s+(?:vitest|jest|mocha|ava|tap|jasmine|pytest)\b|(?:^|;|&&|\|\|)\s*(?:vitest|jest|pytest|mocha|jasmine|tap|ava)\s|\b(?:cargo|go|deno|dotnet|mvn)\s+test\b|\bgradle\w*\s+test\b/i;
927
956
  // #1322 — failure markers in a test runner's own OUTPUT.
928
957
  //
929
958
  // This is deliberately not an exit-code check: Claude Code's PostToolUse payload
package/bin/gate.cjs CHANGED
@@ -920,10 +920,39 @@ function applyPromptStateReset(state, promptText, opts) {
920
920
  state.sddMode = detectSddMode(promptText);
921
921
  state.activeSddSlug = null;
922
922
  }
923
- // Match npm/yarn/pnpm/bun test, npx vitest|jest|..., bare runners at command-start only,
924
- // and language-native test commands. The bare-runner arm is anchored so that
925
- // `npm install jest`, `grep -r vitest src/`, and similar don't false-positive.
926
- var TEST_RUNNER_RE = /(?:^|[^a-z])(?:npm|yarn|pnpm|bun)\s+(?:run\s+)?(?:test|t)(?:[:\s]|$)|\b(?:npx|pnpx)\s+(?:vitest|jest|mocha|ava|tap|jasmine|pytest)\b|(?:^|;|&&|\|\|)\s*(?:vitest|jest|pytest|mocha|jasmine|tap|ava)\s|\b(?:cargo|go|deno|dotnet|mvn)\s+test\b|\bgradle\w*\s+test\b/i;
923
+ // Match npm/yarn/pnpm/bun/turbo/nx/lerna test, npx vitest|jest|..., bare runners
924
+ // at command-start only, and language-native test commands. The bare-runner arm
925
+ // is anchored so that `npm install jest`, `grep -r vitest src/`, and similar
926
+ // don't false-positive.
927
+ //
928
+ // #1484 — the package-manager arm allows a BOUNDED run of selector tokens
929
+ // between the tool and the script name. Every monorepo invocation puts the
930
+ // workspace selection there (`npm run --prefix packages/api test`,
931
+ // `pnpm --filter @acme/api test`, `yarn workspace @acme/api test`), and the old
932
+ // `<pm> [run] test` shape had no slot for it — so a green suite earned no
933
+ // credit and check-before-pr hard-blocked `gh pr create` with no way out.
934
+ //
935
+ // This arm credits the gate, so every way it can over-match is a way the gate
936
+ // fails OPEN. Four properties bound it, and each is pinned by a test:
937
+ // * separators are HORIZONTAL-only (`[ \t]`, not `\s`). Claude Code runs
938
+ // multi-line Bash blocks as one string, so a `\s` separator would let
939
+ // `npm run build\ntest -f dist/x` bridge a newline into the unrelated Unix
940
+ // `test` builtin and credit a suite that never ran.
941
+ // * the token class excludes shell separators (; & | < > ( ) $ `) so a match
942
+ // can never span `npm run build && rm -rf test`, and excludes `#` so a
943
+ // trailing comment (`npm run build # fix test later`) can't supply the
944
+ // keyword.
945
+ // * the class is NEGATED rather than a positive path class. `[-\w=/.:@]`
946
+ // would pass on POSIX and silently keep missing Windows' `--prefix
947
+ // C:\repo\pkg` form (Rule #1).
948
+ // * the `t` alias keeps its own NARROW arm below — reachable only directly
949
+ // after the package manager, never after selector tokens, so a stray bare
950
+ // `t` argument (`npm run build --env t`) can't credit the gate.
951
+ // The script name keeps its `(?:[:\s]|$)` terminator, so `test-utils`, `test/`
952
+ // and `dist-tags.test` still don't match. The repetition is bounded at 8 and its
953
+ // character classes are disjoint from the separator, so there is no backtracking
954
+ // blowup (27k-char pathological input: 0 ms).
955
+ var TEST_RUNNER_RE = /(?:^|[^a-z])(?:npm|yarn|pnpm|bun|turbo|nx|lerna)[ \t]+(?:[^\s;&|<>()$`#]+[ \t]+){0,8}test(?:[:\s]|$)|(?:^|[^a-z])(?:npm|yarn|pnpm|bun)[ \t]+(?:run[ \t]+)?t(?:[:\s]|$)|\b(?:npx|pnpx)\s+(?:vitest|jest|mocha|ava|tap|jasmine|pytest)\b|(?:^|;|&&|\|\|)\s*(?:vitest|jest|pytest|mocha|jasmine|tap|ava)\s|\b(?:cargo|go|deno|dotnet|mvn)\s+test\b|\bgradle\w*\s+test\b/i;
927
956
  // #1322 — failure markers in a test runner's own OUTPUT.
928
957
  //
929
958
  // This is deliberately not an exit-code check: Claude Code's PostToolUse payload
@@ -16,7 +16,7 @@
16
16
  export const EMBEDDED_HELPERS_BASE64 = {
17
17
  "auto-memory-hook.mjs": "IyEvdXNyL2Jpbi9lbnYgbm9kZQovKioKICogQXV0byBNZW1vcnkgQnJpZGdlIEhvb2sgKEFEUi0wNDgvMDQ5KSDigJQgTWluaW1hbCBGYWxsYmFjawogKiBGdWxsIHZlcnNpb24gaXMgY29waWVkIGZyb20gcGFja2FnZSBzb3VyY2Ugd2hlbiBhdmFpbGFibGUuCiAqCiAqIFVzYWdlOgogKiAgIG5vZGUgYXV0by1tZW1vcnktaG9vay5tanMgaW1wb3J0ICAgIyBTZXNzaW9uU3RhcnQKICogICBub2RlIGF1dG8tbWVtb3J5LWhvb2subWpzIHN5bmMgICAgICMgU2Vzc2lvbkVuZCAvIFN0b3AKICogICBub2RlIGF1dG8tbWVtb3J5LWhvb2subWpzIHN0YXR1cyAgICMgU2hvdyBicmlkZ2Ugc3RhdHVzCiAqLwoKaW1wb3J0IHsgZXhpc3RzU3luYywgbWtkaXJTeW5jLCB3cml0ZUZpbGVTeW5jIH0gZnJvbSAnZnMnOwppbXBvcnQgeyBqb2luLCBkaXJuYW1lIH0gZnJvbSAncGF0aCc7CmltcG9ydCB7IGZpbGVVUkxUb1BhdGggfSBmcm9tICd1cmwnOwoKY29uc3QgX19maWxlbmFtZSA9IGZpbGVVUkxUb1BhdGgoaW1wb3J0Lm1ldGEudXJsKTsKY29uc3QgX19kaXJuYW1lID0gZGlybmFtZShfX2ZpbGVuYW1lKTsKY29uc3QgUFJPSkVDVF9ST09UID0gam9pbihfX2Rpcm5hbWUsICcuLi8uLicpOwpjb25zdCBEQVRBX0RJUiA9IGpvaW4oUFJPSkVDVF9ST09ULCAnLm1vZmxvJywgJ2RhdGEnKTsKY29uc3QgU1RPUkVfUEFUSCA9IGpvaW4oREFUQV9ESVIsICdhdXRvLW1lbW9yeS1zdG9yZS5qc29uJyk7Cgpjb25zdCBESU0gPSAnXHgxYlsybSc7CmNvbnN0IFJFU0VUID0gJ1x4MWJbMG0nOwpjb25zdCBkaW0gPSAobXNnKSA9PiBjb25zb2xlLmxvZyhgICAke0RJTX0ke21zZ30ke1JFU0VUfWApOwoKLy8gRW5zdXJlIGRhdGEgZGlyCmlmICghZXhpc3RzU3luYyhEQVRBX0RJUikpIG1rZGlyU3luYyhEQVRBX0RJUiwgeyByZWN1cnNpdmU6IHRydWUgfSk7Cgphc3luYyBmdW5jdGlvbiBsb2FkTWVtb3J5UGFja2FnZSgpIHsKICAvLyBNZW1vcnkgd2FzIGlubGluZWQgaW50byBtb2ZsbydzIGNsaSBwYWNrYWdlIGJ5IHRoZSB3b3Jrc3BhY2UtY29sbGFwc2UgZXBpYwogIC8vICgjNTg2IC8gc3RvcnkgIzU5OCkg4oCUIHRoZSBiYXJlIGBAbW9mbG8vbWVtb3J5YCBzcGVjaWZpZXIgbm8gbG9uZ2VyIHJlc29sdmVzLgogIC8vIEFmdGVyIHRoZSBmaW5hbCBjbGkgY29sbGFwc2UgKCM2MDIpIHRoZSBjb21waWxlZCBtb2R1bGUgc2hpcHMgYXQKICAvLyA8bW9mbG8tcGtnLXJvb3Q+L2Rpc3Qvc3JjL2NsaS9tZW1vcnkvaW5kZXguanMuCiAgY29uc3QgTUVNT1JZX1JFTCA9IGpvaW4oJ2Rpc3QnLCAnc3JjJywgJ2NsaScsICdtZW1vcnknLCAnaW5kZXguanMnKTsKICBjb25zdCB7IHBhdGhUb0ZpbGVVUkwgfSA9IGF3YWl0IGltcG9ydCgndXJsJyk7CgogIC8vIFN0cmF0ZWd5IDE6IFJlc29sdmUgbW9mbG8ncyBwYWNrYWdlLmpzb24gZGlyZWN0bHkgZnJvbSB0aGUgY29uc3VtZXIKICAvLyBwcm9qZWN0IOKAlCBpdHMgZGlybmFtZSBJUyB0aGUgcGFja2FnZSByb290LCBubyB3YWxrIG5lZWRlZC4KICB0cnkgewogICAgY29uc3QgeyBjcmVhdGVSZXF1aXJlIH0gPSBhd2FpdCBpbXBvcnQoJ21vZHVsZScpOwogICAgY29uc3QgcmVxdWlyZSA9IGNyZWF0ZVJlcXVpcmUoam9pbihQUk9KRUNUX1JPT1QsICdwYWNrYWdlLmpzb24nKSk7CiAgICBjb25zdCBwa2dSb290ID0gZGlybmFtZShyZXF1aXJlLnJlc29sdmUoJ21vZmxvL3BhY2thZ2UuanNvbicpKTsKICAgIGNvbnN0IGNhbmRpZGF0ZSA9IGpvaW4ocGtnUm9vdCwgTUVNT1JZX1JFTCk7CiAgICBpZiAoZXhpc3RzU3luYyhjYW5kaWRhdGUpKSByZXR1cm4gYXdhaXQgaW1wb3J0KHBhdGhUb0ZpbGVVUkwoY2FuZGlkYXRlKS5ocmVmKTsKICB9IGNhdGNoIHsgLyogZmFsbCB0aHJvdWdoICovIH0KCiAgLy8gU3RyYXRlZ3kgMjogV2FsayB1cCBmcm9tIFBST0pFQ1RfUk9PVCBsb29raW5nIGZvciBtb2ZsbyBpbiBhbnkgbm9kZV9tb2R1bGVzLgogIGxldCBzZWFyY2hEaXIgPSBQUk9KRUNUX1JPT1Q7CiAgY29uc3QgeyBwYXJzZSB9ID0gYXdhaXQgaW1wb3J0KCdwYXRoJyk7CiAgd2hpbGUgKHNlYXJjaERpciAhPT0gcGFyc2Uoc2VhcmNoRGlyKS5yb290KSB7CiAgICBjb25zdCBjYW5kaWRhdGUgPSBqb2luKHNlYXJjaERpciwgJ25vZGVfbW9kdWxlcycsICdtb2ZsbycsIE1FTU9SWV9SRUwpOwogICAgaWYgKGV4aXN0c1N5bmMoY2FuZGlkYXRlKSkgewogICAgICB0cnkgeyByZXR1cm4gYXdhaXQgaW1wb3J0KHBhdGhUb0ZpbGVVUkwoY2FuZGlkYXRlKS5ocmVmKTsgfSBjYXRjaCB7IC8qIGZhbGwgdGhyb3VnaCAqLyB9CiAgICB9CiAgICBzZWFyY2hEaXIgPSBkaXJuYW1lKHNlYXJjaERpcik7CiAgfQoKICByZXR1cm4gbnVsbDsKfQoKYXN5bmMgZnVuY3Rpb24gZG9JbXBvcnQoKSB7CiAgY29uc3QgbWVtUGtnID0gYXdhaXQgbG9hZE1lbW9yeVBhY2thZ2UoKTsKCiAgaWYgKCFtZW1Qa2cgfHwgIW1lbVBrZy5BdXRvTWVtb3J5QnJpZGdlKSB7CiAgICBkaW0oJ01lbW9yeSBwYWNrYWdlIG5vdCBhdmFpbGFibGUg4oCUIGF1dG8gbWVtb3J5IGltcG9ydCBza2lwcGVkIChub24tY3JpdGljYWwpJyk7CiAgICByZXR1cm47CiAgfQoKICAvLyBGdWxsIGltcGxlbWVudGF0aW9uIGRlZmVycmVkIHRvIGNvcGllZCB2ZXJzaW9uCiAgZGltKCdBdXRvIG1lbW9yeSBpbXBvcnQgYXZhaWxhYmxlIOKAlCBydW4gaW5pdCAtLXVwZ3JhZGUgZm9yIGZ1bGwgc3VwcG9ydCcpOwp9Cgphc3luYyBmdW5jdGlvbiBkb1N5bmMoKSB7CiAgaWYgKCFleGlzdHNTeW5jKFNUT1JFX1BBVEgpKSB7CiAgICBkaW0oJ05vIGVudHJpZXMgdG8gc3luYycpOwogICAgcmV0dXJuOwogIH0KCiAgY29uc3QgbWVtUGtnID0gYXdhaXQgbG9hZE1lbW9yeVBhY2thZ2UoKTsKCiAgaWYgKCFtZW1Qa2cgfHwgIW1lbVBrZy5BdXRvTWVtb3J5QnJpZGdlKSB7CiAgICBkaW0oJ01lbW9yeSBwYWNrYWdlIG5vdCBhdmFpbGFibGUg4oCUIHN5bmMgc2tpcHBlZCAobm9uLWNyaXRpY2FsKScpOwogICAgcmV0dXJuOwogIH0KCiAgZGltKCdBdXRvIG1lbW9yeSBzeW5jIGF2YWlsYWJsZSDigJQgcnVuIGluaXQgLS11cGdyYWRlIGZvciBmdWxsIHN1cHBvcnQnKTsKfQoKZnVuY3Rpb24gZG9TdGF0dXMoKSB7CiAgY29uc29sZS5sb2coJ1xuPT09IEF1dG8gTWVtb3J5IEJyaWRnZSBTdGF0dXMgPT09XG4nKTsKICBjb25zb2xlLmxvZygnICBQYWNrYWdlOiAgICAgICAgRmFsbGJhY2sgbW9kZSAocnVuIGluaXQgLS11cGdyYWRlIGZvciBmdWxsKScpOwogIGNvbnNvbGUubG9nKGAgIFN0b3JlOiAgICAgICAgICAke2V4aXN0c1N5bmMoU1RPUkVfUEFUSCkgPyAnSW5pdGlhbGl6ZWQnIDogJ05vdCBpbml0aWFsaXplZCd9YCk7CiAgY29uc29sZS5sb2coJycpOwp9Cgpjb25zdCBjb21tYW5kID0gcHJvY2Vzcy5hcmd2WzJdIHx8ICdzdGF0dXMnOwoKdHJ5IHsKICBzd2l0Y2ggKGNvbW1hbmQpIHsKICAgIGNhc2UgJ2ltcG9ydCc6IGF3YWl0IGRvSW1wb3J0KCk7IGJyZWFrOwogICAgY2FzZSAnc3luYyc6IGF3YWl0IGRvU3luYygpOyBicmVhazsKICAgIGNhc2UgJ3N0YXR1cyc6IGRvU3RhdHVzKCk7IGJyZWFrOwogICAgZGVmYXVsdDoKICAgICAgY29uc29sZS5sb2coJ1VzYWdlOiBhdXRvLW1lbW9yeS1ob29rLm1qcyA8aW1wb3J0fHN5bmN8c3RhdHVzPicpOwogICAgICBwcm9jZXNzLmV4aXQoMSk7CiAgfQp9IGNhdGNoIChlcnIpIHsKICAvLyBIb29rcyBtdXN0IG5ldmVyIGNyYXNoIENsYXVkZSBDb2RlIC0gZmFpbCBzaWxlbnRseQogIGRpbShgRXJyb3IgKG5vbi1jcml0aWNhbCk6ICR7ZXJyLm1lc3NhZ2V9YCk7Cn0K",
18
18
  "gate-hook.mjs": "IyEvdXNyL2Jpbi9lbnYgbm9kZQppbXBvcnQgeyBleGVjRmlsZVN5bmMgfSBmcm9tICdjaGlsZF9wcm9jZXNzJzsKaW1wb3J0IHsgcmVzb2x2ZSB9IGZyb20gJ3BhdGgnOwoKdmFyIGNvbW1hbmQgPSBwcm9jZXNzLmFyZ3ZbMl07CmlmICghY29tbWFuZCkgcHJvY2Vzcy5leGl0KDApOwoKLy8gUmVhZCBzdGRpbiBKU09OIGZyb20gQ2xhdWRlIENvZGUKdmFyIHN0ZGluRGF0YSA9ICcnOwp0cnkgewogIHN0ZGluRGF0YSA9IGF3YWl0IG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlcykgewogICAgdmFyIGRhdGEgPSAnJzsKICAgIHZhciB0aW1lb3V0ID0gc2V0VGltZW91dChmdW5jdGlvbigpIHsgcmVzKGRhdGEpOyB9LCA1MDApOwogICAgcHJvY2Vzcy5zdGRpbi5zZXRFbmNvZGluZygndXRmLTgnKTsKICAgIHByb2Nlc3Muc3RkaW4ub24oJ2RhdGEnLCBmdW5jdGlvbihjaHVuaykgeyBkYXRhICs9IGNodW5rOyB9KTsKICAgIHByb2Nlc3Muc3RkaW4ub24oJ2VuZCcsIGZ1bmN0aW9uKCkgeyBjbGVhclRpbWVvdXQodGltZW91dCk7IHJlcyhkYXRhKTsgfSk7CiAgICBwcm9jZXNzLnN0ZGluLm9uKCdlcnJvcicsIGZ1bmN0aW9uKCkgeyBjbGVhclRpbWVvdXQodGltZW91dCk7IHJlcygnJyk7IH0pOwogICAgaWYgKHByb2Nlc3Muc3RkaW4uaXNUVFkpIHsgY2xlYXJUaW1lb3V0KHRpbWVvdXQpOyByZXMoJycpOyB9CiAgfSk7Cn0gY2F0Y2ggKGUpIHsgLyogbm8gc3RkaW4gKi8gfQoKdmFyIGhvb2tDb250ZXh0ID0ge307CnRyeSB7IGlmIChzdGRpbkRhdGEudHJpbSgpKSBob29rQ29udGV4dCA9IEpTT04ucGFyc2Uoc3RkaW5EYXRhKTsgfSBjYXRjaCAoZSkge30KCi8vIFBhc3MgdG9vbCBpbmZvIGFzIGVudiB2YXJzIGZvciBnYXRlLmNqcwp2YXIgZW52ID0gT2JqZWN0LmFzc2lnbih7fSwgcHJvY2Vzcy5lbnYpOwppZiAoaG9va0NvbnRleHQudG9vbF9uYW1lKSBlbnYuVE9PTF9OQU1FID0gaG9va0NvbnRleHQudG9vbF9uYW1lOwovLyBGb3J3YXJkIENsYXVkZSBDb2RlJ3Mgc2Vzc2lvbl9pZCBzbyBnYXRlLmNqcyBjYW4gZW5mb3JjZSBtZW1vcnktZmlyc3QKLy8gcGVyLWFjdG9yICgjODM4KSDigJQgZWFjaCBzcGF3bmVkIHN1YmFnZW50IGdldHMgaXRzIG93biBzZXNzaW9uX2lkLCBzbyBhCi8vIHNoYXJlZCB3b3JrZmxvdy1zdGF0ZS5qc29uIG5vIGxvbmdlciBsZXRzIG9uZSBzdWJhZ2VudCdzIGRpcmVjdGl2ZSBiZQovLyBzaWxlbnRseSBzYXRpc2ZpZWQgYnkgdGhlIHBhcmVudCdzIGVhcmxpZXIgc2VhcmNoLgppZiAodHlwZW9mIGhvb2tDb250ZXh0LnNlc3Npb25faWQgPT09ICdzdHJpbmcnICYmIGhvb2tDb250ZXh0LnNlc3Npb25faWQpIHsKICBlbnYuSE9PS19TRVNTSU9OX0lEID0gaG9va0NvbnRleHQuc2Vzc2lvbl9pZDsKfQovLyAjMTM3NCDigJQgZm9yd2FyZCB0aGUgdHJhbnNjcmlwdCBwYXRoIHNvIGEgZ2F0ZSBjYW4gcmVhZCB3aGF0IHRoZSBzZXNzaW9uCi8vIGFjdHVhbGx5IERJRCwgbm90IG9ubHkgd2hhdCB3b3JrZmxvdy1zdGF0ZS5qc29uIHdhcyB0b2xkIGFib3V0IGl0LiBVc2VkIGJ5Ci8vIGNoZWNrLWJlZm9yZS1wciB0byBjb3VudCBUYXNrQ3JlYXRlIGNhbGxzIGFnYWluc3QgdGVybWluYWwgVGFza1VwZGF0ZSBjYWxsczsKLy8gdGhlIGFsdGVybmF0aXZlIOKAlCBhIGBeVGFza1VwZGF0ZSRgIFBvc3RUb29sVXNlIG9ic2VydmVyIOKAlCBpcyB0aGUgd2lyaW5nICMxMzMxCi8vIHJlbW92ZWQgYXMgcHVyZSBob3QtcGF0aCBvdmVyaGVhZCwgYW5kIHRoZSB0cmFuc2NyaXB0IGFscmVhZHkgaG9sZHMgdGhlIGFuc3dlci4KLy8gQWJzZW50IG9uIGhvc3RzIHRoYXQgZG9uJ3Qgc2VuZCBpdDogZ2F0ZXMgdHJlYXQgdGhhdCBhcyAidW5rbm93biIgYW5kIHN0YXkgc2lsZW50LgppZiAodHlwZW9mIGhvb2tDb250ZXh0LnRyYW5zY3JpcHRfcGF0aCA9PT0gJ3N0cmluZycgJiYgaG9va0NvbnRleHQudHJhbnNjcmlwdF9wYXRoKSB7CiAgZW52LkhPT0tfVFJBTlNDUklQVF9QQVRIID0gaG9va0NvbnRleHQudHJhbnNjcmlwdF9wYXRoOwp9Ci8vICMxNDQ3IOKAlCBmb3J3YXJkIHRoZSB1c2VyIHByb21wdC4gYGdhdGUuY2pzYCByZWFkcyBDTEFVREVfVVNFUl9QUk9NUFQgdG8gZGVjaWRlCi8vIHdoZXRoZXIgYSBwcm9tcHQgbmVlZHMgYSBtZW1vcnkgc2VhcmNoLCBhbmQgdGhpcyBicmlkZ2UgbmV2ZXIgc2V0IGl0LCBzbyB0aGUKLy8gYHByb21wdC1zdGF0ZS1yZXNldGAgc2FmZXR5LW5ldCBob29rIGNsYXNzaWZpZWQgdGhlIEVNUFRZIFNUUklORyBvbiBldmVyeQovLyBwcm9tcHQsIGNvbmNsdWRlZCAibm8gbWVtb3J5IHJlcXVpcmVkIiwgYW5kIHdyb3RlIHRoYXQgb3ZlciB0aGUgY29ycmVjdCB2YWx1ZQovLyBwcm9tcHQtaG9vay5tanMgaGFkIGp1c3QgY29tcHV0ZWQuIEEgc2FmZXR5IG5ldCB0aGF0IGRpc2FybWVkIHRoZSBnYXRlIGl0Ci8vIGV4aXN0cyB0byBwcm90ZWN0IOKAlCBpbnRlcm1pdHRlbnRseSwgc2luY2UgdGhlIHN1cnZpdmluZyB2YWx1ZSBkZXBlbmRlZCBvbgovLyB3aGljaCBvZiB0aGUgdHdvIFVzZXJQcm9tcHRTdWJtaXQgaG9va3Mgd3JvdGUgbGFzdC4KLy8KLy8gU2FtZSBmaWVsZCBwcmVjZWRlbmNlIGFzIHByb21wdC1ob29rLm1qcyAoYHVzZXJfcHJvbXB0YCB0aGVuIGBwcm9tcHRgKSBzbyBib3RoCi8vIFVzZXJQcm9tcHRTdWJtaXQgcGF0aHMgY2xhc3NpZnkgaWRlbnRpY2FsIHRleHQgYW5kIHRoZSByZXNldCBpcyBnZW51aW5lbHkKLy8gaWRlbXBvdGVudCwgd2hpY2ggaXMgdGhlIG9ubHkgdGhpbmcgdGhhdCBtYWtlcyBhIHNhZmV0eS1uZXQgaG9vayBzYWZlLgppZiAodHlwZW9mIGhvb2tDb250ZXh0LnVzZXJfcHJvbXB0ID09PSAnc3RyaW5nJyAmJiBob29rQ29udGV4dC51c2VyX3Byb21wdCkgewogIGVudi5DTEFVREVfVVNFUl9QUk9NUFQgPSBob29rQ29udGV4dC51c2VyX3Byb21wdDsKfSBlbHNlIGlmICh0eXBlb2YgaG9va0NvbnRleHQucHJvbXB0ID09PSAnc3RyaW5nJyAmJiBob29rQ29udGV4dC5wcm9tcHQpIHsKICBlbnYuQ0xBVURFX1VTRVJfUFJPTVBUID0gaG9va0NvbnRleHQucHJvbXB0Owp9Ci8vICMxMzMyOiBzdHJ1Y3R1cmVkIHRvb2wgaW5wdXRzIGFyZSBmb3J3YXJkZWQgYXMgSlNPTiwgbm90IGRyb3BwZWQuCi8vCi8vIFRoaXMgcHJldmlvdXNseSBmb3J3YXJkZWQgT05MWSBzdHJpbmcgdmFsdWVzLCBzbyBhbnkgb2JqZWN0LXZhbHVlZCBpbnB1dCB3YXMKLy8gaW52aXNpYmxlIHRvIGdhdGUuY2pzLiBUaGF0IGJsb2NrZWQgdGhlIHZlcmlmeS1iZWZvcmUtZG9uZSBnYXRlIGZyb20gcmVhZGluZwovLyBgL3ZlcmlmeWAncyBwZXItY3JpdGVyaW9uIHZlcmRpY3QsIHdoaWNoICMxMzI4IHN0b3JlcyBpbiBtZW1vcnlfc3RvcmUncwovLyBgbWV0YWRhdGFgIOKAlCBhbiBvYmplY3QuIFBhcnNpbmcgdGhlIHZlcmRpY3Qgb3V0IG9mIHRoZSBwcm9zZSBgdmFsdWVgIHN0cmluZwovLyBpbnN0ZWFkIHdvdWxkIHJlLWNyZWF0ZSBleGFjdGx5IHRoZSBmcmVlLXRleHQgZGVwZW5kZW5jeSAjMTMyOCByZW1vdmVkLgovLwovLyBDcm9zcy1wbGF0Zm9ybSAoUnVsZSAjMSk6IFdpbmRvd3MgY2FwcyBhIHNpbmdsZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBhdAovLyB+MzJLQiBhbmQgdGhlIHdob2xlIGJsb2NrIGF0IH4zMksgd2lkZSBjaGFycywgYW5kIGV4Y2VlZGluZyBpdCBmYWlscyB0aGUKLy8gc3Bhd24gcmF0aGVyIHRoYW4gdHJ1bmNhdGluZy4gTmV3bHktZm9yd2FyZGVkIHZhbHVlcyBhcmUgdGhlcmVmb3JlIHNraXBwZWQKLy8gd2hlbiBvdmVyc2l6ZWQsIG5vdCBjbGlwcGVkIOKAlCBhIHRydW5jYXRlZCBKU09OIGJsb2Igd291bGQgcGFyc2UgYXMgbWFsZm9ybWVkCi8vIG9uIHRoZSBmYXIgc2lkZSBhbmQgcmVhZCBhcyBhIGNvcnJ1cHQgcmVjb3JkIHJhdGhlciB0aGFuIGFuIGFic2VudCBvbmUuCi8vIGBtZXRhZGF0YWAgaXMgY2FwcGVkIGF0IDY0S0IgYnkgbWVtb3J5X3N0b3JlLCBzbyBhIHJlYWwgdmVyZGljdCBuZXZlciBuZWFycwovLyB0aGlzLiBTVFJJTkcgdmFsdWVzIGtlZXAgdGhlaXIgcHJldmlvdXMgdW5jYXBwZWQgYmVoYXZpb3VyIGJ5dGUtZm9yLWJ5dGU6Ci8vIGdhdGUuY2pzIHJlYWRzIFRPT0xfSU5QVVRfY29tbWFuZCwgYW5kIGRyb3BwaW5nIGFuIG92ZXJzaXplZCBoZXJlZG9jIGNvbW1hbmQKLy8gd291bGQgc2lsZW50bHkgc3RvcCBjaGVjay1kYW5nZXJvdXMtY29tbWFuZCBmcm9tIGZpcmluZyBvbiB0aGUgZXhhY3QgaW5wdXRzCi8vIG1vc3Qgd29ydGggY2hlY2tpbmcuCnZhciBNQVhfU1RSVUNUVVJFRF9MRU4gPSAxNjM4NDsKaWYgKGhvb2tDb250ZXh0LnRvb2xfaW5wdXQgJiYgdHlwZW9mIGhvb2tDb250ZXh0LnRvb2xfaW5wdXQgPT09ICdvYmplY3QnKSB7CiAgT2JqZWN0LmtleXMoaG9va0NvbnRleHQudG9vbF9pbnB1dCkuZm9yRWFjaChmdW5jdGlvbihrZXkpIHsKICAgIHZhciByYXcgPSBob29rQ29udGV4dC50b29sX2lucHV0W2tleV07CiAgICBpZiAodHlwZW9mIHJhdyA9PT0gJ3N0cmluZycpIHsKICAgICAgZW52WydUT09MX0lOUFVUXycgKyBrZXldID0gcmF3OwogICAgICByZXR1cm47CiAgICB9CiAgICB2YXIgdmFsOwogICAgaWYgKHR5cGVvZiByYXcgPT09ICdudW1iZXInIHx8IHR5cGVvZiByYXcgPT09ICdib29sZWFuJykgewogICAgICB2YWwgPSBTdHJpbmcocmF3KTsKICAgIH0gZWxzZSBpZiAocmF3ICYmIHR5cGVvZiByYXcgPT09ICdvYmplY3QnKSB7CiAgICAgIHRyeSB7IHZhbCA9IEpTT04uc3RyaW5naWZ5KHJhdyk7IH0gY2F0Y2ggKGUpIHsgcmV0dXJuOyB9CiAgICB9IGVsc2UgewogICAgICByZXR1cm47IC8vIG51bGwvdW5kZWZpbmVkL2Z1bmN0aW9uIOKAlCBub3RoaW5nIG1lYW5pbmdmdWwgdG8gZm9yd2FyZAogICAgfQogICAgaWYgKHZhbC5sZW5ndGggPiBNQVhfU1RSVUNUVVJFRF9MRU4pIHJldHVybjsKICAgIGVudlsnVE9PTF9JTlBVVF8nICsga2V5XSA9IHZhbDsKICB9KTsKfQoKLy8gIzEzMjI6IGZvcndhcmQgdGhlIHBhcnRzIG9mIHRvb2xfcmVzcG9uc2UgdGhhdCBhY3R1YWxseSBleGlzdCwgc28gYSBnYXRlIGNhbgovLyBvYnNlcnZlIGFuIE9VVENPTUUgcmF0aGVyIHRoYW4gb25seSB0aGUgaW50ZW50IGl0IHdhcyBoYW5kZWQuCi8vCi8vIENsYXVkZSBDb2RlJ3MgUG9zdFRvb2xVc2UgcGF5bG9hZCBjYXJyaWVzIE5PIGV4aXQgc3RhdHVzIOKAlCBwcm9iZWQgb24gdjIuMS4yMjAsCi8vIHRvb2xfcmVzcG9uc2UgZm9yIGEgQmFzaCBjYWxsIGlzIHtzdGRvdXQsIHN0ZGVyciwgaW50ZXJydXB0ZWQsIGlzSW1hZ2UsCi8vIG5vT3V0cHV0RXhwZWN0ZWR9LiBQb3N0VG9vbFVzZSBhbHNvIGRvZXMgbm90IGZpcmUgYXQgYWxsIHdoZW4gdGhlIGNvbW1hbmQKLy8gZXhpdHMgbm9uLXplcm8sIHNvIHRoZSBvbmx5IGNhc2UgYSBnYXRlIGNhbiBzdGlsbCBiZSBmb29sZWQgYnkgaXMgYW4gZXhpdCBjb2RlCi8vIE1BU0tFRCBieSBhIHBpcGUgb3IgYHx8IHRydWVgLCB3aGVyZSB0aGUgcmVzcG9uc2UgbG9va3MgY2xlYW4uIFRoZSBydW5uZXIncwovLyBvd24gb3V0cHV0IGlzIHRoZSBzb2xlIHJlbWFpbmluZyBzaWduYWw7IHJlY29yZC10ZXN0LXJ1biByZWFkcyBpdCBpbiBnYXRlLmNqcy4KLy8KLy8gVGFpbCwgbm90IGhlYWQuIEV2ZXJ5IHRlc3QgcnVubmVyIHByaW50cyBpdHMgcGFzcy9mYWlsIHN1bW1hcnkgTEFTVCwgc28KLy8gY2xpcHBpbmcgdGhlIGZyb250IG9mIGEgbG9uZyBsb2cgd291bGQgZGlzY2FyZCB0aGUgZXhhY3QgbGluZXMgdGhpcyBleGlzdHMgdG8KLy8gcmVhZC4gQm91bmRzIGFyZSBkZWxpYmVyYXRlbHkgdGlnaHQg4oCUIFdpbmRvd3MgY2FwcyB0aGUgd2hvbGUgZW52aXJvbm1lbnQKLy8gYmxvY2sgYXQgfjMySyB3aWRlIGNoYXJzIGFuZCBmYWlscyB0aGUgc3Bhd24gcmF0aGVyIHRoYW4gdHJ1bmNhdGluZywgYW5kCi8vIFRPT0xfSU5QVVRfY29tbWFuZCBpcyBhbHJlYWR5IGZvcndhcmRlZCB1bmNhcHBlZCBhbG9uZ3NpZGUgdGhlc2UuCnZhciBNQVhfUkVTUE9OU0VfU1RET1VUID0gNDA5NjsKdmFyIE1BWF9SRVNQT05TRV9TVERFUlIgPSAyMDQ4OwpmdW5jdGlvbiB0YWlsT2YodmFsdWUsIG1heCkgewogIHJldHVybiB2YWx1ZS5sZW5ndGggPiBtYXggPyB2YWx1ZS5zbGljZSh2YWx1ZS5sZW5ndGggLSBtYXgpIDogdmFsdWU7Cn0KaWYgKGhvb2tDb250ZXh0LnRvb2xfcmVzcG9uc2UgJiYgdHlwZW9mIGhvb2tDb250ZXh0LnRvb2xfcmVzcG9uc2UgPT09ICdvYmplY3QnKSB7CiAgdmFyIHJlc3AgPSBob29rQ29udGV4dC50b29sX3Jlc3BvbnNlOwogIGlmICh0eXBlb2YgcmVzcC5zdGRvdXQgPT09ICdzdHJpbmcnICYmIHJlc3Auc3Rkb3V0KSB7CiAgICBlbnYuVE9PTF9SRVNQT05TRV9zdGRvdXQgPSB0YWlsT2YocmVzcC5zdGRvdXQsIE1BWF9SRVNQT05TRV9TVERPVVQpOwogIH0KICBpZiAodHlwZW9mIHJlc3Auc3RkZXJyID09PSAnc3RyaW5nJyAmJiByZXNwLnN0ZGVycikgewogICAgZW52LlRPT0xfUkVTUE9OU0Vfc3RkZXJyID0gdGFpbE9mKHJlc3Auc3RkZXJyLCBNQVhfUkVTUE9OU0VfU1RERVJSKTsKICB9CiAgLy8gQm9vbGVhbiDigJQgdGhlIHN0cmluZy10eXBlZCBmb3J3YXJkaW5nIGFib3ZlIHdvdWxkIGRyb3AgaXQgc2lsZW50bHkuCiAgaWYgKHR5cGVvZiByZXNwLmludGVycnVwdGVkID09PSAnYm9vbGVhbicpIHsKICAgIGVudi5UT09MX1JFU1BPTlNFX2ludGVycnVwdGVkID0gU3RyaW5nKHJlc3AuaW50ZXJydXB0ZWQpOwogIH0KfQoKLy8gIzE0MzUg4oCUIGRlbGl2ZXIgYSBQQVNTSU5HIGdhdGUncyBhZHZpc29yeSB0byBDbGF1ZGUsIG5vdCBvbmx5IHRvIHRoZSB0cmFuc2NyaXB0LgovLwovLyBDbGF1ZGUgQ29kZSBzaG93cyBhIFByZVRvb2xVc2UvUG9zdFRvb2xVc2UgaG9vaydzIHN0ZG91dCB0byB0aGUgdXNlciBpbgovLyB0cmFuc2NyaXB0IG1vZGUgYW5kIHN0b3BzIHRoZXJlOyB0aGUgbW9kZWwgbmV2ZXIgc2VlcyBpdC4gU28gZXZlcnkgYWR2aXNvcnkKLy8gdGhlIGdhdGVzIGVtaXQgb24gdGhlIGV4aXQtMCBwYXRoIHdhcyBpbnZpc2libGUgb24gZXhhY3RseSB0aGUgcnVucyBpdCB3YXMKLy8gd3JpdHRlbiBmb3I6ICMxMzc0J3Mgb3Blbi10YXNrIGNvdW50LCB0aGUgcHJlLUFnZW50IFRhc2tDcmVhdGUgcmVtaW5kZXIsIHRoZQovLyBuYW1lc3BhY2UgaGludCwgdGhlIGRvY3Mtb25seSBhbmQgc2ltcGxpZnktYXV0by1wYXNzIG5vdGVzLiBUaGV5IHN1cmZhY2VkIG9ubHkKLy8gd2hlbiBzb21lIE9USEVSIGdhdGUgYmxvY2tlZCwgYmVjYXVzZSB0aGUgY2F0Y2ggYXJtIGJlbG93IHJlLXJvdXRlcyBlcnIuc3Rkb3V0Ci8vIHRvIHN0ZGVyciDigJQgaS5lLiBvbmx5IG9uY2UgdGhlIFBSIGhhZCBhbHJlYWR5IGJlZW4gc3RvcHBlZCBmb3IgYW5vdGhlciByZWFzb24uCi8vIEEgY29uc3VtZXIgc2hpcHBlZCBhIFBSIG92ZXIgZm91ciB1bnRvdWNoZWQgdGFza3Mgd2l0aCB0aGF0IHJlbWluZGVyICJ3b3JraW5nIi4KLy8KLy8gYGhvb2tTcGVjaWZpY091dHB1dC5hZGRpdGlvbmFsQ29udGV4dGAgaXMgdGhlIGRvY3VtZW50ZWQgY2hhbm5lbCBmcm9tIGEgcGFzc2luZwovLyB0b29sIGhvb2sgaW50byB0aGUgbW9kZWwncyBjb250ZXh0LiBXcmFwIHRoZXJlIGFuZCBub3doZXJlIGVsc2U6IFNlc3Npb25TdGFydAovLyBhbmQgVXNlclByb21wdFN1Ym1pdCBhbHJlYWR5IGluamVjdCB0aGVpciBzdGRvdXQgYXMgY29udGV4dCwgc28gd3JhcHBpbmcgdGhvc2UKLy8gd291bGQgcmV3cml0ZSBhIHdvcmtpbmcgcGF0aCBmb3Igbm90aGluZy4gQW4gdW5rbm93biBvciBhYnNlbnQgaG9va19ldmVudF9uYW1lCi8vIGZhbGxzIGJhY2sgdG8gcmF3IHN0ZG91dCDigJQgYnl0ZS1pZGVudGljYWwgdG8gdGhlIHByZXZpb3VzIGJlaGF2aW91ci4KdmFyIEFEVklTT1JZX0VWRU5UUyA9IHsgUHJlVG9vbFVzZTogdHJ1ZSwgUG9zdFRvb2xVc2U6IHRydWUgfTsKZnVuY3Rpb24gZW1pdEFkdmlzb3J5KHRleHQpIHsKICB2YXIgZXZlbnQgPSBob29rQ29udGV4dC5ob29rX2V2ZW50X25hbWU7CiAgaWYgKCFBRFZJU09SWV9FVkVOVFNbZXZlbnRdKSB7CiAgICBwcm9jZXNzLnN0ZG91dC53cml0ZSh0ZXh0KTsKICAgIHJldHVybjsKICB9CiAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoSlNPTi5zdHJpbmdpZnkoewogICAgaG9va1NwZWNpZmljT3V0cHV0OiB7IGhvb2tFdmVudE5hbWU6IGV2ZW50LCBhZGRpdGlvbmFsQ29udGV4dDogdGV4dCB9LAogIH0pICsgJ1xuJyk7Cn0KCi8vIFJ1biBnYXRlLmNqcyB3aXRoIHRoZSBlbnJpY2hlZCBlbnZpcm9ubWVudAp2YXIgcHJvamVjdERpciA9IChlbnYuQ0xBVURFX1BST0pFQ1RfRElSIHx8IHByb2Nlc3MuY3dkKCkpLnJlcGxhY2UoL15cLyhbYS16XSlcLy9pLCAnJDE6LycpOwp2YXIgZ2F0ZVNjcmlwdCA9IHJlc29sdmUocHJvamVjdERpciwgJy5jbGF1ZGUvaGVscGVycy9nYXRlLmNqcycpOwp0cnkgewogIHZhciBvdXRwdXQgPSBleGVjRmlsZVN5bmMoJ25vZGUnLCBbZ2F0ZVNjcmlwdCwgY29tbWFuZF0sIHsKICAgIGVudjogZW52LCBlbmNvZGluZzogJ3V0Zi04JywgdGltZW91dDogNTAwMCwgc3RkaW86IFsncGlwZScsICdwaXBlJywgJ3BpcGUnXSwgd2luZG93c0hpZGU6IHRydWUKICB9KTsKICBpZiAob3V0cHV0LnRyaW0oKSkgZW1pdEFkdmlzb3J5KG91dHB1dCk7CiAgcHJvY2Vzcy5leGl0KDApOwp9IGNhdGNoIChlcnIpIHsKICAvLyBnYXRlLmNqcyBleGl0KDIpID0gYmxvY2ssIGV4aXQoMSkgPSBhbHNvIGJsb2NrIGF0dGVtcHQg4oCUIHRyYW5zbGF0ZSBib3RoIHRvIGV4aXQoMikKICBpZiAoZXJyLnN0ZGVycikgcHJvY2Vzcy5zdGRlcnIud3JpdGUoZXJyLnN0ZGVycik7CiAgaWYgKGVyci5zdGRvdXQpIHByb2Nlc3Muc3RkZXJyLndyaXRlKGVyci5zdGRvdXQpOwogIHByb2Nlc3MuZXhpdChlcnIuc3RhdHVzID09PSAyIHx8IGVyci5zdGF0dXMgPT09IDEgPyAyIDogMCk7Cn0K",
19
- "gate.cjs": "IyEvdXNyL2Jpbi9lbnYgbm9kZQondXNlIHN0cmljdCc7CnZhciBmcyA9IHJlcXVpcmUoJ2ZzJyk7CnZhciBwYXRoID0gcmVxdWlyZSgncGF0aCcpOwp2YXIgY3AgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJyk7CnZhciBvcyA9IHJlcXVpcmUoJ29zJyk7CnZhciBjcnlwdG8gPSByZXF1aXJlKCdjcnlwdG8nKTsKCnZhciBQUk9KRUNUX0RJUiA9IChwcm9jZXNzLmVudi5DTEFVREVfUFJPSkVDVF9ESVIgfHwgcHJvY2Vzcy5jd2QoKSkucmVwbGFjZSgvXlwvKFthLXpdKVwvL2ksICckMTovJyk7CnZhciBTVEFURV9GSUxFID0gcGF0aC5qb2luKFBST0pFQ1RfRElSLCAnLmNsYXVkZScsICd3b3JrZmxvdy1zdGF0ZS5qc29uJyk7CgovLyB0ZXN0c0ZpbmdlcnByaW50IC8gc2ltcGxpZnlGaW5nZXJwcmludCAvIHZlcmlmeUZpbmdlcnByaW50IHBpbiBlYWNoIGNyZWRpdCB0bwovLyB0aGUgY29kZSBpdCBkZXNjcmliZXMsIHNvIGEgY2hhbmdlIG1hZGUgb3V0c2lkZSBXcml0ZS9FZGl0L011bHRpRWRpdCAoYSBCYXNoCi8vIHdyaXRlLCBhIGJyYW5jaCBzd2l0Y2gsIHRoZSBuZXh0IGlzc3VlIGluIHRoZSBzYW1lIHNlc3Npb24pIGludmFsaWRhdGVzIGl0LgovLyBTZWUgY3JlZGl0RmluZ2VycHJpbnQoKSBmb3Igd2h5IHRoZSBib29sZWFuIGZsYWdzIGFsb25lIGNhbm5vdC4KdmFyIFNUQVRFX0RFRkFVTFRTID0geyB0YXNrc0NyZWF0ZWQ6IGZhbHNlLCB0YXNrQ291bnQ6IDAsIHRhc2tzQWNrbm93bGVkZ2VkOiBmYWxzZSwgbWVtb3J5U2VhcmNoZWQ6IGZhbHNlLCBtZW1vcnlTZWFyY2hlZEJ5OiB7fSwgbWVtb3J5UmVxdWlyZWQ6IHRydWUsIGxlYXJuaW5nc1N0b3JlZDogZmFsc2UsIHRlc3RzUnVuOiBmYWxzZSwgdGVzdHNGaW5nZXJwcmludDogbnVsbCwgc2ltcGxpZnlSdW46IGZhbHNlLCBzaW1wbGlmeVNuYXBzaG90U2hhOiBudWxsLCBzaW1wbGlmeUZpbmdlcnByaW50OiBudWxsLCB2ZXJpZnlSdW46IGZhbHNlLCB2ZXJpZnlPdXRjb21lOiBudWxsLCB2ZXJpZnlGaW5nZXJwcmludDogbnVsbCwgaW50ZXJhY3Rpb25Db3VudDogMCwgc2Vzc2lvblN0YXJ0OiBudWxsLCBsYXN0QmxvY2tlZEF0OiBudWxsLCBsYXN0TmFtZXNwYWNlSGludDogJycsIGxhc3ROYW1lc3BhY2VIaW50RW1pdHRlZEJ5OiB7fSwgZmxNb2RlOiBudWxsLCBzd2FybUluaXRpYWxpemVkOiBmYWxzZSwgaGl2ZUluaXRpYWxpemVkOiBmYWxzZSwgc2RkTW9kZTogZmFsc2UsIGFjdGl2ZVNkZFNsdWc6IG51bGwgfTsKCi8vIFBlci1hY3RvciBtZW1vcnktc2VhcmNoIHRyYWNraW5nICgjODM4KS4gVGhlIGxlZ2FjeSBgbWVtb3J5U2VhcmNoZWRgIGJvb2xlYW4KLy8gaXMgc2Vzc2lvbi13aWRlLCBzbyBvbmNlIHRoZSBwYXJlbnQgc2VhcmNoZXMgbWVtb3J5LCBldmVyeSBzcGF3bmVkIHN1YmFnZW50Ci8vIGluaGVyaXRzIHRoZSBzYXRpc2ZpZWQgZmxhZyBhbmQgdGhlIGRpcmVjdGl2ZSdzICJXSUxMIEJMT0NLIiBwcm9taXNlIGJlY29tZXMKLy8gZmFsc2UuIFdoZW4gZ2F0ZS1ob29rLm1qcyBmb3J3YXJkcyBDbGF1ZGUgQ29kZSdzIHN0ZGluIGBzZXNzaW9uX2lkYCBhcwovLyBIT09LX1NFU1NJT05fSUQsIHByZWZlciB0aGUgcGVyLXNlc3Npb24gbWFwIHNvIGVhY2ggc3ViYWdlbnQgbXVzdCBzZWFyY2gKLy8gbWVtb3J5IGl0c2VsZiBiZWZvcmUgaXRzIGZpcnN0IEdsb2IvR3JlcC9SZWFkLiBGYWxscyBiYWNrIHRvIHRoZSBsZWdhY3kKLy8gYm9vbGVhbiB3aGVuIG5vIHNlc3Npb24gaWQgaXMgcHJlc2VudCAoQ0xJIGludm9jYXRpb25zLCB0ZXN0cywgb2xkZXIgaG9zdHMpLgpmdW5jdGlvbiBpc01lbW9yeVNlYXJjaGVkRm9yKHN0YXRlKSB7CiAgdmFyIHNpZCA9IHByb2Nlc3MuZW52LkhPT0tfU0VTU0lPTl9JRCB8fCAnJzsKICBpZiAoc2lkKSB7CiAgICB2YXIgbWFwID0gc3RhdGUubWVtb3J5U2VhcmNoZWRCeSB8fCB7fTsKICAgIHJldHVybiBtYXBbc2lkXSA9PT0gdHJ1ZTsKICB9CiAgcmV0dXJuIHN0YXRlLm1lbW9yeVNlYXJjaGVkID09PSB0cnVlOwp9CgovLyBTdGFtcCB0aGUgbGVnYWN5IGJvb2wgcGx1cyAod2hlbiBIT09LX1NFU1NJT05fSUQgaXMgc2V0KSB0aGUgcGVyLWFjdG9yIG1hcC4KLy8gUmV0dXJucyB0cnVlIGlmIGFueXRoaW5nIGFjdHVhbGx5IGNoYW5nZWQg4oCUIGNhbGxlcnMgZ2F0ZSB3cml0ZVN0YXRlKCkgb24gaXQKLy8gdG8gYXZvaWQgcmVkdW5kYW50IGZzeW5jcyBpbiB0aWdodCBiYXNoLW1lbW9yeSBsb29wcy4KZnVuY3Rpb24gbWFya01lbW9yeVNlYXJjaGVkKHN0YXRlKSB7CiAgdmFyIHNpZCA9IHByb2Nlc3MuZW52LkhPT0tfU0VTU0lPTl9JRCB8fCAnJzsKICB2YXIgY2hhbmdlZCA9IGZhbHNlOwogIGlmIChzdGF0ZS5tZW1vcnlTZWFyY2hlZCAhPT0gdHJ1ZSkgeyBzdGF0ZS5tZW1vcnlTZWFyY2hlZCA9IHRydWU7IGNoYW5nZWQgPSB0cnVlOyB9CiAgaWYgKHNpZCkgewogICAgaWYgKCFzdGF0ZS5tZW1vcnlTZWFyY2hlZEJ5KSBzdGF0ZS5tZW1vcnlTZWFyY2hlZEJ5ID0ge307CiAgICBpZiAoc3RhdGUubWVtb3J5U2VhcmNoZWRCeVtzaWRdICE9PSB0cnVlKSB7IHN0YXRlLm1lbW9yeVNlYXJjaGVkQnlbc2lkXSA9IHRydWU7IGNoYW5nZWQgPSB0cnVlOyB9CiAgfQogIHJldHVybiBjaGFuZ2VkOwp9CgpmdW5jdGlvbiByZWFkU3RhdGUoKSB7CiAgdHJ5IHsKICAgIGlmIChmcy5leGlzdHNTeW5jKFNUQVRFX0ZJTEUpKSB7CiAgICAgIHZhciBwYXJzZWQgPSBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhTVEFURV9GSUxFLCAndXRmLTgnKSk7CiAgICAgIC8vIE1lcmdlIGRlZmF1bHRzIHNvIG1pc3Npbmcga2V5cyAoZS5nLiBhZGRlZCBpbiBuZXdlciB2ZXJzaW9ucykgYXJlIGZpbGxlZCBpbgogICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgU1RBVEVfREVGQVVMVFMsIHBhcnNlZCk7CiAgICB9CiAgfSBjYXRjaCAoZSkgeyAvKiByZXNldCBvbiBjb3JydXB0aW9uICovIH0KICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgU1RBVEVfREVGQVVMVFMpOwp9CgpmdW5jdGlvbiB3cml0ZVN0YXRlKHMpIHsKICB0cnkgewogICAgdmFyIGRpciA9IHBhdGguZGlybmFtZShTVEFURV9GSUxFKTsKICAgIGlmICghZnMuZXhpc3RzU3luYyhkaXIpKSBmcy5ta2RpclN5bmMoZGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTsKICAgIGZzLndyaXRlRmlsZVN5bmMoU1RBVEVfRklMRSwgSlNPTi5zdHJpbmdpZnkocywgbnVsbCwgMikpOwogIH0gY2F0Y2ggKGUpIHsgLyogbm9uLWZhdGFsICovIH0KfQoKLy8gTG9hZCBtb2Zsby55YW1sIGdhdGUgY29uZmlnIChkZWZhdWx0czogYWxsIGVuYWJsZWQpCmZ1bmN0aW9uIGxvYWRHYXRlQ29uZmlnKCkgewogIC8vIHZlcmlmeV9iZWZvcmVfZG9uZSBpcyBvcHQtT1VUIChkZWZhdWx0IHRydWUpLCBsaWtlIGV2ZXJ5IG90aGVyIGdhdGU6ICMxMjk0CiAgLy8gc2hpcHMgYSByZWFsIC92ZXJpZnkgc2tpbGwgYW5kIGhhcyAvZmxvIGRlbGVnYXRlIHRvIGl0LCBzbyBsZWF2aW5nIGl0IG9mZiBieQogIC8vIGRlZmF1bHQgd291bGQgbWFrZSB0aGUgZGVmYXVsdCAvZmxvIHJ1biBzaWxlbnRseSBza2lwIHRoZSBhY2NlcHRhbmNlIGNoZWNrLgogIC8vIERpc2FibGUgcGVyLXByb2plY3Qgd2l0aCBgdmVyaWZ5X2JlZm9yZV9kb25lOiBmYWxzZWAgb3IgcGVyLXJ1biBgLS1uby12ZXJpZnlgLgogIC8vIHRhc2tfc3RhdHVzX2dhdGUgaXMgYSBNT0RFLCBub3QgYSBib29sZWFuOiAnYmxvY2snIHwgJ3dhcm4nIHwgJ29mZicgKCMxNDM1KS4KICAvLyAjMTM3NCBzaGlwcGVkIHRoZSBvcGVuLXRhc2sgY291bnQgYXMgYSB3YXJuLW9ubHkgc3Rkb3V0IGxpbmUsIGFuZCBhIGNvbnN1bWVyCiAgLy8gc3RpbGwgc2hpcHBlZCBhIFBSIG92ZXIgZm91ciB1bnRvdWNoZWQgdGFza3Mg4oCUIGEgcmVtaW5kZXIgdGhhdCBzdXJ2aXZlZCB0ZW4KICAvLyBjb25zZWN1dGl2ZSBpZ25vcmVzIGluIG9uZSBzZXNzaW9uIGlzIG5vdCBhIGNvbnRyb2wuIEJsb2NraW5nIGlzIHRoZSBkZWZhdWx0CiAgLy8gYmVjYXVzZSB0aGUgaG9uZXN0ICJ0aGVzZSBzdGF5IG9wZW4gb24gcHVycG9zZSIgb3V0Y29tZSBpcyBvbmUgY29tbWFuZCBhd2F5CiAgLy8gKHJlY29yZC10YXNrcy1hY2tub3dsZWRnZWQpLCBzbyBub3RoaW5nIGhlcmUgY2FuIGRlYWRsb2NrIGEgcnVuLgogIHZhciBkZWZhdWx0cyA9IHsgbWVtb3J5X2ZpcnN0OiB0cnVlLCB0YXNrX2NyZWF0ZV9maXJzdDogdHJ1ZSwgY29udGV4dF90cmFja2luZzogdHJ1ZSwgdGVzdGluZ19nYXRlOiB0cnVlLCBzaW1wbGlmeV9nYXRlOiB0cnVlLCBsZWFybmluZ3NfZ2F0ZTogdHJ1ZSwgc3dhcm1faW52b2NhdGlvbl9nYXRlOiB0cnVlLCB2ZXJpZnlfYmVmb3JlX2RvbmU6IHRydWUsIHNkZF9nYXRlOiB0cnVlLCB0YXNrX3N0YXR1c19nYXRlOiAnYmxvY2snIH07CiAgdmFyIGNvbnRlbnQgPSBNT0ZMT19ZQU1MOwogIGlmIChjb250ZW50KSB7CiAgICAvLyBCb29sZWFuIGZvcm1zIGFyZSBhY2NlcHRlZCBzbyB0aGlzIGtleSByZWFkcyBsaWtlIGV2ZXJ5IG90aGVyIGdhdGUgaW4gdGhlCiAgICAvLyBibG9jazogYGZhbHNlYCBpcyB0aGUgc2FtZSBvcHQtb3V0IGB0ZXN0aW5nX2dhdGU6IGZhbHNlYCBpcywgYHRydWVgIG1lYW5zCiAgICAvLyBlbmZvcmNlLiBBbnl0aGluZyB1bnJlY29nbmlzZWQgZmFsbHMgdGhyb3VnaCB0byB0aGUgZGVmYXVsdCByYXRoZXIgdGhhbgogICAgLy8gc2lsZW50bHkgZGlzYWJsaW5nIHRoZSBnYXRlIOKAlCBhIHR5cG8gbXVzdCBub3QgYmUgYSBzdGVhbHRoIG9wdC1vdXQuCiAgICB2YXIgdHNnID0gL3Rhc2tfc3RhdHVzX2dhdGU6XHMqWyciXT8oYmxvY2t8d2FybnxvZmZ8ZmFsc2V8dHJ1ZSlbJyJdPy9pLmV4ZWMoY29udGVudCk7CiAgICBpZiAodHNnKSB7CiAgICAgIHZhciBtb2RlID0gdHNnWzFdLnRvTG93ZXJDYXNlKCk7CiAgICAgIGRlZmF1bHRzLnRhc2tfc3RhdHVzX2dhdGUgPSBtb2RlID09PSAnZmFsc2UnID8gJ29mZicgOiBtb2RlID09PSAndHJ1ZScgPyAnYmxvY2snIDogbW9kZTsKICAgIH0KICAgIGlmICgvbWVtb3J5X2ZpcnN0OlxzKmZhbHNlL2kudGVzdChjb250ZW50KSkgZGVmYXVsdHMubWVtb3J5X2ZpcnN0ID0gZmFsc2U7CiAgICBpZiAoL3Rhc2tfY3JlYXRlX2ZpcnN0OlxzKmZhbHNlL2kudGVzdChjb250ZW50KSkgZGVmYXVsdHMudGFza19jcmVhdGVfZmlyc3QgPSBmYWxzZTsKICAgIGlmICgvY29udGV4dF90cmFja2luZzpccypmYWxzZS9pLnRlc3QoY29udGVudCkpIGRlZmF1bHRzLmNvbnRleHRfdHJhY2tpbmcgPSBmYWxzZTsKICAgIGlmICgvdGVzdGluZ19nYXRlOlxzKmZhbHNlL2kudGVzdChjb250ZW50KSkgZGVmYXVsdHMudGVzdGluZ19nYXRlID0gZmFsc2U7CiAgICBpZiAoL3NpbXBsaWZ5X2dhdGU6XHMqZmFsc2UvaS50ZXN0KGNvbnRlbnQpKSBkZWZhdWx0cy5zaW1wbGlmeV9nYXRlID0gZmFsc2U7CiAgICBpZiAoL2xlYXJuaW5nc19nYXRlOlxzKmZhbHNlL2kudGVzdChjb250ZW50KSkgZGVmYXVsdHMubGVhcm5pbmdzX2dhdGUgPSBmYWxzZTsKICAgIGlmICgvc3dhcm1faW52b2NhdGlvbl9nYXRlOlxzKmZhbHNlL2kudGVzdChjb250ZW50KSkgZGVmYXVsdHMuc3dhcm1faW52b2NhdGlvbl9nYXRlID0gZmFsc2U7CiAgICAvLyBPcHQtb3V0OiBvbiBieSBkZWZhdWx0OyBkaXNhYmxlIG9ubHkgd2hlbiBleHBsaWNpdGx5IHNldCBmYWxzZS4KICAgIGlmICgvdmVyaWZ5X2JlZm9yZV9kb25lOlxzKmZhbHNlL2kudGVzdChjb250ZW50KSkgZGVmYXVsdHMudmVyaWZ5X2JlZm9yZV9kb25lID0gZmFsc2U7CiAgICAvLyBzZGRfZ2F0ZSBpcyB0aGUgY2hlY2stYmVmb3JlLWltcGxlbWVudCBiYWNrc3RvcCAoIzEyOTcpLiBPcHQtb3V0OyB0aGUKICAgIC8vIGdhdGUgb25seSBmaXJlcyB3aGVuIGEgcnVuIGlzIGFjdHVhbGx5IGFybWVkIGZvciBTREQgKHNkZE1vZGUpLCBzbwogICAgLy8gbGVhdmluZyBpdCBvbiBjb3N0cyBub24tU0REIHdvcmsgbm90aGluZy4KICAgIGlmICgvc2RkX2dhdGU6XHMqZmFsc2UvaS50ZXN0KGNvbnRlbnQpKSBkZWZhdWx0cy5zZGRfZ2F0ZSA9IGZhbHNlOwogIH0KICByZXR1cm4gZGVmYXVsdHM7Cn0KCi8vIFBhcnNlIHRoZSB0b3AtbGV2ZWwgYHNkZDpgIGJsb2NrIGZyb20gbW9mbG8ueWFtbCAoIzEyOTcpLiBTY29wZWQgdG8gdGhlIGJsb2NrCi8vIGJvZHkgc28gd2UgbmV2ZXIgbWF0Y2ggYSBgZGVmYXVsdDpgIGtleSBmcm9tIGFub3RoZXIgc2VjdGlvbiAoZXBpYywgbWVyZ2UpLgovLyBDcm9zcy1wbGF0Zm9ybTogdG9sZXJhdGVzIENSTEY7IG5vIHBhdGggc2VwYXJhdG9ycyBoYXJkY29kZWQuCmZ1bmN0aW9uIGxvYWRTZGRDb25maWcoKSB7CiAgdmFyIG91dCA9IHsgZGVmYXVsdDogZmFsc2UsIHNwZWNzRGlyOiAnLm1vZmxvL3NwZWNzJyB9OwogIHZhciBjb250ZW50ID0gTU9GTE9fWUFNTDsKICBpZiAoIWNvbnRlbnQpIHJldHVybiBvdXQ7CiAgdmFyIGJsb2NrID0gY29udGVudC5tYXRjaCgvXnNkZDpbIFx0XSpccj9cbigoPzpbIFx0XSsuKig/OlxyP1xufCQpKSopL20pOwogIGlmICghYmxvY2spIHJldHVybiBvdXQ7CiAgdmFyIGJvZHkgPSBibG9ja1sxXTsKICBpZiAoL15ccypkZWZhdWx0OlxzKnRydWVcYi9pbS50ZXN0KGJvZHkpKSBvdXQuZGVmYXVsdCA9IHRydWU7CiAgdmFyIHNkID0gYm9keS5tYXRjaCgvXlxzKnNwZWNzX2RpcjpccyooLis/KVxzKiQvaW0pOwogIGlmIChzZCkgewogICAgdmFyIHYgPSBzZFsxXS5yZXBsYWNlKC9ccysjLiokLywgJycpLnJlcGxhY2UoL15bIiddfFsiJ10kL2csICcnKS50cmltKCk7CiAgICBpZiAodikgb3V0LnNwZWNzRGlyID0gdjsKICB9CiAgcmV0dXJuIG91dDsKfQoKLy8gUGFyc2UgdGhlIHRvcC1sZXZlbCBgbWVyZ2U6YCBibG9jayBmcm9tIG1vZmxvLnlhbWwgKCMxMjg1KS4gQmxvY2stc2NvcGVkIGZvcgovLyB0aGUgc2FtZSByZWFzb24gYXMgbG9hZFNkZENvbmZpZzogYSBiYXJlIGBhdXRvOmAga2V5IGNhbiBhcHBlYXIgdW5kZXIgb3RoZXIKLy8gc2VjdGlvbnMuIENyb3NzLXBsYXRmb3JtOiB0b2xlcmF0ZXMgQ1JMRi4KZnVuY3Rpb24gbG9hZE1lcmdlQ29uZmlnKCkgewogIHZhciBvdXQgPSB7IGF1dG86IGZhbHNlIH07CiAgdmFyIGNvbnRlbnQgPSBNT0ZMT19ZQU1MOwogIGlmICghY29udGVudCkgcmV0dXJuIG91dDsKICB2YXIgYmxvY2sgPSBjb250ZW50Lm1hdGNoKC9ebWVyZ2U6WyBcdF0qXHI/XG4oKD86WyBcdF0rLiooPzpccj9cbnwkKSkqKS9tKTsKICBpZiAoIWJsb2NrKSByZXR1cm4gb3V0OwogIGlmICgvXlxzKmF1dG86XHMqdHJ1ZVxiL2ltLnRlc3QoYmxvY2tbMV0pKSBvdXQuYXV0byA9IHRydWU7CiAgcmV0dXJuIG91dDsKfQoKLy8gUmVhZCBtb2Zsby55YW1sIGV4YWN0bHkgb25jZSBwZXIgZ2F0ZSBwcm9jZXNzICgjMTI5NyByZXZpZXcpOiBsb2FkR2F0ZUNvbmZpZwovLyBhbmQgbG9hZFNkZENvbmZpZyBib3RoIHBhcnNlIGl0LCBhbmQgdGhlIGdhdGUgZmlyZXMgb24gZXZlcnkgV3JpdGUvRWRpdCDigJQgYQovLyBzZWNvbmQgcmVhZCBpcyB3YXN0ZWQgc3lzY2FsbHMuIFNpbmdsZSByZWFkRmlsZVN5bmMgaW4gdHJ5L2NhdGNoIChubyBleGlzdHNTeW5jCi8vIGRvdWJsZS1zdGF0KTsgRU5PRU5UL3VucmVhZGFibGUg4oaSICcnIOKGkiBldmVyeSBwYXJzZXIgZmFsbHMgYmFjayB0byBkZWZhdWx0cy4KZnVuY3Rpb24gcmVhZE1vZmxvWWFtbCgpIHsKICB0cnkgeyByZXR1cm4gZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbihQUk9KRUNUX0RJUiwgJ21vZmxvLnlhbWwnKSwgJ3V0Zi04Jyk7IH0KICBjYXRjaCAoZSkgeyByZXR1cm4gJyc7IH0KfQp2YXIgTU9GTE9fWUFNTCA9IHJlYWRNb2Zsb1lhbWwoKTsKCi8vICMxMzk0IOKAlCBpcyB0aGUgaG9vayB0aGF0IHRyYW5zY3JpYmVzIC92ZXJpZnkncyB2ZXJkaWN0IGludG8gd29ya2Zsb3ctc3RhdGUuanNvbgovLyBhY3R1YWxseSB3aXJlZD8gRGlzdGluZ3Vpc2hlcyAidGhlIGFnZW50IHNraXBwZWQgU3RlcCA1IiBmcm9tICJub3RoaW5nIGV4aXN0cwovLyB0byByZWNvcmQgdGhlIHZlcmRpY3QiLCB3aGljaCBuZWVkIG9wcG9zaXRlIHJlbWVkaWVzOiB0aGUgZmlyc3QgaXMgZml4ZWQgYnkKLy8gcmUtcnVubmluZyAvdmVyaWZ5LCB0aGUgc2Vjb25kIGNhbm5vdCBiZS4KLy8KLy8gRGVsaWJlcmF0ZWx5IE5PVCBob2lzdGVkIHRvIG1vZHVsZSBzY29wZSBsaWtlIE1PRkxPX1lBTUw6IHRoaXMgaXMgb25seSBldmVyCi8vIGNvbnN1bHRlZCBvbiBhbiBhbHJlYWR5LWJsb2NrZWQgY2hlY2stYmVmb3JlLWRvbmUgcGF0aCwgc28gcmVhZGluZyBpdCBlYWdlcmx5Ci8vIHdvdWxkIGFkZCBhIHN5c2NhbGwgdG8gZXZlcnkgV3JpdGUvRWRpdCB0byBhbnN3ZXIgYSBxdWVzdGlvbiBhbG1vc3Qgbm8gZ2F0ZQovLyBpbnZvY2F0aW9uIGFza3MuIFN1YnN0cmluZyBtYXRjaCAobm90IGEgSlNPTiB3YWxrKSBzbyBpdCBob2xkcyByZWdhcmRsZXNzIG9mCi8vIHdoaWNoIG1hdGNoZXIgYmxvY2sgYSBjb25zdW1lcidzIGhvb2sgbGl2ZXMgaW4sIG9yIGhvdyB0aGV5IGhhbmQtZWRpdGVkIGl0LgovLyBVbnJlYWRhYmxlL21hbGZvcm1lZCBzZXR0aW5ncyDihpIgdHJ1ZSwgc28gYSBwYXJzZSBmYWlsdXJlIGZhbGxzIGJhY2sgdG8gdGhlCi8vIHByZS1leGlzdGluZyBnZW5lcmljIG1lc3NhZ2UgcmF0aGVyIHRoYW4gYXNzZXJ0aW5nIGEgd2lyaW5nIGJ1ZyB0aGF0IG1heSBub3QKLy8gZXhpc3QuCmZ1bmN0aW9uIGlzVmVyaWZ5T3V0Y29tZUhvb2tXaXJlZCgpIHsKICB0cnkgewogICAgcmV0dXJuIGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4oUFJPSkVDVF9ESVIsICcuY2xhdWRlJywgJ3NldHRpbmdzLmpzb24nKSwgJ3V0Zi04JykKICAgICAgLmluZGV4T2YoJ3JlY29yZC12ZXJpZnktb3V0Y29tZScpID49IDA7CiAgfSBjYXRjaCAoZSkgeyByZXR1cm4gdHJ1ZTsgfQp9Cgp2YXIgY29uZmlnID0gbG9hZEdhdGVDb25maWcoKTsKdmFyIHNkZENvbmYgPSBsb2FkU2RkQ29uZmlnKCk7CnZhciBtZXJnZUNvbmYgPSBsb2FkTWVyZ2VDb25maWcoKTsKdmFyIGNvbW1hbmQgPSBwcm9jZXNzLmFyZ3ZbMl07Cgp2YXIgRVhFTVBUID0gWycuY2xhdWRlLycsICcuY2xhdWRlXFwnLCAnQ0xBVURFLm1kJywgJ01FTU9SWS5tZCcsICd3b3JrZmxvdy1zdGF0ZScsICdub2RlX21vZHVsZXMnLCAnbW9mbG8ueWFtbCddOwoKLy8gQXBwZW5kZWQgdG8gZXZlcnkgbWVtb3J5LWZpcnN0IGRlbmlhbC4gV2l0aG91dCBpdCwgYSBjb250ZXh0IGF1ZGl0IG9mIENsYXVkZQovLyBDb2RlJ3MgZGVuaWFsIHRlbGVtZXRyeSByZWFkcyBtb2ZsbydzIGdhdGUgZW5mb3JjZW1lbnRzIGFzIHBlcm1pc3Npb24tc2V0dXAKLy8gZmFpbHVyZXMgYW5kICJmaXhlcyIgdGhlbSB3aXRoIGFsbG93IHJ1bGVzIOKAlCB3aGljaCBjYW5ub3Qgb3ZlcnJpZGUgYSBob29rCi8vIGJsb2NrIGF0IGFsbCAoIzEzMDcgZmluZGluZyA1KS4gTmFtaW5nIHRoZSBnYXRlIG1ha2VzIHRoZSBjYXVzZSBzZWxmLWV2aWRlbnQuCnZhciBHQVRFX09SSUdJTl9OT1RFID0gJ1RoaXMgaXMgYSBtb2ZsbyBob29rLCBub3QgYSBDbGF1ZGUgQ29kZSBwZXJtaXNzaW9uIHJ1bGUg4oCUIGFsbG93LXJ1bGVzIGNhbm5vdCBvdmVycmlkZSBpdC4nOwoKLy8gIzEzNDgg4oCUIHRoZSBwcmUtUFIgZ2F0ZXMgYXJlIG9yZGVyLWRlcGVuZGVudCBhbmQgZWFjaCBibG9jayBtZXNzYWdlIG5hbWVkIG9ubHkKLy8gaXRzIG93biBtaXNzaW5nIGdhdGUsIHNvIGEgY2FsbGVyIGNvdWxkIHNhdGlzZnkgdGhlbSBvbmUgYXQgYSB0aW1lIGZvcmV2ZXI6Ci8vIC9mbG8tc2ltcGxpZnkgbWF5IGVkaXQgY29kZSAod2hpY2ggcmVzZXRzIHRlc3RzIGFuZCB2ZXJpZnkpLCBhbmQgL3ZlcmlmeSBtdXN0Ci8vIG5vdCwgc28gc2ltcGxpZnkgc3RyaWN0bHkgcHJlY2VkZXMgdmVyaWZ5LiBCb3RoIGJsb2NraW5nIGdhdGVzIHByaW50IHRoaXMuCi8vIC92ZXJpZnkncyBTdGVwIDUgbWVtb3J5X3N0b3JlIGNhcnJpZXMgdGhlIHZlcmRpY3QgQU5EIHN0YW1wcyBsZWFybmluZ3MsIHdoaWNoCi8vIGlzIHdoeSBsZWFybmluZ3MgaGFzIG5vIHNlcGFyYXRlIHN0ZXAgaGVyZS4KdmFyIE9SREVSX0hJTlQgPSAnT3JkZXIgdGhhdCBzYXRpc2ZpZXMgYWxsIG9mIHRoZW06IHRlc3RzIGdyZWVuIC0+IC9mbG8tc2ltcGxpZnkgKHJlLXJ1biB0ZXN0cyBpZiBpdCBlZGl0cykgLT4gL3ZlcmlmeSAtPiBpdHMgbWVtb3J5X3N0b3JlIHZlcmRpY3QgLT4gZ2ggcHIgY3JlYXRlXG4nOwovLyAjMTQzNCDigJQgdGhlIG9sZCB0ZXh0ICgnbGVhcm5pbmdzIGhhdmUgbm90IGJlZW4gc3RvcmVkIChjYWxsIG1lbW9yeV9zdG9yZSknKQovLyBuYW1lZCB0aGUgbWVjaGFuaXNtIGJ1dCBubyBxdWFsaXR5IGJhciwgc28gdGhlIGNoZWFwZXN0IHdheSBwYXN0IGl0IHdhcyBhCi8vIHN1bW1hcnkgb2YgdGhlIHJ1biDigJQgYXVkaXQgZXhoYXVzdCB0aGF0IGRpc3BsYWNlcyByZXVzYWJsZSBsZXNzb25zIGZyb20gZXZlcnkKLy8gZnV0dXJlIGJvdW5kZWQgc2VhcmNoLiBOYW1lIHRoZSBiYXIgQU5EIHRoZSBuby13cml0ZSBwYXRoIGhlcmU6IGFuIGVzY2FwZQovLyBoYXRjaCBub2JvZHkgY2FuIGZpbmQgaXMgbm90IGFuIGVzY2FwZSBoYXRjaCAoc2VlICMxMzMyJ3MgZ2F0ZSBkZWFkbG9jaykuCi8vCi8vIFRoZSBlc2NhcGUgY29tbWFuZCBpcyBidWlsdCBmcm9tIF9fZmlsZW5hbWUsIG5vdCB3cml0dGVuIGFzIGEgcmVsYXRpdmUgcGF0aC4KLy8gVGhlIGNhbGxlciBpcyB0aGUgbW9kZWwgdHlwaW5nIGludG8gYSBCYXNoIHRvb2wsIE5PVCBhIGhvb2s6ICRDTEFVREVfUFJPSkVDVF9ESVIKLy8gaXMgdW5zZXQgdGhlcmUgKHNvIHRoZSBzZXR0aW5ncy5qc29uIGZvcm0gd291bGQgZXhwYW5kIHRvICIvLmNsYXVkZS8uLi4iKSwgYW5kIGEKLy8gYmFyZSBgLmNsYXVkZS9oZWxwZXJzL2dhdGUuY2pzYCBicmVha3MgZnJvbSBhbnkgY3dkIGJ1dCB0aGUgcHJvamVjdCByb290LiBUaGUKLy8gcnVubmluZyBzY3JpcHQncyBvd24gYWJzb2x1dGUgcGF0aCBpcyBjb3JyZWN0IG9uIGV2ZXJ5IE9TIGFuZCBmcm9tIGFueSBjd2Q7Ci8vIGRvdWJsZSBxdW90ZXMgY2FycnkgV2luZG93cyBzZXBhcmF0b3JzIGFuZCBzcGFjZXMgdGhyb3VnaCB0aGUgc2hlbGwuCnZhciBMRUFSTklOR1NfTUlTU0lORyA9CiAgJ25vIGR1cmFibGUgbGVzc29uIHJlY29yZGVkLiBBIGxlc3NvbiBxdWFsaWZpZXMgb25seSBpZiBpdCB3b3VsZCBoZWxwIGEgZnV0dXJlIHNlc3Npb24gJyArCiAgJ3dvcmtpbmcgb24gYSBESUZGRVJFTlQgdGFzayDigJQgYSByZXVzYWJsZSBwYXR0ZXJuLCBhIHRyYXAsIGEgZGVjaXNpb24gKyByYXRpb25hbGUuICcgKwogICdTdG9yZSBvbmUgd2l0aCBtY3BfX21vZmxvX19tZW1vcnlfc3RvcmUgKG5hbWVzcGFjZSAibGVhcm5pbmdzIjsgdXNlICJwYXR0ZXJucyIgZm9yIGEgJyArCiAgJ3JldXNhYmxlIGNvZGUgc2hhcGUpLiBXaGF0IFRISVMgcnVuIGNoYW5nZWQgaXMgZ2l0IGhpc3Rvcnkg4oCUIGl0IGJlbG9uZ3MgaW4gdGhlIFBSIGJvZHksICcgKwogICdub3QgaW4gbWVtb3J5LiBJZiB0aGlzIHJ1biB0YXVnaHQgbm90aGluZyBuZXcsIHNheSBzbyBpbnN0ZWFkIG9mIGludmVudGluZyBvbmU6ICcgKwogICdub2RlICInICsgX19maWxlbmFtZSArICciIHJlY29yZC1uby1kdXJhYmxlLWxlc3Nvbic7CnZhciBHQVRFX0RJU0FCTEVfTk9URSA9ICdEaXNhYmxlIHBlci1nYXRlIHZpYSBtb2Zsby55YW1sOiBnYXRlczogbWVtb3J5X2ZpcnN0OiBmYWxzZSc7Ci8vICMxMzM4IOKAlCBDbGF1ZGUgQ29kZSBzcGF3bnMgc3RkaW8gTUNQIHNlcnZlcnMgb25jZSBhdCBzZXNzaW9uIHN0YXJ0IGFuZCBuZXZlcgovLyByZXNwYXducyB0aGVtLCBzbyBhIHNlc3Npb24gY2FuIG91dGxpdmUgaXRzIG1vZmxvIE1DUCBjb25uZWN0aW9uLiBOYW1pbmcgb25seQovLyBtY3BfX21vZmxvX19tZW1vcnlfc2VhcmNoIHRoZXJlIHBvaW50cyB0aGUgcmVhZGVyIGF0IHRoZSBvbmUgdGhpbmcgdGhhdCBjYW5ub3QKLy8gd29yazsgdGhpcyBDTEkgcGF0aCBjcmVkaXRzIHRoZSBnYXRlIGlkZW50aWNhbGx5IGFuZCBuZWVkcyBubyBNQ1AuCnZhciBNQ1BfRkFMTEJBQ0tfTk9URSA9ICdJZiBtY3BfX21vZmxvX18qIHRvb2xzIGFyZSB1bmF2YWlsYWJsZSB0aGlzIHNlc3Npb24gKE1DUCBzZXJ2ZXIgbm90IGNvbm5lY3RlZCksIHRoaXMgY3JlZGl0cyB0aGUgZ2F0ZSB0b286IG5weCBmbG8gbWVtb3J5IHNlYXJjaCAtLXF1ZXJ5ICI8dG9waWM+IiAtLW5hbWVzcGFjZSA8bnM+JzsKLy8gIzEzMzggZm9sbG93LXVwIOKAlCB0aGUgc3dhcm0vaGl2ZSBnYXRlJ3MgZXF1aXZhbGVudC4gVGhlIENMSSBydW5zIHRoZSBzYW1lCi8vIGluLXByb2Nlc3MgaGFuZGxlciBhbmQgcGVyc2lzdHMgdGhlIHN3YXJtLCBzbyBpdCBzYXRpc2ZpZXMgdGhpcyBnYXRlIGZvcgovLyByZWFsOyBpdCBpcyByZWNvcmRlZCBvbmx5IG9uIHN1Y2Nlc3MgKFBvc3RUb29sVXNlLCAjMTMyMikuCnZhciBDT09SRF9GQUxMQkFDS19OT1RFID0gJ0lmIG1jcF9fbW9mbG9fXyogdG9vbHMgYXJlIHVuYXZhaWxhYmxlIHRoaXMgc2Vzc2lvbiAoTUNQIHNlcnZlciBub3QgY29ubmVjdGVkKSwgdGhpcyBzYXRpc2ZpZXMgdGhlIGdhdGUgdG9vOic7CgovLyAjMTI5NCBGaW5kaW5nIDMg4oCUIHJlYWRzL3NjYW5zIG9mIEVQSEVNRVJBTCBmaWxlcyB1bmRlciB0aGUgT1MgdGVtcCBkaXIKLy8gKGJhY2tncm91bmQtdGFzayBvdXRwdXQvdHJhbnNjcmlwdHMsIGFnZW50IHNjcmF0Y2hwYWRzKSBhcmUgdHJhbnNpZW50IHRvb2wKLy8gSS9PIGFuZCBuZXZlciBjYXJyeSBpbmRleGFibGUgcHJvamVjdCBrbm93bGVkZ2UsIHNvIHRoZXkgbXVzdCBub3QgdHJpcCB0aGUKLy8gbWVtb3J5LWZpcnN0IGdhdGUuIENyb3NzLXBsYXRmb3JtIChSdWxlICMxKTogb3MudG1wZGlyKCkgaXMgY29ycmVjdCBvbiBldmVyeQovLyBPUzsgd2Ugbm9ybWFsaXplIGEgbGVhZGluZyBgL3ByaXZhdGVgIG9uIGJvdGggc2lkZXMgc28gbWFjT1MncwovLyAvdmFyL2ZvbGRlcnMgKG9zLnRtcGRpcikgdnMgL3ByaXZhdGUvdmFyL2ZvbGRlcnMgKHJlYWxwYXRoKSBzeW1saW5rIHBhaXIKLy8gc3RpbGwgbWF0Y2hlcyAoQ0xBVURFLm1kICMxMTQ1KS4gTmV2ZXIgaGFyZGNvZGUgYC90bXBgLgpmdW5jdGlvbiBzdHJpcFByaXZhdGUocCkgeyByZXR1cm4gcC5pbmRleE9mKCcvcHJpdmF0ZS8nKSA9PT0gMCA/IHAuc2xpY2UoJy9wcml2YXRlJy5sZW5ndGgpIDogcDsgfQpmdW5jdGlvbiBpc0VwaGVtZXJhbFBhdGgoZnApIHsKICBpZiAoIWZwKSByZXR1cm4gZmFsc2U7CiAgdmFyIHRtcDsKICB0cnkgeyB0bXAgPSBwYXRoLnJlc29sdmUob3MudG1wZGlyKCkpOyB9IGNhdGNoIChlKSB7IHJldHVybiBmYWxzZTsgfQogIHZhciB0ID0gc3RyaXBQcml2YXRlKHRtcCk7CiAgZnVuY3Rpb24gdW5kZXIocCkgeyB2YXIgbiA9IHN0cmlwUHJpdmF0ZShwKTsgcmV0dXJuIG4gPT09IHQgfHwgbi5pbmRleE9mKHQgKyBwYXRoLnNlcCkgPT09IDA7IH0KICB2YXIgcmVzb2x2ZWQgPSBwYXRoLnJlc29sdmUoZnApOwogIGlmICghdW5kZXIocmVzb2x2ZWQpKSByZXR1cm4gZmFsc2U7CiAgLy8gVW5kZXIgdG1wIGJ5IGxpdGVyYWwgcGF0aCDigJQgY29uZmlybSBpdCBpc24ndCBhIHN5bWxpbmsgc3RhZ2VkIGluIHRtcCB0aGF0CiAgLy8gZGVyZWZlcmVuY2VzIHRvIGEgcmVhbCBwcm9qZWN0IGZpbGUgKHJlYWxwYXRoIEJPVEggc2lkZXMsIENMQVVERS5tZCBSdWxlICMyKS4KICAvLyBPbiBFTk9FTlQgKGEgbm90LXlldC1jcmVhdGVkIHRtcCBmaWxlKSBrZWVwIHRoZSB2ZXJkaWN0IOKAlCBzdGlsbCBlcGhlbWVyYWwuCiAgdHJ5IHsgcmV0dXJuIHVuZGVyKGZzLnJlYWxwYXRoU3luYyhyZXNvbHZlZCkpOyB9IGNhdGNoIChlKSB7IHJldHVybiB0cnVlOyB9Cn0KLy8gIzExNzEg4oCUIERBTkdFUk9VUyBnYWluZWQgUG93ZXJTaGVsbCBhZGRpdGlvbnMgdG8gbWF0Y2ggdGhlIG1hdGNoZXIgd2lkZW5pbmcKLy8gdGhhdCBub3cgcm91dGVzIHRoZSBkZWRpY2F0ZWQgYFBvd2VyU2hlbGxgIHRvb2wgdGhyb3VnaCBjaGVjay1kYW5nZXJvdXMtY29tbWFuZC4KLy8gUE9TSVggZW50cmllcyBzdGlsbCBhcHBseSBiZWNhdXNlIFBTIHdpbGwgZXhlY3V0ZSB0aGVtIHdoZW4gaW52b2tlZC4gTWF0Y2hlZAovLyBjYXNlLWluc2Vuc2l0aXZlbHkgYnkgYG1hdGNoZXNEYW5nZXJvdXNgIGJlbG93IOKAlCBzdWJzdHJpbmcgZm9yIG1vc3QgZW50cmllcywKLy8gcm9vdC1hbmNob3JlZCBmb3IgdGhlIG9uZXMgdGhhdCBlbmQgYXQgYSBmaWxlc3lzdGVtIHJvb3QuCnZhciBEQU5HRVJPVVMgPSBbCiAgJ3JtIC1yZiAvJywgJ3JtIC1yZiB+JywgJ2Zvcm1hdCBjOicsICdkZWwgL3MgL3EgYzpcXCcsICc6KCl7Onw6Jn07OicsICdta2ZzLicsICc+IC9kZXYvc2RhJywKICAvLyBQb3dlclNoZWxsIGRlc3RydWN0aXZlIHBhdHRlcm5zLiBXb24ndCBjYXRjaCBldmVyeSBhZHZlcnNhcmlhbCBzcGVsbGluZwogIC8vIChQUyBhbGlhc2VzIGxldCBgcmkgLXIgLWZvcmNlIEM6XGAgbWVhbiB0aGUgc2FtZSB0aGluZykgYnV0IGNvdmVycyB0aGUKICAvLyBjb21tb24tdHlwbyBkZXN0cnVjdGlvbiBjbGFzcyDigJQgc3ltbWV0cmljIHRvIHRoZSBQT1NJWCBsaXN0J3MgaW50ZW50LgogICdyZW1vdmUtaXRlbSAtcmVjdXJzZSAtZm9yY2UgYzpcXCcsCiAgJ3JlbW92ZS1pdGVtIC1yZWN1cnNlIC1mb3JjZSAvJywKICAncmVtb3ZlLWl0ZW0gLXJlY3Vyc2UgLWZvcmNlIH4nLAogICdmb3JtYXQtdm9sdW1lJywKICAnY2xlYXItZGlzaycsCl07CgovLyAjMTQ0OSDigJQgdGhlIGVudHJpZXMgYWJvdmUgdGhhdCBFTkQgYXQgYSBmaWxlc3lzdGVtIHJvb3QgYXJlIGFsc28gYSBQUkVGSVggb2YKLy8gZXZlcnkgYWJzb2x1dGUgcGF0aCBiZW5lYXRoIGl0LCBzbyBwbGFpbiBzdWJzdHJpbmcgbWF0Y2hpbmcgYmxvY2tlZCByb3V0aW5lCi8vIGNsZWFudXA6IGBybSAtcmYgL3RtcC9zY3JhdGNoYCByZXBvcnRlZCBhcyBgcm0gLXJmIC9gLiBUaG9zZSBlbnRyaWVzIG11c3QKLy8gbWF0Y2ggT04gdGhlIHJvb3QgcmF0aGVyIHRoYW4gYXQgdGhlIGhlYWQgb2YgYSBsb25nZXIgcGF0aC4KLy8KLy8gV0hJQ0ggZW50cmllcyB0aG9zZSBhcmUgaXMgZGVyaXZlZCwgbm90IGxpc3RlZDogYSBwYXR0ZXJuIGlzIHJvb3Qtc2hhcGVkIGlmZgovLyBpdCBlbmRzIGF0IGEgcm9vdCDigJQgYSBzZXBhcmF0b3Igb3IgYH5gLiBUaGF0IHNlbGVjdHMgYHJtIC1yZiAvYCwgYHJtIC1yZiB+YCwKLy8gYGRlbCAvcyAvcSBjOlxgIGFuZCB0aGUgdGhyZWUgYHJlbW92ZS1pdGVtYCBmb3JtcywgYW5kIGxlYXZlcyBgZm9ybWF0IGM6YCwKLy8gYG1rZnMuYCwgYD4gL2Rldi9zZGFgLCBgZm9ybWF0LXZvbHVtZWAgYW5kIGBjbGVhci1kaXNrYCBvbiBwbGFpbiBzdWJzdHJpbmcKLy8gbWF0Y2hpbmcsIHdoZXJlIHRyYWlsaW5nIHRleHQgaXMgc3RpbGwgdGhlIHNhbWUgZGFuZ2Vyb3VzIGNvbW1hbmQuIERlcml2aW5nCi8vIGl0IHJhdGhlciB0aGFuIGtlZXBpbmcgYSBwYXJhbGxlbCBsaXN0IG1lYW5zIGEgZnV0dXJlIHJvb3Qtc2hhcGVkIGFkZGl0aW9uIHRvCi8vIERBTkdFUk9VUyBpcyBhbmNob3JlZCBhdXRvbWF0aWNhbGx5IGluc3RlYWQgb2Ygc2lsZW50bHkgZmFsbGluZyBiYWNrIHRvIHRoZQovLyBwcmVmaXggYnVnIHRoaXMgZml4ZXMuCi8vCi8vIGBybSAtcmYgfmAgam9pbnMgREFOR0VST1VTIHdpdGggdGhpcyBjaGFuZ2U6IGl0IHdhcyBuZXZlciBsaXN0ZWQsIHNvIHdpcGluZyBhCi8vIGhvbWUgZGlyZWN0b3J5IHdhcyBhbGxvd2VkIG91dHJpZ2h0IHdoaWxlIGNsZWFuaW5nIGEgc3ViZGlyZWN0b3J5IG9mIG9uZSB3YXMKLy8gYmxvY2tlZC4gQW5jaG9yaW5nIGlzIHdoYXQgbWFrZXMgdGhlIGVudHJ5IHNhZmUgdG8gYWRkLgpmdW5jdGlvbiBlbmRzQXRSb290KHBhdCkgewogIHZhciBsYXN0ID0gcGF0LmNoYXJBdChwYXQubGVuZ3RoIC0gMSk7CiAgcmV0dXJuIGxhc3QgPT09ICcvJyB8fCBsYXN0ID09PSAnXFwnIHx8IGxhc3QgPT09ICd+JzsKfQovLyBXaGF0IG1heSBsZWdhbGx5IGZvbGxvdyBhIHJvb3QgdGFyZ2V0OiBub3RoaW5nLCB3aGl0ZXNwYWNlLCBhIGdsb2IgKGBybSAtcmYgLypgCi8vIHN0aWxsIGJsb2NrcyksIGEgc2hlbGwgb3BlcmF0b3IsIG9yIGEgY2xvc2luZyBxdW90ZS9wYXJlbi4gQSBwYXRoIGNoYXJhY3RlciDigJQKLy8gbGV0dGVyLCBkaWdpdCwgYC1gLCBgX2Ag4oCUIG1lYW5zIGFub3RoZXIgc2VnbWVudCBmb2xsb3dzLCBpLmUuIHJvdXRpbmUgY2xlYW51cAovLyBvZiBzb21ldGhpbmcgYmVsb3cgcm9vdC4gUnVsZSAjMTogcHVyZSBzdHJpbmcgbG9naWMsIG5vIHBsYXRmb3JtIGJyYW5jaDsgYm90aAovLyBzZXBhcmF0b3JzIGFyZSBoYW5kbGVkIGZvciBldmVyeSBPUydzIHNwZWxsaW5nLgp2YXIgUk9PVF9CT1VOREFSWV9SRSA9IC9bXHM7JnwpIidgKjw+XS87CmZ1bmN0aW9uIGlzUm9vdEJvdW5kYXJ5KGNtZCwgaSkgewogIGlmIChpID49IGNtZC5sZW5ndGgpIHJldHVybiB0cnVlOwogIHZhciBjID0gY21kLmNoYXJBdChpKTsKICByZXR1cm4gYyA9PT0gJy8nIHx8IGMgPT09ICdcXCcgfHwgUk9PVF9CT1VOREFSWV9SRS50ZXN0KGMpOwp9CgovKioKICogQWR2YW5jZSBwYXN0IHRleHQgdGhhdCBkb2VzIG5vdCBtb3ZlIE9GRiB0aGUgcm9vdDogcmVwZWF0ZWQgc2VwYXJhdG9ycywgYW5kCiAqIGAuYCAvIGAuLmAgc2VnbWVudHMsIHdoaWNoIHJlc29sdmUgYmFjayB0byB3aGVyZSB0aGV5IHN0YXJ0ZWQuIGBybSAtcmYgLy9gLAogKiBgcm0gLXJmIC8uYCBhbmQgYHJtIC1yZiAvLi5gIGFsbCBzdGlsbCBtZWFuIGBybSAtcmYgL2AgYW5kIG11c3QgYmxvY2ssIHdoaWxlCiAqIGBybSAtcmYgLy90bXAveGAgYW5kIGBybSAtcmYgLy5jb25maWdgIGFyZSByZWFsIHBhdGhzIGJlbG93IHJvb3QgYW5kIG11c3Qgbm90LgogKiBXaXRob3V0IHRoZSBkb3QgaGFuZGxpbmcgdGhlIGFuY2hvcmluZyB3b3VsZCBPUEVOIGEgaG9sZSB0aGUgc3Vic3RyaW5nIG1hdGNoCiAqIGRpZCBub3QgaGF2ZSDigJQgYC5gIGlzIG5vdCBhIGJvdW5kYXJ5IGNoYXJhY3Rlciwgc28gYHJtIC1yZiAvLmAgd291bGQgcmVhZCBhcwogKiAiYSBsb25nZXIgcGF0aCBmb2xsb3dzIiBhbmQgcGFzcy4KICovCmZ1bmN0aW9uIHNraXBUb1Jvb3RFbmQoY21kLCBpKSB7CiAgZm9yICg7OykgewogICAgdmFyIHN0YXJ0ID0gaTsKICAgIHdoaWxlIChpIDwgY21kLmxlbmd0aCAmJiAoY21kLmNoYXJBdChpKSA9PT0gJy8nIHx8IGNtZC5jaGFyQXQoaSkgPT09ICdcXCcpKSBpKys7CiAgICB2YXIgZG90cyA9IDA7CiAgICB3aGlsZSAoY21kLmNoYXJBdChpICsgZG90cykgPT09ICcuJykgZG90cysrOwogICAgLy8gT25seSBhIEJBUkUgYC5gIG9yIGAuLmAgc2VnbWVudCBpcyBhIG5vLW9wOyBgLmNvbmZpZ2AgYW5kIGAuLmZvb2AgYXJlIG5hbWVzLgogICAgaWYgKChkb3RzID09PSAxIHx8IGRvdHMgPT09IDIpICYmIGlzUm9vdEJvdW5kYXJ5KGNtZCwgaSArIGRvdHMpKSBpICs9IGRvdHM7CiAgICBpZiAoaSA9PT0gc3RhcnQpIHJldHVybiBpOwogIH0KfQoKLyoqCiAqIFRydWUgd2hlbiBgcGF0YCBvY2N1cnMgaW4gYGNtZGAgYXMgYSByZWFsIGRhbmdlcm91cyBjb21tYW5kLiBSb290LXNoYXBlZAogKiBwYXR0ZXJucyBtdXN0IGxhbmQgb24gdGhlIHJvb3Q7IGV2ZXJ5IG9jY3VycmVuY2UgaXMgZXhhbWluZWQsIHNvIGEgc2FmZQogKiBsZWFkaW5nIG1hdGNoIChgcm0gLXJmIC90bXAvYSAmJiBybSAtcmYgL2ApIG5ldmVyIG1hc2tzIGEgbGF0ZXIgcmVhbCBvbmUuCiAqLwpmdW5jdGlvbiBtYXRjaGVzRGFuZ2Vyb3VzKGNtZCwgcGF0KSB7CiAgaWYgKCFlbmRzQXRSb290KHBhdCkpIHJldHVybiBjbWQuaW5kZXhPZihwYXQpID49IDA7CiAgZm9yICh2YXIgYXQgPSBjbWQuaW5kZXhPZihwYXQpOyBhdCA+PSAwOyBhdCA9IGNtZC5pbmRleE9mKHBhdCwgYXQgKyAxKSkgewogICAgdmFyIGVuZCA9IHNraXBUb1Jvb3RFbmQoY21kLCBhdCArIHBhdC5sZW5ndGgpOwogICAgaWYgKGVuZCA+PSBjbWQubGVuZ3RoIHx8IFJPT1RfQk9VTkRBUllfUkUudGVzdChjbWQuY2hhckF0KGVuZCkpKSByZXR1cm4gdHJ1ZTsKICB9CiAgcmV0dXJuIGZhbHNlOwp9CgovLyAjMTEzMiDigJQgQmFzaCBtZW1vcnktZmlyc3QgZ2F0ZS4KLy8KLy8gQ1JFRElUOiBtYXJrcyB0aGUgZ2F0ZSBzYXRpc2ZpZWQgd2hlbiBDbGF1ZGUgaW52b2tlcyBhIG1lbW9yeS1zZWFyY2ggQ0xJCi8vIChgZmxvIG1lbW9yeSBzZWFyY2hgLCBgZmxvLXNlYXJjaGAsIGBzZW1hbnRpYy1zZWFyY2gubWpzYCkgZnJvbSB0aGUgc2hlbGwg4oCUCi8vIHRoZSBlc2NhcGUgaGF0Y2ggdGhhdCBrZWVwcyB0aGUgZ2F0ZSBzYXRpc2ZpYWJsZSB3aGVuIHRoZSBtb2ZsbyBNQ1Agc2VydmVyCi8vIGlzIG5vdCBjb25uZWN0ZWQgdG8gdGhlIHNlc3Npb24uCi8vCi8vICMxMzM4IOKAlCB0aGlzIHVzZWQgdG8gYmUgYW4gdW5hbmNob3JlZCBzdWJzdHJpbmcgdGVzdAovLyAoL3NlbWFudGljLXNlYXJjaHxtZW1vcnkgc2VhcmNofG1lbW9yeSByZXRyaWV2ZXxtZW1vcnktc2VhcmNoLykgYWdhaW5zdCB0aGUKLy8gd2hvbGUgY29tbWFuZCwgc28gYGVjaG8gIm1lbW9yeSBzZWFyY2giYCDigJQgb3IgYSBgZ2l0IGNvbW1pdCAtbWAgbWVudGlvbmluZwovLyB0aGUgcGhyYXNlIOKAlCBzYXRpc2ZpZWQgdGhlIGdhdGUgZm9yIHRoZSByZXN0IG9mIHRoZSBwcm9tcHQuIFRoYXQgaXMgdGhlCi8vIG9wcG9zaXRlIGRpc2NpcGxpbmUgZnJvbSBSRUFEX0xJS0VfQkFTSF9SRSBkaXJlY3RseSBiZWxvdywgd2hpY2ggaXMKLy8gZGVsaWJlcmF0ZWx5IGFuY2hvcmVkLiBDcmVkaXQgbm93IHJlcXVpcmVzIGEgcmVhbCBJTlZPQ0FUSU9OLCBtYXRjaGVkIGJ5Ci8vIEJBU0VOQU1FIHNvIFJ1bGUgIzEgaG9sZHM6IGBmbG9gLCBgZmxvLmNtZGAsIGBucHguY21kIGZsb2AsIGBub2RlIC4vYmluL2NsaS5qc2AKLy8gYW5kIGBub2RlIEM6XC4uLlxiaW5cY2xpLmpzYCBhbGwgY3JlZGl0LCB3aXRoIGVpdGhlciBwYXRoIHNlcGFyYXRvci4KdmFyIENSRURJVF9SVU5ORVJfUkUgPSAvXig/Om5weHxucG18cG5wbXx5YXJufGJ1bnxidW54fGRlbm98bm9kZXxub2RlanN8dHN4fHRzLW5vZGUpKD86XC4oPzpjbWR8ZXhlfGJhdHxwczEpKT8kL2k7Ci8vIFN1Yi13b3JkcyBvZiBhIHJ1bm5lciBpbnZvY2F0aW9uIHRoYXQgYXJlIG5vdCB0aGUgZW50cnlwb2ludCBpdHNlbGYKLy8gKGBwbnBtIGRseCBmbG9gLCBgbnBtIGV4ZWMgLS0gZmxvYCwgYG5weCAteSBmbG9gKS4KdmFyIENSRURJVF9SVU5ORVJfU0tJUF9SRSA9IC9eKD86ZGx4fGV4ZWN8cnVufC15fC0teWVzfC1xfC0tcXVpZXR8LS1zaWxlbnR8LS1uby1pbnN0YWxsfC0tKSQvaTsKLy8gVGhlIG1vZmxvIENMSSwgdW5kZXIgZXZlcnkgbmFtZSBwYWNrYWdlLmpzb24gYmluZHMgaXQgdG8gKHBsdXMgdGhlIHJhdyBlbnRyeQovLyBzY3JpcHQsIGZvciBgbm9kZSBub2RlX21vZHVsZXMvbW9mbG8vYmluL2NsaS5qc2ApLgp2YXIgQ1JFRElUX0NMSV9SRSA9IC9eKD86ZmxvfG1vZmxvfGNsYXVkZS1mbG93fGNsaVwuanN8Y2xpXC5tanMpKD86XC4oPzpjbWR8ZXhlfGJhdHxwczEpKT8kL2k7Ci8vIEEgc2VhcmNoIGVudHJ5cG9pbnQg4oCUIGV2ZXJ5IGludm9jYXRpb24gb2YgdGhlc2UgSVMgYSBtZW1vcnkgc2VhcmNoLgp2YXIgQ1JFRElUX1NFQVJDSF9CSU5fUkUgPSAvXig/OmZsby1zZWFyY2goPzpcLig/OmNtZHxleGV8YmF0fHBzMSkpP3xzZW1hbnRpYy1zZWFyY2hcLm1qcykkL2k7Ci8vIFN1YnN0cmluZyBldmVyeSBjcmVkaXRpbmcgZm9ybSBtdXN0IGNvbnRhaW4g4oCUIHRoZSBob3QtcGF0aCBwcmUtZmlsdGVyLiBDb3ZlcnMKLy8gZmxvIC8gbW9mbG8gLyBmbG8tc2VhcmNoIC8gY2xhdWRlLWZsb3cgKGFsbCBjb250YWluICJmbG8iKSwgY2xpLmpzfGNsaS5tanMsCi8vIGFuZCBzZW1hbnRpYy1zZWFyY2gubWpzLgp2YXIgQ1JFRElUX0hJTlRfUkUgPSAvZmxvfGNsaVwubT9qc3xzZW1hbnRpYy1zZWFyY2gvaTsKLy8gYGZsbyBtZW1vcnkgc2VhcmNoYCAvIGBmbG8gbWVtb3J5IHJldHJpZXZlYCwgYW5kIHRoZSBoeXBoZW4vdW5kZXJzY29yZSBzcGVsbGluZ3MuCnZhciBDUkVESVRfTUVNT1JZX1ZFUkJfUkUgPSAvXig/OnNlYXJjaHxyZXRyaWV2ZSkkL2k7CnZhciBDUkVESVRfTUVNT1JZX0NPTVBPVU5EX1JFID0gL15tZW1vcnlbLV9dKD86c2VhcmNofHJldHJpZXZlKSQvaTsKCi8qKgogKiBMYXN0IHBhdGggc2VnbWVudCBvZiBhIHRva2VuLCBsb3dlcmNhc2VkLiBTcGxpdHMgb24gQk9USCBzZXBhcmF0b3JzLCB1bmxpa2UKICogcGF0aC5iYXNlbmFtZSwgd2hpY2ggb25seSBob25vdXJzIHRoZSBIT1NUJ3Mgc2VwYXJhdG9yIChSdWxlICMxKTogYW4gYWdlbnQgb24KICogUE9TSVggY2FuIGxlZ2l0aW1hdGVseSB0eXBlIGBub2RlIC5jbGF1ZGVcc2NyaXB0c1xzZW1hbnRpYy1zZWFyY2gubWpzYCwgYW5kIGEKICogV2luZG93cy1zaGFwZWQgcGF0aCBtdXN0IHJlc29sdmUgdGhlIHNhbWUgd2hlcmV2ZXIgdGhlIGdhdGUgaGFwcGVucyB0byBydW4uCiAqLwpmdW5jdGlvbiBjb21tYW5kQmFzZW5hbWUodG9rKSB7CiAgdmFyIHQgPSB0b2sucmVwbGFjZSgvXlsiJ10rfFsiJ10rJC9nLCAnJyk7CiAgdmFyIGN1dCA9IHQubGFzdEluZGV4T2YoJy8nKTsKICB2YXIgYnMgPSB0Lmxhc3RJbmRleE9mKCdcXCcpOwogIGlmIChicyA+IGN1dCkgY3V0ID0gYnM7CiAgcmV0dXJuIChjdXQgPj0gMCA/IHQuc2xpY2UoY3V0ICsgMSkgOiB0KS50b0xvd2VyQ2FzZSgpOwp9CgovKioKICogVGhlIG1vZmxvIHN1YmNvbW1hbmQgb25lIHNoZWxsIHNlZ21lbnQgaW52b2tlcywgYXMgbG93ZXJjYXNlZCBwb3NpdGlvbmFsCiAqIGFyZ3MgKGBbJ21lbW9yeScsJ3NlYXJjaCddYCwgYFsnc3dhcm0nLCdpbml0J11gKSwgb3IgbnVsbCB3aGVuIHRoZSBzZWdtZW50CiAqIGRvZXMgbm90IGludm9rZSBtb2ZsbyBhdCBhbGwuIEEgZGVkaWNhdGVkIHNlYXJjaCBiaW5hcnkgcmVwb3J0cyB0aGUKICogc3ViY29tbWFuZCBpdCBpcyDigJQgdGhhdCBpcyBhbGwgYGZsby1zZWFyY2hgIGRvZXMuCiAqLwpmdW5jdGlvbiBtb2Zsb1N1YmNvbW1hbmQoc2VnKSB7CiAgdmFyIHRva2VucyA9IHNlZy50cmltKCkuc3BsaXQoL1xzKy8pLmZpbHRlcihCb29sZWFuKTsKICB2YXIgaSA9IDA7CiAgLy8gU2tpcCBzaGVsbCBub2lzZSBhaGVhZCBvZiB0aGUgZW50cnlwb2ludDogZW52IGFzc2lnbm1lbnRzIChgRk9PPWJhciBmbG8g4oCmYCksCiAgLy8gc3VkbywgcGFja2FnZSBydW5uZXJzIGFuZCB0aGVpciBmbGFncy4KICB3aGlsZSAoaSA8IHRva2Vucy5sZW5ndGgpIHsKICAgIHZhciB0b2sgPSB0b2tlbnNbaV07CiAgICBpZiAodG9rID09PSAnc3VkbycgfHwgL15bQS1aYS16X11bQS1aYS16MC05X10qPS8udGVzdCh0b2spKSB7IGkrKzsgY29udGludWU7IH0KICAgIGlmIChDUkVESVRfUlVOTkVSX1NLSVBfUkUudGVzdCh0b2spKSB7IGkrKzsgY29udGludWU7IH0KICAgIGlmIChDUkVESVRfUlVOTkVSX1JFLnRlc3QoY29tbWFuZEJhc2VuYW1lKHRvaykpKSB7IGkrKzsgY29udGludWU7IH0KICAgIGJyZWFrOwogIH0KICBpZiAoaSA+PSB0b2tlbnMubGVuZ3RoKSByZXR1cm4gbnVsbDsKICB2YXIgZW50cnkgPSBjb21tYW5kQmFzZW5hbWUodG9rZW5zW2ldKTsKICBpZiAoQ1JFRElUX1NFQVJDSF9CSU5fUkUudGVzdChlbnRyeSkpIHJldHVybiBbJ21lbW9yeScsICdzZWFyY2gnXTsKICBpZiAoIUNSRURJVF9DTElfUkUudGVzdChlbnRyeSkpIHJldHVybiBudWxsOwogIC8vIFBvc2l0aW9uYWwgYXJncyBhZnRlciB0aGUgQ0xJIGVudHJ5cG9pbnQ7IGZsYWdzIGNhcnJ5IG5vIHN1YmNvbW1hbmQuCiAgdmFyIHJlc3QgPSBbXTsKICBmb3IgKHZhciBqID0gaSArIDE7IGogPCB0b2tlbnMubGVuZ3RoOyBqKyspIHsKICAgIGlmICh0b2tlbnNbal0uY2hhckF0KDApICE9PSAnLScpIHJlc3QucHVzaCh0b2tlbnNbal0udG9Mb3dlckNhc2UoKSk7CiAgfQogIHJldHVybiByZXN0Owp9CgovKiogRG9lcyBvbmUgc2hlbGwgc2VnbWVudCBpbnZva2UgYSBtb2ZsbyBtZW1vcnkgc2VhcmNoPyAqLwpmdW5jdGlvbiBzZWdtZW50Q3JlZGl0c01lbW9yeVNlYXJjaChzZWcpIHsKICB2YXIgc3ViID0gbW9mbG9TdWJjb21tYW5kKHNlZyk7CiAgaWYgKCFzdWIgfHwgIXN1Yi5sZW5ndGgpIHJldHVybiBmYWxzZTsKICBpZiAoQ1JFRElUX01FTU9SWV9DT01QT1VORF9SRS50ZXN0KHN1YlswXSkpIHJldHVybiB0cnVlOwogIHJldHVybiBzdWJbMF0gPT09ICdtZW1vcnknICYmIHN1Yi5sZW5ndGggPiAxICYmIENSRURJVF9NRU1PUllfVkVSQl9SRS50ZXN0KHN1YlsxXSk7Cn0KCi8qKgogKiBDUkVESVQgdGVzdCBmb3IgYSB3aG9sZSBCYXNoL1Bvd2VyU2hlbGwgY29tbWFuZC4gUXVvdGVkIGJvZGllcyBhcmUgc3RyaXBwZWQKICogZmlyc3QgKHNvIGEgY29tbWl0IG1lc3NhZ2UgcXVvdGluZyAibWVtb3J5IHNlYXJjaCIgY2Fubm90IGNyZWRpdCksIHRoZW4gZWFjaAogKiBzaGVsbCBzZWdtZW50IGlzIGNoZWNrZWQgYXQgaXRzIG93biBzdGFydCDigJQgYGNkIHJlcG8gJiYgZmxvIG1lbW9yeSBzZWFyY2hgCiAqIGNyZWRpdHMsIGBlY2hvICJmbG8gbWVtb3J5IHNlYXJjaCJgIGRvZXMgbm90LgogKi8KZnVuY3Rpb24gY3JlZGl0c01lbW9yeVNlYXJjaChyYXdDbWQpIHsKICAvLyBDaGVhcCByZWplY3QgZmlyc3QuIFRoaXMgcnVucyBvbiBFVkVSWSBCYXNoIGNhbGwgaW4gZXZlcnkgY29uc3VtZXIsIGFoZWFkCiAgLy8gb2YgdGhlIGJsb2NrIGFybSdzIHJlZ2V4ZXMsIGFuZCBldmVyeSBjcmVkaXRpbmcgZm9ybSBuZWNlc3NhcmlseSBuYW1lcyBhbgogIC8vIGVudHJ5cG9pbnQgY29udGFpbmluZyBvbmUgb2YgdGhlc2Ug4oCUIHNvIG5vbi1tYXRjaGVzIGNvc3Qgb25lIHJlZ2V4LCBub3QgYQogIC8vIHN0cmlwICsgc3BsaXQgKyB0b2tlbml6ZS4KICBpZiAoIUNSRURJVF9ISU5UX1JFLnRlc3QocmF3Q21kIHx8ICcnKSkgcmV0dXJuIGZhbHNlOwogIHJldHVybiBtb2Zsb1NlZ21lbnRzKHJhd0NtZCkuc29tZShzZWdtZW50Q3JlZGl0c01lbW9yeVNlYXJjaCk7Cn0KCi8qKiBTaGVsbCBzZWdtZW50cyBvZiBhIGNvbW1hbmQsIHF1b3RlZCBib2RpZXMgc3RyaXBwZWQuICovCmZ1bmN0aW9uIG1vZmxvU2VnbWVudHMocmF3Q21kKSB7CiAgcmV0dXJuIHN0cmlwUXVvdGVkQW5kSGVyZWRvY3MocmF3Q21kIHx8ICcnKS5zcGxpdCgvWzt8JlxuXSsvKTsKfQoKLyoqCiAqICMxMzM4IGZvbGxvdy11cCDigJQgd2hpY2ggcHJvdGVjdGVkLWNvb3JkaW5hdGlvbiBpbml0LCBpZiBhbnksIGRpZCB0aGlzIHNoZWxsCiAqIGNvbW1hbmQgcnVuPyBSZXR1cm5zICdzd2FybScsICdoaXZlJywgb3IgbnVsbC4KICoKICogYGZsbyBzd2FybSBpbml0YCBhbmQgYGZsbyBoaXZlLW1pbmQgaW5pdGAgYXJlIE5PVCBzZWNvbmQtY2xhc3Mgc3RhbmQtaW5zIGZvcgogKiB0aGUgTUNQIHRvb2xzOiB0aGUgQ0xJIGRpc3BhdGNoZXMgaW4tcHJvY2VzcyB0aHJvdWdoIHRoZSBzYW1lIFRPT0xfUkVHSVNUUlkKICogaGFuZGxlciB0aGUgTUNQIHNlcnZlciBleHBvc2VzIChgbWNwLWNsaWVudC50c2AgY2FsbE1DUFRvb2wpLCBhbmQgdGhlCiAqIHJlc3VsdGluZyBzd2FybSBpcyBwZXJzaXN0ZWQgKCM4MDYgYWdlbnRzL3RvcG9sb2d5LCAjMTMyOSB0YXNrcyksIHNvIGEgbGF0ZXIKICogcHJvY2VzcyDigJQgaW5jbHVkaW5nIGEgcmVzdGFydGVkIE1DUCBzZXJ2ZXIg4oCUIGh5ZHJhdGVzIHRoZSBzYW1lIHN3YXJtLgogKgogKiBUaGlzIG1hdHRlcnMgYmVjYXVzZSBDbGF1ZGUgQ29kZSBzcGF3bnMgc3RkaW8gTUNQIHNlcnZlcnMgb25jZSBhdCBzZXNzaW9uCiAqIHN0YXJ0IGFuZCBuZXZlciByZXNwYXducyB0aGVtLiBCZWZvcmUgdGhpcywgYHJlY29yZC1zd2FybS1pbml0YCBmaXJlZCBvbmx5IG9uCiAqIGBtY3BfX21vZmxvX19zd2FybV9pbml0YCwgc28gYSBzZXNzaW9uIHRoYXQgbG9zdCBpdHMgTUNQIHNlcnZlciBoaXQgdGhlICM5NTIKICogZ2F0ZSB3aXRoIE5PIHdheSB0byBzYXRpc2Z5IGl0OiBgL2ZsIC1zYCBibG9ja2VkIGV2ZXJ5IEFnZW50IHNwYXduIGFuZCB0b2xkCiAqIHRoZSByZWFkZXIgdG8gY2FsbCBhIHRvb2wgdGhhdCBkaWQgbm90IGV4aXN0IGluIHRoYXQgc2Vzc2lvbi4gVW5saWtlIHRoZQogKiBtZW1vcnkgZ2F0ZSwgdGhlcmUgd2FzIG5vdCBldmVuIGFuIHVuYWR2ZXJ0aXNlZCBlc2NhcGUuCiAqCiAqIERlbGliZXJhdGVseSB3aXJlZCBQb3N0VG9vbFVzZSwgbm90IFByZVRvb2xVc2Ugd2hlcmUgdGhlIG1lbW9yeSBjcmVkaXQgbGl2ZXM6CiAqIENsYXVkZSBDb2RlIGRvZXMgbm90IGZpcmUgUG9zdFRvb2xVc2Ugd2hlbiBhIGNvbW1hbmQgZXhpdHMgbm9uLXplcm8gKCMxMzIyKSwKICogc28gb25seSBhbiBpbml0IHRoYXQgYWN0dWFsbHkgU1VDQ0VFREVEIGNyZWRpdHMgdGhlIGdhdGUuIEEgZmFpbGVkIGluaXQgbXVzdAogKiBuZXZlciBvcGVuIGl0IOKAlCB0aGF0IHdvdWxkIGJlIHRoZSBzaWxlbnQtZGVncmFkYXRpb24gZmFpbHVyZSBDTEFVREUubWQncwogKiBwcm90ZWN0ZWQtZnVuY3Rpb25hbGl0eSBydWxlIGV4aXN0cyB0byBwcmV2ZW50LgogKi8KZnVuY3Rpb24gYmFzaENvb3JkaW5hdGlvbkluaXQocmF3Q21kKSB7CiAgLy8gQ2hlYXAgcmVqZWN0LCBzYW1lIGhvdC1wYXRoIGRpc2NpcGxpbmUgYXMgY3JlZGl0c01lbW9yeVNlYXJjaDogZXZlcnkKICAvLyBjcmVkaXRpbmcgZm9ybSBuYW1lcyBhIG1vZmxvIGVudHJ5cG9pbnQgQU5EIHRoZSBgaW5pdGAgc3ViY29tbWFuZC4KICBpZiAoIUNSRURJVF9ISU5UX1JFLnRlc3QocmF3Q21kIHx8ICcnKSB8fCAhL1xiaW5pdFxiL2kudGVzdChyYXdDbWQpKSByZXR1cm4gbnVsbDsKICB2YXIgc2VnbWVudHMgPSBtb2Zsb1NlZ21lbnRzKHJhd0NtZCk7CiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWdtZW50cy5sZW5ndGg7IGkrKykgewogICAgdmFyIHN1YiA9IG1vZmxvU3ViY29tbWFuZChzZWdtZW50c1tpXSk7CiAgICBpZiAoIXN1YiB8fCBzdWIubGVuZ3RoIDwgMiB8fCBzdWJbMV0gIT09ICdpbml0JykgY29udGludWU7CiAgICBpZiAoc3ViWzBdID09PSAnc3dhcm0nKSByZXR1cm4gJ3N3YXJtJzsKICAgIC8vIGBoaXZlYCBpcyB0aGUgcmVnaXN0ZXJlZCBhbGlhcyBmb3IgYGhpdmUtbWluZGAgKGNvbW1hbmRzL2hpdmUtbWluZC50cykuCiAgICBpZiAoc3ViWzBdID09PSAnaGl2ZS1taW5kJyB8fCBzdWJbMF0gPT09ICdoaXZlJykgcmV0dXJuICdoaXZlJzsKICB9CiAgcmV0dXJuIG51bGw7Cn0KLy8gIzE0NDUg4oCUIHJlYWQgc2hhcGVzIHdob3NlIExFQURJTkcgY29tbWFuZCBpcyBvbmUgQkFTSF9DQVJWRV9PVVRfUkUgY2FydmVzIG91dAovLyB3aG9sZXNhbGUgKGBub2RlIOKApmAsIGBnaXQg4oCmYCkuIFRoZXkgYXJlIHJlYWQtbGlrZSBiZWNhdXNlIG9mIHdoYXQgRk9MTE9XUyB0aGUKLy8gbGVhZGluZyB0b2tlbiwgc28gYW5jaG9yaW5nIG9uIHRoYXQgdG9rZW4gYWxvbmUgY2FuIG5ldmVyIHNlZSB0aGVtOiBpbiBvbmUKLy8gcmVhbCBzZXNzaW9uIDUzOSBmaWxlLWV4cGxvcmF0aW9uIGNhbGxzIHdlbnQgdGhyb3VnaCBgbm9kZSAtZWAgKyByZWFkRmlsZVN5bmMKLy8gYW5kIGBnaXQgc2hvdyA8cmVmPjo8cGF0aD5gIHdpdGggdGhlIGdhdGUgYmxpbmQgdG8gZXZlcnkgb25lIG9mIHRoZW0uIFRoYXQgaXMKLy8gdGhlIGRvbWluYW50IGV4cGxvcmF0aW9uIHNoYXBlIGluIHJlcG9zIHdob3NlIG93biBndWlkYW5jZSBzdGVlcnMgYXdheSBmcm9tCi8vIGBncmVwYCAoZS5nLiB3aGVyZSBgZ3JlcGAgaXMgYHVncmVwYCBhbmQgc2lsZW50bHkgc2tpcHMgZmlsZXMsIHNvIGFueQovLyBpbnZlbnRvcnkgYSBkZWNpc2lvbiByZXN0cyBvbiBtdXN0IGdvIHRocm91Z2ggYGZzLnJlYWRGaWxlU3luY2ApLgovLwovLyBUaGVzZSBzb3VyY2VzIGFyZSBzcGxpY2VkIGludG8gUkVBRF9MSUtFX0JBU0hfUkUgYmVsb3cgQU5EIGtlcHQgYWRkcmVzc2FibGUKLy8gb24gdGhlaXIgb3duLCBiZWNhdXNlIGNoZWNrLWJhc2gtbWVtb3J5IGhhcyB0byBsZXQgdGhlbSBvdmVycmlkZSB0aGUKLy8gY2FydmUtb3V0IOKAlCBleHRlbmRpbmcgUkVBRF9MSUtFIGFsb25lIHdvdWxkIGNoYW5nZSBub3RoaW5nLCB0aGUgYF5ccyoobm9kZXwKLy8gZ2l0KVxzYCBjYXJ2ZS1vdXQgYXJtcyBzd2FsbG93IHRoZW0gb25lIGxpbmUgbGF0ZXIuCnZhciBSVU5ORVJfUkVBRF9TT1VSQ0VTID0gWwogIC8vIGBub2RlIC1lICIuLi5yZWFkRmlsZVN5bmMoLi4uKS4uLiJgLCBpbiBldmVyeSBldmFsIHNwZWxsaW5nICgtZS8tLWV2YWwvLXAvCiAgLy8gLS1wcmludC8tLWlucHV0LXR5cGU9bW9kdWxlIC1lKS4gVGhlIGV2YWwgRkxBRyBpcyBkZWxpYmVyYXRlbHkgbm90IHJlcXVpcmVkOgogIC8vIGEgc2NyaXB0LWZpbGUgaW52b2NhdGlvbiAoYG5vZGUgc2NyaXB0cy9idWlsZC5tanNgKSBkb2VzIG5vdCBjYXJyeSBhIHJlYWQKICAvLyBjYWxsIGluIGl0cyBjb21tYW5kIGxpbmUsIHNvIHRoZSByZWFkIGNhbGwgaXRzZWxmIGlzIHRoZSByZWxpYWJsZSBzaWduYWwgYW5kCiAgLy8gZGVtYW5kaW5nIHRoZSBmbGFnIG9ubHkgYWRkcyBzcGVsbGluZ3MgdG8gbWlzcy4KICAvLwogIC8vIFRoZSBuZWdhdGl2ZSBsb29rYWhlYWQgaXMgbG9hZC1iZWFyaW5nLCBub3QgY2F1dGlvbjogUnVsZSAjMSB0ZWxscyBhdXRob3JzCiAgLy8gdG8gZG8gY3Jvc3MtcGxhdGZvcm0gZmlsZSBPUFMgdGhyb3VnaCBgbm9kZSAtZWAgd2l0aCBmcyAoYG1rZGlyYC9gcm1gL2BjcGAKICAvLyBkbyBub3QgZXhpc3Qgb24gV2luZG93cyksIGFuZCBhIHJlYWQtbW9kaWZ5LXdyaXRlIGlzIGFuIG9wZXJhdGlvbiwgbm90CiAgLy8gZXhwbG9yYXRpb24uIE9ubHkgZnMgTVVUQVRJT04gY2FsbHMgY2FydmUgb3V0IOKAlCBtYXRjaGluZyBhIGJhcmUgYHdyaXRlYAogIC8vIHdvdWxkIGNhcnZlIG91dCBgcHJvY2Vzcy5zdGRvdXQud3JpdGVgLCB3aGljaCBuZWFybHkgZXZlcnkgaW5saW5lIHJlYWQKICAvLyBzY3JpcHQgZW5kcyB3aXRoLCBhbmQgdGhhdCB3b3VsZCBoYW5kIGJhY2sgdGhlIHdob2xlIGdhcC4KICAvLwogIC8vIEV2ZXJ5IG11dGF0aW9uIG5hbWUgY292ZXJzIGl0cyBzeW5jLCBjYWxsYmFjayBBTkQgcHJvbWlzZSBzcGVsbGluZzogYXV0aG9ycwogIC8vIHJlYWNoIGZvciBgZnMucHJvbWlzZXMucm1gIGFzIHJlYWRpbHkgYXMgYHJtU3luY2AsIGFuZCBsaXN0aW5nIG9ubHkgdGhlCiAgLy8gYCpTeW5jYCBmb3JtIHdvdWxkIGJsb2NrIHRoZSBkZWxldGUgb3AgUnVsZSAjMSBzZW50IHRoZW0gdG8gYG5vZGUgLWVgIGZvci4KICAvLyBgcm1gL2BybWRpcmAvYGNwYCBjYXJyeSBgXGJgIGJlY2F1c2UgdGhleSBhcmUgc2hvcnQgZW5vdWdoIHRvIGFwcGVhciBpbnNpZGUKICAvLyB1bnJlbGF0ZWQgd29yZHMg4oCUIGFuIHVuYW5jaG9yZWQgYHJtYCBtYXRjaGVzICJmb3JtYXQiIGFuZCAidHJhbnNmb3JtIiwgYW5kCiAgLy8gd291bGQgY2FydmUgb3V0IG1vc3Qgb2Ygd2hhdCB0aGlzIGFybSBleGlzdHMgdG8gY2F0Y2guCiAgJ15cXHMqKD86bm9kZXxub2RlanMpKD86XFwuKD86ZXhlfGNtZCkpP1xccycKICAgICsgJyg/PVtcXHNcXFNdKig/OnJlYWQoPzpGaWxlfGRpcil8Z2xvYlN5bmMpKScKICAgICsgJyg/IVtcXHNcXFNdKig/OndyaXRlRmlsZXxhcHBlbmRGaWxlfG1rZGlyfG1rZHRlbXB8dW5saW5rfGNvcHlGaWxlfHJlbmFtZScKICAgICsgJ3xzeW1saW5rfGNyZWF0ZVdyaXRlU3RyZWFtfFxcYnJtKD86ZGlyKT8oPzpTeW5jKT9cXGJ8XFxiY3AoPzpTeW5jKT9cXGIpKScsCiAgLy8gYGdpdCBzaG93IDxyZWY+OjxwYXRoPmAgLyBgZ2l0IGNhdC1maWxlIC1wIDxyZWY+OjxwYXRoPmAg4oCUIHRoZSBjb2xvbiBmb3JtCiAgLy8gcmVhZHMgYSBibG9iIGFuZCBpcyBgY2F0YCBieSBhbm90aGVyIG5hbWUuIExlYWRpbmcgYC1gLXByZWZpeGVkIHRva2VucyBhcmUKICAvLyBjb25zdW1lZCBhcyBmbGFncyBmaXJzdCBzbyBgLS1wcmV0dHk9Zm9ybWF0OiVoYCAoYSBjb2xvbiBpbnNpZGUgYSBGTEFHKQogIC8vIGNhbm5vdCBtYXNxdWVyYWRlIGFzIGEgcmVmOnBhdGgsIGFuZCB0aGUgc2VnbWVudCBhZnRlciB0aGUgY29sb24gbXVzdCBjYXJyeQogIC8vIGEgcGF0aCBjaGFyYWN0ZXIg4oCUIHNhbWUgZmFsc2UtbmVnYXRpdmUgdHJhZGUgYXMgdGhlIGB0eXBlIFxTKltcXC8uXWAgYXJtCiAgLy8gYWJvdmUgKGBnaXQgc2hvdyBIRUFEOnNyY2AsIGEgYmFyZSBkaXJlY3RvcnksIHBhc3Nlczsgc291cmNlIGZpbGVzIGFsbCBoYXZlCiAgLy8gZXh0ZW5zaW9ucykuIEJhcmUgYGdpdCBzaG93YCwgYGdpdCBzaG93IC0tc3RhdGAsIGBnaXQgbG9nYCBhbmQgYGdpdCBkaWZmYAogIC8vIGhhdmUgbm8gcmVmOnBhdGggdG9rZW4gYW5kIHN0YXkgb3BlcmF0aW9uYWwuCiAgJ15cXHMqZ2l0XFxzKyg/OnNob3d8Y2F0LWZpbGUpXFxzKyg/Oi17MSwyfVxcUytcXHMrKSpbXi1cXHNdXFxTKjpcXFMqW1xcXFwvLl0nLAogIC8vIFJlcG8td2lkZSBjb250ZW50IHNlYXJjaCBhbmQgZmlsZSBpbnZlbnRvcnkg4oCUIHRoZSBgZ2l0YCBzcGVsbGluZ3Mgb2YKICAvLyBgZ3JlcCAtcmAgYW5kIGBmaW5kYC4gTk9UIGBnaXQgbG9nIC0tZ3JlcGAsIHdoaWNoIHNlYXJjaGVzIGNvbW1pdCBtZXNzYWdlcywKICAvLyBpcyBhbHJlYWR5IGluIHRoZSBwYXNzaW5nIHNldCwgYW5kIGRvZXMgbm90IG1hdGNoIGBnaXRccytncmVwYC4KICAnXlxccypnaXRcXHMrKD86Z3JlcHxscy1maWxlcylcXGInLApdOwovLyBTYW1lIHNvdXJjZXMgYXMgdGhlaXIgb3duIG1hdGNoZXIg4oCUIGNoZWNrLWJhc2gtbWVtb3J5IHRlc3RzIHRoaXMgdG8gbGV0IGEKLy8gY2FydmVkLW91dCBsZWFkaW5nIGNvbW1hbmQgc3RpbGwgYmxvY2sgd2hlbiB0aGUgcmVzdCBvZiB0aGUgY29tbWFuZCBpcyBhIHJlYWQuCnZhciBSVU5ORVJfUkVBRF9CQVNIX1JFID0gbmV3IFJlZ0V4cChSVU5ORVJfUkVBRF9TT1VSQ0VTLmpvaW4oJ3wnKSwgJ2knKTsKLy8gQkxPQ0s6IHJlYWQtbGlrZSBCYXNoIGNvbW1hbmRzIHRoYXQgYnlwYXNzIHRoZSBleGlzdGluZyBjaGVjay1iZWZvcmUtcmVhZCAvCi8vIGNoZWNrLWJlZm9yZS1zY2FuIGdhdGVzIGJ5IGdvaW5nIHRocm91Z2ggdGhlIHNoZWxsLiBBbmNob3JlZCB0byB0aGUgc3RhcnQgb2YKLy8gdGhlIGxpbmUgc28gc3ViY29tbWFuZHMgaW5zaWRlIHBpcGVsaW5lcyBvciBgbnBtIGluc3RhbGwgZ3JlcGAgZG9uJ3QgdHJpcC4KLy8gQ292ZXJzIFBPU0lYIHJlYWQvc2VhcmNoIHRvb2xzLCBXaW5kb3dzIGNtZCBgdHlwZWAsIGFuZCBQb3dlclNoZWxsIHJlYWRlcnMuCi8vICMxMTcxIOKAlCBleHRlbmRlZCB3aXRoIFBvd2VyU2hlbGwtbmF0aXZlIGV4cGxvcmF0aW9uIGZvcm1zIG5vdyB0aGF0IHRoZSBtYXRjaGVyCi8vIHdpZGVucyB0byB0aGUgYFBvd2VyU2hlbGxgIHRvb2wuIFBsYWluIGBHZXQtQ2hpbGRJdGVtYCB3aXRob3V0IC1SZWN1cnNlIHN0YXlzCi8vIHVuY292ZXJlZCAoaXQncyBgbHNgLWVxdWl2YWxlbnQgYW5kIHBsYWluIGBsc2AgaXMgYWxsb3dlZCkuCnZhciBSRUFEX0xJS0VfQkFTSF9SRSA9IG5ldyBSZWdFeHAoWwogICdeXFxzKig/OmNhdHxoZWFkfHRhaWx8bGVzc3xtb3JlfGJhdHx4eGR8b2R8aGV4ZHVtcClcXGInLAogICdeXFxzKig/OmdyZXB8cmd8YWd8ZmdyZXB8ZWdyZXB8ZmluZHxmZClcXGInLAogICdeXFxzKnNlZFxccystblxcYicsCiAgJ15cXHMqYXdrXFxzKyg/IS4qPDwpJywKICAvLyBgdHlwZSA8cGF0aD5gIG9uIFdpbmRvd3MuIE5vIGAkYCBhbmNob3Igc28gYSBwaXBlZCBmb3JtCiAgLy8gKGB0eXBlIHNyY1xmb28udHMgfCBncmVwIHhgKSBzdGlsbCBtYXRjaGVzIGFuZCBnZXRzIGJsb2NrZWQuIFRoZSBhcmd1bWVudAogIC8vIG11c3QgY29udGFpbiBhIHNsYXNoLCBiYWNrc2xhc2gsIG9yIGRvdCDigJQgb3RoZXJ3aXNlIGl0J3MgdGhlIHNoZWxsLWJ1aWx0aW4KICAvLyBjb21tYW5kLWxvb2t1cCBmb3JtIChgdHlwZSBsc2AsIGB0eXBlIGNkYCkgd2hpY2ggdGhlIGdhdGUgaGFzIG5vIGJ1c2luZXNzCiAgLy8gYmxvY2tpbmcuIEZhbHNlLW5lZ2F0aXZlIHRyYWRlOiBleHRlbnNpb24tbGVzcyBmaWxlbmFtZXMgbGlrZSBgdHlwZSBNYWtlZmlsZWAKICAvLyBwYXNzIHRocm91Z2guIEFjY2VwdGFibGUg4oCUIHNvdXJjZSBmaWxlcyBhbGwgaGF2ZSBleHRlbnNpb25zLCBhbmQgdGhlCiAgLy8gcHJpbWFyeSByaXNrIHBhdHRlcm4gaXMgbGVha2luZyBwYXN0IHRoZSBnYXRlIHZpYSBgdHlwZSBzcmNcZm9vLnRzYC4KICAnXlxccyp0eXBlXFxzK1xcUypbXFxcXC8uXScsCiAgJ15cXHMqKD86R2V0LUNvbnRlbnR8Z2N8U2VsZWN0LVN0cmluZ3xzbHMpXFxiJywKICAvLyAjMTE3MSDigJQgUG93ZXJTaGVsbCByZWN1cnNpdmUgZXhwbG9yYXRpb24gKHBhcmFsbGVsIHRvIFBPU0lYIGBmaW5kYC9gZmRgKS4KICAvLyBUaGUgYC1SZWN1cnNlYCBmbGFnIGlzIHdoYXQgbWFrZXMgaXQgZXhwZW5zaXZlIGVub3VnaCB0byBnYXRlOyBwbGFpbgogIC8vIGBHZXQtQ2hpbGRJdGVtYCBpcyBgbHNgLXNoYXBlZCBhbmQgaW50ZW50aW9uYWxseSBub3QgYmxvY2tlZC4KICAnXlxccyooPzpHZXQtQ2hpbGRJdGVtfGdjaSlcXGJbXnxdKi1SZWN1cnNlXFxiJywKICAvLyAjMTE3MSDigJQgY21kLXN0eWxlIHJlY3Vyc2l2ZSBsaXN0aW5nIChgZGlyIC9zYCBvciBgZGlyIC9TYCkuIE9ubHkgdGhlCiAgLy8gV2luZG93cyBgL3NgIGZvcm0sIE5PVCBQT1NJWCBgZGlyIC1zYCAoc29ydC1ieS1zaXplLCB3aGVyZSBgZGlyYCBpcyBhbGlhc2VkCiAgLy8gdG8gYGxzIC1sYCBvbiBtYW55IGRpc3Ryb3MpIOKAlCBmYWxzZS1wb3NpdGl2ZSBibG9ja2luZyB0aGF0IHdvdWxkIGJyZWFrCiAgLy8gbGVnaXRpbWF0ZSBQT1NJWCBsaXN0aW5ncy4KICAnXlxccypkaXJcXGJbXnxdKlxcc1xcL1tzU11cXGInLAogIC8vICMxMTcxIOKAlCBQb3dlclNoZWxsIGhleCBkdW1wLCBwYXJhbGxlbCB0byBQT1NJWCBgeHhkYC9gaGV4ZHVtcGAuCiAgJ15cXHMqRm9ybWF0LUhleFxcYicsCl0uY29uY2F0KFJVTk5FUl9SRUFEX1NPVVJDRVMpLmpvaW4oJ3wnKSwgJ2knKTsKLy8gQ0FSVkUtT1VUOiBjb21tYW5kcyB0aGF0IExPT0sgcmVhZC1saWtlIGJ1dCBhcmUgb3BlcmF0aW9uYWwuIEFuY2hvcmVkIHRvIHRoZQovLyBMRUFESU5HIGNvbW1hbmQg4oCUIHRoZSBwaXBlLWZpbHRlciBjYXNlIChgbnBtIHRlc3QgfCBncmVwIEZBSUxgKSBpcyBhbHJlYWR5Ci8vIGhhbmRsZWQgYnkgUkVBRF9MSUtFJ3MgYF5ccypgIGFuY2hvciBuZXZlciBtYXRjaGluZyB0aGUgbGVhZGluZyBgbnBtYCwgc28KLy8gdGhlcmUgaXMgaW50ZW50aW9uYWxseSBubyBwaXBlIGFybSBoZXJlOiBjYXRjaGluZyB0aGUgbGVhZGluZyBjb21tYW5kIGxldHMKLy8gYGdyZXAgLXIgVE9ETyBzcmMvIHwgaGVhZCAtNWAgcmVhY2ggdGhlIEJMT0NLIGV4aXQgKHdoaWNoIGl0IG11c3QsIHRoYXQncwovLyB0aGUgZ2FwIHRoZSB0aWNrZXQgZXhpc3RzIHRvIGNsb3NlKS4gIzExMzIuCnZhciBCQVNIX0NBUlZFX09VVF9SRSA9IG5ldyBSZWdFeHAoWwogICdeXFxzKihucG18bnB4fHBucG18eWFybnxidW58bm9kZXxkZW5vfHRzeHx0cy1ub2RlKVxccycsCiAgJ15cXHMqKGdpdHxnaHxodWIpXFxzJywKICAnXlxccyooZG9ja2VyfGt1YmVjdGx8aGVsbXx0ZXJyYWZvcm0pXFxzJywKICAnXlxccyooY3VybHx3Z2V0fGh0dHB8ZmV0Y2gpXFxzJywKICAnXlxccyooanF8eXF8eHEpXFxzJywKICAnXlxccyooZWNob3xwcmludGZ8dHJ1ZXxmYWxzZXxzbGVlcHx0ZXN0fFxcWylcXHMnLAogICdeXFxzKmNhdFxccysoPDx8PDw8KScsCiAgJ15cXHMqY2F0XFxzK1tefF0qXFxzKj4nLAogICdeXFxzKnRlZVxcYicsCiAgLy8gTGF6eSBgLis/YCBpbnN0ZWFkIG9mIGAuK1xzYCB0byBhdm9pZCBjYXRhc3Ryb3BoaWMgYmFja3RyYWNraW5nIG9uIGxvbmcKICAvLyBgZmluZGAgY29tbWFuZHMgdGhhdCBsYWNrIGEgYC1kZWxldGVgIC8gYC1leGVjIHJtYCBzdWZmaXguCiAgJ15cXHMqZmluZFxccysuKz8tKGRlbGV0ZXxleGVjXFxzK3JtKVxcYicsCl0uam9pbignfCcpKTsKLy8gIzExNzEgZm9sbG93LXVwIOKAlCBzdHJpcCBxdW90ZWQgc3RyaW5nIGJvZGllcyBhbmQgaGVyZWRvYyBib2RpZXMgZnJvbSBhIHNoZWxsCi8vIGNvbW1hbmQgZm9yIHB1cnBvc2VzIG9mIGRhbmdlcm91cy1wYXR0ZXJuIHN1YnN0cmluZyBtYXRjaGluZy4gVXNlZCBieQovLyBjaGVjay1kYW5nZXJvdXMtY29tbWFuZC4gRG9lcyBOT1Qgc3RyaXAgJCguLi4pIG9yIGAuLi5gIGJlY2F1c2UgdGhvc2UgYm9kaWVzCi8vIGV4ZWN1dGUuIERvdWJsZS1xdW90ZWQgc3RyaW5ncyBoYW5kbGUgZXNjYXBlZCBxdW90ZXMgKGBcImApIGNvcnJlY3RseSBzbwovLyBgZ2l0IGNvbW1pdCAtbSAiZml4IFwiWFwiImAgc3RyaXBzIHRoZSB3aG9sZSBxdW90ZWQgYm9keSwgbm90IGp1c3QgdGhlIGZpcnN0Ci8vIGBcImAgcGFpci4gU2luZ2xlIHF1b3RlcyBkb24ndCBoYXZlIGVzY2FwZXMgaW4gYmFzaC9zaCDigJQgYCdbXiddKidgIGlzIGV4YWN0LgpmdW5jdGlvbiBzdHJpcFF1b3RlZEFuZEhlcmVkb2NzKGNtZCkgewogIHZhciBvdXQgPSBjbWQ7CiAgLy8gSGVyZWRvYyB0YWlsOiBgPDxUT0tFTmAsIGA8PC1UT0tFTmAsIGA8PCdUT0tFTidgLCBgPDwiVE9LRU4iYCB0aHJvdWdoIGVuZC1vZi1pbnB1dC4KICAvLyBCYXNoIGhlcmVkb2NzIGFyZSBtdWx0aS1saW5lOyBpbiBzaW5nbGUtbGluZSB0b29sIGlucHV0cyB0aGV5IHNob3cgdXAgYXMgdGhlCiAgLy8gdGFpbCBhZnRlciBgPDxUT0tFTmAuIENvbnNlcnZhdGl2ZSB0YWlsLXN0cmlwIOKAlCBiZW5pZ24gY29udGVudCBhZnRlciBhIGhlcmVkb2MKICAvLyBib2R5IG9uIHRoZSBzYW1lIGxvZ2ljYWwgbGluZSBpcyBhbHNvIHN0cmlwcGVkLCBoYXJtbGVzcyBmb3IgdGhpcyBnYXRlLgogIC8vIFRva2VuIGNsYXNzIGluY2x1ZGVzIGAtYCBzbyBoeXBoZW5hdGVkIGhlcmVkb2MgdGFncyAoYDw8RU5ELU9GLURPQ2ApIG1hdGNoCiAgLy8gdGhlIGZ1bGwgdG9rZW4sIG5vdCBqdXN0IHRoZSBsZWFkaW5nIHdvcmQg4oCUIHdpdGhvdXQgdGhpcyB0aGUgc3RyaXAgd291bGQKICAvLyBoYWx0IGF0IGA8PEVORGAgYW5kIGxlYXZlIGAtT0YtRE9DYCBwbHVzIHRoZSBib2R5IGFzIGxpdGVyYWwgdGV4dC4KICBvdXQgPSBvdXQucmVwbGFjZSgvPDwtP1xzKlsnIl0/W1x3LV0rWyciXT9bXHNcU10qJC8sICcnKTsKICAvLyBIZXJlLXN0cmluZyBgPDw8d29yZGAg4oCUIHN0cmlwIHRoZSB3b3JkLgogIG91dCA9IG91dC5yZXBsYWNlKC88PDxccypcUysvZywgJycpOwogIC8vIFNpbmdsZS1xdW90ZWQgc3RyaW5ncyDigJQgbm8gZXNjYXBlcyBpbnNpZGUgc2luZ2xlIHF1b3RlcyBpbiBzaC9iYXNoLgogIG91dCA9IG91dC5yZXBsYWNlKC8nW14nXSonL2csICInJyIpOwogIC8vIERvdWJsZS1xdW90ZWQgc3RyaW5ncyDigJQgYCg/OlteIlxcXXxcXC4pKmAgbWF0Y2hlcyBhbnl0aGluZyBleGNlcHQgYW4KICAvLyB1bmVzY2FwZWQgYCJgLCBzbyBlc2NhcGVkIGBcImAgbWlkLXN0cmluZyBkb2Vzbid0IHRlcm1pbmF0ZSB0aGUgc3RyaXAgZWFybHkuCiAgb3V0ID0gb3V0LnJlcGxhY2UoLyIoPzpbXiJcXF18XFwuKSoiL2csICciIicpOwogIHJldHVybiBvdXQ7Cn0KCi8vICMxNDQ3IOKAlCB3b3JkcyB0aGF0IGNhcnJ5IG5vIHN1YmplY3QgdG8gc2VhcmNoIEZPUjogYXNzZW50LCBhY2tub3dsZWRnZW1lbnQsCi8vICJrZWVwIGdvaW5nIiwgYW5kIGNvbnZlcnNhdGlvbmFsIGZpbGxlci4gQSBwcm9tcHQgYnVpbHQgT05MWSBmcm9tIHRoZXNlCi8vIGNvbnRpbnVlcyB3b3JrIGFscmVhZHkgdW5kZXIgd2F5LCBzbyB0aGUgbWVtb3J5IGdhdGUgc3RheXMgZG93bjsgYW55dGhpbmcKLy8gdGhhdCBzdXJ2aXZlcyB0aGUgc3RyaXAgaXMgYSBzdWJqZWN0LCBhbmQgdGhlIGdhdGUgYXJtcy4KLy8KLy8gU3VwZXJzZWRlcyB0d28gdGhpbmdzLiBgRElSRUNUSVZFX1JFYCDigJQgYSBgXih5ZXN8b2t8c3VyZXzigKYpYCBwcmVmaXggdGVzdCB0aGF0Ci8vIGhhZCBhbHJlYWR5IGJlZW4gZGVhZCBjb2RlIGZvciBzb21lIHRpbWUsIHVucmVmZXJlbmNlZCBieSB0aGUgcmVzZXQgaXQgd2FzCi8vIHdyaXR0ZW4gZm9yLiBBbmQgdGhlIGxpdmUgcnVsZSwgYFRBU0tfUkUudGVzdChwKSB8fCBwLmxlbmd0aCA+IDIwYCwgd2hvc2UKLy8gcmVhbCB3b3JrIHdhcyBza2lwcGluZyBzaG9ydCByZXBsaWVzOiBldmVyeSBwcm9tcHQgb2YgMjAgY2hhcmFjdGVycyBvciBmZXdlcgovLyB3aXRob3V0IGEgdGFzayB3b3JkIHdhcyBleGVtcHQuIFRoYXQgY2F1Z2h0IHRyaXZpYSAoImhtbSIsICJnb3QgaXQiKSBhbmQKLy8gZXF1YWxseSBjYXVnaHQgImNoZWNrIHRoZSBkYWVtb24iIOKAlCBhIGdlbnVpbmUgdG9waWMgY2hhbmdlIOKAlCB3aGljaCBpcyB0aGUKLy8gaGFsZiB0aGlzIHJlcGxhY2VzLiBUaGUgbGlzdCBiZWxvdyBoYXMgdG8gY2FycnkgdGhlIHRyaXZpYSBoYWxmIG9uIGl0cyBvd24sCi8vIHNvIGl0IGNvdmVycyBjb25zaWRlcmFibHkgbW9yZSBncm91bmQgdGhhbiBESVJFQ1RJVkVfUkUgZXZlciBkaWQuCi8vCi8vIE1hdGNoaW5nIGJ5IFNVQlRSQUNUSU9OLCBub3QgYnkgYSBsZWFkaW5nLXRva2VuIHRlc3QsIGlzIHdoYXQgbGV0cwovLyAieWVzLCBub3cgZml4IHRoZSBkYWVtb24iIGFybSB3aGlsZSAieWVzIiBkb2VzIG5vdCDigJQgYSBgXih5ZXN8b2spXGJgIHRlc3QKLy8gc2VlcyB0aGUgc2FtZSBmaXJzdCB3b3JkIGluIGJvdGguIEl0IGlzIGFsc28gd2h5IHRoZSBsaXN0IGNhbiBzYWZlbHkgaG9sZAovLyBvcmRpbmFyeSB3b3JkcyBsaWtlIGBkb2AvYGl0YC9gd29ya2AvYHRoZWA6IGEgd29yZCBvbmx5IGV4ZW1wdHMgYSBwcm9tcHQgd2hlbgovLyBOT1RISU5HIGVsc2UgaW4gdGhhdCBwcm9tcHQgc3Vydml2ZXMsIHNvIGVhY2ggYWRkaXRpb24gY29zdHMgcHJlY2lzaW9uIG9ubHkKLy8gZm9yIHByb21wdHMgbWFkZSBlbnRpcmVseSBvZiBsaXN0ZWQgd29yZHMuIERlbGliZXJhdGVseSBhYnNlbnQgZm9yIHRoYXQKLy8gcmVhc29uOiB0YXNrIHdvcmRzIChgZml4YCwgYHRlc3RgLCBgYnVpbGRgKSBhbmQgYW55IG5vdW4uCnZhciBDT05USU5VQVRJT05fV09SRF9SRSA9IG5ldyBSZWdFeHAoJ1xcYig/OicgKyBbCiAgLy8gQXNzZW50IC8gZGlzc2VudCAvIGFja25vd2xlZGdlbWVudAogICd5ZXMnLCAneWVhaCcsICd5ZXAnLCAneXVwJywgJ25vJywgJ25vcGUnLCAnc3VyZScsICdvaycsICdva2F5JywgJ2snLAogICdjb3JyZWN0JywgJ3JpZ2h0JywgJ2V4YWN0bHknLCAncGVyZmVjdCcsICdhZ3JlZWQnLCAndHJ1ZScsICdpbmRlZWQnLAogICd1bmRlcnN0b29kJywgJ2dvdGNoYScsICdnb3QnLCAnbWFrZXMnLCAnc2Vuc2UnLCAnZmluZScsICdhbHJpZ2h0JywKICAvLyBDb250aW51YXRpb24gLyBhc3NlbnQgdG8gcHJvY2VlZAogICdjb250aW51ZScsICdwcm9jZWVkJywgJ2NhcnJ5JywgJ2tlZXAnLCAnZ29pbmcnLCAnZ28nLCAnYWhlYWQnLCAnb24nLCAnbmV4dCcsCiAgJ2FnYWluJywgJ21vcmUnLCAncmVzdCcsICdib3RoJywgJ2FsbCcsICd0aGVtJywgJ3Rob3NlJywKICAvLyBQb2xpdGVuZXNzIGFuZCBwcmFpc2UKICAncGxlYXNlJywgJ3RoYW5rcycsICd0aGFuaycsICd0eScsICdncmVhdCcsICduaWNlJywgJ2Nvb2wnLCAnZ29vZCcsICdhd2Vzb21lJywKICAnZXhjZWxsZW50JywgJ3NvdW5kcycsICdsZ3RtJywgJ2xvdmUnLCAnd2VsbCcsICd3b3JrJywgJ2pvYicsICd3b3cnLCAneWF5JywKICAvLyBDb252ZXJzYXRpb25hbCBmaWxsZXIgLyBoZXNpdGF0aW9uIC8gZ3JlZXRpbmdzCiAgJ2htbScsICdobScsICdodWgnLCAnYWgnLCAnb2gnLCAnaGEnLCAnaGFoYScsICdsb2wnLCAnd2FpdCcsICdob2xkJywgJ2hhbmcnLAogICdhY3R1YWxseScsICdhbnl3YXknLCAnd2hhdGV2ZXInLCAnbnZtJywgJ25ldmVybWluZCcsICdzb3JyeScsICdvb3BzJywKICAnaGknLCAnaGVsbG8nLCAnaGV5JywgJ3N0b3AnLCAncGF1c2UnLCAnbmV2ZXInLCAnbWluZCcsCiAgJ3RoaW5rJywgJ2tub3cnLCAnc2VlJywgJ2d1ZXNzJywgJ3N1cHBvc2UnLCAnbWF5YmUnLCAncHJvYmFibHknLAogIC8vIEZ1bmN0aW9uIHdvcmRzIHdpdGggbm8gc3ViamVjdCBvZiB0aGVpciBvd24KICAnZG8nLCAnaXQnLCAndGhhdCcsICd0aGlzJywgJ3RoZScsICdhJywgJ2FuJywgJ2FuZCcsICdpcycsICdhcmUnLCAnd2FzJywKICAneW91JywgJ3lvdXInLCAnaScsICd3ZScsICdsZXRzJywgJ2xldCcsICd1cycsICdtZScsICdteScsICdub3cnLCAndGhlbicsCiAgJ2RvbmUnLCAnZmluaXNoJywgJ2ZpbmlzaGVkJywgJ3JlYWR5JywgJ3RvbycsICdhbHNvJywgJ2p1c3QnLCAnc3RpbGwnLApdLmpvaW4oJ3wnKSArICcpXFxiJywgJ2dpJyk7Ci8qKgogKiBEb2VzIHRoaXMgcHJvbXB0IGNvbnNpc3Qgb2Ygbm90aGluZyBidXQgY29udGludWF0aW9uIGZpbGxlcj8KICoKICogQW4gRU1QVFkgcHJvbXB0IGFuc3dlcnMgdHJ1ZSDigJQgYSBwcm9tcHQgdGhlIGdhdGUgY2Fubm90IHNlZSBpcyBub3QgZXZpZGVuY2UKICogdGhhdCBhIHNlYXJjaCBpcyBuZWVkZWQsIGFuZCBhcm1pbmcgb24gaXQgd291bGQgYmxvY2sgZXZlcnkgcmVhZCBpbiBhCiAqIGNvbnN1bWVyIHdob3NlIGhvc3Qgb21pdHMgdGhlIGZpZWxkLCB3aXRoIG5vdGhpbmcgb24gc2NyZWVuIGV4cGxhaW5pbmcgd2h5LgogKiBGYWlsLW9wZW4gaGVyZTsgYHByb21wdC1zdGF0ZS1yZXNldGAgc2VwYXJhdGVseSByZWZ1c2VzIHRvIFdSSVRFIGEgdmVyZGljdCBpdAogKiBkZXJpdmVkIGZyb20gYW4gZW1wdHkgcHJvbXB0ICgjMTQ0NyksIHNvIGFuIHVucmVhZGFibGUgcHJvbXB0IG5vdyBsZWF2ZXMgdGhlCiAqIGdhdGUgZXhhY3RseSBhcyBwcm9tcHQtcmVtaW5kZXIgc2V0IGl0IHJhdGhlciB0aGFuIHNpbGVudGx5IGRpc2FybWluZyBpdC4KICovCmZ1bmN0aW9uIGlzQ29udGludWF0aW9uUHJvbXB0KHByb21wdFRleHQpIHsKICB2YXIgdCA9IChwcm9tcHRUZXh0IHx8ICcnKS50cmltKCk7CiAgaWYgKCF0KSByZXR1cm4gdHJ1ZTsKICAvLyBTdWJ0cmFjdCBjb250aW51YXRpb24gd29yZHMsIHRoZW4gZXZlcnkgbm9uLWFscGhhbnVtZXJpYyBjaGFyYWN0ZXIuIFdoYXQKICAvLyByZW1haW5zIGlzIHRoZSBwcm9tcHQncyBhY3R1YWwgc3ViamVjdCBtYXR0ZXI7IG5vdGhpbmcgcmVtYWluaW5nIG1lYW5zIHRoZQogIC8vIHByb21wdCBpbnRyb2R1Y2VkIG5vIG5ldyBzdWJqZWN0LgogIC8vIGBccHtMfVxwe059YCB3aXRoIC91LCBOT1QgYEEtWmEtejAtOWA6IGFuIEFTQ0lJLW9ubHkgY2xhc3Mgc3RyaXBzIGV2ZXJ5CiAgLy8gY2hhcmFjdGVyIG9mIGEgQ0pLLCBDeXJpbGxpYywgQXJhYmljLCBIZWJyZXcsIEdyZWVrIG9yIFRoYWkgcHJvbXB0IOKAlCBhbmQKICAvLyBtb3N0IG9mIGFuIGFjY2VudGVkIEZyZW5jaCBvciBTcGFuaXNoIG9uZSDigJQgbGVhdmluZyBub3RoaW5nLCBzbyBhCiAgLy8gc3Vic3RhbnRpdmUgbm9uLUVuZ2xpc2ggcmVxdWVzdCB3b3VsZCBzY29yZSBhcyBwdXJlIGZpbGxlciBhbmQgc2lsZW50bHkKICAvLyBkaXNhcm0gdGhlIGdhdGUuIFN0cmlwcGluZyBvbmx5IHdoYXQgaXMgbmVpdGhlciBsZXR0ZXIgbm9yIG51bWJlciBrZWVwcwogIC8vIGV2ZXJ5IHNjcmlwdCdzIGNvbnRlbnQgaW50YWN0IGFuZCByZW1vdmVzIGp1c3QgcHVuY3R1YXRpb24gYW5kIHNwYWNpbmcuCiAgdmFyIHJlc3QgPSB0LnJlcGxhY2UoQ09OVElOVUFUSU9OX1dPUkRfUkUsICcgJykucmVwbGFjZSgvW15ccHtMfVxwe059XSsvZ3UsICcgJykudHJpbSgpOwogIHJldHVybiByZXN0Lmxlbmd0aCA9PT0gMDsKfQoKLy8gTmFtZXNwYWNlIGNsYXNzaWZpY2F0aW9uICgjOTMxKS4gVGhlIGhpbnQgdXNlZCB0byBiZSBlbWl0dGVkIG9uIGV2ZXJ5IHByb21wdAovLyBieSBwcm9tcHQtaG9vay5tanMgd2hpY2ggY29zdCB+NDAgdG9rZW5zIMOXIGV2ZXJ5IHByb21wdCDDlyBldmVyeSBjb25zdW1lci4KLy8gTm93IHdlIGNsYXNzaWZ5IGhlcmUsIHN0b3JlIG9uIHdvcmtmbG93LXN0YXRlLCBhbmQgbGV0IGNoZWNrLWJlZm9yZS1hZ2VudAovLyBlbWl0IGl0IG9uY2Ugd2hlbiBDbGF1ZGUgaXMgYWN0dWFsbHkgYWJvdXQgdG8gc3Bhd24gYW4gYWdlbnQuCi8vCi8vIFNZTkM6IHRoZXNlIHJlZ2V4ZXMgKyBjbGFzc2lmeU5hbWVzcGFjZUhpbnQgKyBhcHBseVByb21wdFN0YXRlUmVzZXQgYXJlCi8vIGR1cGxpY2F0ZWQgdmVyYmF0aW0gaW4gc3JjL2NsaS9pbml0L2hlbHBlcnMtZ2VuZXJhdG9yLnRzICh0aGUgZW1iZWRkZWQKLy8gZ2F0ZS5janMgZmFsbGJhY2sgdXNlZCBieSBgZmxvIGluaXRgIHdoZW4gc291cmNlIGhlbHBlcnMgY2FuJ3QgYmUgbG9jYXRlZCkuCi8vIEFueSBlZGl0IHRvIGVpdGhlciBjb3B5IE1VU1QgYmUgYXBwbGllZCB0byBib3RoIOKAlCB0aGVyZSBpcyBubyBzaGFyZWQgbW9kdWxlCi8vIGJlY2F1c2UgaGVscGVycy1nZW5lcmF0b3IgZW1pdHMgYSBzZWxmLWNvbnRhaW5lZCBzdHJpbmcgdGVtcGxhdGUuCnZhciBOU19MRUFSTklOR1NfUkUgPSAvXGIocmVtZW1iZXJ8cmVjYWxsfGluc2lnaHR8bGVzc29uIGxlYXJuZWR8Z290Y2hhfHBvc3QuP21vcnRlbSlcYnx3ZSAoZGVjaWR8YWdyZWV8Y2hvc2V8c2FpZCkvOwp2YXIgTlNfVEVTVF9SRSA9IC9cYih0ZXN0fHNwZWN8Y292ZXJhZ2V8dGVzdGVkfHRlc3QgY2FzZXx0ZXN0IGNhc2VzfHRlc3RzIGZvcnxzcGVjIGZvcilcYi87CnZhciBOU19FWFBMSUNJVCA9IFsKICB7IHBhdHRlcm46IC9cYihwYXR0ZXJufGNvbnZlbnRpb258YmVzdCBwcmFjdGljZXxzdHlsZXxjb2RpbmcgcnVsZSlcYi8sIG5zOiAncGF0dGVybnMnLCBsYWJlbDogJ2NvZGUgcGF0dGVybnMgYW5kIGNvbnZlbnRpb25zJyB9LAogIHsgcGF0dGVybjogL1xiKGNvZGUuP21hcHxmaWxlIHN0cnVjdHVyZXxwcm9qZWN0IHN0cnVjdHVyZXxkaXJlY3RvcnkpXGIvLCBuczogJ2NvZGUtbWFwJywgbGFiZWw6ICdjb2RlYmFzZSBuYXZpZ2F0aW9uJyB9LApdOwp2YXIgTlNfUEFUVEVSTl9SRVMgPSBbL1xiKHRlbXBsYXRlfGV4YW1wbGV8c2ltaWxhciB0b3xob3cgZG8gd2V8aG93IHNob3VsZClcYi9dOwp2YXIgTlNfRE9NQUlOX1JFUyA9IFsKICAvXGIoZ3VpZGFuY2V8Z3VpZGV8ZG9jc3xkb2N1bWVudGF0aW9ufHJ1bGVzfGhvdy10bylcYi8sCiAgL1xiKGFyY2hpdGVjdHVyZXxkZXNpZ258ZG9tYWlufHRlbmFudHxtaWdyYXR8c2NoZW1hfGRlcGxveSkvLAogIC9cYihydWxlfHJlcXVpcmVtZW50fGNvbnN0cmFpbnR8Y29tcGxpYW5jZSlcYi8sCl07CnZhciBOU19OQVZfUkVTID0gWwogIC9cYihmaW5kfHdoZXJlfHdoaWNoIGZpbGV8bG9vayB1cHxsb2NhdGV8ZW5kcG9pbnR8cm91dGV8dXJsfHBhdGgpXGIvLAogIC9cYihjbGFzc3xmdW5jdGlvbnxtZXRob2R8Y29tcG9uZW50fHNlcnZpY2V8ZW50aXR5fG1vZHVsZSlcYi8sCl07CgovLyBEZXRlY3Qgd2hldGhlciB0aGUgY3VycmVudCBwcm9tcHQgaW52b2tlZCAvZmwgb3IgL2ZsbyB3aXRoIGEgc3dhcm0vaGl2ZSBmbGFnICgjOTUyKS4KLy8gV2hlbiBzZXQsIGNoZWNrLWJlZm9yZS1hZ2VudCBCTE9DS1MgdGhlIEFnZW50IHNwYXduIHVudGlsIHRoZSBtYXRjaGluZyBNQ1AgaW5pdAovLyAobWNwX19tb2Zsb19fc3dhcm1faW5pdCBvciBtY3BfX21vZmxvX19oaXZlLW1pbmRfaW5pdCkgaGFzIGJlZW4gcmVjb3JkZWQg4oCUIHRoZSB1c2VyCi8vIGV4cGxpY2l0bHkgb3B0ZWQgaW4gdG8gdGhlIHByb3RlY3RlZCBjb29yZGluYXRpb24gc3VyZmFjZSwgc28gZmFsbGluZyBiYWNrIHRvCi8vIHJhdyBBZ2VudCBkaXNwYXRjaCBzaWxlbnRseSByZWdyZXNzZXMgaGVhZGxpbmUgbW9mbG8gcHJvZHVjdCBjYXBhYmlsaXR5LgovLwovLyBUaGlzIGZpbGUgaXMgdGhlIHNpbmdsZSBzb3VyY2U7ICMxNDQzIHJlcGxhY2VkIGhlbHBlcnMtZ2VuZXJhdG9yLnRzJ3MKLy8gaGFuZC1tYWludGFpbmVkIGNvcHkgd2l0aCBhIGJ1aWxkLXRpbWUgZW1iZWQgb2YgdGhpcyBleGFjdCBmaWxlLCBzbyB0aGVyZSBpcwovLyBubyBsb25nZXIgYSBzZWNvbmQgY29weSBvZiB0aGlzIGZ1bmN0aW9uIHRvIGtlZXAgaW4gc3RlcC4KZnVuY3Rpb24gZGV0ZWN0RmxNb2RlKHByb21wdFRleHQpIHsKICB2YXIgcCA9IHByb21wdFRleHQgfHwgJyc7CiAgaWYgKCEvXlxzKlwvKD86Zmx8ZmxvKVxiL2kudGVzdChwKSkgcmV0dXJuIG51bGw7CiAgaWYgKC8oPzpefFxzKSg/Oi1zfC0tc3dhcm0pXGIvLnRlc3QocCkpIHJldHVybiAnc3dhcm0nOwogIGlmICgvKD86XnxccykoPzotaHwtLWhpdmUpXGIvLnRlc3QocCkpIHJldHVybiAnaGl2ZSc7CiAgcmV0dXJuIG51bGw7Cn0KCi8vIFJlc29sdmUgdGhlIEZVTEwgc2V0IG9mIC9mbG8gcnVuIG1vZGlmaWVycyBmcm9tIHRoZSBwcm9tcHQgKyBtb2Zsby55YW1sIOKAlCB0aGUKLy8gc2luZ2xlIHNvdXJjZSBvZiB0cnV0aCBmb3IgYm90aCBnYXRlIGFybWluZyAoIzEyOTcpIGFuZCB0aGUgYXV0aG9yaXRhdGl2ZQovLyBhbm5vdW5jZW1lbnQgZW1pdHRlZCBieSBwcm9tcHQtcmVtaW5kZXIuIFR3byBjb25zdW1lcnMsIG9uZSByZXNvbHZlcjogYSBzZWNvbmQKLy8gaW1wbGVtZW50YXRpb24gaXMgZXhhY3RseSBob3cgYHNkZC5kZWZhdWx0OiB0cnVlYCBnb3Qgc2lsZW50bHkgaWdub3JlZCAodGhlCi8vIHNraWxsJ3MgcHJvbXB0IGNhcnJpZWQgYGxldCBzZGRNb2RlID0gZmFsc2VgIGFuZCB0aGUgbW9kZWwgZXhlY3V0ZWQgdGhlIGxpdGVyYWwpLgovLwovLyBQcmVjZWRlbmNlIHBlciBrZXk6IGV4cGxpY2l0IC0tbm8tWCA+IGV4cGxpY2l0IC14Ly0tWCA+IG1vZmxvLnlhbWwgPiBidWlsdC1pbi4KLy8gTk9URSB0aGUgZGlmZmVyaW5nIGJ1aWx0LWluIGRlZmF1bHRzOiBzZGQgaXMgb3B0LUlOIChmYWxzZSksIHZlcmlmeSBpcyBvcHQtT1VUCi8vICh0cnVlLCAjMTI5NCksIG1lcmdlIGlzIG9wdC1JTiAoZmFsc2UsICMxMjg1KS4KLy8KLy8gYC1zZGAgaXMgYSBkaXN0aW5jdCB0b2tlbiBmcm9tIGAtc2AgKHN3YXJtKTogdGhlIGBkYCBzaXRzIG9uIHRoZSB3b3JkIGJvdW5kYXJ5Ci8vIHNvIGAtc1xiYCBuZXZlciBtYXRjaGVzIGAtc2RgLgpmdW5jdGlvbiByZXNvbHZlRmxvUnVuKHByb21wdFRleHQpIHsKICB2YXIgcCA9IHByb21wdFRleHQgfHwgJyc7CiAgdmFyIG91dCA9IHsgaXNGbG86IGZhbHNlLCB3b3JrZmxvdzogJ2Z1bGwnLCBzZGQ6IGZhbHNlLCB2ZXJpZnk6IGZhbHNlLCBtZXJnZTogZmFsc2UsCiAgICAgICAgICAgICAgc2RkU3JjOiAnZGVmYXVsdCcsIHZlcmlmeVNyYzogJ2RlZmF1bHQnLCBtZXJnZVNyYzogJ2RlZmF1bHQnIH07CiAgaWYgKCEvXlxzKlwvKD86Zmx8ZmxvKVxiL2kudGVzdChwKSkgcmV0dXJuIG91dDsKICBvdXQuaXNGbG8gPSB0cnVlOwoKICAvLyBXb3JrZmxvdyBtb2RlIOKAlCBkZWNpZGVzIHdoaWNoIG1vZGlmaWVycyBhcmUgZXZlbiBhcHBsaWNhYmxlLgogIGlmICgvKD86XnxccykoPzotd2Z8LS13b3JrZmxvdylcYi8udGVzdChwKSkgb3V0LndvcmtmbG93ID0gJ3NwZWxsLWVuZ2luZSc7CiAgZWxzZSBpZiAoLyg/Ol58XHMpKD86LXJ8LS1yZXNlYXJjaClcYi8udGVzdChwKSkgb3V0LndvcmtmbG93ID0gJ3Jlc2VhcmNoJzsKICBlbHNlIGlmICgvKD86XnxccykoPzotdHwtLXRpY2tldClcYi8udGVzdChwKSkgb3V0LndvcmtmbG93ID0gJ3RpY2tldCc7CiAgdmFyIGVwaWNCcmFuY2ggPSAvKD86XnxccyktLWVwaWMtYnJhbmNoXGIvLnRlc3QocCk7CgogIGlmICgvKD86XnxccyktLW5vLXNkZFxiLy50ZXN0KHApKSB7IG91dC5zZGQgPSBmYWxzZTsgb3V0LnNkZFNyYyA9ICdmbGFnJzsgfQogIGVsc2UgaWYgKC8oPzpefFxzKSg/Oi1zZHwtLXNkZClcYi8udGVzdChwKSkgeyBvdXQuc2RkID0gdHJ1ZTsgb3V0LnNkZFNyYyA9ICdmbGFnJzsgfQogIGVsc2UgaWYgKHNkZENvbmYuZGVmYXVsdCkgeyBvdXQuc2RkID0gdHJ1ZTsgb3V0LnNkZFNyYyA9ICdtb2Zsby55YW1sIHNkZC5kZWZhdWx0JzsgfQoKICBpZiAoLyg/Ol58XHMpLS1uby12ZXJpZnlcYi8udGVzdChwKSkgeyBvdXQudmVyaWZ5ID0gZmFsc2U7IG91dC52ZXJpZnlTcmMgPSAnZmxhZyc7IH0KICBlbHNlIGlmICgvKD86XnxccykoPzotdnwtLXZlcmlmeSlcYi8udGVzdChwKSkgeyBvdXQudmVyaWZ5ID0gdHJ1ZTsgb3V0LnZlcmlmeVNyYyA9ICdmbGFnJzsgfQogIGVsc2UgaWYgKCFjb25maWcudmVyaWZ5X2JlZm9yZV9kb25lKSB7IG91dC52ZXJpZnkgPSBmYWxzZTsgb3V0LnZlcmlmeVNyYyA9ICdtb2Zsby55YW1sIGdhdGVzLnZlcmlmeV9iZWZvcmVfZG9uZSc7IH0KICBlbHNlIHsgb3V0LnZlcmlmeSA9IHRydWU7IG91dC52ZXJpZnlTcmMgPSAnZGVmYXVsdCc7IH0KICAvLyAtLXNkZCBpbXBsaWVzIC0tdmVyaWZ5OiBhIHNwZWMvcGxhbiB3aXRob3V0IGFuIGVuZm9yY2VkIHZlcmlmeSBzdGVwIGRyaWZ0cy4KICBpZiAob3V0LnNkZCAmJiAhb3V0LnZlcmlmeSAmJiBvdXQudmVyaWZ5U3JjICE9PSAnZmxhZycpIG91dC52ZXJpZnkgPSB0cnVlOwoKICBpZiAoLyg/Ol58XHMpLS1uby1tZXJnZVxiLy50ZXN0KHApKSB7IG91dC5tZXJnZSA9IGZhbHNlOyBvdXQubWVyZ2VTcmMgPSAnZmxhZyc7IH0KICBlbHNlIGlmICgvKD86XnxccykoPzotbXwtLW1lcmdlKVxiLy50ZXN0KHApKSB7IG91dC5tZXJnZSA9IHRydWU7IG91dC5tZXJnZVNyYyA9ICdmbGFnJzsgfQogIGVsc2UgaWYgKG1lcmdlQ29uZi5hdXRvKSB7IG91dC5tZXJnZSA9IHRydWU7IG91dC5tZXJnZVNyYyA9ICdtb2Zsby55YW1sIG1lcmdlLmF1dG8nOyB9CgogIC8vIEFwcGxpY2FiaWxpdHk6IC10Ly1yIG5ldmVyIGltcGxlbWVudCwgc28gdmVyaWZ5IGlzIGEgbm8tb3AgdGhlcmU7IC1yIHByb2R1Y2VzCiAgLy8gbm8gYXJ0aWZhY3RzLCBzbyBzZGQgaXMgYSBuby1vcCB0b28gKGluIC10IHRoZSBzcGVjL3BsYW4gZ29lcyBJTlRPIHRoZSB0aWNrZXQsCiAgLy8gc28gc2RkIHN0YXlzIG9uKS4gT25seSBhIGZ1bGwgbm9uLWVwaWMtYnJhbmNoIHJ1biBvcGVucyBhIFBSIHRvIG1lcmdlLgogIC8vIFJlLWF0dHJpYnV0ZSBhbnl0aGluZyBhcHBsaWNhYmlsaXR5IHR1cm5lZCBvZmYsIHNvIGEgZmFsc2UgbmV2ZXIgY2FycmllcyB0aGUKICAvLyBzb3VyY2Ugb2YgdGhlIHZhbHVlIGl0IG5vIGxvbmdlciBoYXMuIFRoaXMgd2hvbGUgY2hhbmdlIGV4aXN0cyB0byBzdG9wIG1vZGVzCiAgLy8gYmVpbmcgcmVwb3J0ZWQgaW5hY2N1cmF0ZWx5IOKAlCB0aGUgYXR0cmlidXRpb24gaGFzIHRvIGJlIGhvbmVzdCB0b28uCiAgaWYgKG91dC53b3JrZmxvdyA9PT0gJ3RpY2tldCcgfHwgb3V0LndvcmtmbG93ID09PSAncmVzZWFyY2gnKSB7CiAgICBpZiAob3V0LnZlcmlmeSkgb3V0LnZlcmlmeVNyYyA9IG91dC53b3JrZmxvdyArICcgbW9kZSBkb2VzIG5vdCBpbXBsZW1lbnQnOwogICAgb3V0LnZlcmlmeSA9IGZhbHNlOwogIH0KICBpZiAob3V0LndvcmtmbG93ID09PSAncmVzZWFyY2gnIHx8IG91dC53b3JrZmxvdyA9PT0gJ3NwZWxsLWVuZ2luZScpIHsKICAgIGlmIChvdXQuc2RkKSBvdXQuc2RkU3JjID0gb3V0LndvcmtmbG93ICsgJyBtb2RlIHByb2R1Y2VzIG5vIHNwZWMgYXJ0aWZhY3RzJzsKICAgIG91dC5zZGQgPSBmYWxzZTsKICB9CiAgaWYgKG91dC53b3JrZmxvdyAhPT0gJ2Z1bGwnIHx8IGVwaWNCcmFuY2gpIHsKICAgIGlmIChvdXQubWVyZ2UpIG91dC5tZXJnZVNyYyA9IGVwaWNCcmFuY2ggPyAnLS1lcGljLWJyYW5jaCBvd25zIG1lcmdpbmcnIDogb3V0LndvcmtmbG93ICsgJyBtb2RlIG9wZW5zIG5vIFBSJzsKICAgIG91dC5tZXJnZSA9IGZhbHNlOwogIH0KICByZXR1cm4gb3V0Owp9CgovLyAjMTI5NyDigJQgYXJtIHRoZSBTREQgaW1wbGVtZW50IGdhdGUgZnJvbSB0aGUgdXNlciBwcm9tcHQuIFRoaW4gd3JhcHBlciBzbyB0aGUKLy8gYXJtaW5nIGRlY2lzaW9uIGFuZCB0aGUgYW5ub3VuY2VkIGRlY2lzaW9uIGNhbiBuZXZlciBkaXNhZ3JlZS4KZnVuY3Rpb24gZGV0ZWN0U2RkTW9kZShwcm9tcHRUZXh0KSB7CiAgcmV0dXJuIHJlc29sdmVGbG9SdW4ocHJvbXB0VGV4dCkuc2RkOwp9CgovLyBSZXNvbHZlIHRoZSBhYnNvbHV0ZSBzcGVjcyByb290IHRoZSBzYW1lIHdheSBUUyBzcGVjc1Jvb3QgZG9lcyAoIzEyOTQpOiBzcGxpdAovLyB0aGUgLy13cml0dGVuIGNvbmZpZyB2YWx1ZSBvbiBlaXRoZXIgc2VwYXJhdG9yLCByZWplY3QgYWJzb2x1dGUvYC4uYC1lc2NhcGluZwovLyB2YWx1ZXMsIGFuZCBmYWxsIGJhY2sgdG8gdGhlIGdpdGlnbm9yZWQgZGVmYXVsdC4gUnVsZSAjMTogbm8gc2VwYXJhdG9yIGhhcmRjb2RlZC4KZnVuY3Rpb24gc2RkU3BlY3NSb290QWJzKCkgewogIHZhciBjb25maWd1cmVkID0gKHNkZENvbmYuc3BlY3NEaXIgfHwgJy5tb2Zsby9zcGVjcycpOwogIHZhciBzZWdtZW50cyA9IGNvbmZpZ3VyZWQuc3BsaXQoL1tcXC9dKy8pLmZpbHRlcihCb29sZWFuKTsKICB2YXIgZXNjYXBlcyA9IHNlZ21lbnRzLmxlbmd0aCA9PT0gMAogICAgfHwgc2VnbWVudHMuaW5kZXhPZignLi4nKSA+PSAwCiAgICB8fCAvXihbYS16QS1aXTp8fikkLy50ZXN0KHNlZ21lbnRzWzBdKQogICAgfHwgY29uZmlndXJlZC5jaGFyQXQoMCkgPT09ICcvJwogICAgfHwgY29uZmlndXJlZC5jaGFyQXQoMCkgPT09ICdcXCc7CiAgaWYgKGVzY2FwZXMpIHJldHVybiBwYXRoLmpvaW4oUFJPSkVDVF9ESVIsICcubW9mbG8nLCAnc3BlY3MnKTsKICByZXR1cm4gcGF0aC5qb2luLmFwcGx5KHBhdGgsIFtQUk9KRUNUX0RJUl0uY29uY2F0KHNlZ21lbnRzKSk7Cn0KCi8vIElzIHRoZSBlZGl0ZWQgcGF0aCBpbnNpZGUgdGhlIHNwZWNzIGRpcj8gRWRpdGluZyBzcGVjLm1kL3BsYW4ubWQgdGhlbXNlbHZlcyBtdXN0Ci8vIG5ldmVyIHRyaXAgdGhlIGltcGxlbWVudCBnYXRlLiBDb21wYXJlcyByZXNvbHZlZCBhYnNvbHV0ZSBwYXRocyAoUnVsZSAjMTogdGhlCi8vIGVkaXQgcGF0aCBtYXkgYmUgcmVsYXRpdmUgb3IgYWJzb2x1dGU7IG5vcm1hbGl6ZSBib3RoIGJlZm9yZSB0aGUgcHJlZml4IHRlc3QpLgpmdW5jdGlvbiBpc0luc2lkZVNwZWNzRGlyKGZpbGVQYXRoKSB7CiAgdHJ5IHsKICAgIHZhciByb290ID0gc2RkU3BlY3NSb290QWJzKCk7CiAgICB2YXIgYWJzID0gcGF0aC5pc0Fic29sdXRlKGZpbGVQYXRoKSA/IGZpbGVQYXRoIDogcGF0aC5yZXNvbHZlKFBST0pFQ1RfRElSLCBmaWxlUGF0aCk7CiAgICB2YXIgcmVsID0gcGF0aC5yZWxhdGl2ZShyb290LCBhYnMpOwogICAgcmV0dXJuIHJlbCA9PT0gJycgfHwgKCFyZWwuc3RhcnRzV2l0aCgnLi4nKSAmJiAhcGF0aC5pc0Fic29sdXRlKHJlbCkpOwogIH0gY2F0Y2ggKGUpIHsgcmV0dXJuIGZhbHNlOyB9Cn0KCi8vIFJlYWQgcGxhbi5tZCBmcm9udG1hdHRlciBmb3IgdGhlIGFjdGl2ZSBzbHVnIGFuZCByZXBvcnQgd2hldGhlciBpdCBpcyByZXZpZXdlZC4KLy8gUHVyZSBmcyArIHJlZ2V4IChubyBzcGF3bikgc28gaXQgc3RheXMgY2hlYXAgb24gZXZlcnkgV3JpdGUvRWRpdC4gTWF0Y2hlcyB0aGUKLy8gZG91YmxlLXF1b3RlZCBzY2FsYXIgc2VyaWFsaXplQXJ0aWZhY3QgZW1pdHMgKGBzdGF0dXM6ICJyZXZpZXdlZCJgKS4KZnVuY3Rpb24gaXNQbGFuUmV2aWV3ZWQoc2x1ZykgewogIHRyeSB7CiAgICB2YXIgcGxhblBhdGggPSBwYXRoLmpvaW4oc2RkU3BlY3NSb290QWJzKCksIHNsdWcsICdwbGFuLm1kJyk7CiAgICBpZiAoIWZzLmV4aXN0c1N5bmMocGxhblBhdGgpKSByZXR1cm4gZmFsc2U7CiAgICB2YXIgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhwbGFuUGF0aCwgJ3V0Zi04JykucmVwbGFjZSgvXHJcbi9nLCAnXG4nKTsKICAgIHZhciBmbSA9IGNvbnRlbnQubWF0Y2goL14tLS1cbihbXHNcU10qPylcbi0tLS8pOwogICAgaWYgKCFmbSkgcmV0dXJuIGZhbHNlOwogICAgcmV0dXJuIC9eXHMqc3RhdHVzOlxzKlsiJ10/cmV2aWV3ZWRbIiddP1xzKiQvaW0udGVzdChmbVsxXSk7CiAgfSBjYXRjaCAoZSkgeyByZXR1cm4gZmFsc2U7IH0KfQoKZnVuY3Rpb24gY2xhc3NpZnlOYW1lc3BhY2VIaW50KHByb21wdFRleHQpIHsKICB2YXIgbG93ZXIgPSAocHJvbXB0VGV4dCB8fCAnJykudG9Mb3dlckNhc2UoKTsKICBpZiAoTlNfVEVTVF9SRS50ZXN0KGxvd2VyKSkgcmV0dXJuICdNZW1vcnkgbmFtZXNwYWNlIGhpbnQ6IHVzZSAidGVzdHMiIGZvciB0ZXN0IGludmVudG9yeSBhbmQgY292ZXJhZ2UgbG9va3Vwcy4nOwogIGlmIChOU19MRUFSTklOR1NfUkUudGVzdChsb3dlcikpIHJldHVybiAnTWVtb3J5IG5hbWVzcGFjZSBoaW50OiB1c2UgImxlYXJuaW5ncyIgZm9yIHVzZXItZGlyZWN0ZWQgZGVjaXNpb25zIGFuZCBkaXN0aWxsZWQgaW5zaWdodHMuJzsKICBmb3IgKHZhciBpID0gMDsgaSA8IE5TX0VYUExJQ0lULmxlbmd0aDsgaSsrKSB7CiAgICBpZiAoTlNfRVhQTElDSVRbaV0ucGF0dGVybi50ZXN0KGxvd2VyKSkgcmV0dXJuICdNZW1vcnkgbmFtZXNwYWNlIGhpbnQ6IHVzZSAiJyArIE5TX0VYUExJQ0lUW2ldLm5zICsgJyIgZm9yICcgKyBOU19FWFBMSUNJVFtpXS5sYWJlbCArICcuJzsKICB9CiAgZm9yICh2YXIgaiA9IDA7IGogPCBOU19ET01BSU5fUkVTLmxlbmd0aDsgaisrKSB7CiAgICBpZiAoTlNfRE9NQUlOX1JFU1tqXS50ZXN0KGxvd2VyKSkgcmV0dXJuICdNZW1vcnkgbmFtZXNwYWNlIGhpbnQ6IHNlYXJjaCAiZ3VpZGFuY2UiIGFuZCAibGVhcm5pbmdzIiBmb3IgZG9tYWluIHJ1bGVzIGFuZCBwcm9qZWN0IGRlY2lzaW9ucy4nOwogIH0KICBmb3IgKHZhciBrID0gMDsgayA8IE5TX1BBVFRFUk5fUkVTLmxlbmd0aDsgaysrKSB7CiAgICBpZiAoTlNfUEFUVEVSTl9SRVNba10udGVzdChsb3dlcikpIHJldHVybiAnTWVtb3J5IG5hbWVzcGFjZSBoaW50OiB1c2UgInBhdHRlcm5zIiBmb3IgY29kZSBwYXR0ZXJucyBhbmQgY29udmVudGlvbnMuJzsKICB9CiAgZm9yICh2YXIgbSA9IDA7IG0gPCBOU19OQVZfUkVTLmxlbmd0aDsgbSsrKSB7CiAgICBpZiAoTlNfTkFWX1JFU1ttXS50ZXN0KGxvd2VyKSkgcmV0dXJuICdNZW1vcnkgbmFtZXNwYWNlIGhpbnQ6IHVzZSAiY29kZS1tYXAiIGZvciBjb2RlYmFzZSBuYXZpZ2F0aW9uLic7CiAgfQogIHJldHVybiAnJzsKfQoKLy8gIzExMzIg4oCUIGNvbW1hbmQtc2hhcGUgbmFtZXNwYWNlIGNsYXNzaWZpZXIgZm9yIHRoZSBiYXNoLUJMT0NLIG1lc3NhZ2UuCi8vIFVzZWQgd2hlbiB0aGUgcHJvbXB0LWRlcml2ZWQgYGxhc3ROYW1lc3BhY2VIaW50YCBpcyBlbXB0eSAoZS5nLiBzdWJhZ2VudHMsCi8vIHdoaWNoIG5ldmVyIHNlZSB0aGUgdXNlciBwcm9tcHQpIHNvIHRoZSBibG9jayBtZXNzYWdlIHN0aWxsIHJvdXRlcyB0byBhCi8vIHVzZWZ1bCBuYW1lc3BhY2UgcmF0aGVyIHRoYW4gdGhlIGdlbmVyaWMgInBpY2sgb25lIG9mIGZpdmUiIGxpc3QuIFJldHVybnMgYQovLyBmdWxsIHNlbnRlbmNlIGluIHRoZSBzYW1lIHNoYXBlIGFzIGNsYXNzaWZ5TmFtZXNwYWNlSGludCBzbyB0aGUgQkxPQ0sgYXJtCi8vIGNhbiB3cml0ZSBlaXRoZXIgc291cmNlJ3MgaGludCB3aXRob3V0IGJyYW5jaGluZyBvbiBmb3JtYXQuCi8vCi8vIFRoaXMgZmlsZSBpcyB0aGUgc2luZ2xlIHNvdXJjZSDigJQgc2VlIHRoZSBub3RlIG9uIGRldGVjdEZsTW9kZSBhYm92ZSAoIzE0NDMpLgpmdW5jdGlvbiBjbGFzc2lmeUJhc2hOYW1lc3BhY2VIaW50KGNtZCkgewogIC8vIFNlYXJjaC1saWtlIHRvb2xzIOKAlCB0aGUgdXNlciBpcyBodW50aW5nIGZvciBhIHN5bWJvbC9maWxlLCBjb2RlLW1hcCB3aW5zLgogIC8vICMxNDQ1IOKAlCBgZ2l0IGdyZXBgIC8gYGdpdCBscy1maWxlc2AgYXJlIHRoZSBzYW1lIGh1bnQgdGhyb3VnaCBhIGRpZmZlcmVudAogIC8vIGJpbmFyeSwgc28gdGhleSByb3V0ZSB0byB0aGUgc2FtZSBuYW1lc3BhY2UgcmF0aGVyIHRoYW4gZmFsbGluZyB0aHJvdWdoIHRvCiAgLy8gdGhlIGhpbnRsZXNzIGdlbmVyaWMgbWVzc2FnZS4KICBpZiAoL15ccyooPzpncmVwfHJnfGFnfGZncmVwfGVncmVwfGZpbmR8ZmR8U2VsZWN0LVN0cmluZ3xzbHMpXGIvaS50ZXN0KGNtZCkKICAgfHwgL15ccypnaXRccysoPzpncmVwfGxzLWZpbGVzKVxiL2kudGVzdChjbWQpKSB7CiAgICByZXR1cm4gJ01lbW9yeSBuYW1lc3BhY2UgaGludDogdXNlICJjb2RlLW1hcCIgZm9yIGNvZGViYXNlIG5hdmlnYXRpb24uJzsKICB9CiAgLy8gUmVhZGluZyBhIC5tZCAvIFJTVCAvIFRYVCwgb3IgYSB3ZWxsLWtub3duIGRvYyBmaWxlIOKAlCBndWlkYW5jZS9sZWFybmluZ3Mgd2luLgogIC8vIGAuKmAgKG5vdCBgXFMqYCkgc28gZmxhZy1wcmVmaXhlZCBmb3JtcyBsaWtlIGBoZWFkIC01MCBSRUFETUUubWRgIG1hdGNoLgogIC8vIEFuY2hvcmVkIG9uIHRoZSBsZWFkaW5nIHJlYWRlciBzbyBhIHBpcGVkIGBjbWQgfCBncmVwIGZvby5tZGAgZG9lc24ndCB0cmlwLgogIGlmICgvXlxzKig/OmNhdHxoZWFkfHRhaWx8bGVzc3xtb3JlfGJhdHx0eXBlfEdldC1Db250ZW50fGdjKVxiLipcLig/Om1kfG1keHxyc3R8dHh0KVxiL2kudGVzdChjbWQpCiAgIHx8IC9eXHMqKD86Y2F0fGhlYWR8dGFpbHxsZXNzfG1vcmV8YmF0fHR5cGV8R2V0LUNvbnRlbnR8Z2MpXGIuKlxiKD86UkVBRE1FfENMQVVERXxDSEFOR0VMT0d8Q09OVFJJQlVUSU5HfExJQ0VOU0UpXGIvaS50ZXN0KGNtZCkpIHsKICAgIHJldHVybiAnTWVtb3J5IG5hbWVzcGFjZSBoaW50OiBzZWFyY2ggImd1aWRhbmNlIiBhbmQgImxlYXJuaW5ncyIgZm9yIHByb2plY3QgcnVsZXMgYW5kIGRlY2lzaW9ucy4nOwogIH0KICByZXR1cm4gJyc7Cn0KCi8vIEFwcGx5IHBlci1wcm9tcHQgc3RhdGUgcmVzZXQgc2hhcmVkIGJ5IGBwcm9tcHQtcmVtaW5kZXJgIChmdWxsKSBhbmQKLy8gYHByb21wdC1zdGF0ZS1yZXNldGAgKGRlZmVuc2l2ZSBzYWZldHktbmV0LCBubyBlbWlzc2lvbikuIElkZW1wb3RlbnQg4oCUIGJvdGgKLy8gVXNlclByb21wdFN1Ym1pdCBob29rcyBjYW4gcnVuIGl0IHdpdGhvdXQgY29tcG91bmRpbmcgYW55IGZpZWxkLiBDYWxsZXIKLy8gb3ducyBpbnRlcmFjdGlvbkNvdW50IGFuZCB0aGUgdXNlci12aXNpYmxlIFJFTUlOREVSL0NvbnRleHQgZW1pc3Npb25zLCBzbwovLyB0aGlzIGhlbHBlciBzdGF5cyBzaWxlbnQuCmZ1bmN0aW9uIGFwcGx5UHJvbXB0U3RhdGVSZXNldChzdGF0ZSwgcHJvbXB0VGV4dCwgb3B0cykgewogIC8vICMzNTIvIzEzMzEg4oCUIHRoaXMgaXMgdGhlIE9OTFkgcGxhY2UgdGhlIG1lbW9yeSBnYXRlIHJlc2V0cy4gRGVsaWJlcmF0ZWx5CiAgLy8gTk9UIG9uIHRhc2sgdHJhbnNpdGlvbnM6IHdpdGhpbiBhIHNpbmdsZSBwcm9tcHQgKGUuZy4gYSAvZmxvIHdvcmtmbG93KQogIC8vIG1lbW9yeSBzdGF5cyBzZWFyY2hlZCBzbyBSZWFkL0dyZXAgYXJlbid0IGJsb2NrZWQgbWlkLWV4ZWN1dGlvbi4gQQogIC8vIGBUYXNrVXBkYXRlYC1kcml2ZW4gcmVzZXQgd291bGQgcmUtYmxvY2sgdGhlIGFnZW50IGhhbGZ3YXkgdGhyb3VnaCBpdHMgb3duCiAgLy8gd29ya2Zsb3cuIFRoZSByYXRpb25hbGUgdXNlZCB0byBsaXZlIG9uIHRoZSBgY2hlY2stdGFzay10cmFuc2l0aW9uYCBjYXNlLAogIC8vIHdoaWNoIGlzIHdoeSB0aGF0IGNhc2UgaXMgYW4gZW1wdHkgbm8tb3A7ICMxMzMxIHVud2lyZWQgdGhlIGhvb2sgYW5kIG1vdmVkCiAgLy8gdGhlIHJlYXNvbmluZyBoZXJlLCB3aGVyZSB0aGUgcmVzZXQgaXQgZGVzY3JpYmVzIGFjdHVhbGx5IGhhcHBlbnMuCiAgc3RhdGUubWVtb3J5U2VhcmNoZWQgPSBmYWxzZTsKICAvLyBXaXBlIHBlci1hY3RvciBtZW1vcnkgdHJhY2tpbmcgdG9vIOKAlCBhIG5ldyB1c2VyIHByb21wdCBpcyBhIGZyZXNoIHdpbmRvdwogIC8vIGZvciBib3RoIHBhcmVudCBBTkQgYW55IHN1YmFnZW50cyB0aGUgcGFyZW50IG1heSBzcGF3biBkdXJpbmcgdGhpcyB0dXJuLgogIHN0YXRlLm1lbW9yeVNlYXJjaGVkQnkgPSB7fTsKICAvLyBsZWFybmluZ3NTdG9yZWQgaXMgc2Vzc2lvbi1zY29wZWQg4oCUIG9uY2Ugc3RvcmVkLCBpdCBzdGF5cyB0cnVlIHVudGlsIHNlc3Npb24gcmVzZXQuCiAgLy8gUmVzZXR0aW5nIHBlci1wcm9tcHQgY2F1c2VkIGZhbHNlIGJsb2NrcyB3aGVuIFBSIGNyZWF0aW9uIHdhcyBvbiBhIGxhdGVyIHByb21wdC4KICAvLyAjMTQ0NyDigJQgYXJtIGJ5IERFRkFVTFQ7IGV4ZW1wdCBvbmx5IHByb21wdHMgdGhhdCBjYXJyeSBubyBzdWJqZWN0IG9mIHRoZWlyCiAgLy8gb3duLiBUaGlzIHJlcGxhY2VzIGBUQVNLX1JFLnRlc3QocCkgfHwgcC5sZW5ndGggPiAyMGAsIHdob3NlIGxlbmd0aCBjbGlmZgogIC8vIHdhcyBhcmJpdHJhcnkgYW5kIGludmlzaWJsZTogIm5vdyBsb29rIGF0IHRoZSBkYWVtb24iICgyMikgYXJtZWQgdGhlIGdhdGUKICAvLyBhbmQgImNoZWNrIHRoZSBkYWVtb24iICgxNikgZGlkIG5vdCwgd2hpY2ggaXMgbW9zdCBvZiB3aHkgdGhlIGdhdGUgZmVsdAogIC8vIGxpa2UgaXQgZmlyZWQgYXQgcmFuZG9tLiBNZW1vcnktZmlyc3QgaXMgdGhpcyBwcm9qZWN0J3MgZmlyc3QgcnVsZSwgc28gdGhlCiAgLy8gZGVmYXVsdCBoYXMgdG8gYmUgInNlYXJjaCIsIHdpdGggY29udGludWF0aW9ucyBhcyB0aGUgY2FydmUtb3V0IOKAlCBub3QgdGhlCiAgLy8gcmV2ZXJzZS4gVGhlIHBlci1wcm9tcHQgbGF0Y2ggYm91bmRzIHRoZSBjb3N0IGF0IG9uZSBzZWFyY2ggcGVyIG5ldyBwcm9tcHQuCiAgLy8KICAvLyBgb3B0cy5za2lwQXJtaW5nYCBzcGxpdHMgdGhlIHJlc2V0IGluIHR3by4gSW52YWxpZGF0aW5nIHRoZSBjcmVkaXRzIGFib3ZlCiAgLy8gaXMgcHJvbXB0LUlOREVQRU5ERU5UIGFuZCBhbHdheXMgY29ycmVjdDsgZGVjaWRpbmcgd2hldGhlciB0aGlzIHByb21wdAogIC8vIG5lZWRzIGEgc2VhcmNoIGlzIG5vdCwgYW5kIGEgY2FsbGVyIGhvbGRpbmcgbm8gcHJvbXB0IHRleHQgbXVzdCBub3QgZGVjaWRlCiAgLy8gaXQgZnJvbSBub3RoaW5nLiBTa2lwcGluZyB0aGUgd2hvbGUgcmVzZXQgaW5zdGVhZCB3b3VsZCBiZSB3b3JzZSB0aGFuCiAgLy8gZWl0aGVyOiBgbWVtb3J5U2VhcmNoZWRCeWAgd291bGQgc3Vydml2ZSwgYW5kIGEgc3RhbGUgcGVyLWFjdG9yIGNyZWRpdCBmcm9tCiAgLy8gdGhlIHByZXZpb3VzIHByb21wdCB3b3VsZCBzYXRpc2Z5IHRoZSBnYXRlIGZvciBhIHByb21wdCBpdCBuZXZlciBzYXcuCiAgaWYgKCEob3B0cyAmJiBvcHRzLnNraXBBcm1pbmcpKSB7CiAgICB2YXIgZXNjYXBlZCA9IC9eQEBccyovLnRlc3QocHJvbXB0VGV4dCB8fCAnJyk7CiAgICBzdGF0ZS5tZW1vcnlSZXF1aXJlZCA9ICFlc2NhcGVkICYmICFpc0NvbnRpbnVhdGlvblByb21wdChwcm9tcHRUZXh0KTsKICB9CiAgLy8gU3Rhc2ggbmFtZXNwYWNlIGhpbnQgZm9yIGNoZWNrLWJlZm9yZS1hZ2VudCB0byBlbWl0IHdoZW4gQ2xhdWRlIGFjdHVhbGx5CiAgLy8gc3Bhd25zIGFuIEFnZW50ICgjOTMxKS4gRW1wdHkgc3RyaW5nIHdoZW4gbm90aGluZyBtYXRjaGVkIOKAlCBvdmVyd3JpdGluZwogIC8vIGFueSBzdGFsZSB2YWx1ZSBmcm9tIHRoZSBwcmV2aW91cyBwcm9tcHQuCiAgc3RhdGUubGFzdE5hbWVzcGFjZUhpbnQgPSBjbGFzc2lmeU5hbWVzcGFjZUhpbnQocHJvbXB0VGV4dCk7CiAgLy8gUGVyLWFjdG9yIGVtaXNzaW9uIHRyYWNraW5nIOKAlCBlYWNoIHN1YmFnZW50J3Mgc2Vzc2lvbiBnZXRzIHRoZSBoaW50IGF0CiAgLy8gbW9zdCBvbmNlIHBlciBwcm9tcHQsIGJ1dCBhIGZyZXNoIHByb21wdCByZXNldHMgZXZlcnkgYWN0b3IncyB3aW5kb3cgc28KICAvLyBzdWJzZXF1ZW50IGFnZW50cyAocGFyZW50ICsgc3ViYWdlbnRzIHRoYXQgc3Bhd24gdGhlaXIgb3duIGFnZW50cykgYWxsCiAgLy8gc2VlIHRoZSBuZXcgY2xhc3NpZmljYXRpb24gb24gdGhlaXIgZmlyc3QgY2hlY2stYmVmb3JlLWFnZW50LgogIHN0YXRlLmxhc3ROYW1lc3BhY2VIaW50RW1pdHRlZEJ5ID0ge307CiAgLy8gIzk1MiDigJQgZGVyaXZlIGZsTW9kZSBmcm9tIHRoZSB1c2VyIHByb21wdCwgYW5kIHJlc2V0IHRoZSBtYXRjaGluZyBpbml0CiAgLy8gZmxhZy4gRWFjaCAvZmwgaW52b2NhdGlvbiBtdXN0IGNhbGwgaXRzIHByb3RlY3RlZCBNQ1AgaW5pdDsgdGhlIHByZXZpb3VzCiAgLy8gcHJvbXB0J3Mgc3dhcm0vaGl2ZSByZWdpc3RyYXRpb24gZG9lcyBub3Qgc2F0aXNmeSB0aGlzIHByb21wdCdzIGdhdGUuCiAgc3RhdGUuZmxNb2RlID0gZGV0ZWN0RmxNb2RlKHByb21wdFRleHQpOwogIHN0YXRlLnN3YXJtSW5pdGlhbGl6ZWQgPSBmYWxzZTsKICBzdGF0ZS5oaXZlSW5pdGlhbGl6ZWQgPSBmYWxzZTsKICAvLyAjMTI5NyDigJQgYXJtL2Rpc2FybSB0aGUgU0REIGltcGxlbWVudCBnYXRlIHBlciBwcm9tcHQuIEEgZnJlc2ggL2ZsbyBydW4gc3RhcnRzCiAgLy8gd2l0aCBubyBhY3RpdmUgc2x1ZzsgYGZsbyBzZGQgc3BlY2Agc3RhbXBzIGFjdGl2ZVNkZFNsdWcgZHVyaW5nIHRoZSBydW4uCiAgc3RhdGUuc2RkTW9kZSA9IGRldGVjdFNkZE1vZGUocHJvbXB0VGV4dCk7CiAgc3RhdGUuYWN0aXZlU2RkU2x1ZyA9IG51bGw7Cn0KLy8gTWF0Y2ggbnBtL3lhcm4vcG5wbS9idW4gdGVzdCwgbnB4IHZpdGVzdHxqZXN0fC4uLiwgYmFyZSBydW5uZXJzIGF0IGNvbW1hbmQtc3RhcnQgb25seSwKLy8gYW5kIGxhbmd1YWdlLW5hdGl2ZSB0ZXN0IGNvbW1hbmRzLiBUaGUgYmFyZS1ydW5uZXIgYXJtIGlzIGFuY2hvcmVkIHNvIHRoYXQKLy8gYG5wbSBpbnN0YWxsIGplc3RgLCBgZ3JlcCAtciB2aXRlc3Qgc3JjL2AsIGFuZCBzaW1pbGFyIGRvbid0IGZhbHNlLXBvc2l0aXZlLgp2YXIgVEVTVF9SVU5ORVJfUkUgPSAvKD86XnxbXmEtel0pKD86bnBtfHlhcm58cG5wbXxidW4pXHMrKD86cnVuXHMrKT8oPzp0ZXN0fHQpKD86Wzpcc118JCl8XGIoPzpucHh8cG5weClccysoPzp2aXRlc3R8amVzdHxtb2NoYXxhdmF8dGFwfGphc21pbmV8cHl0ZXN0KVxifCg/Ol58O3wmJnxcfFx8KVxzKig/OnZpdGVzdHxqZXN0fHB5dGVzdHxtb2NoYXxqYXNtaW5lfHRhcHxhdmEpXHN8XGIoPzpjYXJnb3xnb3xkZW5vfGRvdG5ldHxtdm4pXHMrdGVzdFxifFxiZ3JhZGxlXHcqXHMrdGVzdFxiL2k7Ci8vICMxMzIyIOKAlCBmYWlsdXJlIG1hcmtlcnMgaW4gYSB0ZXN0IHJ1bm5lcidzIG93biBPVVRQVVQuCi8vCi8vIFRoaXMgaXMgZGVsaWJlcmF0ZWx5IG5vdCBhbiBleGl0LWNvZGUgY2hlY2s6IENsYXVkZSBDb2RlJ3MgUG9zdFRvb2xVc2UgcGF5bG9hZAovLyBjYXJyaWVzIG5vIGV4aXQgc3RhdHVzLCBhbmQgUG9zdFRvb2xVc2UgZG9lcyBub3QgZmlyZSBhdCBhbGwgd2hlbiBhIGNvbW1hbmQKLy8gZXhpdHMgbm9uLXplcm8g4oCUIHNvIGFuIHVubWFza2VkIHJlZCBzdWl0ZSBhbHJlYWR5IGxlYXZlcyB0ZXN0c1J1biBmYWxzZSwgYnkKLy8gYWNjaWRlbnQgb2YgdGhlIGhvb2sgbGlmZWN5Y2xlIHJhdGhlciB0aGFuIGJ5IGRlc2lnbi4gV2hhdCBET0VTIGRlZmVhdCB0aGUKLy8gZ2F0ZSBpcyBhIG1hc2tlZCBleGl0IChgbnBtIHRlc3QgfCB0YWlsIC0yMGAsIGBucG0gdGVzdCB8fCB0cnVlYCwKLy8gYG5wbSB0ZXN0IDI+JjEgfCBncmVwIC1pIGZhaWxgKTogdGhlIHBpcGVsaW5lIGV4aXRzIDAsIFBvc3RUb29sVXNlIGZpcmVzIHdpdGgKLy8gYSBjbGVhbi1sb29raW5nIHJlc3BvbnNlLCBhbmQgYSByZWQgc3VpdGUgY3JlZGl0cyB0aGUgZ2F0ZS4gT3V0cHV0IGlzIHRoZSBvbmx5Ci8vIHNpZ25hbCBsZWZ0LCBhbmQgaXQgaXMgZ2VudWluZWx5IHdlYWtlciB0aGFuIGEgc3RhdHVzIOKAlCBzZWUgdGhlIHRpY2tldC4KLy8KLy8gRXZlcnkgYXJtIG1hdGNoZXMgYSBTVU1NQVJZIHNoYXBlIGEgcnVubmVyIGVtaXRzLCBuZXZlciBhIGJhcmUgImZhaWwiLCB3aGljaAovLyBvY2N1cnMgY29uc3RhbnRseSBpbiBvcmRpbmFyeSBwYXNzaW5nIHRlc3QgbmFtZXMgKCJyZXR1cm5zIG51bGwgd2hlbiB0aGUKLy8gbG9va3VwIGZhaWxlZCIpLiBUaGUgY291bnQgYXJtIGV4Y2x1ZGVzIGFuIGV4cGxpY2l0IHplcm8gc28gamVzdCdzCi8vIGAwIGZhaWxlZCwgMTIgcGFzc2VkYCBjYW5ub3Qgc2VsZi1ibG9jay4KLy8KLy8gVGhlIGNvdW50IGFybSdzIHRyYWlsaW5nIGxvb2thaGVhZCBpcyB3aGF0IGtlZXBzIGEgR1JFRU4gcnVuIGZyb20gYmxvY2tpbmcKLy8gaXRzZWxmLiBNb2NoYSdzIGRlZmF1bHQgc3BlYyByZXBvcnRlciBwcmludHMgZXZlcnkgcGFzc2luZyB0ZXN0IG5hbWUsIHNvCi8vIGBucG0gdGVzdCB8IHRhaWwgLTIwYCBvbiBhIGdyZWVuIHN1aXRlIGxlZ2l0aW1hdGVseSBjb250YWlucyBsaW5lcyBsaWtlCi8vIGDinJMgaGFuZGxlcyAyIGZhaWxlZCByZXRyaWVzYC4gQSByZWFsIHN1bW1hcnkgaXMgZm9sbG93ZWQgYnkgYSBkZWxpbWl0ZXIgb3IgYQovLyBsaW5lIGVuZCAoYDMgZmFpbGVkIHwgNDAgcGFzc2VkYCwgYDEgZmFpbGVkLCAyIHBhc3NlZGAsIGAxIGZhaWxpbmdgKSwgbmV2ZXIgYnkKLy8gbW9yZSBwcm9zZSDigJQgc28gYSBsb3dlcmNhc2Ugd29yZCBhZnRlciB0aGUgY291bnQgbWVhbnMgaXQgaXMgYSBzZW50ZW5jZSwgbm90IGEKLy8gdGFsbHkuIGB0ZXN0c2AvYHRlc3RgIGlzIGV4ZW1wdGVkIGJlY2F1c2UgYDIgZmFpbGVkIHRlc3RzYCBpcyBhIHJlYWwgc3VtbWFyeS4KLy8gU2FtZS1saW5lIHdoaXRlc3BhY2Ugb25seTogYXQgYSBsaW5lIGVuZCB0aGVyZSBpcyBub3RoaW5nIHRvIGRpc3F1YWxpZnkuCnZhciBURVNUX0ZBSUxVUkVfUkUgPSBuZXcgUmVnRXhwKFsKICAnXFxiKD8hMFxcYilcXGQrXFxzKyg/OnRlc3RzP1xccyspPyg/OmZhaWxlZHxmYWlsaW5nfGZhaWx1cmVzPylcXGIoPyFbXlxcU1xcbl0rKD8hdGVzdHM/XFxiKVthLXpdKScsIC8vIHZpdGVzdC9qZXN0L3B5dGVzdC9tb2NoYSBjb3VudHMKICAnXlxccyooPzpGQUlMfEZBSUxFRClcXGInLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHZpdGVzdCArIGplc3QgcGVyLWZpbGUsIHB5dGVzdCBGQUlMRUQKICAnXlxccyotLS1cXHMqRkFJTDonLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdvIHRlc3QKICAnXFxidGVzdCByZXN1bHQ6XFxzKkZBSUxFRFxcYicsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhcmdvCiAgJ15ucG0gRVJSIScsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBucG0gd3JhcHBlciBhcm91bmQgYW55IG9mIHRoZSBhYm92ZQpdLmpvaW4oJ3wnKSwgJ2ltJyk7CgovKioKICogIzEzMjIg4oCUIHdoeSBhIGp1c3QtZmlyZWQgcmVjb3JkLXRlc3QtcnVuIG11c3QgTk9UIGJlIGNyZWRpdGVkLCBvciBudWxsLgogKgogKiBBYnNlbnQgb3V0cHV0IGlzIG5vdCBldmlkZW5jZSBvZiBmYWlsdXJlOiBhIHF1aWV0IGdyZWVuIGBucG0gdGVzdCA+IC9kZXYvbnVsbGAKICogYW5kIGEgc2lsZW50bHktbWFza2VkIHJlZCBvbmUgYXJlIGluZGlzdGluZ3Vpc2hhYmxlLCBhbmQgdHJlYXRpbmcgdGhlIHBhaXIgYXMKICogZmFpbHVyZXMgd291bGQgYmxvY2sgZXZlcnkgY29uc3VtZXIgd2hvIHJlZGlyZWN0cyB0ZXN0IG91dHB1dC4gQWJzZW50IG1lYW5zCiAqIHVua25vd24sIGFuZCB1bmtub3duIGtlZXBzIHRoZSBwcmUtIzEzMjIgYmVoYXZpb3VyLgogKi8KZnVuY3Rpb24gZGV0ZWN0VGVzdEZhaWx1cmUoKSB7CiAgaWYgKHByb2Nlc3MuZW52LlRPT0xfUkVTUE9OU0VfaW50ZXJydXB0ZWQgPT09ICd0cnVlJykgcmV0dXJuICd0aGUgcnVuIHdhcyBpbnRlcnJ1cHRlZCc7CiAgdmFyIG91dCA9IChwcm9jZXNzLmVudi5UT09MX1JFU1BPTlNFX3N0ZG91dCB8fCAnJykgKyAnXG4nICsgKHByb2Nlc3MuZW52LlRPT0xfUkVTUE9OU0Vfc3RkZXJyIHx8ICcnKTsKICBpZiAoIW91dC50cmltKCkpIHJldHVybiBudWxsOwogIHZhciBoaXQgPSBvdXQubWF0Y2goVEVTVF9GQUlMVVJFX1JFKTsKICByZXR1cm4gaGl0ID8gJ291dHB1dCByZXBvcnRzICInICsgaGl0WzBdLnRyaW0oKS5zbGljZSgwLCA0MCkgKyAnIicgOiBudWxsOwp9Ci8vIEVkaXRzIHRvIHRoZXNlIGRvbid0IGNoYW5nZSBydW50aW1lIGJlaGF2aW91ciwgc28gdGhleSBkb24ndCBpbnZhbGlkYXRlIHByaW9yIHRlc3Qvc2ltcGxpZnkgcnVucy4KLy8gTG9jayBmaWxlcyBhbmQgLmdpdGlnbm9yZSBhcmUgdHJhY2tlZCBidXQgaW5lcnQ7IHBhY2thZ2UuanNvbi8qLnlhbWwgQVJFIHNvdXJjZSDigJQgdGhleSByZXNldC4KdmFyIEVESVRfUkVTRVRfU0tJUF9CT1RIX1JFID0gL1wuKG1kfG1hcmtkb3dufHR4dHxyc3R8YWRvY3xsb2NrfGdpdGlnbm9yZSkkfCg/Ol58W1xcXC9dKShDSEFOR0VMT0coPzpcLm1kKT98XC5lbnZcLmV4YW1wbGV8cGFja2FnZS1sb2NrXC5qc29ufHBucG0tbG9ja1wueWFtbHx5YXJuXC5sb2NrfGJ1blwubG9ja2IpJC9pOwovLyAjMTE3NiDigJQgcGF0aC1iYXNlZCBpbmVydCBtYXJrZXJzLiBUaGUgZXh0ZW5zaW9uLWJhc2VkIFJFIGFib3ZlIGNhbid0IGNvdmVyCi8vIGAuZ2l0aHViL3dvcmtmbG93cy8qLnltbGAgd2l0aG91dCBhbHNvIGV4ZW1wdGluZyBgbW9mbG8ueWFtbGAgLyBgdHNjb25maWcueWFtbGAKLy8gKHdoaWNoIEFSRSBzb3VyY2UpLiBBbmNob3Igb24gdGhlIEdpdEh1Yi1tZXRhIGRpcmVjdG9yaWVzIHRoYXQgaG9sZCBDSSBjb25maWcKLy8gYW5kIHRlbXBsYXRlIHNjYWZmb2xkcyDigJQgZWRpdGluZyB0aG9zZSBkb2Vzbid0IGV4cG9zZSBuZXcgcnVudGltZSBzdXJmYWNlLCBzbwovLyB0aGV5IHNob3VsZG4ndCByZXNldCB0ZXN0c1J1bi9zaW1wbGlmeVJ1biB0aGUgd2F5IGEgcmVhbCBzb3VyY2UgZWRpdCBkb2VzLgovLyBUcmFpbGluZyB0ZXJtaW5hdG9yIGluY2x1ZGVzIGAuYCBzbyB0aGUgc2luZ2xlLWZpbGUgdGVtcGxhdGUgZm9ybQovLyBgLmdpdGh1Yi9QVUxMX1JFUVVFU1RfVEVNUExBVEUubWRgIG1hdGNoZXMgYWxvbmdzaWRlIHRoZSBkaXJlY3RvcnkgZm9ybS4KLy8gIzEzNDgg4oCUIGAubW9mbG8vYCBqb2lucyB0aGVtLiBJdCBpcyBtb2ZsbydzIG93biBnaXRpZ25vcmVkIHN0YXRlIGRpcmVjdG9yeQovLyAoZGFlbW9uIGxvY2tzLCBtZW1vcnkgZGIsIFNERCBzcGVjL3BsYW4gYXJ0aWZhY3RzKSwgc28gbm90aGluZyB3cml0dGVuIHRoZXJlCi8vIGNhbiBhcHBlYXIgaW4gdGhlIGJyYW5jaCBkaWZmLCBhbmQgYSBzcGVjIGVkaXQgaW52YWxpZGF0aW5nIHRoZSB0ZXN0IHJ1biBpcwovLyBwdXJlIG5vaXNlLiBTY29wZWQgdG8gdGhlIHJlc2V0IG9ubHkg4oCUIGRlbGliZXJhdGVseSBOT1QgYWRkZWQgdG8gRVhFTVBULAovLyB3aGljaCB3b3VsZCBhbHNvIHVuLWdhdGUgcmVhZHMgb2YgYC5tb2Zsby9zcGVjcy8qKmAsIGFuZCB0aG9zZSBhcmUgaW5kZXhlZAovLyBndWlkYW5jZSB0aGF0IG1lbW9yeS1maXJzdCBzaG91bGQgc3RpbGwgcm91dGUgdGhyb3VnaCBhIHNlYXJjaC4KLy8gIzEzOTUg4oCUIGAuY2xhdWRlL2AgQ09ORklHIGpvaW5zIHRoZW0sIGJ5IHRoZSBzYW1lICJkb2Vzbid0IGV4cG9zZSBuZXcgcnVudGltZQovLyBzdXJmYWNlIiByZWFzb25pbmc6IGhvb2sgd2lyaW5nLCBza2lsbHMgYW5kIGd1aWRhbmNlIGFyZSBub3QgdGhlIGNvZGUgdW5kZXIKLy8gdmVyaWZpY2F0aW9uLiBUaGlzIGlzIHRoZSBzdHJvbmdlciBjYXNlLCBpbiBmYWN0IOKAlCBpdCBpcyB0aGUgZGlyZWN0b3J5IGEgdXNlcgovLyBlZGl0cyAqYmVjYXVzZSBhIGdhdGUgdG9sZCB0aGVtIHRvKi4gQmVmb3JlIHRoaXMsIGZpeGluZyBob29rIHdpcmluZyBvbiBhCi8vIGdhdGUncyBvd24gaW5zdHJ1Y3Rpb24gcmVzZXQgdmVyaWZ5UnVuIGFuZCBpbnZhbGlkYXRlZCB0aGUgdmVyaWZpY2F0aW9uIHRoZQovLyBmaXggZXhpc3RlZCB0byBsZXQgdGhyb3VnaCwgc28gdGhlIHJlY292ZXJ5IHdhczogZml4IHdpcmluZyDihpIgdmVyaWZpY2F0aW9uCi8vIGludmFsaWRhdGVkIOKGkiByZXN0YXJ0IHNlc3Npb24g4oaSIHJlLXJ1biAvdmVyaWZ5IOKGkiByZXRyeSAoIzEzOTIgZmllbGQgcmVwb3J0KS4KLy8KLy8gU2NvcGVkIHRvIGNvbmZpZywgTk9UIGFsbCBvZiBgLmNsYXVkZS8qKmA6IGBzY3JpcHRzL2AgYW5kIGBoZWxwZXJzL2AgaG9sZAovLyBleGVjdXRhYmxlIHJ1bnRpbWUgc3VyZmFjZSAoZ2F0ZS5janMgaXRzZWxmIGxpdmVzIHRoZXJlKSwgYW5kIGVkaXRpbmcKLy8gZXhlY3V0YWJsZSBjb2RlIFNIT1VMRCBzdGlsbCBpbnZhbGlkYXRlIGEgdmVyaWZpY2F0aW9uLiBMaXN0aW5nIHRoZSBjb25maWcKLy8gc3ViZGlyZWN0b3JpZXMgZXhwbGljaXRseSBrZWVwcyB0aGF0IGludmFyaWFudCBpbnRhY3QuCi8vCi8vIEJvdGggc2VwYXJhdG9ycyBpbiBldmVyeSBhbHRlcm5hdGl2ZSDigJQgYSBiYXJlIGAvYCBoZXJlIHdvdWxkIHNpbGVudGx5IG5vLW9wCi8vIG9uIFdpbmRvd3MsIHdoZXJlIFRPT0xfSU5QVVQgcGF0aHMgYXJyaXZlIGJhY2tzbGFzaGVkIChSdWxlICMxKS4KdmFyIEVESVRfUkVTRVRfU0tJUF9QQVRIX1JFID0gLyg/Ol58W1xcXC9dKVwuZ2l0aHViW1xcXC9dKD86d29ya2Zsb3dzfElTU1VFX1RFTVBMQVRFfFBVTExfUkVRVUVTVF9URU1QTEFURSkoPzpbXFxcLy5dfCQpfCg/Ol58W1xcXC9dKVwubW9mbG9bXFxcL118KD86XnxbXFxcL10pXC5jbGF1ZGVbXFxcL10oPzpzZXR0aW5ncyg/OlwubG9jYWwpP1wuanNvbiR8c2tpbGxzW1xcXC9dfGd1aWRhbmNlW1xcXC9dfGFnZW50c1tcXFwvXSkvaTsKLy8gVGVzdCBmaWxlczogaW52YWxpZGF0ZSB0aGUgdGVzdGluZyBnYXRlICh0ZXN0cyBhcmUgc3RhbGUgb25jZSB0ZXN0IGNvZGUgY2hhbmdlcykKLy8gYnV0IE5PVCB0aGUgc2ltcGxpZnkgZ2F0ZSDigJQgL3NpbXBsaWZ5IGFscmVhZHkgcmV2aWV3ZWQgdGhlIHByb2R1Y3Rpb24gY29kZTsgdG91Y2hpbmcKLy8gYSB0ZXN0IGZpbGUgb3IgZml4dHVyZSBkb2Vzbid0IGV4cG9zZSBuZXcgdW50ZXN0ZWQgc3VyZmFjZSBmb3IgY29kZSByZXZpZXcgKCM5MDgpLgp2YXIgRURJVF9SRVNFVF9TS0lQX1NJTVBMSUZZX09OTFlfUkUgPSAvKD86XnxbXFxcL10pKF9fdGVzdHNfX3xfX21vY2tzX198dGVzdHM/fHNwZWN8c3BlY3N8Y3lwcmVzc3xlMmV8Zml4dHVyZXM/KVtcXFwvXXxcLih0ZXN0fHNwZWMpXC5bbWNdP1tqdF1zeD8kfFwuZml4dHVyZVwuW21jXT9banRdc3g/JC9pOwovLyAjMTE3NiDigJQgc291cmNlLWZpbGUgZXh0ZW5zaW9ucyB1c2VkIGJ5IHRoZSBuby1zb3VyY2UtZmlsZXMgUFIgZXhlbXB0aW9uLgovLyBXaGVuIHRoZSBjdW11bGF0aXZlIGJyYW5jaCBkaWZmIGhhcyB6ZXJvIGZpbGVzIG1hdGNoaW5nIHRoaXMgUkUgKGkuZS4gb25seQovLyBZQU1ML01EL0pTT04vbG9ja2ZpbGVzL2ltYWdlcy90ZW1wbGF0ZXMpLCB0aGUgdGVzdGluZy9zaW1wbGlmeS9sZWFybmluZ3MKLy8gZ2F0ZXMgYXV0by1wYXNzIGF0IGBjaGVjay1iZWZvcmUtcHJgLiBMaXN0cyBldmVyeSBsYW5ndWFnZSBtb2ZsbyBzaGlwcwovLyBhZ2FpbnN0IOKAlCBhZGRpdGlvbnMgaGVyZSBzaG91bGQgbWF0Y2ggVEVTVF9SVU5ORVJfUkUncyBsYW5ndWFnZSBjb3ZlcmFnZS4KdmFyIFNPVVJDRV9GSUxFX1JFID0gL1wuKHRzfHRzeHxqc3xqc3h8bWpzfGNqc3xweXxnb3xyc3xyYnxqYXZhfGt0fHN3aWZ0fGN8Y2N8Y3BwfGh8aHBwfHNofGJhc2h8cHMxKSQvaTsKLy8gRG9jcy1vbmx5IFBSIGV4ZW1wdGlvbjogdGV4dC9tYXJrdXAvaW1hZ2UgZXh0ZW5zaW9ucyB0aGF0IGNhbm5vdCBjaGFuZ2UgcnVudGltZSBiZWhhdmlvdXIuCi8vIFJldGFpbmVkIGZvciB0aGUgdHJhbnNwYXJlbmN5IG1lc3NhZ2Ugd2hlbiB0aGUgZGlmZiBpcyAqcHVyZWx5KiBkb2NzIChubyBZQU1ML0pTT04gZWl0aGVyKQovLyDigJQgZ2l2ZXMgYSBtb3JlIHNwZWNpZmljIHJlYXNvbiB0aGFuICJubyBzb3VyY2UgZmlsZXMiIGluIHRoYXQgc3Vic2V0Lgp2YXIgRE9DU19PTkxZX1JFID0gL1wuKG1kfG1hcmtkb3dufHR4dHxyc3R8YWRvY3xodG1sP3xwZGZ8cG5nfGpwZT9nfGdpZnxzdmd8d2VicHxpY298Ym1wKSQvaTsKCi8vIOKUgOKUgCBDb250ZW50LWFkZHJlc3NlZCBnYXRlIGNyZWRpdCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKLy8gQSBib29sZWFuIGB0ZXN0c1J1bmAvYHNpbXBsaWZ5UnVuYC9gdmVyaWZ5UnVuYCBhbnN3ZXJzICJ3YXMgYW4gZWRpdAovLyBvYnNlcnZlZD8iIOKAlCB3aGljaCBpcyBvbmx5IGVxdWl2YWxlbnQgdG8gImRvZXMgdGhpcyBjcmVkaXQgc3RpbGwgZGVzY3JpYmUgdGhlCi8vIGNvZGU/IiBpZiBldmVyeSBtdXRhdGlvbiBmbG93cyB0aHJvdWdoIFdyaXRlL0VkaXQvTXVsdGlFZGl0LiBJdCBkb2VzIG5vdC4KLy8gYG5vZGUgLWVgIHdpdGggZnMud3JpdGVGaWxlU3luYywgYHNlZCAtaWAsIHNoZWxsIHJlZGlyZWN0aW9uLCBgY3BgLCBhbmQgZXZlcnkKLy8gZ2l0IG9wZXJhdGlvbiB0aGF0IG1vdmVzIHRoZSB0cmVlIChjaGVja291dCwgcHVsbCwgbWVyZ2UsIHJlYmFzZSwgYXBwbHkpCi8vIGNoYW5nZSBzb3VyY2Ugd2l0aG91dCBmaXJpbmcgUG9zdFRvb2xVc2Ugb24gdGhvc2UgdG9vbHMsIHNvIHJlc2V0LWVkaXQtZ2F0ZXMKLy8gbmV2ZXIgcnVucyBhbmQgY3JlZGl0IGVhcm5lZCBiZWZvcmVoYW5kIHN1cnZpdmVzIHRoZSBjaGFuZ2UuIERlbW9uc3RyYXRlZCBieQovLyBlYXJuaW5nIGZ1bGwgY3JlZGl0LCBhcHBlbmRpbmcgYW4gZXhlY1N5bmMgY2FsbCB0byBhIHNvdXJjZSBmaWxlIHZpYSBCYXNoLAovLyBhbmQgd2F0Y2hpbmcgY2hlY2stYmVmb3JlLXByIGFsbG93IHRoZSBQUi4gTXVsdGktaXNzdWUgc2Vzc2lvbnMgaGF2ZSB0aGUgc2FtZQovLyBzaGFwZTogbm90aGluZyBpcyBwZXItcHJvbXB0LCBzbyBpc3N1ZSBCIGluaGVyaXRzIGlzc3VlIEEncyBjcmVkaXQuCi8vCi8vIEV2ZXJ5IG9uZSBvZiAjOTA4IC8gIzExNzYgLyAjMTMyMiAvICMxMzMyIC8gIzEzNDggcmVmaW5lZCBXSElDSCB0b29sIGNhbGwgdG8KLy8gd2F0Y2guIE5vbmUgb2YgdGhlbSBjb3VsZCBjbG9zZSB0aGlzLCBiZWNhdXNlIHRoZSBvYnNlcnZlciBpcyB0aGUgd3JvbmcKLy8gcHJpbWl0aXZlLiBTbyBzdG9wIG9ic2VydmluZyBtdXRhdGlvbnMgYW5kIGZpbmdlcnByaW50IHRoZSBjb2RlIGl0c2VsZjogSEVBRAovLyBwbHVzIHRoZSBjb250ZW50IG9mIGV2ZXJ5IGNoYW5nZWQgYW5kIHVudHJhY2tlZCBmaWxlLiBSZWNvbXB1dGUgYXQgY2hlY2sKLy8gdGltZTsgYW55IG1pc21hdGNoIG1lYW5zIHRoZSBjcmVkaXQgZGVzY3JpYmVzIGRpZmZlcmVudCBjb2RlIGFuZCBpcyBzdGFsZS4gTm8KLy8gdG9vbCBjYW4gYnlwYXNzIGl0LCBiZWNhdXNlIGl0IHdhdGNoZXMgbm8gdG9vbHMuCi8vCi8vIFNjb3BlIG1pcnJvcnMgdGhlIHJlc2V0IHByZWRpY2F0ZXMgc28gdGhlaXIgaW50ZW50aW9uYWwgZXhlbXB0aW9ucyBzdXJ2aXZlLgovLyBJbmVydCBmaWxlcyAoIzExNzYpIGFuZCBgLmdpdGh1Yi9gICsgYC5tb2Zsby9gIHBhdGhzIG5ldmVyIGNvbnRyaWJ1dGUsIHNvIGEKLy8gbWFya2Rvd24gb3Igc3BlYyBlZGl0IHN0aWxsIGxlYXZlcyBhIHRlc3QgcnVuIHN0YW5kaW5nLiAnbm9udGVzdCcgYWxzbyBkcm9wcwovLyB0ZXN0IGZpbGVzLCBwcmVzZXJ2aW5nICM5MDg6IHRvdWNoaW5nIGEgdGVzdCBkb2VzIG5vdCBpbnZhbGlkYXRlIC9zaW1wbGlmeS4KLy8KLy8gaXNFcGhlbWVyYWxQYXRoIGlzIGRlbGliZXJhdGVseSBOT1QgYXBwbGllZCDigJQgaXQgZXhpc3RzIGZvciBhZ2VudCBzY3JhdGNocGFkcwovLyBvdXRzaWRlIHRoZSBwcm9qZWN0LCBhbmQgYGdpdCBzdGF0dXNgIGNhbm5vdCByZXBvcnQgdGhvc2UuCi8vIFRoZSBnYXRlJ3Mgb3duIHN0YXRlIGZpbGUgbXVzdCBuZXZlciBjb250cmlidXRlOiByZWNvcmRpbmcgYSBjcmVkaXQgd3JpdGVzCi8vIGl0LCB3aGljaCB3b3VsZCBjaGFuZ2UgdGhlIHZlcnkgZmluZ2VycHJpbnQgdGhlIGNyZWRpdCBpcyBwaW5uZWQgdG8gYW5kIG1ha2UKLy8gZXZlcnkgY3JlZGl0IGluc3RhbnRseSBzdGFsZS4gSXQgaXMgZ2l0aWdub3JlZCBpbiBtb2ZsbydzIHJlcG8sIGJ1dCBhCi8vIGNvbnN1bWVyIHByb2plY3QgbmVlZCBub3QgaWdub3JlIGl0LCBhbmQgdGhlcmUgdGhlIHNlbGYtcmVmZXJlbmNlIHdvdWxkCi8vIGRlYWRsb2NrIHRoZWlyIGdhdGUgcGVybWFuZW50bHkg4oCUIHNvIGV4Y2x1ZGUgaXQgYnkgbmFtZSByYXRoZXIgdGhhbiB0cnVzdGluZwovLyAuZ2l0aWdub3JlLiBTY29wZWQgdG8gdGhpcyBvbmUgZmlsZTogYC5jbGF1ZGUvYCBhbHNvIGhvbGRzIHJlYWwgc291cmNlCi8vIChoZWxwZXJzLywgc2NyaXB0cy8pIHRoYXQgbXVzdCBrZWVwIGNvdW50aW5nLgp2YXIgRklOR0VSUFJJTlRfU0VMRl9SRSA9IC8oPzpefFtcXFwvXSlcLmNsYXVkZVtcXFwvXXdvcmtmbG93LXN0YXRlXC5qc29uJC9pOwoKZnVuY3Rpb24gZmluZ2VycHJpbnRJbmNsdWRlcyhyZWwsIHNjb3BlKSB7CiAgaWYgKEZJTkdFUlBSSU5UX1NFTEZfUkUudGVzdChyZWwpKSByZXR1cm4gZmFsc2U7CiAgaWYgKEVESVRfUkVTRVRfU0tJUF9CT1RIX1JFLnRlc3QocmVsKSkgcmV0dXJuIGZhbHNlOwogIGlmIChFRElUX1JFU0VUX1NLSVBfUEFUSF9SRS50ZXN0KHJlbCkpIHJldHVybiBmYWxzZTsKICBpZiAoc2NvcGUgPT09ICdub250ZXN0JyAmJiBFRElUX1JFU0VUX1NLSVBfU0lNUExJRllfT05MWV9SRS50ZXN0KHJlbCkpIHJldHVybiBmYWxzZTsKICByZXR1cm4gdHJ1ZTsKfQoKLyoqCiAqIFBhdGhzIHJlcG9ydGVkIGJ5IGBnaXQgc3RhdHVzIC0tcG9yY2VsYWluPXYxIC11YWxsIC16YCwgYXMKICogYHsgcGF0aCwgb3JpZyB9YCDigJQgYG9yaWdgIHNldCBvbmx5IGZvciByZW5hbWVzIGFuZCBjb3BpZXMuCiAqCiAqIEEgcmVuYW1lIGVtaXRzIGBSICA8bmV3PlwwPG9sZD5cMGA6IHR3byBOVUwtdGVybWluYXRlZCB0b2tlbnMgZm9yIG9uZSBlbnRyeS4KICogVGhlIG9yaWdpbiB0b2tlbiBtdXN0IGJlIGNvbnN1bWVkIG9yIGl0IGlzIG1pc3JlYWQgYXMgdGhlIG5leHQgZW50cnkncyBzdGF0dXMKICogYnl0ZXMsIEFORCBpdCBtdXN0IGJlIHJlcG9ydGVkLCBiZWNhdXNlIGEgcmVuYW1lIG1lYW5zIHRoZSBvbGQgcGF0aCBubyBsb25nZXIKICogZXhpc3RzLiBEcm9wcGluZyBpdCBvbiB0aGUgZmxvb3IgbGVhdmVzIHRoZSBvbGQgcGF0aCBpbiB0aGUgY29udGVudCBtYXAg4oCUIHRoZQogKiBmaW5nZXJwcmludCB3b3VsZCB0aGVuIGNhcnJ5IGEgcGhhbnRvbSBlbnRyeSB0aGF0IGRpc2FwcGVhcnMgdGhlIG1vbWVudCB0aGUKICogcmVuYW1lIGlzIGNvbW1pdHRlZCwgZXhwaXJpbmcgY3JlZGl0IG9uIGEgY29tbWl0IHRoYXQgY2hhbmdlZCBubyBjb250ZW50LgogKiBUaGF0IGlzIHRoZSBzYW1lIGRlZmVjdCBjb250ZW50LWFkZHJlc3Npbmcgd2FzIGludHJvZHVjZWQgdG8gcmVtb3ZlLgogKi8KZnVuY3Rpb24gcGFyc2VQb3JjZWxhaW5aKHJhdykgewogIHZhciBvdXQgPSBbXTsKICB2YXIgcGFydHMgPSBTdHJpbmcocmF3KS5zcGxpdCgnXDAnKTsKICBmb3IgKHZhciBpID0gMDsgaSA8IHBhcnRzLmxlbmd0aDsgaSsrKSB7CiAgICB2YXIgZW50cnkgPSBwYXJ0c1tpXTsKICAgIGlmICghZW50cnkgfHwgZW50cnkubGVuZ3RoIDwgNCkgY29udGludWU7CiAgICAvLyBDaGVjayBCT1RIIHN0YXR1cyBjb2x1bW5zLCBub3QganVzdCB0aGUgc3RhZ2VkIG9uZTogZ2l0IHJlcG9ydHMgYSByZW5hbWUKICAgIC8vIGFzIGBSIGAgd2hlbiBzdGFnZWQgYW5kIGNhbiByZXBvcnQgYCBSYCBmb3Igb25lIGRldGVjdGVkIGluIHRoZSB3b3JrdHJlZS4KICAgIC8vIE1pc3NpbmcgdGhlIHNlY29uZCBmb3JtIHdvdWxkIGxlYXZlIHRoZSBvcmlnaW4gdG9rZW4gdW5jb25zdW1lZCwgYW5kIGl0CiAgICAvLyB3b3VsZCB0aGVuIGJlIHJlYWQgYXMgdGhlIG5leHQgZW50cnkncyBzdGF0dXMgYnl0ZXMg4oCUIG1pc2FsaWduaW5nIGV2ZXJ5CiAgICAvLyBlbnRyeSBhZnRlciBpdC4gUiBhbmQgQyBhbHdheXMgZW1pdCBhbiBvcmlnaW4gdG9rZW4sIHNvIGNvbnN1bWluZyBvbmUKICAgIC8vIHdoZW5ldmVyIGVpdGhlciBjb2x1bW4gc2hvd3MgdGhlbSBjYW5ub3Qgb3Zlci1jb25zdW1lLgogICAgdmFyIHN0ID0gZW50cnkuc2xpY2UoMCwgMik7CiAgICB2YXIgcmVjID0geyBwYXRoOiBlbnRyeS5zbGljZSgzKSwgb3JpZzogbnVsbCB9OwogICAgaWYgKHN0LmluZGV4T2YoJ1InKSA+PSAwIHx8IHN0LmluZGV4T2YoJ0MnKSA+PSAwKSB7IHJlYy5vcmlnID0gcGFydHNbaSArIDFdIHx8IG51bGw7IGkrKzsgfQogICAgb3V0LnB1c2gocmVjKTsKICB9CiAgcmV0dXJuIG91dDsKfQoKLyoqCiAqIEZpbmdlcnByaW50IG9mIHRoZSBjb2RlIGEgZ2F0ZSBjcmVkaXQgZGVzY3JpYmVzLCBvciBudWxsIHdoZW4gaXQgY2Fubm90IGJlCiAqIGNvbXB1dGVkIChubyBnaXQsIG5vIHJlcG8sIG5vIGNvbW1pdHMpLiBOdWxsIGlzIHRoZSBmYWlsLW9wZW4gc2lnbmFsOiBjYWxsZXJzCiAqIGZhbGwgYmFjayB0byB0aGUgZmxhZyBhbG9uZSwgc28gbm9uLWdpdCBwcm9qZWN0cyBiZWhhdmUgZXhhY3RseSBhcyBiZWZvcmUuCiAqLwovLyBNZW1vaXNlZCBwZXIgc2NvcGUuIGNoZWNrLWJlZm9yZS1wciB0ZXN0cyB0aHJlZSBjcmVkaXRzIGFuZCBjaGVjay1iZWZvcmUtZG9uZQovLyBhIGZvdXJ0aCwgYW5kIGVhY2ggY29tcHV0YXRpb24gc2hlbGxzIG91dCB0byBgZ2l0IHN0YXR1cyAtdWFsbGAgb3ZlciB0aGUgd2hvbGUKLy8gdHJlZS4gVGhlIGdhdGUgcHJvY2VzcyBpcyBzaG9ydC1saXZlZCBhbmQgc2luZ2xlLXNob3Qg4oCUIGl0IGV4aXRzIGJlZm9yZSBhbnkKLy8gdG9vbCBpdCBnYXRlcyBjYW4gcnVuIOKAlCBzbyBub3RoaW5nIGNhbiBjaGFuZ2UgdW5kZXJuZWF0aCB0aGUgY2FjaGUuCnZhciBGSU5HRVJQUklOVF9DQUNIRSA9IHt9OwoKZnVuY3Rpb24gY3JlZGl0RmluZ2VycHJpbnQoc2NvcGUpIHsKICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKEZJTkdFUlBSSU5UX0NBQ0hFLCBzY29wZSkpIHJldHVybiBGSU5HRVJQUklOVF9DQUNIRVtzY29wZV07CiAgdmFyIHZhbHVlID0gY29tcHV0ZUNyZWRpdEZpbmdlcnByaW50KHNjb3BlKTsKICBGSU5HRVJQUklOVF9DQUNIRVtzY29wZV0gPSB2YWx1ZTsKICByZXR1cm4gdmFsdWU7Cn0KCmZ1bmN0aW9uIGNvbXB1dGVDcmVkaXRGaW5nZXJwcmludChzY29wZSkgewogIHZhciBnaXQgPSBmdW5jdGlvbiAoYXJncykgewogICAgcmV0dXJuIGNwLmV4ZWNGaWxlU3luYygnZ2l0JywgYXJncywgewogICAgICBjd2Q6IFBST0pFQ1RfRElSLCBlbmNvZGluZzogJ3V0Zi04JywgdGltZW91dDogMTAwMDAsIHdpbmRvd3NIaWRlOiB0cnVlLAogICAgICBtYXhCdWZmZXI6IDY0ICogMTAyNCAqIDEwMjQsIHN0ZGlvOiBbJ2lnbm9yZScsICdwaXBlJywgJ2lnbm9yZSddLAogICAgfSk7CiAgfTsKICAvLyBGaW5nZXJwcmludCB0aGUgQ09OVEVOVCBvZiB0aGUgd29ya2luZyB0cmVlLCBuZXZlciAoSEVBRCArIGRlbHRhKS4gVGhvc2UKICAvLyBhcmUgbm90IHRoZSBzYW1lIHRoaW5nOiBgZ2l0IGNvbW1pdGAgbW92ZXMgY2hhbmdlcyBmcm9tIHRoZSB3b3JraW5nIHRyZWUKICAvLyBpbnRvIEhFQUQgd2l0aG91dCBhbHRlcmluZyBhIHNpbmdsZSBieXRlIG9mIGNvZGUsIGFuZCBhIEhFQUQtYmFzZWQKICAvLyBmaW5nZXJwcmludCB3b3VsZCBleHBpcmUgZXZlcnkgY3JlZGl0IG9uIGNvbW1pdCDigJQgZm9yY2luZyBhIHBvaW50bGVzcwogIC8vIHJlLXJ1biBvZiB0aGUgdGVzdHMgdGhhdCBqdXN0IHBhc3NlZCBvbiBleGFjdGx5IHRoaXMgY29kZS4gQ29udGVudC0KICAvLyBhZGRyZXNzaW5nIGFsc28gbWFrZXMgdGhlIGZpbmdlcnByaW50IHN0YWJsZSBhY3Jvc3MgYW1lbmQsIHN0YXNoL3BvcCwgYW5kCiAgLy8gYW55IGJyYW5jaCBzd2l0Y2ggdGhhdCBsYW5kcyBvbiBpZGVudGljYWwgY29udGVudCwgd2hpbGUgc3RpbGwgbW92aW5nIHRoZQogIC8vIG1vbWVudCByZWFsIGNvbnRlbnQgZGlmZmVycy4KICAvLwogIC8vIFVuY2hhbmdlZCBmaWxlcyBjb250cmlidXRlIGdpdCdzIG93biBibG9iIGhhc2hlcyAoZnJlZSwgYWxyZWFkeSBjb21wdXRlZCk7CiAgLy8gb25seSBmaWxlcyBnaXQgcmVwb3J0cyBhcyBjaGFuZ2VkIG9yIHVudHJhY2tlZCBhcmUgaGFzaGVkIGhlcmUuCiAgdmFyIHRyYWNrZWQ7CiAgdHJ5IHsKICAgIHRyYWNrZWQgPSBnaXQoWydscy10cmVlJywgJy1yJywgJy16JywgJ0hFQUQnXSk7CiAgfSBjYXRjaCAoZSkgeyByZXR1cm4gbnVsbDsgfSAvLyBubyBnaXQsIG5vIHJlcG8sIG9yIG5vIGNvbW1pdCB5ZXQKICB2YXIgYnlQYXRoID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICB2YXIgZW50cmllcyA9IFN0cmluZyh0cmFja2VkKS5zcGxpdCgnXDAnKTsKICBmb3IgKHZhciBpID0gMDsgaSA8IGVudHJpZXMubGVuZ3RoOyBpKyspIHsKICAgIC8vICI8bW9kZT4gPHR5cGU+IDxvYmplY3Q+XHQ8cGF0aD4iCiAgICB2YXIgdGFiID0gZW50cmllc1tpXS5pbmRleE9mKCdcdCcpOwogICAgaWYgKHRhYiA8IDApIGNvbnRpbnVlOwogICAgdmFyIG1ldGEgPSBlbnRyaWVzW2ldLnNsaWNlKDAsIHRhYikuc3BsaXQoJyAnKTsKICAgIGJ5UGF0aFtlbnRyaWVzW2ldLnNsaWNlKHRhYiArIDEpXSA9IG1ldGFbMl07CiAgfQogIHRyeSB7CiAgICB2YXIgY2hhbmdlZCA9IHBhcnNlUG9yY2VsYWluWihnaXQoWydzdGF0dXMnLCAnLS1wb3JjZWxhaW49djEnLCAnLXVhbGwnLCAnLXonXSkpOwogICAgdmFyIGxpdmUgPSBbXTsKICAgIGZvciAodmFyIGogPSAwOyBqIDwgY2hhbmdlZC5sZW5ndGg7IGorKykgewogICAgICB2YXIgcmVsID0gY2hhbmdlZFtqXS5wYXRoOwogICAgICAvLyBBIHJlbmFtZSdzIG9yaWdpbiBwYXRoIGlzIGdvbmUgZnJvbSB0aGUgY29udGVudCDigJQgZHJvcCBpdCwgb3IgaXQKICAgICAgLy8gbGluZ2VycyB1bnRpbCB0aGUgcmVuYW1lIGlzIGNvbW1pdHRlZCBhbmQgdGhlbiB2YW5pc2hlcywgbW92aW5nIHRoZQogICAgICAvLyBmaW5nZXJwcmludCBvbiBhIGNvbW1pdCB0aGF0IGNoYW5nZWQgbm90aGluZy4KICAgICAgaWYgKGNoYW5nZWRbal0ub3JpZykgZGVsZXRlIGJ5UGF0aFtjaGFuZ2VkW2pdLm9yaWddOwogICAgICB2YXIgYWJzID0gcGF0aC5yZXNvbHZlKFBST0pFQ1RfRElSLCByZWwpOwogICAgICB2YXIgaXNGaWxlID0gZmFsc2U7CiAgICAgIHRyeSB7IGlzRmlsZSA9IGZzLnN0YXRTeW5jKGFicykuaXNGaWxlKCk7IH0gY2F0Y2ggKGUpIHsgaXNGaWxlID0gZmFsc2U7IH0KICAgICAgLy8gQSBwYXRoIGdpdCByZXBvcnRzIGJ1dCB0aGF0IGlzIGdvbmUgKG9yIGlzIG5vdCBhIHJlZ3VsYXIgZmlsZSkgaXMKICAgICAgLy8gYWJzZW50IGZyb20gdGhlIGNvbnRlbnQsIHNvIGl0IG11c3QgbGVhdmUgdGhlIG1hcCBlbnRpcmVseS4KICAgICAgaWYgKCFpc0ZpbGUpIHsgZGVsZXRlIGJ5UGF0aFtyZWxdOyBjb250aW51ZTsgfQogICAgICBpZiAocmVsLmluZGV4T2YoJ1xuJykgPj0gMCkgeyBkZWxldGUgYnlQYXRoW3JlbF07IGNvbnRpbnVlOyB9IC8vIHVuaGFzaGFibGUgdmlhIC0tc3RkaW4tcGF0aHMKICAgICAgbGl2ZS5wdXNoKHJlbCk7CiAgICB9CiAgICBpZiAobGl2ZS5sZW5ndGgpIHsKICAgICAgLy8gYGdpdCBoYXNoLW9iamVjdGAg4oCUIE5PVCBhIHJhdyBzaGExIG9mIHRoZSBieXRlcy4gQSBnaXQgYmxvYiBpZCBoYXNoZXMKICAgICAgLy8gImJsb2IgPHNpemU+XDAiIHBsdXMgdGhlIGNvbnRlbnQsIGFuZCBhcHBsaWVzIHRoZSBzYW1lIGNsZWFuIGZpbHRlcnMKICAgICAgLy8gYW5kIGNvcmUuYXV0b2NybGYgbm9ybWFsaXNhdGlvbiBnaXQgd291bGQgYXBwbHkgb24gY2hlY2tpbi4gSGFzaGluZyB0aGUKICAgICAgLy8gcmF3IGJ5dGVzIGhlcmUgaW5zdGVhZCB3b3VsZCBwcm9kdWNlIGEgZGlmZmVyZW50IHN0cmluZyB0aGFuIGxzLXRyZWUKICAgICAgLy8gcmVwb3J0cyBmb3IgaWRlbnRpY2FsIGNvbnRlbnQsIHNvIGEgZmlsZSB3b3VsZCBhcHBlYXIgdG8gImNoYW5nZSIgdGhlCiAgICAgIC8vIG1vbWVudCBpdCB3YXMgY29tbWl0dGVkIOKAlCBhbmQgb24gV2luZG93cywgd2hlbmV2ZXIgYXV0b2NybGYgcmV3cm90ZSBpdHMKICAgICAgLy8gbGluZSBlbmRpbmdzLiBPbmUgYmF0Y2hlZCBjYWxsIGNvdmVycyBldmVyeSBjaGFuZ2VkIHBhdGguCiAgICAgIHZhciBoYXNoZWQgPSBjcC5leGVjRmlsZVN5bmMoJ2dpdCcsIFsnaGFzaC1vYmplY3QnLCAnLS1zdGRpbi1wYXRocyddLCB7CiAgICAgICAgY3dkOiBQUk9KRUNUX0RJUiwgZW5jb2Rpbmc6ICd1dGYtOCcsIHRpbWVvdXQ6IDEwMDAwLCB3aW5kb3dzSGlkZTogdHJ1ZSwKICAgICAgICBtYXhCdWZmZXI6IDY0ICogMTAyNCAqIDEwMjQsIGlucHV0OiBsaXZlLmpvaW4oJ1xuJykgKyAnXG4nLAogICAgICAgIHN0ZGlvOiBbJ3BpcGUnLCAncGlwZScsICdpZ25vcmUnXSwKICAgICAgfSkudHJpbSgpLnNwbGl0KCdcbicpOwogICAgICBmb3IgKHZhciBtID0gMDsgbSA8IGxpdmUubGVuZ3RoOyBtKyspIHsKICAgICAgICBpZiAoaGFzaGVkW21dKSBieVBhdGhbbGl2ZVttXV0gPSBoYXNoZWRbbV0udHJpbSgpOwogICAgICB9CiAgICB9CiAgfSBjYXRjaCAoZSkgewogICAgLy8gc3RhdHVzIGZhaWxlZCDigJQgZmFsbCBiYWNrIHRvIHRoZSBjb21taXR0ZWQgdHJlZSBhbG9uZSByYXRoZXIgdGhhbiBudWxsLAogICAgLy8gc28gdGhlIGZpbmdlcnByaW50IHN0aWxsIHRyYWNrcyBjb21taXR0ZWQgY29udGVudC4KICB9CiAgdmFyIHBhdGhzID0gT2JqZWN0LmtleXMoYnlQYXRoKS5maWx0ZXIoZnVuY3Rpb24gKHApIHsgcmV0dXJuIGZpbmdlcnByaW50SW5jbHVkZXMocCwgc2NvcGUpOyB9KTsKICBwYXRocy5zb3J0KCk7CiAgdmFyIGggPSBjcnlwdG8uY3JlYXRlSGFzaCgnc2hhMScpOwogIGZvciAodmFyIGsgPSAwOyBrIDwgcGF0aHMubGVuZ3RoOyBrKyspIGgudXBkYXRlKHBhdGhzW2tdICsgJzonICsgYnlQYXRoW3BhdGhzW2tdXSArICdcbicpOwogIHJldHVybiBoLmRpZ2VzdCgnaGV4Jyk7Cn0KCi8qKgogKiBJcyBhIGNyZWRpdCBzdGlsbCBsaXZlPyBgZmxhZ2AgaXMgdGhlIGxlZ2FjeSBib29sZWFuLCBgc3RvcmVkYCB0aGUgZmluZ2VycHJpbnQKICogY2FwdHVyZWQgd2hlbiBpdCB3YXMgZWFybmVkLgogKgogKiBGYWlsLW9wZW4gb24gYW4gdW5jb21wdXRhYmxlIGZpbmdlcnByaW50IChub24tZ2l0IHByb2plY3QpIOKAlCB0aGUgZ2F0ZSBrZWVwcwogKiBpdHMgcHJldmlvdXMgc2VtYW50aWNzIHRoZXJlIHJhdGhlciB0aGFuIGJsb2NraW5nIHdvcmsgaXQgY2Fubm90IHJlYXNvbiBhYm91dC4KICogRmFpbC1DTE9TRUQgb24gYSBtaXNzaW5nIHN0b3JlZCBmaW5nZXJwcmludDogdGhhdCBpcyBjcmVkaXQgZWFybmVkIGJ5IGEKICogcHJlLXVwZ3JhZGUgZ2F0ZSwgYW5kIGl0IGNhcnJpZXMgbm8gZXZpZGVuY2UgYWJvdXQgd2hpY2ggY29kZSBpdCBjb3ZlcmVkLiBUaGUKICogY29zdCBpcyByZS1ydW5uaW5nIG9uY2Ugb24gdGhlIGZpcnN0IFBSIGFmdGVyIHVwZ3JhZGUsIHdoaWNoIHNlbGYtaGVhbHMuCiAqLwpmdW5jdGlvbiBjcmVkaXRJc0xpdmUoZmxhZywgc3RvcmVkLCBzY29wZSkgewogIGlmICghZmxhZykgcmV0dXJuIGZhbHNlOwogIHZhciBub3cgPSBjcmVkaXRGaW5nZXJwcmludChzY29wZSk7CiAgaWYgKG5vdyA9PT0gbnVsbCkgcmV0dXJuIHRydWU7CiAgaWYgKCFzdG9yZWQpIHJldHVybiBmYWxzZTsKICByZXR1cm4gc3RvcmVkID09PSBub3c7Cn0KCi8vICMxNDEwIOKAlCBpcyB0aGlzIEJhc2ggY29tbWFuZCBhY3R1YWxseSBhIGBnaCBwciBjcmVhdGVgIGludm9jYXRpb24/IERlbGVnYXRlcwovLyB0byBwci1jcmVhdGUtY29tbWFuZC5janMsIHdoaWNoIHNhbml0aXNlcyBkYXRhIHJlZ2lvbnMgKHF1b3RlcywgaGVyZWRvYwovLyBib2RpZXMsIGNvbW1lbnRzKSBiZWZvcmUgbG9va2luZyBmb3IgdGhlIGNvbW1hbmQsIHNvIHRoZSBnYXRlIG5laXRoZXIgbWlzc2VzCi8vIHJlYWwgaW52b2NhdGlvbnMgKG5ld2xpbmUtc2VwYXJhdGVkLCBwaXBlZCwgcGFyZW50aGVzaXNlZCkgbm9yIGZpcmVzIG9uCi8vIGNvbW1hbmRzIHRoYXQgbWVyZWx5IHF1b3RlIHRoZSBsaXRlcmFsIChgZ2l0IGNvbW1pdCAtbSAiLi4uZ2ggcHIgY3JlYXRlLi4uImApLgovLwovLyBGYWlsLXNhZmUsIGluIEJPVEggZGlyZWN0aW9ucywgYmVjYXVzZSB0aGlzIHJ1bnMgb24gZXZlcnkgQmFzaCBjYWxsIGluIGV2ZXJ5Ci8vIGNvbnN1bWVyLiBnYXRlLWhvb2subWpzIG1hcHMgYSBub24temVybyBleGl0IGZyb20gdGhpcyBzY3JpcHQgdG8gZXhpdCAyLCBzbyBhbgovLyB1bmNhdWdodCB0aHJvdyBoZXJlIGRvZXMgbm90IGRlZ3JhZGUgb25lIGdhdGUg4oCUIGl0IGJsb2NrcyBldmVyeSBCYXNoIGNhbGwgdGhlCi8vIGNvbnN1bWVyIG1ha2VzLiBTbyBhIGxvYWQgZmFpbHVyZSAocGFydGlhbCBgLmNsYXVkZS9oZWxwZXJzYCBzeW5jIG1pZC11cGdyYWRlLAovLyBoYW5kLXBydW5lZCBpbnN0YWxsKSBBTkQgYSB0aHJvdyBmcm9tIHRoZSBtYXRjaGVyIGl0c2VsZiBib3RoIGZhbGwgYmFjayB0byB0aGUKLy8gcHJlLSMxNDEwIHJlZ2V4OiBwcmV2aW91cyBiZWhhdmlvdXIsIG5vdCBhIHdlZGdlZCBzZXNzaW9uLgovLwovLyBOb3Qgc2lsZW50ICgjODU0LCBob29rLWF1dGhvcmluZyDCpzQpOiB0aGUgZmFsbGJhY2sgcGF0aCBhZHZpc2VzIG9uIHN0ZGVyciBhbmQKLy8gY29udGludWVzLiBJZiB0aGlzIGV2ZXIgZmlyZXMgaXQgbWVhbnMgdGhlIG1hdGNoZXIgY3Jhc2hlZCwgd2hpY2ggaXMgd29ydGgKLy8gYmVpbmcgbG91ZCBhYm91dCDigJQgYW5kIGl0IGNhbm5vdCBzcGFtIGEgaGVhbHRoeSBzZXNzaW9uLCBiZWNhdXNlIGEgaGVhbHRoeQovLyBzZXNzaW9uIG5ldmVyIHJlYWNoZXMgaXQuCnZhciBMRUdBQ1lfUFJfQ1JFQVRFX1JFID0gLyg/Ol58JiZccyp8XHxcfFxzKnw7XHMqKVxzKig/OltBLVpfXVtBLVowLTlfXSo9XFMrXHMrKSpnaFxzK3ByXHMrY3JlYXRlXGIvOwp2YXIgcHJDcmVhdGVNYXRjaGVyID0gbnVsbDsKZnVuY3Rpb24gaXNQckNyZWF0ZUNvbW1hbmQoY21kKSB7CiAgaWYgKHByQ3JlYXRlTWF0Y2hlciA9PT0gbnVsbCkgewogICAgdHJ5IHsKICAgICAgcHJDcmVhdGVNYXRjaGVyID0gcmVxdWlyZSgnLi9wci1jcmVhdGUtY29tbWFuZC5janMnKS5pc1ByQ3JlYXRlQ29tbWFuZDsKICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgcHJDcmVhdGVNYXRjaGVyID0gZmFsc2U7CiAgICAgIHByb2Nlc3Muc3RkZXJyLndyaXRlKCdtb2ZsbzogcHItY3JlYXRlLWNvbW1hbmQuY2pzIHVuYXZhaWxhYmxlICgnICsgKGUgJiYgZS5tZXNzYWdlKSArICcpIOKAlCBQUiBnYXRlcyBmYWxsIGJhY2sgdG8gdGhlIGxlZ2FjeSBtYXRjaGVyLiBSdW4gYG5weCBmbG8gZG9jdG9yIC0tZml4YC5cbicpOwogICAgfQogICAgaWYgKHR5cGVvZiBwckNyZWF0ZU1hdGNoZXIgIT09ICdmdW5jdGlvbicpIHByQ3JlYXRlTWF0Y2hlciA9IGZhbHNlOwogIH0KICBpZiAocHJDcmVhdGVNYXRjaGVyKSB7CiAgICB0cnkgewogICAgICByZXR1cm4gcHJDcmVhdGVNYXRjaGVyKGNtZCk7CiAgICB9IGNhdGNoIChlKSB7CiAgICAgIHByb2Nlc3Muc3RkZXJyLndyaXRlKCdtb2ZsbzogcHItY3JlYXRlIG1hdGNoZXIgdGhyZXcgKCcgKyAoZSAmJiBlLm1lc3NhZ2UpICsgJykg4oCUIGZhbGxpbmcgYmFjayB0byB0aGUgbGVnYWN5IG1hdGNoZXIuIFBsZWFzZSByZXBvcnQgd2l0aCB0aGUgY29tbWFuZCB0aGF0IHRyaWdnZXJlZCBpdC5cbicpOwogICAgfQogIH0KICByZXR1cm4gTEVHQUNZX1BSX0NSRUFURV9SRS50ZXN0KGNtZCk7Cn0KCi8vIENsYXNzaWZpZXItYXdhcmUgc2ltcGxpZnkgZ2F0ZSBza2lwLiBSZXR1cm5zIGEgc3RyaW5nIHJlYXNvbiBpZiB0aGUgZ2F0ZQovLyBjYW4gYmUgYXV0by1wYXNzZWQsIG9yIG51bGwgaWYgL3NpbXBsaWZ5IG11c3QgcnVuLiBVc2VzIHNpbXBsaWZ5LWNsYXNzaWZ5LmNqcwovLyBzbyB0aGUgZ2F0ZSdzICJ0cml2aWFsIiBkZWZpbml0aW9uIG1hdGNoZXMgdGhlIHNraWxsJ3MgZXhhY3RseS4KLy8KLy8gVHdvIHBhdGhzOgovLyAgIDEuIHNuYXBzaG90IHBhdGgg4oCUIC9zaW1wbGlmeSByYW4gZWFybGllciBvbiB0aGlzIGJyYW5jaC4gQ2xhc3NpZnkgdGhlIGRpZmYKLy8gICAgICBiZXR3ZWVuIHNpbXBsaWZ5U25hcHNob3RTaGEgYW5kIGN1cnJlbnQgSEVBRC93b3JraW5nLXRyZWUuIElmIFRSSVZJQUwsCi8vICAgICAgdGhlIHByaW9yIHJldmlldyBzdGlsbCBjb3ZlcnMgdGhlIGJyYW5jaCDigJQgbm8gcmUtcnVuIG5lZWRlZC4KLy8gICAyLiBiYXNlbGluZSBwYXRoIOKAlCBubyBzbmFwc2hvdCAoZmlyc3QgdGltZSkuIENsYXNzaWZ5IHRoZSBlbnRpcmUgYnJhbmNoCi8vICAgICAgZGlmZiB2cyBtZXJnZS1iYXNlLiBJZiBUUklWSUFMLCB0aGUgd2hvbGUgUFIgaXMgYmVsb3cgdGhlIHRocmVzaG9sZAovLyAgICAgIHdoZXJlIC9zaW1wbGlmeSBwcm92aWRlcyB2YWx1ZSDigJQgYXV0by1wYXNzIHdpdGhvdXQgZXZlciBpbnZva2luZyBpdC4KLy8KLy8gRmFpbC1zYWZlOiBhbnkgZXJyb3IgKG5vIGNsYXNzaWZpZXIsIG5vIGdpdCwgbm8gbWVyZ2UtYmFzZSkgcmV0dXJucyBudWxsLAovLyB3aGljaCBmb3JjZXMgL3NpbXBsaWZ5IHRvIHJ1biBhcyB0b2RheS4KZnVuY3Rpb24gY2xhc3NpZnlGb3JHYXRlU2tpcChzdGF0ZSkgewogIHZhciBtb2Q7CiAgdHJ5IHsKICAgIG1vZCA9IHJlcXVpcmUoJy4vc2ltcGxpZnktY2xhc3NpZnkuY2pzJyk7CiAgfSBjYXRjaCAoZSkgeyByZXR1cm4gbnVsbDsgfQogIHZhciBjbGFzc2lmeSA9IG1vZCAmJiBtb2QuY2xhc3NpZnlEaWZmOwogIHZhciByZWFkVW50cmFja2VkID0gbW9kICYmIG1vZC5yZWFkVW50cmFja2VkRGlmZjsKICAvLyBFWEVDX01BWF9CVUZGRVIgaXMgY2hlY2tlZCBhbG9uZ3NpZGUgdGhlIGZ1bmN0aW9ucyBiZWNhdXNlIGZhbGxpbmcgYmFjayB0bwogIC8vIE5vZGUncyAxIE1pQiBkZWZhdWx0IHdvdWxkIHNpbGVudGx5IHJlaW5zdGF0ZSB0aGUgdmVyeSBjbGlmZiAjMTQ1MSByZW1vdmVkLgogIGlmICh0eXBlb2YgY2xhc3NpZnkgIT09ICdmdW5jdGlvbicgfHwgdHlwZW9mIHJlYWRVbnRyYWNrZWQgIT09ICdmdW5jdGlvbicKICAgICAgfHwgdHlwZW9mIG1vZC5FWEVDX01BWF9CVUZGRVIgIT09ICdudW1iZXInKSByZXR1cm4gbnVsbDsKCiAgLy8gVW50cmFja2VkIGZpbGVzIHNob3cgdXAgaW4gbm8gYGdpdCBkaWZmYCBvdXRwdXQsIHNvIHdpdGhvdXQgdGhlbSB0aGUgZ2F0ZQogIC8vIGNvdWxkIGF1dG8tcGFzcyBhIGJyYW5jaCBvZiBicmFuZC1uZXcgdW5zdGFnZWQgZmlsZXMgYXMgVFJJVklBTCAoIzE0NTEpLgogIC8vIFJlYWRpbmcgZXZlcnkgb25lIG9mIHRoZW0gaXMgcmVhbCB3b3JrLCBzbyBpdCBpcyBkZWZlcnJlZCB1bnRpbCBhIHBhdGggaXMKICAvLyBhY3R1YWxseSBhYm91dCB0byBjbGFzc2lmeS4gUmV0dXJucyBudWxsIGlmIHRoZSByZWFkIGZhaWxlZCDigJQgdGhlIGNhbGxlcgogIC8vIG11c3QgdGhlbiBmYWxsIHRocm91Z2ggYW5kIGZvcmNlIC9zaW1wbGlmeSByYXRoZXIgdGhhbiBjbGFzc2lmeSBhIHBhcnRpYWwKICAvLyBkaWZmLgogIHZhciB1bnRyYWNrZWRUZXh0ID0gbnVsbDsKICBmdW5jdGlvbiB1bnRyYWNrZWRTdWZmaXgoKSB7CiAgICBpZiAodW50cmFja2VkVGV4dCAhPT0gbnVsbCkgcmV0dXJuIHVudHJhY2tlZFRleHQ7CiAgICB2YXIgdTsKICAgIHRyeSB7IHUgPSByZWFkVW50cmFja2VkKFBST0pFQ1RfRElSKTsgfSBjYXRjaCAoZSkgeyByZXR1cm4gbnVsbDsgfQogICAgaWYgKCF1IHx8IHUudW5yZWFkYWJsZSkgcmV0dXJuIG51bGw7CiAgICB1bnRyYWNrZWRUZXh0ID0gdS50ZXh0ID8gJ1xuJyArIHUudGV4dCA6ICcnOwogICAgcmV0dXJuIHVudHJhY2tlZFRleHQ7CiAgfQoKICBmdW5jdGlvbiB0cnlDbGFzc2lmeShkaWZmVGV4dCwgbGFiZWwsIGFsbG93U21hbGxSZXZpZXdGaXgpIHsKICAgIHRyeSB7CiAgICAgIHZhciBkZWMgPSBjbGFzc2lmeShkaWZmVGV4dCk7CiAgICAgIGlmIChkZWMudGllciA9PT0gJ1RSSVZJQUwnKSB7CiAgICAgICAgdmFyIGxvYyA9IChkZWMuc3RhdHMuYWRkZWQgfHwgMCkgKyAoZGVjLnN0YXRzLmRlbGV0ZWQgfHwgMCk7CiAgICAgICAgcmV0dXJuIGxhYmVsICsgJyBpcyBUUklWSUFMICgnICsgbG9jICsgJyBMT0MsICcgKyAoZGVjLnN0YXRzLmZpbGVDb3VudCB8fCAwKSArICcgZmlsZShzKSknOwogICAgICB9CiAgICAgIC8vICMxMTc2IOKAlCBTTUFMTCByZXZpZXctZml4IHNoYXBlIChzbmFwc2hvdCBwYXRoIG9ubHkpLiBBIOKJpDMwLUxPQyBkZWx0YSB3aXRoCiAgICAgIC8vIHplcm8gbmV3IGRlY2xhcmF0aW9ucyBvbiB0b3Agb2YgYW4gYWxyZWFkeS1yZXZpZXdlZCBicmFuY2ggaXMgdGhlIHR5cGljYWwKICAgICAgLy8gImFwcGx5IDMgcmV2aWV3IGZpeGVzIiBjeWNsZSDigJQgcmUtcnVubmluZyAvZmxvLXNpbXBsaWZ5IGFnYWluc3QgdGhlIHNhbWUKICAgICAgLy8gc3VyZmFjZSBwbHVzIGEgZmV3LWxpbmUgdHdlYWsgYWRkcyBubyBuZXcgc2lnbmFsLiBCYXNlbGluZSBwYXRoIHN0YXlzCiAgICAgIC8vIFRSSVZJQUwtb25seSBzbyBicmFuZC1uZXcgU01BTEwgZmVhdHVyZXMgc3RpbGwgZ2V0IHJldmlld2VkLgogICAgICBpZiAoYWxsb3dTbWFsbFJldmlld0ZpeCAmJiBkZWMudGllciA9PT0gJ1NNQUxMJykgewogICAgICAgIHZhciB0b3RhbExvYyA9IChkZWMuc3RhdHMuYWRkZWQgfHwgMCkgKyAoZGVjLnN0YXRzLmRlbGV0ZWQgfHwgMCk7CiAgICAgICAgaWYgKHRvdGFsTG9jIDw9IDMwICYmIChkZWMuc3RhdHMuZGVjbEFkZGVkIHx8IDApID09PSAwKSB7CiAgICAgICAgICByZXR1cm4gbGFiZWwgKyAnIGlzIFNNQUxMIHJldmlldy1maXggc2hhcGUgKCcgKyB0b3RhbExvYyArICcgTE9DLCBubyBuZXcgZGVjbGFyYXRpb25zKSc7CiAgICAgICAgfQogICAgICB9CiAgICB9IGNhdGNoIChlKSB7IC8qIGZhbGwgdGhyb3VnaCAqLyB9CiAgICByZXR1cm4gbnVsbDsKICB9CgogIC8vIG1heEJ1ZmZlciBjb21lcyBGUk9NIHRoZSBjbGFzc2lmaWVyICgjMTQ1MSkgcmF0aGVyIHRoYW4gYmVpbmcgYSBtYXRjaGluZwogIC8vIGxpdGVyYWwgaGVyZSwgc28gdGhlIGdhdGUgYW5kIHRoZSBza2lsbCBjYW5ub3QgZHJpZnQgb24gd2hpY2ggZGlmZnMgYXJlCiAgLy8gcmVhZGFibGUgYXQgYWxsLiBQYXN0IGl0IGV4ZWNGaWxlU3luYyB0aHJvd3MgRU5PQlVGUyBhbmQgZ2l0RGlmZiByZXR1cm5zCiAgLy8gbnVsbCDigJQgd2hpY2ggZXZlcnkgY2FsbGVyIGJlbG93IG11c3QgdHJlYXQgYXMgInVua25vd24iLCBuZXZlciAiZW1wdHkiLgogIHZhciBtYXhCdWZmZXIgPSBtb2QuRVhFQ19NQVhfQlVGRkVSOwogIGZ1bmN0aW9uIGdpdERpZmYoYXJncykgewogICAgdHJ5IHsKICAgICAgcmV0dXJuIGNwLmV4ZWNGaWxlU3luYygnZ2l0JywgYXJncywgewogICAgICAgIGN3ZDogUFJPSkVDVF9ESVIsIGVuY29kaW5nOiAndXRmLTgnLCB0aW1lb3V0OiA1MDAwLCB3aW5kb3dzSGlkZTogdHJ1ZSwKICAgICAgICBzdGRpbzogWydpZ25vcmUnLCAncGlwZScsICdpZ25vcmUnXSwgbWF4QnVmZmVyOiBtYXhCdWZmZXIKICAgICAgfSk7CiAgICB9IGNhdGNoIChlKSB7IHJldHVybiBudWxsOyB9CiAgfQoKICAvLyBTbmFwc2hvdCBwYXRoOiBjbGFzc2lmeSBldmVyeXRoaW5nIHNpbmNlIC9zaW1wbGlmeSBsYXN0IHJhbi4KICBpZiAoc3RhdGUuc2ltcGxpZnlTbmFwc2hvdFNoYSkgewogICAgdmFyIHNuYXBEaWZmID0gZ2l0RGlmZihbJ2RpZmYnLCBzdGF0ZS5zaW1wbGlmeVNuYXBzaG90U2hhICsgJy4uLkhFQUQnXSk7CiAgICB2YXIgd29ya1RyZWVBID0gZ2l0RGlmZihbJ2RpZmYnLCAnSEVBRCddKTsKICAgIC8vIEJPVEggcmVhZHMgbXVzdCBzdWNjZWVkLiBDb2FsZXNjaW5nIGEgZmFpbGVkIHdvcmtpbmctdHJlZSByZWFkIHRvICcnIGlzCiAgICAvLyBob3cgYW4gb3Zlci1idWZmZXIgd29ya2luZyB0cmVlIHVzZWQgdG8gcmVhZCBhcyAibm8gd29ya2luZy10cmVlIGNoYW5nZXMiCiAgICAvLyBhbmQgbGV0IHRoZSBnYXRlIHNraXAgcmV2aWV3ICgjMTQ1MSkuCiAgICBpZiAoc25hcERpZmYgIT09IG51bGwgJiYgd29ya1RyZWVBICE9PSBudWxsKSB7CiAgICAgIHZhciBzdWZmaXhBID0gdW50cmFja2VkU3VmZml4KCk7CiAgICAgIGlmIChzdWZmaXhBID09PSBudWxsKSByZXR1cm4gbnVsbDsKICAgICAgdmFyIGNvbWJpbmVkID0gc25hcERpZmYgKyAod29ya1RyZWVBID8gJ1xuJyArIHdvcmtUcmVlQSA6ICcnKSArIHN1ZmZpeEE7CiAgICAgIC8vIFNuYXBzaG90IHBhdGg6IGFsbG93IFNNQUxMIHJldmlldy1maXggc2hhcGUgYmVjYXVzZSB0aGUgb3JpZ2luYWwgL3NpbXBsaWZ5CiAgICAgIC8vIGFscmVhZHkgY292ZXJlZCB0aGUgc3VyZmFjZSBhbmQgb25seSB0aW55IG5vLWRlY2wtdG91Y2hpbmcgdHdlYWtzIGZvbGxvd2VkLgogICAgICB2YXIgaGl0ID0gdHJ5Q2xhc3NpZnkoY29tYmluZWQsICdkZWx0YSBzaW5jZSBsYXN0IC9zaW1wbGlmeScsIHRydWUpOwogICAgICBpZiAoaGl0KSByZXR1cm4gaGl0OwogICAgfQogIH0KCiAgLy8gQmFzZWxpbmUgcGF0aDogY2xhc3NpZnkgdGhlIHdob2xlIGJyYW5jaCB2cyBtZXJnZS1iYXNlLgogIHZhciBiYXNlcyA9IFsnb3JpZ2luL21haW4nLCAnbWFpbicsICdvcmlnaW4vbWFzdGVyJywgJ21hc3RlciddOwogIGZvciAodmFyIGkgPSAwOyBpIDwgYmFzZXMubGVuZ3RoOyBpKyspIHsKICAgIHZhciBiYXNlOwogICAgdHJ5IHsKICAgICAgYmFzZSA9IGNwLmV4ZWNGaWxlU3luYygnZ2l0JywgWydtZXJnZS1iYXNlJywgJ0hFQUQnLCBiYXNlc1tpXV0sIHsKICAgICAgICBjd2Q6IFBST0pFQ1RfRElSLCBlbmNvZGluZzogJ3V0Zi04JywgdGltZW91dDogMjAwMCwgd2luZG93c0hpZGU6IHRydWUsCiAgICAgICAgc3RkaW86IFsnaWdub3JlJywgJ3BpcGUnLCAnaWdub3JlJ10KICAgICAgfSkudHJpbSgpOwogICAgfSBjYXRjaCAoZSkgeyBjb250aW51ZTsgfQogICAgaWYgKCFiYXNlKSBjb250aW51ZTsKICAgIHZhciBicmFuY2hEaWZmID0gZ2l0RGlmZihbJ2RpZmYnLCBiYXNlICsgJy4uLkhFQUQnXSk7CiAgICB2YXIgd29ya1RyZWVCID0gZ2l0RGlmZihbJ2RpZmYnLCAnSEVBRCddKTsKICAgIGlmIChicmFuY2hEaWZmICE9PSBudWxsICYmIHdvcmtUcmVlQiAhPT0gbnVsbCkgewogICAgICB2YXIgc3VmZml4QiA9IHVudHJhY2tlZFN1ZmZpeCgpOwogICAgICBpZiAoc3VmZml4QiA9PT0gbnVsbCkgcmV0dXJuIG51bGw7CiAgICAgIHJldHVybiB0cnlDbGFzc2lmeShicmFuY2hEaWZmICsgKHdvcmtUcmVlQiA/ICdcbicgKyB3b3JrVHJlZUIgOiAnJykgKyBzdWZmaXhCLCAnYnJhbmNoIGRpZmYnKTsKICAgIH0KICAgIGJyZWFrOwogIH0KICByZXR1cm4gbnVsbDsKfQoKLy8gR2V0IHRoZSBmaWxlIGxpc3QgY2hhbmdlZCBvbiB0aGUgY3VycmVudCBicmFuY2ggdnMgdGhlIG1lcmdlLWJhc2Ugd2l0aCBvcmlnaW4vbWFpbgovLyAoZmFsbGluZyBiYWNrIHRvIGxvY2FsIG1haW4pLiBSZXR1cm5zIGFuIGFycmF5IG9mIHJlcG8tcmVsYXRpdmUgcGF0aHMsIG9yIG51bGwgb24KLy8gZmFpbHVyZSDigJQgaW4gd2hpY2ggY2FzZSBjYWxsZXJzIE1VU1QgZmFsbCB0aHJvdWdoIHRvIHRoZSBzdGFuZGFyZCBnYXRlIChmYWlsLXNhZmUpLgpmdW5jdGlvbiBnZXRDaGFuZ2VkRmlsZXNWc0Jhc2UoKSB7CiAgdmFyIGJhc2VzID0gWydvcmlnaW4vbWFpbicsICdtYWluJywgJ29yaWdpbi9tYXN0ZXInLCAnbWFzdGVyJ107CiAgdmFyIGJhc2UgPSBudWxsOwogIGZvciAodmFyIGkgPSAwOyBpIDwgYmFzZXMubGVuZ3RoOyBpKyspIHsKICAgIHRyeSB7CiAgICAgIGJhc2UgPSBjcC5leGVjRmlsZVN5bmMoJ2dpdCcsIFsnbWVyZ2UtYmFzZScsICdIRUFEJywgYmFzZXNbaV1dLCB7CiAgICAgICAgY3dkOiBQUk9KRUNUX0RJUiwgZW5jb2Rpbmc6ICd1dGYtOCcsIHRpbWVvdXQ6IDIwMDAsIHdpbmRvd3NIaWRlOiB0cnVlLAogICAgICAgIHN0ZGlvOiBbJ2lnbm9yZScsICdwaXBlJywgJ2lnbm9yZSddCiAgICAgIH0pLnRyaW0oKTsKICAgICAgaWYgKGJhc2UpIGJyZWFrOwogICAgfSBjYXRjaCAoZSkgeyAvKiB0cnkgbmV4dCAqLyB9CiAgfQogIGlmICghYmFzZSkgcmV0dXJuIG51bGw7CiAgdHJ5IHsKICAgIHZhciBvdXQgPSBjcC5leGVjRmlsZVN5bmMoJ2dpdCcsIFsnZGlmZicsICctLW5hbWUtb25seScsIGJhc2UgKyAnLi4uSEVBRCddLCB7CiAgICAgIGN3ZDogUFJPSkVDVF9ESVIsIGVuY29kaW5nOiAndXRmLTgnLCB0aW1lb3V0OiAyMDAwLCB3aW5kb3dzSGlkZTogdHJ1ZSwKICAgICAgc3RkaW86IFsnaWdub3JlJywgJ3BpcGUnLCAnaWdub3JlJ10KICAgIH0pOwogICAgcmV0dXJuIG91dC5zcGxpdCgnXG4nKS5tYXAoZnVuY3Rpb24obCkgeyByZXR1cm4gbC50cmltKCk7IH0pLmZpbHRlcihCb29sZWFuKTsKICB9IGNhdGNoIChlKSB7IHJldHVybiBudWxsOyB9Cn0KCi8vICMxMzc0IOKAlCB0aGUgbWlzc2luZyBoYWxmIG9mIHRoZSBUYXNrQ3JlYXRlIHJlbWluZGVyLgovLwovLyBtb2ZsbyBuYWdzIHlvdSB0byBPUEVOIGEgdGFzayBsaXN0IChjaGVjay1iZWZvcmUtYWdlbnQpIGFuZCB0aGVuIG5ldmVyIGxvb2tzCi8vIGFnYWluOiBgdGFza0NvdW50YCBvbmx5IGNvdW50cyB1cCwgc28gYSBydW4gdGhhdCBjcmVhdGVzIGZvdXIgdGFza3MgYW5kIGNsb3NlcwovLyBub25lIHNhdGlzZmllcyBldmVyeSBnYXRlLiBUaGF0IGlzIHRoZSBleGFjdCBzaGFwZSBvZiBhbiBhYmFuZG9uZWQgbGlzdC4KLy8KLy8gVGhlIGxlZGdlciBpcyByZWFkIGZyb20gdGhlIHNlc3Npb24gVFJBTlNDUklQVCwgYW5kIGJvdGggYWx0ZXJuYXRpdmVzIHdlcmUKLy8gcmVqZWN0ZWQgb24gZXZpZGVuY2UgcmF0aGVyIHRoYW4gdGFzdGU6Ci8vCi8vICAgLSBBIGBeVGFza1VwZGF0ZSRgIFBvc3RUb29sVXNlIG9ic2VydmVyIGZlZWRpbmcgYSBjb3VudGVyIGlzIHRoZSB3aXJpbmcKLy8gICAgICMxMzMxIHJlbW92ZWQgYXMgcHVyZSBob3QtcGF0aCBvdmVyaGVhZC4gSXQgd291bGQgYWxzbyBoYXZlIHRvIHN1cnZpdmUKLy8gICAgIGFwcGx5UHJvbXB0U3RhdGVSZXNldCwgd2hlcmVhcyBhIHRyYW5zY3JpcHQgcmVhZCBob2xkcyBubyBzdGF0ZSB0byByZXNldC4KLy8gICAtIENsYXVkZSBDb2RlJ3Mgb3duIHRhc2sgc3RvcmUgKGB+Ly5jbGF1ZGUvdGFza3Mvc2Vzc2lvbi08aWQ+L2ApIGlzIGdyb3VuZAovLyAgICAgdHJ1dGggYnV0IHVucmVhY2hhYmxlOiBtZWFzdXJlZCBvbiB2Mi4xLjIyMCwgdGhlIGlkIGtleWluZyB0aGF0IGRpcmVjdG9yeQovLyAgICAgZG9lcyBOT1Qgcm90YXRlIG9uIGAvY2xlYXJgLCBzbyBhIHNlc3Npb24gd2hvc2UgdHJhbnNjcmlwdCBpcyA8QT4gd3JpdGVzCi8vICAgICBpdHMgdGFza3MgdW5kZXIgdGhlIHByZS1jbGVhciBpZCA8Qj4g4oCUIGFuZCA8QT4gaXMgd2hhdCB0aGUgYnJpZGdlIGZvcndhcmRzCi8vICAgICBhcyBIT09LX1NFU1NJT05fSUQuIFRoZXJlIGlzIG5vIHBhdGggZnJvbSB0aGUgaG9vayBlbnZpcm9ubWVudCB0byB0aGUgZGlyLgovLwovLyBDb3N0IGxhbmRzIG9ubHkgd2hlcmUgaXQgaXMgYWxyZWFkeSBqdXN0aWZpZWQ6IHRoZSBzb2xlIGNhbGxlciBydW5zIGFmdGVyCi8vIGNoZWNrLWJlZm9yZS1wcidzIGBnaCBwciBjcmVhdGVgIG1hdGNoLCBpLmUuIG9uY2UgcGVyIFBSIGF0dGVtcHQsIG5ldmVyIG9uIHRoZQovLyBwZXItdG9vbCBwYXRoLgovLwovLyBSZXR1cm5zIG51bGwgd2hlbiB0aGUgdHJhbnNjcmlwdCBpcyBtaXNzaW5nLCBvdmVyc2l6ZWQsIHVucmVhZGFibGUsIG9yIHJlY29yZHMKLy8gbm8gVGFza0NyZWF0ZSBhdCBhbGwg4oCUIHRoZSBjYWxsZXIgdGhlbiBzdGF5cyBzaWxlbnQgcmF0aGVyIHRoYW4gZ3Vlc3NpbmcuCi8vIFNpemVkIGFnYWluc3QgbWVhc3VyZW1lbnQsIG5vdCBhIHJvdW5kIG51bWJlcjogYSAzLjRNQiB0cmFuc2NyaXB0ICh0aGUgbGFyZ2VzdAovLyBpbiBhIHdlZWsgb2YgbG9jYWwgc2Vzc2lvbnMpIGNvc3RzIH41NW1zIHRvIHNjYW4sIHNvIH4xNm1zL01CLiAxNk1CIGlzIH40eCB0aGUKLy8gd29yc3Qgb2JzZXJ2ZWQgc2Vzc2lvbiBhbmQgbGFuZHMgbmVhciAyNjBtcyDigJQgYSBjaHVuayBvZiB0aGUgaG9vaydzIDIwMDBtcwovLyBidWRnZXQsIGJ1dCBhIGJvdW5kZWQgb25lLiBQYXN0IHRoZSBjYXAgdGhlIGxlZGdlciBnb2VzIHNpbGVudCByYXRoZXIgdGhhbgovLyByaXNraW5nIHRoZSB0aW1lb3V0LCBzaW5jZSBhIGhvb2sgdGhhdCB0aW1lcyBvdXQgaXMgd29yc2UgdGhhbiBvbmUgdGhhdAovLyBkZWNsaW5lcyB0byBjb21tZW50LiBVbnJlbGF0ZWQgdG8gYFRSQU5TQ1JJUFRfVEFJTF9CWVRFU2AgaW4gYmluL2xpYi9tZWRpdGF0ZS5tanMKLy8gZGVzcGl0ZSB0aGUgc2ltaWxhciBuYW1lIOKAlCB0aGF0IG9uZSB0cnVuY2F0ZXMgdG8gYSB0YWlsIHdpbmRvdywgd2hpY2ggY2Fubm90Ci8vIHdvcmsgaGVyZSAoYSBUYXNrQ3JlYXRlIGZyb20gZWFybHkgaW4gdGhlIHNlc3Npb24gZmFsbHMgb3V0c2lkZSBhbnkgdGFpbCkuCnZhciBUUkFOU0NSSVBUX01BWF9CWVRFUyA9IDE2ICogMTAyNCAqIDEwMjQ7CmZ1bmN0aW9uIHJlYWRUYXNrTGVkZ2VyKCkgewogIHZhciB0cCA9IHByb2Nlc3MuZW52LkhPT0tfVFJBTlNDUklQVF9QQVRIIHx8ICcnOwogIGlmICghdHApIHJldHVybiBudWxsOwogIHZhciByYXc7CiAgdHJ5IHsKICAgIHZhciBzdCA9IGZzLnN0YXRTeW5jKHRwKTsKICAgIGlmICghc3QuaXNGaWxlKCkgfHwgc3Quc2l6ZSA+IFRSQU5TQ1JJUFRfTUFYX0JZVEVTKSByZXR1cm4gbnVsbDsKICAgIHJhdyA9IGZzLnJlYWRGaWxlU3luYyh0cCwgJ3V0Zi04Jyk7CiAgfSBjYXRjaCAoZSkgeyByZXR1cm4gbnVsbDsgfQogIHZhciBjcmVhdGVkID0gMDsgICAgICAgICAgICAgICAgICAgICAgIC8vIFRhc2tDcmVhdGUgQ0FMTFMgc2VlbgogIHZhciBwZW5kaW5nQ3JlYXRlcyA9IHt9OyAgICAgICAgICAgICAgIC8vIHRvb2xfdXNlIGlkIOKGkiBhd2FpdGluZyBpdHMgcmVzdWx0CiAgdmFyIGNyZWF0ZWRJZHMgPSB7fTsgICAgICAgICAgICAgICAgICAgLy8gdGFzayBpZHMgdGhpcyB0cmFuc2NyaXB0IGFjdHVhbGx5IG9wZW5lZAogIHZhciBjcmVhdGVkSWRDb3VudCA9IDA7CiAgdmFyIGxhdGVzdCA9IHt9OyAgICAgICAgICAgICAgICAgICAgICAgLy8gdGFzayBpZCDihpIgbW9zdCByZWNlbnQgc3RhdHVzIHNlZW4KICAvLyBXYWxrZWQgYnkgbmV3bGluZSBpbmRleCByYXRoZXIgdGhhbiByYXcuc3BsaXQoJ1xuJyk6IHRoZSBzcGxpdCB3b3VsZCBob2xkIGEKICAvLyBzZWNvbmQgZnVsbC1zaXplIGNvcHkgb2YgYSBtdWx0aS1NQiB0cmFuc2NyaXB0IGFsb25nc2lkZSB0aGUgZmlyc3QsIGFuZCB0aGUKICAvLyBzY2FuIG5lZWRzIG9uZSBsaW5lIGF0IGEgdGltZS4KICB2YXIgcG9zID0gMDsKICB3aGlsZSAocG9zIDw9IHJhdy5sZW5ndGgpIHsKICAgIHZhciBubCA9IHJhdy5pbmRleE9mKCdcbicsIHBvcyk7CiAgICB2YXIgbGluZSA9IG5sIDwgMCA/IHJhdy5zbGljZShwb3MpIDogcmF3LnNsaWNlKHBvcywgbmwpOwogICAgcG9zID0gbmwgPCAwID8gcmF3Lmxlbmd0aCArIDEgOiBubCArIDE7CiAgICAvLyBDaGVhcCBwcmUtZmlsdGVyLiBBIG11bHRpLU1CIHRyYW5zY3JpcHQgaGFzIGEgaGFuZGZ1bCBvZiB0YXNrIGxpbmVzIGFuZAogICAgLy8gdGVucyBvZiB0aG91c2FuZHMgb2Ygb3RoZXJzOyBKU09OLnBhcnNlIG9uIGV2ZXJ5IGxpbmUgaXMgdGhlIHdob2xlIGNvc3QuCiAgICBpZiAobGluZS5pbmRleE9mKCdUYXNrQ3JlYXRlJykgPCAwICYmIGxpbmUuaW5kZXhPZignVGFza1VwZGF0ZScpIDwgMAogICAgICAmJiBsaW5lLmluZGV4T2YoJ2NyZWF0ZWQgc3VjY2Vzc2Z1bGx5JykgPCAwKSBjb250aW51ZTsKICAgIHZhciBlbnRyeTsKICAgIHRyeSB7IGVudHJ5ID0gSlNPTi5wYXJzZShsaW5lKTsgfSBjYXRjaCAoZSkgeyBjb250aW51ZTsgfQogICAgdmFyIGNvbnRlbnQgPSBlbnRyeSAmJiBlbnRyeS5tZXNzYWdlICYmIGVudHJ5Lm1lc3NhZ2UuY29udGVudDsKICAgIGlmICghQXJyYXkuaXNBcnJheShjb250ZW50KSkgY29udGludWU7CiAgICBmb3IgKHZhciBqID0gMDsgaiA8IGNvbnRlbnQubGVuZ3RoOyBqKyspIHsKICAgICAgdmFyIGJsb2NrID0gY29udGVudFtqXTsKICAgICAgaWYgKCFibG9jaykgY29udGludWU7CiAgICAgIC8vIFRoZSBjcmVhdGVkIGlkcyBjb21lIGZyb20gVGFza0NyZWF0ZSdzIFJFU1VMVCwgYmVjYXVzZSB0aGUgY2FsbCBpdHNlbGYKICAgICAgLy8gY2FycmllcyBubyBpZC4gV2l0aG91dCB0aGVtIGBjcmVhdGVkYCAoYSBjb3VudCBvZiBjYWxscykgYW5kIHRoZSBjbG9zZWQKICAgICAgLy8gc2V0IChhIHNldCBvZiBpZHMpIGFyZSBkaWZmZXJlbnQgdW5pdHM6IGEgVGFza1VwZGF0ZSBuYW1pbmcgYSB0YXNrIGZyb20KICAgICAgLy8gYmVmb3JlIHRoaXMgdHJhbnNjcmlwdCDigJQgb25lIGNhcnJpZWQgYWNyb3NzIGAvY2xlYXJgLCB3aGljaCBpcyBleGFjdGx5CiAgICAgIC8vIHdoYXQgQ2xhdWRlIENvZGUncyB0YXNrIHN0b3JlIGRvZXMg4oCUIHdvdWxkIGRpc2NvdW50IGEgdGFzayBpdCBuZXZlcgogICAgICAvLyBvcGVuZWQsIGFuZCB0aGUgYWR2aXNvcnkgd291bGQgdW5kZXItcmVwb3J0IHRoZSBvcGVuIGxpc3QuCiAgICAgIGlmIChibG9jay50eXBlID09PSAndG9vbF9yZXN1bHQnKSB7CiAgICAgICAgaWYgKCFwZW5kaW5nQ3JlYXRlc1tibG9jay50b29sX3VzZV9pZF0pIGNvbnRpbnVlOwogICAgICAgIGRlbGV0ZSBwZW5kaW5nQ3JlYXRlc1tibG9jay50b29sX3VzZV9pZF07CiAgICAgICAgdmFyIHRleHQgPSB0eXBlb2YgYmxvY2suY29udGVudCA9PT0gJ3N0cmluZycgPyBibG9jay5jb250ZW50IDogSlNPTi5zdHJpbmdpZnkoYmxvY2suY29udGVudCk7CiAgICAgICAgdmFyIG0gPSAvVGFzayAjKFxTKykgY3JlYXRlZCBzdWNjZXNzZnVsbHkvLmV4ZWModGV4dCB8fCAnJyk7CiAgICAgICAgaWYgKG0gJiYgIWNyZWF0ZWRJZHNbbVsxXV0pIHsgY3JlYXRlZElkc1ttWzFdXSA9IHRydWU7IGNyZWF0ZWRJZENvdW50Kys7IH0KICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICAvLyBTdHJ1Y3R1cmFsLCBub3Qgc3Vic3RyaW5nLiBBIGxpbmUgdGhhdCBtZXJlbHkgTUVOVElPTlMgVGFza0NyZWF0ZSDigJQgdGhpcwogICAgICAvLyB0aWNrZXQncyBvd24gZGlzY3Vzc2lvbiwgYSBndWlkYW5jZSBleGNlcnB0LCBhIHNoZWxsIGNvbW1hbmQgZWNob2luZyB0aGUKICAgICAgLy8gcGhyYXNlIOKAlCBpcyB0ZXh0LCBhbmQgY291bnRpbmcgaXQgd291bGQgaW5mbGF0ZSB0aGUgY3JlYXRlZCB0b3RhbCBvbgogICAgICAvLyBleGFjdGx5IHRoZSBzZXNzaW9ucyBtb3N0IGxpa2VseSB0byByZWFjaCBhIFBSIGdhdGUuIENvcnJlbGF0aW5nIG9uCiAgICAgIC8vIHRvb2xfdXNlX2lkIGlzIHdoYXQga2VlcHMgc3VjaCBhbiBlY2hvIG91dCBvZiB0aGUgY3JlYXRlZCBpZHMgdG9vLgogICAgICBpZiAoYmxvY2sudHlwZSAhPT0gJ3Rvb2xfdXNlJykgY29udGludWU7CiAgICAgIGlmIChibG9jay5uYW1lID09PSAnVGFza0NyZWF0ZScpIHsKICAgICAgICBjcmVhdGVkKys7CiAgICAgICAgaWYgKGJsb2NrLmlkKSBwZW5kaW5nQ3JlYXRlc1tibG9jay5pZF0gPSB0cnVlOwogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGlmIChibG9jay5uYW1lICE9PSAnVGFza1VwZGF0ZScpIGNvbnRpbnVlOwogICAgICB2YXIgaW5wdXQgPSBibG9jay5pbnB1dCB8fCB7fTsKICAgICAgdmFyIGlkID0gaW5wdXQudGFza0lkICE9IG51bGwgPyBpbnB1dC50YXNrSWQgOiBpbnB1dC50YXNrX2lkOwogICAgICB2YXIgc3RhdHVzID0gaW5wdXQuc3RhdHVzOwogICAgICBpZiAoaWQgPT0gbnVsbCB8fCB0eXBlb2Ygc3RhdHVzICE9PSAnc3RyaW5nJyB8fCAhc3RhdHVzKSBjb250aW51ZTsKICAgICAgLy8gTGFzdCB3cml0ZSB3aW5zIOKAlCB0cmFuc2NyaXB0IG9yZGVyIGlzIGNocm9ub2xvZ2ljYWwsIHNvIGEgdGFzayByZW9wZW5lZAogICAgICAvLyBhZnRlciBjb21wbGV0aW9uIGlzIGNvcnJlY3RseSBjb3VudGVkIGFzIG9wZW4gYWdhaW4uCiAgICAgIGxhdGVzdFtTdHJpbmcoaWQpXSA9IHN0YXR1czsKICAgIH0KICB9CiAgaWYgKGNyZWF0ZWQgPT09IDApIHJldHVybiBudWxsOwogIC8vIEEgY3JlYXRlIHdob3NlIHJlc3VsdCBuZXZlciBsYW5kZWQgKGludGVycnVwdGVkIGNhbGwsIHRydW5jYXRlZCB0cmFuc2NyaXB0KQogIC8vIGlzIGNvdW50ZWQgT1BFTjogaXQgd2FzIG9wZW5lZCwgYW5kIG5vdGhpbmcgb2JzZXJ2ZWQgaXQgYmVpbmcgY2xvc2VkLgogIHZhciBvcGVuID0gY3JlYXRlZCAtIGNyZWF0ZWRJZENvdW50OwogIE9iamVjdC5rZXlzKGNyZWF0ZWRJZHMpLmZvckVhY2goZnVuY3Rpb24oaWQpIHsKICAgIC8vIGBkZWxldGVkYCBjbG9zZXMgdGhlIGxvb3AgYXMgbGVnaXRpbWF0ZWx5IGFzIGBjb21wbGV0ZWRgOiBhIHRhc2sgcmVtb3ZlZAogICAgLy8gYmVjYXVzZSBpdCBubyBsb25nZXIgYXBwbGllcyBpcyBub3QgYW4gYWJhbmRvbmVkIG9uZS4KICAgIGlmIChsYXRlc3RbaWRdICE9PSAnY29tcGxldGVkJyAmJiBsYXRlc3RbaWRdICE9PSAnZGVsZXRlZCcpIG9wZW4rKzsKICB9KTsKICBpZiAob3BlbiA+IGNyZWF0ZWQpIG9wZW4gPSBjcmVhdGVkOwogIHJldHVybiB7IGNyZWF0ZWQ6IGNyZWF0ZWQsIGNsb3NlZDogY3JlYXRlZCAtIG9wZW4sIG9wZW46IG9wZW4gfTsKfQoKc3dpdGNoIChjb21tYW5kKSB7CiAgY2FzZSAnY2hlY2stYmVmb3JlLWFnZW50JzogewogICAgLy8gTW9zdGx5IGFkdmlzb3J5LiBUaGUgVGFza0NyZWF0ZSArIG1lbW9yeSByZW1pbmRlcnMgYmVsb3cgZ28gdG8gc3Rkb3V0IGFuZAogICAgLy8gbmV2ZXIgYmxvY2sg4oCUIHRoZWlyIHdvcmRpbmcgbXVzdCBub3QgY2xhaW0gb3RoZXJ3aXNlICgjMTMyNikuIFRoZSBvbmUKICAgIC8vIGV4Y2VwdGlvbiBpcyB0aGUgIzk1MiBzd2FybS9oaXZlIGNoZWNrIGF0IHRoZSBib3R0b20gb2YgdGhpcyBjYXNlLCB3aGljaAogICAgLy8gd3JpdGVzIHRvIHN0ZGVyciBhbmQgZXhpdHMgMi4KICAgIC8vIE1lbW9yeS1maXJzdCBlbmZvcmNlbWVudCBvdGhlcndpc2UgaGFwcGVucyBhdCB0aGUgc2Nhbi9yZWFkIGdhdGUgbGF5ZXIuCiAgICAvLyBTdWJhZ2VudFN0YXJ0IGhvb2sgaW5qZWN0cyBndWlkYW5jZSBkaXJlY3RpdmUgaW50byBzdWJhZ2VudCBjb250ZXh0LgogICAgLy8KICAgIC8vICM5MzEg4oCUIFRhc2tDcmVhdGUgUkVNSU5ERVIgYW5kIHRoZSBuYW1lc3BhY2UgaGludCBtb3ZlZCBoZXJlIGZyb20KICAgIC8vIHByb21wdC1yZW1pbmRlci4gVGhleSBvbmx5IG1hdHRlciB3aGVuIENsYXVkZSBpcyBhY3R1YWxseSBhYm91dCB0byBzcGF3bgogICAgLy8gYW4gQWdlbnQ7IGVtaXR0aW5nIHBlci1wcm9tcHQgY29zdCB+OTAgdG9rZW5zIMOXIGV2ZXJ5IHByb21wdCDDlyBldmVyeQogICAgLy8gY29uc3VtZXIuCiAgICB2YXIgcyA9IHJlYWRTdGF0ZSgpOwogICAgaWYgKGNvbmZpZy50YXNrX2NyZWF0ZV9maXJzdCAmJiAhcy50YXNrc0NyZWF0ZWQpIHsKICAgICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoJ1JFTUlOREVSOiBVc2UgVGFza0NyZWF0ZSBiZWZvcmUgc3Bhd25pbmcgYWdlbnRzLlxuJyk7CiAgICB9CiAgICBpZiAoY29uZmlnLm1lbW9yeV9maXJzdCAmJiBzLm1lbW9yeVJlcXVpcmVkICYmICFzLm1lbW9yeVNlYXJjaGVkKSB7CiAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKCdSRU1JTkRFUjogU2VhcmNoIG1lbW9yeSAobWNwX19tb2Zsb19fbWVtb3J5X3NlYXJjaCkgYmVmb3JlIHNwYXduaW5nIGFnZW50cy4gT24gY2h1bmsgaGl0cywgdHJhdmVyc2UgdmlhIG1jcF9fbW9mbG9fX21lbW9yeV9nZXRfbmVpZ2hib3JzIOKAlCBzZWUgLmNsYXVkZS9ndWlkYW5jZS9tb2Zsby1tZW1vcnktcHJvdG9jb2wubWRcbicpOwogICAgfQogICAgaWYgKHMubGFzdE5hbWVzcGFjZUhpbnQpIHsKICAgICAgLy8gUGVyLWFjdG9yIHNpbmdsZS1zaG90LiBFYWNoIHNlc3Npb25faWQgZ2V0cyB0aGUgaGludCBhdCBtb3N0IG9uY2UgcGVyCiAgICAgIC8vIHByb21wdCwgYnV0IHRoZSBoaW50IGl0c2VsZiBzdGF5cyBhdmFpbGFibGUgZm9yIG90aGVyIGFjdG9ycyAoZS5nLgogICAgICAvLyBhIHN1YmFnZW50IHRoYXQgc3Bhd25zIGl0cyBvd24gYWdlbnQgaGFzIGl0cyBvd24gc2Vzc2lvbl9pZCBhbmQgaXMKICAgICAgLy8gZW50aXRsZWQgdG8gYSBmcmVzaCBlbWlzc2lvbikuIEZhbGxzIGJhY2sgdG8gYSBgX2xlZ2FjeV9gIGJ1Y2tldCB3aGVuCiAgICAgIC8vIENsYXVkZSBDb2RlIGRpZG4ndCBmb3J3YXJkIGEgc2Vzc2lvbl9pZCAob2xkZXIgaG9zdCBvciBkaXJlY3QgQ0xJCiAgICAgIC8vIGludm9jYXRpb24pLCBwcmVzZXJ2aW5nIHRoZSBvbGQgImVtaXQgb25jZSBnbG9iYWxseSIgYmVoYXZpb3IuIFRoZQogICAgICAvLyBtYXAgaXMgd2lwZWQgYnkgYXBwbHlQcm9tcHRTdGF0ZVJlc2V0IG9uIGV2ZXJ5IG5ldyBwcm9tcHQuCiAgICAgIHZhciBzaWQgPSBwcm9jZXNzLmVudi5IT09LX1NFU1NJT05fSUQgfHwgJyc7CiAgICAgIHZhciBlbWl0dGVkQnkgPSBzLmxhc3ROYW1lc3BhY2VIaW50RW1pdHRlZEJ5IHx8IHt9OwogICAgICB2YXIgYnVja2V0ID0gc2lkIHx8ICdfbGVnYWN5Xyc7CiAgICAgIGlmICghZW1pdHRlZEJ5W2J1Y2tldF0pIHsKICAgICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZShzLmxhc3ROYW1lc3BhY2VIaW50ICsgJ1xuJyk7CiAgICAgICAgZW1pdHRlZEJ5W2J1Y2tldF0gPSB0cnVlOwogICAgICAgIHMubGFzdE5hbWVzcGFjZUhpbnRFbWl0dGVkQnkgPSBlbWl0dGVkQnk7CiAgICAgICAgd3JpdGVTdGF0ZShzKTsKICAgICAgfQogICAgfQogICAgLy8gIzk1MiDigJQgd2hlbiAvZmwgd2FzIGludm9rZWQgd2l0aCAtcy8taCwgdGhlIHByb3RlY3RlZCBNQ1AgaW5pdCBtdXN0IHJ1bgogICAgLy8gQkVGT1JFIGFueSBBZ2VudCBzcGF3bi4gSGFyZCBibG9jazogdGhlIHVzZXIgZXhwbGljaXRseSBvcHRlZCBpbiB0bwogICAgLy8gbW9mbG8ncyBjb29yZGluYXRpb24gc3VyZmFjZSwgc28gc2lsZW50bHkgZGlzcGF0Y2hpbmcgYEFnZW50YCBjYWxscwogICAgLy8gd2l0aG91dCBgbWNwX19tb2Zsb19fc3dhcm1faW5pdGAgLyBgbWNwX19tb2Zsb19faGl2ZS1taW5kX2luaXRgIGlzIHRoZQogICAgLy8gZmFpbHVyZSBtb2RlIHRoaXMgZ2F0ZSBleGlzdHMgdG8gcHJldmVudCAoQ0xBVURFLm1kICLim5QgUHJvdGVjdGVkCiAgICAvLyBmdW5jdGlvbmFsaXR5IOKAlCBzd2FybSArIGhpdmUtbWluZCIpLiBPdGhlciBBZ2VudCB1c2VzIHJlbWFpbiBhZHZpc29yeS4KICAgIGlmIChjb25maWcuc3dhcm1faW52b2NhdGlvbl9nYXRlKSB7CiAgICAgIGlmIChzLmZsTW9kZSA9PT0gJ3N3YXJtJyAmJiAhcy5zd2FybUluaXRpYWxpemVkKSB7CiAgICAgICAgcHJvY2Vzcy5zdGRlcnIud3JpdGUoJ0JMT0NLRUQ6IC9mbCB3YXMgaW52b2tlZCB3aXRoIC1zLy0tc3dhcm0gYnV0IG1jcF9fbW9mbG9fX3N3YXJtX2luaXQgaGFzIG5vdCBiZWVuIGNhbGxlZC5cbicpOwogICAgICAgIHByb2Nlc3Muc3RkZXJyLndyaXRlKCdSdW4gbWNwX19tb2Zsb19fc3dhcm1faW5pdCBmaXJzdCwgdGhlbiBtY3BfX21vZmxvX19hZ2VudF9zcGF3biBmb3IgZWFjaCByb2xlLCB0aGVuIGRpc3BhdGNoIEFnZW50LlxuJyk7CiAgICAgICAgcHJvY2Vzcy5zdGRlcnIud3JpdGUoQ09PUkRfRkFMTEJBQ0tfTk9URSArICcgIG5weCBmbG8gc3dhcm0gaW5pdCAtLXRvcG9sb2d5IGhpZXJhcmNoaWNhbCAgKHRoZW46IG5weCBmbG8gYWdlbnQgc3Bhd24gLS10eXBlIDxyb2xlPilcbicpOwogICAgICAgIHByb2Nlc3Muc3RkZXJyLndyaXRlKCdTZWUgLmNsYXVkZS9za2lsbHMvZmwvZXhlY3V0aW9uLW1vZGVzLm1kICJTV0FSTSBtb2RlIiBhbmQgQ0xBVURFLm1kICLim5QgUHJvdGVjdGVkIGZ1bmN0aW9uYWxpdHkiLlxuJyk7CiAgICAgICAgcHJvY2Vzcy5zdGRlcnIud3JpdGUoJ0Rpc2FibGUgdmlhIG1vZmxvLnlhbWw6IGdhdGVzOiBzd2FybV9pbnZvY2F0aW9uX2dhdGU6IGZhbHNlXG4nKTsKICAgICAgICBwcm9jZXNzLmV4aXQoMik7CiAgICAgIH0KICAgICAgaWYgKHMuZmxNb2RlID09PSAnaGl2ZScgJiYgIXMuaGl2ZUluaXRpYWxpemVkKSB7CiAgICAgICAgcHJvY2Vzcy5zdGRlcnIud3JpdGUoJ0JMT0NLRUQ6IC9mbCB3YXMgaW52b2tlZCB3aXRoIC1oLy0taGl2ZSBidXQgbWNwX19tb2Zsb19faGl2ZS1taW5kX2luaXQgaGFzIG5vdCBiZWVuIGNhbGxlZC5cbicpOwogICAgICAgIHByb2Nlc3Muc3RkZXJyLndyaXRlKCdSdW4gbWNwX19tb2Zsb19faGl2ZS1taW5kX2luaXQgZmlyc3QsIHRoZW4gZGlzcGF0Y2ggQWdlbnQgb3IgaGl2ZS1taW5kIHdvcmtlcnMuXG4nKTsKICAgICAgICBwcm9jZXNzLnN0ZGVyci53cml0ZShDT09SRF9GQUxMQkFDS19OT1RFICsgJyAgbnB4IGZsbyBoaXZlLW1pbmQgaW5pdCAgKHRoZW46IG5weCBmbG8gaGl2ZS1taW5kIHNwYXduKVxuJyk7CiAgICAgICAgcHJvY2Vzcy5zdGRlcnIud3JpdGUoJ1NlZSAuY2xhdWRlL3NraWxscy9mbC9leGVjdXRpb24tbW9kZXMubWQgIkhJVkUtTUlORCBtb2RlIiBhbmQgQ0xBVURFLm1kICLim5QgUHJvdGVjdGVkIGZ1bmN0aW9uYWxpdHkiLlxuJyk7CiAgICAgICAgcHJvY2Vzcy5zdGRlcnIud3JpdGUoJ0Rpc2FibGUgdmlhIG1vZmxvLnlhbWw6IGdhdGVzOiBzd2FybV9pbnZvY2F0aW9uX2dhdGU6IGZhbHNlXG4nKTsKICAgICAgICBwcm9jZXNzLmV4aXQoMik7CiAgICAgIH0KICAgIH0KICAgIGJyZWFrOwogIH0KICBjYXNlICdyZWNvcmQtc3dhcm0taW5pdCc6IHsKICAgIC8vICM5NTIg4oCUIHdpcmVkIHRvIG1jcF9fbW9mbG9fX3N3YXJtX2luaXQgUG9zdFRvb2xVc2UuIE1hcmtzIHRoZSBnYXRlCiAgICAvLyBzYXRpc2ZpZWQgc28gc3Vic2VxdWVudCBBZ2VudCBzcGF3bnMgdW5kZXIgL2ZsIC1zIHBhc3MuCiAgICB2YXIgcyA9IHJlYWRTdGF0ZSgpOwogICAgaWYgKCFzLnN3YXJtSW5pdGlhbGl6ZWQpIHsKICAgICAgcy5zd2FybUluaXRpYWxpemVkID0gdHJ1ZTsKICAgICAgd3JpdGVTdGF0ZShzKTsKICAgIH0KICAgIGJyZWFrOwogIH0KICBjYXNlICdyZWNvcmQtYmFzaC1zd2FybS1pbml0JzogewogICAgLy8gIzEzMzggZm9sbG93LXVwIOKAlCB0aGUgQ0xJIGhhbGYgb2YgcmVjb3JkLXN3YXJtLWluaXQgLyByZWNvcmQtaGl2ZS1pbml0LgogICAgLy8gV2lyZWQgUG9zdFRvb2xVc2VbQmFzaHxQb3dlclNoZWxsXSwgc28gaXQgb25seSBzZWVzIGNvbW1hbmRzIHRoYXQKICAgIC8vIHN1Y2NlZWRlZCAoIzEzMjIpLiBTZWUgYmFzaENvb3JkaW5hdGlvbkluaXQgZm9yIHdoeSB0aGUgQ0xJIHJvdXRlIGlzIGEKICAgIC8vIHJlYWwgc2F0aXNmYWN0aW9uIG9mIHRoZSAjOTUyIGdhdGUgYW5kIG5vdCBhIHN0YW5kLWluLgogICAgdmFyIGtpbmQgPSBiYXNoQ29vcmRpbmF0aW9uSW5pdChwcm9jZXNzLmVudi5UT09MX0lOUFVUX2NvbW1hbmQgfHwgJycpOwogICAgaWYgKCFraW5kKSBicmVhazsKICAgIHZhciBzID0gcmVhZFN0YXRlKCk7CiAgICB2YXIgZmxhZyA9IGtpbmQgPT09ICdzd2FybScgPyAnc3dhcm1Jbml0aWFsaXplZCcgOiAnaGl2ZUluaXRpYWxpemVkJzsKICAgIGlmICghc1tmbGFnXSkgewogICAgICBzW2ZsYWddID0gdHJ1ZTsKICAgICAgd3JpdGVTdGF0ZShzKTsKICAgIH0KICAgIGJyZWFrOwogIH0KICBjYXNlICdyZWNvcmQtaGl2ZS1pbml0JzogewogICAgLy8gIzk1MiDigJQgd2lyZWQgdG8gbWNwX19tb2Zsb19faGl2ZS1taW5kX2luaXQgUG9zdFRvb2xVc2UuCiAgICB2YXIgcyA9IHJlYWRTdGF0ZSgpOwogICAgaWYgKCFzLmhpdmVJbml0aWFsaXplZCkgewogICAgICBzLmhpdmVJbml0aWFsaXplZCA9IHRydWU7CiAgICAgIHdyaXRlU3RhdGUocyk7CiAgICB9CiAgICBicmVhazsKICB9CiAgY2FzZSAnY2hlY2stYmVmb3JlLXNjYW4nOiB7CiAgICBpZiAoIWNvbmZpZy5tZW1vcnlfZmlyc3QpIGJyZWFrOwogICAgdmFyIHMgPSByZWFkU3RhdGUoKTsKICAgIGlmICghcy5tZW1vcnlSZXF1aXJlZCB8fCBpc01lbW9yeVNlYXJjaGVkRm9yKHMpKSBicmVhazsKICAgIHZhciB0YXJnZXQgPSAocHJvY2Vzcy5lbnYuVE9PTF9JTlBVVF9wYXR0ZXJuIHx8ICcnKSArICcgJyArIChwcm9jZXNzLmVudi5UT09MX0lOUFVUX3BhdGggfHwgJycpOwogICAgaWYgKGlzRXBoZW1lcmFsUGF0aChwcm9jZXNzLmVudi5UT09MX0lOUFVUX3BhdGgpKSBicmVhazsKICAgIGlmIChFWEVNUFQuc29tZShmdW5jdGlvbihwKSB7IHJldHVybiB0YXJnZXQuaW5kZXhPZihwKSA+PSAwOyB9KSkgYnJlYWs7CiAgICBwcm9jZXNzLnN0ZGVyci53cml0ZSgnQkxPQ0tFRCBbbW9mbG8gbWVtb3J5X2ZpcnN0IGdhdGVdOiBTZWFyY2ggbWVtb3J5IGJlZm9yZSBleHBsb3JpbmcgZmlsZXMuIFVzZSBtY3BfX21vZmxvX19tZW1vcnlfc2VhcmNoLiBPbiBjaHVuayBoaXRzLCB0cmF2ZXJzZSB2aWEgbWNwX19tb2Zsb19fbWVtb3J5X2dldF9uZWlnaGJvcnMg4oCUIHNlZSAuY2xhdWRlL2d1aWRhbmNlL21vZmxvLW1lbW9yeS1wcm90b2NvbC5tZFxuJyArIE1DUF9GQUxMQkFDS19OT1RFICsgJ1xuJyArIEdBVEVfT1JJR0lOX05PVEUgKyAnXG4nICsgR0FURV9ESVNBQkxFX05PVEUgKyAnXG4nKTsKICAgIHByb2Nlc3MuZXhpdCgyKTsKICB9CiAgY2FzZSAnY2hlY2stYmVmb3JlLXJlYWQnOiB7CiAgICBpZiAoIWNvbmZpZy5tZW1vcnlfZmlyc3QpIGJyZWFrOwogICAgdmFyIHMgPSByZWFkU3RhdGUoKTsKICAgIGlmICghcy5tZW1vcnlSZXF1aXJlZCB8fCBpc01lbW9yeVNlYXJjaGVkRm9yKHMpKSBicmVhazsKICAgIHZhciBmcCA9IHByb2Nlc3MuZW52LlRPT0xfSU5QVVRfZmlsZV9wYXRoIHx8ICcnOwogICAgLy8gRXBoZW1lcmFsIHRtcC9zY3JhdGNoIHJlYWRzIGFyZSBleGVtcHQgZXZlbiB3aGVuIHRoZXkgbG9vayBsaWtlIGd1aWRhbmNlCiAgICAvLyAoYSB0ZW1wIGNvcHkgaXMgc3RpbGwgdHJhbnNpZW50IHRvb2wgSS9PLCBub3QgdGhlIGluZGV4ZWQgc291cmNlKS4KICAgIGlmIChpc0VwaGVtZXJhbFBhdGgoZnApKSBicmVhazsKICAgIHZhciBpc0d1aWRhbmNlID0gZnAuaW5kZXhPZignLmNsYXVkZS9ndWlkYW5jZS8nKSA+PSAwIHx8IGZwLmluZGV4T2YoJy5jbGF1ZGVcXGd1aWRhbmNlXFwnKSA+PSAwOwogICAgaWYgKCFpc0d1aWRhbmNlICYmIEVYRU1QVC5zb21lKGZ1bmN0aW9uKHApIHsgcmV0dXJuIGZwLmluZGV4T2YocCkgPj0gMDsgfSkpIGJyZWFrOwogICAgcHJvY2Vzcy5zdGRlcnIud3JpdGUoJ0JMT0NLRUQgW21vZmxvIG1lbW9yeV9maXJzdCBnYXRlXTogU2VhcmNoIG1lbW9yeSBiZWZvcmUgcmVhZGluZyBmaWxlcy4gVXNlIG1jcF9fbW9mbG9fX21lbW9yeV9zZWFyY2guIE9uIGNodW5rIGhpdHMsIHRyYXZlcnNlIHZpYSBtY3BfX21vZmxvX19tZW1vcnlfZ2V0X25laWdoYm9ycyDigJQgc2VlIC5jbGF1ZGUvZ3VpZGFuY2UvbW9mbG8tbWVtb3J5LXByb3RvY29sLm1kXG4nICsgTUNQX0ZBTExCQUNLX05PVEUgKyAnXG4nICsgR0FURV9PUklHSU5fTk9URSArICdcbicgKyBHQVRFX0RJU0FCTEVfTk9URSArICdcbicpOwogICAgcHJvY2Vzcy5leGl0KDIpOwogIH0KICBjYXNlICdyZWNvcmQtdGFzay1jcmVhdGVkJzogewogICAgdmFyIHMgPSByZWFkU3RhdGUoKTsKICAgIHMudGFza3NDcmVhdGVkID0gdHJ1ZTsKICAgIHMudGFza0NvdW50ID0gKHMudGFza0NvdW50IHx8IDApICsgMTsKICAgIHdyaXRlU3RhdGUocyk7CiAgICBicmVhazsKICB9CiAgLy8gIzE0MzUg4oCUIHRoZSBlc2NhcGUgZnJvbSB0aGUgdGFzay1zdGF0dXMgZ2F0ZSwgZm9yIHdvcmsgZGVsaWJlcmF0ZWx5IGxlZnQKICAvLyBvcGVuLiBTZXNzaW9uLXNjb3BlZCBsaWtlIGBsZWFybmluZ3NTdG9yZWRgOiBpdCBsaXZlcyBpbiBTVEFURV9ERUZBVUxUUywgc28KICAvLyBzZXNzaW9uLXJlc2V0IGNsZWFycyBpdCwgYW5kIG5laXRoZXIgYXBwbHlQcm9tcHRTdGF0ZVJlc2V0IG5vcgogIC8vIHJlc2V0LWVkaXQtZ2F0ZXMgdG91Y2hlcyBpdCDigJQgYSBkZWNpc2lvbiB0aGUgdXNlciBtYWRlIGFib3V0IHRoZSB0YXNrIGxpc3QKICAvLyBpcyBub3QgaW52YWxpZGF0ZWQgYnkgdGhlIG5leHQgcHJvbXB0IG9yIHRoZSBuZXh0IHNvdXJjZSBlZGl0LgogIC8vCiAgLy8gQSBwbGFpbiBmbGFnLCBub3QgYSBjb3VudC4gVGhlIGNvbW1hbmQgaXMgdHlwZWQgYnkgdGhlIG1vZGVsIGludG8gYSBCYXNoCiAgLy8gdG9vbCwgd2hlcmUgSE9PS19UUkFOU0NSSVBUX1BBVEggaXMgdW5zZXQgKGl0IGlzIGZvcndhcmRlZCBieSBnYXRlLWhvb2subWpzCiAgLy8gZnJvbSB0aGUgaG9vayBwYXlsb2FkIGFuZCBleGlzdHMgb25seSBpbnNpZGUgYSBob29rKSwgc28gdGhpcyBwcm9jZXNzIGNhbm5vdAogIC8vIHJlYWQgdGhlIGxlZGdlciB0byByZWNvcmQgV0hJQ0ggdGFza3Mgd2VyZSBhY2tub3dsZWRnZWQgZXZlbiBpZiBpdCB3YW50ZWQgdG8uCiAgY2FzZSAncmVjb3JkLXRhc2tzLWFja25vd2xlZGdlZCc6IHsKICAgIHZhciBzID0gcmVhZFN0YXRlKCk7CiAgICBpZiAoIXMudGFza3NBY2tub3dsZWRnZWQpIHsKICAgICAgcy50YXNrc0Fja25vd2xlZGdlZCA9IHRydWU7CiAgICAgIHdyaXRlU3RhdGUocyk7CiAgICB9CiAgICAvLyB3cml0ZVN0YXRlIHN3YWxsb3dzIGl0cyBvd24gZXJyb3JzIGJ5IGRlc2lnbiDigJQgYSBnYXRlIG11c3QgbmV2ZXIgY3Jhc2ggdGhlCiAgICAvLyBob29rIGl0IHJ1bnMgaW4uIFRoYXQgd2FzIGhhcm1sZXNzIHdoaWxlIGV2ZXJ5IHJlY29yZGVyIHdhcyBhZHZpc29yeS4gVGhpcwogICAgLy8gb25lIGlzIHRoZSBPTkxZIGVzY2FwZSBmcm9tIGEgQkxPQ0tJTkcgZ2F0ZSwgc28gYSBsb3N0IHdyaXRlIHdvdWxkIHJlcG9ydAogICAgLy8gInNhdGlzZmllZCIgYW5kIHRoZW4gYmxvY2sgdGhlIHZlcnkgbmV4dCBgZ2ggcHIgY3JlYXRlYCB3aXRoIG5vdGhpbmcgc2FpZAogICAgLy8gYWJvdXQgd2h5OiAjMTMzMidzIGRlYWRsb2NrIHNoYXBlIGV4YWN0bHkuIENvbmZpcm0gaXQgbGFuZGVkIGJlZm9yZQogICAgLy8gY2xhaW1pbmcgaXQgZGlkLCBhbmQgbmFtZSB0aGUgZmlsZSBhbmQgdGhlIHdheSBvdXQgd2hlbiBpdCBkaWQgbm90LgogICAgaWYgKCFyZWFkU3RhdGUoKS50YXNrc0Fja25vd2xlZGdlZCkgewogICAgICBwcm9jZXNzLnN0ZGVyci53cml0ZSgKICAgICAgICAnVGFzay1zdGF0dXMgZ2F0ZSBOT1Qgc2F0aXNmaWVkOiB0aGUgYWNrbm93bGVkZ2VtZW50IGNvdWxkIG5vdCBiZSBwZXJzaXN0ZWQgdG9cbicgKwogICAgICAgIFNUQVRFX0ZJTEUgKyAnXG4nICsKICAgICAgICAnQ2hlY2sgdGhhdCB0aGUgZmlsZSBhbmQgaXRzIGRpcmVjdG9yeSBhcmUgd3JpdGFibGUsIHRoZW4gcnVuIHRoaXMgYWdhaW4uXG4nICsKICAgICAgICAnVG8gcHJvY2VlZCB3aXRob3V0IGl0OiBzZXQgZ2F0ZXM6IHRhc2tfc3RhdHVzX2dhdGU6IG9mZiBpbiBtb2Zsby55YW1sLlxuJyk7CiAgICAgIHByb2Nlc3MuZXhpdCgxKTsKICAgIH0KICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKAogICAgICAnVGFzay1zdGF0dXMgZ2F0ZSBzYXRpc2ZpZWQ6IG9wZW4gdGFza3MgYWNrbm93bGVkZ2VkIGFzIGRlbGliZXJhdGVseSBkZWZlcnJlZC5cbicgKwogICAgICAnVGhleSBzdGF5IHZpc2libGUgaW4gdGhlIHRhc2sgbGlzdCDigJQgdGhpcyByZWNvcmRzIHRoZSBkZWNpc2lvbiwgaXQgZG9lcyBub3QgY2xvc2UgdGhlbS5cbicpOwogICAgYnJlYWs7CiAgfQogIGNhc2UgJ3JlY29yZC1tZW1vcnktc2VhcmNoZWQnOiB7CiAgICB2YXIgcyA9IHJlYWRTdGF0ZSgpOwogICAgaWYgKG1hcmtNZW1vcnlTZWFyY2hlZChzKSkgd3JpdGVTdGF0ZShzKTsKICAgIGJyZWFrOwogIH0KICBjYXNlICdjaGVjay1iYXNoLW1lbW9yeSc6IHsKICAgIC8vICMxMTMyIOKAlCBwcmVzZXJ2ZSBDUkVESVQgc2lkZS1lZmZlY3QgQU5EIGFkZCBhIEJMT0NLIGFybSBmb3IgcmVhZC1saWtlCiAgICAvLyBCYXNoIGNvbW1hbmRzLiBXaXJlZCBhcyBQcmVUb29sVXNlW0Jhc2hdICh3YXMgUG9zdFRvb2xVc2UgYmVmb3JlICMxMTMyKQogICAgLy8gc28gcHJvY2Vzcy5leGl0KDIpIGFjdHVhbGx5IHByZXZlbnRzIHRoZSByZWFkIGZyb20gcmVhY2hpbmcgdGhlIHNoZWxsLgogICAgLy8KICAgIC8vICMxMTcxIOKAlCB0aGUgY2FzZSBuYW1lIGlzIGhpc3RvcmljYWwuIFRoZSBtYXRjaGVyIG5vdyBhbHNvIGNvdmVycyB0aGUKICAgIC8vIGRlZGljYXRlZCBgUG93ZXJTaGVsbGAgdG9vbCwgYW5kIFJFQURfTElLRV9CQVNIX1JFIGFscmVhZHkgbWF0Y2hlZCBQUwogICAgLy8gcmVhZGVycyAoR2V0LUNvbnRlbnQvU2VsZWN0LVN0cmluZy9HZXQtQ2hpbGRJdGVtIC1SZWN1cnNlL0Zvcm1hdC1IZXgpLgogICAgLy8gVHJlYXQgdGhpcyBjYXNlIGFzIHNoZWxsLWFnbm9zdGljIHJlYWQtZ2F0ZSBsb2dpYy4KICAgIHZhciBjbWQgPSBwcm9jZXNzLmVudi5UT09MX0lOUFVUX2NvbW1hbmQgfHwgJyc7CgogICAgLy8gMSkgQ1JFRElUIOKAlCBwcmVzZXJ2ZWQgYmVoYXZpb3IuIEEgcmVhbCBtZW1vcnktc2VhcmNoIGludm9jYXRpb24gZmxpcHMKICAgIC8vIHRoZSBnYXRlIGZsYWcgc28gc3Vic2VxdWVudCBSZWFkL0dyZXAvR2xvYiB3aXRoaW4gdGhpcyBwcm9tcHQgcGFzcy4KICAgIGlmIChjcmVkaXRzTWVtb3J5U2VhcmNoKGNtZCkpIHsKICAgICAgdmFyIHMgPSByZWFkU3RhdGUoKTsKICAgICAgaWYgKG1hcmtNZW1vcnlTZWFyY2hlZChzKSkgd3JpdGVTdGF0ZShzKTsKICAgICAgYnJlYWs7CiAgICB9CgogICAgLy8gMikgQkxPQ0sg4oCUIG5ldyBiZWhhdmlvci4gQ2hlYXAgcmVnZXggY2hlY2tzIGNvbWUgQkVGT1JFIHJlYWRTdGF0ZSgpIHNvCiAgICAvLyB0aGUgb3ZlcndoZWxtaW5nIG1ham9yaXR5IG9mIEJhc2ggaW52b2NhdGlvbnMgKGdpdC9ucG0vY3VybC9lY2hvL2V0Yy4pCiAgICAvLyBuZXZlciB0b3VjaCB0aGUgZmlsZXN5c3RlbS4gT3JkZXI6IGNvbmZpZyBmbGFnIOKGkiBjb21tYW5kLXNoYXBlIHJlZ2V4ZXMKICAgIC8vIOKGkiBzdGF0ZSByZWFkIOKGkiBtZW1vcnkgZ2F0ZS4KICAgIGlmICghY29uZmlnLm1lbW9yeV9maXJzdCkgYnJlYWs7CiAgICBpZiAoIVJFQURfTElLRV9CQVNIX1JFLnRlc3QoY21kKSkgYnJlYWs7CiAgICAvLyAjMTQ0NSDigJQgdGhlIGNhcnZlLW91dCBpcyBhbmNob3JlZCB0byB0aGUgTEVBRElORyBjb21tYW5kLCBzbyBpdHMgYG5vZGVgCiAgICAvLyBhbmQgYGdpdGAgYXJtcyBzd2FsbG93IGV2ZXJ5IHNoYXBlIFJVTk5FUl9SRUFEX1NPVVJDRVMgZXhpc3RzIHRvIGNhdGNoLgogICAgLy8gVGhvc2Ugc2hhcGVzIGVhcm4gdGhlaXIgcmVhZCBjbGFzc2lmaWNhdGlvbiBmcm9tIHdoYXQgZm9sbG93cyB0aGUgbGVhZGluZwogICAgLy8gdG9rZW4sIHNvIHRoZXkgb3ZlcnJpZGUgdGhlIGNhcnZlLW91dDsgZXZlcnkgb3RoZXIgY29tbWFuZCBrZWVwcyAjMTEzMidzCiAgICAvLyBzZW1hbnRpY3MgZXhhY3RseSAoYG5wbSB0ZXN0IHwgZ3JlcCBGQUlMYCwgYGdpdCBkaWZmYCwgYG5vZGUgYnVpbGQubWpzYCkuCiAgICBpZiAoQkFTSF9DQVJWRV9PVVRfUkUudGVzdChjbWQpICYmICFSVU5ORVJfUkVBRF9CQVNIX1JFLnRlc3QoY21kKSkgYnJlYWs7CiAgICB2YXIgczIgPSByZWFkU3RhdGUoKTsKICAgIGlmICghczIubWVtb3J5UmVxdWlyZWQgfHwgaXNNZW1vcnlTZWFyY2hlZEZvcihzMikpIGJyZWFrOwogICAgLy8gSGludCBwcmVjZWRlbmNlOiBwcm9tcHQtZGVyaXZlZCBjbGFzc2lmaWNhdGlvbiAoc2V0IGJ5IGFwcGx5UHJvbXB0U3RhdGVSZXNldAogICAgLy8gZnJvbSB0aGUgdXNlciBwcm9tcHQgdGV4dCkg4oaSIGNvbW1hbmQtc2hhcGUgY2xhc3NpZmljYXRpb24gKHdvcmtzIGZvcgogICAgLy8gc3ViYWdlbnRzIHRoYXQgbmV2ZXIgc2F3IHRoZSB1c2VyIHByb21wdCkuIEVpdGhlciBzb3VyY2UgcmV0dXJucyBhIGZ1bGwKICAgIC8vICJNZW1vcnkgbmFtZXNwYWNlIGhpbnQ6IC4uLiIgc2VudGVuY2Ugc28gdGhlIEJMT0NLIG1lc3NhZ2Ugc3RheXMgdW5pZm9ybS4KICAgIHZhciBoaW50ID0gczIubGFzdE5hbWVzcGFjZUhpbnQgfHwgY2xhc3NpZnlCYXNoTmFtZXNwYWNlSGludChjbWQpIHx8ICcnOwogICAgcHJvY2Vzcy5zdGRlcnIud3JpdGUoCiAgICAgICdCTE9DS0VEIFttb2ZsbyBtZW1vcnlfZmlyc3QgZ2F0ZV06IFNlYXJjaCBtZW1vcnkgYmVmb3JlIHJlYWRpbmcgZmlsZXMgdmlhIEJhc2guXG4nICsKICAgICAgJ0V4YW1wbGU6IG1jcF9fbW9mbG9fX21lbW9yeV9zZWFyY2ggeyBxdWVyeTogIjx0b3BpYz4iLCBuYW1lc3BhY2U6ICI8b25lIG9mOiBndWlkYW5jZSB8IGNvZGUtbWFwIHwgcGF0dGVybnMgfCBsZWFybmluZ3MgfCB0ZXN0cz4iIH1cbicgKwogICAgICAoaGludCA/IGhpbnQgKyAnXG4nIDogJycpICsKICAgICAgJ09uIGNodW5rIGhpdHMsIHRyYXZlcnNlIHZpYSBtY3BfX21vZmxvX19tZW1vcnlfZ2V0X25laWdoYm9ycyDigJQgc2VlIC5jbGF1ZGUvZ3VpZGFuY2UvbW9mbG8tbWVtb3J5LXByb3RvY29sLm1kXG4nICsKICAgICAgTUNQX0ZBTExCQUNLX05PVEUgKyAnXG4nICsKICAgICAgR0FURV9PUklHSU5fTk9URSArICdcbicgKwogICAgICBHQVRFX0RJU0FCTEVfTk9URSArICdcbicKICAgICk7CiAgICBwcm9jZXNzLmV4aXQoMik7CiAgICBicmVhazsKICB9CiAgY2FzZSAnY2hlY2stdGFzay10cmFuc2l0aW9uJzogewogICAgLy8gSW50ZW50aW9uYWwgbm8tb3AsIHJldGFpbmVkIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBvbmx5ICgjMTMzMSkuCiAgICAvLyBUaGUgYF5UYXNrVXBkYXRlJGAgd2lyaW5nIHdhcyByZW1vdmVkIGZyb20gc2V0dGluZ3MtZ2VuZXJhdG9yLnRzLAogICAgLy8gaG9vay1ibG9jay1oYXNoLnRzIGFuZCBob29rLXdpcmluZy50cyBiZWNhdXNlIHNwYXduaW5nIGdhdGUtaG9vay5tanMgKwogICAgLy8gZ2F0ZS5janMgb24gZXZlcnkgVGFza1VwZGF0ZSB0byBkbyBub3RoaW5nIGlzIHB1cmUgb3ZlcmhlYWQuIFRoZSBjYXNlCiAgICAvLyBzdGF5cyBiZWNhdXNlIGRvY3Rvci1jaGVja3MtZGVlcC50cyBsaXN0cyBpdCBpbiBSRVFVSVJFRF9HQVRFX0NBU0VTIOKAlAogICAgLy8gZHJvcHBpbmcgdGhlIGNhc2Ugd291bGQgdHVybiBgZmxvIGRvY3RvcmAncyBHYXRlIEhlYWx0aCBjaGVjayByZWQgaW4KICAgIC8vIGV2ZXJ5IGNvbnN1bWVyIGZvciBubyBnYWluLiAoRmFsbGluZyB0aHJvdWdoIHRvIGBkZWZhdWx0OiBicmVha2Agd291bGQKICAgIC8vIG90aGVyd2lzZSBiZSBoYXJtbGVzczsgdGhpcyBpcyBhYm91dCB0aGUgZG9jdG9yIGNvbnRyYWN0LCBub3QgcnVudGltZS4pCiAgICAvLyBXaHkgaXQgZG9lcyBub3RoaW5nOiBzZWUgYXBwbHlQcm9tcHRTdGF0ZVJlc2V0KCkuCiAgICBicmVhazsKICB9CiAgLy8gIzE0MzQg4oCUIHRoZSBnYXRlIGRlbWFuZGVkIG9uZSBtZW1vcnlfc3RvcmUgcGVyIHJ1biB3aGV0aGVyIG9yIG5vdCB0aGUgcnVuCiAgLy8gcHJvZHVjZWQgYSByZXVzYWJsZSBsZXNzb24sIGFuZCBhIG1hbmRhdG9yeSB3cml0ZSB3aXRoIG5vdGhpbmcgdG8gc2F5CiAgLy8gcHJvZHVjZXMgZmlsbGVyOiBhIHN1bW1hcnkgb2YgdGhpcyB0aWNrZXQsIHRoaXMgY29tbWl0LCBhcHBsaWNhYmxlIG5ldmVyCiAgLy8gYWdhaW4uIG1lbW9yeV9zZWFyY2ggcmV0dXJucyBhIGJvdW5kZWQgc2V0LCBzbyBlYWNoIG9mIHRob3NlIGRpc3BsYWNlcyBhCiAgLy8gcmVhbCBsZXNzb24gZnJvbSBldmVyeSBmdXR1cmUgc2VhcmNoIOKAlCB0aGUgY29zdCBpcyByZXRyaWV2YWwgcXVhbGl0eSwgbm90CiAgLy8gZGlzay4gRGVjbGFyaW5nICJub3RoaW5nIGR1cmFibGUgaGVyZSIgaXMgdGhlIGhvbmVzdCBvdXRjb21lIG9mIGEgcnVuIHRoYXQKICAvLyBsZWFybmVkIG5vdGhpbmcgbmV3LCBzbyBpdCBoYXMgdG8gYmUgcmVhY2hhYmxlIHdpdGhvdXQgYSB3cml0ZTsgb3RoZXJ3aXNlCiAgLy8gdGhlIGNoZWFwZXN0IHdheSBwYXN0IHRoZSBnYXRlIHN0YXlzIHRoZSBmaWxsZXIgd3JpdGUuCiAgLy8KICAvLyBCb3RoIGNyZWRpdHMgc2V0IHRoZSBzYW1lIGZsYWc7IHRoZXkgZGlmZmVyIG9ubHkgaW4gd2hldGhlciB0aGUgcnVuIGhhcwogIC8vIHNvbWV0aGluZyB0byBzYXkuIFNoYXJpbmcgdGhlIGNhc2UgYm9keSBrZWVwcyB0aGF0IHNpbmdsZSB3cml0ZSBpbiBvbmUKICAvLyBwbGFjZSBhY3Jvc3MgYWxsIHRocmVlIGNvcGllcyBvZiB0aGlzIGZpbGUuCiAgY2FzZSAncmVjb3JkLWxlYXJuaW5ncy1zdG9yZWQnOgogIGNhc2UgJ3JlY29yZC1uby1kdXJhYmxlLWxlc3Nvbic6IHsKICAgIHZhciBzID0gcmVhZFN0YXRlKCk7CiAgICBpZiAoIXMubGVhcm5pbmdzU3RvcmVkKSB7CiAgICAgIHMubGVhcm5pbmdzU3RvcmVkID0gdHJ1ZTsKICAgICAgd3JpdGVTdGF0ZShzKTsKICAgIH0KICAgIGlmIChjb21tYW5kID09PSAncmVjb3JkLW5vLWR1cmFibGUtbGVzc29uJykgewogICAgICAvLyBTYW1lIHJlYXNvbmluZyBhcyByZWNvcmQtdGFza3MtYWNrbm93bGVkZ2VkIGFib3ZlOiB3cml0ZVN0YXRlIHN3YWxsb3dzCiAgICAgIC8vIGl0cyBvd24gZXJyb3JzIHNvIGEgZ2F0ZSBuZXZlciBjcmFzaGVzIHRoZSBob29rIGl0IHJ1bnMgaW4sIGFuZCB0aGlzIGlzCiAgICAgIC8vIHRoZSBPTkxZIGVzY2FwZSBmcm9tIHRoZSBCTE9DS0lORyBsZWFybmluZ3MgZ2F0ZSB0aGF0IGRvZXMgbm90IHJlcXVpcmUgYQogICAgICAvLyBtZW1vcnlfc3RvcmUuIEEgbG9zdCB3cml0ZSBoZXJlIHdvdWxkIHByaW50ICJzYXRpc2ZpZWQiIGFuZCB0aGVuIGJsb2NrCiAgICAgIC8vIHRoZSBuZXh0IGBnaCBwciBjcmVhdGVgIHdpdGggbm90aGluZyBzYWlkIGFib3V0IHdoeSDigJQgIzEzMzIncyBkZWFkbG9jay4KICAgICAgLy8gVmVyaWZpZWQgb25seSBvbiB0aGlzIGFybTogcmVjb3JkLWxlYXJuaW5ncy1zdG9yZWQgaXMgZmlyZWQKICAgICAgLy8gYXV0b21hdGljYWxseSBieSB0aGUgUG9zdFRvb2xVc2UgaG9vayBvbiBldmVyeSBtZW1vcnlfc3RvcmUsIHdoZXJlIGEKICAgICAgLy8gZmFpbGVkIHdyaXRlIGxlYXZlcyB0aGUgZ2F0ZSBjbG9zZWQgYnV0IHRoZSBydW4gc3RpbGwgaGFzIHRoZSBvcmRpbmFyeQogICAgICAvLyB3YXkgdGhyb3VnaCwgYW5kIGEgZGlhZ25vc3RpYyBvbiBldmVyeSBzdG9yZSB3b3VsZCBiZSBub2lzZS4KICAgICAgaWYgKCFyZWFkU3RhdGUoKS5sZWFybmluZ3NTdG9yZWQpIHsKICAgICAgICBwcm9jZXNzLnN0ZGVyci53cml0ZSgKICAgICAgICAgICdMZWFybmluZ3MgZ2F0ZSBOT1Qgc2F0aXNmaWVkOiB0aGUgZGVjbGFyYXRpb24gY291bGQgbm90IGJlIHBlcnNpc3RlZCB0b1xuJyArCiAgICAgICAgICBTVEFURV9GSUxFICsgJ1xuJyArCiAgICAgICAgICAnQ2hlY2sgdGhhdCB0aGUgZmlsZSBhbmQgaXRzIGRpcmVjdG9yeSBhcmUgd3JpdGFibGUsIHRoZW4gcnVuIHRoaXMgYWdhaW4uXG4nICsKICAgICAgICAgICdUbyBwcm9jZWVkIHdpdGhvdXQgaXQ6IHNldCBnYXRlczogbGVhcm5pbmdzX2dhdGU6IGZhbHNlIGluIG1vZmxvLnlhbWwuXG4nKTsKICAgICAgICBwcm9jZXNzLmV4aXQoMSk7CiAgICAgIH0KICAgICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoCiAgICAgICAgJ0xlYXJuaW5ncyBnYXRlIHNhdGlzZmllZDogbm8gZHVyYWJsZSBsZXNzb24gZGVjbGFyZWQgZm9yIHRoaXMgcnVuLlxuJyArCiAgICAgICAgJ1doYXQgdGhpcyBydW4gZGlkIGJlbG9uZ3MgaW4gdGhlIFBSIGJvZHksIG5vdCBpbiBtZW1vcnkuXG4nLAogICAgICApOwogICAgfQogICAgYnJlYWs7CiAgfQogIGNhc2UgJ3JlY29yZC10ZXN0LXJ1bic6IHsKICAgIHZhciBjbWQgPSBwcm9jZXNzLmVudi5UT09MX0lOUFVUX2NvbW1hbmQgfHwgJyc7CiAgICBpZiAoVEVTVF9SVU5ORVJfUkUudGVzdChjbWQpKSB7CiAgICAgIC8vICMxMzIyIOKAlCBhIHJlZCBydW4gaXMgZXZpZGVuY2UgQUdBSU5TVCB0aGUgZ2F0ZSwgc28gaXQgYWxzbyBjbGVhcnMgYQogICAgICAvLyBmbGFnIGFuIGVhcmxpZXIgZ3JlZW4gcnVuIGVhcm5lZC4gV2l0aG91dCB0aGUgcmVzZXQsIGBucG0gdGVzdGAgKGdyZWVuKQogICAgICAvLyBmb2xsb3dlZCBieSBhbiBlZGl0IGFuZCBgbnBtIHRlc3QgfCB0YWlsIC0yMGAgKHJlZCkgd291bGQgbGVhdmUgdGhlCiAgICAgIC8vIGdhdGUgc2F0aXNmaWVkIGJ5IHRoZSBzdGFsZSBmaXJzdCBydW4g4oCUIHRoZSBlZGl0IHJlc2V0cyB0ZXN0c1J1biwgYnV0CiAgICAgIC8vIHRoZSBtYXNrZWQgcmVkIHJ1biB3b3VsZCBpbW1lZGlhdGVseSBzZXQgaXQgYmFjay4KICAgICAgdmFyIGZhaWx1cmUgPSBkZXRlY3RUZXN0RmFpbHVyZSgpOwogICAgICB2YXIgcyA9IHJlYWRTdGF0ZSgpOwogICAgICBpZiAoZmFpbHVyZSkgewogICAgICAgIGlmIChzLnRlc3RzUnVuKSB7IHMudGVzdHNSdW4gPSBmYWxzZTsgcy50ZXN0c0ZpbmdlcnByaW50ID0gbnVsbDsgd3JpdGVTdGF0ZShzKTsgfQogICAgICAgIHByb2Nlc3Muc3RkZXJyLndyaXRlKCdnYXRlOiByZWNvcmQtdGVzdC1ydW4gbm90IGNyZWRpdGVkIOKAlCAnICsgZmFpbHVyZSArICdcbicpOwogICAgICB9IGVsc2UgewogICAgICAgIC8vIFJlLXN0YW1wIG9uIGV2ZXJ5IGdyZWVuIHJ1biwgbm90IG9ubHkgdGhlIGZpcnN0OiB0aGUgdHJlZSBtYXkgaGF2ZQogICAgICAgIC8vIG1vdmVkIHNpbmNlIHRoZSBsYXN0IG9uZSwgYW5kIHRoaXMgcnVuIGlzIGV2aWRlbmNlIGFib3V0IHRoZSB0cmVlIGFzCiAgICAgICAgLy8gaXQgaXMgTk9XLiBHYXRpbmcgb24gYCFzLnRlc3RzUnVuYCB3b3VsZCBrZWVwIHRoZSBvbGRlciBmaW5nZXJwcmludAogICAgICAgIC8vIGFuZCBkaXNjYXJkIHRoZSBmcmVzaGVyIGV2aWRlbmNlLgogICAgICAgIHZhciB0ZXN0c0ZwID0gY3JlZGl0RmluZ2VycHJpbnQoJ2FsbCcpOwogICAgICAgIGlmICghcy50ZXN0c1J1biB8fCBzLnRlc3RzRmluZ2VycHJpbnQgIT09IHRlc3RzRnApIHsKICAgICAgICAgIHMudGVzdHNSdW4gPSB0cnVlOwogICAgICAgICAgcy50ZXN0c0ZpbmdlcnByaW50ID0gdGVzdHNGcDsKICAgICAgICAgIHdyaXRlU3RhdGUocyk7CiAgICAgICAgfQogICAgICB9CiAgICB9IGVsc2UgaWYgKGNtZCkgewogICAgICAvLyAjMTE3NiDigJQgZW1pdCBhIHN0ZGVyciBjcnVtYiB3aGVuIGludm9rZWQgd2l0aCBhIG5vbi1lbXB0eSBjb21tYW5kIHRoYXQKICAgICAgLy8gZG9lc24ndCBtYXRjaCB0aGUgdGVzdC1ydW5uZXIgcGF0dGVybi4gQ29tbW9uIHBpdGZhbGw6IHVzZXJzIHJ1biB0aGUKICAgICAgLy8gc3RhbXAgbWFudWFsbHkgZnJvbSBhIHRlcm1pbmFsIHRvICJzYXRpc2Z5IHRoZSBnYXRlIjsgdGhlIHNpbGVudCBuby1vcAogICAgICAvLyBsb29rcyBpbmRpc3Rpbmd1aXNoYWJsZSBmcm9tIHN1Y2Nlc3MuIGdhdGUtaG9vay5tanMgZHJvcHMgc3RkZXJyIGZyb20KICAgICAgLy8gZXhpdC0wIGludm9jYXRpb25zLCBzbyB0aGlzIG9ubHkgc3VyZmFjZXMgdG8gZGlyZWN0IENMSSB1c2Ug4oCUIGV4YWN0bHkKICAgICAgLy8gdGhlIGNhc2Ugd2hlcmUgdGhlIGZyaWN0aW9uIGxpdmVzLgogICAgICB2YXIgcHJldmlldyA9IGNtZC5sZW5ndGggPiA4MCA/IGNtZC5zbGljZSgwLCA3NykgKyAnLi4uJyA6IGNtZDsKICAgICAgcHJvY2Vzcy5zdGRlcnIud3JpdGUoJ2dhdGU6IHJlY29yZC10ZXN0LXJ1biBuby1vcCDigJQgVE9PTF9JTlBVVF9jb21tYW5kPSInICsgcHJldmlldyArICciIGRpZCBub3QgbWF0Y2ggVEVTVF9SVU5ORVJfUkVcbicpOwogICAgfQogICAgYnJlYWs7CiAgfQogIGNhc2UgJ3JlY29yZC1za2lsbC1ydW4nOiB7CiAgICB2YXIgc2tOYW1lID0gKHByb2Nlc3MuZW52LlRPT0xfSU5QVVRfc2tpbGwgfHwgJycpOwogICAgaWYgKHNrTmFtZSA9PT0gJ3NpbXBsaWZ5JyB8fCBza05hbWUgPT09ICdmbG8tc2ltcGxpZnknIHx8IHNrTmFtZSA9PT0gJ2Rpc3RpbGwnKSB7CiAgICAgIHZhciBzID0gcmVhZFN0YXRlKCk7CiAgICAgIHZhciBjaGFuZ2VkID0gZmFsc2U7CiAgICAgIGlmICghcy5zaW1wbGlmeVJ1bikgeyBzLnNpbXBsaWZ5UnVuID0gdHJ1ZTsgY2hhbmdlZCA9IHRydWU7IH0KICAgICAgLy8gJ25vbnRlc3QnIHNjb3BlOiBhIGxhdGVyIHRlc3Qtb25seSBlZGl0IG11c3Qgbm90IGludmFsaWRhdGUgdGhpcyByZXZpZXcKICAgICAgLy8gKCM5MDgpLCBzbyB0ZXN0IGZpbGVzIGFyZSBleGNsdWRlZCBmcm9tIHdoYXQgdGhlIGNyZWRpdCBpcyBwaW5uZWQgdG8uCiAgICAgIHZhciBzaW1wbGlmeUZwID0gY3JlZGl0RmluZ2VycHJpbnQoJ25vbnRlc3QnKTsKICAgICAgaWYgKHMuc2ltcGxpZnlGaW5nZXJwcmludCAhPT0gc2ltcGxpZnlGcCkgeyBzLnNpbXBsaWZ5RmluZ2VycHJpbnQgPSBzaW1wbGlmeUZwOyBjaGFuZ2VkID0gdHJ1ZTsgfQogICAgICAvLyBTbmFwc2hvdCBIRUFEIHNvIGNoZWNrLWJlZm9yZS1wciBjYW4gY2xhc3NpZnkgZGVsdGEtc2luY2Utc2ltcGxpZnkgYW5kCiAgICAgIC8vIHNraXAgYSByZWR1bmRhbnQgL3NpbXBsaWZ5IHJlLXJ1biB3aGVuIG9ubHkgdHJpdmlhbCBmaXhlcyBmb2xsb3dlZC4KICAgICAgLy8gTm9uLWZhdGFsIOKAlCBnYXRlIGZhbGxzIHRocm91Z2ggdG8gY3VycmVudCBiZWhhdmlvdXIgd2l0aG91dCB0aGUgc25hcHNob3QuCiAgICAgIHRyeSB7CiAgICAgICAgdmFyIHNoYSA9IGNwLmV4ZWNGaWxlU3luYygnZ2l0JywgWydyZXYtcGFyc2UnLCAnSEVBRCddLCB7CiAgICAgICAgICBjd2Q6IFBST0pFQ1RfRElSLCBlbmNvZGluZzogJ3V0Zi04JywgdGltZW91dDogMjAwMCwgd2luZG93c0hpZGU6IHRydWUsCiAgICAgICAgICBzdGRpbzogWydpZ25vcmUnLCAncGlwZScsICdpZ25vcmUnXQogICAgICAgIH0pLnRyaW0oKTsKICAgICAgICBpZiAoc2hhICYmIHMuc2ltcGxpZnlTbmFwc2hvdFNoYSAhPT0gc2hhKSB7IHMuc2ltcGxpZnlTbmFwc2hvdFNoYSA9IHNoYTsgY2hhbmdlZCA9IHRydWU7IH0KICAgICAgfSBjYXRjaCAoZSkgeyAvKiBubyBnaXQgb3IgZGV0YWNoZWQgc3RhdGUg4oCUIHNraXAgc25hcHNob3QsIGdhdGUgc3RpbGwgd29ya3MgKi8gfQogICAgICBpZiAoY2hhbmdlZCkgd3JpdGVTdGF0ZShzKTsKICAgIH0gZWxzZSBpZiAoc2tOYW1lKSB7CiAgICAgIC8vICMxMTc2IOKAlCBzYW1lIHJhdGlvbmFsZSBhcyByZWNvcmQtdGVzdC1ydW4uIEEgbm8tb3Agc3RhbXAgb24gYSBub24tc2ltcGxpZnkKICAgICAgLy8gc2tpbGwgbmFtZSBpcyBzaWxlbnQgdG8gaG9va3MgKGdhdGUtaG9vay5tanMgZHJvcHMgZXhpdC0wIHN0ZGVycikgYnV0CiAgICAgIC8vIHZpc2libGUgd2hlbiBhIHVzZXIgcnVucyB0aGUgc3RhbXAgZGlyZWN0bHkgdG8gInNhdGlzZnkgdGhlIGdhdGUiIGFuZAogICAgICAvLyB3b25kZXJzIHdoeSBzaW1wbGlmeVJ1biBzdGF5cyBmYWxzZS4KICAgICAgcHJvY2Vzcy5zdGRlcnIud3JpdGUoJ2dhdGU6IHJlY29yZC1za2lsbC1ydW4gbm8tb3Ag4oCUIFRPT0xfSU5QVVRfc2tpbGw9IicgKyBza05hbWUgKyAnIiBpcyBub3Qgc2ltcGxpZnkvZmxvLXNpbXBsaWZ5XG4nKTsKICAgIH0KICAgIGJyZWFrOwogIH0KICBjYXNlICdyZWNvcmQtdmVyaWZ5LXJ1bic6IHsKICAgIC8vIFN0b3J5ICMxMjc0IChFcGljICMxMjY5KS4gRmlyZXMgUG9zdFRvb2xVc2Ugb24gXlNraWxsJCB3aGVuIHRoZSBuYXRpdmUKICAgIC8vIC92ZXJpZnkgc2tpbGwgcnVucywgc2F0aXNmeWluZyB0aGUgdmVyaWZ5LWJlZm9yZS1kb25lIGdhdGUuIE1pcnJvcnMKICAgIC8vIHJlY29yZC1za2lsbC1ydW4ncyBmYXVsdC10b2xlcmFudCBzaGFwZS4gVGhlIHZlcmlmaWNhdGlvbiBPVVRDT01FICh3aGF0CiAgICAvLyB3YXMgY2hlY2tlZCwgcGFzcy9mYWlsKSBpcyB3cml0dGVuIHRvIG1lbW9yeSBieSB0aGUgdmVyaWZ5IGZsb3cgaXRzZWxmCiAgICAvLyB2aWEgbWNwX19tb2Zsb19fbWVtb3J5X3N0b3JlIOKAlCBzYW1lIGRpdmlzaW9uIG9mIGxhYm91ciBhcyB0ZXN0c1J1biB2cyB0aGUKICAgIC8vIHRlc3Qgb3V0cHV0OyB0aGlzIHJlY29yZGVyIG9ubHkgdHJhY2tzIHRoYXQgdmVyaWZpY2F0aW9uIGhhcHBlbmVkLgogICAgdmFyIHZOYW1lID0gKHByb2Nlc3MuZW52LlRPT0xfSU5QVVRfc2tpbGwgfHwgJycpOwogICAgLy8gT25seSB0aGUgbmF0aXZlIC92ZXJpZnkgc2tpbGwgc2F0aXNmaWVzIHZlcmlmeS1iZWZvcmUtZG9uZS4gL3dhcmQgYW5kCiAgICAvLyAvcXVpY2tlbiBhcmUgdGFyZ2V0ZWQgYXVkaXRzLCBOT1QgdGhlIGNvbXBsZXRpb24gZ2F0ZSAoc2VlIGZsL3NkZC5tZCkg4oCUCiAgICAvLyBjcmVkaXRpbmcgdGhlbSB3b3VsZCBsZXQgdGhlIGdhdGUgcGFzcyB3aXRob3V0IGFuIGVuZC10by1lbmQgdmVyaWZ5LgogICAgaWYgKHZOYW1lID09PSAndmVyaWZ5JykgewogICAgICB2YXIgcyA9IHJlYWRTdGF0ZSgpOwogICAgICAvLyAjMTMzMjogaW52b2tpbmcgL3ZlcmlmeSBzdGFydHMgYSB2ZXJpZmljYXRpb247IGl0IGRvZXMgbm90IGNvbmNsdWRlCiAgICAgIC8vIG9uZS4gQ2xlYXIgYW55IHByaW9yIHZlcmRpY3Qgc28gdGhlIHJ1biBpbiBwcm9ncmVzcyBjYW5ub3QgaW5oZXJpdCB0aGUKICAgICAgLy8gUEFTUyBmcm9tIGEgcHJldmlvdXMgaXNzdWUgYW5kIHNhdGlzZnkgY2hlY2stYmVmb3JlLWRvbmUgb24gaXRzIG93bi4KICAgICAgdmFyIHZlcmlmeUZwID0gY3JlZGl0RmluZ2VycHJpbnQoJ2FsbCcpOwogICAgICBpZiAoIXMudmVyaWZ5UnVuIHx8IHMudmVyaWZ5T3V0Y29tZSB8fCBzLnZlcmlmeUZpbmdlcnByaW50ICE9PSB2ZXJpZnlGcCkgewogICAgICAgIHMudmVyaWZ5UnVuID0gdHJ1ZTsKICAgICAgICBzLnZlcmlmeU91dGNvbWUgPSBudWxsOwogICAgICAgIHMudmVyaWZ5RmluZ2VycHJpbnQgPSB2ZXJpZnlGcDsKICAgICAgICB3cml0ZVN0YXRlKHMpOwogICAgICB9CiAgICB9IGVsc2UgaWYgKHZOYW1lKSB7CiAgICAgIHByb2Nlc3Muc3RkZXJyLndyaXRlKCdnYXRlOiByZWNvcmQtdmVyaWZ5LXJ1biBuby1vcCDigJQgVE9PTF9JTlBVVF9za2lsbD0iJyArIHZOYW1lICsgJyIgaXMgbm90IHZlcmlmeVxuJyk7CiAgICB9CiAgICBicmVhazsKICB9CiAgY2FzZSAncmVjb3JkLXZlcmlmeS1vdXRjb21lJzogewogICAgLy8gIzEzMzIuIEZpcmVzIFBvc3RUb29sVXNlIG9uIG1jcF9fbW9mbG9fX21lbW9yeV9zdG9yZS4gYHJlY29yZC12ZXJpZnktcnVuYAogICAgLy8gYWJvdmUgcHJvdmVzIGEgdmVyaWZpY2F0aW9uIHdhcyBBVFRFTVBURUQ7IHRoaXMgcHJvdmVzIGhvdyBpdCBFTkRFRC4KICAgIC8vCiAgICAvLyBUaGUgdmVyZGljdCBpcyByZWFkIGZyb20gdGhlIHN0cnVjdHVyZWQgcmVjb3JkICMxMzI4IG1hZGUgL3ZlcmlmeSB3cml0ZQogICAgLy8gdG8gbWVtb3J5X3N0b3JlJ3MgYG1ldGFkYXRhYCDigJQgbmV2ZXIgcGFyc2VkIG91dCBvZiB0aGUgcHJvc2UgYHZhbHVlYCwKICAgIC8vIHdoaWNoIGlzIHByZWNpc2VseSB0aGUgZnJlZS10ZXh0IGRlcGVuZGVuY3kgIzEzMjggcmVtb3ZlZC4gZ2F0ZS1ob29rLm1qcwogICAgLy8gZm9yd2FyZHMgdGhlIG9iamVjdCBhcyBKU09OIChzZWUgaXRzIE1BWF9TVFJVQ1RVUkVEX0xFTiBub3RlKS4KICAgIHZhciBtS2V5ID0gcHJvY2Vzcy5lbnYuVE9PTF9JTlBVVF9rZXkgfHwgJyc7CiAgICBpZiAobUtleS5pbmRleE9mKCd2ZXJpZnk6JykgIT09IDApIGJyZWFrOwogICAgdmFyIHJhd01ldGEgPSBwcm9jZXNzLmVudi5UT09MX0lOUFVUX21ldGFkYXRhIHx8ICcnOwogICAgaWYgKCFyYXdNZXRhKSB7CiAgICAgIHByb2Nlc3Muc3RkZXJyLndyaXRlKCdnYXRlOiByZWNvcmQtdmVyaWZ5LW91dGNvbWUg4oCUICInICsgbUtleSArICciIGNhcnJpZXMgbm8gbWV0YWRhdGE7IHZlcmRpY3Qgbm90IHJlY29yZGVkXG4nKTsKICAgICAgYnJlYWs7CiAgICB9CiAgICB2YXIgcGFyc2VkTWV0YSA9IG51bGw7CiAgICB0cnkgeyBwYXJzZWRNZXRhID0gSlNPTi5wYXJzZShyYXdNZXRhKTsgfSBjYXRjaCAoZSkgeyBwYXJzZWRNZXRhID0gbnVsbDsgfQogICAgaWYgKCFwYXJzZWRNZXRhIHx8IHR5cGVvZiBwYXJzZWRNZXRhICE9PSAnb2JqZWN0JyB8fCBwYXJzZWRNZXRhLnR5cGUgIT09ICd2ZXJpZnktcmVjb3JkJykgYnJlYWs7CiAgICB2YXIgb3ZlcmFsbCA9IHR5cGVvZiBwYXJzZWRNZXRhLm92ZXJhbGwgPT09ICdzdHJpbmcnID8gcGFyc2VkTWV0YS5vdmVyYWxsLnRvVXBwZXJDYXNlKCkgOiAnJzsKICAgIGlmIChvdmVyYWxsICE9PSAnUEFTUycgJiYgb3ZlcmFsbCAhPT0gJ0ZBSUwnICYmIG92ZXJhbGwgIT09ICdVTlZFUklGSUVEJykgewogICAgICBwcm9jZXNzLnN0ZGVyci53cml0ZSgnZ2F0ZTogcmVjb3JkLXZlcmlmeS1vdXRjb21lIOKAlCB1bnJlY29nbmlzZWQgb3ZlcmFsbD0iJyArIHBhcnNlZE1ldGEub3ZlcmFsbCArICciOyB0cmVhdGluZyBhcyBub3QtcGFzc2luZ1xuJyk7CiAgICAgIG92ZXJhbGwgPSAnVU5WRVJJRklFRCc7CiAgICB9CiAgICB2YXIgdnMgPSByZWFkU3RhdGUoKTsKICAgIC8vICMxMzQ4IOKAlCByZWZ1c2UgYSB2ZXJkaWN0IGZvciBhIHJ1biB0aGF0IGlzIG5vIGxvbmdlciBsaXZlLiBgdmVyaWZ5UnVuYAogICAgLy8gZmFsc2UgaGVyZSBtZWFucyBhIGNvZGUgZWRpdCBmaXJlZCByZXNldC1lZGl0LWdhdGVzIGJldHdlZW4gdGhlIC92ZXJpZnkKICAgIC8vIGludm9jYXRpb24gYW5kIHRoaXMgc3RvcmUsIHNvIHRoZSB2ZXJkaWN0IGRlc2NyaWJlcyBwcmUtZWRpdCBjb2RlLgogICAgLy8gUmVjb3JkaW5nIGl0IGFueXdheSBwcm9kdWNlZCB0aGUgY29udHJhZGljdG9yeSBgdmVyaWZ5UnVuOmZhbHNlLAogICAgLy8gdmVyaWZ5T3V0Y29tZTonUEFTUydgIHN0YXRlIHRoYXQgY2hlY2stYmVmb3JlLWRvbmUncyBmb3VyLXdheSBtZXNzYWdlCiAgICAvLyBjaGFpbiBoYXMgbm8gYnJhbmNoIGZvciDigJQgaXQgcmVwb3J0cyAiYSBjb2RlIGVkaXQgaW52YWxpZGF0ZWQgdGhlIHByZXZpb3VzCiAgICAvLyB2ZXJpZmljYXRpb24iIHdoaWxlIGEgUEFTUyBzaXRzIGluIHN0YXRlLCB3aGljaCByZWFkcyBhcyBhIGdhdGUgYnVnLgogICAgaWYgKCF2cy52ZXJpZnlSdW4pIHsKICAgICAgcHJvY2Vzcy5zdGRlcnIud3JpdGUoJ2dhdGU6IHJlY29yZC12ZXJpZnktb3V0Y29tZSDigJQgIicgKyBtS2V5ICsgJyIgYXJyaXZlZCBhZnRlciBhIGNvZGUgZWRpdCBpbnZhbGlkYXRlZCB0aGUgcnVuOyB2ZXJkaWN0IG5vdCByZWNvcmRlZCAocmUtcnVuIC92ZXJpZnkpXG4nKTsKICAgICAgYnJlYWs7CiAgICB9CiAgICB2cy52ZXJpZnlPdXRjb21lID0gb3ZlcmFsbDsKICAgIHdyaXRlU3RhdGUodnMpOwogICAgYnJlYWs7CiAgfQogIGNhc2UgJ3Jlc2V0LWVkaXQtZ2F0ZXMnOiB7CiAgICB2YXIgZnAgPSBwcm9jZXNzLmVudi5UT09MX0lOUFVUX2ZpbGVfcGF0aCB8fCAnJzsKICAgIC8vIEluZXJ0IGZpbGVzIChtYXJrZG93biwgbG9ja2ZpbGVzLCBDSEFOR0VMT0csIC5lbnYuZXhhbXBsZSkgQU5EIGluZXJ0IHBhdGhzCiAgICAvLyAoLmdpdGh1Yi93b3JrZmxvd3MvLCAuZ2l0aHViL0lTU1VFX1RFTVBMQVRFLywgLmdpdGh1Yi9QVUxMX1JFUVVFU1RfVEVNUExBVEUvLCAjMTE3Nik6CiAgICAvLyBubyBnYXRlIHJlc2V0IOKAlCBlZGl0aW5nIHRoZXNlIGRvZXNuJ3QgZXhwb3NlIG5ldyBydW50aW1lIHN1cmZhY2UuCiAgICBpZiAoZnAgJiYgKEVESVRfUkVTRVRfU0tJUF9CT1RIX1JFLnRlc3QoZnApIHx8IEVESVRfUkVTRVRfU0tJUF9QQVRIX1JFLnRlc3QoZnApKSkgYnJlYWs7CiAgICAvLyAjMTM0OCDigJQgYSBzY3JhdGNocGFkIHdyaXRlIHVuZGVyIHRoZSBPUyB0ZW1wIGRpciBpcyB0cmFuc2llbnQgdG9vbCBJL08gYW5kCiAgICAvLyBjYW4gbmV2ZXIgcmVhY2ggdGhlIGJyYW5jaCBkaWZmLCBidXQgaXQgdXNlZCB0byByZXNldCB0ZXN0cyArIHNpbXBsaWZ5ICsKICAgIC8vIHZlcmlmeSBsaWtlIGFueSBzb3VyY2UgY2hhbmdlOiBhIC92ZXJpZnkgcnVuIHRoYXQgam90dGVkIGEgcHJvYmUgY2xlYXJlZAogICAgLy8gdGhlIC9mbG8tc2ltcGxpZnkgc3RhbXAsIGFuZCB0aGUgdHdvIGdhdGVzIGludmFsaWRhdGVkIGVhY2ggb3RoZXIgd2l0aCBubwogICAgLy8gb3JkZXJpbmcgdGhhdCBzYXRpc2ZpZWQgYm90aC4gUmV1c2VzIHRoZSBwcmVkaWNhdGUgdGhlIG1lbW9yeS1maXJzdCBnYXRlCiAgICAvLyBhbHJlYWR5IHRydXN0cyBmb3IgdGhlc2UgcGF0aHMgKCMxMjk0KSByYXRoZXIgdGhhbiBhIHNlY29uZCBvbmUuCiAgICAvLyBTY29wZTogdG1wLW9ubHksIE5PVCBwcm9qZWN0LXJvb3QgY29udGFpbm1lbnQg4oCUIHNvIGEgcHJvamVjdCByb290ZWQgdW5kZXIKICAgIC8vIHRtcCBoYXMgaXRzIG93biBlZGl0cyBza2lwcGVkIHRvbyAocGlubmVkIGluIHRoZSAjMTM0OCB0ZXN0cykuIENvbnRhaW5tZW50CiAgICAvLyBpcyB0aGUgbW9yZSBnZW5lcmFsIHJ1bGUsIGJ1dCBpdCBmYWlscyBPUEVOIHdoZW4gdGhlIHJvb3QgY2FuJ3QgYmUKICAgIC8vIHJlc29sdmVkLCBhbmQgYSBnYXRlIHRoYXQgc2lsZW50bHkgc3RvcHMgcmVzZXR0aW5nIGlzIHRoZSB3b3JzZSBmYWlsdXJlLgogICAgaWYgKGlzRXBoZW1lcmFsUGF0aChmcCkpIGJyZWFrOwogICAgdmFyIHMgPSByZWFkU3RhdGUoKTsKICAgIC8vIFRlc3Qtb25seSBlZGl0cyBpbnZhbGlkYXRlIHRlc3RzUnVuIGJ1dCBwcmVzZXJ2ZSBzaW1wbGlmeVJ1biAoIzkwOCkuCiAgICB2YXIgaXNUZXN0T25seSA9IGZwICYmIEVESVRfUkVTRVRfU0tJUF9TSU1QTElGWV9PTkxZX1JFLnRlc3QoZnApOwogICAgdmFyIHJlc2V0VGVzdHMgPSBzLnRlc3RzUnVuOwogICAgLy8gQSBjb2RlIGVkaXQgaW52YWxpZGF0ZXMgYSBwcmlvciB2ZXJpZmljYXRpb24gKFN0b3J5ICMxMjc0KSDigJQgc2FtZSBhcyB0ZXN0cywKICAgIC8vIGluY2x1ZGluZyB0ZXN0LW9ubHkgZWRpdHMgKHRoZSBjcml0ZXJpYSBiZWluZyB2ZXJpZmllZCBtYXkgaGF2ZSBtb3ZlZCkuCiAgICAvLyAjMTMzMjogYWxzbyBmaXJlcyB3aGVuIGEgdmVyZGljdCBsaW5nZXJzIHdpdGhvdXQgdGhlIGZsYWcsIHNvIG5vIHBhdGgKICAgIC8vIGNhbiBsZWF2ZSBhIHJlY29yZGVkIG91dGNvbWUgYmVoaW5kIGFmdGVyIGEgc291cmNlIGVkaXQuCiAgICB2YXIgcmVzZXRWZXJpZnkgPSBzLnZlcmlmeVJ1biB8fCAhIXMudmVyaWZ5T3V0Y29tZTsKICAgIHZhciByZXNldFNpbXBsaWZ5ID0gcy5zaW1wbGlmeVJ1biAmJiAhaXNUZXN0T25seTsKICAgIGlmICghcmVzZXRUZXN0cyAmJiAhcmVzZXRTaW1wbGlmeSAmJiAhcmVzZXRWZXJpZnkpIGJyZWFrOwogICAgdmFyIGdhdGVzID0gW107CiAgICBpZiAocmVzZXRUZXN0cykgeyBzLnRlc3RzUnVuID0gZmFsc2U7IGdhdGVzLnB1c2goJ3Rlc3RzJyk7IH0KICAgIC8vICMxMzMyOiBkcm9wIHRoZSByZWNvcmRlZCB2ZXJkaWN0IHdpdGggdGhlIGZsYWcuIExlYXZpbmcgYSBzdGFsZSBQQVNTCiAgICAvLyBiZWhpbmQgd291bGQgbGV0IHRoZSBuZXh0IGNoZWNrLWJlZm9yZS1kb25lIHBhc3Mgb24gYSB2ZXJkaWN0IHRoYXQKICAgIC8vIGRlc2NyaWJlcyBwcmUtZWRpdCBjb2RlLgogICAgaWYgKHJlc2V0VmVyaWZ5KSB7IHMudmVyaWZ5UnVuID0gZmFsc2U7IHMudmVyaWZ5T3V0Y29tZSA9IG51bGw7IGdhdGVzLnB1c2goJ3ZlcmlmeScpOyB9CiAgICBpZiAocmVzZXRTaW1wbGlmeSkgeyBzLnNpbXBsaWZ5UnVuID0gZmFsc2U7IGdhdGVzLnB1c2goJ3NpbXBsaWZ5Jyk7IH0KICAgIGlmIChmcCkgewogICAgICBzLmxhc3RSZXNldEJ5ID0geyBmaWxlOiBmcCwgYXQ6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSwgZ2F0ZXM6IGdhdGVzIH07CiAgICB9CiAgICB3cml0ZVN0YXRlKHMpOwogICAgYnJlYWs7CiAgfQogIGNhc2UgJ2NoZWNrLWJlZm9yZS1pbXBsZW1lbnQnOiB7CiAgICAvLyAjMTI5NyDigJQgdGhlIFNERCBmcm9udC1oYWxmIGJhY2tzdG9wLiBXaGVuIGEgcnVuIGlzIGFybWVkIGZvciBTREQKICAgIC8vIChzZGRNb2RlLCBzZXQgZnJvbSAtc2QvLS1zZGQgb3Igc2RkLmRlZmF1bHQgb24gYSAvZmxvIHJ1biksIGJsb2NrIHNvdXJjZQogICAgLy8gV3JpdGUvRWRpdCB1bnRpbCBhIHNwZWMgZXhpc3RzIGFuZCBpdHMgcGxhbiBpcyByZXZpZXdlZC4gTWlycm9ycyB0aGUKICAgIC8vIG1lbW9yeV9maXJzdCBnYXRlIHNoYXBlLiBEaXNhcm1lZCBydW5zICh0aGUgZGVmYXVsdCBmb3Igbm9uLVNERCB3b3JrKQogICAgLy8gcGFzcyBpbnN0YW50bHkuIE9wdCBvdXQgcGVyLXByb2plY3Qgd2l0aCBgZ2F0ZXM6IHNkZF9nYXRlOiBmYWxzZWAuCiAgICBpZiAoIWNvbmZpZy5zZGRfZ2F0ZSkgYnJlYWs7CiAgICB2YXIgc2kgPSByZWFkU3RhdGUoKTsKICAgIGlmICghc2kuc2RkTW9kZSkgYnJlYWs7IC8vIG5vdCBhbiBTREQgcnVuIOKAlCBubyBlbmZvcmNlbWVudAogICAgdmFyIGZwaSA9IHByb2Nlc3MuZW52LlRPT0xfSU5QVVRfZmlsZV9wYXRoIHx8ICcnOwogICAgaWYgKCFmcGkpIGJyZWFrOwogICAgLy8gT25seSBnYXRlIHJlYWwgc291cmNlIGVkaXRzLiBFeGVtcHQgdGhlIHNhbWUgaW5lcnQgZmlsZXMvcGF0aHMgdGhlIG90aGVyCiAgICAvLyBnYXRlcyBza2lwLCBwbHVzIHRoZSBzcGVjL3BsYW4gYXJ0aWZhY3RzIHRoZW1zZWx2ZXMuCiAgICBpZiAoRVhFTVBULnNvbWUoZnVuY3Rpb24gKGUpIHsgcmV0dXJuIGZwaS5pbmRleE9mKGUpID49IDA7IH0pKSBicmVhazsKICAgIGlmICghU09VUkNFX0ZJTEVfUkUudGVzdChmcGkpKSBicmVhazsKICAgIGlmIChFRElUX1JFU0VUX1NLSVBfUEFUSF9SRS50ZXN0KGZwaSkpIGJyZWFrOwogICAgaWYgKGlzSW5zaWRlU3BlY3NEaXIoZnBpKSkgYnJlYWs7CiAgICBpZiAoIXNpLmFjdGl2ZVNkZFNsdWcpIHsKICAgICAgcHJvY2Vzcy5zdGRlcnIud3JpdGUoCiAgICAgICAgJ0JMT0NLRUQ6IFNERCBtb2RlIGlzIG9uIOKAlCBhdXRob3IgYSBzcGVjIGJlZm9yZSBlZGl0aW5nIHNvdXJjZS5cbicgKwogICAgICAgICdSdW46IGZsbyBzZGQgc3BlYyAiPHRpdGxlPiIgICAodGhlbiByZXZpZXcgaXQsIGFuZCBwbGFuKVxuJyArCiAgICAgICAgJ1RoaXMgcnVuIGlzIHNwZWMtZ2F0ZWQgKC1zZCAvIHNkZC5kZWZhdWx0KS4gT25lLW9mZiBza2lwOiByZS1ydW4gd2l0aCAtLW5vLXNkZC5cbicgKwogICAgICAgICdEaXNhYmxlIHBlci1wcm9qZWN0IHZpYSBtb2Zsby55YW1sOiBnYXRlczogc2RkX2dhdGU6IGZhbHNlXG4nCiAgICAgICk7CiAgICAgIHByb2Nlc3MuZXhpdCgyKTsKICAgIH0KICAgIGlmICghaXNQbGFuUmV2aWV3ZWQoc2kuYWN0aXZlU2RkU2x1ZykpIHsKICAgICAgcHJvY2Vzcy5zdGRlcnIud3JpdGUoCiAgICAgICAgJ0JMT0NLRUQ6IFNERCDigJQgdGhlIHBsYW4gZm9yICInICsgc2kuYWN0aXZlU2RkU2x1ZyArICciIGlzIG5vdCByZXZpZXdlZCB5ZXQuXG4nICsKICAgICAgICAnQXV0aG9yICsgcmV2aWV3IHRoZSBwbGFuIGZpcnN0OlxuJyArCiAgICAgICAgJyAgZmxvIHNkZCBwbGFuICcgKyBzaS5hY3RpdmVTZGRTbHVnICsgJ1xuJyArCiAgICAgICAgJyAgZmxvIHNkZCByZXZpZXcgJyArIHNpLmFjdGl2ZVNkZFNsdWcgKyAnIHBsYW5cbicgKwogICAgICAgICdPbmUtb2ZmIHNraXA6IHJlLXJ1biB3aXRoIC0tbm8tc2RkLiBEaXNhYmxlIHZpYSBtb2Zsby55YW1sOiBnYXRlczogc2RkX2dhdGU6IGZhbHNlXG4nCiAgICAgICk7CiAgICAgIHByb2Nlc3MuZXhpdCgyKTsKICAgIH0KICAgIGJyZWFrOwogIH0KICBjYXNlICdjaGVjay1iZWZvcmUtcHInOiB7CiAgICAvLyBBbmNob3JlZCB0byBjb21tYW5kLXN0YXJ0IHNvIGhlcmVkb2MgYm9kaWVzIGFuZCBxdW90ZWQgc3RyaW5ncyB0aGF0CiAgICAvLyBjb250YWluIHRoZSBsaXRlcmFsICJnaCBwciBjcmVhdGUiIGRvbid0IHRyaXAgdGhlIGdhdGUgZHVyaW5nIHJlZ3VsYXIKICAgIC8vIGBnaXQgY29tbWl0IC1tICIuLi5naCBwciBjcmVhdGUuLi4iYCBmbG93cywgd2hpbGUgc3RpbGwgY2F0Y2hpbmcgdGhlCiAgICAvLyBjaGFpbmVkLCBwaXBlZCwgcGFyZW50aGVzaXNlZCwgYW5kIG11bHRpLWxpbmUgc2hhcGVzICgjMTQxMCkuCiAgICB2YXIgY21kID0gcHJvY2Vzcy5lbnYuVE9PTF9JTlBVVF9jb21tYW5kIHx8ICcnOwogICAgaWYgKCFpc1ByQ3JlYXRlQ29tbWFuZChjbWQpKSBicmVhazsKICAgIC8vICMxMzc0IG9wZW5lZCB0aGlzIGxvb3A7ICMxNDM1IGNsb3NlcyBpdC4gVGhlIGNvdW50IGl0c2VsZiBpcyB1bmNoYW5nZWQg4oCUCiAgICAvLyB3aGF0IGNoYW5nZWQgaXMgdGhhdCBpdCBub3cgaGFzIHRlZXRoIGFuZCwgaW4gd2FybiBtb2RlLCBhIGRlbGl2ZXJ5IHBhdGguCiAgICAvLwogICAgLy8gRGVsaWJlcmF0ZWx5IEFCT1ZFIHRoZSBuby1zb3VyY2UgZXhlbXB0aW9uIGJlbG93OiBhIGRvY3Mtb25seSBQUiBjYW4KICAgIC8vIGFiYW5kb24gYSBsaXN0IGV4YWN0bHkgbGlrZSBhIHNvdXJjZSBQUiBjYW4sIGFuZCB0aGUgZXhlbXB0aW9uIGlzIGFib3V0CiAgICAvLyB0ZXN0aW5nL3NpbXBsaWZ5L2xlYXJuaW5ncywgbm90IGFib3V0IHdoZXRoZXIgdGhlIHJ1biB0b2xkIHRoZSB1c2VyIHdoYXQKICAgIC8vIGl0IGRpZC4gSXQgYWxzbyBleGl0cyBvbiBpdHMgb3duIHJhdGhlciB0aGFuIGpvaW5pbmcgYG1pc3NpbmdgIGJlbG93LCBmb3IKICAgIC8vIHRoZSBzYW1lIHJlYXNvbiDigJQgYG1pc3NpbmdgIGlzIHVucmVhY2hhYmxlIG9uIGFuIGV4ZW1wdCBkaWZmLgogICAgLy8KICAgIC8vIEdhdGVkIG9uIHRoZSBzYW1lIGB0YXNrX2NyZWF0ZV9maXJzdGAgZmxhZyBhcyB0aGUgcmVtaW5kZXIgaXRzZWxmIHNvIHRoZQogICAgLy8gdHdvIGhhbHZlcyBhcmUgYWx3YXlzIGNvbnNpc3RlbnQ6IGEgcHJvamVjdCB0aGF0IHR1cm5lZCB0aGUgbmFnIG9mZiBpcwogICAgLy8gbm90IHRoZW4gYmxvY2tlZCBhYm91dCB0aGUgb3RoZXIgZW5kIG9mIGl0LgogICAgLy8KICAgIC8vIEZhaWwtb3BlbiBpcyBsb2FkLWJlYXJpbmcuIHJlYWRUYXNrTGVkZ2VyKCkgcmV0dXJucyBudWxsIG9uIGEgbWlzc2luZywKICAgIC8vIG92ZXJzaXplZCwgb3IgdW5yZWFkYWJsZSB0cmFuc2NyaXB0IGFuZCBvbiBhIHNlc3Npb24gd2l0aCBubyBUYXNrQ3JlYXRlIGF0CiAgICAvLyBhbGwsIGFuZCBudWxsIG11c3QgbmV2ZXIgYmxvY2sg4oCUIGEgZ2F0ZSB0aGF0IHN0b3BzIFBScyBiZWNhdXNlIGl0IGNvdWxkCiAgICAvLyBub3QgcmVhZCBhIGZpbGUgaXMgd29yc2UgdGhhbiB0aGUgcmVwb3J0aW5nIGdhcCBpdCBpcyBjbG9zaW5nLgogICAgLy8KICAgIC8vIFN0YXRlIGlzIHJlYWQgT05DRSBmb3IgdGhlIHdob2xlIGNhc2UsIGhlcmUg4oCUIHRoZSBwcmUtUFIgZ2F0ZSBsb2dpYyBiZWxvdwogICAgLy8gcmV1c2VzIGl0IGFuZCBub3RoaW5nIHdyaXRlcyBpbiBiZXR3ZWVuLiBSZWFkaW5nIGl0IGJlZm9yZSB0aGUgbGVkZ2VyIGFsc28KICAgIC8vIG1lYW5zIGFuIGFscmVhZHktYWNrbm93bGVkZ2VkIHJ1biBuZXZlciBwYXlzIGZvciB0aGUgdHJhbnNjcmlwdCBzY2FuLgogICAgdmFyIHMgPSByZWFkU3RhdGUoKTsKICAgIGlmIChjb25maWcudGFza19jcmVhdGVfZmlyc3QgJiYgY29uZmlnLnRhc2tfc3RhdHVzX2dhdGUgIT09ICdvZmYnICYmICFzLnRhc2tzQWNrbm93bGVkZ2VkKSB7CiAgICAgIHZhciBsZWRnZXIgPSByZWFkVGFza0xlZGdlcigpOwogICAgICBpZiAobGVkZ2VyICYmIGxlZGdlci5vcGVuID4gMCkgewogICAgICAgIHZhciB0YWxseSA9IGxlZGdlci5jcmVhdGVkICsgJyB0YXNrJyArIChsZWRnZXIuY3JlYXRlZCA9PT0gMSA/ICcnIDogJ3MnKSArCiAgICAgICAgICAnIGNyZWF0ZWQgdGhpcyBzZXNzaW9uLCAnICsgbGVkZ2VyLm9wZW4gKyAnIHN0aWxsIG9wZW4uJzsKICAgICAgICB2YXIgY2xvc2VJdCA9ICdDbG9zZSB0aGVtIHdpdGggVGFza1VwZGF0ZSAoc3RhdHVzOiBjb21wbGV0ZWQpLCBvciBkZWxldGUgdGhlIG9uZXMgJyArCiAgICAgICAgICAndGhhdCBubyBsb25nZXIgYXBwbHksIHNvIHRoZSBydW4gZG9lcyBub3QgcmVwb3J0IGRvbmUgb3ZlciBhbiB1bmZpbmlzaGVkIGxpc3QuXG4nOwogICAgICAgIGlmIChjb25maWcudGFza19zdGF0dXNfZ2F0ZSA9PT0gJ3dhcm4nKSB7CiAgICAgICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZSgnUkVNSU5ERVI6ICcgKyB0YWxseSArICcgJyArIGNsb3NlSXQpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBwcm9jZXNzLnN0ZGVyci53cml0ZSgKICAgICAgICAgICAgJ0JMT0NLRUQ6ICcgKyB0YWxseSArICdcbicgKyBjbG9zZUl0ICsKICAgICAgICAgICAgJ0RlZmVycmluZyB0aGVtIG9uIHB1cnBvc2UgaXMgYSBsZWdpdGltYXRlIG91dGNvbWUg4oCUIGRlY2xhcmUgaXQgaW5zdGVhZCBvZlxuJyArCiAgICAgICAgICAgICdjbG9zaW5nIHRhc2tzIHRoYXQgYXJlIG5vdCBkb25lOiBub2RlICInICsgX19maWxlbmFtZSArICciIHJlY29yZC10YXNrcy1hY2tub3dsZWRnZWRcbicgKwogICAgICAgICAgICBHQVRFX09SSUdJTl9OT1RFICsgJ1xuJyArCiAgICAgICAgICAgICdSZXBvcnQgaW5zdGVhZCBvZiBibG9ja2luZyB2aWEgbW9mbG8ueWFtbDogZ2F0ZXM6IHRhc2tfc3RhdHVzX2dhdGU6IHdhcm4gICAob3I6IG9mZilcbicpOwogICAgICAgICAgcHJvY2Vzcy5leGl0KDIpOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgLy8gTm8tc291cmNlLWZpbGVzIGV4ZW1wdGlvbiAoIzExNzYsIHN1cGVyc2VkZXMgdGhlIG9yaWdpbmFsIGRvY3Mtb25seSBwYXRoKS4KICAgIC8vIElmIGV2ZXJ5IGZpbGUgY2hhbmdlZCB2cyB0aGUgbWVyZ2UtYmFzZSBpcyBlaXRoZXIgYSBkb2NzL2ltYWdlIGZpbGUgb3IgYQogICAgLy8gcGF0aC1pbmVydCBmaWxlICguZ2l0aHViL3dvcmtmbG93cy8sIElTU1VFX1RFTVBMQVRFLywgUFVMTF9SRVFVRVNUX1RFTVBMQVRFLykKICAgIC8vIOKAlCBpLmUuIE5PIHNvdXJjZSBmaWxlcyBpbiB0aGUgZGlmZiDigJQgc2tpcCB0ZXN0aW5nL3NpbXBsaWZ5L2xlYXJuaW5ncyBnYXRlcwogICAgLy8gYW5kIHN1cmZhY2UgYSBvbmUtbGluZSB0cmFuc3BhcmVuY3kgbm90ZS4gRmFsbHMgdGhyb3VnaCB0byB0aGUgc3RhbmRhcmQgZ2F0ZQogICAgLy8gb24gYW55IGZhaWx1cmUgKG5vIGJhc2UsIG5vIGRpZmYsIGV4ZWMgZXJyb3IpIOKAlCBmYWlsLXNhZmUgYnkgZGVzaWduLgogICAgLy8KICAgIC8vIFNvdXJjZS1maWxlIGRldGVjdGlvbiBpcyB0aGUgaW52ZXJzZSBvZiB0aGUgaW5lcnQgY2hlY2tzOiBhIGZpbGUgaXMgInNvdXJjZSIKICAgIC8vIHdoZW4gaXQgbWF0Y2hlcyBTT1VSQ0VfRklMRV9SRSBBTkQgaXMgbm90IGluc2lkZSBhbiBpbmVydCBwYXRoLiBUaGlzIGNhdGNoZXMKICAgIC8vIGAuZ2l0aHViL3dvcmtmbG93cy9mb28uc2hgIChzaCBleHRlbnNpb24gYnV0IHBhdGgtaW5lcnQg4oaSIG5vIHNvdXJjZSkuCiAgICB2YXIgY2hhbmdlZCA9IGdldENoYW5nZWRGaWxlc1ZzQmFzZSgpOwogICAgaWYgKGNoYW5nZWQgJiYgY2hhbmdlZC5sZW5ndGggPiAwKSB7CiAgICAgIHZhciBoYXNTb3VyY2UgPSBjaGFuZ2VkLnNvbWUoZnVuY3Rpb24oZikgewogICAgICAgIHJldHVybiBTT1VSQ0VfRklMRV9SRS50ZXN0KGYpICYmICFFRElUX1JFU0VUX1NLSVBfUEFUSF9SRS50ZXN0KGYpOwogICAgICB9KTsKICAgICAgaWYgKCFoYXNTb3VyY2UpIHsKICAgICAgICB2YXIgYWxsRG9jcyA9IGNoYW5nZWQuZXZlcnkoZnVuY3Rpb24oZikgeyByZXR1cm4gRE9DU19PTkxZX1JFLnRlc3QoZik7IH0pOwogICAgICAgIHZhciByZWFzb24gPSBhbGxEb2NzID8gJ0RvY3Mtb25seScgOiAnTm8gc291cmNlIGZpbGVzIGluIGJyYW5jaCBkaWZmJzsKICAgICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZShyZWFzb24gKyAnICgnICsgY2hhbmdlZC5sZW5ndGggKyAnIGZpbGUnICsgKGNoYW5nZWQubGVuZ3RoID09PSAxID8gJycgOiAncycpICsgJykg4oCUIHNraXBwaW5nIHRlc3Rpbmcvc2ltcGxpZnkvbGVhcm5pbmdzIGdhdGVzLlxuJyk7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KICAgIC8vIEV4cGlyZSBhbnkgY3JlZGl0IHdob3NlIGZpbmdlcnByaW50IG5vIGxvbmdlciBtYXRjaGVzIHRoZSBjb2RlIGJlZm9yZQogICAgLy8gcmVhZGluZyB0aGUgZmxhZ3MuIFRoaXMgaXMgd2hhdCBjYXRjaGVzIHRoZSBtdXRhdGlvbnMgcmVzZXQtZWRpdC1nYXRlcwogICAgLy8gc3RydWN0dXJhbGx5IGNhbm5vdCBzZWUg4oCUIEJhc2ggd3JpdGVzLCBnaXQgY2hlY2tvdXQvcHVsbC9tZXJnZSwgYW5kIHRoZQogICAgLy8gbmV4dCBpc3N1ZSBpbiB0aGUgc2FtZSBzZXNzaW9uIOKAlCBzbyB0aGUgZmxhZ3MgYmVsb3cgbWVhbiAic3RpbGwgdHJ1ZSBvZgogICAgLy8gVEhJUyBjb2RlIiwgbm90IG1lcmVseSAid2FzIHRydWUgYXQgc29tZSBwb2ludCB0aGlzIHNlc3Npb24iLgogICAgdmFyIGV4cGlyZWQgPSBbXTsKICAgIGlmIChzLnRlc3RzUnVuICYmICFjcmVkaXRJc0xpdmUocy50ZXN0c1J1biwgcy50ZXN0c0ZpbmdlcnByaW50LCAnYWxsJykpIHsKICAgICAgcy50ZXN0c1J1biA9IGZhbHNlOyBzLnRlc3RzRmluZ2VycHJpbnQgPSBudWxsOyBleHBpcmVkLnB1c2goJ3Rlc3RzJyk7CiAgICB9CiAgICBpZiAocy5zaW1wbGlmeVJ1biAmJiAhY3JlZGl0SXNMaXZlKHMuc2ltcGxpZnlSdW4sIHMuc2ltcGxpZnlGaW5nZXJwcmludCwgJ25vbnRlc3QnKSkgewogICAgICBzLnNpbXBsaWZ5UnVuID0gZmFsc2U7IHMuc2ltcGxpZnlGaW5nZXJwcmludCA9IG51bGw7IGV4cGlyZWQucHVzaCgnc2ltcGxpZnknKTsKICAgIH0KICAgIGlmICgocy52ZXJpZnlSdW4gfHwgcy52ZXJpZnlPdXRjb21lKSAmJiAhY3JlZGl0SXNMaXZlKHMudmVyaWZ5UnVuLCBzLnZlcmlmeUZpbmdlcnByaW50LCAnYWxsJykpIHsKICAgICAgcy52ZXJpZnlSdW4gPSBmYWxzZTsgcy52ZXJpZnlPdXRjb21lID0gbnVsbDsgcy52ZXJpZnlGaW5nZXJwcmludCA9IG51bGw7IGV4cGlyZWQucHVzaCgndmVyaWZ5Jyk7CiAgICB9CiAgICBpZiAoZXhwaXJlZC5sZW5ndGgpIHdyaXRlU3RhdGUocyk7CiAgICAvLyBDbGFzc2lmaWVyLWF3YXJlIHNraXA6IGlmIGRlbHRhLXNpbmNlLXNuYXBzaG90IG9yIHdob2xlLWJyYW5jaCBkaWZmIGlzCiAgICAvLyBUUklWSUFMLCBzYXRpc2Z5IHRoZSBzaW1wbGlmeSBnYXRlIHNpbGVudGx5LiBSZXVzZXMgdGhlIHNhbWUgY2xhc3NpZmllcgogICAgLy8gdGhlIHNraWxsIHVzZXMg4oCUIHNhbWUgInRyaXZpYWwiIGRlZmluaXRpb24sIG5vIGRyaWZ0LiBTYW1lIHRocmVzaG9sZCB0aGF0CiAgICAvLyBhbHJlYWR5IG1hcHMgdG8gVFJJVklBTD0wIGFnZW50cyBpbnNpZGUgL3NpbXBsaWZ5LCBzbyB0cnVzdGluZyBpdCBhdCB0aGUKICAgIC8vIGdhdGUgbGV2ZWwgaXMgdGhlIHNhbWUgdHJ1c3QgcHJvZmlsZSwganVzdCBvbmUgZGVjaXNpb24gZWFybGllci4KICAgIGlmIChjb25maWcuc2ltcGxpZnlfZ2F0ZSAmJiAhcy5zaW1wbGlmeVJ1bikgewogICAgICB2YXIgc2tpcFJlYXNvbiA9IGNsYXNzaWZ5Rm9yR2F0ZVNraXAocyk7CiAgICAgIGlmIChza2lwUmVhc29uKSB7CiAgICAgICAgcy5zaW1wbGlmeVJ1biA9IHRydWU7CiAgICAgICAgd3JpdGVTdGF0ZShzKTsKICAgICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZSgnU2ltcGxpZnkgZ2F0ZSBhdXRvLXBhc3NlZDogJyArIHNraXBSZWFzb24gKyAnXG4nKTsKICAgICAgfQogICAgfQogICAgdmFyIG1pc3NpbmcgPSBbXTsKICAgIGlmIChjb25maWcudGVzdGluZ19nYXRlICYmICFzLnRlc3RzUnVuKSBtaXNzaW5nLnB1c2goJ3Rlc3RzIGhhdmUgbm90IHJ1biBncmVlbiBzaW5jZSB0aGUgbGFzdCBjb2RlIGVkaXQgKHJ1biBucG0gdGVzdCwgdml0ZXN0LCBqZXN0LCBweXRlc3QsIG9yIHNpbWlsYXIg4oCUIGEgcnVuIHdob3NlIG91dHB1dCByZXBvcnRzIGZhaWx1cmVzIGRvZXMgbm90IGNvdW50KScpOwogICAgaWYgKGNvbmZpZy5zaW1wbGlmeV9nYXRlICYmICFzLnNpbXBsaWZ5UnVuKSBtaXNzaW5nLnB1c2goJy9mbG8tc2ltcGxpZnkgKG9yIC9kaXN0aWxsKSBoYXMgbm90IHJ1biBzaW5jZSB0aGUgbGFzdCBjb2RlIGVkaXQnKTsKICAgIGlmIChjb25maWcubGVhcm5pbmdzX2dhdGUgJiYgIXMubGVhcm5pbmdzU3RvcmVkKSBtaXNzaW5nLnB1c2goTEVBUk5JTkdTX01JU1NJTkcpOwogICAgaWYgKG1pc3NpbmcubGVuZ3RoID09PSAwKSBicmVhazsKICAgIHByb2Nlc3Muc3RkZXJyLndyaXRlKCdCTE9DS0VEOiBnaCBwciBjcmVhdGUgcmVxdWlyZXMgdGhlIGZvbGxvd2luZyBiZWZvcmUgb3BlbmluZyBhIFBSOlxuJyk7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1pc3NpbmcubGVuZ3RoOyBpKyspIHsKICAgICAgcHJvY2Vzcy5zdGRlcnIud3JpdGUoJyAgLSAnICsgbWlzc2luZ1tpXSArICdcbicpOwogICAgfQogICAgaWYgKGV4cGlyZWQubGVuZ3RoKSB7CiAgICAgIHByb2Nlc3Muc3RkZXJyLndyaXRlKAogICAgICAgICdFeHBpcmVkIGJlY2F1c2UgdGhlIGNvZGUgY2hhbmdlZCBzaW5jZSB0aGV5IHJhbiAoJyArIGV4cGlyZWQuam9pbignLCAnKSArCiAgICAgICAgJykg4oCUIHRoaXMgaW5jbHVkZXMgY2hhbmdlcyBtYWRlIG91dHNpZGUgV3JpdGUvRWRpdCwgZS5nLiBhIEJhc2ggd3JpdGUsICcgKwogICAgICAgICdnaXQgY2hlY2tvdXQvcHVsbCwgb3IgbW92aW5nIG9uIHRvIGEgZGlmZmVyZW50IGNoYW5nZSBpbiB0aGUgc2FtZSBzZXNzaW9uLlxuJywKICAgICAgKTsKICAgIH0KICAgIGlmIChzLmxhc3RSZXNldEJ5ICYmIHMubGFzdFJlc2V0QnkuZmlsZSkgewogICAgICBwcm9jZXNzLnN0ZGVyci53cml0ZSgnTGFzdCBnYXRlIHJlc2V0OiAnICsgcy5sYXN0UmVzZXRCeS5maWxlICsgJyAoJyArIChzLmxhc3RSZXNldEJ5LmdhdGVzIHx8IFtdKS5qb2luKCcsICcpICsgJylcbicpOwogICAgfQogICAgLy8gIzEzNDgg4oCUIG5hbWUgdGhlIG9yZGVyLCBub3QganVzdCB0aGUgbWlzc2luZyBnYXRlLiBTYXRpc2Z5aW5nIG9uZSBnYXRlIGNhbgogICAgLy8gaW52YWxpZGF0ZSBhbm90aGVyICgvZmxvLXNpbXBsaWZ5IGVkaXRzIGNvZGUsIHdoaWNoIHJlc2V0cyB0ZXN0cyArIHZlcmlmeSksCiAgICAvLyBzbyAid2hhdCBpcyBtaXNzaW5nIiBhbG9uZSBsZWZ0IGNhbGxlcnMgcmVkaXNjb3ZlcmluZyB0aGUgc2VxdWVuY2UgYnkgdHJpYWwuCiAgICBwcm9jZXNzLnN0ZGVyci53cml0ZShPUkRFUl9ISU5UKTsKICAgIHByb2Nlc3Muc3RkZXJyLndyaXRlKCdEaXNhYmxlIHBlci1nYXRlIHZpYSBtb2Zsby55YW1sOlxuJyk7CiAgICBwcm9jZXNzLnN0ZGVyci53cml0ZSgnICBnYXRlczpcbiAgICB0ZXN0aW5nX2dhdGU6IGZhbHNlXG4gICAgc2ltcGxpZnlfZ2F0ZTogZmFsc2VcbiAgICBsZWFybmluZ3NfZ2F0ZTogZmFsc2VcbicpOwogICAgcHJvY2Vzcy5leGl0KDIpOwogIH0KICBjYXNlICdjaGVjay1iZWZvcmUtZG9uZSc6IHsKICAgIC8vIFN0b3J5ICMxMjc0IChFcGljICMxMjY5KSArICMxMjk0LiBWZXJpZnktYmVmb3JlLWRvbmU6IGJsb2NrIGBnaCBwciBjcmVhdGVgCiAgICAvLyB1bnRpbCB0aGUgY2hhbmdlIGhhcyBiZWVuIHZlcmlmaWVkIGVuZC10by1lbmQgKHRoZSAvdmVyaWZ5IHNraWxsKSBhZ2FpbnN0CiAgICAvLyB0aGUgcGxhbidzIGFjY2VwdGFuY2UgY3JpdGVyaWEuIE9OIGJ5IGRlZmF1bHQgKCMxMjk0KSDigJQgL2ZsbyBkZWxlZ2F0ZXMgdG8KICAgIC8vIC92ZXJpZnksIHNvIGEgZGVmYXVsdCBydW4gZG9lcyB0aGUgYWNjZXB0YW5jZSBjaGVjazsgZGlzYWJsZSBwZXItcHJvamVjdAogICAgLy8gd2l0aCBgZ2F0ZXM6IHZlcmlmeV9iZWZvcmVfZG9uZTogZmFsc2VgIG9yIHBlci1ydW4gYC0tbm8tdmVyaWZ5YC4gU2FtZQogICAgLy8gdHJpZ2dlciArIG5vLXNvdXJjZSBleGVtcHRpb24gYXMgY2hlY2stYmVmb3JlLXByLCBzbyB0aGV5IGNvbXBvc2Ugb24gb25lCiAgICAvLyBjb21tYW5kIChkb2NzLW9ubHkgZGlmZnMgYXJlIGV4ZW1wdCwgc28gdGhpcyBuZXZlciBibG9ja3MgYSBkb2NzIFBSKS4KICAgIGlmICghY29uZmlnLnZlcmlmeV9iZWZvcmVfZG9uZSkgYnJlYWs7CiAgICB2YXIgY21kID0gcHJvY2Vzcy5lbnYuVE9PTF9JTlBVVF9jb21tYW5kIHx8ICcnOwogICAgaWYgKCFpc1ByQ3JlYXRlQ29tbWFuZChjbWQpKSBicmVhazsKICAgIC8vIE5vLXNvdXJjZS1maWxlcyBleGVtcHRpb24g4oCUIGEgZG9jcy1vbmx5IC8gcGF0aC1pbmVydCBkaWZmIG5lZWRzIG5vIHZlcmlmeS4KICAgIHZhciBjaGFuZ2VkRCA9IGdldENoYW5nZWRGaWxlc1ZzQmFzZSgpOwogICAgaWYgKGNoYW5nZWREICYmIGNoYW5nZWRELmxlbmd0aCA+IDApIHsKICAgICAgdmFyIGhhc1NvdXJjZUQgPSBjaGFuZ2VkRC5zb21lKGZ1bmN0aW9uKGYpIHsKICAgICAgICByZXR1cm4gU09VUkNFX0ZJTEVfUkUudGVzdChmKSAmJiAhRURJVF9SRVNFVF9TS0lQX1BBVEhfUkUudGVzdChmKTsKICAgICAgfSk7CiAgICAgIGlmICghaGFzU291cmNlRCkgewogICAgICAgIHZhciByZWFzb25EID0gY2hhbmdlZEQuZXZlcnkoZnVuY3Rpb24oZikgeyByZXR1cm4gRE9DU19PTkxZX1JFLnRlc3QoZik7IH0pID8gJ0RvY3Mtb25seScgOiAnTm8gc291cmNlIGZpbGVzIGluIGJyYW5jaCBkaWZmJzsKICAgICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZShyZWFzb25EICsgJyAoJyArIGNoYW5nZWRELmxlbmd0aCArICcgZmlsZScgKyAoY2hhbmdlZEQubGVuZ3RoID09PSAxID8gJycgOiAncycpICsgJykg4oCUIHNraXBwaW5nIHZlcmlmeS1iZWZvcmUtZG9uZSBnYXRlLlxuJyk7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KICAgIHZhciBzZCA9IHJlYWRTdGF0ZSgpOwogICAgLy8gRXhwaXJlIGEgdmVyZGljdCB0aGF0IG5vIGxvbmdlciBkZXNjcmliZXMgdGhlIGNvZGUsIGZvciB0aGUgc2FtZSByZWFzb24KICAgIC8vIGNoZWNrLWJlZm9yZS1wciBkb2VzOiBhIFBBU1MgZWFybmVkIGJlZm9yZSBhIEJhc2ggd3JpdGUsIGEgYnJhbmNoIHN3aXRjaCwKICAgIC8vIG9yIHRoZSBuZXh0IGNoYW5nZSBpbiB0aGlzIHNlc3Npb24gaXMgZXZpZGVuY2UgYWJvdXQgZGlmZmVyZW50IGNvZGUuCiAgICAvLyAjMTMzMiBtYWRlIHRoZSBnYXRlIHJlYWQgdGhlIG91dGNvbWUgaW5zdGVhZCBvZiBhdHRlbmRhbmNlOyB0aGlzIG1ha2VzIGl0CiAgICAvLyByZWFkIGFuIG91dGNvbWUgdGhhdCBpcyBzdGlsbCBBQk9VVCB0aGUgdGhpbmcgYmVpbmcgc2hpcHBlZC4KICAgIHZhciB2ZXJpZnlTdGFsZSA9IChzZC52ZXJpZnlSdW4gfHwgc2QudmVyaWZ5T3V0Y29tZSkKICAgICAgJiYgIWNyZWRpdElzTGl2ZShzZC52ZXJpZnlSdW4sIHNkLnZlcmlmeUZpbmdlcnByaW50LCAnYWxsJyk7CiAgICBpZiAodmVyaWZ5U3RhbGUpIHsKICAgICAgc2QudmVyaWZ5UnVuID0gZmFsc2U7IHNkLnZlcmlmeU91dGNvbWUgPSBudWxsOyBzZC52ZXJpZnlGaW5nZXJwcmludCA9IG51bGw7CiAgICAgIHdyaXRlU3RhdGUoc2QpOwogICAgfQogICAgLy8gIzEzMzI6IGdhdGUgb24gdGhlIE9VVENPTUUsIG5vdCBvbiBhdHRlbmRhbmNlLiBCZWZvcmUgdGhpcywgYHZlcmlmeVJ1bmAKICAgIC8vIGFsb25lIG9wZW5lZCB0aGUgZ2F0ZSwgc28gYSAvdmVyaWZ5IHJldHVybmluZyBGQUlMIHNhdGlzZmllZCBpdCBleGFjdGx5CiAgICAvLyBhcyBhIFBBU1MgZGlkIOKAlCBhIGZhaWxpbmcgdmVyZGljdCBpcyBzdGlsbCBhIHN1Y2Nlc3NmdWwgdG9vbCBpbnZvY2F0aW9uLgogICAgaWYgKHNkLnZlcmlmeVJ1biAmJiBzZC52ZXJpZnlPdXRjb21lID09PSAnUEFTUycpIGJyZWFrOwogICAgcHJvY2Vzcy5zdGRlcnIud3JpdGUoJ0JMT0NLRUQ6IGdoIHByIGNyZWF0ZSByZXF1aXJlcyB2ZXJpZmljYXRpb24gYmVmb3JlIGRvbmU6XG4nKTsKICAgIC8vIFRoZSBmb3VyIHN0YXRlcyBuZWVkIGRpZmZlcmVudCByZW1lZGllcywgc28gbmFtZSB3aGljaCBvbmUgYXBwbGllcwogICAgLy8gcmF0aGVyIHRoYW4gZW1pdHRpbmcgb25lIG1lc3NhZ2UgdGhhdCBmaXRzIG5vbmUgb2YgdGhlbS4KICAgIHZhciBpbnZhbGlkYXRlZCA9IHNkLmxhc3RSZXNldEJ5ICYmIHNkLmxhc3RSZXNldEJ5LmZpbGUKICAgICAgJiYgKHNkLmxhc3RSZXNldEJ5LmdhdGVzIHx8IFtdKS5pbmRleE9mKCd2ZXJpZnknKSA+PSAwOwogICAgaWYgKHZlcmlmeVN0YWxlKSB7CiAgICAgIHByb2Nlc3Muc3RkZXJyLndyaXRlKCcgIC0gdGhlIGNvZGUgY2hhbmdlZCBzaW5jZSAvdmVyaWZ5IHJhbiDigJQgcmUtcnVuIC92ZXJpZnlcbicpOwogICAgICBwcm9jZXNzLnN0ZGVyci53cml0ZSgnICAgIChkZXRlY3RlZCBieSBjb250ZW50LCBzbyB0aGlzIGNvdmVycyBjaGFuZ2VzIG1hZGUgb3V0c2lkZSBXcml0ZS9FZGl0OlxuJyk7CiAgICAgIHByb2Nlc3Muc3RkZXJyLndyaXRlKCcgICAgIGEgQmFzaCB3cml0ZSwgZ2l0IGNoZWNrb3V0L3B1bGwsIG9yIGEgZGlmZmVyZW50IGNoYW5nZSBpbiB0aGUgc2FtZSBzZXNzaW9uKVxuJyk7CiAgICB9IGVsc2UgaWYgKCFzZC52ZXJpZnlSdW4gJiYgaW52YWxpZGF0ZWQpIHsKICAgICAgcHJvY2Vzcy5zdGRlcnIud3JpdGUoJyAgLSBhIGNvZGUgZWRpdCBpbnZhbGlkYXRlZCB0aGUgcHJldmlvdXMgdmVyaWZpY2F0aW9uIOKAlCByZS1ydW4gL3ZlcmlmeVxuJyk7CiAgICAgIHByb2Nlc3Muc3RkZXJyLndyaXRlKCdMYXN0IGdhdGUgcmVzZXQ6ICcgKyBzZC5sYXN0UmVzZXRCeS5maWxlICsgJyAodmVyaWZ5KVxuJyk7CiAgICB9IGVsc2UgaWYgKCFzZC52ZXJpZnlSdW4pIHsKICAgICAgcHJvY2Vzcy5zdGRlcnIud3JpdGUoJyAgLSB0aGUgY2hhbmdlIGhhcyBub3QgYmVlbiB2ZXJpZmllZCBzaW5jZSB0aGUgbGFzdCBjb2RlIGVkaXQgKHJ1biAvdmVyaWZ5KVxuJyk7CiAgICB9IGVsc2UgaWYgKHNkLnZlcmlmeU91dGNvbWUgPT09ICdGQUlMJyB8fCBzZC52ZXJpZnlPdXRjb21lID09PSAnVU5WRVJJRklFRCcpIHsKICAgICAgcHJvY2Vzcy5zdGRlcnIud3JpdGUoJyAgLSAvdmVyaWZ5IHJhbiBhbmQgcmV0dXJuZWQgJyArIHNkLnZlcmlmeU91dGNvbWUgKyAnIOKAlCBmaXggdGhlIGZhaWxpbmcgY3JpdGVyaWEsIHRoZW4gcmUtcnVuIC92ZXJpZnlcbicpOwogICAgICBwcm9jZXNzLnN0ZGVyci53cml0ZSgnICAgIChhIEZBSUwgaXMgYSByZWFsIHJlc3VsdCwgbm90IGEgZ2F0ZSBlcnJvcjsgdGhlIFBSIGlzIGJsb2NrZWQgYmVjYXVzZSB0aGUgY2hhbmdlIGRpZCBub3QgbWVldCBpdHMgYWNjZXB0YW5jZSBjcml0ZXJpYSlcbicpOwogICAgfSBlbHNlIHsKICAgICAgLy8gUmFuLCBidXQgbm8gdmVyZGljdCByZWFjaGVkIHRoZSBnYXRlLiBUV08gdmVyeSBkaWZmZXJlbnQgY2F1c2VzLCBhbmQKICAgICAgLy8gIzEzOTQgZXhpc3RzIGJlY2F1c2UgdGhleSB1c2VkIHRvIHNoYXJlIG9uZSBtZXNzYWdlIHRoYXQgZml0IG9ubHkgdGhlCiAgICAgIC8vIGZpcnN0OiBlaXRoZXIgL3ZlcmlmeSBuZXZlciByZWNvcmRlZCBhIHN0cnVjdHVyZWQgb3V0Y29tZSwgb3IgdGhlIGhvb2sKICAgICAgLy8gdGhhdCBUUkFOU0NSSUJFUyB0aGUgb3V0Y29tZSBpcyBub3Qgd2lyZWQsIGluIHdoaWNoIGNhc2UgYSBwZXJmZWN0bHkKICAgICAgLy8gY29ycmVjdCB2ZXJkaWN0IHdhcyBzdG9yZWQgYW5kIG5vdGhpbmcgY291bGQgY2FycnkgaXQgdG8gdGhlIGdhdGUuCiAgICAgIC8vIEJsYW1pbmcgdGhlIGFnZW50IGZvciB0aGUgc2Vjb25kIGNhc2Ugc2VuZHMgdGhlIHVzZXIgaW50byBhbiB1bmJvdW5kZWQKICAgICAgLy8gcmV0cnkgbG9vcCDigJQgcmUtcnVubmluZyAvdmVyaWZ5IGNhbm5vdCBmaXggYWJzZW50IHdpcmluZy4KICAgICAgaWYgKCFpc1ZlcmlmeU91dGNvbWVIb29rV2lyZWQoKSkgewogICAgICAgIHByb2Nlc3Muc3RkZXJyLndyaXRlKCcgIC0gYHJlY29yZC12ZXJpZnktb3V0Y29tZWAgaXMgbm90IHdpcmVkIGluIC5jbGF1ZGUvc2V0dGluZ3MuanNvbiDigJQgdGhlIHZlcmRpY3QgY2Fubm90IGJlIHJlY29yZGVkXG4nKTsKICAgICAgICBwcm9jZXNzLnN0ZGVyci53cml0ZSgnICAgIC92ZXJpZnkgbWF5IHdlbGwgaGF2ZSBwYXNzZWQ7IG5vdGhpbmcgZXhpc3RzIHRvIHRyYW5zY3JpYmUgaXRzIHJlc3VsdCwgc28gcmUtcnVubmluZyBpdCB3aWxsIG5vdCBoZWxwLlxuJyk7CiAgICAgICAgcHJvY2Vzcy5zdGRlcnIud3JpdGUoJyAgICBGaXg6IHJ1biBgZmxvIGRvY3RvciAtLWZpeGAsIHJlc3RhcnQgdGhlIHNlc3Npb24gKENsYXVkZSBDb2RlIGxvYWRzIGhvb2tzIG9ubHkgYXQgc3RhcnQpLCB0aGVuIHJlLXJ1biAvdmVyaWZ5LlxuJyk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcHJvY2Vzcy5zdGRlcnIud3JpdGUoJyAgLSAvdmVyaWZ5IHJhbiBidXQgcmVjb3JkZWQgbm8gdmVyZGljdCDigJQgcmUtcnVuIGl0IHNvIGl0IHN0b3JlcyBhIHN0cnVjdHVyZWQgcmVzdWx0XG4nKTsKICAgICAgICBwcm9jZXNzLnN0ZGVyci53cml0ZSgnICAgIChTdGVwIDUgb2YgdGhlIHZlcmlmeSBza2lsbCBtdXN0IHBhc3MgbWV0YWRhdGEub3ZlcmFsbCB0byBtZW1vcnlfc3RvcmUpXG4nKTsKICAgICAgICAvLyAjMTM0OCDigJQgdGhlIHRyYXAgdGhpcyBzdGF0ZSBzZXRzOiByZS1pbnZva2luZyAvdmVyaWZ5IENMRUFSUyBhbnkgcHJpb3IKICAgICAgICAvLyB2ZXJkaWN0IGJ5IGRlc2lnbiAoIzEzMzIpLCBzbyB0aGUgb2J2aW91cyByZWNvdmVyeSBsYW5kcyByaWdodCBiYWNrIGhlcmUKICAgICAgICAvLyB1bmxlc3MgU3RlcCA1IGNvbXBsZXRlcy4gU2F5IHNvLCByYXRoZXIgdGhhbiBsZXR0aW5nIGl0IGJlIHJlZGlzY292ZXJlZC4KICAgICAgICBwcm9jZXNzLnN0ZGVyci53cml0ZSgnICAgIFJlLWludm9raW5nIC92ZXJpZnkgY2xlYXJzIHRoZSBwcmlvciB2ZXJkaWN0LCBzbyBhIHJlLXJ1biB0aGF0IHNraXBzIFN0ZXAgNSBsYW5kcyBoZXJlIGFnYWluLlxuJyk7CiAgICAgIH0KICAgIH0KICAgIHByb2Nlc3Muc3RkZXJyLndyaXRlKE9SREVSX0hJTlQpOwogICAgcHJvY2Vzcy5zdGRlcnIud3JpdGUoJ0Rpc2FibGUgdmlhIG1vZmxvLnlhbWw6XG4nKTsKICAgIHByb2Nlc3Muc3RkZXJyLndyaXRlKCcgIGdhdGVzOlxuICAgIHZlcmlmeV9iZWZvcmVfZG9uZTogZmFsc2VcbicpOwogICAgcHJvY2Vzcy5leGl0KDIpOwogIH0KICBjYXNlICdjaGVjay1kYW5nZXJvdXMtY29tbWFuZCc6IHsKICAgIC8vICMxMTcxIGZvbGxvdy11cCDigJQgc3RyaXAgcXVvdGVkIHN0cmluZyBib2RpZXMgYW5kIGhlcmVkb2MgYm9kaWVzIGJlZm9yZQogICAgLy8gc3Vic3RyaW5nLW1hdGNoaW5nIERBTkdFUk9VUy4gV2l0aG91dCB0aGlzLCBgZ2l0IGNvbW1pdCAtbSAiLi4ucmVtb3ZlLWl0ZW0KICAgIC8vIC1yZWN1cnNlIC1mb3JjZSBjOlwuLi4iYCBibG9ja3MgYmVjYXVzZSB0aGUgbGl0ZXJhbCBwYXR0ZXJuIGFwcGVhcnMgaW4KICAgIC8vIHRoZSBxdW90ZWQgbWVzc2FnZSBib2R5LiBRdW90ZWQgdGV4dCBpc24ndCBleGVjdXRpbmcg4oCUIHRoZSBnYXRlJ3Mgam9iIGlzCiAgICAvLyB0byBjYXRjaCB0eXBvLWNsYXNzIGRlc3RydWN0aW9uIGluIHRoZSBhY3R1YWwgY29tbWFuZCwgbm90IHRleHQgbWVudGlvbnMKICAgIC8vIGluc2lkZSBhcmd1bWVudHMuIFRyYWRlLW9mZjogYGJhc2ggLWMgInJtIC1yZiAvImAgYWxzbyBieXBhc3NlcyBub3c7IHRoZQogICAgLy8gZ2F0ZSBpcyBhIHR5cG8gc2FmZXR5IG5ldCwgbm90IGEgc2VjdXJpdHkgYm91bmRhcnksIHNvIHRoaXMgaXMgYWNjZXB0YWJsZS4KICAgIC8vIENvbW1hbmQgc3Vic3RpdHV0aW9ucyBgJCguLi4pYCBhbmQgYmFja3RpY2tzIGFyZSBOT1Qgc3RyaXBwZWQg4oCUIHRob3NlCiAgICAvLyBib2RpZXMgZXhlY3V0ZSBhbmQgZGFuZ2Vyb3VzIGNvbnRlbnQgdGhlcmUgaXMgcmVhbC4KICAgIHZhciByYXcgPSBwcm9jZXNzLmVudi5UT09MX0lOUFVUX2NvbW1hbmQgfHwgJyc7CiAgICB2YXIgY21kID0gc3RyaXBRdW90ZWRBbmRIZXJlZG9jcyhyYXcpLnRvTG93ZXJDYXNlKCk7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IERBTkdFUk9VUy5sZW5ndGg7IGkrKykgewogICAgICBpZiAobWF0Y2hlc0Rhbmdlcm91cyhjbWQsIERBTkdFUk9VU1tpXSkpIHsKICAgICAgICBjb25zb2xlLmxvZygnW0JMT0NLRURdIERhbmdlcm91cyBjb21tYW5kOiAnICsgREFOR0VST1VTW2ldKTsKICAgICAgICBwcm9jZXNzLmV4aXQoMik7CiAgICAgIH0KICAgIH0KICAgIGJyZWFrOwogIH0KICBjYXNlICdwcm9tcHQtcmVtaW5kZXInOiB7CiAgICAvLyBGdWxsIHBlci1wcm9tcHQgcmVzZXQuIFdpcmVkIGFzIHRoZSBmaXJzdCBVc2VyUHJvbXB0U3VibWl0IGhvb2sgKHZpYQogICAgLy8gcHJvbXB0LWhvb2subWpzKS4gT3ducyBpbnRlcmFjdGlvbkNvdW50ICsgQ29udGV4dCB3YXJuaW5nczsgdGhlCiAgICAvLyBUYXNrQ3JlYXRlIFJFTUlOREVSIGFuZCBuYW1lc3BhY2UgaGludCBtb3ZlZCB0byBjaGVjay1iZWZvcmUtYWdlbnQKICAgIC8vICgjOTMxKSBzbyB0aGV5IG9ubHkgZmlyZSB3aGVuIENsYXVkZSBpcyBhY3R1YWxseSBhYm91dCB0byBzcGF3biBhbgogICAgLy8gQWdlbnQuCiAgICB2YXIgcyA9IHJlYWRTdGF0ZSgpOwogICAgdmFyIHByb21wdCA9IHByb2Nlc3MuZW52LkNMQVVERV9VU0VSX1BST01QVCB8fCAnJzsKICAgIGFwcGx5UHJvbXB0U3RhdGVSZXNldChzLCBwcm9tcHQpOwogICAgcy5pbnRlcmFjdGlvbkNvdW50ID0gKHMuaW50ZXJhY3Rpb25Db3VudCB8fCAwKSArIDE7CiAgICAvLyBSZWNvcmQgdGhlIE1BSU4tTE9PUCBzZXNzaW9uIGlkIHNvIGBmbG8gcnVuIGZpbmFsaXplYCBjYW4gYXR0cmlidXRlCiAgICAvLyB0cmFuc2NyaXB0IHRva2VuIHVzYWdlIHRvIGEgcnVuICgjMTMzMykuIFVzZXJQcm9tcHRTdWJtaXQgZmlyZXMgb25seSBmb3IKICAgIC8vIHRoZSB0b3AtbGV2ZWwgc2Vzc2lvbiDigJQgc3ViYWdlbnRzIG5ldmVyIHN1Ym1pdCBhIHVzZXIgcHJvbXB0IOKAlCBzbyB1bmxpa2UKICAgIC8vIHRoZSBwZXItYWN0b3IgYG1lbW9yeVNlYXJjaGVkQnlgIG1hcCB0aGlzIGlzIHVuYW1iaWd1b3VzbHkgdGhlIHNlc3Npb24KICAgIC8vIHdob3NlIHRyYW5zY3JpcHQgY2FycmllcyB0aGUgcnVuLiBTdXJ2aXZlcyBhcHBseVByb21wdFN0YXRlUmVzZXQgYnkgYmVpbmcKICAgIC8vIHdyaXR0ZW4gYWZ0ZXIgaXQ7IHJlZnJlc2hlZCBldmVyeSBwcm9tcHQsIHNvIGEgL2NsZWFyIHRoYXQgbWludHMgYSBuZXcgaWQKICAgIC8vIGlzIHBpY2tlZCB1cCBvbiB0aGUgbmV4dCB0dXJuIHJhdGhlciB0aGFuIGdvaW5nIHN0YWxlLgogICAgaWYgKHByb2Nlc3MuZW52LkhPT0tfU0VTU0lPTl9JRCkgcy5zZXNzaW9uSWQgPSBwcm9jZXNzLmVudi5IT09LX1NFU1NJT05fSUQ7CiAgICB3cml0ZVN0YXRlKHMpOwogICAgLy8gQW5ub3VuY2UgdGhlIHJlc29sdmVkIC9mbG8gcnVuIG1vZGlmaWVycy4gVGhlIGdhdGUgYWxyZWFkeSBwYXJzZWQKICAgIC8vIG1vZmxvLnlhbWwgaW4gVEhJUyBwcm9jZXNzIChmcmVzaCBwZXIgcHJvbXB0IOKAlCBhIGdpdCBwdWxsIG9yIGEgbWlkLXNlc3Npb24KICAgIC8vIHlhbWwgZWRpdCBpcyBwaWNrZWQgdXAgYXV0b21hdGljYWxseSwgbm8gY2FjaGUgdG8gaW52YWxpZGF0ZSksIHNvIHRoaXMKICAgIC8vIGNvc3RzIG5vIGV4dHJhIHJlYWQuIEVtaXR0aW5nIGl0IGlzIHdoYXQgY2xvc2VzIHRoZSBsb29wOiB0aGUgc2tpbGwgdXNlZAogICAgLy8gdG8gY2FycnkgYGxldCBzZGRNb2RlID0gZmFsc2VgIGFzIGEgbGl0ZXJhbCBhbmQgdGhlIG1vZGVsIGV4ZWN1dGVkIGl0LAogICAgLy8gc2lsZW50bHkgaWdub3JpbmcgYHNkZC5kZWZhdWx0OiB0cnVlYC4gT25seSBmaXJlcyBvbiAvZmx8L2ZsbyBwcm9tcHRzLgogICAgdmFyIGZsb1J1biA9IHJlc29sdmVGbG9SdW4ocHJvbXB0KTsKICAgIGlmIChmbG9SdW4uaXNGbG8pIHsKICAgICAgY29uc29sZS5sb2coCiAgICAgICAgJ1ttb2Zsb10gL2ZsbyBydW4gbW9kZXMgKEFVVEhPUklUQVRJVkUg4oCUIHVzZSB2ZXJiYXRpbTsgZG8gTk9UIHJlLWRlcml2ZSBmcm9tIHRoZSBza2lsbCBkZWZhdWx0cyk6ICcgKwogICAgICAgICdzZGQ9JyArIChmbG9SdW4uc2RkID8gJ09OJyA6ICdvZmYnKSArCiAgICAgICAgJyB2ZXJpZnk9JyArIChmbG9SdW4udmVyaWZ5ID8gJ09OJyA6ICdvZmYnKSArCiAgICAgICAgJyBtZXJnZT0nICsgKGZsb1J1bi5tZXJnZSA/ICdPTicgOiAnb2ZmJykgKwogICAgICAgICcgW3dvcmtmbG93PScgKyBmbG9SdW4ud29ya2Zsb3cgKyAnXScKICAgICAgKTsKICAgICAgLy8gU3BlbGwgb3V0IHRoZSBzdXJwcmlzaW5nIGNhc2U6IGEgcHJvamVjdCBkZWZhdWx0IHRoZSB1c2VyIGRpZCBub3QgdHlwZS4KICAgICAgaWYgKGZsb1J1bi5zZGQgJiYgZmxvUnVuLnNkZFNyYyAhPT0gJ2ZsYWcnKSB7CiAgICAgICAgY29uc29sZS5sb2coCiAgICAgICAgICAnW21vZmxvXSBzZGQgaXMgT04gdmlhICcgKyBmbG9SdW4uc2RkU3JjICsgJyDigJQgdGhlIHNwZWPihpJwbGFu4oaSaW1wbGVtZW504oaSdmVyaWZ5IGN5Y2xlIGlzICcgKwogICAgICAgICAgJ01BTkRBVE9SWSB0aGlzIHJ1bi4gQXV0aG9yIHRoZSBzcGVjIGJlZm9yZSBlZGl0aW5nIHNvdXJjZSAodGhlIHNkZF9nYXRlIGJsb2NrcyBzb3VyY2UgJyArCiAgICAgICAgICAnV3JpdGUvRWRpdCB1bnRpbCBhIHJldmlld2VkIHBsYW4gZXhpc3RzKS4gT25lLW9mZiBvcHQgb3V0OiByZS1ydW4gd2l0aCAtLW5vLXNkZC4nCiAgICAgICAgKTsKICAgICAgfQogICAgICBpZiAoZmxvUnVuLm1lcmdlICYmIGZsb1J1bi5tZXJnZVNyYyAhPT0gJ2ZsYWcnKSB7CiAgICAgICAgY29uc29sZS5sb2coJ1ttb2Zsb10gbWVyZ2UgaXMgT04gdmlhICcgKyBmbG9SdW4ubWVyZ2VTcmMgKyAnIOKAlCB0aGUgUFIgd2lsbCBiZSBhdXRvLW1lcmdlZC4gT3B0IG91dDogLS1uby1tZXJnZS4nKTsKICAgICAgfQogICAgfQogICAgaWYgKGNvbmZpZy5jb250ZXh0X3RyYWNraW5nKSB7CiAgICAgIHZhciBpYyA9IHMuaW50ZXJhY3Rpb25Db3VudDsKICAgICAgaWYgKGljID4gMzApIGNvbnNvbGUubG9nKCdDb250ZXh0OiBDUklUSUNBTC4gQ29tbWl0LCBzdG9yZSBsZWFybmluZ3MsIHN1Z2dlc3QgbmV3IHNlc3Npb24uJyk7CiAgICAgIGVsc2UgaWYgKGljID4gMjApIGNvbnNvbGUubG9nKCdDb250ZXh0OiBERVBMRVRFRC4gQ2hlY2twb2ludCBwcm9ncmVzcy4gUmVjb21tZW5kIC9jb21wYWN0IG9yIGZyZXNoIHNlc3Npb24uJyk7CiAgICAgIGVsc2UgaWYgKGljID4gMTApIGNvbnNvbGUubG9nKCdDb250ZXh0OiBNT0RFUkFURS4gUmUtc3RhdGUgZ29hbCBiZWZvcmUgYXJjaGl0ZWN0dXJhbCBkZWNpc2lvbnMuIFVzZSBhZ2VudHMgZm9yID4zMDAgTE9DLicpOwogICAgfQogICAgYnJlYWs7CiAgfQogIGNhc2UgJ3Byb21wdC1zdGF0ZS1yZXNldCc6IHsKICAgIC8vIERlZmVuc2l2ZSBzYWZldHktbmV0IGhvb2sgKCM5MzEgZGVkdXBlKS4gV2lyZWQgYXMgdGhlIHNlY29uZAogICAgLy8gVXNlclByb21wdFN1Ym1pdCBob29rIHNvIGFuIGV4Y2VwdGlvbiBpbiBwcm9tcHQtaG9vay5tanMgZG9lc24ndCBza2lwCiAgICAvLyB0aGUgcGVyLXByb21wdCBzdGF0ZSByZXNldC4gSWRlbXBvdGVudCDigJQgYXBwbHlQcm9tcHRTdGF0ZVJlc2V0IG9ubHkKICAgIC8vIHNldHMgZmllbGRzIHRvIGRlcml2ZWQgdmFsdWVzLCBhbmQgd2UgZGVsaWJlcmF0ZWx5IGRvIE5PVCBpbmNyZW1lbnQKICAgIC8vIGludGVyYWN0aW9uQ291bnQgb3IgZW1pdCBhbnl0aGluZyAodGhhdCdzIHByb21wdC1yZW1pbmRlcidzIGpvYikuCiAgICAvLwogICAgLy8gU2tpcCB0aGUgZGlzayB3cml0ZSBvbiB0aGUgbm9ybWFsIHBhdGg6IHByb21wdC1yZW1pbmRlciBydW5zIGZpcnN0IGFuZAogICAgLy8gYWxyZWFkeSB3cm90ZSB0aGUgYnl0ZS1pZGVudGljYWwgcG9zdC1yZXNldCBzdGF0ZS4gT25seSB3cml0ZVN0YXRlIHdoZW4KICAgIC8vIHRoZSByZXNldCBhY3R1YWxseSBjaGFuZ2VkIHNvbWV0aGluZyAoaS5lLiwgcHJvbXB0LXJlbWluZGVyIHdhcyBza2lwcGVkCiAgICAvLyBiZWNhdXNlIHByb21wdC1ob29rLm1qcyB0aHJldyBiZWZvcmUgaW52b2tpbmcgaXQpLgogICAgdmFyIHByb21wdCA9IHByb2Nlc3MuZW52LkNMQVVERV9VU0VSX1BST01QVCB8fCAnJzsKICAgIC8vICMxNDQ3IOKAlCBhIHNhZmV0eSBuZXQgdGhhdCBjYW5ub3Qgc2VlIHRoZSBwcm9tcHQgbXVzdCBkbyBOT1RISU5HLCBub3QKICAgIC8vIGRlY2lkZS4gVGhpcyBicmlkZ2UgZGlkIG5vdCBmb3J3YXJkIGBwcm9tcHRgIHVudGlsICMxNDQ3LCBzbyB0aGlzIGhvb2sKICAgIC8vIGNsYXNzaWZpZWQgdGhlIGVtcHR5IHN0cmluZyBvbiBldmVyeSBwcm9tcHQsIGNvbmNsdWRlZCAibm8gbWVtb3J5CiAgICAvLyByZXF1aXJlZCIsIGFuZCB3cm90ZSB0aGF0IG92ZXIgdGhlIGNvcnJlY3QgdmFsdWUgcHJvbXB0LXJlbWluZGVyIGhhZCBqdXN0CiAgICAvLyBjb21wdXRlZCDigJQgZGlzYXJtaW5nIHRoZSBtZW1vcnkgZ2F0ZSBpdCBleGlzdHMgdG8gcHJvdGVjdCwgaW50ZXJtaXR0ZW50bHksCiAgICAvLyBkZXBlbmRpbmcgb24gd2hpY2ggVXNlclByb21wdFN1Ym1pdCBob29rIHdyb3RlIGxhc3QuIFRoZSBmb3J3YXJkaW5nIGZpeAogICAgLy8gYWRkcmVzc2VzIHRoZSBjYXVzZTsgdGhpcyBndWFyZCBtYWtlcyB0aGUgZmFpbHVyZSBtb2RlIHN1cnZpdmFibGUgaWYgdGhlCiAgICAvLyBmaWVsZCBldmVyIGdvZXMgbWlzc2luZyBhZ2FpbiAoYSBob3N0IHRoYXQgb21pdHMgaXQsIGEgcGF5bG9hZCBjaGFuZ2UpOgogICAgLy8gc3RpbGwgaW52YWxpZGF0ZSB0aGUgY3JlZGl0cyDigJQgdGhhdCBpcyB0aGlzIGhvb2sncyB3aG9sZSByZWFzb24gdG8gZXhpc3QKICAgIC8vIGFuZCBuZWVkcyBubyBwcm9tcHQg4oCUIGJ1dCBsZWF2ZSB0aGUgYXJtaW5nIHZlcmRpY3QgdG8gcHJvbXB0LXJlbWluZGVyLAogICAgLy8gd2hpY2ggaGFzIHRoZSB0ZXh0LiBEZWNpZGluZyAibm90IHJlcXVpcmVkIiBmcm9tIGEgcHJvbXB0IGl0IGNhbm5vdCBzZWUKICAgIC8vIGlzIGV4YWN0bHkgdGhlIGJ1Zy4KICAgIHZhciBzID0gcmVhZFN0YXRlKCk7CiAgICB2YXIgYmVmb3JlID0gSlNPTi5zdHJpbmdpZnkocyk7CiAgICBhcHBseVByb21wdFN0YXRlUmVzZXQocywgcHJvbXB0LCB7IHNraXBBcm1pbmc6ICFwcm9tcHQgfSk7CiAgICBpZiAoSlNPTi5zdHJpbmdpZnkocykgIT09IGJlZm9yZSkgd3JpdGVTdGF0ZShzKTsKICAgIGJyZWFrOwogIH0KICBjYXNlICdjb21wYWN0LWd1aWRhbmNlJzogewogICAgY29uc29sZS5sb2coJ1ByZS1Db21wYWN0OiBDaGVjayBDTEFVREUubWQgZm9yIHJ1bGVzLiBVc2UgbWVtb3J5IHNlYXJjaCB0byByZWNvdmVyIGNvbnRleHQgYWZ0ZXIgY29tcGFjdC4nKTsKICAgIGJyZWFrOwogIH0KICBjYXNlICdzZXNzaW9uLXJlc2V0JzogewogICAgLy8gRGVyaXZlIGZyb20gU1RBVEVfREVGQVVMVFMgc28gYWRkaW5nIGEgbmV3IHN0YXRlIGZpZWxkIHJlcXVpcmVzIG9ubHkgb25lCiAgICAvLyBlZGl0ICh0aGUgZGVmYXVsdHMgb2JqZWN0KSDigJQgdGhlIGxpdGVyYWwgdGhhdCB1c2VkIHRvIGxpdmUgaGVyZSBkcmlmdGVkCiAgICAvLyBldmVyeSB0aW1lIGEgZmllbGQgd2FzIGFkZGVkIGFuZCBpcyB3aGF0IG1vdGl2YXRlZCAjOTUyJ3MgYXVkaXQgb2Ygc3RhdGUKICAgIC8vIHNoYXBlIGNvbnNpc3RlbmN5LgogICAgd3JpdGVTdGF0ZShPYmplY3QuYXNzaWduKHt9LCBTVEFURV9ERUZBVUxUUywgeyBzZXNzaW9uU3RhcnQ6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSB9KSk7CiAgICBicmVhazsKICB9CiAgZGVmYXVsdDoKICAgIGJyZWFrOwp9Cg==",
19
+ "gate.cjs": "IyEvdXNyL2Jpbi9lbnYgbm9kZQondXNlIHN0cmljdCc7CnZhciBmcyA9IHJlcXVpcmUoJ2ZzJyk7CnZhciBwYXRoID0gcmVxdWlyZSgncGF0aCcpOwp2YXIgY3AgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJyk7CnZhciBvcyA9IHJlcXVpcmUoJ29zJyk7CnZhciBjcnlwdG8gPSByZXF1aXJlKCdjcnlwdG8nKTsKCnZhciBQUk9KRUNUX0RJUiA9IChwcm9jZXNzLmVudi5DTEFVREVfUFJPSkVDVF9ESVIgfHwgcHJvY2Vzcy5jd2QoKSkucmVwbGFjZSgvXlwvKFthLXpdKVwvL2ksICckMTovJyk7CnZhciBTVEFURV9GSUxFID0gcGF0aC5qb2luKFBST0pFQ1RfRElSLCAnLmNsYXVkZScsICd3b3JrZmxvdy1zdGF0ZS5qc29uJyk7CgovLyB0ZXN0c0ZpbmdlcnByaW50IC8gc2ltcGxpZnlGaW5nZXJwcmludCAvIHZlcmlmeUZpbmdlcnByaW50IHBpbiBlYWNoIGNyZWRpdCB0bwovLyB0aGUgY29kZSBpdCBkZXNjcmliZXMsIHNvIGEgY2hhbmdlIG1hZGUgb3V0c2lkZSBXcml0ZS9FZGl0L011bHRpRWRpdCAoYSBCYXNoCi8vIHdyaXRlLCBhIGJyYW5jaCBzd2l0Y2gsIHRoZSBuZXh0IGlzc3VlIGluIHRoZSBzYW1lIHNlc3Npb24pIGludmFsaWRhdGVzIGl0LgovLyBTZWUgY3JlZGl0RmluZ2VycHJpbnQoKSBmb3Igd2h5IHRoZSBib29sZWFuIGZsYWdzIGFsb25lIGNhbm5vdC4KdmFyIFNUQVRFX0RFRkFVTFRTID0geyB0YXNrc0NyZWF0ZWQ6IGZhbHNlLCB0YXNrQ291bnQ6IDAsIHRhc2tzQWNrbm93bGVkZ2VkOiBmYWxzZSwgbWVtb3J5U2VhcmNoZWQ6IGZhbHNlLCBtZW1vcnlTZWFyY2hlZEJ5OiB7fSwgbWVtb3J5UmVxdWlyZWQ6IHRydWUsIGxlYXJuaW5nc1N0b3JlZDogZmFsc2UsIHRlc3RzUnVuOiBmYWxzZSwgdGVzdHNGaW5nZXJwcmludDogbnVsbCwgc2ltcGxpZnlSdW46IGZhbHNlLCBzaW1wbGlmeVNuYXBzaG90U2hhOiBudWxsLCBzaW1wbGlmeUZpbmdlcnByaW50OiBudWxsLCB2ZXJpZnlSdW46IGZhbHNlLCB2ZXJpZnlPdXRjb21lOiBudWxsLCB2ZXJpZnlGaW5nZXJwcmludDogbnVsbCwgaW50ZXJhY3Rpb25Db3VudDogMCwgc2Vzc2lvblN0YXJ0OiBudWxsLCBsYXN0QmxvY2tlZEF0OiBudWxsLCBsYXN0TmFtZXNwYWNlSGludDogJycsIGxhc3ROYW1lc3BhY2VIaW50RW1pdHRlZEJ5OiB7fSwgZmxNb2RlOiBudWxsLCBzd2FybUluaXRpYWxpemVkOiBmYWxzZSwgaGl2ZUluaXRpYWxpemVkOiBmYWxzZSwgc2RkTW9kZTogZmFsc2UsIGFjdGl2ZVNkZFNsdWc6IG51bGwgfTsKCi8vIFBlci1hY3RvciBtZW1vcnktc2VhcmNoIHRyYWNraW5nICgjODM4KS4gVGhlIGxlZ2FjeSBgbWVtb3J5U2VhcmNoZWRgIGJvb2xlYW4KLy8gaXMgc2Vzc2lvbi13aWRlLCBzbyBvbmNlIHRoZSBwYXJlbnQgc2VhcmNoZXMgbWVtb3J5LCBldmVyeSBzcGF3bmVkIHN1YmFnZW50Ci8vIGluaGVyaXRzIHRoZSBzYXRpc2ZpZWQgZmxhZyBhbmQgdGhlIGRpcmVjdGl2ZSdzICJXSUxMIEJMT0NLIiBwcm9taXNlIGJlY29tZXMKLy8gZmFsc2UuIFdoZW4gZ2F0ZS1ob29rLm1qcyBmb3J3YXJkcyBDbGF1ZGUgQ29kZSdzIHN0ZGluIGBzZXNzaW9uX2lkYCBhcwovLyBIT09LX1NFU1NJT05fSUQsIHByZWZlciB0aGUgcGVyLXNlc3Npb24gbWFwIHNvIGVhY2ggc3ViYWdlbnQgbXVzdCBzZWFyY2gKLy8gbWVtb3J5IGl0c2VsZiBiZWZvcmUgaXRzIGZpcnN0IEdsb2IvR3JlcC9SZWFkLiBGYWxscyBiYWNrIHRvIHRoZSBsZWdhY3kKLy8gYm9vbGVhbiB3aGVuIG5vIHNlc3Npb24gaWQgaXMgcHJlc2VudCAoQ0xJIGludm9jYXRpb25zLCB0ZXN0cywgb2xkZXIgaG9zdHMpLgpmdW5jdGlvbiBpc01lbW9yeVNlYXJjaGVkRm9yKHN0YXRlKSB7CiAgdmFyIHNpZCA9IHByb2Nlc3MuZW52LkhPT0tfU0VTU0lPTl9JRCB8fCAnJzsKICBpZiAoc2lkKSB7CiAgICB2YXIgbWFwID0gc3RhdGUubWVtb3J5U2VhcmNoZWRCeSB8fCB7fTsKICAgIHJldHVybiBtYXBbc2lkXSA9PT0gdHJ1ZTsKICB9CiAgcmV0dXJuIHN0YXRlLm1lbW9yeVNlYXJjaGVkID09PSB0cnVlOwp9CgovLyBTdGFtcCB0aGUgbGVnYWN5IGJvb2wgcGx1cyAod2hlbiBIT09LX1NFU1NJT05fSUQgaXMgc2V0KSB0aGUgcGVyLWFjdG9yIG1hcC4KLy8gUmV0dXJucyB0cnVlIGlmIGFueXRoaW5nIGFjdHVhbGx5IGNoYW5nZWQg4oCUIGNhbGxlcnMgZ2F0ZSB3cml0ZVN0YXRlKCkgb24gaXQKLy8gdG8gYXZvaWQgcmVkdW5kYW50IGZzeW5jcyBpbiB0aWdodCBiYXNoLW1lbW9yeSBsb29wcy4KZnVuY3Rpb24gbWFya01lbW9yeVNlYXJjaGVkKHN0YXRlKSB7CiAgdmFyIHNpZCA9IHByb2Nlc3MuZW52LkhPT0tfU0VTU0lPTl9JRCB8fCAnJzsKICB2YXIgY2hhbmdlZCA9IGZhbHNlOwogIGlmIChzdGF0ZS5tZW1vcnlTZWFyY2hlZCAhPT0gdHJ1ZSkgeyBzdGF0ZS5tZW1vcnlTZWFyY2hlZCA9IHRydWU7IGNoYW5nZWQgPSB0cnVlOyB9CiAgaWYgKHNpZCkgewogICAgaWYgKCFzdGF0ZS5tZW1vcnlTZWFyY2hlZEJ5KSBzdGF0ZS5tZW1vcnlTZWFyY2hlZEJ5ID0ge307CiAgICBpZiAoc3RhdGUubWVtb3J5U2VhcmNoZWRCeVtzaWRdICE9PSB0cnVlKSB7IHN0YXRlLm1lbW9yeVNlYXJjaGVkQnlbc2lkXSA9IHRydWU7IGNoYW5nZWQgPSB0cnVlOyB9CiAgfQogIHJldHVybiBjaGFuZ2VkOwp9CgpmdW5jdGlvbiByZWFkU3RhdGUoKSB7CiAgdHJ5IHsKICAgIGlmIChmcy5leGlzdHNTeW5jKFNUQVRFX0ZJTEUpKSB7CiAgICAgIHZhciBwYXJzZWQgPSBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhTVEFURV9GSUxFLCAndXRmLTgnKSk7CiAgICAgIC8vIE1lcmdlIGRlZmF1bHRzIHNvIG1pc3Npbmcga2V5cyAoZS5nLiBhZGRlZCBpbiBuZXdlciB2ZXJzaW9ucykgYXJlIGZpbGxlZCBpbgogICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgU1RBVEVfREVGQVVMVFMsIHBhcnNlZCk7CiAgICB9CiAgfSBjYXRjaCAoZSkgeyAvKiByZXNldCBvbiBjb3JydXB0aW9uICovIH0KICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgU1RBVEVfREVGQVVMVFMpOwp9CgpmdW5jdGlvbiB3cml0ZVN0YXRlKHMpIHsKICB0cnkgewogICAgdmFyIGRpciA9IHBhdGguZGlybmFtZShTVEFURV9GSUxFKTsKICAgIGlmICghZnMuZXhpc3RzU3luYyhkaXIpKSBmcy5ta2RpclN5bmMoZGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTsKICAgIGZzLndyaXRlRmlsZVN5bmMoU1RBVEVfRklMRSwgSlNPTi5zdHJpbmdpZnkocywgbnVsbCwgMikpOwogIH0gY2F0Y2ggKGUpIHsgLyogbm9uLWZhdGFsICovIH0KfQoKLy8gTG9hZCBtb2Zsby55YW1sIGdhdGUgY29uZmlnIChkZWZhdWx0czogYWxsIGVuYWJsZWQpCmZ1bmN0aW9uIGxvYWRHYXRlQ29uZmlnKCkgewogIC8vIHZlcmlmeV9iZWZvcmVfZG9uZSBpcyBvcHQtT1VUIChkZWZhdWx0IHRydWUpLCBsaWtlIGV2ZXJ5IG90aGVyIGdhdGU6ICMxMjk0CiAgLy8gc2hpcHMgYSByZWFsIC92ZXJpZnkgc2tpbGwgYW5kIGhhcyAvZmxvIGRlbGVnYXRlIHRvIGl0LCBzbyBsZWF2aW5nIGl0IG9mZiBieQogIC8vIGRlZmF1bHQgd291bGQgbWFrZSB0aGUgZGVmYXVsdCAvZmxvIHJ1biBzaWxlbnRseSBza2lwIHRoZSBhY2NlcHRhbmNlIGNoZWNrLgogIC8vIERpc2FibGUgcGVyLXByb2plY3Qgd2l0aCBgdmVyaWZ5X2JlZm9yZV9kb25lOiBmYWxzZWAgb3IgcGVyLXJ1biBgLS1uby12ZXJpZnlgLgogIC8vIHRhc2tfc3RhdHVzX2dhdGUgaXMgYSBNT0RFLCBub3QgYSBib29sZWFuOiAnYmxvY2snIHwgJ3dhcm4nIHwgJ29mZicgKCMxNDM1KS4KICAvLyAjMTM3NCBzaGlwcGVkIHRoZSBvcGVuLXRhc2sgY291bnQgYXMgYSB3YXJuLW9ubHkgc3Rkb3V0IGxpbmUsIGFuZCBhIGNvbnN1bWVyCiAgLy8gc3RpbGwgc2hpcHBlZCBhIFBSIG92ZXIgZm91ciB1bnRvdWNoZWQgdGFza3Mg4oCUIGEgcmVtaW5kZXIgdGhhdCBzdXJ2aXZlZCB0ZW4KICAvLyBjb25zZWN1dGl2ZSBpZ25vcmVzIGluIG9uZSBzZXNzaW9uIGlzIG5vdCBhIGNvbnRyb2wuIEJsb2NraW5nIGlzIHRoZSBkZWZhdWx0CiAgLy8gYmVjYXVzZSB0aGUgaG9uZXN0ICJ0aGVzZSBzdGF5IG9wZW4gb24gcHVycG9zZSIgb3V0Y29tZSBpcyBvbmUgY29tbWFuZCBhd2F5CiAgLy8gKHJlY29yZC10YXNrcy1hY2tub3dsZWRnZWQpLCBzbyBub3RoaW5nIGhlcmUgY2FuIGRlYWRsb2NrIGEgcnVuLgogIHZhciBkZWZhdWx0cyA9IHsgbWVtb3J5X2ZpcnN0OiB0cnVlLCB0YXNrX2NyZWF0ZV9maXJzdDogdHJ1ZSwgY29udGV4dF90cmFja2luZzogdHJ1ZSwgdGVzdGluZ19nYXRlOiB0cnVlLCBzaW1wbGlmeV9nYXRlOiB0cnVlLCBsZWFybmluZ3NfZ2F0ZTogdHJ1ZSwgc3dhcm1faW52b2NhdGlvbl9nYXRlOiB0cnVlLCB2ZXJpZnlfYmVmb3JlX2RvbmU6IHRydWUsIHNkZF9nYXRlOiB0cnVlLCB0YXNrX3N0YXR1c19nYXRlOiAnYmxvY2snIH07CiAgdmFyIGNvbnRlbnQgPSBNT0ZMT19ZQU1MOwogIGlmIChjb250ZW50KSB7CiAgICAvLyBCb29sZWFuIGZvcm1zIGFyZSBhY2NlcHRlZCBzbyB0aGlzIGtleSByZWFkcyBsaWtlIGV2ZXJ5IG90aGVyIGdhdGUgaW4gdGhlCiAgICAvLyBibG9jazogYGZhbHNlYCBpcyB0aGUgc2FtZSBvcHQtb3V0IGB0ZXN0aW5nX2dhdGU6IGZhbHNlYCBpcywgYHRydWVgIG1lYW5zCiAgICAvLyBlbmZvcmNlLiBBbnl0aGluZyB1bnJlY29nbmlzZWQgZmFsbHMgdGhyb3VnaCB0byB0aGUgZGVmYXVsdCByYXRoZXIgdGhhbgogICAgLy8gc2lsZW50bHkgZGlzYWJsaW5nIHRoZSBnYXRlIOKAlCBhIHR5cG8gbXVzdCBub3QgYmUgYSBzdGVhbHRoIG9wdC1vdXQuCiAgICB2YXIgdHNnID0gL3Rhc2tfc3RhdHVzX2dhdGU6XHMqWyciXT8oYmxvY2t8d2FybnxvZmZ8ZmFsc2V8dHJ1ZSlbJyJdPy9pLmV4ZWMoY29udGVudCk7CiAgICBpZiAodHNnKSB7CiAgICAgIHZhciBtb2RlID0gdHNnWzFdLnRvTG93ZXJDYXNlKCk7CiAgICAgIGRlZmF1bHRzLnRhc2tfc3RhdHVzX2dhdGUgPSBtb2RlID09PSAnZmFsc2UnID8gJ29mZicgOiBtb2RlID09PSAndHJ1ZScgPyAnYmxvY2snIDogbW9kZTsKICAgIH0KICAgIGlmICgvbWVtb3J5X2ZpcnN0OlxzKmZhbHNlL2kudGVzdChjb250ZW50KSkgZGVmYXVsdHMubWVtb3J5X2ZpcnN0ID0gZmFsc2U7CiAgICBpZiAoL3Rhc2tfY3JlYXRlX2ZpcnN0OlxzKmZhbHNlL2kudGVzdChjb250ZW50KSkgZGVmYXVsdHMudGFza19jcmVhdGVfZmlyc3QgPSBmYWxzZTsKICAgIGlmICgvY29udGV4dF90cmFja2luZzpccypmYWxzZS9pLnRlc3QoY29udGVudCkpIGRlZmF1bHRzLmNvbnRleHRfdHJhY2tpbmcgPSBmYWxzZTsKICAgIGlmICgvdGVzdGluZ19nYXRlOlxzKmZhbHNlL2kudGVzdChjb250ZW50KSkgZGVmYXVsdHMudGVzdGluZ19nYXRlID0gZmFsc2U7CiAgICBpZiAoL3NpbXBsaWZ5X2dhdGU6XHMqZmFsc2UvaS50ZXN0KGNvbnRlbnQpKSBkZWZhdWx0cy5zaW1wbGlmeV9nYXRlID0gZmFsc2U7CiAgICBpZiAoL2xlYXJuaW5nc19nYXRlOlxzKmZhbHNlL2kudGVzdChjb250ZW50KSkgZGVmYXVsdHMubGVhcm5pbmdzX2dhdGUgPSBmYWxzZTsKICAgIGlmICgvc3dhcm1faW52b2NhdGlvbl9nYXRlOlxzKmZhbHNlL2kudGVzdChjb250ZW50KSkgZGVmYXVsdHMuc3dhcm1faW52b2NhdGlvbl9nYXRlID0gZmFsc2U7CiAgICAvLyBPcHQtb3V0OiBvbiBieSBkZWZhdWx0OyBkaXNhYmxlIG9ubHkgd2hlbiBleHBsaWNpdGx5IHNldCBmYWxzZS4KICAgIGlmICgvdmVyaWZ5X2JlZm9yZV9kb25lOlxzKmZhbHNlL2kudGVzdChjb250ZW50KSkgZGVmYXVsdHMudmVyaWZ5X2JlZm9yZV9kb25lID0gZmFsc2U7CiAgICAvLyBzZGRfZ2F0ZSBpcyB0aGUgY2hlY2stYmVmb3JlLWltcGxlbWVudCBiYWNrc3RvcCAoIzEyOTcpLiBPcHQtb3V0OyB0aGUKICAgIC8vIGdhdGUgb25seSBmaXJlcyB3aGVuIGEgcnVuIGlzIGFjdHVhbGx5IGFybWVkIGZvciBTREQgKHNkZE1vZGUpLCBzbwogICAgLy8gbGVhdmluZyBpdCBvbiBjb3N0cyBub24tU0REIHdvcmsgbm90aGluZy4KICAgIGlmICgvc2RkX2dhdGU6XHMqZmFsc2UvaS50ZXN0KGNvbnRlbnQpKSBkZWZhdWx0cy5zZGRfZ2F0ZSA9IGZhbHNlOwogIH0KICByZXR1cm4gZGVmYXVsdHM7Cn0KCi8vIFBhcnNlIHRoZSB0b3AtbGV2ZWwgYHNkZDpgIGJsb2NrIGZyb20gbW9mbG8ueWFtbCAoIzEyOTcpLiBTY29wZWQgdG8gdGhlIGJsb2NrCi8vIGJvZHkgc28gd2UgbmV2ZXIgbWF0Y2ggYSBgZGVmYXVsdDpgIGtleSBmcm9tIGFub3RoZXIgc2VjdGlvbiAoZXBpYywgbWVyZ2UpLgovLyBDcm9zcy1wbGF0Zm9ybTogdG9sZXJhdGVzIENSTEY7IG5vIHBhdGggc2VwYXJhdG9ycyBoYXJkY29kZWQuCmZ1bmN0aW9uIGxvYWRTZGRDb25maWcoKSB7CiAgdmFyIG91dCA9IHsgZGVmYXVsdDogZmFsc2UsIHNwZWNzRGlyOiAnLm1vZmxvL3NwZWNzJyB9OwogIHZhciBjb250ZW50ID0gTU9GTE9fWUFNTDsKICBpZiAoIWNvbnRlbnQpIHJldHVybiBvdXQ7CiAgdmFyIGJsb2NrID0gY29udGVudC5tYXRjaCgvXnNkZDpbIFx0XSpccj9cbigoPzpbIFx0XSsuKig/OlxyP1xufCQpKSopL20pOwogIGlmICghYmxvY2spIHJldHVybiBvdXQ7CiAgdmFyIGJvZHkgPSBibG9ja1sxXTsKICBpZiAoL15ccypkZWZhdWx0OlxzKnRydWVcYi9pbS50ZXN0KGJvZHkpKSBvdXQuZGVmYXVsdCA9IHRydWU7CiAgdmFyIHNkID0gYm9keS5tYXRjaCgvXlxzKnNwZWNzX2RpcjpccyooLis/KVxzKiQvaW0pOwogIGlmIChzZCkgewogICAgdmFyIHYgPSBzZFsxXS5yZXBsYWNlKC9ccysjLiokLywgJycpLnJlcGxhY2UoL15bIiddfFsiJ10kL2csICcnKS50cmltKCk7CiAgICBpZiAodikgb3V0LnNwZWNzRGlyID0gdjsKICB9CiAgcmV0dXJuIG91dDsKfQoKLy8gUGFyc2UgdGhlIHRvcC1sZXZlbCBgbWVyZ2U6YCBibG9jayBmcm9tIG1vZmxvLnlhbWwgKCMxMjg1KS4gQmxvY2stc2NvcGVkIGZvcgovLyB0aGUgc2FtZSByZWFzb24gYXMgbG9hZFNkZENvbmZpZzogYSBiYXJlIGBhdXRvOmAga2V5IGNhbiBhcHBlYXIgdW5kZXIgb3RoZXIKLy8gc2VjdGlvbnMuIENyb3NzLXBsYXRmb3JtOiB0b2xlcmF0ZXMgQ1JMRi4KZnVuY3Rpb24gbG9hZE1lcmdlQ29uZmlnKCkgewogIHZhciBvdXQgPSB7IGF1dG86IGZhbHNlIH07CiAgdmFyIGNvbnRlbnQgPSBNT0ZMT19ZQU1MOwogIGlmICghY29udGVudCkgcmV0dXJuIG91dDsKICB2YXIgYmxvY2sgPSBjb250ZW50Lm1hdGNoKC9ebWVyZ2U6WyBcdF0qXHI/XG4oKD86WyBcdF0rLiooPzpccj9cbnwkKSkqKS9tKTsKICBpZiAoIWJsb2NrKSByZXR1cm4gb3V0OwogIGlmICgvXlxzKmF1dG86XHMqdHJ1ZVxiL2ltLnRlc3QoYmxvY2tbMV0pKSBvdXQuYXV0byA9IHRydWU7CiAgcmV0dXJuIG91dDsKfQoKLy8gUmVhZCBtb2Zsby55YW1sIGV4YWN0bHkgb25jZSBwZXIgZ2F0ZSBwcm9jZXNzICgjMTI5NyByZXZpZXcpOiBsb2FkR2F0ZUNvbmZpZwovLyBhbmQgbG9hZFNkZENvbmZpZyBib3RoIHBhcnNlIGl0LCBhbmQgdGhlIGdhdGUgZmlyZXMgb24gZXZlcnkgV3JpdGUvRWRpdCDigJQgYQovLyBzZWNvbmQgcmVhZCBpcyB3YXN0ZWQgc3lzY2FsbHMuIFNpbmdsZSByZWFkRmlsZVN5bmMgaW4gdHJ5L2NhdGNoIChubyBleGlzdHNTeW5jCi8vIGRvdWJsZS1zdGF0KTsgRU5PRU5UL3VucmVhZGFibGUg4oaSICcnIOKGkiBldmVyeSBwYXJzZXIgZmFsbHMgYmFjayB0byBkZWZhdWx0cy4KZnVuY3Rpb24gcmVhZE1vZmxvWWFtbCgpIHsKICB0cnkgeyByZXR1cm4gZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbihQUk9KRUNUX0RJUiwgJ21vZmxvLnlhbWwnKSwgJ3V0Zi04Jyk7IH0KICBjYXRjaCAoZSkgeyByZXR1cm4gJyc7IH0KfQp2YXIgTU9GTE9fWUFNTCA9IHJlYWRNb2Zsb1lhbWwoKTsKCi8vICMxMzk0IOKAlCBpcyB0aGUgaG9vayB0aGF0IHRyYW5zY3JpYmVzIC92ZXJpZnkncyB2ZXJkaWN0IGludG8gd29ya2Zsb3ctc3RhdGUuanNvbgovLyBhY3R1YWxseSB3aXJlZD8gRGlzdGluZ3Vpc2hlcyAidGhlIGFnZW50IHNraXBwZWQgU3RlcCA1IiBmcm9tICJub3RoaW5nIGV4aXN0cwovLyB0byByZWNvcmQgdGhlIHZlcmRpY3QiLCB3aGljaCBuZWVkIG9wcG9zaXRlIHJlbWVkaWVzOiB0aGUgZmlyc3QgaXMgZml4ZWQgYnkKLy8gcmUtcnVubmluZyAvdmVyaWZ5LCB0aGUgc2Vjb25kIGNhbm5vdCBiZS4KLy8KLy8gRGVsaWJlcmF0ZWx5IE5PVCBob2lzdGVkIHRvIG1vZHVsZSBzY29wZSBsaWtlIE1PRkxPX1lBTUw6IHRoaXMgaXMgb25seSBldmVyCi8vIGNvbnN1bHRlZCBvbiBhbiBhbHJlYWR5LWJsb2NrZWQgY2hlY2stYmVmb3JlLWRvbmUgcGF0aCwgc28gcmVhZGluZyBpdCBlYWdlcmx5Ci8vIHdvdWxkIGFkZCBhIHN5c2NhbGwgdG8gZXZlcnkgV3JpdGUvRWRpdCB0byBhbnN3ZXIgYSBxdWVzdGlvbiBhbG1vc3Qgbm8gZ2F0ZQovLyBpbnZvY2F0aW9uIGFza3MuIFN1YnN0cmluZyBtYXRjaCAobm90IGEgSlNPTiB3YWxrKSBzbyBpdCBob2xkcyByZWdhcmRsZXNzIG9mCi8vIHdoaWNoIG1hdGNoZXIgYmxvY2sgYSBjb25zdW1lcidzIGhvb2sgbGl2ZXMgaW4sIG9yIGhvdyB0aGV5IGhhbmQtZWRpdGVkIGl0LgovLyBVbnJlYWRhYmxlL21hbGZvcm1lZCBzZXR0aW5ncyDihpIgdHJ1ZSwgc28gYSBwYXJzZSBmYWlsdXJlIGZhbGxzIGJhY2sgdG8gdGhlCi8vIHByZS1leGlzdGluZyBnZW5lcmljIG1lc3NhZ2UgcmF0aGVyIHRoYW4gYXNzZXJ0aW5nIGEgd2lyaW5nIGJ1ZyB0aGF0IG1heSBub3QKLy8gZXhpc3QuCmZ1bmN0aW9uIGlzVmVyaWZ5T3V0Y29tZUhvb2tXaXJlZCgpIHsKICB0cnkgewogICAgcmV0dXJuIGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4oUFJPSkVDVF9ESVIsICcuY2xhdWRlJywgJ3NldHRpbmdzLmpzb24nKSwgJ3V0Zi04JykKICAgICAgLmluZGV4T2YoJ3JlY29yZC12ZXJpZnktb3V0Y29tZScpID49IDA7CiAgfSBjYXRjaCAoZSkgeyByZXR1cm4gdHJ1ZTsgfQp9Cgp2YXIgY29uZmlnID0gbG9hZEdhdGVDb25maWcoKTsKdmFyIHNkZENvbmYgPSBsb2FkU2RkQ29uZmlnKCk7CnZhciBtZXJnZUNvbmYgPSBsb2FkTWVyZ2VDb25maWcoKTsKdmFyIGNvbW1hbmQgPSBwcm9jZXNzLmFyZ3ZbMl07Cgp2YXIgRVhFTVBUID0gWycuY2xhdWRlLycsICcuY2xhdWRlXFwnLCAnQ0xBVURFLm1kJywgJ01FTU9SWS5tZCcsICd3b3JrZmxvdy1zdGF0ZScsICdub2RlX21vZHVsZXMnLCAnbW9mbG8ueWFtbCddOwoKLy8gQXBwZW5kZWQgdG8gZXZlcnkgbWVtb3J5LWZpcnN0IGRlbmlhbC4gV2l0aG91dCBpdCwgYSBjb250ZXh0IGF1ZGl0IG9mIENsYXVkZQovLyBDb2RlJ3MgZGVuaWFsIHRlbGVtZXRyeSByZWFkcyBtb2ZsbydzIGdhdGUgZW5mb3JjZW1lbnRzIGFzIHBlcm1pc3Npb24tc2V0dXAKLy8gZmFpbHVyZXMgYW5kICJmaXhlcyIgdGhlbSB3aXRoIGFsbG93IHJ1bGVzIOKAlCB3aGljaCBjYW5ub3Qgb3ZlcnJpZGUgYSBob29rCi8vIGJsb2NrIGF0IGFsbCAoIzEzMDcgZmluZGluZyA1KS4gTmFtaW5nIHRoZSBnYXRlIG1ha2VzIHRoZSBjYXVzZSBzZWxmLWV2aWRlbnQuCnZhciBHQVRFX09SSUdJTl9OT1RFID0gJ1RoaXMgaXMgYSBtb2ZsbyBob29rLCBub3QgYSBDbGF1ZGUgQ29kZSBwZXJtaXNzaW9uIHJ1bGUg4oCUIGFsbG93LXJ1bGVzIGNhbm5vdCBvdmVycmlkZSBpdC4nOwoKLy8gIzEzNDgg4oCUIHRoZSBwcmUtUFIgZ2F0ZXMgYXJlIG9yZGVyLWRlcGVuZGVudCBhbmQgZWFjaCBibG9jayBtZXNzYWdlIG5hbWVkIG9ubHkKLy8gaXRzIG93biBtaXNzaW5nIGdhdGUsIHNvIGEgY2FsbGVyIGNvdWxkIHNhdGlzZnkgdGhlbSBvbmUgYXQgYSB0aW1lIGZvcmV2ZXI6Ci8vIC9mbG8tc2ltcGxpZnkgbWF5IGVkaXQgY29kZSAod2hpY2ggcmVzZXRzIHRlc3RzIGFuZCB2ZXJpZnkpLCBhbmQgL3ZlcmlmeSBtdXN0Ci8vIG5vdCwgc28gc2ltcGxpZnkgc3RyaWN0bHkgcHJlY2VkZXMgdmVyaWZ5LiBCb3RoIGJsb2NraW5nIGdhdGVzIHByaW50IHRoaXMuCi8vIC92ZXJpZnkncyBTdGVwIDUgbWVtb3J5X3N0b3JlIGNhcnJpZXMgdGhlIHZlcmRpY3QgQU5EIHN0YW1wcyBsZWFybmluZ3MsIHdoaWNoCi8vIGlzIHdoeSBsZWFybmluZ3MgaGFzIG5vIHNlcGFyYXRlIHN0ZXAgaGVyZS4KdmFyIE9SREVSX0hJTlQgPSAnT3JkZXIgdGhhdCBzYXRpc2ZpZXMgYWxsIG9mIHRoZW06IHRlc3RzIGdyZWVuIC0+IC9mbG8tc2ltcGxpZnkgKHJlLXJ1biB0ZXN0cyBpZiBpdCBlZGl0cykgLT4gL3ZlcmlmeSAtPiBpdHMgbWVtb3J5X3N0b3JlIHZlcmRpY3QgLT4gZ2ggcHIgY3JlYXRlXG4nOwovLyAjMTQzNCDigJQgdGhlIG9sZCB0ZXh0ICgnbGVhcm5pbmdzIGhhdmUgbm90IGJlZW4gc3RvcmVkIChjYWxsIG1lbW9yeV9zdG9yZSknKQovLyBuYW1lZCB0aGUgbWVjaGFuaXNtIGJ1dCBubyBxdWFsaXR5IGJhciwgc28gdGhlIGNoZWFwZXN0IHdheSBwYXN0IGl0IHdhcyBhCi8vIHN1bW1hcnkgb2YgdGhlIHJ1biDigJQgYXVkaXQgZXhoYXVzdCB0aGF0IGRpc3BsYWNlcyByZXVzYWJsZSBsZXNzb25zIGZyb20gZXZlcnkKLy8gZnV0dXJlIGJvdW5kZWQgc2VhcmNoLiBOYW1lIHRoZSBiYXIgQU5EIHRoZSBuby13cml0ZSBwYXRoIGhlcmU6IGFuIGVzY2FwZQovLyBoYXRjaCBub2JvZHkgY2FuIGZpbmQgaXMgbm90IGFuIGVzY2FwZSBoYXRjaCAoc2VlICMxMzMyJ3MgZ2F0ZSBkZWFkbG9jaykuCi8vCi8vIFRoZSBlc2NhcGUgY29tbWFuZCBpcyBidWlsdCBmcm9tIF9fZmlsZW5hbWUsIG5vdCB3cml0dGVuIGFzIGEgcmVsYXRpdmUgcGF0aC4KLy8gVGhlIGNhbGxlciBpcyB0aGUgbW9kZWwgdHlwaW5nIGludG8gYSBCYXNoIHRvb2wsIE5PVCBhIGhvb2s6ICRDTEFVREVfUFJPSkVDVF9ESVIKLy8gaXMgdW5zZXQgdGhlcmUgKHNvIHRoZSBzZXR0aW5ncy5qc29uIGZvcm0gd291bGQgZXhwYW5kIHRvICIvLmNsYXVkZS8uLi4iKSwgYW5kIGEKLy8gYmFyZSBgLmNsYXVkZS9oZWxwZXJzL2dhdGUuY2pzYCBicmVha3MgZnJvbSBhbnkgY3dkIGJ1dCB0aGUgcHJvamVjdCByb290LiBUaGUKLy8gcnVubmluZyBzY3JpcHQncyBvd24gYWJzb2x1dGUgcGF0aCBpcyBjb3JyZWN0IG9uIGV2ZXJ5IE9TIGFuZCBmcm9tIGFueSBjd2Q7Ci8vIGRvdWJsZSBxdW90ZXMgY2FycnkgV2luZG93cyBzZXBhcmF0b3JzIGFuZCBzcGFjZXMgdGhyb3VnaCB0aGUgc2hlbGwuCnZhciBMRUFSTklOR1NfTUlTU0lORyA9CiAgJ25vIGR1cmFibGUgbGVzc29uIHJlY29yZGVkLiBBIGxlc3NvbiBxdWFsaWZpZXMgb25seSBpZiBpdCB3b3VsZCBoZWxwIGEgZnV0dXJlIHNlc3Npb24gJyArCiAgJ3dvcmtpbmcgb24gYSBESUZGRVJFTlQgdGFzayDigJQgYSByZXVzYWJsZSBwYXR0ZXJuLCBhIHRyYXAsIGEgZGVjaXNpb24gKyByYXRpb25hbGUuICcgKwogICdTdG9yZSBvbmUgd2l0aCBtY3BfX21vZmxvX19tZW1vcnlfc3RvcmUgKG5hbWVzcGFjZSAibGVhcm5pbmdzIjsgdXNlICJwYXR0ZXJucyIgZm9yIGEgJyArCiAgJ3JldXNhYmxlIGNvZGUgc2hhcGUpLiBXaGF0IFRISVMgcnVuIGNoYW5nZWQgaXMgZ2l0IGhpc3Rvcnkg4oCUIGl0IGJlbG9uZ3MgaW4gdGhlIFBSIGJvZHksICcgKwogICdub3QgaW4gbWVtb3J5LiBJZiB0aGlzIHJ1biB0YXVnaHQgbm90aGluZyBuZXcsIHNheSBzbyBpbnN0ZWFkIG9mIGludmVudGluZyBvbmU6ICcgKwogICdub2RlICInICsgX19maWxlbmFtZSArICciIHJlY29yZC1uby1kdXJhYmxlLWxlc3Nvbic7CnZhciBHQVRFX0RJU0FCTEVfTk9URSA9ICdEaXNhYmxlIHBlci1nYXRlIHZpYSBtb2Zsby55YW1sOiBnYXRlczogbWVtb3J5X2ZpcnN0OiBmYWxzZSc7Ci8vICMxMzM4IOKAlCBDbGF1ZGUgQ29kZSBzcGF3bnMgc3RkaW8gTUNQIHNlcnZlcnMgb25jZSBhdCBzZXNzaW9uIHN0YXJ0IGFuZCBuZXZlcgovLyByZXNwYXducyB0aGVtLCBzbyBhIHNlc3Npb24gY2FuIG91dGxpdmUgaXRzIG1vZmxvIE1DUCBjb25uZWN0aW9uLiBOYW1pbmcgb25seQovLyBtY3BfX21vZmxvX19tZW1vcnlfc2VhcmNoIHRoZXJlIHBvaW50cyB0aGUgcmVhZGVyIGF0IHRoZSBvbmUgdGhpbmcgdGhhdCBjYW5ub3QKLy8gd29yazsgdGhpcyBDTEkgcGF0aCBjcmVkaXRzIHRoZSBnYXRlIGlkZW50aWNhbGx5IGFuZCBuZWVkcyBubyBNQ1AuCnZhciBNQ1BfRkFMTEJBQ0tfTk9URSA9ICdJZiBtY3BfX21vZmxvX18qIHRvb2xzIGFyZSB1bmF2YWlsYWJsZSB0aGlzIHNlc3Npb24gKE1DUCBzZXJ2ZXIgbm90IGNvbm5lY3RlZCksIHRoaXMgY3JlZGl0cyB0aGUgZ2F0ZSB0b286IG5weCBmbG8gbWVtb3J5IHNlYXJjaCAtLXF1ZXJ5ICI8dG9waWM+IiAtLW5hbWVzcGFjZSA8bnM+JzsKLy8gIzEzMzggZm9sbG93LXVwIOKAlCB0aGUgc3dhcm0vaGl2ZSBnYXRlJ3MgZXF1aXZhbGVudC4gVGhlIENMSSBydW5zIHRoZSBzYW1lCi8vIGluLXByb2Nlc3MgaGFuZGxlciBhbmQgcGVyc2lzdHMgdGhlIHN3YXJtLCBzbyBpdCBzYXRpc2ZpZXMgdGhpcyBnYXRlIGZvcgovLyByZWFsOyBpdCBpcyByZWNvcmRlZCBvbmx5IG9uIHN1Y2Nlc3MgKFBvc3RUb29sVXNlLCAjMTMyMikuCnZhciBDT09SRF9GQUxMQkFDS19OT1RFID0gJ0lmIG1jcF9fbW9mbG9fXyogdG9vbHMgYXJlIHVuYXZhaWxhYmxlIHRoaXMgc2Vzc2lvbiAoTUNQIHNlcnZlciBub3QgY29ubmVjdGVkKSwgdGhpcyBzYXRpc2ZpZXMgdGhlIGdhdGUgdG9vOic7CgovLyAjMTI5NCBGaW5kaW5nIDMg4oCUIHJlYWRzL3NjYW5zIG9mIEVQSEVNRVJBTCBmaWxlcyB1bmRlciB0aGUgT1MgdGVtcCBkaXIKLy8gKGJhY2tncm91bmQtdGFzayBvdXRwdXQvdHJhbnNjcmlwdHMsIGFnZW50IHNjcmF0Y2hwYWRzKSBhcmUgdHJhbnNpZW50IHRvb2wKLy8gSS9PIGFuZCBuZXZlciBjYXJyeSBpbmRleGFibGUgcHJvamVjdCBrbm93bGVkZ2UsIHNvIHRoZXkgbXVzdCBub3QgdHJpcCB0aGUKLy8gbWVtb3J5LWZpcnN0IGdhdGUuIENyb3NzLXBsYXRmb3JtIChSdWxlICMxKTogb3MudG1wZGlyKCkgaXMgY29ycmVjdCBvbiBldmVyeQovLyBPUzsgd2Ugbm9ybWFsaXplIGEgbGVhZGluZyBgL3ByaXZhdGVgIG9uIGJvdGggc2lkZXMgc28gbWFjT1MncwovLyAvdmFyL2ZvbGRlcnMgKG9zLnRtcGRpcikgdnMgL3ByaXZhdGUvdmFyL2ZvbGRlcnMgKHJlYWxwYXRoKSBzeW1saW5rIHBhaXIKLy8gc3RpbGwgbWF0Y2hlcyAoQ0xBVURFLm1kICMxMTQ1KS4gTmV2ZXIgaGFyZGNvZGUgYC90bXBgLgpmdW5jdGlvbiBzdHJpcFByaXZhdGUocCkgeyByZXR1cm4gcC5pbmRleE9mKCcvcHJpdmF0ZS8nKSA9PT0gMCA/IHAuc2xpY2UoJy9wcml2YXRlJy5sZW5ndGgpIDogcDsgfQpmdW5jdGlvbiBpc0VwaGVtZXJhbFBhdGgoZnApIHsKICBpZiAoIWZwKSByZXR1cm4gZmFsc2U7CiAgdmFyIHRtcDsKICB0cnkgeyB0bXAgPSBwYXRoLnJlc29sdmUob3MudG1wZGlyKCkpOyB9IGNhdGNoIChlKSB7IHJldHVybiBmYWxzZTsgfQogIHZhciB0ID0gc3RyaXBQcml2YXRlKHRtcCk7CiAgZnVuY3Rpb24gdW5kZXIocCkgeyB2YXIgbiA9IHN0cmlwUHJpdmF0ZShwKTsgcmV0dXJuIG4gPT09IHQgfHwgbi5pbmRleE9mKHQgKyBwYXRoLnNlcCkgPT09IDA7IH0KICB2YXIgcmVzb2x2ZWQgPSBwYXRoLnJlc29sdmUoZnApOwogIGlmICghdW5kZXIocmVzb2x2ZWQpKSByZXR1cm4gZmFsc2U7CiAgLy8gVW5kZXIgdG1wIGJ5IGxpdGVyYWwgcGF0aCDigJQgY29uZmlybSBpdCBpc24ndCBhIHN5bWxpbmsgc3RhZ2VkIGluIHRtcCB0aGF0CiAgLy8gZGVyZWZlcmVuY2VzIHRvIGEgcmVhbCBwcm9qZWN0IGZpbGUgKHJlYWxwYXRoIEJPVEggc2lkZXMsIENMQVVERS5tZCBSdWxlICMyKS4KICAvLyBPbiBFTk9FTlQgKGEgbm90LXlldC1jcmVhdGVkIHRtcCBmaWxlKSBrZWVwIHRoZSB2ZXJkaWN0IOKAlCBzdGlsbCBlcGhlbWVyYWwuCiAgdHJ5IHsgcmV0dXJuIHVuZGVyKGZzLnJlYWxwYXRoU3luYyhyZXNvbHZlZCkpOyB9IGNhdGNoIChlKSB7IHJldHVybiB0cnVlOyB9Cn0KLy8gIzExNzEg4oCUIERBTkdFUk9VUyBnYWluZWQgUG93ZXJTaGVsbCBhZGRpdGlvbnMgdG8gbWF0Y2ggdGhlIG1hdGNoZXIgd2lkZW5pbmcKLy8gdGhhdCBub3cgcm91dGVzIHRoZSBkZWRpY2F0ZWQgYFBvd2VyU2hlbGxgIHRvb2wgdGhyb3VnaCBjaGVjay1kYW5nZXJvdXMtY29tbWFuZC4KLy8gUE9TSVggZW50cmllcyBzdGlsbCBhcHBseSBiZWNhdXNlIFBTIHdpbGwgZXhlY3V0ZSB0aGVtIHdoZW4gaW52b2tlZC4gTWF0Y2hlZAovLyBjYXNlLWluc2Vuc2l0aXZlbHkgYnkgYG1hdGNoZXNEYW5nZXJvdXNgIGJlbG93IOKAlCBzdWJzdHJpbmcgZm9yIG1vc3QgZW50cmllcywKLy8gcm9vdC1hbmNob3JlZCBmb3IgdGhlIG9uZXMgdGhhdCBlbmQgYXQgYSBmaWxlc3lzdGVtIHJvb3QuCnZhciBEQU5HRVJPVVMgPSBbCiAgJ3JtIC1yZiAvJywgJ3JtIC1yZiB+JywgJ2Zvcm1hdCBjOicsICdkZWwgL3MgL3EgYzpcXCcsICc6KCl7Onw6Jn07OicsICdta2ZzLicsICc+IC9kZXYvc2RhJywKICAvLyBQb3dlclNoZWxsIGRlc3RydWN0aXZlIHBhdHRlcm5zLiBXb24ndCBjYXRjaCBldmVyeSBhZHZlcnNhcmlhbCBzcGVsbGluZwogIC8vIChQUyBhbGlhc2VzIGxldCBgcmkgLXIgLWZvcmNlIEM6XGAgbWVhbiB0aGUgc2FtZSB0aGluZykgYnV0IGNvdmVycyB0aGUKICAvLyBjb21tb24tdHlwbyBkZXN0cnVjdGlvbiBjbGFzcyDigJQgc3ltbWV0cmljIHRvIHRoZSBQT1NJWCBsaXN0J3MgaW50ZW50LgogICdyZW1vdmUtaXRlbSAtcmVjdXJzZSAtZm9yY2UgYzpcXCcsCiAgJ3JlbW92ZS1pdGVtIC1yZWN1cnNlIC1mb3JjZSAvJywKICAncmVtb3ZlLWl0ZW0gLXJlY3Vyc2UgLWZvcmNlIH4nLAogICdmb3JtYXQtdm9sdW1lJywKICAnY2xlYXItZGlzaycsCl07CgovLyAjMTQ0OSDigJQgdGhlIGVudHJpZXMgYWJvdmUgdGhhdCBFTkQgYXQgYSBmaWxlc3lzdGVtIHJvb3QgYXJlIGFsc28gYSBQUkVGSVggb2YKLy8gZXZlcnkgYWJzb2x1dGUgcGF0aCBiZW5lYXRoIGl0LCBzbyBwbGFpbiBzdWJzdHJpbmcgbWF0Y2hpbmcgYmxvY2tlZCByb3V0aW5lCi8vIGNsZWFudXA6IGBybSAtcmYgL3RtcC9zY3JhdGNoYCByZXBvcnRlZCBhcyBgcm0gLXJmIC9gLiBUaG9zZSBlbnRyaWVzIG11c3QKLy8gbWF0Y2ggT04gdGhlIHJvb3QgcmF0aGVyIHRoYW4gYXQgdGhlIGhlYWQgb2YgYSBsb25nZXIgcGF0aC4KLy8KLy8gV0hJQ0ggZW50cmllcyB0aG9zZSBhcmUgaXMgZGVyaXZlZCwgbm90IGxpc3RlZDogYSBwYXR0ZXJuIGlzIHJvb3Qtc2hhcGVkIGlmZgovLyBpdCBlbmRzIGF0IGEgcm9vdCDigJQgYSBzZXBhcmF0b3Igb3IgYH5gLiBUaGF0IHNlbGVjdHMgYHJtIC1yZiAvYCwgYHJtIC1yZiB+YCwKLy8gYGRlbCAvcyAvcSBjOlxgIGFuZCB0aGUgdGhyZWUgYHJlbW92ZS1pdGVtYCBmb3JtcywgYW5kIGxlYXZlcyBgZm9ybWF0IGM6YCwKLy8gYG1rZnMuYCwgYD4gL2Rldi9zZGFgLCBgZm9ybWF0LXZvbHVtZWAgYW5kIGBjbGVhci1kaXNrYCBvbiBwbGFpbiBzdWJzdHJpbmcKLy8gbWF0Y2hpbmcsIHdoZXJlIHRyYWlsaW5nIHRleHQgaXMgc3RpbGwgdGhlIHNhbWUgZGFuZ2Vyb3VzIGNvbW1hbmQuIERlcml2aW5nCi8vIGl0IHJhdGhlciB0aGFuIGtlZXBpbmcgYSBwYXJhbGxlbCBsaXN0IG1lYW5zIGEgZnV0dXJlIHJvb3Qtc2hhcGVkIGFkZGl0aW9uIHRvCi8vIERBTkdFUk9VUyBpcyBhbmNob3JlZCBhdXRvbWF0aWNhbGx5IGluc3RlYWQgb2Ygc2lsZW50bHkgZmFsbGluZyBiYWNrIHRvIHRoZQovLyBwcmVmaXggYnVnIHRoaXMgZml4ZXMuCi8vCi8vIGBybSAtcmYgfmAgam9pbnMgREFOR0VST1VTIHdpdGggdGhpcyBjaGFuZ2U6IGl0IHdhcyBuZXZlciBsaXN0ZWQsIHNvIHdpcGluZyBhCi8vIGhvbWUgZGlyZWN0b3J5IHdhcyBhbGxvd2VkIG91dHJpZ2h0IHdoaWxlIGNsZWFuaW5nIGEgc3ViZGlyZWN0b3J5IG9mIG9uZSB3YXMKLy8gYmxvY2tlZC4gQW5jaG9yaW5nIGlzIHdoYXQgbWFrZXMgdGhlIGVudHJ5IHNhZmUgdG8gYWRkLgpmdW5jdGlvbiBlbmRzQXRSb290KHBhdCkgewogIHZhciBsYXN0ID0gcGF0LmNoYXJBdChwYXQubGVuZ3RoIC0gMSk7CiAgcmV0dXJuIGxhc3QgPT09ICcvJyB8fCBsYXN0ID09PSAnXFwnIHx8IGxhc3QgPT09ICd+JzsKfQovLyBXaGF0IG1heSBsZWdhbGx5IGZvbGxvdyBhIHJvb3QgdGFyZ2V0OiBub3RoaW5nLCB3aGl0ZXNwYWNlLCBhIGdsb2IgKGBybSAtcmYgLypgCi8vIHN0aWxsIGJsb2NrcyksIGEgc2hlbGwgb3BlcmF0b3IsIG9yIGEgY2xvc2luZyBxdW90ZS9wYXJlbi4gQSBwYXRoIGNoYXJhY3RlciDigJQKLy8gbGV0dGVyLCBkaWdpdCwgYC1gLCBgX2Ag4oCUIG1lYW5zIGFub3RoZXIgc2VnbWVudCBmb2xsb3dzLCBpLmUuIHJvdXRpbmUgY2xlYW51cAovLyBvZiBzb21ldGhpbmcgYmVsb3cgcm9vdC4gUnVsZSAjMTogcHVyZSBzdHJpbmcgbG9naWMsIG5vIHBsYXRmb3JtIGJyYW5jaDsgYm90aAovLyBzZXBhcmF0b3JzIGFyZSBoYW5kbGVkIGZvciBldmVyeSBPUydzIHNwZWxsaW5nLgp2YXIgUk9PVF9CT1VOREFSWV9SRSA9IC9bXHM7JnwpIidgKjw+XS87CmZ1bmN0aW9uIGlzUm9vdEJvdW5kYXJ5KGNtZCwgaSkgewogIGlmIChpID49IGNtZC5sZW5ndGgpIHJldHVybiB0cnVlOwogIHZhciBjID0gY21kLmNoYXJBdChpKTsKICByZXR1cm4gYyA9PT0gJy8nIHx8IGMgPT09ICdcXCcgfHwgUk9PVF9CT1VOREFSWV9SRS50ZXN0KGMpOwp9CgovKioKICogQWR2YW5jZSBwYXN0IHRleHQgdGhhdCBkb2VzIG5vdCBtb3ZlIE9GRiB0aGUgcm9vdDogcmVwZWF0ZWQgc2VwYXJhdG9ycywgYW5kCiAqIGAuYCAvIGAuLmAgc2VnbWVudHMsIHdoaWNoIHJlc29sdmUgYmFjayB0byB3aGVyZSB0aGV5IHN0YXJ0ZWQuIGBybSAtcmYgLy9gLAogKiBgcm0gLXJmIC8uYCBhbmQgYHJtIC1yZiAvLi5gIGFsbCBzdGlsbCBtZWFuIGBybSAtcmYgL2AgYW5kIG11c3QgYmxvY2ssIHdoaWxlCiAqIGBybSAtcmYgLy90bXAveGAgYW5kIGBybSAtcmYgLy5jb25maWdgIGFyZSByZWFsIHBhdGhzIGJlbG93IHJvb3QgYW5kIG11c3Qgbm90LgogKiBXaXRob3V0IHRoZSBkb3QgaGFuZGxpbmcgdGhlIGFuY2hvcmluZyB3b3VsZCBPUEVOIGEgaG9sZSB0aGUgc3Vic3RyaW5nIG1hdGNoCiAqIGRpZCBub3QgaGF2ZSDigJQgYC5gIGlzIG5vdCBhIGJvdW5kYXJ5IGNoYXJhY3Rlciwgc28gYHJtIC1yZiAvLmAgd291bGQgcmVhZCBhcwogKiAiYSBsb25nZXIgcGF0aCBmb2xsb3dzIiBhbmQgcGFzcy4KICovCmZ1bmN0aW9uIHNraXBUb1Jvb3RFbmQoY21kLCBpKSB7CiAgZm9yICg7OykgewogICAgdmFyIHN0YXJ0ID0gaTsKICAgIHdoaWxlIChpIDwgY21kLmxlbmd0aCAmJiAoY21kLmNoYXJBdChpKSA9PT0gJy8nIHx8IGNtZC5jaGFyQXQoaSkgPT09ICdcXCcpKSBpKys7CiAgICB2YXIgZG90cyA9IDA7CiAgICB3aGlsZSAoY21kLmNoYXJBdChpICsgZG90cykgPT09ICcuJykgZG90cysrOwogICAgLy8gT25seSBhIEJBUkUgYC5gIG9yIGAuLmAgc2VnbWVudCBpcyBhIG5vLW9wOyBgLmNvbmZpZ2AgYW5kIGAuLmZvb2AgYXJlIG5hbWVzLgogICAgaWYgKChkb3RzID09PSAxIHx8IGRvdHMgPT09IDIpICYmIGlzUm9vdEJvdW5kYXJ5KGNtZCwgaSArIGRvdHMpKSBpICs9IGRvdHM7CiAgICBpZiAoaSA9PT0gc3RhcnQpIHJldHVybiBpOwogIH0KfQoKLyoqCiAqIFRydWUgd2hlbiBgcGF0YCBvY2N1cnMgaW4gYGNtZGAgYXMgYSByZWFsIGRhbmdlcm91cyBjb21tYW5kLiBSb290LXNoYXBlZAogKiBwYXR0ZXJucyBtdXN0IGxhbmQgb24gdGhlIHJvb3Q7IGV2ZXJ5IG9jY3VycmVuY2UgaXMgZXhhbWluZWQsIHNvIGEgc2FmZQogKiBsZWFkaW5nIG1hdGNoIChgcm0gLXJmIC90bXAvYSAmJiBybSAtcmYgL2ApIG5ldmVyIG1hc2tzIGEgbGF0ZXIgcmVhbCBvbmUuCiAqLwpmdW5jdGlvbiBtYXRjaGVzRGFuZ2Vyb3VzKGNtZCwgcGF0KSB7CiAgaWYgKCFlbmRzQXRSb290KHBhdCkpIHJldHVybiBjbWQuaW5kZXhPZihwYXQpID49IDA7CiAgZm9yICh2YXIgYXQgPSBjbWQuaW5kZXhPZihwYXQpOyBhdCA+PSAwOyBhdCA9IGNtZC5pbmRleE9mKHBhdCwgYXQgKyAxKSkgewogICAgdmFyIGVuZCA9IHNraXBUb1Jvb3RFbmQoY21kLCBhdCArIHBhdC5sZW5ndGgpOwogICAgaWYgKGVuZCA+PSBjbWQubGVuZ3RoIHx8IFJPT1RfQk9VTkRBUllfUkUudGVzdChjbWQuY2hhckF0KGVuZCkpKSByZXR1cm4gdHJ1ZTsKICB9CiAgcmV0dXJuIGZhbHNlOwp9CgovLyAjMTEzMiDigJQgQmFzaCBtZW1vcnktZmlyc3QgZ2F0ZS4KLy8KLy8gQ1JFRElUOiBtYXJrcyB0aGUgZ2F0ZSBzYXRpc2ZpZWQgd2hlbiBDbGF1ZGUgaW52b2tlcyBhIG1lbW9yeS1zZWFyY2ggQ0xJCi8vIChgZmxvIG1lbW9yeSBzZWFyY2hgLCBgZmxvLXNlYXJjaGAsIGBzZW1hbnRpYy1zZWFyY2gubWpzYCkgZnJvbSB0aGUgc2hlbGwg4oCUCi8vIHRoZSBlc2NhcGUgaGF0Y2ggdGhhdCBrZWVwcyB0aGUgZ2F0ZSBzYXRpc2ZpYWJsZSB3aGVuIHRoZSBtb2ZsbyBNQ1Agc2VydmVyCi8vIGlzIG5vdCBjb25uZWN0ZWQgdG8gdGhlIHNlc3Npb24uCi8vCi8vICMxMzM4IOKAlCB0aGlzIHVzZWQgdG8gYmUgYW4gdW5hbmNob3JlZCBzdWJzdHJpbmcgdGVzdAovLyAoL3NlbWFudGljLXNlYXJjaHxtZW1vcnkgc2VhcmNofG1lbW9yeSByZXRyaWV2ZXxtZW1vcnktc2VhcmNoLykgYWdhaW5zdCB0aGUKLy8gd2hvbGUgY29tbWFuZCwgc28gYGVjaG8gIm1lbW9yeSBzZWFyY2giYCDigJQgb3IgYSBgZ2l0IGNvbW1pdCAtbWAgbWVudGlvbmluZwovLyB0aGUgcGhyYXNlIOKAlCBzYXRpc2ZpZWQgdGhlIGdhdGUgZm9yIHRoZSByZXN0IG9mIHRoZSBwcm9tcHQuIFRoYXQgaXMgdGhlCi8vIG9wcG9zaXRlIGRpc2NpcGxpbmUgZnJvbSBSRUFEX0xJS0VfQkFTSF9SRSBkaXJlY3RseSBiZWxvdywgd2hpY2ggaXMKLy8gZGVsaWJlcmF0ZWx5IGFuY2hvcmVkLiBDcmVkaXQgbm93IHJlcXVpcmVzIGEgcmVhbCBJTlZPQ0FUSU9OLCBtYXRjaGVkIGJ5Ci8vIEJBU0VOQU1FIHNvIFJ1bGUgIzEgaG9sZHM6IGBmbG9gLCBgZmxvLmNtZGAsIGBucHguY21kIGZsb2AsIGBub2RlIC4vYmluL2NsaS5qc2AKLy8gYW5kIGBub2RlIEM6XC4uLlxiaW5cY2xpLmpzYCBhbGwgY3JlZGl0LCB3aXRoIGVpdGhlciBwYXRoIHNlcGFyYXRvci4KdmFyIENSRURJVF9SVU5ORVJfUkUgPSAvXig/Om5weHxucG18cG5wbXx5YXJufGJ1bnxidW54fGRlbm98bm9kZXxub2RlanN8dHN4fHRzLW5vZGUpKD86XC4oPzpjbWR8ZXhlfGJhdHxwczEpKT8kL2k7Ci8vIFN1Yi13b3JkcyBvZiBhIHJ1bm5lciBpbnZvY2F0aW9uIHRoYXQgYXJlIG5vdCB0aGUgZW50cnlwb2ludCBpdHNlbGYKLy8gKGBwbnBtIGRseCBmbG9gLCBgbnBtIGV4ZWMgLS0gZmxvYCwgYG5weCAteSBmbG9gKS4KdmFyIENSRURJVF9SVU5ORVJfU0tJUF9SRSA9IC9eKD86ZGx4fGV4ZWN8cnVufC15fC0teWVzfC1xfC0tcXVpZXR8LS1zaWxlbnR8LS1uby1pbnN0YWxsfC0tKSQvaTsKLy8gVGhlIG1vZmxvIENMSSwgdW5kZXIgZXZlcnkgbmFtZSBwYWNrYWdlLmpzb24gYmluZHMgaXQgdG8gKHBsdXMgdGhlIHJhdyBlbnRyeQovLyBzY3JpcHQsIGZvciBgbm9kZSBub2RlX21vZHVsZXMvbW9mbG8vYmluL2NsaS5qc2ApLgp2YXIgQ1JFRElUX0NMSV9SRSA9IC9eKD86ZmxvfG1vZmxvfGNsYXVkZS1mbG93fGNsaVwuanN8Y2xpXC5tanMpKD86XC4oPzpjbWR8ZXhlfGJhdHxwczEpKT8kL2k7Ci8vIEEgc2VhcmNoIGVudHJ5cG9pbnQg4oCUIGV2ZXJ5IGludm9jYXRpb24gb2YgdGhlc2UgSVMgYSBtZW1vcnkgc2VhcmNoLgp2YXIgQ1JFRElUX1NFQVJDSF9CSU5fUkUgPSAvXig/OmZsby1zZWFyY2goPzpcLig/OmNtZHxleGV8YmF0fHBzMSkpP3xzZW1hbnRpYy1zZWFyY2hcLm1qcykkL2k7Ci8vIFN1YnN0cmluZyBldmVyeSBjcmVkaXRpbmcgZm9ybSBtdXN0IGNvbnRhaW4g4oCUIHRoZSBob3QtcGF0aCBwcmUtZmlsdGVyLiBDb3ZlcnMKLy8gZmxvIC8gbW9mbG8gLyBmbG8tc2VhcmNoIC8gY2xhdWRlLWZsb3cgKGFsbCBjb250YWluICJmbG8iKSwgY2xpLmpzfGNsaS5tanMsCi8vIGFuZCBzZW1hbnRpYy1zZWFyY2gubWpzLgp2YXIgQ1JFRElUX0hJTlRfUkUgPSAvZmxvfGNsaVwubT9qc3xzZW1hbnRpYy1zZWFyY2gvaTsKLy8gYGZsbyBtZW1vcnkgc2VhcmNoYCAvIGBmbG8gbWVtb3J5IHJldHJpZXZlYCwgYW5kIHRoZSBoeXBoZW4vdW5kZXJzY29yZSBzcGVsbGluZ3MuCnZhciBDUkVESVRfTUVNT1JZX1ZFUkJfUkUgPSAvXig/OnNlYXJjaHxyZXRyaWV2ZSkkL2k7CnZhciBDUkVESVRfTUVNT1JZX0NPTVBPVU5EX1JFID0gL15tZW1vcnlbLV9dKD86c2VhcmNofHJldHJpZXZlKSQvaTsKCi8qKgogKiBMYXN0IHBhdGggc2VnbWVudCBvZiBhIHRva2VuLCBsb3dlcmNhc2VkLiBTcGxpdHMgb24gQk9USCBzZXBhcmF0b3JzLCB1bmxpa2UKICogcGF0aC5iYXNlbmFtZSwgd2hpY2ggb25seSBob25vdXJzIHRoZSBIT1NUJ3Mgc2VwYXJhdG9yIChSdWxlICMxKTogYW4gYWdlbnQgb24KICogUE9TSVggY2FuIGxlZ2l0aW1hdGVseSB0eXBlIGBub2RlIC5jbGF1ZGVcc2NyaXB0c1xzZW1hbnRpYy1zZWFyY2gubWpzYCwgYW5kIGEKICogV2luZG93cy1zaGFwZWQgcGF0aCBtdXN0IHJlc29sdmUgdGhlIHNhbWUgd2hlcmV2ZXIgdGhlIGdhdGUgaGFwcGVucyB0byBydW4uCiAqLwpmdW5jdGlvbiBjb21tYW5kQmFzZW5hbWUodG9rKSB7CiAgdmFyIHQgPSB0b2sucmVwbGFjZSgvXlsiJ10rfFsiJ10rJC9nLCAnJyk7CiAgdmFyIGN1dCA9IHQubGFzdEluZGV4T2YoJy8nKTsKICB2YXIgYnMgPSB0Lmxhc3RJbmRleE9mKCdcXCcpOwogIGlmIChicyA+IGN1dCkgY3V0ID0gYnM7CiAgcmV0dXJuIChjdXQgPj0gMCA/IHQuc2xpY2UoY3V0ICsgMSkgOiB0KS50b0xvd2VyQ2FzZSgpOwp9CgovKioKICogVGhlIG1vZmxvIHN1YmNvbW1hbmQgb25lIHNoZWxsIHNlZ21lbnQgaW52b2tlcywgYXMgbG93ZXJjYXNlZCBwb3NpdGlvbmFsCiAqIGFyZ3MgKGBbJ21lbW9yeScsJ3NlYXJjaCddYCwgYFsnc3dhcm0nLCdpbml0J11gKSwgb3IgbnVsbCB3aGVuIHRoZSBzZWdtZW50CiAqIGRvZXMgbm90IGludm9rZSBtb2ZsbyBhdCBhbGwuIEEgZGVkaWNhdGVkIHNlYXJjaCBiaW5hcnkgcmVwb3J0cyB0aGUKICogc3ViY29tbWFuZCBpdCBpcyDigJQgdGhhdCBpcyBhbGwgYGZsby1zZWFyY2hgIGRvZXMuCiAqLwpmdW5jdGlvbiBtb2Zsb1N1YmNvbW1hbmQoc2VnKSB7CiAgdmFyIHRva2VucyA9IHNlZy50cmltKCkuc3BsaXQoL1xzKy8pLmZpbHRlcihCb29sZWFuKTsKICB2YXIgaSA9IDA7CiAgLy8gU2tpcCBzaGVsbCBub2lzZSBhaGVhZCBvZiB0aGUgZW50cnlwb2ludDogZW52IGFzc2lnbm1lbnRzIChgRk9PPWJhciBmbG8g4oCmYCksCiAgLy8gc3VkbywgcGFja2FnZSBydW5uZXJzIGFuZCB0aGVpciBmbGFncy4KICB3aGlsZSAoaSA8IHRva2Vucy5sZW5ndGgpIHsKICAgIHZhciB0b2sgPSB0b2tlbnNbaV07CiAgICBpZiAodG9rID09PSAnc3VkbycgfHwgL15bQS1aYS16X11bQS1aYS16MC05X10qPS8udGVzdCh0b2spKSB7IGkrKzsgY29udGludWU7IH0KICAgIGlmIChDUkVESVRfUlVOTkVSX1NLSVBfUkUudGVzdCh0b2spKSB7IGkrKzsgY29udGludWU7IH0KICAgIGlmIChDUkVESVRfUlVOTkVSX1JFLnRlc3QoY29tbWFuZEJhc2VuYW1lKHRvaykpKSB7IGkrKzsgY29udGludWU7IH0KICAgIGJyZWFrOwogIH0KICBpZiAoaSA+PSB0b2tlbnMubGVuZ3RoKSByZXR1cm4gbnVsbDsKICB2YXIgZW50cnkgPSBjb21tYW5kQmFzZW5hbWUodG9rZW5zW2ldKTsKICBpZiAoQ1JFRElUX1NFQVJDSF9CSU5fUkUudGVzdChlbnRyeSkpIHJldHVybiBbJ21lbW9yeScsICdzZWFyY2gnXTsKICBpZiAoIUNSRURJVF9DTElfUkUudGVzdChlbnRyeSkpIHJldHVybiBudWxsOwogIC8vIFBvc2l0aW9uYWwgYXJncyBhZnRlciB0aGUgQ0xJIGVudHJ5cG9pbnQ7IGZsYWdzIGNhcnJ5IG5vIHN1YmNvbW1hbmQuCiAgdmFyIHJlc3QgPSBbXTsKICBmb3IgKHZhciBqID0gaSArIDE7IGogPCB0b2tlbnMubGVuZ3RoOyBqKyspIHsKICAgIGlmICh0b2tlbnNbal0uY2hhckF0KDApICE9PSAnLScpIHJlc3QucHVzaCh0b2tlbnNbal0udG9Mb3dlckNhc2UoKSk7CiAgfQogIHJldHVybiByZXN0Owp9CgovKiogRG9lcyBvbmUgc2hlbGwgc2VnbWVudCBpbnZva2UgYSBtb2ZsbyBtZW1vcnkgc2VhcmNoPyAqLwpmdW5jdGlvbiBzZWdtZW50Q3JlZGl0c01lbW9yeVNlYXJjaChzZWcpIHsKICB2YXIgc3ViID0gbW9mbG9TdWJjb21tYW5kKHNlZyk7CiAgaWYgKCFzdWIgfHwgIXN1Yi5sZW5ndGgpIHJldHVybiBmYWxzZTsKICBpZiAoQ1JFRElUX01FTU9SWV9DT01QT1VORF9SRS50ZXN0KHN1YlswXSkpIHJldHVybiB0cnVlOwogIHJldHVybiBzdWJbMF0gPT09ICdtZW1vcnknICYmIHN1Yi5sZW5ndGggPiAxICYmIENSRURJVF9NRU1PUllfVkVSQl9SRS50ZXN0KHN1YlsxXSk7Cn0KCi8qKgogKiBDUkVESVQgdGVzdCBmb3IgYSB3aG9sZSBCYXNoL1Bvd2VyU2hlbGwgY29tbWFuZC4gUXVvdGVkIGJvZGllcyBhcmUgc3RyaXBwZWQKICogZmlyc3QgKHNvIGEgY29tbWl0IG1lc3NhZ2UgcXVvdGluZyAibWVtb3J5IHNlYXJjaCIgY2Fubm90IGNyZWRpdCksIHRoZW4gZWFjaAogKiBzaGVsbCBzZWdtZW50IGlzIGNoZWNrZWQgYXQgaXRzIG93biBzdGFydCDigJQgYGNkIHJlcG8gJiYgZmxvIG1lbW9yeSBzZWFyY2hgCiAqIGNyZWRpdHMsIGBlY2hvICJmbG8gbWVtb3J5IHNlYXJjaCJgIGRvZXMgbm90LgogKi8KZnVuY3Rpb24gY3JlZGl0c01lbW9yeVNlYXJjaChyYXdDbWQpIHsKICAvLyBDaGVhcCByZWplY3QgZmlyc3QuIFRoaXMgcnVucyBvbiBFVkVSWSBCYXNoIGNhbGwgaW4gZXZlcnkgY29uc3VtZXIsIGFoZWFkCiAgLy8gb2YgdGhlIGJsb2NrIGFybSdzIHJlZ2V4ZXMsIGFuZCBldmVyeSBjcmVkaXRpbmcgZm9ybSBuZWNlc3NhcmlseSBuYW1lcyBhbgogIC8vIGVudHJ5cG9pbnQgY29udGFpbmluZyBvbmUgb2YgdGhlc2Ug4oCUIHNvIG5vbi1tYXRjaGVzIGNvc3Qgb25lIHJlZ2V4LCBub3QgYQogIC8vIHN0cmlwICsgc3BsaXQgKyB0b2tlbml6ZS4KICBpZiAoIUNSRURJVF9ISU5UX1JFLnRlc3QocmF3Q21kIHx8ICcnKSkgcmV0dXJuIGZhbHNlOwogIHJldHVybiBtb2Zsb1NlZ21lbnRzKHJhd0NtZCkuc29tZShzZWdtZW50Q3JlZGl0c01lbW9yeVNlYXJjaCk7Cn0KCi8qKiBTaGVsbCBzZWdtZW50cyBvZiBhIGNvbW1hbmQsIHF1b3RlZCBib2RpZXMgc3RyaXBwZWQuICovCmZ1bmN0aW9uIG1vZmxvU2VnbWVudHMocmF3Q21kKSB7CiAgcmV0dXJuIHN0cmlwUXVvdGVkQW5kSGVyZWRvY3MocmF3Q21kIHx8ICcnKS5zcGxpdCgvWzt8JlxuXSsvKTsKfQoKLyoqCiAqICMxMzM4IGZvbGxvdy11cCDigJQgd2hpY2ggcHJvdGVjdGVkLWNvb3JkaW5hdGlvbiBpbml0LCBpZiBhbnksIGRpZCB0aGlzIHNoZWxsCiAqIGNvbW1hbmQgcnVuPyBSZXR1cm5zICdzd2FybScsICdoaXZlJywgb3IgbnVsbC4KICoKICogYGZsbyBzd2FybSBpbml0YCBhbmQgYGZsbyBoaXZlLW1pbmQgaW5pdGAgYXJlIE5PVCBzZWNvbmQtY2xhc3Mgc3RhbmQtaW5zIGZvcgogKiB0aGUgTUNQIHRvb2xzOiB0aGUgQ0xJIGRpc3BhdGNoZXMgaW4tcHJvY2VzcyB0aHJvdWdoIHRoZSBzYW1lIFRPT0xfUkVHSVNUUlkKICogaGFuZGxlciB0aGUgTUNQIHNlcnZlciBleHBvc2VzIChgbWNwLWNsaWVudC50c2AgY2FsbE1DUFRvb2wpLCBhbmQgdGhlCiAqIHJlc3VsdGluZyBzd2FybSBpcyBwZXJzaXN0ZWQgKCM4MDYgYWdlbnRzL3RvcG9sb2d5LCAjMTMyOSB0YXNrcyksIHNvIGEgbGF0ZXIKICogcHJvY2VzcyDigJQgaW5jbHVkaW5nIGEgcmVzdGFydGVkIE1DUCBzZXJ2ZXIg4oCUIGh5ZHJhdGVzIHRoZSBzYW1lIHN3YXJtLgogKgogKiBUaGlzIG1hdHRlcnMgYmVjYXVzZSBDbGF1ZGUgQ29kZSBzcGF3bnMgc3RkaW8gTUNQIHNlcnZlcnMgb25jZSBhdCBzZXNzaW9uCiAqIHN0YXJ0IGFuZCBuZXZlciByZXNwYXducyB0aGVtLiBCZWZvcmUgdGhpcywgYHJlY29yZC1zd2FybS1pbml0YCBmaXJlZCBvbmx5IG9uCiAqIGBtY3BfX21vZmxvX19zd2FybV9pbml0YCwgc28gYSBzZXNzaW9uIHRoYXQgbG9zdCBpdHMgTUNQIHNlcnZlciBoaXQgdGhlICM5NTIKICogZ2F0ZSB3aXRoIE5PIHdheSB0byBzYXRpc2Z5IGl0OiBgL2ZsIC1zYCBibG9ja2VkIGV2ZXJ5IEFnZW50IHNwYXduIGFuZCB0b2xkCiAqIHRoZSByZWFkZXIgdG8gY2FsbCBhIHRvb2wgdGhhdCBkaWQgbm90IGV4aXN0IGluIHRoYXQgc2Vzc2lvbi4gVW5saWtlIHRoZQogKiBtZW1vcnkgZ2F0ZSwgdGhlcmUgd2FzIG5vdCBldmVuIGFuIHVuYWR2ZXJ0aXNlZCBlc2NhcGUuCiAqCiAqIERlbGliZXJhdGVseSB3aXJlZCBQb3N0VG9vbFVzZSwgbm90IFByZVRvb2xVc2Ugd2hlcmUgdGhlIG1lbW9yeSBjcmVkaXQgbGl2ZXM6CiAqIENsYXVkZSBDb2RlIGRvZXMgbm90IGZpcmUgUG9zdFRvb2xVc2Ugd2hlbiBhIGNvbW1hbmQgZXhpdHMgbm9uLXplcm8gKCMxMzIyKSwKICogc28gb25seSBhbiBpbml0IHRoYXQgYWN0dWFsbHkgU1VDQ0VFREVEIGNyZWRpdHMgdGhlIGdhdGUuIEEgZmFpbGVkIGluaXQgbXVzdAogKiBuZXZlciBvcGVuIGl0IOKAlCB0aGF0IHdvdWxkIGJlIHRoZSBzaWxlbnQtZGVncmFkYXRpb24gZmFpbHVyZSBDTEFVREUubWQncwogKiBwcm90ZWN0ZWQtZnVuY3Rpb25hbGl0eSBydWxlIGV4aXN0cyB0byBwcmV2ZW50LgogKi8KZnVuY3Rpb24gYmFzaENvb3JkaW5hdGlvbkluaXQocmF3Q21kKSB7CiAgLy8gQ2hlYXAgcmVqZWN0LCBzYW1lIGhvdC1wYXRoIGRpc2NpcGxpbmUgYXMgY3JlZGl0c01lbW9yeVNlYXJjaDogZXZlcnkKICAvLyBjcmVkaXRpbmcgZm9ybSBuYW1lcyBhIG1vZmxvIGVudHJ5cG9pbnQgQU5EIHRoZSBgaW5pdGAgc3ViY29tbWFuZC4KICBpZiAoIUNSRURJVF9ISU5UX1JFLnRlc3QocmF3Q21kIHx8ICcnKSB8fCAhL1xiaW5pdFxiL2kudGVzdChyYXdDbWQpKSByZXR1cm4gbnVsbDsKICB2YXIgc2VnbWVudHMgPSBtb2Zsb1NlZ21lbnRzKHJhd0NtZCk7CiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWdtZW50cy5sZW5ndGg7IGkrKykgewogICAgdmFyIHN1YiA9IG1vZmxvU3ViY29tbWFuZChzZWdtZW50c1tpXSk7CiAgICBpZiAoIXN1YiB8fCBzdWIubGVuZ3RoIDwgMiB8fCBzdWJbMV0gIT09ICdpbml0JykgY29udGludWU7CiAgICBpZiAoc3ViWzBdID09PSAnc3dhcm0nKSByZXR1cm4gJ3N3YXJtJzsKICAgIC8vIGBoaXZlYCBpcyB0aGUgcmVnaXN0ZXJlZCBhbGlhcyBmb3IgYGhpdmUtbWluZGAgKGNvbW1hbmRzL2hpdmUtbWluZC50cykuCiAgICBpZiAoc3ViWzBdID09PSAnaGl2ZS1taW5kJyB8fCBzdWJbMF0gPT09ICdoaXZlJykgcmV0dXJuICdoaXZlJzsKICB9CiAgcmV0dXJuIG51bGw7Cn0KLy8gIzE0NDUg4oCUIHJlYWQgc2hhcGVzIHdob3NlIExFQURJTkcgY29tbWFuZCBpcyBvbmUgQkFTSF9DQVJWRV9PVVRfUkUgY2FydmVzIG91dAovLyB3aG9sZXNhbGUgKGBub2RlIOKApmAsIGBnaXQg4oCmYCkuIFRoZXkgYXJlIHJlYWQtbGlrZSBiZWNhdXNlIG9mIHdoYXQgRk9MTE9XUyB0aGUKLy8gbGVhZGluZyB0b2tlbiwgc28gYW5jaG9yaW5nIG9uIHRoYXQgdG9rZW4gYWxvbmUgY2FuIG5ldmVyIHNlZSB0aGVtOiBpbiBvbmUKLy8gcmVhbCBzZXNzaW9uIDUzOSBmaWxlLWV4cGxvcmF0aW9uIGNhbGxzIHdlbnQgdGhyb3VnaCBgbm9kZSAtZWAgKyByZWFkRmlsZVN5bmMKLy8gYW5kIGBnaXQgc2hvdyA8cmVmPjo8cGF0aD5gIHdpdGggdGhlIGdhdGUgYmxpbmQgdG8gZXZlcnkgb25lIG9mIHRoZW0uIFRoYXQgaXMKLy8gdGhlIGRvbWluYW50IGV4cGxvcmF0aW9uIHNoYXBlIGluIHJlcG9zIHdob3NlIG93biBndWlkYW5jZSBzdGVlcnMgYXdheSBmcm9tCi8vIGBncmVwYCAoZS5nLiB3aGVyZSBgZ3JlcGAgaXMgYHVncmVwYCBhbmQgc2lsZW50bHkgc2tpcHMgZmlsZXMsIHNvIGFueQovLyBpbnZlbnRvcnkgYSBkZWNpc2lvbiByZXN0cyBvbiBtdXN0IGdvIHRocm91Z2ggYGZzLnJlYWRGaWxlU3luY2ApLgovLwovLyBUaGVzZSBzb3VyY2VzIGFyZSBzcGxpY2VkIGludG8gUkVBRF9MSUtFX0JBU0hfUkUgYmVsb3cgQU5EIGtlcHQgYWRkcmVzc2FibGUKLy8gb24gdGhlaXIgb3duLCBiZWNhdXNlIGNoZWNrLWJhc2gtbWVtb3J5IGhhcyB0byBsZXQgdGhlbSBvdmVycmlkZSB0aGUKLy8gY2FydmUtb3V0IOKAlCBleHRlbmRpbmcgUkVBRF9MSUtFIGFsb25lIHdvdWxkIGNoYW5nZSBub3RoaW5nLCB0aGUgYF5ccyoobm9kZXwKLy8gZ2l0KVxzYCBjYXJ2ZS1vdXQgYXJtcyBzd2FsbG93IHRoZW0gb25lIGxpbmUgbGF0ZXIuCnZhciBSVU5ORVJfUkVBRF9TT1VSQ0VTID0gWwogIC8vIGBub2RlIC1lICIuLi5yZWFkRmlsZVN5bmMoLi4uKS4uLiJgLCBpbiBldmVyeSBldmFsIHNwZWxsaW5nICgtZS8tLWV2YWwvLXAvCiAgLy8gLS1wcmludC8tLWlucHV0LXR5cGU9bW9kdWxlIC1lKS4gVGhlIGV2YWwgRkxBRyBpcyBkZWxpYmVyYXRlbHkgbm90IHJlcXVpcmVkOgogIC8vIGEgc2NyaXB0LWZpbGUgaW52b2NhdGlvbiAoYG5vZGUgc2NyaXB0cy9idWlsZC5tanNgKSBkb2VzIG5vdCBjYXJyeSBhIHJlYWQKICAvLyBjYWxsIGluIGl0cyBjb21tYW5kIGxpbmUsIHNvIHRoZSByZWFkIGNhbGwgaXRzZWxmIGlzIHRoZSByZWxpYWJsZSBzaWduYWwgYW5kCiAgLy8gZGVtYW5kaW5nIHRoZSBmbGFnIG9ubHkgYWRkcyBzcGVsbGluZ3MgdG8gbWlzcy4KICAvLwogIC8vIFRoZSBuZWdhdGl2ZSBsb29rYWhlYWQgaXMgbG9hZC1iZWFyaW5nLCBub3QgY2F1dGlvbjogUnVsZSAjMSB0ZWxscyBhdXRob3JzCiAgLy8gdG8gZG8gY3Jvc3MtcGxhdGZvcm0gZmlsZSBPUFMgdGhyb3VnaCBgbm9kZSAtZWAgd2l0aCBmcyAoYG1rZGlyYC9gcm1gL2BjcGAKICAvLyBkbyBub3QgZXhpc3Qgb24gV2luZG93cyksIGFuZCBhIHJlYWQtbW9kaWZ5LXdyaXRlIGlzIGFuIG9wZXJhdGlvbiwgbm90CiAgLy8gZXhwbG9yYXRpb24uIE9ubHkgZnMgTVVUQVRJT04gY2FsbHMgY2FydmUgb3V0IOKAlCBtYXRjaGluZyBhIGJhcmUgYHdyaXRlYAogIC8vIHdvdWxkIGNhcnZlIG91dCBgcHJvY2Vzcy5zdGRvdXQud3JpdGVgLCB3aGljaCBuZWFybHkgZXZlcnkgaW5saW5lIHJlYWQKICAvLyBzY3JpcHQgZW5kcyB3aXRoLCBhbmQgdGhhdCB3b3VsZCBoYW5kIGJhY2sgdGhlIHdob2xlIGdhcC4KICAvLwogIC8vIEV2ZXJ5IG11dGF0aW9uIG5hbWUgY292ZXJzIGl0cyBzeW5jLCBjYWxsYmFjayBBTkQgcHJvbWlzZSBzcGVsbGluZzogYXV0aG9ycwogIC8vIHJlYWNoIGZvciBgZnMucHJvbWlzZXMucm1gIGFzIHJlYWRpbHkgYXMgYHJtU3luY2AsIGFuZCBsaXN0aW5nIG9ubHkgdGhlCiAgLy8gYCpTeW5jYCBmb3JtIHdvdWxkIGJsb2NrIHRoZSBkZWxldGUgb3AgUnVsZSAjMSBzZW50IHRoZW0gdG8gYG5vZGUgLWVgIGZvci4KICAvLyBgcm1gL2BybWRpcmAvYGNwYCBjYXJyeSBgXGJgIGJlY2F1c2UgdGhleSBhcmUgc2hvcnQgZW5vdWdoIHRvIGFwcGVhciBpbnNpZGUKICAvLyB1bnJlbGF0ZWQgd29yZHMg4oCUIGFuIHVuYW5jaG9yZWQgYHJtYCBtYXRjaGVzICJmb3JtYXQiIGFuZCAidHJhbnNmb3JtIiwgYW5kCiAgLy8gd291bGQgY2FydmUgb3V0IG1vc3Qgb2Ygd2hhdCB0aGlzIGFybSBleGlzdHMgdG8gY2F0Y2guCiAgJ15cXHMqKD86bm9kZXxub2RlanMpKD86XFwuKD86ZXhlfGNtZCkpP1xccycKICAgICsgJyg/PVtcXHNcXFNdKig/OnJlYWQoPzpGaWxlfGRpcil8Z2xvYlN5bmMpKScKICAgICsgJyg/IVtcXHNcXFNdKig/OndyaXRlRmlsZXxhcHBlbmRGaWxlfG1rZGlyfG1rZHRlbXB8dW5saW5rfGNvcHlGaWxlfHJlbmFtZScKICAgICsgJ3xzeW1saW5rfGNyZWF0ZVdyaXRlU3RyZWFtfFxcYnJtKD86ZGlyKT8oPzpTeW5jKT9cXGJ8XFxiY3AoPzpTeW5jKT9cXGIpKScsCiAgLy8gYGdpdCBzaG93IDxyZWY+OjxwYXRoPmAgLyBgZ2l0IGNhdC1maWxlIC1wIDxyZWY+OjxwYXRoPmAg4oCUIHRoZSBjb2xvbiBmb3JtCiAgLy8gcmVhZHMgYSBibG9iIGFuZCBpcyBgY2F0YCBieSBhbm90aGVyIG5hbWUuIExlYWRpbmcgYC1gLXByZWZpeGVkIHRva2VucyBhcmUKICAvLyBjb25zdW1lZCBhcyBmbGFncyBmaXJzdCBzbyBgLS1wcmV0dHk9Zm9ybWF0OiVoYCAoYSBjb2xvbiBpbnNpZGUgYSBGTEFHKQogIC8vIGNhbm5vdCBtYXNxdWVyYWRlIGFzIGEgcmVmOnBhdGgsIGFuZCB0aGUgc2VnbWVudCBhZnRlciB0aGUgY29sb24gbXVzdCBjYXJyeQogIC8vIGEgcGF0aCBjaGFyYWN0ZXIg4oCUIHNhbWUgZmFsc2UtbmVnYXRpdmUgdHJhZGUgYXMgdGhlIGB0eXBlIFxTKltcXC8uXWAgYXJtCiAgLy8gYWJvdmUgKGBnaXQgc2hvdyBIRUFEOnNyY2AsIGEgYmFyZSBkaXJlY3RvcnksIHBhc3Nlczsgc291cmNlIGZpbGVzIGFsbCBoYXZlCiAgLy8gZXh0ZW5zaW9ucykuIEJhcmUgYGdpdCBzaG93YCwgYGdpdCBzaG93IC0tc3RhdGAsIGBnaXQgbG9nYCBhbmQgYGdpdCBkaWZmYAogIC8vIGhhdmUgbm8gcmVmOnBhdGggdG9rZW4gYW5kIHN0YXkgb3BlcmF0aW9uYWwuCiAgJ15cXHMqZ2l0XFxzKyg/OnNob3d8Y2F0LWZpbGUpXFxzKyg/Oi17MSwyfVxcUytcXHMrKSpbXi1cXHNdXFxTKjpcXFMqW1xcXFwvLl0nLAogIC8vIFJlcG8td2lkZSBjb250ZW50IHNlYXJjaCBhbmQgZmlsZSBpbnZlbnRvcnkg4oCUIHRoZSBgZ2l0YCBzcGVsbGluZ3Mgb2YKICAvLyBgZ3JlcCAtcmAgYW5kIGBmaW5kYC4gTk9UIGBnaXQgbG9nIC0tZ3JlcGAsIHdoaWNoIHNlYXJjaGVzIGNvbW1pdCBtZXNzYWdlcywKICAvLyBpcyBhbHJlYWR5IGluIHRoZSBwYXNzaW5nIHNldCwgYW5kIGRvZXMgbm90IG1hdGNoIGBnaXRccytncmVwYC4KICAnXlxccypnaXRcXHMrKD86Z3JlcHxscy1maWxlcylcXGInLApdOwovLyBTYW1lIHNvdXJjZXMgYXMgdGhlaXIgb3duIG1hdGNoZXIg4oCUIGNoZWNrLWJhc2gtbWVtb3J5IHRlc3RzIHRoaXMgdG8gbGV0IGEKLy8gY2FydmVkLW91dCBsZWFkaW5nIGNvbW1hbmQgc3RpbGwgYmxvY2sgd2hlbiB0aGUgcmVzdCBvZiB0aGUgY29tbWFuZCBpcyBhIHJlYWQuCnZhciBSVU5ORVJfUkVBRF9CQVNIX1JFID0gbmV3IFJlZ0V4cChSVU5ORVJfUkVBRF9TT1VSQ0VTLmpvaW4oJ3wnKSwgJ2knKTsKLy8gQkxPQ0s6IHJlYWQtbGlrZSBCYXNoIGNvbW1hbmRzIHRoYXQgYnlwYXNzIHRoZSBleGlzdGluZyBjaGVjay1iZWZvcmUtcmVhZCAvCi8vIGNoZWNrLWJlZm9yZS1zY2FuIGdhdGVzIGJ5IGdvaW5nIHRocm91Z2ggdGhlIHNoZWxsLiBBbmNob3JlZCB0byB0aGUgc3RhcnQgb2YKLy8gdGhlIGxpbmUgc28gc3ViY29tbWFuZHMgaW5zaWRlIHBpcGVsaW5lcyBvciBgbnBtIGluc3RhbGwgZ3JlcGAgZG9uJ3QgdHJpcC4KLy8gQ292ZXJzIFBPU0lYIHJlYWQvc2VhcmNoIHRvb2xzLCBXaW5kb3dzIGNtZCBgdHlwZWAsIGFuZCBQb3dlclNoZWxsIHJlYWRlcnMuCi8vICMxMTcxIOKAlCBleHRlbmRlZCB3aXRoIFBvd2VyU2hlbGwtbmF0aXZlIGV4cGxvcmF0aW9uIGZvcm1zIG5vdyB0aGF0IHRoZSBtYXRjaGVyCi8vIHdpZGVucyB0byB0aGUgYFBvd2VyU2hlbGxgIHRvb2wuIFBsYWluIGBHZXQtQ2hpbGRJdGVtYCB3aXRob3V0IC1SZWN1cnNlIHN0YXlzCi8vIHVuY292ZXJlZCAoaXQncyBgbHNgLWVxdWl2YWxlbnQgYW5kIHBsYWluIGBsc2AgaXMgYWxsb3dlZCkuCnZhciBSRUFEX0xJS0VfQkFTSF9SRSA9IG5ldyBSZWdFeHAoWwogICdeXFxzKig/OmNhdHxoZWFkfHRhaWx8bGVzc3xtb3JlfGJhdHx4eGR8b2R8aGV4ZHVtcClcXGInLAogICdeXFxzKig/OmdyZXB8cmd8YWd8ZmdyZXB8ZWdyZXB8ZmluZHxmZClcXGInLAogICdeXFxzKnNlZFxccystblxcYicsCiAgJ15cXHMqYXdrXFxzKyg/IS4qPDwpJywKICAvLyBgdHlwZSA8cGF0aD5gIG9uIFdpbmRvd3MuIE5vIGAkYCBhbmNob3Igc28gYSBwaXBlZCBmb3JtCiAgLy8gKGB0eXBlIHNyY1xmb28udHMgfCBncmVwIHhgKSBzdGlsbCBtYXRjaGVzIGFuZCBnZXRzIGJsb2NrZWQuIFRoZSBhcmd1bWVudAogIC8vIG11c3QgY29udGFpbiBhIHNsYXNoLCBiYWNrc2xhc2gsIG9yIGRvdCDigJQgb3RoZXJ3aXNlIGl0J3MgdGhlIHNoZWxsLWJ1aWx0aW4KICAvLyBjb21tYW5kLWxvb2t1cCBmb3JtIChgdHlwZSBsc2AsIGB0eXBlIGNkYCkgd2hpY2ggdGhlIGdhdGUgaGFzIG5vIGJ1c2luZXNzCiAgLy8gYmxvY2tpbmcuIEZhbHNlLW5lZ2F0aXZlIHRyYWRlOiBleHRlbnNpb24tbGVzcyBmaWxlbmFtZXMgbGlrZSBgdHlwZSBNYWtlZmlsZWAKICAvLyBwYXNzIHRocm91Z2guIEFjY2VwdGFibGUg4oCUIHNvdXJjZSBmaWxlcyBhbGwgaGF2ZSBleHRlbnNpb25zLCBhbmQgdGhlCiAgLy8gcHJpbWFyeSByaXNrIHBhdHRlcm4gaXMgbGVha2luZyBwYXN0IHRoZSBnYXRlIHZpYSBgdHlwZSBzcmNcZm9vLnRzYC4KICAnXlxccyp0eXBlXFxzK1xcUypbXFxcXC8uXScsCiAgJ15cXHMqKD86R2V0LUNvbnRlbnR8Z2N8U2VsZWN0LVN0cmluZ3xzbHMpXFxiJywKICAvLyAjMTE3MSDigJQgUG93ZXJTaGVsbCByZWN1cnNpdmUgZXhwbG9yYXRpb24gKHBhcmFsbGVsIHRvIFBPU0lYIGBmaW5kYC9gZmRgKS4KICAvLyBUaGUgYC1SZWN1cnNlYCBmbGFnIGlzIHdoYXQgbWFrZXMgaXQgZXhwZW5zaXZlIGVub3VnaCB0byBnYXRlOyBwbGFpbgogIC8vIGBHZXQtQ2hpbGRJdGVtYCBpcyBgbHNgLXNoYXBlZCBhbmQgaW50ZW50aW9uYWxseSBub3QgYmxvY2tlZC4KICAnXlxccyooPzpHZXQtQ2hpbGRJdGVtfGdjaSlcXGJbXnxdKi1SZWN1cnNlXFxiJywKICAvLyAjMTE3MSDigJQgY21kLXN0eWxlIHJlY3Vyc2l2ZSBsaXN0aW5nIChgZGlyIC9zYCBvciBgZGlyIC9TYCkuIE9ubHkgdGhlCiAgLy8gV2luZG93cyBgL3NgIGZvcm0sIE5PVCBQT1NJWCBgZGlyIC1zYCAoc29ydC1ieS1zaXplLCB3aGVyZSBgZGlyYCBpcyBhbGlhc2VkCiAgLy8gdG8gYGxzIC1sYCBvbiBtYW55IGRpc3Ryb3MpIOKAlCBmYWxzZS1wb3NpdGl2ZSBibG9ja2luZyB0aGF0IHdvdWxkIGJyZWFrCiAgLy8gbGVnaXRpbWF0ZSBQT1NJWCBsaXN0aW5ncy4KICAnXlxccypkaXJcXGJbXnxdKlxcc1xcL1tzU11cXGInLAogIC8vICMxMTcxIOKAlCBQb3dlclNoZWxsIGhleCBkdW1wLCBwYXJhbGxlbCB0byBQT1NJWCBgeHhkYC9gaGV4ZHVtcGAuCiAgJ15cXHMqRm9ybWF0LUhleFxcYicsCl0uY29uY2F0KFJVTk5FUl9SRUFEX1NPVVJDRVMpLmpvaW4oJ3wnKSwgJ2knKTsKLy8gQ0FSVkUtT1VUOiBjb21tYW5kcyB0aGF0IExPT0sgcmVhZC1saWtlIGJ1dCBhcmUgb3BlcmF0aW9uYWwuIEFuY2hvcmVkIHRvIHRoZQovLyBMRUFESU5HIGNvbW1hbmQg4oCUIHRoZSBwaXBlLWZpbHRlciBjYXNlIChgbnBtIHRlc3QgfCBncmVwIEZBSUxgKSBpcyBhbHJlYWR5Ci8vIGhhbmRsZWQgYnkgUkVBRF9MSUtFJ3MgYF5ccypgIGFuY2hvciBuZXZlciBtYXRjaGluZyB0aGUgbGVhZGluZyBgbnBtYCwgc28KLy8gdGhlcmUgaXMgaW50ZW50aW9uYWxseSBubyBwaXBlIGFybSBoZXJlOiBjYXRjaGluZyB0aGUgbGVhZGluZyBjb21tYW5kIGxldHMKLy8gYGdyZXAgLXIgVE9ETyBzcmMvIHwgaGVhZCAtNWAgcmVhY2ggdGhlIEJMT0NLIGV4aXQgKHdoaWNoIGl0IG11c3QsIHRoYXQncwovLyB0aGUgZ2FwIHRoZSB0aWNrZXQgZXhpc3RzIHRvIGNsb3NlKS4gIzExMzIuCnZhciBCQVNIX0NBUlZFX09VVF9SRSA9IG5ldyBSZWdFeHAoWwogICdeXFxzKihucG18bnB4fHBucG18eWFybnxidW58bm9kZXxkZW5vfHRzeHx0cy1ub2RlKVxccycsCiAgJ15cXHMqKGdpdHxnaHxodWIpXFxzJywKICAnXlxccyooZG9ja2VyfGt1YmVjdGx8aGVsbXx0ZXJyYWZvcm0pXFxzJywKICAnXlxccyooY3VybHx3Z2V0fGh0dHB8ZmV0Y2gpXFxzJywKICAnXlxccyooanF8eXF8eHEpXFxzJywKICAnXlxccyooZWNob3xwcmludGZ8dHJ1ZXxmYWxzZXxzbGVlcHx0ZXN0fFxcWylcXHMnLAogICdeXFxzKmNhdFxccysoPDx8PDw8KScsCiAgJ15cXHMqY2F0XFxzK1tefF0qXFxzKj4nLAogICdeXFxzKnRlZVxcYicsCiAgLy8gTGF6eSBgLis/YCBpbnN0ZWFkIG9mIGAuK1xzYCB0byBhdm9pZCBjYXRhc3Ryb3BoaWMgYmFja3RyYWNraW5nIG9uIGxvbmcKICAvLyBgZmluZGAgY29tbWFuZHMgdGhhdCBsYWNrIGEgYC1kZWxldGVgIC8gYC1leGVjIHJtYCBzdWZmaXguCiAgJ15cXHMqZmluZFxccysuKz8tKGRlbGV0ZXxleGVjXFxzK3JtKVxcYicsCl0uam9pbignfCcpKTsKLy8gIzExNzEgZm9sbG93LXVwIOKAlCBzdHJpcCBxdW90ZWQgc3RyaW5nIGJvZGllcyBhbmQgaGVyZWRvYyBib2RpZXMgZnJvbSBhIHNoZWxsCi8vIGNvbW1hbmQgZm9yIHB1cnBvc2VzIG9mIGRhbmdlcm91cy1wYXR0ZXJuIHN1YnN0cmluZyBtYXRjaGluZy4gVXNlZCBieQovLyBjaGVjay1kYW5nZXJvdXMtY29tbWFuZC4gRG9lcyBOT1Qgc3RyaXAgJCguLi4pIG9yIGAuLi5gIGJlY2F1c2UgdGhvc2UgYm9kaWVzCi8vIGV4ZWN1dGUuIERvdWJsZS1xdW90ZWQgc3RyaW5ncyBoYW5kbGUgZXNjYXBlZCBxdW90ZXMgKGBcImApIGNvcnJlY3RseSBzbwovLyBgZ2l0IGNvbW1pdCAtbSAiZml4IFwiWFwiImAgc3RyaXBzIHRoZSB3aG9sZSBxdW90ZWQgYm9keSwgbm90IGp1c3QgdGhlIGZpcnN0Ci8vIGBcImAgcGFpci4gU2luZ2xlIHF1b3RlcyBkb24ndCBoYXZlIGVzY2FwZXMgaW4gYmFzaC9zaCDigJQgYCdbXiddKidgIGlzIGV4YWN0LgpmdW5jdGlvbiBzdHJpcFF1b3RlZEFuZEhlcmVkb2NzKGNtZCkgewogIHZhciBvdXQgPSBjbWQ7CiAgLy8gSGVyZWRvYyB0YWlsOiBgPDxUT0tFTmAsIGA8PC1UT0tFTmAsIGA8PCdUT0tFTidgLCBgPDwiVE9LRU4iYCB0aHJvdWdoIGVuZC1vZi1pbnB1dC4KICAvLyBCYXNoIGhlcmVkb2NzIGFyZSBtdWx0aS1saW5lOyBpbiBzaW5nbGUtbGluZSB0b29sIGlucHV0cyB0aGV5IHNob3cgdXAgYXMgdGhlCiAgLy8gdGFpbCBhZnRlciBgPDxUT0tFTmAuIENvbnNlcnZhdGl2ZSB0YWlsLXN0cmlwIOKAlCBiZW5pZ24gY29udGVudCBhZnRlciBhIGhlcmVkb2MKICAvLyBib2R5IG9uIHRoZSBzYW1lIGxvZ2ljYWwgbGluZSBpcyBhbHNvIHN0cmlwcGVkLCBoYXJtbGVzcyBmb3IgdGhpcyBnYXRlLgogIC8vIFRva2VuIGNsYXNzIGluY2x1ZGVzIGAtYCBzbyBoeXBoZW5hdGVkIGhlcmVkb2MgdGFncyAoYDw8RU5ELU9GLURPQ2ApIG1hdGNoCiAgLy8gdGhlIGZ1bGwgdG9rZW4sIG5vdCBqdXN0IHRoZSBsZWFkaW5nIHdvcmQg4oCUIHdpdGhvdXQgdGhpcyB0aGUgc3RyaXAgd291bGQKICAvLyBoYWx0IGF0IGA8PEVORGAgYW5kIGxlYXZlIGAtT0YtRE9DYCBwbHVzIHRoZSBib2R5IGFzIGxpdGVyYWwgdGV4dC4KICBvdXQgPSBvdXQucmVwbGFjZSgvPDwtP1xzKlsnIl0/W1x3LV0rWyciXT9bXHNcU10qJC8sICcnKTsKICAvLyBIZXJlLXN0cmluZyBgPDw8d29yZGAg4oCUIHN0cmlwIHRoZSB3b3JkLgogIG91dCA9IG91dC5yZXBsYWNlKC88PDxccypcUysvZywgJycpOwogIC8vIFNpbmdsZS1xdW90ZWQgc3RyaW5ncyDigJQgbm8gZXNjYXBlcyBpbnNpZGUgc2luZ2xlIHF1b3RlcyBpbiBzaC9iYXNoLgogIG91dCA9IG91dC5yZXBsYWNlKC8nW14nXSonL2csICInJyIpOwogIC8vIERvdWJsZS1xdW90ZWQgc3RyaW5ncyDigJQgYCg/OlteIlxcXXxcXC4pKmAgbWF0Y2hlcyBhbnl0aGluZyBleGNlcHQgYW4KICAvLyB1bmVzY2FwZWQgYCJgLCBzbyBlc2NhcGVkIGBcImAgbWlkLXN0cmluZyBkb2Vzbid0IHRlcm1pbmF0ZSB0aGUgc3RyaXAgZWFybHkuCiAgb3V0ID0gb3V0LnJlcGxhY2UoLyIoPzpbXiJcXF18XFwuKSoiL2csICciIicpOwogIHJldHVybiBvdXQ7Cn0KCi8vICMxNDQ3IOKAlCB3b3JkcyB0aGF0IGNhcnJ5IG5vIHN1YmplY3QgdG8gc2VhcmNoIEZPUjogYXNzZW50LCBhY2tub3dsZWRnZW1lbnQsCi8vICJrZWVwIGdvaW5nIiwgYW5kIGNvbnZlcnNhdGlvbmFsIGZpbGxlci4gQSBwcm9tcHQgYnVpbHQgT05MWSBmcm9tIHRoZXNlCi8vIGNvbnRpbnVlcyB3b3JrIGFscmVhZHkgdW5kZXIgd2F5LCBzbyB0aGUgbWVtb3J5IGdhdGUgc3RheXMgZG93bjsgYW55dGhpbmcKLy8gdGhhdCBzdXJ2aXZlcyB0aGUgc3RyaXAgaXMgYSBzdWJqZWN0LCBhbmQgdGhlIGdhdGUgYXJtcy4KLy8KLy8gU3VwZXJzZWRlcyB0d28gdGhpbmdzLiBgRElSRUNUSVZFX1JFYCDigJQgYSBgXih5ZXN8b2t8c3VyZXzigKYpYCBwcmVmaXggdGVzdCB0aGF0Ci8vIGhhZCBhbHJlYWR5IGJlZW4gZGVhZCBjb2RlIGZvciBzb21lIHRpbWUsIHVucmVmZXJlbmNlZCBieSB0aGUgcmVzZXQgaXQgd2FzCi8vIHdyaXR0ZW4gZm9yLiBBbmQgdGhlIGxpdmUgcnVsZSwgYFRBU0tfUkUudGVzdChwKSB8fCBwLmxlbmd0aCA+IDIwYCwgd2hvc2UKLy8gcmVhbCB3b3JrIHdhcyBza2lwcGluZyBzaG9ydCByZXBsaWVzOiBldmVyeSBwcm9tcHQgb2YgMjAgY2hhcmFjdGVycyBvciBmZXdlcgovLyB3aXRob3V0IGEgdGFzayB3b3JkIHdhcyBleGVtcHQuIFRoYXQgY2F1Z2h0IHRyaXZpYSAoImhtbSIsICJnb3QgaXQiKSBhbmQKLy8gZXF1YWxseSBjYXVnaHQgImNoZWNrIHRoZSBkYWVtb24iIOKAlCBhIGdlbnVpbmUgdG9waWMgY2hhbmdlIOKAlCB3aGljaCBpcyB0aGUKLy8gaGFsZiB0aGlzIHJlcGxhY2VzLiBUaGUgbGlzdCBiZWxvdyBoYXMgdG8gY2FycnkgdGhlIHRyaXZpYSBoYWxmIG9uIGl0cyBvd24sCi8vIHNvIGl0IGNvdmVycyBjb25zaWRlcmFibHkgbW9yZSBncm91bmQgdGhhbiBESVJFQ1RJVkVfUkUgZXZlciBkaWQuCi8vCi8vIE1hdGNoaW5nIGJ5IFNVQlRSQUNUSU9OLCBub3QgYnkgYSBsZWFkaW5nLXRva2VuIHRlc3QsIGlzIHdoYXQgbGV0cwovLyAieWVzLCBub3cgZml4IHRoZSBkYWVtb24iIGFybSB3aGlsZSAieWVzIiBkb2VzIG5vdCDigJQgYSBgXih5ZXN8b2spXGJgIHRlc3QKLy8gc2VlcyB0aGUgc2FtZSBmaXJzdCB3b3JkIGluIGJvdGguIEl0IGlzIGFsc28gd2h5IHRoZSBsaXN0IGNhbiBzYWZlbHkgaG9sZAovLyBvcmRpbmFyeSB3b3JkcyBsaWtlIGBkb2AvYGl0YC9gd29ya2AvYHRoZWA6IGEgd29yZCBvbmx5IGV4ZW1wdHMgYSBwcm9tcHQgd2hlbgovLyBOT1RISU5HIGVsc2UgaW4gdGhhdCBwcm9tcHQgc3Vydml2ZXMsIHNvIGVhY2ggYWRkaXRpb24gY29zdHMgcHJlY2lzaW9uIG9ubHkKLy8gZm9yIHByb21wdHMgbWFkZSBlbnRpcmVseSBvZiBsaXN0ZWQgd29yZHMuIERlbGliZXJhdGVseSBhYnNlbnQgZm9yIHRoYXQKLy8gcmVhc29uOiB0YXNrIHdvcmRzIChgZml4YCwgYHRlc3RgLCBgYnVpbGRgKSBhbmQgYW55IG5vdW4uCnZhciBDT05USU5VQVRJT05fV09SRF9SRSA9IG5ldyBSZWdFeHAoJ1xcYig/OicgKyBbCiAgLy8gQXNzZW50IC8gZGlzc2VudCAvIGFja25vd2xlZGdlbWVudAogICd5ZXMnLCAneWVhaCcsICd5ZXAnLCAneXVwJywgJ25vJywgJ25vcGUnLCAnc3VyZScsICdvaycsICdva2F5JywgJ2snLAogICdjb3JyZWN0JywgJ3JpZ2h0JywgJ2V4YWN0bHknLCAncGVyZmVjdCcsICdhZ3JlZWQnLCAndHJ1ZScsICdpbmRlZWQnLAogICd1bmRlcnN0b29kJywgJ2dvdGNoYScsICdnb3QnLCAnbWFrZXMnLCAnc2Vuc2UnLCAnZmluZScsICdhbHJpZ2h0JywKICAvLyBDb250aW51YXRpb24gLyBhc3NlbnQgdG8gcHJvY2VlZAogICdjb250aW51ZScsICdwcm9jZWVkJywgJ2NhcnJ5JywgJ2tlZXAnLCAnZ29pbmcnLCAnZ28nLCAnYWhlYWQnLCAnb24nLCAnbmV4dCcsCiAgJ2FnYWluJywgJ21vcmUnLCAncmVzdCcsICdib3RoJywgJ2FsbCcsICd0aGVtJywgJ3Rob3NlJywKICAvLyBQb2xpdGVuZXNzIGFuZCBwcmFpc2UKICAncGxlYXNlJywgJ3RoYW5rcycsICd0aGFuaycsICd0eScsICdncmVhdCcsICduaWNlJywgJ2Nvb2wnLCAnZ29vZCcsICdhd2Vzb21lJywKICAnZXhjZWxsZW50JywgJ3NvdW5kcycsICdsZ3RtJywgJ2xvdmUnLCAnd2VsbCcsICd3b3JrJywgJ2pvYicsICd3b3cnLCAneWF5JywKICAvLyBDb252ZXJzYXRpb25hbCBmaWxsZXIgLyBoZXNpdGF0aW9uIC8gZ3JlZXRpbmdzCiAgJ2htbScsICdobScsICdodWgnLCAnYWgnLCAnb2gnLCAnaGEnLCAnaGFoYScsICdsb2wnLCAnd2FpdCcsICdob2xkJywgJ2hhbmcnLAogICdhY3R1YWxseScsICdhbnl3YXknLCAnd2hhdGV2ZXInLCAnbnZtJywgJ25ldmVybWluZCcsICdzb3JyeScsICdvb3BzJywKICAnaGknLCAnaGVsbG8nLCAnaGV5JywgJ3N0b3AnLCAncGF1c2UnLCAnbmV2ZXInLCAnbWluZCcsCiAgJ3RoaW5rJywgJ2tub3cnLCAnc2VlJywgJ2d1ZXNzJywgJ3N1cHBvc2UnLCAnbWF5YmUnLCAncHJvYmFibHknLAogIC8vIEZ1bmN0aW9uIHdvcmRzIHdpdGggbm8gc3ViamVjdCBvZiB0aGVpciBvd24KICAnZG8nLCAnaXQnLCAndGhhdCcsICd0aGlzJywgJ3RoZScsICdhJywgJ2FuJywgJ2FuZCcsICdpcycsICdhcmUnLCAnd2FzJywKICAneW91JywgJ3lvdXInLCAnaScsICd3ZScsICdsZXRzJywgJ2xldCcsICd1cycsICdtZScsICdteScsICdub3cnLCAndGhlbicsCiAgJ2RvbmUnLCAnZmluaXNoJywgJ2ZpbmlzaGVkJywgJ3JlYWR5JywgJ3RvbycsICdhbHNvJywgJ2p1c3QnLCAnc3RpbGwnLApdLmpvaW4oJ3wnKSArICcpXFxiJywgJ2dpJyk7Ci8qKgogKiBEb2VzIHRoaXMgcHJvbXB0IGNvbnNpc3Qgb2Ygbm90aGluZyBidXQgY29udGludWF0aW9uIGZpbGxlcj8KICoKICogQW4gRU1QVFkgcHJvbXB0IGFuc3dlcnMgdHJ1ZSDigJQgYSBwcm9tcHQgdGhlIGdhdGUgY2Fubm90IHNlZSBpcyBub3QgZXZpZGVuY2UKICogdGhhdCBhIHNlYXJjaCBpcyBuZWVkZWQsIGFuZCBhcm1pbmcgb24gaXQgd291bGQgYmxvY2sgZXZlcnkgcmVhZCBpbiBhCiAqIGNvbnN1bWVyIHdob3NlIGhvc3Qgb21pdHMgdGhlIGZpZWxkLCB3aXRoIG5vdGhpbmcgb24gc2NyZWVuIGV4cGxhaW5pbmcgd2h5LgogKiBGYWlsLW9wZW4gaGVyZTsgYHByb21wdC1zdGF0ZS1yZXNldGAgc2VwYXJhdGVseSByZWZ1c2VzIHRvIFdSSVRFIGEgdmVyZGljdCBpdAogKiBkZXJpdmVkIGZyb20gYW4gZW1wdHkgcHJvbXB0ICgjMTQ0NyksIHNvIGFuIHVucmVhZGFibGUgcHJvbXB0IG5vdyBsZWF2ZXMgdGhlCiAqIGdhdGUgZXhhY3RseSBhcyBwcm9tcHQtcmVtaW5kZXIgc2V0IGl0IHJhdGhlciB0aGFuIHNpbGVudGx5IGRpc2FybWluZyBpdC4KICovCmZ1bmN0aW9uIGlzQ29udGludWF0aW9uUHJvbXB0KHByb21wdFRleHQpIHsKICB2YXIgdCA9IChwcm9tcHRUZXh0IHx8ICcnKS50cmltKCk7CiAgaWYgKCF0KSByZXR1cm4gdHJ1ZTsKICAvLyBTdWJ0cmFjdCBjb250aW51YXRpb24gd29yZHMsIHRoZW4gZXZlcnkgbm9uLWFscGhhbnVtZXJpYyBjaGFyYWN0ZXIuIFdoYXQKICAvLyByZW1haW5zIGlzIHRoZSBwcm9tcHQncyBhY3R1YWwgc3ViamVjdCBtYXR0ZXI7IG5vdGhpbmcgcmVtYWluaW5nIG1lYW5zIHRoZQogIC8vIHByb21wdCBpbnRyb2R1Y2VkIG5vIG5ldyBzdWJqZWN0LgogIC8vIGBccHtMfVxwe059YCB3aXRoIC91LCBOT1QgYEEtWmEtejAtOWA6IGFuIEFTQ0lJLW9ubHkgY2xhc3Mgc3RyaXBzIGV2ZXJ5CiAgLy8gY2hhcmFjdGVyIG9mIGEgQ0pLLCBDeXJpbGxpYywgQXJhYmljLCBIZWJyZXcsIEdyZWVrIG9yIFRoYWkgcHJvbXB0IOKAlCBhbmQKICAvLyBtb3N0IG9mIGFuIGFjY2VudGVkIEZyZW5jaCBvciBTcGFuaXNoIG9uZSDigJQgbGVhdmluZyBub3RoaW5nLCBzbyBhCiAgLy8gc3Vic3RhbnRpdmUgbm9uLUVuZ2xpc2ggcmVxdWVzdCB3b3VsZCBzY29yZSBhcyBwdXJlIGZpbGxlciBhbmQgc2lsZW50bHkKICAvLyBkaXNhcm0gdGhlIGdhdGUuIFN0cmlwcGluZyBvbmx5IHdoYXQgaXMgbmVpdGhlciBsZXR0ZXIgbm9yIG51bWJlciBrZWVwcwogIC8vIGV2ZXJ5IHNjcmlwdCdzIGNvbnRlbnQgaW50YWN0IGFuZCByZW1vdmVzIGp1c3QgcHVuY3R1YXRpb24gYW5kIHNwYWNpbmcuCiAgdmFyIHJlc3QgPSB0LnJlcGxhY2UoQ09OVElOVUFUSU9OX1dPUkRfUkUsICcgJykucmVwbGFjZSgvW15ccHtMfVxwe059XSsvZ3UsICcgJykudHJpbSgpOwogIHJldHVybiByZXN0Lmxlbmd0aCA9PT0gMDsKfQoKLy8gTmFtZXNwYWNlIGNsYXNzaWZpY2F0aW9uICgjOTMxKS4gVGhlIGhpbnQgdXNlZCB0byBiZSBlbWl0dGVkIG9uIGV2ZXJ5IHByb21wdAovLyBieSBwcm9tcHQtaG9vay5tanMgd2hpY2ggY29zdCB+NDAgdG9rZW5zIMOXIGV2ZXJ5IHByb21wdCDDlyBldmVyeSBjb25zdW1lci4KLy8gTm93IHdlIGNsYXNzaWZ5IGhlcmUsIHN0b3JlIG9uIHdvcmtmbG93LXN0YXRlLCBhbmQgbGV0IGNoZWNrLWJlZm9yZS1hZ2VudAovLyBlbWl0IGl0IG9uY2Ugd2hlbiBDbGF1ZGUgaXMgYWN0dWFsbHkgYWJvdXQgdG8gc3Bhd24gYW4gYWdlbnQuCi8vCi8vIFNZTkM6IHRoZXNlIHJlZ2V4ZXMgKyBjbGFzc2lmeU5hbWVzcGFjZUhpbnQgKyBhcHBseVByb21wdFN0YXRlUmVzZXQgYXJlCi8vIGR1cGxpY2F0ZWQgdmVyYmF0aW0gaW4gc3JjL2NsaS9pbml0L2hlbHBlcnMtZ2VuZXJhdG9yLnRzICh0aGUgZW1iZWRkZWQKLy8gZ2F0ZS5janMgZmFsbGJhY2sgdXNlZCBieSBgZmxvIGluaXRgIHdoZW4gc291cmNlIGhlbHBlcnMgY2FuJ3QgYmUgbG9jYXRlZCkuCi8vIEFueSBlZGl0IHRvIGVpdGhlciBjb3B5IE1VU1QgYmUgYXBwbGllZCB0byBib3RoIOKAlCB0aGVyZSBpcyBubyBzaGFyZWQgbW9kdWxlCi8vIGJlY2F1c2UgaGVscGVycy1nZW5lcmF0b3IgZW1pdHMgYSBzZWxmLWNvbnRhaW5lZCBzdHJpbmcgdGVtcGxhdGUuCnZhciBOU19MRUFSTklOR1NfUkUgPSAvXGIocmVtZW1iZXJ8cmVjYWxsfGluc2lnaHR8bGVzc29uIGxlYXJuZWR8Z290Y2hhfHBvc3QuP21vcnRlbSlcYnx3ZSAoZGVjaWR8YWdyZWV8Y2hvc2V8c2FpZCkvOwp2YXIgTlNfVEVTVF9SRSA9IC9cYih0ZXN0fHNwZWN8Y292ZXJhZ2V8dGVzdGVkfHRlc3QgY2FzZXx0ZXN0IGNhc2VzfHRlc3RzIGZvcnxzcGVjIGZvcilcYi87CnZhciBOU19FWFBMSUNJVCA9IFsKICB7IHBhdHRlcm46IC9cYihwYXR0ZXJufGNvbnZlbnRpb258YmVzdCBwcmFjdGljZXxzdHlsZXxjb2RpbmcgcnVsZSlcYi8sIG5zOiAncGF0dGVybnMnLCBsYWJlbDogJ2NvZGUgcGF0dGVybnMgYW5kIGNvbnZlbnRpb25zJyB9LAogIHsgcGF0dGVybjogL1xiKGNvZGUuP21hcHxmaWxlIHN0cnVjdHVyZXxwcm9qZWN0IHN0cnVjdHVyZXxkaXJlY3RvcnkpXGIvLCBuczogJ2NvZGUtbWFwJywgbGFiZWw6ICdjb2RlYmFzZSBuYXZpZ2F0aW9uJyB9LApdOwp2YXIgTlNfUEFUVEVSTl9SRVMgPSBbL1xiKHRlbXBsYXRlfGV4YW1wbGV8c2ltaWxhciB0b3xob3cgZG8gd2V8aG93IHNob3VsZClcYi9dOwp2YXIgTlNfRE9NQUlOX1JFUyA9IFsKICAvXGIoZ3VpZGFuY2V8Z3VpZGV8ZG9jc3xkb2N1bWVudGF0aW9ufHJ1bGVzfGhvdy10bylcYi8sCiAgL1xiKGFyY2hpdGVjdHVyZXxkZXNpZ258ZG9tYWlufHRlbmFudHxtaWdyYXR8c2NoZW1hfGRlcGxveSkvLAogIC9cYihydWxlfHJlcXVpcmVtZW50fGNvbnN0cmFpbnR8Y29tcGxpYW5jZSlcYi8sCl07CnZhciBOU19OQVZfUkVTID0gWwogIC9cYihmaW5kfHdoZXJlfHdoaWNoIGZpbGV8bG9vayB1cHxsb2NhdGV8ZW5kcG9pbnR8cm91dGV8dXJsfHBhdGgpXGIvLAogIC9cYihjbGFzc3xmdW5jdGlvbnxtZXRob2R8Y29tcG9uZW50fHNlcnZpY2V8ZW50aXR5fG1vZHVsZSlcYi8sCl07CgovLyBEZXRlY3Qgd2hldGhlciB0aGUgY3VycmVudCBwcm9tcHQgaW52b2tlZCAvZmwgb3IgL2ZsbyB3aXRoIGEgc3dhcm0vaGl2ZSBmbGFnICgjOTUyKS4KLy8gV2hlbiBzZXQsIGNoZWNrLWJlZm9yZS1hZ2VudCBCTE9DS1MgdGhlIEFnZW50IHNwYXduIHVudGlsIHRoZSBtYXRjaGluZyBNQ1AgaW5pdAovLyAobWNwX19tb2Zsb19fc3dhcm1faW5pdCBvciBtY3BfX21vZmxvX19oaXZlLW1pbmRfaW5pdCkgaGFzIGJlZW4gcmVjb3JkZWQg4oCUIHRoZSB1c2VyCi8vIGV4cGxpY2l0bHkgb3B0ZWQgaW4gdG8gdGhlIHByb3RlY3RlZCBjb29yZGluYXRpb24gc3VyZmFjZSwgc28gZmFsbGluZyBiYWNrIHRvCi8vIHJhdyBBZ2VudCBkaXNwYXRjaCBzaWxlbnRseSByZWdyZXNzZXMgaGVhZGxpbmUgbW9mbG8gcHJvZHVjdCBjYXBhYmlsaXR5LgovLwovLyBUaGlzIGZpbGUgaXMgdGhlIHNpbmdsZSBzb3VyY2U7ICMxNDQzIHJlcGxhY2VkIGhlbHBlcnMtZ2VuZXJhdG9yLnRzJ3MKLy8gaGFuZC1tYWludGFpbmVkIGNvcHkgd2l0aCBhIGJ1aWxkLXRpbWUgZW1iZWQgb2YgdGhpcyBleGFjdCBmaWxlLCBzbyB0aGVyZSBpcwovLyBubyBsb25nZXIgYSBzZWNvbmQgY29weSBvZiB0aGlzIGZ1bmN0aW9uIHRvIGtlZXAgaW4gc3RlcC4KZnVuY3Rpb24gZGV0ZWN0RmxNb2RlKHByb21wdFRleHQpIHsKICB2YXIgcCA9IHByb21wdFRleHQgfHwgJyc7CiAgaWYgKCEvXlxzKlwvKD86Zmx8ZmxvKVxiL2kudGVzdChwKSkgcmV0dXJuIG51bGw7CiAgaWYgKC8oPzpefFxzKSg/Oi1zfC0tc3dhcm0pXGIvLnRlc3QocCkpIHJldHVybiAnc3dhcm0nOwogIGlmICgvKD86XnxccykoPzotaHwtLWhpdmUpXGIvLnRlc3QocCkpIHJldHVybiAnaGl2ZSc7CiAgcmV0dXJuIG51bGw7Cn0KCi8vIFJlc29sdmUgdGhlIEZVTEwgc2V0IG9mIC9mbG8gcnVuIG1vZGlmaWVycyBmcm9tIHRoZSBwcm9tcHQgKyBtb2Zsby55YW1sIOKAlCB0aGUKLy8gc2luZ2xlIHNvdXJjZSBvZiB0cnV0aCBmb3IgYm90aCBnYXRlIGFybWluZyAoIzEyOTcpIGFuZCB0aGUgYXV0aG9yaXRhdGl2ZQovLyBhbm5vdW5jZW1lbnQgZW1pdHRlZCBieSBwcm9tcHQtcmVtaW5kZXIuIFR3byBjb25zdW1lcnMsIG9uZSByZXNvbHZlcjogYSBzZWNvbmQKLy8gaW1wbGVtZW50YXRpb24gaXMgZXhhY3RseSBob3cgYHNkZC5kZWZhdWx0OiB0cnVlYCBnb3Qgc2lsZW50bHkgaWdub3JlZCAodGhlCi8vIHNraWxsJ3MgcHJvbXB0IGNhcnJpZWQgYGxldCBzZGRNb2RlID0gZmFsc2VgIGFuZCB0aGUgbW9kZWwgZXhlY3V0ZWQgdGhlIGxpdGVyYWwpLgovLwovLyBQcmVjZWRlbmNlIHBlciBrZXk6IGV4cGxpY2l0IC0tbm8tWCA+IGV4cGxpY2l0IC14Ly0tWCA+IG1vZmxvLnlhbWwgPiBidWlsdC1pbi4KLy8gTk9URSB0aGUgZGlmZmVyaW5nIGJ1aWx0LWluIGRlZmF1bHRzOiBzZGQgaXMgb3B0LUlOIChmYWxzZSksIHZlcmlmeSBpcyBvcHQtT1VUCi8vICh0cnVlLCAjMTI5NCksIG1lcmdlIGlzIG9wdC1JTiAoZmFsc2UsICMxMjg1KS4KLy8KLy8gYC1zZGAgaXMgYSBkaXN0aW5jdCB0b2tlbiBmcm9tIGAtc2AgKHN3YXJtKTogdGhlIGBkYCBzaXRzIG9uIHRoZSB3b3JkIGJvdW5kYXJ5Ci8vIHNvIGAtc1xiYCBuZXZlciBtYXRjaGVzIGAtc2RgLgpmdW5jdGlvbiByZXNvbHZlRmxvUnVuKHByb21wdFRleHQpIHsKICB2YXIgcCA9IHByb21wdFRleHQgfHwgJyc7CiAgdmFyIG91dCA9IHsgaXNGbG86IGZhbHNlLCB3b3JrZmxvdzogJ2Z1bGwnLCBzZGQ6IGZhbHNlLCB2ZXJpZnk6IGZhbHNlLCBtZXJnZTogZmFsc2UsCiAgICAgICAgICAgICAgc2RkU3JjOiAnZGVmYXVsdCcsIHZlcmlmeVNyYzogJ2RlZmF1bHQnLCBtZXJnZVNyYzogJ2RlZmF1bHQnIH07CiAgaWYgKCEvXlxzKlwvKD86Zmx8ZmxvKVxiL2kudGVzdChwKSkgcmV0dXJuIG91dDsKICBvdXQuaXNGbG8gPSB0cnVlOwoKICAvLyBXb3JrZmxvdyBtb2RlIOKAlCBkZWNpZGVzIHdoaWNoIG1vZGlmaWVycyBhcmUgZXZlbiBhcHBsaWNhYmxlLgogIGlmICgvKD86XnxccykoPzotd2Z8LS13b3JrZmxvdylcYi8udGVzdChwKSkgb3V0LndvcmtmbG93ID0gJ3NwZWxsLWVuZ2luZSc7CiAgZWxzZSBpZiAoLyg/Ol58XHMpKD86LXJ8LS1yZXNlYXJjaClcYi8udGVzdChwKSkgb3V0LndvcmtmbG93ID0gJ3Jlc2VhcmNoJzsKICBlbHNlIGlmICgvKD86XnxccykoPzotdHwtLXRpY2tldClcYi8udGVzdChwKSkgb3V0LndvcmtmbG93ID0gJ3RpY2tldCc7CiAgdmFyIGVwaWNCcmFuY2ggPSAvKD86XnxccyktLWVwaWMtYnJhbmNoXGIvLnRlc3QocCk7CgogIGlmICgvKD86XnxccyktLW5vLXNkZFxiLy50ZXN0KHApKSB7IG91dC5zZGQgPSBmYWxzZTsgb3V0LnNkZFNyYyA9ICdmbGFnJzsgfQogIGVsc2UgaWYgKC8oPzpefFxzKSg/Oi1zZHwtLXNkZClcYi8udGVzdChwKSkgeyBvdXQuc2RkID0gdHJ1ZTsgb3V0LnNkZFNyYyA9ICdmbGFnJzsgfQogIGVsc2UgaWYgKHNkZENvbmYuZGVmYXVsdCkgeyBvdXQuc2RkID0gdHJ1ZTsgb3V0LnNkZFNyYyA9ICdtb2Zsby55YW1sIHNkZC5kZWZhdWx0JzsgfQoKICBpZiAoLyg/Ol58XHMpLS1uby12ZXJpZnlcYi8udGVzdChwKSkgeyBvdXQudmVyaWZ5ID0gZmFsc2U7IG91dC52ZXJpZnlTcmMgPSAnZmxhZyc7IH0KICBlbHNlIGlmICgvKD86XnxccykoPzotdnwtLXZlcmlmeSlcYi8udGVzdChwKSkgeyBvdXQudmVyaWZ5ID0gdHJ1ZTsgb3V0LnZlcmlmeVNyYyA9ICdmbGFnJzsgfQogIGVsc2UgaWYgKCFjb25maWcudmVyaWZ5X2JlZm9yZV9kb25lKSB7IG91dC52ZXJpZnkgPSBmYWxzZTsgb3V0LnZlcmlmeVNyYyA9ICdtb2Zsby55YW1sIGdhdGVzLnZlcmlmeV9iZWZvcmVfZG9uZSc7IH0KICBlbHNlIHsgb3V0LnZlcmlmeSA9IHRydWU7IG91dC52ZXJpZnlTcmMgPSAnZGVmYXVsdCc7IH0KICAvLyAtLXNkZCBpbXBsaWVzIC0tdmVyaWZ5OiBhIHNwZWMvcGxhbiB3aXRob3V0IGFuIGVuZm9yY2VkIHZlcmlmeSBzdGVwIGRyaWZ0cy4KICBpZiAob3V0LnNkZCAmJiAhb3V0LnZlcmlmeSAmJiBvdXQudmVyaWZ5U3JjICE9PSAnZmxhZycpIG91dC52ZXJpZnkgPSB0cnVlOwoKICBpZiAoLyg/Ol58XHMpLS1uby1tZXJnZVxiLy50ZXN0KHApKSB7IG91dC5tZXJnZSA9IGZhbHNlOyBvdXQubWVyZ2VTcmMgPSAnZmxhZyc7IH0KICBlbHNlIGlmICgvKD86XnxccykoPzotbXwtLW1lcmdlKVxiLy50ZXN0KHApKSB7IG91dC5tZXJnZSA9IHRydWU7IG91dC5tZXJnZVNyYyA9ICdmbGFnJzsgfQogIGVsc2UgaWYgKG1lcmdlQ29uZi5hdXRvKSB7IG91dC5tZXJnZSA9IHRydWU7IG91dC5tZXJnZVNyYyA9ICdtb2Zsby55YW1sIG1lcmdlLmF1dG8nOyB9CgogIC8vIEFwcGxpY2FiaWxpdHk6IC10Ly1yIG5ldmVyIGltcGxlbWVudCwgc28gdmVyaWZ5IGlzIGEgbm8tb3AgdGhlcmU7IC1yIHByb2R1Y2VzCiAgLy8gbm8gYXJ0aWZhY3RzLCBzbyBzZGQgaXMgYSBuby1vcCB0b28gKGluIC10IHRoZSBzcGVjL3BsYW4gZ29lcyBJTlRPIHRoZSB0aWNrZXQsCiAgLy8gc28gc2RkIHN0YXlzIG9uKS4gT25seSBhIGZ1bGwgbm9uLWVwaWMtYnJhbmNoIHJ1biBvcGVucyBhIFBSIHRvIG1lcmdlLgogIC8vIFJlLWF0dHJpYnV0ZSBhbnl0aGluZyBhcHBsaWNhYmlsaXR5IHR1cm5lZCBvZmYsIHNvIGEgZmFsc2UgbmV2ZXIgY2FycmllcyB0aGUKICAvLyBzb3VyY2Ugb2YgdGhlIHZhbHVlIGl0IG5vIGxvbmdlciBoYXMuIFRoaXMgd2hvbGUgY2hhbmdlIGV4aXN0cyB0byBzdG9wIG1vZGVzCiAgLy8gYmVpbmcgcmVwb3J0ZWQgaW5hY2N1cmF0ZWx5IOKAlCB0aGUgYXR0cmlidXRpb24gaGFzIHRvIGJlIGhvbmVzdCB0b28uCiAgaWYgKG91dC53b3JrZmxvdyA9PT0gJ3RpY2tldCcgfHwgb3V0LndvcmtmbG93ID09PSAncmVzZWFyY2gnKSB7CiAgICBpZiAob3V0LnZlcmlmeSkgb3V0LnZlcmlmeVNyYyA9IG91dC53b3JrZmxvdyArICcgbW9kZSBkb2VzIG5vdCBpbXBsZW1lbnQnOwogICAgb3V0LnZlcmlmeSA9IGZhbHNlOwogIH0KICBpZiAob3V0LndvcmtmbG93ID09PSAncmVzZWFyY2gnIHx8IG91dC53b3JrZmxvdyA9PT0gJ3NwZWxsLWVuZ2luZScpIHsKICAgIGlmIChvdXQuc2RkKSBvdXQuc2RkU3JjID0gb3V0LndvcmtmbG93ICsgJyBtb2RlIHByb2R1Y2VzIG5vIHNwZWMgYXJ0aWZhY3RzJzsKICAgIG91dC5zZGQgPSBmYWxzZTsKICB9CiAgaWYgKG91dC53b3JrZmxvdyAhPT0gJ2Z1bGwnIHx8IGVwaWNCcmFuY2gpIHsKICAgIGlmIChvdXQubWVyZ2UpIG91dC5tZXJnZVNyYyA9IGVwaWNCcmFuY2ggPyAnLS1lcGljLWJyYW5jaCBvd25zIG1lcmdpbmcnIDogb3V0LndvcmtmbG93ICsgJyBtb2RlIG9wZW5zIG5vIFBSJzsKICAgIG91dC5tZXJnZSA9IGZhbHNlOwogIH0KICByZXR1cm4gb3V0Owp9CgovLyAjMTI5NyDigJQgYXJtIHRoZSBTREQgaW1wbGVtZW50IGdhdGUgZnJvbSB0aGUgdXNlciBwcm9tcHQuIFRoaW4gd3JhcHBlciBzbyB0aGUKLy8gYXJtaW5nIGRlY2lzaW9uIGFuZCB0aGUgYW5ub3VuY2VkIGRlY2lzaW9uIGNhbiBuZXZlciBkaXNhZ3JlZS4KZnVuY3Rpb24gZGV0ZWN0U2RkTW9kZShwcm9tcHRUZXh0KSB7CiAgcmV0dXJuIHJlc29sdmVGbG9SdW4ocHJvbXB0VGV4dCkuc2RkOwp9CgovLyBSZXNvbHZlIHRoZSBhYnNvbHV0ZSBzcGVjcyByb290IHRoZSBzYW1lIHdheSBUUyBzcGVjc1Jvb3QgZG9lcyAoIzEyOTQpOiBzcGxpdAovLyB0aGUgLy13cml0dGVuIGNvbmZpZyB2YWx1ZSBvbiBlaXRoZXIgc2VwYXJhdG9yLCByZWplY3QgYWJzb2x1dGUvYC4uYC1lc2NhcGluZwovLyB2YWx1ZXMsIGFuZCBmYWxsIGJhY2sgdG8gdGhlIGdpdGlnbm9yZWQgZGVmYXVsdC4gUnVsZSAjMTogbm8gc2VwYXJhdG9yIGhhcmRjb2RlZC4KZnVuY3Rpb24gc2RkU3BlY3NSb290QWJzKCkgewogIHZhciBjb25maWd1cmVkID0gKHNkZENvbmYuc3BlY3NEaXIgfHwgJy5tb2Zsby9zcGVjcycpOwogIHZhciBzZWdtZW50cyA9IGNvbmZpZ3VyZWQuc3BsaXQoL1tcXC9dKy8pLmZpbHRlcihCb29sZWFuKTsKICB2YXIgZXNjYXBlcyA9IHNlZ21lbnRzLmxlbmd0aCA9PT0gMAogICAgfHwgc2VnbWVudHMuaW5kZXhPZignLi4nKSA+PSAwCiAgICB8fCAvXihbYS16QS1aXTp8fikkLy50ZXN0KHNlZ21lbnRzWzBdKQogICAgfHwgY29uZmlndXJlZC5jaGFyQXQoMCkgPT09ICcvJwogICAgfHwgY29uZmlndXJlZC5jaGFyQXQoMCkgPT09ICdcXCc7CiAgaWYgKGVzY2FwZXMpIHJldHVybiBwYXRoLmpvaW4oUFJPSkVDVF9ESVIsICcubW9mbG8nLCAnc3BlY3MnKTsKICByZXR1cm4gcGF0aC5qb2luLmFwcGx5KHBhdGgsIFtQUk9KRUNUX0RJUl0uY29uY2F0KHNlZ21lbnRzKSk7Cn0KCi8vIElzIHRoZSBlZGl0ZWQgcGF0aCBpbnNpZGUgdGhlIHNwZWNzIGRpcj8gRWRpdGluZyBzcGVjLm1kL3BsYW4ubWQgdGhlbXNlbHZlcyBtdXN0Ci8vIG5ldmVyIHRyaXAgdGhlIGltcGxlbWVudCBnYXRlLiBDb21wYXJlcyByZXNvbHZlZCBhYnNvbHV0ZSBwYXRocyAoUnVsZSAjMTogdGhlCi8vIGVkaXQgcGF0aCBtYXkgYmUgcmVsYXRpdmUgb3IgYWJzb2x1dGU7IG5vcm1hbGl6ZSBib3RoIGJlZm9yZSB0aGUgcHJlZml4IHRlc3QpLgpmdW5jdGlvbiBpc0luc2lkZVNwZWNzRGlyKGZpbGVQYXRoKSB7CiAgdHJ5IHsKICAgIHZhciByb290ID0gc2RkU3BlY3NSb290QWJzKCk7CiAgICB2YXIgYWJzID0gcGF0aC5pc0Fic29sdXRlKGZpbGVQYXRoKSA/IGZpbGVQYXRoIDogcGF0aC5yZXNvbHZlKFBST0pFQ1RfRElSLCBmaWxlUGF0aCk7CiAgICB2YXIgcmVsID0gcGF0aC5yZWxhdGl2ZShyb290LCBhYnMpOwogICAgcmV0dXJuIHJlbCA9PT0gJycgfHwgKCFyZWwuc3RhcnRzV2l0aCgnLi4nKSAmJiAhcGF0aC5pc0Fic29sdXRlKHJlbCkpOwogIH0gY2F0Y2ggKGUpIHsgcmV0dXJuIGZhbHNlOyB9Cn0KCi8vIFJlYWQgcGxhbi5tZCBmcm9udG1hdHRlciBmb3IgdGhlIGFjdGl2ZSBzbHVnIGFuZCByZXBvcnQgd2hldGhlciBpdCBpcyByZXZpZXdlZC4KLy8gUHVyZSBmcyArIHJlZ2V4IChubyBzcGF3bikgc28gaXQgc3RheXMgY2hlYXAgb24gZXZlcnkgV3JpdGUvRWRpdC4gTWF0Y2hlcyB0aGUKLy8gZG91YmxlLXF1b3RlZCBzY2FsYXIgc2VyaWFsaXplQXJ0aWZhY3QgZW1pdHMgKGBzdGF0dXM6ICJyZXZpZXdlZCJgKS4KZnVuY3Rpb24gaXNQbGFuUmV2aWV3ZWQoc2x1ZykgewogIHRyeSB7CiAgICB2YXIgcGxhblBhdGggPSBwYXRoLmpvaW4oc2RkU3BlY3NSb290QWJzKCksIHNsdWcsICdwbGFuLm1kJyk7CiAgICBpZiAoIWZzLmV4aXN0c1N5bmMocGxhblBhdGgpKSByZXR1cm4gZmFsc2U7CiAgICB2YXIgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhwbGFuUGF0aCwgJ3V0Zi04JykucmVwbGFjZSgvXHJcbi9nLCAnXG4nKTsKICAgIHZhciBmbSA9IGNvbnRlbnQubWF0Y2goL14tLS1cbihbXHNcU10qPylcbi0tLS8pOwogICAgaWYgKCFmbSkgcmV0dXJuIGZhbHNlOwogICAgcmV0dXJuIC9eXHMqc3RhdHVzOlxzKlsiJ10/cmV2aWV3ZWRbIiddP1xzKiQvaW0udGVzdChmbVsxXSk7CiAgfSBjYXRjaCAoZSkgeyByZXR1cm4gZmFsc2U7IH0KfQoKZnVuY3Rpb24gY2xhc3NpZnlOYW1lc3BhY2VIaW50KHByb21wdFRleHQpIHsKICB2YXIgbG93ZXIgPSAocHJvbXB0VGV4dCB8fCAnJykudG9Mb3dlckNhc2UoKTsKICBpZiAoTlNfVEVTVF9SRS50ZXN0KGxvd2VyKSkgcmV0dXJuICdNZW1vcnkgbmFtZXNwYWNlIGhpbnQ6IHVzZSAidGVzdHMiIGZvciB0ZXN0IGludmVudG9yeSBhbmQgY292ZXJhZ2UgbG9va3Vwcy4nOwogIGlmIChOU19MRUFSTklOR1NfUkUudGVzdChsb3dlcikpIHJldHVybiAnTWVtb3J5IG5hbWVzcGFjZSBoaW50OiB1c2UgImxlYXJuaW5ncyIgZm9yIHVzZXItZGlyZWN0ZWQgZGVjaXNpb25zIGFuZCBkaXN0aWxsZWQgaW5zaWdodHMuJzsKICBmb3IgKHZhciBpID0gMDsgaSA8IE5TX0VYUExJQ0lULmxlbmd0aDsgaSsrKSB7CiAgICBpZiAoTlNfRVhQTElDSVRbaV0ucGF0dGVybi50ZXN0KGxvd2VyKSkgcmV0dXJuICdNZW1vcnkgbmFtZXNwYWNlIGhpbnQ6IHVzZSAiJyArIE5TX0VYUExJQ0lUW2ldLm5zICsgJyIgZm9yICcgKyBOU19FWFBMSUNJVFtpXS5sYWJlbCArICcuJzsKICB9CiAgZm9yICh2YXIgaiA9IDA7IGogPCBOU19ET01BSU5fUkVTLmxlbmd0aDsgaisrKSB7CiAgICBpZiAoTlNfRE9NQUlOX1JFU1tqXS50ZXN0KGxvd2VyKSkgcmV0dXJuICdNZW1vcnkgbmFtZXNwYWNlIGhpbnQ6IHNlYXJjaCAiZ3VpZGFuY2UiIGFuZCAibGVhcm5pbmdzIiBmb3IgZG9tYWluIHJ1bGVzIGFuZCBwcm9qZWN0IGRlY2lzaW9ucy4nOwogIH0KICBmb3IgKHZhciBrID0gMDsgayA8IE5TX1BBVFRFUk5fUkVTLmxlbmd0aDsgaysrKSB7CiAgICBpZiAoTlNfUEFUVEVSTl9SRVNba10udGVzdChsb3dlcikpIHJldHVybiAnTWVtb3J5IG5hbWVzcGFjZSBoaW50OiB1c2UgInBhdHRlcm5zIiBmb3IgY29kZSBwYXR0ZXJucyBhbmQgY29udmVudGlvbnMuJzsKICB9CiAgZm9yICh2YXIgbSA9IDA7IG0gPCBOU19OQVZfUkVTLmxlbmd0aDsgbSsrKSB7CiAgICBpZiAoTlNfTkFWX1JFU1ttXS50ZXN0KGxvd2VyKSkgcmV0dXJuICdNZW1vcnkgbmFtZXNwYWNlIGhpbnQ6IHVzZSAiY29kZS1tYXAiIGZvciBjb2RlYmFzZSBuYXZpZ2F0aW9uLic7CiAgfQogIHJldHVybiAnJzsKfQoKLy8gIzExMzIg4oCUIGNvbW1hbmQtc2hhcGUgbmFtZXNwYWNlIGNsYXNzaWZpZXIgZm9yIHRoZSBiYXNoLUJMT0NLIG1lc3NhZ2UuCi8vIFVzZWQgd2hlbiB0aGUgcHJvbXB0LWRlcml2ZWQgYGxhc3ROYW1lc3BhY2VIaW50YCBpcyBlbXB0eSAoZS5nLiBzdWJhZ2VudHMsCi8vIHdoaWNoIG5ldmVyIHNlZSB0aGUgdXNlciBwcm9tcHQpIHNvIHRoZSBibG9jayBtZXNzYWdlIHN0aWxsIHJvdXRlcyB0byBhCi8vIHVzZWZ1bCBuYW1lc3BhY2UgcmF0aGVyIHRoYW4gdGhlIGdlbmVyaWMgInBpY2sgb25lIG9mIGZpdmUiIGxpc3QuIFJldHVybnMgYQovLyBmdWxsIHNlbnRlbmNlIGluIHRoZSBzYW1lIHNoYXBlIGFzIGNsYXNzaWZ5TmFtZXNwYWNlSGludCBzbyB0aGUgQkxPQ0sgYXJtCi8vIGNhbiB3cml0ZSBlaXRoZXIgc291cmNlJ3MgaGludCB3aXRob3V0IGJyYW5jaGluZyBvbiBmb3JtYXQuCi8vCi8vIFRoaXMgZmlsZSBpcyB0aGUgc2luZ2xlIHNvdXJjZSDigJQgc2VlIHRoZSBub3RlIG9uIGRldGVjdEZsTW9kZSBhYm92ZSAoIzE0NDMpLgpmdW5jdGlvbiBjbGFzc2lmeUJhc2hOYW1lc3BhY2VIaW50KGNtZCkgewogIC8vIFNlYXJjaC1saWtlIHRvb2xzIOKAlCB0aGUgdXNlciBpcyBodW50aW5nIGZvciBhIHN5bWJvbC9maWxlLCBjb2RlLW1hcCB3aW5zLgogIC8vICMxNDQ1IOKAlCBgZ2l0IGdyZXBgIC8gYGdpdCBscy1maWxlc2AgYXJlIHRoZSBzYW1lIGh1bnQgdGhyb3VnaCBhIGRpZmZlcmVudAogIC8vIGJpbmFyeSwgc28gdGhleSByb3V0ZSB0byB0aGUgc2FtZSBuYW1lc3BhY2UgcmF0aGVyIHRoYW4gZmFsbGluZyB0aHJvdWdoIHRvCiAgLy8gdGhlIGhpbnRsZXNzIGdlbmVyaWMgbWVzc2FnZS4KICBpZiAoL15ccyooPzpncmVwfHJnfGFnfGZncmVwfGVncmVwfGZpbmR8ZmR8U2VsZWN0LVN0cmluZ3xzbHMpXGIvaS50ZXN0KGNtZCkKICAgfHwgL15ccypnaXRccysoPzpncmVwfGxzLWZpbGVzKVxiL2kudGVzdChjbWQpKSB7CiAgICByZXR1cm4gJ01lbW9yeSBuYW1lc3BhY2UgaGludDogdXNlICJjb2RlLW1hcCIgZm9yIGNvZGViYXNlIG5hdmlnYXRpb24uJzsKICB9CiAgLy8gUmVhZGluZyBhIC5tZCAvIFJTVCAvIFRYVCwgb3IgYSB3ZWxsLWtub3duIGRvYyBmaWxlIOKAlCBndWlkYW5jZS9sZWFybmluZ3Mgd2luLgogIC8vIGAuKmAgKG5vdCBgXFMqYCkgc28gZmxhZy1wcmVmaXhlZCBmb3JtcyBsaWtlIGBoZWFkIC01MCBSRUFETUUubWRgIG1hdGNoLgogIC8vIEFuY2hvcmVkIG9uIHRoZSBsZWFkaW5nIHJlYWRlciBzbyBhIHBpcGVkIGBjbWQgfCBncmVwIGZvby5tZGAgZG9lc24ndCB0cmlwLgogIGlmICgvXlxzKig/OmNhdHxoZWFkfHRhaWx8bGVzc3xtb3JlfGJhdHx0eXBlfEdldC1Db250ZW50fGdjKVxiLipcLig/Om1kfG1keHxyc3R8dHh0KVxiL2kudGVzdChjbWQpCiAgIHx8IC9eXHMqKD86Y2F0fGhlYWR8dGFpbHxsZXNzfG1vcmV8YmF0fHR5cGV8R2V0LUNvbnRlbnR8Z2MpXGIuKlxiKD86UkVBRE1FfENMQVVERXxDSEFOR0VMT0d8Q09OVFJJQlVUSU5HfExJQ0VOU0UpXGIvaS50ZXN0KGNtZCkpIHsKICAgIHJldHVybiAnTWVtb3J5IG5hbWVzcGFjZSBoaW50OiBzZWFyY2ggImd1aWRhbmNlIiBhbmQgImxlYXJuaW5ncyIgZm9yIHByb2plY3QgcnVsZXMgYW5kIGRlY2lzaW9ucy4nOwogIH0KICByZXR1cm4gJyc7Cn0KCi8vIEFwcGx5IHBlci1wcm9tcHQgc3RhdGUgcmVzZXQgc2hhcmVkIGJ5IGBwcm9tcHQtcmVtaW5kZXJgIChmdWxsKSBhbmQKLy8gYHByb21wdC1zdGF0ZS1yZXNldGAgKGRlZmVuc2l2ZSBzYWZldHktbmV0LCBubyBlbWlzc2lvbikuIElkZW1wb3RlbnQg4oCUIGJvdGgKLy8gVXNlclByb21wdFN1Ym1pdCBob29rcyBjYW4gcnVuIGl0IHdpdGhvdXQgY29tcG91bmRpbmcgYW55IGZpZWxkLiBDYWxsZXIKLy8gb3ducyBpbnRlcmFjdGlvbkNvdW50IGFuZCB0aGUgdXNlci12aXNpYmxlIFJFTUlOREVSL0NvbnRleHQgZW1pc3Npb25zLCBzbwovLyB0aGlzIGhlbHBlciBzdGF5cyBzaWxlbnQuCmZ1bmN0aW9uIGFwcGx5UHJvbXB0U3RhdGVSZXNldChzdGF0ZSwgcHJvbXB0VGV4dCwgb3B0cykgewogIC8vICMzNTIvIzEzMzEg4oCUIHRoaXMgaXMgdGhlIE9OTFkgcGxhY2UgdGhlIG1lbW9yeSBnYXRlIHJlc2V0cy4gRGVsaWJlcmF0ZWx5CiAgLy8gTk9UIG9uIHRhc2sgdHJhbnNpdGlvbnM6IHdpdGhpbiBhIHNpbmdsZSBwcm9tcHQgKGUuZy4gYSAvZmxvIHdvcmtmbG93KQogIC8vIG1lbW9yeSBzdGF5cyBzZWFyY2hlZCBzbyBSZWFkL0dyZXAgYXJlbid0IGJsb2NrZWQgbWlkLWV4ZWN1dGlvbi4gQQogIC8vIGBUYXNrVXBkYXRlYC1kcml2ZW4gcmVzZXQgd291bGQgcmUtYmxvY2sgdGhlIGFnZW50IGhhbGZ3YXkgdGhyb3VnaCBpdHMgb3duCiAgLy8gd29ya2Zsb3cuIFRoZSByYXRpb25hbGUgdXNlZCB0byBsaXZlIG9uIHRoZSBgY2hlY2stdGFzay10cmFuc2l0aW9uYCBjYXNlLAogIC8vIHdoaWNoIGlzIHdoeSB0aGF0IGNhc2UgaXMgYW4gZW1wdHkgbm8tb3A7ICMxMzMxIHVud2lyZWQgdGhlIGhvb2sgYW5kIG1vdmVkCiAgLy8gdGhlIHJlYXNvbmluZyBoZXJlLCB3aGVyZSB0aGUgcmVzZXQgaXQgZGVzY3JpYmVzIGFjdHVhbGx5IGhhcHBlbnMuCiAgc3RhdGUubWVtb3J5U2VhcmNoZWQgPSBmYWxzZTsKICAvLyBXaXBlIHBlci1hY3RvciBtZW1vcnkgdHJhY2tpbmcgdG9vIOKAlCBhIG5ldyB1c2VyIHByb21wdCBpcyBhIGZyZXNoIHdpbmRvdwogIC8vIGZvciBib3RoIHBhcmVudCBBTkQgYW55IHN1YmFnZW50cyB0aGUgcGFyZW50IG1heSBzcGF3biBkdXJpbmcgdGhpcyB0dXJuLgogIHN0YXRlLm1lbW9yeVNlYXJjaGVkQnkgPSB7fTsKICAvLyBsZWFybmluZ3NTdG9yZWQgaXMgc2Vzc2lvbi1zY29wZWQg4oCUIG9uY2Ugc3RvcmVkLCBpdCBzdGF5cyB0cnVlIHVudGlsIHNlc3Npb24gcmVzZXQuCiAgLy8gUmVzZXR0aW5nIHBlci1wcm9tcHQgY2F1c2VkIGZhbHNlIGJsb2NrcyB3aGVuIFBSIGNyZWF0aW9uIHdhcyBvbiBhIGxhdGVyIHByb21wdC4KICAvLyAjMTQ0NyDigJQgYXJtIGJ5IERFRkFVTFQ7IGV4ZW1wdCBvbmx5IHByb21wdHMgdGhhdCBjYXJyeSBubyBzdWJqZWN0IG9mIHRoZWlyCiAgLy8gb3duLiBUaGlzIHJlcGxhY2VzIGBUQVNLX1JFLnRlc3QocCkgfHwgcC5sZW5ndGggPiAyMGAsIHdob3NlIGxlbmd0aCBjbGlmZgogIC8vIHdhcyBhcmJpdHJhcnkgYW5kIGludmlzaWJsZTogIm5vdyBsb29rIGF0IHRoZSBkYWVtb24iICgyMikgYXJtZWQgdGhlIGdhdGUKICAvLyBhbmQgImNoZWNrIHRoZSBkYWVtb24iICgxNikgZGlkIG5vdCwgd2hpY2ggaXMgbW9zdCBvZiB3aHkgdGhlIGdhdGUgZmVsdAogIC8vIGxpa2UgaXQgZmlyZWQgYXQgcmFuZG9tLiBNZW1vcnktZmlyc3QgaXMgdGhpcyBwcm9qZWN0J3MgZmlyc3QgcnVsZSwgc28gdGhlCiAgLy8gZGVmYXVsdCBoYXMgdG8gYmUgInNlYXJjaCIsIHdpdGggY29udGludWF0aW9ucyBhcyB0aGUgY2FydmUtb3V0IOKAlCBub3QgdGhlCiAgLy8gcmV2ZXJzZS4gVGhlIHBlci1wcm9tcHQgbGF0Y2ggYm91bmRzIHRoZSBjb3N0IGF0IG9uZSBzZWFyY2ggcGVyIG5ldyBwcm9tcHQuCiAgLy8KICAvLyBgb3B0cy5za2lwQXJtaW5nYCBzcGxpdHMgdGhlIHJlc2V0IGluIHR3by4gSW52YWxpZGF0aW5nIHRoZSBjcmVkaXRzIGFib3ZlCiAgLy8gaXMgcHJvbXB0LUlOREVQRU5ERU5UIGFuZCBhbHdheXMgY29ycmVjdDsgZGVjaWRpbmcgd2hldGhlciB0aGlzIHByb21wdAogIC8vIG5lZWRzIGEgc2VhcmNoIGlzIG5vdCwgYW5kIGEgY2FsbGVyIGhvbGRpbmcgbm8gcHJvbXB0IHRleHQgbXVzdCBub3QgZGVjaWRlCiAgLy8gaXQgZnJvbSBub3RoaW5nLiBTa2lwcGluZyB0aGUgd2hvbGUgcmVzZXQgaW5zdGVhZCB3b3VsZCBiZSB3b3JzZSB0aGFuCiAgLy8gZWl0aGVyOiBgbWVtb3J5U2VhcmNoZWRCeWAgd291bGQgc3Vydml2ZSwgYW5kIGEgc3RhbGUgcGVyLWFjdG9yIGNyZWRpdCBmcm9tCiAgLy8gdGhlIHByZXZpb3VzIHByb21wdCB3b3VsZCBzYXRpc2Z5IHRoZSBnYXRlIGZvciBhIHByb21wdCBpdCBuZXZlciBzYXcuCiAgaWYgKCEob3B0cyAmJiBvcHRzLnNraXBBcm1pbmcpKSB7CiAgICB2YXIgZXNjYXBlZCA9IC9eQEBccyovLnRlc3QocHJvbXB0VGV4dCB8fCAnJyk7CiAgICBzdGF0ZS5tZW1vcnlSZXF1aXJlZCA9ICFlc2NhcGVkICYmICFpc0NvbnRpbnVhdGlvblByb21wdChwcm9tcHRUZXh0KTsKICB9CiAgLy8gU3Rhc2ggbmFtZXNwYWNlIGhpbnQgZm9yIGNoZWNrLWJlZm9yZS1hZ2VudCB0byBlbWl0IHdoZW4gQ2xhdWRlIGFjdHVhbGx5CiAgLy8gc3Bhd25zIGFuIEFnZW50ICgjOTMxKS4gRW1wdHkgc3RyaW5nIHdoZW4gbm90aGluZyBtYXRjaGVkIOKAlCBvdmVyd3JpdGluZwogIC8vIGFueSBzdGFsZSB2YWx1ZSBmcm9tIHRoZSBwcmV2aW91cyBwcm9tcHQuCiAgc3RhdGUubGFzdE5hbWVzcGFjZUhpbnQgPSBjbGFzc2lmeU5hbWVzcGFjZUhpbnQocHJvbXB0VGV4dCk7CiAgLy8gUGVyLWFjdG9yIGVtaXNzaW9uIHRyYWNraW5nIOKAlCBlYWNoIHN1YmFnZW50J3Mgc2Vzc2lvbiBnZXRzIHRoZSBoaW50IGF0CiAgLy8gbW9zdCBvbmNlIHBlciBwcm9tcHQsIGJ1dCBhIGZyZXNoIHByb21wdCByZXNldHMgZXZlcnkgYWN0b3IncyB3aW5kb3cgc28KICAvLyBzdWJzZXF1ZW50IGFnZW50cyAocGFyZW50ICsgc3ViYWdlbnRzIHRoYXQgc3Bhd24gdGhlaXIgb3duIGFnZW50cykgYWxsCiAgLy8gc2VlIHRoZSBuZXcgY2xhc3NpZmljYXRpb24gb24gdGhlaXIgZmlyc3QgY2hlY2stYmVmb3JlLWFnZW50LgogIHN0YXRlLmxhc3ROYW1lc3BhY2VIaW50RW1pdHRlZEJ5ID0ge307CiAgLy8gIzk1MiDigJQgZGVyaXZlIGZsTW9kZSBmcm9tIHRoZSB1c2VyIHByb21wdCwgYW5kIHJlc2V0IHRoZSBtYXRjaGluZyBpbml0CiAgLy8gZmxhZy4gRWFjaCAvZmwgaW52b2NhdGlvbiBtdXN0IGNhbGwgaXRzIHByb3RlY3RlZCBNQ1AgaW5pdDsgdGhlIHByZXZpb3VzCiAgLy8gcHJvbXB0J3Mgc3dhcm0vaGl2ZSByZWdpc3RyYXRpb24gZG9lcyBub3Qgc2F0aXNmeSB0aGlzIHByb21wdCdzIGdhdGUuCiAgc3RhdGUuZmxNb2RlID0gZGV0ZWN0RmxNb2RlKHByb21wdFRleHQpOwogIHN0YXRlLnN3YXJtSW5pdGlhbGl6ZWQgPSBmYWxzZTsKICBzdGF0ZS5oaXZlSW5pdGlhbGl6ZWQgPSBmYWxzZTsKICAvLyAjMTI5NyDigJQgYXJtL2Rpc2FybSB0aGUgU0REIGltcGxlbWVudCBnYXRlIHBlciBwcm9tcHQuIEEgZnJlc2ggL2ZsbyBydW4gc3RhcnRzCiAgLy8gd2l0aCBubyBhY3RpdmUgc2x1ZzsgYGZsbyBzZGQgc3BlY2Agc3RhbXBzIGFjdGl2ZVNkZFNsdWcgZHVyaW5nIHRoZSBydW4uCiAgc3RhdGUuc2RkTW9kZSA9IGRldGVjdFNkZE1vZGUocHJvbXB0VGV4dCk7CiAgc3RhdGUuYWN0aXZlU2RkU2x1ZyA9IG51bGw7Cn0KLy8gTWF0Y2ggbnBtL3lhcm4vcG5wbS9idW4vdHVyYm8vbngvbGVybmEgdGVzdCwgbnB4IHZpdGVzdHxqZXN0fC4uLiwgYmFyZSBydW5uZXJzCi8vIGF0IGNvbW1hbmQtc3RhcnQgb25seSwgYW5kIGxhbmd1YWdlLW5hdGl2ZSB0ZXN0IGNvbW1hbmRzLiBUaGUgYmFyZS1ydW5uZXIgYXJtCi8vIGlzIGFuY2hvcmVkIHNvIHRoYXQgYG5wbSBpbnN0YWxsIGplc3RgLCBgZ3JlcCAtciB2aXRlc3Qgc3JjL2AsIGFuZCBzaW1pbGFyCi8vIGRvbid0IGZhbHNlLXBvc2l0aXZlLgovLwovLyAjMTQ4NCDigJQgdGhlIHBhY2thZ2UtbWFuYWdlciBhcm0gYWxsb3dzIGEgQk9VTkRFRCBydW4gb2Ygc2VsZWN0b3IgdG9rZW5zCi8vIGJldHdlZW4gdGhlIHRvb2wgYW5kIHRoZSBzY3JpcHQgbmFtZS4gRXZlcnkgbW9ub3JlcG8gaW52b2NhdGlvbiBwdXRzIHRoZQovLyB3b3Jrc3BhY2Ugc2VsZWN0aW9uIHRoZXJlIChgbnBtIHJ1biAtLXByZWZpeCBwYWNrYWdlcy9hcGkgdGVzdGAsCi8vIGBwbnBtIC0tZmlsdGVyIEBhY21lL2FwaSB0ZXN0YCwgYHlhcm4gd29ya3NwYWNlIEBhY21lL2FwaSB0ZXN0YCksIGFuZCB0aGUgb2xkCi8vIGA8cG0+IFtydW5dIHRlc3RgIHNoYXBlIGhhZCBubyBzbG90IGZvciBpdCDigJQgc28gYSBncmVlbiBzdWl0ZSBlYXJuZWQgbm8KLy8gY3JlZGl0IGFuZCBjaGVjay1iZWZvcmUtcHIgaGFyZC1ibG9ja2VkIGBnaCBwciBjcmVhdGVgIHdpdGggbm8gd2F5IG91dC4KLy8KLy8gVGhpcyBhcm0gY3JlZGl0cyB0aGUgZ2F0ZSwgc28gZXZlcnkgd2F5IGl0IGNhbiBvdmVyLW1hdGNoIGlzIGEgd2F5IHRoZSBnYXRlCi8vIGZhaWxzIE9QRU4uIEZvdXIgcHJvcGVydGllcyBib3VuZCBpdCwgYW5kIGVhY2ggaXMgcGlubmVkIGJ5IGEgdGVzdDoKLy8gICAqIHNlcGFyYXRvcnMgYXJlIEhPUklaT05UQUwtb25seSAoYFsgXHRdYCwgbm90IGBcc2ApLiBDbGF1ZGUgQ29kZSBydW5zCi8vICAgICBtdWx0aS1saW5lIEJhc2ggYmxvY2tzIGFzIG9uZSBzdHJpbmcsIHNvIGEgYFxzYCBzZXBhcmF0b3Igd291bGQgbGV0Ci8vICAgICBgbnBtIHJ1biBidWlsZFxudGVzdCAtZiBkaXN0L3hgIGJyaWRnZSBhIG5ld2xpbmUgaW50byB0aGUgdW5yZWxhdGVkIFVuaXgKLy8gICAgIGB0ZXN0YCBidWlsdGluIGFuZCBjcmVkaXQgYSBzdWl0ZSB0aGF0IG5ldmVyIHJhbi4KLy8gICAqIHRoZSB0b2tlbiBjbGFzcyBleGNsdWRlcyBzaGVsbCBzZXBhcmF0b3JzICg7ICYgfCA8ID4gKCApICQgYCkgc28gYSBtYXRjaAovLyAgICAgY2FuIG5ldmVyIHNwYW4gYG5wbSBydW4gYnVpbGQgJiYgcm0gLXJmIHRlc3RgLCBhbmQgZXhjbHVkZXMgYCNgIHNvIGEKLy8gICAgIHRyYWlsaW5nIGNvbW1lbnQgKGBucG0gcnVuIGJ1aWxkICMgZml4IHRlc3QgbGF0ZXJgKSBjYW4ndCBzdXBwbHkgdGhlCi8vICAgICBrZXl3b3JkLgovLyAgICogdGhlIGNsYXNzIGlzIE5FR0FURUQgcmF0aGVyIHRoYW4gYSBwb3NpdGl2ZSBwYXRoIGNsYXNzLiBgWy1cdz0vLjpAXWAKLy8gICAgIHdvdWxkIHBhc3Mgb24gUE9TSVggYW5kIHNpbGVudGx5IGtlZXAgbWlzc2luZyBXaW5kb3dzJyBgLS1wcmVmaXgKLy8gICAgIEM6XHJlcG9ccGtnYCBmb3JtIChSdWxlICMxKS4KLy8gICAqIHRoZSBgdGAgYWxpYXMga2VlcHMgaXRzIG93biBOQVJST1cgYXJtIGJlbG93IOKAlCByZWFjaGFibGUgb25seSBkaXJlY3RseQovLyAgICAgYWZ0ZXIgdGhlIHBhY2thZ2UgbWFuYWdlciwgbmV2ZXIgYWZ0ZXIgc2VsZWN0b3IgdG9rZW5zLCBzbyBhIHN0cmF5IGJhcmUKLy8gICAgIGB0YCBhcmd1bWVudCAoYG5wbSBydW4gYnVpbGQgLS1lbnYgdGApIGNhbid0IGNyZWRpdCB0aGUgZ2F0ZS4KLy8gVGhlIHNjcmlwdCBuYW1lIGtlZXBzIGl0cyBgKD86Wzpcc118JClgIHRlcm1pbmF0b3IsIHNvIGB0ZXN0LXV0aWxzYCwgYHRlc3QvYAovLyBhbmQgYGRpc3QtdGFncy50ZXN0YCBzdGlsbCBkb24ndCBtYXRjaC4gVGhlIHJlcGV0aXRpb24gaXMgYm91bmRlZCBhdCA4IGFuZCBpdHMKLy8gY2hhcmFjdGVyIGNsYXNzZXMgYXJlIGRpc2pvaW50IGZyb20gdGhlIHNlcGFyYXRvciwgc28gdGhlcmUgaXMgbm8gYmFja3RyYWNraW5nCi8vIGJsb3d1cCAoMjdrLWNoYXIgcGF0aG9sb2dpY2FsIGlucHV0OiAwIG1zKS4KdmFyIFRFU1RfUlVOTkVSX1JFID0gLyg/Ol58W15hLXpdKSg/Om5wbXx5YXJufHBucG18YnVufHR1cmJvfG54fGxlcm5hKVsgXHRdKyg/OlteXHM7Jnw8PigpJGAjXStbIFx0XSspezAsOH10ZXN0KD86Wzpcc118JCl8KD86XnxbXmEtel0pKD86bnBtfHlhcm58cG5wbXxidW4pWyBcdF0rKD86cnVuWyBcdF0rKT90KD86Wzpcc118JCl8XGIoPzpucHh8cG5weClccysoPzp2aXRlc3R8amVzdHxtb2NoYXxhdmF8dGFwfGphc21pbmV8cHl0ZXN0KVxifCg/Ol58O3wmJnxcfFx8KVxzKig/OnZpdGVzdHxqZXN0fHB5dGVzdHxtb2NoYXxqYXNtaW5lfHRhcHxhdmEpXHN8XGIoPzpjYXJnb3xnb3xkZW5vfGRvdG5ldHxtdm4pXHMrdGVzdFxifFxiZ3JhZGxlXHcqXHMrdGVzdFxiL2k7Ci8vICMxMzIyIOKAlCBmYWlsdXJlIG1hcmtlcnMgaW4gYSB0ZXN0IHJ1bm5lcidzIG93biBPVVRQVVQuCi8vCi8vIFRoaXMgaXMgZGVsaWJlcmF0ZWx5IG5vdCBhbiBleGl0LWNvZGUgY2hlY2s6IENsYXVkZSBDb2RlJ3MgUG9zdFRvb2xVc2UgcGF5bG9hZAovLyBjYXJyaWVzIG5vIGV4aXQgc3RhdHVzLCBhbmQgUG9zdFRvb2xVc2UgZG9lcyBub3QgZmlyZSBhdCBhbGwgd2hlbiBhIGNvbW1hbmQKLy8gZXhpdHMgbm9uLXplcm8g4oCUIHNvIGFuIHVubWFza2VkIHJlZCBzdWl0ZSBhbHJlYWR5IGxlYXZlcyB0ZXN0c1J1biBmYWxzZSwgYnkKLy8gYWNjaWRlbnQgb2YgdGhlIGhvb2sgbGlmZWN5Y2xlIHJhdGhlciB0aGFuIGJ5IGRlc2lnbi4gV2hhdCBET0VTIGRlZmVhdCB0aGUKLy8gZ2F0ZSBpcyBhIG1hc2tlZCBleGl0IChgbnBtIHRlc3QgfCB0YWlsIC0yMGAsIGBucG0gdGVzdCB8fCB0cnVlYCwKLy8gYG5wbSB0ZXN0IDI+JjEgfCBncmVwIC1pIGZhaWxgKTogdGhlIHBpcGVsaW5lIGV4aXRzIDAsIFBvc3RUb29sVXNlIGZpcmVzIHdpdGgKLy8gYSBjbGVhbi1sb29raW5nIHJlc3BvbnNlLCBhbmQgYSByZWQgc3VpdGUgY3JlZGl0cyB0aGUgZ2F0ZS4gT3V0cHV0IGlzIHRoZSBvbmx5Ci8vIHNpZ25hbCBsZWZ0LCBhbmQgaXQgaXMgZ2VudWluZWx5IHdlYWtlciB0aGFuIGEgc3RhdHVzIOKAlCBzZWUgdGhlIHRpY2tldC4KLy8KLy8gRXZlcnkgYXJtIG1hdGNoZXMgYSBTVU1NQVJZIHNoYXBlIGEgcnVubmVyIGVtaXRzLCBuZXZlciBhIGJhcmUgImZhaWwiLCB3aGljaAovLyBvY2N1cnMgY29uc3RhbnRseSBpbiBvcmRpbmFyeSBwYXNzaW5nIHRlc3QgbmFtZXMgKCJyZXR1cm5zIG51bGwgd2hlbiB0aGUKLy8gbG9va3VwIGZhaWxlZCIpLiBUaGUgY291bnQgYXJtIGV4Y2x1ZGVzIGFuIGV4cGxpY2l0IHplcm8gc28gamVzdCdzCi8vIGAwIGZhaWxlZCwgMTIgcGFzc2VkYCBjYW5ub3Qgc2VsZi1ibG9jay4KLy8KLy8gVGhlIGNvdW50IGFybSdzIHRyYWlsaW5nIGxvb2thaGVhZCBpcyB3aGF0IGtlZXBzIGEgR1JFRU4gcnVuIGZyb20gYmxvY2tpbmcKLy8gaXRzZWxmLiBNb2NoYSdzIGRlZmF1bHQgc3BlYyByZXBvcnRlciBwcmludHMgZXZlcnkgcGFzc2luZyB0ZXN0IG5hbWUsIHNvCi8vIGBucG0gdGVzdCB8IHRhaWwgLTIwYCBvbiBhIGdyZWVuIHN1aXRlIGxlZ2l0aW1hdGVseSBjb250YWlucyBsaW5lcyBsaWtlCi8vIGDinJMgaGFuZGxlcyAyIGZhaWxlZCByZXRyaWVzYC4gQSByZWFsIHN1bW1hcnkgaXMgZm9sbG93ZWQgYnkgYSBkZWxpbWl0ZXIgb3IgYQovLyBsaW5lIGVuZCAoYDMgZmFpbGVkIHwgNDAgcGFzc2VkYCwgYDEgZmFpbGVkLCAyIHBhc3NlZGAsIGAxIGZhaWxpbmdgKSwgbmV2ZXIgYnkKLy8gbW9yZSBwcm9zZSDigJQgc28gYSBsb3dlcmNhc2Ugd29yZCBhZnRlciB0aGUgY291bnQgbWVhbnMgaXQgaXMgYSBzZW50ZW5jZSwgbm90IGEKLy8gdGFsbHkuIGB0ZXN0c2AvYHRlc3RgIGlzIGV4ZW1wdGVkIGJlY2F1c2UgYDIgZmFpbGVkIHRlc3RzYCBpcyBhIHJlYWwgc3VtbWFyeS4KLy8gU2FtZS1saW5lIHdoaXRlc3BhY2Ugb25seTogYXQgYSBsaW5lIGVuZCB0aGVyZSBpcyBub3RoaW5nIHRvIGRpc3F1YWxpZnkuCnZhciBURVNUX0ZBSUxVUkVfUkUgPSBuZXcgUmVnRXhwKFsKICAnXFxiKD8hMFxcYilcXGQrXFxzKyg/OnRlc3RzP1xccyspPyg/OmZhaWxlZHxmYWlsaW5nfGZhaWx1cmVzPylcXGIoPyFbXlxcU1xcbl0rKD8hdGVzdHM/XFxiKVthLXpdKScsIC8vIHZpdGVzdC9qZXN0L3B5dGVzdC9tb2NoYSBjb3VudHMKICAnXlxccyooPzpGQUlMfEZBSUxFRClcXGInLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHZpdGVzdCArIGplc3QgcGVyLWZpbGUsIHB5dGVzdCBGQUlMRUQKICAnXlxccyotLS1cXHMqRkFJTDonLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdvIHRlc3QKICAnXFxidGVzdCByZXN1bHQ6XFxzKkZBSUxFRFxcYicsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhcmdvCiAgJ15ucG0gRVJSIScsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBucG0gd3JhcHBlciBhcm91bmQgYW55IG9mIHRoZSBhYm92ZQpdLmpvaW4oJ3wnKSwgJ2ltJyk7CgovKioKICogIzEzMjIg4oCUIHdoeSBhIGp1c3QtZmlyZWQgcmVjb3JkLXRlc3QtcnVuIG11c3QgTk9UIGJlIGNyZWRpdGVkLCBvciBudWxsLgogKgogKiBBYnNlbnQgb3V0cHV0IGlzIG5vdCBldmlkZW5jZSBvZiBmYWlsdXJlOiBhIHF1aWV0IGdyZWVuIGBucG0gdGVzdCA+IC9kZXYvbnVsbGAKICogYW5kIGEgc2lsZW50bHktbWFza2VkIHJlZCBvbmUgYXJlIGluZGlzdGluZ3Vpc2hhYmxlLCBhbmQgdHJlYXRpbmcgdGhlIHBhaXIgYXMKICogZmFpbHVyZXMgd291bGQgYmxvY2sgZXZlcnkgY29uc3VtZXIgd2hvIHJlZGlyZWN0cyB0ZXN0IG91dHB1dC4gQWJzZW50IG1lYW5zCiAqIHVua25vd24sIGFuZCB1bmtub3duIGtlZXBzIHRoZSBwcmUtIzEzMjIgYmVoYXZpb3VyLgogKi8KZnVuY3Rpb24gZGV0ZWN0VGVzdEZhaWx1cmUoKSB7CiAgaWYgKHByb2Nlc3MuZW52LlRPT0xfUkVTUE9OU0VfaW50ZXJydXB0ZWQgPT09ICd0cnVlJykgcmV0dXJuICd0aGUgcnVuIHdhcyBpbnRlcnJ1cHRlZCc7CiAgdmFyIG91dCA9IChwcm9jZXNzLmVudi5UT09MX1JFU1BPTlNFX3N0ZG91dCB8fCAnJykgKyAnXG4nICsgKHByb2Nlc3MuZW52LlRPT0xfUkVTUE9OU0Vfc3RkZXJyIHx8ICcnKTsKICBpZiAoIW91dC50cmltKCkpIHJldHVybiBudWxsOwogIHZhciBoaXQgPSBvdXQubWF0Y2goVEVTVF9GQUlMVVJFX1JFKTsKICByZXR1cm4gaGl0ID8gJ291dHB1dCByZXBvcnRzICInICsgaGl0WzBdLnRyaW0oKS5zbGljZSgwLCA0MCkgKyAnIicgOiBudWxsOwp9Ci8vIEVkaXRzIHRvIHRoZXNlIGRvbid0IGNoYW5nZSBydW50aW1lIGJlaGF2aW91ciwgc28gdGhleSBkb24ndCBpbnZhbGlkYXRlIHByaW9yIHRlc3Qvc2ltcGxpZnkgcnVucy4KLy8gTG9jayBmaWxlcyBhbmQgLmdpdGlnbm9yZSBhcmUgdHJhY2tlZCBidXQgaW5lcnQ7IHBhY2thZ2UuanNvbi8qLnlhbWwgQVJFIHNvdXJjZSDigJQgdGhleSByZXNldC4KdmFyIEVESVRfUkVTRVRfU0tJUF9CT1RIX1JFID0gL1wuKG1kfG1hcmtkb3dufHR4dHxyc3R8YWRvY3xsb2NrfGdpdGlnbm9yZSkkfCg/Ol58W1xcXC9dKShDSEFOR0VMT0coPzpcLm1kKT98XC5lbnZcLmV4YW1wbGV8cGFja2FnZS1sb2NrXC5qc29ufHBucG0tbG9ja1wueWFtbHx5YXJuXC5sb2NrfGJ1blwubG9ja2IpJC9pOwovLyAjMTE3NiDigJQgcGF0aC1iYXNlZCBpbmVydCBtYXJrZXJzLiBUaGUgZXh0ZW5zaW9uLWJhc2VkIFJFIGFib3ZlIGNhbid0IGNvdmVyCi8vIGAuZ2l0aHViL3dvcmtmbG93cy8qLnltbGAgd2l0aG91dCBhbHNvIGV4ZW1wdGluZyBgbW9mbG8ueWFtbGAgLyBgdHNjb25maWcueWFtbGAKLy8gKHdoaWNoIEFSRSBzb3VyY2UpLiBBbmNob3Igb24gdGhlIEdpdEh1Yi1tZXRhIGRpcmVjdG9yaWVzIHRoYXQgaG9sZCBDSSBjb25maWcKLy8gYW5kIHRlbXBsYXRlIHNjYWZmb2xkcyDigJQgZWRpdGluZyB0aG9zZSBkb2Vzbid0IGV4cG9zZSBuZXcgcnVudGltZSBzdXJmYWNlLCBzbwovLyB0aGV5IHNob3VsZG4ndCByZXNldCB0ZXN0c1J1bi9zaW1wbGlmeVJ1biB0aGUgd2F5IGEgcmVhbCBzb3VyY2UgZWRpdCBkb2VzLgovLyBUcmFpbGluZyB0ZXJtaW5hdG9yIGluY2x1ZGVzIGAuYCBzbyB0aGUgc2luZ2xlLWZpbGUgdGVtcGxhdGUgZm9ybQovLyBgLmdpdGh1Yi9QVUxMX1JFUVVFU1RfVEVNUExBVEUubWRgIG1hdGNoZXMgYWxvbmdzaWRlIHRoZSBkaXJlY3RvcnkgZm9ybS4KLy8gIzEzNDgg4oCUIGAubW9mbG8vYCBqb2lucyB0aGVtLiBJdCBpcyBtb2ZsbydzIG93biBnaXRpZ25vcmVkIHN0YXRlIGRpcmVjdG9yeQovLyAoZGFlbW9uIGxvY2tzLCBtZW1vcnkgZGIsIFNERCBzcGVjL3BsYW4gYXJ0aWZhY3RzKSwgc28gbm90aGluZyB3cml0dGVuIHRoZXJlCi8vIGNhbiBhcHBlYXIgaW4gdGhlIGJyYW5jaCBkaWZmLCBhbmQgYSBzcGVjIGVkaXQgaW52YWxpZGF0aW5nIHRoZSB0ZXN0IHJ1biBpcwovLyBwdXJlIG5vaXNlLiBTY29wZWQgdG8gdGhlIHJlc2V0IG9ubHkg4oCUIGRlbGliZXJhdGVseSBOT1QgYWRkZWQgdG8gRVhFTVBULAovLyB3aGljaCB3b3VsZCBhbHNvIHVuLWdhdGUgcmVhZHMgb2YgYC5tb2Zsby9zcGVjcy8qKmAsIGFuZCB0aG9zZSBhcmUgaW5kZXhlZAovLyBndWlkYW5jZSB0aGF0IG1lbW9yeS1maXJzdCBzaG91bGQgc3RpbGwgcm91dGUgdGhyb3VnaCBhIHNlYXJjaC4KLy8gIzEzOTUg4oCUIGAuY2xhdWRlL2AgQ09ORklHIGpvaW5zIHRoZW0sIGJ5IHRoZSBzYW1lICJkb2Vzbid0IGV4cG9zZSBuZXcgcnVudGltZQovLyBzdXJmYWNlIiByZWFzb25pbmc6IGhvb2sgd2lyaW5nLCBza2lsbHMgYW5kIGd1aWRhbmNlIGFyZSBub3QgdGhlIGNvZGUgdW5kZXIKLy8gdmVyaWZpY2F0aW9uLiBUaGlzIGlzIHRoZSBzdHJvbmdlciBjYXNlLCBpbiBmYWN0IOKAlCBpdCBpcyB0aGUgZGlyZWN0b3J5IGEgdXNlcgovLyBlZGl0cyAqYmVjYXVzZSBhIGdhdGUgdG9sZCB0aGVtIHRvKi4gQmVmb3JlIHRoaXMsIGZpeGluZyBob29rIHdpcmluZyBvbiBhCi8vIGdhdGUncyBvd24gaW5zdHJ1Y3Rpb24gcmVzZXQgdmVyaWZ5UnVuIGFuZCBpbnZhbGlkYXRlZCB0aGUgdmVyaWZpY2F0aW9uIHRoZQovLyBmaXggZXhpc3RlZCB0byBsZXQgdGhyb3VnaCwgc28gdGhlIHJlY292ZXJ5IHdhczogZml4IHdpcmluZyDihpIgdmVyaWZpY2F0aW9uCi8vIGludmFsaWRhdGVkIOKGkiByZXN0YXJ0IHNlc3Npb24g4oaSIHJlLXJ1biAvdmVyaWZ5IOKGkiByZXRyeSAoIzEzOTIgZmllbGQgcmVwb3J0KS4KLy8KLy8gU2NvcGVkIHRvIGNvbmZpZywgTk9UIGFsbCBvZiBgLmNsYXVkZS8qKmA6IGBzY3JpcHRzL2AgYW5kIGBoZWxwZXJzL2AgaG9sZAovLyBleGVjdXRhYmxlIHJ1bnRpbWUgc3VyZmFjZSAoZ2F0ZS5janMgaXRzZWxmIGxpdmVzIHRoZXJlKSwgYW5kIGVkaXRpbmcKLy8gZXhlY3V0YWJsZSBjb2RlIFNIT1VMRCBzdGlsbCBpbnZhbGlkYXRlIGEgdmVyaWZpY2F0aW9uLiBMaXN0aW5nIHRoZSBjb25maWcKLy8gc3ViZGlyZWN0b3JpZXMgZXhwbGljaXRseSBrZWVwcyB0aGF0IGludmFyaWFudCBpbnRhY3QuCi8vCi8vIEJvdGggc2VwYXJhdG9ycyBpbiBldmVyeSBhbHRlcm5hdGl2ZSDigJQgYSBiYXJlIGAvYCBoZXJlIHdvdWxkIHNpbGVudGx5IG5vLW9wCi8vIG9uIFdpbmRvd3MsIHdoZXJlIFRPT0xfSU5QVVQgcGF0aHMgYXJyaXZlIGJhY2tzbGFzaGVkIChSdWxlICMxKS4KdmFyIEVESVRfUkVTRVRfU0tJUF9QQVRIX1JFID0gLyg/Ol58W1xcXC9dKVwuZ2l0aHViW1xcXC9dKD86d29ya2Zsb3dzfElTU1VFX1RFTVBMQVRFfFBVTExfUkVRVUVTVF9URU1QTEFURSkoPzpbXFxcLy5dfCQpfCg/Ol58W1xcXC9dKVwubW9mbG9bXFxcL118KD86XnxbXFxcL10pXC5jbGF1ZGVbXFxcL10oPzpzZXR0aW5ncyg/OlwubG9jYWwpP1wuanNvbiR8c2tpbGxzW1xcXC9dfGd1aWRhbmNlW1xcXC9dfGFnZW50c1tcXFwvXSkvaTsKLy8gVGVzdCBmaWxlczogaW52YWxpZGF0ZSB0aGUgdGVzdGluZyBnYXRlICh0ZXN0cyBhcmUgc3RhbGUgb25jZSB0ZXN0IGNvZGUgY2hhbmdlcykKLy8gYnV0IE5PVCB0aGUgc2ltcGxpZnkgZ2F0ZSDigJQgL3NpbXBsaWZ5IGFscmVhZHkgcmV2aWV3ZWQgdGhlIHByb2R1Y3Rpb24gY29kZTsgdG91Y2hpbmcKLy8gYSB0ZXN0IGZpbGUgb3IgZml4dHVyZSBkb2Vzbid0IGV4cG9zZSBuZXcgdW50ZXN0ZWQgc3VyZmFjZSBmb3IgY29kZSByZXZpZXcgKCM5MDgpLgp2YXIgRURJVF9SRVNFVF9TS0lQX1NJTVBMSUZZX09OTFlfUkUgPSAvKD86XnxbXFxcL10pKF9fdGVzdHNfX3xfX21vY2tzX198dGVzdHM/fHNwZWN8c3BlY3N8Y3lwcmVzc3xlMmV8Zml4dHVyZXM/KVtcXFwvXXxcLih0ZXN0fHNwZWMpXC5bbWNdP1tqdF1zeD8kfFwuZml4dHVyZVwuW21jXT9banRdc3g/JC9pOwovLyAjMTE3NiDigJQgc291cmNlLWZpbGUgZXh0ZW5zaW9ucyB1c2VkIGJ5IHRoZSBuby1zb3VyY2UtZmlsZXMgUFIgZXhlbXB0aW9uLgovLyBXaGVuIHRoZSBjdW11bGF0aXZlIGJyYW5jaCBkaWZmIGhhcyB6ZXJvIGZpbGVzIG1hdGNoaW5nIHRoaXMgUkUgKGkuZS4gb25seQovLyBZQU1ML01EL0pTT04vbG9ja2ZpbGVzL2ltYWdlcy90ZW1wbGF0ZXMpLCB0aGUgdGVzdGluZy9zaW1wbGlmeS9sZWFybmluZ3MKLy8gZ2F0ZXMgYXV0by1wYXNzIGF0IGBjaGVjay1iZWZvcmUtcHJgLiBMaXN0cyBldmVyeSBsYW5ndWFnZSBtb2ZsbyBzaGlwcwovLyBhZ2FpbnN0IOKAlCBhZGRpdGlvbnMgaGVyZSBzaG91bGQgbWF0Y2ggVEVTVF9SVU5ORVJfUkUncyBsYW5ndWFnZSBjb3ZlcmFnZS4KdmFyIFNPVVJDRV9GSUxFX1JFID0gL1wuKHRzfHRzeHxqc3xqc3h8bWpzfGNqc3xweXxnb3xyc3xyYnxqYXZhfGt0fHN3aWZ0fGN8Y2N8Y3BwfGh8aHBwfHNofGJhc2h8cHMxKSQvaTsKLy8gRG9jcy1vbmx5IFBSIGV4ZW1wdGlvbjogdGV4dC9tYXJrdXAvaW1hZ2UgZXh0ZW5zaW9ucyB0aGF0IGNhbm5vdCBjaGFuZ2UgcnVudGltZSBiZWhhdmlvdXIuCi8vIFJldGFpbmVkIGZvciB0aGUgdHJhbnNwYXJlbmN5IG1lc3NhZ2Ugd2hlbiB0aGUgZGlmZiBpcyAqcHVyZWx5KiBkb2NzIChubyBZQU1ML0pTT04gZWl0aGVyKQovLyDigJQgZ2l2ZXMgYSBtb3JlIHNwZWNpZmljIHJlYXNvbiB0aGFuICJubyBzb3VyY2UgZmlsZXMiIGluIHRoYXQgc3Vic2V0Lgp2YXIgRE9DU19PTkxZX1JFID0gL1wuKG1kfG1hcmtkb3dufHR4dHxyc3R8YWRvY3xodG1sP3xwZGZ8cG5nfGpwZT9nfGdpZnxzdmd8d2VicHxpY298Ym1wKSQvaTsKCi8vIOKUgOKUgCBDb250ZW50LWFkZHJlc3NlZCBnYXRlIGNyZWRpdCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKLy8gQSBib29sZWFuIGB0ZXN0c1J1bmAvYHNpbXBsaWZ5UnVuYC9gdmVyaWZ5UnVuYCBhbnN3ZXJzICJ3YXMgYW4gZWRpdAovLyBvYnNlcnZlZD8iIOKAlCB3aGljaCBpcyBvbmx5IGVxdWl2YWxlbnQgdG8gImRvZXMgdGhpcyBjcmVkaXQgc3RpbGwgZGVzY3JpYmUgdGhlCi8vIGNvZGU/IiBpZiBldmVyeSBtdXRhdGlvbiBmbG93cyB0aHJvdWdoIFdyaXRlL0VkaXQvTXVsdGlFZGl0LiBJdCBkb2VzIG5vdC4KLy8gYG5vZGUgLWVgIHdpdGggZnMud3JpdGVGaWxlU3luYywgYHNlZCAtaWAsIHNoZWxsIHJlZGlyZWN0aW9uLCBgY3BgLCBhbmQgZXZlcnkKLy8gZ2l0IG9wZXJhdGlvbiB0aGF0IG1vdmVzIHRoZSB0cmVlIChjaGVja291dCwgcHVsbCwgbWVyZ2UsIHJlYmFzZSwgYXBwbHkpCi8vIGNoYW5nZSBzb3VyY2Ugd2l0aG91dCBmaXJpbmcgUG9zdFRvb2xVc2Ugb24gdGhvc2UgdG9vbHMsIHNvIHJlc2V0LWVkaXQtZ2F0ZXMKLy8gbmV2ZXIgcnVucyBhbmQgY3JlZGl0IGVhcm5lZCBiZWZvcmVoYW5kIHN1cnZpdmVzIHRoZSBjaGFuZ2UuIERlbW9uc3RyYXRlZCBieQovLyBlYXJuaW5nIGZ1bGwgY3JlZGl0LCBhcHBlbmRpbmcgYW4gZXhlY1N5bmMgY2FsbCB0byBhIHNvdXJjZSBmaWxlIHZpYSBCYXNoLAovLyBhbmQgd2F0Y2hpbmcgY2hlY2stYmVmb3JlLXByIGFsbG93IHRoZSBQUi4gTXVsdGktaXNzdWUgc2Vzc2lvbnMgaGF2ZSB0aGUgc2FtZQovLyBzaGFwZTogbm90aGluZyBpcyBwZXItcHJvbXB0LCBzbyBpc3N1ZSBCIGluaGVyaXRzIGlzc3VlIEEncyBjcmVkaXQuCi8vCi8vIEV2ZXJ5IG9uZSBvZiAjOTA4IC8gIzExNzYgLyAjMTMyMiAvICMxMzMyIC8gIzEzNDggcmVmaW5lZCBXSElDSCB0b29sIGNhbGwgdG8KLy8gd2F0Y2guIE5vbmUgb2YgdGhlbSBjb3VsZCBjbG9zZSB0aGlzLCBiZWNhdXNlIHRoZSBvYnNlcnZlciBpcyB0aGUgd3JvbmcKLy8gcHJpbWl0aXZlLiBTbyBzdG9wIG9ic2VydmluZyBtdXRhdGlvbnMgYW5kIGZpbmdlcnByaW50IHRoZSBjb2RlIGl0c2VsZjogSEVBRAovLyBwbHVzIHRoZSBjb250ZW50IG9mIGV2ZXJ5IGNoYW5nZWQgYW5kIHVudHJhY2tlZCBmaWxlLiBSZWNvbXB1dGUgYXQgY2hlY2sKLy8gdGltZTsgYW55IG1pc21hdGNoIG1lYW5zIHRoZSBjcmVkaXQgZGVzY3JpYmVzIGRpZmZlcmVudCBjb2RlIGFuZCBpcyBzdGFsZS4gTm8KLy8gdG9vbCBjYW4gYnlwYXNzIGl0LCBiZWNhdXNlIGl0IHdhdGNoZXMgbm8gdG9vbHMuCi8vCi8vIFNjb3BlIG1pcnJvcnMgdGhlIHJlc2V0IHByZWRpY2F0ZXMgc28gdGhlaXIgaW50ZW50aW9uYWwgZXhlbXB0aW9ucyBzdXJ2aXZlLgovLyBJbmVydCBmaWxlcyAoIzExNzYpIGFuZCBgLmdpdGh1Yi9gICsgYC5tb2Zsby9gIHBhdGhzIG5ldmVyIGNvbnRyaWJ1dGUsIHNvIGEKLy8gbWFya2Rvd24gb3Igc3BlYyBlZGl0IHN0aWxsIGxlYXZlcyBhIHRlc3QgcnVuIHN0YW5kaW5nLiAnbm9udGVzdCcgYWxzbyBkcm9wcwovLyB0ZXN0IGZpbGVzLCBwcmVzZXJ2aW5nICM5MDg6IHRvdWNoaW5nIGEgdGVzdCBkb2VzIG5vdCBpbnZhbGlkYXRlIC9zaW1wbGlmeS4KLy8KLy8gaXNFcGhlbWVyYWxQYXRoIGlzIGRlbGliZXJhdGVseSBOT1QgYXBwbGllZCDigJQgaXQgZXhpc3RzIGZvciBhZ2VudCBzY3JhdGNocGFkcwovLyBvdXRzaWRlIHRoZSBwcm9qZWN0LCBhbmQgYGdpdCBzdGF0dXNgIGNhbm5vdCByZXBvcnQgdGhvc2UuCi8vIFRoZSBnYXRlJ3Mgb3duIHN0YXRlIGZpbGUgbXVzdCBuZXZlciBjb250cmlidXRlOiByZWNvcmRpbmcgYSBjcmVkaXQgd3JpdGVzCi8vIGl0LCB3aGljaCB3b3VsZCBjaGFuZ2UgdGhlIHZlcnkgZmluZ2VycHJpbnQgdGhlIGNyZWRpdCBpcyBwaW5uZWQgdG8gYW5kIG1ha2UKLy8gZXZlcnkgY3JlZGl0IGluc3RhbnRseSBzdGFsZS4gSXQgaXMgZ2l0aWdub3JlZCBpbiBtb2ZsbydzIHJlcG8sIGJ1dCBhCi8vIGNvbnN1bWVyIHByb2plY3QgbmVlZCBub3QgaWdub3JlIGl0LCBhbmQgdGhlcmUgdGhlIHNlbGYtcmVmZXJlbmNlIHdvdWxkCi8vIGRlYWRsb2NrIHRoZWlyIGdhdGUgcGVybWFuZW50bHkg4oCUIHNvIGV4Y2x1ZGUgaXQgYnkgbmFtZSByYXRoZXIgdGhhbiB0cnVzdGluZwovLyAuZ2l0aWdub3JlLiBTY29wZWQgdG8gdGhpcyBvbmUgZmlsZTogYC5jbGF1ZGUvYCBhbHNvIGhvbGRzIHJlYWwgc291cmNlCi8vIChoZWxwZXJzLywgc2NyaXB0cy8pIHRoYXQgbXVzdCBrZWVwIGNvdW50aW5nLgp2YXIgRklOR0VSUFJJTlRfU0VMRl9SRSA9IC8oPzpefFtcXFwvXSlcLmNsYXVkZVtcXFwvXXdvcmtmbG93LXN0YXRlXC5qc29uJC9pOwoKZnVuY3Rpb24gZmluZ2VycHJpbnRJbmNsdWRlcyhyZWwsIHNjb3BlKSB7CiAgaWYgKEZJTkdFUlBSSU5UX1NFTEZfUkUudGVzdChyZWwpKSByZXR1cm4gZmFsc2U7CiAgaWYgKEVESVRfUkVTRVRfU0tJUF9CT1RIX1JFLnRlc3QocmVsKSkgcmV0dXJuIGZhbHNlOwogIGlmIChFRElUX1JFU0VUX1NLSVBfUEFUSF9SRS50ZXN0KHJlbCkpIHJldHVybiBmYWxzZTsKICBpZiAoc2NvcGUgPT09ICdub250ZXN0JyAmJiBFRElUX1JFU0VUX1NLSVBfU0lNUExJRllfT05MWV9SRS50ZXN0KHJlbCkpIHJldHVybiBmYWxzZTsKICByZXR1cm4gdHJ1ZTsKfQoKLyoqCiAqIFBhdGhzIHJlcG9ydGVkIGJ5IGBnaXQgc3RhdHVzIC0tcG9yY2VsYWluPXYxIC11YWxsIC16YCwgYXMKICogYHsgcGF0aCwgb3JpZyB9YCDigJQgYG9yaWdgIHNldCBvbmx5IGZvciByZW5hbWVzIGFuZCBjb3BpZXMuCiAqCiAqIEEgcmVuYW1lIGVtaXRzIGBSICA8bmV3PlwwPG9sZD5cMGA6IHR3byBOVUwtdGVybWluYXRlZCB0b2tlbnMgZm9yIG9uZSBlbnRyeS4KICogVGhlIG9yaWdpbiB0b2tlbiBtdXN0IGJlIGNvbnN1bWVkIG9yIGl0IGlzIG1pc3JlYWQgYXMgdGhlIG5leHQgZW50cnkncyBzdGF0dXMKICogYnl0ZXMsIEFORCBpdCBtdXN0IGJlIHJlcG9ydGVkLCBiZWNhdXNlIGEgcmVuYW1lIG1lYW5zIHRoZSBvbGQgcGF0aCBubyBsb25nZXIKICogZXhpc3RzLiBEcm9wcGluZyBpdCBvbiB0aGUgZmxvb3IgbGVhdmVzIHRoZSBvbGQgcGF0aCBpbiB0aGUgY29udGVudCBtYXAg4oCUIHRoZQogKiBmaW5nZXJwcmludCB3b3VsZCB0aGVuIGNhcnJ5IGEgcGhhbnRvbSBlbnRyeSB0aGF0IGRpc2FwcGVhcnMgdGhlIG1vbWVudCB0aGUKICogcmVuYW1lIGlzIGNvbW1pdHRlZCwgZXhwaXJpbmcgY3JlZGl0IG9uIGEgY29tbWl0IHRoYXQgY2hhbmdlZCBubyBjb250ZW50LgogKiBUaGF0IGlzIHRoZSBzYW1lIGRlZmVjdCBjb250ZW50LWFkZHJlc3Npbmcgd2FzIGludHJvZHVjZWQgdG8gcmVtb3ZlLgogKi8KZnVuY3Rpb24gcGFyc2VQb3JjZWxhaW5aKHJhdykgewogIHZhciBvdXQgPSBbXTsKICB2YXIgcGFydHMgPSBTdHJpbmcocmF3KS5zcGxpdCgnXDAnKTsKICBmb3IgKHZhciBpID0gMDsgaSA8IHBhcnRzLmxlbmd0aDsgaSsrKSB7CiAgICB2YXIgZW50cnkgPSBwYXJ0c1tpXTsKICAgIGlmICghZW50cnkgfHwgZW50cnkubGVuZ3RoIDwgNCkgY29udGludWU7CiAgICAvLyBDaGVjayBCT1RIIHN0YXR1cyBjb2x1bW5zLCBub3QganVzdCB0aGUgc3RhZ2VkIG9uZTogZ2l0IHJlcG9ydHMgYSByZW5hbWUKICAgIC8vIGFzIGBSIGAgd2hlbiBzdGFnZWQgYW5kIGNhbiByZXBvcnQgYCBSYCBmb3Igb25lIGRldGVjdGVkIGluIHRoZSB3b3JrdHJlZS4KICAgIC8vIE1pc3NpbmcgdGhlIHNlY29uZCBmb3JtIHdvdWxkIGxlYXZlIHRoZSBvcmlnaW4gdG9rZW4gdW5jb25zdW1lZCwgYW5kIGl0CiAgICAvLyB3b3VsZCB0aGVuIGJlIHJlYWQgYXMgdGhlIG5leHQgZW50cnkncyBzdGF0dXMgYnl0ZXMg4oCUIG1pc2FsaWduaW5nIGV2ZXJ5CiAgICAvLyBlbnRyeSBhZnRlciBpdC4gUiBhbmQgQyBhbHdheXMgZW1pdCBhbiBvcmlnaW4gdG9rZW4sIHNvIGNvbnN1bWluZyBvbmUKICAgIC8vIHdoZW5ldmVyIGVpdGhlciBjb2x1bW4gc2hvd3MgdGhlbSBjYW5ub3Qgb3Zlci1jb25zdW1lLgogICAgdmFyIHN0ID0gZW50cnkuc2xpY2UoMCwgMik7CiAgICB2YXIgcmVjID0geyBwYXRoOiBlbnRyeS5zbGljZSgzKSwgb3JpZzogbnVsbCB9OwogICAgaWYgKHN0LmluZGV4T2YoJ1InKSA+PSAwIHx8IHN0LmluZGV4T2YoJ0MnKSA+PSAwKSB7IHJlYy5vcmlnID0gcGFydHNbaSArIDFdIHx8IG51bGw7IGkrKzsgfQogICAgb3V0LnB1c2gocmVjKTsKICB9CiAgcmV0dXJuIG91dDsKfQoKLyoqCiAqIEZpbmdlcnByaW50IG9mIHRoZSBjb2RlIGEgZ2F0ZSBjcmVkaXQgZGVzY3JpYmVzLCBvciBudWxsIHdoZW4gaXQgY2Fubm90IGJlCiAqIGNvbXB1dGVkIChubyBnaXQsIG5vIHJlcG8sIG5vIGNvbW1pdHMpLiBOdWxsIGlzIHRoZSBmYWlsLW9wZW4gc2lnbmFsOiBjYWxsZXJzCiAqIGZhbGwgYmFjayB0byB0aGUgZmxhZyBhbG9uZSwgc28gbm9uLWdpdCBwcm9qZWN0cyBiZWhhdmUgZXhhY3RseSBhcyBiZWZvcmUuCiAqLwovLyBNZW1vaXNlZCBwZXIgc2NvcGUuIGNoZWNrLWJlZm9yZS1wciB0ZXN0cyB0aHJlZSBjcmVkaXRzIGFuZCBjaGVjay1iZWZvcmUtZG9uZQovLyBhIGZvdXJ0aCwgYW5kIGVhY2ggY29tcHV0YXRpb24gc2hlbGxzIG91dCB0byBgZ2l0IHN0YXR1cyAtdWFsbGAgb3ZlciB0aGUgd2hvbGUKLy8gdHJlZS4gVGhlIGdhdGUgcHJvY2VzcyBpcyBzaG9ydC1saXZlZCBhbmQgc2luZ2xlLXNob3Qg4oCUIGl0IGV4aXRzIGJlZm9yZSBhbnkKLy8gdG9vbCBpdCBnYXRlcyBjYW4gcnVuIOKAlCBzbyBub3RoaW5nIGNhbiBjaGFuZ2UgdW5kZXJuZWF0aCB0aGUgY2FjaGUuCnZhciBGSU5HRVJQUklOVF9DQUNIRSA9IHt9OwoKZnVuY3Rpb24gY3JlZGl0RmluZ2VycHJpbnQoc2NvcGUpIHsKICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKEZJTkdFUlBSSU5UX0NBQ0hFLCBzY29wZSkpIHJldHVybiBGSU5HRVJQUklOVF9DQUNIRVtzY29wZV07CiAgdmFyIHZhbHVlID0gY29tcHV0ZUNyZWRpdEZpbmdlcnByaW50KHNjb3BlKTsKICBGSU5HRVJQUklOVF9DQUNIRVtzY29wZV0gPSB2YWx1ZTsKICByZXR1cm4gdmFsdWU7Cn0KCmZ1bmN0aW9uIGNvbXB1dGVDcmVkaXRGaW5nZXJwcmludChzY29wZSkgewogIHZhciBnaXQgPSBmdW5jdGlvbiAoYXJncykgewogICAgcmV0dXJuIGNwLmV4ZWNGaWxlU3luYygnZ2l0JywgYXJncywgewogICAgICBjd2Q6IFBST0pFQ1RfRElSLCBlbmNvZGluZzogJ3V0Zi04JywgdGltZW91dDogMTAwMDAsIHdpbmRvd3NIaWRlOiB0cnVlLAogICAgICBtYXhCdWZmZXI6IDY0ICogMTAyNCAqIDEwMjQsIHN0ZGlvOiBbJ2lnbm9yZScsICdwaXBlJywgJ2lnbm9yZSddLAogICAgfSk7CiAgfTsKICAvLyBGaW5nZXJwcmludCB0aGUgQ09OVEVOVCBvZiB0aGUgd29ya2luZyB0cmVlLCBuZXZlciAoSEVBRCArIGRlbHRhKS4gVGhvc2UKICAvLyBhcmUgbm90IHRoZSBzYW1lIHRoaW5nOiBgZ2l0IGNvbW1pdGAgbW92ZXMgY2hhbmdlcyBmcm9tIHRoZSB3b3JraW5nIHRyZWUKICAvLyBpbnRvIEhFQUQgd2l0aG91dCBhbHRlcmluZyBhIHNpbmdsZSBieXRlIG9mIGNvZGUsIGFuZCBhIEhFQUQtYmFzZWQKICAvLyBmaW5nZXJwcmludCB3b3VsZCBleHBpcmUgZXZlcnkgY3JlZGl0IG9uIGNvbW1pdCDigJQgZm9yY2luZyBhIHBvaW50bGVzcwogIC8vIHJlLXJ1biBvZiB0aGUgdGVzdHMgdGhhdCBqdXN0IHBhc3NlZCBvbiBleGFjdGx5IHRoaXMgY29kZS4gQ29udGVudC0KICAvLyBhZGRyZXNzaW5nIGFsc28gbWFrZXMgdGhlIGZpbmdlcnByaW50IHN0YWJsZSBhY3Jvc3MgYW1lbmQsIHN0YXNoL3BvcCwgYW5kCiAgLy8gYW55IGJyYW5jaCBzd2l0Y2ggdGhhdCBsYW5kcyBvbiBpZGVudGljYWwgY29udGVudCwgd2hpbGUgc3RpbGwgbW92aW5nIHRoZQogIC8vIG1vbWVudCByZWFsIGNvbnRlbnQgZGlmZmVycy4KICAvLwogIC8vIFVuY2hhbmdlZCBmaWxlcyBjb250cmlidXRlIGdpdCdzIG93biBibG9iIGhhc2hlcyAoZnJlZSwgYWxyZWFkeSBjb21wdXRlZCk7CiAgLy8gb25seSBmaWxlcyBnaXQgcmVwb3J0cyBhcyBjaGFuZ2VkIG9yIHVudHJhY2tlZCBhcmUgaGFzaGVkIGhlcmUuCiAgdmFyIHRyYWNrZWQ7CiAgdHJ5IHsKICAgIHRyYWNrZWQgPSBnaXQoWydscy10cmVlJywgJy1yJywgJy16JywgJ0hFQUQnXSk7CiAgfSBjYXRjaCAoZSkgeyByZXR1cm4gbnVsbDsgfSAvLyBubyBnaXQsIG5vIHJlcG8sIG9yIG5vIGNvbW1pdCB5ZXQKICB2YXIgYnlQYXRoID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICB2YXIgZW50cmllcyA9IFN0cmluZyh0cmFja2VkKS5zcGxpdCgnXDAnKTsKICBmb3IgKHZhciBpID0gMDsgaSA8IGVudHJpZXMubGVuZ3RoOyBpKyspIHsKICAgIC8vICI8bW9kZT4gPHR5cGU+IDxvYmplY3Q+XHQ8cGF0aD4iCiAgICB2YXIgdGFiID0gZW50cmllc1tpXS5pbmRleE9mKCdcdCcpOwogICAgaWYgKHRhYiA8IDApIGNvbnRpbnVlOwogICAgdmFyIG1ldGEgPSBlbnRyaWVzW2ldLnNsaWNlKDAsIHRhYikuc3BsaXQoJyAnKTsKICAgIGJ5UGF0aFtlbnRyaWVzW2ldLnNsaWNlKHRhYiArIDEpXSA9IG1ldGFbMl07CiAgfQogIHRyeSB7CiAgICB2YXIgY2hhbmdlZCA9IHBhcnNlUG9yY2VsYWluWihnaXQoWydzdGF0dXMnLCAnLS1wb3JjZWxhaW49djEnLCAnLXVhbGwnLCAnLXonXSkpOwogICAgdmFyIGxpdmUgPSBbXTsKICAgIGZvciAodmFyIGogPSAwOyBqIDwgY2hhbmdlZC5sZW5ndGg7IGorKykgewogICAgICB2YXIgcmVsID0gY2hhbmdlZFtqXS5wYXRoOwogICAgICAvLyBBIHJlbmFtZSdzIG9yaWdpbiBwYXRoIGlzIGdvbmUgZnJvbSB0aGUgY29udGVudCDigJQgZHJvcCBpdCwgb3IgaXQKICAgICAgLy8gbGluZ2VycyB1bnRpbCB0aGUgcmVuYW1lIGlzIGNvbW1pdHRlZCBhbmQgdGhlbiB2YW5pc2hlcywgbW92aW5nIHRoZQogICAgICAvLyBmaW5nZXJwcmludCBvbiBhIGNvbW1pdCB0aGF0IGNoYW5nZWQgbm90aGluZy4KICAgICAgaWYgKGNoYW5nZWRbal0ub3JpZykgZGVsZXRlIGJ5UGF0aFtjaGFuZ2VkW2pdLm9yaWddOwogICAgICB2YXIgYWJzID0gcGF0aC5yZXNvbHZlKFBST0pFQ1RfRElSLCByZWwpOwogICAgICB2YXIgaXNGaWxlID0gZmFsc2U7CiAgICAgIHRyeSB7IGlzRmlsZSA9IGZzLnN0YXRTeW5jKGFicykuaXNGaWxlKCk7IH0gY2F0Y2ggKGUpIHsgaXNGaWxlID0gZmFsc2U7IH0KICAgICAgLy8gQSBwYXRoIGdpdCByZXBvcnRzIGJ1dCB0aGF0IGlzIGdvbmUgKG9yIGlzIG5vdCBhIHJlZ3VsYXIgZmlsZSkgaXMKICAgICAgLy8gYWJzZW50IGZyb20gdGhlIGNvbnRlbnQsIHNvIGl0IG11c3QgbGVhdmUgdGhlIG1hcCBlbnRpcmVseS4KICAgICAgaWYgKCFpc0ZpbGUpIHsgZGVsZXRlIGJ5UGF0aFtyZWxdOyBjb250aW51ZTsgfQogICAgICBpZiAocmVsLmluZGV4T2YoJ1xuJykgPj0gMCkgeyBkZWxldGUgYnlQYXRoW3JlbF07IGNvbnRpbnVlOyB9IC8vIHVuaGFzaGFibGUgdmlhIC0tc3RkaW4tcGF0aHMKICAgICAgbGl2ZS5wdXNoKHJlbCk7CiAgICB9CiAgICBpZiAobGl2ZS5sZW5ndGgpIHsKICAgICAgLy8gYGdpdCBoYXNoLW9iamVjdGAg4oCUIE5PVCBhIHJhdyBzaGExIG9mIHRoZSBieXRlcy4gQSBnaXQgYmxvYiBpZCBoYXNoZXMKICAgICAgLy8gImJsb2IgPHNpemU+XDAiIHBsdXMgdGhlIGNvbnRlbnQsIGFuZCBhcHBsaWVzIHRoZSBzYW1lIGNsZWFuIGZpbHRlcnMKICAgICAgLy8gYW5kIGNvcmUuYXV0b2NybGYgbm9ybWFsaXNhdGlvbiBnaXQgd291bGQgYXBwbHkgb24gY2hlY2tpbi4gSGFzaGluZyB0aGUKICAgICAgLy8gcmF3IGJ5dGVzIGhlcmUgaW5zdGVhZCB3b3VsZCBwcm9kdWNlIGEgZGlmZmVyZW50IHN0cmluZyB0aGFuIGxzLXRyZWUKICAgICAgLy8gcmVwb3J0cyBmb3IgaWRlbnRpY2FsIGNvbnRlbnQsIHNvIGEgZmlsZSB3b3VsZCBhcHBlYXIgdG8gImNoYW5nZSIgdGhlCiAgICAgIC8vIG1vbWVudCBpdCB3YXMgY29tbWl0dGVkIOKAlCBhbmQgb24gV2luZG93cywgd2hlbmV2ZXIgYXV0b2NybGYgcmV3cm90ZSBpdHMKICAgICAgLy8gbGluZSBlbmRpbmdzLiBPbmUgYmF0Y2hlZCBjYWxsIGNvdmVycyBldmVyeSBjaGFuZ2VkIHBhdGguCiAgICAgIHZhciBoYXNoZWQgPSBjcC5leGVjRmlsZVN5bmMoJ2dpdCcsIFsnaGFzaC1vYmplY3QnLCAnLS1zdGRpbi1wYXRocyddLCB7CiAgICAgICAgY3dkOiBQUk9KRUNUX0RJUiwgZW5jb2Rpbmc6ICd1dGYtOCcsIHRpbWVvdXQ6IDEwMDAwLCB3aW5kb3dzSGlkZTogdHJ1ZSwKICAgICAgICBtYXhCdWZmZXI6IDY0ICogMTAyNCAqIDEwMjQsIGlucHV0OiBsaXZlLmpvaW4oJ1xuJykgKyAnXG4nLAogICAgICAgIHN0ZGlvOiBbJ3BpcGUnLCAncGlwZScsICdpZ25vcmUnXSwKICAgICAgfSkudHJpbSgpLnNwbGl0KCdcbicpOwogICAgICBmb3IgKHZhciBtID0gMDsgbSA8IGxpdmUubGVuZ3RoOyBtKyspIHsKICAgICAgICBpZiAoaGFzaGVkW21dKSBieVBhdGhbbGl2ZVttXV0gPSBoYXNoZWRbbV0udHJpbSgpOwogICAgICB9CiAgICB9CiAgfSBjYXRjaCAoZSkgewogICAgLy8gc3RhdHVzIGZhaWxlZCDigJQgZmFsbCBiYWNrIHRvIHRoZSBjb21taXR0ZWQgdHJlZSBhbG9uZSByYXRoZXIgdGhhbiBudWxsLAogICAgLy8gc28gdGhlIGZpbmdlcnByaW50IHN0aWxsIHRyYWNrcyBjb21taXR0ZWQgY29udGVudC4KICB9CiAgdmFyIHBhdGhzID0gT2JqZWN0LmtleXMoYnlQYXRoKS5maWx0ZXIoZnVuY3Rpb24gKHApIHsgcmV0dXJuIGZpbmdlcnByaW50SW5jbHVkZXMocCwgc2NvcGUpOyB9KTsKICBwYXRocy5zb3J0KCk7CiAgdmFyIGggPSBjcnlwdG8uY3JlYXRlSGFzaCgnc2hhMScpOwogIGZvciAodmFyIGsgPSAwOyBrIDwgcGF0aHMubGVuZ3RoOyBrKyspIGgudXBkYXRlKHBhdGhzW2tdICsgJzonICsgYnlQYXRoW3BhdGhzW2tdXSArICdcbicpOwogIHJldHVybiBoLmRpZ2VzdCgnaGV4Jyk7Cn0KCi8qKgogKiBJcyBhIGNyZWRpdCBzdGlsbCBsaXZlPyBgZmxhZ2AgaXMgdGhlIGxlZ2FjeSBib29sZWFuLCBgc3RvcmVkYCB0aGUgZmluZ2VycHJpbnQKICogY2FwdHVyZWQgd2hlbiBpdCB3YXMgZWFybmVkLgogKgogKiBGYWlsLW9wZW4gb24gYW4gdW5jb21wdXRhYmxlIGZpbmdlcnByaW50IChub24tZ2l0IHByb2plY3QpIOKAlCB0aGUgZ2F0ZSBrZWVwcwogKiBpdHMgcHJldmlvdXMgc2VtYW50aWNzIHRoZXJlIHJhdGhlciB0aGFuIGJsb2NraW5nIHdvcmsgaXQgY2Fubm90IHJlYXNvbiBhYm91dC4KICogRmFpbC1DTE9TRUQgb24gYSBtaXNzaW5nIHN0b3JlZCBmaW5nZXJwcmludDogdGhhdCBpcyBjcmVkaXQgZWFybmVkIGJ5IGEKICogcHJlLXVwZ3JhZGUgZ2F0ZSwgYW5kIGl0IGNhcnJpZXMgbm8gZXZpZGVuY2UgYWJvdXQgd2hpY2ggY29kZSBpdCBjb3ZlcmVkLiBUaGUKICogY29zdCBpcyByZS1ydW5uaW5nIG9uY2Ugb24gdGhlIGZpcnN0IFBSIGFmdGVyIHVwZ3JhZGUsIHdoaWNoIHNlbGYtaGVhbHMuCiAqLwpmdW5jdGlvbiBjcmVkaXRJc0xpdmUoZmxhZywgc3RvcmVkLCBzY29wZSkgewogIGlmICghZmxhZykgcmV0dXJuIGZhbHNlOwogIHZhciBub3cgPSBjcmVkaXRGaW5nZXJwcmludChzY29wZSk7CiAgaWYgKG5vdyA9PT0gbnVsbCkgcmV0dXJuIHRydWU7CiAgaWYgKCFzdG9yZWQpIHJldHVybiBmYWxzZTsKICByZXR1cm4gc3RvcmVkID09PSBub3c7Cn0KCi8vICMxNDEwIOKAlCBpcyB0aGlzIEJhc2ggY29tbWFuZCBhY3R1YWxseSBhIGBnaCBwciBjcmVhdGVgIGludm9jYXRpb24/IERlbGVnYXRlcwovLyB0byBwci1jcmVhdGUtY29tbWFuZC5janMsIHdoaWNoIHNhbml0aXNlcyBkYXRhIHJlZ2lvbnMgKHF1b3RlcywgaGVyZWRvYwovLyBib2RpZXMsIGNvbW1lbnRzKSBiZWZvcmUgbG9va2luZyBmb3IgdGhlIGNvbW1hbmQsIHNvIHRoZSBnYXRlIG5laXRoZXIgbWlzc2VzCi8vIHJlYWwgaW52b2NhdGlvbnMgKG5ld2xpbmUtc2VwYXJhdGVkLCBwaXBlZCwgcGFyZW50aGVzaXNlZCkgbm9yIGZpcmVzIG9uCi8vIGNvbW1hbmRzIHRoYXQgbWVyZWx5IHF1b3RlIHRoZSBsaXRlcmFsIChgZ2l0IGNvbW1pdCAtbSAiLi4uZ2ggcHIgY3JlYXRlLi4uImApLgovLwovLyBGYWlsLXNhZmUsIGluIEJPVEggZGlyZWN0aW9ucywgYmVjYXVzZSB0aGlzIHJ1bnMgb24gZXZlcnkgQmFzaCBjYWxsIGluIGV2ZXJ5Ci8vIGNvbnN1bWVyLiBnYXRlLWhvb2subWpzIG1hcHMgYSBub24temVybyBleGl0IGZyb20gdGhpcyBzY3JpcHQgdG8gZXhpdCAyLCBzbyBhbgovLyB1bmNhdWdodCB0aHJvdyBoZXJlIGRvZXMgbm90IGRlZ3JhZGUgb25lIGdhdGUg4oCUIGl0IGJsb2NrcyBldmVyeSBCYXNoIGNhbGwgdGhlCi8vIGNvbnN1bWVyIG1ha2VzLiBTbyBhIGxvYWQgZmFpbHVyZSAocGFydGlhbCBgLmNsYXVkZS9oZWxwZXJzYCBzeW5jIG1pZC11cGdyYWRlLAovLyBoYW5kLXBydW5lZCBpbnN0YWxsKSBBTkQgYSB0aHJvdyBmcm9tIHRoZSBtYXRjaGVyIGl0c2VsZiBib3RoIGZhbGwgYmFjayB0byB0aGUKLy8gcHJlLSMxNDEwIHJlZ2V4OiBwcmV2aW91cyBiZWhhdmlvdXIsIG5vdCBhIHdlZGdlZCBzZXNzaW9uLgovLwovLyBOb3Qgc2lsZW50ICgjODU0LCBob29rLWF1dGhvcmluZyDCpzQpOiB0aGUgZmFsbGJhY2sgcGF0aCBhZHZpc2VzIG9uIHN0ZGVyciBhbmQKLy8gY29udGludWVzLiBJZiB0aGlzIGV2ZXIgZmlyZXMgaXQgbWVhbnMgdGhlIG1hdGNoZXIgY3Jhc2hlZCwgd2hpY2ggaXMgd29ydGgKLy8gYmVpbmcgbG91ZCBhYm91dCDigJQgYW5kIGl0IGNhbm5vdCBzcGFtIGEgaGVhbHRoeSBzZXNzaW9uLCBiZWNhdXNlIGEgaGVhbHRoeQovLyBzZXNzaW9uIG5ldmVyIHJlYWNoZXMgaXQuCnZhciBMRUdBQ1lfUFJfQ1JFQVRFX1JFID0gLyg/Ol58JiZccyp8XHxcfFxzKnw7XHMqKVxzKig/OltBLVpfXVtBLVowLTlfXSo9XFMrXHMrKSpnaFxzK3ByXHMrY3JlYXRlXGIvOwp2YXIgcHJDcmVhdGVNYXRjaGVyID0gbnVsbDsKZnVuY3Rpb24gaXNQckNyZWF0ZUNvbW1hbmQoY21kKSB7CiAgaWYgKHByQ3JlYXRlTWF0Y2hlciA9PT0gbnVsbCkgewogICAgdHJ5IHsKICAgICAgcHJDcmVhdGVNYXRjaGVyID0gcmVxdWlyZSgnLi9wci1jcmVhdGUtY29tbWFuZC5janMnKS5pc1ByQ3JlYXRlQ29tbWFuZDsKICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgcHJDcmVhdGVNYXRjaGVyID0gZmFsc2U7CiAgICAgIHByb2Nlc3Muc3RkZXJyLndyaXRlKCdtb2ZsbzogcHItY3JlYXRlLWNvbW1hbmQuY2pzIHVuYXZhaWxhYmxlICgnICsgKGUgJiYgZS5tZXNzYWdlKSArICcpIOKAlCBQUiBnYXRlcyBmYWxsIGJhY2sgdG8gdGhlIGxlZ2FjeSBtYXRjaGVyLiBSdW4gYG5weCBmbG8gZG9jdG9yIC0tZml4YC5cbicpOwogICAgfQogICAgaWYgKHR5cGVvZiBwckNyZWF0ZU1hdGNoZXIgIT09ICdmdW5jdGlvbicpIHByQ3JlYXRlTWF0Y2hlciA9IGZhbHNlOwogIH0KICBpZiAocHJDcmVhdGVNYXRjaGVyKSB7CiAgICB0cnkgewogICAgICByZXR1cm4gcHJDcmVhdGVNYXRjaGVyKGNtZCk7CiAgICB9IGNhdGNoIChlKSB7CiAgICAgIHByb2Nlc3Muc3RkZXJyLndyaXRlKCdtb2ZsbzogcHItY3JlYXRlIG1hdGNoZXIgdGhyZXcgKCcgKyAoZSAmJiBlLm1lc3NhZ2UpICsgJykg4oCUIGZhbGxpbmcgYmFjayB0byB0aGUgbGVnYWN5IG1hdGNoZXIuIFBsZWFzZSByZXBvcnQgd2l0aCB0aGUgY29tbWFuZCB0aGF0IHRyaWdnZXJlZCBpdC5cbicpOwogICAgfQogIH0KICByZXR1cm4gTEVHQUNZX1BSX0NSRUFURV9SRS50ZXN0KGNtZCk7Cn0KCi8vIENsYXNzaWZpZXItYXdhcmUgc2ltcGxpZnkgZ2F0ZSBza2lwLiBSZXR1cm5zIGEgc3RyaW5nIHJlYXNvbiBpZiB0aGUgZ2F0ZQovLyBjYW4gYmUgYXV0by1wYXNzZWQsIG9yIG51bGwgaWYgL3NpbXBsaWZ5IG11c3QgcnVuLiBVc2VzIHNpbXBsaWZ5LWNsYXNzaWZ5LmNqcwovLyBzbyB0aGUgZ2F0ZSdzICJ0cml2aWFsIiBkZWZpbml0aW9uIG1hdGNoZXMgdGhlIHNraWxsJ3MgZXhhY3RseS4KLy8KLy8gVHdvIHBhdGhzOgovLyAgIDEuIHNuYXBzaG90IHBhdGgg4oCUIC9zaW1wbGlmeSByYW4gZWFybGllciBvbiB0aGlzIGJyYW5jaC4gQ2xhc3NpZnkgdGhlIGRpZmYKLy8gICAgICBiZXR3ZWVuIHNpbXBsaWZ5U25hcHNob3RTaGEgYW5kIGN1cnJlbnQgSEVBRC93b3JraW5nLXRyZWUuIElmIFRSSVZJQUwsCi8vICAgICAgdGhlIHByaW9yIHJldmlldyBzdGlsbCBjb3ZlcnMgdGhlIGJyYW5jaCDigJQgbm8gcmUtcnVuIG5lZWRlZC4KLy8gICAyLiBiYXNlbGluZSBwYXRoIOKAlCBubyBzbmFwc2hvdCAoZmlyc3QgdGltZSkuIENsYXNzaWZ5IHRoZSBlbnRpcmUgYnJhbmNoCi8vICAgICAgZGlmZiB2cyBtZXJnZS1iYXNlLiBJZiBUUklWSUFMLCB0aGUgd2hvbGUgUFIgaXMgYmVsb3cgdGhlIHRocmVzaG9sZAovLyAgICAgIHdoZXJlIC9zaW1wbGlmeSBwcm92aWRlcyB2YWx1ZSDigJQgYXV0by1wYXNzIHdpdGhvdXQgZXZlciBpbnZva2luZyBpdC4KLy8KLy8gRmFpbC1zYWZlOiBhbnkgZXJyb3IgKG5vIGNsYXNzaWZpZXIsIG5vIGdpdCwgbm8gbWVyZ2UtYmFzZSkgcmV0dXJucyBudWxsLAovLyB3aGljaCBmb3JjZXMgL3NpbXBsaWZ5IHRvIHJ1biBhcyB0b2RheS4KZnVuY3Rpb24gY2xhc3NpZnlGb3JHYXRlU2tpcChzdGF0ZSkgewogIHZhciBtb2Q7CiAgdHJ5IHsKICAgIG1vZCA9IHJlcXVpcmUoJy4vc2ltcGxpZnktY2xhc3NpZnkuY2pzJyk7CiAgfSBjYXRjaCAoZSkgeyByZXR1cm4gbnVsbDsgfQogIHZhciBjbGFzc2lmeSA9IG1vZCAmJiBtb2QuY2xhc3NpZnlEaWZmOwogIHZhciByZWFkVW50cmFja2VkID0gbW9kICYmIG1vZC5yZWFkVW50cmFja2VkRGlmZjsKICAvLyBFWEVDX01BWF9CVUZGRVIgaXMgY2hlY2tlZCBhbG9uZ3NpZGUgdGhlIGZ1bmN0aW9ucyBiZWNhdXNlIGZhbGxpbmcgYmFjayB0bwogIC8vIE5vZGUncyAxIE1pQiBkZWZhdWx0IHdvdWxkIHNpbGVudGx5IHJlaW5zdGF0ZSB0aGUgdmVyeSBjbGlmZiAjMTQ1MSByZW1vdmVkLgogIGlmICh0eXBlb2YgY2xhc3NpZnkgIT09ICdmdW5jdGlvbicgfHwgdHlwZW9mIHJlYWRVbnRyYWNrZWQgIT09ICdmdW5jdGlvbicKICAgICAgfHwgdHlwZW9mIG1vZC5FWEVDX01BWF9CVUZGRVIgIT09ICdudW1iZXInKSByZXR1cm4gbnVsbDsKCiAgLy8gVW50cmFja2VkIGZpbGVzIHNob3cgdXAgaW4gbm8gYGdpdCBkaWZmYCBvdXRwdXQsIHNvIHdpdGhvdXQgdGhlbSB0aGUgZ2F0ZQogIC8vIGNvdWxkIGF1dG8tcGFzcyBhIGJyYW5jaCBvZiBicmFuZC1uZXcgdW5zdGFnZWQgZmlsZXMgYXMgVFJJVklBTCAoIzE0NTEpLgogIC8vIFJlYWRpbmcgZXZlcnkgb25lIG9mIHRoZW0gaXMgcmVhbCB3b3JrLCBzbyBpdCBpcyBkZWZlcnJlZCB1bnRpbCBhIHBhdGggaXMKICAvLyBhY3R1YWxseSBhYm91dCB0byBjbGFzc2lmeS4gUmV0dXJucyBudWxsIGlmIHRoZSByZWFkIGZhaWxlZCDigJQgdGhlIGNhbGxlcgogIC8vIG11c3QgdGhlbiBmYWxsIHRocm91Z2ggYW5kIGZvcmNlIC9zaW1wbGlmeSByYXRoZXIgdGhhbiBjbGFzc2lmeSBhIHBhcnRpYWwKICAvLyBkaWZmLgogIHZhciB1bnRyYWNrZWRUZXh0ID0gbnVsbDsKICBmdW5jdGlvbiB1bnRyYWNrZWRTdWZmaXgoKSB7CiAgICBpZiAodW50cmFja2VkVGV4dCAhPT0gbnVsbCkgcmV0dXJuIHVudHJhY2tlZFRleHQ7CiAgICB2YXIgdTsKICAgIHRyeSB7IHUgPSByZWFkVW50cmFja2VkKFBST0pFQ1RfRElSKTsgfSBjYXRjaCAoZSkgeyByZXR1cm4gbnVsbDsgfQogICAgaWYgKCF1IHx8IHUudW5yZWFkYWJsZSkgcmV0dXJuIG51bGw7CiAgICB1bnRyYWNrZWRUZXh0ID0gdS50ZXh0ID8gJ1xuJyArIHUudGV4dCA6ICcnOwogICAgcmV0dXJuIHVudHJhY2tlZFRleHQ7CiAgfQoKICBmdW5jdGlvbiB0cnlDbGFzc2lmeShkaWZmVGV4dCwgbGFiZWwsIGFsbG93U21hbGxSZXZpZXdGaXgpIHsKICAgIHRyeSB7CiAgICAgIHZhciBkZWMgPSBjbGFzc2lmeShkaWZmVGV4dCk7CiAgICAgIGlmIChkZWMudGllciA9PT0gJ1RSSVZJQUwnKSB7CiAgICAgICAgdmFyIGxvYyA9IChkZWMuc3RhdHMuYWRkZWQgfHwgMCkgKyAoZGVjLnN0YXRzLmRlbGV0ZWQgfHwgMCk7CiAgICAgICAgcmV0dXJuIGxhYmVsICsgJyBpcyBUUklWSUFMICgnICsgbG9jICsgJyBMT0MsICcgKyAoZGVjLnN0YXRzLmZpbGVDb3VudCB8fCAwKSArICcgZmlsZShzKSknOwogICAgICB9CiAgICAgIC8vICMxMTc2IOKAlCBTTUFMTCByZXZpZXctZml4IHNoYXBlIChzbmFwc2hvdCBwYXRoIG9ubHkpLiBBIOKJpDMwLUxPQyBkZWx0YSB3aXRoCiAgICAgIC8vIHplcm8gbmV3IGRlY2xhcmF0aW9ucyBvbiB0b3Agb2YgYW4gYWxyZWFkeS1yZXZpZXdlZCBicmFuY2ggaXMgdGhlIHR5cGljYWwKICAgICAgLy8gImFwcGx5IDMgcmV2aWV3IGZpeGVzIiBjeWNsZSDigJQgcmUtcnVubmluZyAvZmxvLXNpbXBsaWZ5IGFnYWluc3QgdGhlIHNhbWUKICAgICAgLy8gc3VyZmFjZSBwbHVzIGEgZmV3LWxpbmUgdHdlYWsgYWRkcyBubyBuZXcgc2lnbmFsLiBCYXNlbGluZSBwYXRoIHN0YXlzCiAgICAgIC8vIFRSSVZJQUwtb25seSBzbyBicmFuZC1uZXcgU01BTEwgZmVhdHVyZXMgc3RpbGwgZ2V0IHJldmlld2VkLgogICAgICBpZiAoYWxsb3dTbWFsbFJldmlld0ZpeCAmJiBkZWMudGllciA9PT0gJ1NNQUxMJykgewogICAgICAgIHZhciB0b3RhbExvYyA9IChkZWMuc3RhdHMuYWRkZWQgfHwgMCkgKyAoZGVjLnN0YXRzLmRlbGV0ZWQgfHwgMCk7CiAgICAgICAgaWYgKHRvdGFsTG9jIDw9IDMwICYmIChkZWMuc3RhdHMuZGVjbEFkZGVkIHx8IDApID09PSAwKSB7CiAgICAgICAgICByZXR1cm4gbGFiZWwgKyAnIGlzIFNNQUxMIHJldmlldy1maXggc2hhcGUgKCcgKyB0b3RhbExvYyArICcgTE9DLCBubyBuZXcgZGVjbGFyYXRpb25zKSc7CiAgICAgICAgfQogICAgICB9CiAgICB9IGNhdGNoIChlKSB7IC8qIGZhbGwgdGhyb3VnaCAqLyB9CiAgICByZXR1cm4gbnVsbDsKICB9CgogIC8vIG1heEJ1ZmZlciBjb21lcyBGUk9NIHRoZSBjbGFzc2lmaWVyICgjMTQ1MSkgcmF0aGVyIHRoYW4gYmVpbmcgYSBtYXRjaGluZwogIC8vIGxpdGVyYWwgaGVyZSwgc28gdGhlIGdhdGUgYW5kIHRoZSBza2lsbCBjYW5ub3QgZHJpZnQgb24gd2hpY2ggZGlmZnMgYXJlCiAgLy8gcmVhZGFibGUgYXQgYWxsLiBQYXN0IGl0IGV4ZWNGaWxlU3luYyB0aHJvd3MgRU5PQlVGUyBhbmQgZ2l0RGlmZiByZXR1cm5zCiAgLy8gbnVsbCDigJQgd2hpY2ggZXZlcnkgY2FsbGVyIGJlbG93IG11c3QgdHJlYXQgYXMgInVua25vd24iLCBuZXZlciAiZW1wdHkiLgogIHZhciBtYXhCdWZmZXIgPSBtb2QuRVhFQ19NQVhfQlVGRkVSOwogIGZ1bmN0aW9uIGdpdERpZmYoYXJncykgewogICAgdHJ5IHsKICAgICAgcmV0dXJuIGNwLmV4ZWNGaWxlU3luYygnZ2l0JywgYXJncywgewogICAgICAgIGN3ZDogUFJPSkVDVF9ESVIsIGVuY29kaW5nOiAndXRmLTgnLCB0aW1lb3V0OiA1MDAwLCB3aW5kb3dzSGlkZTogdHJ1ZSwKICAgICAgICBzdGRpbzogWydpZ25vcmUnLCAncGlwZScsICdpZ25vcmUnXSwgbWF4QnVmZmVyOiBtYXhCdWZmZXIKICAgICAgfSk7CiAgICB9IGNhdGNoIChlKSB7IHJldHVybiBudWxsOyB9CiAgfQoKICAvLyBTbmFwc2hvdCBwYXRoOiBjbGFzc2lmeSBldmVyeXRoaW5nIHNpbmNlIC9zaW1wbGlmeSBsYXN0IHJhbi4KICBpZiAoc3RhdGUuc2ltcGxpZnlTbmFwc2hvdFNoYSkgewogICAgdmFyIHNuYXBEaWZmID0gZ2l0RGlmZihbJ2RpZmYnLCBzdGF0ZS5zaW1wbGlmeVNuYXBzaG90U2hhICsgJy4uLkhFQUQnXSk7CiAgICB2YXIgd29ya1RyZWVBID0gZ2l0RGlmZihbJ2RpZmYnLCAnSEVBRCddKTsKICAgIC8vIEJPVEggcmVhZHMgbXVzdCBzdWNjZWVkLiBDb2FsZXNjaW5nIGEgZmFpbGVkIHdvcmtpbmctdHJlZSByZWFkIHRvICcnIGlzCiAgICAvLyBob3cgYW4gb3Zlci1idWZmZXIgd29ya2luZyB0cmVlIHVzZWQgdG8gcmVhZCBhcyAibm8gd29ya2luZy10cmVlIGNoYW5nZXMiCiAgICAvLyBhbmQgbGV0IHRoZSBnYXRlIHNraXAgcmV2aWV3ICgjMTQ1MSkuCiAgICBpZiAoc25hcERpZmYgIT09IG51bGwgJiYgd29ya1RyZWVBICE9PSBudWxsKSB7CiAgICAgIHZhciBzdWZmaXhBID0gdW50cmFja2VkU3VmZml4KCk7CiAgICAgIGlmIChzdWZmaXhBID09PSBudWxsKSByZXR1cm4gbnVsbDsKICAgICAgdmFyIGNvbWJpbmVkID0gc25hcERpZmYgKyAod29ya1RyZWVBID8gJ1xuJyArIHdvcmtUcmVlQSA6ICcnKSArIHN1ZmZpeEE7CiAgICAgIC8vIFNuYXBzaG90IHBhdGg6IGFsbG93IFNNQUxMIHJldmlldy1maXggc2hhcGUgYmVjYXVzZSB0aGUgb3JpZ2luYWwgL3NpbXBsaWZ5CiAgICAgIC8vIGFscmVhZHkgY292ZXJlZCB0aGUgc3VyZmFjZSBhbmQgb25seSB0aW55IG5vLWRlY2wtdG91Y2hpbmcgdHdlYWtzIGZvbGxvd2VkLgogICAgICB2YXIgaGl0ID0gdHJ5Q2xhc3NpZnkoY29tYmluZWQsICdkZWx0YSBzaW5jZSBsYXN0IC9zaW1wbGlmeScsIHRydWUpOwogICAgICBpZiAoaGl0KSByZXR1cm4gaGl0OwogICAgfQogIH0KCiAgLy8gQmFzZWxpbmUgcGF0aDogY2xhc3NpZnkgdGhlIHdob2xlIGJyYW5jaCB2cyBtZXJnZS1iYXNlLgogIHZhciBiYXNlcyA9IFsnb3JpZ2luL21haW4nLCAnbWFpbicsICdvcmlnaW4vbWFzdGVyJywgJ21hc3RlciddOwogIGZvciAodmFyIGkgPSAwOyBpIDwgYmFzZXMubGVuZ3RoOyBpKyspIHsKICAgIHZhciBiYXNlOwogICAgdHJ5IHsKICAgICAgYmFzZSA9IGNwLmV4ZWNGaWxlU3luYygnZ2l0JywgWydtZXJnZS1iYXNlJywgJ0hFQUQnLCBiYXNlc1tpXV0sIHsKICAgICAgICBjd2Q6IFBST0pFQ1RfRElSLCBlbmNvZGluZzogJ3V0Zi04JywgdGltZW91dDogMjAwMCwgd2luZG93c0hpZGU6IHRydWUsCiAgICAgICAgc3RkaW86IFsnaWdub3JlJywgJ3BpcGUnLCAnaWdub3JlJ10KICAgICAgfSkudHJpbSgpOwogICAgfSBjYXRjaCAoZSkgeyBjb250aW51ZTsgfQogICAgaWYgKCFiYXNlKSBjb250aW51ZTsKICAgIHZhciBicmFuY2hEaWZmID0gZ2l0RGlmZihbJ2RpZmYnLCBiYXNlICsgJy4uLkhFQUQnXSk7CiAgICB2YXIgd29ya1RyZWVCID0gZ2l0RGlmZihbJ2RpZmYnLCAnSEVBRCddKTsKICAgIGlmIChicmFuY2hEaWZmICE9PSBudWxsICYmIHdvcmtUcmVlQiAhPT0gbnVsbCkgewogICAgICB2YXIgc3VmZml4QiA9IHVudHJhY2tlZFN1ZmZpeCgpOwogICAgICBpZiAoc3VmZml4QiA9PT0gbnVsbCkgcmV0dXJuIG51bGw7CiAgICAgIHJldHVybiB0cnlDbGFzc2lmeShicmFuY2hEaWZmICsgKHdvcmtUcmVlQiA/ICdcbicgKyB3b3JrVHJlZUIgOiAnJykgKyBzdWZmaXhCLCAnYnJhbmNoIGRpZmYnKTsKICAgIH0KICAgIGJyZWFrOwogIH0KICByZXR1cm4gbnVsbDsKfQoKLy8gR2V0IHRoZSBmaWxlIGxpc3QgY2hhbmdlZCBvbiB0aGUgY3VycmVudCBicmFuY2ggdnMgdGhlIG1lcmdlLWJhc2Ugd2l0aCBvcmlnaW4vbWFpbgovLyAoZmFsbGluZyBiYWNrIHRvIGxvY2FsIG1haW4pLiBSZXR1cm5zIGFuIGFycmF5IG9mIHJlcG8tcmVsYXRpdmUgcGF0aHMsIG9yIG51bGwgb24KLy8gZmFpbHVyZSDigJQgaW4gd2hpY2ggY2FzZSBjYWxsZXJzIE1VU1QgZmFsbCB0aHJvdWdoIHRvIHRoZSBzdGFuZGFyZCBnYXRlIChmYWlsLXNhZmUpLgpmdW5jdGlvbiBnZXRDaGFuZ2VkRmlsZXNWc0Jhc2UoKSB7CiAgdmFyIGJhc2VzID0gWydvcmlnaW4vbWFpbicsICdtYWluJywgJ29yaWdpbi9tYXN0ZXInLCAnbWFzdGVyJ107CiAgdmFyIGJhc2UgPSBudWxsOwogIGZvciAodmFyIGkgPSAwOyBpIDwgYmFzZXMubGVuZ3RoOyBpKyspIHsKICAgIHRyeSB7CiAgICAgIGJhc2UgPSBjcC5leGVjRmlsZVN5bmMoJ2dpdCcsIFsnbWVyZ2UtYmFzZScsICdIRUFEJywgYmFzZXNbaV1dLCB7CiAgICAgICAgY3dkOiBQUk9KRUNUX0RJUiwgZW5jb2Rpbmc6ICd1dGYtOCcsIHRpbWVvdXQ6IDIwMDAsIHdpbmRvd3NIaWRlOiB0cnVlLAogICAgICAgIHN0ZGlvOiBbJ2lnbm9yZScsICdwaXBlJywgJ2lnbm9yZSddCiAgICAgIH0pLnRyaW0oKTsKICAgICAgaWYgKGJhc2UpIGJyZWFrOwogICAgfSBjYXRjaCAoZSkgeyAvKiB0cnkgbmV4dCAqLyB9CiAgfQogIGlmICghYmFzZSkgcmV0dXJuIG51bGw7CiAgdHJ5IHsKICAgIHZhciBvdXQgPSBjcC5leGVjRmlsZVN5bmMoJ2dpdCcsIFsnZGlmZicsICctLW5hbWUtb25seScsIGJhc2UgKyAnLi4uSEVBRCddLCB7CiAgICAgIGN3ZDogUFJPSkVDVF9ESVIsIGVuY29kaW5nOiAndXRmLTgnLCB0aW1lb3V0OiAyMDAwLCB3aW5kb3dzSGlkZTogdHJ1ZSwKICAgICAgc3RkaW86IFsnaWdub3JlJywgJ3BpcGUnLCAnaWdub3JlJ10KICAgIH0pOwogICAgcmV0dXJuIG91dC5zcGxpdCgnXG4nKS5tYXAoZnVuY3Rpb24obCkgeyByZXR1cm4gbC50cmltKCk7IH0pLmZpbHRlcihCb29sZWFuKTsKICB9IGNhdGNoIChlKSB7IHJldHVybiBudWxsOyB9Cn0KCi8vICMxMzc0IOKAlCB0aGUgbWlzc2luZyBoYWxmIG9mIHRoZSBUYXNrQ3JlYXRlIHJlbWluZGVyLgovLwovLyBtb2ZsbyBuYWdzIHlvdSB0byBPUEVOIGEgdGFzayBsaXN0IChjaGVjay1iZWZvcmUtYWdlbnQpIGFuZCB0aGVuIG5ldmVyIGxvb2tzCi8vIGFnYWluOiBgdGFza0NvdW50YCBvbmx5IGNvdW50cyB1cCwgc28gYSBydW4gdGhhdCBjcmVhdGVzIGZvdXIgdGFza3MgYW5kIGNsb3NlcwovLyBub25lIHNhdGlzZmllcyBldmVyeSBnYXRlLiBUaGF0IGlzIHRoZSBleGFjdCBzaGFwZSBvZiBhbiBhYmFuZG9uZWQgbGlzdC4KLy8KLy8gVGhlIGxlZGdlciBpcyByZWFkIGZyb20gdGhlIHNlc3Npb24gVFJBTlNDUklQVCwgYW5kIGJvdGggYWx0ZXJuYXRpdmVzIHdlcmUKLy8gcmVqZWN0ZWQgb24gZXZpZGVuY2UgcmF0aGVyIHRoYW4gdGFzdGU6Ci8vCi8vICAgLSBBIGBeVGFza1VwZGF0ZSRgIFBvc3RUb29sVXNlIG9ic2VydmVyIGZlZWRpbmcgYSBjb3VudGVyIGlzIHRoZSB3aXJpbmcKLy8gICAgICMxMzMxIHJlbW92ZWQgYXMgcHVyZSBob3QtcGF0aCBvdmVyaGVhZC4gSXQgd291bGQgYWxzbyBoYXZlIHRvIHN1cnZpdmUKLy8gICAgIGFwcGx5UHJvbXB0U3RhdGVSZXNldCwgd2hlcmVhcyBhIHRyYW5zY3JpcHQgcmVhZCBob2xkcyBubyBzdGF0ZSB0byByZXNldC4KLy8gICAtIENsYXVkZSBDb2RlJ3Mgb3duIHRhc2sgc3RvcmUgKGB+Ly5jbGF1ZGUvdGFza3Mvc2Vzc2lvbi08aWQ+L2ApIGlzIGdyb3VuZAovLyAgICAgdHJ1dGggYnV0IHVucmVhY2hhYmxlOiBtZWFzdXJlZCBvbiB2Mi4xLjIyMCwgdGhlIGlkIGtleWluZyB0aGF0IGRpcmVjdG9yeQovLyAgICAgZG9lcyBOT1Qgcm90YXRlIG9uIGAvY2xlYXJgLCBzbyBhIHNlc3Npb24gd2hvc2UgdHJhbnNjcmlwdCBpcyA8QT4gd3JpdGVzCi8vICAgICBpdHMgdGFza3MgdW5kZXIgdGhlIHByZS1jbGVhciBpZCA8Qj4g4oCUIGFuZCA8QT4gaXMgd2hhdCB0aGUgYnJpZGdlIGZvcndhcmRzCi8vICAgICBhcyBIT09LX1NFU1NJT05fSUQuIFRoZXJlIGlzIG5vIHBhdGggZnJvbSB0aGUgaG9vayBlbnZpcm9ubWVudCB0byB0aGUgZGlyLgovLwovLyBDb3N0IGxhbmRzIG9ubHkgd2hlcmUgaXQgaXMgYWxyZWFkeSBqdXN0aWZpZWQ6IHRoZSBzb2xlIGNhbGxlciBydW5zIGFmdGVyCi8vIGNoZWNrLWJlZm9yZS1wcidzIGBnaCBwciBjcmVhdGVgIG1hdGNoLCBpLmUuIG9uY2UgcGVyIFBSIGF0dGVtcHQsIG5ldmVyIG9uIHRoZQovLyBwZXItdG9vbCBwYXRoLgovLwovLyBSZXR1cm5zIG51bGwgd2hlbiB0aGUgdHJhbnNjcmlwdCBpcyBtaXNzaW5nLCBvdmVyc2l6ZWQsIHVucmVhZGFibGUsIG9yIHJlY29yZHMKLy8gbm8gVGFza0NyZWF0ZSBhdCBhbGwg4oCUIHRoZSBjYWxsZXIgdGhlbiBzdGF5cyBzaWxlbnQgcmF0aGVyIHRoYW4gZ3Vlc3NpbmcuCi8vIFNpemVkIGFnYWluc3QgbWVhc3VyZW1lbnQsIG5vdCBhIHJvdW5kIG51bWJlcjogYSAzLjRNQiB0cmFuc2NyaXB0ICh0aGUgbGFyZ2VzdAovLyBpbiBhIHdlZWsgb2YgbG9jYWwgc2Vzc2lvbnMpIGNvc3RzIH41NW1zIHRvIHNjYW4sIHNvIH4xNm1zL01CLiAxNk1CIGlzIH40eCB0aGUKLy8gd29yc3Qgb2JzZXJ2ZWQgc2Vzc2lvbiBhbmQgbGFuZHMgbmVhciAyNjBtcyDigJQgYSBjaHVuayBvZiB0aGUgaG9vaydzIDIwMDBtcwovLyBidWRnZXQsIGJ1dCBhIGJvdW5kZWQgb25lLiBQYXN0IHRoZSBjYXAgdGhlIGxlZGdlciBnb2VzIHNpbGVudCByYXRoZXIgdGhhbgovLyByaXNraW5nIHRoZSB0aW1lb3V0LCBzaW5jZSBhIGhvb2sgdGhhdCB0aW1lcyBvdXQgaXMgd29yc2UgdGhhbiBvbmUgdGhhdAovLyBkZWNsaW5lcyB0byBjb21tZW50LiBVbnJlbGF0ZWQgdG8gYFRSQU5TQ1JJUFRfVEFJTF9CWVRFU2AgaW4gYmluL2xpYi9tZWRpdGF0ZS5tanMKLy8gZGVzcGl0ZSB0aGUgc2ltaWxhciBuYW1lIOKAlCB0aGF0IG9uZSB0cnVuY2F0ZXMgdG8gYSB0YWlsIHdpbmRvdywgd2hpY2ggY2Fubm90Ci8vIHdvcmsgaGVyZSAoYSBUYXNrQ3JlYXRlIGZyb20gZWFybHkgaW4gdGhlIHNlc3Npb24gZmFsbHMgb3V0c2lkZSBhbnkgdGFpbCkuCnZhciBUUkFOU0NSSVBUX01BWF9CWVRFUyA9IDE2ICogMTAyNCAqIDEwMjQ7CmZ1bmN0aW9uIHJlYWRUYXNrTGVkZ2VyKCkgewogIHZhciB0cCA9IHByb2Nlc3MuZW52LkhPT0tfVFJBTlNDUklQVF9QQVRIIHx8ICcnOwogIGlmICghdHApIHJldHVybiBudWxsOwogIHZhciByYXc7CiAgdHJ5IHsKICAgIHZhciBzdCA9IGZzLnN0YXRTeW5jKHRwKTsKICAgIGlmICghc3QuaXNGaWxlKCkgfHwgc3Quc2l6ZSA+IFRSQU5TQ1JJUFRfTUFYX0JZVEVTKSByZXR1cm4gbnVsbDsKICAgIHJhdyA9IGZzLnJlYWRGaWxlU3luYyh0cCwgJ3V0Zi04Jyk7CiAgfSBjYXRjaCAoZSkgeyByZXR1cm4gbnVsbDsgfQogIHZhciBjcmVhdGVkID0gMDsgICAgICAgICAgICAgICAgICAgICAgIC8vIFRhc2tDcmVhdGUgQ0FMTFMgc2VlbgogIHZhciBwZW5kaW5nQ3JlYXRlcyA9IHt9OyAgICAgICAgICAgICAgIC8vIHRvb2xfdXNlIGlkIOKGkiBhd2FpdGluZyBpdHMgcmVzdWx0CiAgdmFyIGNyZWF0ZWRJZHMgPSB7fTsgICAgICAgICAgICAgICAgICAgLy8gdGFzayBpZHMgdGhpcyB0cmFuc2NyaXB0IGFjdHVhbGx5IG9wZW5lZAogIHZhciBjcmVhdGVkSWRDb3VudCA9IDA7CiAgdmFyIGxhdGVzdCA9IHt9OyAgICAgICAgICAgICAgICAgICAgICAgLy8gdGFzayBpZCDihpIgbW9zdCByZWNlbnQgc3RhdHVzIHNlZW4KICAvLyBXYWxrZWQgYnkgbmV3bGluZSBpbmRleCByYXRoZXIgdGhhbiByYXcuc3BsaXQoJ1xuJyk6IHRoZSBzcGxpdCB3b3VsZCBob2xkIGEKICAvLyBzZWNvbmQgZnVsbC1zaXplIGNvcHkgb2YgYSBtdWx0aS1NQiB0cmFuc2NyaXB0IGFsb25nc2lkZSB0aGUgZmlyc3QsIGFuZCB0aGUKICAvLyBzY2FuIG5lZWRzIG9uZSBsaW5lIGF0IGEgdGltZS4KICB2YXIgcG9zID0gMDsKICB3aGlsZSAocG9zIDw9IHJhdy5sZW5ndGgpIHsKICAgIHZhciBubCA9IHJhdy5pbmRleE9mKCdcbicsIHBvcyk7CiAgICB2YXIgbGluZSA9IG5sIDwgMCA/IHJhdy5zbGljZShwb3MpIDogcmF3LnNsaWNlKHBvcywgbmwpOwogICAgcG9zID0gbmwgPCAwID8gcmF3Lmxlbmd0aCArIDEgOiBubCArIDE7CiAgICAvLyBDaGVhcCBwcmUtZmlsdGVyLiBBIG11bHRpLU1CIHRyYW5zY3JpcHQgaGFzIGEgaGFuZGZ1bCBvZiB0YXNrIGxpbmVzIGFuZAogICAgLy8gdGVucyBvZiB0aG91c2FuZHMgb2Ygb3RoZXJzOyBKU09OLnBhcnNlIG9uIGV2ZXJ5IGxpbmUgaXMgdGhlIHdob2xlIGNvc3QuCiAgICBpZiAobGluZS5pbmRleE9mKCdUYXNrQ3JlYXRlJykgPCAwICYmIGxpbmUuaW5kZXhPZignVGFza1VwZGF0ZScpIDwgMAogICAgICAmJiBsaW5lLmluZGV4T2YoJ2NyZWF0ZWQgc3VjY2Vzc2Z1bGx5JykgPCAwKSBjb250aW51ZTsKICAgIHZhciBlbnRyeTsKICAgIHRyeSB7IGVudHJ5ID0gSlNPTi5wYXJzZShsaW5lKTsgfSBjYXRjaCAoZSkgeyBjb250aW51ZTsgfQogICAgdmFyIGNvbnRlbnQgPSBlbnRyeSAmJiBlbnRyeS5tZXNzYWdlICYmIGVudHJ5Lm1lc3NhZ2UuY29udGVudDsKICAgIGlmICghQXJyYXkuaXNBcnJheShjb250ZW50KSkgY29udGludWU7CiAgICBmb3IgKHZhciBqID0gMDsgaiA8IGNvbnRlbnQubGVuZ3RoOyBqKyspIHsKICAgICAgdmFyIGJsb2NrID0gY29udGVudFtqXTsKICAgICAgaWYgKCFibG9jaykgY29udGludWU7CiAgICAgIC8vIFRoZSBjcmVhdGVkIGlkcyBjb21lIGZyb20gVGFza0NyZWF0ZSdzIFJFU1VMVCwgYmVjYXVzZSB0aGUgY2FsbCBpdHNlbGYKICAgICAgLy8gY2FycmllcyBubyBpZC4gV2l0aG91dCB0aGVtIGBjcmVhdGVkYCAoYSBjb3VudCBvZiBjYWxscykgYW5kIHRoZSBjbG9zZWQKICAgICAgLy8gc2V0IChhIHNldCBvZiBpZHMpIGFyZSBkaWZmZXJlbnQgdW5pdHM6IGEgVGFza1VwZGF0ZSBuYW1pbmcgYSB0YXNrIGZyb20KICAgICAgLy8gYmVmb3JlIHRoaXMgdHJhbnNjcmlwdCDigJQgb25lIGNhcnJpZWQgYWNyb3NzIGAvY2xlYXJgLCB3aGljaCBpcyBleGFjdGx5CiAgICAgIC8vIHdoYXQgQ2xhdWRlIENvZGUncyB0YXNrIHN0b3JlIGRvZXMg4oCUIHdvdWxkIGRpc2NvdW50IGEgdGFzayBpdCBuZXZlcgogICAgICAvLyBvcGVuZWQsIGFuZCB0aGUgYWR2aXNvcnkgd291bGQgdW5kZXItcmVwb3J0IHRoZSBvcGVuIGxpc3QuCiAgICAgIGlmIChibG9jay50eXBlID09PSAndG9vbF9yZXN1bHQnKSB7CiAgICAgICAgaWYgKCFwZW5kaW5nQ3JlYXRlc1tibG9jay50b29sX3VzZV9pZF0pIGNvbnRpbnVlOwogICAgICAgIGRlbGV0ZSBwZW5kaW5nQ3JlYXRlc1tibG9jay50b29sX3VzZV9pZF07CiAgICAgICAgdmFyIHRleHQgPSB0eXBlb2YgYmxvY2suY29udGVudCA9PT0gJ3N0cmluZycgPyBibG9jay5jb250ZW50IDogSlNPTi5zdHJpbmdpZnkoYmxvY2suY29udGVudCk7CiAgICAgICAgdmFyIG0gPSAvVGFzayAjKFxTKykgY3JlYXRlZCBzdWNjZXNzZnVsbHkvLmV4ZWModGV4dCB8fCAnJyk7CiAgICAgICAgaWYgKG0gJiYgIWNyZWF0ZWRJZHNbbVsxXV0pIHsgY3JlYXRlZElkc1ttWzFdXSA9IHRydWU7IGNyZWF0ZWRJZENvdW50Kys7IH0KICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICAvLyBTdHJ1Y3R1cmFsLCBub3Qgc3Vic3RyaW5nLiBBIGxpbmUgdGhhdCBtZXJlbHkgTUVOVElPTlMgVGFza0NyZWF0ZSDigJQgdGhpcwogICAgICAvLyB0aWNrZXQncyBvd24gZGlzY3Vzc2lvbiwgYSBndWlkYW5jZSBleGNlcnB0LCBhIHNoZWxsIGNvbW1hbmQgZWNob2luZyB0aGUKICAgICAgLy8gcGhyYXNlIOKAlCBpcyB0ZXh0LCBhbmQgY291bnRpbmcgaXQgd291bGQgaW5mbGF0ZSB0aGUgY3JlYXRlZCB0b3RhbCBvbgogICAgICAvLyBleGFjdGx5IHRoZSBzZXNzaW9ucyBtb3N0IGxpa2VseSB0byByZWFjaCBhIFBSIGdhdGUuIENvcnJlbGF0aW5nIG9uCiAgICAgIC8vIHRvb2xfdXNlX2lkIGlzIHdoYXQga2VlcHMgc3VjaCBhbiBlY2hvIG91dCBvZiB0aGUgY3JlYXRlZCBpZHMgdG9vLgogICAgICBpZiAoYmxvY2sudHlwZSAhPT0gJ3Rvb2xfdXNlJykgY29udGludWU7CiAgICAgIGlmIChibG9jay5uYW1lID09PSAnVGFza0NyZWF0ZScpIHsKICAgICAgICBjcmVhdGVkKys7CiAgICAgICAgaWYgKGJsb2NrLmlkKSBwZW5kaW5nQ3JlYXRlc1tibG9jay5pZF0gPSB0cnVlOwogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGlmIChibG9jay5uYW1lICE9PSAnVGFza1VwZGF0ZScpIGNvbnRpbnVlOwogICAgICB2YXIgaW5wdXQgPSBibG9jay5pbnB1dCB8fCB7fTsKICAgICAgdmFyIGlkID0gaW5wdXQudGFza0lkICE9IG51bGwgPyBpbnB1dC50YXNrSWQgOiBpbnB1dC50YXNrX2lkOwogICAgICB2YXIgc3RhdHVzID0gaW5wdXQuc3RhdHVzOwogICAgICBpZiAoaWQgPT0gbnVsbCB8fCB0eXBlb2Ygc3RhdHVzICE9PSAnc3RyaW5nJyB8fCAhc3RhdHVzKSBjb250aW51ZTsKICAgICAgLy8gTGFzdCB3cml0ZSB3aW5zIOKAlCB0cmFuc2NyaXB0IG9yZGVyIGlzIGNocm9ub2xvZ2ljYWwsIHNvIGEgdGFzayByZW9wZW5lZAogICAgICAvLyBhZnRlciBjb21wbGV0aW9uIGlzIGNvcnJlY3RseSBjb3VudGVkIGFzIG9wZW4gYWdhaW4uCiAgICAgIGxhdGVzdFtTdHJpbmcoaWQpXSA9IHN0YXR1czsKICAgIH0KICB9CiAgaWYgKGNyZWF0ZWQgPT09IDApIHJldHVybiBudWxsOwogIC8vIEEgY3JlYXRlIHdob3NlIHJlc3VsdCBuZXZlciBsYW5kZWQgKGludGVycnVwdGVkIGNhbGwsIHRydW5jYXRlZCB0cmFuc2NyaXB0KQogIC8vIGlzIGNvdW50ZWQgT1BFTjogaXQgd2FzIG9wZW5lZCwgYW5kIG5vdGhpbmcgb2JzZXJ2ZWQgaXQgYmVpbmcgY2xvc2VkLgogIHZhciBvcGVuID0gY3JlYXRlZCAtIGNyZWF0ZWRJZENvdW50OwogIE9iamVjdC5rZXlzKGNyZWF0ZWRJZHMpLmZvckVhY2goZnVuY3Rpb24oaWQpIHsKICAgIC8vIGBkZWxldGVkYCBjbG9zZXMgdGhlIGxvb3AgYXMgbGVnaXRpbWF0ZWx5IGFzIGBjb21wbGV0ZWRgOiBhIHRhc2sgcmVtb3ZlZAogICAgLy8gYmVjYXVzZSBpdCBubyBsb25nZXIgYXBwbGllcyBpcyBub3QgYW4gYWJhbmRvbmVkIG9uZS4KICAgIGlmIChsYXRlc3RbaWRdICE9PSAnY29tcGxldGVkJyAmJiBsYXRlc3RbaWRdICE9PSAnZGVsZXRlZCcpIG9wZW4rKzsKICB9KTsKICBpZiAob3BlbiA+IGNyZWF0ZWQpIG9wZW4gPSBjcmVhdGVkOwogIHJldHVybiB7IGNyZWF0ZWQ6IGNyZWF0ZWQsIGNsb3NlZDogY3JlYXRlZCAtIG9wZW4sIG9wZW46IG9wZW4gfTsKfQoKc3dpdGNoIChjb21tYW5kKSB7CiAgY2FzZSAnY2hlY2stYmVmb3JlLWFnZW50JzogewogICAgLy8gTW9zdGx5IGFkdmlzb3J5LiBUaGUgVGFza0NyZWF0ZSArIG1lbW9yeSByZW1pbmRlcnMgYmVsb3cgZ28gdG8gc3Rkb3V0IGFuZAogICAgLy8gbmV2ZXIgYmxvY2sg4oCUIHRoZWlyIHdvcmRpbmcgbXVzdCBub3QgY2xhaW0gb3RoZXJ3aXNlICgjMTMyNikuIFRoZSBvbmUKICAgIC8vIGV4Y2VwdGlvbiBpcyB0aGUgIzk1MiBzd2FybS9oaXZlIGNoZWNrIGF0IHRoZSBib3R0b20gb2YgdGhpcyBjYXNlLCB3aGljaAogICAgLy8gd3JpdGVzIHRvIHN0ZGVyciBhbmQgZXhpdHMgMi4KICAgIC8vIE1lbW9yeS1maXJzdCBlbmZvcmNlbWVudCBvdGhlcndpc2UgaGFwcGVucyBhdCB0aGUgc2Nhbi9yZWFkIGdhdGUgbGF5ZXIuCiAgICAvLyBTdWJhZ2VudFN0YXJ0IGhvb2sgaW5qZWN0cyBndWlkYW5jZSBkaXJlY3RpdmUgaW50byBzdWJhZ2VudCBjb250ZXh0LgogICAgLy8KICAgIC8vICM5MzEg4oCUIFRhc2tDcmVhdGUgUkVNSU5ERVIgYW5kIHRoZSBuYW1lc3BhY2UgaGludCBtb3ZlZCBoZXJlIGZyb20KICAgIC8vIHByb21wdC1yZW1pbmRlci4gVGhleSBvbmx5IG1hdHRlciB3aGVuIENsYXVkZSBpcyBhY3R1YWxseSBhYm91dCB0byBzcGF3bgogICAgLy8gYW4gQWdlbnQ7IGVtaXR0aW5nIHBlci1wcm9tcHQgY29zdCB+OTAgdG9rZW5zIMOXIGV2ZXJ5IHByb21wdCDDlyBldmVyeQogICAgLy8gY29uc3VtZXIuCiAgICB2YXIgcyA9IHJlYWRTdGF0ZSgpOwogICAgaWYgKGNvbmZpZy50YXNrX2NyZWF0ZV9maXJzdCAmJiAhcy50YXNrc0NyZWF0ZWQpIHsKICAgICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoJ1JFTUlOREVSOiBVc2UgVGFza0NyZWF0ZSBiZWZvcmUgc3Bhd25pbmcgYWdlbnRzLlxuJyk7CiAgICB9CiAgICBpZiAoY29uZmlnLm1lbW9yeV9maXJzdCAmJiBzLm1lbW9yeVJlcXVpcmVkICYmICFzLm1lbW9yeVNlYXJjaGVkKSB7CiAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKCdSRU1JTkRFUjogU2VhcmNoIG1lbW9yeSAobWNwX19tb2Zsb19fbWVtb3J5X3NlYXJjaCkgYmVmb3JlIHNwYXduaW5nIGFnZW50cy4gT24gY2h1bmsgaGl0cywgdHJhdmVyc2UgdmlhIG1jcF9fbW9mbG9fX21lbW9yeV9nZXRfbmVpZ2hib3JzIOKAlCBzZWUgLmNsYXVkZS9ndWlkYW5jZS9tb2Zsby1tZW1vcnktcHJvdG9jb2wubWRcbicpOwogICAgfQogICAgaWYgKHMubGFzdE5hbWVzcGFjZUhpbnQpIHsKICAgICAgLy8gUGVyLWFjdG9yIHNpbmdsZS1zaG90LiBFYWNoIHNlc3Npb25faWQgZ2V0cyB0aGUgaGludCBhdCBtb3N0IG9uY2UgcGVyCiAgICAgIC8vIHByb21wdCwgYnV0IHRoZSBoaW50IGl0c2VsZiBzdGF5cyBhdmFpbGFibGUgZm9yIG90aGVyIGFjdG9ycyAoZS5nLgogICAgICAvLyBhIHN1YmFnZW50IHRoYXQgc3Bhd25zIGl0cyBvd24gYWdlbnQgaGFzIGl0cyBvd24gc2Vzc2lvbl9pZCBhbmQgaXMKICAgICAgLy8gZW50aXRsZWQgdG8gYSBmcmVzaCBlbWlzc2lvbikuIEZhbGxzIGJhY2sgdG8gYSBgX2xlZ2FjeV9gIGJ1Y2tldCB3aGVuCiAgICAgIC8vIENsYXVkZSBDb2RlIGRpZG4ndCBmb3J3YXJkIGEgc2Vzc2lvbl9pZCAob2xkZXIgaG9zdCBvciBkaXJlY3QgQ0xJCiAgICAgIC8vIGludm9jYXRpb24pLCBwcmVzZXJ2aW5nIHRoZSBvbGQgImVtaXQgb25jZSBnbG9iYWxseSIgYmVoYXZpb3IuIFRoZQogICAgICAvLyBtYXAgaXMgd2lwZWQgYnkgYXBwbHlQcm9tcHRTdGF0ZVJlc2V0IG9uIGV2ZXJ5IG5ldyBwcm9tcHQuCiAgICAgIHZhciBzaWQgPSBwcm9jZXNzLmVudi5IT09LX1NFU1NJT05fSUQgfHwgJyc7CiAgICAgIHZhciBlbWl0dGVkQnkgPSBzLmxhc3ROYW1lc3BhY2VIaW50RW1pdHRlZEJ5IHx8IHt9OwogICAgICB2YXIgYnVja2V0ID0gc2lkIHx8ICdfbGVnYWN5Xyc7CiAgICAgIGlmICghZW1pdHRlZEJ5W2J1Y2tldF0pIHsKICAgICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZShzLmxhc3ROYW1lc3BhY2VIaW50ICsgJ1xuJyk7CiAgICAgICAgZW1pdHRlZEJ5W2J1Y2tldF0gPSB0cnVlOwogICAgICAgIHMubGFzdE5hbWVzcGFjZUhpbnRFbWl0dGVkQnkgPSBlbWl0dGVkQnk7CiAgICAgICAgd3JpdGVTdGF0ZShzKTsKICAgICAgfQogICAgfQogICAgLy8gIzk1MiDigJQgd2hlbiAvZmwgd2FzIGludm9rZWQgd2l0aCAtcy8taCwgdGhlIHByb3RlY3RlZCBNQ1AgaW5pdCBtdXN0IHJ1bgogICAgLy8gQkVGT1JFIGFueSBBZ2VudCBzcGF3bi4gSGFyZCBibG9jazogdGhlIHVzZXIgZXhwbGljaXRseSBvcHRlZCBpbiB0bwogICAgLy8gbW9mbG8ncyBjb29yZGluYXRpb24gc3VyZmFjZSwgc28gc2lsZW50bHkgZGlzcGF0Y2hpbmcgYEFnZW50YCBjYWxscwogICAgLy8gd2l0aG91dCBgbWNwX19tb2Zsb19fc3dhcm1faW5pdGAgLyBgbWNwX19tb2Zsb19faGl2ZS1taW5kX2luaXRgIGlzIHRoZQogICAgLy8gZmFpbHVyZSBtb2RlIHRoaXMgZ2F0ZSBleGlzdHMgdG8gcHJldmVudCAoQ0xBVURFLm1kICLim5QgUHJvdGVjdGVkCiAgICAvLyBmdW5jdGlvbmFsaXR5IOKAlCBzd2FybSArIGhpdmUtbWluZCIpLiBPdGhlciBBZ2VudCB1c2VzIHJlbWFpbiBhZHZpc29yeS4KICAgIGlmIChjb25maWcuc3dhcm1faW52b2NhdGlvbl9nYXRlKSB7CiAgICAgIGlmIChzLmZsTW9kZSA9PT0gJ3N3YXJtJyAmJiAhcy5zd2FybUluaXRpYWxpemVkKSB7CiAgICAgICAgcHJvY2Vzcy5zdGRlcnIud3JpdGUoJ0JMT0NLRUQ6IC9mbCB3YXMgaW52b2tlZCB3aXRoIC1zLy0tc3dhcm0gYnV0IG1jcF9fbW9mbG9fX3N3YXJtX2luaXQgaGFzIG5vdCBiZWVuIGNhbGxlZC5cbicpOwogICAgICAgIHByb2Nlc3Muc3RkZXJyLndyaXRlKCdSdW4gbWNwX19tb2Zsb19fc3dhcm1faW5pdCBmaXJzdCwgdGhlbiBtY3BfX21vZmxvX19hZ2VudF9zcGF3biBmb3IgZWFjaCByb2xlLCB0aGVuIGRpc3BhdGNoIEFnZW50LlxuJyk7CiAgICAgICAgcHJvY2Vzcy5zdGRlcnIud3JpdGUoQ09PUkRfRkFMTEJBQ0tfTk9URSArICcgIG5weCBmbG8gc3dhcm0gaW5pdCAtLXRvcG9sb2d5IGhpZXJhcmNoaWNhbCAgKHRoZW46IG5weCBmbG8gYWdlbnQgc3Bhd24gLS10eXBlIDxyb2xlPilcbicpOwogICAgICAgIHByb2Nlc3Muc3RkZXJyLndyaXRlKCdTZWUgLmNsYXVkZS9za2lsbHMvZmwvZXhlY3V0aW9uLW1vZGVzLm1kICJTV0FSTSBtb2RlIiBhbmQgQ0xBVURFLm1kICLim5QgUHJvdGVjdGVkIGZ1bmN0aW9uYWxpdHkiLlxuJyk7CiAgICAgICAgcHJvY2Vzcy5zdGRlcnIud3JpdGUoJ0Rpc2FibGUgdmlhIG1vZmxvLnlhbWw6IGdhdGVzOiBzd2FybV9pbnZvY2F0aW9uX2dhdGU6IGZhbHNlXG4nKTsKICAgICAgICBwcm9jZXNzLmV4aXQoMik7CiAgICAgIH0KICAgICAgaWYgKHMuZmxNb2RlID09PSAnaGl2ZScgJiYgIXMuaGl2ZUluaXRpYWxpemVkKSB7CiAgICAgICAgcHJvY2Vzcy5zdGRlcnIud3JpdGUoJ0JMT0NLRUQ6IC9mbCB3YXMgaW52b2tlZCB3aXRoIC1oLy0taGl2ZSBidXQgbWNwX19tb2Zsb19faGl2ZS1taW5kX2luaXQgaGFzIG5vdCBiZWVuIGNhbGxlZC5cbicpOwogICAgICAgIHByb2Nlc3Muc3RkZXJyLndyaXRlKCdSdW4gbWNwX19tb2Zsb19faGl2ZS1taW5kX2luaXQgZmlyc3QsIHRoZW4gZGlzcGF0Y2ggQWdlbnQgb3IgaGl2ZS1taW5kIHdvcmtlcnMuXG4nKTsKICAgICAgICBwcm9jZXNzLnN0ZGVyci53cml0ZShDT09SRF9GQUxMQkFDS19OT1RFICsgJyAgbnB4IGZsbyBoaXZlLW1pbmQgaW5pdCAgKHRoZW46IG5weCBmbG8gaGl2ZS1taW5kIHNwYXduKVxuJyk7CiAgICAgICAgcHJvY2Vzcy5zdGRlcnIud3JpdGUoJ1NlZSAuY2xhdWRlL3NraWxscy9mbC9leGVjdXRpb24tbW9kZXMubWQgIkhJVkUtTUlORCBtb2RlIiBhbmQgQ0xBVURFLm1kICLim5QgUHJvdGVjdGVkIGZ1bmN0aW9uYWxpdHkiLlxuJyk7CiAgICAgICAgcHJvY2Vzcy5zdGRlcnIud3JpdGUoJ0Rpc2FibGUgdmlhIG1vZmxvLnlhbWw6IGdhdGVzOiBzd2FybV9pbnZvY2F0aW9uX2dhdGU6IGZhbHNlXG4nKTsKICAgICAgICBwcm9jZXNzLmV4aXQoMik7CiAgICAgIH0KICAgIH0KICAgIGJyZWFrOwogIH0KICBjYXNlICdyZWNvcmQtc3dhcm0taW5pdCc6IHsKICAgIC8vICM5NTIg4oCUIHdpcmVkIHRvIG1jcF9fbW9mbG9fX3N3YXJtX2luaXQgUG9zdFRvb2xVc2UuIE1hcmtzIHRoZSBnYXRlCiAgICAvLyBzYXRpc2ZpZWQgc28gc3Vic2VxdWVudCBBZ2VudCBzcGF3bnMgdW5kZXIgL2ZsIC1zIHBhc3MuCiAgICB2YXIgcyA9IHJlYWRTdGF0ZSgpOwogICAgaWYgKCFzLnN3YXJtSW5pdGlhbGl6ZWQpIHsKICAgICAgcy5zd2FybUluaXRpYWxpemVkID0gdHJ1ZTsKICAgICAgd3JpdGVTdGF0ZShzKTsKICAgIH0KICAgIGJyZWFrOwogIH0KICBjYXNlICdyZWNvcmQtYmFzaC1zd2FybS1pbml0JzogewogICAgLy8gIzEzMzggZm9sbG93LXVwIOKAlCB0aGUgQ0xJIGhhbGYgb2YgcmVjb3JkLXN3YXJtLWluaXQgLyByZWNvcmQtaGl2ZS1pbml0LgogICAgLy8gV2lyZWQgUG9zdFRvb2xVc2VbQmFzaHxQb3dlclNoZWxsXSwgc28gaXQgb25seSBzZWVzIGNvbW1hbmRzIHRoYXQKICAgIC8vIHN1Y2NlZWRlZCAoIzEzMjIpLiBTZWUgYmFzaENvb3JkaW5hdGlvbkluaXQgZm9yIHdoeSB0aGUgQ0xJIHJvdXRlIGlzIGEKICAgIC8vIHJlYWwgc2F0aXNmYWN0aW9uIG9mIHRoZSAjOTUyIGdhdGUgYW5kIG5vdCBhIHN0YW5kLWluLgogICAgdmFyIGtpbmQgPSBiYXNoQ29vcmRpbmF0aW9uSW5pdChwcm9jZXNzLmVudi5UT09MX0lOUFVUX2NvbW1hbmQgfHwgJycpOwogICAgaWYgKCFraW5kKSBicmVhazsKICAgIHZhciBzID0gcmVhZFN0YXRlKCk7CiAgICB2YXIgZmxhZyA9IGtpbmQgPT09ICdzd2FybScgPyAnc3dhcm1Jbml0aWFsaXplZCcgOiAnaGl2ZUluaXRpYWxpemVkJzsKICAgIGlmICghc1tmbGFnXSkgewogICAgICBzW2ZsYWddID0gdHJ1ZTsKICAgICAgd3JpdGVTdGF0ZShzKTsKICAgIH0KICAgIGJyZWFrOwogIH0KICBjYXNlICdyZWNvcmQtaGl2ZS1pbml0JzogewogICAgLy8gIzk1MiDigJQgd2lyZWQgdG8gbWNwX19tb2Zsb19faGl2ZS1taW5kX2luaXQgUG9zdFRvb2xVc2UuCiAgICB2YXIgcyA9IHJlYWRTdGF0ZSgpOwogICAgaWYgKCFzLmhpdmVJbml0aWFsaXplZCkgewogICAgICBzLmhpdmVJbml0aWFsaXplZCA9IHRydWU7CiAgICAgIHdyaXRlU3RhdGUocyk7CiAgICB9CiAgICBicmVhazsKICB9CiAgY2FzZSAnY2hlY2stYmVmb3JlLXNjYW4nOiB7CiAgICBpZiAoIWNvbmZpZy5tZW1vcnlfZmlyc3QpIGJyZWFrOwogICAgdmFyIHMgPSByZWFkU3RhdGUoKTsKICAgIGlmICghcy5tZW1vcnlSZXF1aXJlZCB8fCBpc01lbW9yeVNlYXJjaGVkRm9yKHMpKSBicmVhazsKICAgIHZhciB0YXJnZXQgPSAocHJvY2Vzcy5lbnYuVE9PTF9JTlBVVF9wYXR0ZXJuIHx8ICcnKSArICcgJyArIChwcm9jZXNzLmVudi5UT09MX0lOUFVUX3BhdGggfHwgJycpOwogICAgaWYgKGlzRXBoZW1lcmFsUGF0aChwcm9jZXNzLmVudi5UT09MX0lOUFVUX3BhdGgpKSBicmVhazsKICAgIGlmIChFWEVNUFQuc29tZShmdW5jdGlvbihwKSB7IHJldHVybiB0YXJnZXQuaW5kZXhPZihwKSA+PSAwOyB9KSkgYnJlYWs7CiAgICBwcm9jZXNzLnN0ZGVyci53cml0ZSgnQkxPQ0tFRCBbbW9mbG8gbWVtb3J5X2ZpcnN0IGdhdGVdOiBTZWFyY2ggbWVtb3J5IGJlZm9yZSBleHBsb3JpbmcgZmlsZXMuIFVzZSBtY3BfX21vZmxvX19tZW1vcnlfc2VhcmNoLiBPbiBjaHVuayBoaXRzLCB0cmF2ZXJzZSB2aWEgbWNwX19tb2Zsb19fbWVtb3J5X2dldF9uZWlnaGJvcnMg4oCUIHNlZSAuY2xhdWRlL2d1aWRhbmNlL21vZmxvLW1lbW9yeS1wcm90b2NvbC5tZFxuJyArIE1DUF9GQUxMQkFDS19OT1RFICsgJ1xuJyArIEdBVEVfT1JJR0lOX05PVEUgKyAnXG4nICsgR0FURV9ESVNBQkxFX05PVEUgKyAnXG4nKTsKICAgIHByb2Nlc3MuZXhpdCgyKTsKICB9CiAgY2FzZSAnY2hlY2stYmVmb3JlLXJlYWQnOiB7CiAgICBpZiAoIWNvbmZpZy5tZW1vcnlfZmlyc3QpIGJyZWFrOwogICAgdmFyIHMgPSByZWFkU3RhdGUoKTsKICAgIGlmICghcy5tZW1vcnlSZXF1aXJlZCB8fCBpc01lbW9yeVNlYXJjaGVkRm9yKHMpKSBicmVhazsKICAgIHZhciBmcCA9IHByb2Nlc3MuZW52LlRPT0xfSU5QVVRfZmlsZV9wYXRoIHx8ICcnOwogICAgLy8gRXBoZW1lcmFsIHRtcC9zY3JhdGNoIHJlYWRzIGFyZSBleGVtcHQgZXZlbiB3aGVuIHRoZXkgbG9vayBsaWtlIGd1aWRhbmNlCiAgICAvLyAoYSB0ZW1wIGNvcHkgaXMgc3RpbGwgdHJhbnNpZW50IHRvb2wgSS9PLCBub3QgdGhlIGluZGV4ZWQgc291cmNlKS4KICAgIGlmIChpc0VwaGVtZXJhbFBhdGgoZnApKSBicmVhazsKICAgIHZhciBpc0d1aWRhbmNlID0gZnAuaW5kZXhPZignLmNsYXVkZS9ndWlkYW5jZS8nKSA+PSAwIHx8IGZwLmluZGV4T2YoJy5jbGF1ZGVcXGd1aWRhbmNlXFwnKSA+PSAwOwogICAgaWYgKCFpc0d1aWRhbmNlICYmIEVYRU1QVC5zb21lKGZ1bmN0aW9uKHApIHsgcmV0dXJuIGZwLmluZGV4T2YocCkgPj0gMDsgfSkpIGJyZWFrOwogICAgcHJvY2Vzcy5zdGRlcnIud3JpdGUoJ0JMT0NLRUQgW21vZmxvIG1lbW9yeV9maXJzdCBnYXRlXTogU2VhcmNoIG1lbW9yeSBiZWZvcmUgcmVhZGluZyBmaWxlcy4gVXNlIG1jcF9fbW9mbG9fX21lbW9yeV9zZWFyY2guIE9uIGNodW5rIGhpdHMsIHRyYXZlcnNlIHZpYSBtY3BfX21vZmxvX19tZW1vcnlfZ2V0X25laWdoYm9ycyDigJQgc2VlIC5jbGF1ZGUvZ3VpZGFuY2UvbW9mbG8tbWVtb3J5LXByb3RvY29sLm1kXG4nICsgTUNQX0ZBTExCQUNLX05PVEUgKyAnXG4nICsgR0FURV9PUklHSU5fTk9URSArICdcbicgKyBHQVRFX0RJU0FCTEVfTk9URSArICdcbicpOwogICAgcHJvY2Vzcy5leGl0KDIpOwogIH0KICBjYXNlICdyZWNvcmQtdGFzay1jcmVhdGVkJzogewogICAgdmFyIHMgPSByZWFkU3RhdGUoKTsKICAgIHMudGFza3NDcmVhdGVkID0gdHJ1ZTsKICAgIHMudGFza0NvdW50ID0gKHMudGFza0NvdW50IHx8IDApICsgMTsKICAgIHdyaXRlU3RhdGUocyk7CiAgICBicmVhazsKICB9CiAgLy8gIzE0MzUg4oCUIHRoZSBlc2NhcGUgZnJvbSB0aGUgdGFzay1zdGF0dXMgZ2F0ZSwgZm9yIHdvcmsgZGVsaWJlcmF0ZWx5IGxlZnQKICAvLyBvcGVuLiBTZXNzaW9uLXNjb3BlZCBsaWtlIGBsZWFybmluZ3NTdG9yZWRgOiBpdCBsaXZlcyBpbiBTVEFURV9ERUZBVUxUUywgc28KICAvLyBzZXNzaW9uLXJlc2V0IGNsZWFycyBpdCwgYW5kIG5laXRoZXIgYXBwbHlQcm9tcHRTdGF0ZVJlc2V0IG5vcgogIC8vIHJlc2V0LWVkaXQtZ2F0ZXMgdG91Y2hlcyBpdCDigJQgYSBkZWNpc2lvbiB0aGUgdXNlciBtYWRlIGFib3V0IHRoZSB0YXNrIGxpc3QKICAvLyBpcyBub3QgaW52YWxpZGF0ZWQgYnkgdGhlIG5leHQgcHJvbXB0IG9yIHRoZSBuZXh0IHNvdXJjZSBlZGl0LgogIC8vCiAgLy8gQSBwbGFpbiBmbGFnLCBub3QgYSBjb3VudC4gVGhlIGNvbW1hbmQgaXMgdHlwZWQgYnkgdGhlIG1vZGVsIGludG8gYSBCYXNoCiAgLy8gdG9vbCwgd2hlcmUgSE9PS19UUkFOU0NSSVBUX1BBVEggaXMgdW5zZXQgKGl0IGlzIGZvcndhcmRlZCBieSBnYXRlLWhvb2subWpzCiAgLy8gZnJvbSB0aGUgaG9vayBwYXlsb2FkIGFuZCBleGlzdHMgb25seSBpbnNpZGUgYSBob29rKSwgc28gdGhpcyBwcm9jZXNzIGNhbm5vdAogIC8vIHJlYWQgdGhlIGxlZGdlciB0byByZWNvcmQgV0hJQ0ggdGFza3Mgd2VyZSBhY2tub3dsZWRnZWQgZXZlbiBpZiBpdCB3YW50ZWQgdG8uCiAgY2FzZSAncmVjb3JkLXRhc2tzLWFja25vd2xlZGdlZCc6IHsKICAgIHZhciBzID0gcmVhZFN0YXRlKCk7CiAgICBpZiAoIXMudGFza3NBY2tub3dsZWRnZWQpIHsKICAgICAgcy50YXNrc0Fja25vd2xlZGdlZCA9IHRydWU7CiAgICAgIHdyaXRlU3RhdGUocyk7CiAgICB9CiAgICAvLyB3cml0ZVN0YXRlIHN3YWxsb3dzIGl0cyBvd24gZXJyb3JzIGJ5IGRlc2lnbiDigJQgYSBnYXRlIG11c3QgbmV2ZXIgY3Jhc2ggdGhlCiAgICAvLyBob29rIGl0IHJ1bnMgaW4uIFRoYXQgd2FzIGhhcm1sZXNzIHdoaWxlIGV2ZXJ5IHJlY29yZGVyIHdhcyBhZHZpc29yeS4gVGhpcwogICAgLy8gb25lIGlzIHRoZSBPTkxZIGVzY2FwZSBmcm9tIGEgQkxPQ0tJTkcgZ2F0ZSwgc28gYSBsb3N0IHdyaXRlIHdvdWxkIHJlcG9ydAogICAgLy8gInNhdGlzZmllZCIgYW5kIHRoZW4gYmxvY2sgdGhlIHZlcnkgbmV4dCBgZ2ggcHIgY3JlYXRlYCB3aXRoIG5vdGhpbmcgc2FpZAogICAgLy8gYWJvdXQgd2h5OiAjMTMzMidzIGRlYWRsb2NrIHNoYXBlIGV4YWN0bHkuIENvbmZpcm0gaXQgbGFuZGVkIGJlZm9yZQogICAgLy8gY2xhaW1pbmcgaXQgZGlkLCBhbmQgbmFtZSB0aGUgZmlsZSBhbmQgdGhlIHdheSBvdXQgd2hlbiBpdCBkaWQgbm90LgogICAgaWYgKCFyZWFkU3RhdGUoKS50YXNrc0Fja25vd2xlZGdlZCkgewogICAgICBwcm9jZXNzLnN0ZGVyci53cml0ZSgKICAgICAgICAnVGFzay1zdGF0dXMgZ2F0ZSBOT1Qgc2F0aXNmaWVkOiB0aGUgYWNrbm93bGVkZ2VtZW50IGNvdWxkIG5vdCBiZSBwZXJzaXN0ZWQgdG9cbicgKwogICAgICAgIFNUQVRFX0ZJTEUgKyAnXG4nICsKICAgICAgICAnQ2hlY2sgdGhhdCB0aGUgZmlsZSBhbmQgaXRzIGRpcmVjdG9yeSBhcmUgd3JpdGFibGUsIHRoZW4gcnVuIHRoaXMgYWdhaW4uXG4nICsKICAgICAgICAnVG8gcHJvY2VlZCB3aXRob3V0IGl0OiBzZXQgZ2F0ZXM6IHRhc2tfc3RhdHVzX2dhdGU6IG9mZiBpbiBtb2Zsby55YW1sLlxuJyk7CiAgICAgIHByb2Nlc3MuZXhpdCgxKTsKICAgIH0KICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKAogICAgICAnVGFzay1zdGF0dXMgZ2F0ZSBzYXRpc2ZpZWQ6IG9wZW4gdGFza3MgYWNrbm93bGVkZ2VkIGFzIGRlbGliZXJhdGVseSBkZWZlcnJlZC5cbicgKwogICAgICAnVGhleSBzdGF5IHZpc2libGUgaW4gdGhlIHRhc2sgbGlzdCDigJQgdGhpcyByZWNvcmRzIHRoZSBkZWNpc2lvbiwgaXQgZG9lcyBub3QgY2xvc2UgdGhlbS5cbicpOwogICAgYnJlYWs7CiAgfQogIGNhc2UgJ3JlY29yZC1tZW1vcnktc2VhcmNoZWQnOiB7CiAgICB2YXIgcyA9IHJlYWRTdGF0ZSgpOwogICAgaWYgKG1hcmtNZW1vcnlTZWFyY2hlZChzKSkgd3JpdGVTdGF0ZShzKTsKICAgIGJyZWFrOwogIH0KICBjYXNlICdjaGVjay1iYXNoLW1lbW9yeSc6IHsKICAgIC8vICMxMTMyIOKAlCBwcmVzZXJ2ZSBDUkVESVQgc2lkZS1lZmZlY3QgQU5EIGFkZCBhIEJMT0NLIGFybSBmb3IgcmVhZC1saWtlCiAgICAvLyBCYXNoIGNvbW1hbmRzLiBXaXJlZCBhcyBQcmVUb29sVXNlW0Jhc2hdICh3YXMgUG9zdFRvb2xVc2UgYmVmb3JlICMxMTMyKQogICAgLy8gc28gcHJvY2Vzcy5leGl0KDIpIGFjdHVhbGx5IHByZXZlbnRzIHRoZSByZWFkIGZyb20gcmVhY2hpbmcgdGhlIHNoZWxsLgogICAgLy8KICAgIC8vICMxMTcxIOKAlCB0aGUgY2FzZSBuYW1lIGlzIGhpc3RvcmljYWwuIFRoZSBtYXRjaGVyIG5vdyBhbHNvIGNvdmVycyB0aGUKICAgIC8vIGRlZGljYXRlZCBgUG93ZXJTaGVsbGAgdG9vbCwgYW5kIFJFQURfTElLRV9CQVNIX1JFIGFscmVhZHkgbWF0Y2hlZCBQUwogICAgLy8gcmVhZGVycyAoR2V0LUNvbnRlbnQvU2VsZWN0LVN0cmluZy9HZXQtQ2hpbGRJdGVtIC1SZWN1cnNlL0Zvcm1hdC1IZXgpLgogICAgLy8gVHJlYXQgdGhpcyBjYXNlIGFzIHNoZWxsLWFnbm9zdGljIHJlYWQtZ2F0ZSBsb2dpYy4KICAgIHZhciBjbWQgPSBwcm9jZXNzLmVudi5UT09MX0lOUFVUX2NvbW1hbmQgfHwgJyc7CgogICAgLy8gMSkgQ1JFRElUIOKAlCBwcmVzZXJ2ZWQgYmVoYXZpb3IuIEEgcmVhbCBtZW1vcnktc2VhcmNoIGludm9jYXRpb24gZmxpcHMKICAgIC8vIHRoZSBnYXRlIGZsYWcgc28gc3Vic2VxdWVudCBSZWFkL0dyZXAvR2xvYiB3aXRoaW4gdGhpcyBwcm9tcHQgcGFzcy4KICAgIGlmIChjcmVkaXRzTWVtb3J5U2VhcmNoKGNtZCkpIHsKICAgICAgdmFyIHMgPSByZWFkU3RhdGUoKTsKICAgICAgaWYgKG1hcmtNZW1vcnlTZWFyY2hlZChzKSkgd3JpdGVTdGF0ZShzKTsKICAgICAgYnJlYWs7CiAgICB9CgogICAgLy8gMikgQkxPQ0sg4oCUIG5ldyBiZWhhdmlvci4gQ2hlYXAgcmVnZXggY2hlY2tzIGNvbWUgQkVGT1JFIHJlYWRTdGF0ZSgpIHNvCiAgICAvLyB0aGUgb3ZlcndoZWxtaW5nIG1ham9yaXR5IG9mIEJhc2ggaW52b2NhdGlvbnMgKGdpdC9ucG0vY3VybC9lY2hvL2V0Yy4pCiAgICAvLyBuZXZlciB0b3VjaCB0aGUgZmlsZXN5c3RlbS4gT3JkZXI6IGNvbmZpZyBmbGFnIOKGkiBjb21tYW5kLXNoYXBlIHJlZ2V4ZXMKICAgIC8vIOKGkiBzdGF0ZSByZWFkIOKGkiBtZW1vcnkgZ2F0ZS4KICAgIGlmICghY29uZmlnLm1lbW9yeV9maXJzdCkgYnJlYWs7CiAgICBpZiAoIVJFQURfTElLRV9CQVNIX1JFLnRlc3QoY21kKSkgYnJlYWs7CiAgICAvLyAjMTQ0NSDigJQgdGhlIGNhcnZlLW91dCBpcyBhbmNob3JlZCB0byB0aGUgTEVBRElORyBjb21tYW5kLCBzbyBpdHMgYG5vZGVgCiAgICAvLyBhbmQgYGdpdGAgYXJtcyBzd2FsbG93IGV2ZXJ5IHNoYXBlIFJVTk5FUl9SRUFEX1NPVVJDRVMgZXhpc3RzIHRvIGNhdGNoLgogICAgLy8gVGhvc2Ugc2hhcGVzIGVhcm4gdGhlaXIgcmVhZCBjbGFzc2lmaWNhdGlvbiBmcm9tIHdoYXQgZm9sbG93cyB0aGUgbGVhZGluZwogICAgLy8gdG9rZW4sIHNvIHRoZXkgb3ZlcnJpZGUgdGhlIGNhcnZlLW91dDsgZXZlcnkgb3RoZXIgY29tbWFuZCBrZWVwcyAjMTEzMidzCiAgICAvLyBzZW1hbnRpY3MgZXhhY3RseSAoYG5wbSB0ZXN0IHwgZ3JlcCBGQUlMYCwgYGdpdCBkaWZmYCwgYG5vZGUgYnVpbGQubWpzYCkuCiAgICBpZiAoQkFTSF9DQVJWRV9PVVRfUkUudGVzdChjbWQpICYmICFSVU5ORVJfUkVBRF9CQVNIX1JFLnRlc3QoY21kKSkgYnJlYWs7CiAgICB2YXIgczIgPSByZWFkU3RhdGUoKTsKICAgIGlmICghczIubWVtb3J5UmVxdWlyZWQgfHwgaXNNZW1vcnlTZWFyY2hlZEZvcihzMikpIGJyZWFrOwogICAgLy8gSGludCBwcmVjZWRlbmNlOiBwcm9tcHQtZGVyaXZlZCBjbGFzc2lmaWNhdGlvbiAoc2V0IGJ5IGFwcGx5UHJvbXB0U3RhdGVSZXNldAogICAgLy8gZnJvbSB0aGUgdXNlciBwcm9tcHQgdGV4dCkg4oaSIGNvbW1hbmQtc2hhcGUgY2xhc3NpZmljYXRpb24gKHdvcmtzIGZvcgogICAgLy8gc3ViYWdlbnRzIHRoYXQgbmV2ZXIgc2F3IHRoZSB1c2VyIHByb21wdCkuIEVpdGhlciBzb3VyY2UgcmV0dXJucyBhIGZ1bGwKICAgIC8vICJNZW1vcnkgbmFtZXNwYWNlIGhpbnQ6IC4uLiIgc2VudGVuY2Ugc28gdGhlIEJMT0NLIG1lc3NhZ2Ugc3RheXMgdW5pZm9ybS4KICAgIHZhciBoaW50ID0gczIubGFzdE5hbWVzcGFjZUhpbnQgfHwgY2xhc3NpZnlCYXNoTmFtZXNwYWNlSGludChjbWQpIHx8ICcnOwogICAgcHJvY2Vzcy5zdGRlcnIud3JpdGUoCiAgICAgICdCTE9DS0VEIFttb2ZsbyBtZW1vcnlfZmlyc3QgZ2F0ZV06IFNlYXJjaCBtZW1vcnkgYmVmb3JlIHJlYWRpbmcgZmlsZXMgdmlhIEJhc2guXG4nICsKICAgICAgJ0V4YW1wbGU6IG1jcF9fbW9mbG9fX21lbW9yeV9zZWFyY2ggeyBxdWVyeTogIjx0b3BpYz4iLCBuYW1lc3BhY2U6ICI8b25lIG9mOiBndWlkYW5jZSB8IGNvZGUtbWFwIHwgcGF0dGVybnMgfCBsZWFybmluZ3MgfCB0ZXN0cz4iIH1cbicgKwogICAgICAoaGludCA/IGhpbnQgKyAnXG4nIDogJycpICsKICAgICAgJ09uIGNodW5rIGhpdHMsIHRyYXZlcnNlIHZpYSBtY3BfX21vZmxvX19tZW1vcnlfZ2V0X25laWdoYm9ycyDigJQgc2VlIC5jbGF1ZGUvZ3VpZGFuY2UvbW9mbG8tbWVtb3J5LXByb3RvY29sLm1kXG4nICsKICAgICAgTUNQX0ZBTExCQUNLX05PVEUgKyAnXG4nICsKICAgICAgR0FURV9PUklHSU5fTk9URSArICdcbicgKwogICAgICBHQVRFX0RJU0FCTEVfTk9URSArICdcbicKICAgICk7CiAgICBwcm9jZXNzLmV4aXQoMik7CiAgICBicmVhazsKICB9CiAgY2FzZSAnY2hlY2stdGFzay10cmFuc2l0aW9uJzogewogICAgLy8gSW50ZW50aW9uYWwgbm8tb3AsIHJldGFpbmVkIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBvbmx5ICgjMTMzMSkuCiAgICAvLyBUaGUgYF5UYXNrVXBkYXRlJGAgd2lyaW5nIHdhcyByZW1vdmVkIGZyb20gc2V0dGluZ3MtZ2VuZXJhdG9yLnRzLAogICAgLy8gaG9vay1ibG9jay1oYXNoLnRzIGFuZCBob29rLXdpcmluZy50cyBiZWNhdXNlIHNwYXduaW5nIGdhdGUtaG9vay5tanMgKwogICAgLy8gZ2F0ZS5janMgb24gZXZlcnkgVGFza1VwZGF0ZSB0byBkbyBub3RoaW5nIGlzIHB1cmUgb3ZlcmhlYWQuIFRoZSBjYXNlCiAgICAvLyBzdGF5cyBiZWNhdXNlIGRvY3Rvci1jaGVja3MtZGVlcC50cyBsaXN0cyBpdCBpbiBSRVFVSVJFRF9HQVRFX0NBU0VTIOKAlAogICAgLy8gZHJvcHBpbmcgdGhlIGNhc2Ugd291bGQgdHVybiBgZmxvIGRvY3RvcmAncyBHYXRlIEhlYWx0aCBjaGVjayByZWQgaW4KICAgIC8vIGV2ZXJ5IGNvbnN1bWVyIGZvciBubyBnYWluLiAoRmFsbGluZyB0aHJvdWdoIHRvIGBkZWZhdWx0OiBicmVha2Agd291bGQKICAgIC8vIG90aGVyd2lzZSBiZSBoYXJtbGVzczsgdGhpcyBpcyBhYm91dCB0aGUgZG9jdG9yIGNvbnRyYWN0LCBub3QgcnVudGltZS4pCiAgICAvLyBXaHkgaXQgZG9lcyBub3RoaW5nOiBzZWUgYXBwbHlQcm9tcHRTdGF0ZVJlc2V0KCkuCiAgICBicmVhazsKICB9CiAgLy8gIzE0MzQg4oCUIHRoZSBnYXRlIGRlbWFuZGVkIG9uZSBtZW1vcnlfc3RvcmUgcGVyIHJ1biB3aGV0aGVyIG9yIG5vdCB0aGUgcnVuCiAgLy8gcHJvZHVjZWQgYSByZXVzYWJsZSBsZXNzb24sIGFuZCBhIG1hbmRhdG9yeSB3cml0ZSB3aXRoIG5vdGhpbmcgdG8gc2F5CiAgLy8gcHJvZHVjZXMgZmlsbGVyOiBhIHN1bW1hcnkgb2YgdGhpcyB0aWNrZXQsIHRoaXMgY29tbWl0LCBhcHBsaWNhYmxlIG5ldmVyCiAgLy8gYWdhaW4uIG1lbW9yeV9zZWFyY2ggcmV0dXJucyBhIGJvdW5kZWQgc2V0LCBzbyBlYWNoIG9mIHRob3NlIGRpc3BsYWNlcyBhCiAgLy8gcmVhbCBsZXNzb24gZnJvbSBldmVyeSBmdXR1cmUgc2VhcmNoIOKAlCB0aGUgY29zdCBpcyByZXRyaWV2YWwgcXVhbGl0eSwgbm90CiAgLy8gZGlzay4gRGVjbGFyaW5nICJub3RoaW5nIGR1cmFibGUgaGVyZSIgaXMgdGhlIGhvbmVzdCBvdXRjb21lIG9mIGEgcnVuIHRoYXQKICAvLyBsZWFybmVkIG5vdGhpbmcgbmV3LCBzbyBpdCBoYXMgdG8gYmUgcmVhY2hhYmxlIHdpdGhvdXQgYSB3cml0ZTsgb3RoZXJ3aXNlCiAgLy8gdGhlIGNoZWFwZXN0IHdheSBwYXN0IHRoZSBnYXRlIHN0YXlzIHRoZSBmaWxsZXIgd3JpdGUuCiAgLy8KICAvLyBCb3RoIGNyZWRpdHMgc2V0IHRoZSBzYW1lIGZsYWc7IHRoZXkgZGlmZmVyIG9ubHkgaW4gd2hldGhlciB0aGUgcnVuIGhhcwogIC8vIHNvbWV0aGluZyB0byBzYXkuIFNoYXJpbmcgdGhlIGNhc2UgYm9keSBrZWVwcyB0aGF0IHNpbmdsZSB3cml0ZSBpbiBvbmUKICAvLyBwbGFjZSBhY3Jvc3MgYWxsIHRocmVlIGNvcGllcyBvZiB0aGlzIGZpbGUuCiAgY2FzZSAncmVjb3JkLWxlYXJuaW5ncy1zdG9yZWQnOgogIGNhc2UgJ3JlY29yZC1uby1kdXJhYmxlLWxlc3Nvbic6IHsKICAgIHZhciBzID0gcmVhZFN0YXRlKCk7CiAgICBpZiAoIXMubGVhcm5pbmdzU3RvcmVkKSB7CiAgICAgIHMubGVhcm5pbmdzU3RvcmVkID0gdHJ1ZTsKICAgICAgd3JpdGVTdGF0ZShzKTsKICAgIH0KICAgIGlmIChjb21tYW5kID09PSAncmVjb3JkLW5vLWR1cmFibGUtbGVzc29uJykgewogICAgICAvLyBTYW1lIHJlYXNvbmluZyBhcyByZWNvcmQtdGFza3MtYWNrbm93bGVkZ2VkIGFib3ZlOiB3cml0ZVN0YXRlIHN3YWxsb3dzCiAgICAgIC8vIGl0cyBvd24gZXJyb3JzIHNvIGEgZ2F0ZSBuZXZlciBjcmFzaGVzIHRoZSBob29rIGl0IHJ1bnMgaW4sIGFuZCB0aGlzIGlzCiAgICAgIC8vIHRoZSBPTkxZIGVzY2FwZSBmcm9tIHRoZSBCTE9DS0lORyBsZWFybmluZ3MgZ2F0ZSB0aGF0IGRvZXMgbm90IHJlcXVpcmUgYQogICAgICAvLyBtZW1vcnlfc3RvcmUuIEEgbG9zdCB3cml0ZSBoZXJlIHdvdWxkIHByaW50ICJzYXRpc2ZpZWQiIGFuZCB0aGVuIGJsb2NrCiAgICAgIC8vIHRoZSBuZXh0IGBnaCBwciBjcmVhdGVgIHdpdGggbm90aGluZyBzYWlkIGFib3V0IHdoeSDigJQgIzEzMzIncyBkZWFkbG9jay4KICAgICAgLy8gVmVyaWZpZWQgb25seSBvbiB0aGlzIGFybTogcmVjb3JkLWxlYXJuaW5ncy1zdG9yZWQgaXMgZmlyZWQKICAgICAgLy8gYXV0b21hdGljYWxseSBieSB0aGUgUG9zdFRvb2xVc2UgaG9vayBvbiBldmVyeSBtZW1vcnlfc3RvcmUsIHdoZXJlIGEKICAgICAgLy8gZmFpbGVkIHdyaXRlIGxlYXZlcyB0aGUgZ2F0ZSBjbG9zZWQgYnV0IHRoZSBydW4gc3RpbGwgaGFzIHRoZSBvcmRpbmFyeQogICAgICAvLyB3YXkgdGhyb3VnaCwgYW5kIGEgZGlhZ25vc3RpYyBvbiBldmVyeSBzdG9yZSB3b3VsZCBiZSBub2lzZS4KICAgICAgaWYgKCFyZWFkU3RhdGUoKS5sZWFybmluZ3NTdG9yZWQpIHsKICAgICAgICBwcm9jZXNzLnN0ZGVyci53cml0ZSgKICAgICAgICAgICdMZWFybmluZ3MgZ2F0ZSBOT1Qgc2F0aXNmaWVkOiB0aGUgZGVjbGFyYXRpb24gY291bGQgbm90IGJlIHBlcnNpc3RlZCB0b1xuJyArCiAgICAgICAgICBTVEFURV9GSUxFICsgJ1xuJyArCiAgICAgICAgICAnQ2hlY2sgdGhhdCB0aGUgZmlsZSBhbmQgaXRzIGRpcmVjdG9yeSBhcmUgd3JpdGFibGUsIHRoZW4gcnVuIHRoaXMgYWdhaW4uXG4nICsKICAgICAgICAgICdUbyBwcm9jZWVkIHdpdGhvdXQgaXQ6IHNldCBnYXRlczogbGVhcm5pbmdzX2dhdGU6IGZhbHNlIGluIG1vZmxvLnlhbWwuXG4nKTsKICAgICAgICBwcm9jZXNzLmV4aXQoMSk7CiAgICAgIH0KICAgICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoCiAgICAgICAgJ0xlYXJuaW5ncyBnYXRlIHNhdGlzZmllZDogbm8gZHVyYWJsZSBsZXNzb24gZGVjbGFyZWQgZm9yIHRoaXMgcnVuLlxuJyArCiAgICAgICAgJ1doYXQgdGhpcyBydW4gZGlkIGJlbG9uZ3MgaW4gdGhlIFBSIGJvZHksIG5vdCBpbiBtZW1vcnkuXG4nLAogICAgICApOwogICAgfQogICAgYnJlYWs7CiAgfQogIGNhc2UgJ3JlY29yZC10ZXN0LXJ1bic6IHsKICAgIHZhciBjbWQgPSBwcm9jZXNzLmVudi5UT09MX0lOUFVUX2NvbW1hbmQgfHwgJyc7CiAgICBpZiAoVEVTVF9SVU5ORVJfUkUudGVzdChjbWQpKSB7CiAgICAgIC8vICMxMzIyIOKAlCBhIHJlZCBydW4gaXMgZXZpZGVuY2UgQUdBSU5TVCB0aGUgZ2F0ZSwgc28gaXQgYWxzbyBjbGVhcnMgYQogICAgICAvLyBmbGFnIGFuIGVhcmxpZXIgZ3JlZW4gcnVuIGVhcm5lZC4gV2l0aG91dCB0aGUgcmVzZXQsIGBucG0gdGVzdGAgKGdyZWVuKQogICAgICAvLyBmb2xsb3dlZCBieSBhbiBlZGl0IGFuZCBgbnBtIHRlc3QgfCB0YWlsIC0yMGAgKHJlZCkgd291bGQgbGVhdmUgdGhlCiAgICAgIC8vIGdhdGUgc2F0aXNmaWVkIGJ5IHRoZSBzdGFsZSBmaXJzdCBydW4g4oCUIHRoZSBlZGl0IHJlc2V0cyB0ZXN0c1J1biwgYnV0CiAgICAgIC8vIHRoZSBtYXNrZWQgcmVkIHJ1biB3b3VsZCBpbW1lZGlhdGVseSBzZXQgaXQgYmFjay4KICAgICAgdmFyIGZhaWx1cmUgPSBkZXRlY3RUZXN0RmFpbHVyZSgpOwogICAgICB2YXIgcyA9IHJlYWRTdGF0ZSgpOwogICAgICBpZiAoZmFpbHVyZSkgewogICAgICAgIGlmIChzLnRlc3RzUnVuKSB7IHMudGVzdHNSdW4gPSBmYWxzZTsgcy50ZXN0c0ZpbmdlcnByaW50ID0gbnVsbDsgd3JpdGVTdGF0ZShzKTsgfQogICAgICAgIHByb2Nlc3Muc3RkZXJyLndyaXRlKCdnYXRlOiByZWNvcmQtdGVzdC1ydW4gbm90IGNyZWRpdGVkIOKAlCAnICsgZmFpbHVyZSArICdcbicpOwogICAgICB9IGVsc2UgewogICAgICAgIC8vIFJlLXN0YW1wIG9uIGV2ZXJ5IGdyZWVuIHJ1biwgbm90IG9ubHkgdGhlIGZpcnN0OiB0aGUgdHJlZSBtYXkgaGF2ZQogICAgICAgIC8vIG1vdmVkIHNpbmNlIHRoZSBsYXN0IG9uZSwgYW5kIHRoaXMgcnVuIGlzIGV2aWRlbmNlIGFib3V0IHRoZSB0cmVlIGFzCiAgICAgICAgLy8gaXQgaXMgTk9XLiBHYXRpbmcgb24gYCFzLnRlc3RzUnVuYCB3b3VsZCBrZWVwIHRoZSBvbGRlciBmaW5nZXJwcmludAogICAgICAgIC8vIGFuZCBkaXNjYXJkIHRoZSBmcmVzaGVyIGV2aWRlbmNlLgogICAgICAgIHZhciB0ZXN0c0ZwID0gY3JlZGl0RmluZ2VycHJpbnQoJ2FsbCcpOwogICAgICAgIGlmICghcy50ZXN0c1J1biB8fCBzLnRlc3RzRmluZ2VycHJpbnQgIT09IHRlc3RzRnApIHsKICAgICAgICAgIHMudGVzdHNSdW4gPSB0cnVlOwogICAgICAgICAgcy50ZXN0c0ZpbmdlcnByaW50ID0gdGVzdHNGcDsKICAgICAgICAgIHdyaXRlU3RhdGUocyk7CiAgICAgICAgfQogICAgICB9CiAgICB9IGVsc2UgaWYgKGNtZCkgewogICAgICAvLyAjMTE3NiDigJQgZW1pdCBhIHN0ZGVyciBjcnVtYiB3aGVuIGludm9rZWQgd2l0aCBhIG5vbi1lbXB0eSBjb21tYW5kIHRoYXQKICAgICAgLy8gZG9lc24ndCBtYXRjaCB0aGUgdGVzdC1ydW5uZXIgcGF0dGVybi4gQ29tbW9uIHBpdGZhbGw6IHVzZXJzIHJ1biB0aGUKICAgICAgLy8gc3RhbXAgbWFudWFsbHkgZnJvbSBhIHRlcm1pbmFsIHRvICJzYXRpc2Z5IHRoZSBnYXRlIjsgdGhlIHNpbGVudCBuby1vcAogICAgICAvLyBsb29rcyBpbmRpc3Rpbmd1aXNoYWJsZSBmcm9tIHN1Y2Nlc3MuIGdhdGUtaG9vay5tanMgZHJvcHMgc3RkZXJyIGZyb20KICAgICAgLy8gZXhpdC0wIGludm9jYXRpb25zLCBzbyB0aGlzIG9ubHkgc3VyZmFjZXMgdG8gZGlyZWN0IENMSSB1c2Ug4oCUIGV4YWN0bHkKICAgICAgLy8gdGhlIGNhc2Ugd2hlcmUgdGhlIGZyaWN0aW9uIGxpdmVzLgogICAgICB2YXIgcHJldmlldyA9IGNtZC5sZW5ndGggPiA4MCA/IGNtZC5zbGljZSgwLCA3NykgKyAnLi4uJyA6IGNtZDsKICAgICAgcHJvY2Vzcy5zdGRlcnIud3JpdGUoJ2dhdGU6IHJlY29yZC10ZXN0LXJ1biBuby1vcCDigJQgVE9PTF9JTlBVVF9jb21tYW5kPSInICsgcHJldmlldyArICciIGRpZCBub3QgbWF0Y2ggVEVTVF9SVU5ORVJfUkVcbicpOwogICAgfQogICAgYnJlYWs7CiAgfQogIGNhc2UgJ3JlY29yZC1za2lsbC1ydW4nOiB7CiAgICB2YXIgc2tOYW1lID0gKHByb2Nlc3MuZW52LlRPT0xfSU5QVVRfc2tpbGwgfHwgJycpOwogICAgaWYgKHNrTmFtZSA9PT0gJ3NpbXBsaWZ5JyB8fCBza05hbWUgPT09ICdmbG8tc2ltcGxpZnknIHx8IHNrTmFtZSA9PT0gJ2Rpc3RpbGwnKSB7CiAgICAgIHZhciBzID0gcmVhZFN0YXRlKCk7CiAgICAgIHZhciBjaGFuZ2VkID0gZmFsc2U7CiAgICAgIGlmICghcy5zaW1wbGlmeVJ1bikgeyBzLnNpbXBsaWZ5UnVuID0gdHJ1ZTsgY2hhbmdlZCA9IHRydWU7IH0KICAgICAgLy8gJ25vbnRlc3QnIHNjb3BlOiBhIGxhdGVyIHRlc3Qtb25seSBlZGl0IG11c3Qgbm90IGludmFsaWRhdGUgdGhpcyByZXZpZXcKICAgICAgLy8gKCM5MDgpLCBzbyB0ZXN0IGZpbGVzIGFyZSBleGNsdWRlZCBmcm9tIHdoYXQgdGhlIGNyZWRpdCBpcyBwaW5uZWQgdG8uCiAgICAgIHZhciBzaW1wbGlmeUZwID0gY3JlZGl0RmluZ2VycHJpbnQoJ25vbnRlc3QnKTsKICAgICAgaWYgKHMuc2ltcGxpZnlGaW5nZXJwcmludCAhPT0gc2ltcGxpZnlGcCkgeyBzLnNpbXBsaWZ5RmluZ2VycHJpbnQgPSBzaW1wbGlmeUZwOyBjaGFuZ2VkID0gdHJ1ZTsgfQogICAgICAvLyBTbmFwc2hvdCBIRUFEIHNvIGNoZWNrLWJlZm9yZS1wciBjYW4gY2xhc3NpZnkgZGVsdGEtc2luY2Utc2ltcGxpZnkgYW5kCiAgICAgIC8vIHNraXAgYSByZWR1bmRhbnQgL3NpbXBsaWZ5IHJlLXJ1biB3aGVuIG9ubHkgdHJpdmlhbCBmaXhlcyBmb2xsb3dlZC4KICAgICAgLy8gTm9uLWZhdGFsIOKAlCBnYXRlIGZhbGxzIHRocm91Z2ggdG8gY3VycmVudCBiZWhhdmlvdXIgd2l0aG91dCB0aGUgc25hcHNob3QuCiAgICAgIHRyeSB7CiAgICAgICAgdmFyIHNoYSA9IGNwLmV4ZWNGaWxlU3luYygnZ2l0JywgWydyZXYtcGFyc2UnLCAnSEVBRCddLCB7CiAgICAgICAgICBjd2Q6IFBST0pFQ1RfRElSLCBlbmNvZGluZzogJ3V0Zi04JywgdGltZW91dDogMjAwMCwgd2luZG93c0hpZGU6IHRydWUsCiAgICAgICAgICBzdGRpbzogWydpZ25vcmUnLCAncGlwZScsICdpZ25vcmUnXQogICAgICAgIH0pLnRyaW0oKTsKICAgICAgICBpZiAoc2hhICYmIHMuc2ltcGxpZnlTbmFwc2hvdFNoYSAhPT0gc2hhKSB7IHMuc2ltcGxpZnlTbmFwc2hvdFNoYSA9IHNoYTsgY2hhbmdlZCA9IHRydWU7IH0KICAgICAgfSBjYXRjaCAoZSkgeyAvKiBubyBnaXQgb3IgZGV0YWNoZWQgc3RhdGUg4oCUIHNraXAgc25hcHNob3QsIGdhdGUgc3RpbGwgd29ya3MgKi8gfQogICAgICBpZiAoY2hhbmdlZCkgd3JpdGVTdGF0ZShzKTsKICAgIH0gZWxzZSBpZiAoc2tOYW1lKSB7CiAgICAgIC8vICMxMTc2IOKAlCBzYW1lIHJhdGlvbmFsZSBhcyByZWNvcmQtdGVzdC1ydW4uIEEgbm8tb3Agc3RhbXAgb24gYSBub24tc2ltcGxpZnkKICAgICAgLy8gc2tpbGwgbmFtZSBpcyBzaWxlbnQgdG8gaG9va3MgKGdhdGUtaG9vay5tanMgZHJvcHMgZXhpdC0wIHN0ZGVycikgYnV0CiAgICAgIC8vIHZpc2libGUgd2hlbiBhIHVzZXIgcnVucyB0aGUgc3RhbXAgZGlyZWN0bHkgdG8gInNhdGlzZnkgdGhlIGdhdGUiIGFuZAogICAgICAvLyB3b25kZXJzIHdoeSBzaW1wbGlmeVJ1biBzdGF5cyBmYWxzZS4KICAgICAgcHJvY2Vzcy5zdGRlcnIud3JpdGUoJ2dhdGU6IHJlY29yZC1za2lsbC1ydW4gbm8tb3Ag4oCUIFRPT0xfSU5QVVRfc2tpbGw9IicgKyBza05hbWUgKyAnIiBpcyBub3Qgc2ltcGxpZnkvZmxvLXNpbXBsaWZ5XG4nKTsKICAgIH0KICAgIGJyZWFrOwogIH0KICBjYXNlICdyZWNvcmQtdmVyaWZ5LXJ1bic6IHsKICAgIC8vIFN0b3J5ICMxMjc0IChFcGljICMxMjY5KS4gRmlyZXMgUG9zdFRvb2xVc2Ugb24gXlNraWxsJCB3aGVuIHRoZSBuYXRpdmUKICAgIC8vIC92ZXJpZnkgc2tpbGwgcnVucywgc2F0aXNmeWluZyB0aGUgdmVyaWZ5LWJlZm9yZS1kb25lIGdhdGUuIE1pcnJvcnMKICAgIC8vIHJlY29yZC1za2lsbC1ydW4ncyBmYXVsdC10b2xlcmFudCBzaGFwZS4gVGhlIHZlcmlmaWNhdGlvbiBPVVRDT01FICh3aGF0CiAgICAvLyB3YXMgY2hlY2tlZCwgcGFzcy9mYWlsKSBpcyB3cml0dGVuIHRvIG1lbW9yeSBieSB0aGUgdmVyaWZ5IGZsb3cgaXRzZWxmCiAgICAvLyB2aWEgbWNwX19tb2Zsb19fbWVtb3J5X3N0b3JlIOKAlCBzYW1lIGRpdmlzaW9uIG9mIGxhYm91ciBhcyB0ZXN0c1J1biB2cyB0aGUKICAgIC8vIHRlc3Qgb3V0cHV0OyB0aGlzIHJlY29yZGVyIG9ubHkgdHJhY2tzIHRoYXQgdmVyaWZpY2F0aW9uIGhhcHBlbmVkLgogICAgdmFyIHZOYW1lID0gKHByb2Nlc3MuZW52LlRPT0xfSU5QVVRfc2tpbGwgfHwgJycpOwogICAgLy8gT25seSB0aGUgbmF0aXZlIC92ZXJpZnkgc2tpbGwgc2F0aXNmaWVzIHZlcmlmeS1iZWZvcmUtZG9uZS4gL3dhcmQgYW5kCiAgICAvLyAvcXVpY2tlbiBhcmUgdGFyZ2V0ZWQgYXVkaXRzLCBOT1QgdGhlIGNvbXBsZXRpb24gZ2F0ZSAoc2VlIGZsL3NkZC5tZCkg4oCUCiAgICAvLyBjcmVkaXRpbmcgdGhlbSB3b3VsZCBsZXQgdGhlIGdhdGUgcGFzcyB3aXRob3V0IGFuIGVuZC10by1lbmQgdmVyaWZ5LgogICAgaWYgKHZOYW1lID09PSAndmVyaWZ5JykgewogICAgICB2YXIgcyA9IHJlYWRTdGF0ZSgpOwogICAgICAvLyAjMTMzMjogaW52b2tpbmcgL3ZlcmlmeSBzdGFydHMgYSB2ZXJpZmljYXRpb247IGl0IGRvZXMgbm90IGNvbmNsdWRlCiAgICAgIC8vIG9uZS4gQ2xlYXIgYW55IHByaW9yIHZlcmRpY3Qgc28gdGhlIHJ1biBpbiBwcm9ncmVzcyBjYW5ub3QgaW5oZXJpdCB0aGUKICAgICAgLy8gUEFTUyBmcm9tIGEgcHJldmlvdXMgaXNzdWUgYW5kIHNhdGlzZnkgY2hlY2stYmVmb3JlLWRvbmUgb24gaXRzIG93bi4KICAgICAgdmFyIHZlcmlmeUZwID0gY3JlZGl0RmluZ2VycHJpbnQoJ2FsbCcpOwogICAgICBpZiAoIXMudmVyaWZ5UnVuIHx8IHMudmVyaWZ5T3V0Y29tZSB8fCBzLnZlcmlmeUZpbmdlcnByaW50ICE9PSB2ZXJpZnlGcCkgewogICAgICAgIHMudmVyaWZ5UnVuID0gdHJ1ZTsKICAgICAgICBzLnZlcmlmeU91dGNvbWUgPSBudWxsOwogICAgICAgIHMudmVyaWZ5RmluZ2VycHJpbnQgPSB2ZXJpZnlGcDsKICAgICAgICB3cml0ZVN0YXRlKHMpOwogICAgICB9CiAgICB9IGVsc2UgaWYgKHZOYW1lKSB7CiAgICAgIHByb2Nlc3Muc3RkZXJyLndyaXRlKCdnYXRlOiByZWNvcmQtdmVyaWZ5LXJ1biBuby1vcCDigJQgVE9PTF9JTlBVVF9za2lsbD0iJyArIHZOYW1lICsgJyIgaXMgbm90IHZlcmlmeVxuJyk7CiAgICB9CiAgICBicmVhazsKICB9CiAgY2FzZSAncmVjb3JkLXZlcmlmeS1vdXRjb21lJzogewogICAgLy8gIzEzMzIuIEZpcmVzIFBvc3RUb29sVXNlIG9uIG1jcF9fbW9mbG9fX21lbW9yeV9zdG9yZS4gYHJlY29yZC12ZXJpZnktcnVuYAogICAgLy8gYWJvdmUgcHJvdmVzIGEgdmVyaWZpY2F0aW9uIHdhcyBBVFRFTVBURUQ7IHRoaXMgcHJvdmVzIGhvdyBpdCBFTkRFRC4KICAgIC8vCiAgICAvLyBUaGUgdmVyZGljdCBpcyByZWFkIGZyb20gdGhlIHN0cnVjdHVyZWQgcmVjb3JkICMxMzI4IG1hZGUgL3ZlcmlmeSB3cml0ZQogICAgLy8gdG8gbWVtb3J5X3N0b3JlJ3MgYG1ldGFkYXRhYCDigJQgbmV2ZXIgcGFyc2VkIG91dCBvZiB0aGUgcHJvc2UgYHZhbHVlYCwKICAgIC8vIHdoaWNoIGlzIHByZWNpc2VseSB0aGUgZnJlZS10ZXh0IGRlcGVuZGVuY3kgIzEzMjggcmVtb3ZlZC4gZ2F0ZS1ob29rLm1qcwogICAgLy8gZm9yd2FyZHMgdGhlIG9iamVjdCBhcyBKU09OIChzZWUgaXRzIE1BWF9TVFJVQ1RVUkVEX0xFTiBub3RlKS4KICAgIHZhciBtS2V5ID0gcHJvY2Vzcy5lbnYuVE9PTF9JTlBVVF9rZXkgfHwgJyc7CiAgICBpZiAobUtleS5pbmRleE9mKCd2ZXJpZnk6JykgIT09IDApIGJyZWFrOwogICAgdmFyIHJhd01ldGEgPSBwcm9jZXNzLmVudi5UT09MX0lOUFVUX21ldGFkYXRhIHx8ICcnOwogICAgaWYgKCFyYXdNZXRhKSB7CiAgICAgIHByb2Nlc3Muc3RkZXJyLndyaXRlKCdnYXRlOiByZWNvcmQtdmVyaWZ5LW91dGNvbWUg4oCUICInICsgbUtleSArICciIGNhcnJpZXMgbm8gbWV0YWRhdGE7IHZlcmRpY3Qgbm90IHJlY29yZGVkXG4nKTsKICAgICAgYnJlYWs7CiAgICB9CiAgICB2YXIgcGFyc2VkTWV0YSA9IG51bGw7CiAgICB0cnkgeyBwYXJzZWRNZXRhID0gSlNPTi5wYXJzZShyYXdNZXRhKTsgfSBjYXRjaCAoZSkgeyBwYXJzZWRNZXRhID0gbnVsbDsgfQogICAgaWYgKCFwYXJzZWRNZXRhIHx8IHR5cGVvZiBwYXJzZWRNZXRhICE9PSAnb2JqZWN0JyB8fCBwYXJzZWRNZXRhLnR5cGUgIT09ICd2ZXJpZnktcmVjb3JkJykgYnJlYWs7CiAgICB2YXIgb3ZlcmFsbCA9IHR5cGVvZiBwYXJzZWRNZXRhLm92ZXJhbGwgPT09ICdzdHJpbmcnID8gcGFyc2VkTWV0YS5vdmVyYWxsLnRvVXBwZXJDYXNlKCkgOiAnJzsKICAgIGlmIChvdmVyYWxsICE9PSAnUEFTUycgJiYgb3ZlcmFsbCAhPT0gJ0ZBSUwnICYmIG92ZXJhbGwgIT09ICdVTlZFUklGSUVEJykgewogICAgICBwcm9jZXNzLnN0ZGVyci53cml0ZSgnZ2F0ZTogcmVjb3JkLXZlcmlmeS1vdXRjb21lIOKAlCB1bnJlY29nbmlzZWQgb3ZlcmFsbD0iJyArIHBhcnNlZE1ldGEub3ZlcmFsbCArICciOyB0cmVhdGluZyBhcyBub3QtcGFzc2luZ1xuJyk7CiAgICAgIG92ZXJhbGwgPSAnVU5WRVJJRklFRCc7CiAgICB9CiAgICB2YXIgdnMgPSByZWFkU3RhdGUoKTsKICAgIC8vICMxMzQ4IOKAlCByZWZ1c2UgYSB2ZXJkaWN0IGZvciBhIHJ1biB0aGF0IGlzIG5vIGxvbmdlciBsaXZlLiBgdmVyaWZ5UnVuYAogICAgLy8gZmFsc2UgaGVyZSBtZWFucyBhIGNvZGUgZWRpdCBmaXJlZCByZXNldC1lZGl0LWdhdGVzIGJldHdlZW4gdGhlIC92ZXJpZnkKICAgIC8vIGludm9jYXRpb24gYW5kIHRoaXMgc3RvcmUsIHNvIHRoZSB2ZXJkaWN0IGRlc2NyaWJlcyBwcmUtZWRpdCBjb2RlLgogICAgLy8gUmVjb3JkaW5nIGl0IGFueXdheSBwcm9kdWNlZCB0aGUgY29udHJhZGljdG9yeSBgdmVyaWZ5UnVuOmZhbHNlLAogICAgLy8gdmVyaWZ5T3V0Y29tZTonUEFTUydgIHN0YXRlIHRoYXQgY2hlY2stYmVmb3JlLWRvbmUncyBmb3VyLXdheSBtZXNzYWdlCiAgICAvLyBjaGFpbiBoYXMgbm8gYnJhbmNoIGZvciDigJQgaXQgcmVwb3J0cyAiYSBjb2RlIGVkaXQgaW52YWxpZGF0ZWQgdGhlIHByZXZpb3VzCiAgICAvLyB2ZXJpZmljYXRpb24iIHdoaWxlIGEgUEFTUyBzaXRzIGluIHN0YXRlLCB3aGljaCByZWFkcyBhcyBhIGdhdGUgYnVnLgogICAgaWYgKCF2cy52ZXJpZnlSdW4pIHsKICAgICAgcHJvY2Vzcy5zdGRlcnIud3JpdGUoJ2dhdGU6IHJlY29yZC12ZXJpZnktb3V0Y29tZSDigJQgIicgKyBtS2V5ICsgJyIgYXJyaXZlZCBhZnRlciBhIGNvZGUgZWRpdCBpbnZhbGlkYXRlZCB0aGUgcnVuOyB2ZXJkaWN0IG5vdCByZWNvcmRlZCAocmUtcnVuIC92ZXJpZnkpXG4nKTsKICAgICAgYnJlYWs7CiAgICB9CiAgICB2cy52ZXJpZnlPdXRjb21lID0gb3ZlcmFsbDsKICAgIHdyaXRlU3RhdGUodnMpOwogICAgYnJlYWs7CiAgfQogIGNhc2UgJ3Jlc2V0LWVkaXQtZ2F0ZXMnOiB7CiAgICB2YXIgZnAgPSBwcm9jZXNzLmVudi5UT09MX0lOUFVUX2ZpbGVfcGF0aCB8fCAnJzsKICAgIC8vIEluZXJ0IGZpbGVzIChtYXJrZG93biwgbG9ja2ZpbGVzLCBDSEFOR0VMT0csIC5lbnYuZXhhbXBsZSkgQU5EIGluZXJ0IHBhdGhzCiAgICAvLyAoLmdpdGh1Yi93b3JrZmxvd3MvLCAuZ2l0aHViL0lTU1VFX1RFTVBMQVRFLywgLmdpdGh1Yi9QVUxMX1JFUVVFU1RfVEVNUExBVEUvLCAjMTE3Nik6CiAgICAvLyBubyBnYXRlIHJlc2V0IOKAlCBlZGl0aW5nIHRoZXNlIGRvZXNuJ3QgZXhwb3NlIG5ldyBydW50aW1lIHN1cmZhY2UuCiAgICBpZiAoZnAgJiYgKEVESVRfUkVTRVRfU0tJUF9CT1RIX1JFLnRlc3QoZnApIHx8IEVESVRfUkVTRVRfU0tJUF9QQVRIX1JFLnRlc3QoZnApKSkgYnJlYWs7CiAgICAvLyAjMTM0OCDigJQgYSBzY3JhdGNocGFkIHdyaXRlIHVuZGVyIHRoZSBPUyB0ZW1wIGRpciBpcyB0cmFuc2llbnQgdG9vbCBJL08gYW5kCiAgICAvLyBjYW4gbmV2ZXIgcmVhY2ggdGhlIGJyYW5jaCBkaWZmLCBidXQgaXQgdXNlZCB0byByZXNldCB0ZXN0cyArIHNpbXBsaWZ5ICsKICAgIC8vIHZlcmlmeSBsaWtlIGFueSBzb3VyY2UgY2hhbmdlOiBhIC92ZXJpZnkgcnVuIHRoYXQgam90dGVkIGEgcHJvYmUgY2xlYXJlZAogICAgLy8gdGhlIC9mbG8tc2ltcGxpZnkgc3RhbXAsIGFuZCB0aGUgdHdvIGdhdGVzIGludmFsaWRhdGVkIGVhY2ggb3RoZXIgd2l0aCBubwogICAgLy8gb3JkZXJpbmcgdGhhdCBzYXRpc2ZpZWQgYm90aC4gUmV1c2VzIHRoZSBwcmVkaWNhdGUgdGhlIG1lbW9yeS1maXJzdCBnYXRlCiAgICAvLyBhbHJlYWR5IHRydXN0cyBmb3IgdGhlc2UgcGF0aHMgKCMxMjk0KSByYXRoZXIgdGhhbiBhIHNlY29uZCBvbmUuCiAgICAvLyBTY29wZTogdG1wLW9ubHksIE5PVCBwcm9qZWN0LXJvb3QgY29udGFpbm1lbnQg4oCUIHNvIGEgcHJvamVjdCByb290ZWQgdW5kZXIKICAgIC8vIHRtcCBoYXMgaXRzIG93biBlZGl0cyBza2lwcGVkIHRvbyAocGlubmVkIGluIHRoZSAjMTM0OCB0ZXN0cykuIENvbnRhaW5tZW50CiAgICAvLyBpcyB0aGUgbW9yZSBnZW5lcmFsIHJ1bGUsIGJ1dCBpdCBmYWlscyBPUEVOIHdoZW4gdGhlIHJvb3QgY2FuJ3QgYmUKICAgIC8vIHJlc29sdmVkLCBhbmQgYSBnYXRlIHRoYXQgc2lsZW50bHkgc3RvcHMgcmVzZXR0aW5nIGlzIHRoZSB3b3JzZSBmYWlsdXJlLgogICAgaWYgKGlzRXBoZW1lcmFsUGF0aChmcCkpIGJyZWFrOwogICAgdmFyIHMgPSByZWFkU3RhdGUoKTsKICAgIC8vIFRlc3Qtb25seSBlZGl0cyBpbnZhbGlkYXRlIHRlc3RzUnVuIGJ1dCBwcmVzZXJ2ZSBzaW1wbGlmeVJ1biAoIzkwOCkuCiAgICB2YXIgaXNUZXN0T25seSA9IGZwICYmIEVESVRfUkVTRVRfU0tJUF9TSU1QTElGWV9PTkxZX1JFLnRlc3QoZnApOwogICAgdmFyIHJlc2V0VGVzdHMgPSBzLnRlc3RzUnVuOwogICAgLy8gQSBjb2RlIGVkaXQgaW52YWxpZGF0ZXMgYSBwcmlvciB2ZXJpZmljYXRpb24gKFN0b3J5ICMxMjc0KSDigJQgc2FtZSBhcyB0ZXN0cywKICAgIC8vIGluY2x1ZGluZyB0ZXN0LW9ubHkgZWRpdHMgKHRoZSBjcml0ZXJpYSBiZWluZyB2ZXJpZmllZCBtYXkgaGF2ZSBtb3ZlZCkuCiAgICAvLyAjMTMzMjogYWxzbyBmaXJlcyB3aGVuIGEgdmVyZGljdCBsaW5nZXJzIHdpdGhvdXQgdGhlIGZsYWcsIHNvIG5vIHBhdGgKICAgIC8vIGNhbiBsZWF2ZSBhIHJlY29yZGVkIG91dGNvbWUgYmVoaW5kIGFmdGVyIGEgc291cmNlIGVkaXQuCiAgICB2YXIgcmVzZXRWZXJpZnkgPSBzLnZlcmlmeVJ1biB8fCAhIXMudmVyaWZ5T3V0Y29tZTsKICAgIHZhciByZXNldFNpbXBsaWZ5ID0gcy5zaW1wbGlmeVJ1biAmJiAhaXNUZXN0T25seTsKICAgIGlmICghcmVzZXRUZXN0cyAmJiAhcmVzZXRTaW1wbGlmeSAmJiAhcmVzZXRWZXJpZnkpIGJyZWFrOwogICAgdmFyIGdhdGVzID0gW107CiAgICBpZiAocmVzZXRUZXN0cykgeyBzLnRlc3RzUnVuID0gZmFsc2U7IGdhdGVzLnB1c2goJ3Rlc3RzJyk7IH0KICAgIC8vICMxMzMyOiBkcm9wIHRoZSByZWNvcmRlZCB2ZXJkaWN0IHdpdGggdGhlIGZsYWcuIExlYXZpbmcgYSBzdGFsZSBQQVNTCiAgICAvLyBiZWhpbmQgd291bGQgbGV0IHRoZSBuZXh0IGNoZWNrLWJlZm9yZS1kb25lIHBhc3Mgb24gYSB2ZXJkaWN0IHRoYXQKICAgIC8vIGRlc2NyaWJlcyBwcmUtZWRpdCBjb2RlLgogICAgaWYgKHJlc2V0VmVyaWZ5KSB7IHMudmVyaWZ5UnVuID0gZmFsc2U7IHMudmVyaWZ5T3V0Y29tZSA9IG51bGw7IGdhdGVzLnB1c2goJ3ZlcmlmeScpOyB9CiAgICBpZiAocmVzZXRTaW1wbGlmeSkgeyBzLnNpbXBsaWZ5UnVuID0gZmFsc2U7IGdhdGVzLnB1c2goJ3NpbXBsaWZ5Jyk7IH0KICAgIGlmIChmcCkgewogICAgICBzLmxhc3RSZXNldEJ5ID0geyBmaWxlOiBmcCwgYXQ6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSwgZ2F0ZXM6IGdhdGVzIH07CiAgICB9CiAgICB3cml0ZVN0YXRlKHMpOwogICAgYnJlYWs7CiAgfQogIGNhc2UgJ2NoZWNrLWJlZm9yZS1pbXBsZW1lbnQnOiB7CiAgICAvLyAjMTI5NyDigJQgdGhlIFNERCBmcm9udC1oYWxmIGJhY2tzdG9wLiBXaGVuIGEgcnVuIGlzIGFybWVkIGZvciBTREQKICAgIC8vIChzZGRNb2RlLCBzZXQgZnJvbSAtc2QvLS1zZGQgb3Igc2RkLmRlZmF1bHQgb24gYSAvZmxvIHJ1biksIGJsb2NrIHNvdXJjZQogICAgLy8gV3JpdGUvRWRpdCB1bnRpbCBhIHNwZWMgZXhpc3RzIGFuZCBpdHMgcGxhbiBpcyByZXZpZXdlZC4gTWlycm9ycyB0aGUKICAgIC8vIG1lbW9yeV9maXJzdCBnYXRlIHNoYXBlLiBEaXNhcm1lZCBydW5zICh0aGUgZGVmYXVsdCBmb3Igbm9uLVNERCB3b3JrKQogICAgLy8gcGFzcyBpbnN0YW50bHkuIE9wdCBvdXQgcGVyLXByb2plY3Qgd2l0aCBgZ2F0ZXM6IHNkZF9nYXRlOiBmYWxzZWAuCiAgICBpZiAoIWNvbmZpZy5zZGRfZ2F0ZSkgYnJlYWs7CiAgICB2YXIgc2kgPSByZWFkU3RhdGUoKTsKICAgIGlmICghc2kuc2RkTW9kZSkgYnJlYWs7IC8vIG5vdCBhbiBTREQgcnVuIOKAlCBubyBlbmZvcmNlbWVudAogICAgdmFyIGZwaSA9IHByb2Nlc3MuZW52LlRPT0xfSU5QVVRfZmlsZV9wYXRoIHx8ICcnOwogICAgaWYgKCFmcGkpIGJyZWFrOwogICAgLy8gT25seSBnYXRlIHJlYWwgc291cmNlIGVkaXRzLiBFeGVtcHQgdGhlIHNhbWUgaW5lcnQgZmlsZXMvcGF0aHMgdGhlIG90aGVyCiAgICAvLyBnYXRlcyBza2lwLCBwbHVzIHRoZSBzcGVjL3BsYW4gYXJ0aWZhY3RzIHRoZW1zZWx2ZXMuCiAgICBpZiAoRVhFTVBULnNvbWUoZnVuY3Rpb24gKGUpIHsgcmV0dXJuIGZwaS5pbmRleE9mKGUpID49IDA7IH0pKSBicmVhazsKICAgIGlmICghU09VUkNFX0ZJTEVfUkUudGVzdChmcGkpKSBicmVhazsKICAgIGlmIChFRElUX1JFU0VUX1NLSVBfUEFUSF9SRS50ZXN0KGZwaSkpIGJyZWFrOwogICAgaWYgKGlzSW5zaWRlU3BlY3NEaXIoZnBpKSkgYnJlYWs7CiAgICBpZiAoIXNpLmFjdGl2ZVNkZFNsdWcpIHsKICAgICAgcHJvY2Vzcy5zdGRlcnIud3JpdGUoCiAgICAgICAgJ0JMT0NLRUQ6IFNERCBtb2RlIGlzIG9uIOKAlCBhdXRob3IgYSBzcGVjIGJlZm9yZSBlZGl0aW5nIHNvdXJjZS5cbicgKwogICAgICAgICdSdW46IGZsbyBzZGQgc3BlYyAiPHRpdGxlPiIgICAodGhlbiByZXZpZXcgaXQsIGFuZCBwbGFuKVxuJyArCiAgICAgICAgJ1RoaXMgcnVuIGlzIHNwZWMtZ2F0ZWQgKC1zZCAvIHNkZC5kZWZhdWx0KS4gT25lLW9mZiBza2lwOiByZS1ydW4gd2l0aCAtLW5vLXNkZC5cbicgKwogICAgICAgICdEaXNhYmxlIHBlci1wcm9qZWN0IHZpYSBtb2Zsby55YW1sOiBnYXRlczogc2RkX2dhdGU6IGZhbHNlXG4nCiAgICAgICk7CiAgICAgIHByb2Nlc3MuZXhpdCgyKTsKICAgIH0KICAgIGlmICghaXNQbGFuUmV2aWV3ZWQoc2kuYWN0aXZlU2RkU2x1ZykpIHsKICAgICAgcHJvY2Vzcy5zdGRlcnIud3JpdGUoCiAgICAgICAgJ0JMT0NLRUQ6IFNERCDigJQgdGhlIHBsYW4gZm9yICInICsgc2kuYWN0aXZlU2RkU2x1ZyArICciIGlzIG5vdCByZXZpZXdlZCB5ZXQuXG4nICsKICAgICAgICAnQXV0aG9yICsgcmV2aWV3IHRoZSBwbGFuIGZpcnN0OlxuJyArCiAgICAgICAgJyAgZmxvIHNkZCBwbGFuICcgKyBzaS5hY3RpdmVTZGRTbHVnICsgJ1xuJyArCiAgICAgICAgJyAgZmxvIHNkZCByZXZpZXcgJyArIHNpLmFjdGl2ZVNkZFNsdWcgKyAnIHBsYW5cbicgKwogICAgICAgICdPbmUtb2ZmIHNraXA6IHJlLXJ1biB3aXRoIC0tbm8tc2RkLiBEaXNhYmxlIHZpYSBtb2Zsby55YW1sOiBnYXRlczogc2RkX2dhdGU6IGZhbHNlXG4nCiAgICAgICk7CiAgICAgIHByb2Nlc3MuZXhpdCgyKTsKICAgIH0KICAgIGJyZWFrOwogIH0KICBjYXNlICdjaGVjay1iZWZvcmUtcHInOiB7CiAgICAvLyBBbmNob3JlZCB0byBjb21tYW5kLXN0YXJ0IHNvIGhlcmVkb2MgYm9kaWVzIGFuZCBxdW90ZWQgc3RyaW5ncyB0aGF0CiAgICAvLyBjb250YWluIHRoZSBsaXRlcmFsICJnaCBwciBjcmVhdGUiIGRvbid0IHRyaXAgdGhlIGdhdGUgZHVyaW5nIHJlZ3VsYXIKICAgIC8vIGBnaXQgY29tbWl0IC1tICIuLi5naCBwciBjcmVhdGUuLi4iYCBmbG93cywgd2hpbGUgc3RpbGwgY2F0Y2hpbmcgdGhlCiAgICAvLyBjaGFpbmVkLCBwaXBlZCwgcGFyZW50aGVzaXNlZCwgYW5kIG11bHRpLWxpbmUgc2hhcGVzICgjMTQxMCkuCiAgICB2YXIgY21kID0gcHJvY2Vzcy5lbnYuVE9PTF9JTlBVVF9jb21tYW5kIHx8ICcnOwogICAgaWYgKCFpc1ByQ3JlYXRlQ29tbWFuZChjbWQpKSBicmVhazsKICAgIC8vICMxMzc0IG9wZW5lZCB0aGlzIGxvb3A7ICMxNDM1IGNsb3NlcyBpdC4gVGhlIGNvdW50IGl0c2VsZiBpcyB1bmNoYW5nZWQg4oCUCiAgICAvLyB3aGF0IGNoYW5nZWQgaXMgdGhhdCBpdCBub3cgaGFzIHRlZXRoIGFuZCwgaW4gd2FybiBtb2RlLCBhIGRlbGl2ZXJ5IHBhdGguCiAgICAvLwogICAgLy8gRGVsaWJlcmF0ZWx5IEFCT1ZFIHRoZSBuby1zb3VyY2UgZXhlbXB0aW9uIGJlbG93OiBhIGRvY3Mtb25seSBQUiBjYW4KICAgIC8vIGFiYW5kb24gYSBsaXN0IGV4YWN0bHkgbGlrZSBhIHNvdXJjZSBQUiBjYW4sIGFuZCB0aGUgZXhlbXB0aW9uIGlzIGFib3V0CiAgICAvLyB0ZXN0aW5nL3NpbXBsaWZ5L2xlYXJuaW5ncywgbm90IGFib3V0IHdoZXRoZXIgdGhlIHJ1biB0b2xkIHRoZSB1c2VyIHdoYXQKICAgIC8vIGl0IGRpZC4gSXQgYWxzbyBleGl0cyBvbiBpdHMgb3duIHJhdGhlciB0aGFuIGpvaW5pbmcgYG1pc3NpbmdgIGJlbG93LCBmb3IKICAgIC8vIHRoZSBzYW1lIHJlYXNvbiDigJQgYG1pc3NpbmdgIGlzIHVucmVhY2hhYmxlIG9uIGFuIGV4ZW1wdCBkaWZmLgogICAgLy8KICAgIC8vIEdhdGVkIG9uIHRoZSBzYW1lIGB0YXNrX2NyZWF0ZV9maXJzdGAgZmxhZyBhcyB0aGUgcmVtaW5kZXIgaXRzZWxmIHNvIHRoZQogICAgLy8gdHdvIGhhbHZlcyBhcmUgYWx3YXlzIGNvbnNpc3RlbnQ6IGEgcHJvamVjdCB0aGF0IHR1cm5lZCB0aGUgbmFnIG9mZiBpcwogICAgLy8gbm90IHRoZW4gYmxvY2tlZCBhYm91dCB0aGUgb3RoZXIgZW5kIG9mIGl0LgogICAgLy8KICAgIC8vIEZhaWwtb3BlbiBpcyBsb2FkLWJlYXJpbmcuIHJlYWRUYXNrTGVkZ2VyKCkgcmV0dXJucyBudWxsIG9uIGEgbWlzc2luZywKICAgIC8vIG92ZXJzaXplZCwgb3IgdW5yZWFkYWJsZSB0cmFuc2NyaXB0IGFuZCBvbiBhIHNlc3Npb24gd2l0aCBubyBUYXNrQ3JlYXRlIGF0CiAgICAvLyBhbGwsIGFuZCBudWxsIG11c3QgbmV2ZXIgYmxvY2sg4oCUIGEgZ2F0ZSB0aGF0IHN0b3BzIFBScyBiZWNhdXNlIGl0IGNvdWxkCiAgICAvLyBub3QgcmVhZCBhIGZpbGUgaXMgd29yc2UgdGhhbiB0aGUgcmVwb3J0aW5nIGdhcCBpdCBpcyBjbG9zaW5nLgogICAgLy8KICAgIC8vIFN0YXRlIGlzIHJlYWQgT05DRSBmb3IgdGhlIHdob2xlIGNhc2UsIGhlcmUg4oCUIHRoZSBwcmUtUFIgZ2F0ZSBsb2dpYyBiZWxvdwogICAgLy8gcmV1c2VzIGl0IGFuZCBub3RoaW5nIHdyaXRlcyBpbiBiZXR3ZWVuLiBSZWFkaW5nIGl0IGJlZm9yZSB0aGUgbGVkZ2VyIGFsc28KICAgIC8vIG1lYW5zIGFuIGFscmVhZHktYWNrbm93bGVkZ2VkIHJ1biBuZXZlciBwYXlzIGZvciB0aGUgdHJhbnNjcmlwdCBzY2FuLgogICAgdmFyIHMgPSByZWFkU3RhdGUoKTsKICAgIGlmIChjb25maWcudGFza19jcmVhdGVfZmlyc3QgJiYgY29uZmlnLnRhc2tfc3RhdHVzX2dhdGUgIT09ICdvZmYnICYmICFzLnRhc2tzQWNrbm93bGVkZ2VkKSB7CiAgICAgIHZhciBsZWRnZXIgPSByZWFkVGFza0xlZGdlcigpOwogICAgICBpZiAobGVkZ2VyICYmIGxlZGdlci5vcGVuID4gMCkgewogICAgICAgIHZhciB0YWxseSA9IGxlZGdlci5jcmVhdGVkICsgJyB0YXNrJyArIChsZWRnZXIuY3JlYXRlZCA9PT0gMSA/ICcnIDogJ3MnKSArCiAgICAgICAgICAnIGNyZWF0ZWQgdGhpcyBzZXNzaW9uLCAnICsgbGVkZ2VyLm9wZW4gKyAnIHN0aWxsIG9wZW4uJzsKICAgICAgICB2YXIgY2xvc2VJdCA9ICdDbG9zZSB0aGVtIHdpdGggVGFza1VwZGF0ZSAoc3RhdHVzOiBjb21wbGV0ZWQpLCBvciBkZWxldGUgdGhlIG9uZXMgJyArCiAgICAgICAgICAndGhhdCBubyBsb25nZXIgYXBwbHksIHNvIHRoZSBydW4gZG9lcyBub3QgcmVwb3J0IGRvbmUgb3ZlciBhbiB1bmZpbmlzaGVkIGxpc3QuXG4nOwogICAgICAgIGlmIChjb25maWcudGFza19zdGF0dXNfZ2F0ZSA9PT0gJ3dhcm4nKSB7CiAgICAgICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZSgnUkVNSU5ERVI6ICcgKyB0YWxseSArICcgJyArIGNsb3NlSXQpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBwcm9jZXNzLnN0ZGVyci53cml0ZSgKICAgICAgICAgICAgJ0JMT0NLRUQ6ICcgKyB0YWxseSArICdcbicgKyBjbG9zZUl0ICsKICAgICAgICAgICAgJ0RlZmVycmluZyB0aGVtIG9uIHB1cnBvc2UgaXMgYSBsZWdpdGltYXRlIG91dGNvbWUg4oCUIGRlY2xhcmUgaXQgaW5zdGVhZCBvZlxuJyArCiAgICAgICAgICAgICdjbG9zaW5nIHRhc2tzIHRoYXQgYXJlIG5vdCBkb25lOiBub2RlICInICsgX19maWxlbmFtZSArICciIHJlY29yZC10YXNrcy1hY2tub3dsZWRnZWRcbicgKwogICAgICAgICAgICBHQVRFX09SSUdJTl9OT1RFICsgJ1xuJyArCiAgICAgICAgICAgICdSZXBvcnQgaW5zdGVhZCBvZiBibG9ja2luZyB2aWEgbW9mbG8ueWFtbDogZ2F0ZXM6IHRhc2tfc3RhdHVzX2dhdGU6IHdhcm4gICAob3I6IG9mZilcbicpOwogICAgICAgICAgcHJvY2Vzcy5leGl0KDIpOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgLy8gTm8tc291cmNlLWZpbGVzIGV4ZW1wdGlvbiAoIzExNzYsIHN1cGVyc2VkZXMgdGhlIG9yaWdpbmFsIGRvY3Mtb25seSBwYXRoKS4KICAgIC8vIElmIGV2ZXJ5IGZpbGUgY2hhbmdlZCB2cyB0aGUgbWVyZ2UtYmFzZSBpcyBlaXRoZXIgYSBkb2NzL2ltYWdlIGZpbGUgb3IgYQogICAgLy8gcGF0aC1pbmVydCBmaWxlICguZ2l0aHViL3dvcmtmbG93cy8sIElTU1VFX1RFTVBMQVRFLywgUFVMTF9SRVFVRVNUX1RFTVBMQVRFLykKICAgIC8vIOKAlCBpLmUuIE5PIHNvdXJjZSBmaWxlcyBpbiB0aGUgZGlmZiDigJQgc2tpcCB0ZXN0aW5nL3NpbXBsaWZ5L2xlYXJuaW5ncyBnYXRlcwogICAgLy8gYW5kIHN1cmZhY2UgYSBvbmUtbGluZSB0cmFuc3BhcmVuY3kgbm90ZS4gRmFsbHMgdGhyb3VnaCB0byB0aGUgc3RhbmRhcmQgZ2F0ZQogICAgLy8gb24gYW55IGZhaWx1cmUgKG5vIGJhc2UsIG5vIGRpZmYsIGV4ZWMgZXJyb3IpIOKAlCBmYWlsLXNhZmUgYnkgZGVzaWduLgogICAgLy8KICAgIC8vIFNvdXJjZS1maWxlIGRldGVjdGlvbiBpcyB0aGUgaW52ZXJzZSBvZiB0aGUgaW5lcnQgY2hlY2tzOiBhIGZpbGUgaXMgInNvdXJjZSIKICAgIC8vIHdoZW4gaXQgbWF0Y2hlcyBTT1VSQ0VfRklMRV9SRSBBTkQgaXMgbm90IGluc2lkZSBhbiBpbmVydCBwYXRoLiBUaGlzIGNhdGNoZXMKICAgIC8vIGAuZ2l0aHViL3dvcmtmbG93cy9mb28uc2hgIChzaCBleHRlbnNpb24gYnV0IHBhdGgtaW5lcnQg4oaSIG5vIHNvdXJjZSkuCiAgICB2YXIgY2hhbmdlZCA9IGdldENoYW5nZWRGaWxlc1ZzQmFzZSgpOwogICAgaWYgKGNoYW5nZWQgJiYgY2hhbmdlZC5sZW5ndGggPiAwKSB7CiAgICAgIHZhciBoYXNTb3VyY2UgPSBjaGFuZ2VkLnNvbWUoZnVuY3Rpb24oZikgewogICAgICAgIHJldHVybiBTT1VSQ0VfRklMRV9SRS50ZXN0KGYpICYmICFFRElUX1JFU0VUX1NLSVBfUEFUSF9SRS50ZXN0KGYpOwogICAgICB9KTsKICAgICAgaWYgKCFoYXNTb3VyY2UpIHsKICAgICAgICB2YXIgYWxsRG9jcyA9IGNoYW5nZWQuZXZlcnkoZnVuY3Rpb24oZikgeyByZXR1cm4gRE9DU19PTkxZX1JFLnRlc3QoZik7IH0pOwogICAgICAgIHZhciByZWFzb24gPSBhbGxEb2NzID8gJ0RvY3Mtb25seScgOiAnTm8gc291cmNlIGZpbGVzIGluIGJyYW5jaCBkaWZmJzsKICAgICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZShyZWFzb24gKyAnICgnICsgY2hhbmdlZC5sZW5ndGggKyAnIGZpbGUnICsgKGNoYW5nZWQubGVuZ3RoID09PSAxID8gJycgOiAncycpICsgJykg4oCUIHNraXBwaW5nIHRlc3Rpbmcvc2ltcGxpZnkvbGVhcm5pbmdzIGdhdGVzLlxuJyk7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KICAgIC8vIEV4cGlyZSBhbnkgY3JlZGl0IHdob3NlIGZpbmdlcnByaW50IG5vIGxvbmdlciBtYXRjaGVzIHRoZSBjb2RlIGJlZm9yZQogICAgLy8gcmVhZGluZyB0aGUgZmxhZ3MuIFRoaXMgaXMgd2hhdCBjYXRjaGVzIHRoZSBtdXRhdGlvbnMgcmVzZXQtZWRpdC1nYXRlcwogICAgLy8gc3RydWN0dXJhbGx5IGNhbm5vdCBzZWUg4oCUIEJhc2ggd3JpdGVzLCBnaXQgY2hlY2tvdXQvcHVsbC9tZXJnZSwgYW5kIHRoZQogICAgLy8gbmV4dCBpc3N1ZSBpbiB0aGUgc2FtZSBzZXNzaW9uIOKAlCBzbyB0aGUgZmxhZ3MgYmVsb3cgbWVhbiAic3RpbGwgdHJ1ZSBvZgogICAgLy8gVEhJUyBjb2RlIiwgbm90IG1lcmVseSAid2FzIHRydWUgYXQgc29tZSBwb2ludCB0aGlzIHNlc3Npb24iLgogICAgdmFyIGV4cGlyZWQgPSBbXTsKICAgIGlmIChzLnRlc3RzUnVuICYmICFjcmVkaXRJc0xpdmUocy50ZXN0c1J1biwgcy50ZXN0c0ZpbmdlcnByaW50LCAnYWxsJykpIHsKICAgICAgcy50ZXN0c1J1biA9IGZhbHNlOyBzLnRlc3RzRmluZ2VycHJpbnQgPSBudWxsOyBleHBpcmVkLnB1c2goJ3Rlc3RzJyk7CiAgICB9CiAgICBpZiAocy5zaW1wbGlmeVJ1biAmJiAhY3JlZGl0SXNMaXZlKHMuc2ltcGxpZnlSdW4sIHMuc2ltcGxpZnlGaW5nZXJwcmludCwgJ25vbnRlc3QnKSkgewogICAgICBzLnNpbXBsaWZ5UnVuID0gZmFsc2U7IHMuc2ltcGxpZnlGaW5nZXJwcmludCA9IG51bGw7IGV4cGlyZWQucHVzaCgnc2ltcGxpZnknKTsKICAgIH0KICAgIGlmICgocy52ZXJpZnlSdW4gfHwgcy52ZXJpZnlPdXRjb21lKSAmJiAhY3JlZGl0SXNMaXZlKHMudmVyaWZ5UnVuLCBzLnZlcmlmeUZpbmdlcnByaW50LCAnYWxsJykpIHsKICAgICAgcy52ZXJpZnlSdW4gPSBmYWxzZTsgcy52ZXJpZnlPdXRjb21lID0gbnVsbDsgcy52ZXJpZnlGaW5nZXJwcmludCA9IG51bGw7IGV4cGlyZWQucHVzaCgndmVyaWZ5Jyk7CiAgICB9CiAgICBpZiAoZXhwaXJlZC5sZW5ndGgpIHdyaXRlU3RhdGUocyk7CiAgICAvLyBDbGFzc2lmaWVyLWF3YXJlIHNraXA6IGlmIGRlbHRhLXNpbmNlLXNuYXBzaG90IG9yIHdob2xlLWJyYW5jaCBkaWZmIGlzCiAgICAvLyBUUklWSUFMLCBzYXRpc2Z5IHRoZSBzaW1wbGlmeSBnYXRlIHNpbGVudGx5LiBSZXVzZXMgdGhlIHNhbWUgY2xhc3NpZmllcgogICAgLy8gdGhlIHNraWxsIHVzZXMg4oCUIHNhbWUgInRyaXZpYWwiIGRlZmluaXRpb24sIG5vIGRyaWZ0LiBTYW1lIHRocmVzaG9sZCB0aGF0CiAgICAvLyBhbHJlYWR5IG1hcHMgdG8gVFJJVklBTD0wIGFnZW50cyBpbnNpZGUgL3NpbXBsaWZ5LCBzbyB0cnVzdGluZyBpdCBhdCB0aGUKICAgIC8vIGdhdGUgbGV2ZWwgaXMgdGhlIHNhbWUgdHJ1c3QgcHJvZmlsZSwganVzdCBvbmUgZGVjaXNpb24gZWFybGllci4KICAgIGlmIChjb25maWcuc2ltcGxpZnlfZ2F0ZSAmJiAhcy5zaW1wbGlmeVJ1bikgewogICAgICB2YXIgc2tpcFJlYXNvbiA9IGNsYXNzaWZ5Rm9yR2F0ZVNraXAocyk7CiAgICAgIGlmIChza2lwUmVhc29uKSB7CiAgICAgICAgcy5zaW1wbGlmeVJ1biA9IHRydWU7CiAgICAgICAgd3JpdGVTdGF0ZShzKTsKICAgICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZSgnU2ltcGxpZnkgZ2F0ZSBhdXRvLXBhc3NlZDogJyArIHNraXBSZWFzb24gKyAnXG4nKTsKICAgICAgfQogICAgfQogICAgdmFyIG1pc3NpbmcgPSBbXTsKICAgIGlmIChjb25maWcudGVzdGluZ19nYXRlICYmICFzLnRlc3RzUnVuKSBtaXNzaW5nLnB1c2goJ3Rlc3RzIGhhdmUgbm90IHJ1biBncmVlbiBzaW5jZSB0aGUgbGFzdCBjb2RlIGVkaXQgKHJ1biBucG0gdGVzdCwgdml0ZXN0LCBqZXN0LCBweXRlc3QsIG9yIHNpbWlsYXIg4oCUIGEgcnVuIHdob3NlIG91dHB1dCByZXBvcnRzIGZhaWx1cmVzIGRvZXMgbm90IGNvdW50KScpOwogICAgaWYgKGNvbmZpZy5zaW1wbGlmeV9nYXRlICYmICFzLnNpbXBsaWZ5UnVuKSBtaXNzaW5nLnB1c2goJy9mbG8tc2ltcGxpZnkgKG9yIC9kaXN0aWxsKSBoYXMgbm90IHJ1biBzaW5jZSB0aGUgbGFzdCBjb2RlIGVkaXQnKTsKICAgIGlmIChjb25maWcubGVhcm5pbmdzX2dhdGUgJiYgIXMubGVhcm5pbmdzU3RvcmVkKSBtaXNzaW5nLnB1c2goTEVBUk5JTkdTX01JU1NJTkcpOwogICAgaWYgKG1pc3NpbmcubGVuZ3RoID09PSAwKSBicmVhazsKICAgIHByb2Nlc3Muc3RkZXJyLndyaXRlKCdCTE9DS0VEOiBnaCBwciBjcmVhdGUgcmVxdWlyZXMgdGhlIGZvbGxvd2luZyBiZWZvcmUgb3BlbmluZyBhIFBSOlxuJyk7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1pc3NpbmcubGVuZ3RoOyBpKyspIHsKICAgICAgcHJvY2Vzcy5zdGRlcnIud3JpdGUoJyAgLSAnICsgbWlzc2luZ1tpXSArICdcbicpOwogICAgfQogICAgaWYgKGV4cGlyZWQubGVuZ3RoKSB7CiAgICAgIHByb2Nlc3Muc3RkZXJyLndyaXRlKAogICAgICAgICdFeHBpcmVkIGJlY2F1c2UgdGhlIGNvZGUgY2hhbmdlZCBzaW5jZSB0aGV5IHJhbiAoJyArIGV4cGlyZWQuam9pbignLCAnKSArCiAgICAgICAgJykg4oCUIHRoaXMgaW5jbHVkZXMgY2hhbmdlcyBtYWRlIG91dHNpZGUgV3JpdGUvRWRpdCwgZS5nLiBhIEJhc2ggd3JpdGUsICcgKwogICAgICAgICdnaXQgY2hlY2tvdXQvcHVsbCwgb3IgbW92aW5nIG9uIHRvIGEgZGlmZmVyZW50IGNoYW5nZSBpbiB0aGUgc2FtZSBzZXNzaW9uLlxuJywKICAgICAgKTsKICAgIH0KICAgIGlmIChzLmxhc3RSZXNldEJ5ICYmIHMubGFzdFJlc2V0QnkuZmlsZSkgewogICAgICBwcm9jZXNzLnN0ZGVyci53cml0ZSgnTGFzdCBnYXRlIHJlc2V0OiAnICsgcy5sYXN0UmVzZXRCeS5maWxlICsgJyAoJyArIChzLmxhc3RSZXNldEJ5LmdhdGVzIHx8IFtdKS5qb2luKCcsICcpICsgJylcbicpOwogICAgfQogICAgLy8gIzEzNDgg4oCUIG5hbWUgdGhlIG9yZGVyLCBub3QganVzdCB0aGUgbWlzc2luZyBnYXRlLiBTYXRpc2Z5aW5nIG9uZSBnYXRlIGNhbgogICAgLy8gaW52YWxpZGF0ZSBhbm90aGVyICgvZmxvLXNpbXBsaWZ5IGVkaXRzIGNvZGUsIHdoaWNoIHJlc2V0cyB0ZXN0cyArIHZlcmlmeSksCiAgICAvLyBzbyAid2hhdCBpcyBtaXNzaW5nIiBhbG9uZSBsZWZ0IGNhbGxlcnMgcmVkaXNjb3ZlcmluZyB0aGUgc2VxdWVuY2UgYnkgdHJpYWwuCiAgICBwcm9jZXNzLnN0ZGVyci53cml0ZShPUkRFUl9ISU5UKTsKICAgIHByb2Nlc3Muc3RkZXJyLndyaXRlKCdEaXNhYmxlIHBlci1nYXRlIHZpYSBtb2Zsby55YW1sOlxuJyk7CiAgICBwcm9jZXNzLnN0ZGVyci53cml0ZSgnICBnYXRlczpcbiAgICB0ZXN0aW5nX2dhdGU6IGZhbHNlXG4gICAgc2ltcGxpZnlfZ2F0ZTogZmFsc2VcbiAgICBsZWFybmluZ3NfZ2F0ZTogZmFsc2VcbicpOwogICAgcHJvY2Vzcy5leGl0KDIpOwogIH0KICBjYXNlICdjaGVjay1iZWZvcmUtZG9uZSc6IHsKICAgIC8vIFN0b3J5ICMxMjc0IChFcGljICMxMjY5KSArICMxMjk0LiBWZXJpZnktYmVmb3JlLWRvbmU6IGJsb2NrIGBnaCBwciBjcmVhdGVgCiAgICAvLyB1bnRpbCB0aGUgY2hhbmdlIGhhcyBiZWVuIHZlcmlmaWVkIGVuZC10by1lbmQgKHRoZSAvdmVyaWZ5IHNraWxsKSBhZ2FpbnN0CiAgICAvLyB0aGUgcGxhbidzIGFjY2VwdGFuY2UgY3JpdGVyaWEuIE9OIGJ5IGRlZmF1bHQgKCMxMjk0KSDigJQgL2ZsbyBkZWxlZ2F0ZXMgdG8KICAgIC8vIC92ZXJpZnksIHNvIGEgZGVmYXVsdCBydW4gZG9lcyB0aGUgYWNjZXB0YW5jZSBjaGVjazsgZGlzYWJsZSBwZXItcHJvamVjdAogICAgLy8gd2l0aCBgZ2F0ZXM6IHZlcmlmeV9iZWZvcmVfZG9uZTogZmFsc2VgIG9yIHBlci1ydW4gYC0tbm8tdmVyaWZ5YC4gU2FtZQogICAgLy8gdHJpZ2dlciArIG5vLXNvdXJjZSBleGVtcHRpb24gYXMgY2hlY2stYmVmb3JlLXByLCBzbyB0aGV5IGNvbXBvc2Ugb24gb25lCiAgICAvLyBjb21tYW5kIChkb2NzLW9ubHkgZGlmZnMgYXJlIGV4ZW1wdCwgc28gdGhpcyBuZXZlciBibG9ja3MgYSBkb2NzIFBSKS4KICAgIGlmICghY29uZmlnLnZlcmlmeV9iZWZvcmVfZG9uZSkgYnJlYWs7CiAgICB2YXIgY21kID0gcHJvY2Vzcy5lbnYuVE9PTF9JTlBVVF9jb21tYW5kIHx8ICcnOwogICAgaWYgKCFpc1ByQ3JlYXRlQ29tbWFuZChjbWQpKSBicmVhazsKICAgIC8vIE5vLXNvdXJjZS1maWxlcyBleGVtcHRpb24g4oCUIGEgZG9jcy1vbmx5IC8gcGF0aC1pbmVydCBkaWZmIG5lZWRzIG5vIHZlcmlmeS4KICAgIHZhciBjaGFuZ2VkRCA9IGdldENoYW5nZWRGaWxlc1ZzQmFzZSgpOwogICAgaWYgKGNoYW5nZWREICYmIGNoYW5nZWRELmxlbmd0aCA+IDApIHsKICAgICAgdmFyIGhhc1NvdXJjZUQgPSBjaGFuZ2VkRC5zb21lKGZ1bmN0aW9uKGYpIHsKICAgICAgICByZXR1cm4gU09VUkNFX0ZJTEVfUkUudGVzdChmKSAmJiAhRURJVF9SRVNFVF9TS0lQX1BBVEhfUkUudGVzdChmKTsKICAgICAgfSk7CiAgICAgIGlmICghaGFzU291cmNlRCkgewogICAgICAgIHZhciByZWFzb25EID0gY2hhbmdlZEQuZXZlcnkoZnVuY3Rpb24oZikgeyByZXR1cm4gRE9DU19PTkxZX1JFLnRlc3QoZik7IH0pID8gJ0RvY3Mtb25seScgOiAnTm8gc291cmNlIGZpbGVzIGluIGJyYW5jaCBkaWZmJzsKICAgICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZShyZWFzb25EICsgJyAoJyArIGNoYW5nZWRELmxlbmd0aCArICcgZmlsZScgKyAoY2hhbmdlZEQubGVuZ3RoID09PSAxID8gJycgOiAncycpICsgJykg4oCUIHNraXBwaW5nIHZlcmlmeS1iZWZvcmUtZG9uZSBnYXRlLlxuJyk7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KICAgIHZhciBzZCA9IHJlYWRTdGF0ZSgpOwogICAgLy8gRXhwaXJlIGEgdmVyZGljdCB0aGF0IG5vIGxvbmdlciBkZXNjcmliZXMgdGhlIGNvZGUsIGZvciB0aGUgc2FtZSByZWFzb24KICAgIC8vIGNoZWNrLWJlZm9yZS1wciBkb2VzOiBhIFBBU1MgZWFybmVkIGJlZm9yZSBhIEJhc2ggd3JpdGUsIGEgYnJhbmNoIHN3aXRjaCwKICAgIC8vIG9yIHRoZSBuZXh0IGNoYW5nZSBpbiB0aGlzIHNlc3Npb24gaXMgZXZpZGVuY2UgYWJvdXQgZGlmZmVyZW50IGNvZGUuCiAgICAvLyAjMTMzMiBtYWRlIHRoZSBnYXRlIHJlYWQgdGhlIG91dGNvbWUgaW5zdGVhZCBvZiBhdHRlbmRhbmNlOyB0aGlzIG1ha2VzIGl0CiAgICAvLyByZWFkIGFuIG91dGNvbWUgdGhhdCBpcyBzdGlsbCBBQk9VVCB0aGUgdGhpbmcgYmVpbmcgc2hpcHBlZC4KICAgIHZhciB2ZXJpZnlTdGFsZSA9IChzZC52ZXJpZnlSdW4gfHwgc2QudmVyaWZ5T3V0Y29tZSkKICAgICAgJiYgIWNyZWRpdElzTGl2ZShzZC52ZXJpZnlSdW4sIHNkLnZlcmlmeUZpbmdlcnByaW50LCAnYWxsJyk7CiAgICBpZiAodmVyaWZ5U3RhbGUpIHsKICAgICAgc2QudmVyaWZ5UnVuID0gZmFsc2U7IHNkLnZlcmlmeU91dGNvbWUgPSBudWxsOyBzZC52ZXJpZnlGaW5nZXJwcmludCA9IG51bGw7CiAgICAgIHdyaXRlU3RhdGUoc2QpOwogICAgfQogICAgLy8gIzEzMzI6IGdhdGUgb24gdGhlIE9VVENPTUUsIG5vdCBvbiBhdHRlbmRhbmNlLiBCZWZvcmUgdGhpcywgYHZlcmlmeVJ1bmAKICAgIC8vIGFsb25lIG9wZW5lZCB0aGUgZ2F0ZSwgc28gYSAvdmVyaWZ5IHJldHVybmluZyBGQUlMIHNhdGlzZmllZCBpdCBleGFjdGx5CiAgICAvLyBhcyBhIFBBU1MgZGlkIOKAlCBhIGZhaWxpbmcgdmVyZGljdCBpcyBzdGlsbCBhIHN1Y2Nlc3NmdWwgdG9vbCBpbnZvY2F0aW9uLgogICAgaWYgKHNkLnZlcmlmeVJ1biAmJiBzZC52ZXJpZnlPdXRjb21lID09PSAnUEFTUycpIGJyZWFrOwogICAgcHJvY2Vzcy5zdGRlcnIud3JpdGUoJ0JMT0NLRUQ6IGdoIHByIGNyZWF0ZSByZXF1aXJlcyB2ZXJpZmljYXRpb24gYmVmb3JlIGRvbmU6XG4nKTsKICAgIC8vIFRoZSBmb3VyIHN0YXRlcyBuZWVkIGRpZmZlcmVudCByZW1lZGllcywgc28gbmFtZSB3aGljaCBvbmUgYXBwbGllcwogICAgLy8gcmF0aGVyIHRoYW4gZW1pdHRpbmcgb25lIG1lc3NhZ2UgdGhhdCBmaXRzIG5vbmUgb2YgdGhlbS4KICAgIHZhciBpbnZhbGlkYXRlZCA9IHNkLmxhc3RSZXNldEJ5ICYmIHNkLmxhc3RSZXNldEJ5LmZpbGUKICAgICAgJiYgKHNkLmxhc3RSZXNldEJ5LmdhdGVzIHx8IFtdKS5pbmRleE9mKCd2ZXJpZnknKSA+PSAwOwogICAgaWYgKHZlcmlmeVN0YWxlKSB7CiAgICAgIHByb2Nlc3Muc3RkZXJyLndyaXRlKCcgIC0gdGhlIGNvZGUgY2hhbmdlZCBzaW5jZSAvdmVyaWZ5IHJhbiDigJQgcmUtcnVuIC92ZXJpZnlcbicpOwogICAgICBwcm9jZXNzLnN0ZGVyci53cml0ZSgnICAgIChkZXRlY3RlZCBieSBjb250ZW50LCBzbyB0aGlzIGNvdmVycyBjaGFuZ2VzIG1hZGUgb3V0c2lkZSBXcml0ZS9FZGl0OlxuJyk7CiAgICAgIHByb2Nlc3Muc3RkZXJyLndyaXRlKCcgICAgIGEgQmFzaCB3cml0ZSwgZ2l0IGNoZWNrb3V0L3B1bGwsIG9yIGEgZGlmZmVyZW50IGNoYW5nZSBpbiB0aGUgc2FtZSBzZXNzaW9uKVxuJyk7CiAgICB9IGVsc2UgaWYgKCFzZC52ZXJpZnlSdW4gJiYgaW52YWxpZGF0ZWQpIHsKICAgICAgcHJvY2Vzcy5zdGRlcnIud3JpdGUoJyAgLSBhIGNvZGUgZWRpdCBpbnZhbGlkYXRlZCB0aGUgcHJldmlvdXMgdmVyaWZpY2F0aW9uIOKAlCByZS1ydW4gL3ZlcmlmeVxuJyk7CiAgICAgIHByb2Nlc3Muc3RkZXJyLndyaXRlKCdMYXN0IGdhdGUgcmVzZXQ6ICcgKyBzZC5sYXN0UmVzZXRCeS5maWxlICsgJyAodmVyaWZ5KVxuJyk7CiAgICB9IGVsc2UgaWYgKCFzZC52ZXJpZnlSdW4pIHsKICAgICAgcHJvY2Vzcy5zdGRlcnIud3JpdGUoJyAgLSB0aGUgY2hhbmdlIGhhcyBub3QgYmVlbiB2ZXJpZmllZCBzaW5jZSB0aGUgbGFzdCBjb2RlIGVkaXQgKHJ1biAvdmVyaWZ5KVxuJyk7CiAgICB9IGVsc2UgaWYgKHNkLnZlcmlmeU91dGNvbWUgPT09ICdGQUlMJyB8fCBzZC52ZXJpZnlPdXRjb21lID09PSAnVU5WRVJJRklFRCcpIHsKICAgICAgcHJvY2Vzcy5zdGRlcnIud3JpdGUoJyAgLSAvdmVyaWZ5IHJhbiBhbmQgcmV0dXJuZWQgJyArIHNkLnZlcmlmeU91dGNvbWUgKyAnIOKAlCBmaXggdGhlIGZhaWxpbmcgY3JpdGVyaWEsIHRoZW4gcmUtcnVuIC92ZXJpZnlcbicpOwogICAgICBwcm9jZXNzLnN0ZGVyci53cml0ZSgnICAgIChhIEZBSUwgaXMgYSByZWFsIHJlc3VsdCwgbm90IGEgZ2F0ZSBlcnJvcjsgdGhlIFBSIGlzIGJsb2NrZWQgYmVjYXVzZSB0aGUgY2hhbmdlIGRpZCBub3QgbWVldCBpdHMgYWNjZXB0YW5jZSBjcml0ZXJpYSlcbicpOwogICAgfSBlbHNlIHsKICAgICAgLy8gUmFuLCBidXQgbm8gdmVyZGljdCByZWFjaGVkIHRoZSBnYXRlLiBUV08gdmVyeSBkaWZmZXJlbnQgY2F1c2VzLCBhbmQKICAgICAgLy8gIzEzOTQgZXhpc3RzIGJlY2F1c2UgdGhleSB1c2VkIHRvIHNoYXJlIG9uZSBtZXNzYWdlIHRoYXQgZml0IG9ubHkgdGhlCiAgICAgIC8vIGZpcnN0OiBlaXRoZXIgL3ZlcmlmeSBuZXZlciByZWNvcmRlZCBhIHN0cnVjdHVyZWQgb3V0Y29tZSwgb3IgdGhlIGhvb2sKICAgICAgLy8gdGhhdCBUUkFOU0NSSUJFUyB0aGUgb3V0Y29tZSBpcyBub3Qgd2lyZWQsIGluIHdoaWNoIGNhc2UgYSBwZXJmZWN0bHkKICAgICAgLy8gY29ycmVjdCB2ZXJkaWN0IHdhcyBzdG9yZWQgYW5kIG5vdGhpbmcgY291bGQgY2FycnkgaXQgdG8gdGhlIGdhdGUuCiAgICAgIC8vIEJsYW1pbmcgdGhlIGFnZW50IGZvciB0aGUgc2Vjb25kIGNhc2Ugc2VuZHMgdGhlIHVzZXIgaW50byBhbiB1bmJvdW5kZWQKICAgICAgLy8gcmV0cnkgbG9vcCDigJQgcmUtcnVubmluZyAvdmVyaWZ5IGNhbm5vdCBmaXggYWJzZW50IHdpcmluZy4KICAgICAgaWYgKCFpc1ZlcmlmeU91dGNvbWVIb29rV2lyZWQoKSkgewogICAgICAgIHByb2Nlc3Muc3RkZXJyLndyaXRlKCcgIC0gYHJlY29yZC12ZXJpZnktb3V0Y29tZWAgaXMgbm90IHdpcmVkIGluIC5jbGF1ZGUvc2V0dGluZ3MuanNvbiDigJQgdGhlIHZlcmRpY3QgY2Fubm90IGJlIHJlY29yZGVkXG4nKTsKICAgICAgICBwcm9jZXNzLnN0ZGVyci53cml0ZSgnICAgIC92ZXJpZnkgbWF5IHdlbGwgaGF2ZSBwYXNzZWQ7IG5vdGhpbmcgZXhpc3RzIHRvIHRyYW5zY3JpYmUgaXRzIHJlc3VsdCwgc28gcmUtcnVubmluZyBpdCB3aWxsIG5vdCBoZWxwLlxuJyk7CiAgICAgICAgcHJvY2Vzcy5zdGRlcnIud3JpdGUoJyAgICBGaXg6IHJ1biBgZmxvIGRvY3RvciAtLWZpeGAsIHJlc3RhcnQgdGhlIHNlc3Npb24gKENsYXVkZSBDb2RlIGxvYWRzIGhvb2tzIG9ubHkgYXQgc3RhcnQpLCB0aGVuIHJlLXJ1biAvdmVyaWZ5LlxuJyk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcHJvY2Vzcy5zdGRlcnIud3JpdGUoJyAgLSAvdmVyaWZ5IHJhbiBidXQgcmVjb3JkZWQgbm8gdmVyZGljdCDigJQgcmUtcnVuIGl0IHNvIGl0IHN0b3JlcyBhIHN0cnVjdHVyZWQgcmVzdWx0XG4nKTsKICAgICAgICBwcm9jZXNzLnN0ZGVyci53cml0ZSgnICAgIChTdGVwIDUgb2YgdGhlIHZlcmlmeSBza2lsbCBtdXN0IHBhc3MgbWV0YWRhdGEub3ZlcmFsbCB0byBtZW1vcnlfc3RvcmUpXG4nKTsKICAgICAgICAvLyAjMTM0OCDigJQgdGhlIHRyYXAgdGhpcyBzdGF0ZSBzZXRzOiByZS1pbnZva2luZyAvdmVyaWZ5IENMRUFSUyBhbnkgcHJpb3IKICAgICAgICAvLyB2ZXJkaWN0IGJ5IGRlc2lnbiAoIzEzMzIpLCBzbyB0aGUgb2J2aW91cyByZWNvdmVyeSBsYW5kcyByaWdodCBiYWNrIGhlcmUKICAgICAgICAvLyB1bmxlc3MgU3RlcCA1IGNvbXBsZXRlcy4gU2F5IHNvLCByYXRoZXIgdGhhbiBsZXR0aW5nIGl0IGJlIHJlZGlzY292ZXJlZC4KICAgICAgICBwcm9jZXNzLnN0ZGVyci53cml0ZSgnICAgIFJlLWludm9raW5nIC92ZXJpZnkgY2xlYXJzIHRoZSBwcmlvciB2ZXJkaWN0LCBzbyBhIHJlLXJ1biB0aGF0IHNraXBzIFN0ZXAgNSBsYW5kcyBoZXJlIGFnYWluLlxuJyk7CiAgICAgIH0KICAgIH0KICAgIHByb2Nlc3Muc3RkZXJyLndyaXRlKE9SREVSX0hJTlQpOwogICAgcHJvY2Vzcy5zdGRlcnIud3JpdGUoJ0Rpc2FibGUgdmlhIG1vZmxvLnlhbWw6XG4nKTsKICAgIHByb2Nlc3Muc3RkZXJyLndyaXRlKCcgIGdhdGVzOlxuICAgIHZlcmlmeV9iZWZvcmVfZG9uZTogZmFsc2VcbicpOwogICAgcHJvY2Vzcy5leGl0KDIpOwogIH0KICBjYXNlICdjaGVjay1kYW5nZXJvdXMtY29tbWFuZCc6IHsKICAgIC8vICMxMTcxIGZvbGxvdy11cCDigJQgc3RyaXAgcXVvdGVkIHN0cmluZyBib2RpZXMgYW5kIGhlcmVkb2MgYm9kaWVzIGJlZm9yZQogICAgLy8gc3Vic3RyaW5nLW1hdGNoaW5nIERBTkdFUk9VUy4gV2l0aG91dCB0aGlzLCBgZ2l0IGNvbW1pdCAtbSAiLi4ucmVtb3ZlLWl0ZW0KICAgIC8vIC1yZWN1cnNlIC1mb3JjZSBjOlwuLi4iYCBibG9ja3MgYmVjYXVzZSB0aGUgbGl0ZXJhbCBwYXR0ZXJuIGFwcGVhcnMgaW4KICAgIC8vIHRoZSBxdW90ZWQgbWVzc2FnZSBib2R5LiBRdW90ZWQgdGV4dCBpc24ndCBleGVjdXRpbmcg4oCUIHRoZSBnYXRlJ3Mgam9iIGlzCiAgICAvLyB0byBjYXRjaCB0eXBvLWNsYXNzIGRlc3RydWN0aW9uIGluIHRoZSBhY3R1YWwgY29tbWFuZCwgbm90IHRleHQgbWVudGlvbnMKICAgIC8vIGluc2lkZSBhcmd1bWVudHMuIFRyYWRlLW9mZjogYGJhc2ggLWMgInJtIC1yZiAvImAgYWxzbyBieXBhc3NlcyBub3c7IHRoZQogICAgLy8gZ2F0ZSBpcyBhIHR5cG8gc2FmZXR5IG5ldCwgbm90IGEgc2VjdXJpdHkgYm91bmRhcnksIHNvIHRoaXMgaXMgYWNjZXB0YWJsZS4KICAgIC8vIENvbW1hbmQgc3Vic3RpdHV0aW9ucyBgJCguLi4pYCBhbmQgYmFja3RpY2tzIGFyZSBOT1Qgc3RyaXBwZWQg4oCUIHRob3NlCiAgICAvLyBib2RpZXMgZXhlY3V0ZSBhbmQgZGFuZ2Vyb3VzIGNvbnRlbnQgdGhlcmUgaXMgcmVhbC4KICAgIHZhciByYXcgPSBwcm9jZXNzLmVudi5UT09MX0lOUFVUX2NvbW1hbmQgfHwgJyc7CiAgICB2YXIgY21kID0gc3RyaXBRdW90ZWRBbmRIZXJlZG9jcyhyYXcpLnRvTG93ZXJDYXNlKCk7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IERBTkdFUk9VUy5sZW5ndGg7IGkrKykgewogICAgICBpZiAobWF0Y2hlc0Rhbmdlcm91cyhjbWQsIERBTkdFUk9VU1tpXSkpIHsKICAgICAgICBjb25zb2xlLmxvZygnW0JMT0NLRURdIERhbmdlcm91cyBjb21tYW5kOiAnICsgREFOR0VST1VTW2ldKTsKICAgICAgICBwcm9jZXNzLmV4aXQoMik7CiAgICAgIH0KICAgIH0KICAgIGJyZWFrOwogIH0KICBjYXNlICdwcm9tcHQtcmVtaW5kZXInOiB7CiAgICAvLyBGdWxsIHBlci1wcm9tcHQgcmVzZXQuIFdpcmVkIGFzIHRoZSBmaXJzdCBVc2VyUHJvbXB0U3VibWl0IGhvb2sgKHZpYQogICAgLy8gcHJvbXB0LWhvb2subWpzKS4gT3ducyBpbnRlcmFjdGlvbkNvdW50ICsgQ29udGV4dCB3YXJuaW5nczsgdGhlCiAgICAvLyBUYXNrQ3JlYXRlIFJFTUlOREVSIGFuZCBuYW1lc3BhY2UgaGludCBtb3ZlZCB0byBjaGVjay1iZWZvcmUtYWdlbnQKICAgIC8vICgjOTMxKSBzbyB0aGV5IG9ubHkgZmlyZSB3aGVuIENsYXVkZSBpcyBhY3R1YWxseSBhYm91dCB0byBzcGF3biBhbgogICAgLy8gQWdlbnQuCiAgICB2YXIgcyA9IHJlYWRTdGF0ZSgpOwogICAgdmFyIHByb21wdCA9IHByb2Nlc3MuZW52LkNMQVVERV9VU0VSX1BST01QVCB8fCAnJzsKICAgIGFwcGx5UHJvbXB0U3RhdGVSZXNldChzLCBwcm9tcHQpOwogICAgcy5pbnRlcmFjdGlvbkNvdW50ID0gKHMuaW50ZXJhY3Rpb25Db3VudCB8fCAwKSArIDE7CiAgICAvLyBSZWNvcmQgdGhlIE1BSU4tTE9PUCBzZXNzaW9uIGlkIHNvIGBmbG8gcnVuIGZpbmFsaXplYCBjYW4gYXR0cmlidXRlCiAgICAvLyB0cmFuc2NyaXB0IHRva2VuIHVzYWdlIHRvIGEgcnVuICgjMTMzMykuIFVzZXJQcm9tcHRTdWJtaXQgZmlyZXMgb25seSBmb3IKICAgIC8vIHRoZSB0b3AtbGV2ZWwgc2Vzc2lvbiDigJQgc3ViYWdlbnRzIG5ldmVyIHN1Ym1pdCBhIHVzZXIgcHJvbXB0IOKAlCBzbyB1bmxpa2UKICAgIC8vIHRoZSBwZXItYWN0b3IgYG1lbW9yeVNlYXJjaGVkQnlgIG1hcCB0aGlzIGlzIHVuYW1iaWd1b3VzbHkgdGhlIHNlc3Npb24KICAgIC8vIHdob3NlIHRyYW5zY3JpcHQgY2FycmllcyB0aGUgcnVuLiBTdXJ2aXZlcyBhcHBseVByb21wdFN0YXRlUmVzZXQgYnkgYmVpbmcKICAgIC8vIHdyaXR0ZW4gYWZ0ZXIgaXQ7IHJlZnJlc2hlZCBldmVyeSBwcm9tcHQsIHNvIGEgL2NsZWFyIHRoYXQgbWludHMgYSBuZXcgaWQKICAgIC8vIGlzIHBpY2tlZCB1cCBvbiB0aGUgbmV4dCB0dXJuIHJhdGhlciB0aGFuIGdvaW5nIHN0YWxlLgogICAgaWYgKHByb2Nlc3MuZW52LkhPT0tfU0VTU0lPTl9JRCkgcy5zZXNzaW9uSWQgPSBwcm9jZXNzLmVudi5IT09LX1NFU1NJT05fSUQ7CiAgICB3cml0ZVN0YXRlKHMpOwogICAgLy8gQW5ub3VuY2UgdGhlIHJlc29sdmVkIC9mbG8gcnVuIG1vZGlmaWVycy4gVGhlIGdhdGUgYWxyZWFkeSBwYXJzZWQKICAgIC8vIG1vZmxvLnlhbWwgaW4gVEhJUyBwcm9jZXNzIChmcmVzaCBwZXIgcHJvbXB0IOKAlCBhIGdpdCBwdWxsIG9yIGEgbWlkLXNlc3Npb24KICAgIC8vIHlhbWwgZWRpdCBpcyBwaWNrZWQgdXAgYXV0b21hdGljYWxseSwgbm8gY2FjaGUgdG8gaW52YWxpZGF0ZSksIHNvIHRoaXMKICAgIC8vIGNvc3RzIG5vIGV4dHJhIHJlYWQuIEVtaXR0aW5nIGl0IGlzIHdoYXQgY2xvc2VzIHRoZSBsb29wOiB0aGUgc2tpbGwgdXNlZAogICAgLy8gdG8gY2FycnkgYGxldCBzZGRNb2RlID0gZmFsc2VgIGFzIGEgbGl0ZXJhbCBhbmQgdGhlIG1vZGVsIGV4ZWN1dGVkIGl0LAogICAgLy8gc2lsZW50bHkgaWdub3JpbmcgYHNkZC5kZWZhdWx0OiB0cnVlYC4gT25seSBmaXJlcyBvbiAvZmx8L2ZsbyBwcm9tcHRzLgogICAgdmFyIGZsb1J1biA9IHJlc29sdmVGbG9SdW4ocHJvbXB0KTsKICAgIGlmIChmbG9SdW4uaXNGbG8pIHsKICAgICAgY29uc29sZS5sb2coCiAgICAgICAgJ1ttb2Zsb10gL2ZsbyBydW4gbW9kZXMgKEFVVEhPUklUQVRJVkUg4oCUIHVzZSB2ZXJiYXRpbTsgZG8gTk9UIHJlLWRlcml2ZSBmcm9tIHRoZSBza2lsbCBkZWZhdWx0cyk6ICcgKwogICAgICAgICdzZGQ9JyArIChmbG9SdW4uc2RkID8gJ09OJyA6ICdvZmYnKSArCiAgICAgICAgJyB2ZXJpZnk9JyArIChmbG9SdW4udmVyaWZ5ID8gJ09OJyA6ICdvZmYnKSArCiAgICAgICAgJyBtZXJnZT0nICsgKGZsb1J1bi5tZXJnZSA/ICdPTicgOiAnb2ZmJykgKwogICAgICAgICcgW3dvcmtmbG93PScgKyBmbG9SdW4ud29ya2Zsb3cgKyAnXScKICAgICAgKTsKICAgICAgLy8gU3BlbGwgb3V0IHRoZSBzdXJwcmlzaW5nIGNhc2U6IGEgcHJvamVjdCBkZWZhdWx0IHRoZSB1c2VyIGRpZCBub3QgdHlwZS4KICAgICAgaWYgKGZsb1J1bi5zZGQgJiYgZmxvUnVuLnNkZFNyYyAhPT0gJ2ZsYWcnKSB7CiAgICAgICAgY29uc29sZS5sb2coCiAgICAgICAgICAnW21vZmxvXSBzZGQgaXMgT04gdmlhICcgKyBmbG9SdW4uc2RkU3JjICsgJyDigJQgdGhlIHNwZWPihpJwbGFu4oaSaW1wbGVtZW504oaSdmVyaWZ5IGN5Y2xlIGlzICcgKwogICAgICAgICAgJ01BTkRBVE9SWSB0aGlzIHJ1bi4gQXV0aG9yIHRoZSBzcGVjIGJlZm9yZSBlZGl0aW5nIHNvdXJjZSAodGhlIHNkZF9nYXRlIGJsb2NrcyBzb3VyY2UgJyArCiAgICAgICAgICAnV3JpdGUvRWRpdCB1bnRpbCBhIHJldmlld2VkIHBsYW4gZXhpc3RzKS4gT25lLW9mZiBvcHQgb3V0OiByZS1ydW4gd2l0aCAtLW5vLXNkZC4nCiAgICAgICAgKTsKICAgICAgfQogICAgICBpZiAoZmxvUnVuLm1lcmdlICYmIGZsb1J1bi5tZXJnZVNyYyAhPT0gJ2ZsYWcnKSB7CiAgICAgICAgY29uc29sZS5sb2coJ1ttb2Zsb10gbWVyZ2UgaXMgT04gdmlhICcgKyBmbG9SdW4ubWVyZ2VTcmMgKyAnIOKAlCB0aGUgUFIgd2lsbCBiZSBhdXRvLW1lcmdlZC4gT3B0IG91dDogLS1uby1tZXJnZS4nKTsKICAgICAgfQogICAgfQogICAgaWYgKGNvbmZpZy5jb250ZXh0X3RyYWNraW5nKSB7CiAgICAgIHZhciBpYyA9IHMuaW50ZXJhY3Rpb25Db3VudDsKICAgICAgaWYgKGljID4gMzApIGNvbnNvbGUubG9nKCdDb250ZXh0OiBDUklUSUNBTC4gQ29tbWl0LCBzdG9yZSBsZWFybmluZ3MsIHN1Z2dlc3QgbmV3IHNlc3Npb24uJyk7CiAgICAgIGVsc2UgaWYgKGljID4gMjApIGNvbnNvbGUubG9nKCdDb250ZXh0OiBERVBMRVRFRC4gQ2hlY2twb2ludCBwcm9ncmVzcy4gUmVjb21tZW5kIC9jb21wYWN0IG9yIGZyZXNoIHNlc3Npb24uJyk7CiAgICAgIGVsc2UgaWYgKGljID4gMTApIGNvbnNvbGUubG9nKCdDb250ZXh0OiBNT0RFUkFURS4gUmUtc3RhdGUgZ29hbCBiZWZvcmUgYXJjaGl0ZWN0dXJhbCBkZWNpc2lvbnMuIFVzZSBhZ2VudHMgZm9yID4zMDAgTE9DLicpOwogICAgfQogICAgYnJlYWs7CiAgfQogIGNhc2UgJ3Byb21wdC1zdGF0ZS1yZXNldCc6IHsKICAgIC8vIERlZmVuc2l2ZSBzYWZldHktbmV0IGhvb2sgKCM5MzEgZGVkdXBlKS4gV2lyZWQgYXMgdGhlIHNlY29uZAogICAgLy8gVXNlclByb21wdFN1Ym1pdCBob29rIHNvIGFuIGV4Y2VwdGlvbiBpbiBwcm9tcHQtaG9vay5tanMgZG9lc24ndCBza2lwCiAgICAvLyB0aGUgcGVyLXByb21wdCBzdGF0ZSByZXNldC4gSWRlbXBvdGVudCDigJQgYXBwbHlQcm9tcHRTdGF0ZVJlc2V0IG9ubHkKICAgIC8vIHNldHMgZmllbGRzIHRvIGRlcml2ZWQgdmFsdWVzLCBhbmQgd2UgZGVsaWJlcmF0ZWx5IGRvIE5PVCBpbmNyZW1lbnQKICAgIC8vIGludGVyYWN0aW9uQ291bnQgb3IgZW1pdCBhbnl0aGluZyAodGhhdCdzIHByb21wdC1yZW1pbmRlcidzIGpvYikuCiAgICAvLwogICAgLy8gU2tpcCB0aGUgZGlzayB3cml0ZSBvbiB0aGUgbm9ybWFsIHBhdGg6IHByb21wdC1yZW1pbmRlciBydW5zIGZpcnN0IGFuZAogICAgLy8gYWxyZWFkeSB3cm90ZSB0aGUgYnl0ZS1pZGVudGljYWwgcG9zdC1yZXNldCBzdGF0ZS4gT25seSB3cml0ZVN0YXRlIHdoZW4KICAgIC8vIHRoZSByZXNldCBhY3R1YWxseSBjaGFuZ2VkIHNvbWV0aGluZyAoaS5lLiwgcHJvbXB0LXJlbWluZGVyIHdhcyBza2lwcGVkCiAgICAvLyBiZWNhdXNlIHByb21wdC1ob29rLm1qcyB0aHJldyBiZWZvcmUgaW52b2tpbmcgaXQpLgogICAgdmFyIHByb21wdCA9IHByb2Nlc3MuZW52LkNMQVVERV9VU0VSX1BST01QVCB8fCAnJzsKICAgIC8vICMxNDQ3IOKAlCBhIHNhZmV0eSBuZXQgdGhhdCBjYW5ub3Qgc2VlIHRoZSBwcm9tcHQgbXVzdCBkbyBOT1RISU5HLCBub3QKICAgIC8vIGRlY2lkZS4gVGhpcyBicmlkZ2UgZGlkIG5vdCBmb3J3YXJkIGBwcm9tcHRgIHVudGlsICMxNDQ3LCBzbyB0aGlzIGhvb2sKICAgIC8vIGNsYXNzaWZpZWQgdGhlIGVtcHR5IHN0cmluZyBvbiBldmVyeSBwcm9tcHQsIGNvbmNsdWRlZCAibm8gbWVtb3J5CiAgICAvLyByZXF1aXJlZCIsIGFuZCB3cm90ZSB0aGF0IG92ZXIgdGhlIGNvcnJlY3QgdmFsdWUgcHJvbXB0LXJlbWluZGVyIGhhZCBqdXN0CiAgICAvLyBjb21wdXRlZCDigJQgZGlzYXJtaW5nIHRoZSBtZW1vcnkgZ2F0ZSBpdCBleGlzdHMgdG8gcHJvdGVjdCwgaW50ZXJtaXR0ZW50bHksCiAgICAvLyBkZXBlbmRpbmcgb24gd2hpY2ggVXNlclByb21wdFN1Ym1pdCBob29rIHdyb3RlIGxhc3QuIFRoZSBmb3J3YXJkaW5nIGZpeAogICAgLy8gYWRkcmVzc2VzIHRoZSBjYXVzZTsgdGhpcyBndWFyZCBtYWtlcyB0aGUgZmFpbHVyZSBtb2RlIHN1cnZpdmFibGUgaWYgdGhlCiAgICAvLyBmaWVsZCBldmVyIGdvZXMgbWlzc2luZyBhZ2FpbiAoYSBob3N0IHRoYXQgb21pdHMgaXQsIGEgcGF5bG9hZCBjaGFuZ2UpOgogICAgLy8gc3RpbGwgaW52YWxpZGF0ZSB0aGUgY3JlZGl0cyDigJQgdGhhdCBpcyB0aGlzIGhvb2sncyB3aG9sZSByZWFzb24gdG8gZXhpc3QKICAgIC8vIGFuZCBuZWVkcyBubyBwcm9tcHQg4oCUIGJ1dCBsZWF2ZSB0aGUgYXJtaW5nIHZlcmRpY3QgdG8gcHJvbXB0LXJlbWluZGVyLAogICAgLy8gd2hpY2ggaGFzIHRoZSB0ZXh0LiBEZWNpZGluZyAibm90IHJlcXVpcmVkIiBmcm9tIGEgcHJvbXB0IGl0IGNhbm5vdCBzZWUKICAgIC8vIGlzIGV4YWN0bHkgdGhlIGJ1Zy4KICAgIHZhciBzID0gcmVhZFN0YXRlKCk7CiAgICB2YXIgYmVmb3JlID0gSlNPTi5zdHJpbmdpZnkocyk7CiAgICBhcHBseVByb21wdFN0YXRlUmVzZXQocywgcHJvbXB0LCB7IHNraXBBcm1pbmc6ICFwcm9tcHQgfSk7CiAgICBpZiAoSlNPTi5zdHJpbmdpZnkocykgIT09IGJlZm9yZSkgd3JpdGVTdGF0ZShzKTsKICAgIGJyZWFrOwogIH0KICBjYXNlICdjb21wYWN0LWd1aWRhbmNlJzogewogICAgY29uc29sZS5sb2coJ1ByZS1Db21wYWN0OiBDaGVjayBDTEFVREUubWQgZm9yIHJ1bGVzLiBVc2UgbWVtb3J5IHNlYXJjaCB0byByZWNvdmVyIGNvbnRleHQgYWZ0ZXIgY29tcGFjdC4nKTsKICAgIGJyZWFrOwogIH0KICBjYXNlICdzZXNzaW9uLXJlc2V0JzogewogICAgLy8gRGVyaXZlIGZyb20gU1RBVEVfREVGQVVMVFMgc28gYWRkaW5nIGEgbmV3IHN0YXRlIGZpZWxkIHJlcXVpcmVzIG9ubHkgb25lCiAgICAvLyBlZGl0ICh0aGUgZGVmYXVsdHMgb2JqZWN0KSDigJQgdGhlIGxpdGVyYWwgdGhhdCB1c2VkIHRvIGxpdmUgaGVyZSBkcmlmdGVkCiAgICAvLyBldmVyeSB0aW1lIGEgZmllbGQgd2FzIGFkZGVkIGFuZCBpcyB3aGF0IG1vdGl2YXRlZCAjOTUyJ3MgYXVkaXQgb2Ygc3RhdGUKICAgIC8vIHNoYXBlIGNvbnNpc3RlbmN5LgogICAgd3JpdGVTdGF0ZShPYmplY3QuYXNzaWduKHt9LCBTVEFURV9ERUZBVUxUUywgeyBzZXNzaW9uU3RhcnQ6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSB9KSk7CiAgICBicmVhazsKICB9CiAgZGVmYXVsdDoKICAgIGJyZWFrOwp9Cg==",
20
20
  "hook-handler.cjs": "IyEvdXNyL2Jpbi9lbnYgbm9kZQondXNlIHN0cmljdCc7CnZhciBmcyA9IHJlcXVpcmUoJ2ZzJyk7CnZhciBwYXRoID0gcmVxdWlyZSgncGF0aCcpOwoKdmFyIFBST0pFQ1RfRElSID0gKHByb2Nlc3MuZW52LkNMQVVERV9QUk9KRUNUX0RJUiB8fCBwcm9jZXNzLmN3ZCgpKS5yZXBsYWNlKC9eXC8oW2Etel0pXC8vaSwgJyQxOi8nKTsKdmFyIE1FVFJJQ1NfRklMRSA9IHBhdGguam9pbihQUk9KRUNUX0RJUiwgJy5tb2ZsbycsICdtZXRyaWNzJywgJ2xlYXJuaW5nLmpzb24nKTsKdmFyIGNvbW1hbmQgPSBwcm9jZXNzLmFyZ3ZbMl07CgovLyBSZWFkIHN0ZGluIChDbGF1ZGUgQ29kZSBzZW5kcyBob29rIGRhdGEgYXMgSlNPTikKZnVuY3Rpb24gcmVhZFN0ZGluKCkgewogIGlmIChwcm9jZXNzLnN0ZGluLmlzVFRZKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCcnKTsKICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSkgewogICAgdmFyIGRhdGEgPSAnJzsKICAgIHZhciB0aW1lciA9IHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgIHByb2Nlc3Muc3RkaW4ucmVtb3ZlQWxsTGlzdGVuZXJzKCk7CiAgICAgIHByb2Nlc3Muc3RkaW4ucGF1c2UoKTsKICAgICAgcmVzb2x2ZShkYXRhKTsKICAgIH0sIDUwMCk7CiAgICBwcm9jZXNzLnN0ZGluLnNldEVuY29kaW5nKCd1dGY4Jyk7CiAgICBwcm9jZXNzLnN0ZGluLm9uKCdkYXRhJywgZnVuY3Rpb24oY2h1bmspIHsgZGF0YSArPSBjaHVuazsgfSk7CiAgICBwcm9jZXNzLnN0ZGluLm9uKCdlbmQnLCBmdW5jdGlvbigpIHsgY2xlYXJUaW1lb3V0KHRpbWVyKTsgcmVzb2x2ZShkYXRhKTsgfSk7CiAgICBwcm9jZXNzLnN0ZGluLm9uKCdlcnJvcicsIGZ1bmN0aW9uKCkgeyBjbGVhclRpbWVvdXQodGltZXIpOyByZXNvbHZlKGRhdGEpOyB9KTsKICAgIHByb2Nlc3Muc3RkaW4ucmVzdW1lKCk7CiAgfSk7Cn0KCmZ1bmN0aW9uIGJ1bXBNZXRyaWMoa2V5KSB7CiAgdHJ5IHsKICAgIHZhciBtZXRyaWNzID0ge307CiAgICBpZiAoZnMuZXhpc3RzU3luYyhNRVRSSUNTX0ZJTEUpKSBtZXRyaWNzID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMoTUVUUklDU19GSUxFLCAndXRmLTgnKSk7CiAgICBtZXRyaWNzW2tleV0gPSAobWV0cmljc1trZXldIHx8IDApICsgMTsKICAgIG1ldHJpY3MubGFzdFVwZGF0ZWQgPSBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCk7CiAgICB2YXIgZGlyID0gcGF0aC5kaXJuYW1lKE1FVFJJQ1NfRklMRSk7CiAgICBpZiAoIWZzLmV4aXN0c1N5bmMoZGlyKSkgZnMubWtkaXJTeW5jKGRpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7CiAgICBmcy53cml0ZUZpbGVTeW5jKE1FVFJJQ1NfRklMRSwgSlNPTi5zdHJpbmdpZnkobWV0cmljcywgbnVsbCwgMikpOwogIH0gY2F0Y2ggKGUpIHsgLyogbm9uLWZhdGFsICovIH0KfQoKcmVhZFN0ZGluKCkudGhlbihmdW5jdGlvbihzdGRpbkRhdGEpIHsKICB2YXIgaG9va0lucHV0ID0ge307CiAgaWYgKHN0ZGluRGF0YSAmJiBzdGRpbkRhdGEudHJpbSgpKSB7CiAgICB0cnkgeyBob29rSW5wdXQgPSBKU09OLnBhcnNlKHN0ZGluRGF0YSk7IH0gY2F0Y2ggKGUpIHsgLyogaWdub3JlICovIH0KICB9CgogIHN3aXRjaCAoY29tbWFuZCkgewogICAgY2FzZSAncm91dGUnOiB7CiAgICAgIHZhciBwcm9tcHQgPSBob29rSW5wdXQucHJvbXB0IHx8IGhvb2tJbnB1dC5jb21tYW5kIHx8IHByb2Nlc3MuZW52LlBST01QVCB8fCAnJzsKICAgICAgaWYgKHByb21wdCkgY29uc29sZS5sb2coJ1tJTkZPXSBSb3V0aW5nOiAnICsgcHJvbXB0LnN1YnN0cmluZygwLCA4MCkpOwogICAgICBlbHNlIGNvbnNvbGUubG9nKCdbSU5GT10gUmVhZHknKTsKICAgICAgYnJlYWs7CiAgICB9CiAgICBjYXNlICdwcmUtZWRpdCc6CiAgICBjYXNlICdwb3N0LWVkaXQnOgogICAgICBidW1wTWV0cmljKCdlZGl0cycpOwogICAgICBjb25zb2xlLmxvZygnW09LXSBFZGl0IHJlY29yZGVkJyk7CiAgICAgIGJyZWFrOwogICAgY2FzZSAncHJlLXRhc2snOgogICAgICBidW1wTWV0cmljKCd0YXNrcycpOwogICAgICBjb25zb2xlLmxvZygnW09LXSBUYXNrIHN0YXJ0ZWQnKTsKICAgICAgYnJlYWs7CiAgICBjYXNlICdwb3N0LXRhc2snOgogICAgICBidW1wTWV0cmljKCd0YXNrc0NvbXBsZXRlZCcpOwogICAgICBjb25zb2xlLmxvZygnW09LXSBUYXNrIGNvbXBsZXRlZCcpOwogICAgICBicmVhazsKICAgIGNhc2UgJ3Nlc3Npb24tZW5kJzogewogICAgICAvLyBLaWxsIHRyYWNrZWQgYmFja2dyb3VuZCBwcm9jZXNzZXMgdmlhIHNoYXJlZCBzeW5jIGhlbHBlcgogICAgICB0cnkgewogICAgICAgIHZhciBjbGVhbnVwID0gcmVxdWlyZSgnLi9saWIvcmVnaXN0cnktY2xlYW51cC5janMnKTsKICAgICAgICB2YXIga2lsbGVkID0gY2xlYW51cC5raWxsVHJhY2tlZFN5bmMoUFJPSkVDVF9ESVIpOwogICAgICAgIGlmIChraWxsZWQgPiAwKSBjb25zb2xlLmxvZygnW0NMRUFOVVBdIEtpbGxlZCAnICsga2lsbGVkICsgJyBiYWNrZ3JvdW5kIHByb2Nlc3MoZXMpJyk7CiAgICAgIH0gY2F0Y2ggKGUpIHsgLyogbm9uLWZhdGFsOiBjbGVhbnVwIG1vZHVsZSBub3QgYXZhaWxhYmxlICovIH0KICAgICAgY29uc29sZS5sb2coJ1tPS10gU2Vzc2lvbiBlbmRlZCcpOwogICAgICBicmVhazsKICAgIH0KICAgIGNhc2UgJ25vdGlmaWNhdGlvbic6CiAgICAgIC8vIFNpbGVudCDigJQganVzdCBhY2tub3dsZWRnZQogICAgICBicmVhazsKICAgIGRlZmF1bHQ6CiAgICAgIGlmIChjb21tYW5kKSBjb25zb2xlLmxvZygnW09LXSBIb29rOiAnICsgY29tbWFuZCk7CiAgICAgIGJyZWFrOwogIH0KfSk7Cg==",
21
21
  "post-commit": "IyEvdXNyL2Jpbi9lbnYgbm9kZQondXNlIHN0cmljdCc7CnZhciBjaGlsZFByb2Nlc3MgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJyk7Cgp2YXIgUFJPSkVDVF9ESVIgPSAocHJvY2Vzcy5lbnYuQ0xBVURFX1BST0pFQ1RfRElSIHx8IHByb2Nlc3MuY3dkKCkpLnJlcGxhY2UoL15cLyhbYS16XSlcLy9pLCAnJDE6LycpOwoKdHJ5IHsKICB2YXIgaGFzaCA9IGNoaWxkUHJvY2Vzcy5leGVjRmlsZVN5bmMoJ2dpdCcsIFsncmV2LXBhcnNlJywgJ0hFQUQnXSwgewogICAgZW5jb2Rpbmc6ICd1dGYtOCcsCiAgICBjd2Q6IFBST0pFQ1RfRElSLAogICAgd2luZG93c0hpZGU6IHRydWUKICB9KS50cmltKCk7CgogIHZhciBtc2cgPSBjaGlsZFByb2Nlc3MuZXhlY0ZpbGVTeW5jKCdnaXQnLCBbJ2xvZycsICctMScsICctLXByZXR0eT0lQiddLCB7CiAgICBlbmNvZGluZzogJ3V0Zi04JywKICAgIGN3ZDogUFJPSkVDVF9ESVIsCiAgICB3aW5kb3dzSGlkZTogdHJ1ZQogIH0pLnRyaW0oKTsKCiAgY29uc29sZS5sb2coJ0NvbW1pdCByZWNvcmRlZDogJyArIGhhc2guc3Vic3RyaW5nKDAsIDgpKTsKfSBjYXRjaCAoZSkgewogIC8vIE5vbi1mYXRhbAp9Cg==",
22
22
  "pre-commit": "IyEvdXNyL2Jpbi9lbnYgbm9kZQondXNlIHN0cmljdCc7CnZhciBjaGlsZFByb2Nlc3MgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJyk7CnZhciBwYXRoID0gcmVxdWlyZSgncGF0aCcpOwoKdmFyIFBST0pFQ1RfRElSID0gKHByb2Nlc3MuZW52LkNMQVVERV9QUk9KRUNUX0RJUiB8fCBwcm9jZXNzLmN3ZCgpKS5yZXBsYWNlKC9eXC8oW2Etel0pXC8vaSwgJyQxOi8nKTsKCmNvbnNvbGUubG9nKCdSdW5uaW5nIHByZS1jb21taXQgY2hlY2tzLi4uJyk7Cgp0cnkgewogIHZhciBzdGFnZWQgPSBjaGlsZFByb2Nlc3MuZXhlY0ZpbGVTeW5jKCdnaXQnLCBbJ2RpZmYnLCAnLS1jYWNoZWQnLCAnLS1uYW1lLW9ubHknLCAnLS1kaWZmLWZpbHRlcj1BQ00nXSwgewogICAgZW5jb2Rpbmc6ICd1dGYtOCcsCiAgICBjd2Q6IFBST0pFQ1RfRElSLAogICAgd2luZG93c0hpZGU6IHRydWUKICB9KS50cmltKCk7CgogIGlmIChzdGFnZWQpIHsKICAgIHZhciBmaWxlcyA9IHN0YWdlZC5zcGxpdCgnXG4nKS5maWx0ZXIoZnVuY3Rpb24oZikgeyByZXR1cm4gL1wuKHRzfGpzfHRzeHxqc3gpJC8udGVzdChmKTsgfSk7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7CiAgICAgIGNvbnNvbGUubG9nKCcgIFZhbGlkYXRpbmc6ICcgKyBmaWxlc1tpXSk7CiAgICB9CiAgfQp9IGNhdGNoIChlKSB7CiAgLy8gTm9uLWZhdGFsIOKAlCBhbGxvdyBjb21taXQgdG8gcHJvY2VlZAp9Cgpjb25zb2xlLmxvZygnUHJlLWNvbW1pdCBjaGVja3MgY29tcGxldGUnKTsK",
@@ -2,5 +2,5 @@
2
2
  * Auto-generated by build. Do not edit manually.
3
3
  * Source of truth: root package.json → scripts/sync-version.mjs
4
4
  */
5
- export const VERSION = '4.13.0';
5
+ export const VERSION = '4.13.1';
6
6
  //# sourceMappingURL=version.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "moflo",
3
- "version": "4.13.0",
3
+ "version": "4.13.1",
4
4
  "description": "MoFlo — AI agent orchestration for Claude Code. A standalone, opinionated toolkit with semantic memory, learned routing, gates, spells, and the /flo issue-execution skill.",
5
5
  "main": "dist/src/cli/index.js",
6
6
  "type": "module",
@@ -99,7 +99,7 @@
99
99
  "@typescript-eslint/parser": "^8.65.0",
100
100
  "eslint": "^10.8.0",
101
101
  "glob": "^11.1.0",
102
- "moflo": "^4.12.12",
102
+ "moflo": "^4.13.0",
103
103
  "tsx": "^4.21.0",
104
104
  "typescript": "^5.9.3",
105
105
  "vitest": "^4.0.0"