UNPKG

vite-plugin-react-server

Version:
168 lines (166 loc) 24.6 kB
/** * vite-plugin-react-server * Copyright (c) Nico Brinkkemper * MIT License */ const tokenizeNodeOptions = () => { const nodeOptions = process.env["NODE_OPTIONS"] || ""; if (!nodeOptions.trim()) { return []; } const tokens = []; let current = ""; let inQuotes = false; let quoteChar = ""; let i = 0; while (i < nodeOptions.length) { const char = nodeOptions[i]; if (inQuotes) { if (char === quoteChar) { inQuotes = false; quoteChar = ""; if (current.trim()) { tokens.push(current.trim()); current = ""; } } else { current += char; } } else { if (char === '"' || char === "'") { if (current.trim()) { tokens.push(current.trim()); current = ""; } inQuotes = true; quoteChar = char; } else if (char === " " || char === " " || char === "\n") { if (current.trim()) { tokens.push(current.trim()); current = ""; } } else { current += char; } } i++; } if (current.trim()) { tokens.push(current.trim()); } return tokens.filter(Boolean); }; const parseNodeArgs = (args) => { const conditions = []; const flags = /* @__PURE__ */ new Set(); for (let i = 0; i < args.length; i++) { const arg = args[i]; if (arg === "--conditions" || arg === "-C") { if (i + 1 < args.length) { const conditionValue = args[i + 1]; conditions.push( ...conditionValue.split(",").map((c) => c.trim()).filter(Boolean) ); i++; } } else if (arg.startsWith("--conditions=")) { const conditionValue = arg.substring("--conditions=".length); conditions.push( ...conditionValue.split(",").map((c) => c.trim()).filter(Boolean) ); } else if (arg === "--no-addons") { flags.add("no-addons"); } else if (arg.startsWith("--")) { flags.add(arg); } } return { conditions, flags }; }; const getAllConditions = () => { const nodeOptionsTokens = tokenizeNodeOptions(); const { conditions: envConditions } = parseNodeArgs(nodeOptionsTokens); const { conditions: cliConditions } = parseNodeArgs(process.execArgv); return [...envConditions, ...cliConditions]; }; let didWarnAmbiguousConditions = false; const reactConditionSet = /* @__PURE__ */ new Set(["react-server", "react-client"]); const detectReactConditionAmbiguity = () => { const conditions = getAllConditions(); const found = conditions.filter((c) => reactConditionSet.has(c)); const unique = Array.from(new Set(found)); return unique; }; const warnIfAmbiguousReactConditions = () => { if (didWarnAmbiguousConditions) return; const unique = detectReactConditionAmbiguity(); if (unique.includes("react-server") && unique.includes("react-client")) { didWarnAmbiguousConditions = true; const nodeOptions = process.env["NODE_OPTIONS"] || ""; const argv = process.execArgv.join(" "); const msg = `Both react-server and react-client conditions detected in NODE_OPTIONS/execArgv. This can lead to ambiguous resolution. Found: [${unique.join(", ")}] NODE_OPTIONS="${nodeOptions}" execArgv="${argv}" Tip: set exactly one condition or let the plugin manage worker conditions.`; try { process.emitWarning(msg, { code: "VPRS_CONDITION_AMBIGUITY", detail: "vite-plugin-react-server detected conflicting conditions" }); } catch { console.warn(`[vite-plugin-react-server] ${msg}`); } } }; const getCurrentCondition = () => { warnIfAmbiguousReactConditions(); const conditions = getAllConditions(); if (conditions.includes("react-server")) return "react-server"; if (conditions.includes("react-client")) return "react-client"; return void 0; }; const getCondition = (prefix = "react-", defaultReturn = `${prefix}client`) => { const condition2 = getCurrentCondition(); if (condition2 === "react-server") { return `${prefix}server`; } if (condition2 === "react-client") { return `${prefix}client`; } return defaultReturn; }; function assertReactServer() { const currentCondition = getCurrentCondition(); if (currentCondition !== "react-server") { console.warn( `[vite-plugin-react-server] Condition mismatch: expected react-server. Set NODE_OPTIONS="--conditions=react-server"` ); return; } } function assertNonReactServer() { const currentCondition = getCurrentCondition(); if (currentCondition === "react-server") { console.warn( `[vite-plugin-react-server] Condition mismatch: unexpected react-server condition on this module.` ); return; } } const isReactServerCondition = () => getCurrentCondition() === "react-server"; const isReactClientCondition = () => getCurrentCondition() === "react-client"; const hasReactServerCondition = () => { const allConditions = getAllConditions(); return allConditions.includes("react-server"); }; const hasReactClientCondition = () => { const allConditions = getAllConditions(); return allConditions.includes("react-client"); }; const getNodeOptionsConditions = () => { const nodeOptionsTokens = tokenizeNodeOptions(); const { conditions } = parseNodeArgs(nodeOptionsTokens); return conditions; }; const condition = getCurrentCondition(); export { assertNonReactServer, assertReactServer, condition, detectReactConditionAmbiguity, getAllConditions, getCondition, getCurrentCondition, getNodeOptionsConditions, hasReactClientCondition, hasReactServerCondition, isReactClientCondition, isReactServerCondition, warnIfAmbiguousReactConditions }; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2V0Q29uZGl0aW9uLmpzIiwic291cmNlcyI6WyIuLi8uLi8uLi9wbHVnaW4vY29uZmlnL2dldENvbmRpdGlvbi50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBOb3RlOiBkbyBub3QgaW1wb3J0IE5vZGUtb25seSBtb2R1bGVzIGhlcmUgKGUuZy4sICdub2RlOndvcmtlcl90aHJlYWRzJykuXG4vLyBUaGlzIGZpbGUgaXMgY29uc3VtZWQgaW4gYm90aCBzZXJ2ZXIgYW5kIGNsaWVudCBwbHVnaW4gY29udGV4dHMuXG5cbi8qKlxuICogVG9rZW5pemVzIE5PREVfT1BUSU9OUyBzdHJpbmcgaW50byBpbmRpdmlkdWFsIGFyZ3VtZW50c1xuICogSGFuZGxlcyBxdW90ZWQgc3RyaW5ncywgc3BhY2VzLCBhbmQgc3BlY2lhbCBjaGFyYWN0ZXJzXG4gKi9cbmNvbnN0IHRva2VuaXplTm9kZU9wdGlvbnMgPSAoKTogc3RyaW5nW10gPT4ge1xuICBjb25zdCBub2RlT3B0aW9ucyA9IHByb2Nlc3MuZW52W1wiTk9ERV9PUFRJT05TXCJdIHx8IFwiXCI7XG4gIGlmICghbm9kZU9wdGlvbnMudHJpbSgpKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgY29uc3QgdG9rZW5zOiBzdHJpbmdbXSA9IFtdO1xuICBsZXQgY3VycmVudCA9IFwiXCI7XG4gIGxldCBpblF1b3RlcyA9IGZhbHNlO1xuICBsZXQgcXVvdGVDaGFyID0gXCJcIjtcbiAgbGV0IGkgPSAwO1xuXG4gIHdoaWxlIChpIDwgbm9kZU9wdGlvbnMubGVuZ3RoKSB7XG4gICAgY29uc3QgY2hhciA9IG5vZGVPcHRpb25zW2ldO1xuXG4gICAgaWYgKGluUXVvdGVzKSB7XG4gICAgICBpZiAoY2hhciA9PT0gcXVvdGVDaGFyKSB7XG4gICAgICAgIGluUXVvdGVzID0gZmFsc2U7XG4gICAgICAgIHF1b3RlQ2hhciA9IFwiXCI7XG4gICAgICAgIGlmIChjdXJyZW50LnRyaW0oKSkge1xuICAgICAgICAgIHRva2Vucy5wdXNoKGN1cnJlbnQudHJpbSgpKTtcbiAgICAgICAgICBjdXJyZW50ID0gXCJcIjtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY3VycmVudCArPSBjaGFyO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoY2hhciA9PT0gJ1wiJyB8fCBjaGFyID09PSBcIidcIikge1xuICAgICAgICBpZiAoY3VycmVudC50cmltKCkpIHtcbiAgICAgICAgICB0b2tlbnMucHVzaChjdXJyZW50LnRyaW0oKSk7XG4gICAgICAgICAgY3VycmVudCA9IFwiXCI7XG4gICAgICAgIH1cbiAgICAgICAgaW5RdW90ZXMgPSB0cnVlO1xuICAgICAgICBxdW90ZUNoYXIgPSBjaGFyO1xuICAgICAgfSBlbHNlIGlmIChjaGFyID09PSBcIiBcIiB8fCBjaGFyID09PSBcIlxcdFwiIHx8IGNoYXIgPT09IFwiXFxuXCIpIHtcbiAgICAgICAgaWYgKGN1cnJlbnQudHJpbSgpKSB7XG4gICAgICAgICAgdG9rZW5zLnB1c2goY3VycmVudC50cmltKCkpO1xuICAgICAgICAgIGN1cnJlbnQgPSBcIlwiO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjdXJyZW50ICs9IGNoYXI7XG4gICAgICB9XG4gICAgfVxuICAgIGkrKztcbiAgfVxuXG4gIGlmIChjdXJyZW50LnRyaW0oKSkge1xuICAgIHRva2Vucy5wdXNoKGN1cnJlbnQudHJpbSgpKTtcbiAgfVxuXG4gIHJldHVybiB0b2tlbnMuZmlsdGVyKEJvb2xlYW4pO1xufTtcblxuLyoqXG4gKiBQYXJzZXMgY29tbWFuZC1saW5lIGFyZ3VtZW50cyBmb3IgY29uZGl0aW9ucyBhbmQgb3RoZXIgZmxhZ3NcbiAqL1xuY29uc3QgcGFyc2VOb2RlQXJncyA9IChhcmdzOiBzdHJpbmdbXSkgPT4ge1xuICBjb25zdCBjb25kaXRpb25zOiBzdHJpbmdbXSA9IFtdO1xuICBjb25zdCBmbGFncyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGFyZyA9IGFyZ3NbaV07XG5cbiAgICBpZiAoYXJnID09PSBcIi0tY29uZGl0aW9uc1wiIHx8IGFyZyA9PT0gXCItQ1wiKSB7XG4gICAgICAvLyBOZXh0IGFyZ3VtZW50IGlzIHRoZSBjb25kaXRpb24gdmFsdWVcbiAgICAgIGlmIChpICsgMSA8IGFyZ3MubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IGNvbmRpdGlvblZhbHVlID0gYXJnc1tpICsgMV07XG4gICAgICAgIGNvbmRpdGlvbnMucHVzaChcbiAgICAgICAgICAuLi5jb25kaXRpb25WYWx1ZVxuICAgICAgICAgICAgLnNwbGl0KFwiLFwiKVxuICAgICAgICAgICAgLm1hcCgoYykgPT4gYy50cmltKCkpXG4gICAgICAgICAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgICAgICk7XG4gICAgICAgIGkrKzsgLy8gU2tpcCB0aGUgbmV4dCBhcmd1bWVudCBzaW5jZSB3ZSBjb25zdW1lZCBpdFxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoYXJnLnN0YXJ0c1dpdGgoXCItLWNvbmRpdGlvbnM9XCIpKSB7XG4gICAgICAvLyBDb25kaXRpb24gdmFsdWUgaXMgcGFydCBvZiB0aGUgc2FtZSBhcmd1bWVudFxuICAgICAgY29uc3QgY29uZGl0aW9uVmFsdWUgPSBhcmcuc3Vic3RyaW5nKFwiLS1jb25kaXRpb25zPVwiLmxlbmd0aCk7XG4gICAgICBjb25kaXRpb25zLnB1c2goXG4gICAgICAgIC4uLmNvbmRpdGlvblZhbHVlXG4gICAgICAgICAgLnNwbGl0KFwiLFwiKVxuICAgICAgICAgIC5tYXAoKGMpID0+IGMudHJpbSgpKVxuICAgICAgICAgIC5maWx0ZXIoQm9vbGVhbilcbiAgICAgICk7XG4gICAgfSBlbHNlIGlmIChhcmcgPT09IFwiLS1uby1hZGRvbnNcIikge1xuICAgICAgZmxhZ3MuYWRkKFwibm8tYWRkb25zXCIpO1xuICAgIH0gZWxzZSBpZiAoYXJnLnN0YXJ0c1dpdGgoXCItLVwiKSkge1xuICAgICAgLy8gT3RoZXIgZmxhZ3NcbiAgICAgIGZsYWdzLmFkZChhcmcpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7IGNvbmRpdGlvbnMsIGZsYWdzIH07XG59O1xuXG4vKipcbiAqIEdldHMgYWxsIGNvbmRpdGlvbnMgZnJvbSBib3RoIE5PREVfT1BUSU9OUyBhbmQgY29tbWFuZC1saW5lIGFyZ3VtZW50c1xuICovXG5leHBvcnQgY29uc3QgZ2V0QWxsQ29uZGl0aW9ucyA9ICgpOiBzdHJpbmdbXSA9PiB7XG4gIC8vIFBhcnNlIE5PREVfT1BUSU9OU1xuICBjb25zdCBub2RlT3B0aW9uc1Rva2VucyA9IHRva2VuaXplTm9kZU9wdGlvbnMoKTtcbiAgY29uc3QgeyBjb25kaXRpb25zOiBlbnZDb25kaXRpb25zIH0gPSBwYXJzZU5vZGVBcmdzKG5vZGVPcHRpb25zVG9rZW5zKTtcblxuICAvLyBQYXJzZSBjb21tYW5kLWxpbmUgYXJndW1lbnRzXG4gIGNvbnN0IHsgY29uZGl0aW9uczogY2xpQ29uZGl0aW9ucyB9ID0gcGFyc2VOb2RlQXJncyhwcm9jZXNzLmV4ZWNBcmd2KTtcblxuICAvLyBDb21iaW5lIGFsbCBjb25kaXRpb25zXG4gIHJldHVybiBbLi4uZW52Q29uZGl0aW9ucywgLi4uY2xpQ29uZGl0aW9uc107XG59O1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBBbWJpZ3VpdHkgZGV0ZWN0aW9uIGFuZCB3YXJuaW5nXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5sZXQgZGlkV2FybkFtYmlndW91c0NvbmRpdGlvbnMgPSBmYWxzZTtcbi8vIHJlYWN0LXN0YXRpYyBkb2VzIG5vdCBleGlzdHMsIGJlY2F1c2UgeW91IHN0aWxsIG5lZWQgY29uZGl0aW9uIHJlYWN0LXNlcnZlciBmb3IgdGhlIC5zdGF0aWMgaW1wb3J0cyB0byB3b3JrLlxuY29uc3QgcmVhY3RDb25kaXRpb25TZXQgPSBuZXcgU2V0KFtcInJlYWN0LXNlcnZlclwiLCBcInJlYWN0LWNsaWVudFwiXSk7XG5cbmV4cG9ydCBjb25zdCBkZXRlY3RSZWFjdENvbmRpdGlvbkFtYmlndWl0eSA9ICgpOiBzdHJpbmdbXSA9PiB7XG4gIGNvbnN0IGNvbmRpdGlvbnMgPSBnZXRBbGxDb25kaXRpb25zKCk7XG4gIGNvbnN0IGZvdW5kID0gY29uZGl0aW9ucy5maWx0ZXIoKGMpID0+IHJlYWN0Q29uZGl0aW9uU2V0LmhhcyhjKSk7XG4gIGNvbnN0IHVuaXF1ZSA9IEFycmF5LmZyb20obmV3IFNldChmb3VuZCkpO1xuICByZXR1cm4gdW5pcXVlO1xufTtcblxuZXhwb3J0IGNvbnN0IHdhcm5JZkFtYmlndW91c1JlYWN0Q29uZGl0aW9ucyA9ICgpOiB2b2lkID0+IHtcbiAgaWYgKGRpZFdhcm5BbWJpZ3VvdXNDb25kaXRpb25zKSByZXR1cm47XG4gIGNvbnN0IHVuaXF1ZSA9IGRldGVjdFJlYWN0Q29uZGl0aW9uQW1iaWd1aXR5KCk7XG4gIGlmICh1bmlxdWUuaW5jbHVkZXMoXCJyZWFjdC1zZXJ2ZXJcIikgJiYgdW5pcXVlLmluY2x1ZGVzKFwicmVhY3QtY2xpZW50XCIpKSB7XG4gICAgZGlkV2FybkFtYmlndW91c0NvbmRpdGlvbnMgPSB0cnVlO1xuICAgIGNvbnN0IG5vZGVPcHRpb25zID0gcHJvY2Vzcy5lbnZbXCJOT0RFX09QVElPTlNcIl0gfHwgXCJcIjtcbiAgICBjb25zdCBhcmd2ID0gcHJvY2Vzcy5leGVjQXJndi5qb2luKFwiIFwiKTtcbiAgICBjb25zdCBtc2cgPVxuICAgICAgYEJvdGggcmVhY3Qtc2VydmVyIGFuZCByZWFjdC1jbGllbnQgY29uZGl0aW9ucyBkZXRlY3RlZCBpbiBOT0RFX09QVElPTlMvZXhlY0FyZ3YuIGAgK1xuICAgICAgYFRoaXMgY2FuIGxlYWQgdG8gYW1iaWd1b3VzIHJlc29sdXRpb24uIEZvdW5kOiBbJHt1bmlxdWUuam9pbihcIiwgXCIpfV1cXG5gICtcbiAgICAgIGBOT0RFX09QVElPTlM9XCIke25vZGVPcHRpb25zfVwiXFxuZXhlY0FyZ3Y9XCIke2FyZ3Z9XCJcXG5gICtcbiAgICAgIGBUaXA6IHNldCBleGFjdGx5IG9uZSBjb25kaXRpb24gb3IgbGV0IHRoZSBwbHVnaW4gbWFuYWdlIHdvcmtlciBjb25kaXRpb25zLmA7XG4gICAgLy8gVXNlIHByb2Nlc3MuZW1pdFdhcm5pbmcgdG8gYXZvaWQgdGhyb3dpbmdcbiAgICB0cnkge1xuICAgICAgcHJvY2Vzcy5lbWl0V2FybmluZyhtc2csIHtcbiAgICAgICAgY29kZTogXCJWUFJTX0NPTkRJVElPTl9BTUJJR1VJVFlcIixcbiAgICAgICAgZGV0YWlsOiBcInZpdGUtcGx1Z2luLXJlYWN0LXNlcnZlciBkZXRlY3RlZCBjb25mbGljdGluZyBjb25kaXRpb25zXCIsXG4gICAgICB9IGFzIGFueSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBGYWxsYmFja1xuXG4gICAgICBjb25zb2xlLndhcm4oYFt2aXRlLXBsdWdpbi1yZWFjdC1zZXJ2ZXJdICR7bXNnfWApO1xuICAgIH1cbiAgfVxufTtcblxuLyoqXG4gKiBHZXRzIHRoZSBjdXJyZW50IGNvbmRpdGlvbiwgZGVmYXVsdGluZyB0byBcInJlYWN0LWNsaWVudFwiIGlmIG5vIGNvbmRpdGlvbnMgYXJlIHNldFxuICovXG5leHBvcnQgY29uc3QgZ2V0Q3VycmVudENvbmRpdGlvbiA9ICgpOlxuICB8IFwicmVhY3Qtc2VydmVyXCJcbiAgfCBcInJlYWN0LWNsaWVudFwiXG4gIHwgdW5kZWZpbmVkID0+IHtcbiAgLy8gV2FybiBpZiB3ZSBkZXRlY3QgYm90aCBjb25kaXRpb25zIHByZXNlbnRcbiAgd2FybklmQW1iaWd1b3VzUmVhY3RDb25kaXRpb25zKCk7XG5cbiAgLy8gQ2hlY2sgYm90aCBOT0RFX09QVElPTlMgYW5kIGV4ZWNBcmd2IGZvciBjb25kaXRpb25zXG4gIGNvbnN0IGNvbmRpdGlvbnMgPSBnZXRBbGxDb25kaXRpb25zKCk7XG4gIGlmIChjb25kaXRpb25zLmluY2x1ZGVzKFwicmVhY3Qtc2VydmVyXCIpKSByZXR1cm4gXCJyZWFjdC1zZXJ2ZXJcIjtcbiAgaWYgKGNvbmRpdGlvbnMuaW5jbHVkZXMoXCJyZWFjdC1jbGllbnRcIikpIHJldHVybiBcInJlYWN0LWNsaWVudFwiO1xuXG4gIC8vIERlZmF1bHQgdG8gcmVhY3QtY2xpZW50IHdoZW4gbm90aGluZyBpcyBzZXRcbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn07XG5cbi8qKlxuICogR2V0cyB0aGUgY29uZGl0aW9uIHdpdGggYSBjdXN0b20gcHJlZml4XG4gKi9cbmV4cG9ydCBjb25zdCBnZXRDb25kaXRpb24gPSA8UHJlZml4IGV4dGVuZHMgc3RyaW5nID0gXCJyZWFjdC1cIiwgRGVmYXVsdENvbmRpdGlvbiBleHRlbmRzIGAke1ByZWZpeH0ke3N0cmluZ31gID0gYCR7UHJlZml4fWNsaWVudGA+KFxuICBwcmVmaXg6IFByZWZpeCA9IFwicmVhY3QtXCIgYXMgUHJlZml4LFxuICBkZWZhdWx0UmV0dXJuOlxuICAgIHwgYCR7UHJlZml4fXNlcnZlcmBcbiAgICB8IGAke1ByZWZpeH1jbGllbnRgID0gYCR7cHJlZml4fWNsaWVudGAgYXMgYCR7UHJlZml4fWNsaWVudGBcbik6IGAke1ByZWZpeH1jbGllbnRgIHwgYCR7UHJlZml4fXNlcnZlcmAgfCBEZWZhdWx0Q29uZGl0aW9uID0+IHtcbiAgY29uc3QgY29uZGl0aW9uID0gZ2V0Q3VycmVudENvbmRpdGlvbigpO1xuICBpZiAoY29uZGl0aW9uID09PSBcInJlYWN0LXNlcnZlclwiKSB7XG4gICAgcmV0dXJuIGAke3ByZWZpeH1zZXJ2ZXJgIGFzIGAke1ByZWZpeH1zZXJ2ZXJgO1xuICB9XG4gIGlmIChjb25kaXRpb24gPT09IFwicmVhY3QtY2xpZW50XCIpIHtcbiAgICByZXR1cm4gYCR7cHJlZml4fWNsaWVudGAgYXMgYCR7UHJlZml4fWNsaWVudGA7XG4gIH1cbiAgcmV0dXJuIGRlZmF1bHRSZXR1cm47XG59O1xuXG4vKipcbiAqIEFzc2VydHMgdGhhdCB0aGUgY3VycmVudCBjb25kaXRpb24gaXMgcmVhY3Qtc2VydmVyXG4gKiBUaHJvd3MgYW4gZXJyb3Igd2l0aCBhIGRlc2NyaXB0aXZlIG1lc3NhZ2UgaWYgbm90XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRSZWFjdFNlcnZlcigpOiBhc3NlcnRzIHRoaXMgaXMge1xuICBjb25kaXRpb246IFwicmVhY3Qtc2VydmVyXCI7XG59IHtcbiAgY29uc3QgY3VycmVudENvbmRpdGlvbiA9IGdldEN1cnJlbnRDb25kaXRpb24oKTtcbiAgaWYgKGN1cnJlbnRDb25kaXRpb24gIT09IFwicmVhY3Qtc2VydmVyXCIpIHtcbiAgICAvLyBEZWJ1Zy1vbmx5OiBhdm9pZCBOb2RlLW9ubHkgQVBJcyB0byBrZWVwIHRoaXMgZmlsZSBicm93c2VyLXNhZmVcbiAgICBjb25zb2xlLndhcm4oXG4gICAgICBgW3ZpdGUtcGx1Z2luLXJlYWN0LXNlcnZlcl0gQ29uZGl0aW9uIG1pc21hdGNoOiBleHBlY3RlZCByZWFjdC1zZXJ2ZXIuIFNldCBOT0RFX09QVElPTlM9XCItLWNvbmRpdGlvbnM9cmVhY3Qtc2VydmVyXCJgXG4gICAgKTtcbiAgICByZXR1cm47IC8vIERvbid0IHRocm93IOKAlCBWaXRlIDcgbWF5IGxvYWQgYm90aCBjb25kaXRpb24gdmFyaWFudHMgZHVyaW5nIGNvbmZpZyBidW5kbGluZ1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnROb25SZWFjdFNlcnZlcigpOiBhc3NlcnRzIHRoaXMgaXMge1xuICBjb25kaXRpb246IFwicmVhY3QtY2xpZW50XCI7XG59IHtcbiAgY29uc3QgY3VycmVudENvbmRpdGlvbiA9IGdldEN1cnJlbnRDb25kaXRpb24oKTtcbiAgaWYgKGN1cnJlbnRDb25kaXRpb24gPT09IFwicmVhY3Qtc2VydmVyXCIpIHtcbiAgICAvLyBEZWJ1Zy1vbmx5OiBhdm9pZCBOb2RlLW9ubHkgQVBJcyB0byBrZWVwIHRoaXMgZmlsZSBicm93c2VyLXNhZmVcbiAgICBjb25zb2xlLndhcm4oXG4gICAgICBgW3ZpdGUtcGx1Z2luLXJlYWN0LXNlcnZlcl0gQ29uZGl0aW9uIG1pc21hdGNoOiB1bmV4cGVjdGVkIHJlYWN0LXNlcnZlciBjb25kaXRpb24gb24gdGhpcyBtb2R1bGUuYFxuICAgICk7XG4gICAgcmV0dXJuOyAvLyBEb24ndCB0aHJvdyDigJQgVml0ZSA3IG1heSBsb2FkIGJvdGggY29uZGl0aW9uIHZhcmlhbnRzIGR1cmluZyBjb25maWcgYnVuZGxpbmdcbiAgfVxufVxuXG4vKipcbiAqIENoZWNrcyBpZiB0aGUgY3VycmVudCBjb25kaXRpb24gaXMgcmVhY3Qtc2VydmVyIChzdHJpY3QgLSByZXF1aXJlcyBib3RoIE5PREVfT1BUSU9OUyBhbmQgZXhlY0FyZ3YpXG4gKiBVc2UgdGhpcyBmb3IgUmVhY3QgU2VydmVyIERPTSBjb21wYXRpYmlsaXR5IGNoZWNrc1xuICovXG5leHBvcnQgY29uc3QgaXNSZWFjdFNlcnZlckNvbmRpdGlvbiA9ICgpOiBib29sZWFuID0+XG4gIGdldEN1cnJlbnRDb25kaXRpb24oKSA9PT0gXCJyZWFjdC1zZXJ2ZXJcIjtcblxuLyoqXG4gKiBDaGVja3MgaWYgdGhlIGN1cnJlbnQgY29uZGl0aW9uIGlzIHJlYWN0LWNsaWVudCAoc3RyaWN0IC0gcmVxdWlyZXMgYm90aCBOT0RFX09QVElPTlMgYW5kIGV4ZWNBcmd2KVxuICogVXNlIHRoaXMgZm9yIFJlYWN0IFNlcnZlciBET00gY29tcGF0aWJpbGl0eSBjaGVja3NcbiAqL1xuZXhwb3J0IGNvbnN0IGlzUmVhY3RDbGllbnRDb25kaXRpb24gPSAoKTogYm9vbGVhbiA9PlxuICBnZXRDdXJyZW50Q29uZGl0aW9uKCkgPT09IFwicmVhY3QtY2xpZW50XCI7XG5cbi8qKlxuICogQ2hlY2tzIGlmIHJlYWN0LXNlcnZlciBjb25kaXRpb24gaXMgcHJlc2VudCBpbiBlaXRoZXIgTk9ERV9PUFRJT05TIE9SIGV4ZWNBcmd2IChsZW5pZW50KVxuICogVXNlIHRoaXMgZm9yIHBsdWdpbiBpbnRlcm5hbCBlbnZpcm9ubWVudCBnYXRpbmdcbiAqL1xuZXhwb3J0IGNvbnN0IGhhc1JlYWN0U2VydmVyQ29uZGl0aW9uID0gKCk6IGJvb2xlYW4gPT4ge1xuICBjb25zdCBhbGxDb25kaXRpb25zID0gZ2V0QWxsQ29uZGl0aW9ucygpO1xuICByZXR1cm4gYWxsQ29uZGl0aW9ucy5pbmNsdWRlcyhcInJlYWN0LXNlcnZlclwiKTtcbn07XG5cbi8qKlxuICogQ2hlY2tzIGlmIHJlYWN0LWNsaWVudCBjb25kaXRpb24gaXMgcHJlc2VudCBpbiBlaXRoZXIgTk9ERV9PUFRJT05TIE9SIGV4ZWNBcmd2IChsZW5pZW50KVxuICogVXNlIHRoaXMgZm9yIHBsdWdpbiBpbnRlcm5hbCBlbnZpcm9ubWVudCBnYXRpbmcgIFxuICovXG5leHBvcnQgY29uc3QgaGFzUmVhY3RDbGllbnRDb25kaXRpb24gPSAoKTogYm9vbGVhbiA9PiB7XG4gIGNvbnN0IGFsbENvbmRpdGlvbnMgPSBnZXRBbGxDb25kaXRpb25zKCk7XG4gIHJldHVybiBhbGxDb25kaXRpb25zLmluY2x1ZGVzKFwicmVhY3QtY2xpZW50XCIpO1xufTtcblxuLyoqXG4gKiBMZWdhY3kgZnVuY3Rpb24gZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHlcbiAqIEBkZXByZWNhdGVkIFVzZSBnZXRBbGxDb25kaXRpb25zKCkgaW5zdGVhZFxuICovXG5leHBvcnQgY29uc3QgZ2V0Tm9kZU9wdGlvbnNDb25kaXRpb25zID0gKCk6IHN0cmluZ1tdID0+IHtcbiAgY29uc3Qgbm9kZU9wdGlvbnNUb2tlbnMgPSB0b2tlbml6ZU5vZGVPcHRpb25zKCk7XG4gIGNvbnN0IHsgY29uZGl0aW9ucyB9ID0gcGFyc2VOb2RlQXJncyhub2RlT3B0aW9uc1Rva2Vucyk7XG4gIHJldHVybiBjb25kaXRpb25zO1xufTtcblxuLyoqXG4gKiBMZWdhY3kgZXhwb3J0IGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5XG4gKiBAZGVwcmVjYXRlZCBVc2UgZ2V0Q3VycmVudENvbmRpdGlvbigpIGluc3RlYWRcbiAqL1xuZXhwb3J0IGNvbnN0IGNvbmRpdGlvbiA9IGdldEN1cnJlbnRDb25kaXRpb24oKTtcbiJdLCJuYW1lcyI6WyJjb25kaXRpb24iXSwibWFwcGluZ3MiOiI7Ozs7O0FBT0EsTUFBTSxzQkFBc0IsTUFBZ0I7QUFDMUMsRUFBQSxNQUFNLFdBQWMsR0FBQSxPQUFBLENBQVEsR0FBSSxDQUFBLGNBQWMsQ0FBSyxJQUFBLEVBQUE7QUFDbkQsRUFBSSxJQUFBLENBQUMsV0FBWSxDQUFBLElBQUEsRUFBUSxFQUFBO0FBQ3ZCLElBQUEsT0FBTyxFQUFDO0FBQUE7QUFHVixFQUFBLE1BQU0sU0FBbUIsRUFBQztBQUMxQixFQUFBLElBQUksT0FBVSxHQUFBLEVBQUE7QUFDZCxFQUFBLElBQUksUUFBVyxHQUFBLEtBQUE7QUFDZixFQUFBLElBQUksU0FBWSxHQUFBLEVBQUE7QUFDaEIsRUFBQSxJQUFJLENBQUksR0FBQSxDQUFBO0FBRVIsRUFBTyxPQUFBLENBQUEsR0FBSSxZQUFZLE1BQVEsRUFBQTtBQUM3QixJQUFNLE1BQUEsSUFBQSxHQUFPLFlBQVksQ0FBQyxDQUFBO0FBRTFCLElBQUEsSUFBSSxRQUFVLEVBQUE7QUFDWixNQUFBLElBQUksU0FBUyxTQUFXLEVBQUE7QUFDdEIsUUFBVyxRQUFBLEdBQUEsS0FBQTtBQUNYLFFBQVksU0FBQSxHQUFBLEVBQUE7QUFDWixRQUFJLElBQUEsT0FBQSxDQUFRLE1BQVEsRUFBQTtBQUNsQixVQUFPLE1BQUEsQ0FBQSxJQUFBLENBQUssT0FBUSxDQUFBLElBQUEsRUFBTSxDQUFBO0FBQzFCLFVBQVUsT0FBQSxHQUFBLEVBQUE7QUFBQTtBQUNaLE9BQ0ssTUFBQTtBQUNMLFFBQVcsT0FBQSxJQUFBLElBQUE7QUFBQTtBQUNiLEtBQ0ssTUFBQTtBQUNMLE1BQUksSUFBQSxJQUFBLEtBQVMsR0FBTyxJQUFBLElBQUEsS0FBUyxHQUFLLEVBQUE7QUFD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