UNPKG

@fenge/eslint-config

Version:

A super strict eslint config for linting js/ts/package.json.

227 lines 34.1 kB
import * as fengeTsPlugin from "@fenge/eslint-plugin-ts"; import { getJsBase } from "../js/base.js"; export function getTsBase() { const jsBase = getJsBase(); const getTsExtensionRules = () => { // Key is js rule, value is ts rule // https://typescript-eslint.io/rules/?=extension const extensionRuleMap = { "class-methods-use-this": "@typescript-eslint/class-methods-use-this", "consistent-return": "@typescript-eslint/consistent-return", "default-param-last": "@typescript-eslint/default-param-last", "dot-notation": "@typescript-eslint/dot-notation", "init-declarations": "@typescript-eslint/init-declarations", "max-params": "@typescript-eslint/max-params", "no-array-constructor": "@typescript-eslint/no-array-constructor", "no-dupe-class-members": "@typescript-eslint/no-dupe-class-members", "no-empty-function": "@typescript-eslint/no-empty-function", "no-implied-eval": "@typescript-eslint/no-implied-eval", "no-invalid-this": "@typescript-eslint/no-invalid-this", "no-loop-func": "@typescript-eslint/no-loop-func", // "no-loss-of-precision": "@typescript-eslint/no-loss-of-precision", // This rule has been deprecated "no-magic-numbers": "@typescript-eslint/no-magic-numbers", "no-redeclare": "@typescript-eslint/no-redeclare", "no-restricted-imports": "@typescript-eslint/no-restricted-imports", "no-shadow": "@typescript-eslint/no-shadow", "no-unused-expressions": "@typescript-eslint/no-unused-expressions", "no-unused-vars": "@typescript-eslint/no-unused-vars", "no-use-before-define": "@typescript-eslint/no-use-before-define", "no-useless-constructor": "@typescript-eslint/no-useless-constructor", "no-throw-literal": "@typescript-eslint/only-throw-error", "prefer-destructuring": "@typescript-eslint/prefer-destructuring", "prefer-promise-reject-errors": "@typescript-eslint/prefer-promise-reject-errors", "require-await": "@typescript-eslint/require-await", "no-return-await": "@typescript-eslint/return-await", // no-return-await has been deprecated }; const isInExtensionRuleMap = (key) => key in extensionRuleMap; return Object.entries(jsBase.rules).reduce((result, [jsRuleKey, jsRuleValue]) => isInExtensionRuleMap(jsRuleKey) ? { ...result, [jsRuleKey]: "off", [extensionRuleMap[jsRuleKey]]: jsRuleValue, } : result, {}); }; return { ...jsBase, name: "fenge/typescript", files: ["**/*.{ts,cts,mts,tsx}"], languageOptions: { ...jsBase.languageOptions, parserOptions: { ...jsBase.languageOptions.parserOptions, // Setting `projectService: true` or `project: true` is pretty slow when lint a monorepo with many tsconfig.json files in each sub-app. // But setting `project: "tsconfig.json"` will cause parser error when the project root tsconfig.json is `{ extends: "fenge/tsconfig" }` projectService: true, }, globals: { ...jsBase.languageOptions.globals, NodeJS: false, }, }, plugins: { ...jsBase.plugins, "@fenge-ts": fengeTsPlugin, }, rules: { ...jsBase.rules, ...getTsExtensionRules(), // fenge "@fenge-ts/exact-map-set-type": "error", "@fenge-ts/no-const-enum": "error", "@fenge-ts/no-declares": "error", "@fenge-ts/no-export-assignment": "error", "@fenge-ts/no-misuse-spreading-parameter": "error", "@fenge-ts/no-property-decorator": "error", "@fenge-ts/no-untyped-empty-array": "error", // typescript "@typescript-eslint/adjacent-overload-signatures": "error", // "@typescript-eslint/array-type": ["error", 'array-simple'], // The default option is 'array'. Not very sure if we need to change the option. So disabled it. "@typescript-eslint/await-thenable": "error", "@typescript-eslint/class-literal-property-style": "error", "@typescript-eslint/consistent-generic-constructors": "error", "@typescript-eslint/consistent-indexed-object-style": "error", "@typescript-eslint/consistent-type-assertions": [ "error", { assertionStyle: "as", objectLiteralTypeAssertions: "allow-as-parameter", }, ], "@typescript-eslint/consistent-type-definitions": ["error", "interface"], // TODO should we change to 'type'? "@typescript-eslint/consistent-type-exports": "error", "@typescript-eslint/consistent-type-imports": "error", "@typescript-eslint/dot-notation": ["error", { allowKeywords: true }], "@typescript-eslint/method-signature-style": "error", "@typescript-eslint/naming-convention": [ "error", { selector: "function", format: ["camelCase", "PascalCase"], }, { selector: "variable", types: ["function"], format: ["camelCase", "PascalCase"], // decorators need PascalCase }, { selector: "class", format: ["PascalCase"], }, { selector: "interface", format: ["PascalCase"], }, { selector: "typeAlias", format: ["PascalCase"], }, { selector: "typeParameter", format: ["UPPER_CASE", "PascalCase"], }, ], "@typescript-eslint/no-array-delete": "error", "@typescript-eslint/no-base-to-string": [ "error", { ignoredTypeNames: [] }, ], "@typescript-eslint/no-confusing-non-null-assertion": "error", "@typescript-eslint/no-confusing-void-expression": [ "error", { ignoreArrowShorthand: true }, ], "@typescript-eslint/no-deprecated": "error", "@typescript-eslint/no-duplicate-enum-values": "error", "@typescript-eslint/no-duplicate-type-constituents": "error", "@typescript-eslint/no-empty-object-type": "error", // "@typescript-eslint/no-explicit-any": "warn", "@typescript-eslint/no-extra-non-null-assertion": "error", // "@typescript-eslint/no-extraneous-class": "error", // Classes have only static member is reasonable sometimes. Nestjs modules use it a lot. "@typescript-eslint/no-floating-promises": [ "error", { ignoreVoid: false, }, ], "@typescript-eslint/no-for-in-array": "error", "@typescript-eslint/no-import-type-side-effects": "error", "@typescript-eslint/no-inferrable-types": "error", "@typescript-eslint/no-invalid-void-type": "error", "@typescript-eslint/no-misused-new": "error", "@typescript-eslint/no-misused-promises": "error", "@typescript-eslint/no-misused-spread": "error", "@typescript-eslint/no-mixed-enums": "error", "@typescript-eslint/no-namespace": "error", // consider to add option `{"allowDefinitionFiles": false}` to strictly forbid `namespace` keyword "@typescript-eslint/no-non-null-asserted-nullish-coalescing": "error", "@typescript-eslint/no-non-null-asserted-optional-chain": "error", "@typescript-eslint/no-non-null-assertion": "error", "@typescript-eslint/no-redundant-type-constituents": "error", "@typescript-eslint/no-require-imports": "error", "@typescript-eslint/no-unnecessary-boolean-literal-compare": "error", "@typescript-eslint/no-unnecessary-condition": "error", "@typescript-eslint/no-unnecessary-parameter-property-assignment": "error", "@typescript-eslint/no-unnecessary-template-expression": "error", // js also need this rule "@typescript-eslint/no-unnecessary-type-arguments": "error", "@typescript-eslint/no-unnecessary-type-assertion": "error", "@typescript-eslint/no-unnecessary-type-constraint": "error", "@typescript-eslint/no-unnecessary-type-conversion": "error", "@typescript-eslint/no-unsafe-call": "error", "@typescript-eslint/no-unsafe-declaration-merging": "error", "@typescript-eslint/no-unsafe-enum-comparison": "error", "@typescript-eslint/no-unsafe-function-type": "error", "@typescript-eslint/no-unsafe-return": "error", // This rule is not very perfect. See https://github.com/typescript-eslint/typescript-eslint/issues/10439 "@typescript-eslint/no-unsafe-unary-minus": "error", "@typescript-eslint/no-wrapper-object-types": "error", "@typescript-eslint/non-nullable-type-assertion-style": "error", "@typescript-eslint/only-throw-error": [ "error", { allowThrowingUnknown: false }, ], "@typescript-eslint/prefer-as-const": "error", "@typescript-eslint/prefer-function-type": "error", "@typescript-eslint/prefer-includes": "error", "@typescript-eslint/prefer-literal-enum-member": "error", "@typescript-eslint/prefer-namespace-keyword": "error", "@typescript-eslint/prefer-nullish-coalescing": "error", "@typescript-eslint/prefer-optional-chain": "error", "@typescript-eslint/prefer-readonly": "error", "@typescript-eslint/prefer-regexp-exec": "error", "@typescript-eslint/prefer-return-this-type": "error", "@typescript-eslint/promise-function-async": "error", "@typescript-eslint/restrict-plus-operands": [ "error", { // allowAny: false, allowBoolean: false, allowNullish: false, allowNumberAndString: false, allowRegExp: false, skipCompoundAssignments: false, }, ], "@typescript-eslint/restrict-template-expressions": [ "error", { allow: [], // allowAny: false, allowBoolean: false, allowNever: false, allowNullish: false, // allowNumber: false, allowRegExp: false, }, ], "@typescript-eslint/related-getter-setter-pairs": "error", "@typescript-eslint/return-await": ["error", "always"], "@typescript-eslint/switch-exhaustiveness-check": [ "error", { requireDefaultForNonUnion: true }, ], "@typescript-eslint/unbound-method": "error", "@typescript-eslint/unified-signatures": "error", "@typescript-eslint/use-unknown-in-catch-callback-variable": "error", }, }; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb25maWcvdHMvYmFzZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssYUFBYSxNQUFNLHlCQUF5QixDQUFDO0FBQ3pELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFMUMsTUFBTSxVQUFVLFNBQVM7SUFDdkIsTUFBTSxNQUFNLEdBQUcsU0FBUyxFQUFFLENBQUM7SUFFM0IsTUFBTSxtQkFBbUIsR0FBRyxHQUFHLEVBQUU7UUFDL0IsbUNBQW1DO1FBQ25DLGlEQUFpRDtRQUNqRCxNQUFNLGdCQUFnQixHQUFHO1lBQ3ZCLHdCQUF3QixFQUFFLDJDQUEyQztZQUNyRSxtQkFBbUIsRUFBRSxzQ0FBc0M7WUFDM0Qsb0JBQW9CLEVBQUUsdUNBQXVDO1lBQzdELGNBQWMsRUFBRSxpQ0FBaUM7WUFDakQsbUJBQW1CLEVBQUUsc0NBQXNDO1lBQzNELFlBQVksRUFBRSwrQkFBK0I7WUFDN0Msc0JBQXNCLEVBQUUseUNBQXlDO1lBQ2pFLHVCQUF1QixFQUFFLDBDQUEwQztZQUNuRSxtQkFBbUIsRUFBRSxzQ0FBc0M7WUFDM0QsaUJBQWlCLEVBQUUsb0NBQW9DO1lBQ3ZELGlCQUFpQixFQUFFLG9DQUFvQztZQUN2RCxjQUFjLEVBQUUsaUNBQWlDO1lBQ2pELHNHQUFzRztZQUN0RyxrQkFBa0IsRUFBRSxxQ0FBcUM7WUFDekQsY0FBYyxFQUFFLGlDQUFpQztZQUNqRCx1QkFBdUIsRUFBRSwwQ0FBMEM7WUFDbkUsV0FBVyxFQUFFLDhCQUE4QjtZQUMzQyx1QkFBdUIsRUFBRSwwQ0FBMEM7WUFDbkUsZ0JBQWdCLEVBQUUsbUNBQW1DO1lBQ3JELHNCQUFzQixFQUFFLHlDQUF5QztZQUNqRSx3QkFBd0IsRUFBRSwyQ0FBMkM7WUFDckUsa0JBQWtCLEVBQUUscUNBQXFDO1lBQ3pELHNCQUFzQixFQUFFLHlDQUF5QztZQUNqRSw4QkFBOEIsRUFD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RSxLQUFLO2lCQUMvQjthQUNGO1lBQ0Qsa0RBQWtELEVBQUU7Z0JBQ2xELE9BQU87Z0JBQ1A7b0JBQ0UsS0FBSyxFQUFFLEVBQUU7b0JBQ1QsbUJBQW1CO29CQUNuQixZQUFZLEVBQUUsS0FBSztvQkFDbkIsVUFBVSxFQUFFLEtBQUs7b0JBQ2pCLFlBQVksRUFBRSxLQUFLO29CQUNuQixzQkFBc0I7b0JBQ3RCLFdBQVcsRUFBRSxLQUFLO2lCQUNuQjthQUNGO1lBQ0QsZ0RBQWdELEVBQUUsT0FBTztZQUN6RCxpQ0FBaUMsRUFBRSxDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUM7WUFDdEQsZ0RBQWdELEVBQUU7Z0JBQ2hELE9BQU87Z0JBQ1AsRUFBRSx5QkFBeUIsRUFBRSxJQUFJLEVBQUU7YUFDcEM7WUFDRCxtQ0FBbUMsRUFBRSxPQUFPO1lBQzVDLHVDQUF1QyxFQUFFLE9BQU87WUFDaEQsMkRBQTJELEVBQUUsT0FBTztTQUNyRTtLQUNPLENBQUM7QUFDYixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgZmVuZ2VUc1BsdWdpbiBmcm9tIFwiQGZlbmdlL2VzbGludC1wbHVnaW4tdHNcIjtcbmltcG9ydCB7IGdldEpzQmFzZSB9IGZyb20gXCIuLi9qcy9iYXNlLnRzXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRUc0Jhc2UoKSB7XG4gIGNvbnN0IGpzQmFzZSA9IGdldEpzQmFzZSgpO1xuXG4gIGNvbnN0IGdldFRzRXh0ZW5zaW9uUnVsZXMgPSAoKSA9PiB7XG4gICAgLy8gS2V5IGlzIGpzIHJ1bGUsIHZhbHVlIGlzIHRzIHJ1bGVcbiAgICAvLyBodHRwczovL3R5cGVzY3JpcHQtZXNsaW50LmlvL3J1bGVzLz89ZXh0ZW5zaW9uXG4gICAgY29uc3QgZXh0ZW5zaW9uUnVsZU1hcCA9IHtcbiAgICAgIFwiY2xhc3MtbWV0aG9kcy11c2UtdGhpc1wiOiBcIkB0eXBlc2NyaXB0LWVzbGludC9jbGFzcy1tZXRob2RzLXVzZS10aGlzXCIsXG4gICAgICBcImNvbnNpc3RlbnQtcmV0dXJuXCI6IFwiQHR5cGVzY3JpcHQtZXNsaW50L2NvbnNpc3RlbnQtcmV0dXJuXCIsXG4gICAgICBcImRlZmF1bHQtcGFyYW0tbGFzdFwiOiBcIkB0eXBlc2NyaXB0LWVzbGludC9kZWZhdWx0LXBhcmFtLWxhc3RcIixcbiAgICAgIFwiZG90LW5vdGF0aW9uXCI6IFwiQHR5cGVzY3JpcHQtZXNsaW50L2RvdC1ub3RhdGlvblwiLFxuICAgICAgXCJpbml0LWRlY2xhcmF0aW9uc1wiOiBcIkB0eXBlc2NyaXB0LWVzbGludC9pbml0LWRlY2xhcmF0aW9uc1wiLFxuICAgICAgXCJtYXgtcGFyYW1zXCI6IFwiQHR5cGVzY3JpcHQtZXNsaW50L21heC1wYXJhbXNcIixcbiAgICAgIFwibm8tYXJyYXktY29uc3RydWN0b3JcIjogXCJAdHlwZXNjcmlwdC1lc2xpbnQvbm8tYXJyYXktY29uc3RydWN0b3JcIixcbiAgICAgIFwibm8tZHVwZS1jbGFzcy1tZW1iZXJzXCI6IFwiQHR5cGVzY3JpcHQtZXNsaW50L25vLWR1cGUtY2xhc3MtbWVtYmVyc1wiLFxuICAgICAgXCJuby1lbXB0eS1mdW5jdGlvblwiOiBcIkB0eXBlc2NyaXB0LWVzbGludC9uby1lbXB0eS1mdW5jdGlvblwiLFxuICAgICAgXCJuby1pbXBsaWVkLWV2YWxcIjogXCJAdHlwZXNjcmlwdC1lc2xpbnQvbm8taW1wbGllZC1ldmFsXCIsXG4gICAgICBcIm5vLWludmFsaWQtdGhpc1wiOiBcIkB0eXBlc2NyaXB0LWVzbGludC9uby1pbnZhbGlkLXRoaXNcIixcbiAgICAgIFwibm8tbG9vcC1mdW5jXCI6IFwiQHR5cGVzY3JpcHQtZXNsaW50L25vLWxvb3AtZnVuY1wiLFxuICAgICAgLy8gXCJuby1sb3NzLW9mLXByZWNpc2lvblwiOiBcIkB0eXBlc2NyaXB0LWVzbGludC9uby1sb3NzLW9mLXByZWNpc2lvblwiLCAvLyBUaGlzIHJ1bGUgaGFzIGJlZW4gZGVwcmVjYXRlZFxuICAgICAgXCJuby1tYWdpYy1udW1iZXJzXCI6IFwiQHR5cGVzY3JpcHQtZXNsaW50L25vLW1hZ2ljLW51bWJlcnNcIixcbiAgICAgIFwibm8tcmVkZWNsYXJlXCI6IFwiQHR5cGVzY3JpcHQtZXNsaW50L25vLXJlZGVjbGFyZVwiLFxuICAgICAgXCJuby1yZXN0cmljdGVkLWltcG9ydHNcIjogXCJAdHlwZXNjcmlwdC1lc2xpbnQvbm8tcmVzdHJpY3RlZC1pbXBvcnRzXCIsXG4gICAgICBcIm5vLXNoYWRvd1wiOiBcIkB0eXBlc2NyaXB0LWVzbGludC9uby1zaGFkb3dcIixcbiAgICAgIFwibm8tdW51c2VkLWV4cHJlc3Npb25zXCI6IFwiQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC1leHByZXNzaW9uc1wiLFxuICAgICAgXCJuby11bnVzZWQtdmFyc1wiOiBcIkB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1wiLFxuICAgICAgXCJuby11c2UtYmVmb3JlLWRlZmluZVwiOiBcIkB0eXBlc2NyaXB0LWVzbGludC9uby11c2UtYmVmb3JlLWRlZmluZVwiLFxuICAgICAgXCJuby11c2VsZXNzLWNvbnN0cnVjdG9yXCI6IFwiQHR5cGVzY3JpcHQtZXNsaW50L25vLXVzZWxlc3MtY29uc3RydWN0b3JcIixcbiAgICAgIFwibm8tdGhyb3ctbGl0ZXJhbFwiOiBcIkB0eXBlc2NyaXB0LWVzbGludC9vbmx5LXRocm93LWVycm9yXCIsXG4gICAgICBcInByZWZlci1kZXN0cnVjdHVyaW5nXCI6IFwiQHR5cGVzY3JpcHQtZXNsaW50L3ByZWZlci1kZXN0cnVjdHVyaW5nXCIsXG4gICAgICBcInByZWZlci1wcm9taXNlLXJlamVjdC1lcnJvcnNcIjpcbiAgICAgICAgXCJAdHlwZXNjcmlwdC1lc2xpbnQvcHJlZmVyLXByb21pc2UtcmVqZWN0LWVycm9yc1wiLFxuICAgICAgXCJyZXF1aXJlLWF3YWl0XCI6IFwiQHR5cGVzY3JpcHQtZXNsaW50L3JlcXVpcmUtYXdhaXRcIixcbiAgICAgIFwibm8tcmV0dXJuLWF3YWl0XCI6IFwiQHR5cGVzY3JpcHQtZXNsaW50L3JldHVybi1hd2FpdFwiLCAvLyBuby1yZXR1cm4tYXdhaXQgaGFzIGJlZW4gZGVwcmVjYXRlZFxuICAgIH0gYXMgY29uc3Q7XG5cbiAgICB0eXBlIEpzMlRzUnVsZU1hcCA9IHR5cGVvZiBleHRlbnNpb25SdWxlTWFwO1xuICAgIHR5cGUgVHMySnNSdWxlTWFwID0ge1xuICAgICAgW0sgaW4ga2V5b2YgSnMyVHNSdWxlTWFwIGFzIEpzMlRzUnVsZU1hcFtLXV06IEs7IC8vIHJldmVyc2VcbiAgICB9O1xuXG4gICAgdHlwZSBKc0V4dGVuc2lvbktleSA9IEV4dHJhY3Q8XG4gICAgICBrZXlvZiBKczJUc1J1bGVNYXAsXG4gICAgICBrZXlvZiB0eXBlb2YganNCYXNlLnJ1bGVzXG4gICAgPjsgLy8gRXh0cmFjdFxuICAgIHR5cGUgVHNFeHRlbnNpb25LZXkgPSBKczJUc1J1bGVNYXBbSnNFeHRlbnNpb25LZXldO1xuXG4gICAgdHlwZSBKc1Jlc3VsdCA9IFJlY29yZDxKc0V4dGVuc2lvbktleSwgXCJvZmZcIj47XG4gICAgdHlwZSBUc1Jlc3VsdCA9IHtcbiAgICAgIFtLZXkgaW4gVHNFeHRlbnNpb25LZXldOiAodHlwZW9mIGpzQmFzZS5ydWxlcylbVHMySnNSdWxlTWFwW0tleV1dO1xuICAgIH07XG4gICAgdHlwZSBSZXN1bHQgPSBKc1Jlc3VsdCAmIFRzUmVzdWx0O1xuXG4gICAgY29uc3QgaXNJbkV4dGVuc2lvblJ1bGVNYXAgPSAoXG4gICAgICBrZXk6IHN0cmluZyxcbiAgICApOiBrZXkgaXMga2V5b2YgdHlwZW9mIGV4dGVuc2lvblJ1bGVNYXAgPT4ga2V5IGluIGV4dGVuc2lvblJ1bGVNYXA7XG4gICAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKGpzQmFzZS5ydWxlcykucmVkdWNlKFxuICAgICAgKHJlc3VsdCwgW2pzUnVsZUtleSwganNSdWxlVmFsdWVdKSA9PlxuICAgICAgICBpc0luRXh0ZW5zaW9uUnVsZU1hcChqc1J1bGVLZXkpXG4gICAgICAgICAgPyB7XG4gICAgICAgICAgICAgIC4uLnJlc3VsdCxcbiAgICAgICAgICAgICAgW2pzUnVsZUtleV06IFwib2ZmXCIsXG4gICAgICAgICAgICAgIFtleHRlbnNpb25SdWxlTWFwW2pzUnVsZUtleV1dOiBqc1J1bGVWYWx1ZSxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICA6IHJlc3VsdCxcbiAgICAgIHt9IGFzIFJlc3VsdCxcbiAgICApO1xuICB9O1xuXG4gIHJldHVybiB7XG4gICAgLi4uanNCYXNlLFxuICAgIG5hbWU6IFwiZmVuZ2UvdHlwZXNjcmlwdFwiLFxuICAgIGZpbGVzOiBbXCIqKi8qLnt0cyxjdHMsbXRzLHRzeH1cIl0sXG4gICAgbGFuZ3VhZ2VPcHRpb25zOiB7XG4gICAgICAuLi5qc0Jhc2UubGFuZ3VhZ2VPcHRpb25zLFxuICAgICAgcGFyc2VyT3B0aW9uczoge1xuICAgICAgICAuLi5qc0Jhc2UubGFuZ3VhZ2VPcHRpb25zLnBhcnNlck9wdGlvbnMsXG4gICAgICAgIC8vIFNldHRpbmcgYHByb2plY3RTZXJ2aWNlOiB0cnVlYCBvciBgcHJvamVjdDogdHJ1ZWAgaXMgcHJldHR5IHNsb3cgd2hlbiBsaW50IGEgbW9ub3JlcG8gd2l0aCBtYW55IHRzY29uZmlnLmpzb24gZmlsZXMgaW4gZWFjaCBzdWItYXBwLlxuICAgICAgICAvLyBCdXQgc2V0dGluZyBgcHJvamVjdDogXCJ0c2NvbmZpZy5qc29uXCJgIHdpbGwgY2F1c2UgcGFyc2VyIGVycm9yIHdoZW4gdGhlIHByb2plY3Qgcm9vdCB0c2NvbmZpZy5qc29uIGlzIGB7IGV4dGVuZHM6IFwiZmVuZ2UvdHNjb25maWdcIiB9YFxuICAgICAgICBwcm9qZWN0U2VydmljZTogdHJ1ZSxcbiAgICAgIH0sXG4gICAgICBnbG9iYWxzOiB7XG4gICAgICAgIC4uLmpzQmFzZS5sYW5ndWFnZU9wdGlvbnMuZ2xvYmFscyxcbiAgICAgICAgTm9kZUpTOiBmYWxzZSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBwbHVnaW5zOiB7XG4gICAgICAuLi5qc0Jhc2UucGx1Z2lucyxcbiAgICAgIFwiQGZlbmdlLXRzXCI6IGZlbmdlVHNQbHVnaW4sXG4gICAgfSxcbiAgICBydWxlczoge1xuICAgICAgLi4uanNCYXNlLnJ1bGVzLFxuICAgICAgLi4uZ2V0VHNFeHRlbnNpb25SdWxlcygpLFxuXG4gICAgICAvLyBmZW5nZVxuICAgICAgXCJAZmVuZ2UtdHMvZXhhY3QtbWFwLXNldC10eXBlXCI6IFwiZXJyb3JcIixcbiAgICAgIFwiQGZlbmdlLXRzL25vLWNvbnN0LWVudW1cIjogXCJlcnJvclwiLFxuICAgICAgXCJAZmVuZ2UtdHMvbm8tZGVjbGFyZXNcIjogXCJlcnJvclwiLFxuICAgICAgXCJAZmVuZ2UtdHMvbm8tZXhwb3J0LWFzc2lnbm1lbnRcIjogXCJlcnJvclwiLFxuICAgICAgXCJAZmVuZ2UtdHMvbm8tbWlzdXNlLXNwcmVhZGluZy1wYXJhbWV0ZXJcIjogXCJlcnJvclwiLFxuICAgICAgXCJAZmVuZ2UtdHMvbm8tcHJvcGVydHktZGVjb3JhdG9yXCI6IFwiZXJyb3JcIixcbiAgICAgIFwiQGZlbmdlLXRzL25vLXVudHlwZWQtZW1wdHktYXJyYXlcIjogXCJlcnJvclwiLFxuICAgICAgLy8gdHlwZXNjcmlwdFxuICAgICAgXCJAdHlwZXNjcmlwdC1lc2xpbnQvYWRqYWNlbnQtb3ZlcmxvYWQtc2lnbmF0dXJlc1wiOiBcImVycm9yXCIsXG4gICAgICAvLyBcIkB0eXBlc2NyaXB0LWVzbGludC9hcnJheS10eXBlXCI6IFtcImVycm9yXCIsICdhcnJheS1zaW1wbGUnXSwgLy8gVGhlIGRlZmF1bHQgb3B0aW9uIGlzICdhcnJheScuIE5vdCB2ZXJ5IHN1cmUgaWYgd2UgbmVlZCB0byBjaGFuZ2UgdGhlIG9wdGlvbi4gU28gZGlzYWJsZWQgaXQuXG4gICAgICBcIkB0eXBlc2NyaXB0LWVzbGludC9hd2FpdC10aGVuYWJsZVwiOiBcImVycm9yXCIsXG4gICAgICBcIkB0eXBlc2NyaXB0LWVzbGludC9jbGFzcy1saXRlcmFsLXByb3BlcnR5LXN0eWxlXCI6IFwiZXJyb3JcIixcbiAgICAgIFwiQHR5cGVzY3JpcHQtZXNsaW50L2NvbnNpc3RlbnQtZ2VuZXJpYy1jb25zdHJ1Y3RvcnNcIjogXCJlcnJvclwiLFxuICAgICAgXCJAdHlwZXNjcmlwdC1lc2xpbnQvY29uc2lzdGVudC1pbmRleGVkLW9iamVjdC1zdHlsZVwiOiBcImVycm9yXCIsXG4gICAgICBcIkB0eXBlc2NyaXB0LWVzbGludC9jb25zaXN0ZW50LXR5cGUtYXNzZXJ0aW9uc1wiOiBbXG4gICAgICAgIFwiZXJyb3JcIixcbiAgICAgICAge1xuICAgICAgICAgIGFzc2VydGlvblN0eWxlOiBcImFzXCIsXG4gICAgICAgICAgb2JqZWN0TGl0ZXJhbFR5cGVBc3NlcnRpb25zOiBcImFsbG93LWFzLXBhcmFtZXRlclwiLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICAgIFwiQHR5cGVzY3JpcHQtZXNsaW50L2NvbnNpc3RlbnQtdHlwZS1kZWZpbml0aW9uc1wiOiBbXCJlcnJvclwiLCBcImludGVyZmFjZVwiXSwgLy8gVE9ETyBzaG91bGQgd2UgY2hhbmdlIHRvICd0eXBlJz9cbiAgICAgIFwiQHR5cGVzY3JpcHQtZXNsaW50L2NvbnNpc3RlbnQtdHlwZS1leHBvcnRzXCI6IFwiZXJyb3JcIixcbiAgICAgIFwiQHR5cGVzY3JpcHQtZXNsaW50L2NvbnNpc3RlbnQtdHlwZS1pbXBvcnRzXCI6IFwiZXJyb3JcIixcbiAgICAgIFwiQHR5cGVzY3JpcHQtZXNsaW50L2RvdC1ub3RhdGlvblwiOiBbXCJlcnJvclwiLCB7IGFsbG93S2V5d29yZHM6IHRydWUgfV0sXG4gICAgICBcIkB0eXBlc2NyaXB0LWVzbGludC9tZXRob2Qtc2lnbmF0dXJlLXN0eWxlXCI6IFwiZXJyb3JcIixcbiAgICAgIFwiQHR5cGVzY3JpcHQtZXNsaW50L25hbWluZy1jb252ZW50aW9uXCI6IFtcbiAgICAgICAgXCJlcnJvclwiLFxuICAgICAgICB7XG4gICAgICAgICAgc2VsZWN0b3I6IFwiZnVuY3Rpb25cIixcbiAgICAgICAgICBmb3JtYXQ6IFtcImNhbWVsQ2FzZVwiLCBcIlBhc2NhbENhc2VcIl0sXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBzZWxlY3RvcjogXCJ2YXJpYWJsZVwiLFxuICAgICAgICAgIHR5cGVzOiBbXCJmdW5jdGlvblwiXSxcbiAgICAgICAgICBmb3JtYXQ6IFtcImNhbWVsQ2FzZVwiLCBcIlBhc2NhbENhc2VcIl0sIC8vIGRlY29yYXRvcnMgbmVlZCBQYXNjYWxDYXNlXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBzZWxlY3RvcjogXCJjbGFzc1wiLFxuICAgICAgICAgIGZvcm1hdDogW1wiUGFzY2FsQ2FzZVwiXSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHNlbGVjdG9yOiBcImludGVyZmFjZVwiLFxuICAgICAgICAgIGZvcm1hdDogW1wiUGFzY2FsQ2FzZVwiXSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHNlbGVjdG9yOiBcInR5cGVBbGlhc1wiLFxuICAgICAgICAgIGZvcm1hdDogW1wiUGFzY2FsQ2FzZVwiXSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHNlbGVjdG9yOiBcInR5cGVQYXJhbWV0ZXJcIixcbiAgICAgICAgICBmb3JtYXQ6IFtcIlVQUEVSX0NBU0VcIiwgXCJQYXNjYWxDYXNlXCJdLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICAgIFwiQHR5cGVzY3JpcHQtZXNsaW50L25vLWFycmF5LWRlbGV0ZVwiOiBcImVycm9yXCIsXG4gICAgICBcIkB0eXBlc2NyaXB0LWVzbGludC9uby1iYXNlLXRvLXN0cmluZ1wiOiBbXG4gICAgICAgIFwiZXJyb3JcIixcbiAgICAgICAgeyBpZ25vcmVkVHlwZU5hbWVzOiBbXSB9LFxuICAgICAgXSxcbiAgICAgIFwiQHR5cGVzY3JpcHQtZXNsaW50L25vLWNvbmZ1c2luZy1ub24tbnVsbC1hc3NlcnRpb25cIjogXCJlcnJvclwiLFxuICAgICAgXCJAdHlwZXNjcmlwdC1lc2xpbnQvbm8tY29uZnVzaW5nLXZvaWQtZXhwcmVzc2lvblwiOiBbXG4gICAgICAgIFwiZXJyb3JcIixcbiAgICAgICAgeyBpZ25vcmVBcnJvd1Nob3J0aGFuZDogdHJ1ZSB9LFxuICAgICAgXSxcbiAgICAgIFwiQHR5cGVzY3JpcHQtZXNsaW50L25vLWRlcHJlY2F0ZWRcIjogXCJlcnJvclwiLFxuICAgICAgXCJAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZHVwbGljYXRlLWVudW0tdmFsdWVzXCI6IFwiZXJyb3JcIixcbiAgICAgIFwiQHR5cGVzY3JpcHQtZXNsaW50L25vLWR1cGxpY2F0ZS10eXBlLWNvbnN0aXR1ZW50c1wiOiBcImVycm9yXCIsXG4gICAgICBcIkB0eXBlc2NyaXB0LWVzbGludC9uby1lbXB0eS1vYmplY3QtdHlwZVwiOiBcImVycm9yXCIsXG4gICAgICAvLyBcIkB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcIjogXCJ3YXJuXCIsXG4gICAgICBcIkB0eXBlc2NyaXB0LWVzbGludC9uby1leHRyYS1ub24tbnVsbC1hc3NlcnRpb25cIjogXCJlcnJvclwiLFxuICAgICAgLy8gXCJAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXh0cmFuZW91cy1jbGFzc1wiOiBcImVycm9yXCIsIC8vIENsYXNzZXMgaGF2ZSBvbmx5IHN0YXRpYyBtZW1iZXIgaXMgcmVhc29uYWJsZSBzb21ldGltZXMuIE5lc3RqcyBtb2R1bGVzIHVzZSBpdCBhIGxvdC5cbiAgICAgIFwiQHR5cGVzY3JpcHQtZXNsaW50L25vLWZsb2F0aW5nLXByb21pc2VzXCI6IFtcbiAgICAgICAgXCJlcnJvclwiLFxuICAgICAgICB7XG4gICAgICAgICAgaWdub3JlVm9pZDogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgICAgXCJAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZm9yLWluLWFycmF5XCI6IFwiZXJyb3JcIixcbiAgICAgIFwiQHR5cGVzY3JpcHQtZXNsaW50L25vLWltcG9ydC10eXBlLXNpZGUtZWZmZWN0c1wiOiBcImVycm9yXCIsXG4gICAgICBcIkB0eXBlc2NyaXB0LWVzbGludC9uby1pbmZlcnJhYmxlLXR5cGVzXCI6IFwiZXJyb3JcIixcbiAgICAgIFwiQHR5cGVzY3JpcHQtZXNsaW50L25vLWludmFsaWQtdm9pZC10eXBlXCI6IFwiZXJyb3JcIixcbiAgICAgIFwiQHR5cGVzY3JpcHQtZXNsaW50L25vLW1pc3VzZWQtbmV3XCI6IFwiZXJyb3JcIixcbiAgICAgIFwiQHR5cGVzY3JpcHQtZXNsaW50L25vLW1pc3VzZWQtcHJvbWlzZXNcIjogXCJlcnJvclwiLFxuICAgICAgXCJAdHlwZXNjcmlwdC1lc2xpbnQvbm8tbWlzdXNlZC1zcHJlYWRcIjogXCJlcnJvclwiLFxuICAgICAgXCJAdHlwZXNjcmlwdC1lc2xpbnQvbm8tbWl4ZWQtZW51bXNcIjogXCJlcnJvclwiLFxuICAgICAgXCJAdHlwZXNjcmlwdC1lc2xpbnQvbm8tbmFtZXNwYWNlXCI6IFwiZXJyb3JcIiwgLy8gY29uc2lkZXIgdG8gYWRkIG9wdGlvbiBge1wiYWxsb3dEZWZpbml0aW9uRmlsZXNcIjogZmFsc2V9YCB0byBzdHJpY3RseSBmb3JiaWQgYG5hbWVzcGFjZWAga2V5d29yZFxuICAgICAgXCJAdHlwZXNjcmlwdC1lc2xpbnQvbm8tbm9uLW51bGwtYXNzZXJ0ZWQtbnVsbGlzaC1jb2FsZXNjaW5nXCI6IFwiZXJyb3JcIixcbiAgICAgIFwiQHR5cGVzY3JpcHQtZXNsaW50L25vLW5vbi1udWxsLWFzc2VydGVkLW9wdGlvbmFsLWNoYWluXCI6IFwiZXJyb3JcIixcbiAgICAgIFwiQHR5cGVzY3JpcHQtZXNsaW50L25vLW5vbi1udWxsLWFzc2VydGlvblwiOiBcImVycm9yXCIsXG4gICAgICBcIkB0eXBlc2NyaXB0LWVzbGludC9uby1yZWR1bmRhbnQtdHlwZS1jb25zdGl0dWVudHNcIjogXCJlcnJvclwiLFxuICAgICAgXCJAdHlwZXNjcmlwdC1lc2xpbnQvbm8tcmVxdWlyZS1pbXBvcnRzXCI6IFwiZXJyb3JcIixcbiAgICAgIFwiQHR5cGVzY3JpcHQtZXNsaW50L25vLXVubmVjZXNzYXJ5LWJvb2xlYW4tbGl0ZXJhbC1jb21wYXJlXCI6IFwiZXJyb3JcIixcbiAgICAgIFwiQHR5cGVzY3JpcHQtZXNsaW50L25vLXVubmVjZXNzYXJ5LWNvbmRpdGlvblwiOiBcImVycm9yXCIsXG4gICAgICBcIkB0eXBlc2NyaXB0LWVzbGludC9uby11bm5lY2Vzc2FyeS1wYXJhbWV0ZXItcHJvcGVydHktYXNzaWdubWVudFwiOlxuICAgICAgICBcImVycm9yXCIsXG4gICAgICBcIkB0eXBlc2NyaXB0LWVzbGludC9uby11bm5lY2Vzc2FyeS10ZW1wbGF0ZS1leHByZXNzaW9uXCI6IFwiZXJyb3JcIiwgLy8ganMgYWxzbyBuZWVkIHRoaXMgcnVsZVxuICAgICAgXCJAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5uZWNlc3NhcnktdHlwZS1hcmd1bWVudHNcIjogXCJlcnJvclwiLFxuICAgICAgXCJAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5uZWNlc3NhcnktdHlwZS1hc3NlcnRpb25cIjogXCJlcnJvclwiLFxuICAgICAgXCJAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5uZWNlc3NhcnktdHlwZS1jb25zdHJhaW50XCI6IFwiZXJyb3JcIixcbiAgICAgIFwiQHR5cGVzY3JpcHQtZXNsaW50L25vLXVubmVjZXNzYXJ5LXR5cGUtY29udmVyc2lvblwiOiBcImVycm9yXCIsXG4gICAgICBcIkB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtY2FsbFwiOiBcImVycm9yXCIsXG4gICAgICBcIkB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtZGVjbGFyYXRpb24tbWVyZ2luZ1wiOiBcImVycm9yXCIsXG4gICAgICBcIkB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtZW51bS1jb21wYXJpc29uXCI6IFwiZXJyb3JcIixcbiAgICAgIFwiQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1mdW5jdGlvbi10eXBlXCI6IFwiZXJyb3JcIixcbiAgICAgIFwiQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1yZXR1cm5cIjogXCJlcnJvclwiLCAvLyBUaGlzIHJ1bGUgaXMgbm90IHZlcnkgcGVyZmVjdC4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS90eXBlc2NyaXB0LWVzbGludC90eXBlc2NyaXB0LWVzbGludC9pc3N1ZXMvMTA0MzlcbiAgICAgIFwiQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS11bmFyeS1taW51c1wiOiBcImVycm9yXCIsXG4gICAgICBcIkB0eXBlc2NyaXB0LWVzbGludC9uby13cmFwcGVyLW9iamVjdC10eXBlc1wiOiBcImVycm9yXCIsXG4gICAgICBcIkB0eXBlc2NyaXB0LWVzbGludC9ub24tbnVsbGFibGUtdHlwZS1hc3NlcnRpb24tc3R5bGVcIjogXCJlcnJvclwiLFxuICAgICAgXCJAdHlwZXNjcmlwdC1lc2xpbnQvb25seS10aHJvdy1lcnJvclwiOiBbXG4gICAgICAgIFwiZXJyb3JcIixcbiAgICAgICAgeyBhbGxvd1Rocm93aW5nVW5rbm93bjogZmFsc2UgfSxcbiAgICAgIF0sXG4gICAgICBcIkB0eXBlc2NyaXB0LWVzbGludC9wcmVmZXItYXMtY29uc3RcIjogXCJlcnJvclwiLFxuICAgICAgXCJAdHlwZXNjcmlwdC1lc2xpbnQvcHJlZmVyLWZ1bmN0aW9uLXR5cGVcIjogXCJlcnJvclwiLFxuICAgICAgXCJAdHlwZXNjcmlwdC1lc2xpbnQvcHJlZmVyLWluY2x1ZGVzXCI6IFwiZXJyb3JcIixcbiAgICAgIFwiQHR5cGVzY3JpcHQtZXNsaW50L3ByZWZlci1saXRlcmFsLWVudW0tbWVtYmVyXCI6IFwiZXJyb3JcIixcbiAgICAgIFwiQHR5cGVzY3JpcHQtZXNsaW50L3ByZWZlci1uYW1lc3BhY2Uta2V5d29yZFwiOiBcImVycm9yXCIsXG4gICAgICBcIkB0eXBlc2NyaXB0LWVzbGludC9wcmVmZXItbnVsbGlzaC1jb2FsZXNjaW5nXCI6IFwiZXJyb3JcIixcbiAgICAgIFwiQHR5cGVzY3JpcHQtZXNsaW50L3ByZWZlci1vcHRpb25hbC1jaGFpblwiOiBcImVycm9yXCIsXG4gICAgICBcIkB0eXBlc2NyaXB0LWVzbGludC9wcmVmZXItcmVhZG9ubHlcIjogXCJlcnJvclwiLFxuICAgICAgXCJAdHlwZXNjcmlwdC1lc2xpbnQvcHJlZmVyLXJlZ2V4cC1leGVjXCI6IFwiZXJyb3JcIixcbiAgICAgIFwiQHR5cGVzY3JpcHQtZXNsaW50L3ByZWZlci1yZXR1cm4tdGhpcy10eXBlXCI6IFwiZXJyb3JcIixcbiAgICAgIFwiQHR5cGVzY3JpcHQtZXNsaW50L3Byb21pc2UtZnVuY3Rpb24tYXN5bmNcIjogXCJlcnJvclwiLFxuICAgICAgXCJAdHlwZXNjcmlwdC1lc2xpbnQvcmVzdHJpY3QtcGx1cy1vcGVyYW5kc1wiOiBbXG4gICAgICAgIFwiZXJyb3JcIixcbiAgICAgICAge1xuICAgICAgICAgIC8vIGFsbG93QW55OiBmYWxzZSxcbiAgICAgICAgICBhbGxvd0Jvb2xlYW46IGZhbHNlLFxuICAgICAgICAgIGFsbG93TnVsbGlzaDogZmFsc2UsXG4gICAgICAgICAgYWxsb3dOdW1iZXJBbmRTdHJpbmc6IGZhbHNlLFxuICAgICAgICAgIGFsbG93UmVnRXhwOiBmYWxzZSxcbiAgICAgICAgICBza2lwQ29tcG91bmRBc3NpZ25tZW50czogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgICAgXCJAdHlwZXNjcmlwdC1lc2xpbnQvcmVzdHJpY3QtdGVtcGxhdGUtZXhwcmVzc2lvbnNcIjogW1xuICAgICAgICBcImVycm9yXCIsXG4gICAgICAgIHtcbiAgICAgICAgICBhbGxvdzogW10sXG4gICAgICAgICAgLy8gYWxsb3dBbnk6IGZhbHNlLFxuICAgICAgICAgIGFsbG93Qm9vbGVhbjogZmFsc2UsXG4gICAgICAgICAgYWxsb3dOZXZlcjogZmFsc2UsXG4gICAgICAgICAgYWxsb3dOdWxsaXNoOiBmYWxzZSxcbiAgICAgICAgICAvLyBhbGxvd051bWJlcjogZmFsc2UsXG4gICAgICAgICAgYWxsb3dSZWdFeHA6IGZhbHNlLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICAgIFwiQHR5cGVzY3JpcHQtZXNsaW50L3JlbGF0ZWQtZ2V0dGVyLXNldHRlci1wYWlyc1wiOiBcImVycm9yXCIsXG4gICAgICBcIkB0eXBlc2NyaXB0LWVzbGludC9yZXR1cm4tYXdhaXRcIjogW1wiZXJyb3JcIiwgXCJhbHdheXNcIl0sXG4gICAgICBcIkB0eXBlc2NyaXB0LWVzbGludC9zd2l0Y2gtZXhoYXVzdGl2ZW5lc3MtY2hlY2tcIjogW1xuICAgICAgICBcImVycm9yXCIsXG4gICAgICAgIHsgcmVxdWlyZURlZmF1bHRGb3JOb25VbmlvbjogdHJ1ZSB9LFxuICAgICAgXSxcbiAgICAgIFwiQHR5cGVzY3JpcHQtZXNsaW50L3VuYm91bmQtbWV0aG9kXCI6IFwiZXJyb3JcIixcbiAgICAgIFwiQHR5cGVzY3JpcHQtZXNsaW50L3VuaWZpZWQtc2lnbmF0dXJlc1wiOiBcImVycm9yXCIsXG4gICAgICBcIkB0eXBlc2NyaXB0LWVzbGludC91c2UtdW5rbm93bi1pbi1jYXRjaC1jYWxsYmFjay12YXJpYWJsZVwiOiBcImVycm9yXCIsXG4gICAgfSxcbiAgfSBhcyBjb25zdDtcbn1cbiJdfQ==