diff --git a/.eslintrc.cjs b/.eslintrc.cjs new file mode 100644 index 00000000..c04b59ea --- /dev/null +++ b/.eslintrc.cjs @@ -0,0 +1,686 @@ +const ISDEPLOYING = false; // Toggle rule changes appropriate to package deployment. +const ALLRULESACTIVE = false; // Toggle (most) inactive rules ON. + +const ISTYPESCRIPT = true; // Toggle TypeScript extensions of base ESLint rules. +const ISFOUNDRY = true; // Replaces General Rules with Foundry-Recommended Rules. +// const ISSTRICTFOUNDRY = false; // Adheres to ALL Foundry rules, including the annoying ones you've manually disabled. +const ISJSDOC = false; // Adds JSDoc Rules governing Documentation +const ISFIXINGCOMMENTS = false; // Include comments in style checking rules. + +const GLOBALCONSTANTS = [ + ["CONFIG", "CONST", "foundry", "game", "canvas", "ui"], + [ + "ActiveEffect", + "Actor", + "ActorSheet", + "Actors", + "Application", + "BladesHelpers", + "ChatMessage", + "Dialog", + "Draggable", + "Folder", + "FormDataExtended", + "Handlebars", + "Hooks", + "Item", + "ItemSheet", + "Items", + "Macro", + "Roll", + "TextureLoader", + "TokenDocument", + "User" + ], + [ + "duplicate", + "fetchWithTimeout", + "loadTemplates", + "getTemplate", + "mergeObject", + "randomID", + "renderTemplate", + "setProperty", + "srcExists", + "isObjectEmpty", + "expandObject", + "flattenObject" + ], + [ + "DEFAULT_TOKEN" + ] +].flat(); + +/* + + If ALLRULESACTIVE = true, any GENERALRULES set to '0' will instead "warn". + To ensure the rule stays off, set it to "off" instead of '0'. + + */ + +const TYPESCRIPTRULES = { + // "@typescript-eslint" + + /* BASE: Rules that do not require changes to base ESLint rules. */ + base: { + "array-type": ["warn", { default: "array-simple" }], + // "await-thenable": "error", // @@ REQUIRES CONFIGURED TYPE INFORMATION @@ + "ban-ts-comment": 0, + "no-empty-interface": 0, + // "no-explicit-any": "warn", + "no-namespace": "off", + "no-non-null-assertion": "warn", + "no-shadow": "warn", + "no-dupe-class-members": "error", + "no-this-alias": [ + "warn", + { + allowDestructuring: true, + allowedNames: ["self"] + } + ], + // "no-unnecessary-type-assertion": "warn", // @@ REQUIRES CONFIGURED TYPE INFORMATION @@ + "no-unnecessary-type-constraint": "warn", + "no-unsafe-declaration-merging": "warn" + // "prefer-readonly": "error", // @@ REQUIRES CONFIGURED TYPE INFORMATION @@ + }, + + /* EXTENSIONS: Rules that extend base ESLint rules. + - When active, the ESLint-equivalent rule will be disabled. + - All values must be of type = [tsValue: any, esLintOffValue?: any = "off"] */ + extensions: { + "default-param-last": ["error"] + // "no-unused-vars": "off" + // "no-unused-vars": [ + // ["warn", { argsIgnorePattern: "^_", varsIgnorePattern: "^_$" }], + // ], + // "require-await": ["warn"], // @@ REQUIRES CONFIGURED TYPE INFORMATION @@ + }, + + plugins: { + "etc/no-assign-mutated-array": "off", + "etc/no-deprecated": "off", + "etc/no-implicit-any-catch": "off", + etc: { + // eslint-plugin-etc + "no-assign-mutated-array": "off", + "no-commented-out-code": "error", + "no-const-enum": "warn", + "no-implicit-any-catch": ["error", { allowExplicitAny: false }], + "no-misused-generics": "error", + "prefer-interface": [ + "error", + { + allowIntersection: true, + allowLocal: true + } + ], + "prefer-less-than": "warn", + "underscore-internal": "warn", + "throw-error": "warn" + } + } +}; +const GENERALRULES = { + "accessor-pairs": ["warn"], + "array-callback-return": "warn", + "array-element-newline": ["warn", "consistent"], + "block-scoped-var": "warn", + "brace-style": [ + "warn", + "1tbs", + { + allowSingleLine: true + } + ], + "capitalized-comments": "off", + "class-methods-use-this": 0, + "comma-dangle": ["warn", "never"], + "consistent-return": [ + "warn", + { + treatUndefinedAsUnspecified: false + } + ], + curly: "warn", + "default-case": "warn", + "default-param-last": "off", + "dot-notation": ["warn"], + "eol-last": 0, + eqeqeq: ["warn", "always"], + "func-names": 0, // ["error", "as-needed"], + "function-call-argument-newline": ["warn", "consistent"], + "function-paren-newline": "warn", + // "indent": ["warn", 2, { + // ArrayExpression: "first", + // CallExpression: { + // arguments: "first" + // }, + // FunctionDeclaration: { + // parameters: "first", + // body: 1 + // }, + // FunctionExpression: { + // parameters: "first", + // body: 1 + // }, + // ImportDeclaration: "first", + // MemberExpression: 1, + // ObjectExpression: "first", + // SwitchCase: 1, + // VariableDeclarator: "first", + // flatTernaryExpressions: true, + // ignoreComments: !ISFIXINGCOMMENTS, + // offsetTernaryExpressions: true, + // outerIIFEBody: 1 + // }], + "line-comment-position": "off", + "linebreak-style": ["warn", "windows"], + "lines-between-class-members": 0, + "max-classes-per-file": 0, + "max-len": "off", + "max-lines-per-function": "off", + "max-params": "off", + "max-statements": "off", + "multiline-comment-style": 0, + "multiline-ternary": ["warn", "always-multiline"], + "new-cap": [ + "error", + { + capIsNewExceptionPattern: "[A-Z]+" + } + ], + "no-bitwise": [ + "error", + { + allow: ["~"] + } + ], + "no-confusing-arrow": [ + "warn", + { + allowParens: true + } + ], + "no-console": 0, + "no-constant-condition": [ + "warn", + { + checkLoops: false + } + ], + "no-continue": 0, + "no-else-return": 0, + "no-empty-function": 0, + "no-eq-null": "warn", + "no-eval": "warn", + "no-extend-native": 0, + "no-extra-bind": "warn", + "no-extra-parens": [ + "warn", + "all", + { + // Automatically disabled for TypeScript to allow "as" type assertions. + conditionalAssign: false, + returnAssign: false, + enforceForArrowConditionals: false, + nestedBinaryExpressions: false + } + ], + "no-floating-decimal": "warn", + "no-implicit-coercion": "warn", + "no-implicit-globals": "warn", + "no-implied-eval": "warn", + "no-inline-comments": "off", + "no-invalid-this": 0, + "no-iterator": "warn", + "no-labels": "warn", + "no-lone-blocks": "warn", + "no-lonely-if": 0, + "no-loop-func": 0, + "no-magic-numbers": "off", // ["error", {ignore: [-1, 0, 0.5, 1, 2]}], + "no-mixed-operators": "warn", + "no-mixed-spaces-and-tabs": ["warn", "smart-tabs"], + "no-multi-spaces": [ + "warn", + { + ignoreEOLComments: true + } + ], + "no-multi-str": "warn", + "no-multiple-empty-lines": "warn", + "no-new": 0, + "no-param-reassign": 0, + "no-plusplus": 0, + "no-restricted-globals": 0, + "no-restricted-syntax": 0, + "no-return-assign": ["error", "except-parens"], + "no-return-await": 0, // Debugging is easier with this disabled, but comes with a performance hit. + "no-tabs": 0, /* ["warn", { allowIndentationTabs: true + }], */ + "no-template-curly-in-string": "warn", + "no-ternary": "off", + "no-trailing-spaces": "warn", + "no-underscore-dangle": 0, + "no-unreachable": 0, + "no-unused-vars": "off", + "@typescript-eslint/no-unused-vars": "off", + "no-use-before-define": 0, + "no-useless-computed-key": 0, + "no-useless-constructor": 0, + "no-useless-escape": "warn", + "no-void": 0, + "nonblock-statement-body-position": ["warn", "below"], + "object-curly-newline": 0, + "object-curly-spacing": ["warn", "never"], + "one-var": 0, /* ["warn", { "var": "always", + "let": "consecutive", + "const": "never" + }], */ + "one-var-declaration-per-line": 0, + "operator-linebreak": ["warn", "before"], + "padded-blocks": "off", + "prefer-arrow-callback": 0, // "warn", + "prefer-const": [ + "warn", + { + destructuring: "all" + } + ], + "prefer-destructuring": 0, // "warn", + "prefer-object-spread": "warn", + "prefer-rest-params": "error", + "quote-props": [ + "warn", + "consistent-as-needed", + { + keywords: true + } + ], + quotes: [ + "warn", + "double", + { + avoidEscape: true, + allowTemplateLiterals: false + } + ], + radix: 0, + "require-await": "off", + semi: [ + "warn", + "always", + { + omitLastInOneLineBlock: true + } + ], + "sort-keys": "off", /* ["warn", "asc", { caseSensitive: true, + natural: true, + minKeys: 20 + }], */ + "space-before-function-paren": [ + "warn", + { + anonymous: "never", + named: "never", + asyncArrow: "always" + } + ], + "spaced-comment": [ + "warn", + "always", + { + line: { + exceptions: ["*", "~", "DEVCODE", "!DEVCODE", "/ )'-style notation. + Object.assign( + RulesAssembly, + {"@typescript-eslint": TYPESCRIPTRULES.base} + ); + Object.entries(TYPESCRIPTRULES.extensions) + .forEach(([ruleName, [ruleVal, esLintOffVal]]) => { + RulesAssembly["@typescript-eslint"][ruleName] = ruleVal; + RulesAssembly[ruleName] = esLintOffVal ?? "off"; + }); +} +if (ISJSDOC) { + Object.assign( + RulesAssembly, + JSDOCRULES + ); +} +const allRules = {}; +Object.keys(RulesAssembly).forEach((rule) => { + if (RulesAssembly[rule] === 0) { + allRules[rule] = "warn"; + } +}); +const RULES = Object.assign( + RulesAssembly, + ALLRULESACTIVE ? allRules : {}, + ISDEPLOYING ? DEPLOYMENTRULES : {} +); +Object.entries(RULES).forEach(([key, val]) => { + if (val && !Array.isArray(val) && typeof val === "object") { + Object.entries(val).forEach(([subKey, subVal]) => (RULES[`${key}/${subKey}`] = subVal)); + delete RULES[key]; + } +}); + +// Create a separate RULES object for JavaScript files +const JSRULES = {...RULES}; +for (const rule in JSRULES) { + if (rule.startsWith("@typescript-eslint")) { + delete JSRULES[rule]; // remove TypeScript rules + } +} + +const EXPORTS = { + root: true, + env: { + browser: true, + es2022: true, + node: true, + jquery: true + }, + plugins: ["import", "@typescript-eslint", "jsdoc", "etc"], + extends: [ + ALLRULESACTIVE ? "eslint:all" : "eslint:recommended", + "plugin:import/recommended", + "plugin:@typescript-eslint/eslint-recommended", + "plugin:@typescript-eslint/recommended", + "plugin:etc/recommended" + ], + parser: "@typescript-eslint/parser", + parserOptions: { + requireConfigFile: false, + ecmaVersion: 2022, + sourceType: "module", + allowImportExportEverywhere: false, + codeFrame: false, + createDefaultProgram: true, + ecmaFeatures: { + ts: true, + jsx: false, + impliedStrict: true + } + }, + reportUnusedDisableDirectives: true, + rules: { + ...RULES, + "etc/no-assign-mutated-array": "off", + "etc/no-deprecated": "off", + "etc/no-implicit-any-catch": "off", + "etc/no-internal": "off" + }, + globals: /* ISTYPESCRIPT ? {} : */ Object.fromEntries( + GLOBALCONSTANTS.map((constant) => [constant, "readonly"]) + ), + overrides: [ + { + files: [".eslintrc.js", "*.js"], + plugins: ["import"], + extends: [], + parser: "espree", // use the default parser for JavaScript files + parserOptions: { + project: undefined + }, + rules: { + ...JSRULES, + "@typescript-eslint/*": "off" + } + } + ], + settings: { + "import/resolver": { + node: { + paths: ["./ts"], // replace this with the actual path to your TypeScript files + extensions: [".ts", ".tsx", ".d.ts"] // specify TypeScript extensions + }, + typescript: { + // Always try to resolve types under `@types` directory even it doesn't contain any source code, like `@types/unist` + alwaysTryTypes: true, + + // Path to a TypeScript configuration file + // Specify the path to your project's tsconfig.json + project: "./tsconfig.json" + } + } + } +}; + +// console.clear(); +// console.log(JSON.stringify(EXPORTS, null, 2)); + +module.exports = EXPORTS; diff --git a/.stylelintrc.js b/.stylelintrc.js new file mode 100644 index 00000000..af97a96d --- /dev/null +++ b/.stylelintrc.js @@ -0,0 +1,16 @@ +module.exports = { + extends: [ + 'stylelint-config-standard', + 'stylelint-config-recess-order', + 'stylelint-config-prettier', + ], + rules: { + 'unit-whitelist': ['em', 'rem', '%', 's', 'px', 'deg'], + 'block-no-empty': true, + 'at-rule-no-unknown': null, + }, + overrides: [{ + files: ["**/*.scss"], + customSyntax: "postcss-scss" + }] +} diff --git a/dist/assets/README.md b/dist/assets/README.md deleted file mode 100644 index 5f0a901a..00000000 --- a/dist/assets/README.md +++ /dev/null @@ -1,59 +0,0 @@ - - -# assets - - - - - -- [**animations**](animations) - - [**chat**](animations/chat) -- [**audio**](audio) -- [**backgrounds**](backgrounds) -- [**chat**](chat) -- [**clocks**](clocks) -- [**dev**](dev) -- [**dice**](dice) - - [**bump-maps**](dice/bump-maps) - - [**emission-maps**](dice/emission-maps) - - [**faces**](dice/faces) - - [**image**](dice/image) -- [**fonts**](fonts) - - [**Beaufort**](fonts/Beaufort) - - [**HistoricalFellType**](fonts/HistoricalFellType) - - [**HistoricalFellTypeSC**](fonts/HistoricalFellTypeSC) - - [**IMFELLDoublePica**](fonts/IMFELLDoublePica) - - [**IMFELLDoublePicaSC**](fonts/IMFELLDoublePicaSC) - - [**Kirsty**](fonts/Kirsty) - - [**MinionPro**](fonts/MinionPro) - - [**MinionProCapt**](fonts/MinionProCapt) - - [**MinionProCond**](fonts/MinionProCond) - - [**MinionProCondCapt**](fonts/MinionProCondCapt) - - [**Pragmata**](fonts/Pragmata) - - [**PWSignaturetwo**](fonts/PWSignaturetwo) - - [**Ravenscroft**](fonts/Ravenscroft) - - [**Spiegel**](fonts/Spiegel) - - [**UglyQua**](fonts/UglyQua) -- [**icons**](icons) - - [**ability-icons**](icons/ability-icons) - - [**class-icons**](icons/class-icons) - - [**cohort-gang-type-icons**](icons/cohort-gang-type-icons) - - [**consequence-icons**](icons/consequence-icons) - - [**crew-ability-icons**](icons/crew-ability-icons) - - [**crew-icons**](icons/crew-icons) - - [**crew-upgrade-icons**](icons/crew-upgrade-icons) - - [**dotline-icons**](icons/dotline-icons) - - [**teeth**](icons/dotline-icons/teeth) - - [**effect-icons**](icons/effect-icons) - - [**faction-icons**](icons/faction-icons) - - [**citizenry**](icons/faction-icons/citizenry) - - [**institutions**](icons/faction-icons/institutions) - - [**labor-and-trade**](icons/faction-icons/labor-and-trade) - - [**the-fringe**](icons/faction-icons/the-fringe) - - [**underworld**](icons/faction-icons/underworld) - - [**item-icons**](icons/item-icons) - - [**misc-icons**](icons/misc-icons) - - [**vice-icons**](icons/vice-icons) -- [**npcs**](npcs) -- [**pdfs**](pdfs) - - [**playbooks**](pdfs/playbooks) diff --git a/dist/assets/animations/chat/energy-beam.webp b/dist/assets/animations/chat/energy-beam.webp deleted file mode 100644 index f2e131cc..00000000 Binary files a/dist/assets/animations/chat/energy-beam.webp and /dev/null differ diff --git a/dist/assets/animations/chat/fail-bg.webp b/dist/assets/animations/chat/fail-bg.webp deleted file mode 100644 index 7a48fb7f..00000000 Binary files a/dist/assets/animations/chat/fail-bg.webp and /dev/null differ diff --git a/dist/assets/animations/chat/lightning-ray.webp b/dist/assets/animations/chat/lightning-ray.webp deleted file mode 100644 index a672de25..00000000 Binary files a/dist/assets/animations/chat/lightning-ray.webp and /dev/null differ diff --git a/dist/assets/animations/chat/roll-position-controlled.webp b/dist/assets/animations/chat/roll-position-controlled.webp deleted file mode 100644 index d2b417e7..00000000 Binary files a/dist/assets/animations/chat/roll-position-controlled.webp and /dev/null differ diff --git a/dist/assets/animations/chat/roll-position-desperate.webp b/dist/assets/animations/chat/roll-position-desperate.webp deleted file mode 100644 index d2b417e7..00000000 Binary files a/dist/assets/animations/chat/roll-position-desperate.webp and /dev/null differ diff --git a/dist/assets/animations/chat/roll-position-risky.webp b/dist/assets/animations/chat/roll-position-risky.webp deleted file mode 100644 index d2b417e7..00000000 Binary files a/dist/assets/animations/chat/roll-position-risky.webp and /dev/null differ diff --git a/dist/assets/animations/clock-flare-blue.webp b/dist/assets/animations/clock-flare-blue.webp deleted file mode 100644 index 9a09b493..00000000 Binary files a/dist/assets/animations/clock-flare-blue.webp and /dev/null differ diff --git a/dist/assets/animations/clock-flare-cyan.webp b/dist/assets/animations/clock-flare-cyan.webp deleted file mode 100644 index 9a09b493..00000000 Binary files a/dist/assets/animations/clock-flare-cyan.webp and /dev/null differ diff --git a/dist/assets/animations/clock-flare-red.webp b/dist/assets/animations/clock-flare-red.webp deleted file mode 100644 index c9ad9718..00000000 Binary files a/dist/assets/animations/clock-flare-red.webp and /dev/null differ diff --git a/dist/assets/animations/clock-flare-white.webp b/dist/assets/animations/clock-flare-white.webp deleted file mode 100644 index 9a09b493..00000000 Binary files a/dist/assets/animations/clock-flare-white.webp and /dev/null differ diff --git a/dist/assets/animations/clock-flare-yellow.webp b/dist/assets/animations/clock-flare-yellow.webp deleted file mode 100644 index c9ad9718..00000000 Binary files a/dist/assets/animations/clock-flare-yellow.webp and /dev/null differ diff --git a/dist/assets/audio/bells.mp3 b/dist/assets/audio/bells.mp3 deleted file mode 100644 index 3a1a552c..00000000 Binary files a/dist/assets/audio/bells.mp3 and /dev/null differ diff --git a/dist/assets/backgrounds/CrowsFoot.webp b/dist/assets/backgrounds/CrowsFoot.webp deleted file mode 100644 index 4f88aad3..00000000 Binary files a/dist/assets/backgrounds/CrowsFoot.webp and /dev/null differ diff --git a/dist/assets/backgrounds/Doskvol.webp b/dist/assets/backgrounds/Doskvol.webp deleted file mode 100644 index a5bba940..00000000 Binary files a/dist/assets/backgrounds/Doskvol.webp and /dev/null differ diff --git a/dist/assets/chat/1-fg.webp b/dist/assets/chat/1-fg.webp deleted file mode 100644 index 638adcce..00000000 Binary files a/dist/assets/chat/1-fg.webp and /dev/null differ diff --git a/dist/assets/chat/2-fg.webp b/dist/assets/chat/2-fg.webp deleted file mode 100644 index 57b67813..00000000 Binary files a/dist/assets/chat/2-fg.webp and /dev/null differ diff --git a/dist/assets/chat/3-fg.webp b/dist/assets/chat/3-fg.webp deleted file mode 100644 index 53ce9a83..00000000 Binary files a/dist/assets/chat/3-fg.webp and /dev/null differ diff --git a/dist/assets/chat/4-fg.webp b/dist/assets/chat/4-fg.webp deleted file mode 100644 index 133fe87d..00000000 Binary files a/dist/assets/chat/4-fg.webp and /dev/null differ diff --git a/dist/assets/chat/5-fg.webp b/dist/assets/chat/5-fg.webp deleted file mode 100644 index f087398b..00000000 Binary files a/dist/assets/chat/5-fg.webp and /dev/null differ diff --git a/dist/assets/chat/6-fg.webp b/dist/assets/chat/6-fg.webp deleted file mode 100644 index cedb80ed..00000000 Binary files a/dist/assets/chat/6-fg.webp and /dev/null differ diff --git a/dist/assets/chat/csq-strip-long.png b/dist/assets/chat/csq-strip-long.png deleted file mode 100644 index 8fd0b405..00000000 Binary files a/dist/assets/chat/csq-strip-long.png and /dev/null differ diff --git a/dist/assets/chat/csq-strip.png b/dist/assets/chat/csq-strip.png deleted file mode 100644 index ac929137..00000000 Binary files a/dist/assets/chat/csq-strip.png and /dev/null differ diff --git a/dist/assets/clocks/clock-10-frame.webp b/dist/assets/clocks/clock-10-frame.webp deleted file mode 100644 index 25262d94..00000000 Binary files a/dist/assets/clocks/clock-10-frame.webp and /dev/null differ diff --git a/dist/assets/clocks/clock-12-frame.webp b/dist/assets/clocks/clock-12-frame.webp deleted file mode 100644 index d3c2d7fd..00000000 Binary files a/dist/assets/clocks/clock-12-frame.webp and /dev/null differ diff --git a/dist/assets/clocks/clock-2-frame.webp b/dist/assets/clocks/clock-2-frame.webp deleted file mode 100644 index 9557a821..00000000 Binary files a/dist/assets/clocks/clock-2-frame.webp and /dev/null differ diff --git a/dist/assets/clocks/clock-3-frame.webp b/dist/assets/clocks/clock-3-frame.webp deleted file mode 100644 index dc605f33..00000000 Binary files a/dist/assets/clocks/clock-3-frame.webp and /dev/null differ diff --git a/dist/assets/clocks/clock-4-frame.webp b/dist/assets/clocks/clock-4-frame.webp deleted file mode 100644 index d76aa419..00000000 Binary files a/dist/assets/clocks/clock-4-frame.webp and /dev/null differ diff --git a/dist/assets/clocks/clock-5-frame.webp b/dist/assets/clocks/clock-5-frame.webp deleted file mode 100644 index 648a239f..00000000 Binary files a/dist/assets/clocks/clock-5-frame.webp and /dev/null differ diff --git a/dist/assets/clocks/clock-6-frame.webp b/dist/assets/clocks/clock-6-frame.webp deleted file mode 100644 index a33ded8b..00000000 Binary files a/dist/assets/clocks/clock-6-frame.webp and /dev/null differ diff --git a/dist/assets/clocks/clock-8-frame.webp b/dist/assets/clocks/clock-8-frame.webp deleted file mode 100644 index 71721c5e..00000000 Binary files a/dist/assets/clocks/clock-8-frame.webp and /dev/null differ diff --git a/dist/assets/clocks/clock-bg.webp b/dist/assets/clocks/clock-bg.webp deleted file mode 100644 index 20bfef2b..00000000 Binary files a/dist/assets/clocks/clock-bg.webp and /dev/null differ diff --git a/dist/assets/clocks/clock-fill-blue.webp b/dist/assets/clocks/clock-fill-blue.webp deleted file mode 100644 index ce33cf27..00000000 Binary files a/dist/assets/clocks/clock-fill-blue.webp and /dev/null differ diff --git a/dist/assets/clocks/clock-fill-cyan.webp b/dist/assets/clocks/clock-fill-cyan.webp deleted file mode 100644 index ce33cf27..00000000 Binary files a/dist/assets/clocks/clock-fill-cyan.webp and /dev/null differ diff --git a/dist/assets/clocks/clock-fill-red.webp b/dist/assets/clocks/clock-fill-red.webp deleted file mode 100644 index d81b6168..00000000 Binary files a/dist/assets/clocks/clock-fill-red.webp and /dev/null differ diff --git a/dist/assets/clocks/clock-fill-white.webp b/dist/assets/clocks/clock-fill-white.webp deleted file mode 100644 index 4dc93dfb..00000000 Binary files a/dist/assets/clocks/clock-fill-white.webp and /dev/null differ diff --git a/dist/assets/clocks/clock-fill-yellow.webp b/dist/assets/clocks/clock-fill-yellow.webp deleted file mode 100644 index 53e95801..00000000 Binary files a/dist/assets/clocks/clock-fill-yellow.webp and /dev/null differ diff --git a/dist/assets/debug-false-canvas.webp b/dist/assets/debug-false-canvas.webp deleted file mode 100644 index 7ce23b0b..00000000 Binary files a/dist/assets/debug-false-canvas.webp and /dev/null differ diff --git a/dist/assets/dev/[Dev] Crew.png b/dist/assets/dev/[Dev] Crew.png deleted file mode 100644 index 9f5a2b37..00000000 Binary files a/dist/assets/dev/[Dev] Crew.png and /dev/null differ diff --git a/dist/assets/dev/[Dev] Cutter.jpg b/dist/assets/dev/[Dev] Cutter.jpg deleted file mode 100644 index e9b9501e..00000000 Binary files a/dist/assets/dev/[Dev] Cutter.jpg and /dev/null differ diff --git a/dist/assets/dev/[Dev] Hound.jpg b/dist/assets/dev/[Dev] Hound.jpg deleted file mode 100644 index c24cb85d..00000000 Binary files a/dist/assets/dev/[Dev] Hound.jpg and /dev/null differ diff --git a/dist/assets/dev/[Dev] Leech.jpg b/dist/assets/dev/[Dev] Leech.jpg deleted file mode 100644 index d24e658d..00000000 Binary files a/dist/assets/dev/[Dev] Leech.jpg and /dev/null differ diff --git a/dist/assets/dev/[Dev] Lurk.jpg b/dist/assets/dev/[Dev] Lurk.jpg deleted file mode 100644 index 86c98ab4..00000000 Binary files a/dist/assets/dev/[Dev] Lurk.jpg and /dev/null differ diff --git a/dist/assets/dev/[Dev] Slide.jpg b/dist/assets/dev/[Dev] Slide.jpg deleted file mode 100644 index 6ec24f86..00000000 Binary files a/dist/assets/dev/[Dev] Slide.jpg and /dev/null differ diff --git a/dist/assets/dev/[Dev] Spider.jpg b/dist/assets/dev/[Dev] Spider.jpg deleted file mode 100644 index 4f40f9af..00000000 Binary files a/dist/assets/dev/[Dev] Spider.jpg and /dev/null differ diff --git a/dist/assets/dev/[Dev] Whisper.jpg b/dist/assets/dev/[Dev] Whisper.jpg deleted file mode 100644 index 5fc72703..00000000 Binary files a/dist/assets/dev/[Dev] Whisper.jpg and /dev/null differ diff --git a/dist/assets/dice/bump-maps/1.webp b/dist/assets/dice/bump-maps/1.webp deleted file mode 100644 index f1cd2bb7..00000000 Binary files a/dist/assets/dice/bump-maps/1.webp and /dev/null differ diff --git a/dist/assets/dice/bump-maps/2.webp b/dist/assets/dice/bump-maps/2.webp deleted file mode 100644 index ab344b31..00000000 Binary files a/dist/assets/dice/bump-maps/2.webp and /dev/null differ diff --git a/dist/assets/dice/bump-maps/3.webp b/dist/assets/dice/bump-maps/3.webp deleted file mode 100644 index 0592f701..00000000 Binary files a/dist/assets/dice/bump-maps/3.webp and /dev/null differ diff --git a/dist/assets/dice/bump-maps/4.webp b/dist/assets/dice/bump-maps/4.webp deleted file mode 100644 index 6f966e5d..00000000 Binary files a/dist/assets/dice/bump-maps/4.webp and /dev/null differ diff --git a/dist/assets/dice/bump-maps/5.webp b/dist/assets/dice/bump-maps/5.webp deleted file mode 100644 index 27732c56..00000000 Binary files a/dist/assets/dice/bump-maps/5.webp and /dev/null differ diff --git a/dist/assets/dice/bump-maps/6.webp b/dist/assets/dice/bump-maps/6.webp deleted file mode 100644 index ea222ded..00000000 Binary files a/dist/assets/dice/bump-maps/6.webp and /dev/null differ diff --git a/dist/assets/dice/emission-maps/6.webp b/dist/assets/dice/emission-maps/6.webp deleted file mode 100644 index ed84788f..00000000 Binary files a/dist/assets/dice/emission-maps/6.webp and /dev/null differ diff --git a/dist/assets/dice/faces/1.webp b/dist/assets/dice/faces/1.webp deleted file mode 100644 index 1f3b85be..00000000 Binary files a/dist/assets/dice/faces/1.webp and /dev/null differ diff --git a/dist/assets/dice/faces/2.webp b/dist/assets/dice/faces/2.webp deleted file mode 100644 index b206c723..00000000 Binary files a/dist/assets/dice/faces/2.webp and /dev/null differ diff --git a/dist/assets/dice/faces/3.webp b/dist/assets/dice/faces/3.webp deleted file mode 100644 index 5016f2b8..00000000 Binary files a/dist/assets/dice/faces/3.webp and /dev/null differ diff --git a/dist/assets/dice/faces/4.webp b/dist/assets/dice/faces/4.webp deleted file mode 100644 index c88515d3..00000000 Binary files a/dist/assets/dice/faces/4.webp and /dev/null differ diff --git a/dist/assets/dice/faces/5.webp b/dist/assets/dice/faces/5.webp deleted file mode 100644 index 99e21483..00000000 Binary files a/dist/assets/dice/faces/5.webp and /dev/null differ diff --git a/dist/assets/dice/faces/6.webp b/dist/assets/dice/faces/6.webp deleted file mode 100644 index 163f2544..00000000 Binary files a/dist/assets/dice/faces/6.webp and /dev/null differ diff --git a/dist/assets/dice/image/1.webp b/dist/assets/dice/image/1.webp deleted file mode 100644 index 7cac6498..00000000 Binary files a/dist/assets/dice/image/1.webp and /dev/null differ diff --git a/dist/assets/dice/image/2.webp b/dist/assets/dice/image/2.webp deleted file mode 100644 index 28108406..00000000 Binary files a/dist/assets/dice/image/2.webp and /dev/null differ diff --git a/dist/assets/dice/image/3.webp b/dist/assets/dice/image/3.webp deleted file mode 100644 index cae5a7c3..00000000 Binary files a/dist/assets/dice/image/3.webp and /dev/null differ diff --git a/dist/assets/dice/image/4.webp b/dist/assets/dice/image/4.webp deleted file mode 100644 index b689cbd2..00000000 Binary files a/dist/assets/dice/image/4.webp and /dev/null differ diff --git a/dist/assets/dice/image/5.webp b/dist/assets/dice/image/5.webp deleted file mode 100644 index e6043fcf..00000000 Binary files a/dist/assets/dice/image/5.webp and /dev/null differ diff --git a/dist/assets/dice/image/6-crit.webp b/dist/assets/dice/image/6-crit.webp deleted file mode 100644 index f00f54a3..00000000 Binary files a/dist/assets/dice/image/6-crit.webp and /dev/null differ diff --git a/dist/assets/dice/image/6.webp b/dist/assets/dice/image/6.webp deleted file mode 100644 index 88264398..00000000 Binary files a/dist/assets/dice/image/6.webp and /dev/null differ diff --git a/dist/assets/dice/image/ghost-1.webp b/dist/assets/dice/image/ghost-1.webp deleted file mode 100644 index d5b88468..00000000 Binary files a/dist/assets/dice/image/ghost-1.webp and /dev/null differ diff --git a/dist/assets/dice/image/ghost-2.webp b/dist/assets/dice/image/ghost-2.webp deleted file mode 100644 index 1c4ba8f6..00000000 Binary files a/dist/assets/dice/image/ghost-2.webp and /dev/null differ diff --git a/dist/assets/dice/image/ghost-3.webp b/dist/assets/dice/image/ghost-3.webp deleted file mode 100644 index f5c14950..00000000 Binary files a/dist/assets/dice/image/ghost-3.webp and /dev/null differ diff --git a/dist/assets/dice/image/ghost-4.webp b/dist/assets/dice/image/ghost-4.webp deleted file mode 100644 index 6789e92d..00000000 Binary files a/dist/assets/dice/image/ghost-4.webp and /dev/null differ diff --git a/dist/assets/dice/image/ghost-5.webp b/dist/assets/dice/image/ghost-5.webp deleted file mode 100644 index 144b5e84..00000000 Binary files a/dist/assets/dice/image/ghost-5.webp and /dev/null differ diff --git a/dist/assets/dice/image/ghost-6.webp b/dist/assets/dice/image/ghost-6.webp deleted file mode 100644 index c3c151b2..00000000 Binary files a/dist/assets/dice/image/ghost-6.webp and /dev/null differ diff --git a/dist/assets/dice/image/grad-1.webp b/dist/assets/dice/image/grad-1.webp deleted file mode 100644 index ae122615..00000000 Binary files a/dist/assets/dice/image/grad-1.webp and /dev/null differ diff --git a/dist/assets/dice/image/grad-2.webp b/dist/assets/dice/image/grad-2.webp deleted file mode 100644 index c743b40e..00000000 Binary files a/dist/assets/dice/image/grad-2.webp and /dev/null differ diff --git a/dist/assets/dice/image/grad-3.webp b/dist/assets/dice/image/grad-3.webp deleted file mode 100644 index 32a132d3..00000000 Binary files a/dist/assets/dice/image/grad-3.webp and /dev/null differ diff --git a/dist/assets/dice/image/grad-4.webp b/dist/assets/dice/image/grad-4.webp deleted file mode 100644 index ab763735..00000000 Binary files a/dist/assets/dice/image/grad-4.webp and /dev/null differ diff --git a/dist/assets/dice/image/grad-5.webp b/dist/assets/dice/image/grad-5.webp deleted file mode 100644 index c3328cbe..00000000 Binary files a/dist/assets/dice/image/grad-5.webp and /dev/null differ diff --git a/dist/assets/dice/image/grad-6-crit.webp b/dist/assets/dice/image/grad-6-crit.webp deleted file mode 100644 index 792e595d..00000000 Binary files a/dist/assets/dice/image/grad-6-crit.webp and /dev/null differ diff --git a/dist/assets/dice/image/grad-6.webp b/dist/assets/dice/image/grad-6.webp deleted file mode 100644 index 88264398..00000000 Binary files a/dist/assets/dice/image/grad-6.webp and /dev/null differ diff --git a/dist/assets/fonts/Beaufort/Beaufort B.otf b/dist/assets/fonts/Beaufort/Beaufort B.otf deleted file mode 100644 index fc65f62d..00000000 Binary files a/dist/assets/fonts/Beaufort/Beaufort B.otf and /dev/null differ diff --git a/dist/assets/fonts/Beaufort/Beaufort Bi.otf b/dist/assets/fonts/Beaufort/Beaufort Bi.otf deleted file mode 100644 index 4780d4eb..00000000 Binary files a/dist/assets/fonts/Beaufort/Beaufort Bi.otf and /dev/null differ diff --git a/dist/assets/fonts/Beaufort/Beaufort L.otf b/dist/assets/fonts/Beaufort/Beaufort L.otf deleted file mode 100644 index 93abecaf..00000000 Binary files a/dist/assets/fonts/Beaufort/Beaufort L.otf and /dev/null differ diff --git a/dist/assets/fonts/Beaufort/Beaufort Li.otf b/dist/assets/fonts/Beaufort/Beaufort Li.otf deleted file mode 100644 index 1096cf3b..00000000 Binary files a/dist/assets/fonts/Beaufort/Beaufort Li.otf and /dev/null differ diff --git a/dist/assets/fonts/Beaufort/Beaufort M.otf b/dist/assets/fonts/Beaufort/Beaufort M.otf deleted file mode 100644 index 200fd9dc..00000000 Binary files a/dist/assets/fonts/Beaufort/Beaufort M.otf and /dev/null differ diff --git a/dist/assets/fonts/Beaufort/Beaufort Mi.otf b/dist/assets/fonts/Beaufort/Beaufort Mi.otf deleted file mode 100644 index 751b397f..00000000 Binary files a/dist/assets/fonts/Beaufort/Beaufort Mi.otf and /dev/null differ diff --git a/dist/assets/fonts/Beaufort/Beaufort S.otf b/dist/assets/fonts/Beaufort/Beaufort S.otf deleted file mode 100644 index b478440b..00000000 Binary files a/dist/assets/fonts/Beaufort/Beaufort S.otf and /dev/null differ diff --git a/dist/assets/fonts/Beaufort/Beaufort Si.otf b/dist/assets/fonts/Beaufort/Beaufort Si.otf deleted file mode 100644 index 3243f06c..00000000 Binary files a/dist/assets/fonts/Beaufort/Beaufort Si.otf and /dev/null differ diff --git a/dist/assets/fonts/Beaufort/Beaufort i.otf b/dist/assets/fonts/Beaufort/Beaufort i.otf deleted file mode 100644 index 73257c4c..00000000 Binary files a/dist/assets/fonts/Beaufort/Beaufort i.otf and /dev/null differ diff --git a/dist/assets/fonts/Beaufort/Beaufort.otf b/dist/assets/fonts/Beaufort/Beaufort.otf deleted file mode 100644 index fdba0e21..00000000 Binary files a/dist/assets/fonts/Beaufort/Beaufort.otf and /dev/null differ diff --git a/dist/assets/fonts/FjallaOne.ttf b/dist/assets/fonts/FjallaOne.ttf deleted file mode 100644 index 482cba06..00000000 Binary files a/dist/assets/fonts/FjallaOne.ttf and /dev/null differ diff --git a/dist/assets/fonts/HistoricalFellType/HistoricalFellType i.otf b/dist/assets/fonts/HistoricalFellType/HistoricalFellType i.otf deleted file mode 100644 index 46b2ae0d..00000000 Binary files a/dist/assets/fonts/HistoricalFellType/HistoricalFellType i.otf and /dev/null differ diff --git a/dist/assets/fonts/HistoricalFellType/HistoricalFellType.otf b/dist/assets/fonts/HistoricalFellType/HistoricalFellType.otf deleted file mode 100644 index d50c7de4..00000000 Binary files a/dist/assets/fonts/HistoricalFellType/HistoricalFellType.otf and /dev/null differ diff --git a/dist/assets/fonts/HistoricalFellTypeSC/HistoricalFellTypeSC.otf b/dist/assets/fonts/HistoricalFellTypeSC/HistoricalFellTypeSC.otf deleted file mode 100644 index 3ba1b607..00000000 Binary files a/dist/assets/fonts/HistoricalFellTypeSC/HistoricalFellTypeSC.otf and /dev/null differ diff --git a/dist/assets/fonts/IMFELLDoublePica/IMFELLDoublePica i.otf b/dist/assets/fonts/IMFELLDoublePica/IMFELLDoublePica i.otf deleted file mode 100644 index d216b549..00000000 Binary files a/dist/assets/fonts/IMFELLDoublePica/IMFELLDoublePica i.otf and /dev/null differ diff --git a/dist/assets/fonts/IMFELLDoublePica/IMFELLDoublePica.otf b/dist/assets/fonts/IMFELLDoublePica/IMFELLDoublePica.otf deleted file mode 100644 index d0bc1b88..00000000 Binary files a/dist/assets/fonts/IMFELLDoublePica/IMFELLDoublePica.otf and /dev/null differ diff --git a/dist/assets/fonts/IMFELLDoublePicaSC/IMFELLDoublePicaSC.ttf b/dist/assets/fonts/IMFELLDoublePicaSC/IMFELLDoublePicaSC.ttf deleted file mode 100644 index 30025bed..00000000 Binary files a/dist/assets/fonts/IMFELLDoublePicaSC/IMFELLDoublePicaSC.ttf and /dev/null differ diff --git a/dist/assets/fonts/Kirsty/Kirsty B.otf b/dist/assets/fonts/Kirsty/Kirsty B.otf deleted file mode 100644 index ce4eeda5..00000000 Binary files a/dist/assets/fonts/Kirsty/Kirsty B.otf and /dev/null differ diff --git a/dist/assets/fonts/Kirsty/Kirsty Bi.otf b/dist/assets/fonts/Kirsty/Kirsty Bi.otf deleted file mode 100644 index a7420337..00000000 Binary files a/dist/assets/fonts/Kirsty/Kirsty Bi.otf and /dev/null differ diff --git a/dist/assets/fonts/Kirsty/Kirsty i.otf b/dist/assets/fonts/Kirsty/Kirsty i.otf deleted file mode 100644 index ddc46bc0..00000000 Binary files a/dist/assets/fonts/Kirsty/Kirsty i.otf and /dev/null differ diff --git a/dist/assets/fonts/Kirsty/Kirsty.otf b/dist/assets/fonts/Kirsty/Kirsty.otf deleted file mode 100644 index a0a644be..00000000 Binary files a/dist/assets/fonts/Kirsty/Kirsty.otf and /dev/null differ diff --git a/dist/assets/fonts/MinionPro/MinionPro B.otf b/dist/assets/fonts/MinionPro/MinionPro B.otf deleted file mode 100644 index 242161f2..00000000 Binary files a/dist/assets/fonts/MinionPro/MinionPro B.otf and /dev/null differ diff --git a/dist/assets/fonts/MinionPro/MinionPro Bi.otf b/dist/assets/fonts/MinionPro/MinionPro Bi.otf deleted file mode 100644 index b2e9d035..00000000 Binary files a/dist/assets/fonts/MinionPro/MinionPro Bi.otf and /dev/null differ diff --git a/dist/assets/fonts/MinionPro/MinionPro M.otf b/dist/assets/fonts/MinionPro/MinionPro M.otf deleted file mode 100644 index 76a2c181..00000000 Binary files a/dist/assets/fonts/MinionPro/MinionPro M.otf and /dev/null differ diff --git a/dist/assets/fonts/MinionPro/MinionPro Mi.otf b/dist/assets/fonts/MinionPro/MinionPro Mi.otf deleted file mode 100644 index 3b460f4f..00000000 Binary files a/dist/assets/fonts/MinionPro/MinionPro Mi.otf and /dev/null differ diff --git a/dist/assets/fonts/MinionPro/MinionPro S.otf b/dist/assets/fonts/MinionPro/MinionPro S.otf deleted file mode 100644 index 22525aef..00000000 Binary files a/dist/assets/fonts/MinionPro/MinionPro S.otf and /dev/null differ diff --git a/dist/assets/fonts/MinionPro/MinionPro Si.otf b/dist/assets/fonts/MinionPro/MinionPro Si.otf deleted file mode 100644 index 4ef71672..00000000 Binary files a/dist/assets/fonts/MinionPro/MinionPro Si.otf and /dev/null differ diff --git a/dist/assets/fonts/MinionPro/MinionPro i.otf b/dist/assets/fonts/MinionPro/MinionPro i.otf deleted file mode 100644 index 313a469c..00000000 Binary files a/dist/assets/fonts/MinionPro/MinionPro i.otf and /dev/null differ diff --git a/dist/assets/fonts/MinionPro/MinionPro.otf b/dist/assets/fonts/MinionPro/MinionPro.otf deleted file mode 100644 index fd6f7947..00000000 Binary files a/dist/assets/fonts/MinionPro/MinionPro.otf and /dev/null differ diff --git a/dist/assets/fonts/MinionProCapt/MinionProCapt B.otf b/dist/assets/fonts/MinionProCapt/MinionProCapt B.otf deleted file mode 100644 index 8573e8ed..00000000 Binary files a/dist/assets/fonts/MinionProCapt/MinionProCapt B.otf and /dev/null differ diff --git a/dist/assets/fonts/MinionProCapt/MinionProCapt Bi.otf b/dist/assets/fonts/MinionProCapt/MinionProCapt Bi.otf deleted file mode 100644 index 890b35e9..00000000 Binary files a/dist/assets/fonts/MinionProCapt/MinionProCapt Bi.otf and /dev/null differ diff --git a/dist/assets/fonts/MinionProCapt/MinionProCapt M.otf b/dist/assets/fonts/MinionProCapt/MinionProCapt M.otf deleted file mode 100644 index 5f18b6cb..00000000 Binary files a/dist/assets/fonts/MinionProCapt/MinionProCapt M.otf and /dev/null differ diff --git a/dist/assets/fonts/MinionProCapt/MinionProCapt Mi.otf b/dist/assets/fonts/MinionProCapt/MinionProCapt Mi.otf deleted file mode 100644 index 8f0b38ec..00000000 Binary files a/dist/assets/fonts/MinionProCapt/MinionProCapt Mi.otf and /dev/null differ diff --git a/dist/assets/fonts/MinionProCapt/MinionProCapt S.otf b/dist/assets/fonts/MinionProCapt/MinionProCapt S.otf deleted file mode 100644 index ea430a78..00000000 Binary files a/dist/assets/fonts/MinionProCapt/MinionProCapt S.otf and /dev/null differ diff --git a/dist/assets/fonts/MinionProCapt/MinionProCapt Si.otf b/dist/assets/fonts/MinionProCapt/MinionProCapt Si.otf deleted file mode 100644 index 8595f7a0..00000000 Binary files a/dist/assets/fonts/MinionProCapt/MinionProCapt Si.otf and /dev/null differ diff --git a/dist/assets/fonts/MinionProCapt/MinionProCapt i.otf b/dist/assets/fonts/MinionProCapt/MinionProCapt i.otf deleted file mode 100644 index 9c23086b..00000000 Binary files a/dist/assets/fonts/MinionProCapt/MinionProCapt i.otf and /dev/null differ diff --git a/dist/assets/fonts/MinionProCapt/MinionProCapt.otf b/dist/assets/fonts/MinionProCapt/MinionProCapt.otf deleted file mode 100644 index 6bb336ff..00000000 Binary files a/dist/assets/fonts/MinionProCapt/MinionProCapt.otf and /dev/null differ diff --git a/dist/assets/fonts/MinionProCond/MinionProCond B.otf b/dist/assets/fonts/MinionProCond/MinionProCond B.otf deleted file mode 100644 index 99cbcf99..00000000 Binary files a/dist/assets/fonts/MinionProCond/MinionProCond B.otf and /dev/null differ diff --git a/dist/assets/fonts/MinionProCond/MinionProCond Bi.otf b/dist/assets/fonts/MinionProCond/MinionProCond Bi.otf deleted file mode 100644 index ed5eff04..00000000 Binary files a/dist/assets/fonts/MinionProCond/MinionProCond Bi.otf and /dev/null differ diff --git a/dist/assets/fonts/MinionProCond/MinionProCond M.otf b/dist/assets/fonts/MinionProCond/MinionProCond M.otf deleted file mode 100644 index b7971434..00000000 Binary files a/dist/assets/fonts/MinionProCond/MinionProCond M.otf and /dev/null differ diff --git a/dist/assets/fonts/MinionProCond/MinionProCond Mi.otf b/dist/assets/fonts/MinionProCond/MinionProCond Mi.otf deleted file mode 100644 index 1fd2d9e5..00000000 Binary files a/dist/assets/fonts/MinionProCond/MinionProCond Mi.otf and /dev/null differ diff --git a/dist/assets/fonts/MinionProCond/MinionProCond S.otf b/dist/assets/fonts/MinionProCond/MinionProCond S.otf deleted file mode 100644 index 8f331e19..00000000 Binary files a/dist/assets/fonts/MinionProCond/MinionProCond S.otf and /dev/null differ diff --git a/dist/assets/fonts/MinionProCond/MinionProCond Si.otf b/dist/assets/fonts/MinionProCond/MinionProCond Si.otf deleted file mode 100644 index 09f0a3ba..00000000 Binary files a/dist/assets/fonts/MinionProCond/MinionProCond Si.otf and /dev/null differ diff --git a/dist/assets/fonts/MinionProCond/MinionProCond i.otf b/dist/assets/fonts/MinionProCond/MinionProCond i.otf deleted file mode 100644 index 8f322611..00000000 Binary files a/dist/assets/fonts/MinionProCond/MinionProCond i.otf and /dev/null differ diff --git a/dist/assets/fonts/MinionProCond/MinionProCond.otf b/dist/assets/fonts/MinionProCond/MinionProCond.otf deleted file mode 100644 index 731349b5..00000000 Binary files a/dist/assets/fonts/MinionProCond/MinionProCond.otf and /dev/null differ diff --git a/dist/assets/fonts/MinionProCondCapt/MinionProCondCapt B.otf b/dist/assets/fonts/MinionProCondCapt/MinionProCondCapt B.otf deleted file mode 100644 index 10f092f7..00000000 Binary files a/dist/assets/fonts/MinionProCondCapt/MinionProCondCapt B.otf and /dev/null differ diff --git a/dist/assets/fonts/MinionProCondCapt/MinionProCondCapt Bi.otf b/dist/assets/fonts/MinionProCondCapt/MinionProCondCapt Bi.otf deleted file mode 100644 index 9cf8ab2b..00000000 Binary files a/dist/assets/fonts/MinionProCondCapt/MinionProCondCapt Bi.otf and /dev/null differ diff --git a/dist/assets/fonts/MinionProCondCapt/MinionProCondCapt M.otf b/dist/assets/fonts/MinionProCondCapt/MinionProCondCapt M.otf deleted file mode 100644 index 4d252a74..00000000 Binary files a/dist/assets/fonts/MinionProCondCapt/MinionProCondCapt M.otf and /dev/null differ diff --git a/dist/assets/fonts/MinionProCondCapt/MinionProCondCapt Mi.otf b/dist/assets/fonts/MinionProCondCapt/MinionProCondCapt Mi.otf deleted file mode 100644 index b6d2e486..00000000 Binary files a/dist/assets/fonts/MinionProCondCapt/MinionProCondCapt Mi.otf and /dev/null differ diff --git a/dist/assets/fonts/MinionProCondCapt/MinionProCondCapt S.otf b/dist/assets/fonts/MinionProCondCapt/MinionProCondCapt S.otf deleted file mode 100644 index 321783f4..00000000 Binary files a/dist/assets/fonts/MinionProCondCapt/MinionProCondCapt S.otf and /dev/null differ diff --git a/dist/assets/fonts/MinionProCondCapt/MinionProCondCapt Si.otf b/dist/assets/fonts/MinionProCondCapt/MinionProCondCapt Si.otf deleted file mode 100644 index b74aef13..00000000 Binary files a/dist/assets/fonts/MinionProCondCapt/MinionProCondCapt Si.otf and /dev/null differ diff --git a/dist/assets/fonts/MinionProCondCapt/MinionProCondCapt i.otf b/dist/assets/fonts/MinionProCondCapt/MinionProCondCapt i.otf deleted file mode 100644 index c378e6cc..00000000 Binary files a/dist/assets/fonts/MinionProCondCapt/MinionProCondCapt i.otf and /dev/null differ diff --git a/dist/assets/fonts/MinionProCondCapt/MinionProCondCapt.otf b/dist/assets/fonts/MinionProCondCapt/MinionProCondCapt.otf deleted file mode 100644 index 391a207a..00000000 Binary files a/dist/assets/fonts/MinionProCondCapt/MinionProCondCapt.otf and /dev/null differ diff --git a/dist/assets/fonts/Oswald.ttf b/dist/assets/fonts/Oswald.ttf deleted file mode 100644 index a3282a3c..00000000 Binary files a/dist/assets/fonts/Oswald.ttf and /dev/null differ diff --git a/dist/assets/fonts/PWSignaturetwo/PWSignaturetwo.ttf b/dist/assets/fonts/PWSignaturetwo/PWSignaturetwo.ttf deleted file mode 100644 index 12fe48f7..00000000 Binary files a/dist/assets/fonts/PWSignaturetwo/PWSignaturetwo.ttf and /dev/null differ diff --git a/dist/assets/fonts/Pragmata/Pragmata B.otf b/dist/assets/fonts/Pragmata/Pragmata B.otf deleted file mode 100644 index 239d31a4..00000000 Binary files a/dist/assets/fonts/Pragmata/Pragmata B.otf and /dev/null differ diff --git a/dist/assets/fonts/Pragmata/Pragmata Bi.otf b/dist/assets/fonts/Pragmata/Pragmata Bi.otf deleted file mode 100644 index 3e539232..00000000 Binary files a/dist/assets/fonts/Pragmata/Pragmata Bi.otf and /dev/null differ diff --git a/dist/assets/fonts/Pragmata/Pragmata i.otf b/dist/assets/fonts/Pragmata/Pragmata i.otf deleted file mode 100644 index 59b07802..00000000 Binary files a/dist/assets/fonts/Pragmata/Pragmata i.otf and /dev/null differ diff --git a/dist/assets/fonts/Pragmata/Pragmata.otf b/dist/assets/fonts/Pragmata/Pragmata.otf deleted file mode 100644 index febedf6e..00000000 Binary files a/dist/assets/fonts/Pragmata/Pragmata.otf and /dev/null differ diff --git a/dist/assets/fonts/Ravenscroft/Ravenscroft.ttf b/dist/assets/fonts/Ravenscroft/Ravenscroft.ttf deleted file mode 100644 index 76cc2052..00000000 Binary files a/dist/assets/fonts/Ravenscroft/Ravenscroft.ttf and /dev/null differ diff --git a/dist/assets/fonts/Spiegel/Spiegel B.otf b/dist/assets/fonts/Spiegel/Spiegel B.otf deleted file mode 100644 index eaac72bf..00000000 Binary files a/dist/assets/fonts/Spiegel/Spiegel B.otf and /dev/null differ diff --git a/dist/assets/fonts/Spiegel/Spiegel Bi.otf b/dist/assets/fonts/Spiegel/Spiegel Bi.otf deleted file mode 100644 index 0e7af576..00000000 Binary files a/dist/assets/fonts/Spiegel/Spiegel Bi.otf and /dev/null differ diff --git a/dist/assets/fonts/Spiegel/Spiegel S.otf b/dist/assets/fonts/Spiegel/Spiegel S.otf deleted file mode 100644 index 082dcb21..00000000 Binary files a/dist/assets/fonts/Spiegel/Spiegel S.otf and /dev/null differ diff --git a/dist/assets/fonts/Spiegel/Spiegel Si.otf b/dist/assets/fonts/Spiegel/Spiegel Si.otf deleted file mode 100644 index 27b652fe..00000000 Binary files a/dist/assets/fonts/Spiegel/Spiegel Si.otf and /dev/null differ diff --git a/dist/assets/fonts/Spiegel/Spiegel i.otf b/dist/assets/fonts/Spiegel/Spiegel i.otf deleted file mode 100644 index 516392a1..00000000 Binary files a/dist/assets/fonts/Spiegel/Spiegel i.otf and /dev/null differ diff --git a/dist/assets/fonts/Spiegel/Spiegel.otf b/dist/assets/fonts/Spiegel/Spiegel.otf deleted file mode 100644 index ef5c2b9b..00000000 Binary files a/dist/assets/fonts/Spiegel/Spiegel.otf and /dev/null differ diff --git a/dist/assets/fonts/UglyQua/UglyQua i.ttf b/dist/assets/fonts/UglyQua/UglyQua i.ttf deleted file mode 100644 index 05a6bfaf..00000000 Binary files a/dist/assets/fonts/UglyQua/UglyQua i.ttf and /dev/null differ diff --git a/dist/assets/fonts/UglyQua/UglyQua.ttf b/dist/assets/fonts/UglyQua/UglyQua.ttf deleted file mode 100644 index b124a3be..00000000 Binary files a/dist/assets/fonts/UglyQua/UglyQua.ttf and /dev/null differ diff --git a/dist/assets/icons/Icon.1_01.png b/dist/assets/icons/Icon.1_01.png deleted file mode 100644 index 88cf686c..00000000 Binary files a/dist/assets/icons/Icon.1_01.png and /dev/null differ diff --git a/dist/assets/icons/Icon.1_02.png b/dist/assets/icons/Icon.1_02.png deleted file mode 100644 index 068d9a57..00000000 Binary files a/dist/assets/icons/Icon.1_02.png and /dev/null differ diff --git a/dist/assets/icons/Icon.1_03.png b/dist/assets/icons/Icon.1_03.png deleted file mode 100644 index fffb4366..00000000 Binary files a/dist/assets/icons/Icon.1_03.png and /dev/null differ diff --git a/dist/assets/icons/Icon.1_04.png b/dist/assets/icons/Icon.1_04.png deleted file mode 100644 index df5296bd..00000000 Binary files a/dist/assets/icons/Icon.1_04.png and /dev/null differ diff --git a/dist/assets/icons/Icon.1_05.png b/dist/assets/icons/Icon.1_05.png deleted file mode 100644 index 80a352ab..00000000 Binary files a/dist/assets/icons/Icon.1_05.png and /dev/null differ diff --git a/dist/assets/icons/Icon.1_06.png b/dist/assets/icons/Icon.1_06.png deleted file mode 100644 index b77b1381..00000000 Binary files a/dist/assets/icons/Icon.1_06.png and /dev/null differ diff --git a/dist/assets/icons/Icon.1_07.png b/dist/assets/icons/Icon.1_07.png deleted file mode 100644 index f9b82d2f..00000000 Binary files a/dist/assets/icons/Icon.1_07.png and /dev/null differ diff --git a/dist/assets/icons/Icon.1_08.png b/dist/assets/icons/Icon.1_08.png deleted file mode 100644 index cda3a8f9..00000000 Binary files a/dist/assets/icons/Icon.1_08.png and /dev/null differ diff --git a/dist/assets/icons/Icon.1_09.png b/dist/assets/icons/Icon.1_09.png deleted file mode 100644 index 33d5c848..00000000 Binary files a/dist/assets/icons/Icon.1_09.png and /dev/null differ diff --git a/dist/assets/icons/Icon.1_10.png b/dist/assets/icons/Icon.1_10.png deleted file mode 100644 index 2d88c166..00000000 Binary files a/dist/assets/icons/Icon.1_10.png and /dev/null differ diff --git a/dist/assets/icons/Icon.1_100.png b/dist/assets/icons/Icon.1_100.png deleted file mode 100644 index ba16bd68..00000000 Binary files a/dist/assets/icons/Icon.1_100.png and /dev/null differ diff --git a/dist/assets/icons/Icon.1_11.png b/dist/assets/icons/Icon.1_11.png deleted file mode 100644 index 613d8c97..00000000 Binary files a/dist/assets/icons/Icon.1_11.png and /dev/null differ diff --git a/dist/assets/icons/Icon.1_12.png b/dist/assets/icons/Icon.1_12.png deleted file mode 100644 index 6f423ae7..00000000 Binary files a/dist/assets/icons/Icon.1_12.png and /dev/null differ diff --git a/dist/assets/icons/Icon.1_13.png b/dist/assets/icons/Icon.1_13.png deleted file mode 100644 index 95b8fc1e..00000000 Binary files a/dist/assets/icons/Icon.1_13.png and /dev/null differ diff --git a/dist/assets/icons/Icon.1_14.png b/dist/assets/icons/Icon.1_14.png deleted file mode 100644 index 37a8ae9b..00000000 Binary files a/dist/assets/icons/Icon.1_14.png and /dev/null differ diff --git a/dist/assets/icons/Icon.1_15.png b/dist/assets/icons/Icon.1_15.png deleted file mode 100644 index 230aa7fb..00000000 Binary files a/dist/assets/icons/Icon.1_15.png and /dev/null differ diff --git a/dist/assets/icons/Icon.1_16.png b/dist/assets/icons/Icon.1_16.png deleted file mode 100644 index b8e15ab0..00000000 Binary files a/dist/assets/icons/Icon.1_16.png and /dev/null differ diff --git a/dist/assets/icons/Icon.1_17.png b/dist/assets/icons/Icon.1_17.png deleted file mode 100644 index 042800fa..00000000 Binary files a/dist/assets/icons/Icon.1_17.png and /dev/null differ diff --git a/dist/assets/icons/Icon.1_18.png b/dist/assets/icons/Icon.1_18.png deleted file mode 100644 index 4fc92783..00000000 Binary files a/dist/assets/icons/Icon.1_18.png and /dev/null differ diff --git a/dist/assets/icons/Icon.1_20.png b/dist/assets/icons/Icon.1_20.png deleted file mode 100644 index 5557c2ef..00000000 Binary files a/dist/assets/icons/Icon.1_20.png and /dev/null differ diff --git a/dist/assets/icons/Icon.1_21.png b/dist/assets/icons/Icon.1_21.png deleted file mode 100644 index d6c4892e..00000000 Binary files a/dist/assets/icons/Icon.1_21.png and /dev/null differ diff --git a/dist/assets/icons/Icon.1_22.png b/dist/assets/icons/Icon.1_22.png deleted file mode 100644 index a39edc40..00000000 Binary files a/dist/assets/icons/Icon.1_22.png and /dev/null differ diff --git a/dist/assets/icons/Icon.1_23.png b/dist/assets/icons/Icon.1_23.png deleted file mode 100644 index ba5f80c2..00000000 Binary files a/dist/assets/icons/Icon.1_23.png and /dev/null differ diff --git a/dist/assets/icons/Icon.1_24.png b/dist/assets/icons/Icon.1_24.png deleted file mode 100644 index 4d974245..00000000 Binary files a/dist/assets/icons/Icon.1_24.png and /dev/null differ diff --git a/dist/assets/icons/Icon.1_25.png b/dist/assets/icons/Icon.1_25.png deleted file mode 100644 index 90a653f6..00000000 Binary files a/dist/assets/icons/Icon.1_25.png and /dev/null differ diff --git a/dist/assets/icons/Icon.1_26.png b/dist/assets/icons/Icon.1_26.png deleted file mode 100644 index b5405859..00000000 Binary files a/dist/assets/icons/Icon.1_26.png and /dev/null differ diff --git a/dist/assets/icons/Icon.1_27.png b/dist/assets/icons/Icon.1_27.png deleted file mode 100644 index 17c21050..00000000 Binary files a/dist/assets/icons/Icon.1_27.png and /dev/null differ diff --git a/dist/assets/icons/Icon.1_28.png b/dist/assets/icons/Icon.1_28.png deleted file mode 100644 index d137e799..00000000 Binary files a/dist/assets/icons/Icon.1_28.png and /dev/null differ diff --git a/dist/assets/icons/Icon.1_29.png b/dist/assets/icons/Icon.1_29.png deleted file mode 100644 index e01ac547..00000000 Binary files a/dist/assets/icons/Icon.1_29.png and /dev/null differ diff --git a/dist/assets/icons/Icon.1_30.png b/dist/assets/icons/Icon.1_30.png deleted file mode 100644 index f86d7388..00000000 Binary files a/dist/assets/icons/Icon.1_30.png and /dev/null differ diff --git a/dist/assets/icons/Icon.1_31.png b/dist/assets/icons/Icon.1_31.png deleted file mode 100644 index e2082ffc..00000000 Binary files a/dist/assets/icons/Icon.1_31.png and /dev/null differ diff --git a/dist/assets/icons/Icon.1_32.png b/dist/assets/icons/Icon.1_32.png deleted file mode 100644 index 03ed61c9..00000000 Binary files a/dist/assets/icons/Icon.1_32.png and /dev/null differ diff --git a/dist/assets/icons/Icon.1_33.png b/dist/assets/icons/Icon.1_33.png deleted file mode 100644 index 482b869f..00000000 Binary files a/dist/assets/icons/Icon.1_33.png and /dev/null differ diff --git a/dist/assets/icons/Icon.1_34.png b/dist/assets/icons/Icon.1_34.png deleted file mode 100644 index f17850d5..00000000 Binary files a/dist/assets/icons/Icon.1_34.png and /dev/null differ diff --git a/dist/assets/icons/Icon.1_35.png b/dist/assets/icons/Icon.1_35.png deleted file mode 100644 index 7ec03f2a..00000000 Binary files a/dist/assets/icons/Icon.1_35.png and /dev/null differ diff --git a/dist/assets/icons/Icon.1_36.png b/dist/assets/icons/Icon.1_36.png deleted file mode 100644 index 25c22f3f..00000000 Binary files a/dist/assets/icons/Icon.1_36.png and /dev/null differ diff --git a/dist/assets/icons/Icon.1_37.png b/dist/assets/icons/Icon.1_37.png deleted file mode 100644 index f8f86085..00000000 Binary files a/dist/assets/icons/Icon.1_37.png and /dev/null differ diff --git a/dist/assets/icons/Icon.1_38.png b/dist/assets/icons/Icon.1_38.png deleted file mode 100644 index a87e0467..00000000 Binary files a/dist/assets/icons/Icon.1_38.png and /dev/null differ diff --git a/dist/assets/icons/Icon.1_39.png b/dist/assets/icons/Icon.1_39.png deleted file mode 100644 index 47e146d5..00000000 Binary files a/dist/assets/icons/Icon.1_39.png and /dev/null differ diff --git a/dist/assets/icons/Icon.1_40.png b/dist/assets/icons/Icon.1_40.png deleted file mode 100644 index e04127e4..00000000 Binary files a/dist/assets/icons/Icon.1_40.png and /dev/null differ diff --git a/dist/assets/icons/Icon.1_41.png b/dist/assets/icons/Icon.1_41.png deleted file mode 100644 index 1c2f0a25..00000000 Binary files a/dist/assets/icons/Icon.1_41.png and /dev/null differ diff --git a/dist/assets/icons/Icon.1_42.png b/dist/assets/icons/Icon.1_42.png deleted file mode 100644 index e9c9ce52..00000000 Binary files a/dist/assets/icons/Icon.1_42.png and /dev/null differ diff --git a/dist/assets/icons/Icon.1_43.png b/dist/assets/icons/Icon.1_43.png deleted file mode 100644 index 9e2664f4..00000000 Binary files a/dist/assets/icons/Icon.1_43.png and /dev/null differ diff --git a/dist/assets/icons/Icon.1_44.png b/dist/assets/icons/Icon.1_44.png deleted file mode 100644 index 5869aaca..00000000 Binary files a/dist/assets/icons/Icon.1_44.png and /dev/null differ diff --git a/dist/assets/icons/Icon.1_45.png b/dist/assets/icons/Icon.1_45.png deleted file mode 100644 index d149c921..00000000 Binary files a/dist/assets/icons/Icon.1_45.png and /dev/null differ diff --git a/dist/assets/icons/Icon.1_46.png b/dist/assets/icons/Icon.1_46.png deleted file mode 100644 index ae48f954..00000000 Binary files a/dist/assets/icons/Icon.1_46.png and /dev/null differ diff --git a/dist/assets/icons/Icon.1_47.png b/dist/assets/icons/Icon.1_47.png deleted file mode 100644 index 24e7edfc..00000000 Binary files a/dist/assets/icons/Icon.1_47.png and /dev/null differ diff --git a/dist/assets/icons/Icon.1_48.png b/dist/assets/icons/Icon.1_48.png deleted file mode 100644 index 7a11d7ab..00000000 Binary files a/dist/assets/icons/Icon.1_48.png and /dev/null differ diff --git a/dist/assets/icons/Icon.1_49.png b/dist/assets/icons/Icon.1_49.png deleted file mode 100644 index 91522dd7..00000000 Binary files a/dist/assets/icons/Icon.1_49.png and /dev/null differ diff --git a/dist/assets/icons/Icon.1_50.png b/dist/assets/icons/Icon.1_50.png deleted file mode 100644 index 71ce5433..00000000 Binary files a/dist/assets/icons/Icon.1_50.png and /dev/null differ diff --git a/dist/assets/icons/Icon.1_51.png b/dist/assets/icons/Icon.1_51.png deleted file mode 100644 index b6f3fdf3..00000000 Binary files a/dist/assets/icons/Icon.1_51.png and /dev/null differ diff --git a/dist/assets/icons/Icon.1_52.png b/dist/assets/icons/Icon.1_52.png deleted file mode 100644 index de215435..00000000 Binary files a/dist/assets/icons/Icon.1_52.png and /dev/null differ diff --git a/dist/assets/icons/Icon.1_53.png b/dist/assets/icons/Icon.1_53.png deleted file mode 100644 index 5bd1fbe8..00000000 Binary files a/dist/assets/icons/Icon.1_53.png and /dev/null differ diff --git a/dist/assets/icons/Icon.1_54.png b/dist/assets/icons/Icon.1_54.png deleted file mode 100644 index 0fa3a95c..00000000 Binary files a/dist/assets/icons/Icon.1_54.png and /dev/null differ diff --git a/dist/assets/icons/Icon.1_55.png b/dist/assets/icons/Icon.1_55.png deleted file mode 100644 index f85c1c36..00000000 Binary files a/dist/assets/icons/Icon.1_55.png and /dev/null differ diff --git a/dist/assets/icons/Icon.1_56.png b/dist/assets/icons/Icon.1_56.png deleted file mode 100644 index 2060af03..00000000 Binary files a/dist/assets/icons/Icon.1_56.png and /dev/null differ diff --git a/dist/assets/icons/Icon.1_57.png b/dist/assets/icons/Icon.1_57.png deleted file mode 100644 index 07326c71..00000000 Binary files a/dist/assets/icons/Icon.1_57.png and /dev/null differ diff --git a/dist/assets/icons/Icon.1_58.png b/dist/assets/icons/Icon.1_58.png deleted file mode 100644 index 768f16c5..00000000 Binary files a/dist/assets/icons/Icon.1_58.png and /dev/null differ diff --git a/dist/assets/icons/Icon.1_59.png b/dist/assets/icons/Icon.1_59.png deleted file mode 100644 index df658a50..00000000 Binary files a/dist/assets/icons/Icon.1_59.png and /dev/null differ diff --git a/dist/assets/icons/Icon.1_60.png b/dist/assets/icons/Icon.1_60.png deleted file mode 100644 index 722be3e5..00000000 Binary files a/dist/assets/icons/Icon.1_60.png and /dev/null differ diff --git a/dist/assets/icons/Icon.1_61.png b/dist/assets/icons/Icon.1_61.png deleted file mode 100644 index 0c31f22f..00000000 Binary files a/dist/assets/icons/Icon.1_61.png and /dev/null differ diff --git a/dist/assets/icons/Icon.1_62.png b/dist/assets/icons/Icon.1_62.png deleted file mode 100644 index 34ed2985..00000000 Binary files a/dist/assets/icons/Icon.1_62.png and /dev/null differ diff --git a/dist/assets/icons/Icon.1_63.png b/dist/assets/icons/Icon.1_63.png deleted file mode 100644 index 4e198623..00000000 Binary files a/dist/assets/icons/Icon.1_63.png and /dev/null differ diff --git a/dist/assets/icons/Icon.1_64.png b/dist/assets/icons/Icon.1_64.png deleted file mode 100644 index dc8afa75..00000000 Binary files a/dist/assets/icons/Icon.1_64.png and /dev/null differ diff --git a/dist/assets/icons/Icon.1_65.png b/dist/assets/icons/Icon.1_65.png deleted file mode 100644 index c3ede525..00000000 Binary files a/dist/assets/icons/Icon.1_65.png and /dev/null differ diff --git a/dist/assets/icons/Icon.1_66.png b/dist/assets/icons/Icon.1_66.png deleted file mode 100644 index 60fdc545..00000000 Binary files a/dist/assets/icons/Icon.1_66.png and /dev/null differ diff --git a/dist/assets/icons/Icon.1_67.png b/dist/assets/icons/Icon.1_67.png deleted file mode 100644 index 8f590957..00000000 Binary files a/dist/assets/icons/Icon.1_67.png and /dev/null differ diff --git a/dist/assets/icons/Icon.1_68.png b/dist/assets/icons/Icon.1_68.png deleted file mode 100644 index 70a59bf7..00000000 Binary files a/dist/assets/icons/Icon.1_68.png and /dev/null differ diff --git a/dist/assets/icons/Icon.1_69.png b/dist/assets/icons/Icon.1_69.png deleted file mode 100644 index bb0f8121..00000000 Binary files a/dist/assets/icons/Icon.1_69.png and /dev/null differ diff --git a/dist/assets/icons/Icon.1_70.png b/dist/assets/icons/Icon.1_70.png deleted file mode 100644 index f3e5d27d..00000000 Binary files a/dist/assets/icons/Icon.1_70.png and /dev/null differ diff --git a/dist/assets/icons/Icon.1_71.png b/dist/assets/icons/Icon.1_71.png deleted file mode 100644 index ea318c5e..00000000 Binary files a/dist/assets/icons/Icon.1_71.png and /dev/null differ diff --git a/dist/assets/icons/Icon.1_72.png b/dist/assets/icons/Icon.1_72.png deleted file mode 100644 index cdfbaf2e..00000000 Binary files a/dist/assets/icons/Icon.1_72.png and /dev/null differ diff --git a/dist/assets/icons/Icon.1_73.png b/dist/assets/icons/Icon.1_73.png deleted file mode 100644 index 92d37e2e..00000000 Binary files a/dist/assets/icons/Icon.1_73.png and /dev/null differ diff --git a/dist/assets/icons/Icon.1_74.png b/dist/assets/icons/Icon.1_74.png deleted file mode 100644 index e4b73cb4..00000000 Binary files a/dist/assets/icons/Icon.1_74.png and /dev/null differ diff --git a/dist/assets/icons/Icon.1_75.png b/dist/assets/icons/Icon.1_75.png deleted file mode 100644 index 187fc0c5..00000000 Binary files a/dist/assets/icons/Icon.1_75.png and /dev/null differ diff --git a/dist/assets/icons/Icon.1_76.png b/dist/assets/icons/Icon.1_76.png deleted file mode 100644 index 670821bb..00000000 Binary files a/dist/assets/icons/Icon.1_76.png and /dev/null differ diff --git a/dist/assets/icons/Icon.1_77.png b/dist/assets/icons/Icon.1_77.png deleted file mode 100644 index c4bb0c5c..00000000 Binary files a/dist/assets/icons/Icon.1_77.png and /dev/null differ diff --git a/dist/assets/icons/Icon.1_78.png b/dist/assets/icons/Icon.1_78.png deleted file mode 100644 index 3b3d946a..00000000 Binary files a/dist/assets/icons/Icon.1_78.png and /dev/null differ diff --git a/dist/assets/icons/Icon.1_79.png b/dist/assets/icons/Icon.1_79.png deleted file mode 100644 index fba513e1..00000000 Binary files a/dist/assets/icons/Icon.1_79.png and /dev/null differ diff --git a/dist/assets/icons/Icon.1_81.png b/dist/assets/icons/Icon.1_81.png deleted file mode 100644 index 7ab66802..00000000 Binary files a/dist/assets/icons/Icon.1_81.png and /dev/null differ diff --git a/dist/assets/icons/Icon.1_82.png b/dist/assets/icons/Icon.1_82.png deleted file mode 100644 index 7348b4be..00000000 Binary files a/dist/assets/icons/Icon.1_82.png and /dev/null differ diff --git a/dist/assets/icons/Icon.1_83.png b/dist/assets/icons/Icon.1_83.png deleted file mode 100644 index a6a54da4..00000000 Binary files a/dist/assets/icons/Icon.1_83.png and /dev/null differ diff --git a/dist/assets/icons/Icon.1_84.png b/dist/assets/icons/Icon.1_84.png deleted file mode 100644 index c324f56b..00000000 Binary files a/dist/assets/icons/Icon.1_84.png and /dev/null differ diff --git a/dist/assets/icons/Icon.1_85.png b/dist/assets/icons/Icon.1_85.png deleted file mode 100644 index a7dd7185..00000000 Binary files a/dist/assets/icons/Icon.1_85.png and /dev/null differ diff --git a/dist/assets/icons/Icon.1_86.png b/dist/assets/icons/Icon.1_86.png deleted file mode 100644 index ca3e0a44..00000000 Binary files a/dist/assets/icons/Icon.1_86.png and /dev/null differ diff --git a/dist/assets/icons/Icon.1_87.png b/dist/assets/icons/Icon.1_87.png deleted file mode 100644 index 84aae7af..00000000 Binary files a/dist/assets/icons/Icon.1_87.png and /dev/null differ diff --git a/dist/assets/icons/Icon.1_88.png b/dist/assets/icons/Icon.1_88.png deleted file mode 100644 index b49e20ed..00000000 Binary files a/dist/assets/icons/Icon.1_88.png and /dev/null differ diff --git a/dist/assets/icons/Icon.1_89.png b/dist/assets/icons/Icon.1_89.png deleted file mode 100644 index 08055839..00000000 Binary files a/dist/assets/icons/Icon.1_89.png and /dev/null differ diff --git a/dist/assets/icons/Icon.1_90.png b/dist/assets/icons/Icon.1_90.png deleted file mode 100644 index 162c1986..00000000 Binary files a/dist/assets/icons/Icon.1_90.png and /dev/null differ diff --git a/dist/assets/icons/Icon.1_91.png b/dist/assets/icons/Icon.1_91.png deleted file mode 100644 index 3bc2c947..00000000 Binary files a/dist/assets/icons/Icon.1_91.png and /dev/null differ diff --git a/dist/assets/icons/Icon.1_92.png b/dist/assets/icons/Icon.1_92.png deleted file mode 100644 index 9c764c33..00000000 Binary files a/dist/assets/icons/Icon.1_92.png and /dev/null differ diff --git a/dist/assets/icons/Icon.1_93.png b/dist/assets/icons/Icon.1_93.png deleted file mode 100644 index 3f1fe84d..00000000 Binary files a/dist/assets/icons/Icon.1_93.png and /dev/null differ diff --git a/dist/assets/icons/Icon.1_94.png b/dist/assets/icons/Icon.1_94.png deleted file mode 100644 index c10b3338..00000000 Binary files a/dist/assets/icons/Icon.1_94.png and /dev/null differ diff --git a/dist/assets/icons/Icon.1_95.png b/dist/assets/icons/Icon.1_95.png deleted file mode 100644 index c9bd2d5c..00000000 Binary files a/dist/assets/icons/Icon.1_95.png and /dev/null differ diff --git a/dist/assets/icons/Icon.1_96.png b/dist/assets/icons/Icon.1_96.png deleted file mode 100644 index fb79d3bf..00000000 Binary files a/dist/assets/icons/Icon.1_96.png and /dev/null differ diff --git a/dist/assets/icons/Icon.1_97.png b/dist/assets/icons/Icon.1_97.png deleted file mode 100644 index 747d14ae..00000000 Binary files a/dist/assets/icons/Icon.1_97.png and /dev/null differ diff --git a/dist/assets/icons/Icon.1_98.png b/dist/assets/icons/Icon.1_98.png deleted file mode 100644 index 88918f9d..00000000 Binary files a/dist/assets/icons/Icon.1_98.png and /dev/null differ diff --git a/dist/assets/icons/Icon.1_99.png b/dist/assets/icons/Icon.1_99.png deleted file mode 100644 index 0a9ffb7b..00000000 Binary files a/dist/assets/icons/Icon.1_99.png and /dev/null differ diff --git a/dist/assets/icons/Icon.2_01.png b/dist/assets/icons/Icon.2_01.png deleted file mode 100644 index 7a6aec6f..00000000 Binary files a/dist/assets/icons/Icon.2_01.png and /dev/null differ diff --git a/dist/assets/icons/Icon.2_02.png b/dist/assets/icons/Icon.2_02.png deleted file mode 100644 index f9dbbc5c..00000000 Binary files a/dist/assets/icons/Icon.2_02.png and /dev/null differ diff --git a/dist/assets/icons/Icon.2_03.png b/dist/assets/icons/Icon.2_03.png deleted file mode 100644 index d3520791..00000000 Binary files a/dist/assets/icons/Icon.2_03.png and /dev/null differ diff --git a/dist/assets/icons/Icon.2_04.png b/dist/assets/icons/Icon.2_04.png deleted file mode 100644 index d88db7fb..00000000 Binary files a/dist/assets/icons/Icon.2_04.png and /dev/null differ diff --git a/dist/assets/icons/Icon.2_05.png b/dist/assets/icons/Icon.2_05.png deleted file mode 100644 index 214d0ca7..00000000 Binary files a/dist/assets/icons/Icon.2_05.png and /dev/null differ diff --git a/dist/assets/icons/Icon.2_06.png b/dist/assets/icons/Icon.2_06.png deleted file mode 100644 index e46403f6..00000000 Binary files a/dist/assets/icons/Icon.2_06.png and /dev/null differ diff --git a/dist/assets/icons/Icon.2_07.png b/dist/assets/icons/Icon.2_07.png deleted file mode 100644 index 81006201..00000000 Binary files a/dist/assets/icons/Icon.2_07.png and /dev/null differ diff --git a/dist/assets/icons/Icon.2_08.png b/dist/assets/icons/Icon.2_08.png deleted file mode 100644 index 6d9b7dbd..00000000 Binary files a/dist/assets/icons/Icon.2_08.png and /dev/null differ diff --git a/dist/assets/icons/Icon.2_09.png b/dist/assets/icons/Icon.2_09.png deleted file mode 100644 index 2485b874..00000000 Binary files a/dist/assets/icons/Icon.2_09.png and /dev/null differ diff --git a/dist/assets/icons/Icon.2_10.png b/dist/assets/icons/Icon.2_10.png deleted file mode 100644 index d88959cb..00000000 Binary files a/dist/assets/icons/Icon.2_10.png and /dev/null differ diff --git a/dist/assets/icons/Icon.2_100.png b/dist/assets/icons/Icon.2_100.png deleted file mode 100644 index 3123ad84..00000000 Binary files a/dist/assets/icons/Icon.2_100.png and /dev/null differ diff --git a/dist/assets/icons/Icon.2_11.png b/dist/assets/icons/Icon.2_11.png deleted file mode 100644 index 4b4d3f41..00000000 Binary files a/dist/assets/icons/Icon.2_11.png and /dev/null differ diff --git a/dist/assets/icons/Icon.2_12.png b/dist/assets/icons/Icon.2_12.png deleted file mode 100644 index e7f4ecc6..00000000 Binary files a/dist/assets/icons/Icon.2_12.png and /dev/null differ diff --git a/dist/assets/icons/Icon.2_13.png b/dist/assets/icons/Icon.2_13.png deleted file mode 100644 index fd2d9540..00000000 Binary files a/dist/assets/icons/Icon.2_13.png and /dev/null differ diff --git a/dist/assets/icons/Icon.2_14.png b/dist/assets/icons/Icon.2_14.png deleted file mode 100644 index d10c01b7..00000000 Binary files a/dist/assets/icons/Icon.2_14.png and /dev/null differ diff --git a/dist/assets/icons/Icon.2_15.png b/dist/assets/icons/Icon.2_15.png deleted file mode 100644 index 166cc965..00000000 Binary files a/dist/assets/icons/Icon.2_15.png and /dev/null differ diff --git a/dist/assets/icons/Icon.2_16.png b/dist/assets/icons/Icon.2_16.png deleted file mode 100644 index 729a6cef..00000000 Binary files a/dist/assets/icons/Icon.2_16.png and /dev/null differ diff --git a/dist/assets/icons/Icon.2_17.png b/dist/assets/icons/Icon.2_17.png deleted file mode 100644 index 17bcb39f..00000000 Binary files a/dist/assets/icons/Icon.2_17.png and /dev/null differ diff --git a/dist/assets/icons/Icon.2_18.png b/dist/assets/icons/Icon.2_18.png deleted file mode 100644 index 4005eee5..00000000 Binary files a/dist/assets/icons/Icon.2_18.png and /dev/null differ diff --git a/dist/assets/icons/Icon.2_19.png b/dist/assets/icons/Icon.2_19.png deleted file mode 100644 index c3aec21f..00000000 Binary files a/dist/assets/icons/Icon.2_19.png and /dev/null differ diff --git a/dist/assets/icons/Icon.2_20.png b/dist/assets/icons/Icon.2_20.png deleted file mode 100644 index 29599be6..00000000 Binary files a/dist/assets/icons/Icon.2_20.png and /dev/null differ diff --git a/dist/assets/icons/Icon.2_21.png b/dist/assets/icons/Icon.2_21.png deleted file mode 100644 index 203ddb6e..00000000 Binary files a/dist/assets/icons/Icon.2_21.png and /dev/null differ diff --git a/dist/assets/icons/Icon.2_22.png b/dist/assets/icons/Icon.2_22.png deleted file mode 100644 index 79740a27..00000000 Binary files a/dist/assets/icons/Icon.2_22.png and /dev/null differ diff --git a/dist/assets/icons/Icon.2_23.png b/dist/assets/icons/Icon.2_23.png deleted file mode 100644 index 5fd225a8..00000000 Binary files a/dist/assets/icons/Icon.2_23.png and /dev/null differ diff --git a/dist/assets/icons/Icon.2_24.png b/dist/assets/icons/Icon.2_24.png deleted file mode 100644 index 51ef05c8..00000000 Binary files a/dist/assets/icons/Icon.2_24.png and /dev/null differ diff --git a/dist/assets/icons/Icon.2_25.png b/dist/assets/icons/Icon.2_25.png deleted file mode 100644 index d420fb46..00000000 Binary files a/dist/assets/icons/Icon.2_25.png and /dev/null differ diff --git a/dist/assets/icons/Icon.2_26.png b/dist/assets/icons/Icon.2_26.png deleted file mode 100644 index 3148ea92..00000000 Binary files a/dist/assets/icons/Icon.2_26.png and /dev/null differ diff --git a/dist/assets/icons/Icon.2_27.png b/dist/assets/icons/Icon.2_27.png deleted file mode 100644 index 05e9899d..00000000 Binary files a/dist/assets/icons/Icon.2_27.png and /dev/null differ diff --git a/dist/assets/icons/Icon.2_28.png b/dist/assets/icons/Icon.2_28.png deleted file mode 100644 index 30d1a718..00000000 Binary files a/dist/assets/icons/Icon.2_28.png and /dev/null differ diff --git a/dist/assets/icons/Icon.2_29.png b/dist/assets/icons/Icon.2_29.png deleted file mode 100644 index 53d715d5..00000000 Binary files a/dist/assets/icons/Icon.2_29.png and /dev/null differ diff --git a/dist/assets/icons/Icon.2_31.png b/dist/assets/icons/Icon.2_31.png deleted file mode 100644 index ea65e9c4..00000000 Binary files a/dist/assets/icons/Icon.2_31.png and /dev/null differ diff --git a/dist/assets/icons/Icon.2_32.png b/dist/assets/icons/Icon.2_32.png deleted file mode 100644 index e923113d..00000000 Binary files a/dist/assets/icons/Icon.2_32.png and /dev/null differ diff --git a/dist/assets/icons/Icon.2_33.png b/dist/assets/icons/Icon.2_33.png deleted file mode 100644 index fce79213..00000000 Binary files a/dist/assets/icons/Icon.2_33.png and /dev/null differ diff --git a/dist/assets/icons/Icon.2_34.png b/dist/assets/icons/Icon.2_34.png deleted file mode 100644 index 8f3a61a3..00000000 Binary files a/dist/assets/icons/Icon.2_34.png and /dev/null differ diff --git a/dist/assets/icons/Icon.2_35.png b/dist/assets/icons/Icon.2_35.png deleted file mode 100644 index 76c5694a..00000000 Binary files a/dist/assets/icons/Icon.2_35.png and /dev/null differ diff --git a/dist/assets/icons/Icon.2_36.png b/dist/assets/icons/Icon.2_36.png deleted file mode 100644 index e4b540d9..00000000 Binary files a/dist/assets/icons/Icon.2_36.png and /dev/null differ diff --git a/dist/assets/icons/Icon.2_37.png b/dist/assets/icons/Icon.2_37.png deleted file mode 100644 index 6bb0d41f..00000000 Binary files a/dist/assets/icons/Icon.2_37.png and /dev/null differ diff --git a/dist/assets/icons/Icon.2_38.png b/dist/assets/icons/Icon.2_38.png deleted file mode 100644 index c279c2b1..00000000 Binary files a/dist/assets/icons/Icon.2_38.png and /dev/null differ diff --git a/dist/assets/icons/Icon.2_39.png b/dist/assets/icons/Icon.2_39.png deleted file mode 100644 index a347582a..00000000 Binary files a/dist/assets/icons/Icon.2_39.png and /dev/null differ diff --git a/dist/assets/icons/Icon.2_40.png b/dist/assets/icons/Icon.2_40.png deleted file mode 100644 index 1df173f1..00000000 Binary files a/dist/assets/icons/Icon.2_40.png and /dev/null differ diff --git a/dist/assets/icons/Icon.2_41.png b/dist/assets/icons/Icon.2_41.png deleted file mode 100644 index 85fea8f3..00000000 Binary files a/dist/assets/icons/Icon.2_41.png and /dev/null differ diff --git a/dist/assets/icons/Icon.2_42.png b/dist/assets/icons/Icon.2_42.png deleted file mode 100644 index 19567ae3..00000000 Binary files a/dist/assets/icons/Icon.2_42.png and /dev/null differ diff --git a/dist/assets/icons/Icon.2_44.png b/dist/assets/icons/Icon.2_44.png deleted file mode 100644 index f16fa3f9..00000000 Binary files a/dist/assets/icons/Icon.2_44.png and /dev/null differ diff --git a/dist/assets/icons/Icon.2_45.png b/dist/assets/icons/Icon.2_45.png deleted file mode 100644 index 9e80465d..00000000 Binary files a/dist/assets/icons/Icon.2_45.png and /dev/null differ diff --git a/dist/assets/icons/Icon.2_46.png b/dist/assets/icons/Icon.2_46.png deleted file mode 100644 index 312b8007..00000000 Binary files a/dist/assets/icons/Icon.2_46.png and /dev/null differ diff --git a/dist/assets/icons/Icon.2_47.png b/dist/assets/icons/Icon.2_47.png deleted file mode 100644 index 80bdb7ee..00000000 Binary files a/dist/assets/icons/Icon.2_47.png and /dev/null differ diff --git a/dist/assets/icons/Icon.2_48.png b/dist/assets/icons/Icon.2_48.png deleted file mode 100644 index c636ec26..00000000 Binary files a/dist/assets/icons/Icon.2_48.png and /dev/null differ diff --git a/dist/assets/icons/Icon.2_49.png b/dist/assets/icons/Icon.2_49.png deleted file mode 100644 index 03c8f590..00000000 Binary files a/dist/assets/icons/Icon.2_49.png and /dev/null differ diff --git a/dist/assets/icons/Icon.2_50.png b/dist/assets/icons/Icon.2_50.png deleted file mode 100644 index 70c3cfab..00000000 Binary files a/dist/assets/icons/Icon.2_50.png and /dev/null differ diff --git a/dist/assets/icons/Icon.2_51.png b/dist/assets/icons/Icon.2_51.png deleted file mode 100644 index 5f2d89a5..00000000 Binary files a/dist/assets/icons/Icon.2_51.png and /dev/null differ diff --git a/dist/assets/icons/Icon.2_52.png b/dist/assets/icons/Icon.2_52.png deleted file mode 100644 index a1548cd8..00000000 Binary files a/dist/assets/icons/Icon.2_52.png and /dev/null differ diff --git a/dist/assets/icons/Icon.2_53.png b/dist/assets/icons/Icon.2_53.png deleted file mode 100644 index 039d73d5..00000000 Binary files a/dist/assets/icons/Icon.2_53.png and /dev/null differ diff --git a/dist/assets/icons/Icon.2_54.png b/dist/assets/icons/Icon.2_54.png deleted file mode 100644 index 56325273..00000000 Binary files a/dist/assets/icons/Icon.2_54.png and /dev/null differ diff --git a/dist/assets/icons/Icon.2_55.png b/dist/assets/icons/Icon.2_55.png deleted file mode 100644 index 3b1d5b09..00000000 Binary files a/dist/assets/icons/Icon.2_55.png and /dev/null differ diff --git a/dist/assets/icons/Icon.2_56.png b/dist/assets/icons/Icon.2_56.png deleted file mode 100644 index a8d67f88..00000000 Binary files a/dist/assets/icons/Icon.2_56.png and /dev/null differ diff --git a/dist/assets/icons/Icon.2_57.png b/dist/assets/icons/Icon.2_57.png deleted file mode 100644 index 42b5711d..00000000 Binary files a/dist/assets/icons/Icon.2_57.png and /dev/null differ diff --git a/dist/assets/icons/Icon.2_58.png b/dist/assets/icons/Icon.2_58.png deleted file mode 100644 index d3a6d5d0..00000000 Binary files a/dist/assets/icons/Icon.2_58.png and /dev/null differ diff --git a/dist/assets/icons/Icon.2_59.png b/dist/assets/icons/Icon.2_59.png deleted file mode 100644 index 4b3933c1..00000000 Binary files a/dist/assets/icons/Icon.2_59.png and /dev/null differ diff --git a/dist/assets/icons/Icon.2_60.png b/dist/assets/icons/Icon.2_60.png deleted file mode 100644 index 96362c8a..00000000 Binary files a/dist/assets/icons/Icon.2_60.png and /dev/null differ diff --git a/dist/assets/icons/Icon.2_61.png b/dist/assets/icons/Icon.2_61.png deleted file mode 100644 index 75ac0cb9..00000000 Binary files a/dist/assets/icons/Icon.2_61.png and /dev/null differ diff --git a/dist/assets/icons/Icon.2_62.png b/dist/assets/icons/Icon.2_62.png deleted file mode 100644 index c72f1dcc..00000000 Binary files a/dist/assets/icons/Icon.2_62.png and /dev/null differ diff --git a/dist/assets/icons/Icon.2_63.png b/dist/assets/icons/Icon.2_63.png deleted file mode 100644 index 01b5d0dd..00000000 Binary files a/dist/assets/icons/Icon.2_63.png and /dev/null differ diff --git a/dist/assets/icons/Icon.2_64.png b/dist/assets/icons/Icon.2_64.png deleted file mode 100644 index f1aa443a..00000000 Binary files a/dist/assets/icons/Icon.2_64.png and /dev/null differ diff --git a/dist/assets/icons/Icon.2_65.png b/dist/assets/icons/Icon.2_65.png deleted file mode 100644 index aa2e518d..00000000 Binary files a/dist/assets/icons/Icon.2_65.png and /dev/null differ diff --git a/dist/assets/icons/Icon.2_66.png b/dist/assets/icons/Icon.2_66.png deleted file mode 100644 index 0191cca7..00000000 Binary files a/dist/assets/icons/Icon.2_66.png and /dev/null differ diff --git a/dist/assets/icons/Icon.2_67.png b/dist/assets/icons/Icon.2_67.png deleted file mode 100644 index f6e1d753..00000000 Binary files a/dist/assets/icons/Icon.2_67.png and /dev/null differ diff --git a/dist/assets/icons/Icon.2_69.png b/dist/assets/icons/Icon.2_69.png deleted file mode 100644 index 5703493d..00000000 Binary files a/dist/assets/icons/Icon.2_69.png and /dev/null differ diff --git a/dist/assets/icons/Icon.2_70.png b/dist/assets/icons/Icon.2_70.png deleted file mode 100644 index 86bf5c30..00000000 Binary files a/dist/assets/icons/Icon.2_70.png and /dev/null differ diff --git a/dist/assets/icons/Icon.2_71.png b/dist/assets/icons/Icon.2_71.png deleted file mode 100644 index 7b1bac55..00000000 Binary files a/dist/assets/icons/Icon.2_71.png and /dev/null differ diff --git a/dist/assets/icons/Icon.2_72.png b/dist/assets/icons/Icon.2_72.png deleted file mode 100644 index d8b3617b..00000000 Binary files a/dist/assets/icons/Icon.2_72.png and /dev/null differ diff --git a/dist/assets/icons/Icon.2_73.png b/dist/assets/icons/Icon.2_73.png deleted file mode 100644 index 09038e90..00000000 Binary files a/dist/assets/icons/Icon.2_73.png and /dev/null differ diff --git a/dist/assets/icons/Icon.2_74.png b/dist/assets/icons/Icon.2_74.png deleted file mode 100644 index d020a8cc..00000000 Binary files a/dist/assets/icons/Icon.2_74.png and /dev/null differ diff --git a/dist/assets/icons/Icon.2_75.png b/dist/assets/icons/Icon.2_75.png deleted file mode 100644 index a014b0f7..00000000 Binary files a/dist/assets/icons/Icon.2_75.png and /dev/null differ diff --git a/dist/assets/icons/Icon.2_76.png b/dist/assets/icons/Icon.2_76.png deleted file mode 100644 index 7e4c9110..00000000 Binary files a/dist/assets/icons/Icon.2_76.png and /dev/null differ diff --git a/dist/assets/icons/Icon.2_77.png b/dist/assets/icons/Icon.2_77.png deleted file mode 100644 index 63366074..00000000 Binary files a/dist/assets/icons/Icon.2_77.png and /dev/null differ diff --git a/dist/assets/icons/Icon.2_78.png b/dist/assets/icons/Icon.2_78.png deleted file mode 100644 index f2969c56..00000000 Binary files a/dist/assets/icons/Icon.2_78.png and /dev/null differ diff --git a/dist/assets/icons/Icon.2_79.png b/dist/assets/icons/Icon.2_79.png deleted file mode 100644 index e21c09d4..00000000 Binary files a/dist/assets/icons/Icon.2_79.png and /dev/null differ diff --git a/dist/assets/icons/Icon.2_80.png b/dist/assets/icons/Icon.2_80.png deleted file mode 100644 index 2c8614f5..00000000 Binary files a/dist/assets/icons/Icon.2_80.png and /dev/null differ diff --git a/dist/assets/icons/Icon.2_81.png b/dist/assets/icons/Icon.2_81.png deleted file mode 100644 index 8b1868a1..00000000 Binary files a/dist/assets/icons/Icon.2_81.png and /dev/null differ diff --git a/dist/assets/icons/Icon.2_82.png b/dist/assets/icons/Icon.2_82.png deleted file mode 100644 index eff095b0..00000000 Binary files a/dist/assets/icons/Icon.2_82.png and /dev/null differ diff --git a/dist/assets/icons/Icon.2_83.png b/dist/assets/icons/Icon.2_83.png deleted file mode 100644 index cbbe2883..00000000 Binary files a/dist/assets/icons/Icon.2_83.png and /dev/null differ diff --git a/dist/assets/icons/Icon.2_84.png b/dist/assets/icons/Icon.2_84.png deleted file mode 100644 index e70baca5..00000000 Binary files a/dist/assets/icons/Icon.2_84.png and /dev/null differ diff --git a/dist/assets/icons/Icon.2_85.png b/dist/assets/icons/Icon.2_85.png deleted file mode 100644 index c4d1ba1f..00000000 Binary files a/dist/assets/icons/Icon.2_85.png and /dev/null differ diff --git a/dist/assets/icons/Icon.2_86.png b/dist/assets/icons/Icon.2_86.png deleted file mode 100644 index e22af393..00000000 Binary files a/dist/assets/icons/Icon.2_86.png and /dev/null differ diff --git a/dist/assets/icons/Icon.2_87.png b/dist/assets/icons/Icon.2_87.png deleted file mode 100644 index 873651e5..00000000 Binary files a/dist/assets/icons/Icon.2_87.png and /dev/null differ diff --git a/dist/assets/icons/Icon.2_88.png b/dist/assets/icons/Icon.2_88.png deleted file mode 100644 index 7c955762..00000000 Binary files a/dist/assets/icons/Icon.2_88.png and /dev/null differ diff --git a/dist/assets/icons/Icon.2_89.png b/dist/assets/icons/Icon.2_89.png deleted file mode 100644 index 43cd6c57..00000000 Binary files a/dist/assets/icons/Icon.2_89.png and /dev/null differ diff --git a/dist/assets/icons/Icon.2_90.png b/dist/assets/icons/Icon.2_90.png deleted file mode 100644 index d33b5f42..00000000 Binary files a/dist/assets/icons/Icon.2_90.png and /dev/null differ diff --git a/dist/assets/icons/Icon.2_91.png b/dist/assets/icons/Icon.2_91.png deleted file mode 100644 index 915594b6..00000000 Binary files a/dist/assets/icons/Icon.2_91.png and /dev/null differ diff --git a/dist/assets/icons/Icon.2_92.png b/dist/assets/icons/Icon.2_92.png deleted file mode 100644 index 5281431a..00000000 Binary files a/dist/assets/icons/Icon.2_92.png and /dev/null differ diff --git a/dist/assets/icons/Icon.2_93.png b/dist/assets/icons/Icon.2_93.png deleted file mode 100644 index e6b8ef07..00000000 Binary files a/dist/assets/icons/Icon.2_93.png and /dev/null differ diff --git a/dist/assets/icons/Icon.2_94.png b/dist/assets/icons/Icon.2_94.png deleted file mode 100644 index 1b3d291e..00000000 Binary files a/dist/assets/icons/Icon.2_94.png and /dev/null differ diff --git a/dist/assets/icons/Icon.2_95.png b/dist/assets/icons/Icon.2_95.png deleted file mode 100644 index cf19e852..00000000 Binary files a/dist/assets/icons/Icon.2_95.png and /dev/null differ diff --git a/dist/assets/icons/Icon.2_96.png b/dist/assets/icons/Icon.2_96.png deleted file mode 100644 index bb71a5f7..00000000 Binary files a/dist/assets/icons/Icon.2_96.png and /dev/null differ diff --git a/dist/assets/icons/Icon.2_97.png b/dist/assets/icons/Icon.2_97.png deleted file mode 100644 index aeb6e0d7..00000000 Binary files a/dist/assets/icons/Icon.2_97.png and /dev/null differ diff --git a/dist/assets/icons/Icon.2_98.png b/dist/assets/icons/Icon.2_98.png deleted file mode 100644 index c3c2d908..00000000 Binary files a/dist/assets/icons/Icon.2_98.png and /dev/null differ diff --git a/dist/assets/icons/Icon.2_99.png b/dist/assets/icons/Icon.2_99.png deleted file mode 100644 index 46287be8..00000000 Binary files a/dist/assets/icons/Icon.2_99.png and /dev/null differ diff --git a/dist/assets/icons/Icon.3_01.png b/dist/assets/icons/Icon.3_01.png deleted file mode 100644 index 505232c7..00000000 Binary files a/dist/assets/icons/Icon.3_01.png and /dev/null differ diff --git a/dist/assets/icons/Icon.3_02.png b/dist/assets/icons/Icon.3_02.png deleted file mode 100644 index 45af398f..00000000 Binary files a/dist/assets/icons/Icon.3_02.png and /dev/null differ diff --git a/dist/assets/icons/Icon.3_03.png b/dist/assets/icons/Icon.3_03.png deleted file mode 100644 index dd67fc80..00000000 Binary files a/dist/assets/icons/Icon.3_03.png and /dev/null differ diff --git a/dist/assets/icons/Icon.3_04.png b/dist/assets/icons/Icon.3_04.png deleted file mode 100644 index fe5b1a6a..00000000 Binary files a/dist/assets/icons/Icon.3_04.png and /dev/null differ diff --git a/dist/assets/icons/Icon.3_05.png b/dist/assets/icons/Icon.3_05.png deleted file mode 100644 index 28bab2a0..00000000 Binary files a/dist/assets/icons/Icon.3_05.png and /dev/null differ diff --git a/dist/assets/icons/Icon.3_06.png b/dist/assets/icons/Icon.3_06.png deleted file mode 100644 index d70bddfd..00000000 Binary files a/dist/assets/icons/Icon.3_06.png and /dev/null differ diff --git a/dist/assets/icons/Icon.3_07.png b/dist/assets/icons/Icon.3_07.png deleted file mode 100644 index 904b7a43..00000000 Binary files a/dist/assets/icons/Icon.3_07.png and /dev/null differ diff --git a/dist/assets/icons/Icon.3_08.png b/dist/assets/icons/Icon.3_08.png deleted file mode 100644 index 9dbab874..00000000 Binary files a/dist/assets/icons/Icon.3_08.png and /dev/null differ diff --git a/dist/assets/icons/Icon.3_09.png b/dist/assets/icons/Icon.3_09.png deleted file mode 100644 index e743117b..00000000 Binary files a/dist/assets/icons/Icon.3_09.png and /dev/null differ diff --git a/dist/assets/icons/Icon.3_10.png b/dist/assets/icons/Icon.3_10.png deleted file mode 100644 index ffd963e8..00000000 Binary files a/dist/assets/icons/Icon.3_10.png and /dev/null differ diff --git a/dist/assets/icons/Icon.3_100.png b/dist/assets/icons/Icon.3_100.png deleted file mode 100644 index ff236944..00000000 Binary files a/dist/assets/icons/Icon.3_100.png and /dev/null differ diff --git a/dist/assets/icons/Icon.3_11.png b/dist/assets/icons/Icon.3_11.png deleted file mode 100644 index 5de2829b..00000000 Binary files a/dist/assets/icons/Icon.3_11.png and /dev/null differ diff --git a/dist/assets/icons/Icon.3_12.png b/dist/assets/icons/Icon.3_12.png deleted file mode 100644 index c998690a..00000000 Binary files a/dist/assets/icons/Icon.3_12.png and /dev/null differ diff --git a/dist/assets/icons/Icon.3_14.png b/dist/assets/icons/Icon.3_14.png deleted file mode 100644 index 9950063d..00000000 Binary files a/dist/assets/icons/Icon.3_14.png and /dev/null differ diff --git a/dist/assets/icons/Icon.3_15.png b/dist/assets/icons/Icon.3_15.png deleted file mode 100644 index 7c3f9252..00000000 Binary files a/dist/assets/icons/Icon.3_15.png and /dev/null differ diff --git a/dist/assets/icons/Icon.3_16.png b/dist/assets/icons/Icon.3_16.png deleted file mode 100644 index 7ddb284f..00000000 Binary files a/dist/assets/icons/Icon.3_16.png and /dev/null differ diff --git a/dist/assets/icons/Icon.3_17.png b/dist/assets/icons/Icon.3_17.png deleted file mode 100644 index 80dea10c..00000000 Binary files a/dist/assets/icons/Icon.3_17.png and /dev/null differ diff --git a/dist/assets/icons/Icon.3_18.png b/dist/assets/icons/Icon.3_18.png deleted file mode 100644 index a4dc3721..00000000 Binary files a/dist/assets/icons/Icon.3_18.png and /dev/null differ diff --git a/dist/assets/icons/Icon.3_19.png b/dist/assets/icons/Icon.3_19.png deleted file mode 100644 index 12102335..00000000 Binary files a/dist/assets/icons/Icon.3_19.png and /dev/null differ diff --git a/dist/assets/icons/Icon.3_20.png b/dist/assets/icons/Icon.3_20.png deleted file mode 100644 index 897b0175..00000000 Binary files a/dist/assets/icons/Icon.3_20.png and /dev/null differ diff --git a/dist/assets/icons/Icon.3_21.png b/dist/assets/icons/Icon.3_21.png deleted file mode 100644 index b81c0449..00000000 Binary files a/dist/assets/icons/Icon.3_21.png and /dev/null differ diff --git a/dist/assets/icons/Icon.3_22.png b/dist/assets/icons/Icon.3_22.png deleted file mode 100644 index 06e42ec0..00000000 Binary files a/dist/assets/icons/Icon.3_22.png and /dev/null differ diff --git a/dist/assets/icons/Icon.3_23.png b/dist/assets/icons/Icon.3_23.png deleted file mode 100644 index 8a0e9834..00000000 Binary files a/dist/assets/icons/Icon.3_23.png and /dev/null differ diff --git a/dist/assets/icons/Icon.3_24.png b/dist/assets/icons/Icon.3_24.png deleted file mode 100644 index f431bfc1..00000000 Binary files a/dist/assets/icons/Icon.3_24.png and /dev/null differ diff --git a/dist/assets/icons/Icon.3_25.png b/dist/assets/icons/Icon.3_25.png deleted file mode 100644 index 1d4c1564..00000000 Binary files a/dist/assets/icons/Icon.3_25.png and /dev/null differ diff --git a/dist/assets/icons/Icon.3_26.png b/dist/assets/icons/Icon.3_26.png deleted file mode 100644 index c6d25eb9..00000000 Binary files a/dist/assets/icons/Icon.3_26.png and /dev/null differ diff --git a/dist/assets/icons/Icon.3_27.png b/dist/assets/icons/Icon.3_27.png deleted file mode 100644 index 63dfe116..00000000 Binary files a/dist/assets/icons/Icon.3_27.png and /dev/null differ diff --git a/dist/assets/icons/Icon.3_28.png b/dist/assets/icons/Icon.3_28.png deleted file mode 100644 index 2013993a..00000000 Binary files a/dist/assets/icons/Icon.3_28.png and /dev/null differ diff --git a/dist/assets/icons/Icon.3_29.png b/dist/assets/icons/Icon.3_29.png deleted file mode 100644 index 48913ee4..00000000 Binary files a/dist/assets/icons/Icon.3_29.png and /dev/null differ diff --git a/dist/assets/icons/Icon.3_30.png b/dist/assets/icons/Icon.3_30.png deleted file mode 100644 index 5d45390c..00000000 Binary files a/dist/assets/icons/Icon.3_30.png and /dev/null differ diff --git a/dist/assets/icons/Icon.3_31.png b/dist/assets/icons/Icon.3_31.png deleted file mode 100644 index b829ef44..00000000 Binary files a/dist/assets/icons/Icon.3_31.png and /dev/null differ diff --git a/dist/assets/icons/Icon.3_32.png b/dist/assets/icons/Icon.3_32.png deleted file mode 100644 index b7c3ef1a..00000000 Binary files a/dist/assets/icons/Icon.3_32.png and /dev/null differ diff --git a/dist/assets/icons/Icon.3_34.png b/dist/assets/icons/Icon.3_34.png deleted file mode 100644 index 51c92f4b..00000000 Binary files a/dist/assets/icons/Icon.3_34.png and /dev/null differ diff --git a/dist/assets/icons/Icon.3_35.png b/dist/assets/icons/Icon.3_35.png deleted file mode 100644 index 38528786..00000000 Binary files a/dist/assets/icons/Icon.3_35.png and /dev/null differ diff --git a/dist/assets/icons/Icon.3_36.png b/dist/assets/icons/Icon.3_36.png deleted file mode 100644 index ad86c0f4..00000000 Binary files a/dist/assets/icons/Icon.3_36.png and /dev/null differ diff --git a/dist/assets/icons/Icon.3_37.png b/dist/assets/icons/Icon.3_37.png deleted file mode 100644 index dbb60b2b..00000000 Binary files a/dist/assets/icons/Icon.3_37.png and /dev/null differ diff --git a/dist/assets/icons/Icon.3_38.png b/dist/assets/icons/Icon.3_38.png deleted file mode 100644 index de61571f..00000000 Binary files a/dist/assets/icons/Icon.3_38.png and /dev/null differ diff --git a/dist/assets/icons/Icon.3_40.png b/dist/assets/icons/Icon.3_40.png deleted file mode 100644 index 9332af8d..00000000 Binary files a/dist/assets/icons/Icon.3_40.png and /dev/null differ diff --git a/dist/assets/icons/Icon.3_41.png b/dist/assets/icons/Icon.3_41.png deleted file mode 100644 index f88637ef..00000000 Binary files a/dist/assets/icons/Icon.3_41.png and /dev/null differ diff --git a/dist/assets/icons/Icon.3_42.png b/dist/assets/icons/Icon.3_42.png deleted file mode 100644 index 950a5508..00000000 Binary files a/dist/assets/icons/Icon.3_42.png and /dev/null differ diff --git a/dist/assets/icons/Icon.3_43.png b/dist/assets/icons/Icon.3_43.png deleted file mode 100644 index 41b8a112..00000000 Binary files a/dist/assets/icons/Icon.3_43.png and /dev/null differ diff --git a/dist/assets/icons/Icon.3_44.png b/dist/assets/icons/Icon.3_44.png deleted file mode 100644 index b03c98b7..00000000 Binary files a/dist/assets/icons/Icon.3_44.png and /dev/null differ diff --git a/dist/assets/icons/Icon.3_45.png b/dist/assets/icons/Icon.3_45.png deleted file mode 100644 index c8916732..00000000 Binary files a/dist/assets/icons/Icon.3_45.png and /dev/null differ diff --git a/dist/assets/icons/Icon.3_46.png b/dist/assets/icons/Icon.3_46.png deleted file mode 100644 index d7c1045b..00000000 Binary files a/dist/assets/icons/Icon.3_46.png and /dev/null differ diff --git a/dist/assets/icons/Icon.3_47.png b/dist/assets/icons/Icon.3_47.png deleted file mode 100644 index 86f2a57a..00000000 Binary files a/dist/assets/icons/Icon.3_47.png and /dev/null differ diff --git a/dist/assets/icons/Icon.3_49.png b/dist/assets/icons/Icon.3_49.png deleted file mode 100644 index 6b18b58a..00000000 Binary files a/dist/assets/icons/Icon.3_49.png and /dev/null differ diff --git a/dist/assets/icons/Icon.3_50.png b/dist/assets/icons/Icon.3_50.png deleted file mode 100644 index cc3c2592..00000000 Binary files a/dist/assets/icons/Icon.3_50.png and /dev/null differ diff --git a/dist/assets/icons/Icon.3_51.png b/dist/assets/icons/Icon.3_51.png deleted file mode 100644 index ad09193c..00000000 Binary files a/dist/assets/icons/Icon.3_51.png and /dev/null differ diff --git a/dist/assets/icons/Icon.3_52.png b/dist/assets/icons/Icon.3_52.png deleted file mode 100644 index 545a53a4..00000000 Binary files a/dist/assets/icons/Icon.3_52.png and /dev/null differ diff --git a/dist/assets/icons/Icon.3_53.png b/dist/assets/icons/Icon.3_53.png deleted file mode 100644 index 3b9c6f45..00000000 Binary files a/dist/assets/icons/Icon.3_53.png and /dev/null differ diff --git a/dist/assets/icons/Icon.3_54.png b/dist/assets/icons/Icon.3_54.png deleted file mode 100644 index 8526aa9b..00000000 Binary files a/dist/assets/icons/Icon.3_54.png and /dev/null differ diff --git a/dist/assets/icons/Icon.3_55.png b/dist/assets/icons/Icon.3_55.png deleted file mode 100644 index 5ed6e365..00000000 Binary files a/dist/assets/icons/Icon.3_55.png and /dev/null differ diff --git a/dist/assets/icons/Icon.3_56.png b/dist/assets/icons/Icon.3_56.png deleted file mode 100644 index 54bdddff..00000000 Binary files a/dist/assets/icons/Icon.3_56.png and /dev/null differ diff --git a/dist/assets/icons/Icon.3_57.png b/dist/assets/icons/Icon.3_57.png deleted file mode 100644 index b01b9e56..00000000 Binary files a/dist/assets/icons/Icon.3_57.png and /dev/null differ diff --git a/dist/assets/icons/Icon.3_58.png b/dist/assets/icons/Icon.3_58.png deleted file mode 100644 index 19b2c261..00000000 Binary files a/dist/assets/icons/Icon.3_58.png and /dev/null differ diff --git a/dist/assets/icons/Icon.3_59.png b/dist/assets/icons/Icon.3_59.png deleted file mode 100644 index f6644b7a..00000000 Binary files a/dist/assets/icons/Icon.3_59.png and /dev/null differ diff --git a/dist/assets/icons/Icon.3_60.png b/dist/assets/icons/Icon.3_60.png deleted file mode 100644 index 4612d371..00000000 Binary files a/dist/assets/icons/Icon.3_60.png and /dev/null differ diff --git a/dist/assets/icons/Icon.3_61.png b/dist/assets/icons/Icon.3_61.png deleted file mode 100644 index 2fb0da6c..00000000 Binary files a/dist/assets/icons/Icon.3_61.png and /dev/null differ diff --git a/dist/assets/icons/Icon.3_62.png b/dist/assets/icons/Icon.3_62.png deleted file mode 100644 index a937cfd7..00000000 Binary files a/dist/assets/icons/Icon.3_62.png and /dev/null differ diff --git a/dist/assets/icons/Icon.3_63.png b/dist/assets/icons/Icon.3_63.png deleted file mode 100644 index 7c2c2d1d..00000000 Binary files a/dist/assets/icons/Icon.3_63.png and /dev/null differ diff --git a/dist/assets/icons/Icon.3_64.png b/dist/assets/icons/Icon.3_64.png deleted file mode 100644 index 43533a06..00000000 Binary files a/dist/assets/icons/Icon.3_64.png and /dev/null differ diff --git a/dist/assets/icons/Icon.3_66.png b/dist/assets/icons/Icon.3_66.png deleted file mode 100644 index 48530e86..00000000 Binary files a/dist/assets/icons/Icon.3_66.png and /dev/null differ diff --git a/dist/assets/icons/Icon.3_67.png b/dist/assets/icons/Icon.3_67.png deleted file mode 100644 index 86f8f5c5..00000000 Binary files a/dist/assets/icons/Icon.3_67.png and /dev/null differ diff --git a/dist/assets/icons/Icon.3_68.png b/dist/assets/icons/Icon.3_68.png deleted file mode 100644 index cb6ad836..00000000 Binary files a/dist/assets/icons/Icon.3_68.png and /dev/null differ diff --git a/dist/assets/icons/Icon.3_69.png b/dist/assets/icons/Icon.3_69.png deleted file mode 100644 index b9ab30da..00000000 Binary files a/dist/assets/icons/Icon.3_69.png and /dev/null differ diff --git a/dist/assets/icons/Icon.3_70.png b/dist/assets/icons/Icon.3_70.png deleted file mode 100644 index 9c025d91..00000000 Binary files a/dist/assets/icons/Icon.3_70.png and /dev/null differ diff --git a/dist/assets/icons/Icon.3_71.png b/dist/assets/icons/Icon.3_71.png deleted file mode 100644 index 777ad13e..00000000 Binary files a/dist/assets/icons/Icon.3_71.png and /dev/null differ diff --git a/dist/assets/icons/Icon.3_72.png b/dist/assets/icons/Icon.3_72.png deleted file mode 100644 index 6fb12212..00000000 Binary files a/dist/assets/icons/Icon.3_72.png and /dev/null differ diff --git a/dist/assets/icons/Icon.3_73.png b/dist/assets/icons/Icon.3_73.png deleted file mode 100644 index 13e1793b..00000000 Binary files a/dist/assets/icons/Icon.3_73.png and /dev/null differ diff --git a/dist/assets/icons/Icon.3_74.png b/dist/assets/icons/Icon.3_74.png deleted file mode 100644 index a00cec96..00000000 Binary files a/dist/assets/icons/Icon.3_74.png and /dev/null differ diff --git a/dist/assets/icons/Icon.3_75.png b/dist/assets/icons/Icon.3_75.png deleted file mode 100644 index 594516db..00000000 Binary files a/dist/assets/icons/Icon.3_75.png and /dev/null differ diff --git a/dist/assets/icons/Icon.3_76.png b/dist/assets/icons/Icon.3_76.png deleted file mode 100644 index 2f346d51..00000000 Binary files a/dist/assets/icons/Icon.3_76.png and /dev/null differ diff --git a/dist/assets/icons/Icon.3_77.png b/dist/assets/icons/Icon.3_77.png deleted file mode 100644 index 884dfeb2..00000000 Binary files a/dist/assets/icons/Icon.3_77.png and /dev/null differ diff --git a/dist/assets/icons/Icon.3_78.png b/dist/assets/icons/Icon.3_78.png deleted file mode 100644 index 26b5a7bf..00000000 Binary files a/dist/assets/icons/Icon.3_78.png and /dev/null differ diff --git a/dist/assets/icons/Icon.3_79.png b/dist/assets/icons/Icon.3_79.png deleted file mode 100644 index 4faa7195..00000000 Binary files a/dist/assets/icons/Icon.3_79.png and /dev/null differ diff --git a/dist/assets/icons/Icon.3_80.png b/dist/assets/icons/Icon.3_80.png deleted file mode 100644 index 6ce6a6a1..00000000 Binary files a/dist/assets/icons/Icon.3_80.png and /dev/null differ diff --git a/dist/assets/icons/Icon.3_81.png b/dist/assets/icons/Icon.3_81.png deleted file mode 100644 index 9c4b6302..00000000 Binary files a/dist/assets/icons/Icon.3_81.png and /dev/null differ diff --git a/dist/assets/icons/Icon.3_82.png b/dist/assets/icons/Icon.3_82.png deleted file mode 100644 index a85c096e..00000000 Binary files a/dist/assets/icons/Icon.3_82.png and /dev/null differ diff --git a/dist/assets/icons/Icon.3_83.png b/dist/assets/icons/Icon.3_83.png deleted file mode 100644 index 2060b458..00000000 Binary files a/dist/assets/icons/Icon.3_83.png and /dev/null differ diff --git a/dist/assets/icons/Icon.3_84.png b/dist/assets/icons/Icon.3_84.png deleted file mode 100644 index 61806c2f..00000000 Binary files a/dist/assets/icons/Icon.3_84.png and /dev/null differ diff --git a/dist/assets/icons/Icon.3_85.png b/dist/assets/icons/Icon.3_85.png deleted file mode 100644 index d35ab79d..00000000 Binary files a/dist/assets/icons/Icon.3_85.png and /dev/null differ diff --git a/dist/assets/icons/Icon.3_86.png b/dist/assets/icons/Icon.3_86.png deleted file mode 100644 index ee05ffff..00000000 Binary files a/dist/assets/icons/Icon.3_86.png and /dev/null differ diff --git a/dist/assets/icons/Icon.3_87.png b/dist/assets/icons/Icon.3_87.png deleted file mode 100644 index db2bf3d6..00000000 Binary files a/dist/assets/icons/Icon.3_87.png and /dev/null differ diff --git a/dist/assets/icons/Icon.3_88.png b/dist/assets/icons/Icon.3_88.png deleted file mode 100644 index 44571ac7..00000000 Binary files a/dist/assets/icons/Icon.3_88.png and /dev/null differ diff --git a/dist/assets/icons/Icon.3_89.png b/dist/assets/icons/Icon.3_89.png deleted file mode 100644 index 59d019e5..00000000 Binary files a/dist/assets/icons/Icon.3_89.png and /dev/null differ diff --git a/dist/assets/icons/Icon.3_90.png b/dist/assets/icons/Icon.3_90.png deleted file mode 100644 index 877c2efd..00000000 Binary files a/dist/assets/icons/Icon.3_90.png and /dev/null differ diff --git a/dist/assets/icons/Icon.3_91.png b/dist/assets/icons/Icon.3_91.png deleted file mode 100644 index 5de3d619..00000000 Binary files a/dist/assets/icons/Icon.3_91.png and /dev/null differ diff --git a/dist/assets/icons/Icon.3_92.png b/dist/assets/icons/Icon.3_92.png deleted file mode 100644 index 53cd3a04..00000000 Binary files a/dist/assets/icons/Icon.3_92.png and /dev/null differ diff --git a/dist/assets/icons/Icon.3_93.png b/dist/assets/icons/Icon.3_93.png deleted file mode 100644 index 99268b26..00000000 Binary files a/dist/assets/icons/Icon.3_93.png and /dev/null differ diff --git a/dist/assets/icons/Icon.3_94.png b/dist/assets/icons/Icon.3_94.png deleted file mode 100644 index 0e4b6eb2..00000000 Binary files a/dist/assets/icons/Icon.3_94.png and /dev/null differ diff --git a/dist/assets/icons/Icon.3_95.png b/dist/assets/icons/Icon.3_95.png deleted file mode 100644 index b5e0b47b..00000000 Binary files a/dist/assets/icons/Icon.3_95.png and /dev/null differ diff --git a/dist/assets/icons/Icon.3_96.png b/dist/assets/icons/Icon.3_96.png deleted file mode 100644 index 84949163..00000000 Binary files a/dist/assets/icons/Icon.3_96.png and /dev/null differ diff --git a/dist/assets/icons/Icon.3_97.png b/dist/assets/icons/Icon.3_97.png deleted file mode 100644 index 70c4c5df..00000000 Binary files a/dist/assets/icons/Icon.3_97.png and /dev/null differ diff --git a/dist/assets/icons/Icon.3_98.png b/dist/assets/icons/Icon.3_98.png deleted file mode 100644 index fe95dd57..00000000 Binary files a/dist/assets/icons/Icon.3_98.png and /dev/null differ diff --git a/dist/assets/icons/Icon.3_99.png b/dist/assets/icons/Icon.3_99.png deleted file mode 100644 index d77ea171..00000000 Binary files a/dist/assets/icons/Icon.3_99.png and /dev/null differ diff --git a/dist/assets/icons/Icon.4_01.png b/dist/assets/icons/Icon.4_01.png deleted file mode 100644 index 027f00ed..00000000 Binary files a/dist/assets/icons/Icon.4_01.png and /dev/null differ diff --git a/dist/assets/icons/Icon.4_02.png b/dist/assets/icons/Icon.4_02.png deleted file mode 100644 index ab6f1063..00000000 Binary files a/dist/assets/icons/Icon.4_02.png and /dev/null differ diff --git a/dist/assets/icons/Icon.4_03.png b/dist/assets/icons/Icon.4_03.png deleted file mode 100644 index 0811ba2c..00000000 Binary files a/dist/assets/icons/Icon.4_03.png and /dev/null differ diff --git a/dist/assets/icons/Icon.4_04.png b/dist/assets/icons/Icon.4_04.png deleted file mode 100644 index 11717259..00000000 Binary files a/dist/assets/icons/Icon.4_04.png and /dev/null differ diff --git a/dist/assets/icons/Icon.4_05.png b/dist/assets/icons/Icon.4_05.png deleted file mode 100644 index 7443fb19..00000000 Binary files a/dist/assets/icons/Icon.4_05.png and /dev/null differ diff --git a/dist/assets/icons/Icon.4_06.png b/dist/assets/icons/Icon.4_06.png deleted file mode 100644 index 92d19258..00000000 Binary files a/dist/assets/icons/Icon.4_06.png and /dev/null differ diff --git a/dist/assets/icons/Icon.4_07.png b/dist/assets/icons/Icon.4_07.png deleted file mode 100644 index 9e8f0162..00000000 Binary files a/dist/assets/icons/Icon.4_07.png and /dev/null differ diff --git a/dist/assets/icons/Icon.4_08.png b/dist/assets/icons/Icon.4_08.png deleted file mode 100644 index 7d9abf46..00000000 Binary files a/dist/assets/icons/Icon.4_08.png and /dev/null differ diff --git a/dist/assets/icons/Icon.4_09.png b/dist/assets/icons/Icon.4_09.png deleted file mode 100644 index a43e18e0..00000000 Binary files a/dist/assets/icons/Icon.4_09.png and /dev/null differ diff --git a/dist/assets/icons/Icon.4_10.png b/dist/assets/icons/Icon.4_10.png deleted file mode 100644 index 6d638cf1..00000000 Binary files a/dist/assets/icons/Icon.4_10.png and /dev/null differ diff --git a/dist/assets/icons/Icon.4_100.png b/dist/assets/icons/Icon.4_100.png deleted file mode 100644 index ceabb908..00000000 Binary files a/dist/assets/icons/Icon.4_100.png and /dev/null differ diff --git a/dist/assets/icons/Icon.4_11.png b/dist/assets/icons/Icon.4_11.png deleted file mode 100644 index bd1dfe2d..00000000 Binary files a/dist/assets/icons/Icon.4_11.png and /dev/null differ diff --git a/dist/assets/icons/Icon.4_12.png b/dist/assets/icons/Icon.4_12.png deleted file mode 100644 index fd5076f3..00000000 Binary files a/dist/assets/icons/Icon.4_12.png and /dev/null differ diff --git a/dist/assets/icons/Icon.4_13.png b/dist/assets/icons/Icon.4_13.png deleted file mode 100644 index 25db8a0b..00000000 Binary files a/dist/assets/icons/Icon.4_13.png and /dev/null differ diff --git a/dist/assets/icons/Icon.4_14.png b/dist/assets/icons/Icon.4_14.png deleted file mode 100644 index d6f6d6dd..00000000 Binary files a/dist/assets/icons/Icon.4_14.png and /dev/null differ diff --git a/dist/assets/icons/Icon.4_15.png b/dist/assets/icons/Icon.4_15.png deleted file mode 100644 index 83ad2098..00000000 Binary files a/dist/assets/icons/Icon.4_15.png and /dev/null differ diff --git a/dist/assets/icons/Icon.4_16.png b/dist/assets/icons/Icon.4_16.png deleted file mode 100644 index 7a71b966..00000000 Binary files a/dist/assets/icons/Icon.4_16.png and /dev/null differ diff --git a/dist/assets/icons/Icon.4_17.png b/dist/assets/icons/Icon.4_17.png deleted file mode 100644 index 640c70ba..00000000 Binary files a/dist/assets/icons/Icon.4_17.png and /dev/null differ diff --git a/dist/assets/icons/Icon.4_18.png b/dist/assets/icons/Icon.4_18.png deleted file mode 100644 index 302251eb..00000000 Binary files a/dist/assets/icons/Icon.4_18.png and /dev/null differ diff --git a/dist/assets/icons/Icon.4_19.png b/dist/assets/icons/Icon.4_19.png deleted file mode 100644 index 83e70697..00000000 Binary files a/dist/assets/icons/Icon.4_19.png and /dev/null differ diff --git a/dist/assets/icons/Icon.4_20.png b/dist/assets/icons/Icon.4_20.png deleted file mode 100644 index dc1fa40c..00000000 Binary files a/dist/assets/icons/Icon.4_20.png and /dev/null differ diff --git a/dist/assets/icons/Icon.4_21.png b/dist/assets/icons/Icon.4_21.png deleted file mode 100644 index bba25420..00000000 Binary files a/dist/assets/icons/Icon.4_21.png and /dev/null differ diff --git a/dist/assets/icons/Icon.4_22.png b/dist/assets/icons/Icon.4_22.png deleted file mode 100644 index b586344e..00000000 Binary files a/dist/assets/icons/Icon.4_22.png and /dev/null differ diff --git a/dist/assets/icons/Icon.4_23.png b/dist/assets/icons/Icon.4_23.png deleted file mode 100644 index a438e7d3..00000000 Binary files a/dist/assets/icons/Icon.4_23.png and /dev/null differ diff --git a/dist/assets/icons/Icon.4_24.png b/dist/assets/icons/Icon.4_24.png deleted file mode 100644 index 0a8505bf..00000000 Binary files a/dist/assets/icons/Icon.4_24.png and /dev/null differ diff --git a/dist/assets/icons/Icon.4_25.png b/dist/assets/icons/Icon.4_25.png deleted file mode 100644 index 998a5515..00000000 Binary files a/dist/assets/icons/Icon.4_25.png and /dev/null differ diff --git a/dist/assets/icons/Icon.4_26.png b/dist/assets/icons/Icon.4_26.png deleted file mode 100644 index df749c5f..00000000 Binary files a/dist/assets/icons/Icon.4_26.png and /dev/null differ diff --git a/dist/assets/icons/Icon.4_27.png b/dist/assets/icons/Icon.4_27.png deleted file mode 100644 index 5a6a828a..00000000 Binary files a/dist/assets/icons/Icon.4_27.png and /dev/null differ diff --git a/dist/assets/icons/Icon.4_28.png b/dist/assets/icons/Icon.4_28.png deleted file mode 100644 index aacdba20..00000000 Binary files a/dist/assets/icons/Icon.4_28.png and /dev/null differ diff --git a/dist/assets/icons/Icon.4_29.png b/dist/assets/icons/Icon.4_29.png deleted file mode 100644 index b23254f3..00000000 Binary files a/dist/assets/icons/Icon.4_29.png and /dev/null differ diff --git a/dist/assets/icons/Icon.4_30.png b/dist/assets/icons/Icon.4_30.png deleted file mode 100644 index d4483618..00000000 Binary files a/dist/assets/icons/Icon.4_30.png and /dev/null differ diff --git a/dist/assets/icons/Icon.4_31.png b/dist/assets/icons/Icon.4_31.png deleted file mode 100644 index 1436ce61..00000000 Binary files a/dist/assets/icons/Icon.4_31.png and /dev/null differ diff --git a/dist/assets/icons/Icon.4_32.png b/dist/assets/icons/Icon.4_32.png deleted file mode 100644 index 74be89b6..00000000 Binary files a/dist/assets/icons/Icon.4_32.png and /dev/null differ diff --git a/dist/assets/icons/Icon.4_33.png b/dist/assets/icons/Icon.4_33.png deleted file mode 100644 index 8f641a7a..00000000 Binary files a/dist/assets/icons/Icon.4_33.png and /dev/null differ diff --git a/dist/assets/icons/Icon.4_34.png b/dist/assets/icons/Icon.4_34.png deleted file mode 100644 index c46668e6..00000000 Binary files a/dist/assets/icons/Icon.4_34.png and /dev/null differ diff --git a/dist/assets/icons/Icon.4_35.png b/dist/assets/icons/Icon.4_35.png deleted file mode 100644 index 27bc50d9..00000000 Binary files a/dist/assets/icons/Icon.4_35.png and /dev/null differ diff --git a/dist/assets/icons/Icon.4_36.png b/dist/assets/icons/Icon.4_36.png deleted file mode 100644 index cb4efe07..00000000 Binary files a/dist/assets/icons/Icon.4_36.png and /dev/null differ diff --git a/dist/assets/icons/Icon.4_37.png b/dist/assets/icons/Icon.4_37.png deleted file mode 100644 index a64f52aa..00000000 Binary files a/dist/assets/icons/Icon.4_37.png and /dev/null differ diff --git a/dist/assets/icons/Icon.4_38.png b/dist/assets/icons/Icon.4_38.png deleted file mode 100644 index 6d600fc0..00000000 Binary files a/dist/assets/icons/Icon.4_38.png and /dev/null differ diff --git a/dist/assets/icons/Icon.4_39.png b/dist/assets/icons/Icon.4_39.png deleted file mode 100644 index 5684f24b..00000000 Binary files a/dist/assets/icons/Icon.4_39.png and /dev/null differ diff --git a/dist/assets/icons/Icon.4_40.png b/dist/assets/icons/Icon.4_40.png deleted file mode 100644 index f0e02e97..00000000 Binary files a/dist/assets/icons/Icon.4_40.png and /dev/null differ diff --git a/dist/assets/icons/Icon.4_41.png b/dist/assets/icons/Icon.4_41.png deleted file mode 100644 index df14c0c3..00000000 Binary files a/dist/assets/icons/Icon.4_41.png and /dev/null differ diff --git a/dist/assets/icons/Icon.4_42.png b/dist/assets/icons/Icon.4_42.png deleted file mode 100644 index 926255ba..00000000 Binary files a/dist/assets/icons/Icon.4_42.png and /dev/null differ diff --git a/dist/assets/icons/Icon.4_43.png b/dist/assets/icons/Icon.4_43.png deleted file mode 100644 index 407d6f84..00000000 Binary files a/dist/assets/icons/Icon.4_43.png and /dev/null differ diff --git a/dist/assets/icons/Icon.4_44.png b/dist/assets/icons/Icon.4_44.png deleted file mode 100644 index d1fee00e..00000000 Binary files a/dist/assets/icons/Icon.4_44.png and /dev/null differ diff --git a/dist/assets/icons/Icon.4_45.png b/dist/assets/icons/Icon.4_45.png deleted file mode 100644 index e5f8dd42..00000000 Binary files a/dist/assets/icons/Icon.4_45.png and /dev/null differ diff --git a/dist/assets/icons/Icon.4_46.png b/dist/assets/icons/Icon.4_46.png deleted file mode 100644 index e127eae7..00000000 Binary files a/dist/assets/icons/Icon.4_46.png and /dev/null differ diff --git a/dist/assets/icons/Icon.4_47.png b/dist/assets/icons/Icon.4_47.png deleted file mode 100644 index 5c55da8e..00000000 Binary files a/dist/assets/icons/Icon.4_47.png and /dev/null differ diff --git a/dist/assets/icons/Icon.4_48.png b/dist/assets/icons/Icon.4_48.png deleted file mode 100644 index cb843804..00000000 Binary files a/dist/assets/icons/Icon.4_48.png and /dev/null differ diff --git a/dist/assets/icons/Icon.4_49.png b/dist/assets/icons/Icon.4_49.png deleted file mode 100644 index 5f409b9d..00000000 Binary files a/dist/assets/icons/Icon.4_49.png and /dev/null differ diff --git a/dist/assets/icons/Icon.4_50.png b/dist/assets/icons/Icon.4_50.png deleted file mode 100644 index 6d864247..00000000 Binary files a/dist/assets/icons/Icon.4_50.png and /dev/null differ diff --git a/dist/assets/icons/Icon.4_51.png b/dist/assets/icons/Icon.4_51.png deleted file mode 100644 index bfec42fd..00000000 Binary files a/dist/assets/icons/Icon.4_51.png and /dev/null differ diff --git a/dist/assets/icons/Icon.4_52.png b/dist/assets/icons/Icon.4_52.png deleted file mode 100644 index cfae65da..00000000 Binary files a/dist/assets/icons/Icon.4_52.png and /dev/null differ diff --git a/dist/assets/icons/Icon.4_53.png b/dist/assets/icons/Icon.4_53.png deleted file mode 100644 index f551acce..00000000 Binary files a/dist/assets/icons/Icon.4_53.png and /dev/null differ diff --git a/dist/assets/icons/Icon.4_54.png b/dist/assets/icons/Icon.4_54.png deleted file mode 100644 index 0e1a4718..00000000 Binary files a/dist/assets/icons/Icon.4_54.png and /dev/null differ diff --git a/dist/assets/icons/Icon.4_55.png b/dist/assets/icons/Icon.4_55.png deleted file mode 100644 index 654448cd..00000000 Binary files a/dist/assets/icons/Icon.4_55.png and /dev/null differ diff --git a/dist/assets/icons/Icon.4_56.png b/dist/assets/icons/Icon.4_56.png deleted file mode 100644 index d7567551..00000000 Binary files a/dist/assets/icons/Icon.4_56.png and /dev/null differ diff --git a/dist/assets/icons/Icon.4_57.png b/dist/assets/icons/Icon.4_57.png deleted file mode 100644 index 626526f7..00000000 Binary files a/dist/assets/icons/Icon.4_57.png and /dev/null differ diff --git a/dist/assets/icons/Icon.4_58.png b/dist/assets/icons/Icon.4_58.png deleted file mode 100644 index 07444fca..00000000 Binary files a/dist/assets/icons/Icon.4_58.png and /dev/null differ diff --git a/dist/assets/icons/Icon.4_59.png b/dist/assets/icons/Icon.4_59.png deleted file mode 100644 index a280139a..00000000 Binary files a/dist/assets/icons/Icon.4_59.png and /dev/null differ diff --git a/dist/assets/icons/Icon.4_60.png b/dist/assets/icons/Icon.4_60.png deleted file mode 100644 index cc7fff35..00000000 Binary files a/dist/assets/icons/Icon.4_60.png and /dev/null differ diff --git a/dist/assets/icons/Icon.4_61.png b/dist/assets/icons/Icon.4_61.png deleted file mode 100644 index 5d4ddcca..00000000 Binary files a/dist/assets/icons/Icon.4_61.png and /dev/null differ diff --git a/dist/assets/icons/Icon.4_62.png b/dist/assets/icons/Icon.4_62.png deleted file mode 100644 index 0b55f9dc..00000000 Binary files a/dist/assets/icons/Icon.4_62.png and /dev/null differ diff --git a/dist/assets/icons/Icon.4_63.png b/dist/assets/icons/Icon.4_63.png deleted file mode 100644 index 1cbf0208..00000000 Binary files a/dist/assets/icons/Icon.4_63.png and /dev/null differ diff --git a/dist/assets/icons/Icon.4_64.png b/dist/assets/icons/Icon.4_64.png deleted file mode 100644 index 7357baa2..00000000 Binary files a/dist/assets/icons/Icon.4_64.png and /dev/null differ diff --git a/dist/assets/icons/Icon.4_65.png b/dist/assets/icons/Icon.4_65.png deleted file mode 100644 index bb09e44e..00000000 Binary files a/dist/assets/icons/Icon.4_65.png and /dev/null differ diff --git a/dist/assets/icons/Icon.4_66.png b/dist/assets/icons/Icon.4_66.png deleted file mode 100644 index a60063a7..00000000 Binary files a/dist/assets/icons/Icon.4_66.png and /dev/null differ diff --git a/dist/assets/icons/Icon.4_67.png b/dist/assets/icons/Icon.4_67.png deleted file mode 100644 index 862d2812..00000000 Binary files a/dist/assets/icons/Icon.4_67.png and /dev/null differ diff --git a/dist/assets/icons/Icon.4_68.png b/dist/assets/icons/Icon.4_68.png deleted file mode 100644 index fbe3619e..00000000 Binary files a/dist/assets/icons/Icon.4_68.png and /dev/null differ diff --git a/dist/assets/icons/Icon.4_69.png b/dist/assets/icons/Icon.4_69.png deleted file mode 100644 index 0aeff54d..00000000 Binary files a/dist/assets/icons/Icon.4_69.png and /dev/null differ diff --git a/dist/assets/icons/Icon.4_70.png b/dist/assets/icons/Icon.4_70.png deleted file mode 100644 index 4111ac1d..00000000 Binary files a/dist/assets/icons/Icon.4_70.png and /dev/null differ diff --git a/dist/assets/icons/Icon.4_71.png b/dist/assets/icons/Icon.4_71.png deleted file mode 100644 index ff1761d5..00000000 Binary files a/dist/assets/icons/Icon.4_71.png and /dev/null differ diff --git a/dist/assets/icons/Icon.4_72.png b/dist/assets/icons/Icon.4_72.png deleted file mode 100644 index 0328fe6b..00000000 Binary files a/dist/assets/icons/Icon.4_72.png and /dev/null differ diff --git a/dist/assets/icons/Icon.4_73.png b/dist/assets/icons/Icon.4_73.png deleted file mode 100644 index b4909044..00000000 Binary files a/dist/assets/icons/Icon.4_73.png and /dev/null differ diff --git a/dist/assets/icons/Icon.4_74.png b/dist/assets/icons/Icon.4_74.png deleted file mode 100644 index 5a5dffb8..00000000 Binary files a/dist/assets/icons/Icon.4_74.png and /dev/null differ diff --git a/dist/assets/icons/Icon.4_75.png b/dist/assets/icons/Icon.4_75.png deleted file mode 100644 index c86f0874..00000000 Binary files a/dist/assets/icons/Icon.4_75.png and /dev/null differ diff --git a/dist/assets/icons/Icon.4_76.png b/dist/assets/icons/Icon.4_76.png deleted file mode 100644 index 9ebf909b..00000000 Binary files a/dist/assets/icons/Icon.4_76.png and /dev/null differ diff --git a/dist/assets/icons/Icon.4_77.png b/dist/assets/icons/Icon.4_77.png deleted file mode 100644 index eaaeae64..00000000 Binary files a/dist/assets/icons/Icon.4_77.png and /dev/null differ diff --git a/dist/assets/icons/Icon.4_78.png b/dist/assets/icons/Icon.4_78.png deleted file mode 100644 index 15357e99..00000000 Binary files a/dist/assets/icons/Icon.4_78.png and /dev/null differ diff --git a/dist/assets/icons/Icon.4_79.png b/dist/assets/icons/Icon.4_79.png deleted file mode 100644 index a274451e..00000000 Binary files a/dist/assets/icons/Icon.4_79.png and /dev/null differ diff --git a/dist/assets/icons/Icon.4_80.png b/dist/assets/icons/Icon.4_80.png deleted file mode 100644 index 33f4ab44..00000000 Binary files a/dist/assets/icons/Icon.4_80.png and /dev/null differ diff --git a/dist/assets/icons/Icon.4_81.png b/dist/assets/icons/Icon.4_81.png deleted file mode 100644 index eaf8223c..00000000 Binary files a/dist/assets/icons/Icon.4_81.png and /dev/null differ diff --git a/dist/assets/icons/Icon.4_82.png b/dist/assets/icons/Icon.4_82.png deleted file mode 100644 index fe3ec430..00000000 Binary files a/dist/assets/icons/Icon.4_82.png and /dev/null differ diff --git a/dist/assets/icons/Icon.4_83.png b/dist/assets/icons/Icon.4_83.png deleted file mode 100644 index 7babc732..00000000 Binary files a/dist/assets/icons/Icon.4_83.png and /dev/null differ diff --git a/dist/assets/icons/Icon.4_84.png b/dist/assets/icons/Icon.4_84.png deleted file mode 100644 index 00889f0c..00000000 Binary files a/dist/assets/icons/Icon.4_84.png and /dev/null differ diff --git a/dist/assets/icons/Icon.4_85.png b/dist/assets/icons/Icon.4_85.png deleted file mode 100644 index c87b5341..00000000 Binary files a/dist/assets/icons/Icon.4_85.png and /dev/null differ diff --git a/dist/assets/icons/Icon.4_86.png b/dist/assets/icons/Icon.4_86.png deleted file mode 100644 index 8499cabc..00000000 Binary files a/dist/assets/icons/Icon.4_86.png and /dev/null differ diff --git a/dist/assets/icons/Icon.4_87.png b/dist/assets/icons/Icon.4_87.png deleted file mode 100644 index a0f74191..00000000 Binary files a/dist/assets/icons/Icon.4_87.png and /dev/null differ diff --git a/dist/assets/icons/Icon.4_88.png b/dist/assets/icons/Icon.4_88.png deleted file mode 100644 index 44bfaab7..00000000 Binary files a/dist/assets/icons/Icon.4_88.png and /dev/null differ diff --git a/dist/assets/icons/Icon.4_89.png b/dist/assets/icons/Icon.4_89.png deleted file mode 100644 index 30a1d026..00000000 Binary files a/dist/assets/icons/Icon.4_89.png and /dev/null differ diff --git a/dist/assets/icons/Icon.4_90.png b/dist/assets/icons/Icon.4_90.png deleted file mode 100644 index fa2d2a06..00000000 Binary files a/dist/assets/icons/Icon.4_90.png and /dev/null differ diff --git a/dist/assets/icons/Icon.4_91.png b/dist/assets/icons/Icon.4_91.png deleted file mode 100644 index 4be990ca..00000000 Binary files a/dist/assets/icons/Icon.4_91.png and /dev/null differ diff --git a/dist/assets/icons/Icon.4_92.png b/dist/assets/icons/Icon.4_92.png deleted file mode 100644 index e870d919..00000000 Binary files a/dist/assets/icons/Icon.4_92.png and /dev/null differ diff --git a/dist/assets/icons/Icon.4_93.png b/dist/assets/icons/Icon.4_93.png deleted file mode 100644 index 21531600..00000000 Binary files a/dist/assets/icons/Icon.4_93.png and /dev/null differ diff --git a/dist/assets/icons/Icon.4_94.png b/dist/assets/icons/Icon.4_94.png deleted file mode 100644 index e6a0ba70..00000000 Binary files a/dist/assets/icons/Icon.4_94.png and /dev/null differ diff --git a/dist/assets/icons/Icon.4_95.png b/dist/assets/icons/Icon.4_95.png deleted file mode 100644 index 9077dc28..00000000 Binary files a/dist/assets/icons/Icon.4_95.png and /dev/null differ diff --git a/dist/assets/icons/Icon.4_96.png b/dist/assets/icons/Icon.4_96.png deleted file mode 100644 index 5dd42077..00000000 Binary files a/dist/assets/icons/Icon.4_96.png and /dev/null differ diff --git a/dist/assets/icons/Icon.4_97.png b/dist/assets/icons/Icon.4_97.png deleted file mode 100644 index 7173a952..00000000 Binary files a/dist/assets/icons/Icon.4_97.png and /dev/null differ diff --git a/dist/assets/icons/Icon.4_98.png b/dist/assets/icons/Icon.4_98.png deleted file mode 100644 index 26e918b9..00000000 Binary files a/dist/assets/icons/Icon.4_98.png and /dev/null differ diff --git a/dist/assets/icons/Icon.4_99.png b/dist/assets/icons/Icon.4_99.png deleted file mode 100644 index c77f4d28..00000000 Binary files a/dist/assets/icons/Icon.4_99.png and /dev/null differ diff --git a/dist/assets/icons/Icon.5_01.png b/dist/assets/icons/Icon.5_01.png deleted file mode 100644 index 6a6f8fb2..00000000 Binary files a/dist/assets/icons/Icon.5_01.png and /dev/null differ diff --git a/dist/assets/icons/Icon.5_02.png b/dist/assets/icons/Icon.5_02.png deleted file mode 100644 index 97d4f25e..00000000 Binary files a/dist/assets/icons/Icon.5_02.png and /dev/null differ diff --git a/dist/assets/icons/Icon.5_03.png b/dist/assets/icons/Icon.5_03.png deleted file mode 100644 index 16100efd..00000000 Binary files a/dist/assets/icons/Icon.5_03.png and /dev/null differ diff --git a/dist/assets/icons/Icon.5_04.png b/dist/assets/icons/Icon.5_04.png deleted file mode 100644 index 0cd68e29..00000000 Binary files a/dist/assets/icons/Icon.5_04.png and /dev/null differ diff --git a/dist/assets/icons/Icon.5_05.png b/dist/assets/icons/Icon.5_05.png deleted file mode 100644 index 13a2a286..00000000 Binary files a/dist/assets/icons/Icon.5_05.png and /dev/null differ diff --git a/dist/assets/icons/Icon.5_06.png b/dist/assets/icons/Icon.5_06.png deleted file mode 100644 index b0e15c40..00000000 Binary files a/dist/assets/icons/Icon.5_06.png and /dev/null differ diff --git a/dist/assets/icons/Icon.5_07.png b/dist/assets/icons/Icon.5_07.png deleted file mode 100644 index f4d730b6..00000000 Binary files a/dist/assets/icons/Icon.5_07.png and /dev/null differ diff --git a/dist/assets/icons/Icon.5_08.png b/dist/assets/icons/Icon.5_08.png deleted file mode 100644 index 1a6542ec..00000000 Binary files a/dist/assets/icons/Icon.5_08.png and /dev/null differ diff --git a/dist/assets/icons/Icon.5_09.png b/dist/assets/icons/Icon.5_09.png deleted file mode 100644 index e311b328..00000000 Binary files a/dist/assets/icons/Icon.5_09.png and /dev/null differ diff --git a/dist/assets/icons/Icon.5_10.png b/dist/assets/icons/Icon.5_10.png deleted file mode 100644 index 1df0a197..00000000 Binary files a/dist/assets/icons/Icon.5_10.png and /dev/null differ diff --git a/dist/assets/icons/Icon.5_100.png b/dist/assets/icons/Icon.5_100.png deleted file mode 100644 index 0e3fcb68..00000000 Binary files a/dist/assets/icons/Icon.5_100.png and /dev/null differ diff --git a/dist/assets/icons/Icon.5_11.png b/dist/assets/icons/Icon.5_11.png deleted file mode 100644 index 495859b2..00000000 Binary files a/dist/assets/icons/Icon.5_11.png and /dev/null differ diff --git a/dist/assets/icons/Icon.5_12.png b/dist/assets/icons/Icon.5_12.png deleted file mode 100644 index c7355e77..00000000 Binary files a/dist/assets/icons/Icon.5_12.png and /dev/null differ diff --git a/dist/assets/icons/Icon.5_13.png b/dist/assets/icons/Icon.5_13.png deleted file mode 100644 index 173584b7..00000000 Binary files a/dist/assets/icons/Icon.5_13.png and /dev/null differ diff --git a/dist/assets/icons/Icon.5_14.png b/dist/assets/icons/Icon.5_14.png deleted file mode 100644 index e5504cfb..00000000 Binary files a/dist/assets/icons/Icon.5_14.png and /dev/null differ diff --git a/dist/assets/icons/Icon.5_15.png b/dist/assets/icons/Icon.5_15.png deleted file mode 100644 index 076637c7..00000000 Binary files a/dist/assets/icons/Icon.5_15.png and /dev/null differ diff --git a/dist/assets/icons/Icon.5_16.png b/dist/assets/icons/Icon.5_16.png deleted file mode 100644 index 54bb85cb..00000000 Binary files a/dist/assets/icons/Icon.5_16.png and /dev/null differ diff --git a/dist/assets/icons/Icon.5_17.png b/dist/assets/icons/Icon.5_17.png deleted file mode 100644 index c3c4416a..00000000 Binary files a/dist/assets/icons/Icon.5_17.png and /dev/null differ diff --git a/dist/assets/icons/Icon.5_18.png b/dist/assets/icons/Icon.5_18.png deleted file mode 100644 index f2f45e2d..00000000 Binary files a/dist/assets/icons/Icon.5_18.png and /dev/null differ diff --git a/dist/assets/icons/Icon.5_19.png b/dist/assets/icons/Icon.5_19.png deleted file mode 100644 index 8aaa9316..00000000 Binary files a/dist/assets/icons/Icon.5_19.png and /dev/null differ diff --git a/dist/assets/icons/Icon.5_20.png b/dist/assets/icons/Icon.5_20.png deleted file mode 100644 index 79f59418..00000000 Binary files a/dist/assets/icons/Icon.5_20.png and /dev/null differ diff --git a/dist/assets/icons/Icon.5_21.png b/dist/assets/icons/Icon.5_21.png deleted file mode 100644 index 9fad261e..00000000 Binary files a/dist/assets/icons/Icon.5_21.png and /dev/null differ diff --git a/dist/assets/icons/Icon.5_22.png b/dist/assets/icons/Icon.5_22.png deleted file mode 100644 index 9c29ff1f..00000000 Binary files a/dist/assets/icons/Icon.5_22.png and /dev/null differ diff --git a/dist/assets/icons/Icon.5_23.png b/dist/assets/icons/Icon.5_23.png deleted file mode 100644 index 9769a854..00000000 Binary files a/dist/assets/icons/Icon.5_23.png and /dev/null differ diff --git a/dist/assets/icons/Icon.5_24.png b/dist/assets/icons/Icon.5_24.png deleted file mode 100644 index 4e256e91..00000000 Binary files a/dist/assets/icons/Icon.5_24.png and /dev/null differ diff --git a/dist/assets/icons/Icon.5_25.png b/dist/assets/icons/Icon.5_25.png deleted file mode 100644 index a0c5fdfc..00000000 Binary files a/dist/assets/icons/Icon.5_25.png and /dev/null differ diff --git a/dist/assets/icons/Icon.5_26.png b/dist/assets/icons/Icon.5_26.png deleted file mode 100644 index 5aed0d1d..00000000 Binary files a/dist/assets/icons/Icon.5_26.png and /dev/null differ diff --git a/dist/assets/icons/Icon.5_27.png b/dist/assets/icons/Icon.5_27.png deleted file mode 100644 index 08b29b68..00000000 Binary files a/dist/assets/icons/Icon.5_27.png and /dev/null differ diff --git a/dist/assets/icons/Icon.5_28.png b/dist/assets/icons/Icon.5_28.png deleted file mode 100644 index 3e4de356..00000000 Binary files a/dist/assets/icons/Icon.5_28.png and /dev/null differ diff --git a/dist/assets/icons/Icon.5_29.png b/dist/assets/icons/Icon.5_29.png deleted file mode 100644 index 7f5b58a8..00000000 Binary files a/dist/assets/icons/Icon.5_29.png and /dev/null differ diff --git a/dist/assets/icons/Icon.5_30.png b/dist/assets/icons/Icon.5_30.png deleted file mode 100644 index 7004d61d..00000000 Binary files a/dist/assets/icons/Icon.5_30.png and /dev/null differ diff --git a/dist/assets/icons/Icon.5_31.png b/dist/assets/icons/Icon.5_31.png deleted file mode 100644 index 4ed6f8d2..00000000 Binary files a/dist/assets/icons/Icon.5_31.png and /dev/null differ diff --git a/dist/assets/icons/Icon.5_32.png b/dist/assets/icons/Icon.5_32.png deleted file mode 100644 index fcf792bd..00000000 Binary files a/dist/assets/icons/Icon.5_32.png and /dev/null differ diff --git a/dist/assets/icons/Icon.5_33.png b/dist/assets/icons/Icon.5_33.png deleted file mode 100644 index 557da951..00000000 Binary files a/dist/assets/icons/Icon.5_33.png and /dev/null differ diff --git a/dist/assets/icons/Icon.5_34.png b/dist/assets/icons/Icon.5_34.png deleted file mode 100644 index 1290a3fd..00000000 Binary files a/dist/assets/icons/Icon.5_34.png and /dev/null differ diff --git a/dist/assets/icons/Icon.5_35.png b/dist/assets/icons/Icon.5_35.png deleted file mode 100644 index 89530f08..00000000 Binary files a/dist/assets/icons/Icon.5_35.png and /dev/null differ diff --git a/dist/assets/icons/Icon.5_36.png b/dist/assets/icons/Icon.5_36.png deleted file mode 100644 index 7f96ed71..00000000 Binary files a/dist/assets/icons/Icon.5_36.png and /dev/null differ diff --git a/dist/assets/icons/Icon.5_37.png b/dist/assets/icons/Icon.5_37.png deleted file mode 100644 index c2468c8c..00000000 Binary files a/dist/assets/icons/Icon.5_37.png and /dev/null differ diff --git a/dist/assets/icons/Icon.5_38.png b/dist/assets/icons/Icon.5_38.png deleted file mode 100644 index 8f2d435b..00000000 Binary files a/dist/assets/icons/Icon.5_38.png and /dev/null differ diff --git a/dist/assets/icons/Icon.5_39.png b/dist/assets/icons/Icon.5_39.png deleted file mode 100644 index c5ab3fa1..00000000 Binary files a/dist/assets/icons/Icon.5_39.png and /dev/null differ diff --git a/dist/assets/icons/Icon.5_40.png b/dist/assets/icons/Icon.5_40.png deleted file mode 100644 index 965ec84c..00000000 Binary files a/dist/assets/icons/Icon.5_40.png and /dev/null differ diff --git a/dist/assets/icons/Icon.5_41.png b/dist/assets/icons/Icon.5_41.png deleted file mode 100644 index aa7a0c82..00000000 Binary files a/dist/assets/icons/Icon.5_41.png and /dev/null differ diff --git a/dist/assets/icons/Icon.5_42.png b/dist/assets/icons/Icon.5_42.png deleted file mode 100644 index 6f58a75a..00000000 Binary files a/dist/assets/icons/Icon.5_42.png and /dev/null differ diff --git a/dist/assets/icons/Icon.5_43.png b/dist/assets/icons/Icon.5_43.png deleted file mode 100644 index 44748c9a..00000000 Binary files a/dist/assets/icons/Icon.5_43.png and /dev/null differ diff --git a/dist/assets/icons/Icon.5_44.png b/dist/assets/icons/Icon.5_44.png deleted file mode 100644 index f713c7e7..00000000 Binary files a/dist/assets/icons/Icon.5_44.png and /dev/null differ diff --git a/dist/assets/icons/Icon.5_45.png b/dist/assets/icons/Icon.5_45.png deleted file mode 100644 index 85d49e56..00000000 Binary files a/dist/assets/icons/Icon.5_45.png and /dev/null differ diff --git a/dist/assets/icons/Icon.5_46.png b/dist/assets/icons/Icon.5_46.png deleted file mode 100644 index 03f62688..00000000 Binary files a/dist/assets/icons/Icon.5_46.png and /dev/null differ diff --git a/dist/assets/icons/Icon.5_47.png b/dist/assets/icons/Icon.5_47.png deleted file mode 100644 index ee279413..00000000 Binary files a/dist/assets/icons/Icon.5_47.png and /dev/null differ diff --git a/dist/assets/icons/Icon.5_48.png b/dist/assets/icons/Icon.5_48.png deleted file mode 100644 index f2960af4..00000000 Binary files a/dist/assets/icons/Icon.5_48.png and /dev/null differ diff --git a/dist/assets/icons/Icon.5_49.png b/dist/assets/icons/Icon.5_49.png deleted file mode 100644 index 9f80e6ea..00000000 Binary files a/dist/assets/icons/Icon.5_49.png and /dev/null differ diff --git a/dist/assets/icons/Icon.5_50.png b/dist/assets/icons/Icon.5_50.png deleted file mode 100644 index e53e39bc..00000000 Binary files a/dist/assets/icons/Icon.5_50.png and /dev/null differ diff --git a/dist/assets/icons/Icon.5_51.png b/dist/assets/icons/Icon.5_51.png deleted file mode 100644 index a68939b9..00000000 Binary files a/dist/assets/icons/Icon.5_51.png and /dev/null differ diff --git a/dist/assets/icons/Icon.5_52.png b/dist/assets/icons/Icon.5_52.png deleted file mode 100644 index d6b6c0e6..00000000 Binary files a/dist/assets/icons/Icon.5_52.png and /dev/null differ diff --git a/dist/assets/icons/Icon.5_53.png b/dist/assets/icons/Icon.5_53.png deleted file mode 100644 index 75135934..00000000 Binary files a/dist/assets/icons/Icon.5_53.png and /dev/null differ diff --git a/dist/assets/icons/Icon.5_54.png b/dist/assets/icons/Icon.5_54.png deleted file mode 100644 index 35416102..00000000 Binary files a/dist/assets/icons/Icon.5_54.png and /dev/null differ diff --git a/dist/assets/icons/Icon.5_55.png b/dist/assets/icons/Icon.5_55.png deleted file mode 100644 index 2def95ea..00000000 Binary files a/dist/assets/icons/Icon.5_55.png and /dev/null differ diff --git a/dist/assets/icons/Icon.5_56.png b/dist/assets/icons/Icon.5_56.png deleted file mode 100644 index e57ecf78..00000000 Binary files a/dist/assets/icons/Icon.5_56.png and /dev/null differ diff --git a/dist/assets/icons/Icon.5_57.png b/dist/assets/icons/Icon.5_57.png deleted file mode 100644 index c5b1c1bc..00000000 Binary files a/dist/assets/icons/Icon.5_57.png and /dev/null differ diff --git a/dist/assets/icons/Icon.5_58.png b/dist/assets/icons/Icon.5_58.png deleted file mode 100644 index 4534d13a..00000000 Binary files a/dist/assets/icons/Icon.5_58.png and /dev/null differ diff --git a/dist/assets/icons/Icon.5_59.png b/dist/assets/icons/Icon.5_59.png deleted file mode 100644 index 4722166d..00000000 Binary files a/dist/assets/icons/Icon.5_59.png and /dev/null differ diff --git a/dist/assets/icons/Icon.5_60.png b/dist/assets/icons/Icon.5_60.png deleted file mode 100644 index 88aa1004..00000000 Binary files a/dist/assets/icons/Icon.5_60.png and /dev/null differ diff --git a/dist/assets/icons/Icon.5_61.png b/dist/assets/icons/Icon.5_61.png deleted file mode 100644 index be859f4e..00000000 Binary files a/dist/assets/icons/Icon.5_61.png and /dev/null differ diff --git a/dist/assets/icons/Icon.5_62.png b/dist/assets/icons/Icon.5_62.png deleted file mode 100644 index c90e34e2..00000000 Binary files a/dist/assets/icons/Icon.5_62.png and /dev/null differ diff --git a/dist/assets/icons/Icon.5_63.png b/dist/assets/icons/Icon.5_63.png deleted file mode 100644 index ed0f7787..00000000 Binary files a/dist/assets/icons/Icon.5_63.png and /dev/null differ diff --git a/dist/assets/icons/Icon.5_64.png b/dist/assets/icons/Icon.5_64.png deleted file mode 100644 index f2bd0eb6..00000000 Binary files a/dist/assets/icons/Icon.5_64.png and /dev/null differ diff --git a/dist/assets/icons/Icon.5_65.png b/dist/assets/icons/Icon.5_65.png deleted file mode 100644 index 17b97d54..00000000 Binary files a/dist/assets/icons/Icon.5_65.png and /dev/null differ diff --git a/dist/assets/icons/Icon.5_66.png b/dist/assets/icons/Icon.5_66.png deleted file mode 100644 index 2ee8f70c..00000000 Binary files a/dist/assets/icons/Icon.5_66.png and /dev/null differ diff --git a/dist/assets/icons/Icon.5_67.png b/dist/assets/icons/Icon.5_67.png deleted file mode 100644 index 9a7cfa11..00000000 Binary files a/dist/assets/icons/Icon.5_67.png and /dev/null differ diff --git a/dist/assets/icons/Icon.5_68.png b/dist/assets/icons/Icon.5_68.png deleted file mode 100644 index ede4dddf..00000000 Binary files a/dist/assets/icons/Icon.5_68.png and /dev/null differ diff --git a/dist/assets/icons/Icon.5_69.png b/dist/assets/icons/Icon.5_69.png deleted file mode 100644 index 738d0636..00000000 Binary files a/dist/assets/icons/Icon.5_69.png and /dev/null differ diff --git a/dist/assets/icons/Icon.5_70.png b/dist/assets/icons/Icon.5_70.png deleted file mode 100644 index 26ba13f5..00000000 Binary files a/dist/assets/icons/Icon.5_70.png and /dev/null differ diff --git a/dist/assets/icons/Icon.5_71.png b/dist/assets/icons/Icon.5_71.png deleted file mode 100644 index 0d42cce6..00000000 Binary files a/dist/assets/icons/Icon.5_71.png and /dev/null differ diff --git a/dist/assets/icons/Icon.5_72.png b/dist/assets/icons/Icon.5_72.png deleted file mode 100644 index f5769e92..00000000 Binary files a/dist/assets/icons/Icon.5_72.png and /dev/null differ diff --git a/dist/assets/icons/Icon.5_74.png b/dist/assets/icons/Icon.5_74.png deleted file mode 100644 index 0d42b26b..00000000 Binary files a/dist/assets/icons/Icon.5_74.png and /dev/null differ diff --git a/dist/assets/icons/Icon.5_75.png b/dist/assets/icons/Icon.5_75.png deleted file mode 100644 index 46f7f5ad..00000000 Binary files a/dist/assets/icons/Icon.5_75.png and /dev/null differ diff --git a/dist/assets/icons/Icon.5_76.png b/dist/assets/icons/Icon.5_76.png deleted file mode 100644 index 037e42e0..00000000 Binary files a/dist/assets/icons/Icon.5_76.png and /dev/null differ diff --git a/dist/assets/icons/Icon.5_77.png b/dist/assets/icons/Icon.5_77.png deleted file mode 100644 index 7069caee..00000000 Binary files a/dist/assets/icons/Icon.5_77.png and /dev/null differ diff --git a/dist/assets/icons/Icon.5_78.png b/dist/assets/icons/Icon.5_78.png deleted file mode 100644 index 53cba6a1..00000000 Binary files a/dist/assets/icons/Icon.5_78.png and /dev/null differ diff --git a/dist/assets/icons/Icon.5_79.png b/dist/assets/icons/Icon.5_79.png deleted file mode 100644 index 191bfae9..00000000 Binary files a/dist/assets/icons/Icon.5_79.png and /dev/null differ diff --git a/dist/assets/icons/Icon.5_80.png b/dist/assets/icons/Icon.5_80.png deleted file mode 100644 index a790f919..00000000 Binary files a/dist/assets/icons/Icon.5_80.png and /dev/null differ diff --git a/dist/assets/icons/Icon.5_81.png b/dist/assets/icons/Icon.5_81.png deleted file mode 100644 index 10e5a8bd..00000000 Binary files a/dist/assets/icons/Icon.5_81.png and /dev/null differ diff --git a/dist/assets/icons/Icon.5_82.png b/dist/assets/icons/Icon.5_82.png deleted file mode 100644 index fcbadde1..00000000 Binary files a/dist/assets/icons/Icon.5_82.png and /dev/null differ diff --git a/dist/assets/icons/Icon.5_83.png b/dist/assets/icons/Icon.5_83.png deleted file mode 100644 index a3cd9be2..00000000 Binary files a/dist/assets/icons/Icon.5_83.png and /dev/null differ diff --git a/dist/assets/icons/Icon.5_84.png b/dist/assets/icons/Icon.5_84.png deleted file mode 100644 index 6027fb1d..00000000 Binary files a/dist/assets/icons/Icon.5_84.png and /dev/null differ diff --git a/dist/assets/icons/Icon.5_85.png b/dist/assets/icons/Icon.5_85.png deleted file mode 100644 index 06e63e57..00000000 Binary files a/dist/assets/icons/Icon.5_85.png and /dev/null differ diff --git a/dist/assets/icons/Icon.5_86.png b/dist/assets/icons/Icon.5_86.png deleted file mode 100644 index b686aa75..00000000 Binary files a/dist/assets/icons/Icon.5_86.png and /dev/null differ diff --git a/dist/assets/icons/Icon.5_87.png b/dist/assets/icons/Icon.5_87.png deleted file mode 100644 index ff7b4966..00000000 Binary files a/dist/assets/icons/Icon.5_87.png and /dev/null differ diff --git a/dist/assets/icons/Icon.5_88.png b/dist/assets/icons/Icon.5_88.png deleted file mode 100644 index d54c1ee8..00000000 Binary files a/dist/assets/icons/Icon.5_88.png and /dev/null differ diff --git a/dist/assets/icons/Icon.5_89.png b/dist/assets/icons/Icon.5_89.png deleted file mode 100644 index 608a91c6..00000000 Binary files a/dist/assets/icons/Icon.5_89.png and /dev/null differ diff --git a/dist/assets/icons/Icon.5_90.png b/dist/assets/icons/Icon.5_90.png deleted file mode 100644 index 84aede3a..00000000 Binary files a/dist/assets/icons/Icon.5_90.png and /dev/null differ diff --git a/dist/assets/icons/Icon.5_91.png b/dist/assets/icons/Icon.5_91.png deleted file mode 100644 index e67889d0..00000000 Binary files a/dist/assets/icons/Icon.5_91.png and /dev/null differ diff --git a/dist/assets/icons/Icon.5_92.png b/dist/assets/icons/Icon.5_92.png deleted file mode 100644 index 37fae52f..00000000 Binary files a/dist/assets/icons/Icon.5_92.png and /dev/null differ diff --git a/dist/assets/icons/Icon.5_93.png b/dist/assets/icons/Icon.5_93.png deleted file mode 100644 index 94861181..00000000 Binary files a/dist/assets/icons/Icon.5_93.png and /dev/null differ diff --git a/dist/assets/icons/Icon.5_94.png b/dist/assets/icons/Icon.5_94.png deleted file mode 100644 index c45f3b9f..00000000 Binary files a/dist/assets/icons/Icon.5_94.png and /dev/null differ diff --git a/dist/assets/icons/Icon.5_95.png b/dist/assets/icons/Icon.5_95.png deleted file mode 100644 index 44085906..00000000 Binary files a/dist/assets/icons/Icon.5_95.png and /dev/null differ diff --git a/dist/assets/icons/Icon.5_96.png b/dist/assets/icons/Icon.5_96.png deleted file mode 100644 index e790ac07..00000000 Binary files a/dist/assets/icons/Icon.5_96.png and /dev/null differ diff --git a/dist/assets/icons/Icon.5_97.png b/dist/assets/icons/Icon.5_97.png deleted file mode 100644 index 43112ee4..00000000 Binary files a/dist/assets/icons/Icon.5_97.png and /dev/null differ diff --git a/dist/assets/icons/Icon.5_98.png b/dist/assets/icons/Icon.5_98.png deleted file mode 100644 index 834cc39e..00000000 Binary files a/dist/assets/icons/Icon.5_98.png and /dev/null differ diff --git a/dist/assets/icons/Icon.5_99.png b/dist/assets/icons/Icon.5_99.png deleted file mode 100644 index c1f4e417..00000000 Binary files a/dist/assets/icons/Icon.5_99.png and /dev/null differ diff --git a/dist/assets/icons/Icon.6_01.png b/dist/assets/icons/Icon.6_01.png deleted file mode 100644 index e78bccdc..00000000 Binary files a/dist/assets/icons/Icon.6_01.png and /dev/null differ diff --git a/dist/assets/icons/Icon.6_02.png b/dist/assets/icons/Icon.6_02.png deleted file mode 100644 index 9096187f..00000000 Binary files a/dist/assets/icons/Icon.6_02.png and /dev/null differ diff --git a/dist/assets/icons/Icon.6_03.png b/dist/assets/icons/Icon.6_03.png deleted file mode 100644 index 020252d6..00000000 Binary files a/dist/assets/icons/Icon.6_03.png and /dev/null differ diff --git a/dist/assets/icons/Icon.6_04.png b/dist/assets/icons/Icon.6_04.png deleted file mode 100644 index 59bb2340..00000000 Binary files a/dist/assets/icons/Icon.6_04.png and /dev/null differ diff --git a/dist/assets/icons/Icon.6_05.png b/dist/assets/icons/Icon.6_05.png deleted file mode 100644 index f887b4f5..00000000 Binary files a/dist/assets/icons/Icon.6_05.png and /dev/null differ diff --git a/dist/assets/icons/Icon.6_06.png b/dist/assets/icons/Icon.6_06.png deleted file mode 100644 index fce60a77..00000000 Binary files a/dist/assets/icons/Icon.6_06.png and /dev/null differ diff --git a/dist/assets/icons/Icon.6_07.png b/dist/assets/icons/Icon.6_07.png deleted file mode 100644 index 10c9c088..00000000 Binary files a/dist/assets/icons/Icon.6_07.png and /dev/null differ diff --git a/dist/assets/icons/Icon.6_08.png b/dist/assets/icons/Icon.6_08.png deleted file mode 100644 index aa9fad14..00000000 Binary files a/dist/assets/icons/Icon.6_08.png and /dev/null differ diff --git a/dist/assets/icons/Icon.6_09.png b/dist/assets/icons/Icon.6_09.png deleted file mode 100644 index 1d6041f8..00000000 Binary files a/dist/assets/icons/Icon.6_09.png and /dev/null differ diff --git a/dist/assets/icons/Icon.6_10.png b/dist/assets/icons/Icon.6_10.png deleted file mode 100644 index d58c7f8e..00000000 Binary files a/dist/assets/icons/Icon.6_10.png and /dev/null differ diff --git a/dist/assets/icons/Icon.6_100.png b/dist/assets/icons/Icon.6_100.png deleted file mode 100644 index 22885178..00000000 Binary files a/dist/assets/icons/Icon.6_100.png and /dev/null differ diff --git a/dist/assets/icons/Icon.6_11.png b/dist/assets/icons/Icon.6_11.png deleted file mode 100644 index 796784e1..00000000 Binary files a/dist/assets/icons/Icon.6_11.png and /dev/null differ diff --git a/dist/assets/icons/Icon.6_12.png b/dist/assets/icons/Icon.6_12.png deleted file mode 100644 index 36718559..00000000 Binary files a/dist/assets/icons/Icon.6_12.png and /dev/null differ diff --git a/dist/assets/icons/Icon.6_13.png b/dist/assets/icons/Icon.6_13.png deleted file mode 100644 index 8aae9287..00000000 Binary files a/dist/assets/icons/Icon.6_13.png and /dev/null differ diff --git a/dist/assets/icons/Icon.6_14.png b/dist/assets/icons/Icon.6_14.png deleted file mode 100644 index b4896af9..00000000 Binary files a/dist/assets/icons/Icon.6_14.png and /dev/null differ diff --git a/dist/assets/icons/Icon.6_15.png b/dist/assets/icons/Icon.6_15.png deleted file mode 100644 index 582bfe02..00000000 Binary files a/dist/assets/icons/Icon.6_15.png and /dev/null differ diff --git a/dist/assets/icons/Icon.6_16.png b/dist/assets/icons/Icon.6_16.png deleted file mode 100644 index 47f54df7..00000000 Binary files a/dist/assets/icons/Icon.6_16.png and /dev/null differ diff --git a/dist/assets/icons/Icon.6_17.png b/dist/assets/icons/Icon.6_17.png deleted file mode 100644 index 0be6aea7..00000000 Binary files a/dist/assets/icons/Icon.6_17.png and /dev/null differ diff --git a/dist/assets/icons/Icon.6_19.png b/dist/assets/icons/Icon.6_19.png deleted file mode 100644 index 1a75e9f6..00000000 Binary files a/dist/assets/icons/Icon.6_19.png and /dev/null differ diff --git a/dist/assets/icons/Icon.6_20.png b/dist/assets/icons/Icon.6_20.png deleted file mode 100644 index 35294867..00000000 Binary files a/dist/assets/icons/Icon.6_20.png and /dev/null differ diff --git a/dist/assets/icons/Icon.6_21.png b/dist/assets/icons/Icon.6_21.png deleted file mode 100644 index 71e437b4..00000000 Binary files a/dist/assets/icons/Icon.6_21.png and /dev/null differ diff --git a/dist/assets/icons/Icon.6_22.png b/dist/assets/icons/Icon.6_22.png deleted file mode 100644 index c0f27679..00000000 Binary files a/dist/assets/icons/Icon.6_22.png and /dev/null differ diff --git a/dist/assets/icons/Icon.6_23.png b/dist/assets/icons/Icon.6_23.png deleted file mode 100644 index 604a3552..00000000 Binary files a/dist/assets/icons/Icon.6_23.png and /dev/null differ diff --git a/dist/assets/icons/Icon.6_24.png b/dist/assets/icons/Icon.6_24.png deleted file mode 100644 index f48871ca..00000000 Binary files a/dist/assets/icons/Icon.6_24.png and /dev/null differ diff --git a/dist/assets/icons/Icon.6_25.png b/dist/assets/icons/Icon.6_25.png deleted file mode 100644 index a5677a76..00000000 Binary files a/dist/assets/icons/Icon.6_25.png and /dev/null differ diff --git a/dist/assets/icons/Icon.6_26.png b/dist/assets/icons/Icon.6_26.png deleted file mode 100644 index 5beba22d..00000000 Binary files a/dist/assets/icons/Icon.6_26.png and /dev/null differ diff --git a/dist/assets/icons/Icon.6_27.png b/dist/assets/icons/Icon.6_27.png deleted file mode 100644 index 6ed0ad8d..00000000 Binary files a/dist/assets/icons/Icon.6_27.png and /dev/null differ diff --git a/dist/assets/icons/Icon.6_28.png b/dist/assets/icons/Icon.6_28.png deleted file mode 100644 index 8b488efc..00000000 Binary files a/dist/assets/icons/Icon.6_28.png and /dev/null differ diff --git a/dist/assets/icons/Icon.6_29.png b/dist/assets/icons/Icon.6_29.png deleted file mode 100644 index 4b2277b8..00000000 Binary files a/dist/assets/icons/Icon.6_29.png and /dev/null differ diff --git a/dist/assets/icons/Icon.6_30.png b/dist/assets/icons/Icon.6_30.png deleted file mode 100644 index 092187d8..00000000 Binary files a/dist/assets/icons/Icon.6_30.png and /dev/null differ diff --git a/dist/assets/icons/Icon.6_31.png b/dist/assets/icons/Icon.6_31.png deleted file mode 100644 index 892f87c8..00000000 Binary files a/dist/assets/icons/Icon.6_31.png and /dev/null differ diff --git a/dist/assets/icons/Icon.6_32.png b/dist/assets/icons/Icon.6_32.png deleted file mode 100644 index 9ba6afaf..00000000 Binary files a/dist/assets/icons/Icon.6_32.png and /dev/null differ diff --git a/dist/assets/icons/Icon.6_33.png b/dist/assets/icons/Icon.6_33.png deleted file mode 100644 index 3f4cc4ce..00000000 Binary files a/dist/assets/icons/Icon.6_33.png and /dev/null differ diff --git a/dist/assets/icons/Icon.6_34.png b/dist/assets/icons/Icon.6_34.png deleted file mode 100644 index 45c80fc3..00000000 Binary files a/dist/assets/icons/Icon.6_34.png and /dev/null differ diff --git a/dist/assets/icons/Icon.6_35.png b/dist/assets/icons/Icon.6_35.png deleted file mode 100644 index e2488d5c..00000000 Binary files a/dist/assets/icons/Icon.6_35.png and /dev/null differ diff --git a/dist/assets/icons/Icon.6_36.png b/dist/assets/icons/Icon.6_36.png deleted file mode 100644 index 27a07211..00000000 Binary files a/dist/assets/icons/Icon.6_36.png and /dev/null differ diff --git a/dist/assets/icons/Icon.6_37.png b/dist/assets/icons/Icon.6_37.png deleted file mode 100644 index 6afad886..00000000 Binary files a/dist/assets/icons/Icon.6_37.png and /dev/null differ diff --git a/dist/assets/icons/Icon.6_38.png b/dist/assets/icons/Icon.6_38.png deleted file mode 100644 index 1216fd46..00000000 Binary files a/dist/assets/icons/Icon.6_38.png and /dev/null differ diff --git a/dist/assets/icons/Icon.6_39.png b/dist/assets/icons/Icon.6_39.png deleted file mode 100644 index b7928e49..00000000 Binary files a/dist/assets/icons/Icon.6_39.png and /dev/null differ diff --git a/dist/assets/icons/Icon.6_40.png b/dist/assets/icons/Icon.6_40.png deleted file mode 100644 index 6c16a4ad..00000000 Binary files a/dist/assets/icons/Icon.6_40.png and /dev/null differ diff --git a/dist/assets/icons/Icon.6_41.png b/dist/assets/icons/Icon.6_41.png deleted file mode 100644 index 7d6eac40..00000000 Binary files a/dist/assets/icons/Icon.6_41.png and /dev/null differ diff --git a/dist/assets/icons/Icon.6_42.png b/dist/assets/icons/Icon.6_42.png deleted file mode 100644 index fb83da3d..00000000 Binary files a/dist/assets/icons/Icon.6_42.png and /dev/null differ diff --git a/dist/assets/icons/Icon.6_43.png b/dist/assets/icons/Icon.6_43.png deleted file mode 100644 index 6662d335..00000000 Binary files a/dist/assets/icons/Icon.6_43.png and /dev/null differ diff --git a/dist/assets/icons/Icon.6_44.png b/dist/assets/icons/Icon.6_44.png deleted file mode 100644 index 2b19a4c7..00000000 Binary files a/dist/assets/icons/Icon.6_44.png and /dev/null differ diff --git a/dist/assets/icons/Icon.6_45.png b/dist/assets/icons/Icon.6_45.png deleted file mode 100644 index a97594c8..00000000 Binary files a/dist/assets/icons/Icon.6_45.png and /dev/null differ diff --git a/dist/assets/icons/Icon.6_46.png b/dist/assets/icons/Icon.6_46.png deleted file mode 100644 index 2be2956e..00000000 Binary files a/dist/assets/icons/Icon.6_46.png and /dev/null differ diff --git a/dist/assets/icons/Icon.6_47.png b/dist/assets/icons/Icon.6_47.png deleted file mode 100644 index 5eadc631..00000000 Binary files a/dist/assets/icons/Icon.6_47.png and /dev/null differ diff --git a/dist/assets/icons/Icon.6_48.png b/dist/assets/icons/Icon.6_48.png deleted file mode 100644 index 0acc7332..00000000 Binary files a/dist/assets/icons/Icon.6_48.png and /dev/null differ diff --git a/dist/assets/icons/Icon.6_49.png b/dist/assets/icons/Icon.6_49.png deleted file mode 100644 index 9eb82b69..00000000 Binary files a/dist/assets/icons/Icon.6_49.png and /dev/null differ diff --git a/dist/assets/icons/Icon.6_50.png b/dist/assets/icons/Icon.6_50.png deleted file mode 100644 index 890a110c..00000000 Binary files a/dist/assets/icons/Icon.6_50.png and /dev/null differ diff --git a/dist/assets/icons/Icon.6_51.png b/dist/assets/icons/Icon.6_51.png deleted file mode 100644 index 9429ac41..00000000 Binary files a/dist/assets/icons/Icon.6_51.png and /dev/null differ diff --git a/dist/assets/icons/Icon.6_52.png b/dist/assets/icons/Icon.6_52.png deleted file mode 100644 index cbc04bfe..00000000 Binary files a/dist/assets/icons/Icon.6_52.png and /dev/null differ diff --git a/dist/assets/icons/Icon.6_53.png b/dist/assets/icons/Icon.6_53.png deleted file mode 100644 index b98fab12..00000000 Binary files a/dist/assets/icons/Icon.6_53.png and /dev/null differ diff --git a/dist/assets/icons/Icon.6_54.png b/dist/assets/icons/Icon.6_54.png deleted file mode 100644 index 15fed8f5..00000000 Binary files a/dist/assets/icons/Icon.6_54.png and /dev/null differ diff --git a/dist/assets/icons/Icon.6_55.png b/dist/assets/icons/Icon.6_55.png deleted file mode 100644 index c16f70d3..00000000 Binary files a/dist/assets/icons/Icon.6_55.png and /dev/null differ diff --git a/dist/assets/icons/Icon.6_56.png b/dist/assets/icons/Icon.6_56.png deleted file mode 100644 index ff46d513..00000000 Binary files a/dist/assets/icons/Icon.6_56.png and /dev/null differ diff --git a/dist/assets/icons/Icon.6_57.png b/dist/assets/icons/Icon.6_57.png deleted file mode 100644 index 4b5edbed..00000000 Binary files a/dist/assets/icons/Icon.6_57.png and /dev/null differ diff --git a/dist/assets/icons/Icon.6_58.png b/dist/assets/icons/Icon.6_58.png deleted file mode 100644 index 0e2230b9..00000000 Binary files a/dist/assets/icons/Icon.6_58.png and /dev/null differ diff --git a/dist/assets/icons/Icon.6_59.png b/dist/assets/icons/Icon.6_59.png deleted file mode 100644 index 3aa43728..00000000 Binary files a/dist/assets/icons/Icon.6_59.png and /dev/null differ diff --git a/dist/assets/icons/Icon.6_60.png b/dist/assets/icons/Icon.6_60.png deleted file mode 100644 index a10237de..00000000 Binary files a/dist/assets/icons/Icon.6_60.png and /dev/null differ diff --git a/dist/assets/icons/Icon.6_61.png b/dist/assets/icons/Icon.6_61.png deleted file mode 100644 index 37d7b867..00000000 Binary files a/dist/assets/icons/Icon.6_61.png and /dev/null differ diff --git a/dist/assets/icons/Icon.6_62.png b/dist/assets/icons/Icon.6_62.png deleted file mode 100644 index 42c2cb11..00000000 Binary files a/dist/assets/icons/Icon.6_62.png and /dev/null differ diff --git a/dist/assets/icons/Icon.6_63.png b/dist/assets/icons/Icon.6_63.png deleted file mode 100644 index 40dd4580..00000000 Binary files a/dist/assets/icons/Icon.6_63.png and /dev/null differ diff --git a/dist/assets/icons/Icon.6_64.png b/dist/assets/icons/Icon.6_64.png deleted file mode 100644 index 875767b4..00000000 Binary files a/dist/assets/icons/Icon.6_64.png and /dev/null differ diff --git a/dist/assets/icons/Icon.6_65.png b/dist/assets/icons/Icon.6_65.png deleted file mode 100644 index 28f2054d..00000000 Binary files a/dist/assets/icons/Icon.6_65.png and /dev/null differ diff --git a/dist/assets/icons/Icon.6_66.png b/dist/assets/icons/Icon.6_66.png deleted file mode 100644 index 30584dce..00000000 Binary files a/dist/assets/icons/Icon.6_66.png and /dev/null differ diff --git a/dist/assets/icons/Icon.6_67.png b/dist/assets/icons/Icon.6_67.png deleted file mode 100644 index 5c06fd38..00000000 Binary files a/dist/assets/icons/Icon.6_67.png and /dev/null differ diff --git a/dist/assets/icons/Icon.6_68.png b/dist/assets/icons/Icon.6_68.png deleted file mode 100644 index 15d94df9..00000000 Binary files a/dist/assets/icons/Icon.6_68.png and /dev/null differ diff --git a/dist/assets/icons/Icon.6_69.png b/dist/assets/icons/Icon.6_69.png deleted file mode 100644 index 8eb7989a..00000000 Binary files a/dist/assets/icons/Icon.6_69.png and /dev/null differ diff --git a/dist/assets/icons/Icon.6_70.png b/dist/assets/icons/Icon.6_70.png deleted file mode 100644 index 46321b94..00000000 Binary files a/dist/assets/icons/Icon.6_70.png and /dev/null differ diff --git a/dist/assets/icons/Icon.6_71.png b/dist/assets/icons/Icon.6_71.png deleted file mode 100644 index c15131e6..00000000 Binary files a/dist/assets/icons/Icon.6_71.png and /dev/null differ diff --git a/dist/assets/icons/Icon.6_72.png b/dist/assets/icons/Icon.6_72.png deleted file mode 100644 index 01899cca..00000000 Binary files a/dist/assets/icons/Icon.6_72.png and /dev/null differ diff --git a/dist/assets/icons/Icon.6_73.png b/dist/assets/icons/Icon.6_73.png deleted file mode 100644 index 62f0323b..00000000 Binary files a/dist/assets/icons/Icon.6_73.png and /dev/null differ diff --git a/dist/assets/icons/Icon.6_74.png b/dist/assets/icons/Icon.6_74.png deleted file mode 100644 index 2f58cb14..00000000 Binary files a/dist/assets/icons/Icon.6_74.png and /dev/null differ diff --git a/dist/assets/icons/Icon.6_75.png b/dist/assets/icons/Icon.6_75.png deleted file mode 100644 index 913966fa..00000000 Binary files a/dist/assets/icons/Icon.6_75.png and /dev/null differ diff --git a/dist/assets/icons/Icon.6_76.png b/dist/assets/icons/Icon.6_76.png deleted file mode 100644 index baf972ec..00000000 Binary files a/dist/assets/icons/Icon.6_76.png and /dev/null differ diff --git a/dist/assets/icons/Icon.6_77.png b/dist/assets/icons/Icon.6_77.png deleted file mode 100644 index e632bc79..00000000 Binary files a/dist/assets/icons/Icon.6_77.png and /dev/null differ diff --git a/dist/assets/icons/Icon.6_78.png b/dist/assets/icons/Icon.6_78.png deleted file mode 100644 index 0d177657..00000000 Binary files a/dist/assets/icons/Icon.6_78.png and /dev/null differ diff --git a/dist/assets/icons/Icon.6_79.png b/dist/assets/icons/Icon.6_79.png deleted file mode 100644 index 44993ece..00000000 Binary files a/dist/assets/icons/Icon.6_79.png and /dev/null differ diff --git a/dist/assets/icons/Icon.6_80.png b/dist/assets/icons/Icon.6_80.png deleted file mode 100644 index d9d09439..00000000 Binary files a/dist/assets/icons/Icon.6_80.png and /dev/null differ diff --git a/dist/assets/icons/Icon.6_81.png b/dist/assets/icons/Icon.6_81.png deleted file mode 100644 index 58c9ebce..00000000 Binary files a/dist/assets/icons/Icon.6_81.png and /dev/null differ diff --git a/dist/assets/icons/Icon.6_82.png b/dist/assets/icons/Icon.6_82.png deleted file mode 100644 index 2f2d4af7..00000000 Binary files a/dist/assets/icons/Icon.6_82.png and /dev/null differ diff --git a/dist/assets/icons/Icon.6_83.png b/dist/assets/icons/Icon.6_83.png deleted file mode 100644 index b0b0662c..00000000 Binary files a/dist/assets/icons/Icon.6_83.png and /dev/null differ diff --git a/dist/assets/icons/Icon.6_84.png b/dist/assets/icons/Icon.6_84.png deleted file mode 100644 index ca2565d7..00000000 Binary files a/dist/assets/icons/Icon.6_84.png and /dev/null differ diff --git a/dist/assets/icons/Icon.6_85.png b/dist/assets/icons/Icon.6_85.png deleted file mode 100644 index e17afe87..00000000 Binary files a/dist/assets/icons/Icon.6_85.png and /dev/null differ diff --git a/dist/assets/icons/Icon.6_86.png b/dist/assets/icons/Icon.6_86.png deleted file mode 100644 index 827441f5..00000000 Binary files a/dist/assets/icons/Icon.6_86.png and /dev/null differ diff --git a/dist/assets/icons/Icon.6_87.png b/dist/assets/icons/Icon.6_87.png deleted file mode 100644 index 1ff5cba1..00000000 Binary files a/dist/assets/icons/Icon.6_87.png and /dev/null differ diff --git a/dist/assets/icons/Icon.6_89.png b/dist/assets/icons/Icon.6_89.png deleted file mode 100644 index 884eebb5..00000000 Binary files a/dist/assets/icons/Icon.6_89.png and /dev/null differ diff --git a/dist/assets/icons/Icon.6_90.png b/dist/assets/icons/Icon.6_90.png deleted file mode 100644 index 0bee6315..00000000 Binary files a/dist/assets/icons/Icon.6_90.png and /dev/null differ diff --git a/dist/assets/icons/Icon.6_91.png b/dist/assets/icons/Icon.6_91.png deleted file mode 100644 index c41f61d0..00000000 Binary files a/dist/assets/icons/Icon.6_91.png and /dev/null differ diff --git a/dist/assets/icons/Icon.6_92.png b/dist/assets/icons/Icon.6_92.png deleted file mode 100644 index 7ac03cf7..00000000 Binary files a/dist/assets/icons/Icon.6_92.png and /dev/null differ diff --git a/dist/assets/icons/Icon.6_93.png b/dist/assets/icons/Icon.6_93.png deleted file mode 100644 index e78f7a14..00000000 Binary files a/dist/assets/icons/Icon.6_93.png and /dev/null differ diff --git a/dist/assets/icons/Icon.6_94.png b/dist/assets/icons/Icon.6_94.png deleted file mode 100644 index 0ea1626b..00000000 Binary files a/dist/assets/icons/Icon.6_94.png and /dev/null differ diff --git a/dist/assets/icons/Icon.6_95.png b/dist/assets/icons/Icon.6_95.png deleted file mode 100644 index bf6bf3ee..00000000 Binary files a/dist/assets/icons/Icon.6_95.png and /dev/null differ diff --git a/dist/assets/icons/Icon.6_96.png b/dist/assets/icons/Icon.6_96.png deleted file mode 100644 index a46f9956..00000000 Binary files a/dist/assets/icons/Icon.6_96.png and /dev/null differ diff --git a/dist/assets/icons/Icon.6_97.png b/dist/assets/icons/Icon.6_97.png deleted file mode 100644 index f3df41b6..00000000 Binary files a/dist/assets/icons/Icon.6_97.png and /dev/null differ diff --git a/dist/assets/icons/Icon.6_98.png b/dist/assets/icons/Icon.6_98.png deleted file mode 100644 index 7c5c5434..00000000 Binary files a/dist/assets/icons/Icon.6_98.png and /dev/null differ diff --git a/dist/assets/icons/Icon.6_99.png b/dist/assets/icons/Icon.6_99.png deleted file mode 100644 index cec08a43..00000000 Binary files a/dist/assets/icons/Icon.6_99.png and /dev/null differ diff --git a/dist/assets/icons/Icon.7_01.png b/dist/assets/icons/Icon.7_01.png deleted file mode 100644 index 15ab1085..00000000 Binary files a/dist/assets/icons/Icon.7_01.png and /dev/null differ diff --git a/dist/assets/icons/Icon.7_02.png b/dist/assets/icons/Icon.7_02.png deleted file mode 100644 index a6c4801a..00000000 Binary files a/dist/assets/icons/Icon.7_02.png and /dev/null differ diff --git a/dist/assets/icons/Icon.7_03.png b/dist/assets/icons/Icon.7_03.png deleted file mode 100644 index 307f2d4a..00000000 Binary files a/dist/assets/icons/Icon.7_03.png and /dev/null differ diff --git a/dist/assets/icons/Icon.7_04.png b/dist/assets/icons/Icon.7_04.png deleted file mode 100644 index 9cfd891e..00000000 Binary files a/dist/assets/icons/Icon.7_04.png and /dev/null differ diff --git a/dist/assets/icons/Icon.7_05.png b/dist/assets/icons/Icon.7_05.png deleted file mode 100644 index a5da2635..00000000 Binary files a/dist/assets/icons/Icon.7_05.png and /dev/null differ diff --git a/dist/assets/icons/Icon.7_06.png b/dist/assets/icons/Icon.7_06.png deleted file mode 100644 index 6fc39df4..00000000 Binary files a/dist/assets/icons/Icon.7_06.png and /dev/null differ diff --git a/dist/assets/icons/Icon.7_07.png b/dist/assets/icons/Icon.7_07.png deleted file mode 100644 index 677864d0..00000000 Binary files a/dist/assets/icons/Icon.7_07.png and /dev/null differ diff --git a/dist/assets/icons/Icon.7_08.png b/dist/assets/icons/Icon.7_08.png deleted file mode 100644 index 7e05ea4b..00000000 Binary files a/dist/assets/icons/Icon.7_08.png and /dev/null differ diff --git a/dist/assets/icons/Icon.7_09.png b/dist/assets/icons/Icon.7_09.png deleted file mode 100644 index 3cb19ca5..00000000 Binary files a/dist/assets/icons/Icon.7_09.png and /dev/null differ diff --git a/dist/assets/icons/Icon.7_10.png b/dist/assets/icons/Icon.7_10.png deleted file mode 100644 index e27424a9..00000000 Binary files a/dist/assets/icons/Icon.7_10.png and /dev/null differ diff --git a/dist/assets/icons/Icon.7_100.png b/dist/assets/icons/Icon.7_100.png deleted file mode 100644 index 2d5986f4..00000000 Binary files a/dist/assets/icons/Icon.7_100.png and /dev/null differ diff --git a/dist/assets/icons/Icon.7_11.png b/dist/assets/icons/Icon.7_11.png deleted file mode 100644 index a97b81d8..00000000 Binary files a/dist/assets/icons/Icon.7_11.png and /dev/null differ diff --git a/dist/assets/icons/Icon.7_12.png b/dist/assets/icons/Icon.7_12.png deleted file mode 100644 index 7b270468..00000000 Binary files a/dist/assets/icons/Icon.7_12.png and /dev/null differ diff --git a/dist/assets/icons/Icon.7_13.png b/dist/assets/icons/Icon.7_13.png deleted file mode 100644 index ffb1308a..00000000 Binary files a/dist/assets/icons/Icon.7_13.png and /dev/null differ diff --git a/dist/assets/icons/Icon.7_14.png b/dist/assets/icons/Icon.7_14.png deleted file mode 100644 index da8660c8..00000000 Binary files a/dist/assets/icons/Icon.7_14.png and /dev/null differ diff --git a/dist/assets/icons/Icon.7_15.png b/dist/assets/icons/Icon.7_15.png deleted file mode 100644 index 218ce862..00000000 Binary files a/dist/assets/icons/Icon.7_15.png and /dev/null differ diff --git a/dist/assets/icons/Icon.7_16.png b/dist/assets/icons/Icon.7_16.png deleted file mode 100644 index cd23f05b..00000000 Binary files a/dist/assets/icons/Icon.7_16.png and /dev/null differ diff --git a/dist/assets/icons/Icon.7_17.png b/dist/assets/icons/Icon.7_17.png deleted file mode 100644 index ef05814d..00000000 Binary files a/dist/assets/icons/Icon.7_17.png and /dev/null differ diff --git a/dist/assets/icons/Icon.7_18.png b/dist/assets/icons/Icon.7_18.png deleted file mode 100644 index e69fc588..00000000 Binary files a/dist/assets/icons/Icon.7_18.png and /dev/null differ diff --git a/dist/assets/icons/Icon.7_19.png b/dist/assets/icons/Icon.7_19.png deleted file mode 100644 index 2a9e3d58..00000000 Binary files a/dist/assets/icons/Icon.7_19.png and /dev/null differ diff --git a/dist/assets/icons/Icon.7_20.png b/dist/assets/icons/Icon.7_20.png deleted file mode 100644 index 80f0a547..00000000 Binary files a/dist/assets/icons/Icon.7_20.png and /dev/null differ diff --git a/dist/assets/icons/Icon.7_21.png b/dist/assets/icons/Icon.7_21.png deleted file mode 100644 index 3fcc787d..00000000 Binary files a/dist/assets/icons/Icon.7_21.png and /dev/null differ diff --git a/dist/assets/icons/Icon.7_22.png b/dist/assets/icons/Icon.7_22.png deleted file mode 100644 index b6542a2e..00000000 Binary files a/dist/assets/icons/Icon.7_22.png and /dev/null differ diff --git a/dist/assets/icons/Icon.7_23.png b/dist/assets/icons/Icon.7_23.png deleted file mode 100644 index 94490171..00000000 Binary files a/dist/assets/icons/Icon.7_23.png and /dev/null differ diff --git a/dist/assets/icons/Icon.7_24.png b/dist/assets/icons/Icon.7_24.png deleted file mode 100644 index 0d1d94e2..00000000 Binary files a/dist/assets/icons/Icon.7_24.png and /dev/null differ diff --git a/dist/assets/icons/Icon.7_25.png b/dist/assets/icons/Icon.7_25.png deleted file mode 100644 index e5af6129..00000000 Binary files a/dist/assets/icons/Icon.7_25.png and /dev/null differ diff --git a/dist/assets/icons/Icon.7_26.png b/dist/assets/icons/Icon.7_26.png deleted file mode 100644 index 358d1d13..00000000 Binary files a/dist/assets/icons/Icon.7_26.png and /dev/null differ diff --git a/dist/assets/icons/Icon.7_27.png b/dist/assets/icons/Icon.7_27.png deleted file mode 100644 index cbd84229..00000000 Binary files a/dist/assets/icons/Icon.7_27.png and /dev/null differ diff --git a/dist/assets/icons/Icon.7_28.png b/dist/assets/icons/Icon.7_28.png deleted file mode 100644 index c765e60a..00000000 Binary files a/dist/assets/icons/Icon.7_28.png and /dev/null differ diff --git a/dist/assets/icons/Icon.7_29.png b/dist/assets/icons/Icon.7_29.png deleted file mode 100644 index 46fd35a4..00000000 Binary files a/dist/assets/icons/Icon.7_29.png and /dev/null differ diff --git a/dist/assets/icons/Icon.7_30.png b/dist/assets/icons/Icon.7_30.png deleted file mode 100644 index 1bf3cccb..00000000 Binary files a/dist/assets/icons/Icon.7_30.png and /dev/null differ diff --git a/dist/assets/icons/Icon.7_31.png b/dist/assets/icons/Icon.7_31.png deleted file mode 100644 index 788d23f5..00000000 Binary files a/dist/assets/icons/Icon.7_31.png and /dev/null differ diff --git a/dist/assets/icons/Icon.7_32.png b/dist/assets/icons/Icon.7_32.png deleted file mode 100644 index 25157110..00000000 Binary files a/dist/assets/icons/Icon.7_32.png and /dev/null differ diff --git a/dist/assets/icons/Icon.7_33.png b/dist/assets/icons/Icon.7_33.png deleted file mode 100644 index 8dc40c6c..00000000 Binary files a/dist/assets/icons/Icon.7_33.png and /dev/null differ diff --git a/dist/assets/icons/Icon.7_34.png b/dist/assets/icons/Icon.7_34.png deleted file mode 100644 index 737f0d47..00000000 Binary files a/dist/assets/icons/Icon.7_34.png and /dev/null differ diff --git a/dist/assets/icons/Icon.7_35.png b/dist/assets/icons/Icon.7_35.png deleted file mode 100644 index 5e049e97..00000000 Binary files a/dist/assets/icons/Icon.7_35.png and /dev/null differ diff --git a/dist/assets/icons/Icon.7_36.png b/dist/assets/icons/Icon.7_36.png deleted file mode 100644 index a0973f3d..00000000 Binary files a/dist/assets/icons/Icon.7_36.png and /dev/null differ diff --git a/dist/assets/icons/Icon.7_37.png b/dist/assets/icons/Icon.7_37.png deleted file mode 100644 index 693cab72..00000000 Binary files a/dist/assets/icons/Icon.7_37.png and /dev/null differ diff --git a/dist/assets/icons/Icon.7_38.png b/dist/assets/icons/Icon.7_38.png deleted file mode 100644 index 85c26525..00000000 Binary files a/dist/assets/icons/Icon.7_38.png and /dev/null differ diff --git a/dist/assets/icons/Icon.7_39.png b/dist/assets/icons/Icon.7_39.png deleted file mode 100644 index 617c1965..00000000 Binary files a/dist/assets/icons/Icon.7_39.png and /dev/null differ diff --git a/dist/assets/icons/Icon.7_40.png b/dist/assets/icons/Icon.7_40.png deleted file mode 100644 index 122a8b20..00000000 Binary files a/dist/assets/icons/Icon.7_40.png and /dev/null differ diff --git a/dist/assets/icons/Icon.7_41.png b/dist/assets/icons/Icon.7_41.png deleted file mode 100644 index 392b53e7..00000000 Binary files a/dist/assets/icons/Icon.7_41.png and /dev/null differ diff --git a/dist/assets/icons/Icon.7_42.png b/dist/assets/icons/Icon.7_42.png deleted file mode 100644 index 7c353d8c..00000000 Binary files a/dist/assets/icons/Icon.7_42.png and /dev/null differ diff --git a/dist/assets/icons/Icon.7_43.png b/dist/assets/icons/Icon.7_43.png deleted file mode 100644 index 37e8a4b3..00000000 Binary files a/dist/assets/icons/Icon.7_43.png and /dev/null differ diff --git a/dist/assets/icons/Icon.7_44.png b/dist/assets/icons/Icon.7_44.png deleted file mode 100644 index c3faa8ef..00000000 Binary files a/dist/assets/icons/Icon.7_44.png and /dev/null differ diff --git a/dist/assets/icons/Icon.7_45.png b/dist/assets/icons/Icon.7_45.png deleted file mode 100644 index 52600c24..00000000 Binary files a/dist/assets/icons/Icon.7_45.png and /dev/null differ diff --git a/dist/assets/icons/Icon.7_46.png b/dist/assets/icons/Icon.7_46.png deleted file mode 100644 index e2bbd0c3..00000000 Binary files a/dist/assets/icons/Icon.7_46.png and /dev/null differ diff --git a/dist/assets/icons/Icon.7_47.png b/dist/assets/icons/Icon.7_47.png deleted file mode 100644 index cdec47d9..00000000 Binary files a/dist/assets/icons/Icon.7_47.png and /dev/null differ diff --git a/dist/assets/icons/Icon.7_48.png b/dist/assets/icons/Icon.7_48.png deleted file mode 100644 index dfe6f34e..00000000 Binary files a/dist/assets/icons/Icon.7_48.png and /dev/null differ diff --git a/dist/assets/icons/Icon.7_49.png b/dist/assets/icons/Icon.7_49.png deleted file mode 100644 index b021ab5f..00000000 Binary files a/dist/assets/icons/Icon.7_49.png and /dev/null differ diff --git a/dist/assets/icons/Icon.7_50.png b/dist/assets/icons/Icon.7_50.png deleted file mode 100644 index ee1bfe0f..00000000 Binary files a/dist/assets/icons/Icon.7_50.png and /dev/null differ diff --git a/dist/assets/icons/Icon.7_51.png b/dist/assets/icons/Icon.7_51.png deleted file mode 100644 index 214db6fc..00000000 Binary files a/dist/assets/icons/Icon.7_51.png and /dev/null differ diff --git a/dist/assets/icons/Icon.7_52.png b/dist/assets/icons/Icon.7_52.png deleted file mode 100644 index ac021c05..00000000 Binary files a/dist/assets/icons/Icon.7_52.png and /dev/null differ diff --git a/dist/assets/icons/Icon.7_53.png b/dist/assets/icons/Icon.7_53.png deleted file mode 100644 index 9d9ec0d7..00000000 Binary files a/dist/assets/icons/Icon.7_53.png and /dev/null differ diff --git a/dist/assets/icons/Icon.7_54.png b/dist/assets/icons/Icon.7_54.png deleted file mode 100644 index af56f43b..00000000 Binary files a/dist/assets/icons/Icon.7_54.png and /dev/null differ diff --git a/dist/assets/icons/Icon.7_55.png b/dist/assets/icons/Icon.7_55.png deleted file mode 100644 index bdb0f2cd..00000000 Binary files a/dist/assets/icons/Icon.7_55.png and /dev/null differ diff --git a/dist/assets/icons/Icon.7_56.png b/dist/assets/icons/Icon.7_56.png deleted file mode 100644 index 1998741c..00000000 Binary files a/dist/assets/icons/Icon.7_56.png and /dev/null differ diff --git a/dist/assets/icons/Icon.7_57.png b/dist/assets/icons/Icon.7_57.png deleted file mode 100644 index 83e0d04a..00000000 Binary files a/dist/assets/icons/Icon.7_57.png and /dev/null differ diff --git a/dist/assets/icons/Icon.7_58.png b/dist/assets/icons/Icon.7_58.png deleted file mode 100644 index dbecef39..00000000 Binary files a/dist/assets/icons/Icon.7_58.png and /dev/null differ diff --git a/dist/assets/icons/Icon.7_59.png b/dist/assets/icons/Icon.7_59.png deleted file mode 100644 index ffa72f7d..00000000 Binary files a/dist/assets/icons/Icon.7_59.png and /dev/null differ diff --git a/dist/assets/icons/Icon.7_61.png b/dist/assets/icons/Icon.7_61.png deleted file mode 100644 index 7095944c..00000000 Binary files a/dist/assets/icons/Icon.7_61.png and /dev/null differ diff --git a/dist/assets/icons/Icon.7_62.png b/dist/assets/icons/Icon.7_62.png deleted file mode 100644 index 72154385..00000000 Binary files a/dist/assets/icons/Icon.7_62.png and /dev/null differ diff --git a/dist/assets/icons/Icon.7_63.png b/dist/assets/icons/Icon.7_63.png deleted file mode 100644 index ca76de15..00000000 Binary files a/dist/assets/icons/Icon.7_63.png and /dev/null differ diff --git a/dist/assets/icons/Icon.7_64.png b/dist/assets/icons/Icon.7_64.png deleted file mode 100644 index 2e55d240..00000000 Binary files a/dist/assets/icons/Icon.7_64.png and /dev/null differ diff --git a/dist/assets/icons/Icon.7_65.png b/dist/assets/icons/Icon.7_65.png deleted file mode 100644 index 3fe2608e..00000000 Binary files a/dist/assets/icons/Icon.7_65.png and /dev/null differ diff --git a/dist/assets/icons/Icon.7_66.png b/dist/assets/icons/Icon.7_66.png deleted file mode 100644 index d418d1db..00000000 Binary files a/dist/assets/icons/Icon.7_66.png and /dev/null differ diff --git a/dist/assets/icons/Icon.7_67.png b/dist/assets/icons/Icon.7_67.png deleted file mode 100644 index e5382bc5..00000000 Binary files a/dist/assets/icons/Icon.7_67.png and /dev/null differ diff --git a/dist/assets/icons/Icon.7_68.png b/dist/assets/icons/Icon.7_68.png deleted file mode 100644 index 9c3ce2eb..00000000 Binary files a/dist/assets/icons/Icon.7_68.png and /dev/null differ diff --git a/dist/assets/icons/Icon.7_69.png b/dist/assets/icons/Icon.7_69.png deleted file mode 100644 index a6beec91..00000000 Binary files a/dist/assets/icons/Icon.7_69.png and /dev/null differ diff --git a/dist/assets/icons/Icon.7_70.png b/dist/assets/icons/Icon.7_70.png deleted file mode 100644 index 11e30c47..00000000 Binary files a/dist/assets/icons/Icon.7_70.png and /dev/null differ diff --git a/dist/assets/icons/Icon.7_71.png b/dist/assets/icons/Icon.7_71.png deleted file mode 100644 index b12c12bb..00000000 Binary files a/dist/assets/icons/Icon.7_71.png and /dev/null differ diff --git a/dist/assets/icons/Icon.7_72.png b/dist/assets/icons/Icon.7_72.png deleted file mode 100644 index a8c353e8..00000000 Binary files a/dist/assets/icons/Icon.7_72.png and /dev/null differ diff --git a/dist/assets/icons/Icon.7_73.png b/dist/assets/icons/Icon.7_73.png deleted file mode 100644 index 2908eb55..00000000 Binary files a/dist/assets/icons/Icon.7_73.png and /dev/null differ diff --git a/dist/assets/icons/Icon.7_74.png b/dist/assets/icons/Icon.7_74.png deleted file mode 100644 index f1577aef..00000000 Binary files a/dist/assets/icons/Icon.7_74.png and /dev/null differ diff --git a/dist/assets/icons/Icon.7_75.png b/dist/assets/icons/Icon.7_75.png deleted file mode 100644 index 926748e7..00000000 Binary files a/dist/assets/icons/Icon.7_75.png and /dev/null differ diff --git a/dist/assets/icons/Icon.7_76.png b/dist/assets/icons/Icon.7_76.png deleted file mode 100644 index df89fb3a..00000000 Binary files a/dist/assets/icons/Icon.7_76.png and /dev/null differ diff --git a/dist/assets/icons/Icon.7_77.png b/dist/assets/icons/Icon.7_77.png deleted file mode 100644 index 7707201c..00000000 Binary files a/dist/assets/icons/Icon.7_77.png and /dev/null differ diff --git a/dist/assets/icons/Icon.7_78.png b/dist/assets/icons/Icon.7_78.png deleted file mode 100644 index eaedcd69..00000000 Binary files a/dist/assets/icons/Icon.7_78.png and /dev/null differ diff --git a/dist/assets/icons/Icon.7_79.png b/dist/assets/icons/Icon.7_79.png deleted file mode 100644 index 50756db1..00000000 Binary files a/dist/assets/icons/Icon.7_79.png and /dev/null differ diff --git a/dist/assets/icons/Icon.7_80.png b/dist/assets/icons/Icon.7_80.png deleted file mode 100644 index 7c08e599..00000000 Binary files a/dist/assets/icons/Icon.7_80.png and /dev/null differ diff --git a/dist/assets/icons/Icon.7_81.png b/dist/assets/icons/Icon.7_81.png deleted file mode 100644 index eded4225..00000000 Binary files a/dist/assets/icons/Icon.7_81.png and /dev/null differ diff --git a/dist/assets/icons/Icon.7_82.png b/dist/assets/icons/Icon.7_82.png deleted file mode 100644 index 58a5963f..00000000 Binary files a/dist/assets/icons/Icon.7_82.png and /dev/null differ diff --git a/dist/assets/icons/Icon.7_83.png b/dist/assets/icons/Icon.7_83.png deleted file mode 100644 index f3ec2bf6..00000000 Binary files a/dist/assets/icons/Icon.7_83.png and /dev/null differ diff --git a/dist/assets/icons/Icon.7_84.png b/dist/assets/icons/Icon.7_84.png deleted file mode 100644 index 7fa08553..00000000 Binary files a/dist/assets/icons/Icon.7_84.png and /dev/null differ diff --git a/dist/assets/icons/Icon.7_85.png b/dist/assets/icons/Icon.7_85.png deleted file mode 100644 index 551c1cc7..00000000 Binary files a/dist/assets/icons/Icon.7_85.png and /dev/null differ diff --git a/dist/assets/icons/Icon.7_86.png b/dist/assets/icons/Icon.7_86.png deleted file mode 100644 index f418d91c..00000000 Binary files a/dist/assets/icons/Icon.7_86.png and /dev/null differ diff --git a/dist/assets/icons/Icon.7_87.png b/dist/assets/icons/Icon.7_87.png deleted file mode 100644 index 6d85ece4..00000000 Binary files a/dist/assets/icons/Icon.7_87.png and /dev/null differ diff --git a/dist/assets/icons/Icon.7_88.png b/dist/assets/icons/Icon.7_88.png deleted file mode 100644 index 54380a39..00000000 Binary files a/dist/assets/icons/Icon.7_88.png and /dev/null differ diff --git a/dist/assets/icons/Icon.7_89.png b/dist/assets/icons/Icon.7_89.png deleted file mode 100644 index 656dd633..00000000 Binary files a/dist/assets/icons/Icon.7_89.png and /dev/null differ diff --git a/dist/assets/icons/Icon.7_90.png b/dist/assets/icons/Icon.7_90.png deleted file mode 100644 index eca09fe4..00000000 Binary files a/dist/assets/icons/Icon.7_90.png and /dev/null differ diff --git a/dist/assets/icons/Icon.7_91.png b/dist/assets/icons/Icon.7_91.png deleted file mode 100644 index 756eb36b..00000000 Binary files a/dist/assets/icons/Icon.7_91.png and /dev/null differ diff --git a/dist/assets/icons/Icon.7_92.png b/dist/assets/icons/Icon.7_92.png deleted file mode 100644 index 544aa47a..00000000 Binary files a/dist/assets/icons/Icon.7_92.png and /dev/null differ diff --git a/dist/assets/icons/Icon.7_93.png b/dist/assets/icons/Icon.7_93.png deleted file mode 100644 index 70f8980b..00000000 Binary files a/dist/assets/icons/Icon.7_93.png and /dev/null differ diff --git a/dist/assets/icons/Icon.7_94.png b/dist/assets/icons/Icon.7_94.png deleted file mode 100644 index 52abaa73..00000000 Binary files a/dist/assets/icons/Icon.7_94.png and /dev/null differ diff --git a/dist/assets/icons/Icon.7_95.png b/dist/assets/icons/Icon.7_95.png deleted file mode 100644 index c5449da1..00000000 Binary files a/dist/assets/icons/Icon.7_95.png and /dev/null differ diff --git a/dist/assets/icons/Icon.7_96.png b/dist/assets/icons/Icon.7_96.png deleted file mode 100644 index aa657263..00000000 Binary files a/dist/assets/icons/Icon.7_96.png and /dev/null differ diff --git a/dist/assets/icons/Icon.7_97.png b/dist/assets/icons/Icon.7_97.png deleted file mode 100644 index 92ff5e16..00000000 Binary files a/dist/assets/icons/Icon.7_97.png and /dev/null differ diff --git a/dist/assets/icons/Icon.7_98.png b/dist/assets/icons/Icon.7_98.png deleted file mode 100644 index 51925bf7..00000000 Binary files a/dist/assets/icons/Icon.7_98.png and /dev/null differ diff --git a/dist/assets/icons/Icon.7_99.png b/dist/assets/icons/Icon.7_99.png deleted file mode 100644 index 53d9d6fc..00000000 Binary files a/dist/assets/icons/Icon.7_99.png and /dev/null differ diff --git a/dist/assets/icons/Icons8_01.png b/dist/assets/icons/Icons8_01.png deleted file mode 100644 index ca21ee3c..00000000 Binary files a/dist/assets/icons/Icons8_01.png and /dev/null differ diff --git a/dist/assets/icons/Icons8_02.png b/dist/assets/icons/Icons8_02.png deleted file mode 100644 index 49274b90..00000000 Binary files a/dist/assets/icons/Icons8_02.png and /dev/null differ diff --git a/dist/assets/icons/Icons8_03.png b/dist/assets/icons/Icons8_03.png deleted file mode 100644 index 2dfc6a5c..00000000 Binary files a/dist/assets/icons/Icons8_03.png and /dev/null differ diff --git a/dist/assets/icons/Icons8_04.png b/dist/assets/icons/Icons8_04.png deleted file mode 100644 index 4c8e216d..00000000 Binary files a/dist/assets/icons/Icons8_04.png and /dev/null differ diff --git a/dist/assets/icons/Icons8_05.png b/dist/assets/icons/Icons8_05.png deleted file mode 100644 index f976c3da..00000000 Binary files a/dist/assets/icons/Icons8_05.png and /dev/null differ diff --git a/dist/assets/icons/Icons8_06.png b/dist/assets/icons/Icons8_06.png deleted file mode 100644 index 9a5bead8..00000000 Binary files a/dist/assets/icons/Icons8_06.png and /dev/null differ diff --git a/dist/assets/icons/Icons8_07.png b/dist/assets/icons/Icons8_07.png deleted file mode 100644 index fa6ee37a..00000000 Binary files a/dist/assets/icons/Icons8_07.png and /dev/null differ diff --git a/dist/assets/icons/Icons8_08.png b/dist/assets/icons/Icons8_08.png deleted file mode 100644 index 9b35a6d6..00000000 Binary files a/dist/assets/icons/Icons8_08.png and /dev/null differ diff --git a/dist/assets/icons/Icons8_10.png b/dist/assets/icons/Icons8_10.png deleted file mode 100644 index 4f18d127..00000000 Binary files a/dist/assets/icons/Icons8_10.png and /dev/null differ diff --git a/dist/assets/icons/Icons8_11.png b/dist/assets/icons/Icons8_11.png deleted file mode 100644 index cbe3adc8..00000000 Binary files a/dist/assets/icons/Icons8_11.png and /dev/null differ diff --git a/dist/assets/icons/Icons8_12.png b/dist/assets/icons/Icons8_12.png deleted file mode 100644 index 26107cd2..00000000 Binary files a/dist/assets/icons/Icons8_12.png and /dev/null differ diff --git a/dist/assets/icons/Icons8_13.png b/dist/assets/icons/Icons8_13.png deleted file mode 100644 index cdf79c2f..00000000 Binary files a/dist/assets/icons/Icons8_13.png and /dev/null differ diff --git a/dist/assets/icons/Icons8_14.png b/dist/assets/icons/Icons8_14.png deleted file mode 100644 index 7fdf247e..00000000 Binary files a/dist/assets/icons/Icons8_14.png and /dev/null differ diff --git a/dist/assets/icons/Icons8_15.png b/dist/assets/icons/Icons8_15.png deleted file mode 100644 index 9397b15f..00000000 Binary files a/dist/assets/icons/Icons8_15.png and /dev/null differ diff --git a/dist/assets/icons/Icons8_16.png b/dist/assets/icons/Icons8_16.png deleted file mode 100644 index 33fccc8f..00000000 Binary files a/dist/assets/icons/Icons8_16.png and /dev/null differ diff --git a/dist/assets/icons/Icons8_17.png b/dist/assets/icons/Icons8_17.png deleted file mode 100644 index 3ee4c361..00000000 Binary files a/dist/assets/icons/Icons8_17.png and /dev/null differ diff --git a/dist/assets/icons/Icons8_18.png b/dist/assets/icons/Icons8_18.png deleted file mode 100644 index 03f7eed8..00000000 Binary files a/dist/assets/icons/Icons8_18.png and /dev/null differ diff --git a/dist/assets/icons/Icons8_19.png b/dist/assets/icons/Icons8_19.png deleted file mode 100644 index e5b51c43..00000000 Binary files a/dist/assets/icons/Icons8_19.png and /dev/null differ diff --git a/dist/assets/icons/Icons8_20.png b/dist/assets/icons/Icons8_20.png deleted file mode 100644 index f50ae35a..00000000 Binary files a/dist/assets/icons/Icons8_20.png and /dev/null differ diff --git a/dist/assets/icons/Icons8_21.png b/dist/assets/icons/Icons8_21.png deleted file mode 100644 index e8971861..00000000 Binary files a/dist/assets/icons/Icons8_21.png and /dev/null differ diff --git a/dist/assets/icons/Icons8_22.png b/dist/assets/icons/Icons8_22.png deleted file mode 100644 index 7c4074e2..00000000 Binary files a/dist/assets/icons/Icons8_22.png and /dev/null differ diff --git a/dist/assets/icons/Icons8_23.png b/dist/assets/icons/Icons8_23.png deleted file mode 100644 index 0c36b9a1..00000000 Binary files a/dist/assets/icons/Icons8_23.png and /dev/null differ diff --git a/dist/assets/icons/Icons8_24.png b/dist/assets/icons/Icons8_24.png deleted file mode 100644 index 40cf3372..00000000 Binary files a/dist/assets/icons/Icons8_24.png and /dev/null differ diff --git a/dist/assets/icons/Icons8_25.png b/dist/assets/icons/Icons8_25.png deleted file mode 100644 index df836b43..00000000 Binary files a/dist/assets/icons/Icons8_25.png and /dev/null differ diff --git a/dist/assets/icons/Icons8_26.png b/dist/assets/icons/Icons8_26.png deleted file mode 100644 index 6de1805f..00000000 Binary files a/dist/assets/icons/Icons8_26.png and /dev/null differ diff --git a/dist/assets/icons/Icons8_27.png b/dist/assets/icons/Icons8_27.png deleted file mode 100644 index e28044d7..00000000 Binary files a/dist/assets/icons/Icons8_27.png and /dev/null differ diff --git a/dist/assets/icons/Icons8_28.png b/dist/assets/icons/Icons8_28.png deleted file mode 100644 index 519b8872..00000000 Binary files a/dist/assets/icons/Icons8_28.png and /dev/null differ diff --git a/dist/assets/icons/Icons8_29.png b/dist/assets/icons/Icons8_29.png deleted file mode 100644 index a5c463aa..00000000 Binary files a/dist/assets/icons/Icons8_29.png and /dev/null differ diff --git a/dist/assets/icons/Icons8_30.png b/dist/assets/icons/Icons8_30.png deleted file mode 100644 index a96bb5ad..00000000 Binary files a/dist/assets/icons/Icons8_30.png and /dev/null differ diff --git a/dist/assets/icons/Icons8_31.png b/dist/assets/icons/Icons8_31.png deleted file mode 100644 index 264072f8..00000000 Binary files a/dist/assets/icons/Icons8_31.png and /dev/null differ diff --git a/dist/assets/icons/Icons8_32.png b/dist/assets/icons/Icons8_32.png deleted file mode 100644 index 96ff64d6..00000000 Binary files a/dist/assets/icons/Icons8_32.png and /dev/null differ diff --git a/dist/assets/icons/Icons8_33.png b/dist/assets/icons/Icons8_33.png deleted file mode 100644 index d1df186b..00000000 Binary files a/dist/assets/icons/Icons8_33.png and /dev/null differ diff --git a/dist/assets/icons/Icons8_34.png b/dist/assets/icons/Icons8_34.png deleted file mode 100644 index cef41f0d..00000000 Binary files a/dist/assets/icons/Icons8_34.png and /dev/null differ diff --git a/dist/assets/icons/Icons8_35.png b/dist/assets/icons/Icons8_35.png deleted file mode 100644 index ea020106..00000000 Binary files a/dist/assets/icons/Icons8_35.png and /dev/null differ diff --git a/dist/assets/icons/Icons8_36.png b/dist/assets/icons/Icons8_36.png deleted file mode 100644 index 59ec5078..00000000 Binary files a/dist/assets/icons/Icons8_36.png and /dev/null differ diff --git a/dist/assets/icons/Icons8_37.png b/dist/assets/icons/Icons8_37.png deleted file mode 100644 index 397184f3..00000000 Binary files a/dist/assets/icons/Icons8_37.png and /dev/null differ diff --git a/dist/assets/icons/Icons8_38.png b/dist/assets/icons/Icons8_38.png deleted file mode 100644 index 46392a3d..00000000 Binary files a/dist/assets/icons/Icons8_38.png and /dev/null differ diff --git a/dist/assets/icons/Icons8_39.png b/dist/assets/icons/Icons8_39.png deleted file mode 100644 index ea2c7488..00000000 Binary files a/dist/assets/icons/Icons8_39.png and /dev/null differ diff --git a/dist/assets/icons/Icons8_40.png b/dist/assets/icons/Icons8_40.png deleted file mode 100644 index 528ab569..00000000 Binary files a/dist/assets/icons/Icons8_40.png and /dev/null differ diff --git a/dist/assets/icons/Icons8_41.png b/dist/assets/icons/Icons8_41.png deleted file mode 100644 index 0ef33272..00000000 Binary files a/dist/assets/icons/Icons8_41.png and /dev/null differ diff --git a/dist/assets/icons/Icons8_42.png b/dist/assets/icons/Icons8_42.png deleted file mode 100644 index 70066b57..00000000 Binary files a/dist/assets/icons/Icons8_42.png and /dev/null differ diff --git a/dist/assets/icons/Icons8_43.png b/dist/assets/icons/Icons8_43.png deleted file mode 100644 index 16db1c67..00000000 Binary files a/dist/assets/icons/Icons8_43.png and /dev/null differ diff --git a/dist/assets/icons/Icons8_44.png b/dist/assets/icons/Icons8_44.png deleted file mode 100644 index 3270086a..00000000 Binary files a/dist/assets/icons/Icons8_44.png and /dev/null differ diff --git a/dist/assets/icons/Icons8_45.png b/dist/assets/icons/Icons8_45.png deleted file mode 100644 index 7cc6bd5d..00000000 Binary files a/dist/assets/icons/Icons8_45.png and /dev/null differ diff --git a/dist/assets/icons/Icons8_46.png b/dist/assets/icons/Icons8_46.png deleted file mode 100644 index 0b436260..00000000 Binary files a/dist/assets/icons/Icons8_46.png and /dev/null differ diff --git a/dist/assets/icons/Icons8_47.png b/dist/assets/icons/Icons8_47.png deleted file mode 100644 index f4db8d3d..00000000 Binary files a/dist/assets/icons/Icons8_47.png and /dev/null differ diff --git a/dist/assets/icons/Icons8_48.png b/dist/assets/icons/Icons8_48.png deleted file mode 100644 index b2316a06..00000000 Binary files a/dist/assets/icons/Icons8_48.png and /dev/null differ diff --git a/dist/assets/icons/Icons8_49.png b/dist/assets/icons/Icons8_49.png deleted file mode 100644 index f7437df3..00000000 Binary files a/dist/assets/icons/Icons8_49.png and /dev/null differ diff --git a/dist/assets/icons/Icons8_50.png b/dist/assets/icons/Icons8_50.png deleted file mode 100644 index 12599c10..00000000 Binary files a/dist/assets/icons/Icons8_50.png and /dev/null differ diff --git a/dist/assets/icons/Icons8_51.png b/dist/assets/icons/Icons8_51.png deleted file mode 100644 index 9c4270f5..00000000 Binary files a/dist/assets/icons/Icons8_51.png and /dev/null differ diff --git a/dist/assets/icons/Icons8_52.png b/dist/assets/icons/Icons8_52.png deleted file mode 100644 index 3fafa9a1..00000000 Binary files a/dist/assets/icons/Icons8_52.png and /dev/null differ diff --git a/dist/assets/icons/Icons8_53.png b/dist/assets/icons/Icons8_53.png deleted file mode 100644 index 46fb1b86..00000000 Binary files a/dist/assets/icons/Icons8_53.png and /dev/null differ diff --git a/dist/assets/icons/Icons8_54.png b/dist/assets/icons/Icons8_54.png deleted file mode 100644 index c3849a05..00000000 Binary files a/dist/assets/icons/Icons8_54.png and /dev/null differ diff --git a/dist/assets/icons/Icons8_55.png b/dist/assets/icons/Icons8_55.png deleted file mode 100644 index ba5321ef..00000000 Binary files a/dist/assets/icons/Icons8_55.png and /dev/null differ diff --git a/dist/assets/icons/Icons8_56.png b/dist/assets/icons/Icons8_56.png deleted file mode 100644 index 5e9cd2f9..00000000 Binary files a/dist/assets/icons/Icons8_56.png and /dev/null differ diff --git a/dist/assets/icons/Icons8_57.png b/dist/assets/icons/Icons8_57.png deleted file mode 100644 index 3f650a40..00000000 Binary files a/dist/assets/icons/Icons8_57.png and /dev/null differ diff --git a/dist/assets/icons/Icons8_58.png b/dist/assets/icons/Icons8_58.png deleted file mode 100644 index 1038be72..00000000 Binary files a/dist/assets/icons/Icons8_58.png and /dev/null differ diff --git a/dist/assets/icons/Icons8_59.png b/dist/assets/icons/Icons8_59.png deleted file mode 100644 index f0f5cb91..00000000 Binary files a/dist/assets/icons/Icons8_59.png and /dev/null differ diff --git a/dist/assets/icons/Icons8_60.png b/dist/assets/icons/Icons8_60.png deleted file mode 100644 index 1bed9a93..00000000 Binary files a/dist/assets/icons/Icons8_60.png and /dev/null differ diff --git a/dist/assets/icons/Icons8_61.png b/dist/assets/icons/Icons8_61.png deleted file mode 100644 index 89e49282..00000000 Binary files a/dist/assets/icons/Icons8_61.png and /dev/null differ diff --git a/dist/assets/icons/Icons8_62.png b/dist/assets/icons/Icons8_62.png deleted file mode 100644 index a3ded25d..00000000 Binary files a/dist/assets/icons/Icons8_62.png and /dev/null differ diff --git a/dist/assets/icons/Icons8_63.png b/dist/assets/icons/Icons8_63.png deleted file mode 100644 index f7474722..00000000 Binary files a/dist/assets/icons/Icons8_63.png and /dev/null differ diff --git a/dist/assets/icons/Icons8_65.png b/dist/assets/icons/Icons8_65.png deleted file mode 100644 index 34d5446b..00000000 Binary files a/dist/assets/icons/Icons8_65.png and /dev/null differ diff --git a/dist/assets/icons/Icons8_66.png b/dist/assets/icons/Icons8_66.png deleted file mode 100644 index 60a6adfb..00000000 Binary files a/dist/assets/icons/Icons8_66.png and /dev/null differ diff --git a/dist/assets/icons/Icons8_67.png b/dist/assets/icons/Icons8_67.png deleted file mode 100644 index ee35eff9..00000000 Binary files a/dist/assets/icons/Icons8_67.png and /dev/null differ diff --git a/dist/assets/icons/Icons8_68.png b/dist/assets/icons/Icons8_68.png deleted file mode 100644 index 16bf9990..00000000 Binary files a/dist/assets/icons/Icons8_68.png and /dev/null differ diff --git a/dist/assets/icons/Icons8_69.png b/dist/assets/icons/Icons8_69.png deleted file mode 100644 index e1f7482b..00000000 Binary files a/dist/assets/icons/Icons8_69.png and /dev/null differ diff --git a/dist/assets/icons/Icons8_70.png b/dist/assets/icons/Icons8_70.png deleted file mode 100644 index 97218788..00000000 Binary files a/dist/assets/icons/Icons8_70.png and /dev/null differ diff --git a/dist/assets/icons/Icons8_71.png b/dist/assets/icons/Icons8_71.png deleted file mode 100644 index a9ed95f4..00000000 Binary files a/dist/assets/icons/Icons8_71.png and /dev/null differ diff --git a/dist/assets/icons/Icons8_72.png b/dist/assets/icons/Icons8_72.png deleted file mode 100644 index 742fd12e..00000000 Binary files a/dist/assets/icons/Icons8_72.png and /dev/null differ diff --git a/dist/assets/icons/Icons8_73.png b/dist/assets/icons/Icons8_73.png deleted file mode 100644 index a010bbf5..00000000 Binary files a/dist/assets/icons/Icons8_73.png and /dev/null differ diff --git a/dist/assets/icons/Icons8_74.png b/dist/assets/icons/Icons8_74.png deleted file mode 100644 index 653b3014..00000000 Binary files a/dist/assets/icons/Icons8_74.png and /dev/null differ diff --git a/dist/assets/icons/Icons8_75.png b/dist/assets/icons/Icons8_75.png deleted file mode 100644 index a368d294..00000000 Binary files a/dist/assets/icons/Icons8_75.png and /dev/null differ diff --git a/dist/assets/icons/Icons8_76.png b/dist/assets/icons/Icons8_76.png deleted file mode 100644 index 49e8940c..00000000 Binary files a/dist/assets/icons/Icons8_76.png and /dev/null differ diff --git a/dist/assets/icons/Icons8_77.png b/dist/assets/icons/Icons8_77.png deleted file mode 100644 index 08c85d7a..00000000 Binary files a/dist/assets/icons/Icons8_77.png and /dev/null differ diff --git a/dist/assets/icons/Icons8_78.png b/dist/assets/icons/Icons8_78.png deleted file mode 100644 index 73d0c333..00000000 Binary files a/dist/assets/icons/Icons8_78.png and /dev/null differ diff --git a/dist/assets/icons/Icons8_79.png b/dist/assets/icons/Icons8_79.png deleted file mode 100644 index 16b7feda..00000000 Binary files a/dist/assets/icons/Icons8_79.png and /dev/null differ diff --git a/dist/assets/icons/Icons8_80.png b/dist/assets/icons/Icons8_80.png deleted file mode 100644 index 36c4c054..00000000 Binary files a/dist/assets/icons/Icons8_80.png and /dev/null differ diff --git a/dist/assets/icons/Icons8_81.png b/dist/assets/icons/Icons8_81.png deleted file mode 100644 index 1941e27c..00000000 Binary files a/dist/assets/icons/Icons8_81.png and /dev/null differ diff --git a/dist/assets/icons/Icons8_83.png b/dist/assets/icons/Icons8_83.png deleted file mode 100644 index f6766abb..00000000 Binary files a/dist/assets/icons/Icons8_83.png and /dev/null differ diff --git a/dist/assets/icons/Icons8_84.png b/dist/assets/icons/Icons8_84.png deleted file mode 100644 index 861a4463..00000000 Binary files a/dist/assets/icons/Icons8_84.png and /dev/null differ diff --git a/dist/assets/icons/Icons8_85.png b/dist/assets/icons/Icons8_85.png deleted file mode 100644 index 5d6604b3..00000000 Binary files a/dist/assets/icons/Icons8_85.png and /dev/null differ diff --git a/dist/assets/icons/Icons8_86.png b/dist/assets/icons/Icons8_86.png deleted file mode 100644 index 2873f7c3..00000000 Binary files a/dist/assets/icons/Icons8_86.png and /dev/null differ diff --git a/dist/assets/icons/Icons8_87.png b/dist/assets/icons/Icons8_87.png deleted file mode 100644 index 1f1df861..00000000 Binary files a/dist/assets/icons/Icons8_87.png and /dev/null differ diff --git a/dist/assets/icons/Icons8_88.png b/dist/assets/icons/Icons8_88.png deleted file mode 100644 index 9a33c853..00000000 Binary files a/dist/assets/icons/Icons8_88.png and /dev/null differ diff --git a/dist/assets/icons/Icons8_89.png b/dist/assets/icons/Icons8_89.png deleted file mode 100644 index b7a51151..00000000 Binary files a/dist/assets/icons/Icons8_89.png and /dev/null differ diff --git a/dist/assets/icons/ability-icons/cutter-ability.svg b/dist/assets/icons/ability-icons/cutter-ability.svg deleted file mode 100644 index 712a43b2..00000000 --- a/dist/assets/icons/ability-icons/cutter-ability.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/dist/assets/icons/ability-icons/ghost-ability.svg b/dist/assets/icons/ability-icons/ghost-ability.svg deleted file mode 100644 index c3939e3f..00000000 --- a/dist/assets/icons/ability-icons/ghost-ability.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/dist/assets/icons/ability-icons/hound-ability.svg b/dist/assets/icons/ability-icons/hound-ability.svg deleted file mode 100644 index a2d3d5ff..00000000 --- a/dist/assets/icons/ability-icons/hound-ability.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/dist/assets/icons/ability-icons/hull-ability.svg b/dist/assets/icons/ability-icons/hull-ability.svg deleted file mode 100644 index ac57df55..00000000 --- a/dist/assets/icons/ability-icons/hull-ability.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/dist/assets/icons/ability-icons/leech-ability.svg b/dist/assets/icons/ability-icons/leech-ability.svg deleted file mode 100644 index d16cb2a5..00000000 --- a/dist/assets/icons/ability-icons/leech-ability.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/dist/assets/icons/ability-icons/lurk-ability.svg b/dist/assets/icons/ability-icons/lurk-ability.svg deleted file mode 100644 index 96cf9ac0..00000000 --- a/dist/assets/icons/ability-icons/lurk-ability.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/dist/assets/icons/ability-icons/slide-ability.svg b/dist/assets/icons/ability-icons/slide-ability.svg deleted file mode 100644 index 5dbf63c5..00000000 --- a/dist/assets/icons/ability-icons/slide-ability.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/dist/assets/icons/ability-icons/spider-ability.svg b/dist/assets/icons/ability-icons/spider-ability.svg deleted file mode 100644 index de931556..00000000 --- a/dist/assets/icons/ability-icons/spider-ability.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/dist/assets/icons/ability-icons/vampire-ability.svg b/dist/assets/icons/ability-icons/vampire-ability.svg deleted file mode 100644 index 2136f782..00000000 --- a/dist/assets/icons/ability-icons/vampire-ability.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/dist/assets/icons/ability-icons/whisper-ability.svg b/dist/assets/icons/ability-icons/whisper-ability.svg deleted file mode 100644 index ef6b9602..00000000 --- a/dist/assets/icons/ability-icons/whisper-ability.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/dist/assets/icons/barrel.svg b/dist/assets/icons/barrel.svg deleted file mode 100644 index da27e369..00000000 --- a/dist/assets/icons/barrel.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/dist/assets/icons/bubbling-flask.svg b/dist/assets/icons/bubbling-flask.svg deleted file mode 100644 index 5193bca6..00000000 --- a/dist/assets/icons/bubbling-flask.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/dist/assets/icons/class-icons/cutter-trans.svg b/dist/assets/icons/class-icons/cutter-trans.svg deleted file mode 100644 index 183d07b8..00000000 --- a/dist/assets/icons/class-icons/cutter-trans.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/dist/assets/icons/class-icons/ghost-trans.svg b/dist/assets/icons/class-icons/ghost-trans.svg deleted file mode 100644 index b2da52d5..00000000 --- a/dist/assets/icons/class-icons/ghost-trans.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/dist/assets/icons/class-icons/hound-trans.svg b/dist/assets/icons/class-icons/hound-trans.svg deleted file mode 100644 index 751aac19..00000000 --- a/dist/assets/icons/class-icons/hound-trans.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/dist/assets/icons/class-icons/hull-trans.svg b/dist/assets/icons/class-icons/hull-trans.svg deleted file mode 100644 index e29f84f7..00000000 --- a/dist/assets/icons/class-icons/hull-trans.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/dist/assets/icons/class-icons/leech-trans.svg b/dist/assets/icons/class-icons/leech-trans.svg deleted file mode 100644 index a2060bd7..00000000 --- a/dist/assets/icons/class-icons/leech-trans.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/dist/assets/icons/class-icons/lurk-trans.svg b/dist/assets/icons/class-icons/lurk-trans.svg deleted file mode 100644 index 9cbafc8c..00000000 --- a/dist/assets/icons/class-icons/lurk-trans.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/dist/assets/icons/class-icons/slide-trans.svg b/dist/assets/icons/class-icons/slide-trans.svg deleted file mode 100644 index 78f8ff86..00000000 --- a/dist/assets/icons/class-icons/slide-trans.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/dist/assets/icons/class-icons/spider-trans.svg b/dist/assets/icons/class-icons/spider-trans.svg deleted file mode 100644 index 90a7ac6d..00000000 --- a/dist/assets/icons/class-icons/spider-trans.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/dist/assets/icons/class-icons/vampire-trans.svg b/dist/assets/icons/class-icons/vampire-trans.svg deleted file mode 100644 index 99803cd8..00000000 --- a/dist/assets/icons/class-icons/vampire-trans.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/dist/assets/icons/class-icons/whisper-trans.svg b/dist/assets/icons/class-icons/whisper-trans.svg deleted file mode 100644 index d3baeca4..00000000 --- a/dist/assets/icons/class-icons/whisper-trans.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/dist/assets/icons/cohort-gang-type-icons/adepts.svg b/dist/assets/icons/cohort-gang-type-icons/adepts.svg deleted file mode 100644 index 7529fca6..00000000 --- a/dist/assets/icons/cohort-gang-type-icons/adepts.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/dist/assets/icons/cohort-gang-type-icons/elite-adepts.svg b/dist/assets/icons/cohort-gang-type-icons/elite-adepts.svg deleted file mode 100644 index fd63f786..00000000 --- a/dist/assets/icons/cohort-gang-type-icons/elite-adepts.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/dist/assets/icons/cohort-gang-type-icons/elite-rooks.svg b/dist/assets/icons/cohort-gang-type-icons/elite-rooks.svg deleted file mode 100644 index 56b42720..00000000 --- a/dist/assets/icons/cohort-gang-type-icons/elite-rooks.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/dist/assets/icons/cohort-gang-type-icons/elite-rovers.svg b/dist/assets/icons/cohort-gang-type-icons/elite-rovers.svg deleted file mode 100644 index d8e64cf1..00000000 --- a/dist/assets/icons/cohort-gang-type-icons/elite-rovers.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/dist/assets/icons/cohort-gang-type-icons/elite-skulks.svg b/dist/assets/icons/cohort-gang-type-icons/elite-skulks.svg deleted file mode 100644 index 6e317896..00000000 --- a/dist/assets/icons/cohort-gang-type-icons/elite-skulks.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/dist/assets/icons/cohort-gang-type-icons/elite-thugs.svg b/dist/assets/icons/cohort-gang-type-icons/elite-thugs.svg deleted file mode 100644 index 5139833b..00000000 --- a/dist/assets/icons/cohort-gang-type-icons/elite-thugs.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/dist/assets/icons/cohort-gang-type-icons/pet.svg b/dist/assets/icons/cohort-gang-type-icons/pet.svg deleted file mode 100644 index 0f216047..00000000 --- a/dist/assets/icons/cohort-gang-type-icons/pet.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/dist/assets/icons/cohort-gang-type-icons/rooks.svg b/dist/assets/icons/cohort-gang-type-icons/rooks.svg deleted file mode 100644 index 80f6a6a0..00000000 --- a/dist/assets/icons/cohort-gang-type-icons/rooks.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/dist/assets/icons/cohort-gang-type-icons/rovers.svg b/dist/assets/icons/cohort-gang-type-icons/rovers.svg deleted file mode 100644 index c6a46c79..00000000 --- a/dist/assets/icons/cohort-gang-type-icons/rovers.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/dist/assets/icons/cohort-gang-type-icons/skulks.svg b/dist/assets/icons/cohort-gang-type-icons/skulks.svg deleted file mode 100644 index ce566b05..00000000 --- a/dist/assets/icons/cohort-gang-type-icons/skulks.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/dist/assets/icons/cohort-gang-type-icons/thugs.svg b/dist/assets/icons/cohort-gang-type-icons/thugs.svg deleted file mode 100644 index 62ab43e2..00000000 --- a/dist/assets/icons/cohort-gang-type-icons/thugs.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/dist/assets/icons/cohort-gang-type-icons/vehicle.svg b/dist/assets/icons/cohort-gang-type-icons/vehicle.svg deleted file mode 100644 index d5d7b8d5..00000000 --- a/dist/assets/icons/cohort-gang-type-icons/vehicle.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/dist/assets/icons/consequence-icons/accept-complication-major.svg b/dist/assets/icons/consequence-icons/accept-complication-major.svg deleted file mode 100644 index f6149a73..00000000 --- a/dist/assets/icons/consequence-icons/accept-complication-major.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/dist/assets/icons/consequence-icons/accept-complication-minor.svg b/dist/assets/icons/consequence-icons/accept-complication-minor.svg deleted file mode 100644 index c2956890..00000000 --- a/dist/assets/icons/consequence-icons/accept-complication-minor.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/dist/assets/icons/consequence-icons/accept-complication-serious.svg b/dist/assets/icons/consequence-icons/accept-complication-serious.svg deleted file mode 100644 index d23af841..00000000 --- a/dist/assets/icons/consequence-icons/accept-complication-serious.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/dist/assets/icons/consequence-icons/accept-harm-insight-1.svg b/dist/assets/icons/consequence-icons/accept-harm-insight-1.svg deleted file mode 100644 index 621cf47c..00000000 --- a/dist/assets/icons/consequence-icons/accept-harm-insight-1.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/dist/assets/icons/consequence-icons/accept-harm-insight-2.svg b/dist/assets/icons/consequence-icons/accept-harm-insight-2.svg deleted file mode 100644 index 7c9084e3..00000000 --- a/dist/assets/icons/consequence-icons/accept-harm-insight-2.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/dist/assets/icons/consequence-icons/accept-harm-insight-3.svg b/dist/assets/icons/consequence-icons/accept-harm-insight-3.svg deleted file mode 100644 index 94906c01..00000000 --- a/dist/assets/icons/consequence-icons/accept-harm-insight-3.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/dist/assets/icons/consequence-icons/accept-harm-insight-4.svg b/dist/assets/icons/consequence-icons/accept-harm-insight-4.svg deleted file mode 100644 index a3ba0618..00000000 --- a/dist/assets/icons/consequence-icons/accept-harm-insight-4.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/dist/assets/icons/consequence-icons/accept-harm-prowess-1.svg b/dist/assets/icons/consequence-icons/accept-harm-prowess-1.svg deleted file mode 100644 index 91bb1c66..00000000 --- a/dist/assets/icons/consequence-icons/accept-harm-prowess-1.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/dist/assets/icons/consequence-icons/accept-harm-prowess-2.svg b/dist/assets/icons/consequence-icons/accept-harm-prowess-2.svg deleted file mode 100644 index ed442d94..00000000 --- a/dist/assets/icons/consequence-icons/accept-harm-prowess-2.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/dist/assets/icons/consequence-icons/accept-harm-prowess-3.svg b/dist/assets/icons/consequence-icons/accept-harm-prowess-3.svg deleted file mode 100644 index 08260892..00000000 --- a/dist/assets/icons/consequence-icons/accept-harm-prowess-3.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/dist/assets/icons/consequence-icons/accept-harm-prowess-4.svg b/dist/assets/icons/consequence-icons/accept-harm-prowess-4.svg deleted file mode 100644 index d5535475..00000000 --- a/dist/assets/icons/consequence-icons/accept-harm-prowess-4.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/dist/assets/icons/consequence-icons/accept-harm-resolve-1.svg b/dist/assets/icons/consequence-icons/accept-harm-resolve-1.svg deleted file mode 100644 index 49f8485a..00000000 --- a/dist/assets/icons/consequence-icons/accept-harm-resolve-1.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/dist/assets/icons/consequence-icons/accept-harm-resolve-2.svg b/dist/assets/icons/consequence-icons/accept-harm-resolve-2.svg deleted file mode 100644 index e118d451..00000000 --- a/dist/assets/icons/consequence-icons/accept-harm-resolve-2.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/dist/assets/icons/consequence-icons/accept-harm-resolve-3.svg b/dist/assets/icons/consequence-icons/accept-harm-resolve-3.svg deleted file mode 100644 index cde11332..00000000 --- a/dist/assets/icons/consequence-icons/accept-harm-resolve-3.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/dist/assets/icons/consequence-icons/accept-harm-resolve-4.svg b/dist/assets/icons/consequence-icons/accept-harm-resolve-4.svg deleted file mode 100644 index 2d6b3cd6..00000000 --- a/dist/assets/icons/consequence-icons/accept-harm-resolve-4.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/dist/assets/icons/consequence-icons/accept-lost-opportunity.svg b/dist/assets/icons/consequence-icons/accept-lost-opportunity.svg deleted file mode 100644 index a6e68f88..00000000 --- a/dist/assets/icons/consequence-icons/accept-lost-opportunity.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/dist/assets/icons/consequence-icons/accept-reduced-effect.svg b/dist/assets/icons/consequence-icons/accept-reduced-effect.svg deleted file mode 100644 index 79193427..00000000 --- a/dist/assets/icons/consequence-icons/accept-reduced-effect.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/dist/assets/icons/consequence-icons/accept-worse-position.svg b/dist/assets/icons/consequence-icons/accept-worse-position.svg deleted file mode 100644 index d6b1b79d..00000000 --- a/dist/assets/icons/consequence-icons/accept-worse-position.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/dist/assets/icons/consequence-icons/base-complication-major.svg b/dist/assets/icons/consequence-icons/base-complication-major.svg deleted file mode 100644 index 6cfb9a00..00000000 --- a/dist/assets/icons/consequence-icons/base-complication-major.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/dist/assets/icons/consequence-icons/base-complication-minor.svg b/dist/assets/icons/consequence-icons/base-complication-minor.svg deleted file mode 100644 index df5b4f82..00000000 --- a/dist/assets/icons/consequence-icons/base-complication-minor.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/dist/assets/icons/consequence-icons/base-complication-serious.svg b/dist/assets/icons/consequence-icons/base-complication-serious.svg deleted file mode 100644 index e3ebcded..00000000 --- a/dist/assets/icons/consequence-icons/base-complication-serious.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/dist/assets/icons/consequence-icons/base-harm-insight-1.svg b/dist/assets/icons/consequence-icons/base-harm-insight-1.svg deleted file mode 100644 index 71eba616..00000000 --- a/dist/assets/icons/consequence-icons/base-harm-insight-1.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/dist/assets/icons/consequence-icons/base-harm-insight-2.svg b/dist/assets/icons/consequence-icons/base-harm-insight-2.svg deleted file mode 100644 index 1b426b42..00000000 --- a/dist/assets/icons/consequence-icons/base-harm-insight-2.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/dist/assets/icons/consequence-icons/base-harm-insight-3.svg b/dist/assets/icons/consequence-icons/base-harm-insight-3.svg deleted file mode 100644 index 4cac22cf..00000000 --- a/dist/assets/icons/consequence-icons/base-harm-insight-3.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/dist/assets/icons/consequence-icons/base-harm-insight-4.svg b/dist/assets/icons/consequence-icons/base-harm-insight-4.svg deleted file mode 100644 index b0561b1c..00000000 --- a/dist/assets/icons/consequence-icons/base-harm-insight-4.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/dist/assets/icons/consequence-icons/base-harm-prowess-1.svg b/dist/assets/icons/consequence-icons/base-harm-prowess-1.svg deleted file mode 100644 index 31ec5f89..00000000 --- a/dist/assets/icons/consequence-icons/base-harm-prowess-1.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/dist/assets/icons/consequence-icons/base-harm-prowess-2.svg b/dist/assets/icons/consequence-icons/base-harm-prowess-2.svg deleted file mode 100644 index f5e6f9ae..00000000 --- a/dist/assets/icons/consequence-icons/base-harm-prowess-2.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/dist/assets/icons/consequence-icons/base-harm-prowess-3.svg b/dist/assets/icons/consequence-icons/base-harm-prowess-3.svg deleted file mode 100644 index f32d2abc..00000000 --- a/dist/assets/icons/consequence-icons/base-harm-prowess-3.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/dist/assets/icons/consequence-icons/base-harm-prowess-4.svg b/dist/assets/icons/consequence-icons/base-harm-prowess-4.svg deleted file mode 100644 index 371aa287..00000000 --- a/dist/assets/icons/consequence-icons/base-harm-prowess-4.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/dist/assets/icons/consequence-icons/base-harm-resolve-1.svg b/dist/assets/icons/consequence-icons/base-harm-resolve-1.svg deleted file mode 100644 index 41f3ff68..00000000 --- a/dist/assets/icons/consequence-icons/base-harm-resolve-1.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/dist/assets/icons/consequence-icons/base-harm-resolve-2.svg b/dist/assets/icons/consequence-icons/base-harm-resolve-2.svg deleted file mode 100644 index 37392515..00000000 --- a/dist/assets/icons/consequence-icons/base-harm-resolve-2.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/dist/assets/icons/consequence-icons/base-harm-resolve-3.svg b/dist/assets/icons/consequence-icons/base-harm-resolve-3.svg deleted file mode 100644 index 5574afb1..00000000 --- a/dist/assets/icons/consequence-icons/base-harm-resolve-3.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/dist/assets/icons/consequence-icons/base-harm-resolve-4.svg b/dist/assets/icons/consequence-icons/base-harm-resolve-4.svg deleted file mode 100644 index 5310259d..00000000 --- a/dist/assets/icons/consequence-icons/base-harm-resolve-4.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/dist/assets/icons/consequence-icons/base-lost-opportunity.svg b/dist/assets/icons/consequence-icons/base-lost-opportunity.svg deleted file mode 100644 index 3f82d79b..00000000 --- a/dist/assets/icons/consequence-icons/base-lost-opportunity.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/dist/assets/icons/consequence-icons/base-reduced-effect.svg b/dist/assets/icons/consequence-icons/base-reduced-effect.svg deleted file mode 100644 index 8c6ce439..00000000 --- a/dist/assets/icons/consequence-icons/base-reduced-effect.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/dist/assets/icons/consequence-icons/base-worse-position.svg b/dist/assets/icons/consequence-icons/base-worse-position.svg deleted file mode 100644 index f8ecb832..00000000 --- a/dist/assets/icons/consequence-icons/base-worse-position.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/dist/assets/icons/consequence-icons/gm-csq-button.svg b/dist/assets/icons/consequence-icons/gm-csq-button.svg deleted file mode 100644 index a8cf0df5..00000000 --- a/dist/assets/icons/consequence-icons/gm-csq-button.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/dist/assets/icons/consequence-icons/resist-complication-major.svg b/dist/assets/icons/consequence-icons/resist-complication-major.svg deleted file mode 100644 index 291d3320..00000000 --- a/dist/assets/icons/consequence-icons/resist-complication-major.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/dist/assets/icons/consequence-icons/resist-complication-minor.svg b/dist/assets/icons/consequence-icons/resist-complication-minor.svg deleted file mode 100644 index 30b79851..00000000 --- a/dist/assets/icons/consequence-icons/resist-complication-minor.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/dist/assets/icons/consequence-icons/resist-complication-serious.svg b/dist/assets/icons/consequence-icons/resist-complication-serious.svg deleted file mode 100644 index 0957cf80..00000000 --- a/dist/assets/icons/consequence-icons/resist-complication-serious.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/dist/assets/icons/consequence-icons/resist-harm-insight-1.svg b/dist/assets/icons/consequence-icons/resist-harm-insight-1.svg deleted file mode 100644 index e3649ac5..00000000 --- a/dist/assets/icons/consequence-icons/resist-harm-insight-1.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/dist/assets/icons/consequence-icons/resist-harm-insight-2.svg b/dist/assets/icons/consequence-icons/resist-harm-insight-2.svg deleted file mode 100644 index 735daeaa..00000000 --- a/dist/assets/icons/consequence-icons/resist-harm-insight-2.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/dist/assets/icons/consequence-icons/resist-harm-insight-3.svg b/dist/assets/icons/consequence-icons/resist-harm-insight-3.svg deleted file mode 100644 index d4c1b2fc..00000000 --- a/dist/assets/icons/consequence-icons/resist-harm-insight-3.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/dist/assets/icons/consequence-icons/resist-harm-insight-4.svg b/dist/assets/icons/consequence-icons/resist-harm-insight-4.svg deleted file mode 100644 index 6f0a2220..00000000 --- a/dist/assets/icons/consequence-icons/resist-harm-insight-4.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/dist/assets/icons/consequence-icons/resist-harm-prowess-1.svg b/dist/assets/icons/consequence-icons/resist-harm-prowess-1.svg deleted file mode 100644 index 65fc1d22..00000000 --- a/dist/assets/icons/consequence-icons/resist-harm-prowess-1.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/dist/assets/icons/consequence-icons/resist-harm-prowess-2.svg b/dist/assets/icons/consequence-icons/resist-harm-prowess-2.svg deleted file mode 100644 index 55da1919..00000000 --- a/dist/assets/icons/consequence-icons/resist-harm-prowess-2.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/dist/assets/icons/consequence-icons/resist-harm-prowess-3.svg b/dist/assets/icons/consequence-icons/resist-harm-prowess-3.svg deleted file mode 100644 index feeae5ff..00000000 --- a/dist/assets/icons/consequence-icons/resist-harm-prowess-3.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/dist/assets/icons/consequence-icons/resist-harm-prowess-4.svg b/dist/assets/icons/consequence-icons/resist-harm-prowess-4.svg deleted file mode 100644 index 9aa34f87..00000000 --- a/dist/assets/icons/consequence-icons/resist-harm-prowess-4.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/dist/assets/icons/consequence-icons/resist-harm-resolve-1.svg b/dist/assets/icons/consequence-icons/resist-harm-resolve-1.svg deleted file mode 100644 index 53ed0a0f..00000000 --- a/dist/assets/icons/consequence-icons/resist-harm-resolve-1.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/dist/assets/icons/consequence-icons/resist-harm-resolve-2.svg b/dist/assets/icons/consequence-icons/resist-harm-resolve-2.svg deleted file mode 100644 index 4c8f7777..00000000 --- a/dist/assets/icons/consequence-icons/resist-harm-resolve-2.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/dist/assets/icons/consequence-icons/resist-harm-resolve-3.svg b/dist/assets/icons/consequence-icons/resist-harm-resolve-3.svg deleted file mode 100644 index c0df3e9f..00000000 --- a/dist/assets/icons/consequence-icons/resist-harm-resolve-3.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/dist/assets/icons/consequence-icons/resist-harm-resolve-4.svg b/dist/assets/icons/consequence-icons/resist-harm-resolve-4.svg deleted file mode 100644 index 174ddaec..00000000 --- a/dist/assets/icons/consequence-icons/resist-harm-resolve-4.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/dist/assets/icons/consequence-icons/resist-lost-opportunity.svg b/dist/assets/icons/consequence-icons/resist-lost-opportunity.svg deleted file mode 100644 index cadfd9fe..00000000 --- a/dist/assets/icons/consequence-icons/resist-lost-opportunity.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/dist/assets/icons/consequence-icons/resist-reduced-effect.svg b/dist/assets/icons/consequence-icons/resist-reduced-effect.svg deleted file mode 100644 index 7e8a4a15..00000000 --- a/dist/assets/icons/consequence-icons/resist-reduced-effect.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/dist/assets/icons/consequence-icons/resist-worse-position.svg b/dist/assets/icons/consequence-icons/resist-worse-position.svg deleted file mode 100644 index 0f45043b..00000000 --- a/dist/assets/icons/consequence-icons/resist-worse-position.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/dist/assets/icons/consequence-icons/special-complication-major.svg b/dist/assets/icons/consequence-icons/special-complication-major.svg deleted file mode 100644 index dad77b86..00000000 --- a/dist/assets/icons/consequence-icons/special-complication-major.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/dist/assets/icons/consequence-icons/special-complication-minor.svg b/dist/assets/icons/consequence-icons/special-complication-minor.svg deleted file mode 100644 index 366f967b..00000000 --- a/dist/assets/icons/consequence-icons/special-complication-minor.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/dist/assets/icons/consequence-icons/special-complication-serious.svg b/dist/assets/icons/consequence-icons/special-complication-serious.svg deleted file mode 100644 index 04bf1a54..00000000 --- a/dist/assets/icons/consequence-icons/special-complication-serious.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/dist/assets/icons/consequence-icons/special-harm-insight-1.svg b/dist/assets/icons/consequence-icons/special-harm-insight-1.svg deleted file mode 100644 index 11b5096e..00000000 --- a/dist/assets/icons/consequence-icons/special-harm-insight-1.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/dist/assets/icons/consequence-icons/special-harm-insight-2.svg b/dist/assets/icons/consequence-icons/special-harm-insight-2.svg deleted file mode 100644 index c41117d5..00000000 --- a/dist/assets/icons/consequence-icons/special-harm-insight-2.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/dist/assets/icons/consequence-icons/special-harm-insight-3.svg b/dist/assets/icons/consequence-icons/special-harm-insight-3.svg deleted file mode 100644 index 43b6a98f..00000000 --- a/dist/assets/icons/consequence-icons/special-harm-insight-3.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/dist/assets/icons/consequence-icons/special-harm-insight-4.svg b/dist/assets/icons/consequence-icons/special-harm-insight-4.svg deleted file mode 100644 index 6456f135..00000000 --- a/dist/assets/icons/consequence-icons/special-harm-insight-4.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/dist/assets/icons/consequence-icons/special-harm-prowess-1.svg b/dist/assets/icons/consequence-icons/special-harm-prowess-1.svg deleted file mode 100644 index 778901f9..00000000 --- a/dist/assets/icons/consequence-icons/special-harm-prowess-1.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/dist/assets/icons/consequence-icons/special-harm-prowess-2.svg b/dist/assets/icons/consequence-icons/special-harm-prowess-2.svg deleted file mode 100644 index d60447a9..00000000 --- a/dist/assets/icons/consequence-icons/special-harm-prowess-2.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/dist/assets/icons/consequence-icons/special-harm-prowess-3.svg b/dist/assets/icons/consequence-icons/special-harm-prowess-3.svg deleted file mode 100644 index 25adf7ab..00000000 --- a/dist/assets/icons/consequence-icons/special-harm-prowess-3.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/dist/assets/icons/consequence-icons/special-harm-prowess-4.svg b/dist/assets/icons/consequence-icons/special-harm-prowess-4.svg deleted file mode 100644 index 9a6c0a6a..00000000 --- a/dist/assets/icons/consequence-icons/special-harm-prowess-4.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/dist/assets/icons/consequence-icons/special-harm-resolve-1.svg b/dist/assets/icons/consequence-icons/special-harm-resolve-1.svg deleted file mode 100644 index 55f1e5a7..00000000 --- a/dist/assets/icons/consequence-icons/special-harm-resolve-1.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/dist/assets/icons/consequence-icons/special-harm-resolve-2.svg b/dist/assets/icons/consequence-icons/special-harm-resolve-2.svg deleted file mode 100644 index 13f36679..00000000 --- a/dist/assets/icons/consequence-icons/special-harm-resolve-2.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/dist/assets/icons/consequence-icons/special-harm-resolve-3.svg b/dist/assets/icons/consequence-icons/special-harm-resolve-3.svg deleted file mode 100644 index 9814629b..00000000 --- a/dist/assets/icons/consequence-icons/special-harm-resolve-3.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/dist/assets/icons/consequence-icons/special-harm-resolve-4.svg b/dist/assets/icons/consequence-icons/special-harm-resolve-4.svg deleted file mode 100644 index eda66f41..00000000 --- a/dist/assets/icons/consequence-icons/special-harm-resolve-4.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/dist/assets/icons/consequence-icons/special-lost-opportunity.svg b/dist/assets/icons/consequence-icons/special-lost-opportunity.svg deleted file mode 100644 index 1d1f8852..00000000 --- a/dist/assets/icons/consequence-icons/special-lost-opportunity.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/dist/assets/icons/consequence-icons/special-reduced-effect.svg b/dist/assets/icons/consequence-icons/special-reduced-effect.svg deleted file mode 100644 index cae85b8e..00000000 --- a/dist/assets/icons/consequence-icons/special-reduced-effect.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/dist/assets/icons/consequence-icons/special-worse-position.svg b/dist/assets/icons/consequence-icons/special-worse-position.svg deleted file mode 100644 index 3274a13a..00000000 --- a/dist/assets/icons/consequence-icons/special-worse-position.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/dist/assets/icons/crew-upgrade-icons/elite_adepts.png b/dist/assets/icons/crew-upgrade-icons/elite_adepts.png deleted file mode 100644 index 3104f2d1..00000000 Binary files a/dist/assets/icons/crew-upgrade-icons/elite_adepts.png and /dev/null differ diff --git a/dist/assets/icons/crew-upgrade-icons/elite_rooks.png b/dist/assets/icons/crew-upgrade-icons/elite_rooks.png deleted file mode 100644 index c189a889..00000000 Binary files a/dist/assets/icons/crew-upgrade-icons/elite_rooks.png and /dev/null differ diff --git a/dist/assets/icons/crew-upgrade-icons/elite_rovers.png b/dist/assets/icons/crew-upgrade-icons/elite_rovers.png deleted file mode 100644 index 900461ef..00000000 Binary files a/dist/assets/icons/crew-upgrade-icons/elite_rovers.png and /dev/null differ diff --git a/dist/assets/icons/crew-upgrade-icons/elite_skulks.png b/dist/assets/icons/crew-upgrade-icons/elite_skulks.png deleted file mode 100644 index cd9cb15f..00000000 Binary files a/dist/assets/icons/crew-upgrade-icons/elite_skulks.png and /dev/null differ diff --git a/dist/assets/icons/crew-upgrade-icons/elite_thugs.png b/dist/assets/icons/crew-upgrade-icons/elite_thugs.png deleted file mode 100644 index 8398dfee..00000000 Binary files a/dist/assets/icons/crew-upgrade-icons/elite_thugs.png and /dev/null differ diff --git a/dist/assets/icons/curly-mask.svg b/dist/assets/icons/curly-mask.svg deleted file mode 100644 index 862518a8..00000000 --- a/dist/assets/icons/curly-mask.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/dist/assets/icons/default.svg b/dist/assets/icons/default.svg deleted file mode 100644 index d63f3086..00000000 --- a/dist/assets/icons/default.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/dist/assets/icons/dotline-icons/coin-empty-hover.svg b/dist/assets/icons/dotline-icons/coin-empty-hover.svg deleted file mode 100644 index 61f527ba..00000000 --- a/dist/assets/icons/dotline-icons/coin-empty-hover.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/dist/assets/icons/dotline-icons/coin-empty.svg b/dist/assets/icons/dotline-icons/coin-empty.svg deleted file mode 100644 index daf7ea75..00000000 --- a/dist/assets/icons/dotline-icons/coin-empty.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/dist/assets/icons/dotline-icons/coin-full-hover.svg b/dist/assets/icons/dotline-icons/coin-full-hover.svg deleted file mode 100644 index 7694c0a7..00000000 --- a/dist/assets/icons/dotline-icons/coin-full-hover.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/dist/assets/icons/dotline-icons/coin-full.svg b/dist/assets/icons/dotline-icons/coin-full.svg deleted file mode 100644 index 046d6a18..00000000 --- a/dist/assets/icons/dotline-icons/coin-full.svg +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - - - diff --git a/dist/assets/icons/dotline-icons/coin-ten-hover.svg b/dist/assets/icons/dotline-icons/coin-ten-hover.svg deleted file mode 100644 index c3b3c3ff..00000000 --- a/dist/assets/icons/dotline-icons/coin-ten-hover.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/dist/assets/icons/dotline-icons/coin-ten.svg b/dist/assets/icons/dotline-icons/coin-ten.svg deleted file mode 100644 index e1acf832..00000000 --- a/dist/assets/icons/dotline-icons/coin-ten.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/dist/assets/icons/dotline-icons/dot-empty-hover.svg b/dist/assets/icons/dotline-icons/dot-empty-hover.svg deleted file mode 100644 index 825fa234..00000000 --- a/dist/assets/icons/dotline-icons/dot-empty-hover.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/dist/assets/icons/dotline-icons/dot-empty.svg b/dist/assets/icons/dotline-icons/dot-empty.svg deleted file mode 100644 index e238d8c3..00000000 --- a/dist/assets/icons/dotline-icons/dot-empty.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/dist/assets/icons/dotline-icons/dot-full-hover.svg b/dist/assets/icons/dotline-icons/dot-full-hover.svg deleted file mode 100644 index ec863e70..00000000 --- a/dist/assets/icons/dotline-icons/dot-full-hover.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/dist/assets/icons/dotline-icons/dot-full.svg b/dist/assets/icons/dotline-icons/dot-full.svg deleted file mode 100644 index 18481045..00000000 --- a/dist/assets/icons/dotline-icons/dot-full.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/dist/assets/icons/dotline-icons/dot-zero.svg b/dist/assets/icons/dotline-icons/dot-zero.svg deleted file mode 100644 index f10c2850..00000000 --- a/dist/assets/icons/dotline-icons/dot-zero.svg +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - diff --git a/dist/assets/icons/dotline-icons/teeth/long-simple-empty.svg b/dist/assets/icons/dotline-icons/teeth/long-simple-empty.svg deleted file mode 100644 index dc75ee3f..00000000 --- a/dist/assets/icons/dotline-icons/teeth/long-simple-empty.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - diff --git a/dist/assets/icons/dotline-icons/teeth/long-simple-full.svg b/dist/assets/icons/dotline-icons/teeth/long-simple-full.svg deleted file mode 100644 index a40ab720..00000000 --- a/dist/assets/icons/dotline-icons/teeth/long-simple-full.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - diff --git a/dist/assets/icons/dotline-icons/teeth/long-strong-empty.svg b/dist/assets/icons/dotline-icons/teeth/long-strong-empty.svg deleted file mode 100644 index 7385071a..00000000 --- a/dist/assets/icons/dotline-icons/teeth/long-strong-empty.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - diff --git a/dist/assets/icons/dotline-icons/teeth/long-strong-full.svg b/dist/assets/icons/dotline-icons/teeth/long-strong-full.svg deleted file mode 100644 index 4bc41167..00000000 --- a/dist/assets/icons/dotline-icons/teeth/long-strong-full.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - diff --git a/dist/assets/icons/dotline-icons/teeth/long-weak-empty.svg b/dist/assets/icons/dotline-icons/teeth/long-weak-empty.svg deleted file mode 100644 index 78699e61..00000000 --- a/dist/assets/icons/dotline-icons/teeth/long-weak-empty.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - diff --git a/dist/assets/icons/dotline-icons/teeth/long-weak-full.svg b/dist/assets/icons/dotline-icons/teeth/long-weak-full.svg deleted file mode 100644 index 13bf911d..00000000 --- a/dist/assets/icons/dotline-icons/teeth/long-weak-full.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - diff --git a/dist/assets/icons/dotline-icons/teeth/med-simple-empty.svg b/dist/assets/icons/dotline-icons/teeth/med-simple-empty.svg deleted file mode 100644 index ee084590..00000000 --- a/dist/assets/icons/dotline-icons/teeth/med-simple-empty.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - diff --git a/dist/assets/icons/dotline-icons/teeth/med-simple-full.svg b/dist/assets/icons/dotline-icons/teeth/med-simple-full.svg deleted file mode 100644 index 80b0379e..00000000 --- a/dist/assets/icons/dotline-icons/teeth/med-simple-full.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - diff --git a/dist/assets/icons/dotline-icons/teeth/short-strong-empty.svg b/dist/assets/icons/dotline-icons/teeth/short-strong-empty.svg deleted file mode 100644 index 21d85945..00000000 --- a/dist/assets/icons/dotline-icons/teeth/short-strong-empty.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - diff --git a/dist/assets/icons/dotline-icons/teeth/short-strong-full.svg b/dist/assets/icons/dotline-icons/teeth/short-strong-full.svg deleted file mode 100644 index 52c86d13..00000000 --- a/dist/assets/icons/dotline-icons/teeth/short-strong-full.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - diff --git a/dist/assets/icons/dotline-icons/teeth/short-weak-empty.svg b/dist/assets/icons/dotline-icons/teeth/short-weak-empty.svg deleted file mode 100644 index ebe74bdf..00000000 --- a/dist/assets/icons/dotline-icons/teeth/short-weak-empty.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - diff --git a/dist/assets/icons/dotline-icons/teeth/short-weak-full.svg b/dist/assets/icons/dotline-icons/teeth/short-weak-full.svg deleted file mode 100644 index c0a0cb3c..00000000 --- a/dist/assets/icons/dotline-icons/teeth/short-weak-full.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - diff --git a/dist/assets/icons/drink-me.svg b/dist/assets/icons/drink-me.svg deleted file mode 100644 index a8d146bf..00000000 --- a/dist/assets/icons/drink-me.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/dist/assets/icons/effect-icons/default.png b/dist/assets/icons/effect-icons/default.png deleted file mode 100644 index 430d9f71..00000000 Binary files a/dist/assets/icons/effect-icons/default.png and /dev/null differ diff --git a/dist/assets/icons/item-icons/a-blade-or-two.png b/dist/assets/icons/item-icons/a-blade-or-two.png deleted file mode 100644 index 43533a06..00000000 Binary files a/dist/assets/icons/item-icons/a-blade-or-two.png and /dev/null differ diff --git a/dist/assets/icons/item-icons/a-large-weapon.png b/dist/assets/icons/item-icons/a-large-weapon.png deleted file mode 100644 index c47b0e8d..00000000 Binary files a/dist/assets/icons/item-icons/a-large-weapon.png and /dev/null differ diff --git a/dist/assets/icons/item-icons/a-pistol.png b/dist/assets/icons/item-icons/a-pistol.png deleted file mode 100644 index abf2e9c5..00000000 Binary files a/dist/assets/icons/item-icons/a-pistol.png and /dev/null differ diff --git a/dist/assets/icons/item-icons/an-unusual-weapon.png b/dist/assets/icons/item-icons/an-unusual-weapon.png deleted file mode 100644 index 6114e07e..00000000 Binary files a/dist/assets/icons/item-icons/an-unusual-weapon.png and /dev/null differ diff --git a/dist/assets/icons/item-icons/arcane-implements.png b/dist/assets/icons/item-icons/arcane-implements.png deleted file mode 100644 index 84396036..00000000 Binary files a/dist/assets/icons/item-icons/arcane-implements.png and /dev/null differ diff --git a/dist/assets/icons/item-icons/armor-heavy-hull.png b/dist/assets/icons/item-icons/armor-heavy-hull.png deleted file mode 100644 index cc32b743..00000000 Binary files a/dist/assets/icons/item-icons/armor-heavy-hull.png and /dev/null differ diff --git a/dist/assets/icons/item-icons/armor-heavy.png b/dist/assets/icons/item-icons/armor-heavy.png deleted file mode 100644 index f932c079..00000000 Binary files a/dist/assets/icons/item-icons/armor-heavy.png and /dev/null differ diff --git a/dist/assets/icons/item-icons/armor-light-hull.png b/dist/assets/icons/item-icons/armor-light-hull.png deleted file mode 100644 index 33029f50..00000000 Binary files a/dist/assets/icons/item-icons/armor-light-hull.png and /dev/null differ diff --git a/dist/assets/icons/item-icons/armor-light.png b/dist/assets/icons/item-icons/armor-light.png deleted file mode 100644 index 28823e7a..00000000 Binary files a/dist/assets/icons/item-icons/armor-light.png and /dev/null differ diff --git a/dist/assets/icons/item-icons/bandolier.png b/dist/assets/icons/item-icons/bandolier.png deleted file mode 100644 index 4594e1ea..00000000 Binary files a/dist/assets/icons/item-icons/bandolier.png and /dev/null differ diff --git a/dist/assets/icons/item-icons/blowgun-and-darts-and-syringes.png b/dist/assets/icons/item-icons/blowgun-and-darts-and-syringes.png deleted file mode 100644 index f2a2cd15..00000000 Binary files a/dist/assets/icons/item-icons/blowgun-and-darts-and-syringes.png and /dev/null differ diff --git a/dist/assets/icons/item-icons/blueprints.png b/dist/assets/icons/item-icons/blueprints.png deleted file mode 100644 index d7b4b762..00000000 Binary files a/dist/assets/icons/item-icons/blueprints.png and /dev/null differ diff --git a/dist/assets/icons/item-icons/bottle-of-whiskey.png b/dist/assets/icons/item-icons/bottle-of-whiskey.png deleted file mode 100644 index a9f7283d..00000000 Binary files a/dist/assets/icons/item-icons/bottle-of-whiskey.png and /dev/null differ diff --git a/dist/assets/icons/item-icons/buglary-gear.png b/dist/assets/icons/item-icons/buglary-gear.png deleted file mode 100644 index 27c336df..00000000 Binary files a/dist/assets/icons/item-icons/buglary-gear.png and /dev/null differ diff --git a/dist/assets/icons/item-icons/cane-sword.png b/dist/assets/icons/item-icons/cane-sword.png deleted file mode 100644 index b2e77bc4..00000000 Binary files a/dist/assets/icons/item-icons/cane-sword.png and /dev/null differ diff --git a/dist/assets/icons/item-icons/climbing-gear.png b/dist/assets/icons/item-icons/climbing-gear.png deleted file mode 100644 index b2328856..00000000 Binary files a/dist/assets/icons/item-icons/climbing-gear.png and /dev/null differ diff --git a/dist/assets/icons/item-icons/clothes-and-accoutrements.png b/dist/assets/icons/item-icons/clothes-and-accoutrements.png deleted file mode 100644 index ba11817c..00000000 Binary files a/dist/assets/icons/item-icons/clothes-and-accoutrements.png and /dev/null differ diff --git a/dist/assets/icons/item-icons/clothes-and-jewelry.png b/dist/assets/icons/item-icons/clothes-and-jewelry.png deleted file mode 100644 index fab17950..00000000 Binary files a/dist/assets/icons/item-icons/clothes-and-jewelry.png and /dev/null differ diff --git a/dist/assets/icons/item-icons/coin.png b/dist/assets/icons/item-icons/coin.png deleted file mode 100644 index 16a365eb..00000000 Binary files a/dist/assets/icons/item-icons/coin.png and /dev/null differ diff --git a/dist/assets/icons/item-icons/concealed-palm-pistol.png b/dist/assets/icons/item-icons/concealed-palm-pistol.png deleted file mode 100644 index 679b1a27..00000000 Binary files a/dist/assets/icons/item-icons/concealed-palm-pistol.png and /dev/null differ diff --git a/dist/assets/icons/item-icons/cover-identity.png b/dist/assets/icons/item-icons/cover-identity.png deleted file mode 100644 index d9ac67ec..00000000 Binary files a/dist/assets/icons/item-icons/cover-identity.png and /dev/null differ diff --git a/dist/assets/icons/item-icons/crown-coin.svg b/dist/assets/icons/item-icons/crown-coin.svg deleted file mode 100644 index 7b26e133..00000000 --- a/dist/assets/icons/item-icons/crown-coin.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/dist/assets/icons/item-icons/dark-sight-goggles.png b/dist/assets/icons/item-icons/dark-sight-goggles.png deleted file mode 100644 index 0f66a4aa..00000000 Binary files a/dist/assets/icons/item-icons/dark-sight-goggles.png and /dev/null differ diff --git a/dist/assets/icons/item-icons/default.svg b/dist/assets/icons/item-icons/default.svg deleted file mode 100644 index b9e4beda..00000000 --- a/dist/assets/icons/item-icons/default.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/dist/assets/icons/item-icons/demolition-tools.png b/dist/assets/icons/item-icons/demolition-tools.png deleted file mode 100644 index 0653ff34..00000000 Binary files a/dist/assets/icons/item-icons/demolition-tools.png and /dev/null differ diff --git a/dist/assets/icons/item-icons/demonbane-charm.png b/dist/assets/icons/item-icons/demonbane-charm.png deleted file mode 100644 index cebc70a9..00000000 Binary files a/dist/assets/icons/item-icons/demonbane-charm.png and /dev/null differ diff --git a/dist/assets/icons/item-icons/disguise-kit.png b/dist/assets/icons/item-icons/disguise-kit.png deleted file mode 100644 index 43aa3032..00000000 Binary files a/dist/assets/icons/item-icons/disguise-kit.png and /dev/null differ diff --git a/dist/assets/icons/item-icons/documents.png b/dist/assets/icons/item-icons/documents.png deleted file mode 100644 index 419fa824..00000000 Binary files a/dist/assets/icons/item-icons/documents.png and /dev/null differ diff --git a/dist/assets/icons/item-icons/electroplasm-vials.png b/dist/assets/icons/item-icons/electroplasm-vials.png deleted file mode 100644 index 6771511e..00000000 Binary files a/dist/assets/icons/item-icons/electroplasm-vials.png and /dev/null differ diff --git a/dist/assets/icons/item-icons/electroplasmic-ammunition.png b/dist/assets/icons/item-icons/electroplasmic-ammunition.png deleted file mode 100644 index 9a0fcd8e..00000000 Binary files a/dist/assets/icons/item-icons/electroplasmic-ammunition.png and /dev/null differ diff --git a/dist/assets/icons/item-icons/gadgets.png b/dist/assets/icons/item-icons/gadgets.png deleted file mode 100644 index 1a14daaf..00000000 Binary files a/dist/assets/icons/item-icons/gadgets.png and /dev/null differ diff --git a/dist/assets/icons/item-icons/ghost-key.png b/dist/assets/icons/item-icons/ghost-key.png deleted file mode 100644 index d907f564..00000000 Binary files a/dist/assets/icons/item-icons/ghost-key.png and /dev/null differ diff --git a/dist/assets/icons/item-icons/hand-weapon.png b/dist/assets/icons/item-icons/hand-weapon.png deleted file mode 100644 index 4750d225..00000000 Binary files a/dist/assets/icons/item-icons/hand-weapon.png and /dev/null differ diff --git a/dist/assets/icons/item-icons/heavy-weapon.png b/dist/assets/icons/item-icons/heavy-weapon.png deleted file mode 100644 index 94c99091..00000000 Binary files a/dist/assets/icons/item-icons/heavy-weapon.png and /dev/null differ diff --git a/dist/assets/icons/item-icons/lantern.png b/dist/assets/icons/item-icons/lantern.png deleted file mode 100644 index 6550a7ce..00000000 Binary files a/dist/assets/icons/item-icons/lantern.png and /dev/null differ diff --git a/dist/assets/icons/item-icons/light-climbing-gear.png b/dist/assets/icons/item-icons/light-climbing-gear.png deleted file mode 100644 index 705afc46..00000000 Binary files a/dist/assets/icons/item-icons/light-climbing-gear.png and /dev/null differ diff --git a/dist/assets/icons/item-icons/lightning-hook.png b/dist/assets/icons/item-icons/lightning-hook.png deleted file mode 100644 index 4b4f33c8..00000000 Binary files a/dist/assets/icons/item-icons/lightning-hook.png and /dev/null differ diff --git a/dist/assets/icons/item-icons/loaded-dice-trick-cards.png b/dist/assets/icons/item-icons/loaded-dice-trick-cards.png deleted file mode 100644 index c4d894e7..00000000 Binary files a/dist/assets/icons/item-icons/loaded-dice-trick-cards.png and /dev/null differ diff --git a/dist/assets/icons/item-icons/lockpicks.png b/dist/assets/icons/item-icons/lockpicks.png deleted file mode 100644 index b8791f6e..00000000 Binary files a/dist/assets/icons/item-icons/lockpicks.png and /dev/null differ diff --git a/dist/assets/icons/item-icons/long-rifle.png b/dist/assets/icons/item-icons/long-rifle.png deleted file mode 100644 index 0150f0c6..00000000 Binary files a/dist/assets/icons/item-icons/long-rifle.png and /dev/null differ diff --git a/dist/assets/icons/item-icons/manacles-and-chain.png b/dist/assets/icons/item-icons/manacles-and-chain.png deleted file mode 100644 index 639fee9a..00000000 Binary files a/dist/assets/icons/item-icons/manacles-and-chain.png and /dev/null differ diff --git a/dist/assets/icons/item-icons/pair-of-pistols.png b/dist/assets/icons/item-icons/pair-of-pistols.png deleted file mode 100644 index b5ddfaeb..00000000 Binary files a/dist/assets/icons/item-icons/pair-of-pistols.png and /dev/null differ diff --git a/dist/assets/icons/item-icons/personal-weapon.png b/dist/assets/icons/item-icons/personal-weapon.png deleted file mode 100644 index dde9eba4..00000000 Binary files a/dist/assets/icons/item-icons/personal-weapon.png and /dev/null differ diff --git a/dist/assets/icons/item-icons/rage-essence-vial.png b/dist/assets/icons/item-icons/rage-essence-vial.png deleted file mode 100644 index 3b3d0e0e..00000000 Binary files a/dist/assets/icons/item-icons/rage-essence-vial.png and /dev/null differ diff --git a/dist/assets/icons/item-icons/scary-weapon-or-tool.png b/dist/assets/icons/item-icons/scary-weapon-or-tool.png deleted file mode 100644 index cdb8bcfc..00000000 Binary files a/dist/assets/icons/item-icons/scary-weapon-or-tool.png and /dev/null differ diff --git a/dist/assets/icons/item-icons/shadow-cloak.png b/dist/assets/icons/item-icons/shadow-cloak.png deleted file mode 100644 index d33653c1..00000000 Binary files a/dist/assets/icons/item-icons/shadow-cloak.png and /dev/null differ diff --git a/dist/assets/icons/item-icons/silence-potion-vial.png b/dist/assets/icons/item-icons/silence-potion-vial.png deleted file mode 100644 index d21e44fb..00000000 Binary files a/dist/assets/icons/item-icons/silence-potion-vial.png and /dev/null differ diff --git a/dist/assets/icons/item-icons/spirit-bottles.png b/dist/assets/icons/item-icons/spirit-bottles.png deleted file mode 100644 index f8403bb0..00000000 Binary files a/dist/assets/icons/item-icons/spirit-bottles.png and /dev/null differ diff --git a/dist/assets/icons/item-icons/spirit-mask.png b/dist/assets/icons/item-icons/spirit-mask.png deleted file mode 100644 index 202fe5aa..00000000 Binary files a/dist/assets/icons/item-icons/spirit-mask.png and /dev/null differ diff --git a/dist/assets/icons/item-icons/spiritbane-charm.png b/dist/assets/icons/item-icons/spiritbane-charm.png deleted file mode 100644 index 764bd881..00000000 Binary files a/dist/assets/icons/item-icons/spiritbane-charm.png and /dev/null differ diff --git a/dist/assets/icons/item-icons/spyglass.png b/dist/assets/icons/item-icons/spyglass.png deleted file mode 100644 index 415a1851..00000000 Binary files a/dist/assets/icons/item-icons/spyglass.png and /dev/null differ diff --git a/dist/assets/icons/item-icons/subterfuge-supplies.png b/dist/assets/icons/item-icons/subterfuge-supplies.png deleted file mode 100644 index aab6bb94..00000000 Binary files a/dist/assets/icons/item-icons/subterfuge-supplies.png and /dev/null differ diff --git a/dist/assets/icons/item-icons/tesla-coil.svg b/dist/assets/icons/item-icons/tesla-coil.svg deleted file mode 100644 index 3aac02e9..00000000 --- a/dist/assets/icons/item-icons/tesla-coil.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/dist/assets/icons/item-icons/throwing-knives.png b/dist/assets/icons/item-icons/throwing-knives.png deleted file mode 100644 index 324a3980..00000000 Binary files a/dist/assets/icons/item-icons/throwing-knives.png and /dev/null differ diff --git a/dist/assets/icons/item-icons/tinkering-tools.png b/dist/assets/icons/item-icons/tinkering-tools.png deleted file mode 100644 index c5024689..00000000 Binary files a/dist/assets/icons/item-icons/tinkering-tools.png and /dev/null differ diff --git a/dist/assets/icons/item-icons/trained-hunting-pet.png b/dist/assets/icons/item-icons/trained-hunting-pet.png deleted file mode 100644 index 4791b5db..00000000 Binary files a/dist/assets/icons/item-icons/trained-hunting-pet.png and /dev/null differ diff --git a/dist/assets/icons/item-icons/trance-powder.png b/dist/assets/icons/item-icons/trance-powder.png deleted file mode 100644 index 01930f36..00000000 Binary files a/dist/assets/icons/item-icons/trance-powder.png and /dev/null differ diff --git a/dist/assets/icons/item-icons/vial-of-slumber-essence.png b/dist/assets/icons/item-icons/vial-of-slumber-essence.png deleted file mode 100644 index faa471e3..00000000 Binary files a/dist/assets/icons/item-icons/vial-of-slumber-essence.png and /dev/null differ diff --git a/dist/assets/icons/item-icons/wrecking-tools.png b/dist/assets/icons/item-icons/wrecking-tools.png deleted file mode 100644 index 38157de3..00000000 Binary files a/dist/assets/icons/item-icons/wrecking-tools.png and /dev/null differ diff --git a/dist/assets/icons/king-ju-mask.svg b/dist/assets/icons/king-ju-mask.svg deleted file mode 100644 index b064d74b..00000000 --- a/dist/assets/icons/king-ju-mask.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/dist/assets/icons/mad-scientist.svg b/dist/assets/icons/mad-scientist.svg deleted file mode 100644 index af8ad366..00000000 --- a/dist/assets/icons/mad-scientist.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/dist/assets/icons/magic-potion.svg b/dist/assets/icons/magic-potion.svg deleted file mode 100644 index 2584f368..00000000 --- a/dist/assets/icons/magic-potion.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/dist/assets/icons/magnifying-glass.svg b/dist/assets/icons/magnifying-glass.svg deleted file mode 100644 index 15d0a130..00000000 --- a/dist/assets/icons/magnifying-glass.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/dist/assets/icons/misc-icons/armor-resist.svg b/dist/assets/icons/misc-icons/armor-resist.svg deleted file mode 100644 index dc85b59a..00000000 --- a/dist/assets/icons/misc-icons/armor-resist.svg +++ /dev/null @@ -1,559 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/dist/assets/icons/misc-icons/clock-keeper.svg b/dist/assets/icons/misc-icons/clock-keeper.svg deleted file mode 100644 index 0b48ebe8..00000000 --- a/dist/assets/icons/misc-icons/clock-keeper.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/dist/assets/icons/misc-icons/gather-info.svg b/dist/assets/icons/misc-icons/gather-info.svg deleted file mode 100644 index 72f14e5e..00000000 --- a/dist/assets/icons/misc-icons/gather-info.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/dist/assets/icons/misc-icons/gm-tracker.svg b/dist/assets/icons/misc-icons/gm-tracker.svg deleted file mode 100644 index f3c72c9a..00000000 --- a/dist/assets/icons/misc-icons/gm-tracker.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/dist/assets/icons/misc-icons/resist-resist.svg b/dist/assets/icons/misc-icons/resist-resist.svg deleted file mode 100644 index 2dca4bd2..00000000 --- a/dist/assets/icons/misc-icons/resist-resist.svg +++ /dev/null @@ -1,766 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/dist/assets/icons/misc-icons/special-resist.svg b/dist/assets/icons/misc-icons/special-resist.svg deleted file mode 100644 index 2a1e490c..00000000 --- a/dist/assets/icons/misc-icons/special-resist.svg +++ /dev/null @@ -1,620 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/dist/assets/icons/ninja-mask (2).svg b/dist/assets/icons/ninja-mask (2).svg deleted file mode 100644 index 97f46fa5..00000000 --- a/dist/assets/icons/ninja-mask (2).svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/dist/assets/icons/one-eyed.svg b/dist/assets/icons/one-eyed.svg deleted file mode 100644 index 1792f678..00000000 --- a/dist/assets/icons/one-eyed.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/dist/assets/icons/round-bottom-flask.svg b/dist/assets/icons/round-bottom-flask.svg deleted file mode 100644 index 9f94759e..00000000 --- a/dist/assets/icons/round-bottom-flask.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/dist/assets/icons/standing-potion.svg b/dist/assets/icons/standing-potion.svg deleted file mode 100644 index a161d292..00000000 --- a/dist/assets/icons/standing-potion.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/dist/assets/icons/vice-icons/electroplasmic power.png b/dist/assets/icons/vice-icons/electroplasmic power.png deleted file mode 100644 index 5ff7ec3e..00000000 Binary files a/dist/assets/icons/vice-icons/electroplasmic power.png and /dev/null differ diff --git a/dist/assets/icons/vice-icons/faith.png b/dist/assets/icons/vice-icons/faith.png deleted file mode 100644 index a014b0f7..00000000 Binary files a/dist/assets/icons/vice-icons/faith.png and /dev/null differ diff --git a/dist/assets/icons/vice-icons/gambling.png b/dist/assets/icons/vice-icons/gambling.png deleted file mode 100644 index 7a11d7ab..00000000 Binary files a/dist/assets/icons/vice-icons/gambling.png and /dev/null differ diff --git a/dist/assets/icons/vice-icons/life essence.png b/dist/assets/icons/vice-icons/life essence.png deleted file mode 100644 index 331f9692..00000000 Binary files a/dist/assets/icons/vice-icons/life essence.png and /dev/null differ diff --git a/dist/assets/icons/vice-icons/living essence.png b/dist/assets/icons/vice-icons/living essence.png deleted file mode 100644 index 01899cca..00000000 Binary files a/dist/assets/icons/vice-icons/living essence.png and /dev/null differ diff --git a/dist/assets/icons/vice-icons/luxury.png b/dist/assets/icons/vice-icons/luxury.png deleted file mode 100644 index b98fab12..00000000 Binary files a/dist/assets/icons/vice-icons/luxury.png and /dev/null differ diff --git a/dist/assets/icons/vice-icons/obligation.png b/dist/assets/icons/vice-icons/obligation.png deleted file mode 100644 index 9096187f..00000000 Binary files a/dist/assets/icons/vice-icons/obligation.png and /dev/null differ diff --git a/dist/assets/icons/vice-icons/pleasure.png b/dist/assets/icons/vice-icons/pleasure.png deleted file mode 100644 index 044d039a..00000000 Binary files a/dist/assets/icons/vice-icons/pleasure.png and /dev/null differ diff --git a/dist/assets/icons/vice-icons/servitude.png b/dist/assets/icons/vice-icons/servitude.png deleted file mode 100644 index 3bbc922a..00000000 Binary files a/dist/assets/icons/vice-icons/servitude.png and /dev/null differ diff --git a/dist/assets/icons/vice-icons/stupor.png b/dist/assets/icons/vice-icons/stupor.png deleted file mode 100644 index 2908eb55..00000000 Binary files a/dist/assets/icons/vice-icons/stupor.png and /dev/null differ diff --git a/dist/assets/icons/vice-icons/weird.png b/dist/assets/icons/vice-icons/weird.png deleted file mode 100644 index 47f54df7..00000000 Binary files a/dist/assets/icons/vice-icons/weird.png and /dev/null differ diff --git a/dist/assets/icons/vice-icons/worship.png b/dist/assets/icons/vice-icons/worship.png deleted file mode 100644 index 3bfde1e3..00000000 Binary files a/dist/assets/icons/vice-icons/worship.png and /dev/null differ diff --git a/dist/assets/npcs/Aranna the Blessed.jpg b/dist/assets/npcs/Aranna the Blessed.jpg deleted file mode 100644 index 8e850cd4..00000000 Binary files a/dist/assets/npcs/Aranna the Blessed.jpg and /dev/null differ diff --git a/dist/assets/npcs/Augus.jpg b/dist/assets/npcs/Augus.jpg deleted file mode 100644 index c36a69b5..00000000 Binary files a/dist/assets/npcs/Augus.jpg and /dev/null differ diff --git a/dist/assets/npcs/Avrick.jpg b/dist/assets/npcs/Avrick.jpg deleted file mode 100644 index 4366fdaf..00000000 Binary files a/dist/assets/npcs/Avrick.jpg and /dev/null differ diff --git a/dist/assets/npcs/Bazso Baz.jpg b/dist/assets/npcs/Bazso Baz.jpg deleted file mode 100644 index 90ea2009..00000000 Binary files a/dist/assets/npcs/Bazso Baz.jpg and /dev/null differ diff --git a/dist/assets/npcs/Bryl.jpg b/dist/assets/npcs/Bryl.jpg deleted file mode 100644 index d57d23ea..00000000 Binary files a/dist/assets/npcs/Bryl.jpg and /dev/null differ diff --git a/dist/assets/npcs/Casta.jpg b/dist/assets/npcs/Casta.jpg deleted file mode 100644 index 96d72d13..00000000 Binary files a/dist/assets/npcs/Casta.jpg and /dev/null differ diff --git a/dist/assets/npcs/Celene.jpg b/dist/assets/npcs/Celene.jpg deleted file mode 100644 index 3131037a..00000000 Binary files a/dist/assets/npcs/Celene.jpg and /dev/null differ diff --git a/dist/assets/npcs/Chael.jpg b/dist/assets/npcs/Chael.jpg deleted file mode 100644 index cd8a8a7c..00000000 Binary files a/dist/assets/npcs/Chael.jpg and /dev/null differ diff --git a/dist/assets/npcs/Chef Roselle.jpg b/dist/assets/npcs/Chef Roselle.jpg deleted file mode 100644 index fee8868c..00000000 Binary files a/dist/assets/npcs/Chef Roselle.jpg and /dev/null differ diff --git a/dist/assets/npcs/CotF Contact.jpg b/dist/assets/npcs/CotF Contact.jpg deleted file mode 100644 index 975b18d9..00000000 Binary files a/dist/assets/npcs/CotF Contact.jpg and /dev/null differ diff --git a/dist/assets/npcs/Darmot.jpg b/dist/assets/npcs/Darmot.jpg deleted file mode 100644 index 0b279cfe..00000000 Binary files a/dist/assets/npcs/Darmot.jpg and /dev/null differ diff --git a/dist/assets/npcs/Dunridge.jpg b/dist/assets/npcs/Dunridge.jpg deleted file mode 100644 index afd779d9..00000000 Binary files a/dist/assets/npcs/Dunridge.jpg and /dev/null differ diff --git a/dist/assets/npcs/Eckerd.jpg b/dist/assets/npcs/Eckerd.jpg deleted file mode 100644 index 2457ad3d..00000000 Binary files a/dist/assets/npcs/Eckerd.jpg and /dev/null differ diff --git a/dist/assets/npcs/Eldrin Prichard.jpg b/dist/assets/npcs/Eldrin Prichard.jpg deleted file mode 100644 index 613d5b1d..00000000 Binary files a/dist/assets/npcs/Eldrin Prichard.jpg and /dev/null differ diff --git a/dist/assets/npcs/Father Yoren.jpg b/dist/assets/npcs/Father Yoren.jpg deleted file mode 100644 index 98a94e93..00000000 Binary files a/dist/assets/npcs/Father Yoren.jpg and /dev/null differ diff --git a/dist/assets/npcs/Flint.jpg b/dist/assets/npcs/Flint.jpg deleted file mode 100644 index 24e7d3ae..00000000 Binary files a/dist/assets/npcs/Flint.jpg and /dev/null differ diff --git a/dist/assets/npcs/Frake.jpg b/dist/assets/npcs/Frake.jpg deleted file mode 100644 index 19307fa3..00000000 Binary files a/dist/assets/npcs/Frake.jpg and /dev/null differ diff --git a/dist/assets/npcs/Grace.jpg b/dist/assets/npcs/Grace.jpg deleted file mode 100644 index 06d60425..00000000 Binary files a/dist/assets/npcs/Grace.jpg and /dev/null differ diff --git a/dist/assets/npcs/Grist.jpg b/dist/assets/npcs/Grist.jpg deleted file mode 100644 index 67e10cb7..00000000 Binary files a/dist/assets/npcs/Grist.jpg and /dev/null differ diff --git a/dist/assets/npcs/Harker.jpg b/dist/assets/npcs/Harker.jpg deleted file mode 100644 index 3823d6a9..00000000 Binary files a/dist/assets/npcs/Harker.jpg and /dev/null differ diff --git a/dist/assets/npcs/Harvale Brogan.jpg b/dist/assets/npcs/Harvale Brogan.jpg deleted file mode 100644 index 031110d4..00000000 Binary files a/dist/assets/npcs/Harvale Brogan.jpg and /dev/null differ diff --git a/dist/assets/npcs/Helene.jpg b/dist/assets/npcs/Helene.jpg deleted file mode 100644 index f12fd708..00000000 Binary files a/dist/assets/npcs/Helene.jpg and /dev/null differ diff --git a/dist/assets/npcs/Hutton.jpg b/dist/assets/npcs/Hutton.jpg deleted file mode 100644 index 100c6718..00000000 Binary files a/dist/assets/npcs/Hutton.jpg and /dev/null differ diff --git a/dist/assets/npcs/Ilacille.jpg b/dist/assets/npcs/Ilacille.jpg deleted file mode 100644 index 0688401f..00000000 Binary files a/dist/assets/npcs/Ilacille.jpg and /dev/null differ diff --git a/dist/assets/npcs/Jennah.jpg b/dist/assets/npcs/Jennah.jpg deleted file mode 100644 index 3ac840f8..00000000 Binary files a/dist/assets/npcs/Jennah.jpg and /dev/null differ diff --git a/dist/assets/npcs/Jeren.jpg b/dist/assets/npcs/Jeren.jpg deleted file mode 100644 index 59b2253e..00000000 Binary files a/dist/assets/npcs/Jeren.jpg and /dev/null differ diff --git a/dist/assets/npcs/Jewel, Bird & Shine.jpg b/dist/assets/npcs/Jewel, Bird & Shine.jpg deleted file mode 100644 index d45bc257..00000000 Binary files a/dist/assets/npcs/Jewel, Bird & Shine.jpg and /dev/null differ diff --git a/dist/assets/npcs/Jul.jpg b/dist/assets/npcs/Jul.jpg deleted file mode 100644 index a5322387..00000000 Binary files a/dist/assets/npcs/Jul.jpg and /dev/null differ diff --git a/dist/assets/npcs/Klyra.jpg b/dist/assets/npcs/Klyra.jpg deleted file mode 100644 index 69691f6f..00000000 Binary files a/dist/assets/npcs/Klyra.jpg and /dev/null differ diff --git a/dist/assets/npcs/Lady Dusk.jpg b/dist/assets/npcs/Lady Dusk.jpg deleted file mode 100644 index bf9eefe7..00000000 Binary files a/dist/assets/npcs/Lady Dusk.jpg and /dev/null differ diff --git a/dist/assets/npcs/Lady Freyla.jpg b/dist/assets/npcs/Lady Freyla.jpg deleted file mode 100644 index 5e9a098b..00000000 Binary files a/dist/assets/npcs/Lady Freyla.jpg and /dev/null differ diff --git a/dist/assets/npcs/Lord Penderyn.jpg b/dist/assets/npcs/Lord Penderyn.jpg deleted file mode 100644 index bde22006..00000000 Binary files a/dist/assets/npcs/Lord Penderyn.jpg and /dev/null differ diff --git a/dist/assets/npcs/Madame Tesslyn.jpg b/dist/assets/npcs/Madame Tesslyn.jpg deleted file mode 100644 index 0b09ab73..00000000 Binary files a/dist/assets/npcs/Madame Tesslyn.jpg and /dev/null differ diff --git a/dist/assets/npcs/Maestro Helleren.jpg b/dist/assets/npcs/Maestro Helleren.jpg deleted file mode 100644 index 04232d1c..00000000 Binary files a/dist/assets/npcs/Maestro Helleren.jpg and /dev/null differ diff --git a/dist/assets/npcs/Malista.jpg b/dist/assets/npcs/Malista.jpg deleted file mode 100644 index b6fa5fae..00000000 Binary files a/dist/assets/npcs/Malista.jpg and /dev/null differ diff --git a/dist/assets/npcs/Mardin Gull.jpg b/dist/assets/npcs/Mardin Gull.jpg deleted file mode 100644 index 4c818a16..00000000 Binary files a/dist/assets/npcs/Mardin Gull.jpg and /dev/null differ diff --git a/dist/assets/npcs/Marlane.jpg b/dist/assets/npcs/Marlane.jpg deleted file mode 100644 index fe0d9c4c..00000000 Binary files a/dist/assets/npcs/Marlane.jpg and /dev/null differ diff --git a/dist/assets/npcs/Marlane.png b/dist/assets/npcs/Marlane.png deleted file mode 100644 index d85a1106..00000000 Binary files a/dist/assets/npcs/Marlane.png and /dev/null differ diff --git a/dist/assets/npcs/Master Vreen.jpg b/dist/assets/npcs/Master Vreen.jpg deleted file mode 100644 index faad4519..00000000 Binary files a/dist/assets/npcs/Master Vreen.jpg and /dev/null differ diff --git a/dist/assets/npcs/Melvir.jpg b/dist/assets/npcs/Melvir.jpg deleted file mode 100644 index 12a0efb9..00000000 Binary files a/dist/assets/npcs/Melvir.jpg and /dev/null differ diff --git a/dist/assets/npcs/Mercy.jpg b/dist/assets/npcs/Mercy.jpg deleted file mode 100644 index 7b491fe2..00000000 Binary files a/dist/assets/npcs/Mercy.jpg and /dev/null differ diff --git a/dist/assets/npcs/Mother Narya.jpg b/dist/assets/npcs/Mother Narya.jpg deleted file mode 100644 index bc642bdc..00000000 Binary files a/dist/assets/npcs/Mother Narya.jpg and /dev/null differ diff --git a/dist/assets/npcs/Nelisanne.jpg b/dist/assets/npcs/Nelisanne.jpg deleted file mode 100644 index 07032b30..00000000 Binary files a/dist/assets/npcs/Nelisanne.jpg and /dev/null differ diff --git a/dist/assets/npcs/Nyryx (Ghost).jpg b/dist/assets/npcs/Nyryx (Ghost).jpg deleted file mode 100644 index f2772c23..00000000 Binary files a/dist/assets/npcs/Nyryx (Ghost).jpg and /dev/null differ diff --git a/dist/assets/npcs/Nyryx.jpg b/dist/assets/npcs/Nyryx.jpg deleted file mode 100644 index 929e7e36..00000000 Binary files a/dist/assets/npcs/Nyryx.jpg and /dev/null differ diff --git a/dist/assets/npcs/Ojak.jpg b/dist/assets/npcs/Ojak.jpg deleted file mode 100644 index 8a739a11..00000000 Binary files a/dist/assets/npcs/Ojak.jpg and /dev/null differ diff --git a/dist/assets/npcs/Petra.jpg b/dist/assets/npcs/Petra.jpg deleted file mode 100644 index 24be40c1..00000000 Binary files a/dist/assets/npcs/Petra.jpg and /dev/null differ diff --git a/dist/assets/npcs/Pux Bolin.jpg b/dist/assets/npcs/Pux Bolin.jpg deleted file mode 100644 index c3a01de5..00000000 Binary files a/dist/assets/npcs/Pux Bolin.jpg and /dev/null differ diff --git a/dist/assets/npcs/Quellyn.jpg b/dist/assets/npcs/Quellyn.jpg deleted file mode 100644 index d665e59f..00000000 Binary files a/dist/assets/npcs/Quellyn.jpg and /dev/null differ diff --git a/dist/assets/npcs/Riven.jpg b/dist/assets/npcs/Riven.jpg deleted file mode 100644 index 79474441..00000000 Binary files a/dist/assets/npcs/Riven.jpg and /dev/null differ diff --git a/dist/assets/npcs/Rolan Volaris.jpg b/dist/assets/npcs/Rolan Volaris.jpg deleted file mode 100644 index ac7e1829..00000000 Binary files a/dist/assets/npcs/Rolan Volaris.jpg and /dev/null differ diff --git a/dist/assets/npcs/Roslyn Kellis.jpg b/dist/assets/npcs/Roslyn Kellis.jpg deleted file mode 100644 index ad0f001d..00000000 Binary files a/dist/assets/npcs/Roslyn Kellis.jpg and /dev/null differ diff --git a/dist/assets/npcs/Salia (Human).jpg b/dist/assets/npcs/Salia (Human).jpg deleted file mode 100644 index 52d82f62..00000000 Binary files a/dist/assets/npcs/Salia (Human).jpg and /dev/null differ diff --git a/dist/assets/npcs/Salia.jpg b/dist/assets/npcs/Salia.jpg deleted file mode 100644 index 52d82f62..00000000 Binary files a/dist/assets/npcs/Salia.jpg and /dev/null differ diff --git a/dist/assets/npcs/SaliaSpirit.jpg b/dist/assets/npcs/SaliaSpirit.jpg deleted file mode 100644 index 4427e62e..00000000 Binary files a/dist/assets/npcs/SaliaSpirit.jpg and /dev/null differ diff --git a/dist/assets/npcs/Sawtooth.jpg b/dist/assets/npcs/Sawtooth.jpg deleted file mode 100644 index 272964a2..00000000 Binary files a/dist/assets/npcs/Sawtooth.jpg and /dev/null differ diff --git a/dist/assets/npcs/Scurlock.jpg b/dist/assets/npcs/Scurlock.jpg deleted file mode 100644 index 30880ed7..00000000 Binary files a/dist/assets/npcs/Scurlock.jpg and /dev/null differ diff --git a/dist/assets/npcs/Sergeant Velk.jpg b/dist/assets/npcs/Sergeant Velk.jpg deleted file mode 100644 index f5bd9276..00000000 Binary files a/dist/assets/npcs/Sergeant Velk.jpg and /dev/null differ diff --git a/dist/assets/npcs/Setarra.jpg b/dist/assets/npcs/Setarra.jpg deleted file mode 100644 index 031f92fe..00000000 Binary files a/dist/assets/npcs/Setarra.jpg and /dev/null differ diff --git a/dist/assets/npcs/Singer.jpg b/dist/assets/npcs/Singer.jpg deleted file mode 100644 index 10d9f583..00000000 Binary files a/dist/assets/npcs/Singer.jpg and /dev/null differ diff --git a/dist/assets/npcs/Sister Thorn.jpg b/dist/assets/npcs/Sister Thorn.jpg deleted file mode 100644 index ce9dffcc..00000000 Binary files a/dist/assets/npcs/Sister Thorn.jpg and /dev/null differ diff --git a/dist/assets/npcs/Sprogg.jpg b/dist/assets/npcs/Sprogg.jpg deleted file mode 100644 index de0cb8d4..00000000 Binary files a/dist/assets/npcs/Sprogg.jpg and /dev/null differ diff --git a/dist/assets/npcs/Stazia.jpg b/dist/assets/npcs/Stazia.jpg deleted file mode 100644 index 20c508ee..00000000 Binary files a/dist/assets/npcs/Stazia.jpg and /dev/null differ diff --git a/dist/assets/npcs/Stazia.png b/dist/assets/npcs/Stazia.png deleted file mode 100644 index 458fedef..00000000 Binary files a/dist/assets/npcs/Stazia.png and /dev/null differ diff --git a/dist/assets/npcs/Steiner.jpg b/dist/assets/npcs/Steiner.jpg deleted file mode 100644 index c7602bd8..00000000 Binary files a/dist/assets/npcs/Steiner.jpg and /dev/null differ diff --git a/dist/assets/npcs/Telda.jpg b/dist/assets/npcs/Telda.jpg deleted file mode 100644 index 22aa2d6d..00000000 Binary files a/dist/assets/npcs/Telda.jpg and /dev/null differ diff --git a/dist/assets/npcs/The Hooded Proprietor.jpg b/dist/assets/npcs/The Hooded Proprietor.jpg deleted file mode 100644 index 7948f48a..00000000 Binary files a/dist/assets/npcs/The Hooded Proprietor.jpg and /dev/null differ diff --git a/dist/assets/npcs/Traven.jpg b/dist/assets/npcs/Traven.jpg deleted file mode 100644 index b88d17da..00000000 Binary files a/dist/assets/npcs/Traven.jpg and /dev/null differ diff --git a/dist/assets/npcs/Veldren.jpg b/dist/assets/npcs/Veldren.jpg deleted file mode 100644 index c229388c..00000000 Binary files a/dist/assets/npcs/Veldren.jpg and /dev/null differ diff --git a/dist/assets/npcs/Veleris.jpg b/dist/assets/npcs/Veleris.jpg deleted file mode 100644 index 8f66be71..00000000 Binary files a/dist/assets/npcs/Veleris.jpg and /dev/null differ diff --git a/dist/assets/npcs/belle-brogan.bmp b/dist/assets/npcs/belle-brogan.bmp deleted file mode 100644 index 5a274c26..00000000 Binary files a/dist/assets/npcs/belle-brogan.bmp and /dev/null differ diff --git a/dist/assets/npcs/chief-pritchard.bmp b/dist/assets/npcs/chief-pritchard.bmp deleted file mode 100644 index f2ee3a47..00000000 Binary files a/dist/assets/npcs/chief-pritchard.bmp and /dev/null differ diff --git a/dist/assets/pdfs/!!BLADES IN THE DARK - FACTIONS (Optimized).pdf b/dist/assets/pdfs/!!BLADES IN THE DARK - FACTIONS (Optimized).pdf deleted file mode 100644 index 8385bdbe..00000000 Binary files a/dist/assets/pdfs/!!BLADES IN THE DARK - FACTIONS (Optimized).pdf and /dev/null differ diff --git a/dist/assets/pdfs/BladesInTheDark.pdf b/dist/assets/pdfs/BladesInTheDark.pdf deleted file mode 100644 index 75aa1bb7..00000000 Binary files a/dist/assets/pdfs/BladesInTheDark.pdf and /dev/null differ diff --git a/dist/blades.js b/dist/blades.js deleted file mode 100644 index ef136790..00000000 --- a/dist/blades.js +++ /dev/null @@ -1,22357 +0,0 @@ -var Bh = Object.defineProperty; -var Hh = (a, e, t) => e in a ? Bh(a, e, { enumerable: !0, configurable: !0, writable: !0, value: t }) : a[e] = t; -var Z = (a, e, t) => (Hh(a, typeof e != "symbol" ? e + "" : e, t), t), Zo = (a, e, t) => { - if (!e.has(a)) - throw TypeError("Cannot " + t); -}; -var rs = (a, e, t) => (Zo(a, e, "read from private field"), t ? t.call(a) : e.get(a)), qt = (a, e, t) => { - if (e.has(a)) - throw TypeError("Cannot add the same private member more than once"); - e instanceof WeakSet ? e.add(a) : e.set(a, t); -}, ct = (a, e, t, s) => (Zo(a, e, "write to private field"), s ? s.call(a, t) : e.set(a, t), t); -var er = (a, e, t) => (Zo(a, e, "access private method"), t); -var Wh = ((a) => (a[a.NONE = CONST.DOCUMENT_PERMISSION_LEVELS.NONE] = "NONE", a[a.BASIC = CONST.DOCUMENT_PERMISSION_LEVELS.LIMITED] = "BASIC", a[a.FULL = CONST.DOCUMENT_PERMISSION_LEVELS.OBSERVER] = "FULL", a[a.OWNER = CONST.DOCUMENT_PERMISSION_LEVELS.OWNER] = "OWNER", a))(Wh || {}), z = /* @__PURE__ */ ((a) => (a.pc = "pc", a.npc = "npc", a.crew = "crew", a.faction = "faction", a))(z || {}), x = /* @__PURE__ */ ((a) => (a.ability = "ability", a.background = "background", a.clock_keeper = "clock_keeper", a.cohort_gang = "cohort_gang", a.cohort_expert = "cohort_expert", a.crew_ability = "crew_ability", a.crew_reputation = "crew_reputation", a.crew_playbook = "crew_playbook", a.crew_upgrade = "crew_upgrade", a.feature = "feature", a.gm_tracker = "gm_tracker", a.heritage = "heritage", a.gear = "gear", a.playbook = "playbook", a.preferred_op = "preferred_op", a.stricture = "stricture", a.vice = "vice", a.project = "project", a.ritual = "ritual", a.design = "design", a.location = "location", a.score = "score", a))(x || {}), to = /* @__PURE__ */ ((a) => (a.HasActiveItem = "HasActiveItem", a.HasActiveItemsByTag = "HasActiveItemByTag", a.AdvancedPlaybook = "AdvancedPlaybook", a.HasAllTags = "HasAllTags", a.HasAnyTag = "HasAnyTag", a.Not_HasActiveItem = "Not_HasActiveItem", a.Not_HasActiveItemsByTag = "Not_HasActiveItemsByTag", a.Not_AdvancedPlaybook = "Not_AdvancedPlaybook", a.Not_HasAllTags = "Not_HasAllTags", a.Not_HasAnyTag = "Not_HasAnyTag", a))(to || {}), Ht = /* @__PURE__ */ ((a) => (a.yellow = "yellow", a.red = "red", a.white = "white", a.cyan = "cyan", a))(Ht || {}), He = /* @__PURE__ */ ((a) => (a.overlay = "overlay", a.pcSheet = "pcSheet", a.factionSheet = "factionSheet", a.projectSheet = "projectSheet", a.scoreSheet = "scoreSheet", a.rollCollab = "rollCollab", a.chatMessage = "chatMessage", a))(He || {}), Ct = /* @__PURE__ */ ((a) => (a.full = "full", a.clocks = "clocks", a.activeClocks = "activeClocks", a.presentCurrentClock = "presentCurrentClock", a.present0 = "present0", a.present1 = "present1", a.present2 = "present2", a.present3 = "present3", a.present4 = "present4", a.present5 = "present5", a))(Ct || {}), Ds = /* @__PURE__ */ ((a) => (a.push = "push", a))(Ds || {}), lu = /* @__PURE__ */ ((a) => (a.Barrowcleft = "Barrowcleft", a.Brightstone = "Brightstone", a.Charhollow = "Charhollow", a.Charterhall = "Charterhall", a.Coalridge = "Coalridge", a["Crows Foot"] = "Crows Foot", a["The Docks"] = "The Docks", a.Dunslough = "Dunslough", a.Nightmarket = "Nightmarket", a.Silkshore = "Silkshore", a["Six Towers"] = "Six Towers", a.Whitecrown = "Whitecrown", a))(lu || {}), cu = /* @__PURE__ */ ((a) => (a["Gaddoc Station"] = "Gaddoc Station", a["The Lost District"] = "The Lost District", a["The Void Sea"] = "The Void Sea", a["Ironhook Prison"] = "Ironhook Prison", a["Old North Port"] = "Old North Port", a.Deathlands = "Deathlands", a))(cu || {}), vt = /* @__PURE__ */ ((a) => (a.insight = "insight", a.prowess = "prowess", a.resolve = "resolve", a))(vt || {}), Is = /* @__PURE__ */ ((a) => (a.hunt = "hunt", a.study = "study", a.survey = "survey", a.tinker = "tinker", a.finesse = "finesse", a.prowl = "prowl", a.skirmish = "skirmish", a.wreck = "wreck", a.attune = "attune", a.command = "command", a.consort = "consort", a.sway = "sway", a))(Is || {}), we = /* @__PURE__ */ ((a) => (a.AcquireAsset = "AcquireAsset", a.IndulgeVice = "IndulgeVice", a.LongTermProject = "LongTermProject", a.Recover = "Recover", a.ReduceHeat = "ReduceHeat", a.Train = "Train", a))(we || {}), ht = /* @__PURE__ */ ((a) => (a.Primary = "Primary", a.Observer = "Observer", a.GM = "GM", a.Participant = "Participant", a))(ht || {}), Ie = /* @__PURE__ */ ((a) => (a.Action = "Action", a.Resistance = "Resistance", a.Fortune = "Fortune", a.IndulgeVice = "IndulgeVice", a))(Ie || {}), ia = /* @__PURE__ */ ((a) => (a.Incarceration = "Incarceration", a.Engagement = "Engagement", a.GatherInfo = "GatherInfo", a.GroupLead = "GroupLead", a.GroupParticipant = "GroupParticipant", a))(ia || {}), Oe = /* @__PURE__ */ ((a) => (a.general = "general", a.harm = "harm", a.teamwork = "teamwork", a.ability = "ability", a.gear = "gear", a.crew_ability = "crew_ability", a.crew_upgrade = "crew_upgrade", a.advantage = "advantage", a.disadvantage = "disadvantage", a))(Oe || {}), $t = /* @__PURE__ */ ((a) => (a.ReducedEffect = "ReducedEffect", a.ComplicationMinor = "ComplicationMinor", a.ComplicationMajor = "ComplicationMajor", a.ComplicationSerious = "ComplicationSerious", a.LostOpportunity = "LostOpportunity", a.WorsePosition = "WorsePosition", a.InsightHarm1 = "InsightHarm1", a.InsightHarm2 = "InsightHarm2", a.InsightHarm3 = "InsightHarm3", a.InsightHarm4 = "InsightHarm4", a.ProwessHarm1 = "ProwessHarm1", a.ProwessHarm2 = "ProwessHarm2", a.ProwessHarm3 = "ProwessHarm3", a.ProwessHarm4 = "ProwessHarm4", a.ResolveHarm1 = "ResolveHarm1", a.ResolveHarm2 = "ResolveHarm2", a.ResolveHarm3 = "ResolveHarm3", a.ResolveHarm4 = "ResolveHarm4", a.None = "None", a))($t || {}), se = /* @__PURE__ */ ((a) => (a.Hidden = "Hidden", a.ForcedOff = "ForcedOff", a.ToggledOff = "ToggledOff", a.ToggledOn = "ToggledOn", a.ForcedOn = "ForcedOn", a.Dominant = "Dominant", a))(se || {}), ae = /* @__PURE__ */ ((a) => (a.roll = "roll", a.position = "position", a.effect = "effect", a.result = "result", a.after = "after", a))(ae || {}), wt = /* @__PURE__ */ ((a) => (a.desperate = "desperate", a.risky = "risky", a.controlled = "controlled", a))(wt || {}), dt = /* @__PURE__ */ ((a) => (a.zero = "zero", a.limited = "limited", a.standard = "standard", a.great = "great", a.extreme = "extreme", a))(dt || {}), H = /* @__PURE__ */ ((a) => (a.tier = "tier", a.quality = "quality", a.scale = "scale", a.magnitude = "magnitude", a))(H || {}), ze = /* @__PURE__ */ ((a) => (a.critical = "critical", a.success = "success", a.partial = "partial", a.fail = "fail", a))(ze || {}), zs = /* @__PURE__ */ ((a) => (a.Collaboration = "Collaboration", a.AwaitingRoll = "AwaitingRoll", a.AwaitingConsequences = "AwaitingConsequences", a.Complete = "Complete", a))(zs || {}), Sn = /* @__PURE__ */ ((a) => (a.Weakened = "Weakened", a.Impaired = "Impaired", a.Broken = "Broken", a.Dead = "Dead", a))(Sn || {}), uu = /* @__PURE__ */ ((a) => (a.Faith = "Faith", a.Gambling = "Gambling", a.Luxury = "Luxury", a.Obligation = "Obligation", a.Pleasure = "Pleasure", a.Stupor = "Stupor", a.Weird = "Weird", a.Worship = "Worship", a.Life_Essence = "Life_Essence", a.Living_Essence = "Living_Essence", a.Electroplasmic_Power = "Electroplasmic_Power", a.Servitude = "Servitude", a))(uu || {}), ra = /* @__PURE__ */ ((a) => (a.Cutter = "Cutter", a.Hound = "Hound", a.Leech = "Leech", a.Lurk = "Lurk", a.Slide = "Slide", a.Spider = "Spider", a.Whisper = "Whisper", a.Vampire = "Vampire", a.Hull = "Hull", a.Ghost = "Ghost", a.Assassins = "Assassins", a.Bravos = "Bravos", a.Cult = "Cult", a.Hawkers = "Hawkers", a.Shadows = "Shadows", a.Smugglers = "Smugglers", a.Vigilantes = "Vigilantes", a))(ra || {}), hi = /* @__PURE__ */ ((a) => (a.UpgradeOrAbility = "UpgradeOrAbility", a.Ability = "Ability", a.Upgrade = "Upgrade", a.Cohort = "Cohort", a.CohortType = "CohortType", a.GeneralAction = "GeneralAction", a.GeneralInsight = "GeneralInsight", a.GeneralProwess = "GeneralProwess", a.GeneralResolve = "GeneralResolve", a.hunt = "hunt", a.study = "study", a.survey = "survey", a.tinker = "tinker", a.finesse = "finesse", a.prowl = "prowl", a.skirmish = "skirmish", a.wreck = "wreck", a.attune = "attune", a.command = "command", a.consort = "consort", a.sway = "sway", a))(hi || {}), Fe = /* @__PURE__ */ ((a) => (a.CharGen = "CharGen", a.Freeplay = "Freeplay", a.Score = "Score", a.Downtime = "Downtime", a))(Fe || {}), he; -((a) => { - ((e) => { - e.Archived = "Archived", e.Featured = "Featured", e.Hidden = "Hidden", e.MultiplesOK = "MultiplesOK"; - })(a.System || (a.System = {})), ((e) => { - e.Fine = "Fine", e.General = "General", e.Advanced = "Advanced", e.Upgraded = "Upgraded"; - })(a.Gear || (a.Gear = {})), ((e) => { - e.Member = "Member", e.CharacterCrew = "CharacterCrew", e.ActivePC = "ActivePC", e.Small = "Small", e.Medium = "Medium", e.Large = "Large", e.CanHeal = "CanHeal"; - })(a.PC || (a.PC = {})), ((e) => { - e.Arcane = "Arcane", e.SparkCraft = "SparkCraft", e.Alchemical = "Alchemical", e.Mundane = "Mundane", e.Ritual = "Ritual"; - })(a.Invention || (a.Invention = {})), ((e) => { - e.ArcaneImplement = "ArcaneImplement", e.Document = "Document", e.GearKit = "GearKit", e.SubterfugeSupplies = "SubterfugeSupplies", e.Tool = "Tool", e.Weapon = "Weapon"; - })(a.GearCategory || (a.GearCategory = {})), ((e) => { - e.Acquaintance = "Acquaintance", e.VicePurveyor = "VicePurveyor", e.CanHeal = "CanHeal"; - })(a.NPC || (a.NPC = {})), ((e) => { - e.Thugs = "Thugs", e.Rooks = "Rooks", e.Adepts = "Adepts", e.Rovers = "Rovers", e.Skulks = "Skulks", e.Vehicle = "Vehicle"; - })(a.GangType || (a.GangType = {})); -})(he || (he = {})); -const Y = { - SYSTEM_ID: "eunos-blades", - SYSTEM_NAME: "Euno's Blades", - SYSTEM_FULL_NAME: "Euno's Blades In The Dark", - TEMPLATE_ROOT: "systems/eunos-blades/templates", - AI_MODELS: { - baseContext: [ - "babbage-002", - "gpt-3.5-turbo", - "gpt-4" - ], - extendedContext: [ - "gpt-3.5-turbo-16k", - "gpt-3.5-turbo-16k", - "gpt-4-32k" - ] - }, - MIN_MOUSE_MOVEMENT_THRESHOLD: 2e3, - AI_FILE_IDS: { - BladesPDF: "file-n72HTTNwt051piPbswQ8isUa" - }, - ClockKeySquareSize: 100, - DowntimeActionDisplay: { - AcquireAsset: "Acquire an Asset", - IndulgeVice: "Indulge Your Vice", - LongTermProject: "Work on a Project", - Recover: "Heal", - ReduceHeat: "Reduce the Crew's Heat", - Train: "Train" - }, - ConsequenceValues: { - ReducedEffect: void 0, - LostOpportunity: 2, - WorsePosition: void 0, - None: 0, - InsightHarm4: 4, - InsightHarm3: 3, - InsightHarm2: 2, - InsightHarm1: 1, - ProwessHarm4: 4, - ProwessHarm3: 3, - ProwessHarm2: 2, - ProwessHarm1: 1, - ResolveHarm4: 4, - ResolveHarm3: 3, - ResolveHarm2: 2, - ResolveHarm1: 1, - ComplicationSerious: 3, - ComplicationMajor: 2, - ComplicationMinor: 1 - }, - ResistedConsequenceTypes: { - None: [], - InsightHarm4: [ - "InsightHarm3" - /* InsightHarm3 */ - ], - InsightHarm3: [ - "InsightHarm2" - /* InsightHarm2 */ - ], - InsightHarm2: [ - "InsightHarm1" - /* InsightHarm1 */ - ], - InsightHarm1: [ - "None" - /* None */ - ], - ProwessHarm4: [ - "ProwessHarm3" - /* ProwessHarm3 */ - ], - ProwessHarm3: [ - "ProwessHarm2" - /* ProwessHarm2 */ - ], - ProwessHarm2: [ - "ProwessHarm1" - /* ProwessHarm1 */ - ], - ProwessHarm1: [ - "None" - /* None */ - ], - ResolveHarm4: [ - "ResolveHarm3" - /* ResolveHarm3 */ - ], - ResolveHarm3: [ - "ResolveHarm2" - /* ResolveHarm2 */ - ], - ResolveHarm2: [ - "ResolveHarm1" - /* ResolveHarm1 */ - ], - ResolveHarm1: [ - "None" - /* None */ - ], - ComplicationSerious: [ - "ComplicationMajor" - /* ComplicationMajor */ - ], - ComplicationMajor: [ - "ComplicationMinor" - /* ComplicationMinor */ - ], - ComplicationMinor: [ - "None" - /* None */ - ] - }, - ConsequenceDisplay: { - ReducedEffect: "Reduced Effect", - ComplicationMinor: "Minor Complication", - ComplicationMajor: "Major Complication", - ComplicationSerious: "Serious Complication", - LostOpportunity: "Lost Opportunity", - WorsePosition: "Worse Position", - InsightHarm1: "Level 1 Harm (Lesser)", - InsightHarm2: "Level 2 Harm (Moderate)", - InsightHarm3: "Level 3 Harm (Severe)", - InsightHarm4: "Level 4 Harm (FATAL)", - ProwessHarm1: "Level 1 Harm (Lesser)", - ProwessHarm2: "Level 2 Harm (Moderate)", - ProwessHarm3: "Level 3 Harm (Severe)", - ProwessHarm4: "Level 4 Harm (FATAL)", - ResolveHarm1: "Level 1 Harm (Lesser)", - ResolveHarm2: "Level 2 Harm (Moderate)", - ResolveHarm3: "Level 3 Harm (Severe)", - ResolveHarm4: "Level 4 Harm (FATAL)", - None: "None" - }, - ConsequenceIcons: { - ReducedEffect: "reduced-effect", - ComplicationMinor: "complication-minor", - ComplicationMajor: "complication-major", - ComplicationSerious: "complication-serious", - LostOpportunity: "lost-opportunity", - WorsePosition: "worse-position", - InsightHarm1: "harm-insight-1", - InsightHarm2: "harm-insight-2", - InsightHarm3: "harm-insight-3", - InsightHarm4: "harm-insight-4", - ProwessHarm1: "harm-prowess-1", - ProwessHarm2: "harm-prowess-2", - ProwessHarm3: "harm-prowess-3", - ProwessHarm4: "harm-prowess-4", - ResolveHarm1: "harm-resolve-1", - ResolveHarm2: "harm-resolve-2", - ResolveHarm3: "harm-resolve-3", - ResolveHarm4: "harm-resolve-4", - None: "" - }, - RollResultDescriptions: { - controlled: { - critical: "You critically succeed from a controlled position!", - success: "You fully succeed from a controlled position!", - partial: "You partially succeed from a controlled position!", - fail: "You fail from a controlled position!" - }, - risky: { - critical: "You critically succeed from a risky position!", - success: "You fully succeed from a risky position!", - partial: "You partially succeed from a risky position!", - fail: "You fail from a risky position!" - }, - desperate: { - critical: "You critically succeed from a desperate position!", - success: "You fully succeed from a desperate position!", - partial: "You partially succeed from a desperate position!", - fail: "You fail from a desperate position!" - } - }, - Colors: { - /* IMPORT FROM CSS via css-loader */ - bWHITE: "rgba(255, 255, 255, 1)", - WHITE: "rgba(200, 200, 200, 1)", - bGREY: "rgba(170, 170, 170, 1)", - GREY: "rgba(119, 119, 119, 1)", - dGREY: "rgba(68, 68, 68, 1)", - BLACK: "rgba(32, 32, 32, 1)", - dBLACK: "rgba(0, 0, 0, 1)", - bGOLD: "rgba(255,216, 44, 1)", - GOLD: "rgba(215,175, 0, 1)", - dGOLD: "rgba(165,134, 0, 1)", - ddGOLD: "rgba(103, 83, 0, 1)", - bRED: "rgba(255, 0, 0, 1)", - RED: "rgba(200, 0, 0, 1)", - dRED: "rgba(150, 0, 0, 1)", - ddRED: "rgba(50, 0, 0, 1)", - bBLUE: "rgba( 0,224,224, 1)", - BLUE: "rgba(52,213,213, 1)", - dBLUE: "rgba(0,118,118, 1)", - ddBLUE: "rgba(0, 77, 77, 1)" - }, - // ClockKeyPositions: { - // elemSquareSize: 100, - // 0: { - // keyDimensions: {width: 0, height: 0}, - // keyCenter: {x: 0, y: 0}, - // clocksCenter: {x: 0, y: 0}, - // clocksCenterDimensions: {width: 0, height: 0}, - // clocks: {} - // }, - // 1: { - // keyDimensions: {width: 230, height: 836}, - // keyCenter: {x: 115, y: 418}, - // clocksCenter: {x: 111.011, y: 108.5}, - // clocksCenterDimensions: {width: 169, height: 169}, - // clocks: { - // 0: {x: 111.011, y: 108.5, size: 169} - // } - // }, - // 2: { - // keyDimensions: {width: 202, height: 625}, - // keyCenter: {x: 101, y: 312}, - // clocksCenter: {x: 101, y: 189}, - // clocksCenterDimensions: {width: 110, height: 290}, - // clocks: { - // 0: {x: 101, y: 99, size: 108}, - // 1: {x: 101, y: 279, size: 108} - // } - // }, - // 3: { - // keyDimensions: {width: 280, height: 915}, - // keyCenter: {x: 140, y: 457}, - // clocksCenter: {x: 140, y: 169}, - // clocksCenterDimensions: {width: 242, height: 222}, - // clocks: { - // 0: {x: 140, y: 99, size: 108}, - // 1: {x: 74, y: 211, size: 108}, - // 2: {x: 206, y: 211, size: 108} - // } - // }, - // 4: { - // keyDimensions: {width: 376, height: 1140}, - // keyCenter: {x: 188, y: 570}, - // clocksCenter: {x: 188, y: 185}, - // clocksCenterDimensions: {width: 284, height: 282}, - // clocks: { - // 0: {x: 188, y: 99, size: 108}, // yTop = 45 - // 1: {x: 101, y: 185, size: 108}, - // 2: {x: 275, y: 185, size: 108}, - // 3: {x: 188, y: 273, size: 108} // yBottom = 327 - // } - // }, - // 5: { - // keyDimensions: {width: 376, height: 1140}, - // keyCenter: {x: 188, y: 570}, - // clocksCenter: {x: 188, y: 185}, - // clocksCenterDimensions: {width: 284, height: 384}, - // clocks: { - // 0: {x: 188, y: 99, size: 108}, // yTop = 45 - // 1: {x: 101, y: 185, size: 108}, - // 2: {x: 275, y: 185, size: 108}, - // 3: {x: 188, y: 273, size: 108}, - // 4: {x: 188, y: 452, size: 108} // yBottom = 506 - // } - // }, - // 6: { - // keyDimensions: {width: 376, height: 1140}, - // keyCenter: {x: 188, y: 570}, - // clocksCenter: {x: 188, y: 391}, - // clocksCenterDimensions: {width: 284, height: 692}, - // clocks: { - // 0: {x: 188, y: 99, size: 108}, // yTop = 45 - // 1: {x: 101, y: 185, size: 108}, - // 2: {x: 275, y: 185, size: 108}, - // 3: {x: 188, y: 273, size: 108}, - // 4: {x: 188, y: 452, size: 108}, - // 5: {x: 188, y: 683, size: 108} // yBottom = 737 - // } - // } - // }, - Loadout: { - selections: [ - { value: "Light", display: "Light" }, - { value: "Normal", display: "Normal" }, - { value: "Heavy", display: "Heavy" } - ], - levels: ["BITD.Light", "BITD.Normal", "BITD.Heavy", "BITD.Encumbered", "BITD.OverMax"] - }, - AttributeTooltips: { - insight: "

Resists consequences from deception or understanding

", - prowess: "

Resists consequences from physical strain or injury

", - resolve: "

Resists consequences from mental strain or willpower

" - }, - ShortAttributeTooltips: { - insight: "vs. deception or (mis)understanding", - prowess: "vs. physical strain or injury", - resolve: "vs. mental strain or willpower" - }, - ShortActionTooltips: { - hunt: "carefully track a target", - study: "scrutinize details and interpret evidence", - survey: "observe the situation and anticipate outcomes", - tinker: "fiddle with devices and mechanisms", - finesse: "employ dexterity or subtle misdirection", - prowl: "traverse skillfully and quietly", - skirmish: "entangle a target in melee so they can't escape", - wreck: "unleash savage force", - attune: "open your mind to the ghost field or channel nearby electroplasmic energy through your body", - command: "compel swift obedience", - consort: "socialize with friends and contacts", - sway: "influence someone with guile, charm, or argument" - }, - ActionTooltips: { - hunt: "

When you Hunt, you carefully track a target.

", - study: "

When you Study, you scrutinize details and interpret evidence.

", - survey: "

When you Survey, you observe the situation and anticipate outcomes.

", - tinker: "

When you Tinker, you fiddle with devices and mechanisms.

", - finesse: "

When you Finesse, you employ dexterity or subtle misdirection.

", - prowl: "

When you Prowl, you traverse skillfully and quietly.

", - skirmish: "

When you Skirmish, you entangle a target in melee so they can't escape.

", - wreck: "

When you Wreck, you unleash savage force.

", - attune: "

When you Attune, you open your mind to the ghost field or channel nearby electroplasmic energy through your body.

", - command: "

When you Command, you compel swift obedience.

", - consort: "

When you Consort, you socialize with friends and contacts.

", - sway: "

When you Sway, you influence someone with guile, charm, or argument.

" - }, - ActionTooltipsGM: { - hunt: "

When you Hunt, you carefully track a target.


", - study: "

When you Study, you scrutinize details and interpret evidence.


", - survey: "

When you Survey, you observe the situation and anticipate outcomes.


", - tinker: "

When you Tinker, you fiddle with devices and mechanisms.


", - finesse: "

When you Finesse, you employ dexterity or subtle misdirection.


", - prowl: "

When you Prowl, you traverse skillfully and quietly.


", - skirmish: "

When you Skirmish, you entangle a target in melee so they can't escape.


", - wreck: "

When you Wreck, you unleash savage force.


", - attune: "

When you Attune, you open your mind to the ghost field or channel nearby electroplasmic energy through your body.


", - command: "

When you Command, you compel swift obedience.


", - consort: "

When you Consort, you socialize with friends and contacts.


", - sway: "

When you Sway, you influence someone with guile, charm, or argument.


" - }, - ActionVerbs: { - hunt: "hunts", - study: "studies", - survey: "surveys", - tinker: "tinkers", - finesse: "finesses", - prowl: "prowls", - skirmish: "skirmishes", - wreck: "wrecks", - attune: "attunes", - command: "commands", - consort: "consorts", - sway: "sways" - }, - ActionPastVerbs: { - hunt: "hunted", - study: "studied", - survey: "surveyed", - tinker: "tinkered", - finesse: "finessed", - prowl: "prowled", - skirmish: "skirmished", - wreck: "wrecked", - attune: "attuned", - command: "commanded", - consort: "consorted", - sway: "swayed" - }, - TraumaTooltips: { - Cold: "You're not moved by emotional appeals or social bonds.", - Haunted: "You're often lost in reverie, reliving past horrors, seeing things.", - Obsessed: "You're enthralled by one thing: an activity, a person, an ideology.", - Paranoid: "You imagine danger everywhere; you can't trust others.", - Reckless: "You have little regard for your own safety or best interests.", - Soft: "You lose your edge; you become sentimental, passive, gentle.", - Unstable: "Your emotional state is volatile. You can instantly rage, or fall into despair, act impulsively, or freeze up.", - Vicious: "You seek out opportunities to hurt people, even for no good reason.", - Chaotic: "You've become so detached from the living that inhibitions fall away, leaving you impulsive and unpredictable.", - Destructive: "You are easily angered by reminders of all you've lost, and can lash out violently against the trappings of the living world.", - Furious: "Your ravaged soul is fertile kindling for rage, and your fury is easily ignited.", - Obsessive: "Your wants and desires become fixations and compulsions, driving you to achieve them at any cost.", - Territorial: "You see some place as yours: Trespassers are dealt with, and even guests must respect your claim.", - Savage: "When moved to anger or violence, you act with cruelty and feral malevolence.", - Clanking: "Your frame has developed a persistent metallic clang with each step, making stealth difficult.", - Leaking: "You continuously leak oil, leviathan blood, distilled electroplasm or some other potentially-dangerous substance.", - Fixated: "You have become fixated on a function of your choice, and lose all memory of your humanity when you pursue it.", - Smoking: "Your frame exudes a constant miasma of acrid, foul-smelling smoke.", - Sparking: "Electroplasmic energy erupts in arcing sparks from joints and junctions throughout your frame.", - Ruthless: "You lose any sense of humanity when indulging your Vice or pursuing your most important goal.", - Secretive: "Knowledge has become so precious to you, that even your closest allies are on a need-to-know basis." - }, - EdgeTooltips: { - Fearsome: "

The cohort is terrifying in aspect and reputation.

", - Independent: "

The cohort can be trusted to make good decisions and act on their own initiative in the absence of direct orders.

", - Loyal: "

The cohort can't be bribed or turned against you.

", - Tenacious: "

The cohort won't be deterred from a task.

", - Nimble: "

The vehicle handles easily. Consider this an assist for tricky maneuvers.

", - Simple: "

The vehicle is easy to repair. Remove all of its Harm during downtime

", - Sturdy: "

The vehicle keeps operating even when Broken.

", - "Arrow-Swift": "

Your pet gains Potency when tracking or fighting the supernatural.

It can move extremely quickly, outpacing any other creature or vehicle.

", - "Ghost Form": "

Your pet gains Potency when tracking or fighting the supernatural.

It can transform into electroplasmic vapor as if it were a spirit.

", - "Mind Link": "

Your pet gains Potency when tracking or fighting the supernatural.

You and your pet can share senses and thoughts telepathically.

" - }, - FlawTooltips: { - Principled: "

The cohort has an ethic or values that it won't betray.

", - Savage: "

The cohort is excessively violent and cruel.

", - Unreliable: "

The cohort isn't always available, due to other obligations, stupefaction from their vices, etc.

", - Wild: "

The cohort is drunken, debauched, and loud-mouthed.

", - Costly: "

The vehicle costs 1 Coin per downtime to keep it in operation.

", - Distinct: "

The vehicle has memorable features. Take +1 Heat when you use it on a score.

", - Finicky: "

The vehicle has quirks that only one person understands. When operated without them, it has -1 Quality.

" - }, - QualityDescriptors: [ - "Poor", - "Adequate", - "Good", - "Excellent", - "Superior", - "Impeccable", - "Legendary" - ], - ForceDescriptors: [ - "Weak", - "Moderate", - "Strong", - "Serious", - "Powerful", - "Overwhelming", - "Devastating" - ], - VehicleDescriptors: [ - "A Vehicle?", - "A Vehicle", - "A Respectable Vehicle", - "A Respected Vehicle", - "A Precision-Built Vehicle", - "A Powerful, Advanced Vehicle", - "A Uniquely Strong, Extremely Advanced Vehicle" - ], - PetDescriptors: [ - "A Weak Hunting Pet", - "A Hunting Pet", - "A Strong Hunting Pet", - "A Serious Hunting Pet", - "A Powerful Hunting Pet", - "An Overwhelmingly Powerful Hunting Pet", - "A Devastating Hunting Pet" - ], - AreaExamples: [ - "a closet", - "a small room", - "a large room", - "several rooms", - "a small building", - "a large building", - "a city block" - ], - ScaleExamples: [ - "(1 or 2 members)", - "(3 - 6 members)", - "(~12 members)", - "(~20 members)", - "(~40 members)", - "(~80 members)", - "(~160 members)" - ], - ScaleSizes: [ - "A Few ", - "A Small Gang of ", - "A Gang of ", - "A Large Gang of ", - "A Small Army of ", - "An Army of ", - "A Massive Army of " - ], - DiceOddsStandard: [ - { crit: 0, success: 2.8, partial: 22.2, fail: 75 }, - { crit: 0, success: 16.7, partial: 33.3, fail: 50 }, - { crit: 2.8, success: 27.8, partial: 44.4, fail: 25 }, - { crit: 7.4, success: 34.7, partial: 45.4, fail: 12.5 }, - { crit: 13.2, success: 38.6, partial: 42, fail: 6.3 }, - { crit: 19.6, success: 40.2, partial: 37.1, fail: 3.1 }, - { crit: 26.3, success: 40.2, partial: 31.9, fail: 1.6 }, - { crit: 33, success: 39.1, partial: 27.1, fail: 0.8 }, - { crit: 39.5, success: 37.2, partial: 22.9, fail: 0.4 }, - { crit: 45.7, success: 34.9, partial: 19.2, fail: 0.2 }, - { crit: 51.5, success: 32.3, partial: 16.1, fail: 0.1 }, - { crit: 56.9, success: 29.6, partial: 13.4, fail: 0 }, - { crit: 61.9, success: 26.9, partial: 11.2, fail: 0 }, - { crit: 66.3, success: 24.3, partial: 9.3, fail: 0 }, - { crit: 70.4, success: 21.8, partial: 7.8, fail: 0 }, - { crit: 74, success: 19.5, partial: 6.5, fail: 0 }, - { crit: 77.3, success: 17.3, partial: 5.4, fail: 0 }, - { crit: 80.2, success: 15.3, partial: 4.5, fail: 0 }, - { crit: 82.7, success: 13.5, partial: 3.8, fail: 0 }, - { crit: 85, success: 11.9, partial: 3.1, fail: 0 }, - { crit: 87, success: 10.4, partial: 2.6, fail: 0 } - ], - DiceOddsResistance: [ - // Stress Cost: [-1, 0, 1, 2, 3, 4, 5] - [0, 2.8, 8.3, 13.9, 19.4, 25, 30.6], - [0, 16.7, 16.7, 16.7, 16.6, 16.7, 16.7], - [2.8, 27.8, 25, 19.4, 13.9, 8.3, 2.8], - [7.4, 34.7, 28.3, 17.1, 8.8, 3.2, 0.5], - [13.2, 38.6, 28.5, 13.5, 5, 1.2, 0.1], - [19.6, 40.2, 27, 10.1, 2.7, 0.4, 0], - [26.3, 40.2, 24.7, 7.2, 1.4, 0.1, 0] - ], - ExperienceClues: { - Scoundrel: [ - "You expressed your beliefs, drives, heritage, or background.", - "You struggled with issues from your vice or traumas during the session." - ], - Crew: [ - "You contended with challenges above your current station.", - "You bolstered your crew's reputation, or developed a new one.", - "You expressed the goals, drives, inner conflict, or essential nature of the crew." - ] - }, - GatherInfoQuestions: { - Cutter: [ - "How can I hurt them?", - "Who's most afraid of me?", - "Who's most dangerous here?", - "What do they intend to do?", - "How can I get them to [X]?", - "Are they telling the truth?", - "What's really going on here?" - ], - Hound: [ - "What do they intend to do?", - "How can I get them to [X]?", - "What are they really feeling?", - "Where are they vulnerable?", - "Where did [X] go?", - "How can I find [X]?", - "What's really going on here?" - ], - Leech: [ - "What do they intend to do?", - "How can I get them to [X]?", - "Are they telling the truth?", - "What can I tinker with here?", - "What might happen if I [X]?", - "How can I find [X]?", - "What's really going on here?" - ], - Lurk: [ - "What do they intend to do?", - "How can I get them to [X]?", - "What should I look out for?", - "What's the best way in?", - "Where can I hide here?", - "How can I find [X]?", - "What's really going on here?" - ], - Slide: [ - "What do they intend to do?", - "How can I get them to [X]?", - "Are they telling the truth?", - "What are they really feeling?", - "What do they really care about?", - "How can I blend in here?", - "What's really going on here?" - ], - Spider: [ - "What do they want most?", - "What should I look out for?", - "Where's the leverage here?", - "How can I discover [X]?", - "What do they intend to do?", - "How can I get them to [X]?", - "What's really going on here?" - ], - Whisper: [ - "What is arcane or weird here?", - "What echoes in the ghost field?", - "What is hidden or lost here?", - "What do they intend to do?", - "What drives them to do this?", - "How can I reveal [X]?", - "What's really going on here?" - ], - Ghost: [ - "What do they intend to do?", - "How can I get them to [X]?", - "What are they really feeling?", - "What should I lookout for?", - "Where's the weakness here?", - "How can I find [X]?", - "What's really going on here?" - ], - Hull: [ - "What do they intend to do?", - "How can I get them to [X]?", - "What are they really doing?", - "What should I lookout for?", - "Where's the weakness here?", - "How can I find [X]?", - "What's really going on here?" - ], - Vampire: [ - "What do they intend to do?", - "How can I get them to [X]?", - "What are they really feeling?", - "What should I lookout for?", - "Where's the weakness here?", - "How can I find [X]?", - "What's really going on here?" - ] - }, - Playbooks: { - Cutter: { - "system.experience_clues": [ - "You addressed a challenge with violence or coercion.", - "You expressed your beliefs, drives, heritage, or background.", - "You struggled with issues from your vice or traumas during the session." - ], - "system.trauma_conditions": ["Cold", "Haunted", "Obsessed", "Paranoid", "Reckless", "Soft", "Unstable", "Vicious"], - "system.gather_info_questions": [ - "How can I hurt them?", - "Who's most afraid of me?", - "Who's most dangerous here?", - "What do they intend to do?", - "How can I get them to [X]?", - "Are they telling the truth?", - "What's really going on here?" - ], - "system.suggested_ability": "Battleborn" - }, - Hound: { - "system.bgImg": "systems/eunos-blades/assets/icons/class-icons/hound-trans.svg", - "system.tagline": "A Deadly Sharpshooter & Tracker", - // "system.acquaintances_name": "Deadly Friends & Rivals", - "system.friends_name": "Deadly Friends", - "system.rivals_name": "Deadlier Rivals", - "system.starting_stats.chargen": { - "system.attributes.insight.hunt.value": 2, - "system.attributes.insight.survey.value": 1 - }, - "system.experience_clues": [ - "You addressed a challenge with tracking or violence.", - "You expressed your beliefs, drives, heritage, or background.", - "You struggled with issues from your vice or traumas during the session." - ], - "system.trauma_conditions": ["Cold", "Haunted", "Obsessed", "Paranoid", "Reckless", "Soft", "Unstable", "Vicious"], - "system.gather_info_questions": [ - "What do they intend to do?", - "How can I get them to [X]?", - "What are they really feeling?", - "Where are they vulnerable?", - "Where did [X] go?", - "How can I find [X]?", - "What's really going on here?" - ], - "system.suggested_ability": "Sharpshooter" - }, - Leech: { - "system.bgImg": "systems/eunos-blades/assets/icons/class-icons/leech-trans.svg", - "system.tagline": "A Saboteur & Technician", - // "system.acquaintances_name": "Clever Friends & Rivals", - "system.friends_name": "Clever Friends", - "system.rivals_name": "Cleverer Rivals", - "system.starting_stats.chargen": { - "system.attributes.insight.tinker.value": 2, - "system.attributes.prowess.wreck.value": 1 - }, - "system.experience_clues": [ - "You addressed a challenge with technical skill or mayhem.", - "You expressed your beliefs, drives, heritage, or background.", - "You struggled with issues from your vice or traumas during the session." - ], - "system.trauma_conditions": ["Cold", "Haunted", "Obsessed", "Paranoid", "Reckless", "Soft", "Unstable", "Vicious"], - "system.gather_info_questions": [ - "What do they intend to do?", - "How can I get them to [X]?", - "Are they telling the truth?", - "What can I tinker with here?", - "What might happen if I [X]?", - "How can I find [X]?", - "What's really going on here?" - ], - "system.suggested_ability": "Alchemist" - }, - Lurk: { - "system.bgImg": "systems/eunos-blades/assets/icons/class-icons/lurk-trans.svg", - "system.tagline": "A Stealthy Infiltrator & Burglar", - // "system.acquaintances_name": "Shady Friends & Rivals", - "system.friends_name": "Shady Friends", - "system.rivals_name": "Shadier Rivals", - "system.starting_stats.chargen": { - "system.attributes.prowess.prowl.value": 2, - "system.attributes.prowess.finesse.value": 1 - }, - "system.experience_clues": [ - "You addressed a challenge with stealth or evasion.", - "You expressed your beliefs, drives, heritage, or background.", - "You struggled with issues from your vice or traumas during the session." - ], - "system.trauma_conditions": ["Cold", "Haunted", "Obsessed", "Paranoid", "Reckless", "Soft", "Unstable", "Vicious"], - "system.gather_info_questions": [ - "What do they intend to do?", - "How can I get them to [X]?", - "What should I look out for?", - "What's the best way in?", - "Where can I hide here?", - "How can I find [X]?", - "What's really going on here?" - ], - "system.suggested_ability": "Infiltrator" - }, - Slide: { - "system.bgImg": "systems/eunos-blades/assets/icons/class-icons/slide-trans.svg", - "system.tagline": "A Subtle Manipulator & Spy", - // "system.acquaintances_name": "Sly Friends & Rivals", - "system.friends_name": "Sly Friends", - "system.rivals_name": "Slyer Rivals", - "system.starting_stats.chargen": { - "system.attributes.resolve.sway.value": 2, - "system.attributes.resolve.consort.value": 1 - }, - "system.experience_clues": [ - "You addressed a challenge with deception or influence.", - "You expressed your beliefs, drives, heritage, or background.", - "You struggled with issues from your vice or traumas during the session." - ], - "system.trauma_conditions": ["Cold", "Haunted", "Obsessed", "Paranoid", "Reckless", "Soft", "Unstable", "Vicious"], - "system.gather_info_questions": [ - "What do they intend to do?", - "How can I get them to [X]?", - "Are they telling the truth?", - "What are they really feeling?", - "What do they really care about?", - "How can I blend in here?", - "What's really going on here?" - ], - "system.suggested_ability": "Rook's Gambit" - }, - Spider: { - "system.bgImg": "systems/eunos-blades/assets/icons/class-icons/spider-trans.svg", - "system.tagline": "A Devious Mastermind", - // "system.acquaintances_name": "Shrewd Friends & Rivals", - "system.friends_name": "Shrewd Friends", - "system.rivals_name": "Very Shrewd Rivals", - "system.starting_stats.chargen": { - "system.attributes.resolve.consort.value": 2, - "system.attributes.insight.study.value": 1 - }, - "system.experience_clues": [ - "You addressed a challenge with calculation or conspiracy.", - "You expressed your beliefs, drives, heritage, or background.", - "You struggled with issues from your vice or traumas during the session." - ], - "system.trauma_conditions": ["Cold", "Haunted", "Obsessed", "Paranoid", "Reckless", "Soft", "Unstable", "Vicious"], - "system.gather_info_questions": [ - "What do they want most?", - "What should I look out for?", - "Where's the leverage here?", - "How can I discover [X]?", - "What do they intend to do?", - "How can I get them to [X]?", - "What's really going on here?" - ], - "system.suggested_ability": "Foresight" - }, - Whisper: { - "system.bgImg": "systems/eunos-blades/assets/icons/class-icons/whisper-trans.svg", - "system.tagline": "An Arcane Adept & Channeler", - // "system.acquaintances_name": "Strange Friends & Rivals", - "system.friends_name": "Strange Friends", - "system.rivals_name": "Stranger Rivals", - "system.starting_stats.chargen": { - "system.attributes.resolve.attune.value": 2, - "system.attributes.insight.study.value": 1 - }, - "system.experience_clues": [ - "You addressed a challenge with knowledge or arcane power.", - "You expressed your beliefs, drives, heritage, or background.", - "You struggled with issues from your vice or traumas during the session." - ], - "system.trauma_conditions": ["Cold", "Haunted", "Obsessed", "Paranoid", "Reckless", "Soft", "Unstable", "Vicious"], - "system.gather_info_questions": [ - "What is arcane or weird here?", - "What echoes in the ghost field?", - "What is hidden or lost here?", - "What do they intend to do?", - "What drives them to do this?", - "How can I reveal [X]?", - "What's really going on here?" - ], - "system.suggested_ability": "Compel" - }, - Ghost: { - "system.bgImg": "systems/eunos-blades/assets/icons/class-icons/ghost-trans.svg", - "system.tagline": "A Vengeful Disembodied Spirit", - "system.acquaintances_name": "Enemies & Rivals", - "system.starting_stats.add": { - "system.attributes.insight.hunt.value": 1, - "system.attributes.prowess.prowl.value": 1, - "system.attributes.resolve.attune.value": 1 - }, - "system.experience_clues": [ - "You exacted vengeance upon those whom you deem deserving.", - "You expressed your outrage or anger, or settled scores from your heritage, or background.", - "You struggled with issues from your need or glooms during the session." - ], - "system.trauma_conditions": ["Chaotic", "Destructive", "Furious", "Obsessive", "Territorial", "Savage"], - "system.gather_info_questions": [ - "What do they intend to do?", - "How can I get them to [X]?", - "What are they really feeling?", - "What should I lookout for?", - "Where's the weakness here?", - "How can I find [X]?", - "What's really going on here?" - ], - "system.auto_abilities": ["Ghost Form"] - }, - Hull: { - "system.bgImg": "systems/eunos-blades/assets/icons/class-icons/hull-trans.svg", - "system.tagline": "An Animated Spark-Craft Frame", - "system.acquaintances_name": "Master", - "system.starting_stats.add": { - "system.attributes.prowess.skirmish.value": 1, - "system.attributes.resolve.attune.value": 1 - }, - "system.experience_clues": [ - "You fulfilled your functions despite difficulty or danger.", - "You suppressed or ignored your former human beliefs, drives, heritage, or background.", - "You struggled with issues from your wear during the session." - ], - "system.trauma_conditions": ["Clanking", "Leaking", "Fixated", "Smoking", "Sparking", "Unstable"], - "system.gather_info_questions": [ - "What do they intend to do?", - "How can I get them to [X]?", - "What are they really doing?", - "What should I lookout for?", - "Where's the weakness here?", - "How can I find [X]?", - "What's really going on here?" - ], - "system.auto_abilities": ["Automaton"] - }, - Vampire: { - "system.bgImg": "systems/eunos-blades/assets/icons/class-icons/vampire-trans.svg", - "system.tagline": "An Animated Undead Body", - "system.acquaintances_name": "Dark Servants", - "system.starting_stats.add": { - "system.attributes.insight.hunt.value": 1, - "system.attributes.prowess.prowl.value": 1, - "system.attributes.prowess.skirmish.value": 1, - "system.attributes.resolve.attune.value": 1, - "system.attributes.resolve.command.value": 1, - "system.attributes.resolve.sway.value": 1 - }, - "system.experience_clues": [ - "You displayed your dominance or slayed without mercy.", - "You expressed your beliefs, drives, heritage, or background.", - "You struggled with issues from your vice, traumas, or strictures during the session." - ], - "system.trauma_conditions": ["Cold", "Haunted", "Obsessed", "Paranoid", "Ruthless", "Secretive", "Unstable", "Vicious"], - "system.gather_info_questions": [ - "What do they intend to do?", - "How can I get them to [X]?", - "What are they really feeling?", - "What should I lookout for?", - "Where's the weakness here?", - "How can I find [X]?", - "What's really going on here?" - ], - "system.auto_abilities": ["Undead"] - } - }, - ClockSizes: [1, 2, 3, 4, 5, 6, 8, 10, 12], - ActorTypes: [ - "pc", - "npc", - "crew", - "faction" - /* faction */ - ], - ItemTypes: [ - "ability", - "background", - "clock_keeper", - "cohort_gang", - "cohort_expert", - "crew_ability", - "crew_reputation", - "crew_playbook", - "crew_upgrade", - "feature", - "gm_tracker", - "heritage", - "gear", - "playbook", - "preferred_op", - "stricture", - "vice", - "project", - "ritual", - "design", - "location", - "score" - /* score */ - ], - SimpleItemTypes: [ - "background", - "crew_reputation", - "feature", - "heritage", - "preferred_op", - "stricture" - /* stricture */ - ], - Attribute: [ - "insight", - "prowess", - "resolve" - /* resolve */ - ], - Action: { - insight: [ - "hunt", - "study", - "survey", - "tinker" - /* tinker */ - ], - prowess: [ - "finesse", - "prowl", - "skirmish", - "wreck" - /* wreck */ - ], - resolve: [ - "attune", - "command", - "consort", - "sway" - /* sway */ - ] - }, - Vices: [ - "Faith", - "Gambling", - "Luxury", - "Obligation", - "Pleasure", - "Stupor", - "Weird", - "Worship", - "Living_Essence", - "Life_Essence", - "Electroplasmic_Power" - /* Electroplasmic_Power */ - ] -}, Re = { - NPC: { - heritage: [ - "Akorosi", - "Akorosi", - "Akorosi", - "Akorosi", - "Akorosi", - "Akorosi", - "Dagger Islander", - "Iruvian", - "Severosi", - "Skovlander", - "Skovlander", - "Tycherosi" - ], - background: [ - "Academic", - "Academic", - "Academic", - "Labor", - "Labor", - "Labor", - "Labor", - "Law", - "Law", - "Law", - "Military", - "Military", - "Military", - "Military", - "Military", - "New Money", - "New Money", - "Old Money", - "Old Money", - "Politics", - "Politics", - "Trade", - "Trade", - "Trade", - "Underworld", - "Underworld", - "Underworld", - "Underworld", - "Underworld", - "Weird" - ], - gender: [ - "M", - "M", - "M", - "M", - "F", - "F", - "F", - "U", - "X" - ], - appearance: [ - "Athletic", - "Beard", - "Bony", - "Chiseled", - "Crippled / Prosthetic", - "Cute", - "Dark", - "Delicate", - "Disfigured / Maimed", - "Elegant", - "Fair", - "Glasses / Monocle", - "Handsome", - "Large", - "Long Hair", - "Lovely", - "Old", - "Plain", - "Plump", - "Rough", - "Scarred", - "Sexy", - "Shaved Bald", - "Short", - "Slim", - "Stooped", - "Stout", - "Strange", - "Striking", - "Stylish", - "Tall", - "Tattooed", - "Weathered", - "Wig", - "Wild", - "Wiry", - "Worn", - "Young" - ], - goal: [ - "Achievement", - "Authority", - "Change", - "Chaos / Destruction", - "Control", - "Cooperation", - "Freedom", - "Happiness", - "Infamy / Fear", - "Justice", - "Knowledge", - "Love", - "Pleasure", - "Power", - "Prestige / Fame", - "Respect", - "Revenge", - "Wealth" - ], - method: [ - "Alchemy", - "Arcane", - "Blackmail", - "Chaos", - "Commerce", - "Espionage", - "Hard Work", - "Law / Politics", - "Manipulation", - "Negotiation", - "Sabotage", - "Strategy", - "Study", - "Subterfuge", - "Teamwork", - "Theft", - "Threats", - "Violence" - ], - profession: [ - "Advocate", - "Apiarist", - "Architect", - "Artist", - "Author", - "Bailiff", - "Baker", - "Baker", - "Baker", - "Banker", - "Barber", - "Barber", - "Barber", - "Blacksmith", - "Blacksmith", - "Blacksmith", - "Bounty Hunter", - "Brewer", - "Brewer", - "Brewer", - "Butcher", - "Butcher", - "Butcher", - "Captain", - "Carpenter", - "Carpenter", - "Carpenter", - "Cartwright", - "Cartwright", - "Cartwright", - "Chandler", - "Chandler", - "Chandler", - "Clerk", - "Clerk", - "Clerk", - "Clockmaker", - "Cobbler", - "Cobbler", - "Cobbler", - "Composer", - "Cooper", - "Cooper", - "Cooper", - "Courtesan", - "Criminal", - "Criminal", - "Criminal", - "Cultivator", - "Cultivator", - "Cultivator", - "Diplomat", - "Driver", - "Driver", - "Driver", - "Dyer", - "Dyer", - "Dyer", - "Embroiderer", - "Embroiderer", - "Embroiderer", - "Explorer", - "Fishmonger", - "Fishmonger", - "Fishmonger", - "Furrier", - "Glass Blower", - "Goat Herd", - "Goat Herd", - "Goat Herd", - "Gondolier", - "Gondolier", - "Gondolier", - "Guard", - "Guard", - "Guard", - "Jailer", - "Jeweler", - "Journalist", - "Leatherworker", - "Leatherworker", - "Leatherworker", - "Leech", - "Locksmith", - "Magistrate", - "Mason", - "Mason", - "Mason", - "Merchant", - "Merchant", - "Merchant", - "Messenger", - "Messenger", - "Messenger", - "Musician", - "Physicker", - "Plumber", - "Printer", - "Rail Jack", - "Roofer", - "Roofer", - "Roofer", - "Ropemaker", - "Ropemaker", - "Ropemaker", - "Rug Maker", - "Rug Maker", - "Rug Maker", - "Sailor", - "Sailor", - "Sailor", - "Scholar", - "Scribe", - "Servant", - "Servant", - "Servant", - "Shipwright", - "Shipwright", - "Shipwright", - "Soldier", - "Sparkwright", - "Spirit Warden", - "Steward", - "Tailor", - "Tailor", - "Tailor", - "Tanner", - "Tanner", - "Tanner", - "Tax Collector", - "Tinkerer", - "Tinkerer", - "Tinkerer", - "Treasurer", - "Vendor", - "Vendor", - "Vendor", - "Weaver", - "Weaver", - "Weaver", - "Whisper", - "Woodworker", - "Woodworker", - "Woodworker" - ], - trait: [ - "Arcane", - "Arrogant", - "Artistic", - "Bold", - "Brash", - "Brave", - "Calculating", - "Calm", - "Candid", - "Careless", - "Cautious", - "Cavalier", - "Charming", - "Cold", - "Commanding", - "Compassionate", - "Confident", - "Connected", - "Cooperative", - "Creative", - "Cruel", - "Cultured", - "Daring", - "Defiant", - "Dishonest", - "Dramatic", - "Elitist", - "Enigmatic", - "Enthusiastic", - "Erudite", - "Experienced", - "Fierce", - "Flexible", - "Friendly", - "Gracious", - "Greedy", - "Haunted", - "Insightful", - "Kind", - "Melancholy", - "Moody", - "Obsessive", - "Paranoid", - "Patient", - "Popular", - "Principled", - "Proud", - "Quiet", - "Reckless", - "Respected", - "Ruthless", - "Sadistic", - "Savage", - "Secretive", - "Shrewd", - "Sincere", - "Sneaky", - "Sophisticated", - "Strange", - "Stylish", - "Subtle", - "Suspicious", - "Tough", - "Vain", - "Vengeful", - "Vicious", - "Visionary", - "Volatile", - "Weird", - "Wise" - ], - interests: [ - "Alchemy, medicine", - "Antiques, artifacts, curios", - "Arcane books, rituals", - "Architecture, furnishings", - "Church of Ecstasy", - "Cooking, gardening", - "Craft (leatherwork, etc.)", - "Demon lore, legends", - "Drugs, essences, tobacco", - "Essences, alchemy", - "Exploration, adventure", - "Fine arts, opera, theater", - "Fine clothes, jewelry, furs", - "Fine food, restaurants", - "Fine whiskey, wine, beer", - "Forgotten gods", - "Gadgets, new technology", - "Gambling, cards, dice", - "History, legends", - "Horses, riding", - "Hunting, shooting", - "Lovers, romance, trysts", - "Music, instruments, dance", - "Natural philosophy", - "Painting, drawing, sculpture", - "Parties, social events", - "Path of Echoes", - "Pets (birds, dogs, cats)", - "Pit-fighting, duels", - "Poetry, novels, writing", - "Politics, journalism", - "Pre-cataclysm legends", - "Ships, boating", - "Spectrology, electroplasm", - "Weapons collector", - "Weeping Lady, charity" - ], - quirk: [ - "A fraud. Some important aspect is fabricated.", - "Bigoted against culture / belief / social class.", - "Black sheep / outcast from family or organization.", - "Blind to flaws in friends, allies, family, etc.", - "Celebrity. Popularized in print / song / theater.", - "Concerned with appearances, gossip, peers.", - "Cursed, haunted, harassed by spirits or demon.", - "Deeply traditional. Opposed to new ideas.", - "Devoted to their family.", - "Drug / alcohol abuser. Often impaired by their vice.", - "Extensive education on every scholarly subject.", - "Has chronic illness that requires frequent care.", - "Holds their position due to blackmail.", - "Holds their position to spy for another faction.", - "In prison or under noble's house arrest.", - "Inherited their position. May not deserve / want it.", - "Intense, unreasonable phobia or loathing.", - "Involved with war crimes from the Unity War.", - "Is blindly faithful to an ideal, group, or tradition.", - "Keeps detailed journals, notes, records, ledgers.", - "Leads a double life using cover identity.", - "Married into important / powerful family.", - "Massive debts (to banks / criminals / family)", - "Once hollowed, then restored. Immune to spirits.", - "Proud of heritage, traditions, native language.", - "Reclusive. Prefers to interact via messengers.", - "Relies on council to make decisions.", - "Revolutionary. Plots against the Imperium.", - "Scandalous reputation (deserved or not).", - "Secretly (openly?) controlled by possessing spirit.", - "Serves a demon's agenda (knowingly or not).", - "Spotless reputation. Highly regarded.", - "Superstitious. Believes in signs, magic numbers.", - "Surrounded by sycophants, supplicants, toadies.", - "Visionary. Holds radical views for future.", - "Well-traveled. Connections outside Doskvol." - ], - style: { - male: [ - "Apron", - "Cane", - "Collared Shirt", - "Crutches", - "Eelskin Bodysuit", - "Face Mask", - "Fitted Leggings", - "Heavy Cloak", - "Heavy Gloves", - "Hide & Furs", - "Hood & Veil", - "Hooded Coat", - "Knit Cap", - "Leathers", - "Long Coat", - "Long Scarf", - "Loose Silks", - "Mask & Robes", - "Rough Tunic", - "Sharp Trousers", - "Short Cloak", - "Slim Jacket", - "Soft Boots", - "Suit & Vest", - "Suspenders", - "Tall Boots", - "Tatters", - "Thick Greatcoat", - "Tool Belt", - "Tricorn Hat", - "Uniform", - "Waxed Coat", - "Wheelchair", - "Wide Belt", - "Work Boots" - ], - female: [ - "Apron", - "Cane", - "Crutches", - "Eelskin Bodysuit", - "Face Mask", - "Fitted Dress", - "Fitted Leggings", - "Heavy Cloak", - "Heavy Gloves", - "Hide & Furs", - "Hood & Veil", - "Hooded Coat", - "Knit Cap", - "Leathers", - "Long Coat", - "Long Scarf", - "Loose Silks", - "Mask & Robes", - "Rough Tunic", - "Sharp Trousers", - "Short Cloak", - "Skirt & Blouse", - "Slim Jacket", - "Soft Boots", - "Suspenders", - "Tall Boots", - "Tatters", - "Thick Greatcoat", - "Tool Belt", - "Uniform", - "Waxed Coat", - "Wheelchair", - "Wide Belt", - "Work Boots" - ] - }, - name_title: [ - "Adept", - "Archivist", - "Captain", - "Charter", - "Scrivener" - ], - name_first: { - male: [ - "Abel", - "Abenthy", - "Adric", - "Airic", - "Alabaster", - "Alastair", - "Aldo", - "Alen", - "Aleph", - "Ambrose", - "Amosen", - "Andal", - "Andrel", - "Anton", - "Aquilla", - "Aradan", - "Aram", - "Archibald", - "Archie", - "Arden", - "Arliden", - "Arlyn", - "Armand", - "Arquo", - "Arrell", - "Arvus", - "Asher", - "Aurelio", - "Benedict", - "Bolster", - "Brace", - "Bran", - "Brance", - "Branon", - "Bricks", - "Brock", - "Brutus", - "Caius", - "Carro", - "Casian", - "Cato", - "Cavelle", - "Cedric", - "Chance", - "Chauncey", - "Cid", - "Clave", - "Cliff", - "Cornelius", - "Cross", - "Crowl", - "Cym", - "Cyrus", - "Declan", - "Del", - "Drav", - "Drazhan", - "Drem", - "Edlun", - "Edmund", - "Edrom", - "Edwin", - "Elan", - "Elend", - "Elias", - "Elodin", - "Ephrim", - "Erasmus", - "Eremon", - "Ethan", - "Everitt", - "Feldspar", - "Fero", - "Finn", - "Fisher", - "Galen", - "Gallahad", - "Garner", - "Gilbert", - "Glint", - "Gnik", - "Gregalos", - "Grey", - "Greyson", - "Grifter", - "Grine", - "Gristofer", - "Hadrian", - "Hagran", - "Hammond", - "Hix", - "Holtz", - "Hugo", - "Iden", - "Irton", - "Isaac", - "Ivellios", - "Jabari", - "Jericho", - "Jerod", - "Kazimir", - "Kellan", - "Kelvyn", - "Kelyr", - "Khafra", - "Kobb", - "Kristov", - "Kyrilu", - "Lael", - "Lafayette", - "Laudius", - "Lawrence", - "Leif", - "Lem", - "Lenny", - "Logan", - "Lucas", - "Lucius", - "Lysander", - "Milos", - "Mord", - "Morketh", - "Morlan", - "Myre", - "Narcus", - "Nehi", - "Noggs", - "Norton", - "Obel", - "Obelas", - "Octavius", - "Odelay", - "Orem", - "Orlan", - "Orth", - "Orton", - "Pavel", - "Perceval", - "Percival", - "Peregrine", - "Phin", - "Phineas", - "Porto", - "Preston", - "Primo", - "Quess", - "Quill", - "Rafe", - "Rasmus", - "Raul", - "Resh", - "Rias", - "Ring", - "Rivallo", - "Rodmund", - "Roethe", - "Roose", - "Roric", - "Sethla", - "Silas", - "Sindri", - "Snitch", - "Sol", - "Solomon", - "Sprig", - "Stavrul", - "Stellan", - "Stev", - "Sym", - "Tacitus", - "Tarn", - "Taylor", - "Thackeray", - "Thaddeus", - "Thane", - "Thelian", - "Theo", - "Theron", - "Thurston", - "Timoth", - "Tisk", - "Tocker", - "Tristero", - "Ulric", - "Vask", - "Veleris", - "Ventaro", - "Virgil", - "Vond", - "Wax", - "Wayne", - "Weaver", - "Wester", - "Winsley" - ], - female: [ - "Adaire", - "Adelaide", - "Adella", - "Adroit", - "Ailen", - "Aina", - "Akilah", - "Albinia", - "Althaea", - "Alyosha", - "Ansa", - "Arabella", - "Arwyl", - "Ashlyn", - "Avora", - "Brena", - "Brenna", - "Calienthe", - "Camilla", - "Candor", - "Candra", - "Carissa", - "Cascabel", - "Casslyn", - "Castille", - "Celeste", - "Chen", - "Claret", - "Clementine", - "Constance", - "Cordelia", - "Corille", - "Corsica", - "Cyrene", - "Dahlia", - "Daphnia", - "Delia", - "Dena", - "Denna", - "Desmona", - "Dolores", - "Drenna", - "Edie", - "Eira", - "Elsie", - "Emeline", - "Etta", - "Fela", - "Felicity", - "Galenica", - "Galina", - "Gitta", - "Gloria", - "Gwen", - "Hedy", - "Hella", - "Helles", - "Henrietta", - "Iduna", - "Iona", - "Isa", - "Isabella", - "Iskra", - "Isolde", - "Jasna", - "Jaxi", - "Joan", - "Juno", - "Kamelin", - "Kari", - "Koli", - "Lauria", - "Lenia", - "Leona", - "Leyva", - "Lieu", - "Lilith", - "Lin", - "Lizete", - "Lorette", - "Lucella", - "Lynthia", - "Lyra", - "Maia", - "Maiathah", - "Maie", - "Mara", - "Marasi", - "Marielda", - "Marisol", - "Marris", - "Mira", - "Naria", - "Nasha", - "Octavia", - "Odrienne", - "Olivia", - "Ora", - "Ordenna", - "Oressia", - "Orsella", - "Pardenna", - "Penelope", - "Penny", - "Phoebe", - "Polonia", - "Pravda", - "Prudence", - "Quelenna", - "Raisa", - "Redji", - "Remira", - "Rey", - "Riven", - "Runa", - "Sabina", - "Sabinia", - "Sabrina", - "Sadeh", - "Sahar", - "Selma", - "Sesereth", - "Severea", - "Silaqui", - "Skannon", - "Sprig", - "Stabitha", - "Syra", - "Tabitha", - "Talitha", - "Tamsyn", - "Tasi", - "Terra", - "Tesslyn", - "Thava", - "Thena", - "Tiff", - "Una", - "Vaurin", - "Veretta", - "Vesna", - "Vestine", - "Vey", - "Victoria", - "Vin", - "Vita", - "Volette", - "Vorka", - "Wander", - "Ylva", - "Zahra", - "Zaida", - "Zamira", - "Zarya" - ] - }, - name_surname: [ - "Abberwick", - "Adelbury", - "Adleton", - "Aloro", - "Alsa", - "Ankhayat", - "Arran", - "Ashton", - "Ashweather", - "Athanoch", - "Axelrod", - "Backworth", - "Barrow", - "Basran", - "Black", - "Blackford", - "Blackpool", - "Blackthorne", - "Bluff", - "Boden", - "Booker", - "Boulder", - "Bowman", - "Braeside", - "Bramble", - "Braum", - "Bray", - "Breakiron", - "Bristle", - "Brocken", - "Brogan", - "Bromley", - "Burnsides", - "Caebrek", - "Cartwright", - "Carver", - "Childermass", - "Claw", - "Clelland", - "Clemont", - "Clermont", - "Cobblecarver", - "Coleburn", - "Combe", - "Comber", - "Crofty", - "Cunningham", - "Daava", - "Dal", - "Dalmore", - "Danfield", - "Drawlight", - "Drigg", - "Dunvil", - "Elmore", - "Eveningeyes", - "Evensteps", - "Eventide", - "Everpenny", - "Fairplay", - "Farros", - "Fellwater", - "Fogg", - "Gatcombe", - "Glasseye", - "Goldsworth", - "Grave", - "Graythwaite", - "Greysteel", - "Grine", - "Haig", - "Half-Off", - "Havelton", - "Havenhorst", - "Hectares", - "Helker", - "Helles", - "Hellyers", - "Hemme", - "Hightower", - "Hightown", - "Highwater", - "Hill", - "Hitchcock", - "Innerwick", - "Jayan", - "Jeduin", - "Kardera", - "Karstas", - "Keel", - "Kempt", - "Kessarin", - "Kinclaith", - "King", - "Lake", - "Larriston", - "Leake", - "Lomond", - "Longstaff", - "Lorewood", - "Maroden", - "Mayson", - "Merriweather", - "Michter", - "Mindwell", - "Morcombe", - "Morriston", - "Mortimer", - "Netherton", - "Night", - "Nighteyre", - "Nightly", - "Noctoft", - "Notherhome", - "Orchard", - "Orchid", - "Path", - "Peak", - "Pegg", - "Penderyn", - "Pond", - "Pool", - "Prichard", - "Raines", - "Ravenglass", - "Ravenwood", - "Reigns", - "Reyes", - "Reynes", - "Rhodes", - "Riverford", - "Robel", - "Rowan", - "Sable", - "Sage", - "Salkara", - "Salos", - "Sevoy", - "Shilbottle", - "Shillmoor", - "Shook", - "Skelkallan", - "Skora", - "Slane", - "Song", - "Steadystep", - "Stoutale", - "Stovestoker", - "Strange", - "Strangford", - "Strathmill", - "Sunder", - "Sunderland", - "Swiftwhistle", - "Tailor", - "Tallfellow", - "Templeton", - "Tenpenny", - "Tevilton", - "Thistle", - "Thrysus", - "Thurston", - "Tinmouth", - "Tower", - "Tristé", - "Tyrconnell", - "Vale", - "Valentine", - "Veldaire", - "Venture", - "Walund", - "Warren", - "Waters", - "Wecker", - "Welker", - "Wend", - "Wharver", - "Whythe", - "Woodall" - ], - name_alias: [ - "Bell", - "Birch", - "Bird", - "Bliss", - "Bricks", - "Bug", - "Chime", - "Coil", - "Cricket", - "Cross", - "Crow", - "Echo", - "Flint", - "Frog", - "Frost", - "Goods", - "Grip", - "Gunner", - "Hammer", - "Hook", - "Ink", - "Junker", - "Mist", - "Moon", - "Nail", - "Needle", - "Ogre", - "Pool", - "Ring", - "Ruby", - "Silver", - "Skinner", - "Song", - "Spur", - "Tackle", - "Thistle", - "Thorn", - "Tick", - "Tick-Tock", - "Tock", - "Trick", - "Twelves", - "Vixen", - "Whip", - "Wicker" - ], - name_suffix: [ - "Jr.", - "Sr.", - "III", - "IV" - ] - }, - GM: { - Bargains: [ - { name: "Infected Wound", category: "Character Effect", effect: "The next time you Recover from Harm, your Physicker is at -1d." }, - { name: "Infected Wound", category: "Character Effect", effect: "The next time you Recover from Harm, your Physicker is at -1d." }, - { name: "Infected Wound", category: "Character Effect", effect: "The next time you Recover from Harm, your Physicker is at -1d." }, - { name: "It's Mine Now", category: "Character Effect", effect: "You discover a small item that belongs to a rival. What is it? Who used to own it? How does this change things for you?" }, - { name: "It's Mine Now", category: "Character Effect", effect: "You discover a small item that belongs to a rival. What is it? Who used to own it? How does this change things for you?" }, - { name: "It's Mine Now", category: "Character Effect", effect: "You discover a small item that belongs to a rival. What is it? Who used to own it? How does this change things for you?" }, - { name: "Mine By Blood", category: "Character Effect", effect: "You discover evidence of the death of a family member during the Score. Who is it? How did they die? How does this change things for your character?" }, - { name: "Mine By Blood", category: "Character Effect", effect: "You discover evidence of the death of a family member during the Score. Who is it? How did they die? How does this change things for your character?" }, - { name: "Mine By Blood", category: "Character Effect", effect: "You discover evidence of the death of a family member during the Score. Who is it? How did they die? How does this change things for your character?" }, - { name: "Mine By Name", category: "Character Effect", effect: "You discover an envelope addressed to you during the Score. What is in it? Who left it here for you to find? How does this change things for your character?" }, - { name: "Mine By Name", category: "Character Effect", effect: "You discover an envelope addressed to you during the Score. What is in it? Who left it here for you to find? How does this change things for your character?" }, - { name: "Mine By Name", category: "Character Effect", effect: "You discover an envelope addressed to you during the Score. What is in it? Who left it here for you to find? How does this change things for your character?" }, - { name: "Mine By Rights", category: "Character Effect", effect: "You discover a small item from your past during the Score. What is it? What does it mean that it's here? Does this change things for your character?" }, - { name: "Mine By Rights", category: "Character Effect", effect: "You discover a small item from your past during the Score. What is it? What does it mean that it's here? Does this change things for your character?" }, - { name: "Mine By Rights", category: "Character Effect", effect: "You discover a small item from your past during the Score. What is it? What does it mean that it's here? Does this change things for your character?" }, - { name: "Not Paying Attention", category: "Character Effect", effect: "Uncheck one of the XP triggers already marked for your character for this Score." }, - { name: "Not Paying Attention", category: "Character Effect", effect: "Uncheck one of the XP triggers already marked for your character for this Score." }, - { name: "Shadow From the Past", category: "Character Effect", effect: "Your intel missed that someone from your past is associated with the target of the Score. Who is it, and how does that change things for you?" }, - { name: "Shadow From the Past", category: "Character Effect", effect: "Your intel missed that someone from your past is associated with the target of the Score. Who is it, and how does that change things for you?" }, - { name: "Shadow From the Past", category: "Character Effect", effect: "Your intel missed that someone from your past is associated with the target of the Score. Who is it, and how does that change things for you?" }, - { name: "Thicker than Blood", category: "Character Effect", effect: "Your intel missed that one of your family members is associated with the target of the Score. How does that change things for you?" }, - { name: "Thicker than Blood", category: "Character Effect", effect: "Your intel missed that one of your family members is associated with the target of the Score. How does that change things for you?" }, - { name: "Thicker than Blood", category: "Character Effect", effect: "Your intel missed that one of your family members is associated with the target of the Score. How does that change things for you?" }, - { name: "Why'd It Have To Be...", category: "Character Effect", effect: "The room you're in triggers a phobia that the Crew didn't know about before. Describe the phobia and take 2 Stress." }, - { name: "Why'd It Have To Be...", category: "Character Effect", effect: "The room you're in triggers a phobia that the Crew didn't know about before. Describe the phobia and take 2 Stress." }, - { name: "Why'd It Have To Be...", category: "Character Effect", effect: "The room you're in triggers a phobia that the Crew didn't know about before. Describe the phobia and take 2 Stress." }, - { name: "Demonic Guest", category: "Crew Effect", effect: "A demonic presence has appeared in your Lair and will need to be dealt with during Free Play." }, - { name: "Demonic Guest", category: "Crew Effect", effect: "A demonic presence has appeared in your Lair and will need to be dealt with during Free Play." }, - { name: "Fracturing Faction", category: "Crew Effect", effect: "If your Hold is Strong, reduce it to Weak. If your Hold is Weak, reduce your Rep to zero." }, - { name: "Lesson Not Learned", category: "Crew Effect", effect: "Uncheck one of the XP triggers already marked for your crew for this Score." }, - { name: "Lesson Not Learned", category: "Crew Effect", effect: "Uncheck one of the XP triggers already marked for your crew for this Score." }, - { name: "Otherworldly Guest", category: "Crew Effect", effect: "A scion of one of the Old Gods has appeared in your Lair and will need to be dealt with during Free Play." }, - { name: "Otherworldly Guest", category: "Crew Effect", effect: "A scion of one of the Old Gods has appeared in your Lair and will need to be dealt with during Free Play." }, - { name: "Rebellious Faction", category: "Crew Effect", effect: "A new crew has taken possession of one of your Claims, and will have to be dealt with in Free Play." }, - { name: "Spectral Guest", category: "Crew Effect", effect: "A ghostly presence has appeared in your Lair and will need to be dealt with during Free Play." }, - { name: "Spectral Guest", category: "Crew Effect", effect: "A ghostly presence has appeared in your Lair and will need to be dealt with during Free Play." }, - { name: "Turncoat", category: "Crew Effect", effect: "One of your Cohorts leaves your crew and joins a rival." }, - { name: "Double-Crossed", category: "Downtime Effect", effect: "After the normal Entanglement roll and result, your Crew takes an additional Flipped result." }, - { name: "Double-Crossed", category: "Downtime Effect", effect: "After the normal Entanglement roll and result, your Crew takes an additional Flipped result." }, - { name: "Double-Crossed", category: "Downtime Effect", effect: "After the normal Entanglement roll and result, your Crew takes an additional Flipped result." }, - { name: "Easily Identified", category: "Downtime Effect", effect: "You left something behind that is easily traced to you. Choose either +2 Heat and −2 Rep, or +1 Heat and −1 Rep." }, - { name: "Easily Identified", category: "Downtime Effect", effect: "You left something behind that is easily traced to you. Choose either +2 Heat and −2 Rep, or +1 Heat and −1 Rep." }, - { name: "Easily Identified", category: "Downtime Effect", effect: "You left something behind that is easily traced to you. Choose either +2 Heat and −2 Rep, or +1 Heat and −1 Rep." }, - { name: "High Profile", category: "Downtime Effect", effect: "This Score gains +2 Heat." }, - { name: "High Profile", category: "Downtime Effect", effect: "This Score gains +2 Heat." }, - { name: "High Profile", category: "Downtime Effect", effect: "This Score gains +2 Heat." }, - { name: "Most Wanted", category: "Downtime Effect", effect: "After the normal Entanglement roll and result, you are the target of an additional Arrest result." }, - { name: "Most Wanted", category: "Downtime Effect", effect: "After the normal Entanglement roll and result, you are the target of an additional Arrest result." }, - { name: "Project Setback", category: "Downtime Effect", effect: "Mark one less Clock segment the first time you work on a Long-Term Project." }, - { name: "Project Setback", category: "Downtime Effect", effect: "Mark one less Clock segment the first time you work on a Long-Term Project." }, - { name: "Project Setback", category: "Downtime Effect", effect: "Mark one less Clock segment the first time you work on a Long-Term Project." }, - { name: "Quelle Horreur!", category: "Downtime Effect", effect: "You suffer nightmares for a week. −1d to all Downtime Actions after this Score." }, - { name: "Quelle Horreur!", category: "Downtime Effect", effect: "You suffer nightmares for a week. −1d to all Downtime Actions after this Score." }, - { name: "Shortchanged", category: "Downtime Effect", effect: "This Score's payoff is −2 Coin." }, - { name: "Shortchanged", category: "Downtime Effect", effect: "This Score's payoff is −2 Coin." }, - { name: "Shortchanged", category: "Downtime Effect", effect: "This Score's payoff is −2 Coin." }, - { name: "Supply Challenges", category: "Downtime Effect", effect: "The next time you pay Coin for an Acquire Asset roll, you must pay 3 instead of 2 Coin per Tier." }, - { name: "Supply Challenges", category: "Downtime Effect", effect: "The next time you pay Coin for an Acquire Asset roll, you must pay 3 instead of 2 Coin per Tier." }, - { name: "Supply Delays", category: "Downtime Effect", effect: "Suffer -1d to your next Acquire Asset roll." }, - { name: "Supply Delays", category: "Downtime Effect", effect: "Suffer -1d to your next Acquire Asset roll." }, - { name: "Supply Delays", category: "Downtime Effect", effect: "Suffer -1d to your next Acquire Asset roll." }, - { name: "Tastes Like Ashes", category: "Downtime Effect", effect: "The next time you indulge your Vice, only clear half as much Stress (rounded down) as normal." }, - { name: "Tastes Like Ashes", category: "Downtime Effect", effect: "The next time you indulge your Vice, only clear half as much Stress (rounded down) as normal." }, - { name: "Thrice-Named", category: "Downtime Effect", effect: "After the normal Entanglement roll and result, your Crew takes an additional Demonic Notice result." }, - { name: "Thrice-Named", category: "Downtime Effect", effect: "After the normal Entanglement roll and result, your Crew takes an additional Demonic Notice result." }, - { name: "Thrice-Named", category: "Downtime Effect", effect: "After the normal Entanglement roll and result, your Crew takes an additional Demonic Notice result." }, - { name: "Warden's Attention", category: "Downtime Effect", effect: "+4 Heat (instead of the normal +2 Heat) if there is a death during this Score." }, - { name: "Warden's Attention", category: "Downtime Effect", effect: "+4 Heat (instead of the normal +2 Heat) if there is a death during this Score." }, - { name: "We Want a Bigger Take!", category: "Downtime Effect", effect: "The gang wants a bigger piece of the action. −2 Coin to Payoff for each Cohort used in this Score." }, - { name: "We Want a Bigger Take!", category: "Downtime Effect", effect: "The gang wants a bigger piece of the action. −2 Coin to Payoff for each Cohort used in this Score." }, - { name: "Weekend Getaway", category: "Downtime Effect", effect: "If you indulge your Vice after this Score, you automatically overindulge." }, - { name: "Weekend Getaway", category: "Downtime Effect", effect: "If you indulge your Vice after this Score, you automatically overindulge." }, - { name: "Weekend Getaway", category: "Downtime Effect", effect: "If you indulge your Vice after this Score, you automatically overindulge." }, - { name: "What's Our Take?", category: "Downtime Effect", effect: "The gang wants a bigger piece of the action. −1 Coin to Payoff for each Cohort used in this Score." }, - { name: "What's Our Take?", category: "Downtime Effect", effect: "The gang wants a bigger piece of the action. −1 Coin to Payoff for each Cohort used in this Score." }, - { name: "What's Our Take?", category: "Downtime Effect", effect: "The gang wants a bigger piece of the action. −1 Coin to Payoff for each Cohort used in this Score." }, - { name: "Accelerating Plans", category: "Faction Relationship Effect", effect: "A rival faction advances one of its Clocks by two before your next Score." }, - { name: "Accelerating Plans", category: "Faction Relationship Effect", effect: "A rival faction advances one of its Clocks by two before your next Score." }, - { name: "Accelerating Plans", category: "Faction Relationship Effect", effect: "A rival faction advances one of its Clocks by two before your next Score." }, - { name: "Escalating Tensions", category: "Faction Relationship Effect", effect: "A faction of your choice that is unfriendly to your crew moves one step towards War." }, - { name: "Escalating Tensions", category: "Faction Relationship Effect", effect: "A faction of your choice that is unfriendly to your crew moves one step towards War." }, - { name: "Forgiveness or Vengeance?", category: "Faction Relationship Effect", effect: "During the Score, one of your Cohorts got in a fight with an neutral Cohort. Choose −2 Rep and +1 faction relationship, or +2 Rep and −1 faction relationship." }, - { name: "Forgiveness or Vengeance?", category: "Faction Relationship Effect", effect: "During the Score, one of your Cohorts got in a fight with an neutral Cohort. Choose −2 Rep and +1 faction relationship, or +2 Rep and −1 faction relationship." }, - { name: "Forgiveness or Vengeance?", category: "Faction Relationship Effect", effect: "During the Score, one of your Cohorts got in a fight with an neutral Cohort. Choose −2 Rep and +1 faction relationship, or +2 Rep and −1 faction relationship." }, - { name: "Hot-Headed Cohort", category: "Faction Relationship Effect", effect: "During the Score, one of your Cohorts picked a fight with an allied Cohort. Pay 2 Coin, lose 2 Rep, or −1 faction relationship." }, - { name: "Hot-Headed Cohort", category: "Faction Relationship Effect", effect: "During the Score, one of your Cohorts picked a fight with an allied Cohort. Pay 2 Coin, lose 2 Rep, or −1 faction relationship." }, - { name: "Hot-Headed Cohort", category: "Faction Relationship Effect", effect: "During the Score, one of your Cohorts picked a fight with an allied Cohort. Pay 2 Coin, lose 2 Rep, or −1 faction relationship." }, - { name: "Mixed Messages", category: "Faction Relationship Effect", effect: "A faction of your choice that is friendly to your crew moves one step towards Neutral." }, - { name: "Mixed Messages", category: "Faction Relationship Effect", effect: "A faction of your choice that is friendly to your crew moves one step towards Neutral." }, - { name: "Mutual Defense", category: "Faction Relationship Effect", effect: "A friendly Faction goes to War with a neutral Faction. Either join their War, or they move to −1 on the relationship chart." }, - { name: "Mutual Defense", category: "Faction Relationship Effect", effect: "A friendly Faction goes to War with a neutral Faction. Either join their War, or they move to −1 on the relationship chart." }, - { name: "Tensions Spread", category: "Faction Relationship Effect", effect: "One Neutral Faction moves a step towards War, and another Neutral Faction moves a step towards Ally." }, - { name: "Tensions Spread", category: "Faction Relationship Effect", effect: "One Neutral Faction moves a step towards War, and another Neutral Faction moves a step towards Ally." }, - { name: "Tensions Spread", category: "Faction Relationship Effect", effect: "One Neutral Faction moves a step towards War, and another Neutral Faction moves a step towards Ally." }, - { name: "The Walls Have Ears", category: "Faction Relationship Effect", effect: "A friendly faction hears you did a Score against their ally. −1 to that faction's relationship rating." }, - { name: "The Walls Have Ears", category: "Faction Relationship Effect", effect: "A friendly faction hears you did a Score against their ally. −1 to that faction's relationship rating." }, - { name: "The Walls Have Ears", category: "Faction Relationship Effect", effect: "A friendly faction hears you did a Score against their ally. −1 to that faction's relationship rating." }, - { name: "The Walls Have Eyes", category: "Faction Relationship Effect", effect: "A friendly faction hears you did a Score against their ally. −1 to both factions' relationship ratings." }, - { name: "The Walls Have Eyes", category: "Faction Relationship Effect", effect: "A friendly faction hears you did a Score against their ally. −1 to both factions' relationship ratings." }, - { name: "...and Into the Fire", category: "Immediate Effect", effect: "You are ambushed by an assassin or bounty hunter. Start a 4-Clock, 'Elite Ambusher' to overcome this new foe." }, - { name: "...and Into the Fire", category: "Immediate Effect", effect: "You are ambushed by an assassin or bounty hunter. Start a 4-Clock, 'Elite Ambusher' to overcome this new foe." }, - { name: "A Familiar Face", category: "Immediate Effect", effect: "You recognize a contact of your choice among the rivals you are running the Score against." }, - { name: "A Familiar Face", category: "Immediate Effect", effect: "You recognize a contact of your choice among the rivals you are running the Score against." }, - { name: "A Familiar Face", category: "Immediate Effect", effect: "You recognize a contact of your choice among the rivals you are running the Score against." }, - { name: "Accidental Discharge", category: "Immediate Effect", effect: "A weapon or item you are carrying loudly discharges and needs to be reloaded before it can be used." }, - { name: "Accidental Discharge", category: "Immediate Effect", effect: "A weapon or item you are carrying loudly discharges and needs to be reloaded before it can be used." }, - { name: "Accidental Discharge", category: "Immediate Effect", effect: "A weapon or item you are carrying loudly discharges and needs to be reloaded before it can be used." }, - { name: "All or Nothing", category: "Immediate Effect", effect: "If you fail this roll, you cannot resist the effects of that failure." }, - { name: "All or Nothing", category: "Immediate Effect", effect: "If you fail this roll, you cannot resist the effects of that failure." }, - { name: "All or Nothing", category: "Immediate Effect", effect: "If you fail this roll, you cannot resist the effects of that failure." }, - { name: "Bishop's Gambit", category: "Immediate Effect", effect: "If you are not in combat, gain +2d for this roll instead of the standard +1d; but you can roll no more than 1d for your next Action." }, - { name: "Bishop's Gambit", category: "Immediate Effect", effect: "If you are not in combat, gain +2d for this roll instead of the standard +1d; but you can roll no more than 1d for your next Action." }, - { name: "Bishop's Gambit", category: "Immediate Effect", effect: "If you are not in combat, gain +2d for this roll instead of the standard +1d; but you can roll no more than 1d for your next Action." }, - { name: "Brute Force Method", category: "Immediate Effect", effect: "You noisily break a weapon of your choice while attempting this Action, even if it is not a combat Action." }, - { name: "Brute Force Method", category: "Immediate Effect", effect: "You noisily break a weapon of your choice while attempting this Action, even if it is not a combat Action." }, - { name: "Brute Force Method", category: "Immediate Effect", effect: "You noisily break a weapon of your choice while attempting this Action, even if it is not a combat Action." }, - { name: "Clear the Board", category: "Immediate Effect", effect: "If you succeed at this roll, clear or fill a Score Clock of your choice. If you fail the roll, you Trauma out of the scene." }, - { name: "Clear the Board", category: "Immediate Effect", effect: "If you succeed at this roll, clear or fill a Score Clock of your choice. If you fail the roll, you Trauma out of the scene." }, - { name: "Devil's Exchange", category: "Immediate Effect", effect: "You gain the normal +1d to this roll, but suffer −1d to your next Action, and cannot take a Devil's Bargain to offset it." }, - { name: "Devil's Exchange", category: "Immediate Effect", effect: "You gain the normal +1d to this roll, but suffer −1d to your next Action, and cannot take a Devil's Bargain to offset it." }, - { name: "Devil's Exchange", category: "Immediate Effect", effect: "You gain the normal +1d to this roll, but suffer −1d to your next Action, and cannot take a Devil's Bargain to offset it." }, - { name: "Ghostly Attention", category: "Immediate Effect", effect: "Whether you succeed in this roll or not, a ghost in the area notices you and begins stalking you." }, - { name: "Ghostly Attention", category: "Immediate Effect", effect: "Whether you succeed in this roll or not, a ghost in the area notices you and begins stalking you." }, - { name: "Ghostly Attention", category: "Immediate Effect", effect: "Whether you succeed in this roll or not, a ghost in the area notices you and begins stalking you." }, - { name: "Gimcrack Gear", category: "Immediate Effect", effect: "Whatever weapon or tool you are using is cheaply made and breaks whether the roll succeeds or not." }, - { name: "Gimcrack Gear", category: "Immediate Effect", effect: "Whatever weapon or tool you are using is cheaply made and breaks whether the roll succeeds or not." }, - { name: "Gimcrack Gear", category: "Immediate Effect", effect: "Whatever weapon or tool you are using is cheaply made and breaks whether the roll succeeds or not." }, - { name: "Gone Rogue", category: "Immediate Effect", effect: "You cannot accept an Assist for the rest of this Score." }, - { name: "Gone Rogue", category: "Immediate Effect", effect: "You cannot accept an Assist for the rest of this Score." }, - { name: "Hunter Becomes Hunted", category: "Immediate Effect", effect: "You've been so preoccupied with the obstacles in front of you that you didn't notice the rival lining up a shot behind you." }, - { name: "Hunter Becomes Hunted", category: "Immediate Effect", effect: "You've been so preoccupied with the obstacles in front of you that you didn't notice the rival lining up a shot behind you." }, - { name: "Hunter Becomes Hunted", category: "Immediate Effect", effect: "You've been so preoccupied with the obstacles in front of you that you didn't notice the rival lining up a shot behind you." }, - { name: "I Know I Packed It!", category: "Immediate Effect", effect: "You must immediately check off 1 Load to no effect, representing equipment you've misplaced." }, - { name: "I Know I Packed It!", category: "Immediate Effect", effect: "You must immediately check off 1 Load to no effect, representing equipment you've misplaced." }, - { name: "I Know I Packed It!", category: "Immediate Effect", effect: "You must immediately check off 1 Load to no effect, representing equipment you've misplaced." }, - { name: "I Know I Packed Them!", category: "Immediate Effect", effect: "You must immediately check off 2 Load to no effect, representing equipment you've misplaced." }, - { name: "I Know I Packed Them!", category: "Immediate Effect", effect: "You must immediately check off 2 Load to no effect, representing equipment you've misplaced." }, - { name: "I Know I Packed Them!", category: "Immediate Effect", effect: "You must immediately check off 2 Load to no effect, representing equipment you've misplaced." }, - { name: "Jangled Nerves", category: "Immediate Effect", effect: "For the rest of the Score, all rolls to Resist generate +1 Stress." }, - { name: "Jangled Nerves", category: "Immediate Effect", effect: "For the rest of the Score, all rolls to Resist generate +1 Stress." }, - { name: "Jangled Nerves", category: "Immediate Effect", effect: "For the rest of the Score, all rolls to Resist generate +1 Stress." }, - { name: "Just a Little Spark", category: "Immediate Effect", effect: "A lamp or candle gets knocked over, catching a curtain or rug on fire. Start a Clock: 'Building is on Fire'." }, - { name: "Just a Little Spark", category: "Immediate Effect", effect: "A lamp or candle gets knocked over, catching a curtain or rug on fire. Start a Clock: 'Building is on Fire'." }, - { name: "Just a Little Spark", category: "Immediate Effect", effect: "A lamp or candle gets knocked over, catching a curtain or rug on fire. Start a Clock: 'Building is on Fire'." }, - { name: "King's Gambit", category: "Immediate Effect", effect: "If you fail at this roll, you are immune to any Harm; but you have a zero rating to your next Action." }, - { name: "King's Gambit", category: "Immediate Effect", effect: "If you fail at this roll, you are immune to any Harm; but you have a zero rating to your next Action." }, - { name: "King's Gambit", category: "Immediate Effect", effect: "If you fail at this roll, you are immune to any Harm; but you have a zero rating to your next Action." }, - { name: "Knight's Gambit", category: "Immediate Effect", effect: "If you are in combat, gain +2d for this roll instead of the standard +1d; but you can roll no more than 1d for your next Action." }, - { name: "Knight's Gambit", category: "Immediate Effect", effect: "If you are in combat, gain +2d for this roll instead of the standard +1d; but you can roll no more than 1d for your next Action." }, - { name: "Knight's Gambit", category: "Immediate Effect", effect: "If you are in combat, gain +2d for this roll instead of the standard +1d; but you can roll no more than 1d for your next Action." }, - { name: "Knuckle Buster", category: "Immediate Effect", effect: "Whether this Action succeeds or not, you accidentally inflict level 1 Harm on your hand, 'Busted Knuckles.'" }, - { name: "Knuckle Buster", category: "Immediate Effect", effect: "Whether this Action succeeds or not, you accidentally inflict level 1 Harm on your hand, 'Busted Knuckles.'" }, - { name: "Knuckle Buster", category: "Immediate Effect", effect: "Whether this Action succeeds or not, you accidentally inflict level 1 Harm on your hand, 'Busted Knuckles.'" }, - { name: "Now or Never", category: "Immediate Effect", effect: "If you fail this roll, you lose this opportunity and cannot retry it for this Score." }, - { name: "Now or Never", category: "Immediate Effect", effect: "If you fail this roll, you lose this opportunity and cannot retry it for this Score." }, - { name: "Now or Never", category: "Immediate Effect", effect: "If you fail this roll, you lose this opportunity and cannot retry it for this Score." }, - { name: "Out of the Frying Pan...", category: "Immediate Effect", effect: "Things are about to go from bad to worse. Start a 4-Clock, 'Surprise Reinforcements'." }, - { name: "Out of the Frying Pan...", category: "Immediate Effect", effect: "Things are about to go from bad to worse. Start a 4-Clock, 'Surprise Reinforcements'." }, - { name: "Out of the Frying Pan...", category: "Immediate Effect", effect: "Things are about to go from bad to worse. Start a 4-Clock, 'Surprise Reinforcements'." }, - { name: "Overextended", category: "Immediate Effect", effect: "Your next Action automatically has reduced Effect." }, - { name: "Overextended", category: "Immediate Effect", effect: "Your next Action automatically has reduced Effect." }, - { name: "Overextended", category: "Immediate Effect", effect: "Your next Action automatically has reduced Effect." }, - { name: "Pawn's Gambit", category: "Immediate Effect", effect: "You cannot use Load for Armor during this Score. You cannot accept this bargain if you already have used Load for Armor." }, - { name: "Pawn's Gambit", category: "Immediate Effect", effect: "You cannot use Load for Armor during this Score. You cannot accept this bargain if you already have used Load for Armor." }, - { name: "Pawn's Gambit", category: "Immediate Effect", effect: "You cannot use Load for Armor during this Score. You cannot accept this bargain if you already have used Load for Armor." }, - { name: "Plan C...", category: "Immediate Effect", effect: "Things are not going according to plan. Flashbacks cost +1 Stress for the rest of the Score." }, - { name: "Plan C...", category: "Immediate Effect", effect: "Things are not going according to plan. Flashbacks cost +1 Stress for the rest of the Score." }, - { name: "Queen's Gambit", category: "Immediate Effect", effect: "You automatically succeed at this Action as if you rolled a 6; but you have a zero rating to your next Action." }, - { name: "Queen's Gambit", category: "Immediate Effect", effect: "You automatically succeed at this Action as if you rolled a 6; but you have a zero rating to your next Action." }, - { name: "Queen's Gambit", category: "Immediate Effect", effect: "You automatically succeed at this Action as if you rolled a 6; but you have a zero rating to your next Action." }, - { name: "Quicksilver Poisoning", category: "Immediate Effect", effect: "Used in electroplasmic containers and devices, you get a noseful of quicksilver vapor, suffering level 1 Harm, 'Silverlung' which starts a 4-Clock Project to heal." }, - { name: "Quicksilver Poisoning", category: "Immediate Effect", effect: "Used in electroplasmic containers and devices, you get a noseful of quicksilver vapor, suffering level 1 Harm, 'Silverlung' which starts a 4-Clock Project to heal." }, - { name: "Quicksilver Poisoning", category: "Immediate Effect", effect: "Used in electroplasmic containers and devices, you get a noseful of quicksilver vapor, suffering level 1 Harm, 'Silverlung' which starts a 4-Clock Project to heal." }, - { name: "Rook's Gambit", category: "Immediate Effect", effect: "You cannot use Load for Unusual or Scary Weapons this Score. You cannot accept this bargain if you already have used Load for these." }, - { name: "Rook's Gambit", category: "Immediate Effect", effect: "You cannot use Load for Unusual or Scary Weapons this Score. You cannot accept this bargain if you already have used Load for these." }, - { name: "Rook's Gambit", category: "Immediate Effect", effect: "You cannot use Load for Unusual or Scary Weapons this Score. You cannot accept this bargain if you already have used Load for these." }, - { name: "Shot Nerves", category: "Immediate Effect", effect: "For the rest of the Score, all rolls to Resist generate +2 Stress." }, - { name: "Shot Nerves", category: "Immediate Effect", effect: "For the rest of the Score, all rolls to Resist generate +2 Stress." }, - { name: "Turned Around", category: "Immediate Effect", effect: "You lose track of your position. Start a 4-Clock, 'Where Am I?' You must use Actions looking for your Crew to rejoin them." }, - { name: "Turned Around", category: "Immediate Effect", effect: "You lose track of your position. Start a 4-Clock, 'Where Am I?' You must use Actions looking for your Crew to rejoin them." }, - { name: "Turned Around", category: "Immediate Effect", effect: "You lose track of your position. Start a 4-Clock, 'Where Am I?' You must use Actions looking for your Crew to rejoin them." }, - { name: "Unsure Footing", category: "Immediate Effect", effect: "Whether you succeed in this roll or not, you loose your footing and fall prone after this Action." }, - { name: "Unsure Footing", category: "Immediate Effect", effect: "Whether you succeed in this roll or not, you loose your footing and fall prone after this Action." }, - { name: "Unsure Footing", category: "Immediate Effect", effect: "Whether you succeed in this roll or not, you loose your footing and fall prone after this Action." }, - { name: "Worse than We thought", category: "Immediate Effect", effect: "A Clock of your choice that is running for this Score is either advanced or set back by two segments (whichever is worse for the Crew)." }, - { name: "Worse than We thought", category: "Immediate Effect", effect: "A Clock of your choice that is running for this Score is either advanced or set back by two segments (whichever is worse for the Crew)." }, - { name: "You're All On Your Own", category: "Immediate Effect", effect: "After this roll, you cannot offer to Assist on anyone else's roll for the rest of the Score." }, - { name: "You're All On Your Own", category: "Immediate Effect", effect: "After this roll, you cannot offer to Assist on anyone else's roll for the rest of the Score." }, - { name: "You're All On Your Own", category: "Immediate Effect", effect: "After this roll, you cannot offer to Assist on anyone else's roll for the rest of the Score." }, - { name: "Death Will Not Stop Me", category: "Long-Term Effect", effect: "The ghost of someone you killed is driven to take you with it. Start a 12-Clock, 'Spectral Vengence'" }, - { name: "That's Enough of That", category: "Long-Term Effect", effect: "Someone whose goals are affected by this Score is going to focus on you now. Start a 8-Clock, 'Cold Vengence'" }, - { name: "That's Enough of That", category: "Long-Term Effect", effect: "Someone whose goals are affected by this Score is going to focus on you now. Start a 8-Clock, 'Cold Vengence'" }, - { name: "The Last Straw", category: "Long-Term Effect", effect: "You've royally pissed off someone with real clout in the city. Start a 12-Clock, 'Furious Vengence'" }, - { name: "You'll Pay For This", category: "Long-Term Effect", effect: "Someone hurt by this Score will come back to collect what's owed. Start a 6-Clock, 'Petty Vengence'" }, - { name: "You'll Pay For This", category: "Long-Term Effect", effect: "Someone hurt by this Score will come back to collect what's owed. Start a 6-Clock, 'Petty Vengence'" }, - { name: "You'll Pay For This", category: "Long-Term Effect", effect: "Someone hurt by this Score will come back to collect what's owed. Start a 6-Clock, 'Petty Vengence'" }, - { name: "Dalgomur, the Heart of the Storm", category: "Mandatory Effect", effect: "If one is not already active for the crew, start a 12-Clock labeled 'The Heart of the Storm' and set it to one. If the Clock is already active, advance it by one." }, - { name: "Dalgomur, the Heart of the Storm", category: "Mandatory Effect", effect: "If one is not already active for the crew, start a 12-Clock labeled 'The Heart of the Storm' and set it to one. If the Clock is already active, advance it by one." }, - { name: "Ulf Ironborn, the Skovlan Agitator", category: "Mandatory Effect", effect: "If one is not already active for the crew, start a 4-Clock labeled 'Skovlander Uprising' and set it to one. If the Clock is already active, advance it by one." }, - { name: "Ulf Ironborn, the Skovlan Agitator", category: "Mandatory Effect", effect: "If one is not already active for the crew, start a 4-Clock labeled 'Skovlander Uprising' and set it to one. If the Clock is already active, advance it by one." }, - { name: "Urumbar, the Closed Eye", category: "Mandatory Effect", effect: "If one is not already active for the crew, start an 8-Clock labeled 'The Closed Eye' and set it to one. If the Clock is already active, advance it by one." }, - { name: "Urumbar, the Closed Eye", category: "Mandatory Effect", effect: "If one is not already active for the crew, start an 8-Clock labeled 'The Closed Eye' and set it to one. If the Clock is already active, advance it by one." }, - { name: "Vaskani, the Crossroads Demon", category: "Mandatory Effect", effect: "If one is not already active for the crew, start a 6-Clock labeled 'The Crossroads Demon' and set it to one. If the Clock is already active, advance it by one." }, - { name: "Vaskani, the Crossroads Demon", category: "Mandatory Effect", effect: "If one is not already active for the crew, start a 6-Clock labeled 'The Crossroads Demon' and set it to one. If the Clock is already active, advance it by one." } - ], - Obstacles: [ - { - name: "Centipedes", - category: "Animal Guards", - desc: "Centipedes the length of a forearm are almost noiseless. If they bite, their toxin causes living flesh to blacken and die, leading to amputation if the poison isn't countered. People tend to scream when bit.", - questions: [ - "Were the centipedes brought in as guardians, or are they a local nuisance?", - "There are many different breeds, how will you describe the appearance of yours?", - "Do they have a nasty local nickname?" - ], - modsHarder: [ - "When one attacks it releases a scent that enrages others nearby, so they tend to swarm.", - "They are excellent swimmers, and they hunt in bog-like areas under the surface." - ], - modsEasier: [ - "They are bright yellow and red, and hiss before striking, giving all the warning possible.", - "All the guardians and neighbors carry the antidote, the local apothecary knows what you need." - ] - }, - { - name: "Great Cats", - category: "Animal Guards", - desc: "One or more great cats slink through the shadows. They like to attack from high places. Their fur mottles to match the colors and tones and textures around them.", - questions: [ - "Did the current owners bring them in, or are they inherited from a previous owner?", - "Do they stay on the estate, or go hunting in the local neighborhood?" - ], - modsHarder: [ - "The cats are trained to alert guards (or wear charm jewelry to alert supernatural guardians) when they detect intruders with their keen senses.", - "Massive old trees draped with moss, or many ledges and overlooks, provide the cats cover." - ], - modsEasier: [ - "There is only one, with a regular feeding time and place.", - "The cats are well fed and lazy, mostly for show unless provoked." - ] - }, - { - name: "Hunting Spiders", - category: "Animal Guards", - desc: "These lightning-fast nightmares are about twenty pounds and three feet across, built like jumping spiders and loaded with paralytic venom.", - questions: [ - "Were these spiders bred for a decadent aristocrat, or warped to this impossible size by an insane whisper?", - "Can they survive away from a spirit well?", - "What noise do they make?", - "How do they smell?" - ], - modsHarder: [ - "They are mostly trained, their handler using a slide whistle to give orders to hunt, attack, withdraw, or guard.", - "The color of the stone, the shape of the underbrush, the leaf litter--everything matches the spider color scheme and hides its movement." - ], - modsEasier: [ - "Little lasting harm at first; paralyzed prey is dragged back to a lair and webbed up. You have a day or so to rescue the prey before the spider injects acid into the web bundle so it can drink its victim.", - "The poison is weak and easy to resist, requiring several successful bites to put a human down." - ] - }, - { - name: "Mastiff Pack", - category: "Animal Guards", - desc: "A pack of mastiffs have run of the guarded area when it is not in more public use. They only respond to their masters, who have special tunics, whistles, and gloves. They kill anyone or anything else.", - questions: [ - "What is their heraldry?", - "How many mastiffs are in the pack?", - "Are they trained well enough to ignore poisoned meat or live animal distractions?" - ], - modsHarder: [ - "Each one is precious to the site owner, who will tirelessly seek vengeance if they are hurt.", - "The pack masters are elite veterans with firearms and excellent tracking and hunting skills." - ], - modsEasier: [ - "The equipment is properly installed, its vulnerable parts behind the energy curtain, directly guarding what needs protecting.", - "The lightning walls attract loose spirits, intruders may also have to contend with confused ghosts." - ] - }, - { - name: "Venomous Snakes", - category: "Animal Guards", - desc: "Venomous snakes have lairs prepared for them in the guarded area.", - questions: [ - "How fast acting is their venom?", - "How aggressive are they?", - "Is their hide camouflage for hunting, or bright to warn away predators?", - "Are there only a few big ones, or many small snakes?", - "Do the site guardians feed them, or can they find enough vermin on their own?" - ], - modsHarder: [ - "Knee-deep plants and elevation shifts intentionally make it difficult to see snakes.", - "Other guardians have a side business in selling venom and meat and hides. They have venom blowdarts and poisoned daggers." - ], - modsEasier: [ - "The snakes dislike a certain whistle tone. Let out a blast occasionally and they'll stay away.", - "A former employee knows how guardians got around the site with minimal risk of snakes." - ] - }, - { - name: "Armor Hosts", - category: "Ghostly Guards", - desc: "Guardian spirits are able to inhabit a crystal melded to each suit of armor in a guarded area. When melded, the spirit can control the armor. Spirits use the armor to attack intruders.", - questions: [ - "Were the suits of armor built for this purpose, or retrofitted by a spirit trafficker?", - "Are the guardian spirits loyal, or were they stripped of their will by a ritual or other power?", - "Are the suits visibly paranormal?" - ], - modsHarder: [ - "A single powerful (relatively sane) spirit can flit from armor to armor, backed up by two slave spirits. The guardian can form an electroplasmic face in the helmet to sneer at intruders.", - "A swarm of spirits are eager to take their turn in armor. When one tires another drops in.", - "Ceaseless patrol." - ], - modsEasier: [ - "The ghost(s) that animate the armor are murderous and difficult to control.", - "The guardians can play a chime to recall them to a restraining prism.", - "The suits of armor are old, battered, and prone to physical failure." - ] - }, - { - name: "Coldrooms", - category: "Ghostly Guards", - desc: "The defended area is kept cold. Body heat registers like a plume of blood in the water. Ghosts flood living meat with cold, gorging on body heat, becoming more visible as their outlines swirl with life-blood.", - questions: [ - "Were they created by ritually starving victims to death in the defended space?", - "Were they stolen from the site of a massive horrific disaster?", - "Does a spirit trafficker maintain the wards on the space?" - ], - modsHarder: [ - "A dead whisper leads them, countering defensive charms and magic, sniffing out breath even if heat is concealed, dueling any supernatural defense.", - "The guarded area is powerfully warded and underground where temperature is easy to maintain." - ], - modsEasier: [ - "The guarded area is vulnerable to weather conditions. It is sharp in the cold, but almost dormant in the heat.", - "A relatively simple spirit bane charm can keep them at bay if created in tune with the site." - ] - }, - { - name: "Cursed Treasure", - category: "Ghostly Guards", - desc: "Treasures are infused with a haunting spirit. Anyone touching the treasure will be cursed, dreaming the crimes of the ghost and attracting anger and distaste from strangers. Friends become uncomfortable and suspicious around the cursed scoundrel.", - questions: [ - "Were those sacrificed to make the haunts loyal, serving past death, or punished by undeath?", - "Is the treasure marked as cursed?" - ], - modsHarder: [ - "The haunting is so deadly that it drives most victims to suicide within a week. Resourceful scoundrels with access to spirit traffickers have days to somehow break the hold. Others are doomed.", - "Electroplasmic poisoning begins, and within a week the scoundrel will become a vampire." - ], - modsEasier: [ - "All the bad luck waiting in the wings (unfinished clocks from foes, poorly protected stashes, jilted lovers, false identities) go wrong in quick succession. Then the curse is over.", - "A competent occultist can break the curse as a down time project with a four segment clock." - ] - }, - { - name: "Darkrooms", - category: "Ghostly Guards", - desc: "The defended area is dark. The ragged ghosts hate light. They shriek horribly as they attack light sources with slapping leathery hands, like bat wings. Intruders may glimpse their luminous fangs.", - questions: [ - "Were these ghosts placed here intentionally, or are they the result of some horror that left a print in the Ghost Field?", - "Is this defense maintained, or passive?" - ], - modsHarder: [ - "Another guardian lurks in the dark and takes advantage of the distraction to steal from intruders, perhaps killing them too.", - "The ghosts are aggressive, pushing intruders. Surroundings include long drops, spikes, mazes, or other hazards difficult to navigate in darkness." - ], - modsEasier: [ - "While annoying, they do no real damage, and forewarned scoundrels may prepare unbreakable light sources or supernatural dark vision.", - "There is enough ambient light to see." - ] - }, - { - name: "Dynastic Hive", - category: "Ghostly Guards", - desc: "Ancestors have been ritually infused into the defense site, it is a dynastic holding. The spirits are old, and insane, but strategically placed to act out their madness in the most damaging way.", - questions: [ - "Did the family get special permission to harbor ghosts?", - "Do they have connections to limmers?", - "Are spirits tied to leviathan bone shards?", - "Are they moving pictures, or conversationalists with clues?" - ], - modsHarder: [ - "The ghosts are legally protected, like landmarks or artwork. Damaging them is a serious crime.", - "Some of the more powerful or canny ghosts are still somewhat sane collaborators with the site owners." - ], - modsEasier: [ - "They are out of control, and few dare to enter the site now (or it is abandoned.)", - "They will not harm family members (but may not react well to hostages.)" - ] - }, - { - name: "Hunting Ghostpack", - category: "Ghostly Guards", - desc: "A group of weaponized ghosts haunts the defended area. They are capable of scouting to find intruders, descending on them with lethal force.", - questions: [ - "Do they appear as a pack with a mounted hunter, spectral hounds, and a ghostly horn call?", - "Or an armored warband?", - "Shapeless lethal electroplasmic stalkers?", - "Are the wounds they inflict bloody cuts, or hard frostbite?", - "Is their area surrounded with runes that let them see into the material world?" - ], - modsHarder: [ - "The ghost leader feels all life force in its hunting ground, knowing its location.", - "The hunt can only rise when certain conditions like anniversaries, moon phases, etc. are met. However, they have a treasure that can only be taken from them when they manifest." - ], - modsEasier: [ - "The attack is purely psychological, killing with supernatural fear. The effect can be resisted.", - "They are summoned and directed by a command artifact like a hunting horn or special weapon. If someone else tunes to the weapon, control (and its obligations) may shift to a new bearer." - ] - }, - { - name: "Possession Gate", - category: "Ghostly Guards", - desc: "If an intruder breaks a clearly marked seal, the intruder is attacked by a possessing spirit that takes on the traits of the most strong-willed, brutal person the seal-breaker ever killed. The possessing spirit and the seal-breaker struggle for control. This counts as a harm.", - questions: [ - "Is the possessing spirit a ghost, or a shape-shifting construct made by an expert that makes a shape out of something in the target?", - "If an innocent triggers the trap, what form does the spirit take then?" - ], - modsHarder: [ - "The only way to be free is to die, undergo electroplasmic surgery while dead, and be revived. Otherwise the curse is protected by the victim's life force.", - "The haunting spirit tries to take possession once a day or so, sending the host into a blackout and acting out vicious crimes against allies, loved ones, and bluecoats." - ], - modsEasier: [ - "The condition can be reduced with a resist roll, but still is likely a 6 segment clock to clear.", - "The curse haunt would rather have a host ally than kill its victim, and may bargain for shared control." - ] - }, - { - name: "Spirit-Infused Art", - category: "Ghostly Guards", - desc: "Art works are haunted by spirits that are capable of spying. They observe their area, and may be able to murmur about what they see to a guardian.", - questions: [ - "Was art repurposed to host spirits, or was it created for them and around them?", - "Is the art mosaics, portraits, statues, or some other form?", - "How sane and coherent are the spirits?", - "How loyal are they?", - "Do they have the power to attack intruders?" - ], - modsHarder: [ - "One or more guardians has a signet ring tuned to the haunted art pieces, and can hear what they whisper as they spy.", - "The ghosts inhabiting the art can move from one piece to another, following intruders or retreating to report." - ], - modsEasier: [ - "One spirit per art piece, and each spirit has its own unbalanced personality.", - "Unhinged art is violent, so it has to be shrouded or restrained when guardians go through the defended area." - ] - }, - { - name: "Starving Fog", - category: "Ghostly Guards", - desc: "The guarded area is in a clinging cold fog. Fog draws energy from those breathing in it until it manifests shadows that increase target fear, which feeds it more. Eventually it can manifest a killing shape.", - questions: [ - "What do intruders in the fog see when it reflects their fears?", - "Are there sound effects, smells, and sounds, or just fleeting glimpses and silhouettes?", - "Does it project hallucinations or trigger memories?" - ], - modsHarder: [ - "The fog strengthens the Ghost Field, making ghosts within it more powerful.", - "The fog can move, summoned or controlled by other guardians to provide backup or help search." - ], - modsEasier: [ - "The fog is generated by an artifact. If the artifact is neutralized so is the fog.", - "Those with the proper energy keyed amulet or other trinket are invisible to the fog." - ] - }, - { - name: "Sweat Nectar", - category: "Ghostly Guards", - desc: "The defended area is kept hot. Sweat tastes like nectar to swarming ghosts, who dehydrate targets into mummies. The stolen life force and moisture flows to prepared corpses, so ghosts can ride them again.", - questions: [ - "Were they created by dehydrating sacrifices to death in the defended space?", - "Were they gathered from outside the lightning walls to stand guard here?", - "Does a spirit trafficker maintain the wards on the space?" - ], - modsHarder: [ - "Many prepared corpses are stashed in unexpected places, bursting into combat when rejuvenated.", - "Once they rise, the desiccated spirit-ridden corpses will chase intruders until they can't." - ], - modsEasier: [ - "Only a few corpses are left to revive.", - "The site is difficult to keep hot enough to extract the necessary sweat from intruders." - ] - }, - { - name: "Dartus Weed", - category: "Supernatural Plants", - desc: "When something moves near a tangled bank of dartus weed, the vines flex, flicking barbed tips towards the source of motion within arm's reach. The darts are paralytic; a target will pass out for about an hour.", - questions: [ - "Do they have a distinctive flower or smell?", - "What is the aftertaste of the poison's effect?" - ], - modsHarder: [ - "Hounds with chemically toughened hides patrol the weed banks, brutally killing intruders.", - "Weed banks are cultivated strategically, flanking important doorways or draped over arborwalks, straggling along verges." - ], - modsEasier: [ - "The weeds are young. Darts can be stopped with thick leather.", - "Weed banks are out of the way of defended valuables, but too close to very annoyed neighbors who may hold a grudge." - ] - }, - { - name: "Dreamspore Shrooms", - category: "Supernatural Plants", - desc: "Placed on the ceiling, they drizzle sandy spores when they sense motion below. Victims hallucinate, heightening subconscious emotion (so they are very mellow, or super anxious, or filled with rage, etc.).", - questions: [ - "Were these intended to be a site defense?", - "Did they instead serve a religious or recreational function?", - "Are there special techniques for harvesting them, perhaps selling them to alchemists?" - ], - modsHarder: [ - "A more intense strain, these can knock out those who succumb, and give them vivid dreams for several hours.", - "They are placed near other guardians as well as hazards like a steep drop or running water." - ], - modsEasier: [ - "Other guardians come here recreationally, their effectiveness reduced.", - "The spores are weak and easier to resist." - ] - }, - { - name: "Floormesh", - category: "Supernatural Plants", - desc: "Flat vines grow together to make flooring. Connected below is the bulb, covered in venomous spikes. Anyone heavier than a child will fall through. Blood and rot feed the floormesh.", - questions: [ - "Have site defenders put carpet over the flat vines to further hide the threat?", - "What colors, textures, and patterns does this version have?", - "How dangerous is the venom?" - ], - modsHarder: [ - "The building's architecture assumes use of floormesh, the carpets are woven to look like floormesh so the guardians don't have to cover the actual pits.", - "The mesh itself has venomous thorns in it, so stepping on it or falling through poisons the target." - ], - modsEasier: [ - "The pit is not cleaned, the area near it stinks heavily of corpserot. The mesh sags visibly.", - "Floormesh is mostly hung like tapestries, living decorations, rather than forming pit traps." - ] - }, - { - name: "Ghost Crystal Topiary", - category: "Supernatural Plants", - desc: "Ghost crystals are worked into the roots of fancifully trimmed bushes. Ghosts may be able to inhabit the bushes and make them move. This gardening curiosity can be weaponized.", - questions: [ - "Is this a currently maintained garden, or one that is overgrown and abandoned?", - "Who provides the necessary skilled care to create or maintain the topiary?", - "Is there a theme to the sculptures?" - ], - modsHarder: [ - "Certain of the most powerful bushes can uproot and move around like living green golems driven by electroplasmic energy.", - "The bushes hardly move, but the powerful energies of the crystals make ghosts much more coherent and powerful in the garden." - ], - modsEasier: [ - "Left unprotected at one point, the garden was raided by thieves after the ghost crystals. Few crystals are left in the shaggy bushes.", - "Incompetent handling has drained most of the power from the crystals." - ] - }, - { - name: "Keenshrooms", - category: "Supernatural Plants", - desc: "These fist-sized mushrooms let out a keening wail when light comes within about thirty feet.", - questions: [ - "What do they look like?", - "Is their smell distinctive?", - "Are they good eating?" - ], - modsHarder: [ - "They are strategically placed to surprise intruders; inside doors, on ceilings, in alcoves, behind statues.", - "Masses of keenshrooms have been allowed to coat walls or fill rooms, and their keen is strong enough to deafen or kill." - ], - modsEasier: [ - "The keenshrooms were placed too close to trafficked paths inside or outside the defended site. Constant false alarms dull vigilance.", - "Too far from site defenders, their keens are seldom investigated." - ] - }, - { - name: "Murder Tree", - category: "Supernatural Plants", - desc: "The willow tree grew around bones wired to it, spirit crystals studded in its bark, and leviathan blood at its roots. lt is dimly self-aware. It senses and hates life, whipping and clubbing any who approach.", - questions: [ - "How do guardians move around the tree?", - "Suggestions include knowing passwords, having enchanted amulets, or attuning to its blind spots. How many guard the site?", - "Who had the expertise to cultivate this living weapon, how long ago?" - ], - modsHarder: [ - "The chorus of semi-aware spirits that fuel the tree are enslaved by one domineering will. The tree is as coherent as a person.", - "Multiple murder trees are connected by roots and share knowledge with each other (and any other site guardians.)" - ], - modsEasier: [ - "No one can communicate with the murder tree, or control it, so it is isolated from other defenses.", - "The tree sleeps most of the time, and it is difficult to rouse it to fighting fury." - ] - }, - { - name: "Snatchweed", - category: "Supernatural Plants", - desc: "It grows in fresh water, lengthening its long winding tendrils almost to the surface. When touched, it snatches and pulls, coiling down to the bottom and holding for a few minutes before relaxing back up.", - questions: [ - "Is their growth boosted supernaturally, and can you see faces reflecting from the Ghost Field beneath their fronds?", - "Are the locals aware of the threat, willing to talk about it?" - ], - modsHarder: [ - "Snatchweed is cultivated in areas where intruders must enter the water to get past other obstacles.", - "The bottom of the water has two foot spikes, victims are pulled down onto them." - ], - modsEasier: [ - "A sign warns of the hazard, as required by law.", - "This particular breed of snatchweed recoils from salt; put enough on the surface and tendrils recoil." - ] - }, - { - name: "Thirstclimber", - category: "Supernatural Plants", - desc: "The vines are red, and when flesh touches them (even through leather) the vine draws blood to the surface in alarming quantities. The vines are slippery, and almost impossible to grasp with wet hands.", - questions: [ - "Are the vines clearly visible to those who can see in the Ghost Field?", - "Do the vines cause damage that must be healed, or does the blood only flow when they are nearby?" - ], - modsHarder: [ - "The site has guard creatures that track by scent and are drawn to attack things that smell bloody.", - "Thirstclimber is cultivated at the mid-point of a really difficult climb." - ], - modsEasier: [ - "Annoyed locals keep it trimmed back on outside walls periodically in spite of the guardian's threats.", - "Guards know the ingredients to make a special paste, and the symbol to paint on skin with it, to protect from the plant's effects. A former guard might share the secret." - ] - }, - { - name: "Thirsty Thorns", - category: "Supernatural Plants", - desc: "Strategically placed thornbushes grow on walls and serve as decorations. They live on blood. They only flower if something dies on them; the bigger the life, the more impressive the bloom.", - questions: [ - "Do they feed on radiant light?", - "Are they along the interior walls, lining the walks, and climbing walls outside?", - "Are there thorns inside, along windows or protecting secret doors?" - ], - modsHarder: [ - "The thorns are poisonous, inflicting some condition on those who fail to resist.", - "Possibilities include sleep, death by choking, blinding blood from the eyes, or paralysis.", - "The thorns are considered a gardening achievement, with some fame and support as local culture." - ], - modsEasier: [ - "A custom amulet tuned to their life energy turns the thorns away, allowing its bearer to push through them unharmed. A site defender may have one, or one could be made.", - "They are old and brittle, dying by inches and neglected." - ] - }, - { - name: "Vine Curtains", - category: "Supernatural Plants", - desc: "Curtains of vines connect back to a radiant root that has grown semi­aware, fed on rogue spirits. If touched, the vines slither and writhe to entangle, hoist, and bundle the target for a guardian to find.", - questions: [ - "What do the vines look like?", - "Do they use their scent to attract or repel?", - "Where is the root relative to the curtain?" - ], - modsHarder: [ - "Many curtains and roots of different sizes (some quite big) connect back to a central bulb somewhere in the defense site.", - "The vines also have a contact poison that makes their target go limp for 10-60 minutes." - ], - modsEasier: [ - "The site owner does not have legal permission to have the vine curtains, so they are only used inside.", - "The vine curtains grow wild and the lazy site owner does not keep them trimmed back, so other guards must stay away from them." - ] - }, - { - name: "Caul Piercers", - category: "Traps", - desc: "Piercers are designed to puncture whoever touches them. They pierce the energy caul of the character's life force in the Ghost Field. This causes a harm condition that worsens or costs stress every down time cycle until the caul can be mended (6 segment project.) Interpret as needed.", - questions: [ - "Do the piercers resemble knives, nails, or thorn-like carvings?", - "What sadistic expert crafted these dire traps?", - "If pried out of their settings, how long do they retain potency?" - ], - modsHarder: [ - "Those affected will trail life energy like a wounded fish bleeding in the water; demons and ghosts alike will investigate the scent.", - "They are worked into important doorknobs, strategic ledges, and concealed flooring." - ], - modsEasier: [ - "They all look alike and are similarly placed, relying on surprise to be effective.", - "They are only on the main treasure." - ] - }, - { - name: "Collapsing Ceilings", - category: "Traps", - desc: "If triggered, this trap drops a mass of stone. That seals off the threatened area, and crushes anyone tampering with its defenses.", - questions: [ - "Who put valuables behind a trap that could seal them away for good?", - "How old is this defense, and who takes care of it?", - "What warning signs tip off an intruder that continuing is dangerous?" - ], - modsHarder: [ - "Hidden mechanisms can raise the block back up to the ceiling, so the trap can be reused (or defeated remotely.)", - "More than one block falls; the first one cuts off escape, then death seems inevitable." - ], - modsEasier: [ - "The stone dropped long ago. Site guardians or intruders have developed ways to climb over it or get past it. Other blocks may still be untriggered, but some of them are no longer dangerous.", - "More like a mine collapse, difficult to control and possible to tunnel past." - ] - }, - { - name: "Combination or Trick", - category: "Traps", - desc: "Various portals and defenses of the site are protected by combination locks or riddles to solve. Lockpicks will not work against them, though finesse may solve them eventually.", - questions: [ - "Are there a series of combination locks expressing a religious or eccentric worldview?", - "Are there picture arranging puzzles, or unusual keys to go in sculpture locks?", - "Are the locks mechanical or supernatural?" - ], - modsHarder: [ - "Powerful runic work or enslaved ghosts make the obstacle difficult to smash or trick--the right combination or object must be used to bypass it.", - "Clues and needed items are spread across a large estate, or multiple estates." - ], - modsEasier: [ - "The combination or solution to the puzzle is in a scholarly work, and can be found or bought ahead of time.", - "The solutions are painfully obvious to someone with the right upbringing and background." - ] - }, - { - name: "Contact Needles", - category: "Traps", - desc: "Small needles are worked into contact surfaces and poisoned, to deter intruders. They may be on doorknobs, seat backs or cushions, doorframes, stair treads, ledges, beds—anywhere, really.", - questions: [ - "Are the needles easily visible if you look for them, or camouflaged?", - "Are they retractable if you know what you're doing?", - "What kind of poison is on them?", - "Will the victim sleep, freeze, die, or hallucinate?" - ], - modsHarder: [ - "The needles are only corporeal to those who touch them without wearing a certain amulet. Important site guardians are immune to the needles.", - "Anything important or at an unguarded entry point is going to be festooned with needles." - ], - modsEasier: [ - "They are not well maintained. Many have snapped off, and few retain much poison.", - "They are only on the most important objects or the most useful trap objects (like a chair for guests.)" - ] - }, - { - name: "Excellent Locks", - category: "Traps", - desc: "Beyond simple security, these locks are works of art. They are higher potency than they would normally be. Also, they are equipped with poison needle traps, or pick breakers, or redundancies.", - questions: [ - "Who put in these superior locks, and for what reason?", - "Are the locks designed to defeat entry, or actively punish intruders?", - "Do the specialized keys have a distinctive look, like two flanges?", - "Is there a master key?" - ], - modsHarder: [ - "Everything is locked, and all the locks are good. Somebody had a real lock problem.", - "The locks involve supernatural components, like hidden keyholes or paralyzing energy." - ], - modsEasier: [ - "The locks are in poor repair, of variable quality after indifferent maintenance and many intrusion attempts.", - "Very fancy locks, but they are padlocks, and bolt cutters can circumvent the problem." - ] - }, - { - name: "Murder Holes", - category: "Traps", - desc: "Intruders go past one door, into a hallway or small room, and the door closes behind them. Arrow slits open in the walls, and slots in the ceiling allow boiling oil to be poured down. Intruders are trapped and vulnerable. These are often in doors through defenses.", - questions: [ - "Was the original site builder often under siege?", - "Are the murder holes obvious or concealed?" - ], - modsHarder: [ - "Murder holes are automated with self- slamming doors and pre-boiling oil, so a few defenders can trap and/or kill many intruders.", - "The whole layout is built with many murder hole areas to deter invasion." - ], - modsEasier: [ - "The walls are wooden, and determined captives can break through to face their attackers.", - "This area does not have enough staff to monitor intruders and make best use of murder holes." - ] - }, - { - name: "Pit Traps", - category: "Traps", - desc: "The defended site has pit traps in strategic places. They are between 10 and 40 feet deep.", - questions: [ - "Do they have slick sides?", - "Are there spikes at the bottom?", - "Are the covers mechanized, or flimsy boards and carpets, grass turf, or leaves over canvas?", - "Are the sides stone, earth, or clay?" - ], - modsHarder: [ - "Fist sized tunnels connect pits. Predatory creatures (crabs, snakes, spiders, rats) scurry to devour victims.", - "Once someone falls into the pit the covers close again, and will not open until unlocked." - ], - modsEasier: [ - "The pits drop into a lower area, mostly abandoned except for predators. It is possible to find a way out.", - "The pits are mostly open and filled with junk." - ] - }, - { - name: "Retractable Spikes", - category: "Traps", - desc: "Spring-loaded spears or racks of spears launch at intruders. They can come from the side, behind, ahead, below, or above.", - questions: [ - "Are the defenses standardized to protect guardians, or random to confuse intruders?", - "Are they in an area that site defenders use, or in an isolated off-limits area?", - "How long have they been in use, and how often are they maintained?" - ], - modsHarder: [ - "After doing their killing work, they retract, and the launch points are not obvious.", - "The spears are slathered with some toxin, further affecting the victim." - ], - modsEasier: [ - "The mechanisms are not well maintained. Sometimes they don't work, and when they do, there is a screech and they are a bit slow.", - "The spears are designed to pin an intruder in place, to be interrogated and punished, rather than to kill outright." - ] - }, - { - name: "Secret Doors & Spyholes", - category: "Traps", - desc: "Guardians are well trained in the use of numerous secret doors and hidden passages with spyholes. They can attack from unexpected directions, escape without a trace, and watch intruders unobserved.", - questions: [ - "Was this site built by a spy, or a cult, or a paranoid aristocrat?", - "Are there consistent tells, a code built into the decor and architecture, or must all secrets be known individually?" - ], - modsHarder: [ - "Ongoing rearrangement and construction means old information from plans or people ages out fast.", - "Supernatural locks and keys mean that triggers and spyholes and seams may not be visible in the material world at all." - ], - modsEasier: [ - "Frequent use has made secret doors easier to spot. Poor baffling of lights may reveal spyholes in use.", - "Current residents are only aware of some secrets; intruders may use back ways to elude security." - ] - }, - { - name: "Shock Grips", - category: "Traps", - desc: "One or more contact points are connected to energy so they will badly shock anyone who touches them. These could be doorknobs, chest lids, floor plates, ladders, and so on.", - questions: [ - "Are they powered by batteries or enslaved ghosts?", - "Does the site have legal permission to use them?", - "How loud is the shock?", - "How do site guardians avoid getting shocked?" - ], - modsHarder: [ - "The shock grips are numerous and concealed, connected to their energy source through the Ghost Field.", - "The shock is designed to stop the heart and kill the victim (possibly setting hair on fire.)" - ], - modsEasier: [ - "The shock grips are connected to control boxes and energy sources by cables.", - "Shock grips are marked by a rune, and shiny, and also give out a palpable hum of energy. They are easy to detect." - ] - }, - { - name: "Brutal Sadists", - category: "Twisted Guards", - desc: "Only brutal sadists are hired on as guards. They have permission to play with captured intruders.", - questions: [ - "Is the owner of the protected property aware of this cultural rule, or are guards hired by an employee?", - "Do they share cultural roots (slaughterhouse workers, leviathan hunters, soldiers, city guards, etc)?", - "How do the neighbors feel about their occasional scandals?" - ], - modsHarder: [ - "Several of them are skilled in both torture and interrogation; they extract secrets from intruders. A side business in blackmail helps them avoid legal trouble.", - "They are hardened veterans, exceptionally tough and dangerous. They aim to incapacitate." - ], - modsEasier: [ - "Their ugly tactics and poorly chosen victims have earned them (and their employer) enemies in lots of unexpected places.", - "They really, really like to drink." - ] - }, - { - name: "Close-Knit Guard Network", - category: "Twisted Guards", - desc: "Guards are only hired by referral. Failure results in punishment for both the guard and the sponsor. Their loyalty is tested many ways before and after they are hired.", - questions: [ - "Do they favor bastards of the employer?", - "Are they connected to one military unit?", - "Are they refugees from another place?", - "Do they come from a single neighborhood?", - "Does punishment extend to their families?" - ], - modsHarder: [ - "They are connected to a larger sponsoring organization that would seek vengeance if they are attacked or insulted, and also offer them favors.", - "They speak in code and have passwords that include safewords and warnings." - ], - modsEasier: [ - "Nepotism has pulled in some really incompetent guards.", - "Endless drama from working with family and friends." - ] - }, - { - name: "Compulsive Detail Focus", - category: "Twisted Guards", - desc: "Only a certain type is hired; a type that checks every lock and every dark corner. Schedules are strict, thoroughness is a guarantee, and they seem unable to cut corners or skip steps. Everything is by the book.", - questions: [ - "Are they altered to be like this, or just screened for a mindset?", - "What are the detailed parts of the defended site that need this kind of attention?", - "How does their gear reflect this fussy attention to detail?" - ], - modsHarder: [ - "There are other elements of the defended site that require their focus, like a pattern of stepping over tiles to avoid triggering traps or complex combination locks or dozens of cells with dangerous prisoners.", - "They are trusted with specialty items like firearms or charms because they are responsible with them." - ], - modsEasier: [ - "Everyone knows that they fall apart if things deviate from the pattern, like distractions or chaos.", - "The locals pick on them when they are off duty, teasing them for their compulsions. They have enemies, and could use friends." - ] - }, - { - name: "Convict Public Service", - category: "Twisted Guards", - desc: "Due to prison overcrowding, some criminals are sentenced to indentured service to a noble to work off their debt to society. This site's guardian uses criminals as guards, under the stern eye of professionals.", - questions: [ - "Are casualties high due to danger from intruders or other site defenses?", - "Is the patron benevolent and trying to rehabilitate criminals, or using them as disposable fodder?", - "How do the convicts like this place?" - ], - modsHarder: [ - "Serving here is a known post among criminals, both a resume builder and networking site.", - "Angering these guards could bring consequences from unexpected directions in the criminal underworld.", - "Hand picked as the hardest and deadliest, these criminal guards are canny and tough." - ], - modsEasier: [ - "Convicts are eager to assist anyone with enough Coin or pull to secure their pardon and freedom.", - "The convicts are bullied and sullen, as much a hindrance to defenders as a defense themselves." - ] - }, - { - name: "Demonic Mutations", - category: "Twisted Guards", - desc: "About a quarter of the guards have been mutated by contact with demonic essence. They are strong, and their senses are sharp.", - questions: [ - "Do they share one demon patron?", - "Did they become guards to gain this power?", - "Are they worshippers or mercenaries?", - "Did they volunteer or are they victims?", - "What element is their demonic affinity?" - ], - modsHarder: [ - "They share a supernatural connection and can sense when other demonic guards are in trouble.", - "They are highly resistant to normal damage. They may be vulnerable to supernatural attacks or a specific allergy (silver, garlic, salt, etc.) Or, they may be resistant to supernatural attacks instead." - ], - modsEasier: [ - "They become physically impressive, but their minds are lost to incoherent lusts and fury.", - "The rest of the staff resent or fear the demonic guards. Loyalty and morale are low among mundane employees." - ] - }, - { - name: "Enchanted Prosthetics", - category: "Twisted Guards", - desc: "Guards are all amputees with at least one prosthetic. Each prosthetic tunes to its owner. The prosthetics can stun on contact.", - questions: [ - "Are the false limbs the work of one genius?", - "Are they part of a collection?", - "Were they made for this use?", - "Is a ghost bound to each?", - "Are they scientific, with batteries?", - "Are they powered by the bearer's life force?" - ], - modsHarder: [ - "All guards have some adept training and spirit bane charms, alert against supernatural forces.", - "Veteran guards have learned to tune to their prosthetics to get an additional effect, like life detection or firing energy blasts." - ], - modsEasier: [ - "Only one use between recharges.", - "The guards are mostly old or broken, relying on reputation and supernatural energy to be effective." - ] - }, - { - name: "Feral Pen", - category: "Twisted Guards", - desc: "Some areas of the defended site have free-range maniacs. Destitute and wretched beggars are treated as guard dogs, expected to attack intruders and draw attention to anything unusual.", - questions: [ - "Does the guarded site pretend to be charitable, or a madhouse, or a prison?", - "What philosophy leads to treating people this way?", - "How do the city authorities feel about the site?", - "Religious authorities?", - "Does the site feed into the Ghost Field in an unusual way?" - ], - modsHarder: [ - "Most of the feral guards are killers, possibly haunted, and extremely dangerous.", - "This pet project is as much art and religion as defense, and has support from a variety of decadent aristocrats in positions of power." - ], - modsEasier: [ - "The rest of the site guards hate the feral pen and ignore it as best they can.", - "It is as much prison hospice as guard dog kennel. Its victims are weak, sick, and starving." - ] - }, - { - name: "Fighting School", - category: "Twisted Guards", - desc: "An onsite training school focuses on the lifestyle and skill of a school of fighting. Site defenders are part of a group identity with specialty training.", - questions: [ - "Is the school's focus on dueling, a martial art, commando training, or something else?", - "What is their crest, uniform, motto, and lore?", - "What sort of training space do they have?" - ], - modsHarder: [ - "The school itself is an impressive fortress or defense.", - "The school has an impressive alumni network that visits occasionally and would avenge wrongs to the honor of the school." - ], - modsEasier: [ - "This is an off-site shrine or expansion, where they send troublemakers and those they can't eject for political or financial reasons.", - "Leadership is riddled with rivalries and power struggles. Outsiders know some details." - ] - }, - { - name: "Performance Enhancers", - category: "Twisted Guards", - desc: "Guards have ready access to drugs. Some of the drugs enhance performance.", - questions: [ - "Do the drugs give them a burst of combat effectiveness?", - "Are the drugs recreational, making them popular with a customer base that pays well and owes favors?", - "Who provides them with drugs?" - ], - modsHarder: [ - "As dealers, the guards are difficult to bribe or intimidate, as they have money and prestige.", - "Guards can medicate flexibly, with concoctions to enhance perception (even to see the supernatural,) gain combat prowess, or heal." - ], - modsEasier: [ - "Their peddling of illegal drugs has made enemies among bluecoats and inspectors.", - "The guards are junkies. Their employer uses addiction to control them, keeping them near the edge. They are often distractible or unconscious." - ] - }, - { - name: "Zealots", - category: "Twisted Guards", - desc: "Guards share a religion that binds them together and makes them resistant to intimidation or corruption.", - questions: [ - "Do they worship one of the Forgotten Gods? The Church of the Ecstasy of the Flesh? Weeping Lady?", - "Have they sworn oaths?", - "What does religion require them to hate, or to love?" - ], - modsHarder: [ - "The defended site includes a shrine or temple. Violating the site angers offended worshippers.", - "Serving as a site guardian is part of a religious duty. Unexpectedly seasoned warriors or important people may serve as lowly guards for a time." - ], - modsEasier: [ - "Mandatory prayer times, unclean objects or places left uninspected, and restricted areas may create holes in security.", - "Enemies of their religion may offer help to embarrass, discredit, or injure the zealots." - ] - }, - { - name: "Ghostport Lock", - category: "Weird Tech", - desc: "Keys are tuned to locks that cannot be picked by normal means, or bypassed without whisper expertise. Their access point is in the Ghost Field until the key is present.", - questions: [ - "Are these locks modem scientific triumphs, or old arcane defenses?", - "Does he key look like a key, or does it look like a missing decoration, or a gem?", - "Is the key physical, or energy, like living blood of the right family?" - ], - modsHarder: [ - "The locks are hidden and trapped. Messing with the lock could hollow the intruder (tearing the spirit out of the body) or other unpleasantness.", - "The precise location of the lock must be known, and it is not near what it is locking." - ], - modsEasier: [ - "The ghostport lock has been a fad several times in Duskwall. Each time, there was some mass production, and a key to a similar lock might work with a little help.", - "The owner may have stiffed a whisper locksmith on the fee, or otherwise offended the expert, who is knowledgeable and disgruntled." - ] - }, - { - name: "Lightning Walls", - category: "Weird Tech", - desc: "Runic energy twisting technology can make pylons that project a curtain of energy between them. The glowing walls are transparent, but crippling to touch and lethal to pass through. They stop projectiles.", - questions: [ - "Does the site have the technology legally, or is it stolen?", - "Maybe cobbled together from leftovers by a mad alchemist?", - "Is it on all the time (expensive to fuel) or only if the alarm is raised?", - "Where are the fuel cells kept?" - ], - modsHarder: [ - "The equipment is properly installed, its vulnerable parts behind the energy curtain, directly guarding what needs protecting.", - "The lightning walls attract loose spirits, intruders may also have to contend with confused ghosts." - ], - modsEasier: [ - "The walls guard a few key access points, but there are multiple ways around.", - "The walls are installed poorly, so their machinery is vulnerable from the outside while it is on. If no other guards are present, they can be wrecked." - ] - }, - { - name: "Panopticon", - category: "Weird Tech", - desc: "Special crystal lenses transmit their sight through the Ghost Field to mirrors in a central location. From one place, a guardian can monitor views all over the defended site.", - questions: [ - "Is this new industrial alchemical technology, or an ancient enchanted construction?", - "Does the current owner know how to get the most functionality out of it?", - "Who maintains the system?" - ], - modsHarder: [ - "The lenses are hidden in mirror frames, statues, and other decor. They are difficult to spot.", - "The lenses can see into the Ghost Field as well, observing ghosts or occult work, and life force." - ], - modsEasier: [ - "The guardians watching the mirrors are somewhat lax.", - "Over time, many lenses have not been replaced or repaired. Views are limited." - ] - }, - { - name: "Shadow Lanterns", - category: "Weird Tech", - desc: "Guards are equipped with lanterns that detect shadows of recent life force as well as shedding light.", - questions: [ - "Are the lanterns traditional lantern shape, or a glowing ball, or something else?", - "Does an expert keep the guardians supplied, or is their supply jealously guarded?", - "Does it cost the guards something to activate the lanterns?", - "Will the lanterns work if taken off-site?" - ], - modsHarder: [ - "Guards are trained to tune into the life force energy to also hear conversations of the life shadows. Guards can tune into the life force energy to know the owner's current location, if in the defended area.", - "Untended lanterns can be set to transmit detection of a life force to a nearby guardian." - ], - modsEasier: [ - "The lanterns can be rendered blind by properly tuning a spiritbane charm while near one.", - "Every sunrise wipes all traces of past life forces, and they only work at night." - ] - }, - { - name: "Shadow Rooms", - category: "Weird Tech", - desc: "The Ghost Field sometimes remembers rooms or entire neighborhoods that no longer exist in the material world. Some defended sites hide treasures in these spaces that can only be accessed if you knowhow.", - questions: [ - "How are colors different in these shadow rooms?", - "Is there a smell or sound that lingers?", - "How does it feel to step out of the material world?", - "What natural laws work differently here, like fire not flickering?" - ], - modsHarder: [ - "The access point to the shadow rooms is an enchanted lock, its location is known and guarded.", - "The shadow rooms are only connected to the material world a few times a year, or less." - ], - modsEasier: [ - "Transitioning from the material world to the shadow rooms involves certain proscribed movements; cross the courtyard three times, then back down stairs with eyes closed (for example.) Too many people know the formula.", - "The current site owners do not know these rooms exist." - ] - } - ], - NPCs: [ - { - name: "Arturo Montastic", - type: "npc", - concept: "Addicted Gambler", - arena: "New Money", - description: "He is impossibly lucky. He wins enough at games of chance to pay for his addictions, and to treat the consequences (transfusions, transplants, cutting-edge treatments.) His relationships are intense but brief. He often loses everything, but then wins it all back and more. He has owned epic treasures many times.", - notes: "Risk-averse collectors cannot bear his cavalier attitude on winning and losing priceless art. He does not truly appreciate his treasures, and should not be trusted with them. Losers can take their losses hard." - }, - { - name: "Baron Kelyr Strathmill", - type: "npc", - concept: "Hardened Industrialist", - arena: "Old Money", - description: "His family has controlled the docks for many generations. They quietly destroy competition, and get lucrative city contracts to re-develop blighted areas if the money slows down. Graceful, educated, and pleasant, he is ruthless as barbed steel under a cultured veneer. He is proud of his estate's gardens.", - notes: "Competition doesn't like being crippled. He often hires outsiders for the dirtiest work, and his victims often hire outsiders to get revenge." - }, - { - name: "Baroness Thena Hellyers", - type: "npc", - concept: "Hazy Art Patron", - arena: "Old Money", - description: "Thena is one of the least emotionally scarred survivors in her weird family. She is a leading light in the art world. She is patron to many artists and her criticism and evaluation drives a significant element of Duskwall's art scene. Whispers have noted she has an unusual connection to the Ghost Field.", - notes: "Sometimes she hires outsiders to sort out one of her artists' problems. She has a private gallery that she updates with her current trending tastes—those in the art market need to know what's in it." - }, - { - name: "Calvin Dannos", - type: "npc", - concept: "Eerie Assassin", - arena: "Underworld", - description: "The Inkvein was a cabal of seven anonymous assassins, named for their maps of the canals. If one of them was identified as a member, the other six were sworn to kill the outed assassin. Dannos was outed a decade ago, and he killed the other members and their undying founder. Now he IS Inkvein.", - notes: "Easily bored, he prefers interesting challenges to high paying or easy kills. Of course, many bereaved or power hungry individuals want him dead." - }, - { - name: "Commissioner Naria Haig", - type: "npc", - concept: "Political Matchmaker", - arena: "City Law", - description: "She exudes a plump grandmotherly innocence, but she is one of the sharpest politicians in Duskwall. She supervises over the merging of unexpected allies and the schism of monolithic interests. She cares about one thing—the good of Duskwall as a whole. She is Chair of the Ethics Oversight Committee.", - notes: "Always playing a bigger game, she uses outsiders to manage errands whose purpose they cannot see. Those she outmaneuvers tend to want to get back at her with violence." - }, - { - name: "Doc Sarnin", - type: "npc", - concept: "Lecherous Leech", - arena: "Underworld", - description: `Doc can keep life in you if you're alive (or recently dead) when you get to him. His extreme methods are often horrifying. Still, his concoctions can crush ghosts, re-attach limbs, and more. The Crows, a tough crew, protect him. They give him victims for his "needs," which are emotional, physical, and scientific.`, - notes: "Sometimes the Crows hire outsiders to go after rare components or victims for Doc. He has many, many enemies who want to either steal him and force him to serve them, or punish him." - }, - { - name: "Doctor Ixit Crichelle", - type: "npc", - concept: "Elegant Spook", - arena: "Old Money", - description: "Crechelle calls himself an Oneiric Master. He interprets dreams for a fee. He enters them, alters them, and moves through veils to understand truths and secrets the dreamer may not grasp. If he touches a target, or one of their possessions, he may enter their dreams. He appears feeble, but his mind is deadly.", - notes: "Aristocratic patrons invite him to parties. He needs a person's possession to see into their dreams; he pays for objects to visit some people's dreams. Victims will pay to free themselves ." - }, - { - name: "Dr. Hansel Kryvanntic", - type: "npc", - concept: "Brilliant Scientist", - arena: "Foreign", - description: "He is Severosi, bow-legged and wild-haired. His work on electroplasmic poisoning and mutation in animals and humans is ground-breaking. Fleeing persecution because of his ethically questionable methods back in Severos, he found a more open-minded scientific community in Duskwall.", - notes: "His research has applications in art, medicine, and war. Those with sufficient resources to further his studies want to control him. He has hurt a lot of people, over time, so he has many enemies." - }, - { - name: "Dr. Yerial Crabbskidditch", - type: "npc", - concept: "Sleazy Lawyer", - arena: "New Money", - description: "He firmly believes those who are wealthy should not be pestered with the law. No matter what you do, if you have means you can arrange for an alternate story that favors you. Deaths, frauds, robberies, and other crimes can be reduced to a few fines. He throws money at problems until they disappear.", - notes: "He routinely hires outsiders to destroy evidence, intimidate witnesses, compel confessions, and so forth. He has countless enemies, both those seeking justice and former clients who ran out of money." - }, - { - name: "Duvrel the Snake", - type: "npc", - concept: "Cunning Smuggler", - arena: "Foreign", - description: "She is Tycherosian, with the eyes and horns of a goat. Snake tattoos coil around her arms. Exotic drugs from the Dagger Isles flow through her distribution network in Duskwall. She hires outsiders to remove stubborn people while she has an alibi, or to retrieve drugs misplaced at incriminating locations.", - notes: "Inspectors have orders from the Spirit Wardens to take her alive, to study her uncanny ability to flex with the Ghost Field for supernatural stealth." - }, - { - name: "Dylayzia Finchester", - type: "npc", - concept: "Fashionable Whisper", - arena: "New Money", - description: "Her exotic looks, tattoos, and bright green eyes draw attention. She popularized thigh-high buckled leather boots and spirit bane chokers. Her opinions echo in drawing rooms across the city. People enjoy her feud with the Church of the Ecstasy of the Flesh.", - notes: "Wealthy figures in the fashion world pay top win for sneak peeks at her clothing designs. Her opinions inflame many enemies­-especially the Church. She hires outsiders to get rare components for her rituals." - }, - { - name: "Emeline Coleburn", - type: "npc", - concept: "Weary Regulator", - arena: "City Law", - description: "She inspects buildings and reports to the Duskwall Council whether they are sound, and whether they serve the purpose listed on the owner's taxation form. She is front-line in the tug-of-war between criminals, politicians, and nobles. She no longer cares about the greater good. Now it's about kickbacks.", - notes: "She takes the path of least resistance in her evaluations, so people pay to make their preference easier and other roads harder. She hires outsiders for off-the-books communication with pushy customers." - }, - { - name: "Eric the White", - type: "npc", - concept: "Vigilante Rebel", - arena: "Foreign", - description: "The War of Skovlan Unity is over, but this slender maniac with a brushy beard can't let it go. He plans to destroy the government and turn Duskwall into a Skovlan colony to punish them for the destructive war. He wants to discredit and disrupt the government at every turn.", - notes: "He targets gavernment officials as high up as he can reach, hoping to cause enough trouble to make the government vulnerable to change. He has gathered zealots, and he uses outsiders for disposable work." - }, - { - name: "Gi Aniru Ga of Sultha", - type: "npc", - concept: "Sacrificing Cultist", - arena: "Supernatural", - description: "She worships the Gaping Maw, the Runnel of Life, the Cosmic Thirst. She builds a cult, teaching them to hunt and conduct rituals. Then she moves on. Witnesses uneasily describe her supernatural abilities, including shapeshifting, flight, killing people by attacking their shadows, and so on.", - notes: "Bereaved relatives, rival cultists, and law enforcers all want her stopped. She hires outsiders to threaten, misdirect, or kill law enforcement. Determined inspectors crush cults she trained, need help to catch her." - }, - { - name: "Holtz Clermont", - type: "npc", - concept: "Reformed Clerk", - arena: "City Law", - description: "He used to be a forger. After he served stint in prison, some respectable family friends got him a position as City Clerk for the whole district. He manages correspondence for permit requests and official notices. When corrupt people inside and outside the system need to adjust evidence, they come to him.", - notes: "Jilted clients can be threatening, leading him to take steps to adjust their attitude by hiring outside help. He's smarter than he looks, and knows how to back people off. He also might know too much." - }, - { - name: "Inspector Lorette Salkha", - type: "npc", - concept: "Crusading Inspector", - arena: "City Law", - description: 'She needs allies in her hopeless quest to clean up the city. Corruption is everywhere, crime runs rampant, and the bluecoats serve the powerful (on both sides of the law.) Some tragedy in her past propels her into a suicidal effort to restore "rule of law.” Her peers muse it is a shame she will die young.', - notes: "She could be helpful if she focuses on the right bad guys—your enemies. She can't be bought, so maybe someone needs her killed (or otherwise neutralized.)" - }, - { - name: "Jemma Dropkick", - type: "npc", - concept: "Feminist Vigilante", - arena: "Underworld", - description: "She is a legend in the Seven Shallows neighborhood. She attacks men who abuse women. She survives because she has friends—a few bluecoats, a gang of thugs, and a grateful public. She carefully plans attacks to hurt abusers. Lf her victims abuse again, they are mutilated, packed like luggage, and shipped out of town.", - notes: "Many powerful men would pay for revenge on Jemma. Sometimes she hires outsiders to help out." - }, - { - name: "Kheldaria Whinnich", - type: "npc", - concept: "Implacable Developer", - arena: "New Money", - description: "She has a vision for developing the Crow's Foot district. It will be divided between businesses, estates, and parks. To realize her vision, she has been selectively buying real estate all around the city, bartering for land in Crow's Foot, and using whatever persuasion is needed to convince owners to sell to her.", - notes: "She has an estate where she stores induce­ments of all sorts, a variety of treasure designed to persuade owners to sell in exchange for what they want most. They say you could find almost anything there." - }, - { - name: "Lady Ashlyn Tyrconnel", - type: "npc", - concept: "Decadent Duelist", - description: "For centuries, aristocrats of Duskwall have learned the Tyrconnel Method of swordplay and self defense. The Tyrconnel family produces countless public servants and warriors—but also a share of scoundrels. Ashlyn's trademark suite of moves is to duel, win, bed someone, and drink to unconsciousness.", - notes: "You're hired to join the spy game in the Tyrconnel family. Or, someone is targeting her. Either way. Watch your back. Outsiders in the games of nobles are uniformly expendable." - }, - { - name: "Lady Candra Dunvil", - type: "npc", - concept: "Corrupt Fixer", - arena: "Old Money", - description: "Her family built Ironhook Prison. Her wealth is built on generations of shady deals with incarcerated aristocrats and business owners. She sees the world as a rigged game and has contempt for anyone who finds corruption shocking or fixable. She is vain, practical, and ruthless.", - notes: "She hires outsiders to carry out promises she made to inmates. Her family has casually wrecked reputations and lives over centuries, and that leaves a trail of vengeance seekers." - }, - { - name: "Lady Polonia Brogan", - type: "npc", - concept: "Desirable Dowry", - arena: "Old Money", - description: "She's ugly, smelly, stupid, and rude--and also the key to the Brogan fortune. Her lucky spouse will have access to massive wealth and infrastructure among professional builders and shipwrights of Duskwall. Only her aunt, CECILIA DURWITHE, looks out for her best interests with sharp disapproval.", - notes: "Brogan hires outsiders to punish those who slight her, or to investigate potential partners. She collects fake wills rogues have planted during assassination attempts, trying to leave her fortune to usurpers ." - }, - { - name: "Lord Branon Kinclaith", - type: "npc", - concept: "Romantic Horseman", - arena: "Old Money", - description: "Branon looks like a hero from a legendary story. He manages the family's stables, the finest horses in Duskwall (where horses are a rare luxury.) His tumultuous trysts with both men and women are common knowledge. Business suffers from his impulsive romantic gestures, but benefits from his charm.", - notes: "Branon sometimes refuses to sell horses, or breed them, if he dislikes the buyer. Some buyers want access to horseflesh anyway. If his horses are attacked, he hires outsiders to get revenge." - }, - { - name: "Lord Bulward Skinnester", - type: "npc", - concept: "Greedy Banker", - arena: "New Money", - description: "This portly curmudgeon does a brisk trade in real estate titles, both lending and foreclosing. He is acutely aware of the value of properties and how neighbors affect value. He takes particular glee in foreclosing on aristocracy and setting up the newly rich in ancient estates.", - notes: "Sometimes he hires outsiders to solve problems that his hired bluecoats and bribed councilmen cannot manage. He collects sculpture by Duskwall artists. He has ruined the lives of many formerly influential people." - }, - { - name: "Lord Orlan Booker", - type: "npc", - concept: "Insulated Mastermind", - arena: "Old Money", - description: "Ennui is a danger to the wealthy. Booker fills his days by gathering intelligence and planning heists, then selling the plans to ambitious gangs that lack his patience, experience, resources, and insight. Twice a month he goes to the opera, and meets those who have arranged to purchase a score.", - notes: "Sometimes things go wrong, and it is natural to blame the planner and want revenge. Sometimes a target wants to punish those who acted against them, even if the act was planning." - }, - { - name: "Master Slen Dallicore", - type: "npc", - concept: "Protective Guilder", - arena: "New Money", - description: "Master Dallicore is the Guildmaster for the Docker's Guild. They move all cargo on and off ships, boats, and gondolas. Their role is protected by law, as are the fees they charge. The guild uses low-level violence to discourage non-guild laborers and smugglers. However, some challenges require proper scoundrels.", - notes: "Dallicore is not above hiring outsiders to punish powerful patrons of smugglers or illegal dock workers. His position of power also gives him access to rare antiquities, both purchased and acquired." - }, - { - name: "Minister Fourteen", - type: "npc", - concept: "Grungy Fixer", - arena: "Underworld", - description: "The blind Skovlander holds court on the docks, moving from one basement to another. He favors baggy shirts, stained vests, shiny jewelry, and fraying lace. He often acts through his massive bodyguard Severen and his weedy messenger Torok.", - notes: "He is connected in the Skovlander refugee community, and in Skovlan. For a price (either wealth or an errand) he will share information about Skovlanders. He often hires outsiders to handle sensitive tasks." - }, - { - name: "Moonslider the Third", - type: "npc", - concept: "Eccentric Artist", - arena: "New Money", - description: "She feels moon phases. Her family put her in an asylum for a decade. Later, she won her freedom and inherited the family bootmaking fortune. She makes art. She tries to communicate her moon feelings. She uses oil paint, glass blowing, sculpture, song, and dance in multimedia recitals and art pieces.", - notes: "Her family bought nice things before they all died and she inherited them; she ignores most of it. She needs expensive equipment and supplies for her bizarre art shows." - }, - { - name: "Officer Milos Penderyn", - type: "npc", - concept: "Corrupt Bailiff", - arena: "City Law", - description: "Milos has access to trial evidence, and to prisoners awaiting trial. He can't get people out, but he can silence them. He has a network of corrupt peers, judges, bluecoats, and others so he can trade favors to accomplish the impossible. Huge and greasy, he is built like a bull and he enjoys the scent of fear.", - notes: "Controlling Milos could mean protecting or killing someone in bluecoat custody. An endless stream of people want revenge on him, and a more select group would like to control or use him." - }, - { - name: "Officer Veleris Walund", - type: "npc", - concept: "Heroic Bluecoat", - description: "There are actually songs about him. He is very popular. Veleris is a skilled orator (though he retreats into modesty) and a canny judge of character and situations. (He insists he just tries to do the right thing.) His opinion is influential in his district. He is trusted to guard valuables. His moustaches are his pride and joy.", - notes: "He has no family, and he seems to be an idealist. Some try to persuade him, others try to threaten him. Threats don't seem to work. He has been known to quietly hire outsiders to get justice." - }, - { - name: "Pebbler", - type: "npc", - concept: "Demon Spy", - arena: "Supernatural", - description: "This earth demon looks like a fat man built around a boulder gut, leaking sand from joints. It is able to see and hear through sand, earth, and stone within a range of miles. It works with non-cultists voluntarily, selling information in exchange for raids into the rare areas protected from its prying.", - notes: "Dozens of powerful people want Pebbler banished or robbed. However, the demon is a peerless information exchange, valuable even if it is difficult to control." - }, - { - name: "Saithernon", - type: "npc", - concept: "Exotic Fence", - arena: "Underworld", - description: "He drapes his python, DELGRAAZ, around his neck. He wears a turban with a jewel on it. He is willing to buy almost anything, no matter how strange. He also knows what you need, sometimes before you know you need it. His bazaar unfurls below the Kennington market in an abandoned gondola dock.", - notes: "He pays people to get things for him, then sells them at tremendously inflated prices to those desperate to have them. This can cause hurt feelings among the desperate." - }, - { - name: "Serlevica the Brander", - type: "npc", - concept: "Spy Whisper", - arena: "Underworld", - description: "Gaunt and frizzed, this foul-smelling Whisper has a secret ritual that allows her to control and see through rats she brands. She sells her services as a spy or site guardian. She has survived by retreating into slums and sewers when threatened, and striking from the shadows until it is safe to emerge again.", - notes: "She is closely tied to the information marketplace, buying and selling secrets. She often hires outsiders to deal with her enemies through theft or violence, and she is in turn a frequent target." - }, - { - name: "Sir Mournseller", - type: "npc", - concept: "Anarchist Ghost", - arena: "Supernatural", - description: "This ghost possesses old men from the Draymach Asylum, breaking them out to find and hire scoundrels for obscure tasks with no independent purpose. Examples include killing an insignificant chandler or stealing a specific stone from a wall in a noble's estate. Payment is the location of hidden treasure.", - notes: "A decade ago, an astute inspector began picking out the connection between errands, seeing a very long and very dangerous game to unseat the city's rulers emerging." - }, - { - name: "Sir Olen Llanwold", - type: "npc", - concept: "Piratical Industrialist", - arena: "New Money", - description: "He is thin and nervous, easy to underestimate. He specializes in stripping foes of their assets and taking over their operations. His father was a butler, and he grew up hating aristocrats. He understands power structures and corrupts retainers. His top agent, Ellsfielder, is a beautiful and ruthless woman.", - notes: "Many ruined aristocrats (and their allies) hate Danwold passionately. He does not hesitate to use his assets, legal and otherwise, to defend himself and cripple his foes. He hires outsiders through proxies." - }, - { - name: "Sir Tocker Farros", - type: "npc", - concept: "Pragmatic Councilman", - arena: "City Law", - description: "Sometimes the law works, and sometimes it doesn't. Regardless, the Council must rule and there must be order. Sir Farros ensures the districts he serves do not get too far out of hand before lawless elements are curbed. One way or another. He looks like an affable grandfather, but he has a dark past.", - notes: "Sir Farros uses inspectors or scoundrels, politicians or housemaids—anyone who will get the job done. He has an endless list of enemies who feel he wronged them, and want revenge. His agents are disposable." - }, - { - name: "SLOPSPATTER", - type: "npc", - concept: "Canal Hull", - arena: "Supernatural", - description: "This hull learned to consume spirits and bolster its strength with theirs. It cannibalizes machinery and rummages in wrecked boats for parts. It has gondola prow shoulder guards and helm, and strange banded armor made of water-logged wood over intricate mechanical parts. It fears destruction.", - notes: "It assassinates targets, with its body or by possessing machines near them. It hunts whispers, leeches, and scholars, stealing their knowledge and killing them. Their allies want revenge." - }, - { - name: "Syla DuTorrivestria", - type: "npc", - concept: "Famous Connoisseur", - arena: "Foreign", - description: "This mysterious Iruvian hides behind a veil. For years, she has been the final word on Duskwall delicacies. She specializes in evaluating high-end cuisine (including spore wines and cooking with leviathan blood.) She stays in the public eye with racy politics and a string of scandalous romances.", - notes: 'She must keep any real competitors for her fame weakened and embarrassed, and she has countless enemies. Everyone "knows" she is an Iruvian spy.' - }, - { - name: "The Honorable Telia Cray", - type: "npc", - concept: "Stern Prosecutor", - arena: "City Law", - description: "She's old, she's sour, and she has a reputation for jailing Duskwall's criminals. As thin and hard as an iron poker, she relentlessly pursues her cases, bending the law with a passionate hatred of scoundrels. She runs a special unit of Inspectors dedicated to investigating her cases, run by INSPECTOR ULEK.", - notes: "If she is taking a case personally ( as she often does) she may hire outsiders to acquire or create evidence. She also conduds a brutal war of counter-intelligence against rogues looking to free their associates." - }, - { - name: "The Wooden Judge", - type: "npc", - concept: "Haunted Puppet", - arena: "Underworld", - description: "This knee-high ventriloquist dummy looks like a caricature of a grim Judge. It is supernaturally animated. The puppet appears unexpectedly, interrupting a scoundrel's routine by offering jobs in a squeaky voice. He pays by revealing the location of hidden caches of ancient coin.", - notes: "Many angry victims want to know who pulls the strings of the Wooden Judge. The puppet often hires fresh talent for dubious work." - }, - { - name: "Theodore Lysander", - type: "npc", - concept: "Bard Pimp", - arena: "Underworld", - description: "Elegant and charismatic, this well-dressed man runs the Tenpenny Court Network. He manages prostitutes and their customers, his personal connections and charm monetized. He is also a skilled composer and performer, often seen at the Worldsedge Theater in Crow's Foot.", - notes: "He is a skilled networker. He takes the safety of his friends seriously, and is protedive of his employees, to the point of using blackmail to force powerful patrons to back off." - }, - { - name: "Chief Prichard", - type: "npc", - description: "The head Overseer of the Ministry of Provisions in Duskwall. Manages the workers and food allotments for the city districts.", - district: "Barrowcleft", - traits: [ - "calculating", - "confident", - "calm" - ] - }, - { - name: "Lord Strangford", - type: "npc", - description: "Operates one of the largest leviathan hunter fleets, serves on the City Council and is a high-ranking member of the secret order within the Church of Ecstasy.", - district: "Brightstone", - traits: [ - "secretive", - "calculating", - "arrogant" - ] - }, - { - name: "Hutton", - type: "npc", - description: "A Skovlander refugee and former soldier, now the leader of an anarchist revolutionary movement, bent on forcing the government to acknowledge Skovlander rights in the Empire.", - district: "Charhollow", - traits: [ - "brave", - "compassionate", - "wise" - ] - }, - { - name: "Lady Drake", - type: "npc", - description: `A magistrate who is "reasonable" when it comes to street crime, so long as the offender's purse is sufficient.`, - district: "Charterhall", - traits: [ - "flexible", - "shrewd", - "subtle" - ] - }, - { - name: "Master Slane", - type: "npc", - description: "A notorious factory foreman known for excessive and cruel punishments for the smallest infractions. Many attempts have been made on his life, but all have failed. Some say he's a devil.", - district: "Coalridge", - traits: [ - "cold", - "cruel", - "sadistic" - ] - }, - { - name: "Sergeant Lochlan", - type: "npc", - description: "The senior Bluecoat squad leader in the district, reporting to Captain Dunvil. Lochlan is flexible and reasonable, taking bribes and payoffs when she can; enforcing the law and making examples when necessary.", - district: "Crow's Foot", - traits: [ - "shrewd", - "tough", - "commanding" - ] - }, - { - name: "Chief Helker", - type: "npc", - description: "One of the most influential senior Dockers. Helker has a lot of sway at the docks, and if you cross him, you might find your cargo tossed into the drink—and possibly you along with it.", - district: "The Docks", - traits: [ - "cautious", - "greedy", - "vengeful" - ] - }, - { - name: "Master Krocket", - type: "npc", - description: "An unsavory, greasy-haired, scarecrow of a man who runs the snarling pack of vicious dogs used by Ironhook to track down escapees and sniff out contraband and tunnels. His dog-handlers can be found around the labor camp and all about Dunslough, using their status with the prison for favors and bribes.", - district: "Dunslough", - traits: [ - "cruel", - "greedy", - "ruthless" - ] - }, - { - name: "Jira", - type: "npc", - description: 'A dealer of fine weapons from the Dagger Isles. Greatly respected by many street toughs in The Dusk—a "jira blade" is a status symbol that many aspire to.', - district: "Nightmarket", - traits: [ - "bold", - "tough", - "confident" - ] - }, - { - name: "Levyra", - type: "npc", - description: 'A medium who invites clients to bring ghosts in bottles to posses her so they can share a few final words before the ghost is "freed" (Levyra hands it off to the waiting Spirit Wardens nearby).', - district: "Silkshore", - traits: [ - "weird", - "daring", - "dishonest", - "" - ] - }, - { - name: "Mother Narya", - type: "npc", - description: "Runs the Arms of the Weeping Lady charity house.", - district: "Six Towers", - traits: [ - "kind", - "patient", - "gracious" - ] - }, - { - name: "Maestro Helleren", - type: "npc", - description: "Senior composer and conductor of the Spiregarden Theater, premiere performance venue for the elite of the city.", - district: "Whitecrown", - traits: [ - "sincere", - "dramatic", - "vain" - ] - }, - { - name: "Hester Vale", - type: "npc", - description: 'Matriarch of the oldest farm family. The living embodiment of "tough but fair."', - district: "Barrowcleft", - traits: [ - "proud", - "fierce", - "suspicious" - ] - }, - { - name: "Commander Bowmore", - type: "npc", - description: "Chief Officer of the Watch in Brightstone. Bowmore's family financed Bowmore Bridge centuries ago and now holds many positions of power.", - district: "Brightstone", - traits: [ - "proud", - "principled", - "connected" - ] - }, - { - name: "Briggs", - type: "npc", - description: "The owner of a merchant stall at Charhollow market, cover for a network of gossips, spies, and code-smiths among the working class people of the district, selling their services to those who need them.", - district: "Charhollow", - traits: [ - "secretive", - "sneaky", - "cautious" - ] - }, - { - name: "Lord Penderyn", - type: "npc", - description: "Chief Scholar of the Archive of Echoes, authorized by the Emperor to keep a collection of ancient ghosts trapped in spirit bottles, to be consulted in cases where knowledge from the distant past would benefit the operation of the Imperial government. Lord Penderyn also consults the spirits on his own volition, forming the rebellious Path of Echoes society for other elites and nobles who seek communion with the spectral realm.", - district: "Charterhall", - traits: [ - "reckless", - "strange", - "obsessive" - ] - }, - { - name: "Belle Brogan", - type: "npc", - description: "A Skovlander factory worker who's been gaining popularity as a potential union organizer. It's only a matter of time before a factory boss tries make an example of her.", - district: "Coalridge", - traits: [ - "charming", - "confident", - "bold" - ] - }, - { - name: "Lewit, Jol, Myra, Reyf", - type: "npc", - description: "Bluecoat constables; run an extortion racket.", - district: "Crow's Foot", - traits: [ - "arrogant", - "vain", - "volatile" - ] - }, - { - name: "Tris", - type: "npc", - description: "A legendary tattooist who only inks those that have looked upon a leviathan and lived to tell the tale. Getting a tattoo from Tris is a rite of passage for everyone who hunts the demons of the void sea.", - district: "The Docks", - traits: [ - "artistic", - "popular", - "insightful" - ] - }, - { - name: "Vandra", - type: "npc", - description: "A deathlands scavenger that survived six runs and was pardoned. She knows the landscape beyond the barrier very well—but few can make sense of her haunted mumblings.", - district: "Dunslough", - traits: [ - "haunted", - "wise", - "daring" - ] - }, - { - name: "Leclure", - type: "npc", - description: "A purveyor of personal luxuries (soaps, hair oils, perfume, fine silks) who dabbles in fortune telling. Some say her that drowned lover is a ghost that whispers secrets in her ear.", - district: "Nightmarket", - traits: [ - "shrewd", - "tough", - "commanding" - ] - }, - { - name: "Helene", - type: "npc", - description: "The elegant and mysterious proprietor of the Silver Stag Casino. People say she would have been a queen of Severos had she lived in the old days before the Empire.", - district: "Silkshore", - traits: [ - "cultured", - "charming", - "secretive" - ] - }, - { - name: "Chef Roselle", - type: "npc", - description: "One of the best cooks in the city, still operating the legendary Golden Plum restaurant—worth the trip into the haunted streets of Six Towers.", - district: "Six Towers", - traits: [ - "creative", - "insightful", - "friendly" - ] - }, - { - name: "Lady Freyla", - type: "npc", - description: "Regarded by some as the finest sommelier in the Empire. She serves only the most deserving at the Emperor's Cask.", - district: "Whitecrown", - traits: [ - "erudite", - "cultured", - "charming" - ] - }, - { - name: "Mara Keel", - type: "npc", - description: "A former smuggler who's gone into hiding among the farm laborers of Barrowcleft.", - district: "Barrowcleft", - traits: [ - "quiet", - "secretive", - "patient" - ] - }, - { - name: "Rolan Wott", - type: "npc", - description: "An influential magistrate who handles property, endowments, and financial cases. Famous for his extravagant parties.", - district: "Brightstone", - traits: [ - "stylish", - "elitist", - "shrewd" - ] - }, - { - name: "Corben", - type: "npc", - description: "An ex-military Skovlander on the lam for crimes against the empire.", - district: "Charhollow", - traits: [ - "tough", - "reckless", - "candid" - ] - }, - { - name: "Hopper", - type: "npc", - description: 'A drug addict, whisper, and all-around weirdo who perches on rooftops in the district. Hopper claims to see "ghost rails" and "spirit trains" originating deep beneath Coalridge, stretching beyond the horizon.', - district: "Coalridge", - traits: [ - "weird", - "visionary", - "enthusiastic" - ] - }, - { - name: "Mardin Gull", - type: "npc", - description: "Owner and operator of the Leaky Bucket public house. Mardin was the leader of the Crows many years ago, before Roric and Lyssa, and now enjoys a comfortable retirement out of the scoundrel life.", - district: "Crow's Foot", - traits: [ - "charming", - "experienced", - "respected" - ] - }, - { - name: "Mordis", - type: "npc", - description: "A strange merchant which hides its true appearance beneath many layers of robes and hoods. Also fences occult and arcane stolen goods, no questions asked.", - district: "Nightmarket", - traits: [ - "secretive", - "insightful", - "arcane" - ] - }, - { - name: "Madame Tesslyn", - type: "npc", - description: "Operates the Red Lamp brothel, the oldest and most respected institution of its sort in the city.", - district: "Silkshore", - traits: [ - "confident", - "insightful", - "enthusiastic" - ] - }, - { - name: "Flint", - type: "npc", - description: "A spirit trafficker who trades out of a condemned manor house.", - district: "Six Towers", - traits: [ - "weird", - "calculating", - "suspicious" - ] - } - ], - Scores: [ - { - name: "Accidental Death", - category: "Secret Dirty Work", - desc: "Not only must the target die, the target must not know how death came. If by some misfortune the ghost of the victim is interrogated, it must not have any special knowledge. There is a ritual and an amulet for the assassins to ensure secrecy. No one living or dead can know who did this deed.", - narrative: "By the time the crew knows the job, there is a better than even chance their knowledge is too much risk and their employer plans to kill them. They might want some leverage." - }, - { - name: "Bayer's Train Heist", - category: "Misplaced Fortune", - desc: "Bayer was a rail jack fired for being drunk. Over years, he built a crew with one mission in mind--robbing a train. When lruvia completed negotiations with Akoros to buy an unprecedented mass of leviathan blood to pour into industrialization, Bayer's crew hit the train carrying the payment, sabotaging a bridge. Rescuers found the train in the canyon, but no gold--an impossible feat. Bayer's crew vanished.", - narrative: 'An Iruvian ingot stamped with the year "802" will attract attention.' - }, - { - name: "Bellweather Architectural Plans", - category: "Historical Curiosity", - desc: "The Duskwall Archives have the sanitized blueprints of the Bellweather Crematorium on file. The original plans were drawn by a Spirit Warden driven mad by an internal rift, so he haunted himself. He drew peculiar plans with occult underpinnings, and those original drawings were interpreted by architects.", - narrative: "Are there coded secrets in the original plans that reveal a repellant secret or ominous threat? Or are the plans the scribbling of a madman? Either way, some people would pay top coin to get a good look." - }, - { - name: "Book of Walls", - category: "Historical Curiosity", - desc: "Long ago, a nameless rogue cultivated a mass of bloodworms in a wall. He wrote a book with their blood. The words were nonsense, but strangely affecting; if the reader tuned in to them, and held the book, the reader could walk through a wall. Spirit Wardens ruined the book with holy smoke.", - narrative: "A legend, or is there truth to it? Walking through walls is a neat trick, and the book may hold the key to learning it. It is sought by a wide variety of the curious—scholars, collectors, and scoundrels." - }, - { - name: "Censer Mace of Udoch", - category: "Religious Object", - desc: "The head of this ornately carved mace opens on hinges so incense can be put inside to wisp as the mace swings. The haft has a recipe carved into it, instructions to make special incense out of bone and rare sap and unguents. If that incense bums in the mace, it can destroy ghosts or demons with a single hit.", - narrative: "This was a founding artifact of the Church of the Ecstasy of the Flesh. If it were returned, they would gain a fresh following from critics who feel the church cannot protect against supernatural threats." - }, - { - name: "Charter of Crows", - category: "Historical Curiosity", - desc: "This gauntlet is made out of crow beaks. Each beak is carved with arcane symbols. Consulting Whispers officially report it does not have any power in the Ghost Field. It was made by the Spirit Warden who first tamed the deathseeker crows; he claimed it was a treaty that guaranteed their service.", - narrative: "Spirit Wardens lost this gauntlet decades ago, but they want it back. The idea it is a treaty with the deathseeker crows is probably nonsense. They can't take that chance." - }, - { - name: "Combination Harpsichord", - category: "Weird Scholarship", - desc: 'TARNALI was a Whisper composer who built a special harpsichord. When two tones are played, often a third "ghost" tone can be heard. By attaching the tuning pegs to crystals and runes, Tarnali built a harpsichord that could interact with the Ghost Field through calculated progressions of played tones.', - narrative: "This effort is intensely interesting to those who want to find doors hidden in the Ghost Field, draw or repel what lurks Behind the Mirror, or develop more portable tonal energies for non-Whispers ." - }, - { - name: "Dyvik's Chaser Mask", - category: "Weird Artifact", - desc: "This silvery face mask has the word “Elekthiaron” etched along its inner edge. When the word is spoken, the personality of the one touching the mask is pulled into it. The personality that was in the mask goes in the body. If the one in the body doesn't touch the mask once a week, madness threatens.", - narrative: "Has someone been using the mask to pose as someone else? How long has that been going on? Is there someone in the mask that needs rescuing? Was the mask used to cheat biological death?" - }, - { - name: "Evardian's Song Folios", - category: "Weird Scholarship", - desc: 'Four leather-bound volumes, full of musical notation with heavily annotated margins. The "music" is supposed to be transcribed and translated leviathan song. Legend suggests if the music is played correctly, it can drive humans insane with visions of the demon-haunted deep.', - narrative: "Aristocrats will collect anything. Scholars go to great lengths for research material. Cultists may find religious significance in the folios. (Owning the folios is against the law.)" - }, - { - name: "Falheim's Prod", - category: "Historical Curiosity", - desc: "This ragged pole with a spear and a silver-cable loop was the first prototype of what became the lightning hook. It doesn't work very well, but it was the first historically known charged object that could consistently interact with the Ghost Field.", - narrative: "Apparently this bit of history is an important prestige piece in the turbulent intrigues of a number of underground cults led by Whispers. The city government would also like to display it in a museum." - }, - { - name: "Fang of Ibiria", - category: "Religious Object", - desc: "This brutal stiletto has a green stone in the pommel, and a runic symbol on the blade. The blade transforms electroplasm into a mutagen. The longer the blade is in a victim, the more monstrous the victim becomes. A cut gives nightmares, minutes give mutations, hours or days create a real monster.", - narrative: "Cultists want this blade so they can make or become monsters." - }, - { - name: "Goblet of Eletrachtian", - category: "Weird Artifact", - desc: "The silver and gold cup is big enough to hold with two hands, crusted with obsidian stones. The owner puts a drop of a demon's blood in the goblet with certain other liquids, and conducts a ritual. For days afterwards (maybe longer) the owner can see anything the demon uses remote vision to view, just by watching the surface's illusory reflections.", - narrative: "There are many legends about the creation of the goblet, and the fate of the Whisper who first energized it. Rumor suggests the Duskwall Council entrusted the goblet to a certain family for safekeeping." - }, - { - name: "Hollow Shroud", - category: "Religious Object", - desc: "The Church of the Ecstasy of the Flesh clergy wrapped the funeral shroud around a heretic, then conducted a ritual that severed the heretic's connection to the body, cutting the spirit loose as a ghost. The shroud transferred the spirit of a faithful but sickly member into the heretic's body. New life!", - narrative: "The Shroud was stolen almost twenty years ago, and rumors suggest it has been used in debased rituals to summon demons or enflesh echoes of the Forgotten Gods." - }, - { - name: "Idol of the Sleeping Lion", - category: "Religious Object", - desc: "The hefty iron statue depicts a devilfish-headed humanoid, cloaked in wings. Its presence influences human dreams, so they drift through the ink-black sea but can perceive their surroundings. Sacrificing to the statue gives a cultist a cosmic infection, involving psychic ability and mutations.", - narrative: "The statue has been retrieved by officers of the law several times, and destroyed several times more. Again and again, it emerges in the heart of fresh tragedy, baleful and singular." - }, - { - name: "Ink Fleece", - category: "Family Heirloom", - desc: "Long ago, Captain Manarill claimed he could prove that leviathans had fur, or fleece. He brought back a swatch of curling fur as big as a bedspread. He claimed to have harvested it from a leviathan's skin. The mantle served as a symbol of the Manarill family's heritage of exploration and danger. But it was stolen.", - narrative: "Does it do more than represent heritage? What dreams might one have while wrapped in it? Might a wealthy Whisper pay more for it than the family that owned it? Who took it?" - }, - { - name: "Kasavaraya Tea Set", - category: "Family Heirloom", - desc: "When the Immortal Emperor visited Akoros four centuries ago, he used this tea set with the patriarch of the Kasavaraya family. They are still one of the most decorated and entrenched military families in Duskwall. Their tea set is a symbol of Duskwall's prominence. However, a saucer and a cup are missing.", - narrative: "This stuff is priceless, literally, so negotiating a price for its return is tricky. If you could find the missing pieces, or forge them adequately, they would be great hostages to ajfed the family's behavior." - }, - { - name: "Kidnap The Heir", - category: "Secret Dirty Work", - desc: "People are keys that fit into estate locks. They can be turned to open the way to lots of money. You might be taking a child to ransom back to the guardian, or you might be getting someone out of the way so a more distant heir can inherit. This is about controlling where the money goes.", - narrative: "How harsh does the employer want this to be? Kid gloves treatment, or is the plan to kill the heir when it is all over? How much input will the employer accept from the hired help? Is the plan already in place?" - }, - { - name: "Krogs Broken Heart", - category: "Misplaced Fortune", - desc: "Krog was a savage from the Dagger Isles, pressed into service on a hunting ship. He eventually owned a small fleet. He was old when he fell in love with a young woman who robbed him. Heartbroken, he took the rest of his treasure aboard his last hunting ship, Heartsong, and scuttled her in the harbor.", - narrative: "Whispers like to brag they found a way under the waves to find the wealth. Gracmaas the Pirate claimed to have recovered it all to his hidden lair—before he was killed." - }, - { - name: "Limptwitch's Stash", - category: "Misplaced Fortune", - desc: "Limptwitch was a Whisper who interrogated ghosts to find the location of hidden treasure. He was famous for his Grotto, the place where he stored all his salvaged wealth. Many factions tried to get his treasure, but he never gave up the secret. Then he was jailed and hanged. The Grotto was never found.", - narrative: "Did a cellmate in prison hear muttered hints as to its location? Maybe a Whisper has clues based on where he left his mark in the sewers. Has someone finally found a real lead?" - }, - { - name: "Mark of the Void", - category: "Religious Object", - desc: "It is an eerie black disk of leviathan bone, about the size of a dinner plate but five times as thick. The bone is carved with a strange circular pattern with rays cutting through it. The primitive artwork was polished, and silver inlaid in the pattern, by a decadent nobleman.", - narrative: "Impressionable people admit the disk whispers to them, they hear the Back of the Mirror when it the disk is near. Many cults see this disk as a conduit to clearer communication with their supernatural patrons." - }, - { - name: "Naladicha's Cartography", - category: "Historical Curiosity", - desc: "The famous cartographer Naladicha died, and his ghost was woven into a spirit anchor connected to a pen on a wire. The drooping pen scribbled nonstop, dipping to indicate a page turn. Two books were filled with scribbles before the pen stilled. These lines and shapes may be maps of the Ghost Field.", - narrative: "One consulting Whisper reported that when she attuned to the books using an expensive and difficult ritual, the maps became luminous and four dimensional, revealing lost secrets in Duskwall." - }, - { - name: "Norscye's Lament", - category: "Famous Jewel", - desc: "This ruby has been set in a series of weapons for the last three centuries. One estimate was that the gem had participated in upwards of a thousand deaths. Legend suggests that the ruby can hold a single ghost, surviving the destruction of the body, bound to the gem until it chooses another guest.", - narrative: "While the gemstone is priceless because of its unnatural clarity, it is also possible that an important ghost might be inside, and might choose to speak to a Whisper or a blood relative." - }, - { - name: "Orb Of Sellivas", - category: "Weird Artifact", - desc: "This fist-sized golden orb tunes to one bearer at a time, though it may respond to others. If commanded, it can release a steady light that radiates in the material world and the Ghost Field, revealing what is hidden. The radiation can also draw or repel ghosts and demons.", - narrative: 'The Sellivas order of witches wrote their research journals in an ink that can only be read by the light of the Orb. If someone had the Orb and the "blank" book, they could crack ancient secrets.' - }, - { - name: "Plant Evidence", - category: "Secret Dirty Work", - desc: "Someone needs to be found guilty of doing something. For that to work out, you need evidence, put in the wrong place at the wrong time. To manage that, you need proper scoundrels.", - narrative: "Do you know what the target will be accused of doing? Are you to lead the authorities to the evidence? Must someone be seduced before a hidden witness? Are the scoundrels making evidence, or using what they're given? What if they could do better? Must the evidence fool a court, or a powerful individual?" - }, - { - name: "Plasmic Blade Flail", - category: "Weird Artifact", - desc: "This weapon can slay ghosts and demons. It appears to be a gladius stitched with runes. Once the bearer attunes to the weapon, it can disconnect into vertebrate-like wedges connected by a steely central cable. The blade-whip is flexible and simmering with energy. It can reform into a straight blade at will.", - narrative: "Only five of these flails ever existed. One is carried by the Spirit Warden assigned to the Immortal Emperor's defense. The rest are the stuff of legends." - }, - { - name: "Remote Writer", - category: "Weird Artifact", - desc: "This little book has a peculiar occult symbol on the cover. If an object is placed between the covers for a full 24 hours, then the book will transcribe any conversation happening in earshot of the object until reset. When the book reaches the end, the writing starts over on the first page, clearing pages as it goes.", - narrative: "The book provides remote reading, eavesdropping of a sort. A target's favorite pen or lucky coin can become the broadcaster, and determined spies can copy the magic book writing so they don't lose it." - }, - { - name: "Rylaria's Shield", - category: "Family Heirloom", - desc: "Rylaria Graefwold was a soldier who gained title and wealth. She wrote her life's story on the back of the shield she used to save a general. Later generations added to the family story. The shield represents the family's honor. It was lost at sea when their first leviathan hunting ship was wrecked. Or was it?", - narrative: "Now the family is wealthy, and this artifact would be important to them. Does it have a secret in code?" - }, - { - name: "Skovlan Scrip", - category: "Misplaced Fortune", - desc: "A dense lockbox filled with paper money issued by the Akorosian government to pay soldiers quelling the Skovlander Insurrection. The scrip can be exchanged for coins or services in Duskwall. Scrip is basically untraceable.", - narrative: "Some of the military supply that got lost during the war. Does the stashs location implicate a corrupt official or other thief?" - }, - { - name: "Sonurian Ghost Key", - category: "Family Heirloom", - desc: "The Sonuria family had mansions in the area that is now the Seven Shallows slum. They created a vault for the protected dead, and for their mundane treasures. The only way in is for a family member to present the Sonurian Ghost Key before the hidden location of the vault in the Ghost Field. The key has been lost for decades.", - narrative: "That key could be hidden anywhere. If it were found, either a family member could be recruited to open the door, or the key could be sold to the family. What does the key look like? What is inside the vault?" - }, - { - name: "Soultrap Carnelian", - category: "Famous Jewel", - desc: "This semi-precious stone was carved by the Whisper Ichralia. She suffocated people with hot wax and bound their fresh ghosts in wax seals on scrolls or letters with the Soultrap. When the seal was broken, the insane ghost attacked the opener and anyone nearby.", - narrative: "The Spirit Wardens destroyed this object decades ago. Didn't they? Maybe someone else made another one, or maybe the original survived." - }, - { - name: "Steal Blackmail", - category: "Secret Dirty Work", - desc: "Secrets must be protected. If they come out, people can get hurt, ruined, killed, and so on. You are hired to adjust the circle of people who can prove something. Will it be bigger? Or smaller?", - narrative: "Do you know what information you're after, or is that secret from you? If you have a chance, will you peek at it? Are you targeting a blackmailer to remove their hold, or getting evidence to give a blackmailer? Is the evidence to be destroyed? Do you plan to do as you are told?" - }, - { - name: "Terrorize", - category: "Secret Dirty Work", - desc: "People can be stubborn, to the point where only fear can unseat their decision. Maybe they feel independent and need to reminded that they need protection. Maybe they feel safe and need to be reminded they are not untouchable.", - narrative: "Are you supposed to be someone in particular, like a random street thug or rival's employee or bluecoat? How far can the terror go? Do you need to trash a home, or maybe converse with a loved one?" - }, - { - name: "The Emerald Well", - category: "Famous Jewel", - desc: "This depthless gem is a chilly pinhole between the material world and the Ghost Field. It provides energy to Whispers and attracts ghosts. The Emerald Well was protected by the Church of the Ecstasy of the Flesh, but a thief stole it decades ago. It is a hotspot for supernatural activity. Disaster flows in its wake.", - narrative: "This is one of the few objects pursued by demons, Whispers, inspectors, clergy, and collectors. Scholars suggest demons may be able to turn it inside out, creating a fresh gate to incarnate more demons." - }, - { - name: "The Hellwhisper Ring", - category: "Weird Scholarship", - desc: `The ring is made of tiny bits of bone wired together. It must be worn for at least a day per year of the bearer's life before it begins to work. When placed on a source of information, the ring sifts it until the ring speaks the information's "language." The bearer can see through riddles, read arcane texts, and break code with ease.`, - narrative: "Legend says 32 demons voluntarily gave some of their bone to be part of this ring, and it was released among humans to cause chaos through greater understanding." - }, - { - name: "The Helsman Inheritance", - category: "Misplaced Fortune", - desc: "The final will and testament of the clan's patriarch included a 24 hour locked-house condition. Survivors would split the inheritance. Darayl Helsman left the house at the end of the time with a small bag. Explorers found nothing but corpses in the house, the inheritance was gone. Darayl was found dead the next day, the bag gone. The city locked the house and guards against trespassers.", - narrative: "Surely Darayl hid the inheritance in the Ghost Field. Find the ghost key and lock in the house, and get it all! Or, did someone else already get it?" - }, - { - name: "The Key Lens", - category: "Weird Scholarship", - desc: 'The round frame has forty special lenses hinged on its rim. The lenses can layer over each other, flip out past the frame, rotate to take advantage of the angles inside the ground crystal, and take translucent colored filters. Their inventor, VLAS HALDAK, said he had found "the key." He died of shock, the lens on his work table.', - narrative: "Legends vary. It can see into the Ghost Field, it can see into people, it allows reading demonic texts, it can see the way into ghost neighborhoods, etc. Needs a Whisper to use properly." - }, - { - name: "The Leviathan's Eye", - category: "Famous Jewel", - desc: "This sapphire turns impossibly black if dipped in leviathan blood. If the still-bloody stone is pressed against a seer's forehead, the sensitive can see what the ocean sees, looking above the waves or probing the deeps. The gem used to be passed around between leviathan hunter captains, but has since been lost.", - narrative: "One expert said using the Eye was as close as a human could get to a demon seeing through its elemental affinity, and that it began a slow change in the individual who was exposed to its power." - }, - { - name: "The Tabissera Diary", - category: "Weird Scholarship", - desc: "Warden Khalana Uress was the Head Confessor of the Spirit Wardens. She recorded secrets that were only for the use of the order using a book code, coordinates that pointed to words in a specific book. Without that book, the code cannot be cracked. Daring thieves took the book, then lost it.", - narrative: "Fakes come on the market all the time. Only the Spirit Warden leadership know what the book looked like, and they aren't telling. What is the Diary about?" - }, - { - name: "The Thousand Facet Diamond", - category: "Famous Jewel", - desc: "This gem is the elegant centerpiece on the back of a peculiar clockwork gauntlet. A seer can use the gauntlet to travel into the Ghost Field while retaining physical presence, or possibly even other dimensions. Each use burns out some of the diamond facets. The device is reported to have a mind of its own.", - narrative: "Ever since its theft from the Adelairde family, the gauntlet has surfaced only in rumors of especially daring heists or mind-shattering experiments." - }, - { - name: "Whitecrown Signet Ring", - category: "Family Heirloom", - desc: "The Whitecrown family schismed in the wake of the theft of the matriarch's signet ring over two centuries ago. They fell from being players in the intrigues around the throne to bickering over dwindling family holdings. Their wealth and influence is low, but not beyond recall.", - narrative: "If the ring resurfaced, elements of the feud might put aside their differences and reunite. Besides, legends suggest a ghost matriarch is bound to the ring, and she knows their secrets." - } - ] - } -}, hu = { - 1: { - height: 836, - width: 230, - paths: [ - "M217.017,123.52c-1.6-0.8-2.84-1.44-4.1-2.04c-1.12-0.53-2.26-1.04-3.42-1.51 c-1.05-0.43-2.18-0.68-3.18-1.19c-0.89-0.45-1.23-1.23-1.2-2.36c0.09-4.48-0.07-8.97,0.05-13.45c0.08-3.31-0.83-6.47-1.14-9.72 c-0.01-0.14-0.09-0.28-0.14-0.42c-0.57-2.01-1.2-4.01-1.69-6.04c-0.45-1.85-0.75-3.74-1.11-5.61 c-0.012-0.043-0.023-0.085-0.035-0.127c-0.6-1.69-1.348-3.353-1.825-5.083c-0.46-1.66-0.68-3.38-1.03-5.07 c-0.04-0.24-0.16-0.47-0.25-0.7c-0.49-1.32-0.98-2.65-1.47-3.97c-0.55-1.44-0.93-2.97-1.69-4.28c-0.79-1.35-0.65-3.03,0.61-4.19 c0.43-0.39,0.85-0.85,1.08-1.36c0.57-1.3,1.35-2.62,1.44-3.97c0.08-1.11-0.46-3.08-1.14-3.29c-1.58-0.47-3.49-0.42-5.1,0.03 c-1.41,0.4-2.59,1.63-4.07,2.62c-1.15-1.18-2.43-2.41-3.6-3.75c-0.41-0.47-0.43-1.29-0.82-1.78c-0.67-0.84-1.56-1.5-2.23-2.33 c-0.18-0.22-0.08-0.9,0.13-1.16c0.85-1.02,1.78-1.97,2.71-2.92c2.18-2.22,4.37-4.45,6.57-6.65c0.85-0.86,1.78-1.64,2.63-2.5 c1.16-1.17,2.38-2.29,3.37-3.59c0.66-0.88,0.89-2.07,1.42-3.06c0.86-1.63,0.01-3.02-0.68-4.31c-0.23-0.43-1.4-0.4-2.15-0.48 c-0.69-0.08-1.4,0.02-2.09-0.02c-1.71-0.11-3.14,0.17-4.52,1.47c-1.22,1.14-2.96,1.74-4.44,2.62c-0.98,0.59-1.89,1.31-2.88,1.88 c-2.02,1.17-4.2,2.11-6.07,3.47c-1.12,0.81-2.16,1.18-3.49,1.4c-1.28,0.22-2.44,1.1-3.7,1.59c-0.58,0.23-1.72,0.49-1.82,0.3 c-0.91-1.63-2.75-1.79-4.03-2.77c-0.33-0.25-0.58-0.62-0.93-0.82c-1.11-0.64-2.26-1.22-3.38-1.85c-1.48-0.83-2.94-1.7-4.42-2.53 c-0.93-0.53-1.83-1.24-2.84-1.5c-1.37-0.35-2.24-1.96-3.89-1.5c-0.08,0.03-0.19-0.02-0.29-0.04c-1.97-0.58-3.94-1.16-5.91-1.73 c-0.28-0.08-0.76-0.02-0.84-0.18c-0.89-1.7-2.8-1.2-4.1-1.6c-2.83-0.87-5.94-0.87-8.94-1.22c-0.39-0.04-1.05,0.06-1.14-0.13 c-0.79-1.56-2.21-1.01-3.4-1.05c-2.09-0.08-2.68-0.62-2.72-2.65c-0.01-0.84-0.1-1.69-0.24-2.51c-0.16-0.88-0.54-1.72-0.62-2.59 c-0.13-1.24-0.03-2.49-0.11-3.73c-0.06-0.88-0.61-1.45-1.5-1.13c-0.79,0.28-1.59,0.72-2.21,1.28c-1.48,1.36-2.85,2.84-4.29,4.25 c-1.1,1.08-2.08,2.06-3.81,2.55c-1.54,0.44-2.99,1.69-4.63,2.42c-1.79,0.8-3.28,2.25-5.44,2.13c-0.44-0.02-1.16-0.02-1.28,0.22 c-0.7,1.36-1.94,0.82-2.98,0.97c-0.49,0.07-0.99,0.11-1.47,0.24c-1.92,0.49-3.84,0.98-5.75,1.52c-1.74,0.49-3.51,0.95-5.19,1.61 c-1.92,0.74-3.67,1.99-5.63,2.46c-1.64,0.38-3.01,1.13-4.51,1.72c-0.99,0.39-2.52,0.38-3.43-0.13c-1.93-1.09-4.28-1.09-6.03-2.54 c-0.22-0.19-0.67-0.12-1.02-0.13c-0.9-0.02-1.79-0.02-2.69-0.02c-1.37,0.01-2.19,0.72-2.36,2.15c-0.09,0.78-0.06,1.59-0.09,2.38 c-0.01,0.35,0.11,0.87-0.06,1.02c-1.68,1.35-0.89,3.24-1.18,4.9c-0.16,0.88-0.56,1.8-1.1,2.51c-0.75,0.99-1.76,1.79-2.61,2.72 c-1.02,1.1-1.99,2.26-2.99,3.39c-1.49,1.67-2.96,3.37-4.5,5c-1.36,1.45-2.81,2.83-4.2,4.25c-0.16,0.17-0.19,0.46-0.31,0.67 c-0.74,1.29-1.39,2.64-2.25,3.84c-0.89,1.25-2.63,1.86-2.72,3.75c-0.02,0.38-0.57,0.73-0.86,1.11c-0.37,0.49-0.79,0.96-1.07,1.5 c-0.73,1.39-1.26,2.89-2.1,4.21c-1.08,1.71-2.25,3.34-2.65,5.38c-0.07,0.32-0.39,0.6-0.57,0.91c-0.21,0.34-0.45,0.67-0.59,1.05 c-0.43,1.21-0.72,2.48-1.24,3.65c-0.79,1.76-1.75,3.45-2.6,5.19c-1.27,2.6-2.74,5.13-3.69,7.85c-0.5,1.45-0.18,3.23-0.08,4.85 c0.05,0.7,0.68,1.37,0.69,2.06c0.06,6.07,0.06,12.15,0.01,18.23c0,0.71-0.37,1.44-0.63,2.13c-0.35,0.95-1.04,1.85-1.09,2.8 c-0.07,1.31-1.04,1.92-1.62,2.82c-0.91,1.43-2.71,1.9-3.59,3.51c-1.01,1.85-0.94,3.91,0.46,5.41c1.17,1.24,2.59,0.75,3.93,0.97 c1.41,0.22,3.01,0.26,4.12,0.99c1.11,0.74,1.87,2.16,2.5,3.43c0.77,1.56,1.35,3.24,1.8,4.92c0.67,2.5,0.94,5.12,2.32,7.4 c0.56,0.92,1.03,1.9,1.52,2.87c0.51,1.03,0.96,2.09,1.48,3.11c0.56,1.09,1.13,2.18,1.77,3.22c0.29,0.48,0.84,0.8,1.16,1.26 c0.61,0.87,1.11,1.82,1.71,2.69c0.32,0.47,0.83,0.81,1.16,1.27c0.93,1.3,1.79,2.65,2.73,3.95c0.31,0.43,0.83,0.69,1.15,1.11 c0.52,0.69,0.89,1.51,1.44,2.16c0.41,0.48,1.1,0.72,1.54,1.18c1.57,1.66,3,3.46,4.65,5.03c1.3,1.26,2.91,2.18,4.25,3.4 c1.99,1.84,3.82,3.85,5.81,5.7c0.51,0.47,1.42,0.47,1.99,0.9c0.95,0.71,1.78,1.59,2.88,2.59c-0.72,0.66-1.63,1.5-2.55,2.33 c-0.78,0.7-1.61,1.34-2.34,2.07c-1.54,1.55-3.05,3.13-4.54,4.73c-1.24,1.32-2.6,2.56-3.6,4.05c-0.6,0.91-1.1,1.85-1.89,2.63 c-1.23,1.21-1.21,4.03,0.24,4.66c1.03,0.45,2.61,0.53,3.57,0.03c1.41-0.72,2.76-0.5,4.14-0.57c1.93-0.09,3.89,0.02,5.8-0.21 c1.19-0.14,2.33-0.75,3.46-1.2c0.49-0.19,0.89-0.6,1.38-0.76c0.46-0.16,1.13,0.06,1.45-0.21c2.19-1.82,5.18-1.79,7.53-3.48 c1.41-1.01,3.25-2.21,5.36-2.06c0.28,0.02,0.58-0.29,0.88-0.44c0.42-0.22,0.85-0.61,1.29-0.62c3.43-0.04,6.86,0,10.3,0.03 c0.38,0,0.99-0.01,1.11,0.21c0.64,1.13,1.69,0.85,2.63,0.91c1.1,0.06,2.24-0.13,3.27,0.14c2.96,0.79,5.9,1.59,9,1.58 c6.02-0.03,12.05,0.27,18.01-0.93c0.82-0.17,1.69-0.08,2.52-0.24c1.04-0.2,2.05-0.52,3.14-0.81c0.13,0.6,0.21,0.79,0.21,0.98 c0.01,8.226,0.03,16.462,0.01,24.699c-0.001,0.368-0.217,0.882-0.515,1.099c-0.676,0.493-1.572,0.71-2.176,1.273 c-1.37,1.26-2.6,2.68-3.92,4c-0.73,0.73-1.61,1.32-2.31,2.08c-0.98,1.06-0.96,2.42-0.9,3.78c0.07,1.95,0.64,2.62,2.59,2.67 c1.712,0.061,3.434,0.019,5.146,0.03c1.112,0.007,2.014,0.908,2.024,2.02c0.06,6.72,0.08,13.44,0.15,20.16 c0.019,1.205-0.537,1.936-1.437,2.533c-0.23,0.153-0.451,0.318-0.644,0.516c-1.605,1.643-3.165,3.308-4.789,4.931 c-0.63,0.64-1.57,1.05-2.01,1.79c-1.29,2.14-3.22,3.55-5.3,4.69c-2.51,1.38-2.76,1.58-2.61,4.33c0.09,1.65,1.84,3.48,3.41,3.17 c1.82-0.35,3.74-0.85,5.26-1.85c0.77-0.51,1.38-0.68,2.16-0.71c0.95-0.04,1.9-0.01,2.84-0.01c2.59,0.01,3.03,0.46,3.03,3.1 c-0.01,31.18-0.02,62.36-0.04,93.55c0,2.88-0.13,5.78,0.03,8.66c0.16,2.8,0.67,5.58,0.91,8.39c0.15,1.83,0.08,3.68,0.15,5.52 c0.02,0.42,0.14,0.85,0.29,1.25c0.23,0.58,0.66,1.12,0.75,1.72c0.13,0.93-0.34,2.21,0.13,2.78c1.82,2.18-0.35,4.04-0.21,6.04 c0.01,0.2-0.21,0.41-0.31,0.62c-0.53,1.08-1.43,2.14-1.49,3.24c-0.21,4.27-0.19,8.56-0.19,12.84 c-0.01,51.9,0.01,103.81-0.05,155.71c0,4.36-0.54,8.71-0.84,13.06c-0.03,0.34-0.19,0.66-0.31,0.98c-0.25,0.69-0.73,1.36-0.74,2.05 c-0.12,5.68-0.07,11.36-0.23,17.03c-0.11,3.65-0.78,7.31-0.68,10.95c0.12,4.59-0.27,9.16,0.58,13.82 c0.85,4.63,0.19,9.53,0.21,14.31c0.01,1-0.27,2.32,0.24,2.92c1.2,1.39,0.69,2.89,0.79,4.35c0.03,0.33-0.22,0.7-0.37,1.03 c-0.25,0.55-0.55,1.06-0.76,1.62c-0.17,0.44-0.2,0.93-0.36,1.38c-0.47,1.36-0.97,2.72-1.45,4.08c-0.11,0.31-0.11,0.7-0.3,0.94 c-1.58,2-2.33,4.36-2.52,6.8c-0.23,3.07-0.06,6.17-0.08,9.26c-0.02,3.62,0.05,7.24,0.93,10.78c0.07,0.3,0.39,0.56,0.42,0.86 c0.13,1.29,0.2,2.59,0.29,3.88c-0.91,0.05-1.84,0.23-2.72,0.09c-0.66-0.1-1.24-0.71-1.91-0.9c-1.83-0.53-3.81,1.69-3.74,3.17 c0.1,2.16,0.3,4.33,1.59,6.15c1.14,1.6,2.44,3.09,3.73,4.57c1.18,1.36,2.64,2.45,2.25,4.66c-0.47,2.6-0.66,5.25-1.01,8.26 c-4.52,0.25-8.9,0.65-13.3,0.72c-8.65,0.13-17.32,0.08-25.98,0.13c-0.58,0-1.24-0.02-1.74,0.22c-1.03,0.49-1.92,1.28-2.97,1.7 c-1.85,0.75-3.77,1.31-5.65,1.96c-0.22,0.07-0.42,0.22-0.63,0.32c-1.16,0.57-2.28,1.38-3.51,1.64c-1.03,0.21-1.79,0.61-2.49,1.28 c-0.2,0.19-0.4,0.5-0.62,0.51c-1.14,0.08-2.03,0.39-2.85,1.34c-0.63,0.73-1.75,1.04-2.67,1.49c-1.72,0.84-3.48,1.61-5.18,2.49 c-1.48,0.77-3.04,1.49-4.33,2.53c-1.49,1.21-2.68,2.8-4.09,4.14c-0.84,0.79-1.75,1.75-2.79,2.02c-1.46,0.39-2.97,0.34-4.52,0.83 c-2.05,0.64-4.39,0.08-6.57,0.95c-1.38,0.54-3.25-0.48-4.4,1.21c-0.07,0.1-0.38,0.03-0.58,0.05c-2.5,0.25-4.95-0.04-7.53,0.73 c-3.19,0.97-6.74,0.74-10.14,1.08c-0.59,0.06-1.36,0.23-1.7,0.63c-0.83,1.02-0.42,3.75,0.69,4.4c0.91,0.54,2,0.82,3.05,1.07 c0.66,0.15,1.4-0.06,2.08,0.05c1.68,0.29,3.67-0.91,5.01,1.05c0.07,0.1,0.38,0.06,0.58,0.07c4.87,0.2,9.72,0.09,14.61,0.8 c4.38,0.64,8.94-0.01,13.42,0.18c3.03,0.13,5.86-0.88,8.82-1.09c0.14-0.01,0.35-0.06,0.4-0.15c0.61-1.3,1.84-0.85,2.85-1.06 c0.57-0.11,1.2-0.3,1.65-0.65c0.83-0.64,1.45-1.63,2.35-2.1c2.5-1.32,4.56-3.31,7.19-4.45c1-0.43,1.58-0.43,2.51,0.04 c0.62,0.31,1.68,0.25,2.33-0.08c1.06-0.53,1.88-0.64,2.74,0.22c0.76,0.76,1.53,1.51,2.34,2.23c1.14,1.02,2.41,1.91,3.46,3.02 c1.04,1.08,1.85,2.38,2.78,3.56c1.11,1.4,4.49,1.72,5.94,0.58c1.29-1.01,1.57-2.52,1.85-3.97c0.24-1.24,0.03-2.49,0.68-3.78 c0.9-1.75,1.39-2.39,3.41-2.36c2.29,0.02,4.58,0.1,6.87,0.11c1.04,0.01,1.62,0.52,1.84,1.5c0.31,1.31,0.45,2.68,0.96,3.9 c0.36,0.85,1.11,1.71,1.91,2.16c1.23,0.7,4.69-0.66,5.09-2.01c0.53-1.73,1.15-3.6,1-5.35c-0.24-2.82,1.44-4.54,2.89-6.43 c0.3-0.39,1.44-0.68,1.72-0.45c1.45,1.23,3.45,2.17,3.18,4.62c-0.06,0.64,0.09,1.3,0.02,1.94c-0.31,3.01-0.68,6.01-0.98,9.02 c-0.08,0.86-0.01,1.74-0.01,2.77c1.08-0.07,1.88-0.05,2.64-0.18c1.12-0.2,2.2-0.62,3.32-0.73c1.38-0.13,2.78-0.05,4.18-0.04 c1.86,0.01,2.13,0.24,1.82,2.07c-0.17,1-0.42,2.39-1.12,2.8c-1.1,0.65-0.86,1.44-0.87,2.24c-0.05,2.1-0.03,4.19-0.01,6.28 c0.01,0.44,0,1.19,0.2,1.26c1.41,0.53,0.81,1.71,0.98,2.64c0.17,0.9,0.34,1.81,0.64,2.66c0.39,1.08-0.23,3.51-1.19,3.75 c-1.67,0.43-3.39,0.66-5.09,0.99c-1.84,0.36-3.67,0.72-5.5,1.11c-0.22,0.05-0.4,0.28-0.61,0.39c-0.43,0.23-0.85,0.56-1.3,0.63 c-0.594,0.081-1.208,0.05-1.82,0.036c-1.386-0.033-2.643-0.905-3.075-2.222c-0.613-1.87-0.822-3.704-0.936-5.614 c-0.03-0.33-0.6-0.59-0.79-0.96c-0.43-0.85-1.13-1.77-1.07-2.62c0.07-0.98,1.05-1.44,2.19-1.38c0.81,0.04,1.64-0.21,2.44-0.43 c0.59-0.16,1.12-0.55,1.72-0.69c0.52-0.12,1.09-0.06,1.63-0.02c1.25,0.08,1.8-0.43,1.76-1.72c-0.05-1.89,0.01-3.78-0.01-5.68 c-0.01-1.66-0.83-2.55-2.56-2.57c-3.84-0.04-7.67-0.02-11.5,0.02c-1.16,0.01-1.74,0.7-1.85,1.83c-0.05,0.54-0.08,1.09-0.24,1.6 c-0.48,1.6-1.38,3.17-1.45,4.78c-0.08,1.83-0.74,3.01-2.08,4.1c-0.83,0.67-1.56,0.79-2.23,0.04c-1.08-1.22-2.09-2.51-3.04-3.83 c-1.06-1.48-1.88-3.17-3.08-4.51c-0.91-1.03-1.92-2.41-3.7-1.84c-0.51,0.17-0.93,0.69-1.44,0.79c-2.58,0.46-4.33,2.33-6.35,3.7 c-2.13,1.45-4.2,2.53-6.93,2.33c-3.17-0.24-6.37-0.07-9.55-0.09c-0.4,0-0.93,0.1-1.16-0.1c-1.75-1.51-4.32-2.07-5.29-4.5 c-0.06-0.13-0.33-0.24-0.5-0.25c-2.1-0.1-3.95-1.56-6.16-1.07c-0.31,0.07-0.68-0.08-1.02-0.17c-0.9-0.25-1.8-0.73-2.71-0.75 c-4.62-0.08-9.25-0.03-13.88-0.05c-0.46,0-0.94-0.13-1.38-0.29c-0.63-0.24-1.23-0.8-1.85-0.81c-6.97-0.06-13.94-0.01-20.91-0.06 c-1.47-0.01-2.4,0.9-3.11,1.81c-1.58,2.02,0.43,5.8,3.19,6.29c1.71,0.31,3.41,0.64,5.12,0.96c0.19,0.04,0.49,0.05,0.55,0.17 c0.65,1.18,1.78,0.83,2.77,0.94c2.9,0.31,5.78,0.66,8.67,1c0.103,0.019,0.206,0.038,0.308,0.057c2.154,0.545,4.296,1.193,6.481,1.6 c1.241,0.232,2.507,0.15,3.769,0.183c0.284,0.007,0.568,0.119,0.821,0.24c0.62,0.28,1.22,0.6,1.83,0.9 c1.33,0.65,2.68,1.25,3.98,1.96c0.4,0.22,0.6,0.76,0.96,1.06c1.45,1.23,2.93,2.41,4.37,3.64c0.97,0.82,1.92,1.67,2.84,2.54 c1.98,1.86,3.98,3.71,5.89,5.64c1.72,1.72,3.46,3.45,4.97,5.36c1.54,1.93,3.34,2.52,5.79,2.51c18.47-0.08,36.94-0.01,55.4,0.02 c2.17,0,4.19,0.14,5.7-2.14c1.09-1.64,2.99-2.73,4.39-4.2c0.74-0.77,1.1-1.87,1.77-2.73c0.68-0.88,1.47-1.69,2.3-2.45 c1.56-1.45,2.81-3.12,3.91-4.94c0.46-0.76,1.51-1.22,1.86-2.01c0.76-1.74,1.56-3.38,3.08-4.61c0.42-0.34,0.88-0.97,0.86-1.44 c-0.08-1.47,0.99-2.28,1.57-3.39c0.75-1.42,1.61-2.73,1.52-4.59c-0.21-4.42-0.08-8.86-0.05-13.29c0-0.61,0.19-1.23,0.35-1.83 c0.14-0.49,0.55-0.98,0.49-1.43c-0.39-3,0.95-5.77,1.1-8.7c0.01-0.2,0.23-0.39,0.34-0.59c0.26-0.47,0.56-0.92,0.78-1.41 c0.59-1.37,1.1-2.77,1.75-4.11c0.19-0.39,0.85-0.54,1.1-0.93c1.25-1.87,2.56-3.71,3.58-5.7c0.73-1.41,1.8-2.83,1.37-4.6 c-0.1-0.41-0.44-1.03-0.73-1.07c-2.3-0.28-4.43-1.46-6.87-1.09c-1.41,0.21-2.88,0.03-4.32,0.03c-2.22,0-2.56-0.51-2.76-2.74 c-0.2-2.19,1.03-4.66-1.1-6.53c-0.08-0.07-0.02-0.29-0.04-0.44c-0.26-2.65,0.17-5.27-0.75-7.99c-0.82-2.44,0.02-5.23-0.93-7.92 c-0.87-2.51,0.15-5.31-1.06-8.11c-1.14-2.64-0.76-5.92-1.16-8.91c-0.31-2.31,0.38-4.77-0.96-6.94c-0.31-0.5-0.91-0.93-1-1.46 c-0.41-2.24-0.68-4.5-1.01-6.76c-0.32-2.2-0.65-4.4-0.99-6.6c-0.03-0.19-0.09-0.47-0.23-0.53c-1.21-0.55-0.86-1.61-0.88-2.55 c-0.25-12.95,0.26-25.89-0.76-38.84c-0.645-8.159-0.207-16.407-0.21-24.606c0-0.326,0.03-0.655,0.132-0.964 c0.498-1.505,1.628-2.909,1.808-4.439c0.32-2.74,0.57-5.52,0.82-8.26c0.521-5.744,0.168-11.569,0.15-17.363 c-0.001-0.411-0.054-0.823-0.201-1.207c-0.519-1.358-1.356-2.643-1.619-4.039c-0.5-2.67-0.7-5.39-1.02-8.09 c-0.04-0.39-0.08-0.79-0.07-1.19c0.07-3.15-0.3-6.32,0.69-9.42c0.41-1.29-0.17-2.87,1.22-3.88c0.1-0.07,0.06-0.37,0.06-0.57 c0.04-8.32,0.08-16.64,0.08-24.96c0-0.43-0.28-0.88-0.45-1.31c-0.19-0.46-0.56-0.9-0.58-1.36c-0.48-11.05,0.53-22.1-0.75-33.17 c-0.77-6.68-0.15-13.52-0.19-20.29c-0.02-4.13-0.15-8.26-0.15-12.39c-0.01-44.063-0.01-88.115,0-132.178 c0-0.883,0.011-1.77,0.117-2.647c0.323-2.687-0.394-5.417,0.813-8.095c0.54-1.2,0.09-2.85,0.14-4.29c0.01-0.42,0.12-0.86,0.28-1.25 c0.26-0.62,0.63-1.2,0.88-1.82c0.14-0.36,0.1-0.78,0.19-1.16c0.48-2.02,1-4.03,1.44-6.05c0.25-1.17-0.47-2.63,1.09-3.39 c0.11-0.05,0.1-0.36,0.11-0.56c0.28-4.51,0.31-9,0.88-13.53c0.7-5.49,0.44-11.15,0.13-16.71c-0.31-5.55,1.18-10.95,0.94-16.46 c-0.02-0.62,0-1.25,0-1.92c0.98-0.1,1.74-0.1,2.45-0.27c0.7-0.17,1.35-0.53,2.03-0.75c1.92-0.62,2.45-1.33,2.42-3.39 c0-0.43-0.07-0.86-0.12-1.48h-4.97c-1.98-0.01-2.64-0.7-2.65-2.73c-0.01-0.75,0.05-1.5-0.01-2.25c-0.53-6.86,1.3-13.97-2.06-20.55 c0.49-2.24-1.35-4.79,0.96-6.8c1.23-1.08,2.27-2.42,3.62-3.33c1.23-0.83,2.52-1.47,3.3-2.84c0.8-1.42,2.89-2.31,4.31-1.95 c1.05,0.28,2.12,0.53,3.13,0.92c2.26,0.86,4.46,1.89,6.75,2.65c0.94,0.32,2.23,0.47,3.05,0.06c1.77-0.89,2.89-2.77,3.34-4.51 c0.76-2.92,0-5.91-1.12-8.69c-0.5-1.24-0.4-1.92,0.76-2.43c1.71-0.75,3.37-1.59,5.07-2.37c2.07-0.95,3.93-2.43,6.34-2.56 c0.29-0.02,0.55-0.33,0.84-0.5c0.37-0.23,0.78-0.65,1.14-0.63c1.59,0.13,3.06-0.23,4.74,0.92c1.61,1.11,4.13,0.99,6.27,1.19 c1.93,0.17,2.82-0.82,3-2.78c0.04-0.43,0.26-0.88,0.47-1.28c0.39-0.75,1.16-1.46,1.2-2.22c0.07-1.42,0.75-3-1.6-3.85 c-1.72-0.61-2.93-2.52-4.52-3.62c-1.38-0.96-2.98-1.6-4.73-2.51c0.24-0.6,0.46-1.24,0.75-1.85c0.82-1.72,1.67-3.42,2.49-5.13 c0.34-0.73,0.5-1.6,1.01-2.17c1.42-1.63,1.98-3.64,2.79-5.55c0.36-0.87,0.45-1.99,1.06-2.59c1.09-1.06,1.52-2.34,1.98-3.69 c0.29-0.85,0.66-1.68,1.09-2.46c0.51-0.93,1.33-1.73,1.67-2.7c0.81-2.39,2.14-3.18,4.45-2.38c0.31,0.1,0.7,0.11,1.03,0.04 c1.17-0.22,2.36-0.41,3.5-0.76c1.24-0.38,2.44-0.9,3.62-1.43c0.21-0.08,0.37-0.5,0.37-0.77 C217.026,126.28,217.017,124.66,217.017,123.52z M143.507,186.1c-0.82,0.65-1.72,0.95-2.7,1.06c-9.15,3.4-19.04,5.26-29.37,5.26 c-46.57,0-84.32-37.75-84.32-84.32c0-46.56,37.75-84.31,84.32-84.31c46.56,0,84.31,37.75,84.31,84.31 C195.747,143.31,174.167,173.48,143.507,186.1z", - "M214.327,133.65c-1.07-0.77-2.58-1.24-3.21-2.27c-2.25-3.6-6.31-7.65-5.88-11.05 c1.52-12.04-0.33-23.52-2.8-35.1c-1.17-5.49-2.18-10.99,4.72-14.06c1.08-0.48,1.88-3.13,1.63-4.57c-0.19-1.07-2.16-2.19-3.55-2.64 c-6.7-2.14-12.98-4.88-17.4-10.69c-8.86-11.65-19.24-21.69-32.64-27.85c-6.64-3.05-11.86-6.24-11.09-14.54 c0.07-0.78-0.31-1.64-0.64-2.4c-1.25-2.84-2.56-5.66-3.84-8.48c-2.09,2.6-4.15,5.23-6.27,7.81c-1.41,1.73-2.68,4.5-4.41,4.85 c-5.32,1.1-10.85,1.76-16.28,1.67c-10.63-0.18-20.99,1.14-30.97,4.67c-7.85,2.78-15.14,3.77-22.72-1.31 c-3.42-2.29-8.09-2.69-13.48-4.35c1.1,3.41,1.68,5.25,2.3,7.08c2.66,7.87,2.9,14.94-4.11,21.28c-9.76,8.83-16.78,19.74-21.74,31.96 c-3.43,8.43-7.09,16.77-10.4,25.25c-0.69,1.77-0.76,4.07-0.31,5.93c1.61,6.58,3.4,13.13,5.43,19.59c3.09,9.77,5.6,19.86,9.93,29.08 c3.68,7.83,9.58,14.63,14.68,22.14c-0.79,0.96-2.1,2.1-2.8,3.53c-1.36,2.82-2.37,5.81-3.53,8.72c3.12,0.11,6.55,1.11,9.29,0.15 c8.09-2.86,14.4-0.35,20.54,4.73c2.39,1.98,2.05,3.36,0.46,5.32c-5.83,7.15-10.71,15.15-18.99,20.06 c-0.98,0.57-0.82,3.05-1.18,4.65c1.4,0.24,3.08,1.12,4.16,0.63c10.45-4.67,20.76-9.67,31.2-14.38c6.31-2.84,12.43-5.88,19.84-5.85 c10.42,0.05,20.84-1.07,31.26-1.7c1.76-0.11,3.51-0.28,5.42-0.43c0.16,1.54,0.36,2.51,0.36,3.49 c-0.02,59.51,0.09,119.02-0.28,178.52c-0.04,6.76-2.01,13.66-6.63,19.46c-5.78,7.26-11.13,14.88-16.46,22.49 c-0.72,1.03-0.2,2.93-0.26,4.43c1.3-0.02,2.66,0.24,3.87-0.09c5.76-1.56,11.47-3.28,18.14-5.22c0.62,6.25,1.49,10.98,1.5,15.73 c0.13,47,0.21,94.01,0.09,141.01c-0.02,9.45-0.81,18.9-1.43,28.34c-0.51,7.62-1.87,15.22-1.81,22.82 c0.09,11.27,1.35,22.52,1.59,33.8c0.11,4.87-1.07,9.77-1.69,14.65c-0.95,7.5-2.36,14.98-2.73,22.51c-0.3,6.1,1.55,12.38,0.78,18.37 c-0.97,7.49-5.01,14.53-11.46,18.32c-5.29,3.13-12.04,4.52-18.29,5.09c-7.23,0.66-14.61-0.47-21.92-0.75 c-7.56-0.29-13.36-5.01-15.18-12.31c-0.24-0.97-0.97-2.04-1.79-2.6c-3.54-2.44-7.19-4.7-11.02-7.17 c-6.83,8.88-7.82,11.33-7.65,21.13c0.27,15.78,1.28,31.58,0.87,47.34c-0.19,7.12-0.36,13.84,2.91,20.27 c0.57,1.13,1.4,2.86,2.29,2.97c6.4,0.82,12.69,3.55,19.18-1.16c3.35-2.42,8.23-3.21,12.54-3.72c7.41-0.88,14.92-0.84,22.37-1.43 c4.08-0.32,7.49-1.9,7.64-6.78c0.16-4.95,2.49-7.46,7.41-7.25c1.26,3.22,2.35,6.35,3.73,9.34c0.48,1.05,1.56,2.34,2.55,2.54 c3.24,0.62,6.57,0.74,9.86,1.16c3.38,0.42,5.09-0.92,6.01-4.3c1.78-6.56,3.92-13.02,6.08-19.47c1.92-5.71,2.31-11.28-0.26-16.93 c-0.69-1.51-0.6-3.37-1.02-5.99c2.46,0.64,3.97,1.18,5.52,1.41c2.3,0.33,4.62,0.44,6.93,0.65c-0.07-2.7,0.5-5.64-0.37-8.06 c-1.39-3.88-4.05-7.3-5.6-11.14c-2.34-5.79-5.86-11.75-5.96-17.69c-0.58-35.66-0.34-71.34-0.33-107.01c0-1.81,0.12-3.68,0.57-5.42 c3.38-13.1,3.56-26.5,1.68-39.63c-1.53-10.75-1.54-20.97,1.15-31.44c1.09-4.23,1.29-8.84,1.02-13.23 c-1.21-19.88-3.7-39.73-3.94-59.61c-0.62-50.99-0.29-102-0.34-153.01c0-1.66-0.07-3.35,0.18-4.98c1.91-12.43,4.96-24.78,5.62-37.26 c1.28-24.01,3.36-48.15-1.87-72.06c-0.27-1.25,0.73-3.34,1.8-4.23c9.73-8.05,9.78-8,20.31-1.11c0.7,0.46,1.39,1.05,2.17,1.23 c2.36,0.55,6.51,1.85,6.85,1.21c1.35-2.54,2.6-5.99,1.92-8.6c-2.38-9.22-2.43-17.78,3.82-25.59c2.88-3.6,5.07-8.11,8.66-10.71 c4.75-3.45,10.65-5.28,15.88-8.13c2.41-1.3,5.32-2.92,6.4-5.17C220.707,136.36,216.637,135.31,214.327,133.65z M111.437,192.42 c-46.57,0-84.32-37.75-84.32-84.32c0-46.56,37.75-84.31,84.32-84.31c46.56,0,84.31,37.75,84.31,84.31 C195.747,154.67,157.997,192.42,111.437,192.42z", - "M216.086,109.69c-0.08-0.48,0.02-1-0.02-1.5c-0.07-0.95,0.16-2.22-0.36-2.76 c-0.73-0.76-2.03-0.97-3.07-1.46c-0.63-0.3-1.24-0.67-1.83-1.05c-0.53-0.33-1.08-0.65-1.53-1.07c-0.8-0.74-1.92-0.81-2.57-2.09 c-1.13-2.22-0.49-4.7-1.75-6.94c-1-1.8,0.07-4.32-0.91-6.51c-0.3-0.67,0.89-2,1.37-3.04c0.65-1.39,2.31-2.03,2.57-3.75 c0.12-0.81,0.64-1.61,1.15-2.28c1.78-2.38,1.16-5.33-1.31-6.02c-1.49-0.42-2.55-1.16-3.72-2.06c-1.21-0.92-2.77-1.49-4.25-1.92 c-1.54-0.44-2.15-1.61-2.84-2.79c-0.59-1.02-1.09-2.11-1.76-3.08c-0.71-1.02-1.59-1.93-2.47-2.98c0.35-0.13,0.74-0.16,0.86-0.35 c1.27-2.02,3.25-2,5.28-1.95c1.15,0.02,2.4,0.21,3.44-0.16c1.28-0.45,2.71-1.16,3.49-2.19c1.24-1.65-0.42-4.48-2.46-4.74 c-1.98-0.25-3.94-0.58-5.91-0.89c-0.18-0.03-0.34-0.15-0.51-0.22c-0.77-0.33-1.52-0.72-2.32-0.95c-0.57-0.16-1.22,0.01-1.79-0.13 c-2.14-0.53-4.24-1.43-6.41-1.61c-1.69-0.14-2.87-0.66-4.02-1.8c-1.28-1.26-2.82-2.26-4.1-3.52c-0.3-0.29-0.23-1.24,0-1.73 c0.44-0.91,1.54-0.97,2.32-1.44c1.74-1.05,3.29-2.45,4.89-3.74c0.52-0.42,1.31-0.9,1.38-1.42c0.19-1.46,0.06-2.96,0.06-4.5 c-2.54-0.33-4.95-0.67-7.38-0.94c-0.89-0.1-1.81-0.01-2.71-0.03c-0.34-0.01-0.68-0.07-1.01-0.16c-0.89-0.23-1.76-0.69-2.64-0.7 c-4.02-0.08-8.04-0.03-12.07-0.05c-0.42,0-1.11,0-1.23-0.23c-1.12-2.09-3.02-1.96-4.92-1.88c-1.14,0.04-1.8-0.46-2.06-1.62 c-0.27-1.22-0.34-2.76-1.12-3.54c-1.17-1.16-0.68-2.45-1.05-3.64c-0.33-1.08-0.81-2.76-1.52-2.93c-2.01-0.5-4.21-0.87-6.23,0.31 c-0.93,0.54-1.88,1.05-2.87,1.44c-1.21,0.48-2.61,0.61-3.7,1.27c-1.77,1.08-3.79,0.89-5.3,0.34c-1.38-0.5-2.66-0.56-4-0.68 c-0.75-0.06-1.5-0.02-2.23-0.16c-0.94-0.18-1.87-0.77-2.76-0.69c-1.9,0.18-3.03-0.91-3.97-2.14c-1.29-1.72-2.14-3.79-3.53-5.41 c-1.31-1.54-1.8-3.71-3.74-4.73c-0.49-0.26-0.96-0.67-1.48-0.73c-0.94-0.12-1.92-0.14-2.85,0c-0.59,0.08-1.26,0.41-1.66,0.85 c-0.55,0.59-0.75,1.49-1.3,2.07c-1.44,1.55-2.99,3-4.48,4.5c-0.13,0.12-0.12,0.38-0.22,0.55c-0.46,0.75-0.9,1.52-1.42,2.22 c-0.5,0.67-1.12,1.24-1.62,1.91c-0.48,0.62-0.79,1.38-1.31,1.96c-1.39,1.54-3.54,0.54-5.35,1.73c-2.13,1.39-5.14,1.6-7.81,1.92 c-2.43,0.29-4.97,0.32-7.37-0.06c-1.44-0.23-2.84-1.32-4.04-2.3c-1.44-1.18-2.57-2.71-4.77-2.47c-0.61,0.06-1.27-0.43-2.23-0.78 c-0.27,0.91-0.79,1.91-0.83,2.92c-0.13,3.22-0.1,6.44-0.1,9.66c0,0.72-0.13,1.16-0.84,1.66c-1.79,1.24-3.39,2.74-5.12,4.08 c-0.33,0.26-0.9,0.26-1.36,0.33c-0.69,0.1-1.75-0.09-2.02,0.28c-0.84,1.21-1.97,0.84-3.05,0.96c-0.53,0.06-1.05,0.27-1.56,0.43 c-1.41,0.44-2.79,0.98-4.23,1.32c-1.4,0.33-3.13-0.6-4.16,1.16c-0.06,0.1-0.38,0.07-0.58,0.08c-1.15,0.07-2.3,0.17-3.45,0.2 c-2.18,0.07-2.94,0.91-2.47,2.97c0.12,0.55,0.55,1.09,0.97,1.51c0.85,0.82,1.83,1.51,2.67,2.35c1.09,1.09,2.1,2.27,2.99,3.24 c-0.99,1.5-1.8,2.84-2.73,4.09c-0.62,0.83-1.51,1.47-2.09,2.32c-1.11,1.6-2.09,3.3-3.12,4.96c-0.31,0.5-0.73,0.96-0.93,1.51 c-0.5,1.33-2.38,2.73-3.8,2.76c-1.15,0.03-2.49-0.24-3.4,0.26c-1.3,0.71-2.55,0.65-3.86,0.66c-2.14,0.01-4.03,0.57-5.36,2.35 c-0.3,0.41-0.32,1.02-0.56,1.48c-0.7,1.31-0.46,3.54,0.67,4.44c0.88,0.71,1.97,1.17,2.86,1.87c0.75,0.58,1.24,1.6,2.06,1.97 c1.26,0.57,1.85,1.38,1.54,2.64c-0.41,1.68,0.4,3.44-0.77,5.14c-0.67,1,0.34,2.85-1.26,3.76c-0.08,0.04-0.05,0.28-0.06,0.43 c-0.07,1.2-0.32,2.3-0.72,3.49c-0.69,2.08-1.06,4.24-2.44,6.06c-1.06,1.41-1.99,2.97-2.99,4.37c-1.47,2.05-3.91,3.38-5.93,5.04 c-0.77,0.63-1.44,1.4-2.26,1.94c-2.24,1.47-2.4,4.44-0.52,6.31c1.02,1.02,2.11,0.63,3.19,0.81c0.52,0.08,1.08,0.08,1.56,0.28 c1.37,0.58,2.71,1.21,4.05,1.87c0.66,0.33,1.54,0.63,1.86,1.2c0.54,0.99,0.73,2.18,1.06,3.29c0.11,0.38,0.15,0.8,0.33,1.14 c0.54,0.96,1.26,1.84,1.67,2.85c1.1,2.69,0.84,5.73,2.18,8.41c0.66,1.31,0.76,2.91,1.15,4.37c0.3,1.13,0.34,2.53,1.05,3.3 c0.9,0.97,0.77,1.95,0.91,3c0.09,0.63,0.37,1.24,0.6,1.95c-0.55,0.45-1.38,0.87-1.82,1.55c-0.96,1.47-1.52,3.18-2.98,4.34 c-1.33,1.06-0.8,2.64-0.82,4.03c-0.02,1.27,1.61,3.18,2.84,3.32c3.02,0.36,6.04,0.64,9.06,0.96c0.33,0.04,0.81,0.04,0.95,0.24 c1,1.45,2.98,2.44,2.17,4.75c-0.11,0.31,0.39,0.78,0.39,1.18c0.02,1.32,0.11,2.68-0.17,3.95c-0.22,1.01-1.1,1.86-1.41,2.87 c-0.54,1.71,0.41,3.02,1.55,4.15c1.28,1.27,1.94,1.24,3.66,0.26c0.96-0.55,1.99-1.12,3.06-1.32c1.94-0.35,3.1,1.4,4.64,2.13 c1.17,0.55,2.17,1.43,3.34,1.98c1.51,0.72,3.1,1.19,4.05,2.8c0.33,0.57,1.26,0.78,1.9,1.19c0.6,0.38,1.4,0.7,1.69,1.26 c0.51,1.03,0.69,2.23,1.05,3.34c0.14,0.4,0.35,0.83,0.65,1.11c0.69,0.66,0.82,3.4,0.13,4.02c-1.03,0.92-1,1.59,0.01,2.49 c0.82,0.73,1.45,1.79,2.39,2.23c0.75,0.36,1.85,0.05,2.78-0.07c0.31-0.04,0.58-0.53,0.9-0.55c3.1-0.24,5.89-1.34,8.58-2.84 c0.3-0.16,0.95-0.17,1.14,0.03c0.76,0.82,2.02,1.28,1.69,2.88c-0.33,1.67,0.2,3.38-1.17,4.99c-1.23,1.45-2.01,3.39-2.64,5.23 c-0.38,1.12-0.54,2.67-0.05,3.67c1.2,2.45,4.7,2.61,6.65,0.57c0.81-0.86,1.69-1.67,2.6-2.42c0.67-0.55,1.47-0.95,2.18-1.46 c0.32-0.22,0.58-0.52,0.85-0.79c0.92-0.91,1.79-1.88,3.23-1.91c0.07-0.01,0.12-0.25,0.21-0.36c0.47-0.55,0.87-1.23,1.45-1.62 c1.52-1.02,3.11-1.93,4.71-2.83c0.26-0.15,0.74-0.13,1.03,0.01c0.92,0.44,2.1,0.77,2.65,1.53c1.27,1.72,2.45,3.58,3.25,5.55 c0.83,2.06,3.35,3.48,5.17,2.57c1.67-0.83,2.63-2.52,4.53-3.18c1.48-0.51,2.62-2,3.93-3.03c0.29-0.22,0.64-0.44,0.98-0.49 c2.46-0.4,4.93-0.75,7.39-1.13c0.2-0.03,0.4-0.06,0.58-0.14c2.21-1.02,3.32-0.31,3.32,2.12c0,14.19-0.05,28.38,0.05,42.57 c0.01,1.86-0.96,2.7-2.18,3.62c-1.74,1.29-3.51,2.55-5.17,3.94c-1.03,0.85-1.73,2.36-2.86,2.77c-2.07,0.74-3.5,2.3-5.3,3.36 c-0.78,0.46-2.38,1.3-1.52,2.46c0.73,0.98,1.51,2.42,3.29,2.29c1.75-0.12,3.52-0.01,5.28,0.04c0.36,0.01,0.79,0.11,1.07,0.32 c0.62,0.47,1.08,1.3,1.76,1.51c2.45,0.76,2.94,2.75,3.4,4.84c0.09,0.38,0.22,0.9,0.49,1.05c1.71,0.98,1.74,2.53,1.65,4.2 c-0.06,1.3,0.03,2.61,0.03,3.92c0,29.84,0.04,59.67-0.06,89.5c-0.01,2.31,0.88,4.73-0.96,7.07c-0.87,1.09-0.54,3.2-0.94,4.86 c-0.58,2.45-0.57,4.95-2.05,7.23c-0.78,1.21-0.76,2.94-1.11,4.44c-0.34,1.49-0.68,2.98-1.03,4.46c-0.03,0.13-0.14,0.34-0.23,0.35 c-1.15,0.18-0.88,1.09-0.84,1.76c0.05,0.94-0.27,1.83,0.87,2.72c0.82,0.63,0.83,2.35,1.12,3.6c0.4,1.74,0.73,3.51,1.09,5.26 c0.03,0.15,0.05,0.32,0.13,0.42c1.29,1.52,1.66,3.35,1.96,5.25c0.2,1.27,0.59,2.51,0.92,3.76c0.03,0.12,0.2,0.2,0.26,0.33 c0.28,0.55,0.77,1.11,0.79,1.68c0.09,3.17,0.09,6.34,0.08,9.51c-0.01,53.22-0.02,106.45-0.08,159.68c0,1.51,0.78,3.34-1.06,4.47 c-0.08,0.05-0.06,0.29-0.07,0.43c-0.29,3.58-0.58,7.16-0.86,10.73c-0.32,4.15-0.63,8.3-0.97,12.45c-0.03,0.37-0.26,0.73-0.4,1.09 c-0.22,0.55-0.64,1.11-0.63,1.66c0.01,2.21,0.17,4.31,0.9,6.56c0.95,2.95,0.48,6.31,0.89,9.51c0.6,4.76,0.19,9.64,0.22,14.47 c0,0.5-0.1,1.11,0.14,1.48c1.42,2.19,0.48,4.57,0.54,6.84c0.04,1.47-0.44,2.98-0.84,4.43c-0.28,0.99-0.67,2.02-1.29,2.82 c-0.83,1.08-1.77,2.01-1.64,3.52c0.05,0.49,0.15,1.21-0.11,1.46c-1.13,1.09-0.65,2.44-0.83,3.69c-0.31,2.06,0.16,4.04-0.82,6.24 c-0.96,2.19-0.26,5.14-0.16,7.75c0.02,0.5,0.87,0.95,0.93,1.47c0.29,2.77-0.03,5.53,0.85,8.32c0.65,2.07,0.26,4.49,0.21,6.75 c-0.04,2.22,0.51,4.38,0.15,6.66c-0.41,2.56-0.2,5.21-0.29,7.83c-0.01,0.43-0.02,1.12-0.27,1.26c-1.4,0.77-2.83,1.57-4.34,2.04 c-1.7,0.53-3.51,0.72-5.26,1.07c-0.15,0.02-0.35,0.06-0.42,0.16c-1.05,1.6-2.96,1.06-4.42,1.69c-1.82,0.79-3.98,0.8-5.99,1.16 c-0.29,0.05-0.67,0.1-0.83,0.3c-1.07,1.37-2.9,1.4-4.18,1.54c-2.35,0.25-4.8-0.49-7.21-0.82c-0.14-0.02-0.32-0.1-0.39-0.21 c-1.13-1.76-2.78-0.72-4.19-0.71c-0.45,0-0.86,0.75-1.36,0.9c-1.49,0.44-3.02,0.74-4.53,1.14c-0.22,0.06-0.35,0.43-0.57,0.58 c-0.67,0.47-1.36,1.26-2.06,1.29c-3.56,0.13-7.14,0.07-10.71,0.04c-0.34,0-0.71-0.21-1.04-0.37c-0.54-0.26-1.05-0.56-1.58-0.84 c-0.82-0.43-1.69-0.79-2.43-1.32c-0.47-0.34-0.64-1.1-1.12-1.39c-1.87-1.14-3.1-2.75-4.11-4.66c-0.29-0.55-1.05-1.17-1.64-1.22 c-2.71-0.22-5.54-0.58-7.69,1.72c-0.83,0.9-1.8,1.06-2.92,1.04c-0.38,0-0.87,0.04-1.14,0.26c-1.57,1.29-3.5,1.51-5.38,1.82 c-2.39,0.39-4.78,0.67-7.17,1.02c-0.22,0.03-0.39,0.29-0.61,0.39c-1.11,0.5-2.2,1.26-3.35,1.41c-2.09,0.25-3.01,0.98-2.64,3.04 c0.19,1.07,0.64,2.49,1.43,2.95c1.21,0.72,2.83,0.7,4.26,1.06c1.65,0.43,3.28,0.93,4.92,1.42c1.01,0.3,2.01,0.63,3.03,0.92 c1.88,0.54,3.74,1.35,5.66,1.53c3.04,0.28,6.13,0.18,9.19,0.18c13.52,0.02,27.05,0,40.57,0.04c1.41,0.01,3.03-0.62,4.13,0.94 c0.1,0.14,0.48,0.07,0.73,0.09c5.48,0.4,11.03-0.61,16.46,0.99c1.95,0.58,4.05,0.68,6.11,1c0.07,1.26,0.61,2.47-0.7,3.3 c-0.85,0.54-1.65,1.22-2.57,1.58c-2.2,0.85-4.44,1.57-6.68,2.32c-0.99,0.34-2.02,0.59-3.01,0.94c-1.67,0.58-3.32,1.21-4.98,1.82 c-0.23,0.09-0.44,0.21-0.66,0.31c-0.53,0.24-1.04,0.64-1.58,0.69c-5.18,0.48-10.35-0.17-15.61,0.68 c-5.76,0.93-11.79-0.18-17.64,1.1c-0.82,0.18-1.73-0.09-2.55,0.08c-1.8,0.37-3.61,0.77-5.32,1.42c-0.58,0.21-1.08,1.13-1.26,1.82 c-0.66,2.45,1.02,5.29,4.03,5.07c1.83-0.13,3.72,0.54,5.59,0.87c0.12,0.02,0.22,0.18,0.34,0.24c0.72,0.31,1.43,0.85,2.17,0.88 c2.51,0.11,5.03,0.09,7.54,0.03c1.18-0.03,2.56,0.41,3.33-1.08c0.07-0.15,0.56-0.11,0.86-0.11c5.22,0.01,10.44,0.02,15.66,0.05 c0.34,0,0.79,0,1,0.19c1.32,1.25,2.86,1.82,4.67,1.79c1.63-0.02,3.26,0.01,4.6,1.25c0.06,0.99-0.12,1.83-1.41,1.95 c-0.23,0.02-0.46,0.31-0.66,0.5c-1.32,1.33-2.56,2.77-3.99,3.98c-1.06,0.89-2.34,2.07-3.56,2.12c-2.5,0.1-4.06,2.03-6.3,2.6 c-1.31,0.34-2.46,1.45-3.98,1.52c-0.29,0.01-0.67,0.07-0.83,0.26c-1.11,1.31-2.62,1.66-4.2,1.76c-1.8,0.12-3.76-0.26-5.37,0.33 c-1.58,0.59-3.07,0.54-4.61,0.59c-1.96,0.05-3.92,0.02-5.88,0c-0.39,0-0.79-0.07-1.16-0.17c-0.83-0.22-1.64-0.59-2.48-0.71 c-2.61-0.36-5.24-0.64-7.85-0.96c-0.15-0.02-0.38-0.06-0.41-0.14c-0.54-1.36-1.74-0.98-2.71-0.99c-4.02-0.06-8.04-0.04-12.07-0.05 c-0.4,0-0.81,0-1.19-0.08c-1.18-0.25-2.34-0.57-3.51-0.81c-0.49-0.09-1.19,0.17-1.47-0.09c-1.49-1.32-3.25-0.64-4.88-0.82 c-0.45-0.05-1.2,0.06-1.3-0.14c-0.68-1.42-1.93-1.03-3.02-1.06c-2.06-0.05-5.27-2.58-6.24-4.39c-0.87-1.64-2.23-3.05-3.48-4.46 c-1.04-1.17-2.36-2.08-3.33-3.29c-0.87-1.07-1.16-2.84-2.21-3.49c-1.93-1.2-2.76-3.77-5.53-3.92c-0.11,0.08-0.58,0.28-0.75,0.63 c-0.28,0.54-0.63,1.29-0.45,1.77c0.48,1.3,1.57,2.45,1.78,3.76c0.36,2.21,2.01,3.73,2.59,5.88c0.45,1.67,1.26,3.48,2.41,5.08 c1.14,1.56,1.41,3.74,2.13,5.63c0.43,1.16,0.89,2.33,1.51,3.4c0.36,0.63,1.01,1.13,1.61,1.59c0.67,0.5,1.52,0.79,2.13,1.35 c0.78,0.7,1.25,1.83,2.11,2.32c1.81,1.02,4.06,1.07,5.77,2.38c0.07,0.06,0.21,0.06,0.3,0.04c2.43-0.53,4.36,1.08,6.06,2.12 c2,1.24,4.52,2.12,5.74,4.61c0.47,0.95,1.67,1.55,3.12,0.54c0.9-0.62,2.18-0.69,3.18-1.48c1.15-0.91,2.59-1.45,3.89-2.16 c0.34-0.18,0.65-0.55,0.97-0.56c2.21-0.07,4.53-0.5,6.59,0.05c1.65,0.44,3.29,0.44,4.91,0.75c3.34,0.63,6.68,1.23,10.11,1.01 c0.19-0.02,0.47-0.04,0.58,0.07c1.69,1.69,4.5-0.27,6.04,1.88c2.64-0.06,5.21,0.33,7.75,1.05c1.35,0.38,2.74,0.65,4.1,0.98 c0.13,0.03,0.21,0.2,0.34,0.27c1.18,0.58,2.33,1.28,3.57,1.7c1.36,0.47,2.81,0.68,4.22,1.01c0.12,0.03,0.22,0.16,0.34,0.24 c0.93,0.58,1.82,1.22,2.8,1.71c1.03,0.51,2.68,0.57,3.1,1.35c1.03,1.92,2.93,2.76,4.5,3.64c1.3,0.73,3.45,0.26,5.09-0.18 c0.46-0.12,0.44-2.05,0.6-3.16c0.06-0.34-0.03-0.71,0.02-1.05c0.29-1.88-1.12-3-1.84-4.46c-0.7-1.42-2.24-1.12-3.03-2.13 c-0.57-0.71-1.11-1.52-1.85-1.99c-1.99-1.26-4.2-2.07-5.98-3.79c-1.42-1.38-3.36-2.21-5.05-3.33c-0.53-0.36-0.97-0.86-1.6-1.43 c1.59-0.28,2.79-0.38,3.91-0.73c1.33-0.42,2.56-1.15,3.88-1.59c1.23-0.41,2.52-0.08,3.86-0.73c1.07-0.51,2.44-1.28,3.54-1.27 c4.9,0.06,9.87-1.42,14.74,0.77c1.85,0.84,4.1,0.89,6.19,1.08c2.2,0.2,4.42,0.08,6.63,0.19c1.39,0.07,2.87-0.36,3.15-1.52 c0.35-1.43-0.11-3.07-0.31-4.61c-0.05-0.35-0.43-0.86-0.75-0.94c-1.89-0.45-3.03-2.61-5.28-2.29c-0.29,0.05-0.76-0.44-0.98-0.79 c-0.55-0.87-1.04-1.78-1.46-2.72c-0.72-1.58-1.07-3.47-2.15-4.72c-1.03-1.21-1.01-2.65-1.64-3.91c-0.95-1.9,1.19-4.82,3.55-5.51 c1.64-0.47,2.56-1.92,3.11-3.23c0.56-1.3,1.48-2.16,2.47-2.65c1.95-1,3.13-2.23,2.85-4.48c-0.15-1.19,0.35-1.95,1.04-2.38 c1,0.29,1.75,0.57,2.54,0.71c0.68,0.12,1.65-0.21,2.05,0.15c1.42,1.25,3.06,0.73,4.59,0.79c1.64,0.07,2.82-1.17,2.72-2.83 c-0.14-2.32,0.71-4.76-1.17-6.9c-1.23-1.41-2.02-3.2-3.05-4.79c-0.22-0.34-0.72-0.52-0.87-0.87c-0.46-1.06-0.77-2.19-1.23-3.25 c-0.29-0.71-0.68-1.39-1.13-2.01c-1.1-1.56-2.04-3.14-1.53-5.37c1.49-0.04,2.78-0.09,3.89-1.32c1.1-1.21,1.2-2.49,1.25-3.92 c0.01-0.23,0.11-0.48,0.24-0.67c1.24-1.84,0.48-3.88,0.58-5.83c0.01-0.15-0.29-0.35-0.49-0.46c-1-0.56-2.03-1.05-3-1.64 c-0.5-0.3-0.84-0.89-1.35-1.13c-1-0.46-2.14-0.66-3.09-1.2c-0.51-0.28-0.94-1-1.07-1.59c-0.43-2.04-0.69-4.12-1.08-6.17 c-0.08-0.39-0.55-0.7-0.63-1.08c-0.19-0.93-0.56-2-0.26-2.78c0.2-0.56,1.73-1.24,2.07-1c1.34,0.91,2.76,0.55,4.13,0.75 c0.3,0.04,0.57,0.28,0.87,0.41c0.5,0.23,0.99,0.58,1.52,0.65c3.46,0.48,6.98-0.42,10.48,0.84c1.88,0.67,4.18,0.23,6.29,0.19 c0.47-0.01,1.28-0.37,1.34-0.69c0.2-1.06,0.29-2.2,0.09-3.25c-0.08-0.41-1.04-0.65-1.59-1c-0.18-0.12-0.3-0.34-0.49-0.47 c-1.59-1.12-3.47-1.86-4.58-3.59c-0.05-0.07-0.2-0.06-0.28-0.11c-0.71-0.43-1.45-0.81-2.11-1.31c-0.61-0.47-1.1-1.11-1.72-1.57 c-0.68-0.5-1.49-0.82-2.16-1.33c-0.65-0.49-1.14-1.21-1.81-1.67c-1.57-1.08-3.21-2.06-4.83-3.08c-0.55-0.35-1.1-0.73-1.69-1.01 c-0.82-0.38-1.8-0.53-2.49-1.06c-0.53-0.41-0.95-1.22-1.04-1.91c-0.29-2.18,0.44-4.47-0.96-6.53c-0.53-0.79-1.11-1.77-1.11-2.66 c-0.06-20.73-0.05-41.46-0.03-62.18c0-0.42,0.15-0.86,0.31-1.25c0.21-0.5,0.64-0.94,0.74-1.45c0.29-1.62,0.18-3.22,0.78-4.9 c0.83-2.34,0.88-4.99,1.09-7.52c0.17-1.95,0.05-3.92,0.11-5.88c0.01-0.47,0.2-0.93,0.37-1.38c0.2-0.51,0.68-0.99,0.69-1.49 c0.05-4.08,0.04-8.15,0.01-12.23c0-0.48-0.04-1.25-0.32-1.39c-0.99-0.49-0.7-1.33-0.78-2.08c-0.35-3.05-0.31-6.21-1.2-9.09 c-0.7-2.29-0.69-4.49-0.62-6.72c0.12-3.64-0.46-7.31,0.67-10.95c0.71-2.26,0.78-4.71,1.14-7.07c0.04-0.24,0.05-0.53,0.19-0.72 c1.27-1.67,1.08-3.79,1.66-5.67c0.44-1.39,0.1-3,0.26-4.5c0.1-0.93,0.2-2.16,0.8-2.68c1.42-1.23,1.05-2.71,1.11-4.18 c0.02-0.75,0.08-1.5,0.08-2.26c0-7.94,0-15.89-0.03-23.84c0-0.4-0.25-0.81-0.42-1.2c-0.21-0.5-0.6-0.97-0.64-1.48 c-0.1-1.3,0.06-2.63-0.09-3.92c-0.13-1.03-0.9-2.06-0.78-3.02c0.31-2.47-0.9-4.62-1.12-6.95c-0.02-0.22-0.23-0.41-0.33-0.63 c-0.25-0.52-0.62-1.03-0.7-1.58c-0.19-1.34,0.04-2.8-0.39-4.03c-0.8-2.24-1.62-4.42-1.62-6.84c0.01-17.65,0.01-35.31,0.01-52.97 c0-0.35,0.01-0.7,0-1.05c-0.02-1.05,0.41-1.5,1.54-1.48c2.96,0.07,5.93,0.14,8.89-0.02c1.36-0.08,2.79-0.5,3.99-1.12 c0.75-0.39,1.46-1.39,1.62-2.23c0.27-1.36,0.17-2.82,0.01-4.2c-0.06-0.53-0.66-1.12-1.16-1.45c-0.95-0.62-2-1.08-3.02-1.6 c-0.99-0.5-1.96-1.06-2.98-1.47c-1.78-0.73-3.61-1.35-5.4-2.06c-0.43-0.18-0.73-0.7-1.16-0.84c-2.24-0.68-2.37-0.81-2.37-3.03 c0.01-25.61,0-51.21,0.02-76.82c0-3.07,0.14-6.13,0.21-9.2c0.01-0.24,0.02-0.5,0.07-0.74c0.27-1.22,0.63-2.42,0.81-3.66 c0.37-2.55,0.64-5.13,0.97-7.69c0.02-0.18,0.12-0.4,0.26-0.51c1.25-1.01,1.6-2.31,1.7-3.89c0.22-3.29,0.67-6.56,1.04-9.84 c0.02-0.18,0.11-0.47,0.23-0.51c1.12-0.39,0.81-1.36,0.9-2.16c0.05-0.55-0.08-1.13,0.06-1.65c0.48-1.75,1.32-3.45,1.53-5.23 c0.29-2.37,0.65-4.96-0.01-7.16c-0.63-2.1-0.45-4.08-0.64-6.11c-0.06-0.75,0.14-1.67-0.22-2.22c-1.07-1.62-0.53-3.36-0.68-5.04 c-0.04-0.45,0-0.91,0-1.36c-0.04-11.77-0.07-23.54-0.12-35.32c0-0.74,0.31-1.64-0.76-2.05c-0.18-0.07-0.26-0.51-0.3-0.79 c-0.28-1.71-0.53-3.42-0.79-5.13c-0.02-0.14-0.04-0.34,0.04-0.43c0.85-1.09,1.42-2.52,3.18-2.48c0.48,0.01,1.01-0.1,1.45-0.3 c1.93-0.87,3.83-1.82,5.76-2.7c0.91-0.41,1.88-0.69,2.8-1.06c0.79-0.32,1.87-0.46,2.28-1.06c1.04-1.51,2.94-0.65,4.08-1.75 c0.2-0.2,0.94-0.09,1.27,0.13c1.02,0.68,1.91,1.57,2.95,2.21c0.97,0.6,2.05,1.01,3.11,1.45c0.77,0.32,1.57,0.54,2.6,0.88 c0.08-0.06,0.43-0.5,0.88-0.68c1.99-0.8,2.28-1.19,2.32-3.33c0.02-0.8-0.16-2.05,0.24-2.3c1.05-0.65,0.8-1.53,0.84-2.37 c0.1-1.85,0.1-3.71,0.2-5.57c0.02-0.46,0.14-1,0.42-1.35c1.19-1.48,2.43-2.92,3.72-4.33c1.85-2.02,3.76-3.98,5.62-5.99 c1.2-1.3,2.41-2.58,3.51-3.96c0.91-1.15,2.34-1.82,2.73-3.48c0.22-0.96,1.04-1.77,1.58-2.66c1.01-1.68,2.08-3.34,2.99-5.07 c0.86-1.63,1.53-3.36,2.33-5.01c0.12-0.24,0.55-0.48,0.82-0.47c0.85,0.06,1.7,0.23,2.56,0.36c1.64-0.37,3.34-0.64,5.04-0.61 c2.2,0.04,4.18-0.16,5.25-2.55c-0.42-0.66-0.75-1.53-1.37-2.07c-1.26-1.13-2.64-2.08-2.54-4.07c0.02-0.43-0.29-0.97-0.6-1.32 c-0.98-1.09-1.88-2.23-2.27-3.68c-0.25-0.92-0.45-1.85-0.7-2.92c0.1-0.16,0.47-0.49,0.53-0.87c0.41-2.81,0.64-5.66,1.19-8.44 c0.36-1.78,1.14-3.48,1.81-5.19c0.13-0.33,0.58-0.58,0.92-0.78c1.21-0.7,2.72-1.11,3.58-2.1c0.87-1,1.89-1.43,2.93-2.05 C215.346,112.2,216.377,111.28,216.086,109.69z M111.437,192.42c-46.57,0-84.32-37.75-84.32-84.32c0-46.56,37.75-84.31,84.32-84.31 c46.56,0,84.31,37.75,84.31,84.31C195.747,154.67,157.997,192.42,111.437,192.42z", - "M220.041,157.85c-0.55-1.59-1.99-2.91-3.19-4.22c-1.44-1.55-3.06-2.93-4.54-4.44 c-0.94-0.97-2.09-1.91-2.57-3.1c-0.71-1.75-2.03-2.69-3.39-3.77c-0.82-0.65-1.45-1.6-2.05-2.48c-0.5-0.74-0.65-1.96-1.31-2.31 c-1.12-0.62-0.92-1.41-0.84-2.26c0.08-0.9-0.07-2.1,0.44-2.6c0.78-0.78,0.7-1.59,0.82-2.45c0.08-0.56-0.1-1.25,0.16-1.69 c1.35-2.35-0.12-5.35,1.81-7.52c0.27-4.36,0.77-8.72,0.74-13.07c-0.02-4.6-0.55-9.19-0.86-13.78c-0.02-0.23-0.04-0.6-0.18-0.67 c-1.2-0.58-0.74-1.69-0.88-2.62c-0.3-2.03-0.62-4.06-0.94-6.09c-0.03-0.17-0.16-0.32-0.24-0.49c-0.24-0.54-0.6-1.06-0.69-1.62 c-0.13-0.75,0.01-1.54-0.06-2.3c-0.14-1.56,0.39-3.22-0.79-4.65c-0.22-0.28-0.2-1.14,0.05-1.36c1.19-1.08,1.96-2.58,3.68-3.18 c0.9-0.32,1.87-1.42,2.11-2.35c0.36-1.38,0.09-2.92,0.09-4.59c-1.73,0-3.3,0.02-4.87,0c-0.36-0.01-0.98-0.02-1.05-0.2 c-0.46-1.09-1.43-0.72-2.21-0.93c-0.6-0.16-1.47-0.3-1.69-0.73c-0.65-1.26-1.95-1.91-2.51-3.35c-0.54-1.39-1.94-2.48-3.06-3.6 c-1.57-1.58-3.29-3.01-4.82-4.63c-0.9-0.96-1.45-2.23-2.3-3.24c-1.37-1.63-3.13-2.84-3.93-5.04c-0.75-2.04-0.93-2.28,0.91-3.34 c1.13-0.65,2.46-1.26,3.14-2.27c0.61-0.91,1.38-1.33,2.18-1.58c1.22-0.36,1.87-1.27,2.04-2.22c0.26-1.52,0.07-3.12,0.07-4.65 c-0.7-0.18-1.53-0.16-1.73-0.5c-0.54-0.93-1.34-0.88-2.1-0.8c-2.26,0.22-4.43-0.1-6.81,0.91c-2.5,1.06-5.7,0.06-8.58,0.97 c-1.39,0.44-3.04,0.01-4.63-0.49c-1.72-0.54-3.23-1.39-4.81-2.12c-0.53-0.24-0.86-0.92-1.39-1.21c-1.65-0.91-3.34-1.75-5.03-2.58 c-1.13-0.55-2.27-1.12-3.46-1.5c-1.3-0.42-2.67-0.64-4.01-0.96c-0.12-0.03-0.2-0.18-0.32-0.25c-0.49-0.28-0.96-0.69-1.5-0.81 c-1.58-0.38-3.18-0.64-4.78-0.96c-0.14-0.02-0.31-0.04-0.39-0.13c-1.28-1.53-3.33-0.93-4.88-1.77c-0.54-0.3-1.16-0.25-1.76-0.8 c-0.74-0.69-1.95-0.86-2.95-1.27c-0.31-0.13-0.57-0.36-0.88-0.52c-1.82-0.91-2.44-3.41-4.85-3.63c-0.37-0.03-0.84-0.97-0.93-1.54 c-0.16-0.97-0.04-2-0.04-2.77c-1.29-1.4-2.71-1.66-4.31-1.5c-1.04,0.1-3.26,1.89-3.77,2.79c-0.68,1.21-0.49,3.06-2.5,3.4 c-0.54,0.1-1.02,0.85-1.41,1.39c-0.58,0.82-1.24,1.27-2.3,1.24c-2.01-0.06-4.03-0.04-6.04,0.02c-0.52,0.02-1.03,0.31-1.53,0.51 c-0.4,0.16-0.75,0.5-1.15,0.55c-3.09,0.4-6.2,0.74-9.3,1.11c-0.14,0.02-0.31,0.01-0.41,0.1c-1.74,1.46-4.05,1.26-6.01,1.52 c-2.02,0.27-3.57,1.32-5.4,1.82c-1.27,0.35-2.45,1.02-3.69,1.51c-2.06,0.82-4.13,1.61-6.2,2.4c-0.64,0.24-1.35,0.37-1.91,0.73 c-1.46,0.94-2.83,2.01-4.28,2.97c-1.07,0.72-2.2,1.37-3.31,2.04c-0.98,0.59-1.98,1.14-2.94,1.76c-0.49,0.32-0.89,0.79-1.38,1.11 c-0.56,0.35-1.41,0.47-1.71,0.95c-0.49,0.79-1.09,1.06-1.92,1.26c-0.56,0.14-1.09,0.61-1.52,1.04c-0.91,0.91-1.7,1.92-2.6,2.84 c-1.47,1.52-3.01,2.96-4.47,4.49c-1.04,1.1-1.94,2.34-2.99,3.42c-1.05,1.07-2.23,2.02-3.34,3.03c-0.16,0.15-0.42,0.34-0.42,0.49 c0.1,1.74-2.06,1.97-2.29,3.47c-1.95,0.29-1.67,2.42-2.79,3.49c-1.16,1.11-1.61,2.94-2.39,4.45c-0.36,0.68-0.62,1.51-1.17,1.98 c-0.96,0.81-1.45,1.74-1.52,2.96c-0.02,0.38-0.02,0.81-0.2,1.11c-0.84,1.45-1.74,2.87-2.62,4.29c-0.4,0.63-1.03,1.22-1.16,1.9 c-0.25,1.29-0.94,1.6-2.14,1.73c-2.53,0.27-5.17-0.85-7.62,0.97c-0.78,0.57-1.29,0.9-1.28,1.82c0.02,1.15,0.04,2.3,0.09,3.45 c0.01,0.28,0.02,0.64,0.18,0.82c0.91,1.01,1.87,1.99,2.82,2.97c0.3,0.31,0.66,0.56,0.92,0.89c0.54,0.7,0.91,1.58,1.57,2.11 c1.32,1.05,1.76,2.7,0.91,4.16c-0.19,0.32-0.31,0.7-0.37,1.07c-0.33,2.36-0.19,4.68-0.93,7.12c-1.04,3.39-0.76,7.19-0.99,10.82 c-0.084,1.3-0.028,2.609-0.004,3.91c0.006,0.347,0.042,0.913,0.113,1.253c0.215,1.031,0.607,2.038,0.712,3.077 c0.13,1.18,0.02,2.39,0.08,3.59c0.02,0.39,0.24,0.77,0.39,1.15c0.19,0.5,0.5,0.97,0.6,1.49c0.36,1.88,0.66,3.78,0.98,5.67 c0.02,0.14,0.04,0.36,0.12,0.39c1.31,0.58,0.79,1.78,0.95,2.74c0.08,0.47-0.04,1.09,0.21,1.4c1.07,1.27,0.76,2.98,1.64,4.41 c0.92,1.49,0.83,3.53,1.95,5.15c1.07,1.53,1.11,3.52,2.09,5.23c1.14,2,1.76,4.33,3.12,6.29c0.99,1.43,1.86,2.94,2.81,4.39 c0.43,0.64,1.05,1.17,1.38,1.86c0.32,0.66,0.52,1.46,0.46,2.17c-0.02,0.21-1.11,0.37-1.72,0.47c-0.89,0.14-2.03-0.1-2.64,0.37 c-1.27,0.99-2.58,1.6-4.16,1.75c-0.27,0.02-0.66,0.12-0.78,0.31c-0.74,1.2-2.18,0.94-3.19,1.62c-0.9,0.6-1.97,0.95-2.95,1.45 c-0.13,0.06-0.15,0.33-0.22,0.5c-0.29,0.61-0.57,1.22-0.88,1.88c0.22,0.14,0.66,0.26,0.73,0.49c0.44,1.56,1.62,1.71,2.95,1.69 c6-0.1,12,0.28,17.98-0.6c2.02-0.3,2.35-0.04,2.27,1.87c-0.01,0.33,0.33,0.65,0.42,1c0.28,1.08,0.93,2.18-0.3,3.18 c-0.72,0.59-1.28,1.39-1.97,2.04c-0.57,0.55-1.16,1.13-1.84,1.51c-1.53,0.85-3.29,1.33-4.37,2.87c-0.11,0.16-0.38,0.21-0.57,0.32 c-1.53,0.89-3.3,1.54-4.54,2.74c-1.67,1.63-4.03,1.83-5.72,3.3c-0.62,0.53-1.4,0.9-2.1,1.34c-0.35,0.22-0.68,0.57-1.05,0.64 c-1.67,0.33-2.61,1.81-2.12,3.47c0.38,1.29,2.05,1.63,3.29,1.08c1.5-0.67,2.83-2,4.72-1.6c0.23,0.05,0.48-0.03,0.71,0.01 c3.29,0.59,6.38-0.81,9.6-0.9c0.14,0,0.37-0.02,0.4-0.09c0.59-1.47,1.9-0.82,2.92-1.07c1.08-0.27,2.31-0.48,3.12-1.14 c1.34-1.1,3.01-1.42,4.43-1.52c2.07-0.14,3.55-1.64,5.54-1.71c0.53-0.02,1.04-0.3,1.55-0.46c0.45-0.14,0.92-0.22,1.33-0.43 c0.95-0.49,1.87-1.48,2.8-1.47c2.17,0.03,4.33,0.51,6.5,0.83c0.1,0.02,0.16,0.24,0.27,0.29c0.56,0.28,1.11,0.61,1.7,0.78 c1.28,0.37,2.98,0.25,3.8,1.06c1.41,1.37,3.24,0.88,4.73,1.73c0.92,0.53,2.42-0.25,3.25,1.05c0.11,0.17,0.55,0.21,0.82,0.18 c3.28-0.45,5.4,2.03,8.05,3.18c1.02,0.44,1.9,1.2,2.94,1.6c2.28,0.87,4.77,0.75,7.12,1.85c2.1,0.99,4.76,1.09,7.16,1.03 c6.72-0.19,13.49,0.95,20.17-0.71c1.13-0.28,2.39-0.08,3.58-0.17c0.39-0.02,0.78-0.21,1.15-0.37c0.47-0.21,0.91-0.6,1.39-0.67 c1.14-0.15,2.49,0.21,3.39-0.3c1.52-0.84,2.91-0.42,4.47-0.47c0.03,0.81,0.09,1.47,0.09,2.13v170.39c0,1.92,0.01,3.84-0.01,5.76 c0,0.42,0.03,1.13-0.17,1.22c-1.48,0.66-0.88,1.94-0.93,2.97c-0.1,1.67-0.15,3.36-0.02,5.03c0.14,1.95-0.76,4.1,1,5.79 c0.14,0.13,0.07,0.46,0.13,0.69c0.32,1.16,0.64,2.31,1,3.45c0.05,0.18,0.32,0.33,0.52,0.42c1.35,0.57,1.68,1.45,1.02,2.81 c-0.14,0.29-0.42,0.71-0.31,0.88c1.11,1.81,0.69,3.83,0.63,5.73c-0.1,2.98-0.59,5.94-0.76,8.93c-0.14,2.43-0.03,4.89-0.08,7.33 c-0.01,0.6,0.23,1.41-0.8,1.57c-0.12,0.02-0.28,0.37-0.29,0.57c-0.16,3.08-0.36,6.15-0.72,9.24c-0.59,4.97-0.21,10.05-0.21,15.09 c0,44.18,0.01,88.36,0,132.54c0,6.23-0.02,12.47-0.12,18.7c-0.03,1.37,0.13,2.67-0.79,4.12c-0.92,1.43-0.93,3.56-1.02,5.39 c-0.16,3.11-0.07,6.24-0.11,9.36c-0.01,0.51-0.02,1.4-0.24,1.47c-1.21,0.4-0.8,1.35-0.89,2.13c-0.08,0.62-0.03,1.28-0.26,1.84 c-1.03,2.54-0.86,5.31-0.25,7.71c0.44,1.74,0.41,3.39,0.61,5.08c0.09,0.71-0.17,1.75,0.22,2.08c1.12,0.97,0.85,2.16,0.86,3.3 c0.05,10.08,0.08,20.15,0.07,30.22c0,1.21,0.33,2.59-1.03,3.45c-0.18,0.11-0.18,0.53-0.24,0.8c-0.3,1.45-0.59,2.91-0.92,4.36 c-0.04,0.18-0.32,0.29-0.45,0.47c-0.23,0.34-0.53,0.68-0.61,1.06c-0.36,1.69-0.64,3.38-0.96,5.08c-0.02,0.13-0.03,0.36-0.11,0.39 c-1.37,0.57-0.82,1.77-0.87,2.73c-0.07,1.48,0.09,2.98-0.06,4.45c-0.07,0.64-0.56,1.58-1.07,1.74c-1.53,0.48-3.39-0.22-4.66,1.28 c-6.11,0.05-12.2-0.04-18.29,0.83c-3.57,0.51-7.27,0.09-10.91,0.11c-0.52,0-1.34-0.08-1.52,0.2c-0.88,1.4-2.2,0.79-3.34,0.85 c-1.68,0.09-3.36,0.01-5.03,0.03c-2.22,0.03-2.87,0.61-2.88,2.52c-0.01,1.74,1.56,3.66,3.06,3.67c2.44,0.02,4.89-0.03,7.33,0.03 c0.54,0.01,1.1,0.29,1.59,0.56c0.66,0.35,1.23,1.13,1.88,1.17c2.77,0.19,5.5,0.3,8.27,0.8c3.4,0.62,6.97,0.26,10.46,0.39 c1.31,0.04,2.77-0.51,3.81,0.86c0.13,0.16,0.55,0.11,0.83,0.16c1.98,0.31,3.97,0.57,5.93,0.94c1.09,0.21,2.13,0.61,3.19,0.93 c0.13,0.04,0.23,0.15,0.35,0.21c0.62,0.31,1.25,0.59,1.87,0.9c0.71,0.37,1.79,0.59,2.05,1.17c0.56,1.23,0.85,2.64,0.96,4.01 c0.19,2.53,0.15,5.07,0.25,7.61c0.01,0.38,0.22,0.77,0.39,1.12c0.21,0.43,0.67,0.83,0.68,1.24c0.06,2.54,0.03,5.08,0.03,8.02 c-1.66,0.18-3.24,0.45-4.82,0.5c-2.92,0.07-5.85,0-8.77,0.03c-0.79,0-1.59,0.13-2.49,0.22c0.04,1.62-0.73,3.04,0.83,4.49 c1.37,1.26,2.42,2.7,4.52,2.55c0.429-0.031,0.861,0.057,1.262,0.211c2.119,0.81,4.149,1.889,6.518,1.859 c2.647-0.022,3.007,0.673,2.932,3.776c-0.017,0.708,0.025,1.415,0.061,2.122c0.065,1.295-0.44,1.831-1.823,1.812 c-3.69-0.07-7.38-0.03-11.07,0c-0.56,0.01-1.42-0.02-1.62,0.29c-0.74,1.16-1.8,0.84-2.78,0.84c-2.78,0.02-5.56,0.01-8.34,0.01 c-2.64,0-5.27,0.06-7.9-0.01c-1.15-0.03-2.08,0.55-2.33,1.39c-0.7,2.4,0.27,5.56,3.59,5.63c1.2,0.02,2.77-0.38,3.51,0.22 c1.4,1.15,2.84,0.75,4.28,0.95c1.97,0.27,3.93,0.57,5.9,0.89c0.17,0.03,0.3,0.3,0.46,0.45c0.91,0.82,1.76,1.71,3.21,1.47 c0.49-0.09,1.07,0.16,1.57,0.35c0.51,0.19,0.95,0.66,1.45,0.73c3.2,0.43,6.4,0.78,9.69,1.16c0.04,0.17,0.13,0.39,0.14,0.62 c0.03,1.82,0.03,3.65,0.06,5.47c0.01,0.76-0.1,1.57,0.11,2.28c0.5,1.64,0.12,2.28-1.61,2.28c-4.12,0-8.24-0.01-12.36,0.02 c-0.7,0.01-1.77,0-2.02,0.4c-0.59,0.96-1.36,0.7-2.11,0.73c-1.81,0.07-3.64,0.04-5.44,0.19c-1.13,0.1-2.23,0.64-3.35,0.64 c-8.67,0.06-17.35,0.03-26.02,0.05c-0.66,0-1.71-0.04-1.89,0.3c-0.55,1.03-1.38,0.79-2.18,0.88c-1.31,0.17-2.07,1-2.12,2.29 c-0.1,2.71,1.38,4.42,4.05,4.64c0.66,0.06,1.34,0.06,2.01,0.06c11.59,0,23.19-0.04,34.79,0.04c2.11,0.01,4.23,0.53,6.34,0.84 c0.16,0.02,0.3,0.17,0.46,0.26c0.46,0.24,0.9,0.61,1.38,0.7c2.05,0.38,4.12,0.68,6.18,1.02c0.17,0.02,0.32,0.14,0.49,0.22 c0.59,0.27,1.16,0.71,1.77,0.77c1.78,0.18,2.26,0.55,2.18,2.39c-0.13,2.89,0.3,5.79-0.56,8.69c-0.54,1.82,0.44,4.02-1.28,5.61 c-1.07,0.99-1.03,2.72-2.45,3.52c-0.6,0.33-1.11,0.94-1.49,1.53c-0.84,1.31-1.52,2.72-2.37,4.02c-0.39,0.59-1.08,0.97-1.53,1.53 c-0.82,1.05-1.77,2.07-2.29,3.27c-0.73,1.7,0.72,3.6,2.56,3.61c1.2,0,2.39-0.07,3.59-0.14c0.28-0.01,0.76-0.06,0.79-0.18 c0.37-1.48,1.9-1.22,2.79-1.6c1.47-0.63,2.91-1.2,4.18-2.2c0.6-0.47,1.56-0.65,1.91-1.24c0.65-1.1,0.98-2.39,1.44-3.6 c0.17-0.43,0.37-0.84,0.5-1.28c0.4-1.41,0.82-2.81,1.14-4.24c0.15-0.69,0.22-1.46,0.08-2.14c-0.28-1.36,0.93-1.72,1.44-2.55 c0.84-1.38,1.53-1.33,2.36-0.08c0.04,0.06,0.18,0.09,0.27,0.09h5.12c-0.27-2.27,0.54-4.2-0.94-6.39c-1.18-1.72-2.35-3.95-2.25-6.37 c0.02-0.28-0.07-0.57-0.13-0.85c-0.31-1.36-0.62-2.72-0.98-4.33c4.5,0,8.43-0.01,12.35,0.02c0.27,0,0.59,0.24,0.78,0.46 c0.82,0.96,1.75,1.44,3.09,1.4c2.73-0.08,5.46,0.06,8.19,0.06c14.24,0.01,28.47,0,42.7,0c0.67,0,1.35,0.02,2.01-0.07 c0.32-0.05,0.75-0.28,0.88-0.55c0.69-1.38,1.24-2.78,1.07-4.42c-0.22-2-0.91-2.79-2.91-2.81c-2.59-0.03-5.17,0-7.76-0.03 c-0.4,0-0.82-0.09-1.21-0.22c-0.79-0.28-1.56-0.86-2.35-0.87c-4.08-0.1-8.15-0.05-12.22-0.06c-0.39,0-0.91,0.14-1.13-0.05 c-1.49-1.3-3.27-0.63-4.92-0.82c-1.42-0.16-3.03,0.59-4.17-0.93c-0.17-0.22-0.72-0.18-1.1-0.18c-1.29-0.03-2.58-0.02-3.86-0.03 c-0.63,0-1.49,0.23-1.83-0.09c-1.49-1.41-3.58-0.43-5.29-1.62c-1.47-1.03-3.79-0.13-5.71-1.05c-1.26-0.6-2.87,0.1-4.29-1.07 c-1.64-1.35-3.9-1.12-5.98-1.07c-1.17,0.02-1.96-0.78-2.01-1.96c-0.02-0.61,0-1.22,0-1.93c0.7-0.04,1.27-0.05,1.83-0.12 c0.31-0.04,0.62-0.16,0.9-0.3c0.48-0.24,0.93-0.73,1.42-0.78c3.66-0.32,7.33-0.56,10.99-0.82c0.05-0.01,0.1-0.01,0.15-0.01 c1.17-0.12,2.41-1.19,2.51-2.35c0.1-1.23,0.02-2.47,0.02-3.7c-1.73-0.36-3.3-0.9-4.9-0.98c-3.01-0.13-6.03,0-9.05,0.03 c-0.43,0-0.99-0.06-1.25,0.17c-1.07,0.95-2.32,0.59-3.51,0.66c-1.57,0.08-2.62-0.97-2.97-2.16c-0.34-1.18-0.19-2.67,0.24-3.85 c0.41-1.13,3.21-1.2,4.42-0.44c0.97,0.61,2.01,1.16,3.09,1.52c0.79,0.26,1.7,0.21,2.56,0.22c2.42,0.05,3.28-0.79,3.32-3.21 c0.02-1.15,0.11-2.31-0.02-3.45c-0.11-0.94-0.49-1.85-0.77-2.77c-0.35-1.1-0.72-2.18-1.14-3.45c0.69-0.05,0.96-0.09,1.24-0.09 c4.31-0.08,8.62-0.14,12.93-0.23c0.51-0.01,1.03-0.12,1.52-0.26c0.68-0.19,1.33-0.66,1.99-0.67c6.85-0.05,13.71-0.02,20.56-0.04 c0.71,0,1.61,0.13,2.1-0.23c1.18-0.87,2.44-0.56,3.67-0.62c1.29-0.05,2.6,0.05,3.87-0.13c0.76-0.11,1.42-0.83,2.18-0.93 c2.31-0.3,4.64,0.04,6.98-0.78c1.36-0.48,1.89-0.92,1.89-2.21c-0.01-1.05,0-2.09,0-3.07c-1.98-0.4-3.74-0.82-5.52-1.07 c-1.03-0.15-2.1-0.02-3.15-0.04c-0.33,0-0.87,0.04-0.95-0.13c-0.68-1.28-1.88-0.93-2.9-0.94c-4.36-0.05-8.72-0.02-13.08-0.03 c-0.42,0-0.84-0.06-1.25-0.16c-0.85-0.21-1.69-0.65-2.53-0.66c-3.74-0.08-7.48-0.04-11.22-0.07c-0.39,0-0.81-0.11-1.19-0.25 c-0.65-0.26-1.27-0.76-1.93-0.82c-1.661-0.151-3.335-0.019-5.007-0.073c-0.629-0.021-1.638-0.204-2.243-0.375 c-0.66-0.186-1.321-0.376-1.99-0.432c-1.57-0.13-3.16-0.02-4.74-0.05c-0.36,0-0.73-0.1-1.06-0.22c-0.75-0.28-1.46-0.83-2.21-0.87 c-2.29-0.12-4.62,0.13-6.89-0.13c-1-0.11-2.34-0.9-2.73-1.74c-0.4-0.87-0.13-2.37,0.4-3.27c0.641-1.095,1.837-1.878,2.791-2.802 c0.176-0.17,0.314-0.377,0.406-0.604c0.418-1.034,0.692-2.09,1.883-2.644c0.49-0.22,0.73-0.96,1.09-1.46 c0.58-0.8,1.01-1.83,1.79-2.34c1.34-0.86,2.7-1.8,4.39-2.05c0.94-0.14,2.19-0.41,2.65-1.07c0.83-1.21,2.16-0.98,3.16-1.63 c1.45-0.94,3.1-1.57,4.65-2.39c0.2-0.1,0.36-0.48,0.37-0.73c0.03-1.66,0.02-3.32,0.02-5.1c-1.93,0-3.73-0.2-5.46,0.05 c-1.77,0.26-3.54,0.82-5.19,1.53c-0.95,0.41-1.55,0.46-2.52,0.01c-1.67-0.76-3.21-2.09-5.31-1.62c-0.77,0.17-1.62,0.05-2.43,0.02 c-1.31-0.03-2.01-0.77-2.04-2.07c-0.03-1.1,0.24-2.39-0.24-3.26c-0.82-1.47-0.5-2.93-0.57-4.4c-0.07-1.35,0.57-1.94,1.93-1.96 c1.81-0.04,3.65,0.03,5.45-0.16c1.45-0.15,2.85-0.78,4.3-0.91c2.1-0.2,4.21-0.09,6.32-0.19c5.64-0.27,11.27-0.58,16.91-0.89 c0.29-0.01,0.59-0.18,0.87-0.31c0.46-0.22,0.9-0.66,1.36-0.68c2.87-0.12,5.74-0.18,8.61-0.21c1.86-0.01,3.49-0.46,4.72-1.98 c0.73-0.91,0.33-3.4-0.5-3.95c-1.54-1.02-3.21-0.87-4.89-0.91c-0.4-0.01-0.81-0.11-1.19-0.25c-0.76-0.27-1.48-0.83-2.23-0.85 c-3.214-0.102-6.428-0.038-9.642-0.061c-0.354-0.003-0.711-0.029-1.053-0.122c-0.859-0.234-1.683-0.63-2.544-0.697 c-1.48-0.12-2.97-0.01-4.46-0.04c-0.35,0-0.72-0.1-1.05-0.23c-0.7-0.28-1.36-0.79-2.07-0.87c-1.37-0.14-2.78,0.05-4.16-0.06 c-4.36-0.36-8.78,0.74-13.14-0.72c-1.01-0.34-1.88-0.84-2.7-1.35c-0.51-0.31-0.85-1.41-0.73-2.06c0.1-0.55,0.9-1.24,1.51-1.38 c1.69-0.39,3.52,0.23,5.11-1.2c0.68-0.6,1.73-0.79,2.03-1.87c0.46-1.59,0.03-3.2-1.02-4.15c-1.15-1.05-2.8-1.57-4.3-2.17 c-0.95-0.37-1.49-0.84-1.48-1.89c0.03-1.58,0.02-3.17-0.01-4.75c-0.01-0.57,0.08-1.42-0.24-1.65c-1.34-0.97-1.03-2.35-1.03-3.6 c-0.03-12.57-0.2-25.14,0.09-37.7c0.09-4.05-0.94-8.2,0.93-12.27c0.93-2.02,0.71-4.58,1.03-6.89c0.16-1.24-0.47-2.69,1-3.6 c0.14-0.09,0.09-0.54,0.09-0.83c0-4.12,0.01-8.25-0.02-12.37c0-0.41-0.16-0.82-0.29-1.22c-0.19-0.59-0.54-1.16-0.6-1.77 c-0.36-3.45-0.65-6.9-0.98-10.35c-0.03-0.31-0.24-0.6-0.38-0.89c-0.22-0.51-0.58-1-0.66-1.53c-0.24-1.69,0.47-3.51-0.81-5.07 c-0.19-0.23-0.19-0.89,0-1.1c1.13-1.21,0.66-2.69,0.81-4.07c0.03-0.33-0.01-0.85,0.17-0.94c1.18-0.61,0.78-1.71,0.9-2.64 c0.31-2.41,0.6-4.82,0.92-7.23c0.02-0.17,0.16-0.32,0.24-0.48c0.28-0.64,0.56-1.28,0.85-1.91c0.32-0.7,0.59-1.93,1-1.98 c1.63-0.19,2.43-1.42,3.43-2.35c1.11-1.02,1.99-2.29,3.34-3.88c1.88-0.27,4.43-0.62,6.97-0.99c0.244-0.035,0.634-0.127,0.864-0.214 c1.441-0.546,2.865-1.399,4.326-1.486c2.42-0.16,3.88-1.4,5.1-3.21c0.42-0.63,0.74-1.32,1.14-1.95c0.73-1.13,0.46-2.45-0.7-3.13 c-1.06-0.64-2.14-1.26-3.22-1.86c-0.79-0.43-1.66-0.72-2.39-1.23c-1.235-0.87-2.388-1.874-3.593-2.814 c-0.497-0.388-1.371-0.934-1.933-1.221c-0.971-0.497-1.952-0.974-2.934-1.465c-1-0.5-2.02-0.97-3.01-1.5 c-1.6-0.84-3.21-1.67-4.75-2.6c-0.37-0.23-0.71-0.84-0.72-1.29c-0.12-4.45-0.14-8.91-0.24-13.37c-0.01-0.63-0.24-1.27-0.47-1.87 c-0.4-1.04-1.01-2.01-1.27-3.07c-0.41-1.62-0.52-3.32-0.9-4.95c-0.19-0.8-1.03-1.52-1.04-2.28c-0.03-2.59-1.5-4.95-1.05-7.62 c0.23-1.35,0.07-2.78,0.01-4.17c-0.02-0.49-0.22-0.99-0.41-1.46c-0.18-0.47-0.63-0.91-0.64-1.37c-0.1-5.89-0.19-11.79-0.2-17.69 c-0.01-43.36-0.01-86.72,0.01-130.09c0-3.59,0.1-7.19,0.18-10.78c0-0.35,0.13-0.72,0.28-1.04c0.23-0.52,0.69-0.98,0.75-1.51 c0.14-1.13-0.01-2.31,0.15-3.44c0.21-1.41,0.24-3.06,1.01-4.12c1.23-1.69,0.93-3.66,1.6-5.44c0.86-2.26-0.54-4.93,1.14-7.29 c1.15-1.62,1.74-3.65,2.56-5.5c0.27-0.59,0.41-1.24,0.72-1.81c0.54-1.02,1.19-1.98,1.75-2.99c0.58-1.04,1.14-2.09,1.63-3.17 c0.67-1.52,2.22-1.88,3.43-2.66c0.92-0.59,2.03-0.89,3.04-1.36c1.51-0.69,3.02-1.38,4.5-2.12c0.5-0.26,1.18-0.59,1.33-1.04 c0.46-1.4,0.79-2.85,1.02-4.31c0.13-0.82-0.4-1.39-1.27-1.39c-3.26,0-6.51,0.03-9.77,0.06c-0.24,0-0.51,0-0.7,0.11 c-2.29,1.29-4.7,0.26-7.06,0.66c-0.05-0.53-0.1-0.81-0.1-1.1c0-8.53,0.13-17.08-0.04-25.61c-0.18-8.49,0.86-17.02-0.84-25.46 c-0.17-0.87-0.26-1.75-0.48-2.61c-0.13-0.53-0.56-0.99-0.63-1.51c-0.16-1.28,0.11-2.69-0.33-3.83c-0.93-2.37-0.35-3.87,2.08-4.61 c1.47-0.44,2.09-2.42,3.94-2.27c0.03,0,0.06-0.17,0.13-0.23c0.85-0.86,1.58-2.12,2.61-2.47c1.65-0.55,2.44-1.96,3.72-2.84 c0.98-0.67,1.86-1.5,2.82-2.2c0.62-0.46,1.31-0.81,1.96-1.23c0.66-0.42,1.31-0.86,1.95-1.31c0.27-0.2,0.49-0.46,0.76-0.67 c0.8-0.63,1.65-1.2,2.4-1.88c1.08-0.97,2.05-2.05,3.13-3.03c1.21-1.1,2.77-1.94,3.64-3.25c1.25-1.87,2.53-3.64,4.13-5.24 c1.47-1.47,2.88-3.08,3.97-4.84c0.72-1.18,2.37-1.65,2.4-3.29c0-0.06,0.14-0.14,0.22-0.16c1.32-0.35,2.61-0.84,3.95-1 c1.36-0.16,2.93-0.39,3.93,0.85c1.2,1.51,2.76,0.97,4.22,1.05c0.96,0.06,1.93,0.15,2.88,0.04c2.29-0.27,4.18,0.69,6.06,1.78 c0.68,0.4,1.4,0.75,2.09,1.13c0.92,0.51,1.83,1.03,2.85,1.6c0-0.01,0.07-0.17,0.19-0.27c0.97-0.86,2.45-1.54,2.79-2.6 C220.411,161.37,220.561,159.38,220.041,157.85z M111.437,192.42c-43.96,0-80.06-33.63-83.96-76.57c-0.27-0.72-0.3-1.53-0.18-2.4 c-0.12-1.77-0.18-3.55-0.18-5.35c0-46.56,37.75-84.31,84.32-84.31c46.56,0,84.31,37.75,84.31,84.31 C195.747,154.67,157.997,192.42,111.437,192.42z", - "M230.071,128.64c-0.15-1.08-0.7-2.04-2.08-2.04c-0.28,0-0.57-0.25-0.84-0.39 c-0.47-0.25-0.92-0.61-1.42-0.73c-1.45-0.36-2.93-0.61-4.39-0.92c-0.12-0.03-0.22-0.18-0.34-0.23c-0.69-0.31-1.37-0.67-2.09-0.89 c-0.5-0.15-1.09,0.01-1.58-0.15c-1.59-0.49-3.12-1.21-4.73-1.56c-0.84-0.18-1.56-0.25-1.9-1.1c-0.26-0.64-0.44-1.3-0.58-1.71 c-0.72-0.61-1.66-1-1.81-1.59c-0.47-1.97-0.84-4-0.92-6.01c-0.17-4.38-0.13-8.76-0.19-13.14c0-0.39,0.08-0.98-0.12-1.13 c-1.52-1.11-0.88-2.72-1.05-4.13c-0.09-0.72-0.04-1.47-0.24-2.16c-0.52-1.81-1.24-3.58-1.68-5.41c-0.47-1.99-0.71-4.03-1.05-6.05 c-0.02-0.15-0.03-0.35-0.12-0.41c-1.51-0.98-1.28-2.82-1.53-4.12c-0.44-2.32-1.97-4.02-2.61-6.16c-0.4-1.34-1.17-2.57-1.71-3.87 c-0.68-1.62-1.18-3.32-1.99-4.86c-0.81-1.54-2.08-2.85-2.84-4.42c-0.66-1.35-0.85-2.94-2.05-4.04c-0.1-0.09-0.05-0.51,0.07-0.66 c0.56-0.66,1.05-1.5,1.78-1.88c1.3-0.68,1.3-1.76,1.31-2.91c0.01-1.17-0.04-2.34,0.01-3.51c0.07-1.48-0.62-2.06-2.07-2.04 c-3.26,0.04-6.52,0.06-9.78-0.01c-0.7-0.02-1.46-0.33-2.05-0.72c-1.1-0.72-2.12-1.56-3.13-2.4c-0.54-0.45-0.96-1.03-1.48-1.5 c-0.43-0.39-0.99-0.65-1.4-1.06c-1.1-1.08-2.85-1.27-3.64-2.8c-0.26-0.51-0.8-0.93-1.31-1.26c-1.904-1.241-3.992-2.242-5.711-3.712 c-0.881-0.754-1.89-1.335-2.86-1.97c-0.607-0.397-1.054-1.111-1.699-1.348c-2.2-0.8-3.28-2.91-5.09-4.15 c-1.33-0.92-1.84-2.72-3.74-3.11c-0.83-0.18-1.88-1.09-2.14-1.89c-0.88-2.71-2.14-5.37-1.84-8.36c0.05-0.48,0.01-0.96,0.01-1.34 c-1.25-1.09-2.38-0.97-3.36,0.1c-0.89,0.97-1.57,2.15-2.54,3.02c-1.43,1.29-2.97,2.51-4.61,3.52c-0.69,0.42-1.38,0.67-2.02,1.31 c-0.9,0.89-2.2,1.64-3.43,1.85c-1.8,0.3-3.69,0.07-5.53,0.05c-0.18,0-0.48-0.07-0.53-0.18c-0.47-1.14-1.47-0.93-2.36-0.94 c-6.56-0.01-13.14-0.04-19.7,0.04c-1.54,0.02-3.04-0.25-4.58,0.97c-1.14,0.9-3.14,0.73-4.76,1.02c-2.09,0.36-4.19,0.69-6.29,1.07 c-0.19,0.03-0.33,0.28-0.53,0.39c-0.37,0.22-0.74,0.54-1.14,0.59c-2.19,0.29-4.26,0.71-6.23,1.94c-1.53,0.96-3.44,1.68-5.22,1.77 c-1.75,0.09-2.67,1.41-4.14,1.82c-1.55,0.42-2.99,0.65-4.48-0.1c-0.81-0.405-1.626-0.816-2.452-1.201 c-0.68-0.317-1.835-0.735-2.558-0.934c-1.54-0.425-3.106-0.796-4.66-1.225c-0.36-0.1-0.75-0.28-1-0.54 c-1.13-1.22-3.97-1.95-5.53-1.35c-0.17,0.06-0.44,0.21-0.43,0.31c0.02,1.69-0.44,3.69,0.31,4.96c0.62,1.05,0.67,1.93,0.85,2.94 c0.3,1.71,0.65,3.4,0.99,5.1c0.03,0.13,0.11,0.31,0.22,0.36c1.21,0.52,0.68,1.35,0.48,2.21c-2.65,0-5.23,0-7.8-0.01 c-0.24,0-0.59,0.01-0.69-0.13c-1.25-1.66-3.02-0.97-4.53-0.83c-0.67,0.07-1.56,1.09-1.79,1.86c-0.3,0.97-0.07,2.11,0.02,3.18 c0.03,0.3,0.32,0.68,0.6,0.85c0.79,0.49,1.63,0.88,2.41,1.29c0,1.61-0.25,3.18,0.06,4.61c0.44,1.98-0.79,3.3-1.41,4.84 c-0.37,0.91-1.12,1.68-1.74,2.48c-0.65,0.86-1.47,1.62-1.97,2.56c-1.056,1.961-2.123,3.875-3.665,5.518 c-0.045,0.048-0.085,0.103-0.115,0.162c-0.62,1.2-1.26,2.38-1.81,3.61c-0.52,1.15-0.65,2.41-1.51,3.5c-0.8,1-1.09,2.41-1.63,3.63 c-0.4,0.91-0.89,1.79-1.23,2.73c-0.65,1.77-0.53,3.74-1.91,5.36c-0.96,1.12-1.31,2.75-2.03,4.1c-0.74,1.37-1.69,2.45-3.49,2.5 c-1.86,0.04-3.37,1.92-3.6,3.77c-0.44,3.62,2.49,5.16,4.33,7.38c0.29,0.36,0.73,0.77,0.74,1.17c0.06,1.95,0,3.9-0.04,5.84 c0,0.27-0.16,0.53-0.27,0.79c-0.22,0.58-0.62,1.14-0.66,1.73c-0.1,1.31-0.05,2.63-0.02,3.94c0,0.38,0.07,0.77,0.19,1.13 c0.27,0.77,0.78,1.51,0.84,2.29c0.15,1.79,0.08,3.6,0.11,5.4c0.01,0.78-0.28,1.79,0.1,2.29c1.42,1.91,0.12,4.44,1.72,6.36 c0.72,0.86,0.64,2.41,0.9,3.65c0.5,2.35,1.18,4.66,1.83,6.96c0.68,2.41,2.51,4.36,2.52,7.02c0,0.81,0.91,1.59,1.32,2.43 c0.52,1.07,0.95,2.19,1.43,3.28c0.11,0.24,0.28,0.45,0.41,0.68c0.56,1,1.12,1.99,1.67,2.99c0.32,0.59,0.48,1.5,0.98,1.75 c1.39,0.69,1.07,2.22,1.83,3.18c0.47,0.6,0.82,1.29,1.25,1.92c0.26,0.37,0.56,0.71,0.83,1.08c0.52,0.72,1.09,1.41,1.54,2.17 c0.52,0.89,1.47,2.02,1.24,2.71c-0.31,0.91-1.5,1.63-2.46,2.18c-1.59,0.9-3.29,1.6-4.94,2.38c-0.45,0.21-0.9,0.41-1.35,0.63 c-0.95,0.47-1.92,0.92-2.85,1.45c-0.71,0.42-1.35,0.98-2.05,1.42c-0.99,0.63-2.06,1.14-3,1.82c-0.81,0.58-1.46,1.39-2.27,1.98 c-0.53,0.4-1.41,0.43-1.81,0.9c-0.87,1.04-1.78,2-2.43,3.31c-0.93,1.85-0.62,3.28,0.36,4.67c0.71,1,1.81,1.7,3.22,1.44 c2.79-0.51,5.68,0.59,8.47-0.8c1.08-0.54,2.59-0.18,3.9-0.27c0.42-0.02,1.09-0.02,1.21-0.26c0.52-1.03,1.44-0.76,2.26-0.9 c1.76-0.28,3.52-0.6,5.28-0.92c0.13-0.02,0.33-0.1,0.37-0.21c0.43-1.07,1.39-0.83,2.22-0.9c0.63-0.06,1.27-0.03,1.88-0.15 c2.21-0.43,4.39-1,6.61-1.36c1.77-0.29,3.57-0.02,5.09,0.93c1.33,0.83,2.43,2.06,4.19,1.92c0.07,0,0.14,0.24,0.25,0.32 c0.96,0.71,1.94,1.41,3.11,2.26c-0.03,0.78,0.72,2.01-0.9,2.62c-0.11,0.05-0.12,0.35-0.21,0.52c-0.68,1.31-1.35,2.63-2.06,3.93 c-0.41,0.75-0.86,1.47-1.32,2.17c-0.52,0.79-1.16,1.5-1.6,2.33c-0.46,0.86-0.7,1.84-1.11,2.73c-0.56,1.22-1.46,2.35-1.74,3.63 c-0.31,1.34-0.12,2.81-0.03,4.22c0.08,1.17,0.87,1.95,2,2.03c1.38,0.09,2.83,0.58,4.1-0.64c0.75-0.73,1.82-1.11,2.66-1.76 c0.66-0.5,1.45-1.08,1.73-1.8c0.87-2.3,2.93-3.51,4.48-5.18c0.47-0.51,1.29-0.68,1.83-1.15c1.39-1.22,2.56-2.77,4.1-3.71 c1.46-0.88,3.26-1.31,4.97-1.65c1.24-0.24,2.38,0.18,3.64,0.89c2.31,1.31,5.28,0.57,7.75,2.06c1.12,0.68,2.84,0.67,4.2,0.82 c2.23,0.25,4.29,0.73,6.53,1.79c-0.24,0.43-0.46,0.94-0.77,1.4c-0.4,0.57-0.99,1.05-1.28,1.67c-0.79,1.67-1.35,3.39-1.07,5.31 c0.19,1.25,2.23,3.39,3.42,3.12c1.23-0.27,2.54-0.81,3.48-1.62c1.48-1.28,2.63-2.93,4.01-4.33c1.1-1.12,2.36-2.08,3.53-3.12 c0.71-0.64,1.3-1.64,2.12-1.89c1.76-0.52,3.64-0.61,5.45-0.97c1.79-0.35,3.55,0.17,5.46-0.91c1.89-1.06,4.51-0.98,6.82-1.09 c2.82-0.13,2.63-0.62,2.63,2.59c0,57.42,0.02,114.83-0.06,172.25c0,4.23,0.83,8.54-0.79,12.73c-0.62,1.6-0.25,3.38-1,5.17 c-0.81,1.94-0.89,4.43-1.01,6.62c-0.34,6.56-0.12,13.14-0.11,19.72c0,0.48-0.12,1.18,0.15,1.41c1.43,1.27-0.05,3.62,1.8,4.67 c0.34,3.04,0.98,6.08,0.99,9.12c0.06,52.79,0.04,105.58,0.04,158.37c0,3.16,0,6.33-0.03,9.49c0,0.57-0.12,1.14-0.26,1.69 c-0.19,0.72-0.64,1.41-0.66,2.11c-0.11,3.56-0.11,7.11-0.16,10.67c-0.01,0.42-0.1,0.85-0.21,1.27c-0.2,0.8-0.52,1.58-0.66,2.4 c-0.17,0.95-0.16,1.93-0.31,2.89c-0.16,1.01-0.64,2.01-0.6,2.99c0.16,3.93,0.47,7.84,0.73,11.76c0.01,0.09,0.01,0.19,0.03,0.29 c0.02,0.09,0.03,0.25,0.09,0.26c1.53,0.52,1.01,1.83,1.01,2.84c0.04,8.82,0.12,17.63-0.03,26.45c-0.05,2.65,0.87,5.42-0.97,8.02 c-0.8,1.12-0.72,2.87-1.05,4.32c-0.05,0.23-0.17,0.43-0.26,0.64c-0.55,1.3-1.35,2.55-1.59,3.9c-0.47,2.59-1.33,5.12-1.07,7.86 c0.22,2.37-0.05,4.78,0.08,7.16c0.1,1.83,0.58,3.64,0.72,5.47c0.11,1.56-0.68,2.28-2.23,2.29c-2.87,0.02-5.74-0.01-8.61,0.03 c-0.6,0.01-1.54,0.04-1.74,0.4c-0.54,0.93-1.29,0.71-2.03,0.74c-1.89,0.09-3.92-0.26-5.63,0.33c-1.64,0.56-3.18,0.44-4.77,0.55 c-0.77,0.05-1.56,0-2.33,0.04c-0.39,0.03-0.99,0.03-1.1,0.25c-0.72,1.33-1.93,0.77-2.95,0.89c-0.68,0.07-1.56-0.12-1.99,0.24 c-1.51,1.3-3.91-0.13-5.14,1.79c-2.12-0.02-4.15,0.22-6.23,0.82c-1.96,0.56-2.12,0.32-2.18,2.44c-0.01,0.34-0.01,0.69,0,1.03 c0.06,1.68,2.24,2.98,3.84,2.46c2.01-0.65,4.08-1.5,6.15-1.56c7.1-0.21,14.21-0.12,21.31-0.12c0.47-0.01,0.99,0.07,1.4,0.28 c1.67,0.85,3.32,1.62,5.27,1.47c0.64-0.05,1.32,0.15,1.95,0.35c0.64,0.19,1.22,0.71,1.84,0.75c3.19,0.16,3.22,0.16,3.33,3.45 c0.02,0.47,0.05,1.22,0.31,1.34c2.07,0.98,1.89,2.8,1.64,4.51c-0.1,0.64-0.81,1.33-1.41,1.69c-0.29,0.17-1-0.36-1.53-0.56 c-0.43-0.16-0.87-0.4-1.32-0.42c-1.21-0.07-2.43-0.01-3.65-0.06c-0.4-0.01-0.97-0.03-1.18-0.29c-1.01-1.21-2.46-2.07-2.96-3.72 c-0.12-0.39-0.73-0.77-1.18-0.88c-0.64-0.15-1.36,0-2.03-0.08c-3.01-0.39-4.31,2.14-4.4,4.43c-0.18,4.77-0.13,9.54-0.14,14.31 c-0.01,2.82,2.03,4.69,4.86,4.52c0.33-0.03,0.71,0,1-0.14c0.39-0.2,0.79-0.49,1.05-0.84c0.57-0.81,0.87-2.08,1.62-2.43 c1.73-0.79,3.65-1.22,5.52-1.65c1.12-0.26,2.33-0.11,3.44-0.37c0.5-0.12,0.83-1.12,1.47-0.21c0.36,0.51,0.86,1.02,0.95,1.59 c0.16,0.95,0.03,1.94,0.06,2.91c0.02,0.73-0.3,1.6,0.72,2.02c0.1,0.04,0.07,0.87-0.06,0.92c-0.9,0.37-1.84,0.86-2.77,0.87 c-4.38,0.09-8.76-0.08-13.14,0.08c-4.25,0.15-8.48,0.6-12.73,0.93c-0.14,0.01-0.29,0.04-0.42,0.1c-0.18,0.06-0.46,0.13-0.49,0.24 c-0.27,1.05-1.1,0.74-1.78,0.78c-1.26,0.07-2.71-0.25-3.73,0.27c-1.56,0.79-3.07,0.49-4.61,0.6c-0.83,0.06-1.66-0.02-2.48,0.05 c-0.46,0.04-0.92,0.23-1.36,0.4c-0.57,0.22-1.11,0.68-1.66,0.69c-5.74,0.12-11.48,0.25-17.22,0.19c-2.94-0.03-5.8,0.32-8.66,0.89 c-1.92,0.38-3.87,0.56-5.81,0.84c-0.14,0.02-0.37,0.03-0.41,0.11c-0.64,1.38-1.89,0.79-2.91,0.91c-0.67,0.07-1.58-0.17-1.99,0.19 c-1.16,1-2.45,0.58-3.69,0.69c-0.83,0.07-1.68,0-2.47,0.2c-0.46,0.12-0.79,0.86-1.24,0.91c-2.91,0.37-5.84,0.62-8.76,0.91 c-0.15,0.01-0.35-0.02-0.43,0.06c-0.65,0.68-1.53,1.29-1.85,2.11c-0.31,0.78,0.21,1.51,0.84,2.36c1.3,1.76,2.87,2,4.54,1.69 c2.76-0.49,5.54,0.64,8.38-0.92c1.96-1.08,4.67-0.8,7.06-1.06c1.06-0.12,2.14-0.03,3.21-0.09c0.36-0.02,0.71-0.16,1.05-0.3 c0.57-0.23,1.13-0.71,1.7-0.71c7.2-0.09,14.42,0.25,21.57-0.98c0.95-0.16,1.86-0.79,2.8-0.8c8.27-0.06,16.54-0.03,24.81-0.02 c0.44,0,1.03-0.11,1.28,0.12c1.16,1.09,2.55,0.69,3.86,0.72c2.62,0.06,5.26-0.04,7.88,0.09c3.92,0.2,7.83,0.57,11.75,0.79 c0.98,0.06,1.1,0.61,1.1,1.33c0.03,2.39,0.05,4.78,0.05,7.16c-0.01,2.02-1.87,3.14-3.77,2.39c-0.95-0.37-1.99-0.7-2.98-0.7 c-10.76-0.06-21.51-0.02-32.27-0.07c-1.58-0.01-3.37,0.66-4.65-0.97c-0.08-0.09-0.27-0.11-0.41-0.13 c-2.93-0.32-5.86-0.62-8.79-0.95c-0.4-0.04-0.8-0.18-1.18-0.33c-0.57-0.24-1.13-0.77-1.69-0.77c-7.35-0.03-14.69,0-22.04,0.04 c-0.95,0-2.27,1.35-2.31,2.29c-0.03,0.86-0.1,1.62,1.01,2.08c0.65,0.27,0.96,1.53,1.59,1.68c1.92,0.48,3.91,0.63,5.87,0.93 c1.04,0.15,2.37-0.55,2.94,1.01c0.04,0.1,0.36,0.11,0.55,0.12c3.51,0.33,7.01,0.67,10.52,0.95c1.16,0.1,2.34,0.02,3.5,0.08 c0.4,0.02,0.79,0.25,1.19,0.39c0.5,0.18,1.01,0.52,1.52,0.53c2.43,0.06,4.86,0.01,7.3,0.06c0.65,0.01,1.3,0.23,1.94,0.4 c0.48,0.13,0.93,0.46,1.4,0.46c7.84,0.09,15.67,0.05,23.5,0.23c5.81,0.13,11.61,0.48,17.4,0.86c0.64,0.05,1.54,0.85,1.76,1.49 c0.49,1.43,1.55,2.76,1.15,4.45c-0.06,0.27,0.33,0.63,0.48,0.97c0.55,1.25,1.09,2.51,1.63,3.77c-0.137,0.184-0.17,0.23-0.307,0.414 c-0.944-0.093-1.899-0.132-2.823-0.294c-0.59-0.1-1.13-0.53-1.7-0.54c-6.96-0.1-13.91-0.14-20.87-0.22 c-1.08-0.01-2.29,0.4-3.09-0.88c-0.16-0.27-0.9-0.25-1.38-0.26c-1.6-0.03-3.21-0.01-4.82-0.01c-0.33-0.01-0.83,0.09-0.99-0.09 c-0.91-1.09-2.14-0.72-3.26-0.77c-1.26-0.05-2.53,0.01-3.79-0.02c-0.36-0.01-0.72-0.14-1.05-0.29c-0.58-0.25-1.11-0.75-1.7-0.82 c-2.88-0.32-5.74-0.13-8.66-0.74c-3.27-0.68-6.78-0.21-10.19-0.18c-0.48,0-1.14,0.2-1.4,0.55c-0.9,1.21,0.09,4.17,1.51,4.44 c2.01,0.39,4.05,0.6,6.08,0.87c0.72,0.1,1.84-0.1,2.09,0.29c0.78,1.21,1.85,0.74,2.83,0.84c0.92,0.1,2.04-0.16,2.7,0.29 c1.05,0.71,2.08,0.6,3.16,0.65c1.06,0.05,2.18-0.07,3.19,0.21c1.63,0.45,3.16,1.3,4.8,1.72c1.71,0.45,3.48,0.08,5.27,1.06 c1.43,0.78,3.44,0.32,5.23,0.91c2.13,0.71,4.5-0.02,6.83,0.88c2.46,0.95,5.22,0.01,8.01,1.07c3.13,1.19,6.86,0.81,10.33,1.12 c0.57,0.05,1.18,0.03,1.68,0.26c0.64,0.3,1.17,0.82,1.75,1.24c0.15-0.02,0.31-0.05,0.46-0.08c-0.1,1.18,0.17,2.59-0.39,3.5 c-0.86,1.38-2.53,1.97-4.19,2.02c-3.25,0.08-6.51,0.02-9.76,0.07c-1.86,0.03-2.68,0.94-2.66,2.81c0.01,0.93,1.47,3.14,2.4,3.36 c1.65,0.4,3.33,0.82,5.01,0.9c3.06,0.14,6.13,0.03,9.19,0.05c1.58,0,2.3,0.73,2.31,2.34c0.02,3.12,0.22,6.25-0.07,9.34 c-0.2,2.13,1.22,2.97,2.27,4.19c0.09,0.1,0.56,0.01,0.73-0.14c0.99-0.82,1.37-1.83,1.28-3.18c-0.06-1.03,0.45-2.08,0.6-3.13 c0.26-1.95-0.25-4.06,1.26-5.73c0.28-5.74,0.56-11.48,0.85-17.22c0.04-0.83,0.14-1.66,0.12-2.48c-0.08-3.46,0.65-6.86,0.83-10.28 c0.13-2.46-0.51-4.96-0.75-7.44c-0.12-1.26,0.28-2.76-0.28-3.74c-0.87-1.54-0.47-3.05-0.63-4.58c-0.05-0.53,0.01-1.07-0.06-1.6 c-0.05-0.37-0.12-0.96-0.36-1.06c-0.97-0.44-0.73-1.24-0.75-1.98c-0.04-1.8,0.39-3.78-0.24-5.34c-0.66-1.64-0.54-3.17-0.62-4.76 c-0.07-1.22-0.02-2.44-0.04-3.65c-0.01-0.44,0.04-1.1-0.2-1.26c-1.41-0.94-0.74-2.36-0.95-3.57c-0.24-1.44-0.63-2.87-0.69-4.32 c-0.07-1.59-0.67-3.32,0.58-4.74c0.21-0.24,0.92-0.42,1-0.32c0.42,0.54,0.88,1.15,1.01,1.8c0.31,1.52-0.14,3.06,1.03,4.58 c1.02,1.3,1.22,3.22,1.85,4.85c0.34,0.86,0.86,1.64,1.25,2.49c0.27,0.58,0.43,1.22,0.69,1.82c0.46,1.07,0.96,2.13,1.45,3.19 c0.52,1.12,1.04,2.24,1.56,3.35c0.41,0.87,1.05,1.69,1.2,2.59c0.41,2.58,0.73,5.18,0.87,7.78c0.17,3.21,0.12,6.43,0.19,9.64 c0.01,0.43-0.01,1.08,0.24,1.23c1.04,0.66,0.84,1.66,0.91,2.6c0.27,3.54-0.37,7.08,0.66,10.64c0.5,1.72,1.74,2.57,2.66,3.79 c0.16,0.21,0.75,0.19,1.12,0.12c0.62-0.12,2.42-2.53,2.46-3.18c0.51-8.75-0.35-17.53,0.71-26.29c0.41-3.38-0.31-6.91-0.58-10.36 c-0.09-1.15,0.49-2.57-1.1-3.24c-0.11-0.04-0.11-0.35-0.13-0.54c-0.3-2.81-0.59-5.62-0.9-8.42c-0.05-0.47-0.11-1.21-0.38-1.33 c-1.02-0.43-0.73-1.26-0.78-1.97c-0.08-1.11,0.3-2.53-0.25-3.27c-0.83-1.1-0.52-2.02-0.49-3.05c1.99-0.43,3.75-1.81,5.74-0.95 c0.39,2.88,0.85,5.69,1.14,8.52c0.23,2.29,1.01,4.26,2.89,5.63c0.45,0.33,1.22,0.47,1.77,0.35c0.76-0.15,1.45-0.63,2.3-1.03 c0-2.53-0.02-5.15,0.02-7.78c0.01-0.86-0.14-1.96,0.31-2.53c0.91-1.16,0.53-1.98-0.12-2.77c0.48-1.75,1.76-1.6,3.07-1.64 c6.71-0.25,13.42-0.57,20.13-0.87c0.19,0,0.39-0.03,0.58-0.06c2.915-0.587,5.795-1.362,8.816-1.146 c1.388,0.099,2.779,0.185,4.166,0.067c1.583-0.135,3.2,0.101,4.658-0.921c0.97-0.68,1.69-1.88,1.18-3.28 c-0.25-0.68-1.16-1.55-1.81-1.58c-5.95-0.3-11.92-0.12-17.83-1.11c-0.37-0.06-0.98-0.04-1.06-0.23c-0.47-1.12-1.42-0.85-2.25-0.88 c-1.79-0.07-3.78,0.4-5.34-0.22c-1.54-0.62-2.97-0.51-4.46-0.69c-4.45-0.53-9.09,1.2-13.37-1.14c-0.57-0.31-1.22-0.55-1.66-0.99 c-1.16-1.18-2.18-2.5-3.35-3.68c-1.89-1.9-3.88-3.71-5.77-5.62c-1.11-1.1-1.9-2.74-3.21-3.36c-1.71-0.81-2.94-1.96-4.27-3.2 c-1.45-1.36-3.25-2.35-5.13-3.67v-1.37c2.39,0.23,4.78-0.38,6.81,1.6c0.74,0.73,2.1,1.17,3.17,1.15c2.07-0.06,2.81-1.1,2.83-3.22 c0.012-1.029,0.105-2.072-0.135-3.065c-0.126-0.522-0.594-1.242-0.983-1.612c-0.994-0.944-2.204-1.718-2.982-2.803 c-1.18-1.62-2.71-2.7-4.3-3.8c-0.66-0.45-1.27-1.04-1.77-1.68c-0.62-0.77-1.01-1.75-1.67-2.48c-0.7-0.79-1.07-1.55-1.07-2.66 c0.04-25.52,0.02-51.03,0.09-76.55c0.01-2.45,0.54-4.89,0.86-7.33c0.02-0.2,0.28-0.36,0.38-0.56c0.51-1.02,1.37-2.03,1.42-3.07 c0.2-4.67,0.37-9.36,0.15-14.02c-0.23-4.6,0.89-9.24-0.91-13.86c-0.97-2.5-0.76-5.45-1.08-8.2c-0.06-0.53-0.12-1.06-0.22-1.59 c-0.17-0.92-0.53-1.84-0.54-2.75c0-1.6-0.1-3.16,0.52-4.8c0.54-1.42,0.41-3.2,0.21-4.77c-0.37-2.8,0.82-5.35,0.97-8.05 c0.01-0.14,0.05-0.36,0.14-0.4c1.26-0.61,0.84-1.8,0.99-2.79c0.06-0.43-0.11-1.04,0.12-1.27c1.46-1.45,0.73-3.5,1.61-5.25 c1.1-2.2-0.12-5.19,1.07-7.68c0.04-9.5,0.1-18.99,0.12-28.49c0-1.74,0.34-3.72-0.35-5.18c-0.85-1.83-0.55-3.56-0.74-5.33 c-0.04-0.36-0.16-0.73-0.31-1.07c-0.25-0.56-0.68-1.08-0.79-1.67c-0.37-2.01-0.64-4.05-0.95-6.07 c-0.018-0.064-0.035-0.126-0.053-0.19c-0.547-1.29-1.442-2.513-1.707-3.87c-0.47-2.46-0.88-4.98-0.88-7.47 c-0.04-51.72-0.02-103.44-0.05-155.15c0-2.24,0.68-3.89,2.54-5.13c0.81-0.53,1.5-1.26,2.19-1.96c1.11-1.12,2.13-2.32,3.27-3.39 c0.39-0.36,1.19-0.28,1.57-0.64c1.32-1.26,2.51-2.66,3.81-3.95c1.03-1.02,2.18-1.94,3.2-2.97c1.34-1.36,2.58-2.82,3.92-4.18 c1.21-1.22,2.62-2.26,3.72-3.58c1.17-1.4,2.28-2.77,4.14-3.27c0.14-0.04,0.24-0.28,0.35-0.43c1.26-1.87,1.11-3.98,0.97-6.07 c-0.02-0.38-0.44-0.97-0.78-1.06c-2.42-0.64-4.68,0.12-6.93,0.92c-0.29,1.52-1.89,1.12-2.8,1.7c-1.15,0.74-2.85,0.01-4.3,1.16 c-0.88,0.7-2.61,0.58-3.96,0.92c-1.74,0.44-3.32,1.03-4.92,2.07c-0.1-0.55-0.25-1.01-0.25-1.47c0-2.48-0.03-4.97,0.07-7.45 c0.23-5.62,0.14-11.24,0.73-16.88c0.56-5.39-0.01-10.89-0.04-16.34c-0.03-6.04,0.03-12.08-0.03-18.12 c-0.03-2.15,0.05-4.26-0.48-6.46c-0.76-3.17-0.78-6.51-1.2-9.77c-0.11-0.84-0.54-1.64-0.8-2.46c-0.06-0.22-0.15-0.54-0.04-0.67 c0.72-0.89,1.46-1.75,2.24-2.59c1.82-1.97,3.8-3.81,5.45-5.92c1.33-1.69,2.58-3.28,4.76-3.9c0.76-0.21,1.55-0.62,2.13-1.15 c1.19-1.11,2.12-2.36,3.81-3.06c1.74-0.72,3.12-2.32,4.64-3.56c0.41-0.33,0.73-0.78,1.16-1.07c2.04-1.42,4.11-2.79,6.15-4.21 c0.29-0.2,0.44-0.61,0.73-0.8c1.46-0.91,3.01-1.69,4.41-2.68c1.16-0.81,2.17-1.83,3.2-2.8c0.46-0.44,0.86-0.97,1.18-1.51 c0.4-0.68,0.54-1.55,1.06-2.09c1.159-1.21,1.822-2.544,1.82-4.222c0-0.258,0.046-0.516,0.159-0.747c0.97-1.97,2.06-3.9,2.95-5.92 c1.15-2.6,2.08-5.3,3.24-7.89c1.04-2.33,2.44-4.52,3.34-6.89c0.61-1.59,1.59-2.02,3.03-2.03c3.99-0.03,7.99-0.22,11.96,0.02 c2.25,0.14,3.79-1.49,5.85-1.66c0.717-0.051,1.424-0.522,2.077-0.886c0.846-0.472,1.672-0.976,2.476-1.516 c0.646-0.434,1.381-0.838,1.917-1.398C230.441,131.98,230.311,130.27,230.071,128.64z M111.437,192.42 c-46.57,0-84.32-37.75-84.32-84.32c0-46.56,37.75-84.31,84.32-84.31c46.56,0,84.31,37.75,84.31,84.31 C195.747,154.67,157.997,192.42,111.437,192.42z" - ], - clocks: { - size: 169, - 0: { x: 111.011, y: 108.5 } - } - }, - 2: { - height: 625.438, - width: 197.009, - path: "M193.86,271.21c-2.234-2.626-5.64-4.792-8.929-5.835c-6.793-2.153-11.841,2.196-17.463,7.369 c-5.009-25.727-17.583-43.987-38.477-54.246l-18.909-21.56v-12l20.773-23.686c19.55-10.446,31.402-28.304,36.229-53.096 c5.622,5.174,10.67,9.523,17.463,7.369c3.289-1.043,6.695-3.208,8.929-5.835c4.877-5.734,3.879-14.302-1.542-19.605 c-6.442-6.301-13.569-5.549-24.852,3.382c-4.816-25.231-17.183-43.587-38.409-54.031h0.158c-1.506-0.732-3.056-1.394-4.625-2.025 c-2.997-1.25-6.144-2.365-9.463-3.327c0,0-0.527-0.089-1.457-0.217c-2.421-0.731-4.757-2.02-7.743-3.273 c2.103-2.282,3.255-3.455,4.321-4.703c5.176-6.057,4.821-14.978-0.792-20.538c-5.647-5.594-14.543-5.829-20.352-0.539 c-6.101,5.556-6.808,14.49-1.648,20.831c4.153,5.103,3.905,5.403-2.49,8.055c-1.793,0.744-3.604,1.465-5.417,2.187 c-10.281,3.032-16.092,6.929-22.875,12.001c-12.415,9.284-19.739,22.385-23.521,37.515c-0.673,2.693-2.08,5.2-3.437,8.492 c-2.262-2.122-3.424-3.284-4.661-4.36c-6.003-5.222-14.845-4.864-20.356,0.799c-5.544,5.698-5.778,14.673-0.534,20.534 c5.507,6.156,14.361,6.869,20.646,1.662c5.058-4.19,5.355-3.94,7.984,2.512c3.394,8.33,6.292,17.054,10.972,24.62 c6.032,9.752,14.303,16.873,24.096,21.915l21.601,23.357v12l-20.223,21.867c-10.232,5.068-18.855,12.348-25.091,22.43 c-4.68,7.566-7.578,16.29-10.972,24.62c-2.629,6.452-2.926,6.702-7.984,2.512c-6.285-5.206-15.139-4.493-20.646,1.662 c-5.243,5.861-5.01,14.837,0.534,20.534c5.511,5.663,14.352,6.021,20.356,0.799c1.237-1.076,2.399-2.238,4.661-4.36 c1.356,3.292,2.764,5.799,3.437,8.492c3.782,15.13,11.106,28.232,23.521,37.515c7.877,5.89,14.425,10.198,28.206,13.404 c1.38,0.321,2.787,0.579,4.201,0.789c0.031,27.796,0.06,69.604,0.085,105.236c0.009,13.829,0.018,26.73,0.026,37.518 c0,0.826-0.08,1.652-0.121,2.436c-3.447,0.597-4.58-0.495-4.682-4.511c-0.072-2.822-0.002-5.649-0.016-8.473 c-0.024-4.802-0.891-5.97-4.609-5.976c-14.432-0.022-28.864-0.01-43.295-0.009c-4.627,0-9.255,0.084-13.881-0.022 c-3.054-0.07-4.428,1.698-4.326,5.623c0.079,3.039,0.085,6.08-0.001,9.119c-0.111,3.933,1.27,5.674,4.317,5.646 c8.372-0.076,16.745-0.038,25.118-0.024c4.14,0.007,4.933,1.055,4.947,6.397c0.024,9.702,0.024,9.702-7.67,9.702 c-7.381-0.001-14.762-0.025-22.143,0.006c-3.558,0.015-4.54,1.209-4.551,5.611c-0.035,13.947-0.943,13.109,10.004,13.035 c6.61-0.045,13.22-0.032,19.83,0.002c3.528,0.018,4.463,1.226,4.534,5.638c0.17,10.455,0.17,10.455-8.056,10.455 c-7.271,0-14.542-0.024-21.813,0.01c-3.492,0.016-4.48,1.263-4.503,5.672c-0.067,12.642-0.701,12.243,9.397,12.129 c6.83-0.077,13.661-0.04,20.491-0.004c3.466,0.018,4.419,1.281,4.484,5.702c0.154,10.39,0.154,10.39-8.106,10.39 c-7.271,0-14.542-0.026-21.813,0.01c-3.447,0.017-4.439,1.296-4.452,5.736c-0.039,13.671-0.908,12.955,9.772,12.916 c17.076-0.063,34.152-0.012,51.227-0.02c4.329-0.002,5.098-1.02,5.1-6.63c0.001-1.977-0.037-3.956,0.007-5.931 c0.094-4.282,1.178-5.371,4.197-4.937c1.031,10.07,1.909,19.99,3.129,29.842c0.425,3.429,1.312,6.98,2.695,9.93 c1.2,2.56,3.388,5.993,5.16,6.013c1.744,0.02,4.469-3.383,5.098-5.954c2.029-8.292,4.037-16.802,4.667-25.395 c0.85-11.612,0.501-23.379,0.517-35.079c0.042-30.977,0.078-68.798,0.115-106.572c0.037-37.246,0.075-74.445,0.121-104.988 c3.105-0.304,5.045-0.635,5.045-0.635c29.872-8.658,46.55-29.062,52.338-59.383c11.283,8.931,18.409,9.683,24.852,3.382 C197.739,285.512,198.737,276.945,193.86,271.21z M44.186,100.381c0-29.823,24.177-54,54-54s54,24.177,54,54 c0,29.823-24.177,54-54,54S44.186,130.205,44.186,100.381z M98.186,334.381c-29.823,0-54-24.177-54-54c0-29.823,24.177-54,54-54 s54,24.177,54,54C152.186,310.205,128.009,334.381,98.186,334.381z", - clocks: { - size: 108, - 0: { x: 98.579, y: 280 }, - 1: { x: 98.579, y: 100 } - } - }, - 3: { - height: 915.936, - width: 277.634, - path: "M263.752,257.836c-13.719,1.508,3.345-15.515,3.955-23.109l-0.113,0.113 c8.127-22.574,2.75-46.079-10.802-65.608c14.365-1.735,19.981-6.287,20.122-15.339c0.118-7.617-5.228-14.388-12.762-14.963 c-3.451-0.263-7.412,0.636-10.496,2.245c-6.369,3.324-6.896,10.001-7.248,17.67c-12.146-8.157-24.329-12.988-36.575-14.34 c-2.94-2.54-4.264-6.236-3.879-10.997c0.451-5.587,0.239-11.066-0.572-16.359c0.828-2.872,1.549-5.847,2.156-8.934 c5.672,5.174,10.766,9.523,17.62,7.369c3.319-1.043,6.755-3.208,9.009-5.835c4.921-5.734,3.914-14.302-1.556-19.605 c-6.5-6.301-13.69-5.549-25.075,3.382c-5.055-30.578-25.967-51.62-54.619-60.047c-2.447-0.732-4.807-2.023-7.825-3.278 c2.125-2.286,3.29-3.461,4.367-4.71c11.938-14.551-7.15-33.181-21.367-21.111c-6.165,5.565-6.879,14.513-1.665,20.864 c4.197,5.111,3.946,5.411-2.516,8.068c-1.812,0.745-3.642,1.467-5.474,2.19c-24.645,7.648-40.948,25.21-46.886,49.595 c-0.68,2.698-2.102,5.208-3.473,8.505c-2.286-2.125-3.461-3.29-4.71-4.367c-14.552-11.938-33.18,7.152-21.111,21.367 c5.565,6.165,14.513,6.879,20.864,1.665c4.71-3.867,5.338-3.944,7.487,1.123c-1.309,6.465-1.74,13.174-1.396,20.102 c0.3,6.03-1.497,10.097-5.356,12.617c-8.889,2.044-17.148,6.132-25.567,9.656c-6.448,2.691-6.837,2.656-7.484-3.926 c-0.804-8.178-7.636-14-15.931-13.576c-18.581,1.516-18.918,28.187-0.181,30.036c1.645,0.122,3.299,0.129,6.419,0.243 c-1.366,3.319-2.113,5.992-3.558,8.47c-3.428,5.74-6.123,11.683-7.912,17.811c-4.722,16.154-2.533,34.602,5.996,50.411 c1.801,5.691,8.569,13.392-1.603,12.903c-40,12.971,18.416,54.114,16.704,9.691c34.782,3.225,46.692,41.92,80.447,49.674 c7.963,2.791,11.179,6.671,12.046,13.724c0.012,3.241,0.01,6.503,0,9.829h-0.223c0,2.086,0,5.309,0,5.309s0.065,0.184-0.069,0.268 c-7.211-0.002-14.005-0.041-20.79,0.015c-4.483,0.037-6.154,1.09-6.592,4.667c-0.352,4.638-0.043,9.45-0.131,14.122 c0.062,5.274,1.49,6.69,6.861,6.724c6.999,0.045,13.998,0.011,21.721,0.011v5.671c-7.723,0-14.722-0.034-21.721,0.011 c-5.372,0.035-6.799,1.45-6.861,6.724c0.087,4.671-0.221,9.484,0.131,14.122c0.438,3.577,2.109,4.63,6.592,4.667 c6.785,0.056,13.579,0.017,20.79,0.015c0.134,0.084,0.279,0.175,0.069,0.268v5.406h0.599c0.031,3.784,0.031,7.619,0,12h-0.599 v4.809c0,0,0.065,0.184-0.069,0.268c-7.211-0.002-14.005-0.041-20.79,0.015c-4.483,0.037-6.154,1.09-6.592,4.667 c-0.352,4.638-0.043,9.45-0.131,14.122c0.062,5.274,1.49,6.69,6.861,6.724c6.999,0.045,13.998,0.011,21.721,0.011v5.671 c-7.723,0-14.722-0.034-21.721,0.011c-5.372,0.035-6.799,1.45-6.861,6.724c0.087,4.671-0.221,9.484,0.131,14.122 c0.438,3.577,2.109,4.63,6.592,4.667c6.785,0.056,13.579,0.017,20.79,0.015c0.134,0.084,0.279,0.175,0.069,0.268v4.906h0.599 c0.031,4.284,0.031,8.119,0,12h-0.599v5.309c0.211,0.092,0.065,0.184-0.069,0.268c-7.211-0.002-14.005-0.041-20.79,0.015 c-4.483,0.037-6.154,1.09-6.592,4.667c-0.352,4.638-0.043,9.45-0.131,14.122c0.062,5.274,1.49,6.69,6.861,6.724 c6.999,0.045,21.721,0.011,21.721,0.011v5.671c0,0-14.722-0.034-21.721,0.011c-5.372,0.035-6.799,1.45-6.861,6.724 c0.087,4.671-0.221,9.484,0.131,14.122c0.438,3.577,2.109,4.63,6.592,4.667c6.785,0.056,13.579,0.017,20.79,0.015 c0.134,0.084,0.279,0.175,0.457,0.268c0,1.594,4.559,168.228,4.51,209.286c-0.005,4.1,0.442,9.128,0.442,10.259 c-3.396,0-6.234,0.133-9.054-0.034c-3.499-0.206-5.37,1.456-6.735,4.558c-1.281,2.913-2.803,5.866-4.843,8.27 c-6.58,7.751-16.578,7.84-23.206,0.144c-2.209-2.565-3.736-5.81-5.169-8.932c-1.239-2.699-2.939-4.083-5.916-4.024 c-3.712,0.073-7.428,0.078-11.14-0.009c-3.163-0.074-4.936,1.432-6.143,4.306c-1.141,2.716-2.476,5.469-4.285,7.764 c-8.725,11.281-23.01,6.923-27.966-5.357c-1.496-5.628-5.039-7.274-10.521-6.767c-4.485,0.415-6.285,1.937-6.286,6.612 c-0.001,15.755-0.002,31.511-0.003,47.266c-0.001,16.376-0.012,32.752,0.006,49.127c0.004,3.646,2.039,5.706,5.586,5.765 c4.244-0.151,7.724,1.078,9.747-3.72c1.63-3.566,3.31-7.297,5.811-10.239c5.927-6.969,15.25-7.396,21.596-0.827 c2.91,3.012,4.885,7.078,6.716,10.936c1.245,2.623,2.748,3.896,5.573,3.857c3.96-0.055,7.925-0.102,11.882,0.027 c3.041,0.099,4.629-1.359,5.914-4.011c1.386-2.861,3.016-5.766,5.166-8.063c10.107-10.412,22.254-3.718,27.139,8.037 c1.337,2.907,3.18,4.141,6.281,4.034c3.442-0.119,6.891-0.027,10.523-0.027c1.065,5.652,2.167,11.021,3.856,16.453 c1.228,3.675,2.407,8.536,7.056,8.594c4.923,0.061,6.042-4.987,7.307-8.743c1.456-4.322,2.867-8.847,3.125-13.35 c0.728-12.721,1.152-25.477,1.174-38.219c0.19-111.404,0.292,50.177,0.366-61.227c0.003-5.129,0.201-18.49,0.201-22.46 c0-41.693,4.098-203.286,4.098-209.558c8.112,0,15.82-0.053,23.528,0.021c5.544,0.13,6.64-3.323,6.288-8.201 c0.033-3.547,0.038-7.095-0.007-10.642c-0.066-5.278-1.476-6.669-6.885-6.701c-7.529-0.044-23.121-0.011-23.121-0.011v-5.671 c0,0,15.592,0.033,23.121-0.011c5.408-0.032,6.819-1.423,6.885-6.701c0.044-3.547,0.04-7.095,0.007-10.642 c0.351-4.882-0.742-8.33-6.288-8.201c-7.707,0.073-15.416,0.021-22.724,0.021v-22.76c7.308,0,15.017-0.053,22.724,0.021 c5.544,0.13,6.64-3.323,6.288-8.201c0.033-3.547,0.038-7.095-0.007-10.642c-0.066-5.278-1.476-6.669-6.885-6.701 c-7.529-0.044-15.059-0.011-23.121-0.011v-5.671c8.062,0,15.592,0.033,23.121-0.011c5.408-0.032,6.819-1.423,6.885-6.701 c0.044-3.547,0.04-7.095,0.007-10.642c0.351-4.882-0.742-8.33-6.288-8.201c-7.707,0.073-15.416,0.021-22.724,0.021v-22.76 c7.308,0,15.017-0.053,22.724,0.021c5.544,0.13,6.64-3.323,6.288-8.201c0.033-3.547,0.038-7.095-0.007-10.642 c-0.066-5.278-1.476-6.669-6.885-6.701c-7.529-0.044-15.059-0.011-23.121-0.011v-5.671c8.062,0,15.592,0.033,23.121-0.011 c5.408-0.032,6.819-1.423,6.885-6.701c0.044-3.547,0.04-7.095,0.007-10.642c0.351-4.882-0.742-8.33-6.288-8.201 c-7.707,0.073-15.416,0.021-22.724,0.021v-13.831c0.379-7.638,5.186-13.149,13.162-15.825 c28.456-7.104,41.808-33.352,64.888-48.287c17.492-10.743,9.354,22.937,28.518,19.129 C282.127,286.309,282.455,259.681,263.752,257.836z M105.697,839.074c0.498,2.38,0.15,4.934-3.302,4.884 c-2.295-0.033-3.176,1.042-3.702,3.217c-0.26,1.076-1.713,2.383-2.793,2.559c-0.723,0.118-2.36-1.479-2.505-2.467 c-0.409-2.804-2.004-3.344-4.385-3.299c-3.709,0.07-7.424,0.116-11.131-0.006c-3.83-0.126-3.945,2.278-3.981,5.13 c-0.038,2.976,0.755,4.826,4.142,4.589c1.477-0.103,2.968,0.015,4.451-0.025c2.202-0.059,4.543-0.006,4.579,2.901 c0.039,3.187-2.477,3.119-4.78,3.068c-1.36-0.03-2.728,0.082-4.08-0.025c-3.258-0.257-4.5,1.312-4.272,4.425 c-0.041,4.353,1.027,8.028-4.883,7.506c-7.022,0.039-7.951,0.802-7.543-7.405c0.169-3.39-1.192-4.855-4.554-4.524 c-0.857,0.085-1.922,0.329-2.555-0.056c-1.2-0.729-2.156-1.861-3.213-2.825c1.006-1.017,1.944-2.121,3.057-3.004 c0.38-0.301,1.199-0.042,1.817-0.044c5.007-0.022,7.131-2.986,5.196-7.646c-0.392-0.945-1.974-1.785-3.11-1.944 c-3.651-0.437-7.442,0.158-11.117-0.121c-3.786-0.387-5.894,0.721-5.698,5.061c0.045,0.996-1.78,2.077-2.744,3.119 c-0.848-1.038-2.451-2.105-2.412-3.108c0.153-3.932-1.445-5.27-5.269-5.225c-1.017,0.012-2.491-1.899-2.973-3.215 c-0.52-1.421-0.127-3.18-0.126-4.791c0-5.24-0.002-5.268,5.3-5.954c2.366-0.306,3.023-1.787,2.927-3.889 c-0.098-2.143,0.268-4.425,2.848-4.073c1.034,0.141,2.342,2.528,2.49,3.998c0.282,2.788,1.314,4.039,4.131,3.976 c3.956-0.088,7.919-0.125,11.873,0.011c3.063,0.105,4.168-1.204,4.13-4.212c-0.036-2.816-0.326-5.041-3.916-4.755 c-2.559,0.203-4.468-0.474-4.367-3.527c0.095-2.865,2.016-3.344,4.358-3.173c2.898,0.212,3.849-1.243,3.979-4.019 c0.085-1.821,0.73-5.002,1.563-5.153c3.046-0.553,6.308-0.31,9.408,0.165c0.646,0.099,1.284,2.453,1.345,3.795 c0.224,4.967,0.374,5.207,5.401,5.214c1.361,0.002,2.929-0.422,4.027,0.116c1.271,0.623,2.94,2.09,2.942,3.194 c0.002,1.125-1.621,2.815-2.876,3.241c-1.665,0.565-3.667,0.223-5.518,0.132c-3.18-0.157-3.971,1.57-3.952,4.398 c0.019,2.703,0.495,4.64,3.783,4.569c3.956-0.085,7.916-0.055,11.873-0.012c2.165,0.024,3.322-0.763,3.826-3.068 c0.241-1.105,1.771-1.927,2.718-2.877c0.905,0.971,2.333,1.814,2.605,2.939c0.545,2.256,1.757,2.7,3.843,3.111 C108.401,831.102,105.035,835.914,105.697,839.074z M139.108,46c29.823,0,54,24.177,54,54c0,29.823-24.177,54-54,54 s-54-24.177-54-54C85.108,70.176,109.285,46,139.108,46z M19.108,212c0-29.823,24.177-54,54-54s54,24.177,54,54 c0,29.823-24.177,54-54,54S19.108,241.823,19.108,212z M144.944,857.898c-2.09,2.578-1.865,5.176-1.942,7.953 c-0.024,0.854,0.131,1.914-0.302,2.509c-2.403,3.147-3.159,2.809-5.436-0.185c-0.264-0.306-0.178-0.948-0.184-1.437 c-0.041-3.271,0.536-6.657-2.369-9.253c-0.531-0.475-0.479-1.605-0.957-3.425c1.21-1.271,2.47-3.306,4.294-4.333 c2.379-1.339,5.236-0.58,6.441,1.819C145.405,853.367,145.95,856.658,144.944,857.898z M144.996,807.941 c-2.224,2.677-1.877,5.438-1.992,8.318c-0.086,2.146-0.2,4.578-2.99,4.544c-2.765-0.034-2.874-2.475-2.933-4.614 c-0.08-2.895,0.543-5.919-2.179-8.193c-0.631-0.527-0.645-1.797-1.234-3.633c1.265-1.382,2.48-3.465,4.292-4.5 c2.341-1.338,5.233-0.649,6.476,1.731C145.382,803.404,145.991,806.744,144.996,807.941z M80.062,279.694 c17.171-3.582,56.234-25.446,59.296-50.487c5.518,22.114,30,48.729,61,48.729C162.77,319.773,120.431,321.28,80.062,279.694z M205.108,266c-29.823,0-54-24.177-54-54c0-29.823,24.177-54,54-54s54,24.177,54,54C259.108,241.823,234.932,266,205.108,266z", - clocks: { - size: 108, - 0: { x: 138.892, y: 100 }, - 1: { x: 72.892, y: 212 }, - 2: { x: 204.892, y: 212 } - } - }, - 4: { - height: 1041, - width: 368.697, - path: "M365.949,178.882c-2.159-2.705-5.464-5.038-8.725-6.201c-7.211-2.57-12.634,1.794-18.155,7.261 c-1.008-3.182-1.811-5.292-2.346-7.468c-7.207-29.311-25.676-46.993-55.052-53.142c-3.565-0.746-4.337-2.365-5.721-5.525 c-10.917-24.928-15.917-32.928-31.863-49.408c-1.625-1.679-3.453-3.192-5.144-4.761c-15.909-14.758-20.909-17.758-43.492-26.71 c-1.882-0.746-3.781-1.782-6.866-3.302c2.349-1.876,3.694-2.659,4.662-3.772c4.695-5.397,4.837-13.436,0.452-19.014 c-5.3-6.742-15-7.806-21.456-2.354c-6.714,5.67-7.304,15.417-1.328,21.919c3.617,3.935,3.297,5.361-1.725,7.153 c-2.044,0.73-4.17,1.226-6.237,1.896c-12.766,4.137-23.255,11.604-31.918,21.798c-2.372,2.791-4.778,5.622-7.539,8.002 c-15.564,13.413-26.166,29.895-31.108,49.904c-0.68,2.752-1.741,4.084-4.825,4.54c-29.053,4.299-51.461,25.809-57.16,54.556 c-0.307,1.549-0.792,3.062-1.25,4.806c-11.35-8.302-18-8.998-24.401-2.862c-5.321,5.101-6.467,13.398-1.935,19.203 c2.036,2.608,5.192,4.836,8.302,6.005c7.137,2.683,12.59-1.579,17.735-6.353c0.583,1.299,1.01,1.874,1.096,2.496 c4.046,29.315,27.997,53.277,57.825,57.393c2.223,0.307,4.062,1.874,4.644,4.041c1.308,4.861,2.891,9.682,4.787,14.345 c9.432,23.198,28.811,38.203,45.823,55.084c5.104,5.065,11.204,9.197,17.156,13.308c5.563,3.842,7.792,8.391,7.788,15.456 c-0.129,188.254-0.004,308.508,0.065,496.762c0,0.102-0.005,0.205-0.006,0.307v41.241c-2.701,0.026-5.102,0.092-7.461-0.047 c-3.499-0.206-5.37,1.456-6.735,4.558c-1.282,2.913-2.803,5.866-4.844,8.27c-6.581,7.751-16.578,7.84-23.206,0.144 c-2.254-2.617-3.797-5.94-5.255-9.119c-1.087-2.369-3.472-3.882-6.078-3.833c-3.63,0.068-7.263,0.071-10.893-0.013 c-3.163-0.074-4.936,1.432-6.143,4.306c-1.141,2.716-2.476,5.469-4.285,7.764c-8.725,11.281-23.01,6.923-27.966-5.357 c-1.496-5.628-5.039-7.274-10.521-6.767c-4.485,0.415-6.285,1.937-6.286,6.612c-0.001,15.755-0.002,31.511-0.003,47.266 c-0.001,16.376-0.012,32.752,0.006,49.127c0.004,3.646,2.039,5.706,5.586,5.765c4.244-0.151,7.724,1.078,9.747-3.72 c1.63-3.566,3.31-7.297,5.811-10.239c5.927-6.969,15.25-7.396,21.596-0.827c2.91,3.012,4.885,7.078,6.716,10.936 c1.457,3.071,3.269,4.292,7.14,3.723c2.897-0.426,5.844-0.506,8.73-0.009c4.108,0.708,6.007-0.762,7.499-3.84 c1.386-2.861,3.016-5.766,5.166-8.063c10.107-10.412,22.254-3.718,27.139,8.037c1.337,2.907,3.181,4.141,6.281,4.034 c2.715-0.094,5.446-0.058,8.257-0.038v2.091c0.319,0.001,0.631,0.004,0.951,0.004c0.362,2.11,0.473,3.786,0.947,5.352 c2.41,7.972,4.19,16.244,7.596,23.773c3.168,7.005,9.289,6.901,12.709-0.011c2.932-5.925,5.134-12.395,6.525-18.868 c4.01-18.662,2.675-37.664,2.696-56.567c0.133-118.853,0.314,0.295,0.392-118.558c0.068-103.934,0.013-377.867,0.064-481.801 c0.001-2.781-0.281-6.125,1.073-8.24c4.886-7.634,8.978-15.851,18.168-20.058c5.139-2.352,9.257-7.045,13.652-10.893 c4.267-3.736,8.16-7.904,12.459-11.599c15.452-13.278,26.023-29.619,30.885-49.451c0.909-3.707,2.926-4.598,6.161-5.73 c8.764-3.067,17.943-5.775,25.742-10.598c14.82-9.164,23.822-23.162,28.263-40.071c0.703-2.678,1.909-5.223,2.991-8.122 c11.076,8.596,18.006,9.328,24.489,3.223C369.187,192.953,370.464,184.538,365.949,178.882z M146.765,952.539 c0.498,2.38,0.15,4.934-3.302,4.884c-2.294-0.033-3.176,1.042-3.702,3.217c-0.26,1.076-1.713,2.383-2.793,2.559 c-0.723,0.118-2.36-1.479-2.504-2.467c-0.409-2.804-2.004-3.344-4.384-3.299c-3.709,0.07-7.424,0.116-11.131-0.006 c-3.83-0.126-3.945,2.278-3.981,5.13c-0.038,2.976,0.755,4.826,4.142,4.589c1.477-0.103,2.968,0.015,4.451-0.025 c2.202-0.059,4.543-0.006,4.579,2.901c0.04,3.187-2.477,3.119-4.78,3.068c-1.36-0.03-2.728,0.082-4.08-0.025 c-3.258-0.257-4.5,1.312-4.272,4.425c-0.041,4.353,1.027,8.028-4.883,7.506c-7.022,0.039-7.951,0.802-7.542-7.405 c0.168-3.39-1.192-4.855-4.555-4.524c-0.857,0.085-1.922,0.329-2.555-0.056c-1.2-0.729-2.156-1.861-3.213-2.825 c1.006-1.017,1.944-2.121,3.057-3.004c0.379-0.301,1.199-0.042,1.817-0.044c5.007-0.022,7.131-2.986,5.197-7.646 c-0.393-0.945-1.975-1.785-3.11-1.944c-3.651-0.437-7.442,0.158-11.117-0.121c-3.786-0.387-5.894,0.721-5.698,5.061 c0.045,0.996-1.78,2.077-2.744,3.119c-0.848-1.038-2.451-2.105-2.412-3.108c0.153-3.932-1.445-5.27-5.269-5.225 c-1.017,0.012-2.491-1.899-2.973-3.215c-0.52-1.422-0.127-3.18-0.126-4.791c0.001-5.24-0.002-5.268,5.3-5.954 c2.366-0.306,3.023-1.787,2.927-3.889c-0.098-2.143,0.268-4.425,2.848-4.073c1.034,0.141,2.342,2.528,2.49,3.998 c0.282,2.788,1.314,4.039,4.131,3.976c3.956-0.088,7.919-0.125,11.872,0.011c3.063,0.105,4.168-1.204,4.13-4.212 c-0.035-2.816-0.326-5.041-3.916-4.755c-2.559,0.203-4.468-0.474-4.367-3.527c0.095-2.865,2.016-3.344,4.358-3.173 c2.898,0.212,3.849-1.243,3.979-4.019c0.085-1.821,0.73-5.002,1.563-5.153c3.046-0.553,6.308-0.31,9.408,0.165 c0.646,0.099,1.284,2.453,1.345,3.795c0.224,4.967,0.375,5.207,5.402,5.214c1.361,0.002,2.928-0.423,4.027,0.116 c1.272,0.623,2.94,2.09,2.943,3.194c0.002,1.125-1.621,2.815-2.876,3.241c-1.666,0.565-3.668,0.223-5.518,0.132 c-3.18-0.157-3.971,1.57-3.952,4.398c0.019,2.703,0.495,4.64,3.783,4.569c3.957-0.085,7.916-0.055,11.874-0.012 c2.166,0.024,3.322-0.763,3.826-3.068c0.242-1.105,1.771-1.927,2.718-2.877c0.905,0.971,2.333,1.814,2.605,2.939 c0.545,2.256,1.757,2.7,3.843,3.111C149.469,944.566,146.104,949.379,146.765,952.539z M252.621,98.898 c0.287-0.167,0.574-0.334,0.861-0.502c2.841,6.521,5.683,13.042,8.739,20.056c-4.719,1.002-8.414,1.787-12.443,2.642 C250.758,113.446,251.689,106.172,252.621,98.898z M184.136,46.188c29.823,0,54,24.177,54,54c0,29.823-24.177,54-54,54 s-54-24.177-54-54C130.136,70.365,154.313,46.188,184.136,46.188z M162.097,165.903c14.218,3.796,27.946,4.565,42.414-0.072 c-3.942,14.414-4.001,28.063,0.302,42.583c-14.189-3.96-27.779-4.487-42.527-0.062C166.547,193.78,166.444,180.286,162.097,165.903 z M114.049,99.643c0.292,0.134,0.583,0.269,0.875,0.403c1.095,7.133,2.19,14.267,3.378,22.01 c-3.852-0.843-7.747-1.695-12.458-2.726C108.69,112.502,111.369,106.072,114.049,99.643z M114.09,275.17 c-2.992-7.299-5.446-13.283-8.044-19.622c4.192-0.951,7.557-1.714,11.303-2.564C116.293,260.174,115.314,266.84,114.09,275.17z M97.136,240.188c-29.823,0-54-24.177-54-54c0-29.823,24.177-54,54-54s54,24.177,54,54 C151.136,216.012,126.96,240.188,97.136,240.188z M190.317,961.816c-2.889,3.631-2.59,7.316-2.675,11.229 c-0.063,2.929-0.301,6.185-4.102,6.083c-3.718-0.099-3.92-3.373-3.912-6.266c0.01-3.961,0.532-7.956-2.966-11.069 c-0.843-0.75-0.86-2.433-1.653-4.938c1.737-1.842,3.427-4.577,5.876-5.996c3.218-1.864,7.078-0.801,8.743,2.361 C190.908,955.651,191.666,960.12,190.317,961.816z M190.377,894.286c-2.75,3.639-2.754,7.277-2.731,11.231 c0.017,2.954-0.303,6.162-3.967,6.219c-3.722,0.058-4.036-3.156-4.069-6.118c-0.044-3.915,0.729-7.982-2.898-11.07 c-0.855-0.728-0.902-2.408-1.792-5.047c1.877-1.885,3.726-5.163,6.313-5.925c2.41-0.711,6.606,0.411,8.177,2.279 C190.999,887.744,191.681,892.56,190.377,894.286z M190.399,830.196c-3.107,3.329-2.592,6.926-2.795,10.682 c-0.086,1.597-0.323,3.33-1.04,4.717c-1.41,2.725-4.298,2.744-5.822,0.114c-0.63-1.087-1.04-2.453-1.075-3.706 c-0.125-4.43,0.653-9.009-3.304-12.472c-0.62-0.543-0.572-1.852-0.833-2.806c-0.315-0.34-0.629-0.679-0.944-1.019 c2.103-2.244,3.85-5.571,6.413-6.415c2.391-0.788,6.184,0.324,8.392,1.933C192.319,823.355,192.864,827.555,190.399,830.196z M184.136,328.188c-29.823,0-54-24.177-54-54c0-29.823,24.177-54,54-54s54,24.177,54,54 C238.136,304.012,213.96,328.188,184.136,328.188z M252.789,277.752c-0.265-0.133-0.531-0.265-0.796-0.398 c-1.015-8.257-2.029-16.515-3.086-25.115c4.167,0.862,8.324,1.721,13.585,2.809C259.162,262.841,255.975,270.297,252.789,277.752z M271.136,240.188c-29.823,0-54-24.177-54-54c0-29.823,24.177-54,54-54c29.823,0,54,24.177,54,54 C325.137,216.012,300.96,240.188,271.136,240.188z", - clocks: { - size: 108, - 0: { x: 184.245, y: 100 }, - 1: { x: 97.245, y: 186 }, - 2: { x: 271.245, y: 186 }, - 3: { x: 184.245, y: 274 } - } - }, - 5: { - height: 1148.657, - width: 368.698, - path: "M364.919,177.185c-5.856-6.593-15.147-6.888-21.897-0.694c-3.717,3.411-4.299,3.242-5.541-1.587 c-0.25-0.972-0.571-1.926-0.803-2.901c-6.223-26.032-22.396-42.736-47.523-51.238c-2.474-0.837-4.808-2.72-6.666-4.641 c-6.618-6.844-12.426-14.598-19.638-20.709c-7.25-6.144-14.426-11.753-15.964-21.863c-0.145-0.952-0.81-1.83-1.262-2.728 c-10.14-20.142-26.293-32.5-48.2-37.503c-2.572-0.587-5.014-1.743-8.025-2.817c1.316-1.702,1.86-2.531,2.526-3.247 c6.502-6.986,6.698-15.783,0.465-21.94c-5.785-5.714-15.027-5.762-20.84-0.11c-6.368,6.191-6.436,15.084,0.239,21.857 c2.991,3.035,1.728,4.561-1.167,5.98c-1.334,0.654-2.844,0.952-4.281,1.387c-24.857,7.514-40.936,23.712-48.399,48.654 c-0.748,2.499-2.69,4.83-4.561,6.77c-8.684,9.004-17.485,17.897-26.377,26.695c-1.782,1.764-3.95,3.591-6.269,4.287 c-27.272,8.186-44.245,25.906-50.386,53.864c-0.306,1.391-0.752,2.75-1.182,4.299c-11.942-8.326-18.43-8.891-24.733-2.424 c-5.16,5.294-6.085,13.716-1.351,19.24c2.253,2.629,5.655,4.841,8.962,5.874c6.77,2.115,12.009-1.8,16.717-6.757 c0.647,1.364,1.068,1.923,1.182,2.539c5.495,29.672,22.939,48.289,51.806,56.504c1.891,0.538,3.666,2.056,5.112,3.503 c8.725,8.731,17.397,17.519,25.942,26.426c1.755,1.83,3.532,4.061,4.227,6.423c5.507,18.702,16.574,32.696,33.076,43.228 c6.667,4.255,11.428,11.52,16.987,17.48c0.5,0.535,0.688,1.544,0.692,2.334c0.044,10.877,0.03,21.753,0.03,32.638 c-1.577,0.516-2.845,0.932-4.113,1.346c-17.135,5.597-30.511,16.033-39.024,31.952c-3.426,6.407-5.333,13.646-7.754,20.57 c-1.76,5.033-3.129,5.54-6.907,2.08c-2.706-2.478-6.172-4.068-9.837-4.235c-8.598-0.392-15.176,6.223-15.67,13.97 c-0.384,6.021,2.865,11.744,8.198,14.44c5.638,2.851,12.01,2.021,16.818-2.189c2.562-2.243,5.668-1.656,6.923,1.51 c1.187,2.993,1.799,6.229,3.124,9.149c2.549,5.62,4.886,11.444,8.247,16.568c9.497,14.478,39.422,28.018,39.422,28.018v28.542 c0,0-0.496,0.466-0.788,0.469c-5.522,0.049-11.045,0.088-16.568,0.095c-9.805,0.013-10.191,0.382-10.188,9.959 c0.001,2.347-0.002,4.695,0,7.042c0.008,7.059,1.061,8.147,7.942,8.157c6.643,0.01,13.286,0.002,20.223,0.002 c-0.115,2.368-0.198,4.098-0.292,6.035c-7.528,0-14.546,0.054-21.562-0.02c-3.56-0.037-6.383,2.854-6.323,6.415 c0.064,3.826-0.011,7.654,0.01,11.481c0.033,5.918,1.364,7.248,7.324,7.269c6.815,0.024,21.22,0.006,21.22,0.006v7.044 c0,0-14.435-0.017-21.108,0.005c-6.069,0.02-7.373,1.289-7.434,7.19c-0.028,2.682,0.18,5.38-0.039,8.044 c-0.443,5.389,0.07,10.039,6.912,10.524c-3.015,31.457-2.572,62.398,2.234,93.196c2.98,19.097,7.19,37.854,16.599,55.063 c1.443,2.639,2.397,5.924,2.406,8.914c0.209,63.543,0.251,127.087,0.325,190.631c0.002,1.795,0,3.59,0,5.442 c-5.238,0.679-7.397-1.369-7.347-5.986c0.035-3.185,0.024-6.371,0.006-9.557c-0.034-5.945-1.325-7.274-7.309-7.285 c-17.074-0.032-34.148-0.022-51.222-0.026c-11.718-0.003-23.435-0.029-35.153,0.013c-5.235,0.019-6.699,1.54-6.756,6.814 c-0.038,3.521-0.04,7.042,0.004,10.563c0.066,5.255,1.516,6.725,6.823,6.744c11.215,0.04,22.431,0.01,33.646,0.013 c11.868,0.003,11.868,0.005,11.75,11.912c-0.059,5.922-1.3,7.16-7.407,7.176c-12.22,0.031-24.439,0.018-36.659,0.029 c-7.054,0.006-8.155,1.08-8.167,7.935c-0.004,2.18-0.006,4.359,0.001,6.539c0.021,6.383,1.222,7.644,7.439,7.655 c11.048,0.02,22.096,0.002,33.144,0.006c11.791,0.005,11.791,0.008,11.648,12.012c-0.067,5.703-1.367,7.062-7.047,7.083 c-10.378,0.04-20.758,0.096-31.135-0.002c-15.122-0.144-14.146-0.478-14.047,14.132c0.038,5.646,1.377,6.992,7.074,7.008 c11.048,0.031,22.096,0.007,33.144,0.01c12.19,0.003,12.19,0.005,12.011,12.153c-0.083,5.597-1.413,6.924-7.187,6.944 c-10.211,0.034-20.423,0.089-30.633-0.001c-15.773-0.139-14.465-0.577-14.406,14.774c0.024,6.173,1.313,7.37,7.73,7.375 c13.726,0.011,27.452,0.005,41.179,0.003c14.898-0.002,29.796,0.018,44.694-0.027c5.339-0.016,6.767-1.487,6.831-6.742 c0.033-2.682-0.046-5.366,0.02-8.047c0.126-5.106,1.839-6.469,8.044-5.697c0,5.722-0.455,11.611,0.097,17.404 c1.078,11.308,2.634,22.631,8.667,32.623c3.709,6.143,9.563,5.816,12.753-0.612c2.984-6.015,5.833-12.625,6.409-19.174 c1.579-17.969,2.543-36.045,2.614-54.083c0.36-91.878,0.35-183.757,0.553-275.636c0.005-2.049,0.733-4.214,1.576-6.124 c3.369-7.639,7.748-14.934,10.257-22.833c11.421-35.946,13.433-72.997,11.755-110.391c-0.269-5.99-0.801-11.968-1.209-17.909 c7.452-1.534,7.775-1.945,7.779-9.588c0.001-2.515,0.011-5.03,0.007-7.545c-0.013-7.75-0.894-8.656-8.46-8.663 c-7.141-0.007-22.406-0.001-22.406-0.001v-7.045c0,0,16.742-0.048,24.561,0.019c4.359,0.038,6.392-2,6.312-6.351 c-0.071-3.855,0.016-7.712-0.019-11.568c-0.053-5.938-1.345-7.219-7.35-7.242c-7.485-0.029-22.504-0.007-22.504-0.007v-6.035 c0,0,15.454,0.033,22.967-0.011c5.362-0.031,6.803-1.454,6.876-6.683c0.049-3.52,0.028-7.042,0.018-10.563 c-0.019-6.708-1.157-7.881-7.7-7.895c-7.319-0.016-21.161-0.004-21.161-0.004v-28.963c0,0,51.319-18.506,51.418-58.803 c13.274,8.8,19.828,9.143,25.982,1.96c4.843-5.653,4.919-13.758,0.181-19.362c-6.121-7.24-12.687-6.904-26.259,1.909 c-5.709-30.27-22.672-50.541-52.587-59.137c0-11.198-0.038-22.249,0.053-33.298c0.01-1.247,0.394-2.826,1.206-3.677 c5.143-5.394,9.736-11.741,15.851-15.695c15.582-10.074,26.618-23.168,32.069-40.997c0.628-2.052,2.154-4.251,3.897-5.472 c12.064-8.448,22.297-18.658,30.858-30.639c1.235-1.728,3.009-3,5.027-3.661c25.276-8.284,41.218-25.241,47.865-51.029 c0.549-2.129,1.536-4.145,2.62-7.008c2.028,1.88,3.182,3.03,4.418,4.083c5.813,4.951,14.202,4.893,19.761-0.107 C369.847,192.788,370.428,183.388,364.919,177.185z M252.394,107.492c4.098,3.415,7.887,6.574,11.677,9.733 c-0.404,0.395-0.807,0.791-1.211,1.186c-4.169,0.785-8.338,1.57-13.15,2.476C250.666,116.112,251.516,111.872,252.394,107.492z M184.406,46c29.823,0,54,24.177,54,54c0,29.823-24.177,54-54,54s-54-24.177-54-54C130.406,70.177,154.583,46,184.406,46z M162.373,165.581c14.357,4.18,28.096,4.578,42.513,0.199c-4.092,14.47-3.946,28.113,0.227,42.523 c-14.26-4.037-27.868-4.509-42.273-0.152C166.659,193.831,166.896,180.189,162.373,165.581z M115.827,107.593 c1.197,5.466,2.101,9.598,3.149,14.382c-4.547-0.964-8.521-1.806-13.675-2.899C108.835,115.221,111.958,111.814,115.827,107.593z M43.406,186c0-29.823,24.177-54,54-54s54,24.177,54,54c0,29.823-24.177,54-54,54S43.406,215.823,43.406,186z M115.278,265.909 c-3.402-3.626-6.248-6.661-9.67-10.309c4.662-1.06,8.192-1.862,12.324-2.801C117.071,257.051,116.27,261.011,115.278,265.909z M238.406,453c0,29.823-24.177,54-54,54s-54-24.177-54-54s24.177-54,54-54S238.406,423.177,238.406,453z M184.406,328 c-29.823,0-54-24.177-54-54c0-29.823,24.177-54,54-54s54,24.177,54,54C238.406,303.823,214.23,328,184.406,328z M251.958,267.927 c-1.167-5.669-2.154-10.46-3.262-15.84c5.154,0.97,9.935,1.87,14.716,2.77c0.446,0.541,0.892,1.082,1.338,1.623 C260.673,260.129,256.595,263.778,251.958,267.927z M271.406,240c-29.823,0-54-24.177-54-54c0-29.823,24.177-54,54-54 c29.823,0,54,24.177,54,54C325.406,215.823,301.23,240,271.406,240z", - clocks: { - size: 108, - 0: { x: 184.245, y: 100 }, - 1: { x: 97.245, y: 186 }, - 2: { x: 271.245, y: 186 }, - 3: { x: 184.245, y: 274 }, - 4: { x: 184.245, y: 453 } - } - }, - 6: { - height: 1148.98, - width: 370.141, - path: "M365.84,176.489c-5.689-5.831-14.774-6.109-20.983-0.642c-4.677,4.118-4.976,4.085-6.414-2.269 c-6.187-27.333-22.732-44.97-49.412-53.347c-1.887-0.593-3.769-2.168-4.983-3.788c-8.33-11.115-18.008-20.785-29.318-28.894 c-1.84-1.32-3.239-3.825-3.948-6.065c-8.013-25.306-24.804-41.278-50.453-47.985c-1.299-0.34-2.628-0.562-3.93-0.89 c-6.029-1.519-6.346-2.456-2.44-7.102c5.378-6.396,4.93-15.201-1.065-20.921c-5.702-5.442-14.806-5.447-20.582-0.013 c-6.006,5.651-6.507,14.545-1.066,20.88c0.962,1.12,2.36,1.865,5.102,3.969c-3.997,1.969-6.466,3.647-9.192,4.455 c-21.058,6.239-37.094,18.816-44.941,39.357c-3.899,10.207-9.562,17.625-17.758,24.394c-6.646,5.489-11.704,12.883-17.615,19.294 c-1.38,1.497-3.203,3.002-5.097,3.546c-28.343,8.127-45.563,26.507-51.567,55.389c-0.195,0.941-0.595,1.84-1.211,3.697 c-4.56-5.357-9.738-8.928-16.367-7.261c-3.226,0.811-6.599,2.778-8.897,5.184c-5.104,5.343-4.779,13.776,0.038,19.336 c6.068,7.004,12.02,6.721,25.619-1.458c0.72,3.007,1.322,5.896,2.106,8.735c7.133,25.831,23.797,42.127,49.404,49.659 c2.498,0.735,4.874,2.61,6.784,4.488c8.593,8.445,17.053,17.028,25.427,25.692c1.767,1.828,3.636,4.007,4.323,6.356 c5.597,19.138,16.997,33.318,33.994,43.913c6.567,4.094,11.118,11.439,16.51,17.374c0.48,0.528,0.534,1.578,0.536,2.386 c0.033,10.743,0.022,21.486,0.022,30.697c-9.552,5.427-18.816,9.569-26.776,15.469c-12.547,9.299-19.949,22.422-23.771,37.578 c-0.68,2.698-2.102,5.208-3.473,8.506c-2.286-2.126-3.461-3.29-4.711-4.367c-6.067-5.231-15.003-4.872-20.573,0.801 c-5.603,5.707-5.839,14.698-0.54,20.569c5.565,6.166,14.515,6.88,20.866,1.665c5.112-4.197,5.412-3.946,8.069,2.516 c3.43,8.344,6.359,17.082,11.089,24.661c8.379,13.426,21.019,21.894,36.078,26.785c1.434,0.466,3.551,2,3.587,3.097 c0.294,8.853,0.165,17.72,0.165,27.124c-7.476,0-14.485-0.043-21.493,0.014c-5.306,0.044-6.687,1.494-6.735,6.878 c-0.033,3.697-0.03,7.394-0.004,11.091c0.042,5.943,1.284,7.157,7.436,7.185c6.702,0.031,13.405,0.007,20.448,0.007 c0,2.034,0,5.598,0,5.598s-13.784-0.034-20.783,0.011c-5.372,0.035-6.799,1.45-6.861,6.724c-0.047,4.026,0.044,8.054-0.023,12.079 c-0.072,4.325,1.898,6.385,6.299,6.345c6.876-0.063,13.753,0.049,20.629,0.113c0.289,0.003,1.739,0.534,1.739,0.534v6.407 c0,0-14.692-0.032-21.682,0.01c-5.652,0.034-7.334,1.395-6.872,7.119c0.694,8.601-1.289,15.249-8.006,21.638 c-8.605,8.185-13.036,19.34-15.463,31.089c-1.309,6.335-2.096,6.555-6.889,2.398c-6.287-5.453-15.195-5.103-20.871,0.819 c-5.657,5.902-5.624,15.003,0.076,20.896c5.702,5.895,14.51,6.153,20.855,0.613c1.117-0.975,2.238-1.945,4.238-3.682 c1.129,2.807,2.274,4.924,2.843,7.186c4.769,18.938,15.137,33.728,31.864,44.051c1.736,1.072,3.27,3.377,3.775,5.392 c3.397,13.548,7.363,26.834,14.685,38.904c0.804,1.325,1.03,3.177,1.033,4.786c0.118,64.926,0.18,129.852,0.239,194.778 c0.001,0.981-0.122,1.963-0.184,2.894c-5.249,0.709-6.974-0.588-7.13-5.358c-0.109-3.352-0.003-6.71-0.024-10.065 c-0.036-5.705-1.357-7.092-7.019-7.099c-21.978-0.026-43.956-0.012-65.933-0.011c-7.046,0-14.094,0.1-21.138-0.026 c-4.635-0.083-6.728,2.003-6.589,6.633c0.109,3.639,0.121,7.278-0.002,10.917c-0.157,4.646,1.947,6.703,6.575,6.67 c12.75-0.09,25.501-0.045,38.251-0.028c6.305,0.008,7.513,1.253,7.533,7.599c0.038,11.525,0.038,11.526-11.68,11.525 c-11.24-0.001-22.481-0.03-33.722,0.007c-5.418,0.018-6.914,1.437-6.931,6.666c-0.053,16.568-1.437,15.572,15.235,15.484 c10.066-0.053,20.132-0.038,30.198,0.002c5.373,0.021,6.796,1.457,6.905,6.697c0.259,12.419,0.259,12.42-12.268,12.419 c-11.073,0-22.146-0.028-33.218,0.011c-5.319,0.019-6.822,1.501-6.857,6.738c-0.102,15.018-1.068,14.544,14.31,14.408 c10.401-0.092,20.803-0.047,31.205-0.005c5.279,0.022,6.729,1.522,6.828,6.773c0.234,12.342,0.234,12.342-12.345,12.342 c-11.073,0-22.146-0.031-33.218,0.012c-5.25,0.02-6.76,1.539-6.779,6.814c-0.06,16.24-1.382,15.39,14.882,15.343 c26.004-0.075,52.009-0.015,78.013-0.024c6.592-0.002,7.763-1.211,7.767-7.876c0.001-2.349-0.056-4.699,0.01-7.046 c0.144-5.087,1.794-6.38,6.391-5.865c1.57,11.962,2.907,23.747,4.765,35.449c0.647,4.073,1.998,8.292,4.104,11.797 c1.828,3.041,5.159,7.119,7.859,7.143c2.656,0.024,6.805-4.019,7.763-7.073c3.09-9.85,6.148-19.959,7.106-30.167 c1.295-13.794,0.763-27.772,0.787-41.671c0.158-91.433,0.238-182.866,0.46-274.299c0.006-2.499,0.844-5.29,2.131-7.444 c7.151-11.972,11.314-25.021,14.283-38.502c0.767-3.483,2.275-5.895,5.318-7.958c14.472-9.809,23.801-23.321,28.184-40.279 c0.711-2.753,1.981-5.361,3.281-8.798c2.096,1.947,3.257,3.114,4.508,4.173c6.274,5.312,15.319,4.747,20.867-1.276 c5.371-5.83,5.28-14.718-0.209-20.541c-5.593-5.933-14.657-6.313-20.861-0.875c-4.91,4.304-5.502,4.183-6.871-2.32 c-2.843-13.501-9.129-25.091-18.636-35.051c-1.059-1.109-1.624-3.064-1.703-4.662c-0.225-4.519-0.177-9.058-0.049-13.584 c0.13-4.584-1.863-6.712-6.52-6.641c-7.688,0.117-23.46,0.032-23.46,0.032v-7.081c0,0,15.513,0.035,23.187-0.012 c5.264-0.032,6.699-1.51,6.757-6.834c0.042-3.858,0.047-7.718-0.001-11.576c-0.066-5.278-1.476-6.669-6.885-6.701 c-7.529-0.044-22.059-0.011-22.059-0.011v-6.073c0,0,14.421,0.036,22.088-0.012c5.373-0.034,6.792-1.451,6.855-6.73 c0.048-4.026-0.055-8.054,0.028-12.079c0.089-4.361-1.944-6.374-6.308-6.332c-7.707,0.073-23.662,0.021-23.662,0.021 s0-18.743,0-28.6c29.397-8.459,46.462-28.621,52.535-59.535c5.681,5.182,10.784,9.539,17.649,7.382 c3.324-1.045,6.767-3.214,9.025-5.845c4.929-5.744,3.921-14.326-1.559-19.637c-6.511-6.312-13.714-5.558-25.117,3.388 c-5.85-30.371-22.706-50.809-52.896-59.482c0-11.328-1.021-22.855,0.356-34.088c0.927-7.564,7.385-13.291,13.943-17.092 c17.546-10.17,29.776-24.263,35.419-43.925c0.495-1.726,2.182-3.403,3.745-4.482c12.023-8.304,22.113-18.494,30.667-30.315 c1.255-1.734,3.402-3.24,5.446-3.923c25.095-8.384,41.101-25.168,47.682-50.873c0.553-2.159,1.517-4.212,2.638-7.26 c1.992,1.814,3.143,2.911,4.345,3.949c6.307,5.446,15.194,5.081,20.928-0.844C371.579,191.607,371.538,182.33,365.84,176.489z M253.55,107.072c4.157,3.613,7.747,6.732,11.337,9.852c-0.326,0.501-0.652,1.003-0.979,1.504 c-4.182,0.798-8.365,1.596-13.163,2.512C251.718,116.132,252.577,111.882,253.55,107.072z M185.289,45.98c29.823,0,54,24.177,54,54 c0,29.823-24.177,54-54,54s-54-24.177-54-54C131.289,70.157,155.466,45.98,185.289,45.98z M164.151,165.773 c13.581,4.334,27.363,4.22,41.777,0.199c-4.474,14.48-3.87,28.139,0.027,42.429c-14.232-4.098-27.748-4.399-41.531-0.444 c0.777-7.312,2.093-14.066,2.044-20.809C166.419,180.244,165.032,173.349,164.151,165.773z M116.538,107.809 c1.209,5.322,2.145,9.436,3.252,14.311c-4.762-1.06-8.731-1.943-13.791-3.07C109.65,115.157,112.775,111.823,116.538,107.809z M98.289,239.98c-29.823,0-54-24.177-54-54c0-29.823,24.177-54,54-54s54,24.177,54,54 C152.289,215.804,128.113,239.98,98.289,239.98z M115.949,265.97c-3.407-3.594-6.205-6.546-9.77-10.308 c5.012-1.059,8.587-1.815,12.604-2.664C117.803,257.484,116.976,261.266,115.949,265.97z M239.289,683.98c0,29.823-24.177,54-54,54 s-54-24.177-54-54s24.177-54,54-54S239.289,654.157,239.289,683.98z M239.289,452.98c0,29.823-24.177,54-54,54s-54-24.177-54-54 s24.177-54,54-54S239.289,423.157,239.289,452.98z M185.289,327.98c-29.823,0-54-24.177-54-54c0-29.823,24.177-54,54-54 s54,24.177,54,54C239.289,303.804,215.113,327.98,185.289,327.98z M253.079,268.69c-1.271-6.405-2.241-11.297-3.279-16.525 c5.356,1.047,10.057,1.966,16.634,3.251C261.644,260.177,257.764,264.034,253.079,268.69z M272.289,239.98 c-29.823,0-54-24.177-54-54c0-29.823,24.177-54,54-54c29.823,0,54,24.177,54,54C326.289,215.804,302.113,239.98,272.289,239.98z", - clocks: { - size: 108, - 0: { x: 185.128, y: 100 }, - 1: { x: 98.128, y: 186 }, - 2: { x: 272.128, y: 186 }, - 3: { x: 185.128, y: 274 }, - 4: { x: 185.128, y: 453 }, - 5: { x: 185.128, y: 684 } - } - } -}, Kh = { - teeth: { - tall: { - viewBox: "0 0 512 1540", - paths: { - frame: "M0,0v1540l512-244.2V0H0z M451,1263.5l-390,186V61h390V1263.5z", - half: "M0,0v748l512-244.2V0H0z", - full: "M0,0v1540l512-244.2V0H0z" - } - }, - med: { - viewBox: "0 0 512 1540", - paths: { - frame: "M0,0v1388l512-395.6V0H0z M458,965.7L54,1278V53h404V965.7z", - full: "M0,0v1540l512-244.2V0H0z" - } - }, - short: { - viewBox: "0 0 512 1540", - paths: { - frame: "M0,0v991l511.4-247L512,0H0z M470.5,715.2L41,922.6V40h430L470.5,715.2z", - full: "M0,0v991l511.4-247L512,0H0z" - } - } - }, - armor: { - viewBox: "0 0 512 512", - paths: { - heavy: "M157.5,80.7c-20.6,13.7-46,22.5-69.4,26c6.8,48.9,26.1,84.1,46,97.8 c10.5,7.3,20.4,9,30.4,5.6c8.9-3.1,18.6-11,27.8-25.6C165.3,154.3,160.6,113.5,157.5,80.7L157.5,80.7z M354.5,80.8 c-3.1,32.8-7.8,73.6-34.7,103.8c9.1,14.6,18.9,22.5,27.8,25.6c10,3.4,19.8,1.7,30.4-5.6c19.8-13.7,39.1-48.8,45.9-97.7 C399.3,103.7,376,95.5,354.5,80.8L354.5,80.8z M254.4,67.9c-37.1,0-69.8,8.3-89.6,21c1.2,6.5,2.6,13,4.2,19.3 c19.2-8.2,50.3-16.7,85.4-16.7c35.2,0,66.3,8.5,85.4,16.7c1.7-6.3,3.1-12.8,4.2-19.3C324.2,76.2,291.5,67.9,254.4,67.9z M64.9,127.9l-47.7,45.5c29.8,37.2,63,56.8,86.5,58.7c1.1,0.1,2.3,0.1,3.3,0.2c1.8-7.6,4-15.1,6.5-22.3 C91.7,194.9,74.4,166.1,64.9,127.9L64.9,127.9z M447.1,127.9c-9.6,38.3-26.9,67-48.6,82c0,0-0.1,0-0.1,0.1 c2.5,7.3,4.7,14.7,6.5,22.3c1.1,0,2.2-0.1,3.4-0.2c23.4-1.9,56.8-21.5,86.5-58.7L447.1,127.9L447.1,127.9z M176,139.4 c5.7,12.2,13.1,23.3,22.9,32.8l6.4,6.2l-4.3,7.8c-2.3,4.1-4.6,8-7,11.7c40.8,15,85,14,124-0.2c-2.4-3.6-4.6-7.4-6.9-11.4l-4.3-7.8 l6.4-6.2c9.4-9.1,16.7-19.9,22.3-31.5C280.8,153.8,228.5,151.3,176,139.4L176,139.4z M401.7,243.6c0,0-3.7,38.1-22.9,76.1 l-121.7-32.7l-1.8-0.4l-1.8,0.4l-120.3,32.7c-19-38-22.7-76.1-22.7-76.1s12,3.8,19.5-18.7c10.7,3.2,22,3.3,32.8-0.4 c9.2-3.2,17.8-8.8,25.8-16.9c21.6,8.9,44.2,13.1,66.7,13.1c22.7,0,45.6-4.2,67.4-13.1c8,8,16.8,13.7,26.1,16.9 c10.9,3.7,22.3,3.6,33.1,0.4C389.6,247.4,401.7,243.6,401.7,243.6z M486.1,210.7c-25.4,24.2-52.1,38-76.2,40c-0.4,0-0.9,0-1.3,0.1 c1.2,8.1,2,16.2,2.3,24.4c22.8,3.8,54.7,0.1,90-14.3L486.1,210.7L486.1,210.7z M25.9,210.8l-14.8,50.1c35.3,14.4,67.2,18.1,90,14.3 c0.3-8.2,1.1-16.3,2.3-24.4c-0.4,0-0.9,0-1.3-0.1C78,248.7,51.3,234.9,25.9,210.8L25.9,210.8z M256,305.2l-114.8,28.1 c1.9,7.7,10.1,17.6,15.4,23.8c31.8-7.3,59.3-11.4,94.7-11.6c2.6,0,5.3,0,7.9,0c38.2,0.3,64.9,4.3,95.9,11.6 c5.1-6.2,15.2-15.8,16.8-23.6L256,305.2L256,305.2z M254.1,347.8l-79.3,22.1c5.8,4.8,16,8.5,23.2,13.3c18-5,33.5-7.8,53.5-7.9 c1.5,0,3,0,4.5,0c21.6,0.2,36.6,3,54.1,7.9c9.9-1.8,16.8-6.8,25.5-12.3L254.1,347.8L254.1,347.8z M373.3,377.7 c-68.3,55.6-166.9,55.7-235.3,0.3l-1.8,35.9c4.7,7.9,18.3,17,38,23c21,6.4,48,9.9,75.6,10.2c27.6,0.3,55.8-2.6,79.4-8.7 c21.6-5.6,39.3-14.2,48.8-23.9L373.3,377.7L373.3,377.7z", - light: "M254.9,88c-23.1,0-44.1,2.8-59.8,8.8c-7.9,3-14.5,6.8-19.5,11.9c-5,5.1-8.4,12.1-8.4,19.9 c0,3.2,0.5,6.2,1.5,9.1c2,37.1-20.9,83.9-46,107.5c5.9,35.9,19.4,72.7,39.6,106.3c23.8,23,54.6,35.4,85.9,37.1v-24 c-9.6-0.1-19-0.5-26.5-1.1l0.8-13.2c7.1,0.6,16.2,1,25.7,1.1v-28.3c-9.1,0.4-17.9,1.8-24.4,4.2l-3.3-12.7 c8.1-2.9,17.8-4.6,27.7-5.1v-23.8c-2.9,0.2-5.8,0.5-8.7,1c-17.2,1-31.8,3.6-45.2,7.5l-0.1-0.2c16.7-14.8,38.1-22.2,59.6-22.2 c21.4,0,42.9,7.4,59.6,22.2l-0.1,0.1c-13.4-3.9-28.1-6.5-45.4-7.5c-2.8-0.5-5.7-0.8-8.5-1v23.8c10,0.5,19.7,2.1,27.7,5.1l-3.3,12.7 c-6.6-2.4-15.4-3.8-24.5-4.2v28.3c9.4-0.1,18.6-0.4,25.7-1.1l0.8,13.2c-7.5,0.7-16.9,1-26.5,1.1v24.1c32.4-0.8,64.6-13,89.4-36.5 c21.1-33.6,34.9-69.9,40.8-105.3c-26.2-23.2-50.7-72.5-47.8-110.7c0.7-2.5,1-5,1-7.7c0-7.8-3.4-14.8-8.4-19.9 c-5-5.1-11.7-8.9-19.6-11.9C298.9,90.8,278,88,254.9,88L254.9,88z M254.9,101.3c22.3,0,42.5,2.9,56.4,8.2c7,2.7,12.4,6,15.7,9.3 c3.3,3.4,4.5,6.3,4.5,9.9c0,1.8-0.3,3.6-1.1,5.5c-21.9-11.9-49.3-17.9-76.7-17.9c-26.6,0-53.2,5.6-74.7,16.8 c-0.5-1.5-0.7-2.9-0.7-4.4c0-3.5,1.2-6.5,4.5-9.9c3.3-3.4,8.7-6.7,15.7-9.3C212.4,104.1,232.6,101.3,254.9,101.3L254.9,101.3z M253.7,130c24.6,0,49.2,4.8,68.6,14.3c-3.1,2.6-6.9,5.1-11.4,7.3c-13.9,7-33.9,11.5-56,11.5s-42-4.5-56-11.5 c-4.9-2.4-9-5.2-12.2-8C205.8,134.5,229.7,130,253.7,130z M232.3,174.9c3.7,0.5,7.5,0.9,11.4,1.2c0.5,3.6,1,7.5,1.6,11.8 c1.6,13,3.3,27.9,3.3,37.5c0,10.8-3.5,20.6-9.5,28.1c-6.1,7.5-14.5,13-24.6,16.5c-11.2,3.9-24.5,5.6-39.3,4.8 c-14.2-2.5-25.1-9.3-35.7-19.6c29.1,8.3,54.5,8.2,71.9,2.1c8.7-3.1,15.4-7.6,19.7-13c4.3-5.4,6.5-11.4,6.5-18.9 c0-7.7-1.6-22.8-3.1-35.6C233.6,184.1,232.9,179,232.3,174.9L232.3,174.9z M275,175.2c-0.6,4-1.3,9-2,14.6 c-1.6,12.7-3.1,27.9-3.1,35.6c0,7.5,2.1,13.6,6.5,18.9c4.3,5.4,11,9.9,19.7,13c17.3,6.1,42.6,6.2,71.6-2.1 c-10.6,10.3-21.5,17.1-35.7,19.6c-14.8,0.8-28-0.9-39.1-4.8c-10.1-3.5-18.5-9-24.6-16.5s-9.5-17.3-9.5-28.1 c0-9.7,1.7-24.6,3.3-37.5c0.5-4.3,1.1-8.2,1.5-11.7C267.4,176,271.2,175.7,275,175.2L275,175.2z M347.1,370.2 c-52.9,43.1-129.3,43.2-182.3,0.3l-1.4,27.8c3.6,6.1,14.2,13.2,29.4,17.8c16.3,4.9,37.2,7.7,58.5,7.9c21.4,0.2,43.2-2,61.5-6.7 c16.8-4.3,30.4-11,37.8-18.5L347.1,370.2L347.1,370.2z", - special: "M256,14.2c-65.6,98.3-131.1,90.2-196.7,106.5c0,262.3,65.6,327.8,196.7,377 c131.1-49.2,196.7-114.7,196.7-377C387.1,104.4,321.6,112.6,256,14.2z M256,47c5.1,0,9.2,4.1,9.2,9.2s-4.1,9.2-9.2,9.2 s-9.2-4.1-9.2-9.2S250.9,47,256,47z M70.6,138.2c0-5.1,4.1-9.2,9.2-9.2s9.2,4.1,9.2,9.2s-4.1,9.2-9.2,9.2S70.6,143.3,70.6,138.2z M92.1,301.1c-5.1,0-9.2-4.1-9.2-9.2c0-5.1,4.1-9.2,9.2-9.2s9.2,4.1,9.2,9.2C101.3,296.9,97.2,301.1,92.1,301.1z M157.7,432.2 c-5.1,0-9.2-4.1-9.2-9.2c0-5.1,4.1-9.2,9.2-9.2s9.2,4.1,9.2,9.2C166.9,428.1,162.7,432.2,157.7,432.2z M256,483.4 c-5.1,0-9.2-4.1-9.2-9.2s4.1-9.2,9.2-9.2s9.2,4.1,9.2,9.2S261.1,483.4,256,483.4z M354.3,432.2c-5.1,0-9.2-4.1-9.2-9.2 c0-5.1,4.1-9.2,9.2-9.2c5.1,0,9.2,4.1,9.2,9.2C363.6,428.1,359.4,432.2,354.3,432.2z M314.4,426.7c-15.8,11.1-33.7,18.7-51.1,26.8 c-6.7,4.7-14-0.5-20.7-2.5c-44.7-18.3-86.5-49.8-107.6-94.5c-29.8-63.5-33.8-135-36.7-204.3c58.8-9,115.3-28.5,156.2-72.1l1.9-2.1 c4.5,5,9.3,9.8,14.2,14.5c35.8,36.3,85,47,133.9,57.8c2.8,1.2,6.8,0.5,9.1,2c-2.7,66.4-5.7,134.9-33.1,196.4 C367.3,380.9,343.2,407.7,314.4,426.7z M419.9,301.1c-5.1,0-9.2-4.1-9.2-9.2c0-5.1,4.1-9.2,9.2-9.2s9.2,4.1,9.2,9.2 C429.1,296.9,425,301.1,419.9,301.1z M432.2,147.4c-5.1,0-9.2-4.1-9.2-9.2s4.1-9.2,9.2-9.2s9.2,4.1,9.2,9.2 S437.3,147.4,432.2,147.4z M301.1,154.9c0.2,23.3,0.3,46.6,0.5,69.9c0,1,0.4,2.2,0.9,3.1c4.9,8.4,9.8,16.9,15,25.1 c1.6,2.6,0.8,5.1,0.6,7.6c-0.7,9.5-1.7,19-2.6,28.5c-1,10.5-2,21-3,31.6c-0.8,9-1.6,17.9-2.4,26.9c-0.8,9-1.7,17.9-2.5,26.9 c-0.7,7.3-1.3,14.6-2,22c-0.1,1.2-0.6,2.7-1.4,3.6c-12,12-24.1,23.9-36.2,35.9c-0.2,0.2-0.5,0.5-1.1,1c0-1.1,0-1.8,0-2.5 c0.1-66.5,0.3-133,0.5-199.5c0-1.5,0.8-3.2,1.7-4.4c2.2-2.9,2.8-6,2.8-9.6c0-28.5,0.1-57.1,0.2-85.6c0-0.7,0-1.5,0-2.5 c0.8,0,1.5-0.1,2.3-0.1c13.9,0.1,27.8,0.1,41.7,0.1c1.2,0,1.9,0.3,2.3,1.5c0.8,2.2,1.7,4.3,2.7,6.6c-6.2,3.9-12.2,7.6-18.2,11.3 C301.6,152.6,301.1,153.4,301.1,154.9z M245.2,433.7c0,0.9,0,1.7,0,2.6c-0.2,0.1-0.4,0.2-0.6,0.3c-1.4-1.5-2.8-3.1-4.3-4.5 c-10.7-10.6-21.5-21.2-32.2-31.9c-0.9-0.9-1.6-2.5-1.7-3.9c-1-9.2-1.8-18.4-2.6-27.5c-0.7-7.2-1.3-14.3-2-21.5 c-0.8-9.2-1.7-18.4-2.6-27.5c-0.7-7.1-1.3-14.2-1.9-21.3c-0.9-9.3-1.7-18.5-2.6-27.8c-0.5-4.9-1-9.9-1.3-14.8 c-0.1-0.7,0.4-1.6,0.8-2.2c5.1-8.6,10.2-17.1,15.2-25.7c0.5-0.9,0.9-2.1,0.9-3.1c0.2-23.2,0.3-46.4,0.5-69.6c0-1.6-0.5-2.5-1.9-3.4 c-6-3.6-11.9-7.3-18-11.2c1-2.5,2-4.9,3.1-7.4c0.2-0.3,0.8-0.6,1.2-0.6c14.6-0.1,29.3-0.1,43.9-0.1c0.1,0,0.3,0.1,0.6,0.3 c0,0.7,0.1,1.5,0.1,2.3c0.1,29.2,0.2,58.4,0.3,87.7c0,2.1,0.3,4,1.7,5.6c2.5,2.9,3,6.2,3,10C244.9,303.4,245.1,368.5,245.2,433.7z", - specialBg: "M316.9,432.4c-16.5,11.6-35,19.4-53.1,27.8c-7,4.9-14.6-0.5-21.6-2.6 c-46.5-19-90-51.8-111.9-98.3c-31-66.1-35.1-140.5-38.2-212.4c61.2-9.4,119.9-29.6,162.4-75l2-2.1c4.7,5.2,9.6,10.2,14.7,15.1 c37.2,37.7,88.4,48.9,139.2,60.1c2.9,1.3,7.1,0.5,9.4,2.1c-2.9,69.1-5.9,140.3-34.4,204.3C372,384.8,346.8,412.7,316.9,432.4z" - } - }, - ReducedEffect: { - viewBox: "0 0 512 512", - paths: { - main: "M260.7,487.55C133,487.55,28.39,382.92,28.39,255.23S133,24.45,260.7,24.45A230.5,230.5,0,0,1,491.49,255.23c0,127.69-103.1,232.32-230.78,232.32Zm-1.06-82L377,287.58l-23.94-25.1-65.41,37.94V128a167.28,167.28,0,0,1,103.6,268.91,193.71,193.71,0,0,0,61.22-141.63A191.18,191.18,0,0,0,260.7,63.45c-106.39,0-193.31,85.39-193.31,191.78A192.9,192.9,0,0,0,128,395.55,167.3,167.3,0,0,1,231,128.2V296.92l-62.5-35.62-25.09,26.28Z" - }, - classes: { - main: "fill-linear" - } - }, - ComplicationMinor: { - viewBox: "0 0 512 512", - paths: { - main: "M345.58,263.18l39.74-8.31,73.29-15.3,22.83-4.79,2.81-.58,9.56-2V213.1l-6.33,1.33-79.55,16.62-26.49,5.54-55.93,11.69c-13-11.18-20-24.73-27.16-39.89l-1.67-3.53,34.18-46.76,57.87-79.18,3-4.1,41.19-56.33H409.77L375.26,65.7l-4.09,5.59-60.51,82.78-32.91,45c-15.06-6.36-26.14-17.76-38.57-30.33l-2.34-2.37-4.59-30.28L216.72,33.5l-1-6.47-1.29-8.54h-18.9l2.84,18.75-.11-4.41,15.2,104.1,5.59,37c-11.18,7.5-24.44,12.15-39,15.49l-22.9-28.89L93.8,80.58,44.58,18.49H20.74l53,66.83,4.18,5.26,66.54,84,19.15,24.16-.08.7c-1.93,17.37-8.88,29.63-16.65,43.07L115.3,234.2,25.49,210.61,23.08,210l-4.31-1.14v19.32l2.56.67L112,252.65l27.61,7.25.56,1.4c6.1,15.15,5.39,31.77,2.9,49.71l-30.31,14.2L23.15,367.14l-4.38,2.06v20.62l9.18-4.3,67.92-31.77,17.13-8,28.92-13.54,1.52,1.53c5.85,5.86,10,10.29,11.22,20.75l-31.14,31.3L56.27,453.39l-37.5,37.69v2.43h24l20.91-21h0l77.94-78.36,24.11-24.24,1-.23c23.75-5.79,59.86-6.75,80.11-6.78,4,0,6.81,0,9.35.08l10.4,32.29L293,477.73l1.54,4.78,3.54,11h19.63l-5.19-16.14-2.24-6.95-25.77-80.06-11-34.32c3.55-3.17,8.73-7.63,15-12.42,11.42-8.73,26.21-17.7,35.68-19.62l4.24-.87,25.37,10L442,368.08l4.18,1.66,47.6,18.83V368.48l-37.78-15-5.21-2-82.75-32.74-36.59-14.48c0-13.16,1.4-22.85,9.12-33.93Zm-61.35-41.29c5.12,10.41,11.11,21.1,19.66,30.91l-31.15,6.52a39.69,39.69,0,0,0-6.93-12.22Zm-62.13-28,6,39.74a39.25,39.25,0,0,0-10.25,3.48l-25.18-31.77A132,132,0,0,0,222.1,193.9Zm-43.39,23.92,24.91,31.43a38.6,38.6,0,0,0-4.08,7.07l-33.92-8.92C170.58,238.65,175.45,229.15,178.71,217.82Zm17.49,56.93a39.32,39.32,0,0,0,2.08,10.45L163,301.7c1.05-11.91.92-24.05-2-36.2ZM160,324.27l.09-.55,47.15-22.07h0L169.55,339.5A54.79,54.79,0,0,0,160,324.27Zm28.37,22.85,36.61-36.8a39.43,39.43,0,0,0,10.6,1.45,35.54,35.54,0,0,0,4-.2L250,344.11C236.7,344,212.41,344.2,188.33,347.12ZM250.78,236a35.39,35.39,0,0,0-3.61-1.32L241.46,197a109.45,109.45,0,0,0,25.15,17.38Zm26.37,92.76c-3.9,3-7.1,5.61-9.88,8l-10.1-31.4a39.81,39.81,0,0,0,8.16-7.16l36.5,14.44A169,169,0,0,0,277.15,328.76Zm36-31.76L273.9,281.47c.26-1.14.47-2.29.64-3.44l45.58-9.53C315.5,277.93,313.74,287.39,313.17,297Z" - }, - classes: { - main: "fill-radial" - } - }, - ComplicationMajor: { - viewBox: "0 0 512 512", - paths: { - main: "M458.26,239.57l22.83-4.78,2.81-.59,9.56-2v-19.1l-6.33,1.33-79.55,16.62-26.49,5.54-55.93,11.69c-13-11.18-20-24.73-27.16-39.89l-1.67-3.53,34.18-46.76.58-.79c9.76,28.37,24.84,58.48,51.36,78.35l24.6-5,1.83-.54L407.07,229c-37.27-19.15-50.45-51.64-61.94-88.83l-.44-1.43,43.69-59.78,3-4.1,41.19-56.34H409.42L374.91,65.7l-4.09,5.6-46.71,63.9c-34.73.23-70.42-3-95.76-22.5l-12-79.19-1-6.47-1.29-8.55H195.2L198,37.24l-.11-4.4,12.18,83.44c-17,16.89-39.15,28.73-67.39,26.48L93.45,80.59,44.23,18.49H20.39l53,66.83,4.18,5.27L129,155.51c-3.16,27.24-16.63,53.33-32.88,73.74l-71-18.63L22.73,210l-4.31-1.13v19.32l2.56.67,71.38,18.74c8.29,26.73,6.3,57.28,2.12,86L22.8,367.15l-4.38,2.05v20.63l9.18-4.3,67.92-31.78,1.09-.51A190.52,190.52,0,0,1,104.47,382c1.33,7.25,2.58,14.68,3.19,19.36l-51.74,52-37.5,37.69v2.43H42.37l20.91-21h0l58.27-58.57c10.1-.83,33.7-2.28,59.06-3.17,7.9-.28,16.15-.45,24.46-.47,23.47-.05,49.4,1.12,67.34,4.45l20.27,63,1.54,4.79,3.54,11h19.63l-5.19-16.14L310,470.43,291.2,412.17c23.43-27.05,48.62-54.87,86-69.58l64.45,25.5,4.18,1.65,47.6,18.84v-20.1l-37.78-15-5.21-2.06-62.74-24.82c-3.11-24.21,8.64-50.64,20.2-76.57ZM266.92,336.72l-10.1-31.4a39.76,39.76,0,0,0,8.16-7.15l36.5,14.44a169,169,0,0,0-24.68,16.16C272.9,331.76,269.7,334.38,266.92,336.72Zm-71.07-62a39.17,39.17,0,0,0,2.08,10.44l-35.27,16.5c1.05-11.9.92-24-2-36.19Zm-30.58-27.35c5-8.75,9.83-18.25,13.09-29.59l24.91,31.43a39.28,39.28,0,0,0-4.08,7.07Zm41.58,54.25h0L169.2,339.51a54.79,54.79,0,0,0-9.59-15.23l.09-.56Zm17.74,8.67a39.43,39.43,0,0,0,10.6,1.45,38,38,0,0,0,4-.2l10.47,32.54c-13.32-.16-37.61.08-61.69,3Zm22.23-75.64L241.11,197a109.17,109.17,0,0,0,25.15,17.39L250.43,236A37.88,37.88,0,0,0,246.82,234.69Zm26.73,46.78c.26-1.13.47-2.28.64-3.43l45.58-9.53c-4.62,9.43-6.38,18.89-6.95,28.5Zm30-28.66-31.15,6.51a39.53,39.53,0,0,0-6.93-12.21l18.42-25.21C289,232.31,295,243,303.54,252.81ZM232.78,136.13c23.18,13.26,50.47,17.92,77,18.68l-32.37,44.3c-15.06-6.37-26.14-17.76-38.57-30.33l-2.34-2.37-4.59-30.28,0-.12Zm-5,97.52a39.25,39.25,0,0,0-10.25,3.48l-25.18-31.77a132,132,0,0,0,29.42-11.45Zm-14.52-96,5.48,36.25c-11.18,7.5-24.44,12.15-39.05,15.49l-22.46-28.34C178.25,159.21,198.58,149.44,213.24,137.65Zm-69.67,36.28.5.63,19.15,24.15-.08.71c-1.93,17.37-8.88,29.63-16.65,43.06L115,234.2l-.07,0C127,217.56,138.38,195.1,143.57,173.93ZM123.4,385.56c-.42-2.17-1.06-4.9-1.43-6.92-1.84-10-4.7-23.39-8.85-33.12l28.45-13.32,1.52,1.53c5.85,5.87,10,10.3,11.22,20.75Zm15.89-125.65.56,1.4c6.1,15.14,5.39,31.77,2.9,49.71l-29,13.58c2.87-22.76,3.42-48.28-2.06-71.93h0Zm72.18,131.64h-6.55c-8.5.05-16.9.25-25,.53-15.57.55-28,1.33-37.85,2.07l.07-.07a7.94,7.94,0,0,1-.82-.06l24-24.11,1-.23c23.75-5.79,59.86-6.75,80.11-6.78,4,0,6.81,0,9.35.07l10.29,32C249.77,392.55,229.58,391.66,211.47,391.55Zm73.59-1.18-.71.53-.17-.53-11-34.32c3.55-3.17,8.73-7.63,15-12.42,11.42-8.73,26.21-17.7,35.68-19.63l4.24-.86,25.37,10C324.89,348,303.58,369.47,285.06,390.37ZM368.49,319l-.77-.31-36.59-14.48c0-13.15,1.4-22.84,9.12-33.92l5-7.14L385,254.88l.12,0C376.44,274.07,368.18,297,368.49,319Z" - }, - classes: { - main: "fill-radial" - } - }, - ComplicationSerious: { - viewBox: "0 0 512 512", - paths: { - main: "M21.42,17.34,78.56,89.45c-2.73,48.59-23.75,85.79-52.39,120l-6.72-1.76V227l2.56.67C37.36,272.78,31.1,318.54,23.83,366l-4.38,2.05v20.63l9.18-4.29c6.52,10.7,13.66,27,19.06,41.33,4.29,11.33,7.48,21,9.26,26.53l-37.5,37.69v2.43h24L72,463.67c9.27-.36,41.77-1.47,82.7-.75,46.74.83,102.61,4.3,139,13.67l5.08,15.78h19.63L311,469.28c35.94-41.51,71.91-80.52,131.73-102.34l51.78,20.49v-20.1l-43-17c-6.37-39.21,12.76-76.67,30.62-116.68l12.37-2.59V212l-6.33,1.32-5.45-2.8c-56.09-28.83-76.33-78-93.3-132.7L433.6,17.34H410.45l-38.6,52.81c-58.28,1.26-112.48-2.46-154.45-37.79l-2.27-15h-18.9l2.83,18.75c-27.13,29-57.56,48-104.58,43.36L45.26,17.34Zm199.92,41c40.6,26.3,88.49,30.89,136.75,30.63L325,134.32c-36.59.39-69.86-3-95.85-24.64l-7.76-51.33Zm-18.84.44,8.29,54.77c-17.81,18.62-37.29,30.18-68,26.86L109.72,98.68c38.59-.74,68.36-17.15,92.78-39.89ZM375.83,96.38c15.53,47,37.05,92.69,84.55,122.72l-51.77,10.82-.82-.42c-37.27-19.14-50.44-51.64-61.93-88.83l-.72-2.31,30.68-42ZM95.09,110.3l34.39,43.39c-2.52,29.59-15.41,52.66-33.14,74.21L45.93,214.67c23.72-29.78,42.64-63.39,49.16-104.37ZM232.93,135c23.94,13.69,51.05,17.4,78.41,17.94l-32.91,45c-15.06-6.36-26.14-17.75-38.57-30.32l-2.35-2.37L232.93,135Zm-18.77.81,5.59,36.95c-11.18,7.5-24.44,12.15-39.05,15.49l-22.9-28.89c22.71-1.4,41.09-10.68,56.36-23.55ZM331.54,157c9.74,29.15,23.14,58,50.58,78.49l-55.93,11.69c-13-11.18-20-24.74-27.16-39.89l-1.67-3.53ZM145.1,173.41l19.15,24.16-.08.71c-1.93,17.36-8.88,29.63-16.65,43.06L116,233.06c13.21-17.36,23.94-36.83,29.12-59.65Zm77.68,19.35,6,39.75A38.88,38.88,0,0,0,218.54,236l-25.18-31.77a132.49,132.49,0,0,0,29.42-11.45Zm19.36,3.05a109.17,109.17,0,0,0,25.15,17.39l-15.83,21.66c-1.18-.49-2.38-.94-3.61-1.32l-5.71-37.73Zm-62.75,20.86L204.3,248.1a39.37,39.37,0,0,0-4.08,7.07l-33.92-8.9c5-8.76,9.83-18.25,13.09-29.6Zm105.52,4.08c5.12,10.42,11.11,21.1,19.66,30.92l-31.15,6.5A39.64,39.64,0,0,0,266.49,246l18.42-25.21ZM43.14,233.26,92,246.09c9.23,28.21,5.8,57.08,1.2,87.45l-49.07,23c6-40.15,10.29-81.42-1-123.24Zm416.14,5.16c-14.93,32.63-30.11,66.73-27.43,104.13l-43.74-17.31c-3.6-25,8.78-49.44,20.72-76.28l50.45-10.54Zm-346.57,13.1,27.61,7.25.56,1.4c6.1,15.13,5.39,31.77,2.9,49.71l-30.32,14.18c3.22-23.51,5-47.81-.75-72.54ZM386,253.74c-9,19.81-17.8,40.8-17.25,63.84l-36.59-14.47c0-13.15,1.4-22.84,9.12-33.92l5-7.15,39.74-8.3ZM161.64,264.36l35.24,9.26A39.33,39.33,0,0,0,199,284.06l-35.27,16.5c1.05-11.9.92-24.05-2.05-36.2Zm159.16,3c-4.62,9.44-6.38,18.89-6.95,28.5l-39.27-15.54c.26-1.12.47-2.27.64-3.43l45.58-9.53ZM266,297l36.5,14.44a169,169,0,0,0-24.68,16.16c-3.9,3-7.1,5.6-9.88,7.94l-10.11-31.4A39.76,39.76,0,0,0,266,297Zm-58.12,3.48-37.66,37.86a54.85,54.85,0,0,0-9.59-15.24l.09-.55,47.15-22.07Zm17.73,8.67a39.43,39.43,0,0,0,10.6,1.46c1.35,0,2.69-.07,4-.2L250.7,343c-13.32-.16-37.62.07-61.7,3l36.61-36.81ZM329.1,322l25.36,10c-29.4,14.92-50.37,35.89-69.25,57.2l-11-34.32c3.55-3.18,8.73-7.63,15-12.43,11.42-8.73,26.21-17.7,35.68-19.63l4.24-.86Zm-186.5,9.07,1.52,1.52c5.85,5.88,10,10.31,11.22,20.75L124.2,384.64c-.35-2.27-.74-4.63-1.2-7.14-2-10.95-4.45-22.94-9.32-32.9l28.92-13.54Zm235.93,10.49,39.22,15.52c-49.42,22.5-82.92,56.68-113.45,91.47l-12.44-38.65c24.11-27.84,47.68-53.61,86.67-68.34Zm-282,11.06c3,6.84,6.22,18.17,8.07,28.26,1.58,8.61,2.5,16.08,3,20.45L71.72,437.4c-1.68-5-3.78-11-6.55-18.29-5.37-14.22-12-30-19.61-42.64l51-23.86Zm150.86,9.15c4,0,6.81,0,9.35.06l10.39,32.3c-26.25-4.15-58.63-4.19-87-3.18-15.58.55-28,1.32-37.86,2.06l24.11-24.24,1-.23C191,362.74,227.16,361.79,247.41,361.76Zm-42.19,47.39c24.92-.06,50.36,1.26,68.41,5.1L287.06,456c-38.71-8.23-89-11-132.09-11.74-27.22-.48-49.23-.19-63.87.17l30.8-31c7.77-.76,30.71-2.84,58.86-3.84,7.9-.28,16.15-.45,24.46-.47Z" - }, - classes: { - main: "fill-radial" - } - }, - LostOpportunity: { - viewBox: "0 0 512 512", - paths: { - main: "M373.33,52.76A234.57,234.57,0,0,0,52.77,138.67C-12,250.93,26.41,394.41,138.67,459.23s255.75,26.36,320.56-85.91S485.59,117.58,373.33,52.76Zm-211.87,367A189.1,189.1,0,0,1,81,184.37L327.62,431A188.73,188.73,0,0,1,161.46,419.76Zm211.18-14.87L107.14,139.38a187.3,187.3,0,0,1,32.24-32.29L404.89,372.6A187.71,187.71,0,0,1,372.64,404.89ZM431,327.6,184.41,81A189.12,189.12,0,0,1,431,327.6Z" - }, - classes: { - main: "fill-linear" - } - }, - WorsePosition: { - viewBox: "0 0 512 512", - paths: { - horizon: "M18.36,227.8v18.68h86.37a98.45,98.45,0,0,0-4.43-18.68Zm379.4,0a110.51,110.51,0,0,1,9.44,18.68h86.44V227.8H397.76Z", - boot: "M218.67,18.73a162.14,162.14,0,0,0-20,1.32C164,24.39,123.5,39.4,91.23,67.36L124.7,257.55l.35,10.12c42.26,15.79,100.82,24.55,152.87,24.25,27.19-.15,52.64-2.74,73-7.78s35.2-12.82,41.81-20.94l.44.35a113,113,0,0,0-6.53-17.06h.19a95.88,95.88,0,0,0-4.85-8.66c-.09-.14-.16-.3-.25-.44l-.31-.47c-21.46-34.89-63.5-55.87-124.28-29.37l-.16.06a215.37,215.37,0,0,0-34,20.19h-.81c11-15.72,23.26-28.12,35.91-37.28l1.12-11.16c-14.68-4-38.08-4.06-53.53-.09L201,161.14a130.33,130.33,0,0,1,30.34-3.84c1.5,0,3,0,4.5,0a117.66,117.66,0,0,1,25.25,3.12l3.19-32c-21.06-8.07-42.12-6.6-64.57-1.59l-4.06-18.25A170.07,170.07,0,0,1,231,104.17c1.72,0,3.44,0,5.16.07a107,107,0,0,1,30.06,5.12l3.16-31.47c-25.6-7.69-51-8.1-76.91-2.78l-3.78-18.28A188.53,188.53,0,0,1,221.52,53c1.14,0,2.29-.05,3.43-.06A167.36,167.36,0,0,1,271.23,59l.47-4.6c5-23.31-18.75-35.71-53-35.65ZM397.26,284.45c-10.84,8.13-25.26,13.7-41.87,17.82-22.37,5.54-49.07,8.18-77.38,8.34a526.46,526.46,0,0,1-65.09-3.75L225.36,329c80.16,9.44,141.5-1.19,172-21.78a113.13,113.13,0,0,0-.13-22.75ZM125.7,287.77l1,30.47,58.6,8.43,9.59-22.31c-24.55-3.82-48.21-9.37-69.19-16.59Z", - ice: "M92.61,309.3C82.3,312.37,74,315.76,68,319.36l-.21.12L37.58,334.2,18.36,322v22.16L32,352.8l4.41,2.81,4.72-2.31,22-10.72c11.71,9.8,40.46,18.23,79.4,23.87l-60,28.25,26.63,21L18.36,454.23v39H145.14L188.86,447l51,46.28h27.84L159.11,394.8l35.06-23c20,1.37,41.34,2.15,63.56,2.15,20.7,0,40.66-.67,59.44-1.87l39.06,24.69-66.9,35.71,62.28,60.75H475.52L385,440.64l51.32-39.78-71.5-33.28c45.88-6,79.18-15.67,89.81-27l18,6.43,21.06,22.57V342.17l-8.94-9.56L483.17,331l-2.15-.78L439.8,315.42a141.57,141.57,0,0,0-16.66-6c5.37,3.24,8.28,6.7,8.28,10.28,0,18.59-77.73,33.66-173.62,33.66S84.14,338.29,84.14,319.7c0-3.63,3-7.13,8.47-10.4Z" - }, - classes: { - horizon: "fill-dark", - boot: "fill-bright", - ice: "fill-radial" - } - }, - InsightHarm1: { - viewBox: "0 0 512 512", - paths: { - eye: "M406.09,282.69V352.6c4.19,8.54,8.53,16.73,8.53,27.56,0,13.24-8.75,22.78-18.09,22.78-9.13,0-18.69-10-18.69-23.94,0-12.22,5.1-20.64,9.56-29.59V289.63c-6.51-19.32-16.22-25.45-26.54-21.72V226.24A401.64,401.64,0,0,0,409.07,204h45.2C435.64,222.23,417,244.72,406.09,282.69ZM494.83,158.8c-33,49.83-80.77,87.12-134,108.82a291.28,291.28,0,0,1-90,21.07q-7.2.51-14.42.62a256.33,256.33,0,0,1-89-14,239,239,0,0,1-25.35-10.52A239.65,239.65,0,0,1,82.64,223.9C74.76,216.85,66,208.81,57.89,200c-11.54-12.52-21.66-26.51-25.72-41.23,20.19-37.74,48.7-69.38,84.66-92.29C241.41-14.68,416.3,37.68,494.83,158.8Zm-29.17-.36C373.78,11.86,140.41,12.08,57.19,160.28l.46.39-.46.39a353,353,0,0,0,54.67,42.55c45.21,28.32,92.77,42.1,140.82,42.29h.22C324.81,246.14,397.81,215.94,465.66,158.44Z", - iris: "M303.7,99.51a65,65,0,0,0-45-18h0a65.26,65.26,0,1,0,45,18Zm-45.4,68.13a23.4,23.4,0,1,1,23.39-23.41A23.42,23.42,0,0,1,258.3,167.64Zm45.4-68.13a65,65,0,0,0-45-18h0a65.26,65.26,0,1,0,45,18Zm-45.4,68.13a23.4,23.4,0,1,1,23.39-23.41A23.42,23.42,0,0,1,258.3,167.64Zm45.4-68.13a65,65,0,0,0-45-18h0a65.26,65.26,0,1,0,45,18Zm-45.4,68.13a23.4,23.4,0,1,1,23.39-23.41A23.42,23.42,0,0,1,258.3,167.64Z" - }, - classes: { - eye: "fill-dark", - iris: "fill-med" - } - }, - InsightHarm2: { - viewBox: "0 0 512 512", - paths: { - eye: "M305.51,89.71A78.5,78.5,0,0,0,251.22,68h0a78.81,78.81,0,1,0,54.29,21.71ZM250.71,172a28.25,28.25,0,1,1,28.23-28.27A28.28,28.28,0,0,1,250.71,172Zm54.8-82.26A78.5,78.5,0,0,0,251.22,68h0a78.81,78.81,0,1,0,54.29,21.71ZM250.71,172a28.25,28.25,0,1,1,28.23-28.27A28.28,28.28,0,0,1,250.71,172Zm54.8-82.26A78.5,78.5,0,0,0,251.22,68h0a78.81,78.81,0,1,0,54.29,21.71ZM250.71,172a28.25,28.25,0,1,1,28.23-28.27A28.28,28.28,0,0,1,250.71,172Z", - iris: "M398.59,282.69V352.6c4.19,8.54,8.53,16.73,8.53,27.56,0,13.24-8.75,22.78-18.09,22.78-9.13,0-18.69-10-18.69-23.94,0-12.22,5.1-20.64,9.56-29.59V289.63c-6.51-19.32-16.22-25.45-26.54-21.72V226.24A401.64,401.64,0,0,0,401.57,204h45.2C428.14,222.23,409.46,244.72,398.59,282.69Zm-264-17.94A239.65,239.65,0,0,1,75.14,223.9c-7.88-7.05-16.67-15.09-24.75-23.86,11.79,18.34,22,39.48,27.42,60.27v50c-4.76,10.14-12.06,17.21-12.06,28.41,0,9.09,11.63,18.09,21,18.09,9.2,0,21.6-9.67,21.59-19.25,0-11.36-7.31-17.81-11.87-27V278.22C103,265.1,117.78,261.12,134.61,264.75ZM487.33,158.8c-33,49.83-80.77,87.12-134,108.82a291.28,291.28,0,0,1-90,21.07q-7.2.51-14.42.62a256.33,256.33,0,0,1-88.95-14,239,239,0,0,1-25.35-10.52A239.65,239.65,0,0,1,75.14,223.9c-7.88-7.05-16.67-15.09-24.75-23.86-11.54-12.52-21.66-26.51-25.72-41.23,20.19-37.74,48.7-69.38,84.66-92.29C233.91-14.68,408.8,37.68,487.33,158.8Zm-29.17-.36C366.28,11.86,132.91,12.08,49.69,160.28l.46.39-.46.39a353,353,0,0,0,54.67,42.55c45.21,28.32,92.77,42.1,140.82,42.29h.22C317.31,246.14,390.31,215.94,458.16,158.44Z" - }, - classes: { - eye: "fill-med", - iris: "fill-med" - } - }, - InsightHarm3: { - viewBox: "0 0 512 512", - paths: { - eye: "M398.31,282.69V352.6c4.19,8.54,8.53,16.73,8.53,27.56,0,13.24-8.75,22.78-18.09,22.78-9.13,0-18.69-10-18.69-23.94,0-12.22,5.1-20.64,9.56-29.59V289.63c-6.51-19.32-16.22-25.45-26.54-21.72V226.24A401.64,401.64,0,0,0,401.29,204h45.2C427.86,222.23,409.18,244.72,398.31,282.69Zm-264-17.94A239.65,239.65,0,0,1,74.86,223.9C67,216.85,58.19,208.81,50.11,200c11.79,18.34,22,39.48,27.42,60.27v50c-4.76,10.14-12.06,17.21-12.06,28.41,0,9.09,11.63,18.09,21,18.09,9.2,0,21.6-9.67,21.59-19.25,0-11.36-7.31-17.81-11.87-27V278.22C102.75,265.1,117.5,261.12,134.33,264.75Zm114.3,24.56a256.33,256.33,0,0,1-88.95-14,109.79,109.79,0,0,1,42.38,48.58v80.59c-6.36,10.47-13.62,16.95-13.62,28.87,0,17.89,11.76,24.5,23.93,24.5,11.91,0,21.6-5.66,21.6-24.5,0-9.3-7.44-16.63-13.22-31.06V324.1C227.16,309.18,237.5,294.45,248.63,289.31ZM487.05,158.8c-33,49.83-80.77,87.12-134,108.82a291.28,291.28,0,0,1-90,21.07q-7.2.51-14.42.62a256.33,256.33,0,0,1-88.95-14,239,239,0,0,1-25.35-10.52A239.65,239.65,0,0,1,74.86,223.9C67,216.85,58.19,208.81,50.11,200c-11.54-12.52-21.66-26.51-25.72-41.23,20.19-37.74,48.7-69.38,84.66-92.29C233.63-14.68,408.52,37.68,487.05,158.8Zm-29.17-.36C366,11.86,132.63,12.08,49.41,160.28l.46.39-.46.39a353,353,0,0,0,54.67,42.55c45.21,28.32,92.77,42.1,140.82,42.29h.22C317,246.14,390,215.94,457.88,158.44Z", - iris: "M314.46,80a91.84,91.84,0,0,0-63.52-25.39h0A92.2,92.2,0,1,0,314.46,80Zm-64.12,96.24a33.05,33.05,0,1,1,33-33.07A33.08,33.08,0,0,1,250.34,176.25ZM314.46,80a91.84,91.84,0,0,0-63.52-25.39h0A92.2,92.2,0,1,0,314.46,80Zm-64.12,96.24a33.05,33.05,0,1,1,33-33.07A33.08,33.08,0,0,1,250.34,176.25ZM314.46,80a91.84,91.84,0,0,0-63.52-25.39h0A92.2,92.2,0,1,0,314.46,80Zm-64.12,96.24a33.05,33.05,0,1,1,33-33.07A33.08,33.08,0,0,1,250.34,176.25Z" - }, - classes: { - eye: "fill-med", - iris: "fill-bright" - } - }, - InsightHarm4: { - viewBox: "0 0 512 512", - paths: { - eye: "M244,27.44c-46.86,0-93.53,12.25-134.7,39.08-36,22.91-64.47,54.55-84.66,92.29,4.06,14.72,14.18,28.71,25.72,41.23,8.08,8.77,16.87,16.81,24.75,23.86a239.65,239.65,0,0,0,59.47,40.85A239,239,0,0,0,160,275.27a256.33,256.33,0,0,0,88.95,14q7.22-.1,14.42-.62a291.28,291.28,0,0,0,90-21.07A299.94,299.94,0,0,0,430.12,222a286.46,286.46,0,0,0,57.21-63.16C434.75,77.71,339,27.44,244,27.44ZM245.4,245.9h-.22c-48.05-.19-95.61-14-140.82-42.29a353,353,0,0,1-54.67-42.55l.46-.39-.46-.39c83.22-148.2,316.59-148.42,408.47-1.84C390.31,215.94,317.31,246.14,245.4,245.9Zm17.93,42.79c7.16,3,14.11,11.57,20,28.08,3.54,9.85,6.71,22.54,9.33,38.58v74.84C287.27,440.69,281,449.64,281,462.5s10,22.19,21,22.19c10.74,0,22.18-9.73,22.18-23.34,0-14.45-7.09-23.42-12.81-34.57V342.22h-.22a223.26,223.26,0,0,1,7.48-25.45c9.57-26.37,22.57-44.47,34.73-48.86v-.29A291.28,291.28,0,0,1,263.33,288.69Zm-38.82,28.08c6.37-12.19,15.11-23.17,24.4-27.46a256.33,256.33,0,0,1-88.95-14,109.62,109.62,0,0,1,38.91,41.5q1.84,3.45,3.47,7.08v80.59c-6.36,10.47-13.62,16.95-13.62,28.87,0,17.89,11.76,24.5,23.93,24.5,11.91,0,21.6-5.66,21.6-24.5,0-9.3-7.44-16.63-13.22-31.06V324.1C222.09,321.64,223.26,319.18,224.51,316.77Zm-89.9-52A239.65,239.65,0,0,1,75.14,223.9c-7.88-7.05-16.67-15.09-24.75-23.86,11.79,18.34,22,39.48,27.42,60.27v50c-1.08,2.29-2.28,4.43-3.51,6.49-4.18,7.06-8.55,13.25-8.55,21.92,0,9.09,11.63,18.09,21,18.09,9.2,0,21.6-9.67,21.59-19.25,0-8.63-4.22-14.43-8.25-20.76a67,67,0,0,1-3.62-6.27V278.22C103,265.1,117.78,261.12,134.61,264.75Zm267-60.78a401.64,401.64,0,0,1-48.21,22.27v41.67c10.32-3.73,20,2.4,26.54,21.72v59.78c-4.46,8.95-9.56,17.37-9.56,29.59,0,13.94,9.56,23.94,18.69,23.94,9.34,0,18.09-9.54,18.09-22.78,0-10.83-4.34-19-8.53-27.56V282.69c7.59-26.52,19-45.48,31.53-60.73a225.7,225.7,0,0,1,16.65-18Z", - iris: "M326.5,67.65a108.84,108.84,0,0,0-75.28-30.08h0A109.22,109.22,0,1,0,326.5,67.65Zm-76,114.06a39.17,39.17,0,1,1,39.15-39.19A39.2,39.2,0,0,1,250.51,181.71Zm76-114.06a108.84,108.84,0,0,0-75.28-30.08h0A109.22,109.22,0,1,0,326.5,67.65Zm-76,114.06a39.17,39.17,0,1,1,39.15-39.19A39.2,39.2,0,0,1,250.51,181.71Zm76-114.06a108.84,108.84,0,0,0-75.28-30.08h0A109.22,109.22,0,1,0,326.5,67.65Zm-76,114.06a39.17,39.17,0,1,1,39.15-39.19A39.2,39.2,0,0,1,250.51,181.71Z" - }, - classes: { - eye: "fill-bright", - iris: "fill-med" - } - }, - ProwessHarm1: { - viewBox: "0 0 512 512", - paths: { - scar: "M443.44,434.53Q408.7,409.87,376,383.64c-20-11.91-31.49.3-44.26,16.86,8.8-18.17,13.38-36.95,3.24-50.86l-4.46-3.84-44.85-35.35L237.9,336.93l17.19-25.34c7.31-12.4,3.43-27.17-5.65-41.14q-16.37-16.32-32.22-33c-1.66-1.23-3.31-2.38-4.95-3.5l-66.44,18.87L167.59,227c10.57-17.62,0-41.59-9.84-55.7q-8.4-9.81-16.62-19.75l-43.67,7.29c18.43-7.3,31.37-22.38,16.85-40l2.06,2.33Q91.79,90.29,68.44,58.49q43,32.32,83.86,67.06L188.92,116l-22.11,22q23.38,20.3,46.09,41.39l71.86-30.46L266,178l.3-.24c-21.55,27.54,18.77,86,46,78.42l31.91-17.7L319.4,275l36.88,52.71c.26.3.53.59.79.9,13.64,12.5,31.23,1.71,43.05-14.53l-19.59,42Q412.66,394.28,443.44,434.53Z" - }, - classes: { - scar: "fill-dark" - } - }, - ProwessHarm2: { - viewBox: "0 0 512 512", - paths: { - scarTissue: "M399,355.08c-15-32.31-18.67-65.87-6.23-94.7-47.19,58.41-76.14,4.41-4.09-70.72-101.67,62.7-147.78,31.47-14-88.26-103,54.66-182.49,69.22-130.93,15.19-37.19,10.63-58.21,5.21-76-2.43A643.42,643.42,0,0,0,55.28,58.49a789.14,789.14,0,0,0,47,77.56c7,18.27,3,38.71-31.46,63.44,124.85-33.45,88.52,47-9.36,104.92,166.21-61.68,207.52-47.41,100.64,78,84-61.07,150.14-44.57,122.89,31.29,31.63-24.51,57.9-29.74,78-20.87q43.39,30.7,90.32,59C436.25,418.27,418.25,386,399,355.08ZM352.11,362c-16.61-9.9-26.17.25-36.79,14,7.32-15.11,11.12-30.72,2.69-42.28l-3.7-3.19L277,301.11l-39.68,22,14.29-21.06c6.08-10.31,2.85-22.58-4.7-34.2q-13.6-13.56-26.78-27.46c-1.38-1-2.75-2-4.11-2.91l-55.23,15.68,18.09-21.41c8.78-14.64,0-34.57-8.18-46.3q-7-8.15-13.82-16.42l-36.3,6.06c15.32-6.06,26.08-18.6,14-33.28l-1.89-2.13c.69.72,1.31,1.42,1.89,2.13l1.71,1.94q-20.43-25.65-39.84-52.09,35.76,26.88,69.71,55.75l30.44-7.93-18.38,18.27q19.44,16.88,38.31,34.41l59.73-25.32L260.68,191l.25-.2c-17.91,22.9,15.6,71.52,38.24,65.19l26.52-14.71-20.6,30.37,30.65,43.82.66.74c11.34,10.39,26,1.42,35.79-12.07L355.9,339q26.72,31.78,52.3,65.24Q379.31,383.76,352.11,362Z" - }, - classes: { - scarTissue: "fill-med" - } - }, - ProwessHarm3: { - viewBox: "0 0 512 512", - paths: { - scar: "M447.44,434.53Q412.7,409.87,380,383.64c-20-11.91-31.49.3-44.26,16.86,8.8-18.17,13.38-36.95,3.24-50.86l-4.46-3.84-44.85-35.35L241.9,336.93l17.19-25.34c7.31-12.4,3.43-27.17-5.65-41.14q-16.37-16.32-32.22-33c-1.66-1.23-3.31-2.38-4.95-3.5l-66.44,18.87L171.59,227c10.57-17.62,0-41.59-9.84-55.7q-8.4-9.81-16.62-19.75l-43.67,7.29c18.43-7.3,31.37-22.38,16.85-40l2.06,2.33Q95.79,90.29,72.44,58.49q43,32.32,83.86,67.06L192.92,116l-22.11,22q23.38,20.3,46.09,41.39l71.86-30.46L270,178l.3-.24c-21.55,27.54,18.77,86,46,78.42l31.91-17.7L323.4,275l36.88,52.71c.26.3.53.59.79.9,13.64,12.5,31.23,1.71,43.05-14.53l-19.59,42Q416.66,394.28,447.44,434.53Z", - scarTissue: "M436.33,375.37c-18.07-38.87-22.46-79.24-7.49-113.92-56.77,70.27-91.6,5.3-4.93-85.08C301.61,251.8,246.13,214.23,407,70.19,283.18,136,187.5,153.46,249.53,88.47c-44.75,12.79-70,6.27-91.47-2.93a773.7,773.7,0,0,0-135.18-67,949.58,949.58,0,0,0,56.49,93.31c8.39,22,3.6,46.57-37.84,76.32C191.72,148,148,244.71,30.26,314.42c200-74.2,249.65-57,121.08,93.78C252.42,334.73,332,354.59,299.17,445.84c38.06-29.48,69.66-35.77,93.87-25.1q52.21,36.94,108.66,70.93C481.19,451.39,459.54,412.52,436.33,375.37ZM380,383.64c-20-11.91-31.49.3-44.26,16.86,8.8-18.17,13.38-36.95,3.24-50.86l-4.46-3.84-44.85-35.35L241.9,336.93l17.19-25.34c7.31-12.4,3.43-27.17-5.65-41.14q-16.37-16.32-32.22-33c-1.66-1.23-3.31-2.38-4.95-3.5l-66.44,18.87L171.59,227c10.57-17.62,0-41.59-9.84-55.7q-8.4-9.81-16.62-19.75l-43.67,7.29c18.43-7.3,31.37-22.38,16.85-40L116,116.26c.83.86,1.57,1.71,2.27,2.56l2.06,2.33Q95.79,90.29,72.44,58.49q43,32.32,83.86,67.06L192.92,116l-22.11,22q23.38,20.3,46.09,41.39l71.86-30.46L270,178l.3-.24c-21.55,27.54,18.77,86,46,78.42l31.91-17.7L323.4,275l36.88,52.71c.26.3.53.59.79.9,13.64,12.5,31.23,1.71,43.05-14.53l-19.59,42q32.13,38.23,62.91,78.49Q412.7,409.87,380,383.64Z" - }, - classes: { - scar: "fill-dark", - scarTissue: "fill-med" - } - }, - ProwessHarm4: { - viewBox: "0 0 512 512", - paths: { - scar: "M441.44,434.53Q406.7,409.87,374,383.64c-20-11.91-31.49.3-44.26,16.86,8.8-18.17,13.38-36.95,3.24-50.86l-4.46-3.84-44.85-35.35L235.9,336.93l17.19-25.34c7.31-12.4,3.43-27.17-5.65-41.14q-16.37-16.32-32.22-33c-1.66-1.23-3.31-2.38-4.95-3.5l-66.44,18.87L165.59,227c10.57-17.62,0-41.59-9.84-55.7q-8.4-9.81-16.62-19.75l-43.67,7.29c18.43-7.3,31.37-22.38,16.85-40l2.06,2.33Q89.79,90.29,66.44,58.49q43,32.32,83.86,67.06L186.92,116l-22.11,22q23.38,20.3,46.09,41.39l71.86-30.46L264,178l.3-.24c-21.55,27.54,18.77,86,46,78.42l31.91-17.7L317.4,275l36.88,52.71c.26.3.53.59.79.9,13.64,12.5,31.23,1.71,43.05-14.53l-19.59,42Q410.66,394.28,441.44,434.53Z", - scarTissue: "M430.33,375.37c-18.07-38.87-22.46-79.24-7.49-113.92-56.77,70.27-91.6,5.3-4.93-85.08C295.61,251.8,240.13,214.23,401,70.19,277.18,136,181.5,153.46,243.53,88.47c-44.75,12.79-70,6.27-91.47-2.93a773.7,773.7,0,0,0-135.18-67,949.58,949.58,0,0,0,56.49,93.31c8.39,22,3.6,46.57-37.84,76.32C185.72,148,142,244.71,24.26,314.42c200-74.2,249.65-57,121.08,93.78C246.42,334.73,326,354.59,293.17,445.84c38.06-29.48,69.66-35.77,93.87-25.1q52.21,36.94,108.66,70.93C475.19,451.39,453.54,412.52,430.33,375.37ZM374,383.64c-20-11.91-31.49.3-44.26,16.86,8.8-18.17,13.38-36.95,3.24-50.86l-4.46-3.84-44.85-35.35L235.9,336.93l17.19-25.34c7.31-12.4,3.43-27.17-5.65-41.14q-16.37-16.32-32.22-33c-1.66-1.23-3.31-2.38-4.95-3.5l-66.44,18.87L165.59,227c10.57-17.62,0-41.59-9.84-55.7q-8.4-9.81-16.62-19.75l-43.67,7.29c18.43-7.3,31.37-22.38,16.85-40L110,116.26c.83.86,1.57,1.71,2.27,2.56l2.06,2.33Q89.79,90.29,66.44,58.49q43,32.32,83.86,67.06L186.92,116l-22.11,22q23.38,20.3,46.09,41.39l71.86-30.46L264,178l.3-.24c-21.55,27.54,18.77,86,46,78.42l31.91-17.7L317.4,275l36.88,52.71c.26.3.53.59.79.9,13.64,12.5,31.23,1.71,43.05-14.53l-19.59,42q32.13,38.23,62.91,78.49Q406.7,409.87,374,383.64Z", - welts: "M414.13,84.19a39.5,39.5,0,1,0,39.57,39.5,39.2,39.2,0,0,0-39.57-39.5ZM308.33,29.83A28.66,28.66,0,1,0,337,58.51a28.51,28.51,0,0,0-28.67-28.68ZM90.17,322.56a49.51,49.51,0,1,0,49.53,49.52A49.36,49.36,0,0,0,90.17,322.56Zm258-171.24A22.79,22.79,0,1,0,371,174.11a22.61,22.61,0,0,0-22.83-22.79ZM261.49,89.88a16.72,16.72,0,1,0,16.73,16.73,16.63,16.63,0,0,0-16.73-16.73ZM91.15,187.65a21.18,21.18,0,1,0,21.18,21.18,21,21,0,0,0-21.18-21.18Zm77.51,94.54a32.09,32.09,0,1,0,32.07,32.1,32,32,0,0,0-32.07-32.1ZM391.6,243.05a16.51,16.51,0,1,0,16.49,16.52,16.41,16.41,0,0,0-16.49-16.52ZM238.11,374.85a48.43,48.43,0,1,0,48.44,48.45A48.29,48.29,0,0,0,238.11,374.85Zm137,59.88A22.86,22.86,0,1,0,398,457.59a22.69,22.69,0,0,0-22.86-22.86Z" - }, - classes: { - scar: "fill-bright", - scarTissue: "fill-dark", - welts: "fill-bright" - } - }, - ResolveHarm1: { - viewBox: "0 0 512 512", - paths: { - spikes: "M256.09,19.1A237.5,237.5,0,0,0,197,27.22C70.63,61.08-4.36,191,29.5,317.31,62.59,440.8,187.39,515.21,311,486.92A132.35,132.35,0,0,1,279.74,475,207,207,0,0,1,122,417.49l-13.48-14.55L94.89,385.42a205.62,205.62,0,0,1-24-47.36l-7.2-17.33L60.71,296.5a205.83,205.83,0,0,1-.18-54.37l3-24.36,7.67-19.51a208.28,208.28,0,0,1,29.16-53.84l105,60.61-68.63-98a205.85,205.85,0,0,1,63.68-34.49l27.24-8.18,23.18-1.89q6.46-.48,12.89-.54a205.54,205.54,0,0,1,61.66,8.84l23.65,11,22,9.09A207.05,207.05,0,0,1,428.2,140.9l13.1,14.44L448.93,173a208,208,0,0,1,16.41,42.22,205.89,205.89,0,0,1,2.52,96.73,133,133,0,0,1,7.74,38.31,235.8,235.8,0,0,0,11.48-155.53C458.51,88.09,361.59,18.05,256.09,19.1Z", - eyeball: "M344.58,242.53a45.61,45.61,0,0,1,8.95,6.95c12.22,12.21,16.07,29.9,13.26,47.35S354.74,332,340,346.82s-32.54,24-50,26.83-35.13-1-47.35-13.26a48,48,0,0,1-13-24.74,114.74,114.74,0,1,0,114.92-93.12Z", - iris: "M316.24,254a50.56,50.56,0,0,0-7.08.66c-13,2.09-27.56,9.39-39.76,21.59S249.91,303,247.81,316s.75,23.89,8,31.16S274,357.3,287,355.2s27.56-9.39,39.76-21.59,19.5-26.76,21.59-39.76-.75-23.89-8-31.16c-5.45-5.45-12.94-8.42-21.83-8.68-.74,0-1.49,0-2.25,0Zm-13.81,20.35a16,16,0,0,1,11.86,4.38c7.49,7.5,5.16,22-5.22,32.37s-24.88,12.72-32.38,5.23-5.16-22,5.22-32.38c6.17-6.16,13.78-9.49,20.52-9.6Z" - }, - classes: { - spikes: "fill-dark", - eyeball: "fill-dark", - iris: "fill-med" - } - }, - ResolveHarm2: { - viewBox: "0 0 512 512", - paths: { - spikes: "M261.25,19.1a237.64,237.64,0,0,0-59.11,8.12C75.79,61.08.8,191,34.66,317.31,67.75,440.8,192.55,515.21,316.15,486.92A132.59,132.59,0,0,1,284.89,475a207,207,0,0,1-157.72-57.52l-11.44-12.15-15.68-19.92a205.62,205.62,0,0,1-24-47.36l-7.32-17.33L65.87,296.5a205.41,205.41,0,0,1-.18-54.37l91.84,19.32L76.38,198.26a208,208,0,0,1,29.16-53.84L259.93,252.78,141.87,107a205.79,205.79,0,0,1,63.67-34.49L263.45,141,256,62.45q6.46-.48,12.89-.54a205.54,205.54,0,0,1,61.66,8.84l22.84,8.32,22.83,11.78a207,207,0,0,1,57.17,50.05l13.41,16.85L454.08,173a207.52,207.52,0,0,1,18.93,139,132.67,132.67,0,0,1,7.75,38.31,235.92,235.92,0,0,0,11.48-155.53C463.67,88.09,366.74,18.05,261.25,19.1Z", - eyeball: "M349.74,242.53a45.61,45.61,0,0,1,8.95,6.95c12.21,12.21,16.07,29.9,13.26,47.35s-12.05,35.21-26.83,50-32.54,24-50,26.83-35.14-1-47.35-13.26a48,48,0,0,1-13-24.74,116.19,116.19,0,0,0-2,21.58,114.73,114.73,0,1,0,117-114.7Z", - iris: "M321.4,254a50.42,50.42,0,0,0-7.08.66c-13,2.09-27.56,9.39-39.76,21.59S255.06,303,253,316s.75,23.89,8,31.16,18.16,10.12,31.16,8,27.56-9.39,39.76-21.59,19.49-26.76,21.59-39.76-.75-23.89-8-31.16c-5.46-5.45-13-8.42-21.83-8.68-.74,0-1.49,0-2.25,0Zm-13.81,20.35a16,16,0,0,1,11.85,4.38c7.5,7.5,5.16,22-5.22,32.37s-24.87,12.72-32.37,5.23-5.16-22,5.22-32.38c6.16-6.16,13.78-9.49,20.52-9.6Z" - }, - classes: { - spikes: "fill-med", - eyeball: "fill-dark", - iris: "fill-bright" - } - }, - ResolveHarm3: { - viewBox: "0 0 512 512", - paths: { - spikes: "M261.31,19.1a237.51,237.51,0,0,0-59.11,8.12C75.84,61.08.86,191,34.71,317.31,67.8,440.8,192.61,515.21,316.2,486.92A132.35,132.35,0,0,1,285,475a207,207,0,0,1-157.72-57.52l-13.81-16.37-13.31-15.7a206,206,0,0,1-24.06-47.36l83.63-17.33L65.93,296.5a205.41,205.41,0,0,1-.18-54.37l164.66,47.21-154-91.08a208,208,0,0,1,29.15-53.84L260,252.78,141.92,107A205.85,205.85,0,0,1,205.6,72.52l95.49,158.21L256,62.45q6.47-.48,12.9-.54a205.43,205.43,0,0,1,61.65,8.84L353.08,169l23.17-78.14a206.76,206.76,0,0,1,57.16,50.05l13.08,22.41,7.65,9.67a207.52,207.52,0,0,1,18.93,139,132.33,132.33,0,0,1,7.74,38.31,235.8,235.8,0,0,0,11.48-155.53C463.73,88.09,366.8,18.05,261.31,19.1Z", - eyeball: "M349.79,242.53a45.38,45.38,0,0,1,9,6.95c12.21,12.21,16.07,29.9,13.25,47.35s-12,35.21-26.82,50-32.54,24-50,26.83-35.13-1-47.34-13.26a48,48,0,0,1-13-24.74,116.19,116.19,0,0,0-2,21.58,114.73,114.73,0,1,0,117-114.7Z", - iris: "M321.45,254a50.56,50.56,0,0,0-7.08.66c-13,2.09-27.55,9.39-39.75,21.59S255.12,303,253,316s.75,23.89,8,31.16,18.16,10.12,31.16,8,27.56-9.39,39.76-21.59,19.49-26.76,21.59-39.76-.75-23.89-8-31.16c-5.45-5.45-12.94-8.42-21.83-8.68-.74,0-1.49,0-2.25,0Zm-13.81,20.35a16,16,0,0,1,11.86,4.38c7.5,7.5,5.16,22-5.22,32.37s-24.88,12.72-32.37,5.23-5.16-22,5.22-32.38c6.16-6.16,13.78-9.49,20.51-9.6Z" - }, - classes: { - spikes: "fill-bright", - eyeball: "fill-med", - iris: "fill-bright" - } - }, - ResolveHarm4: { - viewBox: "0 0 512 512", - paths: { - spikes: "M261.14,19.1A237.51,237.51,0,0,0,202,27.22C75.67,61.08.69,191,34.54,317.31,67.63,440.8,192.44,515.21,316,486.92A132.35,132.35,0,0,1,284.78,475a207,207,0,0,1-157.72-57.52l89.22-30-116.34-2a206,206,0,0,1-24.06-47.36L214,333.21,65.76,296.5a205.41,205.41,0,0,1-.18-54.37l164.66,47.21-154-91.08a208,208,0,0,1,29.15-53.84l154.4,108.36L141.75,107a205.85,205.85,0,0,1,63.68-34.49l95.49,158.21L255.85,62.45q6.47-.48,12.9-.54a205.43,205.43,0,0,1,61.65,8.84L359.77,223.5,376.08,90.85a206.76,206.76,0,0,1,57.16,50.05L415.61,243.13,454,173a207.52,207.52,0,0,1,18.93,139,132.33,132.33,0,0,1,7.74,38.31,235.8,235.8,0,0,0,11.48-155.53C463.55,88.09,366.63,18.05,261.14,19.1Z", - eyeball: "M349.62,242.53a45.38,45.38,0,0,1,9,6.95c12.21,12.21,16.07,29.9,13.25,47.35s-12,35.21-26.82,50-32.55,24-50,26.83-35.13-1-47.34-13.26a48,48,0,0,1-13-24.74,116.19,116.19,0,0,0-2,21.58,114.73,114.73,0,1,0,117-114.7Z", - iris: "M321.28,254a50.56,50.56,0,0,0-7.08.66c-13,2.09-27.55,9.39-39.75,21.59S255,303,252.86,316s.75,23.89,8,31.16S279,357.3,292,355.2s27.55-9.39,39.76-21.59,19.49-26.76,21.59-39.76-.75-23.89-8-31.16c-5.45-5.45-12.94-8.42-21.83-8.68-.74,0-1.49,0-2.25,0Zm-13.81,20.35a16,16,0,0,1,11.86,4.38c7.5,7.5,5.16,22-5.22,32.37s-24.88,12.72-32.37,5.23-5.16-22,5.22-32.38c6.16-6.16,13.78-9.49,20.51-9.6Z" - }, - classes: { - spikes: "fill-bright", - eyeball: "fill-bright", - iris: "fill-bright" - } - } -}; -var Vh = typeof globalThis < "u" ? globalThis : typeof window < "u" ? window : typeof global < "u" ? global : typeof self < "u" ? self : {}; -function jh(a) { - return a && a.__esModule && Object.prototype.hasOwnProperty.call(a, "default") ? a.default : a; -} -var du = { exports: {} }; -(function(a, e) { - (function(t, s) { - a.exports = s(); - })(Vh, function() { - function t(d, p) { - var w = Object.keys(d); - if (Object.getOwnPropertySymbols) { - var b = Object.getOwnPropertySymbols(d); - p && (b = b.filter(function(D) { - return Object.getOwnPropertyDescriptor(d, D).enumerable; - })), w.push.apply(w, b); - } - return w; - } - function s(d) { - for (var p = 1; p < arguments.length; p++) { - var w = arguments[p] != null ? arguments[p] : {}; - p % 2 ? t(Object(w), !0).forEach(function(b) { - i(d, b, w[b]); - }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(d, Object.getOwnPropertyDescriptors(w)) : t(Object(w)).forEach(function(b) { - Object.defineProperty(d, b, Object.getOwnPropertyDescriptor(w, b)); - }); - } - return d; - } - function i(d, p, w) { - return (p = function(b) { - var D = function(_, P) { - if (typeof _ != "object" || _ === null) - return _; - var N = _[Symbol.toPrimitive]; - if (N !== void 0) { - var V = N.call(_, P || "default"); - if (typeof V != "object") - return V; - throw new TypeError("@@toPrimitive must return a primitive value."); - } - return (P === "string" ? String : Number)(_); - }(b, "string"); - return typeof D == "symbol" ? D : String(D); - }(p)) in d ? Object.defineProperty(d, p, { value: w, enumerable: !0, configurable: !0, writable: !0 }) : d[p] = w, d; - } - const r = (d, p, w, b) => (d = "" + d, p = "" + p, b && (d = d.trim(), p = p.trim()), w ? d == p : d.toLowerCase() == p.toLowerCase()), o = (d, p) => d && Array.isArray(d) && d.map((w) => n(w, p)); - function n(d, p) { - var w, b = {}; - for (w in d) - p.indexOf(w) < 0 && (b[w] = d[w]); - return b; - } - function l(d) { - var p = document.createElement("div"); - return d.replace(/\&#?[0-9a-z]+;/gi, function(w) { - return p.innerHTML = w, p.innerText; - }); - } - function c(d) { - return new DOMParser().parseFromString(d.trim(), "text/html").body.firstElementChild; - } - function u(d, p) { - for (p = p || "previous"; d = d[p + "Sibling"]; ) - if (d.nodeType == 3) - return d; - } - function g(d) { - return typeof d == "string" ? d.replace(/&/g, "&").replace(//g, ">").replace(/"/g, """).replace(/`|'/g, "'") : d; - } - function f(d) { - var p = Object.prototype.toString.call(d).split(" ")[1].slice(0, -1); - return d === Object(d) && p != "Array" && p != "Function" && p != "RegExp" && p != "HTMLUnknownElement"; - } - function h(d, p, w) { - function b(D, _) { - for (var P in _) - if (_.hasOwnProperty(P)) { - if (f(_[P])) { - f(D[P]) ? b(D[P], _[P]) : D[P] = Object.assign({}, _[P]); - continue; - } - if (Array.isArray(_[P])) { - D[P] = Object.assign([], _[P]); - continue; - } - D[P] = _[P]; - } - } - return d instanceof Object || (d = {}), b(d, p), w && b(d, w), d; - } - function m() { - const d = [], p = {}; - for (let w of arguments) - for (let b of w) - f(b) ? p[b.value] || (d.push(b), p[b.value] = 1) : d.includes(b) || d.push(b); - return d; - } - function y(d) { - return String.prototype.normalize ? typeof d == "string" ? d.normalize("NFD").replace(/[\u0300-\u036f]/g, "") : void 0 : d; - } - var k = () => /(?=.*chrome)(?=.*android)/i.test(navigator.userAgent); - function T() { - return ("10000000-1000-4000-8000" + -1e11).replace(/[018]/g, (d) => (d ^ crypto.getRandomValues(new Uint8Array(1))[0] & 15 >> d / 4).toString(16)); - } - function S(d) { - return d && d.classList && d.classList.contains(this.settings.classNames.tag); - } - function C(d, p) { - var w = window.getSelection(); - return p = p || w.getRangeAt(0), typeof d == "string" && (d = document.createTextNode(d)), p && (p.deleteContents(), p.insertNode(d)), d; - } - function I(d, p, w) { - return d ? (p && (d.__tagifyTagData = w ? p : h({}, d.__tagifyTagData || {}, p)), d.__tagifyTagData) : (console.warn("tag element doesn't exist", d, p), p); - } - function E(d) { - if (d && d.parentNode) { - var p = d, w = window.getSelection(), b = w.getRangeAt(0); - w.rangeCount && (b.setStartAfter(p), b.collapse(!0), w.removeAllRanges(), w.addRange(b)); - } - } - function F(d, p) { - d.forEach((w) => { - if (I(w.previousSibling) || !w.previousSibling) { - var b = document.createTextNode("​"); - w.before(b), p && E(b); - } - }); - } - var O = { delimiters: ",", pattern: null, tagTextProp: "value", maxTags: 1 / 0, callbacks: {}, addTagOnBlur: !0, addTagOn: ["blur", "tab", "enter"], onChangeAfterBlur: !0, duplicates: !1, whitelist: [], blacklist: [], enforceWhitelist: !1, userInput: !0, keepInvalidTags: !1, createInvalidTags: !0, mixTagsAllowedAfter: /,|\.|\:|\s/, mixTagsInterpolator: ["[[", "]]"], backspace: !0, skipInvalid: !1, pasteAsTags: !0, editTags: { clicks: 2, keepInvalid: !0 }, transformTag: () => { - }, trim: !0, a11y: { focusableTags: !1 }, mixMode: { insertAfterTag: " " }, autoComplete: { enabled: !0, rightKey: !1, tabKey: !1 }, classNames: { namespace: "tagify", mixMode: "tagify--mix", selectMode: "tagify--select", input: "tagify__input", focus: "tagify--focus", tagNoAnimation: "tagify--noAnim", tagInvalid: "tagify--invalid", tagNotAllowed: "tagify--notAllowed", scopeLoading: "tagify--loading", hasMaxTags: "tagify--hasMaxTags", hasNoTags: "tagify--noTags", empty: "tagify--empty", inputInvalid: "tagify__input--invalid", dropdown: "tagify__dropdown", dropdownWrapper: "tagify__dropdown__wrapper", dropdownHeader: "tagify__dropdown__header", dropdownFooter: "tagify__dropdown__footer", dropdownItem: "tagify__dropdown__item", dropdownItemActive: "tagify__dropdown__item--active", dropdownItemHidden: "tagify__dropdown__item--hidden", dropdownInital: "tagify__dropdown--initial", tag: "tagify__tag", tagText: "tagify__tag-text", tagX: "tagify__tag__removeBtn", tagLoading: "tagify__tag--loading", tagEditing: "tagify__tag--editable", tagFlash: "tagify__tag--flash", tagHide: "tagify__tag--hide" }, dropdown: { classname: "", enabled: 2, maxItems: 10, searchKeys: ["value", "searchBy"], fuzzySearch: !0, caseSensitive: !1, accentedSearch: !0, includeSelectedTags: !1, escapeHTML: !0, highlightFirst: !0, closeOnSelect: !0, clearOnSelect: !0, position: "all", appendTarget: null }, hooks: { beforeRemoveTag: () => Promise.resolve(), beforePaste: () => Promise.resolve(), suggestionClick: () => Promise.resolve(), beforeKeyDown: () => Promise.resolve() } }, R = { events: { binding() { - let d = !(arguments.length > 0 && arguments[0] !== void 0) || arguments[0]; - var p = this.dropdown.events.callbacks, w = this.listeners.dropdown = this.listeners.dropdown || { position: this.dropdown.position.bind(this, null), onKeyDown: p.onKeyDown.bind(this), onMouseOver: p.onMouseOver.bind(this), onMouseLeave: p.onMouseLeave.bind(this), onClick: p.onClick.bind(this), onScroll: p.onScroll.bind(this) }, b = d ? "addEventListener" : "removeEventListener"; - this.settings.dropdown.position != "manual" && (document[b]("scroll", w.position, !0), window[b]("resize", w.position), window[b]("keydown", w.onKeyDown)), this.DOM.dropdown[b]("mouseover", w.onMouseOver), this.DOM.dropdown[b]("mouseleave", w.onMouseLeave), this.DOM.dropdown[b]("mousedown", w.onClick), this.DOM.dropdown.content[b]("scroll", w.onScroll); - }, callbacks: { onKeyDown(d) { - if (this.state.hasFocus && !this.state.composing) { - var p = this.settings, w = this.DOM.dropdown.querySelector(p.classNames.dropdownItemActiveSelector), b = this.dropdown.getSuggestionDataByNode(w), D = p.mode == "mix"; - p.hooks.beforeKeyDown(d, { tagify: this }).then((_) => { - switch (d.key) { - case "ArrowDown": - case "ArrowUp": - case "Down": - case "Up": - d.preventDefault(); - var P = this.dropdown.getAllSuggestionsRefs(), N = d.key == "ArrowUp" || d.key == "Up"; - w && (w = this.dropdown.getNextOrPrevOption(w, !N)), w && w.matches(p.classNames.dropdownItemSelector) || (w = P[N ? P.length - 1 : 0]), this.dropdown.highlightOption(w, !0); - break; - case "Escape": - case "Esc": - this.dropdown.hide(); - break; - case "ArrowRight": - if (this.state.actions.ArrowLeft) - return; - case "Tab": { - let K = !p.autoComplete.rightKey || !p.autoComplete.tabKey; - if (!D && w && K && !this.state.editing) { - d.preventDefault(); - var V = this.dropdown.getMappedValue(b); - return this.input.autocomplete.set.call(this, V), !1; - } - return !0; - } - case "Enter": - d.preventDefault(), p.hooks.suggestionClick(d, { tagify: this, tagData: b, suggestionElm: w }).then(() => { - if (w) - return this.dropdown.selectOption(w), w = this.dropdown.getNextOrPrevOption(w, !N), void this.dropdown.highlightOption(w); - this.dropdown.hide(), D || this.addTags(this.state.inputText.trim(), !0); - }).catch((K) => console.warn(K)); - break; - case "Backspace": { - if (D || this.state.editing.scope) - return; - const K = this.input.raw.call(this); - K != "" && K.charCodeAt(0) != 8203 || (p.backspace === !0 ? this.removeTags() : p.backspace == "edit" && setTimeout(this.editTag.bind(this), 0)); - } - } - }); - } - }, onMouseOver(d) { - var p = d.target.closest(this.settings.classNames.dropdownItemSelector); - this.dropdown.highlightOption(p); - }, onMouseLeave(d) { - this.dropdown.highlightOption(); - }, onClick(d) { - if (d.button == 0 && d.target != this.DOM.dropdown && d.target != this.DOM.dropdown.content) { - var p = d.target.closest(this.settings.classNames.dropdownItemSelector), w = this.dropdown.getSuggestionDataByNode(p); - this.state.actions.selectOption = !0, setTimeout(() => this.state.actions.selectOption = !1, 50), this.settings.hooks.suggestionClick(d, { tagify: this, tagData: w, suggestionElm: p }).then(() => { - p ? this.dropdown.selectOption(p, d) : this.dropdown.hide(); - }).catch((b) => console.warn(b)); - } - }, onScroll(d) { - var p = d.target, w = p.scrollTop / (p.scrollHeight - p.parentNode.clientHeight) * 100; - this.trigger("dropdown:scroll", { percentage: Math.round(w) }); - } } }, refilter(d) { - d = d || this.state.dropdown.query || "", this.suggestedListItems = this.dropdown.filterListItems(d), this.dropdown.fill(), this.suggestedListItems.length || this.dropdown.hide(), this.trigger("dropdown:updated", this.DOM.dropdown); - }, getSuggestionDataByNode(d) { - var p = d && d.getAttribute("value"); - return this.suggestedListItems.find((w) => w.value == p) || null; - }, getNextOrPrevOption(d) { - let p = !(arguments.length > 1 && arguments[1] !== void 0) || arguments[1]; - var w = this.dropdown.getAllSuggestionsRefs(), b = w.findIndex((D) => D === d); - return p ? w[b + 1] : w[b - 1]; - }, highlightOption(d, p) { - var w, b = this.settings.classNames.dropdownItemActive; - if (this.state.ddItemElm && (this.state.ddItemElm.classList.remove(b), this.state.ddItemElm.removeAttribute("aria-selected")), !d) - return this.state.ddItemData = null, this.state.ddItemElm = null, void this.input.autocomplete.suggest.call(this); - w = this.dropdown.getSuggestionDataByNode(d), this.state.ddItemData = w, this.state.ddItemElm = d, d.classList.add(b), d.setAttribute("aria-selected", !0), p && (d.parentNode.scrollTop = d.clientHeight + d.offsetTop - d.parentNode.clientHeight), this.settings.autoComplete && (this.input.autocomplete.suggest.call(this, w), this.dropdown.position()); - }, selectOption(d, p) { - var w = this.settings, b = w.dropdown, D = b.clearOnSelect, _ = b.closeOnSelect; - if (!d) - return this.addTags(this.state.inputText, !0), void (_ && this.dropdown.hide()); - p = p || {}; - var P = d.getAttribute("value"), N = P == "noMatch", V = w.mode == "mix", K = this.suggestedListItems.find((ce) => (ce.value ?? ce) == P); - if (this.trigger("dropdown:select", { data: K, elm: d, event: p }), P && (K || N)) { - if (this.state.editing) { - let ce = this.normalizeTags([K])[0]; - K = w.transformTag.call(this, ce) || ce, this.onEditTagDone(null, h({ __isValid: !0 }, K)); - } else - this[V ? "addMixTags" : "addTags"]([K || this.input.raw.call(this)], D); - (V || this.DOM.input.parentNode) && (setTimeout(() => { - this.DOM.input.focus(), this.toggleFocusClass(!0); - }), _ && setTimeout(this.dropdown.hide.bind(this)), d.addEventListener("transitionend", () => { - this.dropdown.fillHeaderFooter(), setTimeout(() => d.remove(), 100); - }, { once: !0 }), d.classList.add(this.settings.classNames.dropdownItemHidden)); - } else - _ && setTimeout(this.dropdown.hide.bind(this)); - }, selectAll(d) { - this.suggestedListItems.length = 0, this.dropdown.hide(), this.dropdown.filterListItems(""); - var p = this.dropdown.filterListItems(""); - return d || (p = this.state.dropdown.suggestions), this.addTags(p, !0), this; - }, filterListItems(d, p) { - var w, b, D, _, P, N = this.settings, V = N.dropdown, K = (p = p || {}, []), ce = [], ee = N.whitelist, ke = V.maxItems >= 0 ? V.maxItems : 1 / 0, ie = V.searchKeys, pe = 0; - if (!(d = N.mode == "select" && this.value.length && this.value[0][N.tagTextProp] == d ? "" : d) || !ie.length) - return K = V.includeSelectedTags ? ee : ee.filter((me) => !this.isTagDuplicate(f(me) ? me.value : me)), this.state.dropdown.suggestions = K, K.slice(0, ke); - function be(me, ge) { - return ge.toLowerCase().split(" ").every((ve) => me.includes(ve.toLowerCase())); - } - for (P = V.caseSensitive ? "" + d : ("" + d).toLowerCase(); pe < ee.length; pe++) { - let me, ge; - w = ee[pe] instanceof Object ? ee[pe] : { value: ee[pe] }; - let ve = Object.keys(w).some((Ze) => ie.includes(Ze)) ? ie : ["value"]; - V.fuzzySearch && !p.exact ? (D = ve.reduce((Ze, B) => Ze + " " + (w[B] || ""), "").toLowerCase().trim(), V.accentedSearch && (D = y(D), P = y(P)), me = D.indexOf(P) == 0, ge = D === P, b = be(D, P)) : (me = !0, b = ve.some((Ze) => { - var B = "" + (w[Ze] || ""); - return V.accentedSearch && (B = y(B), P = y(P)), V.caseSensitive || (B = B.toLowerCase()), ge = B === P, p.exact ? B === P : B.indexOf(P) == 0; - })), _ = !V.includeSelectedTags && this.isTagDuplicate(f(w) ? w.value : w), b && !_ && (ge && me ? ce.push(w) : V.sortby == "startsWith" && me ? K.unshift(w) : K.push(w)); - } - return this.state.dropdown.suggestions = ce.concat(K), typeof V.sortby == "function" ? V.sortby(ce.concat(K), P) : ce.concat(K).slice(0, ke); - }, getMappedValue(d) { - var p = this.settings.dropdown.mapValueTo; - return p ? typeof p == "function" ? p(d) : d[p] || d.value : d.value; - }, createListHTML(d) { - return h([], d).map((p, w) => { - typeof p != "string" && typeof p != "number" || (p = { value: p }); - var b = this.dropdown.getMappedValue(p); - return b = typeof b == "string" && this.settings.dropdown.escapeHTML ? g(b) : b, this.settings.templates.dropdownItem.apply(this, [s(s({}, p), {}, { mappedValue: b }), this]); - }).join(""); - } }; - function L() { - this.dropdown = {}; - for (let d in this._dropdown) - this.dropdown[d] = typeof this._dropdown[d] == "function" ? this._dropdown[d].bind(this) : this._dropdown[d]; - this.dropdown.refs(); - } - var U = s(s({}, R), {}, { refs() { - this.DOM.dropdown = this.parseTemplate("dropdown", [this.settings]), this.DOM.dropdown.content = this.DOM.dropdown.querySelector("[data-selector='tagify-suggestions-wrapper']"); - }, getHeaderRef() { - return this.DOM.dropdown.querySelector("[data-selector='tagify-suggestions-header']"); - }, getFooterRef() { - return this.DOM.dropdown.querySelector("[data-selector='tagify-suggestions-footer']"); - }, getAllSuggestionsRefs() { - return [...this.DOM.dropdown.content.querySelectorAll(this.settings.classNames.dropdownItemSelector)]; - }, show(d) { - var p, w, b, D = this.settings, _ = D.mode == "mix" && !D.enforceWhitelist, P = !D.whitelist || !D.whitelist.length, N = D.dropdown.position == "manual"; - if (d = d === void 0 ? this.state.inputText : d, !(P && !_ && !D.templates.dropdownItemNoMatch || D.dropdown.enable === !1 || this.state.isLoading || this.settings.readonly)) { - if (clearTimeout(this.dropdownHide__bindEventsTimeout), this.suggestedListItems = this.dropdown.filterListItems(d), d && !this.suggestedListItems.length && (this.trigger("dropdown:noMatch", d), D.templates.dropdownItemNoMatch && (b = D.templates.dropdownItemNoMatch.call(this, { value: d }))), !b) { - if (this.suggestedListItems.length) - d && _ && !this.state.editing.scope && !r(this.suggestedListItems[0].value, d) && this.suggestedListItems.unshift({ value: d }); - else { - if (!d || !_ || this.state.editing.scope) - return this.input.autocomplete.suggest.call(this), void this.dropdown.hide(); - this.suggestedListItems = [{ value: d }]; - } - w = "" + (f(p = this.suggestedListItems[0]) ? p.value : p), D.autoComplete && w && w.indexOf(d) == 0 && this.input.autocomplete.suggest.call(this, p); - } - this.dropdown.fill(b), D.dropdown.highlightFirst && this.dropdown.highlightOption(this.DOM.dropdown.content.querySelector(D.classNames.dropdownItemSelector)), this.state.dropdown.visible || setTimeout(this.dropdown.events.binding.bind(this)), this.state.dropdown.visible = d || !0, this.state.dropdown.query = d, this.setStateSelection(), N || setTimeout(() => { - this.dropdown.position(), this.dropdown.render(); - }), setTimeout(() => { - this.trigger("dropdown:show", this.DOM.dropdown); - }); - } - }, hide(d) { - var p = this.DOM, w = p.scope, b = p.dropdown, D = this.settings.dropdown.position == "manual" && !d; - if (b && document.body.contains(b) && !D) - return window.removeEventListener("resize", this.dropdown.position), this.dropdown.events.binding.call(this, !1), w.setAttribute("aria-expanded", !1), b.parentNode.removeChild(b), setTimeout(() => { - this.state.dropdown.visible = !1; - }, 100), this.state.dropdown.query = this.state.ddItemData = this.state.ddItemElm = this.state.selection = null, this.state.tag && this.state.tag.value.length && (this.state.flaggedTags[this.state.tag.baseOffset] = this.state.tag), this.trigger("dropdown:hide", b), this; - }, toggle(d) { - this.dropdown[this.state.dropdown.visible && !d ? "hide" : "show"](); - }, getAppendTarget() { - var d = this.settings.dropdown; - return typeof d.appendTarget == "function" ? d.appendTarget() : d.appendTarget; - }, render() { - var d, p, w, b = (d = this.DOM.dropdown, (w = d.cloneNode(!0)).style.cssText = "position:fixed; top:-9999px; opacity:0", document.body.appendChild(w), p = w.clientHeight, w.parentNode.removeChild(w), p), D = this.settings, _ = typeof D.dropdown.enabled == "number" && D.dropdown.enabled >= 0, P = this.dropdown.getAppendTarget(); - return _ ? (this.DOM.scope.setAttribute("aria-expanded", !0), document.body.contains(this.DOM.dropdown) || (this.DOM.dropdown.classList.add(D.classNames.dropdownInital), this.dropdown.position(b), P.appendChild(this.DOM.dropdown), setTimeout(() => this.DOM.dropdown.classList.remove(D.classNames.dropdownInital))), this) : this; - }, fill(d) { - d = typeof d == "string" ? d : this.dropdown.createListHTML(d || this.suggestedListItems); - var p, w = this.settings.templates.dropdownContent.call(this, d); - this.DOM.dropdown.content.innerHTML = (p = w) ? p.replace(/\>[\r\n ]+\<").split(/>\s+<").trim() : ""; - }, fillHeaderFooter() { - var d = this.dropdown.filterListItems(this.state.dropdown.query), p = this.parseTemplate("dropdownHeader", [d]), w = this.parseTemplate("dropdownFooter", [d]), b = this.dropdown.getHeaderRef(), D = this.dropdown.getFooterRef(); - p && (b == null || b.parentNode.replaceChild(p, b)), w && (D == null || D.parentNode.replaceChild(w, D)); - }, position(d) { - var p = this.settings.dropdown, w = this.dropdown.getAppendTarget(); - if (p.position != "manual" && w) { - var b, D, _, P, N, V, K, ce, ee, ke = this.DOM.dropdown, ie = p.RTL, pe = w === document.body, be = w === this.DOM.scope, me = pe ? window.pageYOffset : w.scrollTop, ge = document.fullscreenElement || document.webkitFullscreenElement || document.documentElement, ve = ge.clientHeight, Ze = Math.max(ge.clientWidth || 0, window.innerWidth || 0) > 480 ? p.position : "all", B = this.DOM[Ze == "input" ? "input" : "scope"]; - if (d = d || ke.clientHeight, this.state.dropdown.visible) { - if (Ze == "text" ? (_ = (b = function() { - const De = document.getSelection(); - if (De.rangeCount) { - const lt = De.getRangeAt(0), Ke = lt.startContainer, ye = lt.startOffset; - let Ve, Ps; - if (ye > 0) - return Ps = document.createRange(), Ps.setStart(Ke, ye - 1), Ps.setEnd(Ke, ye), Ve = Ps.getBoundingClientRect(), { left: Ve.right, top: Ve.top, bottom: Ve.bottom }; - if (Ke.getBoundingClientRect) - return Ke.getBoundingClientRect(); - } - return { left: -9999, top: -9999 }; - }()).bottom, D = b.top, P = b.left, N = "auto") : (V = function(De) { - var lt = 0, Ke = 0; - for (De = De.parentNode; De && De != ge; ) - lt += De.offsetTop || 0, Ke += De.offsetLeft || 0, De = De.parentNode; - return { top: lt, left: Ke }; - }(w), b = B.getBoundingClientRect(), D = be ? -1 : b.top - V.top, _ = (be ? b.height : b.bottom - V.top) - 1, P = be ? -1 : b.left - V.left, N = b.width + "px"), !pe) { - let De = function() { - for (var lt = 0, Ke = p.appendTarget.parentNode; Ke; ) - lt += Ke.scrollTop || 0, Ke = Ke.parentNode; - return lt; - }(); - D += De, _ += De; - } - D = Math.floor(D), _ = Math.ceil(_), ce = ((K = p.placeAbove ?? ve - b.bottom < d) ? D : _) + me, ee = `left: ${P + (ie && b.width || 0) + window.pageXOffset}px;`, ke.style.cssText = `${ee}; top: ${ce}px; min-width: ${N}; max-width: ${N}`, ke.setAttribute("placement", K ? "top" : "bottom"), ke.setAttribute("position", Ze); - } - } - } }); - const j = "@yaireo/tagify/"; - var re, X = { empty: "empty", exceed: "number of tags exceeded", pattern: "pattern mismatch", duplicate: "already exists", notAllowed: "not allowed" }, de = { wrapper: (d, p) => ` - - ​ - `, tag(d, p) { - let w = p.settings; - return ` - -
- ${d[w.tagTextProp] || d.value} -
-
`; - }, dropdown(d) { - var p = d.dropdown; - return `
-
-
`; - }, dropdownContent(d) { - var p = this.settings.templates, w = this.state.dropdown.suggestions; - return ` - ${p.dropdownHeader.call(this, w)} - ${d} - ${p.dropdownFooter.call(this, w)} - `; - }, dropdownItem(d) { - return `
${d.mappedValue || d.value}
`; - }, dropdownHeader(d) { - return `
`; - }, dropdownFooter(d) { - var p = d.length - this.settings.dropdown.maxItems; - return p > 0 ? `
- ${p} more items. Refine your search. -
` : ""; - }, dropdownItemNoMatch: null }, Q = { customBinding() { - this.customEventsList.forEach((d) => { - this.on(d, this.settings.callbacks[d]); - }); - }, binding() { - let d = !(arguments.length > 0 && arguments[0] !== void 0) || arguments[0]; - var p, w = this.settings, b = this.events.callbacks, D = d ? "addEventListener" : "removeEventListener"; - if (!this.state.mainEvents || !d) { - for (var _ in this.state.mainEvents = d, d && !this.listeners.main && (this.events.bindGlobal.call(this), this.settings.isJQueryPlugin && jQuery(this.DOM.originalInput).on("tagify.removeAllTags", this.removeAllTags.bind(this))), p = this.listeners.main = this.listeners.main || { focus: ["input", b.onFocusBlur.bind(this)], keydown: ["input", b.onKeydown.bind(this)], click: ["scope", b.onClickScope.bind(this)], dblclick: w.mode != "select" && ["scope", b.onDoubleClickScope.bind(this)], paste: ["input", b.onPaste.bind(this)], drop: ["input", b.onDrop.bind(this)], compositionstart: ["input", b.onCompositionStart.bind(this)], compositionend: ["input", b.onCompositionEnd.bind(this)] }) - p[_] && this.DOM[p[_][0]][D](_, p[_][1]); - clearInterval(this.listeners.main.originalInputValueObserverInterval), this.listeners.main.originalInputValueObserverInterval = setInterval(b.observeOriginalInputValue.bind(this), 500); - var P = this.listeners.main.inputMutationObserver || new MutationObserver(b.onInputDOMChange.bind(this)); - P.disconnect(), w.mode == "mix" && P.observe(this.DOM.input, { childList: !0 }); - } - }, bindGlobal(d) { - var p, w = this.events.callbacks, b = d ? "removeEventListener" : "addEventListener"; - if (this.listeners && (d || !this.listeners.global)) - for (p of (this.listeners.global = this.listeners.global || [{ type: this.isIE ? "keydown" : "input", target: this.DOM.input, cb: w[this.isIE ? "onInputIE" : "onInput"].bind(this) }, { type: "keydown", target: window, cb: w.onWindowKeyDown.bind(this) }, { type: "blur", target: this.DOM.input, cb: w.onFocusBlur.bind(this) }, { type: "click", target: document, cb: w.onClickAnywhere.bind(this), useCapture: !0 }], this.listeners.global)) - p.target[b](p.type, p.cb, !!p.useCapture); - }, unbindGlobal() { - this.events.bindGlobal.call(this, !0); - }, callbacks: { onFocusBlur(d) { - var K, ce; - var p = this.settings, w = d.target ? this.trim(d.target.textContent) : "", b = (ce = (K = this.value) == null ? void 0 : K[0]) == null ? void 0 : ce[p.tagTextProp], D = d.type, _ = p.dropdown.enabled >= 0, P = { relatedTarget: d.relatedTarget }, N = this.state.actions.selectOption && (_ || !p.dropdown.closeOnSelect), V = this.state.actions.addNew && _; - if (D == "blur") { - if (d.relatedTarget === this.DOM.scope) - return this.dropdown.hide(), void this.DOM.input.focus(); - this.postUpdate(), p.onChangeAfterBlur && this.triggerChangeEvent(); - } - if (!N && !V) - if (this.state.hasFocus = D == "focus" && +/* @__PURE__ */ new Date(), this.toggleFocusClass(this.state.hasFocus), p.mode != "mix") { - if (D == "focus") - return this.trigger("focus", P), void (p.dropdown.enabled !== 0 && p.userInput || this.state.dropdown.visible || this.dropdown.show(this.value.length ? "" : void 0)); - D == "blur" && (this.trigger("blur", P), this.loading(!1), p.mode == "select" && b === w && (w = ""), w && !this.state.actions.selectOption && p.addTagOnBlur && p.addTagOn.includes("blur") && this.addTags(w, !0)), this.DOM.input.removeAttribute("style"), this.dropdown.hide(); - } else - D == "focus" ? this.trigger("focus", P) : d.type == "blur" && (this.trigger("blur", P), this.loading(!1), this.dropdown.hide(), this.state.dropdown.visible = void 0, this.setStateSelection()); - }, onCompositionStart(d) { - this.state.composing = !0; - }, onCompositionEnd(d) { - this.state.composing = !1; - }, onWindowKeyDown(d) { - var p, w = document.activeElement, b = S.call(this, w) && this.DOM.scope.contains(document.activeElement), D = b && w.hasAttribute("readonly"); - if (b && !D) - switch (p = w.nextElementSibling, d.key) { - case "Backspace": - this.settings.readonly || (this.removeTags(w), (p || this.DOM.input).focus()); - break; - case "Enter": - setTimeout(this.editTag.bind(this), 0, w); - } - }, onKeydown(d) { - var p = this.settings; - if (!this.state.composing && p.userInput) { - p.mode == "select" && p.enforceWhitelist && this.value.length && d.key != "Tab" && d.preventDefault(); - var w = this.trim(d.target.textContent); - this.trigger("keydown", { event: d }), p.hooks.beforeKeyDown(d, { tagify: this }).then((b) => { - if (p.mode == "mix") { - switch (d.key) { - case "Left": - case "ArrowLeft": - this.state.actions.ArrowLeft = !0; - break; - case "Delete": - case "Backspace": - if (this.state.editing) - return; - var D = document.getSelection(), _ = d.key == "Delete" && D.anchorOffset == (D.anchorNode.length || 0), P = D.anchorNode.previousSibling, N = D.anchorNode.nodeType == 1 || !D.anchorOffset && P && P.nodeType == 1 && D.anchorNode.previousSibling; - l(this.DOM.input.innerHTML); - var V, K, ce, ee = this.getTagElms(), ke = D.anchorNode.length === 1 && D.anchorNode.nodeValue == "​"; - if (p.backspace == "edit" && N) - return V = D.anchorNode.nodeType == 1 ? null : D.anchorNode.previousElementSibling, setTimeout(this.editTag.bind(this), 0, V), void d.preventDefault(); - if (k() && N instanceof Element) - return ce = u(N), N.hasAttribute("readonly") || N.remove(), this.DOM.input.focus(), void setTimeout(() => { - E(ce), this.DOM.input.click(); - }); - if (D.anchorNode.nodeName == "BR") - return; - if ((_ || N) && D.anchorNode.nodeType == 1 ? K = D.anchorOffset == 0 ? _ ? ee[0] : null : ee[Math.min(ee.length, D.anchorOffset) - 1] : _ ? K = D.anchorNode.nextElementSibling : N instanceof Element && (K = N), D.anchorNode.nodeType == 3 && !D.anchorNode.nodeValue && D.anchorNode.previousElementSibling && d.preventDefault(), (N || _) && !p.backspace || D.type != "Range" && !D.anchorOffset && D.anchorNode == this.DOM.input && d.key != "Delete") - return void d.preventDefault(); - if (D.type != "Range" && K && K.hasAttribute("readonly")) - return void E(u(K)); - d.key == "Delete" && ke && I(D.anchorNode.nextSibling) && this.removeTags(D.anchorNode.nextSibling), clearTimeout(re), re = setTimeout(() => { - var pe = document.getSelection(); - l(this.DOM.input.innerHTML), !_ && pe.anchorNode.previousSibling, this.value = [].map.call(ee, (be, me) => { - var ge = I(be); - if (be.parentNode || ge.readonly) - return ge; - this.trigger("remove", { tag: be, index: me, data: ge }); - }).filter((be) => be); - }, 20); - } - return !0; - } - var ie = p.dropdown.position == "manual"; - switch (d.key) { - case "Backspace": - p.mode == "select" && p.enforceWhitelist && this.value.length ? this.removeTags() : this.state.dropdown.visible && p.dropdown.position != "manual" || d.target.textContent != "" && w.charCodeAt(0) != 8203 || (p.backspace === !0 ? this.removeTags() : p.backspace == "edit" && setTimeout(this.editTag.bind(this), 0)); - break; - case "Esc": - case "Escape": - if (this.state.dropdown.visible) - return; - d.target.blur(); - break; - case "Down": - case "ArrowDown": - this.state.dropdown.visible || this.dropdown.show(); - break; - case "ArrowRight": { - let pe = this.state.inputSuggestion || this.state.ddItemData; - if (pe && p.autoComplete.rightKey) - return void this.addTags([pe], !0); - break; - } - case "Tab": { - let pe = p.mode == "select"; - if (!w || pe) - return !0; - d.preventDefault(); - } - case "Enter": - if (this.state.dropdown.visible && !ie) - return; - d.preventDefault(), setTimeout(() => { - this.state.dropdown.visible && !ie || this.state.actions.selectOption || !p.addTagOn.includes(d.key.toLowerCase()) || this.addTags(w, !0); - }); - } - }).catch((b) => b); - } - }, onInput(d) { - this.postUpdate(); - var p = this.settings; - if (p.mode == "mix") - return this.events.callbacks.onMixTagsInput.call(this, d); - var w = this.input.normalize.call(this, void 0, { trim: !1 }), b = w.length >= p.dropdown.enabled, D = { value: w, inputElm: this.DOM.input }, _ = this.validateTag({ value: w }); - p.mode == "select" && this.toggleScopeValidation(_), D.isValid = _, this.state.inputText != w && (this.input.set.call(this, w, !1), w.search(p.delimiters) != -1 ? this.addTags(w) && this.input.set.call(this) : p.dropdown.enabled >= 0 && this.dropdown[b ? "show" : "hide"](w), this.trigger("input", D)); - }, onMixTagsInput(d) { - var p, w, b, D, _, P, N, V, K = this.settings, ce = this.value.length, ee = this.getTagElms(), ke = document.createDocumentFragment(), ie = window.getSelection().getRangeAt(0), pe = [].map.call(ee, (be) => I(be).value); - if (d.inputType == "deleteContentBackward" && k() && this.events.callbacks.onKeydown.call(this, { target: d.target, key: "Backspace" }), F(this.getTagElms()), this.value.slice().forEach((be) => { - be.readonly && !pe.includes(be.value) && ke.appendChild(this.createTagElem(be)); - }), ke.childNodes.length && (ie.insertNode(ke), this.setRangeAtStartEnd(!1, ke.lastChild)), ee.length != ce) - return this.value = [].map.call(this.getTagElms(), (be) => I(be)), void this.update({ withoutChangeEvent: !0 }); - if (this.hasMaxTags()) - return !0; - if (window.getSelection && (P = window.getSelection()).rangeCount > 0 && P.anchorNode.nodeType == 3) { - if ((ie = P.getRangeAt(0).cloneRange()).collapse(!0), ie.setStart(P.focusNode, 0), b = (p = ie.toString().slice(0, ie.endOffset)).split(K.pattern).length - 1, (w = p.match(K.pattern)) && (D = p.slice(p.lastIndexOf(w[w.length - 1]))), D) { - if (this.state.actions.ArrowLeft = !1, this.state.tag = { prefix: D.match(K.pattern)[0], value: D.replace(K.pattern, "") }, this.state.tag.baseOffset = P.baseOffset - this.state.tag.value.length, V = this.state.tag.value.match(K.delimiters)) - return this.state.tag.value = this.state.tag.value.replace(K.delimiters, ""), this.state.tag.delimiters = V[0], this.addTags(this.state.tag.value, K.dropdown.clearOnSelect), void this.dropdown.hide(); - _ = this.state.tag.value.length >= K.dropdown.enabled; - try { - N = (N = this.state.flaggedTags[this.state.tag.baseOffset]).prefix == this.state.tag.prefix && N.value[0] == this.state.tag.value[0], this.state.flaggedTags[this.state.tag.baseOffset] && !this.state.tag.value && delete this.state.flaggedTags[this.state.tag.baseOffset]; - } catch { - } - (N || b < this.state.mixMode.matchedPatternCount) && (_ = !1); - } else - this.state.flaggedTags = {}; - this.state.mixMode.matchedPatternCount = b; - } - setTimeout(() => { - this.update({ withoutChangeEvent: !0 }), this.trigger("input", h({}, this.state.tag, { textContent: this.DOM.input.textContent })), this.state.tag && this.dropdown[_ ? "show" : "hide"](this.state.tag.value); - }, 10); - }, onInputIE(d) { - var p = this; - setTimeout(function() { - p.events.callbacks.onInput.call(p, d); - }); - }, observeOriginalInputValue() { - this.DOM.originalInput.parentNode || this.destroy(), this.DOM.originalInput.value != this.DOM.originalInput.tagifyValue && this.loadOriginalValues(); - }, onClickAnywhere(d) { - d.target == this.DOM.scope || this.DOM.scope.contains(d.target) || (this.toggleFocusClass(!1), this.state.hasFocus = !1, !this.settings.userInput && this.dropdown.hide()); - }, onClickScope(d) { - var p = this.settings, w = d.target.closest("." + p.classNames.tag), b = d.target === this.DOM.scope, D = +/* @__PURE__ */ new Date() - this.state.hasFocus; - if (b && p.mode != "select") - this.DOM.input.focus(); - else { - if (!d.target.classList.contains(p.classNames.tagX)) - return w && !this.state.editing ? (this.trigger("click", { tag: w, index: this.getNodeIndex(w), data: I(w), event: d }), void (p.editTags !== 1 && p.editTags.clicks !== 1 && p.mode != "select" || this.events.callbacks.onDoubleClickScope.call(this, d))) : void (d.target == this.DOM.input && (p.mode == "mix" && this.fixFirefoxLastTagNoCaret(), D > 500) ? this.state.dropdown.visible ? this.dropdown.hide() : p.dropdown.enabled === 0 && p.mode != "mix" && this.dropdown.show(this.value.length ? "" : void 0) : p.mode != "select" || p.dropdown.enabled !== 0 || this.state.dropdown.visible || (this.events.callbacks.onDoubleClickScope.call(this, s(s({}, d), {}, { target: this.getTagElms()[0] })), !p.userInput && this.dropdown.show())); - this.removeTags(d.target.parentNode); - } - }, onPaste(d) { - d.preventDefault(); - var p, w, b, D = this.settings; - if (D.mode == "select" && D.enforceWhitelist || !D.userInput) - return !1; - D.readonly || (w = d.clipboardData || window.clipboardData, b = w.getData("Text"), D.hooks.beforePaste(d, { tagify: this, pastedText: b, clipboardData: w }).then((_) => { - _ === void 0 && (_ = b), _ && (this.injectAtCaret(_, window.getSelection().getRangeAt(0)), this.settings.mode == "mix" ? this.events.callbacks.onMixTagsInput.call(this, d) : this.settings.pasteAsTags ? p = this.addTags(this.state.inputText + _, !0) : (this.state.inputText = _, this.dropdown.show(_))), this.trigger("paste", { event: d, pastedText: b, clipboardData: w, tagsElems: p }); - }).catch((_) => _)); - }, onDrop(d) { - d.preventDefault(); - }, onEditTagInput(d, p) { - var w = d.closest("." + this.settings.classNames.tag), b = this.getNodeIndex(w), D = I(w), _ = this.input.normalize.call(this, d), P = { [this.settings.tagTextProp]: _, __tagId: D.__tagId }, N = this.validateTag(P); - this.editTagChangeDetected(h(D, P)) || d.originalIsValid !== !0 || (N = !0), w.classList.toggle(this.settings.classNames.tagInvalid, N !== !0), D.__isValid = N, w.title = N === !0 ? D.title || D.value : N, _.length >= this.settings.dropdown.enabled && (this.state.editing && (this.state.editing.value = _), this.dropdown.show(_)), this.trigger("edit:input", { tag: w, index: b, data: h({}, this.value[b], { newValue: _ }), event: p }); - }, onEditTagPaste(d, p) { - var w = (p.clipboardData || window.clipboardData).getData("Text"); - p.preventDefault(); - var b = C(w); - this.setRangeAtStartEnd(!1, b); - }, onEditTagClick(d, p) { - this.events.callbacks.onClickScope.call(this, p); - }, onEditTagFocus(d) { - this.state.editing = { scope: d, input: d.querySelector("[contenteditable]") }; - }, onEditTagBlur(d, p) { - if (S.call(this, p.relatedTarget) && p.relatedTarget.contains(p.target)) - this.dropdown.hide(); - else if (this.state.editing && (this.state.hasFocus || this.toggleFocusClass(), this.DOM.scope.contains(d))) { - var w, b, D = this.settings, _ = d.closest("." + D.classNames.tag), P = I(_), N = this.input.normalize.call(this, d), V = { [D.tagTextProp]: N, __tagId: P.__tagId }, K = P.__originalData, ce = this.editTagChangeDetected(h(P, V)), ee = this.validateTag(V); - if (N) - if (ce) { - if (w = this.hasMaxTags(), b = h({}, K, { [D.tagTextProp]: this.trim(N), __isValid: ee }), D.transformTag.call(this, b, K), (ee = (!w || K.__isValid === !0) && this.validateTag(b)) !== !0) { - if (this.trigger("invalid", { data: b, tag: _, message: ee }), D.editTags.keepInvalid) - return; - D.keepInvalidTags ? b.__isValid = ee : b = K; - } else - D.keepInvalidTags && (delete b.title, delete b["aria-invalid"], delete b.class); - this.onEditTagDone(_, b); - } else - this.onEditTagDone(_, K); - else - this.onEditTagDone(_); - } - }, onEditTagkeydown(d, p) { - if (!this.state.composing) - switch (this.trigger("edit:keydown", { event: d }), d.key) { - case "Esc": - case "Escape": - this.state.editing = !1, p.__tagifyTagData.__originalData.value ? p.parentNode.replaceChild(p.__tagifyTagData.__originalHTML, p) : p.remove(); - break; - case "Enter": - case "Tab": - d.preventDefault(), setTimeout(() => d.target.blur(), 0); - } - }, onDoubleClickScope(d) { - var p, w, b = d.target.closest("." + this.settings.classNames.tag), D = I(b), _ = this.settings; - b && D.editable !== !1 && (p = b.classList.contains(this.settings.classNames.tagEditing), w = b.hasAttribute("readonly"), _.readonly || p || w || !this.settings.editTags || !_.userInput || this.editTag(b), this.toggleFocusClass(!0), _.mode != "select" && this.trigger("dblclick", { tag: b, index: this.getNodeIndex(b), data: I(b) })); - }, onInputDOMChange(d) { - d.forEach((w) => { - w.addedNodes.forEach((b) => { - var D; - if (b.outerHTML == "

") - b.replaceWith(document.createElement("br")); - else if (b.nodeType == 1 && b.querySelector(this.settings.classNames.tagSelector)) { - let _ = document.createTextNode(""); - b.childNodes[0].nodeType == 3 && b.previousSibling.nodeName != "BR" && (_ = document.createTextNode(` -`)), b.replaceWith(_, ...[...b.childNodes].slice(0, -1)), E(_); - } else if (S.call(this, b)) - if (((D = b.previousSibling) == null ? void 0 : D.nodeType) != 3 || b.previousSibling.textContent || b.previousSibling.remove(), b.previousSibling && b.previousSibling.nodeName == "BR") { - b.previousSibling.replaceWith(` -​`); - let _ = b.nextSibling, P = ""; - for (; _; ) - P += _.textContent, _ = _.nextSibling; - P.trim() && E(b.previousSibling); - } else - b.previousSibling && !I(b.previousSibling) || b.before("​"); - }), w.removedNodes.forEach((b) => { - b && b.nodeName == "BR" && S.call(this, p) && (this.removeTags(p), this.fixFirefoxLastTagNoCaret()); - }); - }); - var p = this.DOM.input.lastChild; - p && p.nodeValue == "" && p.remove(), p && p.nodeName == "BR" || this.DOM.input.appendChild(document.createElement("br")); - } } }; - function le(d, p) { - if (!d) { - console.warn("Tagify:", "input element not found", d); - const b = new Proxy(this, { get: () => () => b }); - return b; - } - if (d.__tagify) - return console.warn("Tagify: ", "input element is already Tagified - Same instance is returned.", d), d.__tagify; - var w; - h(this, function(b) { - var D = document.createTextNode(""); - function _(P, N, V) { - V && N.split(/\s+/g).forEach((K) => D[P + "EventListener"].call(D, K, V)); - } - return { off(P, N) { - return _("remove", P, N), this; - }, on(P, N) { - return N && typeof N == "function" && _("add", P, N), this; - }, trigger(P, N, V) { - var K; - if (V = V || { cloneData: !0 }, P) - if (b.settings.isJQueryPlugin) - P == "remove" && (P = "removeTag"), jQuery(b.DOM.originalInput).triggerHandler(P, [N]); - else { - try { - var ce = typeof N == "object" ? N : { value: N }; - if ((ce = V.cloneData ? h({}, ce) : ce).tagify = this, N.event && (ce.event = this.cloneEvent(N.event)), N instanceof Object) - for (var ee in N) - N[ee] instanceof HTMLElement && (ce[ee] = N[ee]); - K = new CustomEvent(P, { detail: ce }); - } catch (ke) { - console.warn(ke); - } - D.dispatchEvent(K); - } - } }; - }(this)), this.isFirefox = /firefox|fxios/i.test(navigator.userAgent) && !/seamonkey/i.test(navigator.userAgent), this.isIE = window.document.documentMode, p = p || {}, this.getPersistedData = (w = p.id, (b) => { - let D, _ = "/" + b; - if (localStorage.getItem(j + w + "/v", 1) == 1) - try { - D = JSON.parse(localStorage[j + w + _]); - } catch { - } - return D; - }), this.setPersistedData = ((b) => b ? (localStorage.setItem(j + b + "/v", 1), (D, _) => { - let P = "/" + _, N = JSON.stringify(D); - D && _ && (localStorage.setItem(j + b + P, N), dispatchEvent(new Event("storage"))); - }) : () => { - })(p.id), this.clearPersistedData = /* @__PURE__ */ ((b) => (D) => { - const _ = j + "/" + b + "/"; - if (D) - localStorage.removeItem(_ + D); - else - for (let P in localStorage) - P.includes(_) && localStorage.removeItem(P); - })(p.id), this.applySettings(d, p), this.state = { inputText: "", editing: !1, composing: !1, actions: {}, mixMode: {}, dropdown: {}, flaggedTags: {} }, this.value = [], this.listeners = {}, this.DOM = {}, this.build(d), L.call(this), this.getCSSVars(), this.loadOriginalValues(), this.events.customBinding.call(this), this.events.binding.call(this), d.autofocus && this.DOM.input.focus(), d.__tagify = this; - } - return le.prototype = { _dropdown: U, placeCaretAfterNode: E, getSetTagData: I, helpers: { sameStr: r, removeCollectionProp: o, omit: n, isObject: f, parseHTML: c, escapeHTML: g, extend: h, concatWithoutDups: m, getUID: T, isNodeTag: S }, customEventsList: ["change", "add", "remove", "invalid", "input", "paste", "click", "keydown", "focus", "blur", "edit:input", "edit:beforeUpdate", "edit:updated", "edit:start", "edit:keydown", "dropdown:show", "dropdown:hide", "dropdown:select", "dropdown:updated", "dropdown:noMatch", "dropdown:scroll"], dataProps: ["__isValid", "__removed", "__originalData", "__originalHTML", "__tagId"], trim(d) { - return this.settings.trim && d && typeof d == "string" ? d.trim() : d; - }, parseHTML: c, templates: de, parseTemplate(d, p) { - return c((d = this.settings.templates[d] || d).apply(this, p)); - }, set whitelist(d) { - const p = d && Array.isArray(d); - this.settings.whitelist = p ? d : [], this.setPersistedData(p ? d : [], "whitelist"); - }, get whitelist() { - return this.settings.whitelist; - }, generateClassSelectors(d) { - for (let p in d) { - let w = p; - Object.defineProperty(d, w + "Selector", { get() { - return "." + this[w].split(" ")[0]; - } }); - } - }, applySettings(d, p) { - var _, P; - O.templates = this.templates; - var w = h({}, O, p.mode == "mix" ? { dropdown: { position: "text" } } : {}), b = this.settings = h({}, w, p); - if (b.disabled = d.hasAttribute("disabled"), b.readonly = b.readonly || d.hasAttribute("readonly"), b.placeholder = g(d.getAttribute("placeholder") || b.placeholder || ""), b.required = d.hasAttribute("required"), this.generateClassSelectors(b.classNames), b.dropdown.includeSelectedTags === void 0 && (b.dropdown.includeSelectedTags = b.duplicates), this.isIE && (b.autoComplete = !1), ["whitelist", "blacklist"].forEach((N) => { - var V = d.getAttribute("data-" + N); - V && (V = V.split(b.delimiters)) instanceof Array && (b[N] = V); - }), "autoComplete" in p && !f(p.autoComplete) && (b.autoComplete = O.autoComplete, b.autoComplete.enabled = p.autoComplete), b.mode == "mix" && (b.pattern = b.pattern || /@/, b.autoComplete.rightKey = !0, b.delimiters = p.delimiters || null, b.tagTextProp && !b.dropdown.searchKeys.includes(b.tagTextProp) && b.dropdown.searchKeys.push(b.tagTextProp)), d.pattern) - try { - b.pattern = new RegExp(d.pattern); - } catch { - } - if (b.delimiters) { - b._delimiters = b.delimiters; - try { - b.delimiters = new RegExp(this.settings.delimiters, "g"); - } catch { - } - } - b.disabled && (b.userInput = !1), this.TEXTS = s(s({}, X), b.texts || {}), (b.mode != "select" || (_ = p.dropdown) != null && _.enabled) && b.userInput || (b.dropdown.enabled = 0), b.dropdown.appendTarget = ((P = p.dropdown) == null ? void 0 : P.appendTarget) || document.body; - let D = this.getPersistedData("whitelist"); - Array.isArray(D) && (this.whitelist = Array.isArray(b.whitelist) ? m(b.whitelist, D) : D); - }, getAttributes(d) { - var p, w = this.getCustomAttributes(d), b = ""; - for (p in w) - b += " " + p + (d[p] !== void 0 ? `="${w[p]}"` : ""); - return b; - }, getCustomAttributes(d) { - if (!f(d)) - return ""; - var p, w = {}; - for (p in d) - p.slice(0, 2) != "__" && p != "class" && d.hasOwnProperty(p) && d[p] !== void 0 && (w[p] = g(d[p])); - return w; - }, setStateSelection() { - var d = window.getSelection(), p = { anchorOffset: d.anchorOffset, anchorNode: d.anchorNode, range: d.getRangeAt && d.rangeCount && d.getRangeAt(0) }; - return this.state.selection = p, p; - }, getCSSVars() { - var d = getComputedStyle(this.DOM.scope, null), p; - this.CSSVars = { tagHideTransition: ((w) => { - let b = w.value; - return w.unit == "s" ? 1e3 * b : b; - })(function(w) { - if (!w) - return {}; - var b = (w = w.trim().split(" ")[0]).split(/\d+/g).filter((D) => D).pop().trim(); - return { value: +w.split(b).filter((D) => D)[0].trim(), unit: b }; - }((p = "tag-hide-transition", d.getPropertyValue("--" + p)))) }; - }, build(d) { - var p = this.DOM, w = d.closest("label"); - this.settings.mixMode.integrated ? (p.originalInput = null, p.scope = d, p.input = d) : (p.originalInput = d, p.originalInput_tabIndex = d.tabIndex, p.scope = this.parseTemplate("wrapper", [d, this.settings]), p.input = p.scope.querySelector(this.settings.classNames.inputSelector), d.parentNode.insertBefore(p.scope, d), d.tabIndex = -1), w && w.setAttribute("for", ""); - }, destroy() { - this.events.unbindGlobal.call(this), this.DOM.scope.parentNode.removeChild(this.DOM.scope), this.DOM.originalInput.tabIndex = this.DOM.originalInput_tabIndex, delete this.DOM.originalInput.__tagify, this.dropdown.hide(!0), clearTimeout(this.dropdownHide__bindEventsTimeout), clearInterval(this.listeners.main.originalInputValueObserverInterval); - }, loadOriginalValues(d) { - var p, w = this.settings; - if (this.state.blockChangeEvent = !0, d === void 0) { - const b = this.getPersistedData("value"); - d = b && !this.DOM.originalInput.value ? b : w.mixMode.integrated ? this.DOM.input.textContent : this.DOM.originalInput.value; - } - if (this.removeAllTags(), d) - if (w.mode == "mix") - this.parseMixTags(d), (p = this.DOM.input.lastChild) && p.tagName == "BR" || this.DOM.input.insertAdjacentHTML("beforeend", "
"); - else { - try { - JSON.parse(d) instanceof Array && (d = JSON.parse(d)); - } catch { - } - this.addTags(d, !0).forEach((b) => b && b.classList.add(w.classNames.tagNoAnimation)); - } - else - this.postUpdate(); - this.state.lastOriginalValueReported = w.mixMode.integrated ? "" : this.DOM.originalInput.value; - }, cloneEvent(d) { - var p = {}; - for (var w in d) - w != "path" && (p[w] = d[w]); - return p; - }, loading(d) { - return this.state.isLoading = d, this.DOM.scope.classList[d ? "add" : "remove"](this.settings.classNames.scopeLoading), this; - }, tagLoading(d, p) { - return d && d.classList[p ? "add" : "remove"](this.settings.classNames.tagLoading), this; - }, toggleClass(d, p) { - typeof d == "string" && this.DOM.scope.classList.toggle(d, p); - }, toggleScopeValidation(d) { - var p = d === !0 || d === void 0; - !this.settings.required && d && d === this.TEXTS.empty && (p = !0), this.toggleClass(this.settings.classNames.tagInvalid, !p), this.DOM.scope.title = p ? "" : d; - }, toggleFocusClass(d) { - this.toggleClass(this.settings.classNames.focus, !!d); - }, triggerChangeEvent: function() { - if (!this.settings.mixMode.integrated) { - var d = this.DOM.originalInput, p = this.state.lastOriginalValueReported !== d.value, w = new CustomEvent("change", { bubbles: !0 }); - p && (this.state.lastOriginalValueReported = d.value, w.simulated = !0, d._valueTracker && d._valueTracker.setValue(Math.random()), d.dispatchEvent(w), this.trigger("change", this.state.lastOriginalValueReported), d.value = this.state.lastOriginalValueReported); - } - }, events: Q, fixFirefoxLastTagNoCaret() { - }, setRangeAtStartEnd(d, p) { - if (p) { - d = typeof d == "number" ? d : !!d, p = p.lastChild || p; - var w = document.getSelection(); - if (w.focusNode instanceof Element && !this.DOM.input.contains(w.focusNode)) - return !0; - try { - w.rangeCount >= 1 && ["Start", "End"].forEach((b) => w.getRangeAt(0)["set" + b](p, d || p.length)); - } catch (b) { - console.warn("Tagify: ", b); - } - } - }, insertAfterTag(d, p) { - if (p = p || this.settings.mixMode.insertAfterTag, d && d.parentNode && p) - return p = typeof p == "string" ? document.createTextNode(p) : p, d.parentNode.insertBefore(p, d.nextSibling), p; - }, editTagChangeDetected(d) { - var p = d.__originalData; - for (var w in p) - if (!this.dataProps.includes(w) && d[w] != p[w]) - return !0; - return !1; - }, getTagTextNode(d) { - return d.querySelector(this.settings.classNames.tagTextSelector); - }, setTagTextNode(d, p) { - this.getTagTextNode(d).innerHTML = g(p); - }, editTag(d, p) { - d = d || this.getLastTag(), p = p || {}, this.dropdown.hide(); - var w = this.settings, b = this.getTagTextNode(d), D = this.getNodeIndex(d), _ = I(d), P = this.events.callbacks, N = !0; - if (b) { - if (!(_ instanceof Object && "editable" in _) || _.editable) - return _ = I(d, { __originalData: h({}, _), __originalHTML: d.cloneNode(!0) }), I(_.__originalHTML, _.__originalData), b.setAttribute("contenteditable", !0), d.classList.add(w.classNames.tagEditing), b.addEventListener("click", P.onEditTagClick.bind(this, d)), b.addEventListener("focus", P.onEditTagFocus.bind(this, d)), b.addEventListener("blur", P.onEditTagBlur.bind(this, this.getTagTextNode(d))), b.addEventListener("input", P.onEditTagInput.bind(this, b)), b.addEventListener("paste", P.onEditTagPaste.bind(this, b)), b.addEventListener("keydown", (V) => P.onEditTagkeydown.call(this, V, d)), b.addEventListener("compositionstart", P.onCompositionStart.bind(this)), b.addEventListener("compositionend", P.onCompositionEnd.bind(this)), p.skipValidation || (N = this.editTagToggleValidity(d)), b.originalIsValid = N, this.trigger("edit:start", { tag: d, index: D, data: _, isValid: N }), b.focus(), this.setRangeAtStartEnd(!1, b), w.dropdown.enabled === 0 && this.dropdown.show(), this.state.hasFocus = !0, this; - } else - console.warn("Cannot find element in Tag template: .", w.classNames.tagTextSelector); - }, editTagToggleValidity(d, p) { - var w; - if (p = p || I(d)) - return (w = !("__isValid" in p) || p.__isValid === !0) || this.removeTagsFromValue(d), this.update(), d.classList.toggle(this.settings.classNames.tagNotAllowed, !w), p.__isValid = w, p.__isValid; - console.warn("tag has no data: ", d, p); - }, onEditTagDone(d, p) { - var _; - d = d || this.state.editing.scope, p = p || {}; - var w, b = { tag: d, index: this.getNodeIndex(d), previousData: I(d), data: p }, D = this.settings; - this.trigger("edit:beforeUpdate", b, { cloneData: !1 }), this.state.editing = !1, delete p.__originalData, delete p.__originalHTML, d && ((w = p[D.tagTextProp]) ? (_ = w.trim) != null && _.call(w) : !(D.tagTextProp in p) && p.value) ? (d = this.replaceTag(d, p), this.editTagToggleValidity(d, p), D.a11y.focusableTags ? d.focus() : E(d)) : d && this.removeTags(d), this.trigger("edit:updated", b), this.dropdown.hide(), this.settings.keepInvalidTags && this.reCheckInvalidTags(); - }, replaceTag(d, p) { - p && p.value !== "" && p.value !== void 0 || (p = d.__tagifyTagData), p.__isValid && p.__isValid != 1 && h(p, this.getInvalidTagAttrs(p, p.__isValid)); - var w = this.createTagElem(p); - return d.parentNode.replaceChild(w, d), this.updateValueByDOMTags(), w; - }, updateValueByDOMTags() { - this.value.length = 0, [].forEach.call(this.getTagElms(), (d) => { - d.classList.contains(this.settings.classNames.tagNotAllowed.split(" ")[0]) || this.value.push(I(d)); - }), this.update(); - }, injectAtCaret(d, p) { - var b; - if (!(p = p || ((b = this.state.selection) == null ? void 0 : b.range)) && d) - return this.appendMixTags(d), this; - let w = C(d, p); - return this.setRangeAtStartEnd(!1, w), this.updateValueByDOMTags(), this.update(), this; - }, input: { set() { - let d = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : "", p = !(arguments.length > 1 && arguments[1] !== void 0) || arguments[1]; - var w = this.settings.dropdown.closeOnSelect; - this.state.inputText = d, p && (this.DOM.input.innerHTML = g("" + d)), !d && w && this.dropdown.hide.bind(this), this.input.autocomplete.suggest.call(this), this.input.validate.call(this); - }, raw() { - return this.DOM.input.textContent; - }, validate() { - var d = !this.state.inputText || this.validateTag({ value: this.state.inputText }) === !0; - return this.DOM.input.classList.toggle(this.settings.classNames.inputInvalid, !d), d; - }, normalize(d, p) { - var w = d || this.DOM.input, b = []; - w.childNodes.forEach((D) => D.nodeType == 3 && b.push(D.nodeValue)), b = b.join(` -`); - try { - b = b.replace(/(?:\r\n|\r|\n)/g, this.settings.delimiters.source.charAt(0)); - } catch { - } - return b = b.replace(/\s/g, " "), p != null && p.trim ? this.trim(b) : b; - }, autocomplete: { suggest(d) { - if (this.settings.autoComplete.enabled) { - typeof (d = d || { value: "" }) != "object" && (d = { value: d }); - var p = this.dropdown.getMappedValue(d); - if (typeof p != "number") { - var w = this.state.inputText.toLowerCase(), b = p.substr(0, this.state.inputText.length).toLowerCase(), D = p.substring(this.state.inputText.length); - p && this.state.inputText && b == w ? (this.DOM.input.setAttribute("data-suggest", D), this.state.inputSuggestion = d) : (this.DOM.input.removeAttribute("data-suggest"), delete this.state.inputSuggestion); - } - } - }, set(d) { - var p = this.DOM.input.getAttribute("data-suggest"), w = d || (p ? this.state.inputText + p : null); - return !!w && (this.settings.mode == "mix" ? this.replaceTextWithNode(document.createTextNode(this.state.tag.prefix + w)) : (this.input.set.call(this, w), this.setRangeAtStartEnd(!1, this.DOM.input)), this.input.autocomplete.suggest.call(this), this.dropdown.hide(), !0); - } } }, getTagIdx(d) { - return this.value.findIndex((p) => p.__tagId == (d || {}).__tagId); - }, getNodeIndex(d) { - var p = 0; - if (d) - for (; d = d.previousElementSibling; ) - p++; - return p; - }, getTagElms() { - for (var d = arguments.length, p = new Array(d), w = 0; w < d; w++) - p[w] = arguments[w]; - var b = "." + [...this.settings.classNames.tag.split(" "), ...p].join("."); - return [].slice.call(this.DOM.scope.querySelectorAll(b)); - }, getLastTag() { - var d = this.DOM.scope.querySelectorAll(`${this.settings.classNames.tagSelector}:not(.${this.settings.classNames.tagHide}):not([readonly])`); - return d[d.length - 1]; - }, isTagDuplicate(d, p, w) { - var b = 0; - if (this.settings.mode == "select") - return !1; - for (let D of this.value) - r(this.trim("" + d), D.value, p) && w != D.__tagId && b++; - return b; - }, getTagIndexByValue(d) { - var p = [], w = this.settings.dropdown.caseSensitive; - return this.getTagElms().forEach((b, D) => { - b.__tagifyTagData && r(this.trim(b.__tagifyTagData.value), d, w) && p.push(D); - }), p; - }, getTagElmByValue(d) { - var p = this.getTagIndexByValue(d)[0]; - return this.getTagElms()[p]; - }, flashTag(d) { - d && (d.classList.add(this.settings.classNames.tagFlash), setTimeout(() => { - d.classList.remove(this.settings.classNames.tagFlash); - }, 100)); - }, isTagBlacklisted(d) { - return d = this.trim(d.toLowerCase()), this.settings.blacklist.filter((p) => ("" + p).toLowerCase() == d).length; - }, isTagWhitelisted(d) { - return !!this.getWhitelistItem(d); - }, getWhitelistItem(d, p, w) { - p = p || "value"; - var b, D = this.settings; - return (w = w || D.whitelist).some((_) => { - var P = typeof _ == "string" ? _ : _[p] || _.value; - if (r(P, d, D.dropdown.caseSensitive, D.trim)) - return b = typeof _ == "string" ? { value: _ } : _, !0; - }), b || p != "value" || D.tagTextProp == "value" || (b = this.getWhitelistItem(d, D.tagTextProp, w)), b; - }, validateTag(d) { - var p = this.settings, w = "value" in d ? "value" : p.tagTextProp, b = this.trim(d[w] + ""); - return (d[w] + "").trim() ? p.mode != "mix" && p.pattern && p.pattern instanceof RegExp && !p.pattern.test(b) ? this.TEXTS.pattern : !p.duplicates && this.isTagDuplicate(b, p.dropdown.caseSensitive, d.__tagId) ? this.TEXTS.duplicate : this.isTagBlacklisted(b) || p.enforceWhitelist && !this.isTagWhitelisted(b) ? this.TEXTS.notAllowed : !p.validate || p.validate(d) : this.TEXTS.empty; - }, getInvalidTagAttrs(d, p) { - return { "aria-invalid": !0, class: `${d.class || ""} ${this.settings.classNames.tagNotAllowed}`.trim(), title: p }; - }, hasMaxTags() { - return this.value.length >= this.settings.maxTags && this.TEXTS.exceed; - }, setReadonly(d, p) { - var w = this.settings; - document.activeElement.blur(), w[p || "readonly"] = d, this.DOM.scope[(d ? "set" : "remove") + "Attribute"](p || "readonly", !0), this.settings.userInput = !0, this.setContentEditable(!d); - }, setContentEditable(d) { - this.settings.userInput && (this.DOM.input.contentEditable = d, this.DOM.input.tabIndex = d ? 0 : -1); - }, setDisabled(d) { - this.setReadonly(d, "disabled"); - }, normalizeTags(d) { - var p = this.settings, w = p.whitelist, b = p.delimiters, D = p.mode, _ = p.tagTextProp, P = [], N = !!w && w[0] instanceof Object, V = Array.isArray(d), K = V && d[0].value, ce = (ee) => (ee + "").split(b).filter((ke) => ke).map((ke) => ({ [_]: this.trim(ke), value: this.trim(ke) })); - if (typeof d == "number" && (d = d.toString()), typeof d == "string") { - if (!d.trim()) - return []; - d = ce(d); - } else - V && (d = [].concat(...d.map((ee) => ee.value != null ? ee : ce(ee)))); - return N && !K && (d.forEach((ee) => { - var ke = P.map((be) => be.value), ie = this.dropdown.filterListItems.call(this, ee[_], { exact: !0 }); - this.settings.duplicates || (ie = ie.filter((be) => !ke.includes(be.value))); - var pe = ie.length > 1 ? this.getWhitelistItem(ee[_], _, ie) : ie[0]; - pe && pe instanceof Object ? P.push(pe) : D != "mix" && (ee.value == null && (ee.value = ee[_]), P.push(ee)); - }), P.length && (d = P)), d; - }, parseMixTags(d) { - var p = this.settings, w = p.mixTagsInterpolator, b = p.duplicates, D = p.transformTag, _ = p.enforceWhitelist, P = p.maxTags, N = p.tagTextProp, V = []; - d = d.split(w[0]).map((ce, ee) => { - var ke, ie, pe, be = ce.split(w[1]), me = be[0], ge = V.length == P; - try { - if (me == +me) - throw Error; - ie = JSON.parse(me); - } catch { - ie = this.normalizeTags(me)[0] || { value: me }; - } - if (D.call(this, ie), ge || !(be.length > 1) || _ && !this.isTagWhitelisted(ie.value) || !b && this.isTagDuplicate(ie.value)) { - if (ce) - return ee ? w[0] + ce : ce; - } else - ie[ke = ie[N] ? N : "value"] = this.trim(ie[ke]), pe = this.createTagElem(ie), V.push(ie), pe.classList.add(this.settings.classNames.tagNoAnimation), be[0] = pe.outerHTML, this.value.push(ie); - return be.join(""); - }).join(""), this.DOM.input.innerHTML = d, this.DOM.input.appendChild(document.createTextNode("")), this.DOM.input.normalize(); - var K = this.getTagElms(); - return K.forEach((ce, ee) => I(ce, V[ee])), this.update({ withoutChangeEvent: !0 }), F(K, this.state.hasFocus), d; - }, replaceTextWithNode(d, p) { - if (this.state.tag || p) { - p = p || this.state.tag.prefix + this.state.tag.value; - var w, b, D = this.state.selection || window.getSelection(), _ = D.anchorNode, P = this.state.tag.delimiters ? this.state.tag.delimiters.length : 0; - return _.splitText(D.anchorOffset - P), (w = _.nodeValue.lastIndexOf(p)) == -1 || (b = _.splitText(w), d && _.parentNode.replaceChild(d, b)), !0; - } - }, prepareNewTagNode(d, p) { - p = p || {}; - var w = this.settings, b = [], D = {}, _ = Object.assign({}, d, { value: d.value + "" }); - if (d = Object.assign({}, _), w.transformTag.call(this, d), d.__isValid = this.hasMaxTags() || this.validateTag(d), d.__isValid !== !0) { - if (p.skipInvalid) - return; - if (h(D, this.getInvalidTagAttrs(d, d.__isValid), { __preInvalidData: _ }), d.__isValid == this.TEXTS.duplicate && this.flashTag(this.getTagElmByValue(d.value)), !w.createInvalidTags) - return void b.push(d.value); - } - return "readonly" in d && (d.readonly ? D["aria-readonly"] = !0 : delete d.readonly), { tagElm: this.createTagElem(d, D), tagData: d, aggregatedInvalidInput: b }; - }, postProcessNewTagNode(d, p) { - var w = this.settings, b = p.__isValid; - b && b === !0 ? (this.value.push(p), this.trigger("add", { tag: d, index: this.value.length - 1, data: p })) : (this.trigger("invalid", { data: p, index: this.value.length, tag: d, message: b }), w.keepInvalidTags || setTimeout(() => this.removeTags(d, !0), 1e3)), this.dropdown.position(); - }, selectTag(d, p) { - if (!this.settings.enforceWhitelist || this.isTagWhitelisted(p.value)) { - this.state.actions.selectOption && setTimeout(() => this.setRangeAtStartEnd(!1, this.DOM.input)); - var w = this.getLastTag(); - return w ? this.replaceTag(w, p) : this.appendTag(d), this.value[0] = p, this.update(), this.trigger("add", { tag: d, data: p }), [d]; - } - }, addEmptyTag(d) { - var p = h({ value: "" }, d || {}), w = this.createTagElem(p); - I(w, p), this.appendTag(w), this.editTag(w, { skipValidation: !0 }), this.toggleFocusClass(!0); - }, addTags(d, p, w) { - var b = [], D = this.settings, _ = [], P = document.createDocumentFragment(); - if (!d || d.length == 0) - return b; - switch (d = this.normalizeTags(d), D.mode) { - case "mix": - return this.addMixTags(d); - case "select": - p = !1, this.removeAllTags(); - } - return this.DOM.input.removeAttribute("style"), d.forEach((N) => { - const V = this.prepareNewTagNode(N, { skipInvalid: w || D.skipInvalid }), K = V.tagElm; - if (N = V.tagData, _ = V.aggregatedInvalidInput, b.push(K), D.mode == "select") - return this.selectTag(K, N); - P.appendChild(K), this.postProcessNewTagNode(K, N); - }), this.appendTag(P), this.update(), d.length && p && (this.input.set.call(this, D.createInvalidTags ? "" : _.join(D._delimiters)), this.setRangeAtStartEnd(!1, this.DOM.input)), D.dropdown.enabled && this.dropdown.refilter(), b; - }, addMixTags(d) { - if ((d = this.normalizeTags(d))[0].prefix || this.state.tag) - return this.prefixedTextToTag(d[0]); - var p = document.createDocumentFragment(); - return d.forEach((w) => { - const b = this.prepareNewTagNode(w); - p.appendChild(b.tagElm), this.postProcessNewTagNode(tagElm, b.tagData); - }), this.appendMixTags(p), p; - }, appendMixTags(d) { - var p = !!this.state.selection; - p ? this.injectAtCaret(d) : (this.DOM.input.focus(), (p = this.setStateSelection()).range.setStart(this.DOM.input, p.range.endOffset), p.range.setEnd(this.DOM.input, p.range.endOffset), this.DOM.input.appendChild(d), this.updateValueByDOMTags(), this.update()); - }, prefixedTextToTag(d) { - var P; - var p, w, b = this.settings, D = (P = this.state.tag) == null ? void 0 : P.delimiters; - if (d.prefix = d.prefix || this.state.tag ? this.state.tag.prefix : (b.pattern.source || b.pattern)[0], w = this.prepareNewTagNode(d), p = w.tagElm, this.replaceTextWithNode(p) || this.DOM.input.appendChild(p), setTimeout(() => p.classList.add(this.settings.classNames.tagNoAnimation), 300), this.value.push(w.tagData), this.update(), !D) { - var _ = this.insertAfterTag(p) || p; - setTimeout(E, 0, _); - } - return this.state.tag = null, this.postProcessNewTagNode(p, w.tagData), p; - }, appendTag(d) { - var p = this.DOM, w = p.input; - p.scope.insertBefore(d, w); - }, createTagElem(d, p) { - d.__tagId = T(); - var w, b = h({}, d, s({ value: g(d.value + "") }, p)); - return function(D) { - for (var _, P = document.createNodeIterator(D, NodeFilter.SHOW_TEXT, null, !1); _ = P.nextNode(); ) - _.textContent.trim() || _.parentNode.removeChild(_); - }(w = this.parseTemplate("tag", [b, this])), I(w, d), w; - }, reCheckInvalidTags() { - var d = this.settings; - this.getTagElms(d.classNames.tagNotAllowed).forEach((p, w) => { - var b = I(p), D = this.hasMaxTags(), _ = this.validateTag(b), P = _ === !0 && !D; - if (d.mode == "select" && this.toggleScopeValidation(_), P) - return b = b.__preInvalidData ? b.__preInvalidData : { value: b.value }, this.replaceTag(p, b); - p.title = D || _; - }); - }, removeTags(d, p, w) { - var b, D = this.settings; - if (d = d && d instanceof HTMLElement ? [d] : d instanceof Array ? d : d ? [d] : [this.getLastTag()], b = d.reduce((_, P) => { - P && typeof P == "string" && (P = this.getTagElmByValue(P)); - var N = I(P); - return P && N && !N.readonly && _.push({ node: P, idx: this.getTagIdx(N), data: I(P, { __removed: !0 }) }), _; - }, []), w = typeof w == "number" ? w : this.CSSVars.tagHideTransition, D.mode == "select" && (w = 0, this.input.set.call(this)), b.length == 1 && D.mode != "select" && b[0].node.classList.contains(D.classNames.tagNotAllowed) && (p = !0), b.length) - return D.hooks.beforeRemoveTag(b, { tagify: this }).then(() => { - function _(P) { - P.node.parentNode && (P.node.parentNode.removeChild(P.node), p ? D.keepInvalidTags && this.trigger("remove", { tag: P.node, index: P.idx }) : (this.trigger("remove", { tag: P.node, index: P.idx, data: P.data }), this.dropdown.refilter(), this.dropdown.position(), this.DOM.input.normalize(), D.keepInvalidTags && this.reCheckInvalidTags())); - } - w && w > 10 && b.length == 1 ? (function(P) { - P.node.style.width = parseFloat(window.getComputedStyle(P.node).width) + "px", document.body.clientTop, P.node.classList.add(D.classNames.tagHide), setTimeout(_.bind(this), w, P); - }).call(this, b[0]) : b.forEach(_.bind(this)), p || (this.removeTagsFromValue(b.map((P) => P.node)), this.update(), D.mode == "select" && this.setContentEditable(!0)); - }).catch((_) => { - }); - }, removeTagsFromDOM() { - [].slice.call(this.getTagElms()).forEach((d) => d.parentNode.removeChild(d)); - }, removeTagsFromValue(d) { - (d = Array.isArray(d) ? d : [d]).forEach((p) => { - var w = I(p), b = this.getTagIdx(w); - b > -1 && this.value.splice(b, 1); - }); - }, removeAllTags(d) { - d = d || {}, this.value = [], this.settings.mode == "mix" ? this.DOM.input.innerHTML = "" : this.removeTagsFromDOM(), this.dropdown.refilter(), this.dropdown.position(), this.state.dropdown.visible && setTimeout(() => { - this.DOM.input.focus(); - }), this.settings.mode == "select" && (this.input.set.call(this), this.setContentEditable(!0)), this.update(d); - }, postUpdate() { - var b, D; - this.state.blockChangeEvent = !1; - var d = this.settings, p = d.classNames, w = d.mode == "mix" ? d.mixMode.integrated ? this.DOM.input.textContent : this.DOM.originalInput.value.trim() : this.value.length + this.input.raw.call(this).length; - this.toggleClass(p.hasMaxTags, this.value.length >= d.maxTags), this.toggleClass(p.hasNoTags, !this.value.length), this.toggleClass(p.empty, !w), d.mode == "select" && this.toggleScopeValidation((D = (b = this.value) == null ? void 0 : b[0]) == null ? void 0 : D.__isValid); - }, setOriginalInputValue(d) { - var p = this.DOM.originalInput; - this.settings.mixMode.integrated || (p.value = d, p.tagifyValue = p.value, this.setPersistedData(d, "value")); - }, update(d) { - clearTimeout(this.debouncedUpdateTimeout), this.debouncedUpdateTimeout = setTimeout((function() { - var p = this.getInputValue(); - this.setOriginalInputValue(p), this.settings.onChangeAfterBlur && (d || {}).withoutChangeEvent || this.state.blockChangeEvent || this.triggerChangeEvent(), this.postUpdate(); - }).bind(this), 100); - }, getInputValue() { - var d = this.getCleanValue(); - return this.settings.mode == "mix" ? this.getMixedTagsAsString(d) : d.length ? this.settings.originalInputValueFormat ? this.settings.originalInputValueFormat(d) : JSON.stringify(d) : ""; - }, getCleanValue(d) { - return o(d || this.value, this.dataProps); - }, getMixedTagsAsString() { - var d = "", p = this, w = this.settings, b = w.originalInputValueFormat || JSON.stringify, D = w.mixTagsInterpolator; - return function _(P) { - P.childNodes.forEach((N) => { - if (N.nodeType == 1) { - const V = I(N); - if (N.tagName == "BR" && (d += `\r -`), V && S.call(p, N)) { - if (V.__removed) - return; - d += D[0] + b(n(V, p.dataProps)) + D[1]; - } else - N.getAttribute("style") || ["B", "I", "U"].includes(N.tagName) ? d += N.textContent : N.tagName != "DIV" && N.tagName != "P" || (d += `\r -`, _(N)); - } else - d += N.textContent; - }); - }(this.DOM.input), d; - } }, le.prototype.removeTag = le.prototype.removeTags, le; - }); -})(du); -var Gh = du.exports; -const zh = /* @__PURE__ */ jh(Gh); -function qs(a) { - if (a === void 0) - throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); - return a; -} -function gu(a, e) { - a.prototype = Object.create(e.prototype), a.prototype.constructor = a, a.__proto__ = e; -} -/*! - * GSAP 3.12.5 - * https://gsap.com - * - * @license Copyright 2008-2024, GreenSock. All rights reserved. - * Subject to the terms at https://gsap.com/standard-license or for - * Club GSAP members, the agreement issued with that membership. - * @author: Jack Doyle, jack@greensock.com -*/ -var Qt = { - autoSleep: 120, - force3D: "auto", - nullTargetWarn: 1, - units: { - lineHeight: "" - } -}, Sr = { - duration: 0.5, - overwrite: !1, - delay: 0 -}, dl, xt, qe, ds = 1e8, We = 1 / ds, En = Math.PI * 2, qh = En / 4, Yh = 0, pu = Math.sqrt, Uh = Math.cos, Xh = Math.sin, ft = function(e) { - return typeof e == "string"; -}, Je = function(e) { - return typeof e == "function"; -}, si = function(e) { - return typeof e == "number"; -}, gl = function(e) { - return typeof e > "u"; -}, Ns = function(e) { - return typeof e == "object"; -}, Kt = function(e) { - return e !== !1; -}, pl = function() { - return typeof window < "u"; -}, ja = function(e) { - return Je(e) || ft(e); -}, fu = typeof ArrayBuffer == "function" && ArrayBuffer.isView || function() { -}, It = Array.isArray, xn = /(?:-?\.?\d|\.)+/gi, mu = /[-+=.]*\d+[.e\-+]*\d*[e\-+]*\d*/g, ar = /[-+=.]*\d+[.e-]*\d*[a-z%]*/g, Jo = /[-+=.]*\d+\.?\d*(?:e-|e\+)?\d*/gi, yu = /[+-]=-?[.\d]+/, bu = /[^,'"\[\]\s]+/gi, Zh = /^[+\-=e\s\d]*\d+[.\d]*([a-z]*|%)\s*$/i, Ye, Fs, In, fl, ts = {}, uo = {}, vu, wu = function(e) { - return (uo = Ui(e, ts)) && zt; -}, ml = function(e, t) { - return console.warn("Invalid property", e, "set to", t, "Missing plugin? gsap.registerPlugin()"); -}, Da = function(e, t) { - return !t && console.warn(e); -}, ku = function(e, t) { - return e && (ts[e] = t) && uo && (uo[e] = t) || ts; -}, Ta = function() { - return 0; -}, Jh = { - suppressEvents: !0, - isStart: !0, - kill: !1 -}, so = { - suppressEvents: !0, - kill: !1 -}, Qh = { - suppressEvents: !0 -}, yl = {}, Di = [], An = {}, Du, Yt = {}, Qo = {}, ic = 30, io = [], bl = "", vl = function(e) { - var t = e[0], s, i; - if (Ns(t) || Je(t) || (e = [e]), !(s = (t._gsap || {}).harness)) { - for (i = io.length; i-- && !io[i].targetTest(t); ) - ; - s = io[i]; - } - for (i = e.length; i--; ) - e[i] && (e[i]._gsap || (e[i]._gsap = new zu(e[i], s))) || e.splice(i, 1); - return e; -}, Ki = function(e) { - return e._gsap || vl(gs(e))[0]._gsap; -}, Tu = function(e, t, s) { - return (s = e[t]) && Je(s) ? e[t]() : gl(s) && e.getAttribute && e.getAttribute(t) || s; -}, Vt = function(e, t) { - return (e = e.split(",")).forEach(t) || e; -}, st = function(e) { - return Math.round(e * 1e5) / 1e5 || 0; -}, gt = function(e) { - return Math.round(e * 1e7) / 1e7 || 0; -}, gr = function(e, t) { - var s = t.charAt(0), i = parseFloat(t.substr(2)); - return e = parseFloat(e), s === "+" ? e + i : s === "-" ? e - i : s === "*" ? e * i : e / i; -}, e1 = function(e, t) { - for (var s = t.length, i = 0; e.indexOf(t[i]) < 0 && ++i < s; ) - ; - return i < s; -}, ho = function() { - var e = Di.length, t = Di.slice(0), s, i; - for (An = {}, Di.length = 0, s = 0; s < e; s++) - i = t[s], i && i._lazy && (i.render(i._lazy[0], i._lazy[1], !0)._lazy = 0); -}, Cu = function(e, t, s, i) { - Di.length && !xt && ho(), e.render(t, s, i || xt && t < 0 && (e._initted || e._startAt)), Di.length && !xt && ho(); -}, _u = function(e) { - var t = parseFloat(e); - return (t || t === 0) && (e + "").match(bu).length < 2 ? t : ft(e) ? e.trim() : e; -}, Su = function(e) { - return e; -}, fs = function(e, t) { - for (var s in t) - s in e || (e[s] = t[s]); - return e; -}, t1 = function(e) { - return function(t, s) { - for (var i in s) - i in t || i === "duration" && e || i === "ease" || (t[i] = s[i]); - }; -}, Ui = function(e, t) { - for (var s in t) - e[s] = t[s]; - return e; -}, rc = function a(e, t) { - for (var s in t) - s !== "__proto__" && s !== "constructor" && s !== "prototype" && (e[s] = Ns(t[s]) ? a(e[s] || (e[s] = {}), t[s]) : t[s]); - return e; -}, go = function(e, t) { - var s = {}, i; - for (i in e) - i in t || (s[i] = e[i]); - return s; -}, aa = function(e) { - var t = e.parent || Ye, s = e.keyframes ? t1(It(e.keyframes)) : fs; - if (Kt(e.inherit)) - for (; t; ) - s(e, t.vars.defaults), t = t.parent || t._dp; - return e; -}, s1 = function(e, t) { - for (var s = e.length, i = s === t.length; i && s-- && e[s] === t[s]; ) - ; - return s < 0; -}, Eu = function(e, t, s, i, r) { - s === void 0 && (s = "_first"), i === void 0 && (i = "_last"); - var o = e[i], n; - if (r) - for (n = t[r]; o && o[r] > n; ) - o = o._prev; - return o ? (t._next = o._next, o._next = t) : (t._next = e[s], e[s] = t), t._next ? t._next._prev = t : e[i] = t, t._prev = o, t.parent = t._dp = e, t; -}, Oo = function(e, t, s, i) { - s === void 0 && (s = "_first"), i === void 0 && (i = "_last"); - var r = t._prev, o = t._next; - r ? r._next = o : e[s] === t && (e[s] = o), o ? o._prev = r : e[i] === t && (e[i] = r), t._next = t._prev = t.parent = null; -}, Ci = function(e, t) { - e.parent && (!t || e.parent.autoRemoveChildren) && e.parent.remove && e.parent.remove(e), e._act = 0; -}, Vi = function(e, t) { - if (e && (!t || t._end > e._dur || t._start < 0)) - for (var s = e; s; ) - s._dirty = 1, s = s.parent; - return e; -}, i1 = function(e) { - for (var t = e.parent; t && t.parent; ) - t._dirty = 1, t.totalDuration(), t = t.parent; - return e; -}, Pn = function(e, t, s, i) { - return e._startAt && (xt ? e._startAt.revert(so) : e.vars.immediateRender && !e.vars.autoRevert || e._startAt.render(t, !0, i)); -}, r1 = function a(e) { - return !e || e._ts && a(e.parent); -}, ac = function(e) { - return e._repeat ? Er(e._tTime, e = e.duration() + e._rDelay) * e : 0; -}, Er = function(e, t) { - var s = Math.floor(e /= t); - return e && s === e ? s - 1 : s; -}, po = function(e, t) { - return (e - t._start) * t._ts + (t._ts >= 0 ? 0 : t._dirty ? t.totalDuration() : t._tDur); -}, Fo = function(e) { - return e._end = gt(e._start + (e._tDur / Math.abs(e._ts || e._rts || We) || 0)); -}, Lo = function(e, t) { - var s = e._dp; - return s && s.smoothChildTiming && e._ts && (e._start = gt(s._time - (e._ts > 0 ? t / e._ts : ((e._dirty ? e.totalDuration() : e._tDur) - t) / -e._ts)), Fo(e), s._dirty || Vi(s, e)), e; -}, xu = function(e, t) { - var s; - if ((t._time || !t._dur && t._initted || t._start < e._time && (t._dur || !t.add)) && (s = po(e.rawTime(), t), (!t._dur || Ra(0, t.totalDuration(), s) - t._tTime > We) && t.render(s, !0)), Vi(e, t)._dp && e._initted && e._time >= e._dur && e._ts) { - if (e._dur < e.duration()) - for (s = e; s._dp; ) - s.rawTime() >= 0 && s.totalTime(s._tTime), s = s._dp; - e._zTime = -We; - } -}, Ls = function(e, t, s, i) { - return t.parent && Ci(t), t._start = gt((si(s) ? s : s || e !== Ye ? ns(e, s, t) : e._time) + t._delay), t._end = gt(t._start + (t.totalDuration() / Math.abs(t.timeScale()) || 0)), Eu(e, t, "_first", "_last", e._sort ? "_start" : 0), Mn(t) || (e._recent = t), i || xu(e, t), e._ts < 0 && Lo(e, e._tTime), e; -}, Iu = function(e, t) { - return (ts.ScrollTrigger || ml("scrollTrigger", t)) && ts.ScrollTrigger.create(t, e); -}, Au = function(e, t, s, i, r) { - if (kl(e, t, r), !e._initted) - return 1; - if (!s && e._pt && !xt && (e._dur && e.vars.lazy !== !1 || !e._dur && e.vars.lazy) && Du !== Ut.frame) - return Di.push(e), e._lazy = [r, i], 1; -}, a1 = function a(e) { - var t = e.parent; - return t && t._ts && t._initted && !t._lock && (t.rawTime() < 0 || a(t)); -}, Mn = function(e) { - var t = e.data; - return t === "isFromStart" || t === "isStart"; -}, o1 = function(e, t, s, i) { - var r = e.ratio, o = t < 0 || !t && (!e._start && a1(e) && !(!e._initted && Mn(e)) || (e._ts < 0 || e._dp._ts < 0) && !Mn(e)) ? 0 : 1, n = e._rDelay, l = 0, c, u, g; - if (n && e._repeat && (l = Ra(0, e._tDur, t), u = Er(l, n), e._yoyo && u & 1 && (o = 1 - o), u !== Er(e._tTime, n) && (r = 1 - o, e.vars.repeatRefresh && e._initted && e.invalidate())), o !== r || xt || i || e._zTime === We || !t && e._zTime) { - if (!e._initted && Au(e, t, i, s, l)) - return; - for (g = e._zTime, e._zTime = t || (s ? We : 0), s || (s = t && !g), e.ratio = o, e._from && (o = 1 - o), e._time = 0, e._tTime = l, c = e._pt; c; ) - c.r(o, c.d), c = c._next; - t < 0 && Pn(e, t, s, !0), e._onUpdate && !s && Jt(e, "onUpdate"), l && e._repeat && !s && e.parent && Jt(e, "onRepeat"), (t >= e._tDur || t < 0) && e.ratio === o && (o && Ci(e, 1), !s && !xt && (Jt(e, o ? "onComplete" : "onReverseComplete", !0), e._prom && e._prom())); - } else - e._zTime || (e._zTime = t); -}, n1 = function(e, t, s) { - var i; - if (s > t) - for (i = e._first; i && i._start <= s; ) { - if (i.data === "isPause" && i._start > t) - return i; - i = i._next; - } - else - for (i = e._last; i && i._start >= s; ) { - if (i.data === "isPause" && i._start < t) - return i; - i = i._prev; - } -}, xr = function(e, t, s, i) { - var r = e._repeat, o = gt(t) || 0, n = e._tTime / e._tDur; - return n && !i && (e._time *= o / e._dur), e._dur = o, e._tDur = r ? r < 0 ? 1e10 : gt(o * (r + 1) + e._rDelay * r) : o, n > 0 && !i && Lo(e, e._tTime = e._tDur * n), e.parent && Fo(e), s || Vi(e.parent, e), e; -}, oc = function(e) { - return e instanceof Ot ? Vi(e) : xr(e, e._dur); -}, l1 = { - _start: 0, - endTime: Ta, - totalDuration: Ta -}, ns = function a(e, t, s) { - var i = e.labels, r = e._recent || l1, o = e.duration() >= ds ? r.endTime(!1) : e._dur, n, l, c; - return ft(t) && (isNaN(t) || t in i) ? (l = t.charAt(0), c = t.substr(-1) === "%", n = t.indexOf("="), l === "<" || l === ">" ? (n >= 0 && (t = t.replace(/=/, "")), (l === "<" ? r._start : r.endTime(r._repeat >= 0)) + (parseFloat(t.substr(1)) || 0) * (c ? (n < 0 ? r : s).totalDuration() / 100 : 1)) : n < 0 ? (t in i || (i[t] = o), i[t]) : (l = parseFloat(t.charAt(n - 1) + t.substr(n + 1)), c && s && (l = l / 100 * (It(s) ? s[0] : s).totalDuration()), n > 1 ? a(e, t.substr(0, n - 1), s) + l : o + l)) : t == null ? o : +t; -}, oa = function(e, t, s) { - var i = si(t[1]), r = (i ? 2 : 1) + (e < 2 ? 0 : 1), o = t[r], n, l; - if (i && (o.duration = t[1]), o.parent = s, e) { - for (n = o, l = s; l && !("immediateRender" in n); ) - n = l.vars.defaults || {}, l = Kt(l.vars.inherit) && l.parent; - o.immediateRender = Kt(n.immediateRender), e < 2 ? o.runBackwards = 1 : o.startAt = t[r - 1]; - } - return new at(t[0], o, t[r + 1]); -}, xi = function(e, t) { - return e || e === 0 ? t(e) : t; -}, Ra = function(e, t, s) { - return s < e ? e : s > t ? t : s; -}, St = function(e, t) { - return !ft(e) || !(t = Zh.exec(e)) ? "" : t[1]; -}, c1 = function(e, t, s) { - return xi(s, function(i) { - return Ra(e, t, i); - }); -}, On = [].slice, Pu = function(e, t) { - return e && Ns(e) && "length" in e && (!t && !e.length || e.length - 1 in e && Ns(e[0])) && !e.nodeType && e !== Fs; -}, u1 = function(e, t, s) { - return s === void 0 && (s = []), e.forEach(function(i) { - var r; - return ft(i) && !t || Pu(i, 1) ? (r = s).push.apply(r, gs(i)) : s.push(i); - }) || s; -}, gs = function(e, t, s) { - return qe && !t && qe.selector ? qe.selector(e) : ft(e) && !s && (In || !Ir()) ? On.call((t || fl).querySelectorAll(e), 0) : It(e) ? u1(e, s) : Pu(e) ? On.call(e, 0) : e ? [e] : []; -}, Fn = function(e) { - return e = gs(e)[0] || Da("Invalid scope") || {}, function(t) { - var s = e.current || e.nativeElement || e; - return gs(t, s.querySelectorAll ? s : s === e ? Da("Invalid scope") || fl.createElement("div") : e); - }; -}, Mu = function(e) { - return e.sort(function() { - return 0.5 - Math.random(); - }); -}, Ou = function(e) { - if (Je(e)) - return e; - var t = Ns(e) ? e : { - each: e - }, s = ji(t.ease), i = t.from || 0, r = parseFloat(t.base) || 0, o = {}, n = i > 0 && i < 1, l = isNaN(i) || n, c = t.axis, u = i, g = i; - return ft(i) ? u = g = { - center: 0.5, - edges: 0.5, - end: 1 - }[i] || 0 : !n && l && (u = i[0], g = i[1]), function(f, h, m) { - var y = (m || t).length, k = o[y], T, S, C, I, E, F, O, R, L; - if (!k) { - if (L = t.grid === "auto" ? 0 : (t.grid || [1, ds])[1], !L) { - for (O = -ds; O < (O = m[L++].getBoundingClientRect().left) && L < y; ) - ; - L < y && L--; - } - for (k = o[y] = [], T = l ? Math.min(L, y) * u - 0.5 : i % L, S = L === ds ? 0 : l ? y * g / L - 0.5 : i / L | 0, O = 0, R = ds, F = 0; F < y; F++) - C = F % L - T, I = S - (F / L | 0), k[F] = E = c ? Math.abs(c === "y" ? I : C) : pu(C * C + I * I), E > O && (O = E), E < R && (R = E); - i === "random" && Mu(k), k.max = O - R, k.min = R, k.v = y = (parseFloat(t.amount) || parseFloat(t.each) * (L > y ? y - 1 : c ? c === "y" ? y / L : L : Math.max(L, y / L)) || 0) * (i === "edges" ? -1 : 1), k.b = y < 0 ? r - y : r, k.u = St(t.amount || t.each) || 0, s = s && y < 0 ? Vu(s) : s; - } - return y = (k[f] - k.min) / k.max || 0, gt(k.b + (s ? s(y) : y) * k.v) + k.u; - }; -}, Ln = function(e) { - var t = Math.pow(10, ((e + "").split(".")[1] || "").length); - return function(s) { - var i = gt(Math.round(parseFloat(s) / e) * e * t); - return (i - i % 1) / t + (si(s) ? 0 : St(s)); - }; -}, Fu = function(e, t) { - var s = It(e), i, r; - return !s && Ns(e) && (i = s = e.radius || ds, e.values ? (e = gs(e.values), (r = !si(e[0])) && (i *= i)) : e = Ln(e.increment)), xi(t, s ? Je(e) ? function(o) { - return r = e(o), Math.abs(r - o) <= i ? r : o; - } : function(o) { - for (var n = parseFloat(r ? o.x : o), l = parseFloat(r ? o.y : 0), c = ds, u = 0, g = e.length, f, h; g--; ) - r ? (f = e[g].x - n, h = e[g].y - l, f = f * f + h * h) : f = Math.abs(e[g] - n), f < c && (c = f, u = g); - return u = !i || c <= i ? e[u] : o, r || u === o || si(o) ? u : u + St(o); - } : Ln(e)); -}, Lu = function(e, t, s, i) { - return xi(It(e) ? !t : s === !0 ? !!(s = 0) : !i, function() { - return It(e) ? e[~~(Math.random() * e.length)] : (s = s || 1e-5) && (i = s < 1 ? Math.pow(10, (s + "").length - 2) : 1) && Math.floor(Math.round((e - s / 2 + Math.random() * (t - e + s * 0.99)) / s) * s * i) / i; - }); -}, h1 = function() { - for (var e = arguments.length, t = new Array(e), s = 0; s < e; s++) - t[s] = arguments[s]; - return function(i) { - return t.reduce(function(r, o) { - return o(r); - }, i); - }; -}, d1 = function(e, t) { - return function(s) { - return e(parseFloat(s)) + (t || St(s)); - }; -}, g1 = function(e, t, s) { - return $u(e, t, 0, 1, s); -}, Ru = function(e, t, s) { - return xi(s, function(i) { - return e[~~t(i)]; - }); -}, p1 = function a(e, t, s) { - var i = t - e; - return It(e) ? Ru(e, a(0, e.length), t) : xi(s, function(r) { - return (i + (r - e) % i) % i + e; - }); -}, f1 = function a(e, t, s) { - var i = t - e, r = i * 2; - return It(e) ? Ru(e, a(0, e.length - 1), t) : xi(s, function(o) { - return o = (r + (o - e) % r) % r || 0, e + (o > i ? r - o : o); - }); -}, Ca = function(e) { - for (var t = 0, s = "", i, r, o, n; ~(i = e.indexOf("random(", t)); ) - o = e.indexOf(")", i), n = e.charAt(i + 7) === "[", r = e.substr(i + 7, o - i - 7).match(n ? bu : xn), s += e.substr(t, i - t) + Lu(n ? r : +r[0], n ? 0 : +r[1], +r[2] || 1e-5), t = o + 1; - return s + e.substr(t, e.length - t); -}, $u = function(e, t, s, i, r) { - var o = t - e, n = i - s; - return xi(r, function(l) { - return s + ((l - e) / o * n || 0); - }); -}, m1 = function a(e, t, s, i) { - var r = isNaN(e + t) ? 0 : function(h) { - return (1 - h) * e + h * t; - }; - if (!r) { - var o = ft(e), n = {}, l, c, u, g, f; - if (s === !0 && (i = 1) && (s = null), o) - e = { - p: e - }, t = { - p: t - }; - else if (It(e) && !It(t)) { - for (u = [], g = e.length, f = g - 2, c = 1; c < g; c++) - u.push(a(e[c - 1], e[c])); - g--, r = function(m) { - m *= g; - var y = Math.min(f, ~~m); - return u[y](m - y); - }, s = t; - } else - i || (e = Ui(It(e) ? [] : {}, e)); - if (!u) { - for (l in t) - wl.call(n, e, l, "get", t[l]); - r = function(m) { - return Cl(m, n) || (o ? e.p : e); - }; - } - } - return xi(s, r); -}, nc = function(e, t, s) { - var i = e.labels, r = ds, o, n, l; - for (o in i) - n = i[o] - t, n < 0 == !!s && n && r > (n = Math.abs(n)) && (l = o, r = n); - return l; -}, Jt = function(e, t, s) { - var i = e.vars, r = i[t], o = qe, n = e._ctx, l, c, u; - if (r) - return l = i[t + "Params"], c = i.callbackScope || e, s && Di.length && ho(), n && (qe = n), u = l ? r.apply(c, l) : r.call(c), qe = o, u; -}, Xr = function(e) { - return Ci(e), e.scrollTrigger && e.scrollTrigger.kill(!!xt), e.progress() < 1 && Jt(e, "onInterrupt"), e; -}, or, Nu = [], Bu = function(e) { - if (e) - if (e = !e.name && e.default || e, pl() || e.headless) { - var t = e.name, s = Je(e), i = t && !s && e.init ? function() { - this._props = []; - } : e, r = { - init: Ta, - render: Cl, - add: wl, - kill: M1, - modifier: P1, - rawVars: 0 - }, o = { - targetTest: 0, - get: 0, - getSetter: Tl, - aliases: {}, - register: 0 - }; - if (Ir(), e !== i) { - if (Yt[t]) - return; - fs(i, fs(go(e, r), o)), Ui(i.prototype, Ui(r, go(e, o))), Yt[i.prop = t] = i, e.targetTest && (io.push(i), yl[t] = 1), t = (t === "css" ? "CSS" : t.charAt(0).toUpperCase() + t.substr(1)) + "Plugin"; - } - ku(t, i), e.register && e.register(zt, i, jt); - } else - Nu.push(e); -}, $e = 255, Zr = { - aqua: [0, $e, $e], - lime: [0, $e, 0], - silver: [192, 192, 192], - black: [0, 0, 0], - maroon: [128, 0, 0], - teal: [0, 128, 128], - blue: [0, 0, $e], - navy: [0, 0, 128], - white: [$e, $e, $e], - olive: [128, 128, 0], - yellow: [$e, $e, 0], - orange: [$e, 165, 0], - gray: [128, 128, 128], - purple: [128, 0, 128], - green: [0, 128, 0], - red: [$e, 0, 0], - pink: [$e, 192, 203], - cyan: [0, $e, $e], - transparent: [$e, $e, $e, 0] -}, en = function(e, t, s) { - return e += e < 0 ? 1 : e > 1 ? -1 : 0, (e * 6 < 1 ? t + (s - t) * e * 6 : e < 0.5 ? s : e * 3 < 2 ? t + (s - t) * (2 / 3 - e) * 6 : t) * $e + 0.5 | 0; -}, Hu = function(e, t, s) { - var i = e ? si(e) ? [e >> 16, e >> 8 & $e, e & $e] : 0 : Zr.black, r, o, n, l, c, u, g, f, h, m; - if (!i) { - if (e.substr(-1) === "," && (e = e.substr(0, e.length - 1)), Zr[e]) - i = Zr[e]; - else if (e.charAt(0) === "#") { - if (e.length < 6 && (r = e.charAt(1), o = e.charAt(2), n = e.charAt(3), e = "#" + r + r + o + o + n + n + (e.length === 5 ? e.charAt(4) + e.charAt(4) : "")), e.length === 9) - return i = parseInt(e.substr(1, 6), 16), [i >> 16, i >> 8 & $e, i & $e, parseInt(e.substr(7), 16) / 255]; - e = parseInt(e.substr(1), 16), i = [e >> 16, e >> 8 & $e, e & $e]; - } else if (e.substr(0, 3) === "hsl") { - if (i = m = e.match(xn), !t) - l = +i[0] % 360 / 360, c = +i[1] / 100, u = +i[2] / 100, o = u <= 0.5 ? u * (c + 1) : u + c - u * c, r = u * 2 - o, i.length > 3 && (i[3] *= 1), i[0] = en(l + 1 / 3, r, o), i[1] = en(l, r, o), i[2] = en(l - 1 / 3, r, o); - else if (~e.indexOf("=")) - return i = e.match(mu), s && i.length < 4 && (i[3] = 1), i; - } else - i = e.match(xn) || Zr.transparent; - i = i.map(Number); - } - return t && !m && (r = i[0] / $e, o = i[1] / $e, n = i[2] / $e, g = Math.max(r, o, n), f = Math.min(r, o, n), u = (g + f) / 2, g === f ? l = c = 0 : (h = g - f, c = u > 0.5 ? h / (2 - g - f) : h / (g + f), l = g === r ? (o - n) / h + (o < n ? 6 : 0) : g === o ? (n - r) / h + 2 : (r - o) / h + 4, l *= 60), i[0] = ~~(l + 0.5), i[1] = ~~(c * 100 + 0.5), i[2] = ~~(u * 100 + 0.5)), s && i.length < 4 && (i[3] = 1), i; -}, Wu = function(e) { - var t = [], s = [], i = -1; - return e.split(Ti).forEach(function(r) { - var o = r.match(ar) || []; - t.push.apply(t, o), s.push(i += o.length + 1); - }), t.c = s, t; -}, lc = function(e, t, s) { - var i = "", r = (e + i).match(Ti), o = t ? "hsla(" : "rgba(", n = 0, l, c, u, g; - if (!r) - return e; - if (r = r.map(function(f) { - return (f = Hu(f, t, 1)) && o + (t ? f[0] + "," + f[1] + "%," + f[2] + "%," + f[3] : f.join(",")) + ")"; - }), s && (u = Wu(e), l = s.c, l.join(i) !== u.c.join(i))) - for (c = e.replace(Ti, "1").split(ar), g = c.length - 1; n < g; n++) - i += c[n] + (~l.indexOf(n) ? r.shift() || o + "0,0,0,0)" : (u.length ? u : r.length ? r : s).shift()); - if (!c) - for (c = e.split(Ti), g = c.length - 1; n < g; n++) - i += c[n] + r[n]; - return i + c[g]; -}, Ti = function() { - var a = "(?:\\b(?:(?:rgb|rgba|hsl|hsla)\\(.+?\\))|\\B#(?:[0-9a-f]{3,4}){1,2}\\b", e; - for (e in Zr) - a += "|" + e + "\\b"; - return new RegExp(a + ")", "gi"); -}(), y1 = /hsl[a]?\(/, Ku = function(e) { - var t = e.join(" "), s; - if (Ti.lastIndex = 0, Ti.test(t)) - return s = y1.test(t), e[1] = lc(e[1], s), e[0] = lc(e[0], s, Wu(e[1])), !0; -}, _a, Ut = function() { - var a = Date.now, e = 500, t = 33, s = a(), i = s, r = 1e3 / 240, o = r, n = [], l, c, u, g, f, h, m = function y(k) { - var T = a() - i, S = k === !0, C, I, E, F; - if ((T > e || T < 0) && (s += T - t), i += T, E = i - s, C = E - o, (C > 0 || S) && (F = ++g.frame, f = E - g.time * 1e3, g.time = E = E / 1e3, o += C + (C >= r ? 4 : r - C), I = 1), S || (l = c(y)), I) - for (h = 0; h < n.length; h++) - n[h](E, f, F, k); - }; - return g = { - time: 0, - frame: 0, - tick: function() { - m(!0); - }, - deltaRatio: function(k) { - return f / (1e3 / (k || 60)); - }, - wake: function() { - vu && (!In && pl() && (Fs = In = window, fl = Fs.document || {}, ts.gsap = zt, (Fs.gsapVersions || (Fs.gsapVersions = [])).push(zt.version), wu(uo || Fs.GreenSockGlobals || !Fs.gsap && Fs || {}), Nu.forEach(Bu)), u = typeof requestAnimationFrame < "u" && requestAnimationFrame, l && g.sleep(), c = u || function(k) { - return setTimeout(k, o - g.time * 1e3 + 1 | 0); - }, _a = 1, m(2)); - }, - sleep: function() { - (u ? cancelAnimationFrame : clearTimeout)(l), _a = 0, c = Ta; - }, - lagSmoothing: function(k, T) { - e = k || 1 / 0, t = Math.min(T || 33, e); - }, - fps: function(k) { - r = 1e3 / (k || 240), o = g.time * 1e3 + r; - }, - add: function(k, T, S) { - var C = T ? function(I, E, F, O) { - k(I, E, F, O), g.remove(C); - } : k; - return g.remove(k), n[S ? "unshift" : "push"](C), Ir(), C; - }, - remove: function(k, T) { - ~(T = n.indexOf(k)) && n.splice(T, 1) && h >= T && h--; - }, - _listeners: n - }, g; -}(), Ir = function() { - return !_a && Ut.wake(); -}, _e = {}, b1 = /^[\d.\-M][\d.\-,\s]/, v1 = /["']/g, w1 = function(e) { - for (var t = {}, s = e.substr(1, e.length - 3).split(":"), i = s[0], r = 1, o = s.length, n, l, c; r < o; r++) - l = s[r], n = r !== o - 1 ? l.lastIndexOf(",") : l.length, c = l.substr(0, n), t[i] = isNaN(c) ? c.replace(v1, "").trim() : +c, i = l.substr(n + 1).trim(); - return t; -}, k1 = function(e) { - var t = e.indexOf("(") + 1, s = e.indexOf(")"), i = e.indexOf("(", t); - return e.substring(t, ~i && i < s ? e.indexOf(")", s + 1) : s); -}, D1 = function(e) { - var t = (e + "").split("("), s = _e[t[0]]; - return s && t.length > 1 && s.config ? s.config.apply(null, ~e.indexOf("{") ? [w1(t[1])] : k1(e).split(",").map(_u)) : _e._CE && b1.test(e) ? _e._CE("", e) : s; -}, Vu = function(e) { - return function(t) { - return 1 - e(1 - t); - }; -}, ju = function a(e, t) { - for (var s = e._first, i; s; ) - s instanceof Ot ? a(s, t) : s.vars.yoyoEase && (!s._yoyo || !s._repeat) && s._yoyo !== t && (s.timeline ? a(s.timeline, t) : (i = s._ease, s._ease = s._yEase, s._yEase = i, s._yoyo = t)), s = s._next; -}, ji = function(e, t) { - return e && (Je(e) ? e : _e[e] || D1(e)) || t; -}, Ji = function(e, t, s, i) { - s === void 0 && (s = function(l) { - return 1 - t(1 - l); - }), i === void 0 && (i = function(l) { - return l < 0.5 ? t(l * 2) / 2 : 1 - t((1 - l) * 2) / 2; - }); - var r = { - easeIn: t, - easeOut: s, - easeInOut: i - }, o; - return Vt(e, function(n) { - _e[n] = ts[n] = r, _e[o = n.toLowerCase()] = s; - for (var l in r) - _e[o + (l === "easeIn" ? ".in" : l === "easeOut" ? ".out" : ".inOut")] = _e[n + "." + l] = r[l]; - }), r; -}, Gu = function(e) { - return function(t) { - return t < 0.5 ? (1 - e(1 - t * 2)) / 2 : 0.5 + e((t - 0.5) * 2) / 2; - }; -}, tn = function a(e, t, s) { - var i = t >= 1 ? t : 1, r = (s || (e ? 0.3 : 0.45)) / (t < 1 ? t : 1), o = r / En * (Math.asin(1 / i) || 0), n = function(u) { - return u === 1 ? 1 : i * Math.pow(2, -10 * u) * Xh((u - o) * r) + 1; - }, l = e === "out" ? n : e === "in" ? function(c) { - return 1 - n(1 - c); - } : Gu(n); - return r = En / r, l.config = function(c, u) { - return a(e, c, u); - }, l; -}, sn = function a(e, t) { - t === void 0 && (t = 1.70158); - var s = function(o) { - return o ? --o * o * ((t + 1) * o + t) + 1 : 0; - }, i = e === "out" ? s : e === "in" ? function(r) { - return 1 - s(1 - r); - } : Gu(s); - return i.config = function(r) { - return a(e, r); - }, i; -}; -Vt("Linear,Quad,Cubic,Quart,Quint,Strong", function(a, e) { - var t = e < 5 ? e + 1 : e; - Ji(a + ",Power" + (t - 1), e ? function(s) { - return Math.pow(s, t); - } : function(s) { - return s; - }, function(s) { - return 1 - Math.pow(1 - s, t); - }, function(s) { - return s < 0.5 ? Math.pow(s * 2, t) / 2 : 1 - Math.pow((1 - s) * 2, t) / 2; - }); -}); -_e.Linear.easeNone = _e.none = _e.Linear.easeIn; -Ji("Elastic", tn("in"), tn("out"), tn()); -(function(a, e) { - var t = 1 / e, s = 2 * t, i = 2.5 * t, r = function(n) { - return n < t ? a * n * n : n < s ? a * Math.pow(n - 1.5 / e, 2) + 0.75 : n < i ? a * (n -= 2.25 / e) * n + 0.9375 : a * Math.pow(n - 2.625 / e, 2) + 0.984375; - }; - Ji("Bounce", function(o) { - return 1 - r(1 - o); - }, r); -})(7.5625, 2.75); -Ji("Expo", function(a) { - return a ? Math.pow(2, 10 * (a - 1)) : 0; -}); -Ji("Circ", function(a) { - return -(pu(1 - a * a) - 1); -}); -Ji("Sine", function(a) { - return a === 1 ? 1 : -Uh(a * qh) + 1; -}); -Ji("Back", sn("in"), sn("out"), sn()); -_e.SteppedEase = _e.steps = ts.SteppedEase = { - config: function(e, t) { - e === void 0 && (e = 1); - var s = 1 / e, i = e + (t ? 0 : 1), r = t ? 1 : 0, o = 1 - We; - return function(n) { - return ((i * Ra(0, o, n) | 0) + r) * s; - }; - } -}; -Sr.ease = _e["quad.out"]; -Vt("onComplete,onUpdate,onStart,onRepeat,onReverseComplete,onInterrupt", function(a) { - return bl += a + "," + a + "Params,"; -}); -var zu = function(e, t) { - this.id = Yh++, e._gsap = this, this.target = e, this.harness = t, this.get = t ? t.get : Tu, this.set = t ? t.getSetter : Tl; -}, Sa = /* @__PURE__ */ function() { - function a(t) { - this.vars = t, this._delay = +t.delay || 0, (this._repeat = t.repeat === 1 / 0 ? -2 : t.repeat || 0) && (this._rDelay = t.repeatDelay || 0, this._yoyo = !!t.yoyo || !!t.yoyoEase), this._ts = 1, xr(this, +t.duration, 1, 1), this.data = t.data, qe && (this._ctx = qe, qe.data.push(this)), _a || Ut.wake(); - } - var e = a.prototype; - return e.delay = function(s) { - return s || s === 0 ? (this.parent && this.parent.smoothChildTiming && this.startTime(this._start + s - this._delay), this._delay = s, this) : this._delay; - }, e.duration = function(s) { - return arguments.length ? this.totalDuration(this._repeat > 0 ? s + (s + this._rDelay) * this._repeat : s) : this.totalDuration() && this._dur; - }, e.totalDuration = function(s) { - return arguments.length ? (this._dirty = 0, xr(this, this._repeat < 0 ? s : (s - this._repeat * this._rDelay) / (this._repeat + 1))) : this._tDur; - }, e.totalTime = function(s, i) { - if (Ir(), !arguments.length) - return this._tTime; - var r = this._dp; - if (r && r.smoothChildTiming && this._ts) { - for (Lo(this, s), !r._dp || r.parent || xu(r, this); r && r.parent; ) - r.parent._time !== r._start + (r._ts >= 0 ? r._tTime / r._ts : (r.totalDuration() - r._tTime) / -r._ts) && r.totalTime(r._tTime, !0), r = r.parent; - !this.parent && this._dp.autoRemoveChildren && (this._ts > 0 && s < this._tDur || this._ts < 0 && s > 0 || !this._tDur && !s) && Ls(this._dp, this, this._start - this._delay); - } - return (this._tTime !== s || !this._dur && !i || this._initted && Math.abs(this._zTime) === We || !s && !this._initted && (this.add || this._ptLookup)) && (this._ts || (this._pTime = s), Cu(this, s, i)), this; - }, e.time = function(s, i) { - return arguments.length ? this.totalTime(Math.min(this.totalDuration(), s + ac(this)) % (this._dur + this._rDelay) || (s ? this._dur : 0), i) : this._time; - }, e.totalProgress = function(s, i) { - return arguments.length ? this.totalTime(this.totalDuration() * s, i) : this.totalDuration() ? Math.min(1, this._tTime / this._tDur) : this.rawTime() > 0 ? 1 : 0; - }, e.progress = function(s, i) { - return arguments.length ? this.totalTime(this.duration() * (this._yoyo && !(this.iteration() & 1) ? 1 - s : s) + ac(this), i) : this.duration() ? Math.min(1, this._time / this._dur) : this.rawTime() > 0 ? 1 : 0; - }, e.iteration = function(s, i) { - var r = this.duration() + this._rDelay; - return arguments.length ? this.totalTime(this._time + (s - 1) * r, i) : this._repeat ? Er(this._tTime, r) + 1 : 1; - }, e.timeScale = function(s, i) { - if (!arguments.length) - return this._rts === -We ? 0 : this._rts; - if (this._rts === s) - return this; - var r = this.parent && this._ts ? po(this.parent._time, this) : this._tTime; - return this._rts = +s || 0, this._ts = this._ps || s === -We ? 0 : this._rts, this.totalTime(Ra(-Math.abs(this._delay), this._tDur, r), i !== !1), Fo(this), i1(this); - }, e.paused = function(s) { - return arguments.length ? (this._ps !== s && (this._ps = s, s ? (this._pTime = this._tTime || Math.max(-this._delay, this.rawTime()), this._ts = this._act = 0) : (Ir(), this._ts = this._rts, this.totalTime(this.parent && !this.parent.smoothChildTiming ? this.rawTime() : this._tTime || this._pTime, this.progress() === 1 && Math.abs(this._zTime) !== We && (this._tTime -= We)))), this) : this._ps; - }, e.startTime = function(s) { - if (arguments.length) { - this._start = s; - var i = this.parent || this._dp; - return i && (i._sort || !this.parent) && Ls(i, this, s - this._delay), this; - } - return this._start; - }, e.endTime = function(s) { - return this._start + (Kt(s) ? this.totalDuration() : this.duration()) / Math.abs(this._ts || 1); - }, e.rawTime = function(s) { - var i = this.parent || this._dp; - return i ? s && (!this._ts || this._repeat && this._time && this.totalProgress() < 1) ? this._tTime % (this._dur + this._rDelay) : this._ts ? po(i.rawTime(s), this) : this._tTime : this._tTime; - }, e.revert = function(s) { - s === void 0 && (s = Qh); - var i = xt; - return xt = s, (this._initted || this._startAt) && (this.timeline && this.timeline.revert(s), this.totalTime(-0.01, s.suppressEvents)), this.data !== "nested" && s.kill !== !1 && this.kill(), xt = i, this; - }, e.globalTime = function(s) { - for (var i = this, r = arguments.length ? s : i.rawTime(); i; ) - r = i._start + r / (Math.abs(i._ts) || 1), i = i._dp; - return !this.parent && this._sat ? this._sat.globalTime(s) : r; - }, e.repeat = function(s) { - return arguments.length ? (this._repeat = s === 1 / 0 ? -2 : s, oc(this)) : this._repeat === -2 ? 1 / 0 : this._repeat; - }, e.repeatDelay = function(s) { - if (arguments.length) { - var i = this._time; - return this._rDelay = s, oc(this), i ? this.time(i) : this; - } - return this._rDelay; - }, e.yoyo = function(s) { - return arguments.length ? (this._yoyo = s, this) : this._yoyo; - }, e.seek = function(s, i) { - return this.totalTime(ns(this, s), Kt(i)); - }, e.restart = function(s, i) { - return this.play().totalTime(s ? -this._delay : 0, Kt(i)); - }, e.play = function(s, i) { - return s != null && this.seek(s, i), this.reversed(!1).paused(!1); - }, e.reverse = function(s, i) { - return s != null && this.seek(s || this.totalDuration(), i), this.reversed(!0).paused(!1); - }, e.pause = function(s, i) { - return s != null && this.seek(s, i), this.paused(!0); - }, e.resume = function() { - return this.paused(!1); - }, e.reversed = function(s) { - return arguments.length ? (!!s !== this.reversed() && this.timeScale(-this._rts || (s ? -We : 0)), this) : this._rts < 0; - }, e.invalidate = function() { - return this._initted = this._act = 0, this._zTime = -We, this; - }, e.isActive = function() { - var s = this.parent || this._dp, i = this._start, r; - return !!(!s || this._ts && this._initted && s.isActive() && (r = s.rawTime(!0)) >= i && r < this.endTime(!0) - We); - }, e.eventCallback = function(s, i, r) { - var o = this.vars; - return arguments.length > 1 ? (i ? (o[s] = i, r && (o[s + "Params"] = r), s === "onUpdate" && (this._onUpdate = i)) : delete o[s], this) : o[s]; - }, e.then = function(s) { - var i = this; - return new Promise(function(r) { - var o = Je(s) ? s : Su, n = function() { - var c = i.then; - i.then = null, Je(o) && (o = o(i)) && (o.then || o === i) && (i.then = c), r(o), i.then = c; - }; - i._initted && i.totalProgress() === 1 && i._ts >= 0 || !i._tTime && i._ts < 0 ? n() : i._prom = n; - }); - }, e.kill = function() { - Xr(this); - }, a; -}(); -fs(Sa.prototype, { - _time: 0, - _start: 0, - _end: 0, - _tTime: 0, - _tDur: 0, - _dirty: 0, - _repeat: 0, - _yoyo: !1, - parent: null, - _initted: !1, - _rDelay: 0, - _ts: 1, - _dp: 0, - ratio: 0, - _zTime: -We, - _prom: 0, - _ps: !1, - _rts: 1 -}); -var Ot = /* @__PURE__ */ function(a) { - gu(e, a); - function e(s, i) { - var r; - return s === void 0 && (s = {}), r = a.call(this, s) || this, r.labels = {}, r.smoothChildTiming = !!s.smoothChildTiming, r.autoRemoveChildren = !!s.autoRemoveChildren, r._sort = Kt(s.sortChildren), Ye && Ls(s.parent || Ye, qs(r), i), s.reversed && r.reverse(), s.paused && r.paused(!0), s.scrollTrigger && Iu(qs(r), s.scrollTrigger), r; - } - var t = e.prototype; - return t.to = function(i, r, o) { - return oa(0, arguments, this), this; - }, t.from = function(i, r, o) { - return oa(1, arguments, this), this; - }, t.fromTo = function(i, r, o, n) { - return oa(2, arguments, this), this; - }, t.set = function(i, r, o) { - return r.duration = 0, r.parent = this, aa(r).repeatDelay || (r.repeat = 0), r.immediateRender = !!r.immediateRender, new at(i, r, ns(this, o), 1), this; - }, t.call = function(i, r, o) { - return Ls(this, at.delayedCall(0, i, r), o); - }, t.staggerTo = function(i, r, o, n, l, c, u) { - return o.duration = r, o.stagger = o.stagger || n, o.onComplete = c, o.onCompleteParams = u, o.parent = this, new at(i, o, ns(this, l)), this; - }, t.staggerFrom = function(i, r, o, n, l, c, u) { - return o.runBackwards = 1, aa(o).immediateRender = Kt(o.immediateRender), this.staggerTo(i, r, o, n, l, c, u); - }, t.staggerFromTo = function(i, r, o, n, l, c, u, g) { - return n.startAt = o, aa(n).immediateRender = Kt(n.immediateRender), this.staggerTo(i, r, n, l, c, u, g); - }, t.render = function(i, r, o) { - var n = this._time, l = this._dirty ? this.totalDuration() : this._tDur, c = this._dur, u = i <= 0 ? 0 : gt(i), g = this._zTime < 0 != i < 0 && (this._initted || !c), f, h, m, y, k, T, S, C, I, E, F, O; - if (this !== Ye && u > l && i >= 0 && (u = l), u !== this._tTime || o || g) { - if (n !== this._time && c && (u += this._time - n, i += this._time - n), f = u, I = this._start, C = this._ts, T = !C, g && (c || (n = this._zTime), (i || !r) && (this._zTime = i)), this._repeat) { - if (F = this._yoyo, k = c + this._rDelay, this._repeat < -1 && i < 0) - return this.totalTime(k * 100 + i, r, o); - if (f = gt(u % k), u === l ? (y = this._repeat, f = c) : (y = ~~(u / k), y && y === u / k && (f = c, y--), f > c && (f = c)), E = Er(this._tTime, k), !n && this._tTime && E !== y && this._tTime - E * k - this._dur <= 0 && (E = y), F && y & 1 && (f = c - f, O = 1), y !== E && !this._lock) { - var R = F && E & 1, L = R === (F && y & 1); - if (y < E && (R = !R), n = R ? 0 : u % c ? c : u, this._lock = 1, this.render(n || (O ? 0 : gt(y * k)), r, !c)._lock = 0, this._tTime = u, !r && this.parent && Jt(this, "onRepeat"), this.vars.repeatRefresh && !O && (this.invalidate()._lock = 1), n && n !== this._time || T !== !this._ts || this.vars.onRepeat && !this.parent && !this._act) - return this; - if (c = this._dur, l = this._tDur, L && (this._lock = 2, n = R ? c : -1e-4, this.render(n, !0), this.vars.repeatRefresh && !O && this.invalidate()), this._lock = 0, !this._ts && !T) - return this; - ju(this, O); - } - } - if (this._hasPause && !this._forcing && this._lock < 2 && (S = n1(this, gt(n), gt(f)), S && (u -= f - (f = S._start))), this._tTime = u, this._time = f, this._act = !C, this._initted || (this._onUpdate = this.vars.onUpdate, this._initted = 1, this._zTime = i, n = 0), !n && f && !r && !y && (Jt(this, "onStart"), this._tTime !== u)) - return this; - if (f >= n && i >= 0) - for (h = this._first; h; ) { - if (m = h._next, (h._act || f >= h._start) && h._ts && S !== h) { - if (h.parent !== this) - return this.render(i, r, o); - if (h.render(h._ts > 0 ? (f - h._start) * h._ts : (h._dirty ? h.totalDuration() : h._tDur) + (f - h._start) * h._ts, r, o), f !== this._time || !this._ts && !T) { - S = 0, m && (u += this._zTime = -We); - break; - } - } - h = m; - } - else { - h = this._last; - for (var U = i < 0 ? i : f; h; ) { - if (m = h._prev, (h._act || U <= h._end) && h._ts && S !== h) { - if (h.parent !== this) - return this.render(i, r, o); - if (h.render(h._ts > 0 ? (U - h._start) * h._ts : (h._dirty ? h.totalDuration() : h._tDur) + (U - h._start) * h._ts, r, o || xt && (h._initted || h._startAt)), f !== this._time || !this._ts && !T) { - S = 0, m && (u += this._zTime = U ? -We : We); - break; - } - } - h = m; - } - } - if (S && !r && (this.pause(), S.render(f >= n ? 0 : -We)._zTime = f >= n ? 1 : -1, this._ts)) - return this._start = I, Fo(this), this.render(i, r, o); - this._onUpdate && !r && Jt(this, "onUpdate", !0), (u === l && this._tTime >= this.totalDuration() || !u && n) && (I === this._start || Math.abs(C) !== Math.abs(this._ts)) && (this._lock || ((i || !c) && (u === l && this._ts > 0 || !u && this._ts < 0) && Ci(this, 1), !r && !(i < 0 && !n) && (u || n || !l) && (Jt(this, u === l && i >= 0 ? "onComplete" : "onReverseComplete", !0), this._prom && !(u < l && this.timeScale() > 0) && this._prom()))); - } - return this; - }, t.add = function(i, r) { - var o = this; - if (si(r) || (r = ns(this, r, i)), !(i instanceof Sa)) { - if (It(i)) - return i.forEach(function(n) { - return o.add(n, r); - }), this; - if (ft(i)) - return this.addLabel(i, r); - if (Je(i)) - i = at.delayedCall(0, i); - else - return this; - } - return this !== i ? Ls(this, i, r) : this; - }, t.getChildren = function(i, r, o, n) { - i === void 0 && (i = !0), r === void 0 && (r = !0), o === void 0 && (o = !0), n === void 0 && (n = -ds); - for (var l = [], c = this._first; c; ) - c._start >= n && (c instanceof at ? r && l.push(c) : (o && l.push(c), i && l.push.apply(l, c.getChildren(!0, r, o)))), c = c._next; - return l; - }, t.getById = function(i) { - for (var r = this.getChildren(1, 1, 1), o = r.length; o--; ) - if (r[o].vars.id === i) - return r[o]; - }, t.remove = function(i) { - return ft(i) ? this.removeLabel(i) : Je(i) ? this.killTweensOf(i) : (Oo(this, i), i === this._recent && (this._recent = this._last), Vi(this)); - }, t.totalTime = function(i, r) { - return arguments.length ? (this._forcing = 1, !this._dp && this._ts && (this._start = gt(Ut.time - (this._ts > 0 ? i / this._ts : (this.totalDuration() - i) / -this._ts))), a.prototype.totalTime.call(this, i, r), this._forcing = 0, this) : this._tTime; - }, t.addLabel = function(i, r) { - return this.labels[i] = ns(this, r), this; - }, t.removeLabel = function(i) { - return delete this.labels[i], this; - }, t.addPause = function(i, r, o) { - var n = at.delayedCall(0, r || Ta, o); - return n.data = "isPause", this._hasPause = 1, Ls(this, n, ns(this, i)); - }, t.removePause = function(i) { - var r = this._first; - for (i = ns(this, i); r; ) - r._start === i && r.data === "isPause" && Ci(r), r = r._next; - }, t.killTweensOf = function(i, r, o) { - for (var n = this.getTweensOf(i, o), l = n.length; l--; ) - mi !== n[l] && n[l].kill(i, r); - return this; - }, t.getTweensOf = function(i, r) { - for (var o = [], n = gs(i), l = this._first, c = si(r), u; l; ) - l instanceof at ? e1(l._targets, n) && (c ? (!mi || l._initted && l._ts) && l.globalTime(0) <= r && l.globalTime(l.totalDuration()) > r : !r || l.isActive()) && o.push(l) : (u = l.getTweensOf(n, r)).length && o.push.apply(o, u), l = l._next; - return o; - }, t.tweenTo = function(i, r) { - r = r || {}; - var o = this, n = ns(o, i), l = r, c = l.startAt, u = l.onStart, g = l.onStartParams, f = l.immediateRender, h, m = at.to(o, fs({ - ease: r.ease || "none", - lazy: !1, - immediateRender: !1, - time: n, - overwrite: "auto", - duration: r.duration || Math.abs((n - (c && "time" in c ? c.time : o._time)) / o.timeScale()) || We, - onStart: function() { - if (o.pause(), !h) { - var k = r.duration || Math.abs((n - (c && "time" in c ? c.time : o._time)) / o.timeScale()); - m._dur !== k && xr(m, k, 0, 1).render(m._time, !0, !0), h = 1; - } - u && u.apply(m, g || []); - } - }, r)); - return f ? m.render(0) : m; - }, t.tweenFromTo = function(i, r, o) { - return this.tweenTo(r, fs({ - startAt: { - time: ns(this, i) - } - }, o)); - }, t.recent = function() { - return this._recent; - }, t.nextLabel = function(i) { - return i === void 0 && (i = this._time), nc(this, ns(this, i)); - }, t.previousLabel = function(i) { - return i === void 0 && (i = this._time), nc(this, ns(this, i), 1); - }, t.currentLabel = function(i) { - return arguments.length ? this.seek(i, !0) : this.previousLabel(this._time + We); - }, t.shiftChildren = function(i, r, o) { - o === void 0 && (o = 0); - for (var n = this._first, l = this.labels, c; n; ) - n._start >= o && (n._start += i, n._end += i), n = n._next; - if (r) - for (c in l) - l[c] >= o && (l[c] += i); - return Vi(this); - }, t.invalidate = function(i) { - var r = this._first; - for (this._lock = 0; r; ) - r.invalidate(i), r = r._next; - return a.prototype.invalidate.call(this, i); - }, t.clear = function(i) { - i === void 0 && (i = !0); - for (var r = this._first, o; r; ) - o = r._next, this.remove(r), r = o; - return this._dp && (this._time = this._tTime = this._pTime = 0), i && (this.labels = {}), Vi(this); - }, t.totalDuration = function(i) { - var r = 0, o = this, n = o._last, l = ds, c, u, g; - if (arguments.length) - return o.timeScale((o._repeat < 0 ? o.duration() : o.totalDuration()) / (o.reversed() ? -i : i)); - if (o._dirty) { - for (g = o.parent; n; ) - c = n._prev, n._dirty && n.totalDuration(), u = n._start, u > l && o._sort && n._ts && !o._lock ? (o._lock = 1, Ls(o, n, u - n._delay, 1)._lock = 0) : l = u, u < 0 && n._ts && (r -= u, (!g && !o._dp || g && g.smoothChildTiming) && (o._start += u / o._ts, o._time -= u, o._tTime -= u), o.shiftChildren(-u, !1, -1 / 0), l = 0), n._end > r && n._ts && (r = n._end), n = c; - xr(o, o === Ye && o._time > r ? o._time : r, 1, 1), o._dirty = 0; - } - return o._tDur; - }, e.updateRoot = function(i) { - if (Ye._ts && (Cu(Ye, po(i, Ye)), Du = Ut.frame), Ut.frame >= ic) { - ic += Qt.autoSleep || 120; - var r = Ye._first; - if ((!r || !r._ts) && Qt.autoSleep && Ut._listeners.length < 2) { - for (; r && !r._ts; ) - r = r._next; - r || Ut.sleep(); - } - } - }, e; -}(Sa); -fs(Ot.prototype, { - _lock: 0, - _hasPause: 0, - _forcing: 0 -}); -var T1 = function(e, t, s, i, r, o, n) { - var l = new jt(this._pt, e, t, 0, 1, Ju, null, r), c = 0, u = 0, g, f, h, m, y, k, T, S; - for (l.b = s, l.e = i, s += "", i += "", (T = ~i.indexOf("random(")) && (i = Ca(i)), o && (S = [s, i], o(S, e, t), s = S[0], i = S[1]), f = s.match(Jo) || []; g = Jo.exec(i); ) - m = g[0], y = i.substring(c, g.index), h ? h = (h + 1) % 5 : y.substr(-5) === "rgba(" && (h = 1), m !== f[u++] && (k = parseFloat(f[u - 1]) || 0, l._pt = { - _next: l._pt, - p: y || u === 1 ? y : ",", - //note: SVG spec allows omission of comma/space when a negative sign is wedged between two numbers, like 2.5-5.3 instead of 2.5,-5.3 but when tweening, the negative value may switch to positive, so we insert the comma just in case. - s: k, - c: m.charAt(1) === "=" ? gr(k, m) - k : parseFloat(m) - k, - m: h && h < 4 ? Math.round : 0 - }, c = Jo.lastIndex); - return l.c = c < i.length ? i.substring(c, i.length) : "", l.fp = n, (yu.test(i) || T) && (l.e = 0), this._pt = l, l; -}, wl = function(e, t, s, i, r, o, n, l, c, u) { - Je(i) && (i = i(r || 0, e, o)); - var g = e[t], f = s !== "get" ? s : Je(g) ? c ? e[t.indexOf("set") || !Je(e["get" + t.substr(3)]) ? t : "get" + t.substr(3)](c) : e[t]() : g, h = Je(g) ? c ? x1 : Xu : Dl, m; - if (ft(i) && (~i.indexOf("random(") && (i = Ca(i)), i.charAt(1) === "=" && (m = gr(f, i) + (St(f) || 0), (m || m === 0) && (i = m))), !u || f !== i || Rn) - return !isNaN(f * i) && i !== "" ? (m = new jt(this._pt, e, t, +f || 0, i - (f || 0), typeof g == "boolean" ? A1 : Zu, 0, h), c && (m.fp = c), n && m.modifier(n, this, e), this._pt = m) : (!g && !(t in e) && ml(t, i), T1.call(this, e, t, f, i, h, l || Qt.stringFilter, c)); -}, C1 = function(e, t, s, i, r) { - if (Je(e) && (e = na(e, r, t, s, i)), !Ns(e) || e.style && e.nodeType || It(e) || fu(e)) - return ft(e) ? na(e, r, t, s, i) : e; - var o = {}, n; - for (n in e) - o[n] = na(e[n], r, t, s, i); - return o; -}, qu = function(e, t, s, i, r, o) { - var n, l, c, u; - if (Yt[e] && (n = new Yt[e]()).init(r, n.rawVars ? t[e] : C1(t[e], i, r, o, s), s, i, o) !== !1 && (s._pt = l = new jt(s._pt, r, e, 0, 1, n.render, n, 0, n.priority), s !== or)) - for (c = s._ptLookup[s._targets.indexOf(r)], u = n._props.length; u--; ) - c[n._props[u]] = l; - return n; -}, mi, Rn, kl = function a(e, t, s) { - var i = e.vars, r = i.ease, o = i.startAt, n = i.immediateRender, l = i.lazy, c = i.onUpdate, u = i.runBackwards, g = i.yoyoEase, f = i.keyframes, h = i.autoRevert, m = e._dur, y = e._startAt, k = e._targets, T = e.parent, S = T && T.data === "nested" ? T.vars.targets : k, C = e._overwrite === "auto" && !dl, I = e.timeline, E, F, O, R, L, U, j, re, X, de, Q, le, d; - if (I && (!f || !r) && (r = "none"), e._ease = ji(r, Sr.ease), e._yEase = g ? Vu(ji(g === !0 ? r : g, Sr.ease)) : 0, g && e._yoyo && !e._repeat && (g = e._yEase, e._yEase = e._ease, e._ease = g), e._from = !I && !!i.runBackwards, !I || f && !i.stagger) { - if (re = k[0] ? Ki(k[0]).harness : 0, le = re && i[re.prop], E = go(i, yl), y && (y._zTime < 0 && y.progress(1), t < 0 && u && n && !h ? y.render(-1, !0) : y.revert(u && m ? so : Jh), y._lazy = 0), o) { - if (Ci(e._startAt = at.set(k, fs({ - data: "isStart", - overwrite: !1, - parent: T, - immediateRender: !0, - lazy: !y && Kt(l), - startAt: null, - delay: 0, - onUpdate: c && function() { - return Jt(e, "onUpdate"); - }, - stagger: 0 - }, o))), e._startAt._dp = 0, e._startAt._sat = e, t < 0 && (xt || !n && !h) && e._startAt.revert(so), n && m && t <= 0 && s <= 0) { - t && (e._zTime = t); - return; - } - } else if (u && m && !y) { - if (t && (n = !1), O = fs({ - overwrite: !1, - data: "isFromStart", - //we tag the tween with as "isFromStart" so that if [inside a plugin] we need to only do something at the very END of a tween, we have a way of identifying this tween as merely the one that's setting the beginning values for a "from()" tween. For example, clearProps in CSSPlugin should only get applied at the very END of a tween and without this tag, from(...{height:100, clearProps:"height", delay:1}) would wipe the height at the beginning of the tween and after 1 second, it'd kick back in. - lazy: n && !y && Kt(l), - immediateRender: n, - //zero-duration tweens render immediately by default, but if we're not specifically instructed to render this tween immediately, we should skip this and merely _init() to record the starting values (rendering them immediately would push them to completion which is wasteful in that case - we'd have to render(-1) immediately after) - stagger: 0, - parent: T - //ensures that nested tweens that had a stagger are handled properly, like gsap.from(".class", {y: gsap.utils.wrap([-100,100]), stagger: 0.5}) - }, E), le && (O[re.prop] = le), Ci(e._startAt = at.set(k, O)), e._startAt._dp = 0, e._startAt._sat = e, t < 0 && (xt ? e._startAt.revert(so) : e._startAt.render(-1, !0)), e._zTime = t, !n) - a(e._startAt, We, We); - else if (!t) - return; - } - for (e._pt = e._ptCache = 0, l = m && Kt(l) || l && !m, F = 0; F < k.length; F++) { - if (L = k[F], j = L._gsap || vl(k)[F]._gsap, e._ptLookup[F] = de = {}, An[j.id] && Di.length && ho(), Q = S === k ? F : S.indexOf(L), re && (X = new re()).init(L, le || E, e, Q, S) !== !1 && (e._pt = R = new jt(e._pt, L, X.name, 0, 1, X.render, X, 0, X.priority), X._props.forEach(function(p) { - de[p] = R; - }), X.priority && (U = 1)), !re || le) - for (O in E) - Yt[O] && (X = qu(O, E, e, Q, L, S)) ? X.priority && (U = 1) : de[O] = R = wl.call(e, L, O, "get", E[O], Q, S, 0, i.stringFilter); - e._op && e._op[F] && e.kill(L, e._op[F]), C && e._pt && (mi = e, Ye.killTweensOf(L, de, e.globalTime(t)), d = !e.parent, mi = 0), e._pt && l && (An[j.id] = 1); - } - U && Qu(e), e._onInit && e._onInit(e); - } - e._onUpdate = c, e._initted = (!e._op || e._pt) && !d, f && t <= 0 && I.render(ds, !0, !0); -}, _1 = function(e, t, s, i, r, o, n, l) { - var c = (e._pt && e._ptCache || (e._ptCache = {}))[t], u, g, f, h; - if (!c) - for (c = e._ptCache[t] = [], f = e._ptLookup, h = e._targets.length; h--; ) { - if (u = f[h][t], u && u.d && u.d._pt) - for (u = u.d._pt; u && u.p !== t && u.fp !== t; ) - u = u._next; - if (!u) - return Rn = 1, e.vars[t] = "+=0", kl(e, n), Rn = 0, l ? Da(t + " not eligible for reset") : 1; - c.push(u); - } - for (h = c.length; h--; ) - g = c[h], u = g._pt || g, u.s = (i || i === 0) && !r ? i : u.s + (i || 0) + o * u.c, u.c = s - u.s, g.e && (g.e = st(s) + St(g.e)), g.b && (g.b = u.s + St(g.b)); -}, S1 = function(e, t) { - var s = e[0] ? Ki(e[0]).harness : 0, i = s && s.aliases, r, o, n, l; - if (!i) - return t; - r = Ui({}, t); - for (o in i) - if (o in r) - for (l = i[o].split(","), n = l.length; n--; ) - r[l[n]] = r[o]; - return r; -}, E1 = function(e, t, s, i) { - var r = t.ease || i || "power1.inOut", o, n; - if (It(t)) - n = s[e] || (s[e] = []), t.forEach(function(l, c) { - return n.push({ - t: c / (t.length - 1) * 100, - v: l, - e: r - }); - }); - else - for (o in t) - n = s[o] || (s[o] = []), o === "ease" || n.push({ - t: parseFloat(e), - v: t[o], - e: r - }); -}, na = function(e, t, s, i, r) { - return Je(e) ? e.call(t, s, i, r) : ft(e) && ~e.indexOf("random(") ? Ca(e) : e; -}, Yu = bl + "repeat,repeatDelay,yoyo,repeatRefresh,yoyoEase,autoRevert", Uu = {}; -Vt(Yu + ",id,stagger,delay,duration,paused,scrollTrigger", function(a) { - return Uu[a] = 1; -}); -var at = /* @__PURE__ */ function(a) { - gu(e, a); - function e(s, i, r, o) { - var n; - typeof i == "number" && (r.duration = i, i = r, r = null), n = a.call(this, o ? i : aa(i)) || this; - var l = n.vars, c = l.duration, u = l.delay, g = l.immediateRender, f = l.stagger, h = l.overwrite, m = l.keyframes, y = l.defaults, k = l.scrollTrigger, T = l.yoyoEase, S = i.parent || Ye, C = (It(s) || fu(s) ? si(s[0]) : "length" in i) ? [s] : gs(s), I, E, F, O, R, L, U, j; - if (n._targets = C.length ? vl(C) : Da("GSAP target " + s + " not found. https://gsap.com", !Qt.nullTargetWarn) || [], n._ptLookup = [], n._overwrite = h, m || f || ja(c) || ja(u)) { - if (i = n.vars, I = n.timeline = new Ot({ - data: "nested", - defaults: y || {}, - targets: S && S.data === "nested" ? S.vars.targets : C - }), I.kill(), I.parent = I._dp = qs(n), I._start = 0, f || ja(c) || ja(u)) { - if (O = C.length, U = f && Ou(f), Ns(f)) - for (R in f) - ~Yu.indexOf(R) && (j || (j = {}), j[R] = f[R]); - for (E = 0; E < O; E++) - F = go(i, Uu), F.stagger = 0, T && (F.yoyoEase = T), j && Ui(F, j), L = C[E], F.duration = +na(c, qs(n), E, L, C), F.delay = (+na(u, qs(n), E, L, C) || 0) - n._delay, !f && O === 1 && F.delay && (n._delay = u = F.delay, n._start += u, F.delay = 0), I.to(L, F, U ? U(E, L, C) : 0), I._ease = _e.none; - I.duration() ? c = u = 0 : n.timeline = 0; - } else if (m) { - aa(fs(I.vars.defaults, { - ease: "none" - })), I._ease = ji(m.ease || i.ease || "none"); - var re = 0, X, de, Q; - if (It(m)) - m.forEach(function(le) { - return I.to(C, le, ">"); - }), I.duration(); - else { - F = {}; - for (R in m) - R === "ease" || R === "easeEach" || E1(R, m[R], F, m.easeEach); - for (R in F) - for (X = F[R].sort(function(le, d) { - return le.t - d.t; - }), re = 0, E = 0; E < X.length; E++) - de = X[E], Q = { - ease: de.e, - duration: (de.t - (E ? X[E - 1].t : 0)) / 100 * c - }, Q[R] = de.v, I.to(C, Q, re), re += Q.duration; - I.duration() < c && I.to({}, { - duration: c - I.duration() - }); - } - } - c || n.duration(c = I.duration()); - } else - n.timeline = 0; - return h === !0 && !dl && (mi = qs(n), Ye.killTweensOf(C), mi = 0), Ls(S, qs(n), r), i.reversed && n.reverse(), i.paused && n.paused(!0), (g || !c && !m && n._start === gt(S._time) && Kt(g) && r1(qs(n)) && S.data !== "nested") && (n._tTime = -We, n.render(Math.max(0, -u) || 0)), k && Iu(qs(n), k), n; - } - var t = e.prototype; - return t.render = function(i, r, o) { - var n = this._time, l = this._tDur, c = this._dur, u = i < 0, g = i > l - We && !u ? l : i < We ? 0 : i, f, h, m, y, k, T, S, C, I; - if (!c) - o1(this, i, r, o); - else if (g !== this._tTime || !i || o || !this._initted && this._tTime || this._startAt && this._zTime < 0 !== u) { - if (f = g, C = this.timeline, this._repeat) { - if (y = c + this._rDelay, this._repeat < -1 && u) - return this.totalTime(y * 100 + i, r, o); - if (f = gt(g % y), g === l ? (m = this._repeat, f = c) : (m = ~~(g / y), m && m === gt(g / y) && (f = c, m--), f > c && (f = c)), T = this._yoyo && m & 1, T && (I = this._yEase, f = c - f), k = Er(this._tTime, y), f === n && !o && this._initted && m === k) - return this._tTime = g, this; - m !== k && (C && this._yEase && ju(C, T), this.vars.repeatRefresh && !T && !this._lock && this._time !== y && this._initted && (this._lock = o = 1, this.render(gt(y * m), !0).invalidate()._lock = 0)); - } - if (!this._initted) { - if (Au(this, u ? i : f, o, r, g)) - return this._tTime = 0, this; - if (n !== this._time && !(o && this.vars.repeatRefresh && m !== k)) - return this; - if (c !== this._dur) - return this.render(i, r, o); - } - if (this._tTime = g, this._time = f, !this._act && this._ts && (this._act = 1, this._lazy = 0), this.ratio = S = (I || this._ease)(f / c), this._from && (this.ratio = S = 1 - S), f && !n && !r && !m && (Jt(this, "onStart"), this._tTime !== g)) - return this; - for (h = this._pt; h; ) - h.r(S, h.d), h = h._next; - C && C.render(i < 0 ? i : C._dur * C._ease(f / this._dur), r, o) || this._startAt && (this._zTime = i), this._onUpdate && !r && (u && Pn(this, i, r, o), Jt(this, "onUpdate")), this._repeat && m !== k && this.vars.onRepeat && !r && this.parent && Jt(this, "onRepeat"), (g === this._tDur || !g) && this._tTime === g && (u && !this._onUpdate && Pn(this, i, !0, !0), (i || !c) && (g === this._tDur && this._ts > 0 || !g && this._ts < 0) && Ci(this, 1), !r && !(u && !n) && (g || n || T) && (Jt(this, g === l ? "onComplete" : "onReverseComplete", !0), this._prom && !(g < l && this.timeScale() > 0) && this._prom())); - } - return this; - }, t.targets = function() { - return this._targets; - }, t.invalidate = function(i) { - return (!i || !this.vars.runBackwards) && (this._startAt = 0), this._pt = this._op = this._onUpdate = this._lazy = this.ratio = 0, this._ptLookup = [], this.timeline && this.timeline.invalidate(i), a.prototype.invalidate.call(this, i); - }, t.resetTo = function(i, r, o, n, l) { - _a || Ut.wake(), this._ts || this.play(); - var c = Math.min(this._dur, (this._dp._time - this._start) * this._ts), u; - return this._initted || kl(this, c), u = this._ease(c / this._dur), _1(this, i, r, o, n, u, c, l) ? this.resetTo(i, r, o, n, 1) : (Lo(this, 0), this.parent || Eu(this._dp, this, "_first", "_last", this._dp._sort ? "_start" : 0), this.render(0)); - }, t.kill = function(i, r) { - if (r === void 0 && (r = "all"), !i && (!r || r === "all")) - return this._lazy = this._pt = 0, this.parent ? Xr(this) : this; - if (this.timeline) { - var o = this.timeline.totalDuration(); - return this.timeline.killTweensOf(i, r, mi && mi.vars.overwrite !== !0)._first || Xr(this), this.parent && o !== this.timeline.totalDuration() && xr(this, this._dur * this.timeline._tDur / o, 0, 1), this; - } - var n = this._targets, l = i ? gs(i) : n, c = this._ptLookup, u = this._pt, g, f, h, m, y, k, T; - if ((!r || r === "all") && s1(n, l)) - return r === "all" && (this._pt = 0), Xr(this); - for (g = this._op = this._op || [], r !== "all" && (ft(r) && (y = {}, Vt(r, function(S) { - return y[S] = 1; - }), r = y), r = S1(n, r)), T = n.length; T--; ) - if (~l.indexOf(n[T])) { - f = c[T], r === "all" ? (g[T] = r, m = f, h = {}) : (h = g[T] = g[T] || {}, m = r); - for (y in m) - k = f && f[y], k && ((!("kill" in k.d) || k.d.kill(y) === !0) && Oo(this, k, "_pt"), delete f[y]), h !== "all" && (h[y] = 1); - } - return this._initted && !this._pt && u && Xr(this), this; - }, e.to = function(i, r) { - return new e(i, r, arguments[2]); - }, e.from = function(i, r) { - return oa(1, arguments); - }, e.delayedCall = function(i, r, o, n) { - return new e(r, 0, { - immediateRender: !1, - lazy: !1, - overwrite: !1, - delay: i, - onComplete: r, - onReverseComplete: r, - onCompleteParams: o, - onReverseCompleteParams: o, - callbackScope: n - }); - }, e.fromTo = function(i, r, o) { - return oa(2, arguments); - }, e.set = function(i, r) { - return r.duration = 0, r.repeatDelay || (r.repeat = 0), new e(i, r); - }, e.killTweensOf = function(i, r, o) { - return Ye.killTweensOf(i, r, o); - }, e; -}(Sa); -fs(at.prototype, { - _targets: [], - _lazy: 0, - _startAt: 0, - _op: 0, - _onInit: 0 -}); -Vt("staggerTo,staggerFrom,staggerFromTo", function(a) { - at[a] = function() { - var e = new Ot(), t = On.call(arguments, 0); - return t.splice(a === "staggerFromTo" ? 5 : 4, 0, 0), e[a].apply(e, t); - }; -}); -var Dl = function(e, t, s) { - return e[t] = s; -}, Xu = function(e, t, s) { - return e[t](s); -}, x1 = function(e, t, s, i) { - return e[t](i.fp, s); -}, I1 = function(e, t, s) { - return e.setAttribute(t, s); -}, Tl = function(e, t) { - return Je(e[t]) ? Xu : gl(e[t]) && e.setAttribute ? I1 : Dl; -}, Zu = function(e, t) { - return t.set(t.t, t.p, Math.round((t.s + t.c * e) * 1e6) / 1e6, t); -}, A1 = function(e, t) { - return t.set(t.t, t.p, !!(t.s + t.c * e), t); -}, Ju = function(e, t) { - var s = t._pt, i = ""; - if (!e && t.b) - i = t.b; - else if (e === 1 && t.e) - i = t.e; - else { - for (; s; ) - i = s.p + (s.m ? s.m(s.s + s.c * e) : Math.round((s.s + s.c * e) * 1e4) / 1e4) + i, s = s._next; - i += t.c; - } - t.set(t.t, t.p, i, t); -}, Cl = function(e, t) { - for (var s = t._pt; s; ) - s.r(e, s.d), s = s._next; -}, P1 = function(e, t, s, i) { - for (var r = this._pt, o; r; ) - o = r._next, r.p === i && r.modifier(e, t, s), r = o; -}, M1 = function(e) { - for (var t = this._pt, s, i; t; ) - i = t._next, t.p === e && !t.op || t.op === e ? Oo(this, t, "_pt") : t.dep || (s = 1), t = i; - return !s; -}, O1 = function(e, t, s, i) { - i.mSet(e, t, i.m.call(i.tween, s, i.mt), i); -}, Qu = function(e) { - for (var t = e._pt, s, i, r, o; t; ) { - for (s = t._next, i = r; i && i.pr > t.pr; ) - i = i._next; - (t._prev = i ? i._prev : o) ? t._prev._next = t : r = t, (t._next = i) ? i._prev = t : o = t, t = s; - } - e._pt = r; -}, jt = /* @__PURE__ */ function() { - function a(t, s, i, r, o, n, l, c, u) { - this.t = s, this.s = r, this.c = o, this.p = i, this.r = n || Zu, this.d = l || this, this.set = c || Dl, this.pr = u || 0, this._next = t, t && (t._prev = this); - } - var e = a.prototype; - return e.modifier = function(s, i, r) { - this.mSet = this.mSet || this.set, this.set = O1, this.m = s, this.mt = r, this.tween = i; - }, a; -}(); -Vt(bl + "parent,duration,ease,delay,overwrite,runBackwards,startAt,yoyo,immediateRender,repeat,repeatDelay,data,paused,reversed,lazy,callbackScope,stringFilter,id,yoyoEase,stagger,inherit,repeatRefresh,keyframes,autoRevert,scrollTrigger", function(a) { - return yl[a] = 1; -}); -ts.TweenMax = ts.TweenLite = at; -ts.TimelineLite = ts.TimelineMax = Ot; -Ye = new Ot({ - sortChildren: !1, - defaults: Sr, - autoRemoveChildren: !0, - id: "root", - smoothChildTiming: !0 -}); -Qt.stringFilter = Ku; -var Gi = [], ro = {}, F1 = [], cc = 0, L1 = 0, rn = function(e) { - return (ro[e] || F1).map(function(t) { - return t(); - }); -}, $n = function() { - var e = Date.now(), t = []; - e - cc > 2 && (rn("matchMediaInit"), Gi.forEach(function(s) { - var i = s.queries, r = s.conditions, o, n, l, c; - for (n in i) - o = Fs.matchMedia(i[n]).matches, o && (l = 1), o !== r[n] && (r[n] = o, c = 1); - c && (s.revert(), l && t.push(s)); - }), rn("matchMediaRevert"), t.forEach(function(s) { - return s.onMatch(s, function(i) { - return s.add(null, i); - }); - }), cc = e, rn("matchMedia")); -}, e0 = /* @__PURE__ */ function() { - function a(t, s) { - this.selector = s && Fn(s), this.data = [], this._r = [], this.isReverted = !1, this.id = L1++, t && this.add(t); - } - var e = a.prototype; - return e.add = function(s, i, r) { - Je(s) && (r = i, i = s, s = Je); - var o = this, n = function() { - var c = qe, u = o.selector, g; - return c && c !== o && c.data.push(o), r && (o.selector = Fn(r)), qe = o, g = i.apply(o, arguments), Je(g) && o._r.push(g), qe = c, o.selector = u, o.isReverted = !1, g; - }; - return o.last = n, s === Je ? n(o, function(l) { - return o.add(null, l); - }) : s ? o[s] = n : n; - }, e.ignore = function(s) { - var i = qe; - qe = null, s(this), qe = i; - }, e.getTweens = function() { - var s = []; - return this.data.forEach(function(i) { - return i instanceof a ? s.push.apply(s, i.getTweens()) : i instanceof at && !(i.parent && i.parent.data === "nested") && s.push(i); - }), s; - }, e.clear = function() { - this._r.length = this.data.length = 0; - }, e.kill = function(s, i) { - var r = this; - if (s ? function() { - for (var n = r.getTweens(), l = r.data.length, c; l--; ) - c = r.data[l], c.data === "isFlip" && (c.revert(), c.getChildren(!0, !0, !1).forEach(function(u) { - return n.splice(n.indexOf(u), 1); - })); - for (n.map(function(u) { - return { - g: u._dur || u._delay || u._sat && !u._sat.vars.immediateRender ? u.globalTime(0) : -1 / 0, - t: u - }; - }).sort(function(u, g) { - return g.g - u.g || -1 / 0; - }).forEach(function(u) { - return u.t.revert(s); - }), l = r.data.length; l--; ) - c = r.data[l], c instanceof Ot ? c.data !== "nested" && (c.scrollTrigger && c.scrollTrigger.revert(), c.kill()) : !(c instanceof at) && c.revert && c.revert(s); - r._r.forEach(function(u) { - return u(s, r); - }), r.isReverted = !0; - }() : this.data.forEach(function(n) { - return n.kill && n.kill(); - }), this.clear(), i) - for (var o = Gi.length; o--; ) - Gi[o].id === this.id && Gi.splice(o, 1); - }, e.revert = function(s) { - this.kill(s || {}); - }, a; -}(), R1 = /* @__PURE__ */ function() { - function a(t) { - this.contexts = [], this.scope = t, qe && qe.data.push(this); - } - var e = a.prototype; - return e.add = function(s, i, r) { - Ns(s) || (s = { - matches: s - }); - var o = new e0(0, r || this.scope), n = o.conditions = {}, l, c, u; - qe && !o.selector && (o.selector = qe.selector), this.contexts.push(o), i = o.add("onMatch", i), o.queries = s; - for (c in s) - c === "all" ? u = 1 : (l = Fs.matchMedia(s[c]), l && (Gi.indexOf(o) < 0 && Gi.push(o), (n[c] = l.matches) && (u = 1), l.addListener ? l.addListener($n) : l.addEventListener("change", $n))); - return u && i(o, function(g) { - return o.add(null, g); - }), this; - }, e.revert = function(s) { - this.kill(s || {}); - }, e.kill = function(s) { - this.contexts.forEach(function(i) { - return i.kill(s, !0); - }); - }, a; -}(), fo = { - registerPlugin: function() { - for (var e = arguments.length, t = new Array(e), s = 0; s < e; s++) - t[s] = arguments[s]; - t.forEach(function(i) { - return Bu(i); - }); - }, - timeline: function(e) { - return new Ot(e); - }, - getTweensOf: function(e, t) { - return Ye.getTweensOf(e, t); - }, - getProperty: function(e, t, s, i) { - ft(e) && (e = gs(e)[0]); - var r = Ki(e || {}).get, o = s ? Su : _u; - return s === "native" && (s = ""), e && (t ? o((Yt[t] && Yt[t].get || r)(e, t, s, i)) : function(n, l, c) { - return o((Yt[n] && Yt[n].get || r)(e, n, l, c)); - }); - }, - quickSetter: function(e, t, s) { - if (e = gs(e), e.length > 1) { - var i = e.map(function(u) { - return zt.quickSetter(u, t, s); - }), r = i.length; - return function(u) { - for (var g = r; g--; ) - i[g](u); - }; - } - e = e[0] || {}; - var o = Yt[t], n = Ki(e), l = n.harness && (n.harness.aliases || {})[t] || t, c = o ? function(u) { - var g = new o(); - or._pt = 0, g.init(e, s ? u + s : u, or, 0, [e]), g.render(1, g), or._pt && Cl(1, or); - } : n.set(e, l); - return o ? c : function(u) { - return c(e, l, s ? u + s : u, n, 1); - }; - }, - quickTo: function(e, t, s) { - var i, r = zt.to(e, Ui((i = {}, i[t] = "+=0.1", i.paused = !0, i), s || {})), o = function(l, c, u) { - return r.resetTo(t, l, c, u); - }; - return o.tween = r, o; - }, - isTweening: function(e) { - return Ye.getTweensOf(e, !0).length > 0; - }, - defaults: function(e) { - return e && e.ease && (e.ease = ji(e.ease, Sr.ease)), rc(Sr, e || {}); - }, - config: function(e) { - return rc(Qt, e || {}); - }, - registerEffect: function(e) { - var t = e.name, s = e.effect, i = e.plugins, r = e.defaults, o = e.extendTimeline; - (i || "").split(",").forEach(function(n) { - return n && !Yt[n] && !ts[n] && Da(t + " effect requires " + n + " plugin."); - }), Qo[t] = function(n, l, c) { - return s(gs(n), fs(l || {}, r), c); - }, o && (Ot.prototype[t] = function(n, l, c) { - return this.add(Qo[t](n, Ns(l) ? l : (c = l) && {}, this), c); - }); - }, - registerEase: function(e, t) { - _e[e] = ji(t); - }, - parseEase: function(e, t) { - return arguments.length ? ji(e, t) : _e; - }, - getById: function(e) { - return Ye.getById(e); - }, - exportRoot: function(e, t) { - e === void 0 && (e = {}); - var s = new Ot(e), i, r; - for (s.smoothChildTiming = Kt(e.smoothChildTiming), Ye.remove(s), s._dp = 0, s._time = s._tTime = Ye._time, i = Ye._first; i; ) - r = i._next, (t || !(!i._dur && i instanceof at && i.vars.onComplete === i._targets[0])) && Ls(s, i, i._start - i._delay), i = r; - return Ls(Ye, s, 0), s; - }, - context: function(e, t) { - return e ? new e0(e, t) : qe; - }, - matchMedia: function(e) { - return new R1(e); - }, - matchMediaRefresh: function() { - return Gi.forEach(function(e) { - var t = e.conditions, s, i; - for (i in t) - t[i] && (t[i] = !1, s = 1); - s && e.revert(); - }) || $n(); - }, - addEventListener: function(e, t) { - var s = ro[e] || (ro[e] = []); - ~s.indexOf(t) || s.push(t); - }, - removeEventListener: function(e, t) { - var s = ro[e], i = s && s.indexOf(t); - i >= 0 && s.splice(i, 1); - }, - utils: { - wrap: p1, - wrapYoyo: f1, - distribute: Ou, - random: Lu, - snap: Fu, - normalize: g1, - getUnit: St, - clamp: c1, - splitColor: Hu, - toArray: gs, - selector: Fn, - mapRange: $u, - pipe: h1, - unitize: d1, - interpolate: m1, - shuffle: Mu - }, - install: wu, - effects: Qo, - ticker: Ut, - updateRoot: Ot.updateRoot, - plugins: Yt, - globalTimeline: Ye, - core: { - PropTween: jt, - globals: ku, - Tween: at, - Timeline: Ot, - Animation: Sa, - getCache: Ki, - _removeLinkedListItem: Oo, - reverting: function() { - return xt; - }, - context: function(e) { - return e && qe && (qe.data.push(e), e._ctx = qe), qe; - }, - suppressOverwrites: function(e) { - return dl = e; - } - } -}; -Vt("to,from,fromTo,delayedCall,set,killTweensOf", function(a) { - return fo[a] = at[a]; -}); -Ut.add(Ot.updateRoot); -or = fo.to({}, { - duration: 0 -}); -var $1 = function(e, t) { - for (var s = e._pt; s && s.p !== t && s.op !== t && s.fp !== t; ) - s = s._next; - return s; -}, N1 = function(e, t) { - var s = e._targets, i, r, o; - for (i in t) - for (r = s.length; r--; ) - o = e._ptLookup[r][i], o && (o = o.d) && (o._pt && (o = $1(o, i)), o && o.modifier && o.modifier(t[i], e, s[r], i)); -}, an = function(e, t) { - return { - name: e, - rawVars: 1, - //don't pre-process function-based values or "random()" strings. - init: function(i, r, o) { - o._onInit = function(n) { - var l, c; - if (ft(r) && (l = {}, Vt(r, function(u) { - return l[u] = 1; - }), r = l), t) { - l = {}; - for (c in r) - l[c] = t(r[c]); - r = l; - } - N1(n, r); - }; - } - }; -}, zt = fo.registerPlugin({ - name: "attr", - init: function(e, t, s, i, r) { - var o, n, l; - this.tween = s; - for (o in t) - l = e.getAttribute(o) || "", n = this.add(e, "setAttribute", (l || 0) + "", t[o], i, r, 0, 0, o), n.op = o, n.b = l, this._props.push(o); - }, - render: function(e, t) { - for (var s = t._pt; s; ) - xt ? s.set(s.t, s.p, s.b, s) : s.r(e, s.d), s = s._next; - } -}, { - name: "endArray", - init: function(e, t) { - for (var s = t.length; s--; ) - this.add(e, s, e[s] || 0, t[s], 0, 0, 0, 0, 0, 1); - } -}, an("roundProps", Ln), an("modifiers"), an("snap", Fu)) || fo; -at.version = Ot.version = zt.version = "3.12.5"; -vu = 1; -pl() && Ir(); -_e.Power0; -_e.Power1; -_e.Power2; -_e.Power3; -_e.Power4; -_e.Linear; -_e.Quad; -_e.Cubic; -_e.Quart; -_e.Quint; -_e.Strong; -_e.Elastic; -_e.Back; -_e.SteppedEase; -_e.Bounce; -_e.Sine; -_e.Expo; -_e.Circ; -/*! - * CSSPlugin 3.12.5 - * https://gsap.com - * - * Copyright 2008-2024, GreenSock. All rights reserved. - * Subject to the terms at https://gsap.com/standard-license or for - * Club GSAP members, the agreement issued with that membership. - * @author: Jack Doyle, jack@greensock.com -*/ -var uc, yi, pr, _l, Hi, hc, Sl, B1 = function() { - return typeof window < "u"; -}, ii = {}, Ni = 180 / Math.PI, fr = Math.PI / 180, tr = Math.atan2, dc = 1e8, El = /([A-Z])/g, H1 = /(left|right|width|margin|padding|x)/i, W1 = /[\s,\(]\S/, Rs = { - autoAlpha: "opacity,visibility", - scale: "scaleX,scaleY", - alpha: "opacity" -}, Nn = function(e, t) { - return t.set(t.t, t.p, Math.round((t.s + t.c * e) * 1e4) / 1e4 + t.u, t); -}, K1 = function(e, t) { - return t.set(t.t, t.p, e === 1 ? t.e : Math.round((t.s + t.c * e) * 1e4) / 1e4 + t.u, t); -}, V1 = function(e, t) { - return t.set(t.t, t.p, e ? Math.round((t.s + t.c * e) * 1e4) / 1e4 + t.u : t.b, t); -}, j1 = function(e, t) { - var s = t.s + t.c * e; - t.set(t.t, t.p, ~~(s + (s < 0 ? -0.5 : 0.5)) + t.u, t); -}, t0 = function(e, t) { - return t.set(t.t, t.p, e ? t.e : t.b, t); -}, s0 = function(e, t) { - return t.set(t.t, t.p, e !== 1 ? t.b : t.e, t); -}, G1 = function(e, t, s) { - return e.style[t] = s; -}, z1 = function(e, t, s) { - return e.style.setProperty(t, s); -}, q1 = function(e, t, s) { - return e._gsap[t] = s; -}, Y1 = function(e, t, s) { - return e._gsap.scaleX = e._gsap.scaleY = s; -}, U1 = function(e, t, s, i, r) { - var o = e._gsap; - o.scaleX = o.scaleY = s, o.renderTransform(r, o); -}, X1 = function(e, t, s, i, r) { - var o = e._gsap; - o[t] = s, o.renderTransform(r, o); -}, Ue = "transform", Gt = Ue + "Origin", Z1 = function a(e, t) { - var s = this, i = this.target, r = i.style, o = i._gsap; - if (e in ii && r) { - if (this.tfm = this.tfm || {}, e !== "transform") - e = Rs[e] || e, ~e.indexOf(",") ? e.split(",").forEach(function(n) { - return s.tfm[n] = Ys(i, n); - }) : this.tfm[e] = o.x ? o[e] : Ys(i, e), e === Gt && (this.tfm.zOrigin = o.zOrigin); - else - return Rs.transform.split(",").forEach(function(n) { - return a.call(s, n, t); - }); - if (this.props.indexOf(Ue) >= 0) - return; - o.svg && (this.svgo = i.getAttribute("data-svg-origin"), this.props.push(Gt, t, "")), e = Ue; - } - (r || t) && this.props.push(e, t, r[e]); -}, i0 = function(e) { - e.translate && (e.removeProperty("translate"), e.removeProperty("scale"), e.removeProperty("rotate")); -}, J1 = function() { - var e = this.props, t = this.target, s = t.style, i = t._gsap, r, o; - for (r = 0; r < e.length; r += 3) - e[r + 1] ? t[e[r]] = e[r + 2] : e[r + 2] ? s[e[r]] = e[r + 2] : s.removeProperty(e[r].substr(0, 2) === "--" ? e[r] : e[r].replace(El, "-$1").toLowerCase()); - if (this.tfm) { - for (o in this.tfm) - i[o] = this.tfm[o]; - i.svg && (i.renderTransform(), t.setAttribute("data-svg-origin", this.svgo || "")), r = Sl(), (!r || !r.isStart) && !s[Ue] && (i0(s), i.zOrigin && s[Gt] && (s[Gt] += " " + i.zOrigin + "px", i.zOrigin = 0, i.renderTransform()), i.uncache = 1); - } -}, r0 = function(e, t) { - var s = { - target: e, - props: [], - revert: J1, - save: Z1 - }; - return e._gsap || zt.core.getCache(e), t && t.split(",").forEach(function(i) { - return s.save(i); - }), s; -}, a0, Bn = function(e, t) { - var s = yi.createElementNS ? yi.createElementNS((t || "http://www.w3.org/1999/xhtml").replace(/^https/, "http"), e) : yi.createElement(e); - return s && s.style ? s : yi.createElement(e); -}, $s = function a(e, t, s) { - var i = getComputedStyle(e); - return i[t] || i.getPropertyValue(t.replace(El, "-$1").toLowerCase()) || i.getPropertyValue(t) || !s && a(e, Ar(t) || t, 1) || ""; -}, gc = "O,Moz,ms,Ms,Webkit".split(","), Ar = function(e, t, s) { - var i = t || Hi, r = i.style, o = 5; - if (e in r && !s) - return e; - for (e = e.charAt(0).toUpperCase() + e.substr(1); o-- && !(gc[o] + e in r); ) - ; - return o < 0 ? null : (o === 3 ? "ms" : o >= 0 ? gc[o] : "") + e; -}, Hn = function() { - B1() && window.document && (uc = window, yi = uc.document, pr = yi.documentElement, Hi = Bn("div") || { - style: {} - }, Bn("div"), Ue = Ar(Ue), Gt = Ue + "Origin", Hi.style.cssText = "border-width:0;line-height:0;position:absolute;padding:0", a0 = !!Ar("perspective"), Sl = zt.core.reverting, _l = 1); -}, on = function a(e) { - var t = Bn("svg", this.ownerSVGElement && this.ownerSVGElement.getAttribute("xmlns") || "http://www.w3.org/2000/svg"), s = this.parentNode, i = this.nextSibling, r = this.style.cssText, o; - if (pr.appendChild(t), t.appendChild(this), this.style.display = "block", e) - try { - o = this.getBBox(), this._gsapBBox = this.getBBox, this.getBBox = a; - } catch { - } - else - this._gsapBBox && (o = this._gsapBBox()); - return s && (i ? s.insertBefore(this, i) : s.appendChild(this)), pr.removeChild(t), this.style.cssText = r, o; -}, pc = function(e, t) { - for (var s = t.length; s--; ) - if (e.hasAttribute(t[s])) - return e.getAttribute(t[s]); -}, o0 = function(e) { - var t; - try { - t = e.getBBox(); - } catch { - t = on.call(e, !0); - } - return t && (t.width || t.height) || e.getBBox === on || (t = on.call(e, !0)), t && !t.width && !t.x && !t.y ? { - x: +pc(e, ["x", "cx", "x1"]) || 0, - y: +pc(e, ["y", "cy", "y1"]) || 0, - width: 0, - height: 0 - } : t; -}, n0 = function(e) { - return !!(e.getCTM && (!e.parentNode || e.ownerSVGElement) && o0(e)); -}, Xi = function(e, t) { - if (t) { - var s = e.style, i; - t in ii && t !== Gt && (t = Ue), s.removeProperty ? (i = t.substr(0, 2), (i === "ms" || t.substr(0, 6) === "webkit") && (t = "-" + t), s.removeProperty(i === "--" ? t : t.replace(El, "-$1").toLowerCase())) : s.removeAttribute(t); - } -}, bi = function(e, t, s, i, r, o) { - var n = new jt(e._pt, t, s, 0, 1, o ? s0 : t0); - return e._pt = n, n.b = i, n.e = r, e._props.push(s), n; -}, fc = { - deg: 1, - rad: 1, - turn: 1 -}, Q1 = { - grid: 1, - flex: 1 -}, _i = function a(e, t, s, i) { - var r = parseFloat(s) || 0, o = (s + "").trim().substr((r + "").length) || "px", n = Hi.style, l = H1.test(t), c = e.tagName.toLowerCase() === "svg", u = (c ? "client" : "offset") + (l ? "Width" : "Height"), g = 100, f = i === "px", h = i === "%", m, y, k, T; - if (i === o || !r || fc[i] || fc[o]) - return r; - if (o !== "px" && !f && (r = a(e, t, s, "px")), T = e.getCTM && n0(e), (h || o === "%") && (ii[t] || ~t.indexOf("adius"))) - return m = T ? e.getBBox()[l ? "width" : "height"] : e[u], st(h ? r / m * g : r / 100 * m); - if (n[l ? "width" : "height"] = g + (f ? o : i), y = ~t.indexOf("adius") || i === "em" && e.appendChild && !c ? e : e.parentNode, T && (y = (e.ownerSVGElement || {}).parentNode), (!y || y === yi || !y.appendChild) && (y = yi.body), k = y._gsap, k && h && k.width && l && k.time === Ut.time && !k.uncache) - return st(r / k.width * g); - if (h && (t === "height" || t === "width")) { - var S = e.style[t]; - e.style[t] = g + i, m = e[u], S ? e.style[t] = S : Xi(e, t); - } else - (h || o === "%") && !Q1[$s(y, "display")] && (n.position = $s(e, "position")), y === e && (n.position = "static"), y.appendChild(Hi), m = Hi[u], y.removeChild(Hi), n.position = "absolute"; - return l && h && (k = Ki(y), k.time = Ut.time, k.width = y[u]), st(f ? m * r / g : m && r ? g / m * r : 0); -}, Ys = function(e, t, s, i) { - var r; - return _l || Hn(), t in Rs && t !== "transform" && (t = Rs[t], ~t.indexOf(",") && (t = t.split(",")[0])), ii[t] && t !== "transform" ? (r = xa(e, i), r = t !== "transformOrigin" ? r[t] : r.svg ? r.origin : yo($s(e, Gt)) + " " + r.zOrigin + "px") : (r = e.style[t], (!r || r === "auto" || i || ~(r + "").indexOf("calc(")) && (r = mo[t] && mo[t](e, t, s) || $s(e, t) || Tu(e, t) || (t === "opacity" ? 1 : 0))), s && !~(r + "").trim().indexOf(" ") ? _i(e, t, r, s) + s : r; -}, ed = function(e, t, s, i) { - if (!s || s === "none") { - var r = Ar(t, e, 1), o = r && $s(e, r, 1); - o && o !== s ? (t = r, s = o) : t === "borderColor" && (s = $s(e, "borderTopColor")); - } - var n = new jt(this._pt, e.style, t, 0, 1, Ju), l = 0, c = 0, u, g, f, h, m, y, k, T, S, C, I, E; - if (n.b = s, n.e = i, s += "", i += "", i === "auto" && (y = e.style[t], e.style[t] = i, i = $s(e, t) || i, y ? e.style[t] = y : Xi(e, t)), u = [s, i], Ku(u), s = u[0], i = u[1], f = s.match(ar) || [], E = i.match(ar) || [], E.length) { - for (; g = ar.exec(i); ) - k = g[0], S = i.substring(l, g.index), m ? m = (m + 1) % 5 : (S.substr(-5) === "rgba(" || S.substr(-5) === "hsla(") && (m = 1), k !== (y = f[c++] || "") && (h = parseFloat(y) || 0, I = y.substr((h + "").length), k.charAt(1) === "=" && (k = gr(h, k) + I), T = parseFloat(k), C = k.substr((T + "").length), l = ar.lastIndex - C.length, C || (C = C || Qt.units[t] || I, l === i.length && (i += C, n.e += C)), I !== C && (h = _i(e, t, y, C) || 0), n._pt = { - _next: n._pt, - p: S || c === 1 ? S : ",", - //note: SVG spec allows omission of comma/space when a negative sign is wedged between two numbers, like 2.5-5.3 instead of 2.5,-5.3 but when tweening, the negative value may switch to positive, so we insert the comma just in case. - s: h, - c: T - h, - m: m && m < 4 || t === "zIndex" ? Math.round : 0 - }); - n.c = l < i.length ? i.substring(l, i.length) : ""; - } else - n.r = t === "display" && i === "none" ? s0 : t0; - return yu.test(i) && (n.e = 0), this._pt = n, n; -}, mc = { - top: "0%", - bottom: "100%", - left: "0%", - right: "100%", - center: "50%" -}, td = function(e) { - var t = e.split(" "), s = t[0], i = t[1] || "50%"; - return (s === "top" || s === "bottom" || i === "left" || i === "right") && (e = s, s = i, i = e), t[0] = mc[s] || s, t[1] = mc[i] || i, t.join(" "); -}, sd = function(e, t) { - if (t.tween && t.tween._time === t.tween._dur) { - var s = t.t, i = s.style, r = t.u, o = s._gsap, n, l, c; - if (r === "all" || r === !0) - i.cssText = "", l = 1; - else - for (r = r.split(","), c = r.length; --c > -1; ) - n = r[c], ii[n] && (l = 1, n = n === "transformOrigin" ? Gt : Ue), Xi(s, n); - l && (Xi(s, Ue), o && (o.svg && s.removeAttribute("transform"), xa(s, 1), o.uncache = 1, i0(i))); - } -}, mo = { - clearProps: function(e, t, s, i, r) { - if (r.data !== "isFromStart") { - var o = e._pt = new jt(e._pt, t, s, 0, 0, sd); - return o.u = i, o.pr = -10, o.tween = r, e._props.push(s), 1; - } - } - /* className feature (about 0.4kb gzipped). - , className(plugin, target, property, endValue, tween) { - let _renderClassName = (ratio, data) => { - data.css.render(ratio, data.css); - if (!ratio || ratio === 1) { - let inline = data.rmv, - target = data.t, - p; - target.setAttribute("class", ratio ? data.e : data.b); - for (p in inline) { - _removeProperty(target, p); - } - } - }, - _getAllStyles = (target) => { - let styles = {}, - computed = getComputedStyle(target), - p; - for (p in computed) { - if (isNaN(p) && p !== "cssText" && p !== "length") { - styles[p] = computed[p]; - } - } - _setDefaults(styles, _parseTransform(target, 1)); - return styles; - }, - startClassList = target.getAttribute("class"), - style = target.style, - cssText = style.cssText, - cache = target._gsap, - classPT = cache.classPT, - inlineToRemoveAtEnd = {}, - data = {t:target, plugin:plugin, rmv:inlineToRemoveAtEnd, b:startClassList, e:(endValue.charAt(1) !== "=") ? endValue : startClassList.replace(new RegExp("(?:\\s|^)" + endValue.substr(2) + "(?![\\w-])"), "") + ((endValue.charAt(0) === "+") ? " " + endValue.substr(2) : "")}, - changingVars = {}, - startVars = _getAllStyles(target), - transformRelated = /(transform|perspective)/i, - endVars, p; - if (classPT) { - classPT.r(1, classPT.d); - _removeLinkedListItem(classPT.d.plugin, classPT, "_pt"); - } - target.setAttribute("class", data.e); - endVars = _getAllStyles(target, true); - target.setAttribute("class", startClassList); - for (p in endVars) { - if (endVars[p] !== startVars[p] && !transformRelated.test(p)) { - changingVars[p] = endVars[p]; - if (!style[p] && style[p] !== "0") { - inlineToRemoveAtEnd[p] = 1; - } - } - } - cache.classPT = plugin._pt = new PropTween(plugin._pt, target, "className", 0, 0, _renderClassName, data, 0, -11); - if (style.cssText !== cssText) { //only apply if things change. Otherwise, in cases like a background-image that's pulled dynamically, it could cause a refresh. See https://gsap.com/forums/topic/20368-possible-gsap-bug-switching-classnames-in-chrome/. - style.cssText = cssText; //we recorded cssText before we swapped classes and ran _getAllStyles() because in cases when a className tween is overwritten, we remove all the related tweening properties from that class change (otherwise class-specific stuff can't override properties we've directly set on the target's style object due to specificity). - } - _parseTransform(target, true); //to clear the caching of transforms - data.css = new gsap.plugins.css(); - data.css.init(target, changingVars, tween); - plugin._props.push(...data.css._props); - return 1; - } - */ -}, Ea = [1, 0, 0, 1, 0, 0], l0 = {}, c0 = function(e) { - return e === "matrix(1, 0, 0, 1, 0, 0)" || e === "none" || !e; -}, yc = function(e) { - var t = $s(e, Ue); - return c0(t) ? Ea : t.substr(7).match(mu).map(st); -}, xl = function(e, t) { - var s = e._gsap || Ki(e), i = e.style, r = yc(e), o, n, l, c; - return s.svg && e.getAttribute("transform") ? (l = e.transform.baseVal.consolidate().matrix, r = [l.a, l.b, l.c, l.d, l.e, l.f], r.join(",") === "1,0,0,1,0,0" ? Ea : r) : (r === Ea && !e.offsetParent && e !== pr && !s.svg && (l = i.display, i.display = "block", o = e.parentNode, (!o || !e.offsetParent) && (c = 1, n = e.nextElementSibling, pr.appendChild(e)), r = yc(e), l ? i.display = l : Xi(e, "display"), c && (n ? o.insertBefore(e, n) : o ? o.appendChild(e) : pr.removeChild(e))), t && r.length > 6 ? [r[0], r[1], r[4], r[5], r[12], r[13]] : r); -}, Wn = function(e, t, s, i, r, o) { - var n = e._gsap, l = r || xl(e, !0), c = n.xOrigin || 0, u = n.yOrigin || 0, g = n.xOffset || 0, f = n.yOffset || 0, h = l[0], m = l[1], y = l[2], k = l[3], T = l[4], S = l[5], C = t.split(" "), I = parseFloat(C[0]) || 0, E = parseFloat(C[1]) || 0, F, O, R, L; - s ? l !== Ea && (O = h * k - m * y) && (R = I * (k / O) + E * (-y / O) + (y * S - k * T) / O, L = I * (-m / O) + E * (h / O) - (h * S - m * T) / O, I = R, E = L) : (F = o0(e), I = F.x + (~C[0].indexOf("%") ? I / 100 * F.width : I), E = F.y + (~(C[1] || C[0]).indexOf("%") ? E / 100 * F.height : E)), i || i !== !1 && n.smooth ? (T = I - c, S = E - u, n.xOffset = g + (T * h + S * y) - T, n.yOffset = f + (T * m + S * k) - S) : n.xOffset = n.yOffset = 0, n.xOrigin = I, n.yOrigin = E, n.smooth = !!i, n.origin = t, n.originIsAbsolute = !!s, e.style[Gt] = "0px 0px", o && (bi(o, n, "xOrigin", c, I), bi(o, n, "yOrigin", u, E), bi(o, n, "xOffset", g, n.xOffset), bi(o, n, "yOffset", f, n.yOffset)), e.setAttribute("data-svg-origin", I + " " + E); -}, xa = function(e, t) { - var s = e._gsap || new zu(e); - if ("x" in s && !t && !s.uncache) - return s; - var i = e.style, r = s.scaleX < 0, o = "px", n = "deg", l = getComputedStyle(e), c = $s(e, Gt) || "0", u, g, f, h, m, y, k, T, S, C, I, E, F, O, R, L, U, j, re, X, de, Q, le, d, p, w, b, D, _, P, N, V; - return u = g = f = y = k = T = S = C = I = 0, h = m = 1, s.svg = !!(e.getCTM && n0(e)), l.translate && ((l.translate !== "none" || l.scale !== "none" || l.rotate !== "none") && (i[Ue] = (l.translate !== "none" ? "translate3d(" + (l.translate + " 0 0").split(" ").slice(0, 3).join(", ") + ") " : "") + (l.rotate !== "none" ? "rotate(" + l.rotate + ") " : "") + (l.scale !== "none" ? "scale(" + l.scale.split(" ").join(",") + ") " : "") + (l[Ue] !== "none" ? l[Ue] : "")), i.scale = i.rotate = i.translate = "none"), O = xl(e, s.svg), s.svg && (s.uncache ? (p = e.getBBox(), c = s.xOrigin - p.x + "px " + (s.yOrigin - p.y) + "px", d = "") : d = !t && e.getAttribute("data-svg-origin"), Wn(e, d || c, !!d || s.originIsAbsolute, s.smooth !== !1, O)), E = s.xOrigin || 0, F = s.yOrigin || 0, O !== Ea && (j = O[0], re = O[1], X = O[2], de = O[3], u = Q = O[4], g = le = O[5], O.length === 6 ? (h = Math.sqrt(j * j + re * re), m = Math.sqrt(de * de + X * X), y = j || re ? tr(re, j) * Ni : 0, S = X || de ? tr(X, de) * Ni + y : 0, S && (m *= Math.abs(Math.cos(S * fr))), s.svg && (u -= E - (E * j + F * X), g -= F - (E * re + F * de))) : (V = O[6], P = O[7], b = O[8], D = O[9], _ = O[10], N = O[11], u = O[12], g = O[13], f = O[14], R = tr(V, _), k = R * Ni, R && (L = Math.cos(-R), U = Math.sin(-R), d = Q * L + b * U, p = le * L + D * U, w = V * L + _ * U, b = Q * -U + b * L, D = le * -U + D * L, _ = V * -U + _ * L, N = P * -U + N * L, Q = d, le = p, V = w), R = tr(-X, _), T = R * Ni, R && (L = Math.cos(-R), U = Math.sin(-R), d = j * L - b * U, p = re * L - D * U, w = X * L - _ * U, N = de * U + N * L, j = d, re = p, X = w), R = tr(re, j), y = R * Ni, R && (L = Math.cos(R), U = Math.sin(R), d = j * L + re * U, p = Q * L + le * U, re = re * L - j * U, le = le * L - Q * U, j = d, Q = p), k && Math.abs(k) + Math.abs(y) > 359.9 && (k = y = 0, T = 180 - T), h = st(Math.sqrt(j * j + re * re + X * X)), m = st(Math.sqrt(le * le + V * V)), R = tr(Q, le), S = Math.abs(R) > 2e-4 ? R * Ni : 0, I = N ? 1 / (N < 0 ? -N : N) : 0), s.svg && (d = e.getAttribute("transform"), s.forceCSS = e.setAttribute("transform", "") || !c0($s(e, Ue)), d && e.setAttribute("transform", d))), Math.abs(S) > 90 && Math.abs(S) < 270 && (r ? (h *= -1, S += y <= 0 ? 180 : -180, y += y <= 0 ? 180 : -180) : (m *= -1, S += S <= 0 ? 180 : -180)), t = t || s.uncache, s.x = u - ((s.xPercent = u && (!t && s.xPercent || (Math.round(e.offsetWidth / 2) === Math.round(-u) ? -50 : 0))) ? e.offsetWidth * s.xPercent / 100 : 0) + o, s.y = g - ((s.yPercent = g && (!t && s.yPercent || (Math.round(e.offsetHeight / 2) === Math.round(-g) ? -50 : 0))) ? e.offsetHeight * s.yPercent / 100 : 0) + o, s.z = f + o, s.scaleX = st(h), s.scaleY = st(m), s.rotation = st(y) + n, s.rotationX = st(k) + n, s.rotationY = st(T) + n, s.skewX = S + n, s.skewY = C + n, s.transformPerspective = I + o, (s.zOrigin = parseFloat(c.split(" ")[2]) || !t && s.zOrigin || 0) && (i[Gt] = yo(c)), s.xOffset = s.yOffset = 0, s.force3D = Qt.force3D, s.renderTransform = s.svg ? rd : a0 ? u0 : id, s.uncache = 0, s; -}, yo = function(e) { - return (e = e.split(" "))[0] + " " + e[1]; -}, nn = function(e, t, s) { - var i = St(t); - return st(parseFloat(t) + parseFloat(_i(e, "x", s + "px", i))) + i; -}, id = function(e, t) { - t.z = "0px", t.rotationY = t.rotationX = "0deg", t.force3D = 0, u0(e, t); -}, Fi = "0deg", Gr = "0px", Li = ") ", u0 = function(e, t) { - var s = t || this, i = s.xPercent, r = s.yPercent, o = s.x, n = s.y, l = s.z, c = s.rotation, u = s.rotationY, g = s.rotationX, f = s.skewX, h = s.skewY, m = s.scaleX, y = s.scaleY, k = s.transformPerspective, T = s.force3D, S = s.target, C = s.zOrigin, I = "", E = T === "auto" && e && e !== 1 || T === !0; - if (C && (g !== Fi || u !== Fi)) { - var F = parseFloat(u) * fr, O = Math.sin(F), R = Math.cos(F), L; - F = parseFloat(g) * fr, L = Math.cos(F), o = nn(S, o, O * L * -C), n = nn(S, n, -Math.sin(F) * -C), l = nn(S, l, R * L * -C + C); - } - k !== Gr && (I += "perspective(" + k + Li), (i || r) && (I += "translate(" + i + "%, " + r + "%) "), (E || o !== Gr || n !== Gr || l !== Gr) && (I += l !== Gr || E ? "translate3d(" + o + ", " + n + ", " + l + ") " : "translate(" + o + ", " + n + Li), c !== Fi && (I += "rotate(" + c + Li), u !== Fi && (I += "rotateY(" + u + Li), g !== Fi && (I += "rotateX(" + g + Li), (f !== Fi || h !== Fi) && (I += "skew(" + f + ", " + h + Li), (m !== 1 || y !== 1) && (I += "scale(" + m + ", " + y + Li), S.style[Ue] = I || "translate(0, 0)"; -}, rd = function(e, t) { - var s = t || this, i = s.xPercent, r = s.yPercent, o = s.x, n = s.y, l = s.rotation, c = s.skewX, u = s.skewY, g = s.scaleX, f = s.scaleY, h = s.target, m = s.xOrigin, y = s.yOrigin, k = s.xOffset, T = s.yOffset, S = s.forceCSS, C = parseFloat(o), I = parseFloat(n), E, F, O, R, L; - l = parseFloat(l), c = parseFloat(c), u = parseFloat(u), u && (u = parseFloat(u), c += u, l += u), l || c ? (l *= fr, c *= fr, E = Math.cos(l) * g, F = Math.sin(l) * g, O = Math.sin(l - c) * -f, R = Math.cos(l - c) * f, c && (u *= fr, L = Math.tan(c - u), L = Math.sqrt(1 + L * L), O *= L, R *= L, u && (L = Math.tan(u), L = Math.sqrt(1 + L * L), E *= L, F *= L)), E = st(E), F = st(F), O = st(O), R = st(R)) : (E = g, R = f, F = O = 0), (C && !~(o + "").indexOf("px") || I && !~(n + "").indexOf("px")) && (C = _i(h, "x", o, "px"), I = _i(h, "y", n, "px")), (m || y || k || T) && (C = st(C + m - (m * E + y * O) + k), I = st(I + y - (m * F + y * R) + T)), (i || r) && (L = h.getBBox(), C = st(C + i / 100 * L.width), I = st(I + r / 100 * L.height)), L = "matrix(" + E + "," + F + "," + O + "," + R + "," + C + "," + I + ")", h.setAttribute("transform", L), S && (h.style[Ue] = L); -}, ad = function(e, t, s, i, r) { - var o = 360, n = ft(r), l = parseFloat(r) * (n && ~r.indexOf("rad") ? Ni : 1), c = l - i, u = i + c + "deg", g, f; - return n && (g = r.split("_")[1], g === "short" && (c %= o, c !== c % (o / 2) && (c += c < 0 ? o : -o)), g === "cw" && c < 0 ? c = (c + o * dc) % o - ~~(c / o) * o : g === "ccw" && c > 0 && (c = (c - o * dc) % o - ~~(c / o) * o)), e._pt = f = new jt(e._pt, t, s, i, c, K1), f.e = u, f.u = "deg", e._props.push(s), f; -}, bc = function(e, t) { - for (var s in t) - e[s] = t[s]; - return e; -}, od = function(e, t, s) { - var i = bc({}, s._gsap), r = "perspective,force3D,transformOrigin,svgOrigin", o = s.style, n, l, c, u, g, f, h, m; - i.svg ? (c = s.getAttribute("transform"), s.setAttribute("transform", ""), o[Ue] = t, n = xa(s, 1), Xi(s, Ue), s.setAttribute("transform", c)) : (c = getComputedStyle(s)[Ue], o[Ue] = t, n = xa(s, 1), o[Ue] = c); - for (l in ii) - c = i[l], u = n[l], c !== u && r.indexOf(l) < 0 && (h = St(c), m = St(u), g = h !== m ? _i(s, l, c, m) : parseFloat(c), f = parseFloat(u), e._pt = new jt(e._pt, n, l, g, f - g, Nn), e._pt.u = m || 0, e._props.push(l)); - bc(n, i); -}; -Vt("padding,margin,Width,Radius", function(a, e) { - var t = "Top", s = "Right", i = "Bottom", r = "Left", o = (e < 3 ? [t, s, i, r] : [t + r, t + s, i + s, i + r]).map(function(n) { - return e < 2 ? a + n : "border" + n + a; - }); - mo[e > 1 ? "border" + a : a] = function(n, l, c, u, g) { - var f, h; - if (arguments.length < 4) - return f = o.map(function(m) { - return Ys(n, m, c); - }), h = f.join(" "), h.split(f[0]).length === 5 ? f[0] : h; - f = (u + "").split(" "), h = {}, o.forEach(function(m, y) { - return h[m] = f[y] = f[y] || f[(y - 1) / 2 | 0]; - }), n.init(l, h, g); - }; -}); -var h0 = { - name: "css", - register: Hn, - targetTest: function(e) { - return e.style && e.nodeType; - }, - init: function(e, t, s, i, r) { - var o = this._props, n = e.style, l = s.vars.startAt, c, u, g, f, h, m, y, k, T, S, C, I, E, F, O, R; - _l || Hn(), this.styles = this.styles || r0(e), R = this.styles.props, this.tween = s; - for (y in t) - if (y !== "autoRound" && (u = t[y], !(Yt[y] && qu(y, t, s, i, e, r)))) { - if (h = typeof u, m = mo[y], h === "function" && (u = u.call(s, i, e, r), h = typeof u), h === "string" && ~u.indexOf("random(") && (u = Ca(u)), m) - m(this, e, y, u, s) && (O = 1); - else if (y.substr(0, 2) === "--") - c = (getComputedStyle(e).getPropertyValue(y) + "").trim(), u += "", Ti.lastIndex = 0, Ti.test(c) || (k = St(c), T = St(u)), T ? k !== T && (c = _i(e, y, c, T) + T) : k && (u += k), this.add(n, "setProperty", c, u, i, r, 0, 0, y), o.push(y), R.push(y, 0, n[y]); - else if (h !== "undefined") { - if (l && y in l ? (c = typeof l[y] == "function" ? l[y].call(s, i, e, r) : l[y], ft(c) && ~c.indexOf("random(") && (c = Ca(c)), St(c + "") || c === "auto" || (c += Qt.units[y] || St(Ys(e, y)) || ""), (c + "").charAt(1) === "=" && (c = Ys(e, y))) : c = Ys(e, y), f = parseFloat(c), S = h === "string" && u.charAt(1) === "=" && u.substr(0, 2), S && (u = u.substr(2)), g = parseFloat(u), y in Rs && (y === "autoAlpha" && (f === 1 && Ys(e, "visibility") === "hidden" && g && (f = 0), R.push("visibility", 0, n.visibility), bi(this, n, "visibility", f ? "inherit" : "hidden", g ? "inherit" : "hidden", !g)), y !== "scale" && y !== "transform" && (y = Rs[y], ~y.indexOf(",") && (y = y.split(",")[0]))), C = y in ii, C) { - if (this.styles.save(y), I || (E = e._gsap, E.renderTransform && !t.parseTransform || xa(e, t.parseTransform), F = t.smoothOrigin !== !1 && E.smooth, I = this._pt = new jt(this._pt, n, Ue, 0, 1, E.renderTransform, E, 0, -1), I.dep = 1), y === "scale") - this._pt = new jt(this._pt, E, "scaleY", E.scaleY, (S ? gr(E.scaleY, S + g) : g) - E.scaleY || 0, Nn), this._pt.u = 0, o.push("scaleY", y), y += "X"; - else if (y === "transformOrigin") { - R.push(Gt, 0, n[Gt]), u = td(u), E.svg ? Wn(e, u, 0, F, 0, this) : (T = parseFloat(u.split(" ")[2]) || 0, T !== E.zOrigin && bi(this, E, "zOrigin", E.zOrigin, T), bi(this, n, y, yo(c), yo(u))); - continue; - } else if (y === "svgOrigin") { - Wn(e, u, 1, F, 0, this); - continue; - } else if (y in l0) { - ad(this, E, y, f, S ? gr(f, S + u) : u); - continue; - } else if (y === "smoothOrigin") { - bi(this, E, "smooth", E.smooth, u); - continue; - } else if (y === "force3D") { - E[y] = u; - continue; - } else if (y === "transform") { - od(this, u, e); - continue; - } - } else - y in n || (y = Ar(y) || y); - if (C || (g || g === 0) && (f || f === 0) && !W1.test(u) && y in n) - k = (c + "").substr((f + "").length), g || (g = 0), T = St(u) || (y in Qt.units ? Qt.units[y] : k), k !== T && (f = _i(e, y, c, T)), this._pt = new jt(this._pt, C ? E : n, y, f, (S ? gr(f, S + g) : g) - f, !C && (T === "px" || y === "zIndex") && t.autoRound !== !1 ? j1 : Nn), this._pt.u = T || 0, k !== T && T !== "%" && (this._pt.b = c, this._pt.r = V1); - else if (y in n) - ed.call(this, e, y, c, S ? S + u : u); - else if (y in e) - this.add(e, y, c || e[y], S ? S + u : u, i, r); - else if (y !== "parseTransform") { - ml(y, u); - continue; - } - C || (y in n ? R.push(y, 0, n[y]) : R.push(y, 1, c || e[y])), o.push(y); - } - } - O && Qu(this); - }, - render: function(e, t) { - if (t.tween._time || !Sl()) - for (var s = t._pt; s; ) - s.r(e, s.d), s = s._next; - else - t.styles.revert(); - }, - get: Ys, - aliases: Rs, - getSetter: function(e, t, s) { - var i = Rs[t]; - return i && i.indexOf(",") < 0 && (t = i), t in ii && t !== Gt && (e._gsap.x || Ys(e, "x")) ? s && hc === s ? t === "scale" ? Y1 : q1 : (hc = s || {}) && (t === "scale" ? U1 : X1) : e.style && !gl(e.style[t]) ? G1 : ~t.indexOf("-") ? z1 : Tl(e, t); - }, - core: { - _removeProperty: Xi, - _getMatrix: xl - } -}; -zt.utils.checkPrefix = Ar; -zt.core.getStyleSaver = r0; -(function(a, e, t, s) { - var i = Vt(a + "," + e + "," + t, function(r) { - ii[r] = 1; - }); - Vt(e, function(r) { - Qt.units[r] = "deg", l0[r] = 1; - }), Rs[i[13]] = a + "," + e, Vt(s, function(r) { - var o = r.split(":"); - Rs[o[1]] = i[o[0]]; - }); -})("x,y,z,scale,scaleX,scaleY,xPercent,yPercent", "rotation,rotationX,rotationY,skewX,skewY", "transform,transformOrigin,svgOrigin,force3D,smoothOrigin,transformPerspective", "0:translateX,1:translateY,2:translateZ,8:rotate,8:rotationZ,8:rotateZ,9:rotateX,10:rotateY"); -Vt("x,y,z,top,right,bottom,left,width,height,fontSize,padding,margin,perspective", function(a) { - Qt.units[a] = "px"; -}); -zt.registerPlugin(h0); -var ot = zt.registerPlugin(h0) || zt; -ot.core.Tween; -/*! - * paths 3.12.5 - * https://gsap.com - * - * Copyright 2008-2024, GreenSock. All rights reserved. - * Subject to the terms at https://gsap.com/standard-license or for - * Club GSAP members, the agreement issued with that membership. - * @author: Jack Doyle, jack@greensock.com -*/ -var nd = /[achlmqstvz]|(-?\d*\.?\d*(?:e[\-+]?\d+)?)[0-9]/ig, ld = /(?:(-)?\d*\.?\d*(?:e[\-+]?\d+)?)[0-9]/ig, cd = /[\+\-]?\d*\.?\d+e[\+\-]?\d+/ig, ud = /(^[#\.][a-z]|[a-y][a-z])/i, hd = Math.PI / 180, dd = 180 / Math.PI, Ga = Math.sin, za = Math.cos, ps = Math.abs, Xs = Math.sqrt, gd = Math.atan2, Kn = 1e8, vc = function(e) { - return typeof e == "string"; -}, d0 = function(e) { - return typeof e == "number"; -}, pd = function(e) { - return typeof e > "u"; -}, fd = {}, md = {}, bo = 1e5, g0 = function(e) { - return Math.round((e + Kn) % 1 * bo) / bo || (e < 0 ? 0 : 1); -}, Ae = function(e) { - return Math.round(e * bo) / bo || 0; -}, wc = function(e) { - return Math.round(e * 1e10) / 1e10 || 0; -}, kc = function(e, t, s, i) { - var r = e[t], o = i === 1 ? 6 : Vn(r, s, i); - if ((o || !i) && o + s + 2 < r.length) - return e.splice(t, 0, r.slice(0, s + o + 2)), r.splice(0, s + o), 1; -}, p0 = function(e, t, s) { - var i = e.length, r = ~~(s * i); - if (e[r] > t) { - for (; --r && e[r] > t; ) - ; - r < 0 && (r = 0); - } else - for (; e[++r] < t && r < i; ) - ; - return r < i ? r : i - 1; -}, yd = function(e, t) { - var s = e.length; - for (t || e.reverse(); s--; ) - e[s].reversed || wd(e[s]); -}, Dc = function(e, t) { - return t.totalLength = e.totalLength, e.samples ? (t.samples = e.samples.slice(0), t.lookup = e.lookup.slice(0), t.minLength = e.minLength, t.resolution = e.resolution) : e.totalPoints && (t.totalPoints = e.totalPoints), t; -}, bd = function(e, t) { - var s = e.length, i = e[s - 1] || [], r = i.length; - s && t[0] === i[r - 2] && t[1] === i[r - 1] && (t = i.concat(t.slice(2)), s--), e[s] = t; -}; -function ao(a) { - a = vc(a) && ud.test(a) && document.querySelector(a) || a; - var e = a.getAttribute ? a : 0, t; - return e && (a = a.getAttribute("d")) ? (e._gsPath || (e._gsPath = {}), t = e._gsPath[a], t && !t._dirty ? t : e._gsPath[a] = Ia(a)) : a ? vc(a) ? Ia(a) : d0(a[0]) ? [a] : a : console.warn("Expecting a element or an SVG path data string"); -} -function vd(a) { - for (var e = [], t = 0; t < a.length; t++) - e[t] = Dc(a[t], a[t].slice(0)); - return Dc(a, e); -} -function wd(a) { - var e = 0, t; - for (a.reverse(); e < a.length; e += 2) - t = a[e], a[e] = a[e + 1], a[e + 1] = t; - a.reversed = !a.reversed; -} -var kd = function(e, t) { - var s = document.createElementNS("http://www.w3.org/2000/svg", "path"), i = [].slice.call(e.attributes), r = i.length, o; - for (t = "," + t + ","; --r > -1; ) - o = i[r].nodeName.toLowerCase(), t.indexOf("," + o + ",") < 0 && s.setAttributeNS(null, o, i[r].nodeValue); - return s; -}, Dd = { - rect: "rx,ry,x,y,width,height", - circle: "r,cx,cy", - ellipse: "rx,ry,cx,cy", - line: "x1,x2,y1,y2" -}, Td = function(e, t) { - for (var s = t ? t.split(",") : [], i = {}, r = s.length; --r > -1; ) - i[s[r]] = +e.getAttribute(s[r]) || 0; - return i; -}; -function Cd(a, e) { - var t = a.tagName.toLowerCase(), s = 0.552284749831, i, r, o, n, l, c, u, g, f, h, m, y, k, T, S, C, I, E, F, O, R, L; - return t === "path" || !a.getBBox ? a : (c = kd(a, "x,y,width,height,cx,cy,rx,ry,r,x1,x2,y1,y2,points"), L = Td(a, Dd[t]), t === "rect" ? (n = L.rx, l = L.ry || n, r = L.x, o = L.y, h = L.width - n * 2, m = L.height - l * 2, n || l ? (y = r + n * (1 - s), k = r + n, T = k + h, S = T + n * s, C = T + n, I = o + l * (1 - s), E = o + l, F = E + m, O = F + l * s, R = F + l, i = "M" + C + "," + E + " V" + F + " C" + [C, O, S, R, T, R, T - (T - k) / 3, R, k + (T - k) / 3, R, k, R, y, R, r, O, r, F, r, F - (F - E) / 3, r, E + (F - E) / 3, r, E, r, I, y, o, k, o, k + (T - k) / 3, o, T - (T - k) / 3, o, T, o, S, o, C, I, C, E].join(",") + "z") : i = "M" + (r + h) + "," + o + " v" + m + " h" + -h + " v" + -m + " h" + h + "z") : t === "circle" || t === "ellipse" ? (t === "circle" ? (n = l = L.r, g = n * s) : (n = L.rx, l = L.ry, g = l * s), r = L.cx, o = L.cy, u = n * s, i = "M" + (r + n) + "," + o + " C" + [r + n, o + g, r + u, o + l, r, o + l, r - u, o + l, r - n, o + g, r - n, o, r - n, o - g, r - u, o - l, r, o - l, r + u, o - l, r + n, o - g, r + n, o].join(",") + "z") : t === "line" ? i = "M" + L.x1 + "," + L.y1 + " L" + L.x2 + "," + L.y2 : (t === "polyline" || t === "polygon") && (f = (a.getAttribute("points") + "").match(ld) || [], r = f.shift(), o = f.shift(), i = "M" + r + "," + o + " L" + f.join(","), t === "polygon" && (i += "," + r + "," + o + "z")), c.setAttribute("d", Il(c._gsRawPath = Ia(i))), e && a.parentNode && (a.parentNode.insertBefore(c, a), a.parentNode.removeChild(a)), c); -} -function f0(a, e, t) { - var s = a[e], i = a[e + 2], r = a[e + 4], o; - return s += (i - s) * t, i += (r - i) * t, s += (i - s) * t, o = i + (r + (a[e + 6] - r) * t - i) * t - s, s = a[e + 1], i = a[e + 3], r = a[e + 5], s += (i - s) * t, i += (r - i) * t, s += (i - s) * t, Ae(gd(i + (r + (a[e + 7] - r) * t - i) * t - s, o) * dd); -} -function m0(a, e, t) { - t = pd(t) ? 1 : wc(t) || 0, e = wc(e) || 0; - var s = Math.max(0, ~~(ps(t - e) - 1e-8)), i = vd(a); - if (e > t && (e = 1 - e, t = 1 - t, yd(i), i.totalLength = 0), e < 0 || t < 0) { - var r = Math.abs(~~Math.min(e, t)) + 1; - e += r, t += r; - } - i.totalLength || zi(i); - var o = t > 1, n = Tc(i, e, fd, !0), l = Tc(i, t, md), c = l.segment, u = n.segment, g = l.segIndex, f = n.segIndex, h = l.i, m = n.i, y = f === g, k = h === m && y, T, S, C, I, E, F, O, R; - if (o || s) { - for (T = g < f || y && h < m || k && l.t < n.t, kc(i, f, m, n.t) && (f++, T || (g++, k ? (l.t = (l.t - n.t) / (1 - n.t), h = 0) : y && (h -= m))), Math.abs(1 - (t - e)) < 1e-5 ? g = f - 1 : !l.t && g ? g-- : kc(i, g, h, l.t) && T && f++, n.t === 1 && (f = (f + 1) % i.length), E = [], F = i.length, O = 1 + F * s, R = f, O += (F - f + g) % F, I = 0; I < O; I++) - bd(E, i[R++ % F]); - i = E; - } else if (C = l.t === 1 ? 6 : Vn(c, h, l.t), e !== t) - for (S = Vn(u, m, k ? n.t / l.t : n.t), y && (C += S), c.splice(h + C + 2), (S || m) && u.splice(0, m + S), I = i.length; I--; ) - (I < f || I > g) && i.splice(I, 1); - else - c.angle = f0(c, h + C, 0), h += C, n = c[h], l = c[h + 1], c.length = c.totalLength = 0, c.totalPoints = i.totalPoints = 8, c.push(n, l, n, l, n, l, n, l); - return i.totalLength = 0, i; -} -function _d(a, e, t) { - e = e || 0, a.samples || (a.samples = [], a.lookup = []); - var s = ~~a.resolution || 12, i = 1 / s, r = t ? e + t * 6 + 1 : a.length, o = a[e], n = a[e + 1], l = e ? e / 6 * s : 0, c = a.samples, u = a.lookup, g = (e ? a.minLength : Kn) || Kn, f = c[l + t * s - 1], h = e ? c[l - 1] : 0, m, y, k, T, S, C, I, E, F, O, R, L, U, j, re, X, de; - for (c.length = u.length = 0, y = e + 2; y < r; y += 6) { - if (k = a[y + 4] - o, T = a[y + 2] - o, S = a[y] - o, E = a[y + 5] - n, F = a[y + 3] - n, O = a[y + 1] - n, C = I = R = L = 0, ps(k) < 0.01 && ps(E) < 0.01 && ps(S) + ps(O) < 0.01) - a.length > 8 && (a.splice(y, 6), y -= 6, r -= 6); - else - for (m = 1; m <= s; m++) - j = i * m, U = 1 - j, C = I - (I = (j * j * k + 3 * U * (j * T + U * S)) * j), R = L - (L = (j * j * E + 3 * U * (j * F + U * O)) * j), X = Xs(R * R + C * C), X < g && (g = X), h += X, c[l++] = h; - o += k, n += E; - } - if (f) - for (f -= h; l < c.length; l++) - c[l] += f; - if (c.length && g) { - if (a.totalLength = de = c[c.length - 1] || 0, a.minLength = g, de / g < 9999) - for (X = re = 0, m = 0; m < de; m += g) - u[X++] = c[re] < m ? ++re : re; - } else - a.totalLength = c[0] = 0; - return e ? h - c[e / 2 - 1] : h; -} -function zi(a, e) { - var t, s, i; - for (i = t = s = 0; i < a.length; i++) - a[i].resolution = ~~e || 12, s += a[i].length, t += _d(a[i]); - return a.totalPoints = s, a.totalLength = t, a; -} -function Vn(a, e, t) { - if (t <= 0 || t >= 1) - return 0; - var s = a[e], i = a[e + 1], r = a[e + 2], o = a[e + 3], n = a[e + 4], l = a[e + 5], c = a[e + 6], u = a[e + 7], g = s + (r - s) * t, f = r + (n - r) * t, h = i + (o - i) * t, m = o + (l - o) * t, y = g + (f - g) * t, k = h + (m - h) * t, T = n + (c - n) * t, S = l + (u - l) * t; - return f += (T - f) * t, m += (S - m) * t, a.splice( - e + 2, - 4, - Ae(g), - //first control point - Ae(h), - Ae(y), - //second control point - Ae(k), - Ae(y + (f - y) * t), - //new fabricated anchor on line - Ae(k + (m - k) * t), - Ae(f), - //third control point - Ae(m), - Ae(T), - //fourth control point - Ae(S) - ), a.samples && a.samples.splice(e / 6 * a.resolution | 0, 0, 0, 0, 0, 0, 0, 0), 6; -} -function Tc(a, e, t, s) { - t = t || {}, a.totalLength || zi(a), (e < 0 || e > 1) && (e = g0(e)); - var i = 0, r = a[0], o, n, l, c, u, g, f; - if (!e) - f = g = i = 0, r = a[0]; - else if (e === 1) - f = 1, i = a.length - 1, r = a[i], g = r.length - 8; - else { - if (a.length > 1) { - for (l = a.totalLength * e, u = g = 0; (u += a[g++].totalLength) < l; ) - i = g; - r = a[i], c = u - r.totalLength, e = (l - c) / (u - c) || 0; - } - o = r.samples, n = r.resolution, l = r.totalLength * e, g = r.lookup.length ? r.lookup[~~(l / r.minLength)] || 0 : p0(o, l, e), c = g ? o[g - 1] : 0, u = o[g], u < l && (c = u, u = o[++g]), f = 1 / n * ((l - c) / (u - c) + g % n), g = ~~(g / n) * 6, s && f === 1 && (g + 6 < r.length ? (g += 6, f = 0) : i + 1 < a.length && (g = f = 0, r = a[++i])); - } - return t.t = f, t.i = g, t.path = a, t.segment = r, t.segIndex = i, t; -} -function Cc(a, e, t, s) { - var i = a[0], r = s || {}, o, n, l, c, u, g, f, h, m; - if ((e < 0 || e > 1) && (e = g0(e)), i.lookup || zi(a), a.length > 1) { - for (l = a.totalLength * e, u = g = 0; (u += a[g++].totalLength) < l; ) - i = a[g]; - c = u - i.totalLength, e = (l - c) / (u - c) || 0; - } - return o = i.samples, n = i.resolution, l = i.totalLength * e, g = i.lookup.length ? i.lookup[e < 1 ? ~~(l / i.minLength) : i.lookup.length - 1] || 0 : p0(o, l, e), c = g ? o[g - 1] : 0, u = o[g], u < l && (c = u, u = o[++g]), f = 1 / n * ((l - c) / (u - c) + g % n) || 0, m = 1 - f, g = ~~(g / n) * 6, h = i[g], r.x = Ae((f * f * (i[g + 6] - h) + 3 * m * (f * (i[g + 4] - h) + m * (i[g + 2] - h))) * f + h), r.y = Ae((f * f * (i[g + 7] - (h = i[g + 1])) + 3 * m * (f * (i[g + 5] - h) + m * (i[g + 3] - h))) * f + h), t && (r.angle = i.totalLength ? f0(i, g, f >= 1 ? 1 - 1e-9 : f || 1e-9) : i.angle || 0), r; -} -function nr(a, e, t, s, i, r, o) { - for (var n = a.length, l, c, u, g, f; --n > -1; ) - for (l = a[n], c = l.length, u = 0; u < c; u += 2) - g = l[u], f = l[u + 1], l[u] = g * e + f * s + r, l[u + 1] = g * t + f * i + o; - return a._dirty = 1, a; -} -function Sd(a, e, t, s, i, r, o, n, l) { - if (!(a === n && e === l)) { - t = ps(t), s = ps(s); - var c = i % 360 * hd, u = za(c), g = Ga(c), f = Math.PI, h = f * 2, m = (a - n) / 2, y = (e - l) / 2, k = u * m + g * y, T = -g * m + u * y, S = k * k, C = T * T, I = S / (t * t) + C / (s * s); - I > 1 && (t = Xs(I) * t, s = Xs(I) * s); - var E = t * t, F = s * s, O = (E * F - E * C - F * S) / (E * C + F * S); - O < 0 && (O = 0); - var R = (r === o ? -1 : 1) * Xs(O), L = R * (t * T / s), U = R * -(s * k / t), j = (a + n) / 2, re = (e + l) / 2, X = j + (u * L - g * U), de = re + (g * L + u * U), Q = (k - L) / t, le = (T - U) / s, d = (-k - L) / t, p = (-T - U) / s, w = Q * Q + le * le, b = (le < 0 ? -1 : 1) * Math.acos(Q / Xs(w)), D = (Q * p - le * d < 0 ? -1 : 1) * Math.acos((Q * d + le * p) / Xs(w * (d * d + p * p))); - isNaN(D) && (D = f), !o && D > 0 ? D -= h : o && D < 0 && (D += h), b %= h, D %= h; - var _ = Math.ceil(ps(D) / (h / 4)), P = [], N = D / _, V = 4 / 3 * Ga(N / 2) / (1 + za(N / 2)), K = u * t, ce = g * t, ee = g * -s, ke = u * s, ie; - for (ie = 0; ie < _; ie++) - i = b + ie * N, k = za(i), T = Ga(i), Q = za(i += N), le = Ga(i), P.push(k - V * T, T + V * k, Q + V * le, le - V * Q, Q, le); - for (ie = 0; ie < P.length; ie += 2) - k = P[ie], T = P[ie + 1], P[ie] = k * K + T * ee + X, P[ie + 1] = k * ce + T * ke + de; - return P[ie - 2] = n, P[ie - 1] = l, P; - } -} -function Ia(a) { - var e = (a + "").replace(cd, function(L) { - var U = +L; - return U < 1e-4 && U > -1e-4 ? 0 : U; - }).match(nd) || [], t = [], s = 0, i = 0, r = 2 / 3, o = e.length, n = 0, l = "ERROR: malformed path: " + a, c, u, g, f, h, m, y, k, T, S, C, I, E, F, O, R = function(U, j, re, X) { - S = (re - U) / 3, C = (X - j) / 3, y.push(U + S, j + C, re - S, X - C, re, X); - }; - if (!a || !isNaN(e[0]) || isNaN(e[1])) - return console.log(l), t; - for (c = 0; c < o; c++) - if (E = h, isNaN(e[c]) ? (h = e[c].toUpperCase(), m = h !== e[c]) : c--, g = +e[c + 1], f = +e[c + 2], m && (g += s, f += i), c || (k = g, T = f), h === "M") - y && (y.length < 8 ? t.length -= 1 : n += y.length), s = k = g, i = T = f, y = [g, f], t.push(y), c += 2, h = "L"; - else if (h === "C") - y || (y = [0, 0]), m || (s = i = 0), y.push(g, f, s + e[c + 3] * 1, i + e[c + 4] * 1, s += e[c + 5] * 1, i += e[c + 6] * 1), c += 6; - else if (h === "S") - S = s, C = i, (E === "C" || E === "S") && (S += s - y[y.length - 4], C += i - y[y.length - 3]), m || (s = i = 0), y.push(S, C, g, f, s += e[c + 3] * 1, i += e[c + 4] * 1), c += 4; - else if (h === "Q") - S = s + (g - s) * r, C = i + (f - i) * r, m || (s = i = 0), s += e[c + 3] * 1, i += e[c + 4] * 1, y.push(S, C, s + (g - s) * r, i + (f - i) * r, s, i), c += 4; - else if (h === "T") - S = s - y[y.length - 4], C = i - y[y.length - 3], y.push(s + S, i + C, g + (s + S * 1.5 - g) * r, f + (i + C * 1.5 - f) * r, s = g, i = f), c += 2; - else if (h === "H") - R(s, i, s = g, i), c += 1; - else if (h === "V") - R(s, i, s, i = g + (m ? i - s : 0)), c += 1; - else if (h === "L" || h === "Z") - h === "Z" && (g = k, f = T, y.closed = !0), (h === "L" || ps(s - g) > 0.5 || ps(i - f) > 0.5) && (R(s, i, g, f), h === "L" && (c += 2)), s = g, i = f; - else if (h === "A") { - if (F = e[c + 4], O = e[c + 5], S = e[c + 6], C = e[c + 7], u = 7, F.length > 1 && (F.length < 3 ? (C = S, S = O, u--) : (C = O, S = F.substr(2), u -= 2), O = F.charAt(1), F = F.charAt(0)), I = Sd(s, i, +e[c + 1], +e[c + 2], +e[c + 3], +F, +O, (m ? s : 0) + S * 1, (m ? i : 0) + C * 1), c += u, I) - for (u = 0; u < I.length; u++) - y.push(I[u]); - s = y[y.length - 2], i = y[y.length - 1]; - } else - console.log(l); - return c = y.length, c < 6 ? (t.pop(), c = 0) : y[0] === y[c - 2] && y[1] === y[c - 1] && (y.closed = !0), t.totalPoints = n + c, t; -} -function Ed(a, e) { - e === void 0 && (e = 1); - for (var t = a[0], s = 0, i = [t, s], r = 2; r < a.length; r += 2) - i.push(t, s, a[r], s = (a[r] - t) * e / 2, t = a[r], -s); - return i; -} -function jn(a, e) { - ps(a[0] - a[2]) < 1e-4 && ps(a[1] - a[3]) < 1e-4 && (a = a.slice(2)); - var t = a.length - 2, s = +a[0], i = +a[1], r = +a[2], o = +a[3], n = [s, i, s, i], l = r - s, c = o - i, u = Math.abs(a[t] - s) < 1e-3 && Math.abs(a[t + 1] - i) < 1e-3, g, f, h, m, y, k, T, S, C, I, E, F, O, R, L; - for (u && (a.push(r, o), r = s, o = i, s = a[t - 2], i = a[t - 1], a.unshift(s, i), t += 4), e = e || e === 0 ? +e : 1, h = 2; h < t; h += 2) - g = s, f = i, s = r, i = o, r = +a[h + 2], o = +a[h + 3], !(s === r && i === o) && (m = l, y = c, l = r - s, c = o - i, k = Xs(m * m + y * y), T = Xs(l * l + c * c), S = Xs(Math.pow(l / T + m / k, 2) + Math.pow(c / T + y / k, 2)), C = (k + T) * e * 0.25 / S, I = s - (s - g) * (k ? C / k : 0), E = s + (r - s) * (T ? C / T : 0), F = s - (I + ((E - I) * (k * 3 / (k + T) + 0.5) / 4 || 0)), O = i - (i - f) * (k ? C / k : 0), R = i + (o - i) * (T ? C / T : 0), L = i - (O + ((R - O) * (k * 3 / (k + T) + 0.5) / 4 || 0)), (s !== g || i !== f) && n.push( - Ae(I + F), - // first control point - Ae(O + L), - Ae(s), - // anchor - Ae(i), - Ae(E + F), - // second control point - Ae(R + L) - )); - return s !== r || i !== o || n.length < 4 ? n.push(Ae(r), Ae(o), Ae(r), Ae(o)) : n.length -= 2, n.length === 2 ? n.push(s, i, s, i, s, i) : u && (n.splice(0, 6), n.length = n.length - 6), n; -} -function Il(a) { - d0(a[0]) && (a = [a]); - var e = "", t = a.length, s, i, r, o; - for (i = 0; i < t; i++) { - for (o = a[i], e += "M" + Ae(o[0]) + "," + Ae(o[1]) + " C", s = o.length, r = 2; r < s; r++) - e += Ae(o[r++]) + "," + Ae(o[r++]) + " " + Ae(o[r++]) + "," + Ae(o[r++]) + " " + Ae(o[r++]) + "," + Ae(o[r]) + " "; - o.closed && (e += "z"); - } - return e; -} -/*! - * CustomEase 3.12.5 - * https://gsap.com - * - * @license Copyright 2008-2024, GreenSock. All rights reserved. - * Subject to the terms at https://gsap.com/standard-license or for - * Club GSAP members, the agreement issued with that membership. - * @author: Jack Doyle, jack@greensock.com -*/ -var Wt, y0, b0 = function() { - return Wt || typeof window < "u" && (Wt = window.gsap) && Wt.registerPlugin && Wt; -}, _c = function() { - Wt = b0(), Wt ? (Wt.registerEase("_CE", $a.create), y0 = 1) : console.warn("Please gsap.registerPlugin(CustomEase)"); -}, xd = 1e20, qa = function(e) { - return ~~(e * 1e3 + (e < 0 ? -0.5 : 0.5)) / 1e3; -}, Id = /[-+=.]*\d+[.e\-+]*\d*[e\-+]*\d*/gi, Ad = /[cLlsSaAhHvVtTqQ]/g, Pd = function(e) { - var t = e.length, s = xd, i; - for (i = 1; i < t; i += 6) - +e[i] < s && (s = +e[i]); - return s; -}, Md = function(e, t, s) { - !s && s !== 0 && (s = Math.max(+e[e.length - 1], +e[1])); - var i = +e[0] * -1, r = -s, o = e.length, n = 1 / (+e[o - 2] + i), l = -t || (Math.abs(+e[o - 1] - +e[1]) < 0.01 * (+e[o - 2] - +e[0]) ? Pd(e) + r : +e[o - 1] + r), c; - for (l ? l = 1 / l : l = -n, c = 0; c < o; c += 2) - e[c] = (+e[c] + i) * n, e[c + 1] = (+e[c + 1] + r) * l; -}, Od = function a(e, t, s, i, r, o, n, l, c, u, g) { - var f = (e + s) / 2, h = (t + i) / 2, m = (s + r) / 2, y = (i + o) / 2, k = (r + n) / 2, T = (o + l) / 2, S = (f + m) / 2, C = (h + y) / 2, I = (m + k) / 2, E = (y + T) / 2, F = (S + I) / 2, O = (C + E) / 2, R = n - e, L = l - t, U = Math.abs((s - n) * L - (i - l) * R), j = Math.abs((r - n) * L - (o - l) * R), re; - return u || (u = [{ - x: e, - y: t - }, { - x: n, - y: l - }], g = 1), u.splice(g || u.length - 1, 0, { - x: F, - y: O - }), (U + j) * (U + j) > c * (R * R + L * L) && (re = u.length, a(e, t, f, h, S, C, F, O, c, u, g), a(F, O, I, E, k, T, n, l, c, u, g + 1 + (u.length - re))), u; -}, $a = /* @__PURE__ */ function() { - function a(t, s, i) { - y0 || _c(), this.id = t, this.setData(s, i); - } - var e = a.prototype; - return e.setData = function(s, i) { - i = i || {}, s = s || "0,0,1,1"; - var r = s.match(Id), o = 1, n = [], l = [], c = i.precision || 1, u = c <= 1, g, f, h, m, y, k, T, S, C; - if (this.data = s, (Ad.test(s) || ~s.indexOf("M") && s.indexOf("C") < 0) && (r = Ia(s)[0]), g = r.length, g === 4) - r.unshift(0, 0), r.push(1, 1), g = 8; - else if ((g - 2) % 6) - throw "Invalid CustomEase"; - for ((+r[0] != 0 || +r[g - 2] != 1) && Md(r, i.height, i.originY), this.segment = r, m = 2; m < g; m += 6) - f = { - x: +r[m - 2], - y: +r[m - 1] - }, h = { - x: +r[m + 4], - y: +r[m + 5] - }, n.push(f, h), Od(f.x, f.y, +r[m], +r[m + 1], +r[m + 2], +r[m + 3], h.x, h.y, 1 / (c * 2e5), n, n.length - 1); - for (g = n.length, m = 0; m < g; m++) - T = n[m], S = n[m - 1] || T, (T.x > S.x || S.y !== T.y && S.x === T.x || T === S) && T.x <= 1 ? (S.cx = T.x - S.x, S.cy = T.y - S.y, S.n = T, S.nx = T.x, u && m > 1 && Math.abs(S.cy / S.cx - n[m - 2].cy / n[m - 2].cx) > 2 && (u = 0), S.cx < o && (S.cx ? o = S.cx : (S.cx = 1e-3, m === g - 1 && (S.x -= 1e-3, o = Math.min(o, 1e-3), u = 0)))) : (n.splice(m--, 1), g--); - if (g = 1 / o + 1 | 0, y = 1 / g, k = 0, T = n[0], u) { - for (m = 0; m < g; m++) - C = m * y, T.nx < C && (T = n[++k]), f = T.y + (C - T.x) / T.cx * T.cy, l[m] = { - x: C, - cx: y, - y: f, - cy: 0, - nx: 9 - }, m && (l[m - 1].cy = f - l[m - 1].y); - l[g - 1].cy = n[n.length - 1].y - f; - } else { - for (m = 0; m < g; m++) - T.nx < m * y && (T = n[++k]), l[m] = T; - k < n.length - 1 && (l[m - 1] = n[n.length - 2]); - } - return this.ease = function(I) { - var E = l[I * g | 0] || l[g - 1]; - return E.nx < I && (E = E.n), E.y + (I - E.x) / E.cx * E.cy; - }, this.ease.custom = this, this.id && Wt && Wt.registerEase(this.id, this.ease), this; - }, e.getSVGData = function(s) { - return a.getSVGData(this, s); - }, a.create = function(s, i, r) { - return new a(s, i, r).ease; - }, a.register = function(s) { - Wt = s, _c(); - }, a.get = function(s) { - return Wt.parseEase(s); - }, a.getSVGData = function(s, i) { - i = i || {}; - var r = i.width || 100, o = i.height || 100, n = i.x || 0, l = (i.y || 0) + o, c = Wt.utils.toArray(i.path)[0], u, g, f, h, m, y, k, T, S, C; - if (i.invert && (o = -o, l = 0), typeof s == "string" && (s = Wt.parseEase(s)), s.custom && (s = s.custom), s instanceof a) - u = Il(nr([s.segment], r, 0, 0, -o, n, l)); - else { - for (u = [n, l], k = Math.max(5, (i.precision || 1) * 200), h = 1 / k, k += 2, T = 5 / k, S = qa(n + h * r), C = qa(l + s(h) * -o), g = (C - l) / (S - n), f = 2; f < k; f++) - m = qa(n + f * h * r), y = qa(l + s(f * h) * -o), (Math.abs((y - C) / (m - S) - g) > T || f === k - 1) && (u.push(S, C), g = (y - C) / (m - S)), S = m, C = y; - u = "M" + u.join(","); - } - return c && c.setAttribute("d", u), u; - }, a; -}(); -b0() && Wt.registerPlugin($a); -$a.version = "3.12.5"; -/*! - * matrix 3.12.5 - * https://gsap.com - * - * Copyright 2008-2024, GreenSock. All rights reserved. - * Subject to the terms at https://gsap.com/standard-license or for - * Club GSAP members, the agreement issued with that membership. - * @author: Jack Doyle, jack@greensock.com -*/ -var Zs, qi, Al, Ro, Jr, oo, vo, la, Ts = "transform", Gn = Ts + "Origin", v0, Pl = function(e) { - var t = e.ownerDocument || e; - for (!(Ts in e.style) && ("msTransform" in e.style) && (Ts = "msTransform", Gn = Ts + "Origin"); t.parentNode && (t = t.parentNode); ) - ; - if (qi = window, vo = new ri(), t) { - Zs = t, Al = t.documentElement, Ro = t.body, la = Zs.createElementNS("http://www.w3.org/2000/svg", "g"), la.style.transform = "none"; - var s = t.createElement("div"), i = t.createElement("div"), r = t && (t.body || t.firstElementChild); - r && r.appendChild && (r.appendChild(s), s.appendChild(i), s.setAttribute("style", "position:static;transform:translate3d(0,0,1px)"), v0 = i.offsetParent !== s, r.removeChild(s)); - } - return t; -}, Fd = function(e) { - for (var t, s; e && e !== Ro; ) - s = e._gsap, s && s.uncache && s.get(e, "x"), s && !s.scaleX && !s.scaleY && s.renderTransform && (s.scaleX = s.scaleY = 1e-4, s.renderTransform(1, s), t ? t.push(s) : t = [s]), e = e.parentNode; - return t; -}, w0 = [], k0 = [], Ml = function() { - return qi.pageYOffset || Zs.scrollTop || Al.scrollTop || Ro.scrollTop || 0; -}, Ol = function() { - return qi.pageXOffset || Zs.scrollLeft || Al.scrollLeft || Ro.scrollLeft || 0; -}, Fl = function(e) { - return e.ownerSVGElement || ((e.tagName + "").toLowerCase() === "svg" ? e : null); -}, Ld = function a(e) { - if (qi.getComputedStyle(e).position === "fixed") - return !0; - if (e = e.parentNode, e && e.nodeType === 1) - return a(e); -}, ln = function a(e, t) { - if (e.parentNode && (Zs || Pl(e))) { - var s = Fl(e), i = s ? s.getAttribute("xmlns") || "http://www.w3.org/2000/svg" : "http://www.w3.org/1999/xhtml", r = s ? t ? "rect" : "g" : "div", o = t !== 2 ? 0 : 100, n = t === 3 ? 100 : 0, l = "position:absolute;display:block;pointer-events:none;margin:0;padding:0;", c = Zs.createElementNS ? Zs.createElementNS(i.replace(/^https/, "http"), r) : Zs.createElement(r); - return t && (s ? (oo || (oo = a(e)), c.setAttribute("width", 0.01), c.setAttribute("height", 0.01), c.setAttribute("transform", "translate(" + o + "," + n + ")"), oo.appendChild(c)) : (Jr || (Jr = a(e), Jr.style.cssText = l), c.style.cssText = l + "width:0.1px;height:0.1px;top:" + n + "px;left:" + o + "px", Jr.appendChild(c))), c; - } - throw "Need document and parent."; -}, Rd = function(e) { - for (var t = new ri(), s = 0; s < e.numberOfItems; s++) - t.multiply(e.getItem(s).matrix); - return t; -}, D0 = function(e) { - var t = e.getCTM(), s; - return t || (s = e.style[Ts], e.style[Ts] = "none", e.appendChild(la), t = la.getCTM(), e.removeChild(la), s ? e.style[Ts] = s : e.style.removeProperty(Ts.replace(/([A-Z])/g, "-$1").toLowerCase())), t || vo.clone(); -}, $d = function(e, t) { - var s = Fl(e), i = e === s, r = s ? w0 : k0, o = e.parentNode, n, l, c, u, g, f; - if (e === qi) - return e; - if (r.length || r.push(ln(e, 1), ln(e, 2), ln(e, 3)), n = s ? oo : Jr, s) - i ? (c = D0(e), u = -c.e / c.a, g = -c.f / c.d, l = vo) : e.getBBox ? (c = e.getBBox(), l = e.transform ? e.transform.baseVal : {}, l = l.numberOfItems ? l.numberOfItems > 1 ? Rd(l) : l.getItem(0).matrix : vo, u = l.a * c.x + l.c * c.y, g = l.b * c.x + l.d * c.y) : (l = new ri(), u = g = 0), t && e.tagName.toLowerCase() === "g" && (u = g = 0), (i ? s : o).appendChild(n), n.setAttribute("transform", "matrix(" + l.a + "," + l.b + "," + l.c + "," + l.d + "," + (l.e + u) + "," + (l.f + g) + ")"); - else { - if (u = g = 0, v0) - for (l = e.offsetParent, c = e; c && (c = c.parentNode) && c !== l && c.parentNode; ) - (qi.getComputedStyle(c)[Ts] + "").length > 4 && (u = c.offsetLeft, g = c.offsetTop, c = 0); - if (f = qi.getComputedStyle(e), f.position !== "absolute" && f.position !== "fixed") - for (l = e.offsetParent; o && o !== l; ) - u += o.scrollLeft || 0, g += o.scrollTop || 0, o = o.parentNode; - c = n.style, c.top = e.offsetTop - g + "px", c.left = e.offsetLeft - u + "px", c[Ts] = f[Ts], c[Gn] = f[Gn], c.position = f.position === "fixed" ? "fixed" : "absolute", e.parentNode.appendChild(n); - } - return n; -}, cn = function(e, t, s, i, r, o, n) { - return e.a = t, e.b = s, e.c = i, e.d = r, e.e = o, e.f = n, e; -}, ri = /* @__PURE__ */ function() { - function a(t, s, i, r, o, n) { - t === void 0 && (t = 1), s === void 0 && (s = 0), i === void 0 && (i = 0), r === void 0 && (r = 1), o === void 0 && (o = 0), n === void 0 && (n = 0), cn(this, t, s, i, r, o, n); - } - var e = a.prototype; - return e.inverse = function() { - var s = this.a, i = this.b, r = this.c, o = this.d, n = this.e, l = this.f, c = s * o - i * r || 1e-10; - return cn(this, o / c, -i / c, -r / c, s / c, (r * l - o * n) / c, -(s * l - i * n) / c); - }, e.multiply = function(s) { - var i = this.a, r = this.b, o = this.c, n = this.d, l = this.e, c = this.f, u = s.a, g = s.c, f = s.b, h = s.d, m = s.e, y = s.f; - return cn(this, u * i + f * o, u * r + f * n, g * i + h * o, g * r + h * n, l + m * i + y * o, c + m * r + y * n); - }, e.clone = function() { - return new a(this.a, this.b, this.c, this.d, this.e, this.f); - }, e.equals = function(s) { - var i = this.a, r = this.b, o = this.c, n = this.d, l = this.e, c = this.f; - return i === s.a && r === s.b && o === s.c && n === s.d && l === s.e && c === s.f; - }, e.apply = function(s, i) { - i === void 0 && (i = {}); - var r = s.x, o = s.y, n = this.a, l = this.b, c = this.c, u = this.d, g = this.e, f = this.f; - return i.x = r * n + o * c + g || 0, i.y = r * l + o * u + f || 0, i; - }, a; -}(); -function Xe(a, e, t, s) { - if (!a || !a.parentNode || (Zs || Pl(a)).documentElement === a) - return new ri(); - var i = Fd(a), r = Fl(a), o = r ? w0 : k0, n = $d(a, t), l = o[0].getBoundingClientRect(), c = o[1].getBoundingClientRect(), u = o[2].getBoundingClientRect(), g = n.parentNode, f = !s && Ld(a), h = new ri((c.left - l.left) / 100, (c.top - l.top) / 100, (u.left - l.left) / 100, (u.top - l.top) / 100, l.left + (f ? 0 : Ol()), l.top + (f ? 0 : Ml())); - if (g.removeChild(n), i) - for (l = i.length; l--; ) - c = i[l], c.scaleX = c.scaleY = 0, c.renderTransform(1, c); - return e ? h.inverse() : h; -} -/*! - * Flip 3.12.5 - * https://gsap.com - * - * @license Copyright 2008-2024, GreenSock. All rights reserved. - * Subject to the terms at https://gsap.com/standard-license or for - * Club GSAP members, the agreement issued with that membership. - * @author: Jack Doyle, jack@greensock.com -*/ -var Nd = 1, Pr, _t, Ge, ca, gi, Js, zn, Sc = function(e, t) { - return e.actions.forEach(function(s) { - return s.vars[t] && s.vars[t](s); - }); -}, qn = {}, Ec = 180 / Math.PI, Bd = Math.PI / 180, wo = {}, xc = {}, $o = {}, Ll = function(e) { - return typeof e == "string" ? e.split(" ").join("").split(",") : e; -}, Hd = Ll("onStart,onUpdate,onComplete,onReverseComplete,onInterrupt"), No = Ll("transform,transformOrigin,width,height,position,top,left,opacity,zIndex,maxWidth,maxHeight,minWidth,minHeight"), ua = function(e) { - return Pr(e)[0] || console.warn("Element not found:", e); -}, lr = function(e) { - return Math.round(e * 1e4) / 1e4 || 0; -}, un = function(e, t, s) { - return e.forEach(function(i) { - return i.classList[s](t); - }); -}, Ic = { - zIndex: 1, - kill: 1, - simple: 1, - spin: 1, - clearProps: 1, - targets: 1, - toggleClass: 1, - onComplete: 1, - onUpdate: 1, - onInterrupt: 1, - onStart: 1, - delay: 1, - repeat: 1, - repeatDelay: 1, - yoyo: 1, - scale: 1, - fade: 1, - absolute: 1, - props: 1, - onEnter: 1, - onLeave: 1, - custom: 1, - paused: 1, - nested: 1, - prune: 1, - absoluteOnLeave: 1 -}, T0 = { - zIndex: 1, - simple: 1, - clearProps: 1, - scale: 1, - absolute: 1, - fitChild: 1, - getVars: 1, - props: 1 -}, C0 = function(e) { - return e.replace(/([A-Z])/g, "-$1").toLowerCase(); -}, cr = function(e, t) { - var s = {}, i; - for (i in e) - t[i] || (s[i] = e[i]); - return s; -}, Rl = {}, _0 = function(e) { - var t = Rl[e] = Ll(e); - return $o[e] = t.concat(No), t; -}, Wd = function(e) { - var t = e._gsap || _t.core.getCache(e); - return t.gmCache === _t.ticker.frame ? t.gMatrix : (t.gmCache = _t.ticker.frame, t.gMatrix = Xe(e, !0, !1, !0)); -}, Kd = function a(e, t, s) { - s === void 0 && (s = 0); - for (var i = e.parentNode, r = 1e3 * Math.pow(10, s) * (t ? -1 : 1), o = t ? -r * 900 : 0; e; ) - o += r, e = e.previousSibling; - return i ? o + a(i, t, s + 1) : o; -}, ko = function(e, t, s) { - return e.forEach(function(i) { - return i.d = Kd(s ? i.element : i.t, t); - }), e.sort(function(i, r) { - return i.d - r.d; - }), e; -}, Aa = function(e, t) { - for (var s = e.element.style, i = e.css = e.css || [], r = t.length, o, n; r--; ) - o = t[r], n = s[o] || s.getPropertyValue(o), i.push(n ? o : xc[o] || (xc[o] = C0(o)), n); - return s; -}, Do = function(e) { - var t = e.css, s = e.element.style, i = 0; - for (e.cache.uncache = 1; i < t.length; i += 2) - t[i + 1] ? s[t[i]] = t[i + 1] : s.removeProperty(t[i]); - !t[t.indexOf("transform") + 1] && s.translate && (s.removeProperty("translate"), s.removeProperty("scale"), s.removeProperty("rotate")); -}, Ac = function(e, t) { - e.forEach(function(s) { - return s.a.cache.uncache = 1; - }), t || e.finalStates.forEach(Do); -}, hn = "paddingTop,paddingRight,paddingBottom,paddingLeft,gridArea,transition".split(","), $l = function(e, t, s) { - var i = e.element, r = e.width, o = e.height, n = e.uncache, l = e.getProp, c = i.style, u = 4, g, f, h; - if (typeof t != "object" && (t = e), Ge && s !== 1) - return Ge._abs.push({ - t: i, - b: e, - a: e, - sd: 0 - }), Ge._final.push(function() { - return (e.cache.uncache = 1) && Do(e); - }), i; - for (f = l("display") === "none", (!e.isVisible || f) && (f && (Aa(e, ["display"]).display = t.display), e.matrix = t.matrix, e.width = r = e.width || t.width, e.height = o = e.height || t.height), Aa(e, hn), h = window.getComputedStyle(i); u--; ) - c[hn[u]] = h[hn[u]]; - if (c.gridArea = "1 / 1 / 1 / 1", c.transition = "none", c.position = "absolute", c.width = r + "px", c.height = o + "px", c.top || (c.top = "0px"), c.left || (c.left = "0px"), n) - g = new Zi(i); - else if (g = cr(e, wo), g.position = "absolute", e.simple) { - var m = i.getBoundingClientRect(); - g.matrix = new ri(1, 0, 0, 1, m.left + Ol(), m.top + Ml()); - } else - g.matrix = Xe(i, !1, !1, !0); - return g = mr(g, e, !0), e.x = Js(g.x, 0.01), e.y = Js(g.y, 0.01), i; -}, Pc = function(e, t) { - return t !== !0 && (t = Pr(t), e = e.filter(function(s) { - if (t.indexOf((s.sd < 0 ? s.b : s.a).element) !== -1) - return !0; - s.t._gsap.renderTransform(1), s.b.isVisible && (s.t.style.width = s.b.width + "px", s.t.style.height = s.b.height + "px"); - })), e; -}, S0 = function(e) { - return ko(e, !0).forEach(function(t) { - return (t.a.isVisible || t.b.isVisible) && $l(t.sd < 0 ? t.b : t.a, t.b, 1); - }); -}, Vd = function(e, t) { - return t && e.idLookup[Yn(t).id] || e.elementStates[0]; -}, Yn = function(e, t, s, i) { - return e instanceof Zi ? e : e instanceof _s ? Vd(e, i) : new Zi(typeof e == "string" ? ua(e) || console.warn(e + " not found") : e, t, s); -}, jd = function(e, t) { - for (var s = _t.getProperty(e.element, null, "native"), i = e.props = {}, r = t.length; r--; ) - i[t[r]] = (s(t[r]) + "").trim(); - return i.zIndex && (i.zIndex = parseFloat(i.zIndex) || 0), e; -}, E0 = function(e, t) { - var s = e.style || e, i; - for (i in t) - s[i] = t[i]; -}, Gd = function(e) { - var t = e.getAttribute("data-flip-id"); - return t || e.setAttribute("data-flip-id", t = "auto-" + Nd++), t; -}, x0 = function(e) { - return e.map(function(t) { - return t.element; - }); -}, Mc = function(e, t, s) { - return e && t.length && s.add(e(x0(t), s, new _s(t, 0, !0)), 0); -}, mr = function(e, t, s, i, r, o) { - var n = e.element, l = e.cache, c = e.parent, u = e.x, g = e.y, f = t.width, h = t.height, m = t.scaleX, y = t.scaleY, k = t.rotation, T = t.bounds, S = o && zn && zn(n, "transform"), C = e, I = t.matrix, E = I.e, F = I.f, O = e.bounds.width !== T.width || e.bounds.height !== T.height || e.scaleX !== m || e.scaleY !== y || e.rotation !== k, R = !O && e.simple && t.simple && !r, L, U, j, re, X, de, Q; - return R || !c ? (m = y = 1, k = L = 0) : (X = Wd(c), de = X.clone().multiply(t.ctm ? t.matrix.clone().multiply(t.ctm) : t.matrix), k = lr(Math.atan2(de.b, de.a) * Ec), L = lr(Math.atan2(de.c, de.d) * Ec + k) % 360, m = Math.sqrt(Math.pow(de.a, 2) + Math.pow(de.b, 2)), y = Math.sqrt(Math.pow(de.c, 2) + Math.pow(de.d, 2)) * Math.cos(L * Bd), r && (r = Pr(r)[0], re = _t.getProperty(r), Q = r.getBBox && typeof r.getBBox == "function" && r.getBBox(), C = { - scaleX: re("scaleX"), - scaleY: re("scaleY"), - width: Q ? Q.width : Math.ceil(parseFloat(re("width", "px"))), - height: Q ? Q.height : parseFloat(re("height", "px")) - }), l.rotation = k + "deg", l.skewX = L + "deg"), s ? (m *= f === C.width || !C.width ? 1 : f / C.width, y *= h === C.height || !C.height ? 1 : h / C.height, l.scaleX = m, l.scaleY = y) : (f = Js(f * m / C.scaleX, 0), h = Js(h * y / C.scaleY, 0), n.style.width = f + "px", n.style.height = h + "px"), i && E0(n, t.props), R || !c ? (u += E - e.matrix.e, g += F - e.matrix.f) : O || c !== t.parent ? (l.renderTransform(1, l), de = Xe(r || n, !1, !1, !0), U = X.apply({ - x: de.e, - y: de.f - }), j = X.apply({ - x: E, - y: F - }), u += j.x - U.x, g += j.y - U.y) : (X.e = X.f = 0, j = X.apply({ - x: E - e.matrix.e, - y: F - e.matrix.f - }), u += j.x, g += j.y), u = Js(u, 0.02), g = Js(g, 0.02), o && !(o instanceof Zi) ? S && S.revert() : (l.x = u + "px", l.y = g + "px", l.renderTransform(1, l)), o && (o.x = u, o.y = g, o.rotation = k, o.skewX = L, s ? (o.scaleX = m, o.scaleY = y) : (o.width = f, o.height = h)), o || l; -}, dn = function(e, t) { - return e instanceof _s ? e : new _s(e, t); -}, I0 = function(e, t, s) { - var i = e.idLookup[s], r = e.alt[s]; - return r.isVisible && (!(t.getElementState(r.element) || r).isVisible || !i.isVisible) ? r : i; -}, gn = [], pn = "width,height,overflowX,overflowY".split(","), Ya, Oc = function(e) { - if (e !== Ya) { - var t = gi.style, s = gi.clientWidth === window.outerWidth, i = gi.clientHeight === window.outerHeight, r = 4; - if (e && (s || i)) { - for (; r--; ) - gn[r] = t[pn[r]]; - s && (t.width = gi.clientWidth + "px", t.overflowY = "hidden"), i && (t.height = gi.clientHeight + "px", t.overflowX = "hidden"), Ya = e; - } else if (Ya) { - for (; r--; ) - gn[r] ? t[pn[r]] = gn[r] : t.removeProperty(C0(pn[r])); - Ya = e; - } - } -}, fn = function(e, t, s, i) { - e instanceof _s && t instanceof _s || console.warn("Not a valid state object."), s = s || {}; - var r = s, o = r.clearProps, n = r.onEnter, l = r.onLeave, c = r.absolute, u = r.absoluteOnLeave, g = r.custom, f = r.delay, h = r.paused, m = r.repeat, y = r.repeatDelay, k = r.yoyo, T = r.toggleClass, S = r.nested, C = r.zIndex, I = r.scale, E = r.fade, F = r.stagger, O = r.spin, R = r.prune, L = ("props" in s ? s : e).props, U = cr(s, Ic), j = _t.timeline({ - delay: f, - paused: h, - repeat: m, - repeatDelay: y, - yoyo: k, - data: "isFlip" - }), re = U, X = [], de = [], Q = [], le = [], d = O === !0 ? 1 : O || 0, p = typeof O == "function" ? O : function() { - return d; - }, w = e.interrupted || t.interrupted, b = j[i !== 1 ? "to" : "from"], D, _, P, N, V, K, ce, ee, ke, ie, pe, be, me, ge; - for (_ in t.idLookup) - pe = t.alt[_] ? I0(t, e, _) : t.idLookup[_], V = pe.element, ie = e.idLookup[_], e.alt[_] && V === ie.element && (e.alt[_].isVisible || !pe.isVisible) && (ie = e.alt[_]), ie ? (K = { - t: V, - b: ie, - a: pe, - sd: ie.element === V ? 0 : pe.isVisible ? 1 : -1 - }, Q.push(K), K.sd && (K.sd < 0 && (K.b = pe, K.a = ie), w && Aa(K.b, L ? $o[L] : No), E && Q.push(K.swap = { - t: ie.element, - b: K.b, - a: K.a, - sd: -K.sd, - swap: K - })), V._flip = ie.element._flip = Ge ? Ge.timeline : j) : pe.isVisible && (Q.push({ - t: V, - b: cr(pe, { - isVisible: 1 - }), - a: pe, - sd: 0, - entering: 1 - }), V._flip = Ge ? Ge.timeline : j); - if (L && (Rl[L] || _0(L)).forEach(function(B) { - return U[B] = function(De) { - return Q[De].a.props[B]; - }; - }), Q.finalStates = ke = [], be = function() { - for (ko(Q), Oc(!0), N = 0; N < Q.length; N++) - K = Q[N], me = K.a, ge = K.b, R && !me.isDifferent(ge) && !K.entering ? Q.splice(N--, 1) : (V = K.t, S && !(K.sd < 0) && N && (me.matrix = Xe(V, !1, !1, !0)), ge.isVisible && me.isVisible ? (K.sd < 0 ? (ce = new Zi(V, L, e.simple), mr(ce, me, I, 0, 0, ce), ce.matrix = Xe(V, !1, !1, !0), ce.css = K.b.css, K.a = me = ce, E && (V.style.opacity = w ? ge.opacity : me.opacity), F && le.push(V)) : K.sd > 0 && E && (V.style.opacity = w ? me.opacity - ge.opacity : "0"), mr(me, ge, I, L)) : ge.isVisible !== me.isVisible && (ge.isVisible ? me.isVisible || (ge.css = me.css, de.push(ge), Q.splice(N--, 1), c && S && mr(me, ge, I, L)) : (me.isVisible && X.push(me), Q.splice(N--, 1))), I || (V.style.maxWidth = Math.max(me.width, ge.width) + "px", V.style.maxHeight = Math.max(me.height, ge.height) + "px", V.style.minWidth = Math.min(me.width, ge.width) + "px", V.style.minHeight = Math.min(me.height, ge.height) + "px"), S && T && V.classList.add(T)), ke.push(me); - var De; - if (T && (De = ke.map(function(ye) { - return ye.element; - }), S && De.forEach(function(ye) { - return ye.classList.remove(T); - })), Oc(!1), I ? (U.scaleX = function(ye) { - return Q[ye].a.scaleX; - }, U.scaleY = function(ye) { - return Q[ye].a.scaleY; - }) : (U.width = function(ye) { - return Q[ye].a.width + "px"; - }, U.height = function(ye) { - return Q[ye].a.height + "px"; - }, U.autoRound = s.autoRound || !1), U.x = function(ye) { - return Q[ye].a.x + "px"; - }, U.y = function(ye) { - return Q[ye].a.y + "px"; - }, U.rotation = function(ye) { - return Q[ye].a.rotation + (O ? p(ye, ee[ye], ee) * 360 : 0); - }, U.skewX = function(ye) { - return Q[ye].a.skewX; - }, ee = Q.map(function(ye) { - return ye.t; - }), (C || C === 0) && (U.modifiers = { - zIndex: function() { - return C; - } - }, U.zIndex = C, U.immediateRender = s.immediateRender !== !1), E && (U.opacity = function(ye) { - return Q[ye].sd < 0 ? 0 : Q[ye].sd > 0 ? Q[ye].a.opacity : "+=0"; - }), le.length) { - F = _t.utils.distribute(F); - var lt = ee.slice(le.length); - U.stagger = function(ye, Ve) { - return F(~le.indexOf(Ve) ? ee.indexOf(Q[ye].swap.t) : ye, Ve, lt); - }; - } - if (Hd.forEach(function(ye) { - return s[ye] && j.eventCallback(ye, s[ye], s[ye + "Params"]); - }), g && ee.length) { - re = cr(U, Ic), "scale" in g && (g.scaleX = g.scaleY = g.scale, delete g.scale); - for (_ in g) - D = cr(g[_], T0), D[_] = U[_], !("duration" in D) && "duration" in U && (D.duration = U.duration), D.stagger = U.stagger, b.call(j, ee, D, 0), delete re[_]; - } - (ee.length || de.length || X.length) && (T && j.add(function() { - return un(De, T, j._zTime < 0 ? "remove" : "add"); - }, 0) && !h && un(De, T, "add"), ee.length && b.call(j, ee, re, 0)), Mc(n, X, j), Mc(l, de, j); - var Ke = Ge && Ge.timeline; - Ke && (Ke.add(j, 0), Ge._final.push(function() { - return Ac(Q, !o); - })), P = j.duration(), j.call(function() { - var ye = j.time() >= P; - ye && !Ke && Ac(Q, !o), T && un(De, T, ye ? "remove" : "add"); - }); - }, u && (c = Q.filter(function(B) { - return !B.sd && !B.a.isVisible && B.b.isVisible; - }).map(function(B) { - return B.a.element; - })), Ge) { - var ve; - c && (ve = Ge._abs).push.apply(ve, Pc(Q, c)), Ge._run.push(be); - } else - c && S0(Pc(Q, c)), be(); - var Ze = Ge ? Ge.timeline : j; - return Ze.revert = function() { - return Nl(Ze, 1, 1); - }, Ze; -}, zd = function a(e) { - e.vars.onInterrupt && e.vars.onInterrupt.apply(e, e.vars.onInterruptParams || []), e.getChildren(!0, !1, !0).forEach(a); -}, Nl = function(e, t, s) { - if (e && e.progress() < 1 && (!e.paused() || s)) - return t && (zd(e), t < 2 && e.progress(1), e.kill()), !0; -}, Ua = function(e) { - for (var t = e.idLookup = {}, s = e.alt = {}, i = e.elementStates, r = i.length, o; r--; ) - o = i[r], t[o.id] ? s[o.id] = o : t[o.id] = o; -}, _s = /* @__PURE__ */ function() { - function a(t, s, i) { - if (this.props = s && s.props, this.simple = !!(s && s.simple), i) - this.targets = x0(t), this.elementStates = t, Ua(this); - else { - this.targets = Pr(t); - var r = s && (s.kill === !1 || s.batch && !s.kill); - Ge && !r && Ge._kill.push(this), this.update(r || !!Ge); - } - } - var e = a.prototype; - return e.update = function(s) { - var i = this; - return this.elementStates = this.targets.map(function(r) { - return new Zi(r, i.props, i.simple); - }), Ua(this), this.interrupt(s), this.recordInlineStyles(), this; - }, e.clear = function() { - return this.targets.length = this.elementStates.length = 0, Ua(this), this; - }, e.fit = function(s, i, r) { - for (var o = ko(this.elementStates.slice(0), !1, !0), n = (s || this).idLookup, l = 0, c, u; l < o.length; l++) - c = o[l], r && (c.matrix = Xe(c.element, !1, !1, !0)), u = n[c.id], u && mr(c, u, i, !0, 0, c), c.matrix = Xe(c.element, !1, !1, !0); - return this; - }, e.getProperty = function(s, i) { - var r = this.getElementState(s) || wo; - return (i in r ? r : r.props || wo)[i]; - }, e.add = function(s) { - for (var i = s.targets.length, r = this.idLookup, o = this.alt, n, l, c; i--; ) - l = s.elementStates[i], c = r[l.id], c && (l.element === c.element || o[l.id] && o[l.id].element === l.element) ? (n = this.elementStates.indexOf(l.element === c.element ? c : o[l.id]), this.targets.splice(n, 1, s.targets[i]), this.elementStates.splice(n, 1, l)) : (this.targets.push(s.targets[i]), this.elementStates.push(l)); - return s.interrupted && (this.interrupted = !0), s.simple || (this.simple = !1), Ua(this), this; - }, e.compare = function(s) { - var i = s.idLookup, r = this.idLookup, o = [], n = [], l = [], c = [], u = [], g = s.alt, f = this.alt, h = function(R, L, U) { - return (R.isVisible !== L.isVisible ? R.isVisible ? l : c : R.isVisible ? n : o).push(U) && u.push(U); - }, m = function(R, L, U) { - return u.indexOf(U) < 0 && h(R, L, U); - }, y, k, T, S, C, I, E, F; - for (T in i) - C = g[T], I = f[T], y = C ? I0(s, this, T) : i[T], S = y.element, k = r[T], I ? (F = k.isVisible || !I.isVisible && S === k.element ? k : I, E = C && !y.isVisible && !C.isVisible && F.element === C.element ? C : y, E.isVisible && F.isVisible && E.element !== F.element ? ((E.isDifferent(F) ? n : o).push(E.element, F.element), u.push(E.element, F.element)) : h(E, F, E.element), C && E.element === C.element && (C = i[T]), m(E.element !== k.element && C ? C : E, k, k.element), m(C && C.element === I.element ? C : E, I, I.element), C && m(C, I.element === C.element ? I : k, C.element)) : (k ? k.isDifferent(y) ? h(y, k, S) : o.push(S) : l.push(S), C && m(C, k, C.element)); - for (T in r) - i[T] || (c.push(r[T].element), f[T] && c.push(f[T].element)); - return { - changed: n, - unchanged: o, - enter: l, - leave: c - }; - }, e.recordInlineStyles = function() { - for (var s = $o[this.props] || No, i = this.elementStates.length; i--; ) - Aa(this.elementStates[i], s); - }, e.interrupt = function(s) { - var i = this, r = []; - this.targets.forEach(function(o) { - var n = o._flip, l = Nl(n, s ? 0 : 1); - s && l && r.indexOf(n) < 0 && n.add(function() { - return i.updateVisibility(); - }), l && r.push(n); - }), !s && r.length && this.updateVisibility(), this.interrupted || (this.interrupted = !!r.length); - }, e.updateVisibility = function() { - this.elementStates.forEach(function(s) { - var i = s.element.getBoundingClientRect(); - s.isVisible = !!(i.width || i.height || i.top || i.left), s.uncache = 1; - }); - }, e.getElementState = function(s) { - return this.elementStates[this.targets.indexOf(ua(s))]; - }, e.makeAbsolute = function() { - return ko(this.elementStates.slice(0), !0, !0).map($l); - }, a; -}(), Zi = /* @__PURE__ */ function() { - function a(t, s, i) { - this.element = t, this.update(s, i); - } - var e = a.prototype; - return e.isDifferent = function(s) { - var i = this.bounds, r = s.bounds; - return i.top !== r.top || i.left !== r.left || i.width !== r.width || i.height !== r.height || !this.matrix.equals(s.matrix) || this.opacity !== s.opacity || this.props && s.props && JSON.stringify(this.props) !== JSON.stringify(s.props); - }, e.update = function(s, i) { - var r = this, o = r.element, n = _t.getProperty(o), l = _t.core.getCache(o), c = o.getBoundingClientRect(), u = o.getBBox && typeof o.getBBox == "function" && o.nodeName.toLowerCase() !== "svg" && o.getBBox(), g = i ? new ri(1, 0, 0, 1, c.left + Ol(), c.top + Ml()) : Xe(o, !1, !1, !0); - r.getProp = n, r.element = o, r.id = Gd(o), r.matrix = g, r.cache = l, r.bounds = c, r.isVisible = !!(c.width || c.height || c.left || c.top), r.display = n("display"), r.position = n("position"), r.parent = o.parentNode, r.x = n("x"), r.y = n("y"), r.scaleX = l.scaleX, r.scaleY = l.scaleY, r.rotation = n("rotation"), r.skewX = n("skewX"), r.opacity = n("opacity"), r.width = u ? u.width : Js(n("width", "px"), 0.04), r.height = u ? u.height : Js(n("height", "px"), 0.04), s && jd(r, Rl[s] || _0(s)), r.ctm = o.getCTM && o.nodeName.toLowerCase() === "svg" && D0(o).inverse(), r.simple = i || lr(g.a) === 1 && !lr(g.b) && !lr(g.c) && lr(g.d) === 1, r.uncache = 0; - }, a; -}(), qd = /* @__PURE__ */ function() { - function a(t, s) { - this.vars = t, this.batch = s, this.states = [], this.timeline = s.timeline; - } - var e = a.prototype; - return e.getStateById = function(s) { - for (var i = this.states.length; i--; ) - if (this.states[i].idLookup[s]) - return this.states[i]; - }, e.kill = function() { - this.batch.remove(this); - }, a; -}(), Yd = /* @__PURE__ */ function() { - function a(t) { - this.id = t, this.actions = [], this._kill = [], this._final = [], this._abs = [], this._run = [], this.data = {}, this.state = new _s(), this.timeline = _t.timeline(); - } - var e = a.prototype; - return e.add = function(s) { - var i = this.actions.filter(function(r) { - return r.vars === s; - }); - return i.length ? i[0] : (i = new qd(typeof s == "function" ? { - animate: s - } : s, this), this.actions.push(i), i); - }, e.remove = function(s) { - var i = this.actions.indexOf(s); - return i >= 0 && this.actions.splice(i, 1), this; - }, e.getState = function(s) { - var i = this, r = Ge, o = ca; - return Ge = this, this.state.clear(), this._kill.length = 0, this.actions.forEach(function(n) { - n.vars.getState && (n.states.length = 0, ca = n, n.state = n.vars.getState(n)), s && n.states.forEach(function(l) { - return i.state.add(l); - }); - }), ca = o, Ge = r, this.killConflicts(), this; - }, e.animate = function() { - var s = this, i = Ge, r = this.timeline, o = this.actions.length, n, l; - for (Ge = this, r.clear(), this._abs.length = this._final.length = this._run.length = 0, this.actions.forEach(function(c) { - c.vars.animate && c.vars.animate(c); - var u = c.vars.onEnter, g = c.vars.onLeave, f = c.targets, h, m; - f && f.length && (u || g) && (h = new _s(), c.states.forEach(function(y) { - return h.add(y); - }), m = h.compare(Na.getState(f)), m.enter.length && u && u(m.enter), m.leave.length && g && g(m.leave)); - }), S0(this._abs), this._run.forEach(function(c) { - return c(); - }), l = r.duration(), n = this._final.slice(0), r.add(function() { - l <= r.time() && (n.forEach(function(c) { - return c(); - }), Sc(s, "onComplete")); - }), Ge = i; o--; ) - this.actions[o].vars.once && this.actions[o].kill(); - return Sc(this, "onStart"), r.restart(), this; - }, e.loadState = function(s) { - s || (s = function() { - return 0; - }); - var i = []; - return this.actions.forEach(function(r) { - if (r.vars.loadState) { - var o, n = function l(c) { - c && (r.targets = c), o = i.indexOf(l), ~o && (i.splice(o, 1), i.length || s()); - }; - i.push(n), r.vars.loadState(n); - } - }), i.length || s(), this; - }, e.setState = function() { - return this.actions.forEach(function(s) { - return s.targets = s.vars.setState && s.vars.setState(s); - }), this; - }, e.killConflicts = function(s) { - return this.state.interrupt(s), this._kill.forEach(function(i) { - return i.interrupt(s); - }), this; - }, e.run = function(s, i) { - var r = this; - return this !== Ge && (s || this.getState(i), this.loadState(function() { - r._killed || (r.setState(), r.animate()); - })), this; - }, e.clear = function(s) { - this.state.clear(), s || (this.actions.length = 0); - }, e.getStateById = function(s) { - for (var i = this.actions.length, r; i--; ) - if (r = this.actions[i].getStateById(s), r) - return r; - return this.state.idLookup[s] && this.state; - }, e.kill = function() { - this._killed = 1, this.clear(), delete qn[this.id]; - }, a; -}(), Na = /* @__PURE__ */ function() { - function a() { - } - return a.getState = function(t, s) { - var i = dn(t, s); - return ca && ca.states.push(i), s && s.batch && a.batch(s.batch).state.add(i), i; - }, a.from = function(t, s) { - return s = s || {}, "clearProps" in s || (s.clearProps = !0), fn(t, dn(s.targets || t.targets, { - props: s.props || t.props, - simple: s.simple, - kill: !!s.kill - }), s, -1); - }, a.to = function(t, s) { - return fn(t, dn(s.targets || t.targets, { - props: s.props || t.props, - simple: s.simple, - kill: !!s.kill - }), s, 1); - }, a.fromTo = function(t, s, i) { - return fn(t, s, i); - }, a.fit = function(t, s, i) { - var r = i ? cr(i, T0) : {}, o = i || r, n = o.absolute, l = o.scale, c = o.getVars, u = o.props, g = o.runBackwards, f = o.onComplete, h = o.simple, m = i && i.fitChild && ua(i.fitChild), y = Yn(s, u, h, t), k = Yn(t, 0, h, y), T = u ? $o[u] : No, S = _t.context(); - return u && E0(r, y.props), Aa(k, T), g && ("immediateRender" in r || (r.immediateRender = !0), r.onComplete = function() { - Do(k), f && f.apply(this, arguments); - }), n && $l(k, y), r = mr(k, y, l || m, u, m, r.duration || c ? r : 0), S && !c && S.add(function() { - return function() { - return Do(k); - }; - }), c ? r : r.duration ? _t.to(k.element, r) : null; - }, a.makeAbsolute = function(t, s) { - return (t instanceof _s ? t : new _s(t, s)).makeAbsolute(); - }, a.batch = function(t) { - return t || (t = "default"), qn[t] || (qn[t] = new Yd(t)); - }, a.killFlipsOf = function(t, s) { - (t instanceof _s ? t.targets : Pr(t)).forEach(function(i) { - return i && Nl(i._flip, s !== !1 ? 1 : 2); - }); - }, a.isFlipping = function(t) { - var s = a.getByTarget(t); - return !!s && s.isActive(); - }, a.getByTarget = function(t) { - return (ua(t) || wo)._flip; - }, a.getElementState = function(t, s) { - return new Zi(ua(t), s); - }, a.convertCoordinates = function(t, s, i) { - var r = Xe(s, !0, !0).multiply(Xe(t)); - return i ? r.apply(i) : r; - }, a.register = function(t) { - if (gi = typeof document < "u" && document.body, gi) { - _t = t, Pl(gi), Pr = _t.utils.toArray, zn = _t.core.getStyleSaver; - var s = _t.utils.snap(0.1); - Js = function(r, o) { - return s(parseFloat(r) + o); - }; - } - }, a; -}(); -Na.version = "3.12.5"; -typeof window < "u" && window.gsap && window.gsap.registerPlugin(Na); -function Fc(a, e) { - for (var t = 0; t < e.length; t++) { - var s = e[t]; - s.enumerable = s.enumerable || !1, s.configurable = !0, "value" in s && (s.writable = !0), Object.defineProperty(a, s.key, s); - } -} -function Ud(a, e, t) { - return e && Fc(a.prototype, e), t && Fc(a, t), a; -} -/*! - * Observer 3.12.5 - * https://gsap.com - * - * @license Copyright 2008-2024, GreenSock. All rights reserved. - * Subject to the terms at https://gsap.com/standard-license or for - * Club GSAP members, the agreement issued with that membership. - * @author: Jack Doyle, jack@greensock.com -*/ -var Dt, no, Xt, vi, wi, yr, A0, Bi, ha, P0, Qs, vs, M0, O0 = function() { - return Dt || typeof window < "u" && (Dt = window.gsap) && Dt.registerPlugin && Dt; -}, F0 = 1, ur = [], us = [], da = [], ga = Date.now, Un = function(e, t) { - return t; -}, Xd = function() { - var e = ha.core, t = e.bridge || {}, s = e._scrollers, i = e._proxies; - s.push.apply(s, us), i.push.apply(i, da), us = s, da = i, Un = function(o, n) { - return t[o](n); - }; -}, Zd = function(e, t) { - return ~da.indexOf(e) && da[da.indexOf(e) + 1][t]; -}, pa = function(e) { - return !!~P0.indexOf(e); -}, Mt = function(e, t, s, i, r) { - return e.addEventListener(t, s, { - passive: i !== !1, - capture: !!r - }); -}, Pt = function(e, t, s, i) { - return e.removeEventListener(t, s, !!i); -}, Xa = "scrollLeft", Za = "scrollTop", Xn = function() { - return Qs && Qs.isPressed || us.cache++; -}, To = function(e, t) { - var s = function i(r) { - if (r || r === 0) { - F0 && (Xt.history.scrollRestoration = "manual"); - var o = Qs && Qs.isPressed; - r = i.v = Math.round(r) || (Qs && Qs.iOS ? 1 : 0), e(r), i.cacheID = us.cache, o && Un("ss", r); - } else - (t || us.cache !== i.cacheID || Un("ref")) && (i.cacheID = us.cache, i.v = e()); - return i.v + i.offset; - }; - return s.offset = 0, e && s; -}, Co = { - s: Xa, - p: "left", - p2: "Left", - os: "right", - os2: "Right", - d: "width", - d2: "Width", - a: "x", - sc: To(function(a) { - return arguments.length ? Xt.scrollTo(a, Bo.sc()) : Xt.pageXOffset || vi[Xa] || wi[Xa] || yr[Xa] || 0; - }) -}, Bo = { - s: Za, - p: "top", - p2: "Top", - os: "bottom", - os2: "Bottom", - d: "height", - d2: "Height", - a: "y", - op: Co, - sc: To(function(a) { - return arguments.length ? Xt.scrollTo(Co.sc(), a) : Xt.pageYOffset || vi[Za] || wi[Za] || yr[Za] || 0; - }) -}, Jd = function(e, t) { - return (t && t._ctx && t._ctx.selector || Dt.utils.toArray)(e)[0] || (typeof e == "string" && Dt.config().nullTargetWarn !== !1 ? console.warn("Element not found:", e) : null); -}, Lc = function(e, t) { - var s = t.s, i = t.sc; - pa(e) && (e = vi.scrollingElement || wi); - var r = us.indexOf(e), o = i === Bo.sc ? 1 : 2; - !~r && (r = us.push(e) - 1), us[r + o] || Mt(e, "scroll", Xn); - var n = us[r + o], l = n || (us[r + o] = To(Zd(e, s), !0) || (pa(e) ? i : To(function(c) { - return arguments.length ? e[s] = c : e[s]; - }))); - return l.target = e, n || (l.smooth = Dt.getProperty(e, "scrollBehavior") === "smooth"), l; -}, Rc = function(e, t, s) { - var i = e, r = e, o = ga(), n = o, l = t || 50, c = Math.max(500, l * 3), u = function(m, y) { - var k = ga(); - y || k - o > l ? (r = i, i = m, n = o, o = k) : s ? i += m : i = r + (m - r) / (k - n) * (o - n); - }, g = function() { - r = i = s ? 0 : i, n = o = 0; - }, f = function(m) { - var y = n, k = r, T = ga(); - return (m || m === 0) && m !== i && u(m), o === n || T - n > c ? 0 : (i + (s ? k : -k)) / ((s ? T : o) - y) * 1e3; - }; - return { - update: u, - reset: g, - getVelocity: f - }; -}, zr = function(e, t) { - return t && !e._gsapAllow && e.preventDefault(), e.changedTouches ? e.changedTouches[0] : e; -}, $c = function(e) { - var t = Math.max.apply(Math, e), s = Math.min.apply(Math, e); - return Math.abs(t) >= Math.abs(s) ? t : s; -}, L0 = function() { - ha = Dt.core.globals().ScrollTrigger, ha && ha.core && Xd(); -}, R0 = function(e) { - return Dt = e || O0(), !no && Dt && typeof document < "u" && document.body && (Xt = window, vi = document, wi = vi.documentElement, yr = vi.body, P0 = [Xt, vi, wi, yr], Dt.utils.clamp, M0 = Dt.core.context || function() { - }, Bi = "onpointerenter" in yr ? "pointer" : "mouse", A0 = As.isTouch = Xt.matchMedia && Xt.matchMedia("(hover: none), (pointer: coarse)").matches ? 1 : "ontouchstart" in Xt || navigator.maxTouchPoints > 0 || navigator.msMaxTouchPoints > 0 ? 2 : 0, vs = As.eventTypes = ("ontouchstart" in wi ? "touchstart,touchmove,touchcancel,touchend" : "onpointerdown" in wi ? "pointerdown,pointermove,pointercancel,pointerup" : "mousedown,mousemove,mouseup,mouseup").split(","), setTimeout(function() { - return F0 = 0; - }, 500), L0(), no = 1), no; -}; -Co.op = Bo; -us.cache = 0; -var As = /* @__PURE__ */ function() { - function a(t) { - this.init(t); - } - var e = a.prototype; - return e.init = function(s) { - no || R0(Dt) || console.warn("Please gsap.registerPlugin(Observer)"), ha || L0(); - var i = s.tolerance, r = s.dragMinimum, o = s.type, n = s.target, l = s.lineHeight, c = s.debounce, u = s.preventDefault, g = s.onStop, f = s.onStopDelay, h = s.ignore, m = s.wheelSpeed, y = s.event, k = s.onDragStart, T = s.onDragEnd, S = s.onDrag, C = s.onPress, I = s.onRelease, E = s.onRight, F = s.onLeft, O = s.onUp, R = s.onDown, L = s.onChangeX, U = s.onChangeY, j = s.onChange, re = s.onToggleX, X = s.onToggleY, de = s.onHover, Q = s.onHoverEnd, le = s.onMove, d = s.ignoreCheck, p = s.isNormalizer, w = s.onGestureStart, b = s.onGestureEnd, D = s.onWheel, _ = s.onEnable, P = s.onDisable, N = s.onClick, V = s.scrollSpeed, K = s.capture, ce = s.allowClicks, ee = s.lockAxis, ke = s.onLockAxis; - this.target = n = Jd(n) || wi, this.vars = s, h && (h = Dt.utils.toArray(h)), i = i || 1e-9, r = r || 0, m = m || 1, V = V || 1, o = o || "wheel,touch,pointer", c = c !== !1, l || (l = parseFloat(Xt.getComputedStyle(yr).lineHeight) || 22); - var ie, pe, be, me, ge, ve, Ze, B = this, De = 0, lt = 0, Ke = s.passive || !u, ye = Lc(n, Co), Ve = Lc(n, Bo), Ps = ye(), Ai = Ve(), Ka = ~o.indexOf("touch") && !~o.indexOf("pointer") && vs[0] === "pointerdown", At = pa(n), je = n.ownerDocument || vi, ys = [0, 0, 0], Ws = [0, 0, 0], Qi = 0, Va = function() { - return Qi = ga(); - }, Ks = function(W, G) { - return (B.event = W) && h && ~h.indexOf(W.target) || G && Ka && W.pointerType !== "touch" || d && d(W, G); - }, Wr = function() { - B._vx.reset(), B._vy.reset(), pe.pause(), g && g(B); - }, Pi = function() { - var W = B.deltaX = $c(ys), G = B.deltaY = $c(Ws), J = Math.abs(W) >= i, fe = Math.abs(G) >= i; - j && (J || fe) && j(B, W, G, ys, Ws), J && (E && B.deltaX > 0 && E(B), F && B.deltaX < 0 && F(B), L && L(B), re && B.deltaX < 0 != De < 0 && re(B), De = B.deltaX, ys[0] = ys[1] = ys[2] = 0), fe && (R && B.deltaY > 0 && R(B), O && B.deltaY < 0 && O(B), U && U(B), X && B.deltaY < 0 != lt < 0 && X(B), lt = B.deltaY, Ws[0] = Ws[1] = Ws[2] = 0), (me || be) && (le && le(B), be && (S(B), be = !1), me = !1), ve && !(ve = !1) && ke && ke(B), ge && (D(B), ge = !1), ie = 0; - }, Mi = function(W, G, J) { - ys[J] += W, Ws[J] += G, B._vx.update(W), B._vy.update(G), c ? ie || (ie = requestAnimationFrame(Pi)) : Pi(); - }, ai = function(W, G) { - ee && !Ze && (B.axis = Ze = Math.abs(W) > Math.abs(G) ? "x" : "y", ve = !0), Ze !== "y" && (ys[2] += W, B._vx.update(W, !0)), Ze !== "x" && (Ws[2] += G, B._vy.update(G, !0)), c ? ie || (ie = requestAnimationFrame(Pi)) : Pi(); - }, Kr = function(W) { - if (!Ks(W, 1)) { - W = zr(W, u); - var G = W.clientX, J = W.clientY, fe = G - B.x, ne = J - B.y, xe = B.isDragging; - B.x = G, B.y = J, (xe || Math.abs(B.startX - G) >= r || Math.abs(B.startY - J) >= r) && (S && (be = !0), xe || (B.isDragging = !0), ai(fe, ne), xe || k && k(B)); - } - }, Vs = B.onPress = function(M) { - Ks(M, 1) || M && M.button || (B.axis = Ze = null, pe.pause(), B.isPressed = !0, M = zr(M), De = lt = 0, B.startX = B.x = M.clientX, B.startY = B.y = M.clientY, B._vx.reset(), B._vy.reset(), Mt(p ? n : je, vs[1], Kr, Ke, !0), B.deltaX = B.deltaY = 0, C && C(B)); - }, ss = B.onRelease = function(M) { - if (!Ks(M, 1)) { - Pt(p ? n : je, vs[1], Kr, !0); - var W = !isNaN(B.y - B.startY), G = B.isDragging, J = G && (Math.abs(B.x - B.startX) > 3 || Math.abs(B.y - B.startY) > 3), fe = zr(M); - !J && W && (B._vx.reset(), B._vy.reset(), u && ce && Dt.delayedCall(0.08, function() { - if (ga() - Qi > 300 && !M.defaultPrevented) { - if (M.target.click) - M.target.click(); - else if (je.createEvent) { - var ne = je.createEvent("MouseEvents"); - ne.initMouseEvent("click", !0, !0, Xt, 1, fe.screenX, fe.screenY, fe.clientX, fe.clientY, !1, !1, !1, !1, 0, null), M.target.dispatchEvent(ne); - } - } - })), B.isDragging = B.isGesturing = B.isPressed = !1, g && G && !p && pe.restart(!0), T && G && T(B), I && I(B, J); - } - }, oi = function(W) { - return W.touches && W.touches.length > 1 && (B.isGesturing = !0) && w(W, B.isDragging); - }, Rt = function() { - return (B.isGesturing = !1) || b(B); - }, Oi = function(W) { - if (!Ks(W)) { - var G = ye(), J = Ve(); - Mi((G - Ps) * V, (J - Ai) * V, 1), Ps = G, Ai = J, g && pe.restart(!0); - } - }, Vr = function(W) { - if (!Ks(W)) { - W = zr(W, u), D && (ge = !0); - var G = (W.deltaMode === 1 ? l : W.deltaMode === 2 ? Xt.innerHeight : 1) * m; - Mi(W.deltaX * G, W.deltaY * G, 0), g && !p && pe.restart(!0); - } - }, jr = function(W) { - if (!Ks(W)) { - var G = W.clientX, J = W.clientY, fe = G - B.x, ne = J - B.y; - B.x = G, B.y = J, me = !0, g && pe.restart(!0), (fe || ne) && ai(fe, ne); - } - }, ue = function(W) { - B.event = W, de(B); - }, A = function(W) { - B.event = W, Q(B); - }, q = function(W) { - return Ks(W) || zr(W, u) && N(B); - }; - pe = B._dc = Dt.delayedCall(f || 0.25, Wr).pause(), B.deltaX = B.deltaY = 0, B._vx = Rc(0, 50, !0), B._vy = Rc(0, 50, !0), B.scrollX = ye, B.scrollY = Ve, B.isDragging = B.isGesturing = B.isPressed = !1, M0(this), B.enable = function(M) { - return B.isEnabled || (Mt(At ? je : n, "scroll", Xn), o.indexOf("scroll") >= 0 && Mt(At ? je : n, "scroll", Oi, Ke, K), o.indexOf("wheel") >= 0 && Mt(n, "wheel", Vr, Ke, K), (o.indexOf("touch") >= 0 && A0 || o.indexOf("pointer") >= 0) && (Mt(n, vs[0], Vs, Ke, K), Mt(je, vs[2], ss), Mt(je, vs[3], ss), ce && Mt(n, "click", Va, !0, !0), N && Mt(n, "click", q), w && Mt(je, "gesturestart", oi), b && Mt(je, "gestureend", Rt), de && Mt(n, Bi + "enter", ue), Q && Mt(n, Bi + "leave", A), le && Mt(n, Bi + "move", jr)), B.isEnabled = !0, M && M.type && Vs(M), _ && _(B)), B; - }, B.disable = function() { - B.isEnabled && (ur.filter(function(M) { - return M !== B && pa(M.target); - }).length || Pt(At ? je : n, "scroll", Xn), B.isPressed && (B._vx.reset(), B._vy.reset(), Pt(p ? n : je, vs[1], Kr, !0)), Pt(At ? je : n, "scroll", Oi, K), Pt(n, "wheel", Vr, K), Pt(n, vs[0], Vs, K), Pt(je, vs[2], ss), Pt(je, vs[3], ss), Pt(n, "click", Va, !0), Pt(n, "click", q), Pt(je, "gesturestart", oi), Pt(je, "gestureend", Rt), Pt(n, Bi + "enter", ue), Pt(n, Bi + "leave", A), Pt(n, Bi + "move", jr), B.isEnabled = B.isPressed = B.isDragging = !1, P && P(B)); - }, B.kill = B.revert = function() { - B.disable(); - var M = ur.indexOf(B); - M >= 0 && ur.splice(M, 1), Qs === B && (Qs = 0); - }, ur.push(B), p && pa(n) && (Qs = B), B.enable(y); - }, Ud(a, [{ - key: "velocityX", - get: function() { - return this._vx.getVelocity(); - } - }, { - key: "velocityY", - get: function() { - return this._vy.getVelocity(); - } - }]), a; -}(); -As.version = "3.12.5"; -As.create = function(a) { - return new As(a); -}; -As.register = R0; -As.getAll = function() { - return ur.slice(); -}; -As.getById = function(a) { - return ur.filter(function(e) { - return e.vars.id === a; - })[0]; -}; -O0() && Dt.registerPlugin(As); -function Nc(a) { - if (a === void 0) - throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); - return a; -} -function Qd(a, e) { - a.prototype = Object.create(e.prototype), a.prototype.constructor = a, a.__proto__ = e; -} -var Ce, Ne, Zt, Ss, ei, mn, Us, Zn, Qr, ki, $0, Jn, Pa, Bl, ea, ws, ta, lo, N0, Qn, _o = 0, B0 = function() { - return typeof window < "u"; -}, H0 = function() { - return Ce || B0() && (Ce = window.gsap) && Ce.registerPlugin && Ce; -}, di = function(e) { - return typeof e == "function"; -}, fa = function(e) { - return typeof e == "object"; -}, ks = function(e) { - return typeof e > "u"; -}, co = function() { - return !1; -}, ma = "transform", el = "transformOrigin", li = function(e) { - return Math.round(e * 1e4) / 1e4; -}, qr = Array.isArray, Ja = function(e, t) { - var s = Zt.createElementNS ? Zt.createElementNS((t || "http://www.w3.org/1999/xhtml").replace(/^https/, "http"), e) : Zt.createElement(e); - return s.style ? s : Zt.createElement(e); -}, Bc = 180 / Math.PI, Ri = 1e20, eg = new ri(), ci = Date.now || function() { - return (/* @__PURE__ */ new Date()).getTime(); -}, Yi = [], br = {}, tg = 0, sg = /^(?:a|input|textarea|button|select)$/i, Hc = 0, sr = {}, Gs = {}, W0 = function(e, t) { - var s = {}, i; - for (i in e) - s[i] = t ? e[i] * t : e[i]; - return s; -}, ig = function(e, t) { - for (var s in t) - s in e || (e[s] = t[s]); - return e; -}, Wc = function a(e, t) { - for (var s = e.length, i; s--; ) - t ? e[s].style.touchAction = t : e[s].style.removeProperty("touch-action"), i = e[s].children, i && i.length && a(i, t); -}, K0 = function() { - return Yi.forEach(function(e) { - return e(); - }); -}, rg = function(e) { - Yi.push(e), Yi.length === 1 && Ce.ticker.add(K0); -}, Kc = function() { - return !Yi.length && Ce.ticker.remove(K0); -}, Vc = function(e) { - for (var t = Yi.length; t--; ) - Yi[t] === e && Yi.splice(t, 1); - Ce.to(Kc, { - overwrite: !0, - delay: 15, - duration: 0, - onComplete: Kc, - data: "_draggable" - }); -}, ag = function(e, t) { - for (var s in t) - s in e || (e[s] = t[s]); - return e; -}, nt = function(e, t, s, i) { - if (e.addEventListener) { - var r = Pa[t]; - i = i || ($0 ? { - passive: !1 - } : null), e.addEventListener(r || t, s, i), r && t !== r && e.addEventListener(t, s, i); - } -}, rt = function(e, t, s, i) { - if (e.removeEventListener) { - var r = Pa[t]; - e.removeEventListener(r || t, s, i), r && t !== r && e.removeEventListener(t, s, i); - } -}, as = function(e) { - e.preventDefault && e.preventDefault(), e.preventManipulation && e.preventManipulation(); -}, og = function(e, t) { - for (var s = e.length; s--; ) - if (e[s].identifier === t) - return !0; -}, ng = function a(e) { - Bl = e.touches && _o < e.touches.length, rt(e.target, "touchend", a); -}, jc = function(e) { - Bl = e.touches && _o < e.touches.length, nt(e.target, "touchend", ng); -}, vr = function(e) { - return Ne.pageYOffset || e.scrollTop || e.documentElement.scrollTop || e.body.scrollTop || 0; -}, wr = function(e) { - return Ne.pageXOffset || e.scrollLeft || e.documentElement.scrollLeft || e.body.scrollLeft || 0; -}, Gc = function a(e, t) { - nt(e, "scroll", t), Mr(e.parentNode) || a(e.parentNode, t); -}, zc = function a(e, t) { - rt(e, "scroll", t), Mr(e.parentNode) || a(e.parentNode, t); -}, Mr = function(e) { - return !e || e === Ss || e.nodeType === 9 || e === Zt.body || e === Ne || !e.nodeType || !e.parentNode; -}, qc = function(e, t) { - var s = t === "x" ? "Width" : "Height", i = "scroll" + s, r = "client" + s; - return Math.max(0, Mr(e) ? Math.max(Ss[i], ei[i]) - (Ne["inner" + s] || Ss[r] || ei[r]) : e[i] - e[r]); -}, yn = function a(e, t) { - var s = qc(e, "x"), i = qc(e, "y"); - Mr(e) ? e = Gs : a(e.parentNode, t), e._gsMaxScrollX = s, e._gsMaxScrollY = i, t || (e._gsScrollX = e.scrollLeft || 0, e._gsScrollY = e.scrollTop || 0); -}, bn = function(e, t, s) { - var i = e.style; - i && (ks(i[t]) && (t = Qr(t, e) || t), s == null ? i.removeProperty && i.removeProperty(t.replace(/([A-Z])/g, "-$1").toLowerCase()) : i[t] = s); -}, Ma = function(e) { - return Ne.getComputedStyle(e instanceof Element ? e : e.host || (e.parentNode || {}).host || e); -}, $i = {}, ir = function(e) { - if (e === Ne) - return $i.left = $i.top = 0, $i.width = $i.right = Ss.clientWidth || e.innerWidth || ei.clientWidth || 0, $i.height = $i.bottom = (e.innerHeight || 0) - 20 < Ss.clientHeight ? Ss.clientHeight : e.innerHeight || ei.clientHeight || 0, $i; - var t = e.ownerDocument || Zt, s = ks(e.pageX) ? !e.nodeType && !ks(e.left) && !ks(e.top) ? e : ki(e)[0].getBoundingClientRect() : { - left: e.pageX - wr(t), - top: e.pageY - vr(t), - right: e.pageX - wr(t) + 1, - bottom: e.pageY - vr(t) + 1 - }; - return ks(s.right) && !ks(s.width) ? (s.right = s.left + s.width, s.bottom = s.top + s.height) : ks(s.width) && (s = { - width: s.right - s.left, - height: s.bottom - s.top, - right: s.right, - left: s.left, - bottom: s.bottom, - top: s.top - }), s; -}, tt = function(e, t, s) { - var i = e.vars, r = i[s], o = e._listeners[t], n; - return di(r) && (n = r.apply(i.callbackScope || e, i[s + "Params"] || [e.pointerEvent])), o && e.dispatchEvent(t) === !1 && (n = !1), n; -}, Yc = function(e, t) { - var s = ki(e)[0], i, r, o; - return !s.nodeType && s !== Ne ? ks(e.left) ? (r = e.min || e.minX || e.minRotation || 0, i = e.min || e.minY || 0, { - left: r, - top: i, - width: (e.max || e.maxX || e.maxRotation || 0) - r, - height: (e.max || e.maxY || 0) - i - }) : (o = { - x: 0, - y: 0 - }, { - left: e.left - o.x, - top: e.top - o.y, - width: e.width, - height: e.height - }) : lg(s, t); -}, os = {}, lg = function(e, t) { - t = ki(t)[0]; - var s = e.getBBox && e.ownerSVGElement, i = e.ownerDocument || Zt, r, o, n, l, c, u, g, f, h, m, y, k, T; - if (e === Ne) - n = vr(i), r = wr(i), o = r + (i.documentElement.clientWidth || e.innerWidth || i.body.clientWidth || 0), l = n + ((e.innerHeight || 0) - 20 < i.documentElement.clientHeight ? i.documentElement.clientHeight : e.innerHeight || i.body.clientHeight || 0); - else { - if (t === Ne || ks(t)) - return e.getBoundingClientRect(); - r = n = 0, s ? (m = e.getBBox(), y = m.width, k = m.height) : (e.viewBox && (m = e.viewBox.baseVal) && (r = m.x || 0, n = m.y || 0, y = m.width, k = m.height), y || (T = Ma(e), m = T.boxSizing === "border-box", y = (parseFloat(T.width) || e.clientWidth || 0) + (m ? 0 : parseFloat(T.borderLeftWidth) + parseFloat(T.borderRightWidth)), k = (parseFloat(T.height) || e.clientHeight || 0) + (m ? 0 : parseFloat(T.borderTopWidth) + parseFloat(T.borderBottomWidth)))), o = y, l = k; - } - return e === t ? { - left: r, - top: n, - width: o - r, - height: l - n - } : (c = Xe(t, !0).multiply(Xe(e)), u = c.apply({ - x: r, - y: n - }), g = c.apply({ - x: o, - y: n - }), f = c.apply({ - x: o, - y: l - }), h = c.apply({ - x: r, - y: l - }), r = Math.min(u.x, g.x, f.x, h.x), n = Math.min(u.y, g.y, f.y, h.y), { - left: r, - top: n, - width: Math.max(u.x, g.x, f.x, h.x) - r, - height: Math.max(u.y, g.y, f.y, h.y) - n - }); -}, vn = function(e, t, s, i, r, o) { - var n = {}, l, c, u; - if (t) - if (r !== 1 && t instanceof Array) { - if (n.end = l = [], u = t.length, fa(t[0])) - for (c = 0; c < u; c++) - l[c] = W0(t[c], r); - else - for (c = 0; c < u; c++) - l[c] = t[c] * r; - s += 1.1, i -= 1.1; - } else - di(t) ? n.end = function(g) { - var f = t.call(e, g), h, m; - if (r !== 1) - if (fa(f)) { - h = {}; - for (m in f) - h[m] = f[m] * r; - f = h; - } else - f *= r; - return f; - } : n.end = t; - return (s || s === 0) && (n.max = s), (i || i === 0) && (n.min = i), o && (n.velocity = 0), n; -}, cg = function a(e) { - var t; - return !e || !e.getAttribute || e === ei ? !1 : (t = e.getAttribute("data-clickable")) === "true" || t !== "false" && (sg.test(e.nodeName + "") || e.getAttribute("contentEditable") === "true") ? !0 : a(e.parentNode); -}, Qa = function(e, t) { - for (var s = e.length, i; s--; ) - i = e[s], i.ondragstart = i.onselectstart = t ? null : co, Ce.set(i, { - lazy: !0, - userSelect: t ? "text" : "none" - }); -}, ug = function a(e) { - if (Ma(e).position === "fixed") - return !0; - if (e = e.parentNode, e && e.nodeType === 1) - return a(e); -}, V0, tl, hg = function(e, t) { - e = Ce.utils.toArray(e)[0], t = t || {}; - var s = document.createElement("div"), i = s.style, r = e.firstChild, o = 0, n = 0, l = e.scrollTop, c = e.scrollLeft, u = e.scrollWidth, g = e.scrollHeight, f = 0, h = 0, m = 0, y, k, T, S, C, I; - V0 && t.force3D !== !1 ? (C = "translate3d(", I = "px,0px)") : ma && (C = "translate(", I = "px)"), this.scrollTop = function(E, F) { - if (!arguments.length) - return -this.top(); - this.top(-E, F); - }, this.scrollLeft = function(E, F) { - if (!arguments.length) - return -this.left(); - this.left(-E, F); - }, this.left = function(E, F) { - if (!arguments.length) - return -(e.scrollLeft + n); - var O = e.scrollLeft - c, R = n; - if ((O > 2 || O < -2) && !F) { - c = e.scrollLeft, Ce.killTweensOf(this, { - left: 1, - scrollLeft: 1 - }), this.left(-c), t.onKill && t.onKill(); - return; - } - E = -E, E < 0 ? (n = E - 0.5 | 0, E = 0) : E > h ? (n = E - h | 0, E = h) : n = 0, (n || R) && (this._skip || (i[ma] = C + -n + "px," + -o + I), n + f >= 0 && (i.paddingRight = n + f + "px")), e.scrollLeft = E | 0, c = e.scrollLeft; - }, this.top = function(E, F) { - if (!arguments.length) - return -(e.scrollTop + o); - var O = e.scrollTop - l, R = o; - if ((O > 2 || O < -2) && !F) { - l = e.scrollTop, Ce.killTweensOf(this, { - top: 1, - scrollTop: 1 - }), this.top(-l), t.onKill && t.onKill(); - return; - } - E = -E, E < 0 ? (o = E - 0.5 | 0, E = 0) : E > m ? (o = E - m | 0, E = m) : o = 0, (o || R) && (this._skip || (i[ma] = C + -n + "px," + -o + I)), e.scrollTop = E | 0, l = e.scrollTop; - }, this.maxScrollTop = function() { - return m; - }, this.maxScrollLeft = function() { - return h; - }, this.disable = function() { - for (r = s.firstChild; r; ) - S = r.nextSibling, e.appendChild(r), r = S; - e === s.parentNode && e.removeChild(s); - }, this.enable = function() { - if (r = e.firstChild, r !== s) { - for (; r; ) - S = r.nextSibling, s.appendChild(r), r = S; - e.appendChild(s), this.calibrate(); - } - }, this.calibrate = function(E) { - var F = e.clientWidth === y, O, R, L; - l = e.scrollTop, c = e.scrollLeft, !(F && e.clientHeight === k && s.offsetHeight === T && u === e.scrollWidth && g === e.scrollHeight && !E) && ((o || n) && (R = this.left(), L = this.top(), this.left(-e.scrollLeft), this.top(-e.scrollTop)), O = Ma(e), (!F || E) && (i.display = "block", i.width = "auto", i.paddingRight = "0px", f = Math.max(0, e.scrollWidth - e.clientWidth), f && (f += parseFloat(O.paddingLeft) + (tl ? parseFloat(O.paddingRight) : 0))), i.display = "inline-block", i.position = "relative", i.overflow = "visible", i.verticalAlign = "top", i.boxSizing = "content-box", i.width = "100%", i.paddingRight = f + "px", tl && (i.paddingBottom = O.paddingBottom), y = e.clientWidth, k = e.clientHeight, u = e.scrollWidth, g = e.scrollHeight, h = e.scrollWidth - y, m = e.scrollHeight - k, T = s.offsetHeight, i.display = "block", (R || L) && (this.left(R), this.top(L))); - }, this.content = s, this.element = e, this._skip = !1, this.enable(); -}, wn = function(e) { - if (B0() && document.body) { - var t = window && window.navigator; - Ne = window, Zt = document, Ss = Zt.documentElement, ei = Zt.body, mn = Ja("div"), lo = !!window.PointerEvent, Us = Ja("div"), Us.style.cssText = "visibility:hidden;height:1px;top:-1px;pointer-events:none;position:relative;clear:both;cursor:grab", ta = Us.style.cursor === "grab" ? "grab" : "move", ea = t && t.userAgent.toLowerCase().indexOf("android") !== -1, Jn = "ontouchstart" in Ss && "orientation" in Ne || t && (t.MaxTouchPoints > 0 || t.msMaxTouchPoints > 0), tl = function() { - var s = Ja("div"), i = Ja("div"), r = i.style, o = ei, n; - return r.display = "inline-block", r.position = "relative", s.style.cssText = "width:90px;height:40px;padding:10px;overflow:auto;visibility:hidden", s.appendChild(i), o.appendChild(s), n = i.offsetHeight + 18 > s.scrollHeight, o.removeChild(s), n; - }(), Pa = function(s) { - for (var i = s.split(","), r = ("onpointerdown" in mn ? "pointerdown,pointermove,pointerup,pointercancel" : "onmspointerdown" in mn ? "MSPointerDown,MSPointerMove,MSPointerUp,MSPointerCancel" : s).split(","), o = {}, n = 4; --n > -1; ) - o[i[n]] = r[n], o[r[n]] = i[n]; - try { - Ss.addEventListener("test", null, Object.defineProperty({}, "passive", { - get: function() { - $0 = 1; - } - })); - } catch { - } - return o; - }("touchstart,touchmove,touchend,touchcancel"), nt(Zt, "touchcancel", co), nt(Ne, "touchmove", co), ei && ei.addEventListener("touchstart", co), nt(Zt, "contextmenu", function() { - for (var s in br) - br[s].isPressed && br[s].endDrag(); - }), Ce = Zn = H0(); - } - Ce ? (ws = Ce.plugins.inertia, N0 = Ce.core.context || function() { - }, Qr = Ce.utils.checkPrefix, ma = Qr(ma), el = Qr(el), ki = Ce.utils.toArray, Qn = Ce.core.getStyleSaver, V0 = !!Qr("perspective")) : e && console.warn("Please gsap.registerPlugin(Draggable)"); -}, dg = /* @__PURE__ */ function() { - function a(t) { - this._listeners = {}, this.target = t || this; - } - var e = a.prototype; - return e.addEventListener = function(s, i) { - var r = this._listeners[s] || (this._listeners[s] = []); - ~r.indexOf(i) || r.push(i); - }, e.removeEventListener = function(s, i) { - var r = this._listeners[s], o = r && r.indexOf(i); - o >= 0 && r.splice(o, 1); - }, e.dispatchEvent = function(s) { - var i = this, r; - return (this._listeners[s] || []).forEach(function(o) { - return o.call(i, { - type: s, - target: i.target - }) === !1 && (r = !1); - }), r; - }, a; -}(), Ii = /* @__PURE__ */ function(a) { - Qd(e, a); - function e(t, s) { - var i; - i = a.call(this) || this, Zn || wn(1), t = ki(t)[0], i.styles = Qn && Qn(t, "transform,left,top"), ws || (ws = Ce.plugins.inertia), i.vars = s = W0(s || {}), i.target = t, i.x = i.y = i.rotation = 0, i.dragResistance = parseFloat(s.dragResistance) || 0, i.edgeResistance = isNaN(s.edgeResistance) ? 1 : parseFloat(s.edgeResistance) || 0, i.lockAxis = s.lockAxis, i.autoScroll = s.autoScroll || 0, i.lockedAxis = null, i.allowEventDefault = !!s.allowEventDefault, Ce.getProperty(t, "x"); - var r = (s.type || "x,y").toLowerCase(), o = ~r.indexOf("x") || ~r.indexOf("y"), n = r.indexOf("rotation") !== -1, l = n ? "rotation" : o ? "x" : "left", c = o ? "y" : "top", u = !!(~r.indexOf("x") || ~r.indexOf("left") || r === "scroll"), g = !!(~r.indexOf("y") || ~r.indexOf("top") || r === "scroll"), f = s.minimumMovement || 2, h = Nc(i), m = ki(s.trigger || s.handle || t), y = {}, k = 0, T = !1, S = s.autoScrollMarginTop || 40, C = s.autoScrollMarginRight || 40, I = s.autoScrollMarginBottom || 40, E = s.autoScrollMarginLeft || 40, F = s.clickableTest || cg, O = 0, R = t._gsap || Ce.core.getCache(t), L = ug(t), U = function(A, q) { - return parseFloat(R.get(t, A, q)); - }, j = t.ownerDocument || Zt, re, X, de, Q, le, d, p, w, b, D, _, P, N, V, K, ce, ee, ke, ie, pe, be, me, ge, ve, Ze, B, De, lt, Ke, ye, Ve, Ps, Ai, Ka = function(A) { - return as(A), A.stopImmediatePropagation && A.stopImmediatePropagation(), !1; - }, At = function ue(A) { - if (h.autoScroll && h.isDragging && (T || ee)) { - var q = t, M = h.autoScroll * 15, W, G, J, fe, ne, xe, Se, Le; - for (T = !1, Gs.scrollTop = Ne.pageYOffset != null ? Ne.pageYOffset : j.documentElement.scrollTop != null ? j.documentElement.scrollTop : j.body.scrollTop, Gs.scrollLeft = Ne.pageXOffset != null ? Ne.pageXOffset : j.documentElement.scrollLeft != null ? j.documentElement.scrollLeft : j.body.scrollLeft, fe = h.pointerX - Gs.scrollLeft, ne = h.pointerY - Gs.scrollTop; q && !G; ) - G = Mr(q.parentNode), W = G ? Gs : q.parentNode, J = G ? { - bottom: Math.max(Ss.clientHeight, Ne.innerHeight || 0), - right: Math.max(Ss.clientWidth, Ne.innerWidth || 0), - left: 0, - top: 0 - } : W.getBoundingClientRect(), xe = Se = 0, g && (Le = W._gsMaxScrollY - W.scrollTop, Le < 0 ? Se = Le : ne > J.bottom - I && Le ? (T = !0, Se = Math.min(Le, M * (1 - Math.max(0, J.bottom - ne) / I) | 0)) : ne < J.top + S && W.scrollTop && (T = !0, Se = -Math.min(W.scrollTop, M * (1 - Math.max(0, ne - J.top) / S) | 0)), Se && (W.scrollTop += Se)), u && (Le = W._gsMaxScrollX - W.scrollLeft, Le < 0 ? xe = Le : fe > J.right - C && Le ? (T = !0, xe = Math.min(Le, M * (1 - Math.max(0, J.right - fe) / C) | 0)) : fe < J.left + E && W.scrollLeft && (T = !0, xe = -Math.min(W.scrollLeft, M * (1 - Math.max(0, fe - J.left) / E) | 0)), xe && (W.scrollLeft += xe)), G && (xe || Se) && (Ne.scrollTo(W.scrollLeft, W.scrollTop), oi(h.pointerX + xe, h.pointerY + Se)), q = W; - } - if (ee) { - var Qe = h.x, Tt = h.y; - n ? (h.deltaX = Qe - parseFloat(R.rotation), h.rotation = Qe, R.rotation = Qe + "deg", R.renderTransform(1, R)) : X ? (g && (h.deltaY = Tt - X.top(), X.top(Tt)), u && (h.deltaX = Qe - X.left(), X.left(Qe))) : o ? (g && (h.deltaY = Tt - parseFloat(R.y), R.y = Tt + "px"), u && (h.deltaX = Qe - parseFloat(R.x), R.x = Qe + "px"), R.renderTransform(1, R)) : (g && (h.deltaY = Tt - parseFloat(t.style.top || 0), t.style.top = Tt + "px"), u && (h.deltaX = Qe - parseFloat(t.style.left || 0), t.style.left = Qe + "px")), w && !A && !lt && (lt = !0, tt(h, "drag", "onDrag") === !1 && (u && (h.x -= h.deltaX), g && (h.y -= h.deltaY), ue(!0)), lt = !1); - } - ee = !1; - }, je = function(A, q) { - var M = h.x, W = h.y, G, J; - t._gsap || (R = Ce.core.getCache(t)), R.uncache && Ce.getProperty(t, "x"), o ? (h.x = parseFloat(R.x), h.y = parseFloat(R.y)) : n ? h.x = h.rotation = parseFloat(R.rotation) : X ? (h.y = X.top(), h.x = X.left()) : (h.y = parseFloat(t.style.top || (J = Ma(t)) && J.top) || 0, h.x = parseFloat(t.style.left || (J || {}).left) || 0), (ie || pe || be) && !q && (h.isDragging || h.isThrowing) && (be && (sr.x = h.x, sr.y = h.y, G = be(sr), G.x !== h.x && (h.x = G.x, ee = !0), G.y !== h.y && (h.y = G.y, ee = !0)), ie && (G = ie(h.x), G !== h.x && (h.x = G, n && (h.rotation = G), ee = !0)), pe && (G = pe(h.y), G !== h.y && (h.y = G), ee = !0)), ee && At(!0), A || (h.deltaX = h.x - M, h.deltaY = h.y - W, tt(h, "throwupdate", "onThrowUpdate")); - }, ys = function(A, q, M, W) { - return q == null && (q = -Ri), M == null && (M = Ri), di(A) ? function(G) { - var J = h.isPressed ? 1 - h.edgeResistance : 1; - return A.call(h, (G > M ? M + (G - M) * J : G < q ? q + (G - q) * J : G) * W) * W; - } : qr(A) ? function(G) { - for (var J = A.length, fe = 0, ne = Ri, xe, Se; --J > -1; ) - xe = A[J], Se = xe - G, Se < 0 && (Se = -Se), Se < ne && xe >= q && xe <= M && (fe = J, ne = Se); - return A[fe]; - } : isNaN(A) ? function(G) { - return G; - } : function() { - return A * W; - }; - }, Ws = function(A, q, M, W, G, J, fe) { - return J = J && J < Ri ? J * J : Ri, di(A) ? function(ne) { - var xe = h.isPressed ? 1 - h.edgeResistance : 1, Se = ne.x, Le = ne.y, Qe, Tt, js; - return ne.x = Se = Se > M ? M + (Se - M) * xe : Se < q ? q + (Se - q) * xe : Se, ne.y = Le = Le > G ? G + (Le - G) * xe : Le < W ? W + (Le - W) * xe : Le, Qe = A.call(h, ne), Qe !== ne && (ne.x = Qe.x, ne.y = Qe.y), fe !== 1 && (ne.x *= fe, ne.y *= fe), J < Ri && (Tt = ne.x - Se, js = ne.y - Le, Tt * Tt + js * js > J && (ne.x = Se, ne.y = Le)), ne; - } : qr(A) ? function(ne) { - for (var xe = A.length, Se = 0, Le = Ri, Qe, Tt, js, is; --xe > -1; ) - js = A[xe], Qe = js.x - ne.x, Tt = js.y - ne.y, is = Qe * Qe + Tt * Tt, is < Le && (Se = xe, Le = is); - return Le <= J ? A[Se] : ne; - } : function(ne) { - return ne; - }; - }, Qi = function() { - var A, q, M, W; - p = !1, X ? (X.calibrate(), h.minX = _ = -X.maxScrollLeft(), h.minY = N = -X.maxScrollTop(), h.maxX = D = h.maxY = P = 0, p = !0) : s.bounds && (A = Yc(s.bounds, t.parentNode), n ? (h.minX = _ = A.left, h.maxX = D = A.left + A.width, h.minY = N = h.maxY = P = 0) : !ks(s.bounds.maxX) || !ks(s.bounds.maxY) ? (A = s.bounds, h.minX = _ = A.minX, h.minY = N = A.minY, h.maxX = D = A.maxX, h.maxY = P = A.maxY) : (q = Yc(t, t.parentNode), h.minX = _ = Math.round(U(l, "px") + A.left - q.left), h.minY = N = Math.round(U(c, "px") + A.top - q.top), h.maxX = D = Math.round(_ + (A.width - q.width)), h.maxY = P = Math.round(N + (A.height - q.height))), _ > D && (h.minX = D, h.maxX = D = _, _ = h.minX), N > P && (h.minY = P, h.maxY = P = N, N = h.minY), n && (h.minRotation = _, h.maxRotation = D), p = !0), s.liveSnap && (M = s.liveSnap === !0 ? s.snap || {} : s.liveSnap, W = qr(M) || di(M), n ? (ie = ys(W ? M : M.rotation, _, D, 1), pe = null) : M.points ? be = Ws(W ? M : M.points, _, D, N, P, M.radius, X ? -1 : 1) : (u && (ie = ys(W ? M : M.x || M.left || M.scrollLeft, _, D, X ? -1 : 1)), g && (pe = ys(W ? M : M.y || M.top || M.scrollTop, N, P, X ? -1 : 1)))); - }, Va = function() { - h.isThrowing = !1, tt(h, "throwcomplete", "onThrowComplete"); - }, Ks = function() { - h.isThrowing = !1; - }, Wr = function(A, q) { - var M, W, G, J; - A && ws ? (A === !0 && (M = s.snap || s.liveSnap || {}, W = qr(M) || di(M), A = { - resistance: (s.throwResistance || s.resistance || 1e3) / (n ? 10 : 1) - }, n ? A.rotation = vn(h, W ? M : M.rotation, D, _, 1, q) : (u && (A[l] = vn(h, W ? M : M.points || M.x || M.left, D, _, X ? -1 : 1, q || h.lockedAxis === "x")), g && (A[c] = vn(h, W ? M : M.points || M.y || M.top, P, N, X ? -1 : 1, q || h.lockedAxis === "y")), (M.points || qr(M) && fa(M[0])) && (A.linkedProps = l + "," + c, A.radius = M.radius))), h.isThrowing = !0, J = isNaN(s.overshootTolerance) ? s.edgeResistance === 1 ? 0 : 1 - h.edgeResistance + 0.2 : s.overshootTolerance, A.duration || (A.duration = { - max: Math.max(s.minDuration || 0, "maxDuration" in s ? s.maxDuration : 2), - min: isNaN(s.minDuration) ? J === 0 || fa(A) && A.resistance > 1e3 ? 0 : 0.5 : s.minDuration, - overshoot: J - }), h.tween = G = Ce.to(X || t, { - inertia: A, - data: "_draggable", - inherit: !1, - onComplete: Va, - onInterrupt: Ks, - onUpdate: s.fastMode ? tt : je, - onUpdateParams: s.fastMode ? [h, "onthrowupdate", "onThrowUpdate"] : M && M.radius ? [!1, !0] : [] - }), s.fastMode || (X && (X._skip = !0), G.render(1e9, !0, !0), je(!0, !0), h.endX = h.x, h.endY = h.y, n && (h.endRotation = h.x), G.play(0), je(!0, !0), X && (X._skip = !1))) : p && h.applyBounds(); - }, Pi = function(A) { - var q = ve, M; - ve = Xe(t.parentNode, !0), A && h.isPressed && !ve.equals(q || new ri()) && (M = q.inverse().apply({ - x: de, - y: Q - }), ve.apply(M, M), de = M.x, Q = M.y), ve.equals(eg) && (ve = null); - }, Mi = function() { - var A = 1 - h.edgeResistance, q = L ? wr(j) : 0, M = L ? vr(j) : 0, W, G, J; - o && (R.x = U(l, "px") + "px", R.y = U(c, "px") + "px", R.renderTransform()), Pi(!1), os.x = h.pointerX - q, os.y = h.pointerY - M, ve && ve.apply(os, os), de = os.x, Q = os.y, ee && (oi(h.pointerX, h.pointerY), At(!0)), Ps = Xe(t), X ? (Qi(), d = X.top(), le = X.left()) : (ai() ? (je(!0, !0), Qi()) : h.applyBounds(), n ? (W = t.ownerSVGElement ? [R.xOrigin - t.getBBox().x, R.yOrigin - t.getBBox().y] : (Ma(t)[el] || "0 0").split(" "), ce = h.rotationOrigin = Xe(t).apply({ - x: parseFloat(W[0]) || 0, - y: parseFloat(W[1]) || 0 - }), je(!0, !0), G = h.pointerX - ce.x - q, J = ce.y - h.pointerY + M, le = h.x, d = h.y = Math.atan2(J, G) * Bc) : (d = U(c, "px"), le = U(l, "px"))), p && A && (le > D ? le = D + (le - D) / A : le < _ && (le = _ - (_ - le) / A), n || (d > P ? d = P + (d - P) / A : d < N && (d = N - (N - d) / A))), h.startX = le = li(le), h.startY = d = li(d); - }, ai = function() { - return h.tween && h.tween.isActive(); - }, Kr = function() { - Us.parentNode && !ai() && !h.isDragging && Us.parentNode.removeChild(Us); - }, Vs = function(A, q) { - var M; - if (!re || h.isPressed || !A || (A.type === "mousedown" || A.type === "pointerdown") && !q && ci() - O < 30 && Pa[h.pointerEvent.type]) { - Ve && A && re && as(A); - return; - } - if (Ze = ai(), Ai = !1, h.pointerEvent = A, Pa[A.type] ? (ge = ~A.type.indexOf("touch") ? A.currentTarget || A.target : j, nt(ge, "touchend", Rt), nt(ge, "touchmove", ss), nt(ge, "touchcancel", Rt), nt(j, "touchstart", jc)) : (ge = null, nt(j, "mousemove", ss)), De = null, (!lo || !ge) && (nt(j, "mouseup", Rt), A && A.target && nt(A.target, "mouseup", Rt)), me = F.call(h, A.target) && s.dragClickables === !1 && !q, me) { - nt(A.target, "change", Rt), tt(h, "pressInit", "onPressInit"), tt(h, "press", "onPress"), Qa(m, !0), Ve = !1; - return; - } - if (B = !ge || u === g || h.vars.allowNativeTouchScrolling === !1 || h.vars.allowContextMenu && A && (A.ctrlKey || A.which > 2) ? !1 : u ? "y" : "x", Ve = !B && !h.allowEventDefault, Ve && (as(A), nt(Ne, "touchforcechange", as)), A.changedTouches ? (A = V = A.changedTouches[0], K = A.identifier) : A.pointerId ? K = A.pointerId : V = K = null, _o++, rg(At), Q = h.pointerY = A.pageY, de = h.pointerX = A.pageX, tt(h, "pressInit", "onPressInit"), (B || h.autoScroll) && yn(t.parentNode), t.parentNode && h.autoScroll && !X && !n && t.parentNode._gsMaxScrollX && !Us.parentNode && !t.getBBox && (Us.style.width = t.parentNode.scrollWidth + "px", t.parentNode.appendChild(Us)), Mi(), h.tween && h.tween.kill(), h.isThrowing = !1, Ce.killTweensOf(X || t, y, !0), X && Ce.killTweensOf(t, { - scrollTo: 1 - }, !0), h.tween = h.lockedAxis = null, (s.zIndexBoost || !n && !X && s.zIndexBoost !== !1) && (t.style.zIndex = e.zIndex++), h.isPressed = !0, w = !!(s.onDrag || h._listeners.drag), b = !!(s.onMove || h._listeners.move), s.cursor !== !1 || s.activeCursor) - for (M = m.length; --M > -1; ) - Ce.set(m[M], { - cursor: s.activeCursor || s.cursor || (ta === "grab" ? "grabbing" : ta) - }); - tt(h, "press", "onPress"); - }, ss = function(A) { - var q = A, M, W, G, J, fe, ne; - if (!re || Bl || !h.isPressed || !A) { - Ve && A && re && as(A); - return; - } - if (h.pointerEvent = A, M = A.changedTouches, M) { - if (A = M[0], A !== V && A.identifier !== K) { - for (J = M.length; --J > -1 && (A = M[J]).identifier !== K && A.target !== t; ) - ; - if (J < 0) - return; - } - } else if (A.pointerId && K && A.pointerId !== K) - return; - if (ge && B && !De && (os.x = A.pageX - (L ? wr(j) : 0), os.y = A.pageY - (L ? vr(j) : 0), ve && ve.apply(os, os), W = os.x, G = os.y, fe = Math.abs(W - de), ne = Math.abs(G - Q), (fe !== ne && (fe > f || ne > f) || ea && B === De) && (De = fe > ne && u ? "x" : "y", B && De !== B && nt(Ne, "touchforcechange", as), h.vars.lockAxisOnTouchScroll !== !1 && u && g && (h.lockedAxis = De === "x" ? "y" : "x", di(h.vars.onLockAxis) && h.vars.onLockAxis.call(h, q)), ea && B === De))) { - Rt(q); - return; - } - !h.allowEventDefault && (!B || De && B !== De) && q.cancelable !== !1 ? (as(q), Ve = !0) : Ve && (Ve = !1), h.autoScroll && (T = !0), oi(A.pageX, A.pageY, b); - }, oi = function(A, q, M) { - var W = 1 - h.dragResistance, G = 1 - h.edgeResistance, J = h.pointerX, fe = h.pointerY, ne = d, xe = h.x, Se = h.y, Le = h.endX, Qe = h.endY, Tt = h.endRotation, js = ee, is, ni, mt, et, Xo, bs; - h.pointerX = A, h.pointerY = q, L && (A -= wr(j), q -= vr(j)), n ? (et = Math.atan2(ce.y - q, A - ce.x) * Bc, Xo = h.y - et, Xo > 180 ? (d -= 360, h.y = et) : Xo < -180 && (d += 360, h.y = et), h.x !== le || Math.abs(d - et) > f ? (h.y = et, mt = le + (d - et) * W) : mt = le) : (ve && (bs = A * ve.a + q * ve.c + ve.e, q = A * ve.b + q * ve.d + ve.f, A = bs), ni = q - Q, is = A - de, ni < f && ni > -f && (ni = 0), is < f && is > -f && (is = 0), (h.lockAxis || h.lockedAxis) && (is || ni) && (bs = h.lockedAxis, bs || (h.lockedAxis = bs = u && Math.abs(is) > Math.abs(ni) ? "y" : g ? "x" : null, bs && di(h.vars.onLockAxis) && h.vars.onLockAxis.call(h, h.pointerEvent)), bs === "y" ? ni = 0 : bs === "x" && (is = 0)), mt = li(le + is * W), et = li(d + ni * W)), (ie || pe || be) && (h.x !== mt || h.y !== et && !n) && (be && (sr.x = mt, sr.y = et, bs = be(sr), mt = li(bs.x), et = li(bs.y)), ie && (mt = li(ie(mt))), pe && (et = li(pe(et)))), p && (mt > D ? mt = D + Math.round((mt - D) * G) : mt < _ && (mt = _ + Math.round((mt - _) * G)), n || (et > P ? et = Math.round(P + (et - P) * G) : et < N && (et = Math.round(N + (et - N) * G)))), (h.x !== mt || h.y !== et && !n) && (n ? (h.endRotation = h.x = h.endX = mt, ee = !0) : (g && (h.y = h.endY = et, ee = !0), u && (h.x = h.endX = mt, ee = !0)), !M || tt(h, "move", "onMove") !== !1 ? !h.isDragging && h.isPressed && (h.isDragging = Ai = !0, tt(h, "dragstart", "onDragStart")) : (h.pointerX = J, h.pointerY = fe, d = ne, h.x = xe, h.y = Se, h.endX = Le, h.endY = Qe, h.endRotation = Tt, ee = js)); - }, Rt = function ue(A, q) { - if (!re || !h.isPressed || A && K != null && !q && (A.pointerId && A.pointerId !== K && A.target !== t || A.changedTouches && !og(A.changedTouches, K))) { - Ve && A && re && as(A); - return; - } - h.isPressed = !1; - var M = A, W = h.isDragging, G = h.vars.allowContextMenu && A && (A.ctrlKey || A.which > 2), J = Ce.delayedCall(1e-3, Kr), fe, ne, xe, Se, Le; - if (ge ? (rt(ge, "touchend", ue), rt(ge, "touchmove", ss), rt(ge, "touchcancel", ue), rt(j, "touchstart", jc)) : rt(j, "mousemove", ss), rt(Ne, "touchforcechange", as), (!lo || !ge) && (rt(j, "mouseup", ue), A && A.target && rt(A.target, "mouseup", ue)), ee = !1, W && (k = Hc = ci(), h.isDragging = !1), Vc(At), me && !G) { - A && (rt(A.target, "change", ue), h.pointerEvent = M), Qa(m, !1), tt(h, "release", "onRelease"), tt(h, "click", "onClick"), me = !1; - return; - } - for (ne = m.length; --ne > -1; ) - bn(m[ne], "cursor", s.cursor || (s.cursor !== !1 ? ta : null)); - if (_o--, A) { - if (fe = A.changedTouches, fe && (A = fe[0], A !== V && A.identifier !== K)) { - for (ne = fe.length; --ne > -1 && (A = fe[ne]).identifier !== K && A.target !== t; ) - ; - if (ne < 0 && !q) - return; - } - h.pointerEvent = M, h.pointerX = A.pageX, h.pointerY = A.pageY; - } - return G && M ? (as(M), Ve = !0, tt(h, "release", "onRelease")) : M && !W ? (Ve = !1, Ze && (s.snap || s.bounds) && Wr(s.inertia || s.throwProps), tt(h, "release", "onRelease"), (!ea || M.type !== "touchmove") && M.type.indexOf("cancel") === -1 && (tt(h, "click", "onClick"), ci() - O < 300 && tt(h, "doubleclick", "onDoubleClick"), Se = M.target || t, O = ci(), Le = function() { - O !== Ke && h.enabled() && !h.isPressed && !M.defaultPrevented && (Se.click ? Se.click() : j.createEvent && (xe = j.createEvent("MouseEvents"), xe.initMouseEvent("click", !0, !0, Ne, 1, h.pointerEvent.screenX, h.pointerEvent.screenY, h.pointerX, h.pointerY, !1, !1, !1, !1, 0, null), Se.dispatchEvent(xe))); - }, !ea && !M.defaultPrevented && Ce.delayedCall(0.05, Le))) : (Wr(s.inertia || s.throwProps), !h.allowEventDefault && M && (s.dragClickables !== !1 || !F.call(h, M.target)) && W && (!B || De && B === De) && M.cancelable !== !1 ? (Ve = !0, as(M)) : Ve = !1, tt(h, "release", "onRelease")), ai() && J.duration(h.tween.duration()), W && tt(h, "dragend", "onDragEnd"), !0; - }, Oi = function(A) { - if (A && h.isDragging && !X) { - var q = A.target || t.parentNode, M = q.scrollLeft - q._gsScrollX, W = q.scrollTop - q._gsScrollY; - (M || W) && (ve ? (de -= M * ve.a + W * ve.c, Q -= W * ve.d + M * ve.b) : (de -= M, Q -= W), q._gsScrollX += M, q._gsScrollY += W, oi(h.pointerX, h.pointerY)); - } - }, Vr = function(A) { - var q = ci(), M = q - O < 100, W = q - k < 50, G = M && Ke === O, J = h.pointerEvent && h.pointerEvent.defaultPrevented, fe = M && ye === O, ne = A.isTrusted || A.isTrusted == null && M && G; - if ((G || W && h.vars.suppressClickOnDrag !== !1) && A.stopImmediatePropagation && A.stopImmediatePropagation(), M && !(h.pointerEvent && h.pointerEvent.defaultPrevented) && (!G || ne && !fe)) { - ne && G && (ye = O), Ke = O; - return; - } - (h.isPressed || W || M) && (!ne || !A.detail || !M || J) && as(A), !M && !W && !Ai && (A && A.target && (h.pointerEvent = A), tt(h, "click", "onClick")); - }, jr = function(A) { - return ve ? { - x: A.x * ve.a + A.y * ve.c + ve.e, - y: A.x * ve.b + A.y * ve.d + ve.f - } : { - x: A.x, - y: A.y - }; - }; - return ke = e.get(t), ke && ke.kill(), i.startDrag = function(ue, A) { - var q, M, W, G; - Vs(ue || h.pointerEvent, !0), A && !h.hitTest(ue || h.pointerEvent) && (q = ir(ue || h.pointerEvent), M = ir(t), W = jr({ - x: q.left + q.width / 2, - y: q.top + q.height / 2 - }), G = jr({ - x: M.left + M.width / 2, - y: M.top + M.height / 2 - }), de -= W.x - G.x, Q -= W.y - G.y), h.isDragging || (h.isDragging = Ai = !0, tt(h, "dragstart", "onDragStart")); - }, i.drag = ss, i.endDrag = function(ue) { - return Rt(ue || h.pointerEvent, !0); - }, i.timeSinceDrag = function() { - return h.isDragging ? 0 : (ci() - k) / 1e3; - }, i.timeSinceClick = function() { - return (ci() - O) / 1e3; - }, i.hitTest = function(ue, A) { - return e.hitTest(h.target, ue, A); - }, i.getDirection = function(ue, A) { - var q = ue === "velocity" && ws ? ue : fa(ue) && !n ? "element" : "start", M, W, G, J, fe, ne; - return q === "element" && (fe = ir(h.target), ne = ir(ue)), M = q === "start" ? h.x - le : q === "velocity" ? ws.getVelocity(t, l) : fe.left + fe.width / 2 - (ne.left + ne.width / 2), n ? M < 0 ? "counter-clockwise" : "clockwise" : (A = A || 2, W = q === "start" ? h.y - d : q === "velocity" ? ws.getVelocity(t, c) : fe.top + fe.height / 2 - (ne.top + ne.height / 2), G = Math.abs(M / W), J = G < 1 / A ? "" : M < 0 ? "left" : "right", G < A && (J !== "" && (J += "-"), J += W < 0 ? "up" : "down"), J); - }, i.applyBounds = function(ue, A) { - var q, M, W, G, J, fe; - if (ue && s.bounds !== ue) - return s.bounds = ue, h.update(!0, A); - if (je(!0), Qi(), p && !ai()) { - if (q = h.x, M = h.y, q > D ? q = D : q < _ && (q = _), M > P ? M = P : M < N && (M = N), (h.x !== q || h.y !== M) && (W = !0, h.x = h.endX = q, n ? h.endRotation = q : h.y = h.endY = M, ee = !0, At(!0), h.autoScroll && !h.isDragging)) - for (yn(t.parentNode), G = t, Gs.scrollTop = Ne.pageYOffset != null ? Ne.pageYOffset : j.documentElement.scrollTop != null ? j.documentElement.scrollTop : j.body.scrollTop, Gs.scrollLeft = Ne.pageXOffset != null ? Ne.pageXOffset : j.documentElement.scrollLeft != null ? j.documentElement.scrollLeft : j.body.scrollLeft; G && !fe; ) - fe = Mr(G.parentNode), J = fe ? Gs : G.parentNode, g && J.scrollTop > J._gsMaxScrollY && (J.scrollTop = J._gsMaxScrollY), u && J.scrollLeft > J._gsMaxScrollX && (J.scrollLeft = J._gsMaxScrollX), G = J; - h.isThrowing && (W || h.endX > D || h.endX < _ || h.endY > P || h.endY < N) && Wr(s.inertia || s.throwProps, W); - } - return h; - }, i.update = function(ue, A, q) { - if (A && h.isPressed) { - var M = Xe(t), W = Ps.apply({ - x: h.x - le, - y: h.y - d - }), G = Xe(t.parentNode, !0); - G.apply({ - x: M.e - W.x, - y: M.f - W.y - }, W), h.x -= W.x - G.e, h.y -= W.y - G.f, At(!0), Mi(); - } - var J = h.x, fe = h.y; - return Pi(!A), ue ? h.applyBounds() : (ee && q && At(!0), je(!0)), A && (oi(h.pointerX, h.pointerY), ee && At(!0)), h.isPressed && !A && (u && Math.abs(J - h.x) > 0.01 || g && Math.abs(fe - h.y) > 0.01 && !n) && Mi(), h.autoScroll && (yn(t.parentNode, h.isDragging), T = h.isDragging, At(!0), zc(t, Oi), Gc(t, Oi)), h; - }, i.enable = function(ue) { - var A = { - lazy: !0 - }, q, M, W; - if (s.cursor !== !1 && (A.cursor = s.cursor || ta), Ce.utils.checkPrefix("touchCallout") && (A.touchCallout = "none"), ue !== "soft") { - for (Wc(m, u === g ? "none" : s.allowNativeTouchScrolling && t.scrollHeight === t.clientHeight == (t.scrollWidth === t.clientHeight) || s.allowEventDefault ? "manipulation" : u ? "pan-y" : "pan-x"), M = m.length; --M > -1; ) - W = m[M], lo || nt(W, "mousedown", Vs), nt(W, "touchstart", Vs), nt(W, "click", Vr, !0), Ce.set(W, A), W.getBBox && W.ownerSVGElement && u !== g && Ce.set(W.ownerSVGElement, { - touchAction: s.allowNativeTouchScrolling || s.allowEventDefault ? "manipulation" : u ? "pan-y" : "pan-x" - }), s.allowContextMenu || nt(W, "contextmenu", Ka); - Qa(m, !1); - } - return Gc(t, Oi), re = !0, ws && ue !== "soft" && ws.track(X || t, o ? "x,y" : n ? "rotation" : "top,left"), t._gsDragID = q = "d" + tg++, br[q] = h, X && (X.enable(), X.element._gsDragID = q), (s.bounds || n) && Mi(), s.bounds && h.applyBounds(), h; - }, i.disable = function(ue) { - for (var A = h.isDragging, q = m.length, M; --q > -1; ) - bn(m[q], "cursor", null); - if (ue !== "soft") { - for (Wc(m, null), q = m.length; --q > -1; ) - M = m[q], bn(M, "touchCallout", null), rt(M, "mousedown", Vs), rt(M, "touchstart", Vs), rt(M, "click", Vr, !0), rt(M, "contextmenu", Ka); - Qa(m, !0), ge && (rt(ge, "touchcancel", Rt), rt(ge, "touchend", Rt), rt(ge, "touchmove", ss)), rt(j, "mouseup", Rt), rt(j, "mousemove", ss); - } - return zc(t, Oi), re = !1, ws && ue !== "soft" && (ws.untrack(X || t, o ? "x,y" : n ? "rotation" : "top,left"), h.tween && h.tween.kill()), X && X.disable(), Vc(At), h.isDragging = h.isPressed = me = !1, A && tt(h, "dragend", "onDragEnd"), h; - }, i.enabled = function(ue, A) { - return arguments.length ? ue ? h.enable(A) : h.disable(A) : re; - }, i.kill = function() { - return h.isThrowing = !1, h.tween && h.tween.kill(), h.disable(), Ce.set(m, { - clearProps: "userSelect" - }), delete br[t._gsDragID], h; - }, i.revert = function() { - this.kill(), this.styles && this.styles.revert(); - }, ~r.indexOf("scroll") && (X = i.scrollProxy = new hg(t, ig({ - onKill: function() { - h.isPressed && Rt(null); - } - }, s)), t.style.overflowY = g && !Jn ? "auto" : "hidden", t.style.overflowX = u && !Jn ? "auto" : "hidden", t = X.content), n ? y.rotation = 1 : (u && (y[l] = 1), g && (y[c] = 1)), R.force3D = "force3D" in s ? s.force3D : !0, N0(Nc(i)), i.enable(), i; - } - return e.register = function(s) { - Ce = s, wn(); - }, e.create = function(s, i) { - return Zn || wn(!0), ki(s).map(function(r) { - return new e(r, i); - }); - }, e.get = function(s) { - return br[(ki(s)[0] || {})._gsDragID]; - }, e.timeSinceDrag = function() { - return (ci() - Hc) / 1e3; - }, e.hitTest = function(s, i, r) { - if (s === i) - return !1; - var o = ir(s), n = ir(i), l = o.top, c = o.left, u = o.right, g = o.bottom, f = o.width, h = o.height, m = n.left > u || n.right < c || n.top > g || n.bottom < l, y, k, T; - return m || !r ? !m : (T = (r + "").indexOf("%") !== -1, r = parseFloat(r) || 0, y = { - left: Math.max(c, n.left), - top: Math.max(l, n.top) - }, y.width = Math.min(u, n.right) - y.left, y.height = Math.min(g, n.bottom) - y.top, y.width < 0 || y.height < 0 ? !1 : T ? (r *= 0.01, k = y.width * y.height, k >= f * h * r || k >= n.width * n.height * r) : y.width > r && y.height > r); - }, e; -}(dg); -ag(Ii.prototype, { - pointerX: 0, - pointerY: 0, - startX: 0, - startY: 0, - deltaX: 0, - deltaY: 0, - isDragging: !1, - isPressed: !1 -}); -Ii.zIndex = 1e3; -Ii.version = "3.12.5"; -H0() && Ce.registerPlugin(Ii); -/*! - * MotionPathPlugin 3.12.5 - * https://gsap.com - * - * @license Copyright 2008-2024, GreenSock. All rights reserved. - * Subject to the terms at https://gsap.com/standard-license or for - * Club GSAP members, the agreement issued with that membership. - * @author: Jack Doyle, jack@greensock.com -*/ -var gg = "x,translateX,left,marginLeft,xPercent".split(","), pg = "y,translateY,top,marginTop,yPercent".split(","), fg = Math.PI / 180, cs, j0, rr, sl, kn, Uc, mg = function() { - return cs || typeof window < "u" && (cs = window.gsap) && cs.registerPlugin && cs; -}, Yr = function(e, t, s, i) { - for (var r = t.length, o = i === 2 ? 0 : i, n = 0; n < r; n++) - e[o] = parseFloat(t[n][s]), i === 2 && (e[o + 1] = 0), o += 2; - return e; -}, hr = function(e, t, s) { - return parseFloat(e._gsap.get(e, t, s || "px")) || 0; -}, G0 = function(e) { - var t = e[0], s = e[1], i; - for (i = 2; i < e.length; i += 2) - t = e[i] += t, s = e[i + 1] += s; -}, Xc = function(e, t, s, i, r, o, n, l, c) { - if (n.type === "cubic") - t = [t]; - else { - n.fromCurrent !== !1 && t.unshift(hr(s, i, l), r ? hr(s, r, c) : 0), n.relative && G0(t); - var u = r ? jn : Ed; - t = [u(t, n.curviness)]; - } - return t = o(z0(t, s, n)), So(e, s, i, t, "x", l), r && So(e, s, r, t, "y", c), zi(t, n.resolution || (n.curviness === 0 ? 20 : 12)); -}, yg = function(e) { - return e; -}, bg = /[-+\.]*\d+\.?(?:e-|e\+)?\d*/g, Zc = function(e, t, s) { - var i = Xe(e), r = 0, o = 0, n; - return (e.tagName + "").toLowerCase() === "svg" ? (n = e.viewBox.baseVal, n.width || (n = { - width: +e.getAttribute("width"), - height: +e.getAttribute("height") - })) : n = t && e.getBBox && e.getBBox(), t && t !== "auto" && (r = t.push ? t[0] * (n ? n.width : e.offsetWidth || 0) : t.x, o = t.push ? t[1] * (n ? n.height : e.offsetHeight || 0) : t.y), s.apply(r || o ? i.apply({ - x: r, - y: o - }) : { - x: i.e, - y: i.f - }); -}, il = function(e, t, s, i) { - var r = Xe(e.parentNode, !0, !0), o = r.clone().multiply(Xe(t)), n = Zc(e, s, r), l = Zc(t, i, r), c = l.x, u = l.y, g; - return o.e = o.f = 0, i === "auto" && t.getTotalLength && t.tagName.toLowerCase() === "path" && (g = t.getAttribute("d").match(bg) || [], g = o.apply({ - x: +g[0], - y: +g[1] - }), c += g.x, u += g.y), g && (g = o.apply(t.getBBox()), c -= g.x, u -= g.y), o.e = c - n.x, o.f = u - n.y, o; -}, z0 = function(e, t, s) { - var i = s.align, r = s.matrix, o = s.offsetX, n = s.offsetY, l = s.alignOrigin, c = e[0][0], u = e[0][1], g = hr(t, "x"), f = hr(t, "y"), h, m, y; - return !e || !e.length ? ao("M0,0L0,0") : (i && (i === "self" || (h = sl(i)[0] || t) === t ? nr(e, 1, 0, 0, 1, g - c, f - u) : (l && l[2] !== !1 ? cs.set(t, { - transformOrigin: l[0] * 100 + "% " + l[1] * 100 + "%" - }) : l = [hr(t, "xPercent") / -100, hr(t, "yPercent") / -100], m = il(t, h, l, "auto"), y = m.apply({ - x: c, - y: u - }), nr(e, m.a, m.b, m.c, m.d, g + m.e - (y.x - m.e), f + m.f - (y.y - m.f)))), r ? nr(e, r.a, r.b, r.c, r.d, r.e, r.f) : (o || n) && nr(e, 1, 0, 0, 1, o || 0, n || 0), e); -}, So = function(e, t, s, i, r, o) { - var n = t._gsap, l = n.harness, c = l && l.aliases && l.aliases[s], u = c && c.indexOf(",") < 0 ? c : s, g = e._pt = new j0(e._pt, t, u, 0, 0, yg, 0, n.set(t, u, e)); - g.u = rr(n.get(t, u, o)) || 0, g.path = i, g.pp = r, e._props.push(u); -}, vg = function(e, t) { - return function(s) { - return e || t !== 1 ? m0(s, e, t) : s; - }; -}, Lr = { - version: "3.12.5", - name: "motionPath", - register: function(e, t, s) { - cs = e, rr = cs.utils.getUnit, sl = cs.utils.toArray, kn = cs.core.getStyleSaver, Uc = cs.core.reverting || function() { - }, j0 = s; - }, - init: function(e, t, s) { - if (!cs) - return console.warn("Please gsap.registerPlugin(MotionPathPlugin)"), !1; - (!(typeof t == "object" && !t.style) || !t.path) && (t = { - path: t - }); - var i = [], r = t, o = r.path, n = r.autoRotate, l = r.unitX, c = r.unitY, u = r.x, g = r.y, f = o[0], h = vg(t.start, "end" in t ? t.end : 1), m, y; - if (this.rawPaths = i, this.target = e, this.tween = s, this.styles = kn && kn(e, "transform"), (this.rotate = n || n === 0) && (this.rOffset = parseFloat(n) || 0, this.radians = !!t.useRadians, this.rProp = t.rotation || "rotation", this.rSet = e._gsap.set(e, this.rProp, this), this.ru = rr(e._gsap.get(e, this.rProp)) || 0), Array.isArray(o) && !("closed" in o) && typeof f != "number") { - for (y in f) - !u && ~gg.indexOf(y) ? u = y : !g && ~pg.indexOf(y) && (g = y); - u && g ? i.push(Xc(this, Yr(Yr([], o, u, 0), o, g, 1), e, u, g, h, t, l || rr(o[0][u]), c || rr(o[0][g]))) : u = g = 0; - for (y in f) - y !== u && y !== g && i.push(Xc(this, Yr([], o, y, 2), e, y, 0, h, t, rr(o[0][y]))); - } else - m = h(z0(ao(t.path), e, t)), zi(m, t.resolution), i.push(m), So(this, e, t.x || "x", m, "x", t.unitX || "px"), So(this, e, t.y || "y", m, "y", t.unitY || "px"); - }, - render: function(e, t) { - var s = t.rawPaths, i = s.length, r = t._pt; - if (t.tween._time || !Uc()) { - for (e > 1 ? e = 1 : e < 0 && (e = 0); i--; ) - Cc(s[i], e, !i && t.rotate, s[i]); - for (; r; ) - r.set(r.t, r.p, r.path[r.pp] + r.u, r.d, e), r = r._next; - t.rotate && t.rSet(t.target, t.rProp, s[0].angle * (t.radians ? fg : 1) + t.rOffset + t.ru, t, e); - } else - t.styles.revert(); - }, - getLength: function(e) { - return zi(ao(e)).totalLength; - }, - sliceRawPath: m0, - getRawPath: ao, - pointsToSegment: jn, - stringToRawPath: Ia, - rawPathToString: Il, - transformRawPath: nr, - getGlobalMatrix: Xe, - getPositionOnPath: Cc, - cacheRawPathMeasurements: zi, - convertToPath: function(e, t) { - return sl(e).map(function(s) { - return Cd(s, t !== !1); - }); - }, - convertCoordinates: function(e, t, s) { - var i = Xe(t, !0, !0).multiply(Xe(e)); - return s ? i.apply(s) : i; - }, - getAlignMatrix: il, - getRelativePosition: function(e, t, s, i) { - var r = il(e, t, s, i); - return { - x: r.e, - y: r.f - }; - }, - arrayToRawPath: function(e, t) { - t = t || {}; - var s = Yr(Yr([], e, t.x || "x", 0), e, t.y || "y", 1); - return t.relative && G0(s), [t.type === "cubic" ? s : jn(s, t.curviness)]; - } -}; -mg() && cs.registerPlugin(Lr); -/*! - * strings: 3.12.5 - * https://gsap.com - * - * Copyright 2008-2024, GreenSock. All rights reserved. - * Subject to the terms at https://gsap.com/standard-license or for - * Club GSAP members, the agreement issued with that membership. - * @author: Jack Doyle, jack@greensock.com -*/ -var wg = /(?:^\s+|\s+$)/g, kg = /([\uD800-\uDBFF][\uDC00-\uDFFF](?:[\u200D\uFE0F][\uD800-\uDBFF][\uDC00-\uDFFF]){2,}|\uD83D\uDC69(?:\u200D(?:(?:\uD83D\uDC69\u200D)?\uD83D\uDC67|(?:\uD83D\uDC69\u200D)?\uD83D\uDC66)|\uD83C[\uDFFB-\uDFFF])|\uD83D\uDC69\u200D(?:\uD83D\uDC69\u200D)?\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC69\u200D(?:\uD83D\uDC69\u200D)?\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67])|\uD83C\uDFF3\uFE0F\u200D\uD83C\uDF08|(?:\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD37-\uDD39\uDD3D\uDD3E\uDDD6-\uDDDD])(?:\uD83C[\uDFFB-\uDFFF])\u200D[\u2640\u2642]\uFE0F|\uD83D\uDC69(?:\uD83C[\uDFFB-\uDFFF])\u200D(?:\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92])|(?:\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC6F\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD37-\uDD39\uDD3C-\uDD3E\uDDD6-\uDDDF])\u200D[\u2640\u2642]\uFE0F|\uD83C\uDDFD\uD83C\uDDF0|\uD83C\uDDF6\uD83C\uDDE6|\uD83C\uDDF4\uD83C\uDDF2|\uD83C\uDDE9(?:\uD83C[\uDDEA\uDDEC\uDDEF\uDDF0\uDDF2\uDDF4\uDDFF])|\uD83C\uDDF7(?:\uD83C[\uDDEA\uDDF4\uDDF8\uDDFA\uDDFC])|\uD83C\uDDE8(?:\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDEE\uDDF0-\uDDF5\uDDF7\uDDFA-\uDDFF])|(?:\u26F9|\uD83C[\uDFCB\uDFCC]|\uD83D\uDD75)(?:\uFE0F\u200D[\u2640\u2642]|(?:\uD83C[\uDFFB-\uDFFF])\u200D[\u2640\u2642])\uFE0F|(?:\uD83D\uDC41\uFE0F\u200D\uD83D\uDDE8|\uD83D\uDC69(?:\uD83C[\uDFFB-\uDFFF])\u200D[\u2695\u2696\u2708]|\uD83D\uDC69\u200D[\u2695\u2696\u2708]|\uD83D\uDC68(?:(?:\uD83C[\uDFFB-\uDFFF])\u200D[\u2695\u2696\u2708]|\u200D[\u2695\u2696\u2708]))\uFE0F|\uD83C\uDDF2(?:\uD83C[\uDDE6\uDDE8-\uDDED\uDDF0-\uDDFF])|\uD83D\uDC69\u200D(?:\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D(?:\uD83D[\uDC68\uDC69])|\uD83D[\uDC68\uDC69]))|\uD83C\uDDF1(?:\uD83C[\uDDE6-\uDDE8\uDDEE\uDDF0\uDDF7-\uDDFB\uDDFE])|\uD83C\uDDEF(?:\uD83C[\uDDEA\uDDF2\uDDF4\uDDF5])|\uD83C\uDDED(?:\uD83C[\uDDF0\uDDF2\uDDF3\uDDF7\uDDF9\uDDFA])|\uD83C\uDDEB(?:\uD83C[\uDDEE-\uDDF0\uDDF2\uDDF4\uDDF7])|[#\*0-9]\uFE0F\u20E3|\uD83C\uDDE7(?:\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEF\uDDF1-\uDDF4\uDDF6-\uDDF9\uDDFB\uDDFC\uDDFE\uDDFF])|\uD83C\uDDE6(?:\uD83C[\uDDE8-\uDDEC\uDDEE\uDDF1\uDDF2\uDDF4\uDDF6-\uDDFA\uDDFC\uDDFD\uDDFF])|\uD83C\uDDFF(?:\uD83C[\uDDE6\uDDF2\uDDFC])|\uD83C\uDDF5(?:\uD83C[\uDDE6\uDDEA-\uDDED\uDDF0-\uDDF3\uDDF7-\uDDF9\uDDFC\uDDFE])|\uD83C\uDDFB(?:\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDEE\uDDF3\uDDFA])|\uD83C\uDDF3(?:\uD83C[\uDDE6\uDDE8\uDDEA-\uDDEC\uDDEE\uDDF1\uDDF4\uDDF5\uDDF7\uDDFA\uDDFF])|\uD83C\uDFF4\uDB40\uDC67\uDB40\uDC62(?:\uDB40\uDC77\uDB40\uDC6C\uDB40\uDC73|\uDB40\uDC73\uDB40\uDC63\uDB40\uDC74|\uDB40\uDC65\uDB40\uDC6E\uDB40\uDC67)\uDB40\uDC7F|\uD83D\uDC68(?:\u200D(?:\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83D\uDC68|(?:(?:\uD83D[\uDC68\uDC69])\u200D)?\uD83D\uDC66\u200D\uD83D\uDC66|(?:(?:\uD83D[\uDC68\uDC69])\u200D)?\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92])|(?:\uD83C[\uDFFB-\uDFFF])\u200D(?:\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]))|\uD83C\uDDF8(?:\uD83C[\uDDE6-\uDDEA\uDDEC-\uDDF4\uDDF7-\uDDF9\uDDFB\uDDFD-\uDDFF])|\uD83C\uDDF0(?:\uD83C[\uDDEA\uDDEC-\uDDEE\uDDF2\uDDF3\uDDF5\uDDF7\uDDFC\uDDFE\uDDFF])|\uD83C\uDDFE(?:\uD83C[\uDDEA\uDDF9])|\uD83C\uDDEE(?:\uD83C[\uDDE8-\uDDEA\uDDF1-\uDDF4\uDDF6-\uDDF9])|\uD83C\uDDF9(?:\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDED\uDDEF-\uDDF4\uDDF7\uDDF9\uDDFB\uDDFC\uDDFF])|\uD83C\uDDEC(?:\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEE\uDDF1-\uDDF3\uDDF5-\uDDFA\uDDFC\uDDFE])|\uD83C\uDDFA(?:\uD83C[\uDDE6\uDDEC\uDDF2\uDDF3\uDDF8\uDDFE\uDDFF])|\uD83C\uDDEA(?:\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDED\uDDF7-\uDDFA])|\uD83C\uDDFC(?:\uD83C[\uDDEB\uDDF8])|(?:\u26F9|\uD83C[\uDFCB\uDFCC]|\uD83D\uDD75)(?:\uD83C[\uDFFB-\uDFFF])|(?:\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD37-\uDD39\uDD3D\uDD3E\uDDD6-\uDDDD])(?:\uD83C[\uDFFB-\uDFFF])|(?:[\u261D\u270A-\u270D]|\uD83C[\uDF85\uDFC2\uDFC7]|\uD83D[\uDC42\uDC43\uDC46-\uDC50\uDC66\uDC67\uDC70\uDC72\uDC74-\uDC76\uDC78\uDC7C\uDC83\uDC85\uDCAA\uDD74\uDD7A\uDD90\uDD95\uDD96\uDE4C\uDE4F\uDEC0\uDECC]|\uD83E[\uDD18-\uDD1C\uDD1E\uDD1F\uDD30-\uDD36\uDDD1-\uDDD5])(?:\uD83C[\uDFFB-\uDFFF])|\uD83D\uDC68(?:\u200D(?:(?:(?:\uD83D[\uDC68\uDC69])\u200D)?\uD83D\uDC67|(?:(?:\uD83D[\uDC68\uDC69])\u200D)?\uD83D\uDC66)|\uD83C[\uDFFB-\uDFFF])|(?:[\u261D\u26F9\u270A-\u270D]|\uD83C[\uDF85\uDFC2-\uDFC4\uDFC7\uDFCA-\uDFCC]|\uD83D[\uDC42\uDC43\uDC46-\uDC50\uDC66-\uDC69\uDC6E\uDC70-\uDC78\uDC7C\uDC81-\uDC83\uDC85-\uDC87\uDCAA\uDD74\uDD75\uDD7A\uDD90\uDD95\uDD96\uDE45-\uDE47\uDE4B-\uDE4F\uDEA3\uDEB4-\uDEB6\uDEC0\uDECC]|\uD83E[\uDD18-\uDD1C\uDD1E\uDD1F\uDD26\uDD30-\uDD39\uDD3D\uDD3E\uDDD1-\uDDDD])(?:\uD83C[\uDFFB-\uDFFF])?|(?:[\u231A\u231B\u23E9-\u23EC\u23F0\u23F3\u25FD\u25FE\u2614\u2615\u2648-\u2653\u267F\u2693\u26A1\u26AA\u26AB\u26BD\u26BE\u26C4\u26C5\u26CE\u26D4\u26EA\u26F2\u26F3\u26F5\u26FA\u26FD\u2705\u270A\u270B\u2728\u274C\u274E\u2753-\u2755\u2757\u2795-\u2797\u27B0\u27BF\u2B1B\u2B1C\u2B50\u2B55]|\uD83C[\uDC04\uDCCF\uDD8E\uDD91-\uDD9A\uDDE6-\uDDFF\uDE01\uDE1A\uDE2F\uDE32-\uDE36\uDE38-\uDE3A\uDE50\uDE51\uDF00-\uDF20\uDF2D-\uDF35\uDF37-\uDF7C\uDF7E-\uDF93\uDFA0-\uDFCA\uDFCF-\uDFD3\uDFE0-\uDFF0\uDFF4\uDFF8-\uDFFF]|\uD83D[\uDC00-\uDC3E\uDC40\uDC42-\uDCFC\uDCFF-\uDD3D\uDD4B-\uDD4E\uDD50-\uDD67\uDD7A\uDD95\uDD96\uDDA4\uDDFB-\uDE4F\uDE80-\uDEC5\uDECC\uDED0-\uDED2\uDEEB\uDEEC\uDEF4-\uDEF8]|\uD83E[\uDD10-\uDD3A\uDD3C-\uDD3E\uDD40-\uDD45\uDD47-\uDD4C\uDD50-\uDD6B\uDD80-\uDD97\uDDC0\uDDD0-\uDDE6])|(?:[#\*0-9\xA9\xAE\u203C\u2049\u2122\u2139\u2194-\u2199\u21A9\u21AA\u231A\u231B\u2328\u23CF\u23E9-\u23F3\u23F8-\u23FA\u24C2\u25AA\u25AB\u25B6\u25C0\u25FB-\u25FE\u2600-\u2604\u260E\u2611\u2614\u2615\u2618\u261D\u2620\u2622\u2623\u2626\u262A\u262E\u262F\u2638-\u263A\u2640\u2642\u2648-\u2653\u2660\u2663\u2665\u2666\u2668\u267B\u267F\u2692-\u2697\u2699\u269B\u269C\u26A0\u26A1\u26AA\u26AB\u26B0\u26B1\u26BD\u26BE\u26C4\u26C5\u26C8\u26CE\u26CF\u26D1\u26D3\u26D4\u26E9\u26EA\u26F0-\u26F5\u26F7-\u26FA\u26FD\u2702\u2705\u2708-\u270D\u270F\u2712\u2714\u2716\u271D\u2721\u2728\u2733\u2734\u2744\u2747\u274C\u274E\u2753-\u2755\u2757\u2763\u2764\u2795-\u2797\u27A1\u27B0\u27BF\u2934\u2935\u2B05-\u2B07\u2B1B\u2B1C\u2B50\u2B55\u3030\u303D\u3297\u3299]|\uD83C[\uDC04\uDCCF\uDD70\uDD71\uDD7E\uDD7F\uDD8E\uDD91-\uDD9A\uDDE6-\uDDFF\uDE01\uDE02\uDE1A\uDE2F\uDE32-\uDE3A\uDE50\uDE51\uDF00-\uDF21\uDF24-\uDF93\uDF96\uDF97\uDF99-\uDF9B\uDF9E-\uDFF0\uDFF3-\uDFF5\uDFF7-\uDFFF]|\uD83D[\uDC00-\uDCFD\uDCFF-\uDD3D\uDD49-\uDD4E\uDD50-\uDD67\uDD6F\uDD70\uDD73-\uDD7A\uDD87\uDD8A-\uDD8D\uDD90\uDD95\uDD96\uDDA4\uDDA5\uDDA8\uDDB1\uDDB2\uDDBC\uDDC2-\uDDC4\uDDD1-\uDDD3\uDDDC-\uDDDE\uDDE1\uDDE3\uDDE8\uDDEF\uDDF3\uDDFA-\uDE4F\uDE80-\uDEC5\uDECB-\uDED2\uDEE0-\uDEE5\uDEE9\uDEEB\uDEEC\uDEF0\uDEF3-\uDEF8]|\uD83E[\uDD10-\uDD3A\uDD3C-\uDD3E\uDD40-\uDD45\uDD47-\uDD4C\uDD50-\uDD6B\uDD80-\uDD97\uDDC0\uDDD0-\uDDE6])\uFE0F)/; -function q0(a) { - var e = a.nodeType, t = ""; - if (e === 1 || e === 9 || e === 11) { - if (typeof a.textContent == "string") - return a.textContent; - for (a = a.firstChild; a; a = a.nextSibling) - t += q0(a); - } else if (e === 3 || e === 4) - return a.nodeValue; - return t; -} -function rl(a, e, t, s) { - for (var i = a.firstChild, r = [], o; i; ) - i.nodeType === 3 ? (o = (i.nodeValue + "").replace(/^\n+/g, ""), s || (o = o.replace(/\s+/g, " ")), r.push.apply(r, Y0(o, e, t, s))) : (i.nodeName + "").toLowerCase() === "br" ? r[r.length - 1] += "
" : r.push(i.outerHTML), i = i.nextSibling; - for (o = r.length; o--; ) - r[o] === "&" && r.splice(o, 1, "&"); - return r; -} -function Y0(a, e, t, s) { - if (a += "", t && (a = a.trim ? a.trim() : a.replace(wg, "")), e && e !== "") - return a.replace(/>/g, ">").replace(/= 55296 && l.charCodeAt(0) <= 56319 || a.charCodeAt(o + 1) >= 65024 && a.charCodeAt(o + 1) <= 65039) && (n = ((a.substr(o, 12).split(kg) || [])[1] || "").length || 2, l = a.substr(o, n), i.emoji = 1, o += n - 1), i.push(l === ">" ? ">" : l === "<" ? "<" : s && l === " " && (a.charAt(o - 1) === " " || a.charAt(o + 1) === " ") ? " " : l); - return i; -} -/*! - * TextPlugin 3.12.5 - * https://gsap.com - * - * @license Copyright 2008-2024, GreenSock. All rights reserved. - * Subject to the terms at https://gsap.com/standard-license or for - * Club GSAP members, the agreement issued with that membership. - * @author: Jack Doyle, jack@greensock.com -*/ -var sa, eo, Dg = function() { - return sa || typeof window < "u" && (sa = window.gsap) && sa.registerPlugin && sa; -}, Rr = { - version: "3.12.5", - name: "text", - init: function(e, t, s) { - typeof t != "object" && (t = { - value: t - }); - var i = e.nodeName.toUpperCase(), r = this, o = t, n = o.newClass, l = o.oldClass, c = o.preserveSpaces, u = o.rtl, g = r.delimiter = t.delimiter || "", f = r.fillChar = t.fillChar || (t.padSpace ? " " : ""), h, m, y, k, T, S, C, I; - if (r.svg = e.getBBox && (i === "TEXT" || i === "TSPAN"), !("innerHTML" in e) && !r.svg) - return !1; - if (r.target = e, !("value" in t)) { - r.text = r.original = [""]; - return; - } - for (y = rl(e, g, !1, c), eo || (eo = document.createElement("div")), eo.innerHTML = t.value, m = rl(eo, g, !1, c), r.from = s._from, (r.from || u) && !(u && r.from) && (i = y, y = m, m = i), r.hasClass = !!(n || l), r.newClass = u ? l : n, r.oldClass = u ? n : l, i = y.length - m.length, h = i < 0 ? y : m, i < 0 && (i = -i); --i > -1; ) - h.push(f); - if (t.type === "diff") { - for (k = 0, T = [], S = [], C = "", i = 0; i < m.length; i++) - I = m[i], I === y[i] ? C += I : (T[k] = C + I, S[k++] = C + y[i], C = ""); - m = T, y = S, C && (m.push(C), y.push(C)); - } - t.speed && s.duration(Math.min(0.05 / t.speed * h.length, t.maxDuration || 9999)), r.rtl = u, r.original = y, r.text = m, r._props.push("text"); - }, - render: function(e, t) { - e > 1 ? e = 1 : e < 0 && (e = 0), t.from && (e = 1 - e); - var s = t.text, i = t.hasClass, r = t.newClass, o = t.oldClass, n = t.delimiter, l = t.target, c = t.fillChar, u = t.original, g = t.rtl, f = s.length, h = (g ? 1 - e : e) * f + 0.5 | 0, m, y, k; - i && e ? (m = r && h, y = o && h !== f, k = (m ? "" : "") + s.slice(0, h).join(n) + (m ? "" : "") + (y ? "" : "") + n + u.slice(h).join(n) + (y ? "" : "")) : k = s.slice(0, h).join(n) + n + u.slice(h).join(n), t.svg ? l.textContent = k : l.innerHTML = c === " " && ~k.indexOf(" ") ? k.split(" ").join("  ") : k; - } -}; -Rr.splitInnerHTML = rl; -Rr.emojiSafeSplit = Y0; -Rr.getText = q0; -Dg() && sa.registerPlugin(Rr); -ot.registerPlugin(Lr); -const Tg = "a|above|after|an|and|at|below|but|by|down|for|for|from|in|nor|of|off|on|onto|or|out|so|the|to|under|up|with|yet".split("|").map((a) => new RegExp(`\\b${a}\\b`, "gui")), Jc = [ - "I", - /[^a-z]{3,}|[.0-9]/gu -].map((a) => /RegExp/.test(Object.prototype.toString.call(a)) ? a : new RegExp(`\\b${a}\\b`, "gui")), Cg = `Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse ultricies -nibh sed massa euismod lacinia. Aliquam nec est ac nunc ultricies scelerisque porta vulputate odio. -Integer gravida mattis odio, semper volutpat tellus. Ut elit leo, auctor eget fermentum hendrerit, -aliquet ac nunc. Suspendisse porta turpis vitae mi posuere molestie. Cras lectus lacus, vulputate a -vestibulum in, mattis vel mi. Mauris quis semper mauris. Praesent blandit nec diam eget tincidunt. Nunc -aliquet consequat massa ac lacinia. Ut posuere velit sagittis, vehicula nisl eget, fringilla nibh. Duis -volutpat mattis libero, a porttitor sapien viverra ut. Phasellus vulputate imperdiet ligula, eget -eleifend metus tempor nec. Nam eget sapien risus. Praesent id suscipit elit. Sed pellentesque ligula -diam, non aliquet magna feugiat vitae. Pellentesque ut tortor id erat placerat dignissim. Pellentesque -ut dui vel leo laoreet sodales nec ac tellus. In hac habitasse platea dictumst. Proin sed ex sed augue -sollicitudin interdum. Sed id lacus porttitor nisi vestibulum tincidunt. Nulla facilisi. Vestibulum -feugiat finibus magna in pretium. Proin consectetur lectus nisi, non commodo lectus tempor et. Cras -viverra, mi in consequat aliquet, justo mauris fringilla tellus, at accumsan magna metus in eros. Sed -vehicula, diam ut sagittis semper, purus massa mattis dolor, in posuere.`, _g = ` -aboveboard|account|achiever|acoustics|act|action|activity|actor|addition|adjustment|advertisement|advice|afterglow|afterimage|afterlife|aftermath|afternoon|afterthought|agreement -air|aircraft|airfield|airlift|airline|airmen|airplane|airport|airtime|alarm|allover|allspice|alongside|also|amount|amusement|anger|angle|animal|another|ants|anyhow|anymore -anyone|anyplace|anytime|anywhere|apparatus|apparel|appliance|approval|arch|argument|arithmetic|arm|army|around|art|ashtray|attack|attraction|aunt|authority|babies|baby|babysitter -back|backache|backbone|backbreaker|backdrop|backfire|background|backhand|backlash|backlog|backpack|backside|backslap|backslide|backspace|backspin|backstroke|backtrack|backward -badge|bag|bait|balance|ball|ballroom|bankbook|bankroll|base|baseball|basin|basket|basketball|bat|bath|battle|beachcomb|bead|bear|because|become|bed|bedrock|bedroll|bedroom -beds|bee|beef|beginner|behavior|belief|believe|bell|bellboy|bellhop|bells|below|berry|bike|bikes|bird|birds|birth|birthday|bit|bite|blackball|blackberries|blackbird|blackboard -blackjack|blacklist|blackmail|blackout|blacksmith|blacktop|blade|blood|blow|blowgun|bluebell|blueberry|bluebird|bluefish|bluegrass|blueprint|board|boardwalk|boat|bodyguard -bomb|bone|book|bookcase|bookend|bookkeeper|bookmark|bookmobile|books|bookseller|bookshelf|bookworm|boot|border|bottle|boundary|bowlegs|bowtie|box|boy|brainchild|brake|branch -brass|breath|brick|bridge|brother|bubble|bucket|bugspray|building|bulb|burst|bushes|business|butter|butterball|buttercup|butterfingers|buttermilk|butternut|butterscotch|button -bypass|cabbage|cabdriver|cable|cactus|cake|cakes|calculator|calendar|camera|camp|can|cancan|candlelight|candlestick|cannon|cannot|canvas|cap|caption|car|card|cardsharp|care -carefree|careworn|carfare|carload|carpenter|carpool|carport|carriage|cars|carsick|cart|cartwheel|cast|cat|cats|cattle|catwalk|cause|cave|caveman|celery|cellar|cemetery|cent -centercut|chalk|chance|change|channel|cheese|cheeseburger|cherries|cherry|chess|chicken|chickens|children|chin|church|circle|clam|class|clockwise|cloth|clover|club|coach|coal -coast|coat|cobweb|coffeemaker|coil|collar|color|comeback|committee|commonplace|commonwealth|company|comparison|competition|condition|connection|control|cook|copper|corn|cornmeal -cough|country|courthouse|cover|cow|cows|crack|cracker|crate|crayon|cream|creator|creature|credit|crewcut|crib|crime|crook|crossbow|crossbreed|crosscut|crossover|crosswalk -crow|crowd|crown|cub|cup|current|curtain|curve|cushion|dad|dairymaid|daisywheel|daughter|day|daybed|daybook|daybreak|daydream|daylight|daytime|deadend|deadline|death|debt -decision|deer|degree|design|desire|desk|destruction|detail|development|digestion|dime|dinner|dinosaurs|direction|dirt|discovery|discussion|dishcloth|dishpan|dishwasher|dishwater -diskdrive|distance|distribution|division|dock|doctor|dog|dogs|doll|dolls|donkey|door|doorstop|downtown|downunder|drain|drawbridge|drawer|dress|drink|driveway|driving|drop -duck|duckbill|duckpin|ducks|dust|ear|earache|earring|earth|earthquake|earthward|earthworm|edge|education|effect|egg|egghead|eggnog|eggs|eggshell|elbow|end|engine|error|event -everything|example|exchange|existence|expansion|experience|expert|eye|eyeballs|eyecatching|eyeglasses|eyelash|eyelid|eyes|eyesight|eyewitness|face|fact|fairies|fall|fang|farm -fatherland|fear|feeling|field|finger|fire|fireball|fireboat|firebomb|firebreak|firecracker|firefighter|firehouse|fireman|fireproof|fireworks|fish|fishbowl|fisherman|fisheye -fishhook|fishmonger|fishnet|fishpond|fishtail|flag|flame|flavor|flesh|flight|flock|floor|flower|flowers|fly|fog|fold|food|foot|football|foothill|footlights|footlocker|footprints -forbearer|force|forearm|forebear|forebrain|forecast|foreclose|foreclosure|foredoom|forefather|forefeet|forefinger|forefoot|forego|foregone|forehand|forehead|foreknowledge -foreleg|foreman|forepaws|foresee|foreshadow|forestall|forethought|foretold|forever|forewarn|foreword|forget|fork|forklift|form|fowl|frame|friction|friend|friends|frog|frogs -front|fruit|fruitcup|fuel|furniture|gate|gearshift|geese|ghost|giants|giraffe|girl|girls|glass|glassmaking|glove|gold|goodbye|goodnight|government|governor|grade|grain|grandaunt -granddaughter|grandfather|grandmaster|grandmother|grandnephew|grandparent|grandson|grandstand|granduncle|grape|grass|grassland|graveyard|grip|ground|group|growth|guide|guitar -gumball|gun|hair|haircut|hall|hamburger|hammer|hand|handbook|handgun|handmade|handout|hands|harbor|harmony|hat|hate|head|headache|headlight|headline|headquarters|health|heat -hereafter|hereby|herein|hereupon|highchair|highland|highway|hill|himself|history|hobbies|hole|holiday|home|homemade|hometown|honey|honeybee|honeydew|honeysuckle|hook|hookup -hope|horn|horse|horseback|horsefly|horsehair|horseman|horseplay|horsepower|horseradish|horses|hose|hospital|hot|hour|house|houseboat|household|housekeeper|houses|housetop -however|humor|hydrant|ice|icicle|idea|impulse|income|increase|industry|ink|insect|inside|instrument|insurance|intake|interest|invention|iron|island|itself|jail|jailbait|jam -jar|jeans|jelly|jellybean|jellyfish|jetliner|jetport|jewel|join|judge|juice|jump|jumpshot|kettle|key|keyboard|keyhole|keynote|keypad|keypunch|keystone|keystroke|keyword|kick -kiss|kittens|kitty|knee|knife|knot|knowledge|laborer|lace|ladybug|lake|lamp|land|language|laugh|leather|leg|legs|letter|letters|lettuce|level|library|lifeblood|lifeguard|lifelike -lifeline|lifelong|lifetime|lifework|limelight|limestone|limit|line|linen|lip|liquid|loaf|lock|locket|longhand|look|loss|love|low|lukewarm|lumber|lunch|lunchroom|machine|magic -maid|mailbox|mainline|man|marble|mark|market|mask|mass|match|matchbox|meal|meantime|meanwhile|measure|meat|meeting|memory|men|metal|mice|middle|milk|mind|mine|minister|mint -minute|mist|mitten|mom|money|monkey|month|moon|moonbeam|moonlight|moonlit|moonscape|moonshine|moonstruck|moonwalk|moreover|morning|mother|motion|motorcycle|mountain|mouth -move|muscle|name|nation|nearby|neck|need|needle|nerve|nest|nevermore|newsboy|newsbreak|newscaster|newsdealer|newsletter|newsman|newspaper|newsprint|newsreel|newsroom|night -nightfall|nobody|noise|noisemaker|north|northeast|nose|note|notebook|nowhere|number|nursemaid|nut|nutcracker|oatmeal|observation|ocean|offer|office|oil|oneself|onetime|orange -oranges|order|oven|overboard|overcoat|overflow|overland|pacemaker|page|pail|pan|pancake|paper|parcel|part|partner|party|passbook|passenger|passkey|Passover|passport|payment -peace|pear|pen|pencil|peppermint|person|pest|pet|pets|pickle|pickup|picture|pie|pies|pig|pigs|pin|pinhole|pinstripe|pinup|pinwheel|pipe|pizzas|place|plane|planes|plant|plantation -plants|plastic|plate|play|playback|playground|playhouse|playthings|pleasure|plot|plough|pocket|point|poison|pollution|ponytail|popcorn|porter|position|postcard|pot|potato -powder|power|price|produce|profit|property|prose|protest|pull|pump|punishment|purpose|push|quarter|quartz|queen|question|quicksand|quiet|quill|quilt|quince|quiver|rabbit|rabbits -racquetball|rail|railroad|railway|rain|raincheck|raincoat|rainstorm|rainwater|rake|range|rat|rate|rattlesnake|rattletrap|ray|reaction|reading|reason|receipt|recess|record -regret|relation|religion|repairman|representative|request|respect|rest|reward|rhythm|rice|riddle|rifle|ring|rings|river|riverbanks|road|robin|rock|rod|roll|roof|room|root -rose|route|rub|rubberband|rule|run|sack|sail|sailboat|salesclerk|salt|sand|sandlot|sandstone|saucepan|scale|scapegoat|scarecrow|scarf|scene|scent|school|schoolbook|schoolboy -schoolbus|schoolhouse|science|scissors|screw|sea|seashore|seat|secretary|seed|selection|self|sense|servant|shade|shadyside|shake|shame|shape|sharecropper|sharpshooter|sheep -sheepskin|sheet|shelf|ship|shirt|shock|shoe|shoelace|shoemaker|shoes|shop|shortbread|show|showoff|showplace|side|sidekick|sidewalk|sign|silk|silver|silversmith|sink|sister -sisterhood|sisters|sixfold|size|skate|skateboard|skin|skintight|skirt|sky|skylark|skylight|slave|sleep|sleet|slip|slope|slowdown|slumlord|smash|smell|smile|smoke|snail|snails -snake|snakes|snakeskin|sneeze|snow|snowball|snowbank|snowbird|snowdrift|snowshovel|soap|society|sock|soda|sofa|softball|somebody|someday|somehow|someone|someplace|something -sometimes|somewhat|somewhere|son|song|songs|sort|sound|soundproof|soup|southeast|southwest|soybean|space|spacewalk|spade|spark|spearmint|spiders|spillway|spokesperson|sponge -spoon|spot|spring|spy|square|squirrel|stage|stagehand|stamp|standby|standoff|standout|standpoint|star|starfish|start|statement|station|steam|steamship|steel|stem|step|stepson -stew|stick|sticks|stitch|stocking|stockroom|stomach|stone|stop|stoplight|stopwatch|store|story|stove|stranger|straw|stream|street|stretch|string|stronghold|structure|substance -subway|sugar|suggestion|suit|summer|sun|sunbaked|sunbathe|sundial|sundown|sunfish|sunflower|sunglasses|sunlit|sunray|sunroof|sunup|supercargo|supercharge|supercool|superego -superfine|supergiant|superhero|superhighways|superhuman|superimpose|supermarket|supermen|supernatural|superpower|superscript|supersensitive|supersonic|superstar|superstrong -superstructure|supertanker|superweapon|superwoman|support|surprise|sweater|sweetheart|sweetmeat|swim|swing|system|table|tablecloth|tablespoon|tabletop|tableware|tail|tailcoat -tailgate|taillight|taillike|tailpiece|tailspin|takeoff|takeout|takeover|talebearer|taleteller|talk|tank|tapeworm|taproom|taproot|target|taskmaster|taste|tax|taxicab|taxpayer -teaching|teacup|team|teammate|teamwork|teapot|teaspoon|teenager|teeth|telltale|temper|tendency|tenderfoot|tenfold|tent|territory|test|textbook|texture|theory|therefore|thing -things|thought|thread|thrill|throat|throne|throwaway|throwback|thumb|thunder|thunderbird|thunderstorm|ticket|tiger|time|timekeeper|timesaving|timeshare|timetable|tin|title -toad|toe|toes|together|tomatoes|tongue|toolbox|tooth|toothbrush|toothpaste|toothpick|top|touch|touchdown|town|township|toy|toys|trade|trail|train|trains|tramp|transport|tray -treatment|tree|trees|trick|trip|trouble|trousers|truck|trucks|tub|turkey|turn|turnabout|turnaround|turnbuckle|turndown|turnkey|turnoff|turntable|twig|twist|typewriter|umbrella -uncle|underachieve|underage|underarm|underbelly|underbid|undercharge|underclothes|undercover|undercut|underdevelop|underestimate|underexpose|underfoot|underground|underwear -unit|upbeat|upbringing|upcoming|update|upend|upgrade|upheaval|uphill|uphold|upkeep|upland|uplift|upload|upmarket|upon|uppercase|upperclassman|uppercut|uproar|uproot|upset -upshot|upside|upstage|upstairs|upstanding|upstart|upstate|upstream|uptake|upthrust|uptight|uptime|uptown|upward|upwind|use|vacation|value|van|vase|vegetable|veil|vein|verse -vessel|vest|view|visitor|voice|volcano|volleyball|voyage|waistline|walk|walkways|wall|walleyed|wallpaper|war|wardroom|warfare|warmblooded|warpath|wash|washbowl|washcloth|washhouse -washout|washrag|washroom|washstand|washtub|waste|wastebasket|wasteland|wastepaper|wastewater|watch|watchband|watchdog|watchmaker|watchman|watchtower|watchword|water|watercolor -watercooler|watercraft|waterfall|waterfront|waterline|waterlog|watermelon|waterpower|waterproof|waterscape|watershed|waterside|waterspout|watertight|wave|wavelike|waves|wax -waxwork|way|waybill|wayfarer|waylaid|wayside|wayward|wealth|weather|weathercock|weatherman|weatherproof|week|weekday|weekend|weeknight|weight|whatever|whatsoever|wheel|wheelchair -wheelhouse|whip|whistle|whitecap|whitefish|whitewall|whitewash|widespread|wilderness|wind|window|wine|wing|winter|wipeout|wire|wish|without|woman|women|wood|woodshop|wool -word|work|worm|wound|wren|wrench|wrist|writer|writing|yak|yam|yard|yarn|year|yoke|zebra|zephyr|zinc|zipper|zoo -`.split("|"), Ms = { - ones: [ - "zero", - "one", - "two", - "three", - "four", - "five", - "six", - "seven", - "eight", - "nine", - "ten", - "eleven", - "twelve", - "thirteen", - "fourteen", - "fifteen", - "sixteen", - "seventeen", - "eighteen", - "nineteen", - "twenty" - ], - tens: ["", "", "twenty", "thirty", "forty", "fifty", "sixty", "seventy", "eighty", "ninety"], - tiers: ["", "thousand", "million", "billion", "trillion", "quadrillion", "quintillion", "sextillion", "septillion", "octillion", "nonillion"], - bigPrefixes: ["", "un", "duo", "tre", "quattuor", "quin", "sex", "octo", "novem"], - bigSuffixes: ["", "decillion", "vigintillion", "trigintillion", "quadragintillion", "quinquagintillion", "sexagintillion", "septuagintillion", "octogintillion", "nonagintillion", "centillion"] -}, Qc = { - zero: "zeroeth", - one: "first", - two: "second", - three: "third", - four: "fourth", - five: "fifth", - eight: "eighth", - nine: "ninth", - twelve: "twelfth", - twenty: "twentieth", - thirty: "thirtieth", - forty: "fortieth", - fifty: "fiftieth", - sixty: "sixtieth", - seventy: "seventieth", - eighty: "eightieth", - ninety: "ninetieth" -}, Sg = { - grouped: [ - ["", "Ⅰ", "Ⅱ", "Ⅲ", "Ⅳ", "Ⅴ", "Ⅵ", "Ⅶ", "Ⅷ", "Ⅸ"], - ["", "Ⅹ", "ⅩⅩ", "ⅩⅩⅩ", "ⅩⅬ", "Ⅼ", "ⅬⅩ", "ⅬⅩⅩ", "ⅬⅩⅩⅩ", "ⅩⅭ"], - ["", "Ⅽ", "ⅭⅭ", "ⅭⅭⅭ", "ⅭⅮ", "Ⅾ", "ⅮⅭ", "ⅮⅭⅭ", "ⅮⅭⅭⅭ", "ⅭⅯ"], - ["", "Ⅿ", "ⅯⅯ", "ⅯⅯⅯ", "Ⅿↁ", "ↁ", "ↁⅯ", "ↁⅯⅯ", "ↁⅯⅯⅯ", "ↁↂ"], - ["", "ↂ", "ↂↂ", "ↂↂↂ", "ↂↇ", "ↇ", "ↇↂ", "ↇↂↂ", "ↇↂↂↂ", "ↇↈ"], - ["", "ↈ", "ↈↈ", "ↈↈↈ"] - ], - ungrouped: [ - ["", "Ⅰ", "ⅠⅠ", "ⅠⅠⅠ", "ⅠⅤ", "Ⅴ", "ⅤⅠ", "ⅤⅠⅠ", "ⅤⅠⅠⅠ", "ⅠⅩ"], - ["", "Ⅹ", "ⅩⅩ", "ⅩⅩⅩ", "ⅩⅬ", "Ⅼ", "ⅬⅩ", "ⅬⅩⅩ", "ⅬⅩⅩⅩ", "ⅩⅭ"], - ["", "Ⅽ", "ⅭⅭ", "ⅭⅭⅭ", "ⅭⅮ", "Ⅾ", "ⅮⅭ", "ⅮⅭⅭ", "ⅮⅭⅭⅭ", "ⅭⅯ"], - ["", "Ⅿ", "ⅯⅯ", "ⅯⅯⅯ", "Ⅿↁ", "ↁ", "ↁⅯ", "ↁⅯⅯ", "ↁⅯⅯⅯ", "ↁↂ"], - ["", "ↂ", "ↂↂ", "ↂↂↂ", "ↂↇ", "ↇ", "ↇↂ", "ↇↂↂ", "ↇↂↂↂ", "ↇↈ"], - ["", "ↈ", "ↈↈ", "ↈↈↈ"] - ] -}, Dn = [], Eg = () => { - var a, e; - return ((e = (a = game == null ? void 0 : game.user) == null ? void 0 : a.find((t) => t.isGM)) == null ? void 0 : e.id) ?? !1; -}, Ho = (a) => typeof a == "number" && !isNaN(a), U0 = (a) => typeof a == "string" && !isNaN(parseFloat(a)) && isFinite(parseFloat(a)), X0 = (a) => typeof a == "string" && (a === "true" || a === "false"), it = (a) => Array.isArray(a), Z0 = (a) => a === Object(a) && !it(a), Bs = (a) => a === Object(a) && !it(a), xg = (a) => typeof a == "function", ya = (a) => Ho(a) && Math.round(a) === a, J0 = (a) => Ho(a) && /\./.test(`${a}`), al = (a) => ya(a) && a >= 0, Q0 = (a) => Bs(a) || it(a), Ig = (a) => typeof a == "object" && a !== null && Symbol.iterator in a, Ag = (a) => typeof a == "string" && /^<.*>$/u.test(a), Wo = (a) => typeof a == "string" && /^#(([0-9a-fA-F]{2}){3,4}|[0-9a-fA-F]{3,4})$/.test(a), Ko = (a) => typeof a == "string" && /^rgba?\((\d{1,3},\s*){1,2}?\d{1,3},\s*\d{1,3}(\.\d+)?\)$/.test(a), Es = (a) => a === void 0, ba = (a) => !Es(a), Hl = (a) => Object.keys(a).length === 0, Wl = (a) => !Hl(a), Pg = (a, e) => e instanceof a, Mg = (a) => Es(a) || a === null; -function eh(a, e) { - let t; - try { - t = JSON.stringify(a); - } catch { - t = String(a); - } - if (a === void 0) - throw new Error(`Value ${t} is undefined!`); - if (typeof e == "string") { - if (typeof a !== e) - throw new Error(`Value ${t} is not a ${e}!`); - } else if (!(a instanceof e)) - throw new Error(`Value ${t} is not a ${e.name}!`); -} -const th = (a, e) => [null, void 0].includes(a) && [null, void 0].includes(e) ? !0 : [null, void 0].includes(a) || [null, void 0].includes(e) ? !1 : typeof a == "number" && typeof e == "number" || typeof a == "boolean" && typeof e == "boolean" || typeof a == "string" && typeof e == "string" ? a === e : typeof a == "number" && typeof e == "string" ? a === Number(e) : typeof a == "string" && typeof e == "number" ? Number(a) === e : typeof a == "boolean" && typeof e == "object" || typeof a == "object" && typeof e == "boolean" ? !1 : typeof a == "boolean" && typeof e == "string" ? a && e !== "" || !a && e === "" : typeof a == "string" && typeof e == "boolean" ? e && a !== "" || !e && a === "" : (typeof a == "number" || typeof a == "string") && typeof e == "object" || typeof a == "object" && (typeof e == "number" || typeof e == "string") ? !1 : typeof a == "object" && typeof e == "object" ? a === e : !1, Og = (...a) => { - do { - const e = a.pop(); - if (a.length && !th(e, a[0])) - return !1; - } while (a.length); - return !0; -}, es = (a, e, t = !1) => (typeof a == "string" && (a = parseFloat(a)), typeof a == "number" ? isNaN(a) ? t ? NaN : 0 : Es(e) ? a : Math.round(a * 10 ** e) / 10 ** e : t ? NaN : 0), Bt = (a, e, t) => { - let s = !1; - return typeof e == "boolean" && (s = e), isNaN(es(a, 0, s)) ? NaN : Math.round(es(a, 0, s)); -}, Fg = (a) => typeof a == "boolean" ? a : [0, null, void 0, ""].includes(a) ? !1 : typeof a == "string" ? !["0", "false", "null", "undefined", ""].includes(a) : !(it(a) && a.length === 0 || Bs(a) && Hl(a)), sh = (a, e = !0) => (a = e ? a % (2 * Math.PI) : a, a *= 180 / Math.PI, a), Lg = (a, e = !0) => (a = e ? a % 360 : a, a *= Math.PI / 180, a), Rg = (a, e) => a in e ? e[a] : null, $g = { - IsInstance: (a) => (e) => typeof a == "function" && e instanceof a -}, ih = (a) => String(a).toUpperCase(), Hs = (a) => String(a).toLowerCase(), Kl = (a) => { - let [e, ...t] = `${a ?? ""}`.split(/\s+/); - return e = Eo(e, Jc) ? e : `${ih(e.charAt(0))}${Hs(e.slice(1))}`, Wl(t) && (t = t.map((s) => Eo(s, Jc) ? s : Hs(s))), [e, ...t].join(" ").trim(); -}, Ng = (a) => String(a).split(/\s/).map((e, t) => t && Eo(e, Tg) ? Hs(e) : Kl(e)).join(" ").trim(), Eo = (a, e = [], t = "gui", s = !1) => e.map((i) => i instanceof RegExp ? i : new RegExp(`\\b${i}\\b`, t))[s ? "every" : "some"]((i) => i.test(`${a}`)), dr = (a, e, t) => { - const s = []; - [...(t ?? "").replace(/g/g, ""), "u"].forEach((o) => { - o && !s.includes(o) && s.push(o); - }); - const i = /[)(]/.test(e.toString().replace(/\\\)|\\\(/g, "")); - i && s.push("g"), t = s.join(""), e = new RegExp(e, t); - const r = `${a}`.match(e) || []; - return i ? Array.from(r) : r.pop(); -}, Bg = (a) => `${a}`.replace(/[\u00AD\u200B]/gu, ""), Hg = (a) => `${a}`.replace(/\b([aA])\s([aeiouAEIOU])/gu, "$1n $2"), Wg = (a, e = 2, t) => es(e) === 1 ? a : t ?? `${a.replace(/y$/, "ie").replace(/s$/, "se")}s`, Kg = (a, e = !0, t = "and") => { - if (a.length === 0) - return ""; - if (a.length === 1) - return `${a[0]}`; - const s = a.pop(); - return [ - a.join(", "), - e ? "," : "", - ` ${t} `, - s - ].join(""); -}, Vg = (a, e) => { - const t = String(a); - return t.length > e ? `${t.slice(0, e - 3)}…` : t; -}, jg = (a, e, t = " ") => { - const s = `${a}`; - return s.length < e ? `${t.repeat(e - s.length)}${s}` : s; -}, Gg = (a) => (a ?? "").toLowerCase().replace(/ /g, "-").replace(/default/, "DEFAULT"), rh = (a, e = "", t = "+") => { - let s; - const i = es(a); - return i < 0 ? s = "-" : i === 0 ? s = t : s = "+", `${s}${e}${Math.abs(i)}`; -}, zg = (a, e, t = !1) => { - const s = t && a >= 0 ? "+" : "", [i, r] = `${es(a)}`.split(/\./); - return getType(r) === "int" ? r.length > e ? `${s}${es(a, e)}` : r.length < e ? `${s}${i}.${r}${"0".repeat(e - r.length)}` : `${s}${es(a)}` : `${s}${i}.${"0".repeat(e)}`; -}, Vl = (a) => { - var i; - if (es(a) === 0) - return "0"; - const e = Hs(a).replace(/[^\d.e+-]/g, ""), t = dr(e, /^-?[\d.]+/), s = Bt(dr(e, /e([+-]?\d+)$/)); - if (typeof t == "string" && typeof s == "string") { - let r = dr(t, /^-?(\d+)/), o = dr(t, /\.(\d+)/); - if (it(r) && it(o) && (r = (i = r.pop()) == null ? void 0 : i.replace(/^0+/, ""), o = Hs(o == null ? void 0 : o.pop()).replace(/0+$/, ""), !Es(r) && !Es(o))) { - const n = Math.max(0, r.length + s), l = Math.max(0, o.length - s), c = [ - r.slice(0, n), - o.slice(0, Math.max(0, s)) - ].join("") || "0", u = [ - r.length - n > 0 ? r.slice(r.length - n - 1) : "", - o.slice(o.length - l) - ].join(""); - return [ - e.charAt(0) === "-" ? "-" : "", - c, - "0".repeat(Math.max(0, n - c.length)), - u.length ? "." : "", - "0".repeat(Math.max(0, l - u.length)), - u - ].join(""); - } - } - return `${a}`; -}, ah = (a) => { - var l; - a = Vl(a); - const e = (c) => c < Ms.tiers.length ? Ms.tiers[c] : [ - Ms.bigPrefixes[c % 10 - 1], - Ms.bigSuffixes[Math.floor(c / 10)] - ].join(""), t = (c) => { - if (Bt(c) === 0) - return ""; - const u = `${c}`.split("").map((f) => Bt(f)); - let g = ""; - if (u.length === 3) { - const f = u.shift(); - if (Es(f)) - throw new Error(`[U.verbalizeNum] Undefined digit in trio '${u.join("")}'.`); - g += f > 0 ? `${Ms.ones[f]} hundred` : "", f && (u[0] || u[1]) && (g += " and "); - } - if (Bt(u.join("")) <= Ms.ones.length) - g += Ms.ones[Bt(u.join(""))]; - else { - const f = Ms.tens[Bt(u.shift())], h = Bt(u[0]) > 0 ? `-${Ms.ones[Bt(u[0])]}` : ""; - g += `${f}${h}`; - } - return g; - }, s = []; - a.charAt(0) === "-" && s.push("negative"); - const [i, r] = a.replace(/[,\s-]/g, "").split("."), o = ((l = [...i.split("")].reverse().join("").match(/.{1,3}/g)) == null ? void 0 : l.map((c) => [...c.split("")].reverse().join(""))) ?? [], n = []; - for (; o.length; ) { - const c = o.pop(); - if (c) { - const u = t(c); - u && n.push(`${u} ${e(o.length)}`); - } - } - if (s.push(n.join(", ").trim()), getType(r) === "int") { - i === "0" && s.push("zero"), s.push("point"); - for (const c of r.split("")) - s.push(Ms.ones[Bt(c)]); - } - return s.join(" "); -}, qg = (a, e = !1) => { - if (e) { - const [t, s] = Hs(ah(a)).match(/.*?[-\s]?(\w*)$/i) ?? ["", ""]; - return t.replace( - new RegExp(`${s}$`), - s in Qc ? Qc[s] : `${s}th` - ); - } - return /(\.)|(1[1-3]$)/.test(`${a}`) ? `${a}th` : `${a}${["th", "st", "nd", "rd", "th", "th", "th", "th", "th", "th"][Bt(`${a}`.charAt(`${a}`.length - 1))]}`; -}, Yg = (a, e = !0) => { - if (J0(a)) - throw new Error(`Error: Can't Romanize Floats (${a})`); - if (a >= 4e5) - throw new Error(`Error: Can't Romanize >= 400,000 (${a})`); - if (a < 0) - throw new Error(`Error: Can't Romanize Negative Numbers (${a})`); - if (a === 0) - return "0"; - const t = Sg[e ? "grouped" : "ungrouped"], s = [...Vl(a).split("")].reverse().map((i, r) => t[r][Bt(i)]).reverse().join(""); - return e ? s.replace(/ⅩⅠ/gu, "Ⅺ").replace(/ⅩⅡ/gu, "Ⅻ") : s; -}, Ug = (a = 200) => { - const e = Cg.split(/\n?\s+/g), t = [...e[Vo(0, e.length - 1)]]; - for (; t.length < a; ) - t.push(...e); - return t.length = a, `${Kl(t.join(" ")).trim().replace(/[^a-z\s]*$/ui, "")}.`; -}, Xg = (a = 5) => Array.from({ length: a }).map(() => String.fromCharCode(jl(...["a", "z"].map((e) => e.charCodeAt(0))))).join(""), Zg = (a = 1, e = _g) => Array.from({ length: a }).map(() => zl([...e])).join(" "), Jg = (a) => { - const e = Math.max( - 0, - ...Dn.filter(([s]) => s.startsWith(a)).map(([, , s]) => s) - ) + 1, t = e === 1 ? a : `${a}_${e}`; - return Dn.push([a, t, e]), eLog.log(`UUIDify(${a}) --> [${t}, ${e}]`), Object.assign(globalThis, { UUIDLOG: Dn }), t; -}, Qg = (a, e) => { - const [t, s] = [a, e].map((i) => Hs(String(i).replace(/[^a-zA-Z0-9.+-]/g, "").trim())); - return t.length > 0 && t === s; -}, oh = (a, e = [], t = 0) => { - const s = [ - (n, l) => new RegExp(`^${n}$`, "gu").test(`${l}`), - (n, l) => new RegExp(`^${n}$`, "gui").test(`${l}`) - ]; - if (t >= 1) { - const n = [ - (l, c) => new RegExp(`^${l}`, "gui").test(`${c}`), - (l, c) => new RegExp(`${l}$`, "gui").test(`${c}`), - (l, c) => new RegExp(`${l}`, "gui").test(`${c}`), - (l, c) => new RegExp(`${c}`, "gui").test(`${l}`) - ]; - s.push(...n), t >= 2 && (s.push(...n.map((l) => (c, u) => l(`${c}`.replace(/\W/g, ""), `${u}`.replace(/\W/gu, "")))), t >= 3 && s.push(() => !1)); - } - const i = `${a}`, r = (() => { - if (it(e)) - return [...e]; - if (Bs(e)) - return Object.keys(e); - try { - return Array.from(e); - } catch { - throw new Error(`Haystack type must be [list, array], not ${typeof e}: ${JSON.stringify(e)}`); - } - })(); - if (!it(r)) - return !1; - let o = -1; - for (; !al(o); ) { - const n = s.shift(); - if (!n) - return !1; - o = r.findIndex((l) => n(i, `${l}`)); - } - return al(o) ? Bs(e) ? Object.values(e)[o] : e[o] : !1; -}, e2 = (a, e) => oh(a, e, 0), Vo = (a, e, t = 0) => ot.utils.random(a, e, t), jl = (a, e) => Vo(a, e, 1), t2 = () => Vo(0, 1, 1) === 1, nh = (a, [e = 0, t = 1 / 0] = []) => ot.utils.wrap(e, t, a), s2 = (a, [e = 0, t = 1 / 0] = []) => ot.utils.clamp(e, t, a), Gl = (a, e = [0, 360]) => nh(a, e), Oa = (a, e = 0) => e === 0 ? Bt(a) : es(a, e), lh = (...a) => Object.values(a.flat()).reduce((e, t) => t + e, 0), i2 = (...a) => lh(...a) / a.flat().length, r2 = ({ x: a, y: e }, { x: t, y: s }) => ((a - t) ** 2 + (e - s) ** 2) ** 0.5, a2 = ({ x: a, y: e }, { x: t, y: s }, { x: i, y: r } = { x: 0, y: 0 }, o = [0, 360]) => (a -= i, e -= r, t -= i, s -= r, Gl(sh(Math.atan2(s - e, t - a)), o)), ch = (a, e, t = [0, 360]) => Gl(e - a, t), o2 = (a) => { - let e = 1 / 0, t = 1 / 0, s = -1 / 0, i = -1 / 0; - for (const c of a) { - let u, g, f, h; - if (c.radius !== void 0) - u = c.x - c.radius, g = c.y - c.radius, f = c.x + c.radius, h = c.y + c.radius; - else if (c.size !== void 0) - u = (c.x - c.size) / 2, g = (c.y - c.size) / 2, f = (c.x + c.size) / 2, h = (c.y + c.size) / 2; - else if (c.width !== void 0 || c.height !== void 0) - c.width ?? (c.width = c.height), c.height ?? (c.height = c.width), u = (c.x - c.width) / 2, g = (c.y - c.height) / 2, f = (c.x + c.width) / 2, h = (c.y + c.height) / 2; - else - throw new Error(`[getBoundingRectangle] Error: shape must be a circle, square, or rectangle, not ${JSON.stringify(c)}`); - e = Math.min(e, u), t = Math.min(t, g), s = Math.max(s, f), i = Math.max(i, h); - } - const r = s - e, o = i - t, n = (e + r) / 2, l = (t + o) / 2; - return { x: n, y: l, width: r, height: o }; -}, zl = (a) => ot.utils.random(a), n2 = (a) => jl(0, a.length - 1), l2 = (a, e) => { - const t = []; - for (let s = a; s <= e; s++) - t.push(s); - return t; -}, c2 = (a, e = 0) => { - const t = ot.utils.wrap(a); - return e--, function* () { - for (; ; ) - e++, yield t(e); - }(); -}; -function u2(a) { - if (a = Object.values(a), a.length === 0) - throw new Error("Cannot get last element of an empty array."); - return a[a.length - 1]; -} -const h2 = (a) => { - const e = []; - return a.forEach((t) => { - e.includes(t) || e.push(t); - }), e; -}, d2 = (a, e) => { - const t = {}; - return a.forEach((s) => { - const i = s[e]; - let r = t[i]; - r || (r = [], t[i] = r), r.push(s); - }), t; -}, g2 = (a, e = 1, t = !0, s = (i, r) => !r.includes(i)) => { - const i = []; - let r = 0; - for (; i.length < e && r < 1e6; ) { - const o = zl(a); - t && s(o, i) && i.push(o), r++; - } - return i; -}, p2 = (a, e) => a.splice(a.findIndex((t) => t === e)); -function uh(a, e) { - let t; - typeof e != "function" ? t = (i) => i === e : t = e; - const s = a.findIndex((i, r, o) => t(i, r, o)); - if (s !== -1) - return a.splice(s, 1).pop(); -} -const f2 = (a, e) => uh(a, (t, s) => s === e), m2 = (a, e) => { - const t = []; - for (; a.length > e; ) { - const s = []; - for (; s.length < e; ) - s.push(a.shift()); - t.push(s); - } - return t.push(a), t; -}, y2 = (a) => { - let e = a.length, t; - for (; e !== 0; ) - t = Math.floor(Math.random() * e), e--, [a[e], a[t]] = [ - a[t], - a[e] - ]; - return a; -}, b2 = (a) => ot.utils.toArray(a), xo = ({ k: a, v: e }, t) => typeof t == "function" ? ba(e) ? t(e, a) : t(a) : (typeof t == "number" && (t = `${t}`), new RegExp(t).test(`${e}`)), v2 = (a, e) => { - if (it(a)) { - const t = a.findIndex((s) => xo({ v: s }, e)); - if (t >= 0) - return w2(a, t); - } else if (Bs(a)) { - const [t] = Object.entries(a).find(([s, i]) => xo({ k: s, v: i }, e)) ?? []; - if (t) - return k2(a, t); - } - return !1; -}, w2 = (a, e) => { - let t; - for (let s = 0; s <= a.length; s++) - s === e ? t = a.shift() : a.push(a.shift()); - return t; -}, k2 = (a, e) => { - const t = a[e]; - return delete a[e], t; -}, D2 = (a, e, t) => { - let s; - if (Bs(a)) { - if ([s] = Object.entries(a).find((i) => xo({ v: i }, e)) || [!1], s === !1) - return !1; - } else if (it(a) && (s = a.findIndex((i) => xo({ v: i }, e)), s === -1)) - return !1; - return typeof s != "number" && (s = `${s}`), typeof t == "function" ? a[s] = t(a[s], s) : a[s] = t, !0; -}, ol = (a, e = [void 0, null, "", {}, []]) => { - if (e.map((s) => JSON.stringify(s)).includes(JSON.stringify(a)) || e.includes(a)) - return "KILL"; - if (Array.isArray(a)) { - const s = a.map((i) => ol(i, e)).filter((i) => i !== "KILL"); - return Array.isArray(s) && s.length ? s : "KILL"; - } - if (a && typeof a == "object" && JSON.stringify(a).startsWith("{")) { - const s = Object.entries(a).map(([i, r]) => [i, ol(r, e)]).filter(([, i]) => i !== "KILL"); - return s.length ? Object.fromEntries(s) : "KILL"; - } - return a; -}, T2 = (a, e = () => !0) => [ - Io(a, e), - Io(a, (t, s) => !e(t, s)) -], C2 = (a, e) => { - if (a.length !== e.length) - throw new Error("The arrays must be of equal length."); - if (new Set(a).size !== a.length) - throw new Error("The keys must be unique."); - const t = {}; - return a.forEach((s, i) => { - t[s] = e[i]; - }), t; -}; -function hh(a, e, t) { - let s = t, i = e; - return s || (s = e, i = !1), i || (i = (r) => r), Array.isArray(a) ? a.map(s) : Object.fromEntries(Object.entries(a).map(([r, o]) => (eh(s, "function"), [i(r, o), s(o, r)]))); -} -const dh = (a) => Z0(a) ? Object.keys(a).length : it(a) ? a.length : a === !1 || a === null || a === void 0 ? 0 : 1; -function _2(a, e, t) { - if (t || (t = e, e = !1), e || (e = (o) => o), it(a)) - return a.findIndex(t); - const s = e || (() => !0), i = t || (() => !0), r = Object.entries(a).find(([o, n]) => s(o, n) && i(n, o)); - return r ? r[0] : !1; -} -const Io = (a, e, t, s = !1) => { - if (t || (t = e, e = !1), e || (e = (o) => o), it(a)) { - const o = a.filter(t); - return s ? (a.splice(0, a.length, ...o), a) : o; - } - const i = e || (() => !0), r = t || (() => !0); - if (s) { - const o = Object.entries(a).filter(([n, l]) => !(i(n, l) && r(l, n))); - for (const [n] of o) - delete a[n]; - return a; - } - return Object.fromEntries( - Object.entries(a).filter(([o, n]) => i(o, n) && r(n, o)) - ); -}, S2 = (a, e) => { - it(a) ? a.forEach(e) : Object.entries(a).forEach(([t, s]) => e(s, t)); -}, E2 = (a, e = [void 0, null], t = !1) => Io(a, (s) => !e.includes(s), void 0, t), gh = (a, e = !1) => { - const t = (i) => [...i], s = (i) => ({ ...i }); - try { - return JSON.parse(JSON.stringify(a)); - } catch (i) { - if (e) - throw i; - if (Array.isArray(a)) - return t(a); - if (typeof a == "object") - return s(a); - } - return a; -}; -function ph(a, e, { - isMutatingOk: t = !1, - isStrictlySafe: s = !1, - isConcatenatingArrays: i = !0, - isReplacingArrays: r = !1 -} = {}) { - if (a = t ? a : gh(a, s), e && typeof e == "object" && "id" in e && Go(e.id) || Es(a)) - return e; - if (Es(e) || !Q0(e)) - return a; - for (const [o, n] of Object.entries(e)) { - const l = a[o]; - r && it(l) && it(n) ? a[o] = n : i && it(l) && it(n) ? a[o].push(...n) : n !== null && typeof n == "object" ? (Es(l) && !(n instanceof Application) && (a[o] = new (Object.getPrototypeOf(n)).constructor()), a[o] = ph( - a[o], - n, - { isMutatingOk: !0, isStrictlySafe: s } - )) : a[o] = n; - } - return a; -} -function fh(a, e) { - const t = {}, s = Object.keys(e).filter((r) => Object.hasOwn(e, r) && Object.hasOwn(a, r)), i = Object.keys(e).filter((r) => Object.hasOwn(e, r) && !Object.hasOwn(a, r)); - for (const r of s) - if (typeof a[r] == "object" && typeof e[r] == "object" && !Array.isArray(a[r]) && !Array.isArray(e[r])) { - const o = fh(a[r], e[r]); - Object.keys(o).length > 0 && (t[r] = o); - } else if (Array.isArray(a[r]) && Array.isArray(e[r])) { - const o = a[r], n = e[r]; - o.toString() !== n.toString() && (t[r] = e[r]); - } else - a[r] !== e[r] && (t[r] = e[r]); - for (const r of i) - t[`-=${r}`] = e[r]; - return t; -} -const mh = (a) => { - const e = {}; - for (const [s, i] of Object.entries(a)) - if (Bs(i)) { - const r = mh(i); - setProperty(e, s, r); - } else - setProperty(e, s, i); - function t(s) { - return Bs(s) ? /^\d+$/.test(Object.keys(s).join("")) ? Object.values(s).map(t) : hh(s, (i) => t(i)) : it(s) ? s.map(t) : s; - } - return t(e); -}, yh = (a) => { - const e = {}; - for (const [t, s] of Object.entries(a)) - if ((it(s) || Bs(s)) && Wl(s)) - for (const [i, r] of Object.entries(yh(s))) - e[`${t}.${i}`] = r; - else - e[t] = s; - return e; -}; -function x2(a) { - return Q0(a) ? Array.isArray(a) ? (a.forEach((e, t) => { - a[t] = null; - }), a) : (Object.keys(a).forEach((e) => { - a[e] = null; - }), a) : a; -} -function I2(a, ...e) { - const t = e[0]; - if (t instanceof Object && !Array.isArray(t)) { - const s = t; - for (const i in s) - if (a[i] === void 0) - throw new Error(`Missing value for ${i}`); - } else - for (const s of e) - if (a[s] === void 0) - throw new Error(`Missing value for ${String(s)}`); - return a; -} -const A2 = (a, e, t) => { - if (typeof e == "function") { - const s = { [a](...i) { - return e(...i); - } }[a]; - return t ? s.bind(t) : s; - } - return !1; -}, P2 = (a) => (...e) => (console.log(`calling ${a.name}`), a(...e)), M2 = (a, e, t = !1) => { - a = $(a)[0], e = $(e)[0]; - const s = $(a).parent()[0], i = { - x: ot.getProperty(a, "x"), - y: ot.getProperty(a, "y") - }, r = Lr.convertCoordinates( - s, - e, - i - ); - return eLog.checkLog3("changeContainer", "Target Element", { elem: a, container: e, curContainer: s, curPosition: i, relPos: r }), t && (a = $(a).clone()[0]), $(a).appendTo($(e)), ot.set(a, r), a; -}, bh = (a, e, t, s, i = 8) => { - a = $(a)[0], s ? a.style.setProperty("width", `${s}px`, "important") : a.style.setProperty("width", "max-content", "important"); - function r() { - a = $(a)[0]; - const f = parseFloat(o.fontSize) * 0.8, h = parseFloat(o.lineHeight) * 0.8; - return f < i ? !1 : (a.style.fontSize = `${f}px`, a.style.lineHeight = `${h}px`, bh(a, e, l ?? t, s, i)); - } - const o = window.getComputedStyle(a), n = parseFloat(o.lineHeight); - let l; - ya(t) && t < n && (l = t); - const c = parseFloat(o.width); - let u = c, g = !1; - for (let f = 1; ; f++) { - const h = n * f, m = c / f; - if (m / h < e) - break; - if (ya(l)) { - if (f > l) { - if (r()) - return; - break; - } - } else if (t && h > t) { - if (r()) - return; - break; - } - if (u = m, ya(l) && f === l) { - g = !0; - break; - } - } - !g && s && u > s && r() || a.style.setProperty("width", `${u}px`, "important"); -}, O2 = (a, e) => { - const t = getProperty(Kh, a); - if (!t) - return ""; - const { viewBox: s, paths: i, classes: r } = t; - return e ?? (e = Object.keys(i).join("|")), typeof e == "string" && (e = e.split("|")), [ - ``, - ...e.map((o) => ``), - "" - ].join(` -`); -}, vh = (a, { x: e, y: t } = { x: 0, y: 0 }) => { - [a, e, t] = [a, e, t].map((n) => Oa(n, 2)); - const [s, i] = [0.4475 * a, (1 - 0.4475) * a], [r, o] = [e, t - a]; - return [[ - r, - o, - i, - 0, - a, - s, - a, - a, - 0, - i, - -s, - a, - -a, - a, - -i, - 0, - -a, - -s, - -a, - -a, - 0, - -i, - s, - -a, - a, - -a - ]]; -}, F2 = (a, e) => { - const [[t, s, ...i]] = vh(a, e), r = [`m ${t} ${s}`]; - return i.forEach((o, n) => { - n % 6 === 0 && r.push("c"), r.push(o); - }), r.push("z"), r.join(" "); -}, jo = (a, e, t, s) => { - var i; - return Ko(a) && ([a, e, t, s] = a.replace(/[^\d.,]/g, "").split(/,/).map((r) => Es(r) ? void 0 : parseFloat(r))), Wo(a) && ([4, 5].includes(a.length) && (a = a.replace(/([^#])/g, "$1$1")), [a, e, t, s] = ((i = a.match(/[^#]{2}/g)) == null ? void 0 : i.map((r) => parseInt(r, 16))) ?? []), [a, e, t].every((r) => /^\d+$/.test(`${r}`)) ? [a, e, t, s].filter((r) => /^[\d.]+$/.test(`${r}`)) : null; -}, wh = (a, e, t, s) => { - if ((Ko(a) || Wo(a)) && ([a, e, t, s] = jo(a) ?? []), [a, e, t].every((i) => /^[.\d]+$/.test(`${i}`))) { - let i = "rgb"; - const r = [a, e, t]; - return /^[.\d]+$/.test(`${s}`) && (r.push(s >= 1 ? Bt(s) : es(s, 2)), i += "a"), `${i}(${r.join(", ")})`; - } - return null; -}, L2 = (a, e, t) => { - function s(i) { - const r = i.toString(16); - return r.length === 1 ? `0${r}` : r; - } - return Wo(a) ? a : (Ko(a) && ([a, e, t] = jo(a) ?? []), ba(a) && ba(e) && ba(t) && [a, e, t].every((i) => /^[.\d]+$/.test(`${i}`)) ? `#${s(a ?? 0)}${s(e ?? 0)}${s(t ?? 0)}` : null); -}, R2 = (...a) => { - const [e, t, s] = jo(...a) ?? []; - return [e, t, s].every(Ho) ? (e * 299 + t * 587 + s * 114) / 1e3 >= 128 ? "rgba(0, 0, 0, 1)" : "rgba(255, 255, 255, 0.8)" : null; -}, $2 = () => wh( - ot.utils.random(0, 255, 1), - ot.utils.random(0, 255, 1), - ot.utils.random(0, 255, 1) -), N2 = (a) => { - const e = []; - return a.parentNode && Array.from(a.parentNode.children).forEach((t) => { - t !== a && e.push(t); - }), e; -}, B2 = (a) => typeof a == "string" ? a.replace(/&/g, "&").replace(//g, ">").replace(/"/g, """).replace(/[`']/g, "'") : a, H2 = (a, ...e) => { - const t = performance.now(); - let s = 0; - const i = () => { - if (performance.now() - t < 1e4) - r(), s++; - else { - const o = performance.now() - t, n = Oa(o / s / 4e3, 4); - eLog.checkLog3("performance", `[TestPerformance] Function Ran ${s} Times in ${Oa(o / 1e3, 4)}s, Averaging ${n}s per Call`); - } - }, r = () => { - const o = a(...e); - o instanceof Promise ? o.then(i) : i(); - }; - r(); -}, W2 = (a, e) => ot.set(a, e); -function K2(a, e, t) { - if (t) { - const s = dr(ot.getProperty(a, e, t), /[\d.]+/); - if (typeof s == "string") - return es(s); - throw new Error(`Unable to extract property '${e}' in '${t}' units from ${a}`); - } - return ot.getProperty(a, e); -} -const V2 = (a, e) => rh(Oa(ch(a, e), 2)).replace(/^(.)/, "$1="), j2 = (a, e) => { - if (!a || !dh(a.labels)) - return; - typeof e == "string" && (e = new RegExp(e)); - const t = Object.entries(a.labels).filter(([r]) => e instanceof RegExp ? e.test(r) : !0).sort((r, o) => r[1] - o[1]), s = ot.utils.snap(t.map(([r, o]) => o), a.time()), [i] = t.find(([r, o]) => o === s); - return i; -}, G2 = (a) => { - if (a.repeat() === -1) - a.totalTime(a.time()); - else { - const [e] = a.getChildren(!1, !0, !0, a.time()); - e && e.repeat() === -1 && e.totalTime(e.time()), a.reverse(); - } - return a; -}, z2 = (a) => new Promise( - (e) => { - setTimeout(e, a >= 100 ? a : a * 1e3); - } -); -function kh(a) { - return new Promise( - (e, t) => { - a instanceof Promise || a instanceof ot.core.Animation ? a.then(() => e()).catch(t) : Array.isArray(a) ? Promise.all(a.map((s) => kh(s))).then(() => e()).catch(t) : e(); - } - ); -} -const q2 = { - onTextInputBlur: async (a, e) => { - const t = e.target, { action: s, target: i, flagTarget: r } = t.dataset; - if (!s) - throw new Error("Input text elements require a data-action attribute."); - if (!i && !r) - throw new Error("Input text elements require a 'data-target' or 'data-flag-target' attribute."); - i ? await a.document.update({ [i]: t.value }) : r && (t.value === "" ? await a.document.unsetFlag(Y.SYSTEM_ID, r) : await a.document.setFlag(Y.SYSTEM_ID, r, t.value)); - }, - onSelectChange: async (a, e) => { - const t = e.currentTarget, { action: s, dtype: i, target: r, flagTarget: o } = t.dataset; - if (!s) - throw new Error("Select elements require a data-action attribute."); - if (!r && !o) - throw new Error("Select elements require a 'data-target' or 'data-flag-target' attribute."); - const n = Hs(i); - let l; - switch (n) { - case "number": - l = es(t.value); - break; - case "boolean": - l = Hs(`${t.value}`) === "true"; - break; - case "string": - l = `${t.value}`; - break; - default: { - if (U0(l)) - throw new Error(`You must set 'data-dtype="Number"' for elements with boolean values.`); - l = `${t.value}`; - break; - } - } - r ? await a.document.update({ [r]: l }) : o && (t.value === "" ? await a.document.unsetFlag(Y.SYSTEM_ID, o) : await a.document.setFlag(Y.SYSTEM_ID, o, l)); - } -}, Go = (a) => typeof a == "string" && /^[A-Za-z0-9]{16}$/.test(a), Dh = (a) => { - if (typeof a != "string") - return !1; - const [e, t] = a.split(/\./); - return Go(t) ? game.collections.has(e) : !1; -}, ql = (a) => typeof a == "string", Th = (a) => ql(a) ? !!(["name", "img", "id", "_id"].includes(a) || a.startsWith("system") || a.startsWith("flag")) : !1, Y2 = (a) => !(!ql(a) || Th(a)), U2 = (a) => { - var e; - if (Dh(a)) - return a; - if (Go(a)) { - const t = (e = game.collections.find((s) => s.has(a))) == null ? void 0 : e.get(a); - if (t && "uuid" in t) - return t.uuid; - throw new Error(`[U.parseDocRefToUUID] Unable to find document with id '${a}'`); - } else if (a && typeof a == "object" && "uuid" in a && typeof a.uuid == "string") - return a.uuid; - throw new Error(`[U.parseDocRefToUUID] Unrecognized reference: '${a}'`); -}, Ch = (a, e = {}) => { - if (/[a-z]/.test(a) && (a = a.replace(new RegExp(`^(${Y.SYSTEM_ID}.)*`), `${Y.SYSTEM_ID}.`)), typeof game.i18n.localize(a) == "string") { - for (const [t, s] of Object.entries(e)) - e[t] = Ch(s); - return game.i18n.format(a, e) || game.i18n.localize(a) || a; - } - return a; -}, X2 = (a) => { - if (game.settings.settings.has(`${Y.SYSTEM_ID}.${a}`)) - return game.settings.get(Y.SYSTEM_ID, a); -}; -function _h(a, e) { - return typeof e == "string" ? `${Y.TEMPLATE_ROOT}/${a}/${e.replace(/\..*$/, "")}.hbs` : e.map((t) => _h(a, t)); -} -function Z2(a, e = `systems/${Y.SYSTEM_ID}/assets`, t = { top: 200, left: 200 }) { - return new FilePicker({ - type: "image", - activeSource: "public", - displayMode: "tiles", - callback: a, - top: t.top ?? 240, - left: t.left ?? 210 - }).browse(e); -} -const v = { - // ████████ GETTERS: Basic Data Lookup & Retrieval ████████ - GMID: Eg, - getUID: Jg, - // ████████ TYPES: Type Checking, Validation, Conversion, Casting ████████ - isNumber: Ho, - isNumString: U0, - isBooleanString: X0, - isSimpleObj: Z0, - isList: Bs, - isArray: it, - isFunc: xg, - isInt: ya, - isFloat: J0, - isPosInt: al, - isIterable: Ig, - isHTMLCode: Ag, - isRGBColor: Ko, - isHexColor: Wo, - isUndefined: Es, - isDefined: ba, - isEmpty: Hl, - hasItems: Wl, - isInstance: Pg, - isNullish: Mg, - areEqual: Og, - areFuzzyEqual: th, - pFloat: es, - pInt: Bt, - pBool: Fg, - radToDeg: sh, - degToRad: Lg, - getKey: Rg, - assertNonNullType: eh, - FILTERS: $g, - // ████████ REGEXP: Regular Expressions, Replacing, Matching ████████ - testRegExp: Eo, - regExtract: dr, - // ████████ STRINGS: String Parsing, Manipulation, Conversion ████████ - // ░░░░░░░ Case Conversion ░░░░░░░ - uCase: ih, - lCase: Hs, - sCase: Kl, - tCase: Ng, - // ░░░░░░░ Formatting ░░░░░░░ - /* hyphenate, */ - unhyphenate: Bg, - pluralize: Wg, - oxfordize: Kg, - ellipsize: Vg, - pad: jg, - toKey: Gg, - parseArticles: Hg, - signNum: rh, - padNum: zg, - stringifyNum: Vl, - verbalizeNum: ah, - ordinalizeNum: qg, - romanizeNum: Yg, - // ░░░░░░░ Content ░░░░░░░ - loremIpsum: Ug, - randString: Xg, - randWord: Zg, - // ████████ SEARCHING: Searching Various Data Types w/ Fuzzy Matching ████████ - fuzzyMatch: Qg, - isIn: oh, - isInExact: e2, - // ████████ NUMBERS: Number Casting, Mathematics, Conversion ████████ - randNum: Vo, - randInt: jl, - coinFlip: t2, - cycleNum: nh, - cycleAngle: Gl, - roundNum: Oa, - clampNum: s2, - sum: lh, - average: i2, - // ░░░░░░░ Positioning ░░░░░░░ - getDistance: r2, - getAngle: a2, - getAngleDelta: ch, - getBoundingRectangle: o2, - // ████████ ARRAYS: Array Manipulation ████████ - randElem: zl, - randIndex: n2, - makeIntRange: l2, - makeCycler: c2, - unique: h2, - group: d2, - sample: g2, - getLast: u2, - removeFirst: p2, - pullElement: uh, - pullIndex: f2, - subGroup: m2, - shuffle: y2, - toArray: b2, - // ████████ OBJECTS: Manipulation of Simple Key/Val Objects ████████ - remove: v2, - replace: D2, - partition: T2, - zip: C2, - objClean: ol, - objSize: dh, - objMap: hh, - objFindKey: _2, - objFilter: Io, - objForEach: S2, - objCompact: E2, - objClone: gh, - objMerge: ph, - objDiff: fh, - objExpand: mh, - objFlatten: yh, - objNullify: x2, - objFreezeProps: I2, - // ████████ FUNCTIONS: Function Wrapping, Queuing, Manipulation ████████ - getDynamicFunc: A2, - withLog: P2, - // ████████ HTML: Parsing HTML Code, Manipulating DOM Objects ████████ - getSvgCode: O2, - changeContainer: M2, - adjustTextContainerAspectRatio: bh, - getRawCirclePath: vh, - drawCirclePath: F2, - getColorVals: jo, - getRGBString: wh, - getHEXString: L2, - getContrastingColor: R2, - getRandomColor: $2, - getSiblings: N2, - escapeHTML: B2, - // ████████ PERFORMANCE: Performance Testing & Metrics ████████ - testFuncPerformance: H2, - // ░░░░░░░ GreenSock ░░░░░░░ - gsap: ot, - get: K2, - set: W2, - getGSAngleDelta: V2, - getNearestLabel: j2, - reverseRepeatingTimeline: G2, - /* to, from, fromTo, */ - /* TextPlugin, Flip, */ - MotionPathPlugin: Lr, - // ████████ ASYNC: Async Functions, Asynchronous Flow Control ████████ - sleep: z2, - waitFor: kh, - // EVENT HANDLERS - EventHandlers: q2, - // ░░░░░░░ SYSTEM: System-Specific Functions (Requires Configuration of System ID in constants.js) ░░░░░░░ - isDocID: Go, - isDocUUID: Dh, - isDotKey: ql, - isTargetKey: Th, - isTargetFlagKey: Y2, - parseDocRefToUUID: U2, - loc: Ch, - getSetting: X2, - getTemplatePath: _h, - displayImageSelector: Z2 -}, J2 = function() { - game.settings.register("eunos-blades", "debug", { - name: "Debug Level", - hint: "The verbosity of the debug messages to console.", - scope: "client", - // This specifies a world-level setting - config: !0, - // This specifies that the setting appears in the configuration view - type: Number, - range: { - // If range is specified, the resulting setting will be a range slider - min: 0, - max: 5, - step: 1 - }, - default: 3 - // The default value for the setting - }), game.settings.register("eunos-blades", "debugHooks", { - name: "Debug HOOKS", - hint: "Whether all Hooks are logged to the console.", - scope: "client", - config: !0, - type: Boolean, - default: !1 - }), game.settings.register("eunos-blades", "openAPIModelLevel", { - name: "AI Base Quality", - hint: "Lower values are cheaper to run, at the cost of quality.", - scope: "client", - // This specifies a world-level setting - config: !0, - // This specifies that the setting appears in the configuration view - type: Number, - range: { - // If range is specified, the resulting setting will be a range slider - min: 0, - max: 2, - step: 1 - } - }), game.settings.register("eunos-blades", "blacklist", { - name: "Debug Blacklist", - hint: "Comma-delimited list of categories of debug messages to silence.", - scope: "client", - // This specifies a world-level setting - config: !0, - // This specifies that the setting appears in the configuration view - type: String, - default: "" - // The default value for the setting - }), game.settings.register("eunos-blades", "openAPIKey", { - name: "OpenAI API Key", - hint: "Your personal OpenAI API Key (necessary to enable AI functionality)", - scope: "client", - // This specifies a world-level setting - config: !0, - // This specifies that the setting appears in the configuration view - type: String, - default: "" - // The default value for the setting - }), game.settings.register("eunos-blades", "whitelist", { - name: "Debug Whitelist", - hint: "Comma-delimited list of categories of debug messages to promote.", - scope: "client", - // This specifies a world-level setting - config: !0, - // This specifies that the setting appears in the configuration view - type: String, - default: "" - // The default value for the setting - }), game.settings.register("eunos-blades", "systemMigrationVersion", { - name: "System Migration Version", - scope: "world", - config: !1, - type: Number, - default: 0 - }); -}; -function Q2() { - CONFIG.TinyMCE = { - ...CONFIG.TinyMCE, - skin: "skin", - skin_url: "systems/eunos-blades/tinymce/skin", - content_css: `systems/eunos-blades/tinymce/content.css?${(/* @__PURE__ */ new Date()).getTime()}`, - font_css: "systems/eunos-blades/fonts.css", - max_height: 500, - min_height: 40, - autoresize_overflow_padding: 0, - autoresize_bottom_margin: 0, - // 25, - menubar: !1, - statusbar: !1, - // True, - elementPath: !0, - branding: !1, - resize: !1, - plugins: "lists image table code save autoresize searchreplace quickbars template", - save_enablewhendirty: !1, - // Table_default_styles: {}, - style_formats: [ - { - title: "Headings", - items: [ - { title: "Heading 1", block: "h1", wrapper: !1 }, - { title: "Heading 2", block: "h2", wrapper: !1 }, - { title: "Heading 3", block: "h3", wrapper: !1 }, - { title: "Heading 4", block: "h4", wrapper: !1 } - ] - }, - { - title: "Blocks", - items: [ - { title: "Paragraph", block: "p", wrapper: !1 }, - { title: "Block Quote", block: "blockquote", wrapper: !0 } - // {title: "Secret", block: "span", classes: "text-secret", attributes: {"data-is-secret": "true"}, wrapper: false} - ] - }, - { - title: "Inline", - items: [ - { title: "Bold", inline: "b", wrapper: !1 }, - { title: "Italics", inline: "i", wrapper: !1 }, - { title: "Underline", inline: "u", wrapper: !1 }, - { title: "Secret", inline: "span", classes: "text-secret", attributes: { "data-is-secret": "true" }, wrapper: !1 } - ] - } - ], - style_formats_merge: !1, - toolbar: "styles | searchreplace | formatting alignment lists elements | removeformat | code | save", - toolbar_groups: { - formatting: { - icon: "color-picker", - tooltip: "Formatting", - items: "bold italic underline" - }, - alignment: { - icon: "align-left", - tooltip: "Alignment", - items: "alignleft aligncenter alignright alignjustify | outdent indent" - }, - lists: { - icon: "unordered-list", - tooltip: "Lists", - items: "bullist numlist" - }, - elements: { - icon: "duplicate", - tooltip: "Insert Element", - items: "tableinsertdialog image hr | template" - } - }, - toolbar_mode: "floating", - quickbars_link_toolbar: !1, - quickbars_selection_toolbar: "styles | bold italic underline", - quickbars_insert_toolbar: "hr image table", - quickbars_table_toolbar: "tableprops tabledelete | tableinsertrowbefore tableinsertrowafter tabledeleterow | tableinsertcolbefore tableinsertcolafter tabledeletecol" - }; -} -function ep() { - CONFIG.canvasTextStyle = new PIXI.TextStyle({ - align: "center", - dropShadow: !0, - dropShadowAngle: v.degToRad(45), - dropShadowBlur: 8, - dropShadowColor: Y.Colors.BLACK, - dropShadowDistance: 4, - fill: [ - Y.Colors.bWHITE, - Y.Colors.bGREY - ], - fillGradientType: 1, - fillGradientStops: [ - 0, - 0.3 - ], - fontFamily: "Kirsty", - fontSize: 32, - letterSpacing: 2, - lineHeight: 32, - lineJoin: "round", - padding: 4, - stroke: Y.Colors.dBLACK, - strokeThickness: 3, - trim: !0, - whiteSpace: "normal", - wordWrap: !0, - wordWrapWidth: 0.1 - }); -} -function tp() { - $("body.vtt.game.system-eunos-blades").append(`
`), $("#interface").append(`
-
`); -} -async function sp() { - const a = [ - // General Components - "systems/eunos-blades/templates/components/toggle-icon.hbs", - "systems/eunos-blades/templates/components/button-icon.hbs", - "systems/eunos-blades/templates/components/dotline.hbs", - "systems/eunos-blades/templates/components/armor.hbs", - "systems/eunos-blades/templates/components/comp.hbs", - "systems/eunos-blades/templates/components/select.hbs", - "systems/eunos-blades/templates/components/portrait.hbs", - "systems/eunos-blades/templates/components/clock.hbs", - "systems/eunos-blades/templates/components/roll-collab-mod.hbs", - "systems/eunos-blades/templates/components/slide-out-controls.hbs", - "systems/eunos-blades/templates/components/consequence.hbs", - "systems/eunos-blades/templates/components/consequence-accepted.hbs", - // Partials - "systems/eunos-blades/templates/parts/tier-block.hbs", - "systems/eunos-blades/templates/parts/turf-list.hbs", - "systems/eunos-blades/templates/parts/cohort-block.hbs", - "systems/eunos-blades/templates/parts/roll-opposition-creator.hbs", - "systems/eunos-blades/templates/parts/active-effects.hbs", - "systems/eunos-blades/templates/parts/gm-pc-summary.hbs", - "systems/eunos-blades/templates/components/clock-key.hbs" - ]; - return loadTemplates(a); -} -const ms = { - randString(a = 10) { - return v.randString(a); - }, - test(a, e, t) { - const s = { - true: !0, - false: !1, - null: null, - undefined: void 0 - }; - switch (["!", "not", "=??"].includes(String(a)) && ([e, a] = [String(a), e]), typeof a == "string" && a in s && (a = s[a]), typeof t == "string" && t in s && (t = s[t]), e) { - case "!": - case "not": - return !a; - case "=??": - return [void 0, null].includes(a); - case "&&": - return a && t; - case "||": - return a || t; - case "==": - return v.areFuzzyEqual(a, t); - case "===": - return a === t; - case "!=": - case "!==": - return a !== t; - case ">": - return typeof a == "number" && typeof t == "number" && a > t; - case "<": - return typeof a == "number" && typeof t == "number" && a < t; - case ">=": - return typeof a == "number" && typeof t == "number" && a >= t; - case "<=": - return typeof a == "number" && typeof t == "number" && a <= t; - case "??": - return a ?? t; - case "includes": - return Array.isArray(a) && a.includes(t); - case "in": - return Array.isArray(t) ? t.includes(a) : v.isList(t) && (typeof a == "number" || typeof a == "string") ? a in t : typeof t == "string" ? new RegExp(String(a), "gu").test(String(t)) : !1; - default: - return !1; - } - }, - calc(...a) { - const e = { - "+": (r, o) => v.pInt(r) + v.pInt(o), - "-": (r, o) => v.pInt(r) - v.pInt(o), - "*": (r, o) => v.pInt(r) * v.pInt(o), - "/": (r, o) => v.pInt(r) / v.pInt(o), - "%": (r, o) => v.pInt(r) % v.pInt(o), - max: (r, o) => Math.max(v.pInt(r), v.pInt(o)), - min: (r, o) => Math.min(v.pInt(r), v.pInt(o)), - ceil: (r) => Math.ceil(v.pFloat(r)), - floor: (r) => Math.floor(v.pFloat(r)) - }, [t, s, i] = typeof a[0] == "string" && a[0] in e ? [a[1], a[0]] : a; - return e[s](t, i); - }, - isIn(...a) { - const [e, ...t] = a; - return t.includes(e); - }, - case(a, e) { - switch (a) { - case "upper": - return v.uCase(e); - case "lower": - return v.lCase(e); - case "sentence": - return v.sCase(e); - case "title": - return v.tCase(e); - default: - return e; - } - }, - romanize(a) { - return v.romanizeNum(v.pInt(a)); - }, - count(a) { - return Array.isArray(a) || v.isList(a) ? Object.values(a).filter((e) => e != null).length : typeof a == "string" ? a.length : a ? 1 : 0; - }, - // Concat helper - // Usage: (concat 'first 'second') - concat(...a) { - let e = ""; - for (const t of a) - (typeof t == "string" || typeof t == "number") && (e += t); - return e; - }, - // Merge helper - To merge additional properties into a template's context - merge(a, ...e) { - return e.pop(), e.reduce((t, s) => Object.assign(t, s), a); - }, - // For loop: {{#for [from = 0, to, stepSize = 1]}}{{/for}} - for: (...a) => { - const e = a.pop(); - let [t, s, i] = a; - if (t = v.pInt(t), s = v.pInt(s), i = v.pInt(i) || 1, t > s) - return ""; - let r = ""; - for (let o = parseInt(t || 0, 10); o <= parseInt(s || 0, 10); o += i) - r += e.fn(o); - return r; - }, - signNum(a) { - return v.signNum(a); - }, - compileSvg(...a) { - const [e, t] = a; - return v.getSvgCode(e, t); - }, - eLog(...a) { - a.pop(); - let e = 3; - [0, 1, 2, 3, 4, 5].includes(a[0]) && (e = a.shift()), eLog.hbsLog(...a, e); - }, - // Does the name of this turf block represent a standard 'Turf' claim? - isTurfBlock: (a) => v.fuzzyMatch(a, "Turf"), - // Which other connection does this connector overlap with? - getConnectorPartner: (a, e) => { - a = parseInt(`${a}`, 10); - const t = { - 1: { right: 2, bottom: 6 }, - 2: { left: 1, right: 3, bottom: 7 }, - 3: { left: 2, right: 4, bottom: 8 }, - 4: { left: 3, right: 5, bottom: 9 }, - 5: { left: 4, bottom: 10 }, - 6: { top: 1, right: 7, bottom: 11 }, - 7: { top: 2, left: 6, right: 8, bottom: 12 }, - 8: { top: 3, left: 7, right: 9, bottom: 13 }, - 9: { top: 4, left: 8, right: 10, bottom: 14 }, - 10: { top: 5, left: 9, bottom: 15 }, - 11: { top: 6, right: 12 }, - 12: { top: 7, left: 11, right: 13 }, - 13: { top: 8, left: 12, right: 14 }, - 14: { top: 9, left: 13, right: 15 }, - 15: { top: 10, left: 14 } - }, s = { left: "right", right: "left", top: "bottom", bottom: "top" }[e], i = t[a][e] ?? 0; - return i ? `${i}-${s}` : null; - }, - // Is the value Turf side. - isTurfOnEdge: (a, e) => { - a = parseInt(`${a}`, 10); - const t = { - 1: ["top", "left"], - 2: ["top"], - 3: ["top"], - 4: ["top"], - 5: ["top", "right"], - 6: ["left"], - 7: [], - 8: [], - 9: [], - 10: ["right"], - 11: ["left", "bottom"], - 12: ["bottom"], - 13: ["bottom"], - 14: ["bottom"], - 15: ["right", "bottom"] - }; - return a in t ? t[a].includes(e) : !0; - }, - // Multiboxes - multiboxes(a, e) { - let t = e.fn(this); - return a = [a].flat(1), a.forEach((s) => { - if (s !== !1) { - const i = RegExp.escape(Handlebars.escapeExpression(String(s))), r = new RegExp(` value="${i}"`); - t = t.replace(r, '$& checked="checked"'); - } - }), t; - }, - repturf: (a, e) => { - let t = e.fn(void 0), s = parseInt(a, 10); - s > 6 && (s = 6); - for (let i = 13 - s; i <= 12; i++) { - const r = new RegExp(` value="${i}"`); - t = t.replace(r, '$& disabled="disabled"'); - } - return t; - } -}; -ms.eLog1 = function(...a) { - ms.eLog(1, ...a.slice(0, 7)); -}; -ms.eLog2 = function(...a) { - ms.eLog(2, ...a.slice(0, 7)); -}; -ms.eLog3 = function(...a) { - ms.eLog(3, ...a.slice(0, 7)); -}; -ms.eLog4 = function(...a) { - ms.eLog(4, ...a.slice(0, 7)); -}; -ms.eLog5 = function(...a) { - ms.eLog(5, ...a.slice(0, 7)); -}; -Object.assign(ms); -function ip() { - Object.entries(ms).forEach(([a, e]) => Handlebars.registerHelper(a, e)); -} -const eu = [ - Rr, - Na, - Lr, - Ii, - // SplitText, - As, - $a - // CustomWiggle, - // CustomBounce, - // EasePack -], rp = { - // #region CLOCK KEYS - keyDrop: { - effect: (a, e) => { - const [t] = $(a).closest(".clock-key-container"); - return v.gsap.timeline({ - onComplete() { - e.callback && e.callback(); - } - }).fromTo(t, { - y: e.yShift - }, { - y: 0, - autoAlpha: 1, - ease: "bounce", - duration: e.duration - }); - }, - defaults: { - duration: 1, - yShift: -800 - }, - extendTimeline: !0 - }, - keyPull: { - effect: (a, e) => { - const [t] = $(a).closest(".clock-key-container"); - return v.gsap.timeline({ - onComplete() { - e.callback && e.callback(); - } - }).to(t, { - y: e.yDelta, - ease: e.ease, - duration: 0.75 * e.duration - }).to(t, { - opacity: 0, - ease: "power2.out", - duration: 0.25 * e.duration - }, 0.75 * e.duration); - }, - defaults: { - yDelta: -800, - duration: 1, - ease: "back.in(1)" - }, - extendTimeline: !0 - }, - keyControlPanelFlip: { - effect: (a, e) => v.gsap.timeline({ - delay: e.delay, - onStart() { - if (a) { - const s = $(a).next(".clock-control-flipper"); - s.length && v.gsap.effects.keyControlPanelFlip(s[0], { - ...e, - delay: 0.15 - }); - } - } - }).to(a, { - rotateX: e.angle, - duration: 0.5, - ease: "back.inOut(2)" - }), - defaults: { - angle: 180, - delay: 0 - }, - extendTimeline: !0 - }, - // #endregion - // #region CHAT CONSEQUENCE EFFECTS - csqEnter: { - effect: (a, e) => { - const t = v.gsap.utils.selector(a), s = t(".consequence-icon-circle.base-consequence"), i = t(".consequence-type.base-consequence"), r = t(".consequence-type.accept-consequence"), o = t(".consequence-name.base-consequence"), n = t(".consequence-name.accept-consequence"), l = v.gsap.timeline({ paused: !0, defaults: {} }); - return r.length > 0 && l.set(r, { opacity: 0 }, 0), n.length > 0 && l.set(n, { opacity: 0 }, 0), i.length > 0 && l.fromTo(i, { - opacity: 1 - }, { - opacity: 0, - duration: 0.25, - ease: "sine" - }, 0), r.length > 0 && l.fromTo(r, { - opacity: 0 - }, { - opacity: 1, - duration: 0.25, - ease: "sine" - }, 0), o.length > 0 && l.fromTo(o, { - opacity: 1 - }, { - opacity: 0, - duration: 0.25, - ease: "sine" - }, 0), n.length > 0 && l.fromTo(n, { - opacity: 0 - }, { - opacity: 1, - duration: 0.25, - ease: "sine" - }, 0), a && l.fromTo(a, { - filter: "brightness(1)" - }, { - filter: `brightness(${e.brightness})`, - duration: e.duration / 3, - ease: "none" - }, 0), s.length > 0 && l.fromTo(s, { - scale: 0.75, - outlineColor: Y.Colors.dBLACK, - outlineWidth: 0 - }, { - scale: 0.85, - outlineColor: Y.Colors.GREY, - outlineWidth: 1, - duration: 0.55, - ease: "sine.out" - }, 0), l; - }, - defaults: { - brightness: 1.5, - duration: 0.5, - scale: 1.5, - stagger: 0.05, - ease: "sine", - easeStrength: 1.5 - } - }, - csqClickIcon: { - effect: (a, e) => { - const t = $(a).closest(".comp.consequence-display-container"), s = v.gsap.utils.selector(t[0]), i = v.gsap.utils.selector(a), r = s(".consequence-bg-image"), o = s(".consequence-interaction-pad"), n = i(".consequence-icon-circle.base-consequence"), l = i(".consequence-icon-circle.accept-consequence"), c = i(".consequence-button-container"), u = v.gsap.timeline({ - paused: !0, - onComplete: function() { - $(o).css("pointerEvents", "auto"); - }, - onReverseComplete: function() { - $(o).css("pointerEvents", "none"); - } - }); - return r.length && u.fromTo(r, { - xPercent: 110, - yPercent: -50 - }, { - xPercent: -60, - yPercent: -50, - duration: 0.5, - ease: "back" - }, 0), n.length > 0 && u.fromTo(n, { - opacity: 1 - }, { - opacity: 0, - duration: 0.25, - ease: "sine.out" - }, 0), l.length > 0 && u.fromTo(l, { - opacity: 0 - }, { - opacity: 1, - duration: 0.15, - ease: "sine" - }, 0).fromTo(l, { - outlineWidth: 1, - scale: 0.85 - }, { - outlineWidth: 2, - scale: 1, - duration: 0.25, - ease: "sine" - }, 0.175), c.length > 0 && u.fromTo(c, { - scale: e.scale, - opacity: 0, - filter: "blur(25px)" - }, { - scale: 1, - opacity: 1, - filter: "blur(0px)", - stagger: e.stagger, - duration: e.duration, - ease: `${e.ease}.inOut(${e.easeStrength})` - }, 0), u; - }, - defaults: { - duration: 0.5, - scale: 1.5, - stagger: 0.05, - ease: "sine", - easeStrength: 1.5 - } - }, - csqEnterRight: { - effect: (a) => { - const e = v.gsap.utils.selector(a), t = e(".consequence-type-container .consequence-type.accept-consequence"), s = e(".consequence-type-container .consequence-type-bg.accept-consequence"), i = v.gsap.utils.selector(e(".consequence-button-container.consequence-accept-button-container")), r = i(".consequence-button-bg"), o = i(".button-icon i"), n = i(".consequence-button-label"), l = v.gsap.timeline({ paused: !0, defaults: {} }); - return t.length > 0 && l.fromTo( - t, - { - color: Y.Colors.RED - }, - { - color: Y.Colors.WHITE, - duration: 0.5, - ease: "sine.inOut" - }, - 0 - ), s.length > 0 && l.fromTo(s, { - x: 5, - scaleX: 0, - color: Y.Colors.RED, - skewX: 0 - }, { - scaleX: 1, - skewX: -45, - color: Y.Colors.RED, - duration: 0.5, - ease: "back.out" - }, 0), r.length > 0 && l.fromTo(r, { - scaleX: 0, - color: Y.Colors.RED, - skewX: 0 - }, { - x: 0, - scaleX: 1, - skewX: -45, - color: Y.Colors.RED, - duration: 0.25, - ease: "back.out" - }, 0), o.length > 0 && l.fromTo( - o, - { - color: Y.Colors.GREY, - opacity: 0.75, - scale: 1 - }, - { - color: Y.Colors.dBLACK, - scale: 1.25, - opacity: 1, - duration: 0.5, - ease: "sine" - }, - 0 - ), n.length > 0 && l.fromTo( - n, - { - color: Y.Colors.GREY, - fontWeight: 400, - scale: 1 - }, - { - color: Y.Colors.dBLACK, - fontWeight: 800, - duration: 0.75, - ease: "sine" - }, - 0 - ), l; - }, - defaults: {} - }, - csqEnterLeft: { - effect: (a) => { - const e = v.gsap.utils.selector(a), t = e(".consequence-type-container .consequence-type.accept-consequence"), s = e(".consequence-name-container .consequence-name.accept-consequence"), i = e(".consequence-icon-circle.accept-consequence"), r = e(".consequence-button-container.consequence-accept-button-container"), o = v.gsap.timeline({ paused: !0, defaults: {} }); - return t.length > 0 && o.to( - t, - { - opacity: 0, - duration: 0.15, - ease: "sine.inOut" - }, - 0 - ), s.length > 0 && o.to(s, { - opacity: 0, - duration: 0.15, - ease: "sine.inOut" - }, 0), i.length > 0 && o.to( - i, - { - opacity: 0, - duration: 0.15, - ease: "sine.inOut" - }, - 0 - ), r.length > 0 && o.fromTo( - r, - { - opacity: 1 - }, - { - opacity: 0, - duration: 0.25, - ease: "sine.inOut" - }, - 0 - ), o; - }, - defaults: {} - }, - csqEnterSubLeft: { - effect: (a, e) => { - const t = v.gsap.utils.selector(a), s = t(`.consequence-icon-circle.${e.type}-consequence`), i = t(`.consequence-type-container .consequence-type.${e.type}-consequence`), r = t(`.consequence-name.${e.type}-consequence`), o = t(`.consequence-footer-container .consequence-footer-bg.${e.type}-consequence`), n = t(`.consequence-footer-container .consequence-footer-message.${e.type}-consequence`), l = v.gsap.timeline({ paused: !0, defaults: {} }); - if (s.length > 0 && l.fromTo(s, { - opacity: 0 - }, { - opacity: 1, - duration: 0.5, - ease: "back.out" - }, 0), i.length > 0 && l.fromTo(i, { - opacity: 0 - }, { - opacity: 1, - duration: 0.5, - ease: "back.out" - }, 0), r.length > 0 && l.fromTo(r, { - scaleX: 0 - }, { - scaleX: 1, - duration: 0.5, - ease: "back.inOut" - }, 0), o.length > 0 && l.fromTo(o, { - scaleX: 0, - skewX: 0, - opacity: 1 - }, { - scaleX: 1, - skewX: -45, - opacity: 1, - duration: 0.5, - ease: "back.inOut" - }, 0), n.length > 0 && l.fromTo(n, { - scaleX: 0, - opacity: 1 - }, { - scaleX: 1, - opacity: 1, - duration: 0.5, - ease: "back.inOut" - }, 0), t(`.consequence-button-container.consequence-${e.type}-button-container`).length > 0) { - const c = v.gsap.utils.selector(t(`.consequence-button-container.consequence-${e.type}-button-container`)), u = c(".consequence-button-bg"), g = c(".button-icon i"), f = c(".consequence-button-label"); - u.length > 0 && l.fromTo(u, { - scaleX: 0, - skewX: 0, - opacity: 1 - }, { - scaleX: 1, - skewX: -45, - opacity: 1, - duration: 0.5, - ease: "back.inOut" - }, 0), g.length > 0 && l.fromTo( - g, - { - color: Y.Colors.GREY, - opacity: 0.75, - scale: 1 - }, - { - color: Y.Colors.dBLACK, - scale: 1.25, - opacity: 1, - duration: 0.5, - ease: "sine" - }, - 0 - ), f.length > 0 && l.fromTo( - f, - { - color: Y.Colors.GREY, - fontWeight: 400, - scale: 1 - }, - { - color: Y.Colors.dBLACK, - fontWeight: 800, - duration: 0.75, - ease: "sine" - }, - 0 - ); - } - return l; - }, - defaults: {} - }, - // #endregion - // #region CHARACTER SHEET EFFECTS - fillCoins: { - effect: (a, e) => v.gsap.to( - a, - { - duration: e.duration / 2, - scale: e.scale, - filter: e.filter, - ease: e.ease, - stagger: { - amount: 0.25, - from: "start", - repeat: 1, - yoyo: !0 - } - } - ), - defaults: { - duration: 1, - scale: 1, - filter: "saturate(1) brightness(2)", - ease: "power2.in" - }, - extendTimeline: !0 - }, - // #endregion - // #region GENERAL: 'blurRemove', 'hoverTooltip', 'textJitter' - blurRemove: { - effect: (a, e) => v.gsap.timeline({ stagger: e.stagger }).to( - a, - { - skewX: e.skewX, - duration: e.duration / 2, - ease: "power4.out" - } - ).to( - a, - { - x: e.x, - marginBottom: e.ignoreMargin ? void 0 : function(t, s) { - return v.get(s, "height") * -1; - }, - marginRight: e.ignoreMargin ? void 0 : function(t, s) { - return v.get(s, "width") * -1; - }, - scale: e.scale, - filter: `blur(${e.blur}px)`, - duration: 3 / 4 * e.duration - }, - e.duration / 4 - ).to( - a, - { - autoAlpha: 0, - duration: e.duration / 2, - ease: "power3.in" - }, - e.duration / 2 - ), - defaults: { - ignoreMargin: !1, - skewX: -20, - duration: 0.5, - x: "+=300", - scale: 1.5, - blur: 10, - stagger: 0 - }, - extendTimeline: !0 - }, - blurReveal: { - effect: (a, e) => v.gsap.timeline().fromTo( - a, - { - x: e.x, - marginBottom: e.ignoreMargin ? void 0 : function(t, s) { - return v.get(s, "height") * -1; - }, - marginRight: e.ignoreMargin ? void 0 : function(t, s) { - return v.get(s, "width") * -1; - }, - scale: e.scale, - filter: `blur(${e.blur}px)` - }, - { - x: 0, - marginBottom: 0, - marginRight: 0, - scale: 1, - filter: "blur(0px)", - duration: 3 / 4 * e.duration - }, - 0 - ).fromTo( - a, - { - autoAlpha: 0 - }, - { - autoAlpha: 1, - duration: e.duration / 2, - ease: "power3.in" - }, - 0 - ).fromTo( - a, - { - skewX: e.skewX - }, - { - skewX: 0, - duration: e.duration / 2, - ease: "power4.out" - }, - e.duration / 2 - ), - defaults: { - ignoreMargin: !1, - skewX: -20, - duration: 0.5, - x: "+=300", - scale: 1.5, - blur: 10 - }, - extendTimeline: !0 - }, - scaleUpReveal: { - effect: (a, e) => v.gsap.timeline().fromTo(a, { - autoAlpha: 0, - scale: 0.5 * e.scale - }, { - autoAlpha: 1, - scale: e.scale, - duration: e.duration, - ease: e.ease - }), - defaults: { - scale: 1, - duration: 0.5, - ease: "power2" - }, - extendTimeline: !0 - }, - scaleDownRemove: { - effect: (a, e) => v.gsap.timeline().to(a, { - autoAlpha: 0, - scale: 0.5 * e.scale, - duration: e.duration, - ease: e.ease - }), - defaults: { - scale: 1, - duration: 0.5, - ease: "power2" - }, - extendTimeline: !0 - }, - blurRevealTooltip: { - effect: (a, e) => { - if (!a) - throw new Error(`blurRevealTooltip effect: tooltip element is ${a === null ? "null" : typeof a}`); - const t = $(a); - return v.gsap.timeline({ - paused: !0, - onReverseComplete: e.onReverseComplete - }).fromTo( - t, - { - filter: `blur(${e.blurStrength}px)`, - autoAlpha: 0, - xPercent: 50, - yPercent: -200, - scale: e.scale - }, - { - filter: "blur(0px)", - autoAlpha: 1, - xPercent: -50, - yPercent: -100, - scale: 1, - ease: e.ease, - duration: e.duration - } - ); - }, - defaults: { - scale: 1.5, - blurStrength: 15, - ease: "back.out", - duration: 0.25, - onReverseComplete: void 0 - }, - extendTimeline: !0 - }, - textJitter: { - effect: (a, e) => { - const [t] = $(a); - if (!t) - throw new Error("textJitter effect: target not found"); - const s = new SplitText(t, { type: "chars" }); - return v.gsap.timeline().to(t, { - autoAlpha: 1, - duration: e.duration, - ease: "none" - }).fromTo(s.chars, { - y: -e.yAmp - }, { - y: e.yAmp, - duration: e.duration, - ease: "sine.inOut", - stagger: { - repeat: -1, - yoyo: !0, - from: "random", - each: e.stagger - } - }, 0).fromTo(s.chars, { - rotateZ: -e.rotateAmp - }, { - rotateZ: e.rotateAmp, - duration: e.duration, - ease: CustomWiggle.create("myWiggle", { wiggles: 10, type: "random" }), - stagger: { - repeat: -1, - from: "random", - yoyo: !0, - each: e.stagger - } - }, 0); - }, - defaults: { - yAmp: 2, - rotateAmp: 2, - duration: 1, - stagger: 0.05 - }, - extendTimeline: !0 - } - // #endregion -}; -function ap() { - eu.length && (v.gsap.config({ - nullTargetWarn: !0 - }), v.gsap.registerPlugin(...eu), Object.assign( - globalThis, - { - TextPlugin: Rr, - Flip: Na, - MotionPathPlugin: Lr, - Dragger: Ii, - // SplitText, - Observer: As, - CustomEase: $a - // CustomWiggle, - // CustomBounce, - // EasePack - } - )), Object.entries(rp).forEach(([a, e]) => { - v.gsap.registerEffect(Object.assign(e, { name: a })); - }); -} -function Or(a) { - a.find(".tooltip-trigger").each((e, t) => { - const s = $(t).find(".tooltip")[0] ?? $(t).next(".tooltip")[0]; - if (!s) - return; - const i = $(s), r = i.parent(); - r.css("position") !== "relative" && r.css("position") !== "absolute" && r.css("position", "relative"), i.css("position", "absolute"); - const o = `tooltip-${randomID()}`; - i.attr("id", o), i.hasClass("tooltip-wide") && v.adjustTextContainerAspectRatio(s, 6), $(t).on({ - mouseenter: function() { - game.eunoblades.Director.displayTooltip(s); - }, - mouseleave: function() { - game.eunoblades.Director.clearTooltip(o); - } - }); - }); -} -const va = v.gsap; -var Ao, Sh, Fa, nl, Po, Eh, Mo, xh; -const ka = class ka { - constructor(e, t) { - qt(this, Po); - qt(this, Mo); - Z(this, "_id"); - Z(this, "_targetID"); - Z(this, "_targetKey"); - Z(this, "_targetFlagKey"); - Z(this, "_isScopingById", !0); - Z(this, "_initialSchema"); - Z(this, "_target"); - Z(this, "initPromise"); - Z(this, "isInitPromiseResolved", !1); - var n; - let s, i; - const r = this.constructor; - if (r.IsValidData(e)) { - ({ linkData: s } = r.PartitionSchemaData(e)); - const l = fromUuidSync(s.targetID); - if (!l) - throw new Error(`[new BladesTargetLink()] Unable to resolve target from uuid '${s.targetID}'`); - "targetKey" in s ? i = getProperty(l, `${s.targetKey}.${s.id}`) : i = l.getFlag(Y.SYSTEM_ID, `${s.targetFlagKey}.${s.id}`), this.isInitPromiseResolved = !0; - } else { - const l = er(n = ka, Fa, nl).call(n, e, t); - let c; - ({ linkData: s, partialSchema: c } = r.PartitionSchemaData(l)), i = r._ApplySchemaDefaults(c); - } - this._id = s.id, this._targetID = s.targetID, "targetKey" in s ? this._targetKey = s.targetKey : this._targetFlagKey = s.targetFlagKey; - const o = fromUuidSync(this.targetID); - if (!o) - throw new Error(`[new BladesTargetLink()] Unable to resolve target from uuid '${this._targetID}'`); - this._target = o, this._initialSchema = i; - } - // #region STATIC METHODS ~ - static get ValidTargetClasses() { - return [ - oe, - te, - Ei, - User - ]; - } - static IsValidConfig(e) { - return v.isSimpleObj(e) && (v.isDocID(e.target) || v.isDocUUID(e.target) || v.isDocID(e.targetID) || v.isDocUUID(e.targetID) || this.ValidTargetClasses.some((t) => e.target instanceof t)) && (v.isTargetKey(e.targetKey) || v.isTargetFlagKey(e.targetFlagKey)) && !(v.isTargetKey(e.targetKey) && v.isTargetFlagKey(e.targetFlagKey)); - } - static IsValidData(e) { - return v.isSimpleObj(e) && v.isDocID(e.id) && v.isDocUUID(e.targetID) && (v.isTargetKey(e.targetKey) || v.isTargetFlagKey(e.targetFlagKey)) && !(v.isTargetKey(e.targetKey) && v.isTargetFlagKey(e.targetFlagKey)); - } - static BuildLinkConfig(e) { - if ("target" in e) { - if ("targetKey" in e) - return { - target: e.target, - targetKey: e.targetKey, - isScopingById: e.isScopingById - }; - if ("targetFlagKey" in e) - return { - target: e.target, - targetFlagKey: e.targetFlagKey, - isScopingById: e.isScopingById - }; - throw new Error("[BladesTargetLink.BuildConfig] Must provide a targetKey or targetFlagKey."); - } else if ("targetID" in e) { - if ("targetKey" in e) - return { - targetID: e.targetID, - targetKey: e.targetKey, - isScopingById: e.isScopingById - }; - if ("targetFlagKey" in e) - return { - targetID: e.targetID, - targetFlagKey: e.targetFlagKey, - isScopingById: e.isScopingById - }; - throw new Error("[BladesTargetLink.BuildConfig] Must provide a targetKey or targetFlagKey."); - } - throw new Error("[BladesTargetLink.BuildConfig] Must provide a target or targetID."); - } - /** - * This static method parses the provided data into a format suitable for BladesTargetLink. - * Subclasses can override this method to include their own parse logic. - * If the provided data is already valid, it is returned as is. - * Otherwise, the data is passed to the private #ParseConfig method for further processing. - * Note: The 'id' property is defined at the return step, within #ParseConfig: Subclass - * functionality that depends on the id property should be placed after the super call to this method. - * - * @template Schema - The data schema required by the subclass. - * @param {(BladesTargetLink.Config | BladesTargetLink.Data) & Partial} data - The data to be parsed. - * @returns {BladesTargetLink.Data & Partial} - The parsed data, suitable for BladesTargetLink. - */ - static ParseConfigToData(e, t) { - return this.IsValidData(e) ? er(this, Ao, Sh).call(this, e, t) : er(this, Fa, nl).call(this, e, t); - } - static PartitionSchemaData(e) { - const { - id: t, - target: s, - targetID: i, - targetKey: r, - targetFlagKey: o, - isScopingById: n, - ...l - } = e, c = l; - if (v.isDocID(t)) { - if (!this.IsValidData({ id: t, targetID: i, targetKey: r, targetFlagKey: o, isScopingById: n })) - throw eLog.error("BladesTargetLink", "Bad Constructor DATA", { dataOrConfig: e }), new Error("[new BladesTargetLink()] Bad Constructor DATA (see log)"); - let u; - if (r) - u = { id: t, targetID: i, targetKey: r, isScopingById: n ?? !0 }; - else if (o) - u = { id: t, targetID: i, targetFlagKey: o, isScopingById: n ?? !0 }; - else - throw eLog.error("BladesTargetLink", "Bad Constructor DATA", { dataOrConfig: e }), new Error("[BladesTargetLink.PartitionSchemaData] Bad Constructor DATA (see log)"); - return { - linkData: u, - partialSchema: c - }; - } - return { - linkConfig: this.BuildLinkConfig({ - isScopingById: n ?? !0, - ..."targetID" in e ? { targetID: e.targetID } : { target: e.target }, - ..."targetKey" in e ? { targetKey: e.targetKey } : { targetFlagKey: e.targetFlagKey } - }), - partialSchema: c - }; - } - static _ApplySchemaDefaults(e) { - return this.ApplySchemaDefaults(e); - } - /** - * This static method applies defaults to any values missing from the class' data Schema. - * 'Schema' is defined by subclasses to BladesTargetLink. - * Subclasses must override this method to apply their own defaults. - * - * @template Schema - The data schema required by the subclass. - * @param {Partial} schemaData - Schema data overriding the defaults. - * @returns {Schema} - The schema data with defaults applied. - * @throws {Error} - Throws an error if this method is not overridden in a subclass. - */ - static ApplySchemaDefaults(e) { - throw new Error("[BladesTargetLink.ApplySchemaDefaults] Static Method ApplySchemaDefaults must be overridden in subclass"); - } - /** - * Creates a new instance of BladesTargetLink and initializes it with the provided configuration. - * The configuration is parsed into a data object which is then used to initialize the target link. - * The function logs the parsed data for debugging purposes. - * - * @template Schema - The schema type parameter that extends the data structure. - * @param {BladesTargetLink.Config & Partial} config - The configuration object containing both the target link configuration and the schema configuration. - * - * @returns {Promise & BladesTargetLink.Subclass>} - A promise that resolves to a new instance of BladesTargetLink, initialized with the provided data. - * - * @throws {Error} - Throws an error if the initialization of the target link fails. - */ - static async Create(e, t) { - const s = new this(e, t); - return await s.initTargetLink(), s; - } - // #endregion - // #region GETTERS ~ - get isGM() { - return game.user.isGM; - } - get id() { - return this._id; - } - get targetID() { - return this._targetID; - } - get targetKey() { - return this._targetKey; - } - get targetFlagKey() { - return this._targetFlagKey; - } - get isScopingById() { - return this._isScopingById; - } - get initialSchema() { - return this._initialSchema; - } - get targetKeyPrefix() { - if (this.targetKey) - return this.isScopingById ? this.targetKey ? `${this.targetKey}.${this.id}` : void 0 : this.targetKey; - } - get targetKeyNullPrefix() { - if (this.targetKey) { - if (this.isScopingById) - return `${this.targetKey}.-=${this.id}`; - if (/^.+\..+$/g.test(this.targetKey)) - return this.targetKey.replace(/\.([^.]+)$/, ".-=$1"); - throw new Error(`[BladesTargetLink.targetKeyNullPrefix] Can't Nullify TargetKey '${this.targetKey}'`); - } - } - get targetFlagKeyPrefix() { - if (this.targetFlagKey) - return this.isScopingById ? this.targetFlagKey ? `${this.targetFlagKey}.${this.id}` : void 0 : this.targetFlagKey; - } - get isLinkInitialized() { - return this.isInitPromiseResolved; - } - get linkData() { - if (this.targetKey) - return { - id: this.id, - targetID: this.targetID, - targetKey: this.targetKey, - isScopingById: this.isScopingById - }; - if (this.targetFlagKey) - return { - id: this.id, - targetID: this.targetID, - targetFlagKey: this.targetFlagKey, - isScopingById: this.isScopingById - }; - throw new Error(`[BladesTargetLink.linkData] Missing targetKey and targetFlagKey for '${this.id}'`); - } - get target() { - return this._target; - } - get localData() { - return { - ...this.initialSchema, - ...this.linkData - }; - } - get data() { - if (this.isLinkInitialized) { - let e; - if (this.targetFlagKeyPrefix ? e = this.target.getFlag(Y.SYSTEM_ID, this.targetFlagKeyPrefix) : this.targetKeyPrefix && (e = getProperty(this.target, this.targetKeyPrefix)), !e) - throw new Error("[BladesTargetLink.data] Error retrieving data."); - return e; - } else - return eLog.warn("BladesTargetLink", "Attempt to access data of uninitiated BladesTargetLink: Returning local data only.", { bladesTargetLink: this, localData: this.localData }), this.localData; - } - // #endregion - // #region ASYNC UPDATE & DELETE METHODS ~ - getDotKeyToProp(e, t = !1) { - if (this.targetKeyPrefix) - return e === void 0 ? t ? this.targetKeyNullPrefix : this.targetKeyPrefix : `${this.targetKeyPrefix}.${t ? "-=" : ""}${e}`; - if (this.targetFlagKeyPrefix) - return e === void 0 ? this.targetFlagKeyPrefix : `${this.targetFlagKeyPrefix}.${e}`; - throw new Error("[BladesTargetLink.getDotKeyToProp()] Missing 'targetKeyPrefix' and 'targetFlagKeyPrefix'"); - } - getFlagParamsToProp(e) { - return [Y.SYSTEM_ID, this.getDotKeyToProp(e)]; - } - async updateTargetFlag(e, t) { - this.targetFlagKeyPrefix && (t === null ? await this.target.unsetFlag(...this.getFlagParamsToProp(e)) : this.target instanceof oe ? await this.target.setFlag(...this.getFlagParamsToProp(e), t) : this.target instanceof te ? await this.target.setFlag(...this.getFlagParamsToProp(e), t) : this.target instanceof User ? await this.target.setFlag(...this.getFlagParamsToProp(e), t) : this.target instanceof Ei && await this.target.setFlag(...this.getFlagParamsToProp(e), t)); - } - async updateTargetKey(e, t) { - this.targetKeyPrefix && await this.target.update({ [this.getDotKeyToProp(e, t === null)]: t }, { render: !1 }); - } - /** - * Initializes a target link by updating the target's data with the provided data object. - * If a targetKey is provided, the data is updated directly on the target. - * If a targetFlagKey is provided, the data is set as a flag on the target. - * - * This method need only be run once, when the document is first created and its data must be written to server storage. - * External functions can synchronously check the status of initialization via the isInitPromiseResolved property, while - * asynchronous functions can await the initPromise property. - * - * TargetLink documents whose data already exists in server storage can be constructed directly (i.e. new BladesTargetLink(data)) - * without needing to call this method. - * - * @param {BladesTargetLink.Data & Schema} data - The combined data object containing both the target link data and the schema data. - * @returns {Promise} - A promise that resolves when the server update is complete. - */ - async initTargetLink() { - this.isInitPromiseResolved = !1; - const e = { - ...this.linkData, - ...this.initialSchema - }; - return this.initPromise = new Promise((t, s) => { - if (this.targetKeyPrefix) { - const i = mergeObject( - getProperty(this.target, this.targetKeyPrefix) ?? {}, - e - ); - this.target.update({ [this.targetKeyPrefix]: i }, { render: !1 }).then(() => { - this.isInitPromiseResolved = !0, t(); - }).catch(s); - } else if (this.targetFlagKeyPrefix) { - const i = mergeObject( - this.target.getFlag(Y.SYSTEM_ID, this.targetFlagKeyPrefix) ?? {}, - e - ); - this.target.setFlag(Y.SYSTEM_ID, this.targetFlagKeyPrefix, i).then(() => { - this.isInitPromiseResolved = !0, t(); - }).catch(s); - } else - s(); - }), this.initPromise; - } - async updateTarget(e, t, s) { - if (typeof e == "string") - return getProperty(this.data, e) === t ? void 0 : er(this, Mo, xh).call(this, e, t, s); - if (typeof e == "object") - return er(this, Po, Eh).call(this, e, t); - throw new Error(`[BladesTargetLink.updateTarget()] Bad updateData for id '${this.id}': ${e}`); - } - async updateTargetData(e, t) { - e && (e = { - ...e, - ...this.linkData - }), await v.waitFor([this.initPromise, t]), this.targetFlagKeyPrefix ? await this.updateTargetFlag(void 0, e) : await this.updateTargetKey(void 0, e); - } - async delete(e, t) { - e && e.delete(this.id), await v.waitFor([this.initPromise, t]), await this.updateTargetData(null); - } - // #endregion -}; -Ao = new WeakSet(), Sh = function(e, t) { - if (!t) - return e; - const s = "targetKey" in t ? [t.targetKey] : [t.targetFlagKey]; - t.isScopingById && s.push(t.id); - const i = s.join("."); - if ("targetKey" in e && "targetKey" in t) - e.targetKey.startsWith(`${i}.`) && (e.targetKey = e.targetKey.slice(i.length + 1)), e.targetKey = [ - t.targetKey, - t.isScopingById ? t.id : void 0, - e.targetKey - ].filter(Boolean).join("."); - else if ("targetFlagKey" in e && "targetFlagKey" in t) - e.targetFlagKey.startsWith(`${i}.`) && (e.targetFlagKey = e.targetFlagKey.slice(i.length + 1)), e.targetFlagKey = [ - t.targetFlagKey, - t.isScopingById ? t.id : void 0, - e.targetFlagKey - ].filter(Boolean).join("."); - else - throw new Error("[BladesTargetLink.ParseChildLinkData] targetKey/targetFlagKey mismatch between provided partialConfig and parentLinkData."); - return e; -}, Fa = new WeakSet(), nl = function(e, t) { - if (this.IsValidData(e)) - return this.ParseConfigToData(e, t); - const { linkConfig: s, partialSchema: i } = this.PartitionSchemaData(e), r = this.BuildLinkConfig(s); - return "targetKey" in r ? this.ParseConfigToData({ - id: randomID(), - ...i, - targetID: v.parseDocRefToUUID("target" in r ? r.target : r.targetID), - targetKey: r.targetKey - }, t) : this.ParseConfigToData({ - id: randomID(), - ...i, - targetID: v.parseDocRefToUUID("target" in r ? r.target : r.targetID), - targetFlagKey: r.targetFlagKey - }, t); -}, Po = new WeakSet(), Eh = async function(e, t) { - if (await v.waitFor(t), this.targetKeyPrefix) - return e = v.objMap(e, !1, (s) => `${this.targetKeyPrefix || this.targetFlagKeyPrefix}.${s}`), this.target.update(e, { render: !1 }); - if (this.targetFlagKeyPrefix) { - const s = this.target.getFlag(Y.SYSTEM_ID, this.targetFlagKeyPrefix) ?? {}, i = flattenObject(s), r = mergeObject(i, e); - return this.target.setFlag(Y.SYSTEM_ID, this.targetFlagKeyPrefix, r); - } else - throw new Error(`[BladesTargetLink.#updateTargetViaMerge] Unable to update target data for BladesTargetLink id '${this.id}': Missing both 'targetKeyPrefix' and 'targetFlagKeyPrefix'`); -}, Mo = new WeakSet(), xh = async function(e, t, s) { - if (await v.waitFor(s), this.targetKeyPrefix) - return this.target.update({ [`${this.targetKeyPrefix}.${e}`]: t }); - if (this.targetFlagKeyPrefix) - return this.updateTargetFlag(e, t); -}, qt(ka, Ao), /** - * This private static method is used to transform a configuration object into a data object for BladesTargetLink. - * It checks if the provided configuration object is already valid data, and if so, returns it directly. - * Otherwise, it partitions the configuration object into link-specific configuration and additional schema data, - * constructs a full link configuration, and then creates a data object with a new random ID and the target UUID. - * The method ensures that either 'targetKey' or 'targetFlagKey' is present and throws an error if the configuration is invalid. - * - * @template Schema - The additional schema data required by the subclass. - * @param {BladesTargetLink.Config | BladesTargetLink.Data & Partial} config - The configuration object that may contain BladesTargetLink properties and any subclass-specific schema data. - * @returns {BladesTargetLink.Data & Partial} - The fully constructed data object with necessary properties for BladesTargetLink. - * @throws {Error} - Throws an error if the configuration object is invalid, lacks a target reference, or if both 'targetKey' and 'targetFlagKey' are provided. - */ -qt(ka, Fa); -let hs = ka; -function op(a) { - return v.isList(a) && typeof a.x == "number" && typeof a.y == "number" && typeof a.width == "number" && typeof a.height == "number"; -} -class Et extends hs { - constructor(t) { - super(t); - Z(this, "positionDragger"); - game.eunoblades.ClockKeys.set(this.id, this), Object.values(t.clocksData ?? {}).forEach((s) => new Be(s)); - } - // #region STATIC METHODS ~ - static Initialize() { - function t(s) { - "clocksData" in s.system && Object.values(s.system.clocksData ?? {}).forEach((i) => { - try { - new Et(i); - } catch (r) { - eLog.error("BladesClockKey", "[BladesClockKey.Initialize] Error initializing clock key.", r, i); - } - }); - } - return game.items.contents.filter( - (s) => te.IsType( - s, - x.clock_keeper, - x.project, - x.cohort_gang, - x.cohort_expert, - x.ritual, - x.design, - x.location, - x.score - ) - ).forEach(t), game.actors.contents.filter( - (s) => oe.IsType( - s, - z.pc, - z.faction - ) - ).forEach(t), loadTemplates([ - "systems/eunos-blades/templates/components/clock-key.hbs", - "systems/eunos-blades/templates/components/clock.hbs" - ]); - } - static ApplySchemaDefaults(t) { - return { - name: "", - isVisible: !1, - isNameVisible: !1, - isSpotlit: !1, - clocksData: {}, - sceneIDs: [], - displayMode: Ct.full, - oneKeyIndex: v.gsap.utils.random(0, 4, 1), - ...t - }; - } - static async Create(t, s, i = []) { - i.length > 6 ? (eLog.error("BladesClockKey", "[BladesClockKey.Create] Too many clock configs! (Max 6.) Eliminating extras.", i), i = i.slice(0, 6)) : i.length === 0 && i.push({}); - const r = new hs(t); - if (r.targetKeyPrefix) - t.clocksData = Object.fromEntries( - i.map((l, c) => { - const u = Be.ParseConfigToData({ - ...Be.ApplySchemaDefaults(l), - index: c, - targetID: r.targetID, - targetKey: `${r.targetKeyPrefix}.clocksData`, - isScopingById: !0 - }); - return [ - u.id, - u - ]; - }) - ); - else if (r.targetFlagKeyPrefix) - t.clocksData = Object.fromEntries( - i.map((l, c) => { - const u = Be.ParseConfigToData({ - ...Be.ApplySchemaDefaults(l), - targetID: r.targetID, - targetFlagKey: `${r.targetFlagKeyPrefix}.clocksData`, - isScopingById: !0 - }); - return [ - u.id, - u - ]; - }) - ); - else - throw new Error("BladesClockKey.Create: No targetKey or targetFlagKey provided."); - const o = await super.Create(r.data), n = new Et(o.data); - return n.renderTargetAndKeeper(), n; - } - static GetFromElement(t) { - const s = $(t).closest(".clock-key-container").find(".clock-key"); - if (s.length === 0) - return; - const i = s.attr("id"); - if (i) - return game.eunoblades.ClockKeys.get(i); - } - // #endregion - // #region GETTERS & SETTERS ~ - // #region -- Shortcut Schema Getters ~ - get data() { - return this.linkData; - } - get name() { - return this.data.name; - } - set name(t) { - this.updateTarget("name", t).then(() => { - this.renderTargetAndKeeper(); - }); - } - get isVisible() { - return this.data.isVisible; - } - set isVisible(t) { - this.updateTarget("isVisible", v.pBool(t)).then(() => { - this.renderTargetAndKeeper(); - }); - } - get isNameVisible() { - return this.data.isNameVisible; - } - set isNameVisible(t) { - this.updateTarget("isNameVisible", v.pBool(t)).then(() => { - this.renderTargetAndKeeper(); - }); - } - get isSpotlit() { - return this.data.isSpotlit; - } - set isSpotlit(t) { - this.updateTarget("isSpotlit", t).then(() => { - this.renderTargetAndKeeper(); - }); - } - get clocksData() { - return this.data.clocksData; - } - get displayMode() { - return this.data.displayMode; - } - get oneKeyIndex() { - let { oneKeyIndex: t } = this.data; - return t || (t = v.gsap.utils.random(0, 4, 1), this.updateTarget("oneKeyIndex", t).then(() => { - this.renderTargetAndKeeper(); - })), t; - } - get sceneIDs() { - return this.data.sceneIDs ?? []; - } - get overlayPosition() { - var t; - return (t = this.data.overlayPosition) == null ? void 0 : t[game.scenes.current.id]; - } - set overlayPosition(t) { - t ? this.updateTarget(`overlayPosition.${game.scenes.current.id}`, t).then(() => { - this.renderTargetAndKeeper(); - }) : this.updateTarget(`overlayPosition.-=${game.scenes.current.id}`, null).then(() => { - this.renderTargetAndKeeper(); - }); - } - // #endregion - get clocks() { - return new Collection( - Object.entries(this.clocksData).sort((t, s) => t[1].index - s[1].index).map(([t, s]) => [t, new Be(s)]) - ); - } - getClockByID(t) { - return this.clocks.get(t); - } - getClockByIndex(t) { - return this.clocks.find((s) => s.index === t); - } - get size() { - return this.clocks.size; - } - get isComplete() { - return Array.from(this.clocks).every((t) => t.isComplete); - } - get isClockKeeperKey() { - return this.target instanceof zo; - } - get isFactionKey() { - return this.target instanceof Hr; - } - get isProjectKey() { - return this.target instanceof Ba; - } - get isScoreKey() { - return this.target instanceof Ha; - } - get visibleClocks() { - return this.clocks.filter((t) => t.isVisible); - } - get activeClocks() { - return this.visibleClocks.filter((t) => t.isActive); - } - get inProgressClocks() { - return this.visibleClocks.filter((t) => !t.isComplete && t.value > 0); - } - get unstartedClocks() { - return this.visibleClocks.filter((t) => t.value === 0); - } - get completedClocks() { - return this.visibleClocks.filter((t) => t.isComplete); - } - get currentClock() { - return this.activeClocks.length > 0 ? this.getEarliestClock(this.activeClocks) : this.completedClocks.length > 0 ? this.getLatestClock(this.completedClocks) : this.visibleClocks.length > 0 ? this.getEarliestClock(this.visibleClocks) : this.getEarliestClock(Array.from(this.clocks)); - } - get fullDisplayPosData() { - const t = this.svgData.width / 2, s = this.svgData.height / 2; - return { - x: t, - y: s, - width: this.svgData.width, - height: this.svgData.height - }; - } - get clocksDisplayPosData() { - return this.getClocksBoundingBox(Array.from(this.clocks)); - } - get visibleClocksDisplayPosData() { - return this.getClocksBoundingBox(this.visibleClocks); - } - get activeClocksDisplayPosData() { - return this.getClocksBoundingBox(this.activeClocks); - } - getClocksBoundingBox(t) { - const { size: s, ...i } = this.svgData.clocks, r = Object.fromEntries( - Object.entries(i).filter(([f]) => t.map((h) => h.index).includes(v.pInt(f))).map(([f, h]) => [v.pInt(f), h]) - ), o = Object.values(r).sort((f, h) => f.x - h.x), n = Object.values(r).sort((f, h) => f.y - h.y), l = o[0].x, c = o[o.length - 1].x, u = n[0].y, g = n[n.length - 1].y; - return { - // Determine the center point in both x and y axes - x: (l + c) / 2, - y: (u + g) / 2, - // Determine height and width of bounding box, accounting for clock size - width: c - l + s, - height: g - u + s - }; - } - /** This function accepts any number of arrays of BladesClock, then returns an array - * containing those BladesClock instances that appear in ALL provided arrays. - */ - getClocksIn(...t) { - return t.length === 0 ? [] : t.reduce((s, i) => s.filter((r) => i.includes(r))); - } - /** This function accepts an array of BladesClock, and returns the BladesClock - * instance with the lowest index property. - */ - getEarliestClock(t) { - if (t.length) - return t.sort((s, i) => s.index - i.index)[0]; - } - /** This function accepts an array of BladesClock, and returns the BladesClock - * instance with the highest index property. - */ - getLatestClock(t) { - if (t.length) - return t.sort((s, i) => i.index - s.index)[0]; - } - isInScene(t = game.scenes.current.id) { - return this.sceneIDs.includes(t); - } - get isInCurrentScene() { - return this.isInScene(game.scenes.current.id); - } - get displaySelectOptions() { - const t = [ - { value: Ct.full, display: "Full Key" }, - { value: Ct.clocks, display: "Clocks" }, - { value: Ct.activeClocks, display: "Active Clocks" } - ]; - for (let s = 0; s < this.size; s++) - t.push({ value: s, display: `Clock #${s}` }, { value: `present${s}`, display: `Present Clock #${s}` }); - return t; - } - // parseClockConfig(config: BladesClock.Config, indexOverride?: ClockIndex): BladesClock.Data { - // if (this.size === 6) {throw new Error("Cannot add a clock to a clock key with 6 clocks.");} - // if (indexOverride !== undefined && indexOverride < 0) {throw new Error("Cannot add a clock with a negative index.");} - // // Remove target so it doesn't conflict with key's targetID - // // delete config.target; - // const {target, targetID, targetKey, targetFlagKey, ...partialSchema} = config; - // const linkData: BladesTargetLink.LinkData = this.targetKey - // ? { - // targetID: this.targetID, - // targetKey: `${this.targetKeyPrefix}.clocksData` as TargetKey - // } - // : { - // targetID: this.targetID, - // targetFlagKey: `${this.targetFlagKeyPrefix}.clocksData` as TargetFlagKey - // }; - // // Derive clock's targetID and targetKey/targetFlagKey from key's values - // data.targetID = this.targetID; - // if (this.targetKey) { - // data.targetKey = `${this.targetKeyPrefix}.clocksData` as TargetKey; - // } else if (this.targetFlagKey) { - // data.targetFlagKey = `${this.targetFlagKeyPrefix}.clocksData` as TargetFlagKey; - // } - // // Assign 'parentKeyID' and 'index' - // config.parentKeyID = this.id; - // config.index = indexOverride ?? this.size; - // // Parse config to full data object - // return BladesClock.ApplySchemaDefaults( - // BladesClock.ParseConfigToData(config as BladesClock.Config) - // ); - // } - // #endregion - // #region HTML INTERACTION ~ - // #region Get Elements$ ~ - getElemFromDisplayContext(t) { - let s; - const i = $(".vtt.game.system-eunos-blades"); - switch (t) { - case He.overlay: { - s = i.find(`#blades-overlay #${this.id}`); - break; - } - case He.pcSheet: { - s = i.find(`.actor.sheet .pc #${this.id}`); - break; - } - case He.factionSheet: { - s = i.find(`.actor.sheet .faction #${this.id}`); - break; - } - case He.projectSheet: { - s = i.find(`.item.sheet .project #${this.id}`); - break; - } - case He.scoreSheet: { - s = i.find(`.item.sheet .score #${this.id}`); - break; - } - case He.rollCollab: { - s = i.find(`.roll-collab-sheet #${this.id}`); - break; - } - case He.chatMessage: { - s = i.find(`#chat #${this.id}`); - break; - } - } - if (!s.length) - throw new Error(`[BladesClockKey.getElemFromDisplayContext] Error elem$ not found for key '${this.id}' for display context '${t}'.`); - return s; - } - getElements$(t) { - let s; - if (typeof t == "string" && (t = this.getElemFromDisplayContext(t)), s = $(t).find(`#${this.id}`), s.length || (s = $(t).closest(`#${this.id}`)), !(s != null && s.length)) - throw new Error(`[BladesClockKey.getElements$] Cannot find elements for display context '${t}' of clockKey '${this.id}'.`); - const i = { - elem$: s - }; - if (!s.length) - throw new Error(`[BladesClockKey.renderClockKey] Error '.clock-key-container' not found for key '${this.id}'.`); - i.container$ = s.closest(".clock-key-container"); - const r = s.find(".key-image-container"); - if (!r.length) - throw new Error(`[BladesClockKey.renderClockKey] Error '.key-image-container' not found for key '${this.id}'.`); - i.imgContainer$ = r; - const o = s.find(".key-label"); - if (!o.length) - throw new Error(`[BladesClockKey.renderClockKey] Error label$ not found for key '${this.id}'.`); - i.label$ = o; - const n = s.find(".faction-label"); - n.length && (i.factionLabel$ = n); - const l = s.find(".project-label"); - l.length && (i.projectLabel$ = l); - const c = s.find(".score-label"); - return c.length && (i.scoreLabel$ = c), this.clocks.forEach((u) => { - i.clocks ?? (i.clocks = {}), i.clocks[u.id] = u.getElements$(t); - }), eLog.checkLog3("BladesClockKey", "Clock Key Elements", i), i; - } - // #endregion - // #region Initial Rendering ~ - async renderTo(t) { - const s = $(t); - if (!s.length) - throw new Error(`[BladesClockKey.renderClockKeyTo] Error parent element not provided for key '${this.id}'.`); - const i = await renderTemplate( - "systems/eunos-blades/templates/components/clock-key.hbs", - this - ); - $(i).appendTo(s); - } - /** - * This function generates a partial GSAP.TweenVars object that will display the key in a given mode within the bounds of a provided container. - * - * @param {ClockKeyDisplayMode | number} [displayMode="full"] - The display mode. Options include: - * - "full" - displays the entire clock key - * - "clocks" - zooms in to display only the clocks - * - "activeClocks" - zooms in to the active clocks - * - "presentN" (where N is a clock index number) - zooms in to the clock at index N, and presents whichever side has the next available segment towards the camera. - * - A clock index number - zooms in to the clock at index N - * - * @param {HTMLElement | JQuery | {x: number, y: number, width: number, height: number}} [container$] - The container within which the key will be displayed. - * This can be: - * - An HTMLElement - * - A JQuery - * - A {x, y, width, height} position definition - * If not provided, it defaults to the clock key's container element (only if the key is already rendered in the DOM). - * - * @returns {gsap.TweenVars} - A partial GSAP.TweenVars object that describes how to display the key in the given mode within the bounds of the provided container. The returned object may include the following properties: - * - 'scale' (number): A multiple to be applied to scale at "full" display mode. - * - 'top' (number): A delta vertical shift from "full" display mode position. - * - 'left' (number): A delta horizontal shift from "full" display mode position. - * - 'transformOrigin': An absolute value. - * - 'rotationZ': An absolute value for the keySwing axis. - * - 'rotationY': An absolute value for rotation in/out of the screen. - * Any variables left undefined default to "full" display mode. - */ - getVarsForDisplayMode(t, s = Ct.full, i) { - const r = {}, o = {}; - i ?? (i = t.container$); - let n; - if (i instanceof HTMLElement || i instanceof jQuery) { - const u = v.gsap.getProperty($(i)[0]); - n = { - x: u("x"), - y: u("y"), - width: u("width"), - height: u("height") - }; - } else if (op(i)) - n = i; - else - throw new Error(`[BladesClockKey.getVarsForDisplayMode] Error container$ '${i}' is not a valid type.`); - let l, c; - switch (s) { - case Ct.full: { - c = { - x: this.svgData.width / 2, - y: this.svgData.height / 2, - width: this.svgData.width, - height: this.svgData.height - }; - break; - } - case Ct.clocks: { - c = this.getClocksBoundingBox(Array.from(this.clocks)); - break; - } - case Ct.activeClocks: { - c = this.getClocksBoundingBox(this.getClocksIn(this.activeClocks, this.visibleClocks)); - break; - } - case Ct.presentCurrentClock: - l = this.currentClock, s = l.index; - default: { - if (typeof s == "string" && s.startsWith("present") && (s = v.pInt(s.toString().slice(7)), l = this.getClockByIndex(s)), !v.isInt(s) || s < 0 || s >= this.size) - throw new Error(`[BladesClockKey.getVarsForDisplayMode] Error display mode '${s}' is not a valid clock index for key '${this.id}'.`); - const u = this.svgData.clocks[s]; - c = { - x: u.x, - y: u.y, - width: this.svgData.clocks.size, - height: this.svgData.clocks.size - }; - break; - } - } - return r.scale = Math.min( - n.height / c.height, - n.width / c.width - ), o.top = 0.5 * Y.ClockKeySquareSize - c.y, o.left = 0.5 * Y.ClockKeySquareSize - c.x, o.transformOrigin = `${c.x}px ${c.y}px`, o.rotateY = 0, l && (r.scale *= 2, l.getActiveSide() === "left" ? (o.rotateY = 30, o.left += this.size === 1 ? 45 : 25) : l.getActiveSide() === "right" && (o.rotateY = -30, o.left -= this.size === 1 ? 45 : 25)), { keyTweenVars: r, keyImgContTweenVars: o }; - } - // public fitKeyToContainer( - // keyElems$: ClockKeyElems$, - // posOverrides?: Partial - // ) { - // const {container$, elem$, imgContainer$} = keyElems$; - // // Get position data for the container$ element (x, y, width, height) - // const keyPosition: ElemPosData = { - // x: U.gsap.getProperty(container$[0], "x") as number, - // y: U.gsap.getProperty(container$[0], "y") as number, - // width: U.gsap.getProperty(container$[0], "width") as number, - // height: U.gsap.getProperty(container$[0], "height") as number - // }; - // const {xShift, yShift, scaleMult, ...focusPosOverrides} = posOverrides ?? {}; - // const focusPosition: ElemPosData = { - // ...this.fullDisplayPosData, - // ...focusPosOverrides - // }; - // eLog.checkLog3("BladesClockKey", "[BladesClockKey] Key Positions", { - // keyPosition, - // focusPosition, - // widthScale: keyPosition.width / focusPosition.width, - // heightScale: keyPosition.height / focusPosition.height - // }); - // // Apply scale factor to elem$ to fit default key position inside container$ - // U.gsap.set(elem$, { - // scale: Math.min( - // keyPosition.width / focusPosition.width, - // keyPosition.height / focusPosition.height - // ) * (scaleMult ?? 1) - // }); - // // Apply top, left and transformOrigin value to keyImgContainer, accounting for x/yPercent -50 - // U.gsap.set(imgContainer$, { - // top: (0.5 * C.ClockKeySquareSize) - focusPosition.y + (yShift ?? 0), - // left: (0.5 * C.ClockKeySquareSize) - focusPosition.x + (xShift ?? 0), - // transformOrigin: `${focusPosition.x + (xShift ?? 0)}px ${focusPosition.y + (yShift ?? 0)}px` - // }); - // } - formatLabels(t) { - const { label$: s, clocks: i, factionLabel$: r, projectLabel$: o, scoreLabel$: n } = t; - [ - [s, 2, 4], - r ? [r, 2, 2] : void 0, - o ? [o, 2, 2] : void 0, - n ? [n, 2, 2] : void 0, - ...this.clocks.map((l) => [i[l.id].clockLabel$, 2.5, 3]) - ].filter(Boolean).forEach(([l, c, u]) => { - v.adjustTextContainerAspectRatio(l, c, u); - }); - } - setToDisplayMode(t, s, i = !0) { - const { keyTweenVars: r, keyImgContTweenVars: o } = this.getVarsForDisplayMode(t, s); - v.gsap.set(t.elem$, r), v.gsap.set(t.imgContainer$, o), i && s !== this.displayMode && this.updateTarget("displayMode", s); - } - initElementsInContext(t, s, i = !0) { - const r = this.getElements$(t); - return s ?? (s = this.displayMode), this.setToDisplayMode(r, s, i), this.formatLabels(r), (s.toString().startsWith("present") || Number.isInteger(s)) && v.gsap.to(r.container$.find(".clock-label, .clock-key-label"), { autoAlpha: 0, duration: 0 }), r; - } - // #endregion - async addToScene(t = game.scenes.current.id) { - if (this.isInScene(t)) - return; - const { sceneIDs: s } = this; - s.push(t), await this.updateTarget({ - isVisible: !1, - sceneIDs: s - }), this.renderTargetAndKeeper(); - } - async removeFromScene(t = game.scenes.current.id) { - if (!this.isInScene(t)) - return; - const { sceneIDs: s } = this; - v.remove(s, t), await this.updateTarget("sceneIDs", s), this.renderTargetAndKeeper(); - } - closeClockKey({ container$: t }) { - t.remove(); - } - get svgData() { - if (this.size === 0) - throw new Error("[BladesClockKey.svgData] Error size is 0."); - const t = hu[this.size]; - let s; - if (this.size === 1 && t.paths) - s = t.paths[this.oneKeyIndex]; - else if (t.path) - s = t.path; - else - throw new Error("[BladesClockKey.svgData] Error path is not defined."); - return { - width: t.width, - height: t.height, - path: s, - clocks: t.clocks - }; - } - isInOverlay(t) { - return $(t).hasClass(".overlay-section") || $(t).closest(".overlay-section").length > 0; - } - get keyHeight() { - return this.svgData.height; - } - get keyWidth() { - return this.svgData.width; - } - get keyViewbox() { - return `0 0 ${this.svgData.width} ${this.svgData.height}`; - } - get keyPath() { - return this.svgData.path; - } - get clockSize() { - return this.svgData.clocks.size; - } - getClockPosition(t = 0) { - if (t > this.size) - throw new Error(`[BladesClockKey.getClockPosition] Error clockIndex '${t}' is greater than key size '${this.size}'.`); - if (t < 0) - throw new Error(`[BladesClockKey.getClockPosition] Error clockIndex '${t}' is less than 0.`); - return this.svgData.clocks[t]; - } - removePositionDragger() { - var t, s; - (t = this.positionDragger) == null || t.target.remove(), (s = this.positionDragger) == null || s.kill(), delete this.positionDragger; - } - spawnPositionDragger(t = game.eunoblades.Director.clockKeySection$) { - const s = this; - this.positionDragger && this.removePositionDragger(); - const i = $(`
`).appendTo(t); - this.overlayPosition && i.css({ - left: this.overlayPosition.x, - top: this.overlayPosition.y - }), this.positionDragger = new Ii(i, { - type: "top,left", - onDragStart() { - $(this.target).css("background", "rgba(255, 255, 0, 0.25)"), $(this.target).css("outlineColor", "rgba(255, 255, 0, 1)"); - }, - onDragEnd() { - $(this.target).css("background", "rgba(255, 0, 255, 0.25)"), $(this.target).css("outlineColor", "rgba(255, 0, 255, 1)"), s.overlayPosition = { x: this.endX, y: this.endY }; - } - }); - } - switchToMode(t, s, i = {}, r = {}, o = !0, n) { - const { elem$: l, imgContainer$: c } = t, { keyTweenVars: u, keyImgContTweenVars: g } = this.getVarsForDisplayMode(t, s), f = this.displayMode, h = v.gsap.utils.random(1, 1e3, 1); - return v.gsap.timeline({ - callbackScope: this, - paused: !0, - onStart() { - eLog.checkLog2("BladesClockKey", `switchToMode #${h} - START`, { key: this, keyElems$: t, displayMode: s }); - }, - onComplete() { - eLog.checkLog3("BladesClockKey", `switchToMode #${h} - COMPLETE`, { key: this, keyElems$: t, displayMode: s }), o && s !== this.currentDisplayMode ? this.updateTarget("displayMode", s).then(() => n == null ? void 0 : n()) : n == null || n(); - }, - onReverseComplete() { - eLog.checkLog3("BladesClockKey", `switchToMode #${h} - REVERSE COMPLETE`, { key: this, keyElems$: t, displayMode: s }), o && this.updateTarget("displayMode", f); - } - }).to(l, { ...u, ...i }, 0).to(c, { ...g, ...r }, 0); - } - // #endregion - // #region ANIMATED UPDATES (Both GM-Only AND Socket Calls) - // #region > SOCKET CALLS: _SocketCall / static _SocketResponse / _Animation - fadeInName_Animation(t) { - if (this.name) - return v.gsap.effects.blurReveal(t.label$, { - ignoreMargin: !0, - duration: 0.75 - }); - } - async fadeInName_SocketCall(t) { - game.user.isGM && socketlib.system.executeForEveryone("fadeInName_SocketCall", t, this.id); - } - static fadeInName_SocketResponse(t, s) { - const i = game.eunoblades.ClockKeys.get(s); - i && i.fadeInName_Animation(i.getElements$(t)); - } - fadeOutName_Animation(t) { - if (this.name) - return v.gsap.effects.blurRemove(t.label$, { - ignoreMargin: !0, - duration: 0.75 - }); - } - async fadeOutName_SocketCall(t) { - game.user.isGM && (this.fadeOutName_Animation(this.getElements$(t)), socketlib.system.executeForOthers("fadeOutName_SocketCall", t, this.id)); - } - static fadeOutName_SocketResponse(t, s) { - const i = game.eunoblades.ClockKeys.get(s); - i && i.fadeOutName_Animation(i.getElements$(t)); - } - // #endregion - // #endregion - // #region Adding & Removing Clocks ~ - async updateClockIndices() { - return await this.updateTarget("clocksData", Object.fromEntries( - Object.entries(this.clocksData).map(([t, s], i) => [t, { ...s, index: i }]) - )), this.clocks; - } - async addClock(t = {}) { - const s = Be.ParseConfigToData({ - ...Be.ApplySchemaDefaults(t), - index: this.size, - targetID: this.targetID, - targetKey: `${this.targetKeyPrefix}.clocksData`, - isScopingById: !0 - }); - await this.updateTarget(`clocksData.${s.id}`, s), this.clocks, this.renderTargetAndKeeper(); - } - async deleteClock(t) { - var s, i; - if (this.size <= 1) - throw new Error("[BladesClockKey.deleteClock()] Cannot reduce number of clocks below 1!"); - t ?? (t = (s = Array.from(this.clocks).pop()) == null ? void 0 : s.id), t && (await ((i = this.getClockByID(t)) == null ? void 0 : i.delete()), await this.updateClockIndices(), this.clocks); - } - // #endregion - // #region OVERRIDES: Async Update Methods - renderTargetAndKeeper() { - var t; - this.renderTarget(), (t = game.eunoblades.ClockKeeper.sheet) == null || t.render(); - } - renderTarget() { - var t; - (t = this.target.sheet) == null || t.render(); - } - // #endregion -} -class Be extends hs { - // #region STATIC METHODS ~ - static ApplySchemaDefaults(e) { - const t = { - name: e.name ?? "", - value: e.value ?? 0, - max: e.max ?? 8 - }; - return { - index: 0, - color: Ht.white, - isVisible: !v.isInt(e.index) || e.index === 0, - isNameVisible: !1, - isHighlighted: !1, - isActive: !v.isInt(e.index) || e.index === 0, - ...e, - ...t - }; - } - // #endregion - // #region GETTERS & SETTERS ~ - get canEdit() { - return console.log("NOTE: All Clocks currently Editable; see line 71 of BladesClock.ts"), this.isVisible && this.isActive; - } - get data() { - return this.linkData; - } - get name() { - return this.data.name; - } - set name(e) { - this.updateTarget("name", e).then(() => { - this.parentKey.renderTargetAndKeeper(); - }); - } - get value() { - return v.pInt(this.data.value); - } - set value(e) { - this.updateTarget("value", v.pInt(e)).then(() => { - this.parentKey.renderTargetAndKeeper(); - }); - } - get max() { - return v.pInt(this.data.max); - } - set max(e) { - this.updateTarget("max", v.pInt(e)).then(() => { - this.parentKey.renderTargetAndKeeper(); - }); - } - get color() { - return this.data.color ?? Ht.white; - } - set color(e) { - this.updateTarget("color", e).then(() => { - this.parentKey.renderTargetAndKeeper(); - }); - } - get isActive() { - return v.pBool(this.data.isActive); - } - set isActive(e) { - this.updateTarget("isActive", v.pBool(e)).then(() => { - this.parentKey.renderTargetAndKeeper(); - }); - } - get parentKey() { - const e = game.eunoblades.ClockKeys.get(this.data.parentKeyID); - if (!e) - throw new Error(`[BladesClockKey.parentKey] No parent key found for clock ${this.id}`); - return e; - } - get isNameVisible() { - return v.pBool(this.data.isNameVisible); - } - set isNameVisible(e) { - this.updateTarget("isNameVisible", v.pBool(e)).then(() => { - this.parentKey.renderTargetAndKeeper(); - }); - } - get isVisible() { - return v.pBool(this.data.isVisible); - } - set isVisible(e) { - this.updateTarget("isVisible", v.pBool(e)).then(() => { - this.parentKey.renderTargetAndKeeper(); - }); - } - get isHighlighted() { - return v.pBool(this.data.isHighlighted); - } - set isHighlighted(e) { - this.updateTarget("isHighlighted", v.pBool(e)).then(() => { - this.parentKey.renderTargetAndKeeper(); - }); - } - get index() { - return v.pInt(this.data.index); - } - set index(e) { - this.updateTarget("index", v.pInt(e)).then(() => { - this.parentKey.renderTargetAndKeeper(); - }); - } - get isEmpty() { - return this.value === 0; - } - get isComplete() { - return this.value >= this.max; - } - get rollOppClock() { - return this; - } - get rollOppName() { - return this.name; - } - get rollOppType() { - return "clock"; - } - get colorSelectOptions() { - return [ - { value: Ht.white, display: "🔘" }, - { value: Ht.yellow, display: "📀" }, - { value: Ht.cyan, display: "🔵" }, - { value: Ht.red, display: "🔴" } - ]; - } - get maxSelectOptions() { - return [ - { value: 2, display: 2 }, - { value: 3, display: 3 }, - { value: 4, display: 4 }, - { value: 5, display: 5 }, - { value: 6, display: 6 }, - { value: 8, display: 8 }, - { value: 10, display: 10 }, - { value: 12, display: 12 } - ]; - } - get valueSelectOptions() { - const e = []; - for (let t = 0; t <= this.max; t++) - e.push({ value: t, display: t }); - return e; - } - // Returns which hemisphere of the clock will show the final change if segmentDelta segments are added/removed. - getActiveSide(e = 0) { - const t = Math.min(this.max, Math.max(0, this.value + e)), s = this.max / 2; - return e === 0 ? t >= s ? "left" : "right" : t > s ? "left" : "right"; - } - // #endregion - // #region HTML INTERACTION ~ - getElemFromDisplayContext(e) { - let t; - const s = $(".vtt.game.system-eunos-blades"); - switch (e) { - case He.overlay: { - t = s.find(`#blades-overlay #${this.id}`); - break; - } - case He.pcSheet: { - t = s.find(`.actor.sheet .pc #${this.id}`); - break; - } - case He.factionSheet: { - t = s.find(`.actor.sheet .faction #${this.id}`); - break; - } - case He.projectSheet: { - t = s.find(`.item.sheet .project #${this.id}`); - break; - } - case He.scoreSheet: { - t = s.find(`.item.sheet .score #${this.id}`); - break; - } - case He.rollCollab: { - t = s.find(`.roll-collab-sheet #${this.id}`); - break; - } - case He.chatMessage: { - t = s.find(`#chat #${this.id}`); - break; - } - } - if (!t.length) - throw new Error(`[BladesClockKey.getElemFromDisplayContext] Error elem$ not found for key '${this.id}' for display context '${e}'.`); - return t; - } - getElements$(e) { - let t; - if (typeof e == "string" && (e = this.getElemFromDisplayContext(e)), t = $(e).find(`#${this.id}`), t.length || (t = $(e).closest(`#${this.id}`)), !(t != null && t.length)) - throw new Error(`[BladesClock.getElements$] Cannot find elements for display context '${e}' of clock '${this.id}' of key '${this.parentKey.id}'.`); - const s = { - clockElem$: t - }, i = t.closest(".clock-container"); - if (!i.length) - throw new Error(`[BladesClock.getElements$] Error '.clock-container' not found for clock '${this.id}' of key '${this.parentKey.id}'.`); - s.clockContainer$ = i; - const r = t.find(".clock-label"); - if (!r.length) - throw new Error(`[BladesClock.getElements$] Error '.clock-label' not found for clock '${this.id}' of key '${this.parentKey.id}'.`); - s.clockLabel$ = r; - const o = t.find(".clock-bg"); - if (!o.length) - throw new Error(`[BladesClock.getElements$] Error '.clock-bg' not found for clock '${this.id}' of key '${this.parentKey.id}'.`); - s.bg$ = o; - const n = t.find(".clock-frame"); - if (!n.length) - throw new Error(`[BladesClock.getElements$] Error '.clock-frame' not found for clock '${this.id}' of key '${this.parentKey.id}'.`); - s.frame$ = n; - const l = t.find(".clock-fill"); - if (!l.length) - throw new Error(`[BladesClock.getElements$] Error '.clock-fill' not found for clock '${this.id}' of key '${this.parentKey.id}'.`); - s.fill$ = l; - const c = t.find(".clock-glow"); - if (!c.length) - throw new Error(`[BladesClock.getElements$] Error '.clock-glow' not found for clock '${this.id}' of key '${this.parentKey.id}'.`); - s.glow$ = c; - const u = t.find(".clock-cover"); - if (!u.length) - throw new Error(`[BladesClock.getElements$] Error '.clock-cover' not found for clock '${this.id}' of key '${this.parentKey.id}'.`); - s.cover$ = u; - const g = t.find(".clock-one-segment"); - if (g.length !== 3) - throw new Error(`[BladesClock.getElements$] Error '.clock-one-segment' elements not found for clock '${this.id}' of key '${this.parentKey.id}'.`); - return s.oneSegments$ = g, s; - } - // #endregion - // #region ANIMATED UPDATES (Both GM-Only AND Socket Calls) - reveal_Animation(e, t) { - const s = [ - e.frame$, - e.fill$ - ].filter((r) => r !== void 0), i = v.gsap.timeline({ - callbackScope: this, - onComplete() { - t == null || t(); - } - }); - return i.to(e.cover$, { scale: 2, autoAlpha: 0, duration: 0.5, ease: "power2" }), i.fromTo(s, { - autoAlpha: 0, - scale: 2 - }, { - autoAlpha: 1, - scale: 1, - duration: 0.5, - stagger: 0.2, - ease: "power2" - }), this.name && this.isNameVisible && i.blurReveal(e.clockLabel$, { - ignoreMargin: !0, - duration: 0.75 - }, "<+0.05"), this.isHighlighted && i.scaleUpReveal(e.glow$, { - scale: 3, - duration: 0.5 - }, "<+0.05"), this.isActive ? i.add(() => this.activate_Animation(e), "<+0.05") : i.add(() => this.deactivate_Animation(e), "<+0.05"), i; - } - async reveal_SocketCall(e) { - game.user.isGM && socketlib.system.executeForEveryone("reveal_SocketCall", e, this.parentKey.id, this.index); - } - static reveal_SocketResponse(e, t, s) { - const i = game.eunoblades.ClockKeys.get(t); - if (!(i != null && i.isVisible)) - return; - const r = i.getClockByIndex(s); - if (!r) - return; - const o = r.getElements$(e); - r.reveal_Animation(o); - } - hide_Animation(e, t) { - const s = [ - e.frame$, - e.fill$ - ].filter((r) => r !== void 0), i = v.gsap.timeline({ - callbackScope: this, - onComplete() { - t == null || t(); - } - }); - return i.to(s, { - autoAlpha: 0, - scale: 2, - duration: 0.5, - stagger: 0.2, - ease: "power2" - }), this.name && this.isNameVisible && i.blurRemove(e.clockLabel$, { - ignoreMargin: !0, - duration: 0.75 - }, "<+0.05"), this.isHighlighted && i.scaleDownRemove(e.glow$, { - scale: 3, - duration: 0.5 - }, "<+0.05"), i.to(e.cover$, { scale: 1, autoAlpha: 1, duration: 0.5, ease: "power2" }), i; - } - async hide_SocketCall(e) { - game.user.isGM && socketlib.system.executeForEveryone("hide_SocketCall", e, this.parentKey.id, this.index); - } - static hide_SocketResponse(e, t, s) { - const i = game.eunoblades.ClockKeys.get(t); - if (!(i != null && i.isVisible)) - return; - const r = i.getClockByIndex(s); - if (!r) - return; - const o = r.getElements$(e); - r.hide_Animation(o); - } - activate_Animation(e, t) { - v.gsap.to(e.bg$, { autoAlpha: 1, duration: 0.5, ease: "power2" }), v.gsap.to(e.frame$, { - filter: "brightness(0.5)", - duration: 0.5, - ease: "power2", - onComplete: t - }); - } - async activate_SocketCall(e) { - game.user.isGM && socketlib.system.executeForEveryone("activate_SocketCall", e, this.parentKey.id, this.index); - } - static activate_SocketResponse(e, t, s) { - const i = game.eunoblades.ClockKeys.get(t); - if (!(i != null && i.isVisible)) - return; - const r = i.getClockByIndex(s); - r && r.activate_Animation(r.getElements$(e)); - } - deactivate_Animation(e, t) { - v.gsap.to(e.bg$, { autoAlpha: 0, duration: 0.5, ease: "power2" }), v.gsap.to(e.frame$, { - filter: "brightness(1) blur(5px)", - duration: 0.5, - ease: "power2", - onComplete: t - }); - } - async deactivate_SocketCall(e) { - game.user.isGM && socketlib.system.executeForEveryone("deactivate_SocketCall", e, this.parentKey.id, this.index); - } - static deactivate_SocketResponse(e, t, s) { - const i = game.eunoblades.ClockKeys.get(t); - if (!(i != null && i.isVisible)) - return; - const r = i.getClockByIndex(s); - r && r.deactivate_Animation(r.getElements$(e)); - } - fadeInClockName_Animation(e) { - v.gsap.effects.blurReveal(e.clockLabel$, { - ignoreMargin: !0, - duration: 0.75 - }); - } - async fadeInClockName_SocketCall(e) { - game.user.isGM && socketlib.system.executeForEveryone("fadeInClockName_SocketCall", e, this.parentKey.id, this.index); - } - static fadeInClockName_SocketResponse(e, t, s) { - const i = game.eunoblades.ClockKeys.get(t); - if (!(i != null && i.isVisible)) - return; - const r = i.getClockByIndex(s); - r && r.fadeInClockName_Animation(r.getElements$(e)); - } - fadeOutClockName_Animation(e) { - v.gsap.effects.blurRemove(e.clockLabel$, { - ignoreMargin: !0, - duration: 0.75 - }); - } - async fadeOutClockName_SocketCall(e) { - game.user.isGM && socketlib.system.executeForEveryone("fadeOutClockName_SocketCall", e, this.parentKey.id, this.index); - } - static fadeOutClockName_SocketResponse(e, t, s) { - const i = game.eunoblades.ClockKeys.get(t); - if (!(i != null && i.isVisible)) - return; - const r = i.getClockByIndex(s); - r && r.fadeOutClockName_Animation(r.getElements$(e)); - } - highlight_Animation(e) { - v.gsap.effects.scaleUpReveal(e.glow$, { - duration: 0.5, - scale: 3 - }); - } - async highlight_SocketCall(e) { - game.user.isGM && socketlib.system.executeForEveryone("highlight_SocketCall", e, this.parentKey.id, this.index); - } - static highlight_SocketResponse(e, t, s) { - const i = game.eunoblades.ClockKeys.get(t); - if (!(i != null && i.isVisible)) - return; - const r = i.getClockByIndex(s); - r && r.highlight_Animation(r.getElements$(e)); - } - unhighlight_Animation(e) { - v.gsap.effects.scaleDownRemove(e.glow$, { - duration: 0.5, - scale: 3 - }); - } - async unhighlight_SocketCall(e) { - game.user.isGM && socketlib.system.executeForEveryone("unhighlight_SocketCall", e, this.parentKey.id, this.index); - } - static unhighlight_SocketResponse(e, t, s) { - const i = game.eunoblades.ClockKeys.get(t); - if (!(i != null && i.isVisible)) - return; - const r = i.getClockByIndex(s); - r && r.unhighlight_Animation(r.getElements$(e)); - } - getRotationOfSegment(e) { - return 360 / this.max * (e - 1); - } - initOneSegments(e, t, s) { - if (t.length > 3) - throw new Error(`Too many segments: [${t.join(", ")}]`); - const i = [...e.oneSegments$], r = Array.from(e.oneSegments$).slice(0, t.length); - for (const o of t) { - const n = i.shift(); - v.gsap.set(n, { - rotation: this.getRotationOfSegment(o), - autoAlpha: s ? 1 : 0 - }); - } - return s && e.clockElem$.attr("data-value", v.getLast(t) - 1), r; - } - changeSegments_Animation(e, t, s, i) { - t = v.gsap.utils.clamp(0, this.max, t), s = v.gsap.utils.clamp(0, this.max, s); - let r = s - t; - if (r === 0) - return; - const o = []; - if (r < 0) { - for (; Math.abs(r) > t; ) - r++; - for (let c = t; c > s; c--) - o.push(c); - } else { - for (; s > this.max; ) - r--; - for (let c = t + 1; c <= s; c++) - o.push(c); - } - const n = this.initOneSegments(e, o, t > s); - eLog.checkLog3("BladesClock", "changeSegments_Animation", { clockElems$: e, delta: r, segmentNums: o, startVal: t, endVal: s, segmentsToAnimate: n }); - const l = v.gsap.timeline(); - return r > 0 ? l.fromTo(n, { - autoAlpha: 0, - scale: 2 - }, { - autoAlpha: 1, - scale: 1, - duration: 0.5, - stagger: 0.2, - ease: "power2", - callbackScope: this, - onComplete() { - e.clockElem$.attr("data-value", s), v.gsap.to(n, { - autoAlpha: 0, - duration: 0.5, - stagger: 0.2 - // onComplete() { - // // Return clock key to original size and focus - // clockFocusTimeline.reverse(); - // } - }); - } - }) : l.fromTo(n, { - autoAlpha: 1, - scale: 1 - }, { - autoAlpha: 0, - scale: 2, - duration: 0.5, - stagger: 0.2, - ease: "power2" - // onComplete() { - // // Return clock key to original size and focus - // clockFocusTimeline.reverse(); - // } - }), l; - } - async changeSegments_SocketCall(e, t, s) { - game.user.isGM && (t = v.gsap.utils.clamp(0, this.max, t), s = v.gsap.utils.clamp(0, this.max, s), socketlib.system.executeForEveryone("changeSegments_SocketCall", e, this.parentKey.id, this.index, t, s)); - } - static changeSegments_SocketResponse(e, t, s, i, r) { - const o = game.eunoblades.ClockKeys.get(t); - if (!(o != null && o.isVisible)) - return; - const n = o.getClockByIndex(s); - n && n.changeSegments_Animation(n.getElements$(e), i, r); - } - // #endregion - // #region Adding/Removing Clock Segments ~ - // Returns number of segments beyond max (or 0, if max not met) - async fillSegments(e, t = !1) { - const s = Math.max(0, this.value + e - this.max); - return e = Math.min(this.value + e, this.max) - this.value, e === 0 || (await this.updateTarget("value", this.value + e), t || this.parentKey.renderTargetAndKeeper()), s; - } - // Returns (positive) number of segments removed - // in excess of the number of segments in the clock - async clearSegments(e, t = !1) { - const s = Math.max(0, e - this.value); - return e = Math.min(this.value, e), e === 0 || (await this.updateTarget("value", this.value - e), t || this.parentKey.renderTargetAndKeeper()), s; - } - async delete() { - const { parentKey: e } = this; - await super.delete(!1), e.updateClockIndices(); - } - // #endregion -} -const Nt = class Nt { - constructor() { - Z(this, "_id"); - // #endregion - // #endregion - // #region OVERLAY ~ - // #region >> Overlay Elements$ ~ - Z(this, "_overlayContainer"); - Z(this, "_overlayContainer$"); - // - As with notifications: placeholder animation until something more final can be coded. - // #endregion - // #region TOOLTIPS ~ - Z(this, "_tooltipObserver"); - Z(this, "_tooltipElems", /* @__PURE__ */ new Map()); - Z(this, "_displayedTooltipID"); - this._id = randomID(); - } - static getInstance() { - return Nt.instance ?? (Nt.instance = new Nt()); - } - // #endregion - static async Initialize() { - return Hooks.on("renderApplication", async () => { - game.eunoblades.Director.initClockKeySection(!0), game.user.isGM && (await game.eunoblades.ClockKeeper.update({ "system.targetScene": game.scenes.current.id }), game.eunoblades.ClockKeeper.render()); - }), loadTemplates([ - "systems/eunos-blades/templates/overlay/blades-overlay.hbs", - "systems/eunos-blades/templates/overlay/location.hbs", - "systems/eunos-blades/templates/overlay/score-panel.hbs", - "systems/eunos-blades/templates/overlay/npc-portrait.hbs", - "systems/eunos-blades/templates/overlay/pc-portrait.hbs", - "systems/eunos-blades/templates/overlay/cohort-portrait.hbs", - "systems/eunos-blades/templates/overlay/crew-status-bar.hbs", - "systems/eunos-blades/templates/overlay/game-phase-bar.hbs", - "systems/eunos-blades/templates/overlay/notices/push.hbs" - ]); - } - // #region >> Sockets ~ - static InitSockets() { - const e = Nt.getInstance(); - socketlib.system.register("renderOverlay_SocketCall", e.renderOverlay_SocketResponse.bind(e)), e.initClockSockets(), e.initScorePanelSockets(), e.initLocationSockets(), e.initNPCSockets(), e.initPCSockets(), e.initCohortSockets(), e.initCrewSockets(), e.initNotificationSockets(), e.initTransitionSockets(); - } - get overlayContainer() { - return this._overlayContainer || ([this._overlayContainer] = $("#blades-overlay")), this._overlayContainer || ($("body.vtt").append('
'), [this._overlayContainer] = $("#blades-overlay")), this._overlayContainer; - } - get overlayContainer$() { - return this._overlayContainer$ || (this._overlayContainer$ = $(this.overlayContainer)), this._overlayContainer$; - } - get clockKeySection$() { - return this.overlayContainer$.find(".overlay-section-clock-keys"); - } - get locationSection$() { - return this.overlayContainer$.find(".overlay-section-location"); - } - get scorePanelSection$() { - return this.overlayContainer$.find(".overlay-section-score-panel"); - } - get npcSection$() { - return this.overlayContainer$.find(".overlay-section-npcs"); - } - get playerSection$() { - return this.overlayContainer$.find(".overlay-section-players"); - } - get crewSection$() { - return this.overlayContainer$.find(".overlay-section-crew"); - } - get notificationSection$() { - return this.overlayContainer$.find(".overlay-section-notifications"); - } - get transitionSection$() { - return this.overlayContainer$.find(".overlay-section-transitions"); - } - get tooltipSection$() { - return this.overlayContainer$.find(".overlay-section-tooltips"); - } - get svgData() { - return hu; - } - // #endregion - // #region >> Rendering ~ - renderOverlay_SocketCall() { - game.user.isGM && this.overlayContainer && socketlib.system.executeForEveryone("renderOverlay_SocketCall"); - } - async renderOverlay_SocketResponse() { - const e = await renderTemplate( - "systems/eunos-blades/templates/overlay/blades-overlay.hbs", - this - ); - this.overlayContainer$.empty().append(e), this.initClockKeySection(), this.initTooltipSection(); - } - // #endregion - // #endregion - // #region CLOCKS & CLOCK KEYS ~ - // #region >> INITIALIZATION ~ - initClockKeySection(e = !1) { - e && this.clockKeySection$.empty(); - const t = v.shuffle(this.sceneKeys.filter((i) => i.isVisible)); - let s = 0; - for (; t.length; ) { - const i = t.shift(); - i && (setTimeout(() => this.renderClockKey(i), s * 1e3), s += 0.5); - } - setTimeout(() => { - }, s * 1e3); - } - initClockSockets() { - socketlib.system.register("renderClockKey_SocketCall", Nt.renderClockKey_SocketResponse.bind(Nt)), socketlib.system.register("pullKey_SocketCall", Nt.pullKey_SocketResponse.bind(Nt)), socketlib.system.register("fadeInName_SocketCall", Et.fadeInName_SocketResponse.bind(Et)), socketlib.system.register("fadeOutName_SocketCall", Et.fadeOutName_SocketResponse.bind(Et)), socketlib.system.register("reveal_SocketCall", Be.reveal_SocketResponse.bind(Be)), socketlib.system.register("hide_SocketCall", Be.hide_SocketResponse.bind(Be)), socketlib.system.register("activate_SocketCall", Be.activate_SocketResponse.bind(Be)), socketlib.system.register("deactivate_SocketCall", Be.deactivate_SocketResponse.bind(Be)), socketlib.system.register("fadeInClockName_SocketCall", Be.fadeInClockName_SocketResponse.bind(Be)), socketlib.system.register("fadeOutClockName_SocketCall", Be.fadeOutClockName_SocketResponse.bind(Be)), socketlib.system.register("highlight_SocketCall", Be.highlight_SocketResponse.bind(Be)), socketlib.system.register("unhighlight_SocketCall", Be.unhighlight_SocketResponse.bind(Be)), socketlib.system.register("changeSegments_SocketCall", Be.changeSegments_SocketResponse.bind(Be)); - } - // #endregion - get sceneKeys() { - return game.eunoblades.ClockKeeper.getSceneKeys(game.scenes.current.id); - } - // #region >> Rendering (Dropping) Clock Keys ~ - dropKey_Animation(e, t) { - const { - container$: s, - label$: i, - imgContainer$: r, - clocks: o - } = t ?? e.getElements$(game.eunoblades.Director.clockKeySection$), n = r.data("keySwingTimeline"), l = v.gsap.timeline().call(() => { - n.seek("NEUTRAL").play(); - }).from(s, { - y: -800, - ease: "bounce", - duration: 1 - }, 0).to(s, { autoAlpha: 1, duration: 0.5, ease: "power2" }, 0); - e.visibleClocks.forEach((c, u) => { - l.add( - () => { - c.reveal_Animation(o[c.id]); - }, - u === 0 ? ">" : "<+0.15" - ); - }), e.name && e.isNameVisible && l.blurReveal(i, { - ignoreMargin: !0, - duration: 0.75 - }, "<+0.05"); - } - prepareClockKeyTimelines(e, t) { - const { container$: s, imgContainer$: i, elem$: r, label$: o, clocks: n } = t; - v.gsap.set(s, { pointerEvents: "auto" }), v.gsap.set(r, { filter: "brightness(1)" }), v.gsap.set(i, { transformOrigin: "50% 10%" }); - const l = v.gsap.getProperty(s[0], "scale"); - i.data( - "keySwingTimeline", - v.gsap.timeline({ paused: !0, repeat: -1, yoyo: !0 }).fromTo(i, { rotateZ: -1 }, { rotateZ: 1, duration: 3, ease: "sine.inOut" }).addLabel("NEUTRAL", 1.5).seek("NEUTRAL") - ), s.data( - "hoverOverTimeline", - v.gsap.timeline({ - paused: !0, - data: { key: e, imgContainer$: i, label$: o, isNameRevealed: !1 }, - onStart() { - this.data.imgContainer$.data("keySwingTimeline").tweenTo("NEUTRAL", { - duration: 0.25, - ease: "back.out(1.5)" - }), this.data.key.name && !this.data.key.isNameVisible && (this.data.isNameRevealed = !0, v.gsap.effects.blurReveal(this.data.label$, { - ignoreMargin: !0, - duration: 0.5 - })); - }, - onReverseComplete() { - this.data.imgContainer$.data("keySwingTimeline").seek("NEUTRAL").play(), this.data.isNameRevealed && (this.data.isNameRevealed = !1, v.gsap.effects.blurRemove(this.data.label$, { - ignoreMargin: !0, - duration: 0.5 - })); - } - }).to(r, { filter: "brightness(1.5)", scale: l * 1.25, duration: 0.5, ease: "sine" }) - ), e.clocks.forEach((c) => { - const { clockContainer$: u, clockLabel$: g, clockElem$: f } = n[c.id]; - if (!(u != null && u.length)) - throw new Error(`[BladesDirector.prepareClockKeyTimelines] Error clockContainer$ not found for clock '${c.id}' of key '${e.id}'.`); - v.gsap.set(u, { pointerEvents: "auto" }), u.data( - "hoverOverTimeline", - v.gsap.timeline({ - paused: !0, - data: { clock: c, clockLabel$: g, isNameRevealed: !1 }, - onStart() { - this.data.clock.name && !this.data.clock.isNameVisible && (this.data.isNameRevealed = !0, v.gsap.effects.blurReveal(this.data.clockLabel$, { - ignoreMargin: !0, - duration: 0.5 - })); - }, - onReverseComplete() { - this.data.isNameRevealed && (this.data.isNameRevealed = !1, v.gsap.effects.blurRemove(this.data.clockLabel$, { - ignoreMargin: !0, - duration: 0.5 - })); - } - }).to(f, { filter: "brightness(1.5)", scale: 1.25, duration: 0.25, ease: "sine" }) - ); - }); - } - async activateClockKeyListeners(e, t) { - const { container$: s, clocks: i } = t; - game.user.isGM ? (s.on("dblclick", async () => { - var r; - (r = game.eunoblades.ClockKeeper.sheet) == null || r.render(!0); - }), s.on("contextmenu", async () => { - this.pullKey_SocketCall(e.id), e.updateTarget("isVisible", !1); - })) : (s.on("mouseenter", () => { - s.data("hoverOverTimeline").play(); - }).on("mouseleave", () => { - s.data("hoverOverTimeline").reverse(); - }), e.clocks.forEach((r) => { - const { clockContainer$: o } = i[r.id]; - o.on("mouseenter", () => { - r.isVisible && o.data("hoverOverTimeline").play(); - }).on("mouseleave", () => { - r.isVisible && o.data("hoverOverTimeline").reverse(); - }); - })); - } - async renderClockKey(e) { - await e.renderTo(this.clockKeySection$), e.positionDragger && e.removePositionDragger(); - const t = e.initElementsInContext(this.clockKeySection$, Ct.full); - e.overlayPosition && v.gsap.set(t.container$, { - left: e.overlayPosition.x, - top: e.overlayPosition.y - }), this.prepareClockKeyTimelines(e, t), this.activateClockKeyListeners(e, t), this.dropKey_Animation(e, t); - } - async renderClockKey_SocketCall(e) { - game.user.isGM && socketlib.system.executeForEveryone("renderClockKey_SocketCall", e); - } - static async renderClockKey_SocketResponse(e) { - const t = game.eunoblades.ClockKeys.get(e); - t && game.eunoblades.Director.renderClockKey(t); - } - // #endregion - // #region >> Un-Rendering (Pulling) Clock Keys ~ - pullKey_Animation(e) { - const { container$: t } = e.getElements$(game.eunoblades.Director.clockKeySection$); - v.gsap.timeline().to(t, { - y: -800, - ease: "back.in(1)", - duration: 0.75 - }).to(t, { - opacity: 0, - ease: "power2.out", - duration: 0.25 - }, 0.75).call(() => { - t.remove(); - }); - } - async pullKey_SocketCall(e) { - game.user.isGM && socketlib.system.executeForEveryone("pullKey_SocketCall", e); - } - static pullKey_SocketResponse(e) { - const t = game.eunoblades.ClockKeys.get(e); - t && game.eunoblades.Director.pullKey_Animation(t); - } - // #endregion - // #endregion - // #region SCORE PANEL ~ - // #region >> INITIALIZATION ~ - initScorePanelSockets() { - } - // #endregion - // ## Score Details - // - Small panel overlapping corner of Location - // - Engagement roll result - // - Plan & Detail - // - Target tier - activateScorePanelListeners() { - } - // #endregion - // #region LOCATIONS ~ - // #region >> INITIALIZATION ~ - initLocationSockets() { - } - // #endregion - // ## Locations - // - District wrapper/header - // - Faction wrapper/footer - // - Location main - // - Slide-scroll of sublocations - activateLocationListeners() { - } - // #endregion - // #region NPCs ~ - // #region >> INITIALIZATION ~ - initNPCSockets() { - } - // #endregion// ## NPCs - // - Linked to a location: When location is displayed, so are they. *(Can be linked to District wrapper, main Location, or sublocations)* - // - Portrait images close to the central location display, hover-over popups provide more detailed information from sheet or `BladesScore` instance - activateNPCListeners() { - } - // #endregion - // #region PCs, COHORTs, CREW ~ - // #region >> INITIALIZATION ~ - initPCSockets() { - } - initCohortSockets() { - } - initCrewSockets() { - } - // #endregion - // ## PCs - // - Display panels along bottom - // - Signal lights - activatePCListeners() { - } - // ## Cohorts - // - Smaller panels alongside the PCs - activateCohortListeners() { - } - // ## Crew - // - Limited information displayed, maybe bar beneath PCs showing Heat, Wanted Level… - activateCrewListeners() { - } - // #endregion - // #region NOTIFICATIONS ~ - // #region >> INITIALIZATION ~ - initNotificationSockets() { - socketlib.system.register("pushNotice_SocketCall", Nt.pushNotice_SocketResponse.bind(Nt)); - } - // #endregion - pushNotice_SocketCall(e, t) { - const s = randomID(); - if (typeof e == "string") { - if (e === "ALL") - return socketlib.system.executeForEveryone("pushNotice_SocketCall", s, t); - if (e === "GM") - return socketlib.system.executeForAllGMs("pushNotice_SocketCall", s, t); - e = game.users.filter( - (i) => { - var r, o; - return i.id === e || i.name === e || ((r = i.character) == null ? void 0 : r.id) === e || ((o = i.character) == null ? void 0 : o.name) === e || game.user.isGM; - } - ).map((i) => i.id); - } - if (e.length > 0) - return socketlib.system.executeForUsers("pushNotice_SocketCall", e, s, t); - } - static async pushNotice_SocketResponse(e, t) { - const s = game.eunoblades.Director, i = $(await renderTemplate("systems/eunos-blades/templates/overlay/notices/push.hbs", { - id: e, - ...t - })).appendTo(s.notificationSection$).on("click", (r) => { - s.$removePush(r.currentTarget); - }).on("contextmenu", (r) => { - s.$removeAndClear(r.currentTarget); - }); - v.gsap.fromTo( - i, - { - x: 200, - skewX: 20, - autoAlpha: 0, - filter: "blur(10px)" - }, - { - x: 0, - skewX: 0, - autoAlpha: 1, - filter: "blur(0px)", - duration: 0.5, - ease: "back" - } - ); - } - async $removePush(e) { - v.gsap.to( - e, - { - x: "+=200", - autoAlpha: 0, - ease: "power2", - duration: 0.5, - onComplete: function() { - $(e).remove(); - } - } - ); - } - async $removeAndClear(e) { - const t = $(e).prevAll().get().reverse(); - t.unshift(e), v.gsap.to( - t, - { - x: "+=200", - autoAlpha: 0, - ease: "power2", - duration: 0.5, - stagger: { - each: 0.5, - from: "start", - ease: "power1.inOut" - }, - onComplete: function() { - t.forEach((s) => $(s).remove()); - } - } - ); - } - // #endregion - // #region TRANSITIONS ~ - // #region >> INITIALIZATION ~ - initTransitionSockets() { - } - // #endregion - // ## Transitions - async advanceGamePhase(e) { - var t; - v.gsap.utils.wrap( - Object.values(Fe), - Object.values(Fe).indexOf(e ?? ((t = game.eunoblades.Tracker) == null ? void 0 : t.phase) ?? Fe.Freeplay) + 1 - ); - } - /** - * Adjusts the tooltip's position to ensure it remains within its parent container using jQuery methods. - * @param tooltip - The tooltip element, which can be either an HTMLElement or a JQuery. - */ - adjustTooltipPosition(e) { - if (e.css("position") !== "absolute") - throw new Error("Tooltip position must be 'absolute'."); - const t = e[0].getBoundingClientRect(), s = this.tooltipSection$[0].getBoundingClientRect(), i = e.position().top, r = e.position().left; - if (t.right > s.right) { - const o = s.right - t.right; - e.css("left", `${r + o}px`); - } else if (t.left < s.left) { - const o = s.left - t.left; - e.css("left", `${r + o}px`); - } - if (t.bottom > s.bottom) { - const o = s.bottom - t.bottom; - e.css("top", `${i + o}px`); - } else if (t.top < s.top) { - const o = s.top - t.top; - e.css("top", `${i + o}px`); - } - } - displayTooltip(e) { - var s, i; - if (!e.id) - throw new Error("Tooltip must have an ID to be cloned to the overlay."); - this._displayedTooltipID = e.id; - const t = this; - if (game.eunoblades.Director.clearTooltips(), !this._tooltipElems.has(e.id)) { - const r = $(v.changeContainer( - e, - game.eunoblades.Director.tooltipSection$[0], - !0 - )); - this.adjustTooltipPosition(r); - const o = v.gsap.effects.blurRevealTooltip( - r[0], - { - onReverseComplete() { - r.attr("id") === t._displayedTooltipID && delete t._displayedTooltipID, game.eunoblades.Director._tooltipElems.delete(r.attr("id")), game.eunoblades.Director.tooltipSection$.find(`#${r.attr("id")}`).remove(), game.eunoblades.Director.tooltipSection$.children("[style*='opacity: 0'], [style*='opacity:0']").each(function() { - const n = this.id; - n !== t._displayedTooltipID && (n && game.eunoblades.Director._tooltipElems.delete(n), $(this).remove()); - }); - } - } - ); - r.data("revealTimeline", o), this._tooltipElems.set(e.id, r); - } - (i = (s = this._tooltipElems.get(e.id)) == null ? void 0 : s.data("revealTimeline")) == null || i.play(); - } - clearTooltip(e, t = !0) { - e === this._displayedTooltipID && delete this._displayedTooltipID; - const s = game.eunoblades.Director._tooltipElems.get(e); - if (!s) - return; - const i = s.data("revealTimeline"); - i.isActive() && !t || i.reverse(); - } - clearTooltips() { - eLog.checkLog3("Observer", "Observer Triggered!"), game.eunoblades.Director._tooltipElems.forEach((e) => { - e.attr("id") !== this._displayedTooltipID && game.eunoblades.Director.clearTooltip(e.attr("id"), !0); - }); - } - initTooltipSection() { - var t; - const e = this; - this.clearTooltips(), (t = this._tooltipObserver) == null || t.kill(), this._tooltipObserver = Observer.create({ - type: "touch,pointer", - // onMove: throttledOnMove, - onClick() { - e.clearTooltips(); - } - }); - } - // #endregion -}; -// #region INITIALIZATION ~ -// #region >> Single-Instance Factory Construction ~ -Z(Nt, "instance"); -let kt = Nt; -class Pe extends Item { - constructor() { - super(...arguments); - Z(this, "dialogCSSClasses", ""); - } - // #region Static Overrides: Create ~ - static async create(t, s = {}) { - return Array.isArray(t) && (t = t[0]), t.system = t.system ?? {}, eLog.checkLog2("item", "BladesItem.create(data,options)", { data: t, options: s }), t.system.world_name = t.system.world_name ?? t.name.replace(/[^A-Za-z_0-9 ]/g, "").trim().replace(/ /g, "_"), super.create(t, s); - } - // #endregion - // #region BladesDocument Implementation - static get All() { - return game.items; - } - static Get(t) { - return t instanceof Pe ? t : v.isDocID(t) ? Pe.All.get(t) : Pe.All.find((s) => s.system.world_name === t) || Pe.All.find((s) => s.name === t); - } - static GetTypeWithTags(t, ...s) { - return Array.isArray(t) ? t.map((i) => Pe.All.filter((r) => r.type === i)).flat() : Pe.All.filter((i) => i.type === t).filter((i) => i.hasTag(...s)); - } - static IsType(t, ...s) { - const i = new Set(s); - return t instanceof Pe && i.has(t.type); - } - get tags() { - return this.system.tags ?? []; - } - hasTag(...t) { - return t.every((s) => this.tags.includes(s)); - } - async addTag(...t) { - const s = this.tags; - t.forEach((i) => { - s.includes(i) || s.push(i); - }), await this.update({ "system.tags": s }); - } - async remTag(...t) { - const s = this.tags.filter((i) => !t.includes(i)); - await this.update({ "system.tags": s }); - } - get tooltip() { - const t = [ - this.system.concept, - this.system.rules, - this.system.notes - ].filter(Boolean).join(""); - if (t) - return new Handlebars.SafeString(t).toString(); - } - getFactorTotal(t) { - var s, i, r; - switch (t) { - case H.tier: - return Pe.IsType(this, x.cohort_gang) ? this.system.tier.value + (((s = this.parent) == null ? void 0 : s.getFactorTotal(H.tier)) ?? 0) : Pe.IsType(this, x.cohort_expert) ? this.system.tier.value + (((i = this.parent) == null ? void 0 : i.getFactorTotal(H.tier)) ?? 0) : Pe.IsType(this, x.gear) ? this.system.tier.value + (((r = this.parent) == null ? void 0 : r.getFactorTotal(H.tier)) ?? 0) : this.system.tier.value; - case H.quality: { - if (Pe.IsType(this, x.cohort_gang)) - return this.getFactorTotal(H.tier) + (this.system.quality_bonus ?? 0); - if (Pe.IsType(this, x.cohort_expert)) - return this.getFactorTotal(H.tier) + (this.system.quality_bonus ?? 0) + 1; - if (Pe.IsType(this, x.gear)) { - let o = this.getFactorTotal(H.tier) + (this.hasTag("Fine") ? 1 : 0); - return Te.IsType(this.parent) && (o += this.parent.getTaggedItemBonuses(this.tags)), o; - } - return Pe.IsType(this, x.design) ? this.system.min_quality : this.getFactorTotal(H.tier); - } - case H.scale: - return Pe.IsType(this, x.cohort_gang) ? this.getFactorTotal(H.tier) + (this.system.scale_bonus ?? 0) : Pe.IsType(this, x.cohort_expert) ? 0 + (this.system.scale_bonus ?? 0) : 0; - case H.magnitude: - return Pe.IsType(this, x.ritual) ? this.system.magnitude.value : 0; - default: - return 0; - } - } - // #endregion - // #region BladesItemDocument Implementation - async archive() { - return await this.addTag(he.System.Archived), this; - } - async unarchive() { - return await this.remTag(he.System.Archived), this; - } - // #endregion - // #region BladesRoll Implementation - get rollFactors() { - const t = { - [x.cohort_gang]: [H.quality, H.scale], - [x.cohort_expert]: [H.quality, H.scale], - [x.gear]: [H.quality], - [x.project]: [H.quality], - [x.ritual]: [H.magnitude], - [x.design]: [H.quality] - }; - if (!t[this.type]) - return {}; - const s = t[this.type], i = {}; - return (s ?? []).forEach((r, o) => { - const n = this.getFactorTotal(r); - i[r] = { - name: r, - value: n, - max: n, - baseVal: n, - display: [H.tier, H.quality].includes(r) ? v.romanizeNum(n) : `${n}`, - isActive: o === 0, - isPrimary: o === 0, - isDominant: !1, - highFavorsPC: !0, - cssClasses: `factor-gold${o === 0 ? " factor-main" : ""}` - }; - }), i; - } - // #region BladesRoll.PrimaryDoc Implementation - get rollPrimaryID() { - return this.id; - } - get rollPrimaryDoc() { - return this; - } - get rollPrimaryName() { - return this.name; - } - get rollPrimaryType() { - if (![ - x.cohort_gang, - x.cohort_expert, - x.gm_tracker, - x.score - ].includes(this.type)) - throw new Error(`BladesItem of type '${this.type}' ("${this.name}") cannot be RollPrimary.`); - return this.type; - } - get rollPrimaryImg() { - return this.img; - } - get rollPrimaryModsSchemaSet() { - return ti.ParseDocModsToSchemaSet(this); - } - async applyHarm(t, s) { - if (Pe.IsType(this, x.cohort_expert, x.cohort_gang)) { - const i = this.system.harm.value; - let r; - t > i ? r = t : r = i + 1; - const o = ["is Weakened", "is Impaired", "has been Broken", "has been Killed!"], n = [ - "They act with Reduced Effect.", - "They act with Reduced Effect and suffer -1d to all rolls.", - "They cannot do anything until they recover.", - "You may replace them during Downtime." - ]; - kt.getInstance().pushNotice_SocketCall( - "ALL", - { - title: `${this.name} ${o[r - 1]}`, - body: n[r - 1], - type: Ds.push, - cssClasses: "harm-alert" - } - ), await this.update({ "system.harm": t }); - } - } - async applyWorsePosition() { - Pe.IsType(this, x.cohort_expert, x.cohort_gang) && this.setFlag("eunos-blades", "isWorsePosition", !0); - } - // #endregion - // #region BladesRoll.OppositionDoc Implementation - get rollOppID() { - return this.id; - } - get rollOppDoc() { - return this; - } - get rollOppImg() { - return this.img; - } - get rollOppName() { - return this.name; - } - get rollOppSubName() { - return ""; - } - get rollOppType() { - if (![ - x.cohort_gang, - x.cohort_expert, - x.gm_tracker, - x.score, - x.location, - x.project, - x.design, - x.ritual - ].includes(this.type)) - throw new Error(`BladesItem of type '${this.type}' ("${this.name}") cannot be RollOpposition.`); - return this.type; - } - get rollOppModsSchemaSet() { - return []; - } - // #endregion - // #region BladesRoll.ParticipantDoc Implementation - get rollParticipantID() { - return this.id; - } - get rollParticipantDoc() { - return this; - } - get rollParticipantIcon() { - return this.img; - } - get rollParticipantName() { - return this.name; - } - get rollParticipantType() { - if (![ - x.cohort_gang, - x.cohort_expert, - x.gm_tracker - ].includes(this.type)) - throw new Error(`BladesItem of type '${this.type}' ("${this.name}") cannot be RollParticipant.`); - return this.type; - } - get rollParticipantModsSchemaSet() { - return []; - } - // #endregion - // #endregion - // #region PREPARING DERIVED DATA - prepareDerivedData() { - super.prepareDerivedData(), Pe.IsType(this, x.cohort_gang, x.cohort_expert) && this._prepareCohortData(this.system), Pe.IsType(this, x.crew_playbook) && this._preparePlaybookData(this.system), Pe.IsType(this, x.gear) && this._prepareGearData(this.system), Pe.IsType(this, x.playbook) && this._preparePlaybookData(this.system); - } - _prepareCohortData(t) { - if (!Pe.IsType(this, x.cohort_gang, x.cohort_expert)) - return; - t.tier.name = "Quality"; - const s = v.unique(Object.values(t.subtypes).map((r) => r.trim()).filter((r) => /[A-Za-z]/.test(r))), i = [ - ...Object.values(t.elite_subtypes) - ]; - if (Lt.IsType(this.parent) && i.push( - ...this.parent.upgrades.filter((r) => (r.name ?? "").startsWith("Elite")).map((r) => (r.name ?? "").trim().replace(/^Elite /, "")) - ), t.subtypes = Object.fromEntries(s.map((r, o) => [`${o + 1}`, r])), t.elite_subtypes = Object.fromEntries( - v.unique( - i.map((r) => r.trim()).filter((r) => /[A-Za-z]/.test(r) && s.includes(r)) - ).map((r, o) => [`${o + 1}`, r]) - ), t.edges = Object.fromEntries(Object.values(t.edges ?? []).filter((r) => /[A-Za-z]/.test(r)).map((r, o) => [`${o + 1}`, r.trim()])), t.flaws = Object.fromEntries(Object.values(t.flaws ?? []).filter((r) => /[A-Za-z]/.test(r)).map((r, o) => [`${o + 1}`, r.trim()])), t.quality = this.getFactorTotal(H.quality), Pe.IsType(this, x.cohort_gang)) { - if ([...s, ...i].includes(he.GangType.Vehicle)) - t.scale = this.getFactorTotal(H.scale), t.scaleExample = "(1 vehicle)"; - else { - t.scale = this.getFactorTotal(H.scale); - const r = Math.min(6, t.scale); - t.scaleExample = Y.ScaleExamples[r], t.subtitle = Y.ScaleSizes[r]; - } - s.length + i.length === 0 && (t.subtitle = t.subtitle.replace(/\s+of\b/g, "").trim()); - } else - t.scale = 0, t.scaleExample = [...s, ...i].includes("Pet") ? "(1 animal)" : "(1 person)", t.subtitle = "An Expert"; - s.length + i.length > 0 && ([...s, ...i].includes(he.GangType.Vehicle) ? t.subtitle = Y.VehicleDescriptors[Math.min(6, this.getFactorTotal(H.tier))] : t.subtitle += ` ${v.oxfordize([ - ...s.filter((r) => !i.includes(r)), - ...i.map((r) => `Elite ${r}`) - ], !1, "&")}`); - } - _prepareGearData(t) { - Pe.IsType(this, x.gear) && (t.tier.name = "Quality"); - } - _preparePlaybookData(t) { - if (!Pe.IsType(this, x.playbook, x.crew_playbook)) - return; - const s = {}; - if ([...Object.values(t.experience_clues).filter((i) => /[A-Za-z]/.test(i)), " "].forEach((i, r) => { - s[(r + 1).toString()] = i; - }), t.experience_clues = s, Pe.IsType(this, x.playbook)) { - const i = {}; - [...Object.values(t.gather_info_questions).filter((r) => /[A-Za-z]/.test(r)), " "].forEach((r, o) => { - i[(o + 1).toString()] = r; - }), t.gather_info_questions = i; - } - } - // #endregion - // Unlock lower-level update method for subclasses - async callOnUpdate(...t) { - await this._onUpdate(...t); - } -} -const te = Pe, Os = {}, Ur = { - addItem: async (a, e, t, s = !1) => { - if (eLog.checkLog("activeEffects", "addItem", { actor: a, funcData: e, isReversing: s }), a.hasActiveSubItemOf(e)) { - if (s) - return a.remSubItem(e); - } else if (!s) - return a.addSubItem(e); - }, - addIfChargen: async (a, e, t, s = !1) => { - var o; - if (eLog.checkLog("activeEffects", "addIfChargen", { actor: a, funcData: e, isReversing: s }), !s && ((o = game.eunoblades.Tracker) == null ? void 0 : o.system.phase) !== Fe.CharGen) - return; - const [i, r] = e.split(/:/); - if (s) { - await a.update({ [i]: v.pInt(getProperty(a, i)) - v.pInt(r) }); - return; - } - await a.update({ [i]: v.pInt(getProperty(a, i)) + v.pInt(r) }); - }, - upgradeIfChargen: async (a, e, t, s = !1) => { - var o; - if (eLog.checkLog("activeEffects", "upgradeIfChargen", { actor: a, funcData: e, isReversing: s }), !s && ((o = game.eunoblades.Tracker) == null ? void 0 : o.system.phase) !== Fe.CharGen) - return; - const [i, r] = e.split(/:/); - getProperty(a, i) < v.pInt(r) && await a.update({ [i]: v.pInt(r) }); - }, - APPLYTOMEMBERS: async () => { - }, - APPLYTOCOHORTS: async () => { - }, - remItem: async (a, e, t, s = !1) => { - function i(r, o) { - return o.startsWith("rX") ? new RegExp(o.replace(/^rX:\/(.*?)\//, "$1")).test(r) : r === o; - } - if (e.startsWith("{")) { - if (s) { - console.error("Cannot reverse a 'remItem' custom effect that was defined with a JSON object."); - return; - } - const { type: r, tags: o, name: n } = JSON.parse(e); - let l = a.activeSubItems; - if (l.length === 0 || (n && (l = l.filter((c) => i(c.name, n))), l.length === 0) || (r && (l = l.filter((c) => i(c.type, r))), l.length === 0) || (o && (l = l.filter((c) => c.hasTag(...o))), l.length === 0)) - return; - eLog.checkLog("activeEffects", "remItem - JSON OBJECT", { actor: a, funcData: JSON.parse(e), isReversing: s, activeSubItems: l }), l.forEach((c) => a.remSubItem(c)); - } - if (eLog.checkLog("activeEffects", "remItem", { actor: a, funcData: e, isReversing: s }), a.hasActiveSubItemOf(e)) - return a.remSubItem(e); - if (s) - return a.addSubItem(e); - } -}; -class ls extends ActiveEffect { - static Initialize() { - CONFIG.ActiveEffect.documentClass = ls, Hooks.on("preCreateActiveEffect", async (e) => { - var i; - if (eLog.checkLog3("effect", "PRECREATE ActiveEffect", { effect: e, parent: (i = e.parent) == null ? void 0 : i.name }), !(e.parent instanceof oe)) - return; - if (e.changes.some((r) => r.key === "APPLYTOMEMBERS")) { - if (oe.IsType(e.parent, z.pc) && oe.IsType(e.parent.crew, z.crew)) { - const r = e.parent.crew.members.filter((o) => { - var n; - return o.id !== ((n = e.parent) == null ? void 0 : n.id); - }); - r.length > 0 && (e.changes = e.changes.filter((o) => o.key !== "APPLYTOMEMBERS"), await Promise.all(r.map(async (o) => o.createEmbeddedDocuments("ActiveEffect", [e.toJSON()]))), await e.parent.setFlag("eunos-blades", `memberEffects.${e.id}`, { - appliedTo: r.map((o) => o.id), - effect: e.toJSON() - })); - } else if (oe.IsType(e.parent, z.crew)) { - const r = v.pullElement(e.changes, (o) => o.key === "APPLYTOMEMBERS"); - if (!r) - return; - e.parent.members.length > 0 && await Promise.all(e.parent.members.map(async (o) => o.createEmbeddedDocuments("ActiveEffect", [e.toJSON()]))), await e.parent.setFlag("eunos-blades", `memberEffects.${e.id}`, { - appliedTo: e.parent.members.map((o) => o.id), - effect: e - }), await e.updateSource({ changes: [r] }); - } - } else - e.changes.some((r) => r.key === "APPLYTOCOHORTS") && (oe.IsType(e.parent, z.pc) || oe.IsType(e.parent, z.crew)) && (e.parent.cohorts.length > 0 && await Promise.all(e.parent.cohorts.map(async (r) => r.createEmbeddedDocuments("ActiveEffect", [e.toJSON()]))), await e.parent.setFlag("eunos-blades", `cohortEffects.${e.id}`, { - appliedTo: e.parent.cohorts.map((r) => r.id), - effect: e - }), await e.updateSource({ changes: e.changes.filter((r) => r.key === "APPLYTOCOHORTS") })); - const [t, s] = v.partition(e.changes, (r) => r.key.startsWith("perm")); - await e.updateSource({ changes: s }); - for (const r of t) { - const { key: o, value: n } = r, l = o.replace(/^perm/, ""); - if (l in Ur) { - const c = { - funcName: l, - funcData: n, - isReversing: !1, - effect: e - }; - ls.ThrottleCustomFunc(e.parent, c); - } else if (l === "Add") { - const [c, u] = n.split(/:/); - e.parent.update({ [c]: v.pInt(getProperty(e.parent, c)) + v.pInt(u) }); - } - } - }), Hooks.on("applyActiveEffect", (e, t) => { - if (e instanceof oe && t.key in Ur) { - const s = { - funcName: t.key, - funcData: t.value, - isReversing: !1, - effect: t.effect - }; - ls.ThrottleCustomFunc(e, s); - } - }), Hooks.on("updateActiveEffect", (e, { disabled: t }) => { - if (!(e.parent instanceof oe)) - return; - e.changes.filter((i) => i.mode === 0).forEach(({ key: i, value: r }) => { - const o = { - funcName: i, - funcData: r, - isReversing: t, - effect: e - }; - ls.ThrottleCustomFunc(e.parent, o); - }); - }), Hooks.on("deleteActiveEffect", async (e) => { - if (!(e.parent instanceof oe)) - return; - if (e.changes.some((s) => s.key === "APPLYTOMEMBERS")) - if (oe.IsType(e.parent, z.pc) && oe.IsType(e.parent.crew, z.crew)) { - const s = e.parent.crew.members.filter((i) => { - var r; - return i.id !== ((r = e.parent) == null ? void 0 : r.id); - }); - s.length > 0 && await Promise.all(s.map(async (i) => Promise.all(i.effects.filter((r) => r.name === e.name).map(async (r) => r.delete())))), await e.parent.unsetFlag("eunos-blades", `memberEffects.${e.id}`); - } else - oe.IsType(e.parent, z.crew) && (e.parent.members.length > 0 && await Promise.all(e.parent.members.map(async (s) => Promise.all(s.effects.filter((i) => i.name === e.name).map(async (i) => i.delete())))), await e.parent.unsetFlag("eunos-blades", `memberEffects.${e.id}`)); - else - e.changes.some((s) => s.key === "APPLYTOCOHORTS") && oe.IsType(e.parent, z.pc, z.crew) && (e.parent.cohorts.length > 0 && await Promise.all(e.parent.cohorts.map(async (s) => Promise.all(s.effects.filter((i) => i.name === e.name).map(async (i) => i.delete())))), await e.parent.unsetFlag("eunos-blades", `cohortEffects.${e.id}`)); - e.changes.filter((s) => s.mode === 0).forEach(({ key: s, value: i }) => { - const r = { - funcName: s, - funcData: i, - isReversing: !0, - effect: e - }; - ls.ThrottleCustomFunc(e.parent, r); - }); - }); - } - static async AddActiveEffect(e, t, s, i = "systems/eunos-blades/assets/icons/effect-icons/default.png") { - const r = [s].flat(); - await e.createEmbeddedDocuments("ActiveEffect", [{ name: t, icon: i, changes: r }]); - } - static ThrottleCustomFunc(e, t) { - const { funcName: s, funcData: i, isReversing: r, effect: o } = t; - if (e.id) { - if (eLog.checkLog3("activeEffect", `Throttling Func: ${s}(${i}, ${r})`), e.id && e.id in Os) { - const n = Os[e.id].queue.find((l) => JSON.stringify(l) === JSON.stringify(t)); - if (eLog.checkLog("activeEffects", "... Checking Queue", { data: t, FUNCQUEUE: Os[e.id], matchingQueue: n }), n) { - eLog.error("... Function ALREADY QUEUED, SKIPPING"); - return; - } - Os[e.id].queue.push(t); - return; - } - eLog.checkLog3("activeEffect", "... Creating New FUNCQUEUE, RUNNING:"), Os[e.id] = { - curFunc: ls.RunCustomFunc(e, Ur[s](e, i, o, r)), - queue: [] - }; - } - } - static async RunCustomFunc(e, t) { - if (e.id) - if (eLog.checkLog("activeEffects", "... Running Func ..."), await t, eLog.checkLog("activeEffects", "... Function Complete!"), Os[e.id].queue.length) { - const { funcName: s, funcData: i, isReversing: r, effect: o } = Os[e.id].queue.shift() ?? {}; - if (!s || !(s in Ur) || !i) - return; - eLog.checkLog3("activeEffect", `Progressing Queue: ${s}(${i}, ${r}) -- ${Os[e.id].queue.length} remaining funcs.`), Os[e.id].curFunc = ls.RunCustomFunc( - e, - Ur[s](e, i, o, r) - ); - } else - eLog.checkLog3("activeEffect", "Function Queue Complete! Deleting."), delete Os[e.id]; - } - /** - * Manage Active Effect instances through the Actor Sheet via effect control buttons. - * @param {MouseEvent} event The left-click event on the effect control - * @param {Actor|Item} owner The owning entity which manages this effect - */ - static onManageActiveEffect(e, t) { - var o; - e.preventDefault(); - const s = e.currentTarget; - if (s.dataset.action === "create") - return t.createEmbeddedDocuments("ActiveEffect", [{ - name: t.name, - icon: t.img, - origin: t.uuid - }]); - const i = s.closest("tr"); - if (i === null) - return null; - const r = i.dataset.effectId ? t.effects.get(i.dataset.effectId) : null; - if (!r) - return null; - switch (s.dataset.action) { - case "edit": - return (o = r.sheet) == null ? void 0 : o.render(!0); - case "delete": - return eLog.checkLog("activeEffects", "delete effect"), r.delete(); - case "toggle": - return r.update({ disabled: !r.disabled }); - default: - return null; - } - } - async _preCreate(e, t, s) { - eLog.checkLog3("effect", "ActiveEffect._preCreate()", { data: e, options: t, user: s }), await super._preCreate(e, t, s); - } - _onDelete(e, t) { - eLog.checkLog3("effect", "ActiveEffect._onDelete()", { options: e, userID: t }), super._onDelete(e, t); - } - get isSuppressed() { - if (!/Actor.*Item/.test(this.origin)) - return super.isSuppressed; - const [e, t] = this.origin.replace(/Actor\.|Item\./g, "").split("."), i = game.actors.get(e).items.get(t); - return super.isSuppressed || (i == null ? void 0 : i.hasTag(he.System.Archived)); - } -} -const np = (a, e, t) => { - const s = a.target.value; - if (s) { - const i = JSON.parse(s).map(({ value: r }) => r); - e.update({ [t]: i }); - } else - e.update({ [t]: [] }); -}, Ih = { - InitListeners: (a, e) => { - function t(o, n) { - const l = new zh(o, { - enforceWhitelist: !0, - editTags: !1, - whitelist: Object.entries(n).map(([f, h]) => h.map((m) => ({ - value: new Handlebars.SafeString(m).toString(), - "data-group": f - }))).flat(), - dropdown: { - enabled: 0, - maxItems: 1e4, - placeAbove: !1, - appendTarget: a[0] - } - }); - l.dropdown.createListHTML = (f) => { - const h = {}; - return structuredClone(f).map((m) => { - const y = l.dropdown.getMappedValue.call( - l, - m - ); - let k = ""; - return h[m["data-group"]] || (h[m["data-group"]] = !0, Object.keys(h).length && (k += ""), k += ` -
-

${m["data-group"]}

- `), m.value = y && typeof y == "string" ? v.escapeHTML(y) : y, k += l.settings.templates.dropdownItem.apply( - l, - [m] - ), k; - }).join(""); - }; - function c(f) { - for (const [h, m] of Object.entries(n)) - if (m.includes(f)) - return h; - return !1; - } - const u = $(o).data("tagTarget") ?? "system.tags", g = [getProperty(e, u) ?? []].flat().filter(Boolean); - l.addTags( - g.filter(c).map((f) => ({ - value: new Handlebars.SafeString(f).toString(), - "data-group": c(f) - })), - !0, - !0 - ), setTimeout(() => o.addEventListener("change", (f) => { - np(f, e, u); - }), 1e3); - } - const s = { - "System Tags": Object.values(he.System), - "Gear Tags": [ - ...Object.values(he.Gear), - ...Object.values(he.GearCategory) - ], - "Actor Tags": [ - ...Object.values(he.PC), - ...Object.values(he.NPC) - ], - Vices: Object.values(uu), - Playbooks: Object.values(ra), - Inventions: Object.values(he.Invention), - "Gang Types": Object.values(he.GangType) - }, i = { - "City Districts": Object.values(lu), - "Other Districts": Object.values(cu) - }, r = { Factions: game.actors.filter((o) => o.type === z.faction && o.name !== null).map((o) => o.name) }; - $(a).find(".tags-gm").each((o, n) => t(n, s)), $(a).find(".tags-district").each((o, n) => t(n, i)), $(a).find(".tags-faction").each((o, n) => t(n, r)); - } -}; -class $r extends ItemSheet { - constructor() { - super(...arguments); - Z(this, "_getTypedItemData", { - [x.ability]: (t) => te.IsType(this.item, x.ability) ? { - ...t, - ...{} - } : void 0, - [x.background]: (t) => te.IsType(this.item, x.background) ? { - ...t, - ...{} - } : void 0, - [x.clock_keeper]: (t) => { - if (!te.IsType(this.item, x.clock_keeper)) - return; - const s = { - phases: Object.values(Fe) - }; - return { - ...t, - ...s - }; - }, - [x.cohort_gang]: (t) => { - var i, r; - if (!te.IsType(this.item, x.cohort_gang, x.cohort_expert)) - return; - t.tierTotal = this.item.system.quality > 0 ? v.romanizeNum(this.item.system.quality) : "0", (i = t.system).subtypes ?? (i.subtypes = {}), (r = t.system).elite_subtypes ?? (r.elite_subtypes = {}); - const s = { - tierData: { - class: "comp-tier comp-vertical comp-teeth", - dotline: { - data: this.item.system.tier, - target: "system.tier.value", - iconEmpty: "dot-empty.svg", - iconEmptyHover: "dot-empty-hover.svg", - iconFull: "dot-full.svg", - iconFullHover: "dot-full-hover.svg" - } - } - }; - return s.edgeData = Object.fromEntries(Object.values(t.system.edges ?? []).filter((o) => /[A-Za-z]/.test(o)).map((o) => [o.trim(), Y.EdgeTooltips[o]])), s.flawData = Object.fromEntries(Object.values(t.system.flaws ?? []).filter((o) => /[A-Za-z]/.test(o)).map((o) => [o.trim(), Y.FlawTooltips[o]])), { - ...t, - ...s - }; - }, - [x.cohort_expert]: (t) => { - const s = this._getTypedItemData[x.cohort_gang]; - if (!s) - throw new Error(`No data for type ${this.item.type}`); - return s(t); - }, - [x.crew_ability]: (t) => te.IsType(this.item, x.crew_ability) ? { - ...t, - ...{} - } : void 0, - [x.crew_reputation]: (t) => te.IsType(this.item, x.crew_reputation) ? { - ...t, - ...{} - } : void 0, - [x.crew_playbook]: (t) => { - if (!te.IsType(this.item, x.crew_playbook)) - return; - if (t.isGM) { - const i = {}; - [...Object.values(t.system.experience_clues ?? []).filter((r) => /[A-Za-z]/.test(r)), " "].forEach((r, o) => { - i[(o + 1).toString()] = r; - }), t.system.experience_clues = i; - } - return { - ...t, - ...{} - }; - }, - [x.crew_upgrade]: (t) => te.IsType(this.item, x.crew_upgrade) ? { - ...t, - ...{} - } : void 0, - [x.feature]: (t) => te.IsType(this.item, x.feature) ? { - ...t, - ...{} - } : void 0, - [x.gm_tracker]: (t) => { - if (!te.IsType(this.item, x.gm_tracker)) - return; - const s = { - phase: this.item.system.phase, - phases: Object.values(Fe) - }; - return { - ...t, - ...s - }; - }, - [x.heritage]: (t) => te.IsType(this.item, x.heritage) ? { - ...t, - ...{} - } : void 0, - [x.gear]: (t) => { - if (!te.IsType(this.item, x.gear)) - return; - const s = { - tierData: { - class: "comp-tier comp-vertical comp-teeth", - label: "Quality", - labelClass: "filled-label full-width", - dotline: { - data: this.item.system.tier, - target: "system.tier.value", - iconEmpty: "dot-empty.svg", - iconEmptyHover: "dot-empty-hover.svg", - iconFull: "dot-full.svg", - iconFullHover: "dot-full-hover.svg" - } - } - }; - return { - ...t, - ...s - }; - }, - [x.playbook]: (t) => { - if (!te.IsType(this.item, x.playbook)) - return; - if (t.isGM) { - const i = {}; - [...Object.values(t.system.experience_clues ?? []).filter((o) => /[A-Za-z]/.test(o)), " "].forEach((o, n) => { - i[(n + 1).toString()] = o; - }), t.system.experience_clues = i; - const r = {}; - [...Object.values(t.system.gather_info_questions ?? []).filter((o) => /[A-Za-z]/.test(o)), " "].forEach((o, n) => { - r[(n + 1).toString()] = o; - }), t.system.gather_info_questions = r; - } - return { - ...t, - ...{} - }; - }, - [x.preferred_op]: (t) => te.IsType(this.item, x.preferred_op) ? { - ...t, - ...{} - } : void 0, - [x.stricture]: (t) => te.IsType(this.item, x.stricture) ? { - ...t, - ...{} - } : void 0, - [x.vice]: (t) => te.IsType(this.item, x.vice) ? { - ...t, - ...{} - } : void 0, - [x.ritual]: (t) => te.IsType(this.item, x.ritual) ? { - ...t, - ...{} - } : void 0, - [x.design]: (t) => te.IsType(this.item, x.design) ? { - ...t, - ...{} - } : void 0, - [x.location]: (t) => te.IsType(this.item, x.location) ? { - ...t, - ...{} - } : void 0, - [x.score]: (t) => { - if (te.IsType(this.item, x.score)) - return t; - } - }); - } - static get defaultOptions() { - return foundry.utils.mergeObject(super.defaultOptions, { - classes: ["eunos-blades", "sheet", "item"], - width: 560, - height: 500, - tabs: [{ navSelector: ".sheet-tabs", contentSelector: ".sheet-body", initial: "description" }] - }); - } - /* -------------------------------------------- */ - // constructor(item: BladesItem, options: Partial = {}) { - // options.classes = [...options.classes ?? [], "eunos-blades", "sheet", "item", item.type]; - // super(item, options); - // } - // override async getData() { - getData() { - var r; - const t = super.getData(), s = { - cssClass: this.item.type, - editable: this.options.editable, - isGM: (r = game.eunoblades.Tracker) != null && r.system.is_spoofing_player ? !1 : !!game.user.isGM, - isEmbeddedItem: !!this.item.parent, - item: this.item, - system: this.item.system, - tierTotal: this.item.getFactorTotal(H.tier) > 0 ? v.romanizeNum(this.item.getFactorTotal(H.tier)) : "0", - activeEffects: Array.from(this.item.effects) - }, i = this._getTypedItemData[this.item.type]; - return i ? i({ ...t, ...s }) : { - ...t, - ...s - }; - } - get template() { - const t = [ - "systems/eunos-blades/templates/items" - ]; - return Y.SimpleItemTypes.includes(this.item.type) ? t.push("simple-sheet.hbs") : t.push(`${this.item.type}-sheet.hbs`), t.join("/"); - } - /* -------------------------------------------- */ - addDotlineListeners(t) { - t.find(".dotline").each((s, i) => { - if ($(i).hasClass("locked")) - return; - const r = this.item, o = $(i).data("target"), n = $(i).closest("comp"), l = v.pInt($(i).data("value")); - $(i).find(".dot").each((c, u) => { - $(u).on("click", (g) => { - g.preventDefault(); - const f = v.pInt($(u).data("value")); - f !== l && (n.hasClass("comp-coins") || n.hasClass("comp-stash") ? va.effects.fillCoins($(u).prevAll(".dot")).then(() => r.update({ [o]: f })) : r.update({ [o]: f })); - }), $(u).on("contextmenu", (g) => { - g.preventDefault(); - const f = v.pInt($(u).data("value")) - 1; - f !== l && r.update({ [o]: f }); - }); - }); - }); - } - async activateListeners(t) { - await super.activateListeners(t); - const s = this; - Ih.InitListeners(t, this.item), Or(t), this.options.editable && (this.addDotlineListeners(t), te.IsType(this.item, x.cohort_expert, x.cohort_gang) && t.find("[data-harm-click]").on({ - click: (i) => { - var o; - i.preventDefault(); - const r = v.pInt($(i.currentTarget).data("harmClick")); - ((o = this.item.system.harm) == null ? void 0 : o.value) !== r && this.item.update({ "system.harm.value": r }); - }, - contextmenu: (i) => { - var o; - i.preventDefault(); - const r = Math.max(0, v.pInt($(i.currentTarget).data("harmClick")) - 1); - ((o = this.item.system.harm) == null ? void 0 : o.value) !== r && this.item.update({ "system.harm.value": r }); - } - }), this.options.submitOnChange && t.on("change", "textarea", this._onChangeInput.bind(this)), t.find(".effect-control").on("click", (i) => { - var r; - if (s.item.isOwned) { - (r = ui.notifications) == null || r.warn(game.i18n.localize("BITD.EffectWarning")); - return; - } - ls.onManageActiveEffect(i, s.item); - }), t.find('[data-action="toggle-turf-connection"').on("click", this.toggleTurfConnection.bind(this))); - } - toggleTurfConnection(t) { - const i = $(t.currentTarget).parent(), r = parseInt(i.data("index") ?? 0, 10), o = i.data("dir"); - if (!r || !o) - return; - const n = i.hasClass("no-connect"), l = { - [`system.turfs.${r}.connects.${o}`]: n - }, c = i.data("partner"); - if (typeof c == "string" && /-/.test(c)) { - const [u, g] = c.split("-"); - l[`system.turfs.${u}.connects.${g}`] = n; - } - this.item.update(l); - } -} -class tu extends $r { - constructor() { - super(...arguments); - Z(this, "_htmlContext"); - } - static get defaultOptions() { - return foundry.utils.mergeObject(super.defaultOptions, { - classes: ["eunos-blades", "sheet", "item", "project-sheet"], - template: "systems/eunos-blades/templates/items/project-sheet.hbs" - }); - } - getData() { - const t = super.getData(), s = {}; - return s.presentingClock = this.presentedClock, { - ...t, - ...s - }; - } - get presentedClock() { - const { clockKey: t } = this.document; - if (!t) - throw new Error(`ClockKey not initialized for Project ${this.document.name}`); - let s; - if (v.isInt(t.displayMode)) - s = t.displayMode; - else if (t.displayMode === Ct.presentCurrentClock) - s = this.document.currentClock.index; - else if (t.displayMode.startsWith("present")) - s = v.pInt(t.displayMode.slice(7)); - else - return !1; - return this.document.clockKey.getClockByIndex(s) ?? !1; - } - getClockKeyComponents(t) { - const { clockKey: s } = this.document; - if (!s) - throw new Error(`ClockKey not initialized for Project ${this.document.name}`); - return { - clockKey: s, - keyElems$: s.getElements$(t.find(".clock-key-panel")) - }; - } - switchToPresentAllClocks(t, s) { - const { clocks: i } = s, r = t.switchToMode(s, Ct.clocks); - t.size > 1 && t.visibleClocks.forEach((o, n) => { - const { clockLabel$: l } = i[o.id]; - r.blurReveal(l, n === 0 ? ">" : "<+0.05"); - }), r.play().then(() => { - this._htmlContext && this.document.currentClock && this._htmlContext.find(".sheet-subtitle").attr("data-action", "current-clock-name").val(this.document.currentClock.name); - }); - } - switchToPresentClock(t, s, i) { - const r = s.switchToMode( - i, - t === Ct.presentCurrentClock ? t : `present${t}`, - void 0, - void 0, - !0, - () => { - eLog.checkLog3("BladesProject", "Clock Switch", { clockRef: t, clockKey: s, keyElems$: i, htmlContext: this._htmlContext, presentedClock: this.presentedClock }), this._htmlContext && this.presentedClock && this._htmlContext.find(".sheet-subtitle").attr("data-action", "presented-clock-name").val(this.presentedClock.name); - } - ); - r.to(i.container$.find(".clock-label, .clock-key-label"), { autoAlpha: 0, duration: 0.5, ease: "sine" }, 0), r.play().then(); - } - activateClockKeyListeners(t, s) { - eLog.checkLog2("BladesProject", "Clock Key Data", { clockKey: t, keyElems$: s }); - const { container$: i } = s; - i.css("pointer-events", "auto"), i.on("contextmenu", () => { - this.switchToPresentAllClocks(t, s); - }), Object.entries(s.clocks).forEach(([r, o]) => { - o.clockContainer$.css("pointer-events", "auto"), o.clockContainer$.on("click", () => { - var n; - this.switchToPresentClock( - ((n = t.clocks.get(r)) == null ? void 0 : n.index) ?? Ct.presentCurrentClock, - t, - s - ); - }); - }); - } - async activateListeners(t) { - this._htmlContext = t, await super.activateListeners(t); - const { clockKey: s, keyElems$: i } = this.getClockKeyComponents(t); - t.find("input.sheet-subtitle").on({ - change: (r) => { - r.preventDefault(); - const o = $(r.currentTarget).data("action"); - eLog.checkLog3("BladesProject", "Clock Name Change", { action: o, value: $(r.currentTarget).val() }), o === "presented-clock-name" && this.presentedClock ? (this.presentedClock.updateTarget("name", $(r.currentTarget).val()), i.clocks[this.presentedClock.id].clockLabel$.text($(r.currentTarget).val())) : o === "current-clock-name" && (this.document.clockKey.currentClock.updateTarget("name", $(r.currentTarget).val()), i.clocks[this.document.clockKey.currentClock.id].clockLabel$.text($(r.currentTarget).val())), s.formatLabels(i); - } - }), s.initElementsInContext(t), this.activateClockKeyListeners(s, i), await Promise.all([ - ...s.visibleClocks.map((r) => new Promise((o) => { - const n = i.clocks[r.id]; - r.reveal_Animation(n, () => { - o(); - }); - })), - ...s.activeClocks.map((r) => new Promise((o) => { - const n = i.clocks[r.id]; - r.activate_Animation(n, () => { - o(); - }); - })) - ]); - } -} -class Yl extends te { - constructor() { - super(...arguments); - Z(this, "_clockKey"); - } - // #region INITIALIZATION ~ - static async Initialize() { - return Object.assign(globalThis, { BladesProject: Yl, BladesProjectSheet: tu }), Items.registerSheet("blades", tu, { types: ["project"], makeDefault: !0 }), loadTemplates(["systems/eunos-blades/templates/items/project-sheet.hbs"]); - } - // #endregion - static IsType(t) { - return super.IsType(t, x.project); - } - static async create(t, s = {}) { - const i = await super.create(t, { ...s, renderSheet: !1 }); - return i._clockKey || (i._clockKey = await Et.Create({ - name: i.name, - target: i, - targetKey: "system.clocksData", - isNameVisible: !1, - isSpotlit: !1, - isVisible: !0, - displayMode: Ct.clocks - // oneKeyIndex: U.gsap.utils.random(0, 4, 1) as OneKeyImgIndex - }, void 0, [{ - name: "", - index: 0, - color: Ht.yellow, - value: 0, - max: 8, - isVisible: !0, - isActive: !0, - isNameVisible: !1, - isHighlighted: !1 - }])), i; - } - get clockKey() { - var i, r, o; - if (this._clockKey) - return this._clockKey; - const t = Object.values(this.system.clocksData); - if (t.length === 0) - throw new Error(`ClockKey not initialized for Project ${this.name}`); - let s; - if (t.length === 1) - s = t[0].id; - else if (this.isEmbedded) { - if (s = (i = t.find((n) => { - var l; - return n.targetID.includes((l = this.parent) == null ? void 0 : l.id); - })) == null ? void 0 : i.id, !s) - throw new Error(`ClockKey not initialized for Project ${this.name} embedded in document '${(r = this.parent) == null ? void 0 : r.name}'.`); - } else if (s = (o = t.find((n) => /^Item\.[^.]{16}$/.exec(n.targetID))) == null ? void 0 : o.id, !s) - throw new Error(`ClockKey not initialized for Project ${this.name}.`); - if (this._clockKey = game.eunoblades.ClockKeys.get(s) ?? new Et(this.system.clocksData[s]), !this._clockKey) - throw new Error(`ClockKey not initialized for Project ${this.name}`); - return this._clockKey; - } - get ownerName() { - if (this.parent) - return this.parent.name; - } - get currentClock() { - return this.clockKey.currentClock; - } - get isComplete() { - return this.clockKey.isComplete; - } - get rollOppClock() { - var t; - return (t = this.currentClock) == null ? void 0 : t.data; - } - async advanceClock(t = 1) { - if (this.currentClock) - return this.currentClock.fillSegments(t); - } - get rollFactors() { - const t = {}; - return [ - H.tier, - H.quality - ].forEach((s, i) => { - const r = this.getFactorTotal(s); - t[s] = { - name: s, - value: r, - max: r, - baseVal: r, - display: s === H.tier ? v.romanizeNum(r) : `${r}`, - isActive: i === 0, - isPrimary: i === 0, - isDominant: !1, - highFavorsPC: !0, - cssClasses: `factor-gold${i === 0 ? " factor-main" : ""}` - }; - }), t; - } - getFactorTotal(t) { - switch (t) { - case H.tier: - return this.system.tier.value; - case H.quality: - return this.getFactorTotal(H.tier); - } - return 0; - } - get rollOppImg() { - return ""; - } - get keyElem() { - if (this.clockKey) - return $(`#${this.clockKey.id}`)[0]; - } - get currentClockElem() { - if (this.keyElem && this.currentClock) - return $(this.keyElem).find(`.clock[data-id="${this.currentClock.id}"]`)[0]; - } -} -const Ba = Yl; -class Ah extends te { - get rollFactors() { - const e = {}; - return [ - H.tier, - H.quality, - H.scale - ].forEach((t, s) => { - const i = this.getFactorTotal(t); - e[t] = { - name: t, - value: i, - max: i, - baseVal: i, - display: t === H.tier ? v.romanizeNum(i) : `${i}`, - isActive: s === 0, - isPrimary: s === 0, - isDominant: !1, - highFavorsPC: !0, - cssClasses: `factor-gold${s === 0 ? " factor-main" : ""}` - }; - }), e; - } - getFactorTotal(e) { - switch (e) { - case H.tier: - return this.system.tier.value; - case H.quality: - return this.getFactorTotal(H.tier); - case H.scale: - return this.system.scale; - } - return 0; - } - get rollOppImg() { - return this.img ?? ""; - } - // #region OVERRIDES: _onUpdate - // override async _onUpdate(changed: any, options: any, userId: string) { - // await super._onUpdate(changed, options, userId); - // BladesActor.GetTypeWithTags(BladesActorType.pc).forEach((actor) => actor.render()); - // } - // #endregion -} -class Ul extends te { - static async Initialize() { - const e = game.items.find((t) => t.type === "clock_keeper"); - return e ? game.eunoblades.ClockKeeper = e : game.eunoblades.ClockKeeper = await Ul.create({ - name: "Clock Keeper", - type: "clock_keeper", - img: "systems/eunos-blades/assets/icons/misc-icons/clock-keeper.svg" - }), loadTemplates([ - "systems/eunos-blades/templates/parts/clock-sheet-key-controls.hbs", - "systems/eunos-blades/templates/parts/clock-sheet-clock-controls.hbs" - ]); - } - showClockKeyControls(e) { - var t; - (t = this.sheet) != null && t.element; - } - hideClockKeyControls(e) { - var t; - (t = this.sheet) != null && t.element; - } - // #region CLOCKS OVERLAY - get clockKeys() { - return this.getSceneKeys(); - } - get currentScene() { - var e, t; - return (t = (e = game.scenes) == null ? void 0 : e.current) == null ? void 0 : t.id; - } - get currentSceneID() { - var e; - if (!((e = game.scenes) != null && e.current)) - throw new Error("[BladesClockKeeper.currentScene] Error retrieving 'game.scenes.current'."); - return game.scenes.current.id; - } - get targetSceneID() { - return this.system.targetScene ?? this.currentSceneID; - } - get keys() { - return new Collection( - Object.entries(this.system.clocksData ?? {}).map(([e, t]) => [ - e, - game.eunoblades.ClockKeys.get(e) ?? new Et(t) - ]) - ); - } - getSceneKeys(e) { - return e ?? (e = this.targetSceneID), new Collection(Array.from(game.eunoblades.ClockKeys).filter((t) => t.sceneIDs.includes(e)).map((t) => [t.id, t])); - } - async addClockKey(e = {}) { - var s; - return (s = e.sceneIDs) != null && s.length || (e.sceneIDs = [this.targetSceneID]), await Et.Create({ - target: this, - targetKey: "system.clocksData", - ...e - }); - } - async deleteClockKey(e) { - var t; - await ((t = game.eunoblades.ClockKeys.get(e)) == null ? void 0 : t.delete(game.eunoblades.ClockKeys)); - } - async addClockToKey(e, t) { - const s = await game.eunoblades.ClockKeys.get(e); - s && await s.addClock(t); - } - async deleteClockFromKey(e, t) { - const s = await game.eunoblades.ClockKeys.get(e); - s && await s.deleteClock(t); - } - // #endregion - // #region OVERRIDES: prepareDerivedData, _onUpdate - prepareDerivedData() { - var e, t; - super.prepareDerivedData(), (t = this.system).targetScene ?? (t.targetScene = ((e = game.scenes.current) == null ? void 0 : e.id) || null); - } - // #endregion -} -const zo = Ul; -class Nr extends te { - static async Initialize() { - const e = game.items.find((t) => te.IsType(t, x.gm_tracker)); - e ? game.eunoblades.Tracker = e : game.eunoblades.Tracker = await Nr.create({ - name: "GM Tracker", - type: "gm_tracker", - img: "systems/eunos-blades/assets/icons/misc-icons/gm-tracker.svg" - }); - } - get phase() { - return this.system.phase ?? Fe.Freeplay; - } - set phase(e) { - this.update({ "system.phase": e }); - } - prepareDerivedData() { - this.system.phases = Object.values(Fe); - } - // #region OVERRIDES: prepareDerivedData, _onUpdate - async _onUpdate(...e) { - await super.callOnUpdate(...e), oe.GetTypeWithTags(z.pc).forEach((t) => t.render()); - } - // #endregion -} -class su extends $r { - static get defaultOptions() { - return foundry.utils.mergeObject(super.defaultOptions, { - classes: ["eunos-blades", "sheet", "item", "score-sheet"], - template: "systems/eunos-blades/templates/items/score-sheet.hbs", - width: 900, - submitOnChange: !1, - height: 970 - }); - } - async generateRandomizerData(e) { - const t = { - Bargains: Object.fromEntries(Object.entries(v.sample(Re.GM.Bargains.filter((i) => !Object.values(this.document.system.randomizers.Bargains).some((r) => r.name === i.name || r.effect === i.effect)), 3, !0, (i, r) => r.filter((o) => i.category === o.category).length === 0)).map(([i, r]) => (i = `${i}`, Object.assign(r, { notes: "" }), [i, r]))), - Obstacles: Object.fromEntries(Object.entries(v.sample(Re.GM.Obstacles.filter((i) => !Object.values(this.document.system.randomizers.Obstacles).some((r) => r.name === i.name || r.desc === i.desc)), 3, !0, (i, r) => r.filter((o) => i.category === o.category).length === 0)).map(([i, r]) => (i = `${i}`, Object.assign(r, { notes: "" }), [i, r]))), - NPCs: Object.fromEntries(Object.entries(v.sample( - Re.GM.NPCs.filter( - (i) => !Object.values(this.document.system.randomizers.NPCs).some((r) => r.name === i.name || r.description === i.description) - ), - 3, - !0, - (i, r) => r.filter((o) => i.arena === o.arena).length === 0 - )).map(([i, r]) => (i = `${i}`, Object.assign(r, { notes: "" }), [i, r]))), - Scores: Object.fromEntries(Object.entries(v.sample(Re.GM.Scores.filter((i) => !Object.values(this.document.system.randomizers.Scores).some((r) => r.name === i.name || r.desc === i.desc)), 3, !0, (i, r) => r.filter((o) => i.category === o.category).length === 0)).map(([i, r]) => (i = `${i}`, Object.assign(r, { notes: "" }), [i, r]))) - }; - e && Object.keys(t).filter((i) => i !== e).forEach((i) => { - const r = i; - t[r] = this.document.system.randomizers[r]; - }); - const s = { - Bargains: {}, - Obstacles: {}, - NPCs: {}, - Scores: {} - }; - Object.keys(t).forEach((i) => { - const r = i; - Object.keys(t[r]).forEach((o) => { - var n; - (n = this.document.system.randomizers) != null && n[r][o].isLocked ? s[r][o] = this.document.system.randomizers[r][o] : s[r][o] = t[r][o]; - }); - }), await this.document.update({ "system.randomizers": s }); - } - getData() { - const e = super.getData(), t = {}; - t.playerCharacters = oe.GetTypeWithTags(z.pc, he.PC.ActivePC).map((i) => Object.assign( - i, - { - actionData: Object.fromEntries(Object.entries(i.system.attributes).map(([r, o]) => [ - r, - Object.fromEntries(Object.entries(o).map(([n, l]) => [ - v.uCase(n).slice(0, 3), - l - ])) - ])) - } - )); - const s = {}; - for (const [i, r] of Object.entries(e.system.oppositions)) - !r.rollOppName && !r.rollOppSubName || (s[i] = r); - return e.system.oppositions = s, { - ...e, - ...t - }; - } - _toggleRandomizerLock(e) { - const t = $(e.currentTarget), s = t.data("category"), i = `${t.data("index")}`; - `${t.data("value")}` == "true" ? this.document.update({ [`system.randomizers.${s}.${i}.isLocked`]: !1 }) : this.document.update({ [`system.randomizers.${s}.${i}.isLocked`]: !0 }); - } - _selectImage(e) { - const s = $(e.currentTarget).data("imgNum"); - this.document.update({ "system.imageSelected": s }); - } - _deselectOrDeleteImage(e) { - const s = $(e.currentTarget).data("imgNum"); - if (this.document.system.imageSelected === s) { - this.document.update({ "system.-=imageSelected": null }); - return; - } - const i = { ...this.document.system.images }; - this.document.update({ "system.-=images": null }).then(() => this.document.update({ - "system.images": Object.fromEntries(Object.entries(Object.values(i).filter((r, o) => v.pInt(s) !== o))) - })); - } - _addImage() { - v.displayImageSelector( - (e) => { - const t = v.objSize(this.document.system.images); - return this.document.update({ [`system.images.${t}`]: e }); - }, - "systems/eunos-blades/assets", - this.position - ); - } - _selectRollOpposition(e) { - var i; - eLog.checkLog3("Select Roll Opposition", { event: e }); - const s = $(e.currentTarget).data("oppId"); - this.document.update({ "system.oppositionSelected": s }), ((i = Ha.Active) == null ? void 0 : i.id) === this.document.id && xs.Active && (xs.Active.rollOpposition = new Ft( - xs.Active, - this.document.system.oppositions[s] - )); - } - _triggerRandomize(e) { - const s = $(e.currentTarget).data("category"); - s && s in Re.GM ? this.generateRandomizerData(s) : this.generateRandomizerData(); - } - async _updateGMNotesOnPC(e) { - const t = $(e.currentTarget), s = oe.Get(t.data("id")); - if (!s) - throw new Error(`Unable to retrieve actor with id '${t.data("id")}'`); - const i = e.currentTarget.innerHTML; - eLog.checkLog3("scoreSheet", "Retrieved Text, Updating ...", { updateText: i }), await s.update({ "system.gm_notes": i }), eLog.checkLog3("scoreSheet", "Updated!", { gm_notes: s.system.gm_notes }); - } - async activateListeners(e) { - super.activateListeners(e), e.find("[data-action='select-image']").on({ - click: this._selectImage.bind(this), - contextmenu: this._deselectOrDeleteImage.bind(this) - }), e.find("[data-action='add-image']").on({ - click: this._addImage.bind(this) - }), e.find(".roll-opposition-name").on({ - dblclick: this._selectRollOpposition.bind(this) - }), e.find(".toggle-lock").on({ - click: this._toggleRandomizerLock.bind(this) - }), e.find("[data-action='randomize'").on({ - click: this._triggerRandomize.bind(this) - }), e.find("textarea.pc-summary-notes-body").on({ - change: this._updateGMNotesOnPC.bind(this) - }); - } - async _onSubmit(e, t = {}) { - let s = !0; - const i = this.item.system.phase, r = await super._onSubmit(e, t), o = this.item.system.phase; - if (i !== o) { - switch (i) { - case Fe.CharGen: - break; - case Fe.Freeplay: - break; - case Fe.Score: { - s = !1, game.actors.filter((n) => oe.IsType(n, z.pc)).forEach((n) => n.clearLoadout()); - break; - } - case Fe.Downtime: - break; - } - switch (o) { - case Fe.CharGen: - break; - case Fe.Freeplay: - break; - case Fe.Score: - break; - case Fe.Downtime: - break; - } - } - return s && game.actors.filter((n) => n.type === z.pc).forEach((n) => { - var l; - return (l = n.sheet) == null ? void 0 : l.render(); - }), r; - } -} -class Xl extends te { - // #region INITIALIZATION ~ - static async Initialize() { - return Object.assign(globalThis, { BladesScore: Xl, BladesScoreSheet: su }), Items.registerSheet("blades", su, { types: ["score"], makeDefault: !0 }), loadTemplates(["systems/eunos-blades/templates/items/score-sheet.hbs"]); - } - // #endregion - static get Active() { - return te.GetTypeWithTags(x.score).find((e) => e.system.isActive); - } - static set Active(e) { - var t; - (t = te.GetTypeWithTags(x.score).find((s) => s.system.isActive)) == null || t.update({ "system.isActive": !1 }).then(() => { - e && e.update({ "system.isActive": !0 }); - }); - } - // #region BladesRoll.OppositionData Implementation - get rollFactors() { - const e = this.getFactorTotal(H.tier); - return { - [H.tier]: { - name: "Tier", - value: e, - max: e, - baseVal: e, - display: v.romanizeNum(e), - isActive: !0, - isPrimary: !0, - isDominant: !1, - highFavorsPC: !0, - cssClasses: "factor-gold factor-main" - } - }; - } - get rollOppImg() { - return this.img ?? ""; - } - getFactorTotal(e) { - switch (e) { - case H.tier: - return this.system.tier.value; - case H.quality: - return this.getFactorTotal(H.tier); - case H.scale: - return 0; - case H.magnitude: - return 0; - default: - return 0; - } - } - // #endregion - // #region OVERRIDES: _onUpdate - async _onUpdate(e, t, s) { - super._onUpdate(e, t, s), oe.GetTypeWithTags(z.pc).forEach((i) => i.render()); - } - // #endregion -} -const Ha = Xl, Tn = { - [x.clock_keeper]: zo, - [x.gm_tracker]: Nr, - [x.location]: Ah, - [x.project]: Ba, - [x.score]: Ha -}, lp = new Proxy(function() { -}, { - construct(a, e) { - const [{ type: t }] = e; - if (!t) - throw new Error(`Invalid Item Type: ${String(t)}`); - const s = Tn[t]; - return s ? new s(...e) : new te(...e); - }, - get(a, e) { - switch (e) { - case "create": - case "createDocuments": - return function(t, s = {}) { - if (v.isArray(t)) - return t.map((r) => CONFIG.Item.documentClass.create(r, s)); - const i = Tn[t.type]; - return i ? i.create(t, s) : te.create(t, s); - }; - case Symbol.hasInstance: - return function(t) { - return Object.values(Tn).some((s) => t instanceof s); - }; - default: - return te[e]; - } - } -}); -var pt = /* @__PURE__ */ ((a) => (a.Heritage = "Heritage", a.Background = "Background", a.Vice = "Vice", a.Playbook = "Playbook", a.Reputation = "Reputation", a.Preferred_Op = "Preferred_Op", a.Gear = "Gear", a.Ability = "Ability", a.Faction = "Faction", a.Upgrade = "Upgrade", a.Cohort_Gang = "Cohort_Gang", a.Cohort_Expert = "Cohort_Expert", a.Feature = "Feature", a.Stricture = "Stricture", a.VicePurveyor = "VicePurveyor", a.Acquaintance = "Acquaintance", a.Friend = "Friend", a.Rival = "Rival", a.Crew = "Crew", a.Member = "Member", a.Contact = "Contact", a))(pt || {}); -class Fr extends Dialog { - constructor(t, s) { - super(t, s); - Z(this, "parent"); - Z(this, "tabs"); - Z(this, "dialogType"); - Z(this, "tags", []); - Z(this, "width"); - Z(this, "docType"); - // csqData?: Record< - // Position, - // Record< - // RollResult.partial|RollResult.fail, - // Record< - // string, - // BladesRoll.ConsequenceData - // > - // > - // >; - Z(this, "prompt"); - Z(this, "target"); - Z(this, "flagTarget"); - switch (this.dialogType = t.dialogType ?? "Selection", this.parent = t.parent, this.width = (s == null ? void 0 : s.width) ?? 500, this.prompt = t.prompt, this.target = t.target, this.flagTarget = t.flagTarget, this.dialogType) { - case "Input": - return; - case "Selection": - this.constructSelectionData( - t - /* , options */ - ); - return; - default: - throw new Error(`Unrecognized type for BladesDialog constructor: '${this.dialogType}'`); - } - } - static get defaultOptions() { - return foundry.utils.mergeObject(super.defaultOptions, { - classes: ["eunos-blades", "sheet", "dialog"], - width: "auto", - height: "auto", - tabs: [{ navSelector: ".nav-tabs", contentSelector: ".tab-content", initial: "front" }] - }); - } - static Initialize() { - return loadTemplates([ - "systems/eunos-blades/templates/dialog-selection.hbs", - "systems/eunos-blades/templates/dialog-consequence.hbs", - "systems/eunos-blades/templates/dialog-input.hbs", - "systems/eunos-blades/templates/parts/dialog-consequence-block.hbs" - ]); - } - static async DisplaySimpleInputDialog(t, s, i, r) { - const o = new Fr({ - parent: t, - title: t instanceof xs ? "Roll Input" : `${t.name}: Input`, - dialogType: "Input", - content: "", - prompt: s, - target: i, - flagTarget: r, - buttons: { - apply: { - icon: '', - label: "Apply", - callback: (n) => o - // .writeToRollInstance(html as JQuery) - }, - cancel: { - icon: '', - label: game.i18n.localize("Cancel"), - callback: (n) => (eLog.checkLog3("dialog", "Callback Scope", { this: o, html: n }), !1) - } - }, - default: "apply" - }, { classes: ["eunos-blades", "sheet", "dialog", "simple-input-dialog"] }); - return o._render(!0, { width: o.width }).then(() => eLog.checkLog3("dialog", "Input Dialog Instance", { this: o })); - } - static async DisplaySelectionDialog(t, s, i, r, o) { - const n = new Fr({ - parent: t, - title: s, - docType: i, - tabs: r, - tags: o == null ? void 0 : o.filter((l) => l !== ""), - content: "", - buttons: { - cancel: { - icon: '', - label: game.i18n.localize("Cancel"), - callback: (l) => (eLog.checkLog3("dialog", "Callback Scope", { this: this, html: l }), !1) - } - }, - default: "cancel" - }); - return n.hasItems ? n.render(!0, { width: n.width }) : void 0; - } - // static async DisplayRollConsequenceDialog(rollInst: BladesRoll) { - // const app: BladesDialog = new BladesDialog({ - // parent: rollInst, - // title: "Consequences", - // dialogType: BladesDialogType.Consequence, - // content: "", - // buttons: { - // apply: { - // icon: '', - // label: "Apply", - // callback: (html: HTMLElement|JQuery) => (app as BladesDialog) - // .writeToRollInstance(html as JQuery) - // }, - // cancel: { - // icon: '', - // label: game.i18n.localize("Cancel"), - // callback: (html: JQuery|HTMLElement) => { - // eLog.checkLog3("dialog", "Callback Scope", {this: app, html}); - // return false; - // } - // } - // }, - // default: "apply" - // }, {classes: ["eunos-blades", "sheet", "dialog", "consequence-dialog"]}); - // return app._render(true, {width: app.width}).then(() => eLog.checkLog3("dialog", "Dialog Instance", {this: app})); - // } - get template() { - return `systems/eunos-blades/templates/dialog-${v.lCase(this.dialogType)}.hbs`; - } - get hasItems() { - return Object.values(this.tabs ?? []).some((t) => t.length > 0); - } - constructSelectionData(t) { - const s = []; - if (t.tabs) { - for (const [i, r] of Object.entries(t.tabs)) - r.length === 0 ? delete t.tabs[i] : s.push(i); - s.length === 1 && !("Main" in t.tabs) && (t.tabs.Main = [...t.tabs[s[0]]], delete t.tabs[s[0]]), this.docType = t.docType, this.tabs = t.tabs, this.tags = t.tags ?? [], this.width = 150 * Math.ceil(Math.sqrt(Object.values(t.tabs)[0].length)); - } - } - // constructConsequenceData(data: BladesDialog.Data/* , options?: Partial */) { - // eLog.checkLog3("dialog", "constructConsequenceData", {incoming: {...data}}); - // if (!(this.parent instanceof BladesRoll)) { throw new Error("Cannot call 'constructConsequenceData' without a rollInst parent!"); } - // // Get existing consequence data, if any, on roll instance - // const rollCsqData = this.parent.data.consequenceData ?? {}; - // // Extend consequence data by applying new blank consequence instances, - // // so at least three csq entries are available for each position/result combination - // (Object.values(Position) as Position[]).forEach((rollPos: Position) => { - // rollCsqData[rollPos] ??= { - // [RollResult.partial]: {}, - // [RollResult.fail]: {} - // }; - // ([RollResult.partial, RollResult.fail] as const).forEach((rollResult: RollResult.partial|RollResult.fail) => { - // rollCsqData[rollPos] ??= {}; - // rollCsqData[rollPos][rollResult] ??= {}; - // while (Object.values(rollCsqData[rollPos][rollResult as RollResult.partial|RollResult.fail]).length < 3) { - // const blankCsqData: BladesConsequence.Data = { - // id: randomID() as IDString, - // name: "", - // type: "", - // attribute: "" - // }; - // rollCsqData[rollPos][rollResult as RollResult.partial|RollResult.fail][blankCsqData.id] = blankCsqData; - // } - // }); - // }); - // this._consequenceAI = new BladesAI(AGENTS.ConsequenceAdjuster); - // return rollCsqData; - // } - getData() { - const t = super.getData(); - switch (this.dialogType) { - case "Input": - return this.prepareInputData(t); - case "Selection": - return this.prepareSelectionData(t); - default: - return null; - } - } - prepareInputData(t) { - return t.prompt = this.prompt, t.target = this.target, t.flagTarget = this.flagTarget, t; - } - prepareSelectionData(t) { - return t.title = this.title, t.tabs = this.tabs, t.docType = this.docType, t.tags = this.tags, t; - } - // prepareConsequenceData(data: BladesDialog.Data) { - // eLog.checkLog3("dialog", "prepareConsequenceData this.csqData", {...this.csqData}); - // eLog.checkLog3("dialog", "prepareConsequenceData", {incoming: {...data}}); - // data.consequenceData = this.csqData; - // data.consequenceTypeOptions = this.consequenceTypeOptions; - // data.consequenceTypeOptionsAll = Object.keys(C.ConsequenceDisplay) - // .map((cType) => ({value: cType, display: cType})); - // data.consequenceAttributeOptions = [ - // {value: AttributeTrait.insight, display: "Insight"}, - // {value: AttributeTrait.prowess, display: "Prowess"}, - // {value: AttributeTrait.resolve, display: "Resolve"} - // ]; - // eLog.checkLog3("dialog", "prepareConsequenceData", {outgoing: {...data}}); - // return data; - // } - // get consequenceTypeOptions(): Record< - // Position, - // Record< - // RollResult.partial|RollResult.fail, - // Array> - // > - // > { - // if (this.parent instanceof BladesRoll) { - // const returnData: Partial> - // > - // >> = {}; - // [Position.controlled, Position.risky, Position.desperate].forEach((pos) => { - // returnData[pos] = { - // [RollResult.partial]: C.Consequences[pos][RollResult.partial] - // .map((cType) => ({value: cType, display: cType})), - // [RollResult.fail]: C.Consequences[pos][RollResult.fail] - // .map((cType) => ({value: cType, display: cType})) - // }; - // }); - // return returnData as Record< - // Position, - // Record< - // RollResult.partial|RollResult.fail, - // Array> - // > - // >; - // } - // return {} as never; - // } - updateInputText(t) { - const s = t.val(); - if (this.parent instanceof xs) { - const i = t.data("flagTarget"); - eLog.checkLog3("dialog", "updateInputText", { value: s, flagTarget: i }), this.parent.updateTarget(i, s).then(() => this.parent.renderRollCollab_SocketCall()); - } else - (this.parent instanceof te || this.parent instanceof oe) && this.parent.update({ [t.data("target")]: t.val() }); - } - // updateConsequenceType(csqElem$: JQuery, cData: BladesConsequence.Data) { - // const type$ = csqElem$.find(".roll-consequence-type-select") as JQuery; - // const typeVal = type$.val() as string|undefined; - // if (typeVal && typeVal in ConsequenceType) { - // cData.type = typeVal as ConsequenceType; - // cData.icon = C.ConsequenceIcons[cData.type]; - // cData.typeDisplay = C.ConsequenceDisplay[cData.type]; - // } - // } - // updateConsequenceAttribute(csqElem$: JQuery, cData: BladesConsequence.Data) { - // if (/Insight/.exec(cData.type)) { cData.attribute = AttributeTrait.insight; } - // else if (/Prowess/.exec(cData.type)) { cData.attribute = AttributeTrait.prowess; } - // else if (/Resolve/.exec(cData.type)) { cData.attribute = AttributeTrait.resolve; } - // else { - // const attribute$ = csqElem$.find(".roll-consequence-attribute-select") as JQuery; - // const attrVal = attribute$.val() as AttributeTrait|undefined; - // if (attrVal) { - // cData.attribute = attrVal; - // } - // } - // } - // updateConsequenceAttributeVal(cData: BladesConsequence.Data) { - // if (this.parent.rollPrimaryDoc instanceof BladesPC) { - // cData.attributeVal = this.parent.rollPrimaryDoc.attributes[cData.attribute as AttributeTrait]; - // } else if (this.parent.rollPrimaryDoc?.parent instanceof BladesPC) { - // cData.attributeVal = this.parent.rollPrimaryDoc.parent.attributes[cData.attribute as AttributeTrait]; - // } else { - // eLog.error(`Unable to get attribute from rollPrimaryDoc '${this.parent.rollPrimaryDoc?.name}' of type '${this.parent.rollPrimaryDoc?.rollPrimaryType}' (may need to log via flags if either of the previous show 'undefined'.`); - // } - // } - // getSelectedResistOption(cData: BladesConsequence.Data): BladesConsequence|false { - // return cData.resistTo - // ? new BladesConsequence(cData.resistTo) - // : false; - // } - // updateConsequenceResist(csqElem$: JQuery, cData: BladesConsequence.Data) { - // const resistOptions: Record = cData.resistOptions ?? {}; - // // If consequence is already minimal, toggle resistNegates to true and set 'resistTo' to None-type - // const minimalCsqTypes = Object.entries(C.ResistedConsequenceTypes) - // .filter(([_, rCsqType]) => rCsqType === ConsequenceType.None) - // .map(([csqType]) => csqType as ConsequenceType); - // if (minimalCsqTypes.includes(cData.type as ConsequenceType)) { - // cData.resistNegates = true; - // const noneCsq = BladesConsequence.None; - // cData.resistOptions = {[noneCsq.id]: noneCsq}; - // cData.resistTo = noneCsq; - // return; - // } else { - // // Clear 'resistTo' (will be redetermined below) - // delete cData.resistTo; - // delete cData.resistNegates; - // csqElem$.find(".consequence-resist-option").each((_, elem) => { - // const resCsqID = $(elem).data("csq-id"); - // resistOptions[resCsqID] ??= {id: resCsqID, name: "", type: undefined, isSelected: false}; - // // Update Resistance Option Type - // const resType$ = $(elem).find(".roll-consequence-type-select") as JQuery; - // const resTypeVal = resType$.val() as string|undefined; - // if (resTypeVal && resTypeVal in ConsequenceType) { - // resistOptions[resCsqID].type = resTypeVal as ConsequenceType; - // resistOptions[resCsqID].icon = C.ConsequenceIcons[resistOptions[resCsqID].type as ConsequenceType]; - // resistOptions[resCsqID].typeDisplay = C.ConsequenceDisplay[resistOptions[resCsqID].type as ConsequenceType]; - // } - // // Update Resistance Option Name - // const resName$ = $(elem).find(".consequence-name") as JQuery; - // const resNameVal = resName$.val(); - // resistOptions[resCsqID].name = resNameVal ?? ""; - // // If this is selected, update 'resistTo' data as well - // if (resistOptions[resCsqID].isSelected) { - // cData.resistTo = resistOptions[resCsqID]; - // } - // }); - // } - // cData.resistOptions = resistOptions; - // } - // updateConsequenceArmorResist(_csqElem$: JQuery, cData: BladesConsequence.Data) { - // // If consequence is already minimal, toggle armorNegates to true and set 'armorTo' to None-type - // const minimalCsqTypes = Object.entries(C.ResistedConsequenceTypes) - // .filter(([_, rCsqType]) => rCsqType === ConsequenceType.None) - // .map(([csqType]) => csqType as ConsequenceType); - // if (minimalCsqTypes.includes(cData.type as ConsequenceType)) { - // cData.armorNegates = true; - // cData.armorTo = BladesConsequence.None; - // } else { - // delete cData.armorNegates; - // cData.armorTo = this.getSelectedResistOption(cData); - // } - // } - // updateConsequenceSpecialArmorResist(_csqElem$: JQuery, cData: BladesConsequence.Data) { - // // If consequence is already minimal, toggle specialArmorNegates to true and set 'specialTo' to None-type - // const minimalCsqTypes = Object.entries(C.ResistedConsequenceTypes) - // .filter(([_, rCsqType]) => rCsqType === ConsequenceType.None) - // .map(([csqType]) => csqType as ConsequenceType); - // if (minimalCsqTypes.includes(cData.type as ConsequenceType)) { - // cData.specialArmorNegates = true; - // cData.specialTo = BladesConsequence.None; - // } else { - // delete cData.specialArmorNegates; - // cData.specialArmorNegates ??= false; - // cData.specialTo = this.getSelectedResistOption(cData); - // } - // } - // updateConsequenceData( - // html: JQuery, - // cData: BladesConsequence.Data - // ) { - // const csqElem$ = html.find(`.roll-consequence-row[data-csq-id='${cData.id}']`); - // // Update Type - // this.updateConsequenceType(csqElem$, cData); - // // Update Name - // if (cData.type === ConsequenceType.None) { - // cData.name = ""; - // } else { - // const name$ = csqElem$.find(".consequence-name") as JQuery; - // const nameVal = name$.val(); - // cData.name = nameVal ?? ""; - // } - // // Update Resistance Attribute - // this.updateConsequenceAttribute(csqElem$, cData); - // this.updateConsequenceAttributeVal(cData); - // // Update Resistance Options - // this.updateConsequenceResist(csqElem$, cData); - // // Update Armor Options - // if (( this.parent).canResistWithArmor(cData)) { - // cData.isDisplayingArmorToggle = true; - // this.updateConsequenceArmorResist(csqElem$, cData); - // } else { - // cData.isDisplayingArmorToggle = false; - // } - // // Update Special Armor Options - // if (( this.parent).canResistWithSpecialArmor(cData)) { - // cData.isDisplayingSpecialArmorToggle = true; - // this.updateConsequenceSpecialArmorResist(csqElem$, cData); - // } else { - // cData.isDisplayingSpecialArmorToggle = false; - // } - // return cData; - // } - // updateConsequenceDialog(html: JQuery, isRendering = true) { - // if (!(this.parent instanceof BladesRoll)) { return; } - // if (!this.csqData) { return; } - // eLog.checkLog3("dialog", "updateConsequenceDialog() this.csqData INCOMING", {...this.csqData}); - // const {csqData} = this; - // const {rollPrimaryDoc} = this.parent; - // if (!(rollPrimaryDoc instanceof BladesPC)) { return; } - // (Object.keys(csqData) as Position[]).forEach((rollPos) => { - // const positionCsqData = csqData[rollPos]; - // (Object.keys(csqData[rollPos]) as [RollResult.partial, RollResult.fail]).forEach((rollResult) => { - // positionCsqData[rollResult] = U.objMap( - // positionCsqData[rollResult], - // (cData: BladesConsequence.Data) => this.updateConsequenceData(html, cData) - // ); - // }); - // csqData[rollPos] = positionCsqData; - // }); - // this.csqData = csqData; - // eLog.checkLog3("dialog", "updateConsequenceDialog() this.csqData OUTGOING", {...this.csqData}); - // if (isRendering) { - // this.render(); - // } - // } - // async writeToRollInstance(html: JQuery) { - // if (this.parent instanceof BladesRoll) { - // this.updateConsequenceDialog(html, false); - // await this.parent.updateTarget("consequenceData", this.csqData); - // } - // } - // _consequenceAI?: BladesAI; - // getCsqDataFromElem(elem: HTMLElement, paramCount = 3): string[] { - // const dataAction = elem.dataset.action; - // if (dataAction) { - // const params = dataAction.split(/-/).reverse().slice(0, paramCount); - // return params.reverse(); - // } - // return []; - // } - // async queryAI(event: ClickEvent) { - // if (!this.csqData) { return; } - // // If the AI generator has not been initialized, do so. - // if (!this._consequenceAI) { - // this._consequenceAI = new BladesAI(AGENTS.ConsequenceAdjuster); - // } - // const [rollPosition, rollResult, csqID] = this.getCsqDataFromElem(event.currentTarget); - // const csqName: string|undefined = - // this.csqData[rollPosition as Position][rollResult as RollResult.partial|RollResult.fail][csqID]?.name; - // if (csqName) { - // const response = await this._consequenceAI?.query(csqName, csqName); - // if (response) { - // this.refreshResistanceOptions(rollPosition as Position, rollResult as RollResult.partial|RollResult.fail, csqID, response.split("|")); - // } - // } - // } - // async spawnBlankResistOption(event: ClickEvent) { - // if (!this.csqData) { return; } - // const [rollPosition, rollResult, csqID] = this.getCsqDataFromElem(event.currentTarget); - // const rCsqID = randomID() as IDString; - // this.csqData[rollPosition as Position][rollResult as RollResult.partial|RollResult.fail][csqID] - // .resistOptions = { - // [rCsqID]: { - // id: rCsqID, - // name: "", - // type: undefined, - // isSelected: true - // } - // }; - // this.render(); - // } - // async setFlagVal(target: string, value: unknown) { - // if (this.parent instanceof BladesRoll) { - // await this.parent.updateTarget(target, value); - // } - // } - // async refreshResistanceOptions(rollPosition: Position, rollResult: RollResult, cID: string, rOptions: string[]) { - // if (!this.csqData) { return; } - // const cData = this.csqData[rollPosition][rollResult as RollResult.partial|RollResult.fail][cID]; - // if (!cData) { return; } - // const cType = cData.type as keyof typeof C["ResistedConsequenceTypes"]; - // const rType = C.ResistedConsequenceTypes[cType] ?? undefined; - // const resistOptions: Record = {}; - // for (let i = 0; i < rOptions.length; i++) { - // const rID = randomID() as IDString; - // resistOptions[rID] = { - // id: rID, - // name: rOptions[i], - // isSelected: false - // }; - // if (rType) { - // resistOptions[rID].type = rType; - // resistOptions[rID].typeDisplay = C.ConsequenceDisplay[rType]; - // resistOptions[rID].icon = C.ConsequenceIcons[rType]; - // } - // } - // this.csqData[rollPosition][rollResult as RollResult.partial|RollResult.fail][cID].resistOptions = resistOptions; - // eLog.checkLog3("dialog", "addResistanceOptions() this.csqData", {...this.csqData}); - // this.render(); - // } - // async selectResistOption(event: ClickEvent) { - // if (!this.csqData) { return; } - // const [rollPosition, rollResult, csqID, resID] = this.getCsqDataFromElem(event.currentTarget, 4); - // eLog.checkLog3("dialog", "... Action Passed", {rollResult, csqIndex: csqID, resIndex: resID}); - // // Get consequence data - // const cData = this.csqData[rollPosition as Position][rollResult as RollResult.partial|RollResult.fail][csqID]; - // cData.resistOptions ??= {}; - // // Toggle clicked resistance option - // cData.resistOptions[resID].isSelected = !cData.resistOptions[resID].isSelected; - // // If resistance option is now selected... - // if (cData.resistOptions[resID].isSelected) { - // // ... deselect & hide other options - // Object.keys(cData.resistOptions) - // .filter((key) => key !== resID) - // .forEach((key) => { - // Object.assign(cData.resistOptions?.[key] ?? {}, {isSelected: false, isVisible: false}); - // }); - // // ... and set 'resistTo' to this consequence. - // cData.resistTo = cData.resistOptions[resID]; - // } else { - // // Otherwise, set 'resistTo' to false... - // cData.resistTo = false; - // // ... and unhide other options. - // Object.keys(cData.resistOptions) - // .filter((key) => key !== resID) - // .forEach((key) => { - // Object.assign(cData.resistOptions?.[key] ?? {}, {isVisible: true}); - // }); - // } - // // Assign new cData instance. - // this.csqData[rollPosition as Position][rollResult as RollResult.partial|RollResult.fail][csqID] = cData; - // this.render(); - // } - // async clearResistOptions(event: ContextMenuEvent) { - // if (!this.csqData) { return; } - // const [rollPosition, rollResult, csqID] = this.getCsqDataFromElem(event.currentTarget); - // this.csqData[rollPosition as Position][rollResult as RollResult.partial|RollResult.fail][csqID].resistOptions = {}; - // this.render(); - // } - // async toggleArmor(event: ClickEvent) { - // if (!this.csqData) { return; } - // const [rollPosition, rollResult, csqID] = this.getCsqDataFromElem(event.currentTarget); - // const cData = this.csqData[rollPosition as Position][rollResult as RollResult.partial|RollResult.fail][csqID]; - // cData.canArmor = !cData.canArmor; - // this.render(); - // } - // async toggleSpecialArmor(event: ClickEvent) { - // if (!this.csqData) { return; } - // const [rollPosition, rollResult, csqID] = this.getCsqDataFromElem(event.currentTarget); - // const cData = this.csqData[rollPosition as Position][rollResult as RollResult.partial|RollResult.fail][csqID]; - // cData.canSpecialArmor = !cData.canSpecialArmor; - // this.render(); - // } - activateListeners(t) { - switch (super.activateListeners(t), Or(t), this.dialogType) { - case "Input": - this.activateInputListeners(t); - break; - case "Selection": - this.activateSelectionListeners(t); - break; - } - } - activateInputListeners(t) { - t.find("textarea").on({ change: (s) => this.updateInputText($(s.currentTarget)) }); - } - activateSelectionListeners(t) { - const s = this; - t.find(".nav-tabs .tab-selector").on("click", (i) => { - const r = v.pInt($(i.currentTarget).data("tab")), o = Object.values(s.tabs ?? [])[r].length, n = v.pInt(150 * Math.ceil(Math.sqrt(o))); - eLog.checkLog3("nav", "Nav Tab Size Recalculation", { tabIndex: r, numItems: o, width: n }), this.render(!1, { width: n }); - }), t.find("[data-item-id]").on("click", function() { - if ($(this).parent().hasClass("locked")) - return; - const i = $(this).data("itemId"), r = $(this).data("docType"); - eLog.checkLog("dialog", "[BladesDialog] on Click", { elem: this, docId: i, docType: r, parent: s.parent }), s.parent instanceof oe && (r === "Actor" ? s.parent.addSubActor(i, s.tags) : r === "Item" && s.parent.addSubItem(i)), s.close(); - }); - } - async close() { - $("#eunos-blades-tooltips > *").remove(), super.close(); - } - // activateConsequenceListeners(html: JQuery) { - // html.find("input").on({change: () => this.updateConsequenceDialog(html)}); - // html.find("select").on({change: () => this.updateConsequenceDialog(html)}); - // html.find('[data-action^="ai-query"]').on({ - // click: (event) => this.queryAI(event), - // contextmenu: (event) => this.clearResistOptions(event) - // }); - // html.find('[data-action^="blank-option"]').on({ - // click: (event) => this.spawnBlankResistOption(event), - // contextmenu: (event) => this.clearResistOptions(event) - // }); - // html.find('[data-action^="gm-select-toggle"]').on({click: (event) => this.selectResistOption(event) }); - // html.find('[data-action^="toggle-armor"]').on({click: (event) => this.toggleArmor(event) }); - // html.find('[data-action^="toggle-special"]').on({click: (event) => this.toggleSpecialArmor(event) }); - // } -} -var Ph = ((a) => (a[a.CharacterCrew = he.PC.CharacterCrew] = "CharacterCrew", a[a.VicePurveyor = he.NPC.VicePurveyor] = "VicePurveyor", a))(Ph || {}), Mh = ((a) => (a[a.background = x.background] = "background", a[a.vice = x.vice] = "vice", a[a.crew_playbook = x.crew_playbook] = "crew_playbook", a[a.crew_reputation = x.crew_reputation] = "crew_reputation", a[a.heritage = x.heritage] = "heritage", a[a.playbook = x.playbook] = "playbook", a[a.preferred_op = x.preferred_op] = "preferred_op", a))(Mh || {}); -class Ee extends Actor { - constructor() { - super(...arguments); - // #endregion - // #region BladesSubActor Implementation ~ - Z(this, "parentActor"); - } - // #region Static Overrides: Create ~ - static async create(t, s = {}) { - return t.token = t.token || {}, t.system = t.system ?? {}, t.system.world_name = t.system.world_name ?? t.name.replace(/[^A-Za-z_0-9 ]/g, "").trim().replace(/ /g, "_"), await super.create(t, s); - } - // #endregion - // #region BladesDocument Implementation ~ - static get All() { - return game.actors; - } - static Get(t) { - return t instanceof Ee ? t : v.isDocID(t) ? Ee.All.get(t) : Ee.All.find((s) => s.system.world_name === t) || Ee.All.find((s) => s.name === t); - } - static GetTypeWithTags(t, ...s) { - return Ee.All.filter((i) => i.type === t).filter((i) => i.hasTag(...s)); - } - static IsType(t, ...s) { - const i = new Set(s); - return t instanceof Ee && i.has(t.type); - } - get tags() { - return this.system.tags ?? []; - } - hasTag(...t) { - return t.every((s) => this.tags.includes(s)); - } - async addTag(...t) { - const s = this.tags; - t.forEach((i) => { - s.includes(i) || s.push(i); - }), eLog.checkLog2("actor", "BladesActor.addTag(...tags)", { tags: t, curTags: s }), await this.update({ "system.tags": s }); - } - async remTag(...t) { - const s = this.tags.filter((i) => !t.includes(i)); - eLog.checkLog2("actor", "BladesActor.remTag(...tags)", { tags: t, curTags: s }), await this.update({ "system.tags": s }); - } - get tooltip() { - const t = [this.system.concept, this.system.subtitle].filter(Boolean).join("

"); - return t ? new Handlebars.SafeString(t).toString() : void 0; - } - get dialogCSSClasses() { - return ""; - } - getFactorTotal(t) { - var s; - switch (t) { - case H.tier: - return Ee.IsType(this, z.pc) ? this.system.tier.value + (((s = this.crew) == null ? void 0 : s.getFactorTotal(H.tier)) ?? 0) : this.system.tier.value; - case H.quality: - return this.getFactorTotal(H.tier); - case H.scale: - return Ee.IsType(this, z.npc) ? this.system.scale : 0; - case H.magnitude: - return Ee.IsType(this, z.npc) ? this.system.magnitude : 0; - default: - return 0; - } - } - // #endregion - // #region SubActorControl Implementation ~ - get subActors() { - return Object.keys(this.system.subactors).map((t) => this.getSubActor(t)).filter((t) => !!t); - } - get activeSubActors() { - return this.subActors.filter((t) => !t.hasTag(he.System.Archived)); - } - get archivedSubActors() { - return this.subActors.filter((t) => t.hasTag(he.System.Archived)); - } - checkActorPrereqs(t) { - return !!t; - } - processEmbeddedActorMatches(t) { - return t.filter(this.checkActorPrereqs).filter((s) => !this.activeSubActors.some((i) => i.id === s.id)).map((s) => this.getSubActor(s) || s).sort((s, i) => s.name === i.name ? 0 : s.name === null ? 1 : i.name === null ? -1 : s.name > i.name ? 1 : s.name < i.name ? -1 : 0); - } - getDialogActors(t) { - var i; - const s = {}; - switch (t) { - case pt.Contact: - case pt.Rival: - case pt.Friend: - case pt.Acquaintance: - return !Ee.IsType(this, z.pc, z.crew) || this.playbookName === null ? !1 : (s.Main = this.processEmbeddedActorMatches( - Ee.GetTypeWithTags(z.npc, this.playbookName) - ), s); - case pt.VicePurveyor: - return !Ee.IsType(this, z.pc) || !((i = this.vice) != null && i.name) ? !1 : (s.Main = this.processEmbeddedActorMatches( - Ee.GetTypeWithTags(z.npc, this.vice.name) - ), s); - case pt.Crew: - return s.Main = Ee.GetTypeWithTags(z.crew), s; - default: - return !1; - } - } - async addSubActor(t, s) { - let i; - if (this.hasSubActorOf(t)) { - const o = this.getSubActor(t); - if (!o) - return; - o.hasTag(he.System.Archived) && await o.remTag(he.System.Archived), i = o; - } else { - const o = Ee.Get(t); - if (!o) - return; - const n = {}; - s && (n.tags = v.unique([ - ...o.tags, - ...s - ])), await this.update({ [`system.subactors.${o.id}`]: n }), i = this.getSubActor(o.id); - } - if (!i) - return; - const r = i.tags.filter((o) => o in Ph); - r.length > 0 && r.forEach((o) => this.activeSubActors.filter( - (n) => !!(i != null && i.id && n.id !== i.id && n.hasTag(o)) - ).map((n) => this.remSubActor(n.id))); - } - getSubActor(t) { - const s = Ee.Get(t); - if (!(s != null && s.id)) - return; - if (!Ee.IsType(s, z.npc, z.faction)) - return s; - const i = this.system.subactors[s.id] ?? {}; - return Object.assign( - s.system, - i - ), s.parentActor = this, s; - } - hasSubActorOf(t) { - const s = Ee.Get(t); - return s && s != null && s.id ? s.id in this.system.subactors : !1; - } - async updateSubActor(t, s) { - const i = v.objExpand(s); - if (!i.system) - return; - const r = Ee.Get(t); - if (!r) - return; - const o = v.objDiff(r.system, i.system), n = v.objMerge( - this.system.subactors[r.id] ?? {}, - o, - { isReplacingArrays: !0, isConcatenatingArrays: !1 } - ); - if (JSON.stringify(this.system.subactors[r.id]) !== JSON.stringify(n)) - return this.update({ [`system.subactors.${r.id}`]: null }, void 0, !0).then(() => this.update({ [`system.subactors.${r.id}`]: n }, void 0, !0)).then(() => { - var l; - return (l = r.sheet) == null ? void 0 : l.render(); - }); - } - async remSubActor(t) { - const s = this.getSubActor(t); - s && await this.update({ "system.subactors": mergeObject(this.system.subactors, { [`-=${s.id}`]: null }) }, void 0, !0); - } - async clearSubActors(t = !0) { - var s; - this.subActors.forEach((i) => { - var r; - ((r = i.parentActor) == null ? void 0 : r.id) === this.id && i.clearParentActor(t); - }), await ((s = this.sheet) == null ? void 0 : s.render()); - } - async clearParentActor(t = !0) { - var i; - const { parentActor: s } = this; - s && (this.parentActor = void 0, this.system = this._source.system, this.ownership = this._source.ownership, this.prepareData(), t && await ((i = this.sheet) == null ? void 0 : i.render())); - } - // #endregion - // #region SubItemControl Implementation ~ - get subItems() { - return Array.from(this.items); - } - getSubItemsOfType(t) { - return this.items.filter((s) => s.type === t); - } - get activeSubItems() { - return this.items.filter((t) => !t.hasTag(he.System.Archived)); - } - get archivedSubItems() { - return this.items.filter((t) => t.hasTag(he.System.Archived)); - } - _checkItemPrereqs(t) { - if (!t.system.prereqs) - return !0; - for (const [s, i] of Object.entries( - t.system.prereqs - )) { - const r = Array.isArray(i) ? i : [i.toString()], o = {}; - if (!this._processPrereqArray(r, s, o)) - return !1; - } - return !0; - } - _processPrereqArray(t, s, i) { - for (; t.length; ) { - const r = t.pop(); - if (i[s] ?? (i[s] = []), !this._processPrereqType(s, r, i)) - return !1; - } - return !0; - } - _processPrereqType(t, s, i) { - switch (t) { - case to.HasActiveItem: - return this._processActiveItemPrereq(s, i, t); - case to.HasActiveItemsByTag: - return this._processActiveItemsByTagPrereq(s, i, t); - case to.AdvancedPlaybook: - return this._processAdvancedPlaybookPrereq(); - default: - return !0; - } - } - _processActiveItemPrereq(t, s, i) { - var o; - const r = this.activeSubItems.filter((n) => { - var l; - return !((l = s[i]) != null && l.includes(n.id)); - }).find((n) => n.system.world_name === t); - return r ? ((o = s[i]) == null || o.push(r.id), !0) : !1; - } - _processActiveItemsByTagPrereq(t, s, i) { - var o; - const r = this.activeSubItems.filter((n) => { - var l; - return !((l = s[i]) != null && l.includes(n.id)); - }).find((n) => n.hasTag(t)); - return r ? ((o = s[i]) == null || o.push(r.id), !0) : !1; - } - _processAdvancedPlaybookPrereq() { - return !(!Ee.IsType(this, z.pc) || !this.playbookName || ![ra.Ghost, ra.Hull, ra.Vampire].includes(this.playbookName)); - } - _processEmbeddedItemMatches(t) { - return t.filter((s) => this._checkItemPrereqs(s)).filter((s) => s.hasTag(he.System.MultiplesOK) || (s.system.max_per_score ?? 1) > this.activeSubItems.filter((i) => i.system.world_name === s.system.world_name).length).map((s) => { - const i = this.archivedSubItems.filter((r) => r.system.world_name === s.system.world_name); - return i.length > 0 ? i : s; - }).flat().map((s) => { - s.dialogCSSClasses = ""; - const i = []; - return s.isEmbedded && i.push("embedded"), s.hasTag(he.Gear.Fine) && i.push("fine-quality"), s.hasTag(he.System.Featured) && i.push("featured-item"), [x.ability, x.crew_ability].includes(s.type) && (this.getAvailableAdvancements("Ability") === 0 ? i.push("locked") : (s.system.price ?? 1) > this.getAvailableAdvancements("Ability") ? i.push("locked", "unaffordable") : (s.system.price ?? 1) > 1 && i.push("expensive")), [x.crew_upgrade].includes(s.type) && (this.getAvailableAdvancements("Upgrade") === 0 ? i.push("locked") : (s.system.price ?? 1) > this.getAvailableAdvancements("Upgrade") ? i.push("locked", "unaffordable") : (s.system.price ?? 1) > 1 && i.push("expensive")), i.length > 0 && (s.dialogCSSClasses = i.join(" ")), s; - }).sort((s, i) => s.hasTag(he.System.Featured) && !i.hasTag(he.System.Featured) ? -1 : !s.hasTag(he.System.Featured) && i.hasTag(he.System.Featured) ? 1 : s.hasTag(he.Gear.Fine) && !i.hasTag(he.Gear.Fine) ? -1 : !s.hasTag(he.Gear.Fine) && i.hasTag(he.Gear.Fine) || s.system.world_name > i.system.world_name ? 1 : s.system.world_name < i.system.world_name || s.isEmbedded && !i.isEmbedded ? -1 : !s.isEmbedded && i.isEmbedded ? 1 : s.name === i.name ? 0 : s.name === null ? 1 : i.name === null ? -1 : s.name > i.name ? 1 : s.name < i.name ? -1 : 0); - } - getSubItem(t, s = !1) { - const i = (r) => !s || !r.hasTag(he.System.Archived); - if (typeof t == "string" && this.items.get(t)) { - const r = this.items.get(t); - return r && i(r) ? r : void 0; - } else { - const r = te.Get(t); - return r ? this.items.find((o) => o.name === r.name && i(o)) ?? this.items.find((o) => o.system.world_name === r.system.world_name && i(o)) : void 0; - } - } - hasSubItemOf(t) { - const s = te.Get(t); - return s ? !!this.items.find((i) => i.system.world_name === s.system.world_name) : !1; - } - hasActiveSubItemOf(t) { - const s = te.Get(t); - return s ? !!this.items.find((i) => !i.hasTag(he.System.Archived) && i.system.world_name === s.system.world_name) : !1; - } - async addSubItem(t) { - function s(o) { - return Object.values(Mh).includes(o); - } - eLog.checkLog3("subitems", "[addSubItem] itemRef", t); - let i; - const r = this.getSubItem(t); - if (r) - r.hasTag(he.System.Archived) ? (await r.remTag(he.System.Archived), i = r, eLog.checkLog3("subitems", `[addSubItem] IS ARCHIVED EMBEDDED > Removing 'Archived' Tag, '${i.id}':`, i)) : (i = await te.create( - [r], - { parent: this } - ), eLog.checkLog3("subitems", `[addSubItem] IS ACTIVE EMBEDDED > Duplicating, focusItem '${i.id}':`, i)); - else { - const o = te.Get(t); - if (eLog.checkLog3("subitems", `[addSubItem] IS NOT EMBEDDED > Fetching Global, globalItem '${o == null ? void 0 : o.id}':`, o), !o) - return; - i = await te.create( - [o], - { parent: this } - ), i = this.items.getName(o.name); - } - i && s(i.type) && await Promise.all(this.activeSubItems.filter((o) => o.type === (i == null ? void 0 : i.type) && o.system.world_name !== (i == null ? void 0 : i.system.world_name) && !o.hasTag(he.System.Archived)).map(this.remSubItem.bind(this))); - } - async remSubItem(t) { - const s = this.getSubItem(t); - if (s) { - if (s.type !== x.gear) { - this.purgeSubItem(t); - return; - } - eLog.checkLog("actorTrigger", `Removing SubItem ${s.name}`, s), !s.hasTag(he.System.Archived) && await s.addTag(he.System.Archived); - } - } - async purgeSubItem(t) { - const s = this.getSubItem(t); - !s || s.hasTag(he.System.Archived) || await s.delete(); - } - // #endregion - // #region Advancement Implementation ~ - // get totalAbilityPoints(): number { - // if (!BladesActor.IsType(this, BladesActorType.pc, BladesActorType.crew)) { return 0 } - // if (!this.playbook) { return 0 } - // switch (this.type) { - // case BladesActorType.pc: return this.system.advancement.ability ?? 0; - // case BladesActorType.crew: return Math.floor(0.5 * (this.system.advancement.general ?? 0)) - // + (this.system.advancement.ability ?? 0); - // default: return 0; - // } - // } - // get spentAbilityPoints(): number { - // if (!BladesActor.IsType(this, BladesActorType.pc, BladesActorType.crew)) { return 0 } - // if (!this.playbook) { return 0 } - // return this.abilities.reduce((total, ability) => total + (ability.system.price ?? 1), 0); - // } - // get getAvailableAdvancements("Ability")(): number { - // if (!BladesActor.IsType(this, BladesActorType.pc, BladesActorType.crew)) { return 0 } - // if (!this.playbook) { return 0 } - // return this.totalAbilityPoints - this.spentAbilityPoints; - // } - /* Need simple getters for total ability & upgrade points that check for PRICES of items - (upgrade.system.price ?? 1) */ - async grantAdvancementPoints(t, s = 1) { - var r; - const i = Array.isArray(t) ? [...t].sort((o, n) => o.localeCompare(n)).join("_") : t; - await this.update({ [`system.advancement_points.${i}`]: (((r = this.system.advancement_points) == null ? void 0 : r[i]) ?? 0) + s }); - } - async removeAdvancementPoints(t, s = 1) { - var o; - const i = Array.isArray(t) ? [...t].sort((n, l) => n.localeCompare(l)).join("_") : t, r = ((o = this.system.advancement_points) == null ? void 0 : o[i]) ?? 0 - s; - r <= 0 && i in (this.system.advancement_points ?? []) ? await this.update({ [`system.advancement_points.-=${i}`]: null }) : await this.update({ [`system.advancement_points.${i}`]: r }); - } - getAvailableAdvancements(t) { - var T, S, C, I, E; - if (!Ee.IsType(this, z.pc, z.crew)) - return 0; - if (t in Is) - return 1; - if (t === "Cohort") { - const F = ((T = this.system.advancement_points) == null ? void 0 : T[hi.Cohort]) ?? 0, O = this.cohorts.length; - return Math.max(0, F - O); - } - const s = ((S = this.system.advancement_points) == null ? void 0 : S[hi.Ability]) ?? 0, i = ((C = this.system.advancement_points) == null ? void 0 : C[hi.CohortType]) ?? 0, r = ((I = this.system.advancement_points) == null ? void 0 : I[hi.Upgrade]) ?? 0, o = ((E = this.system.advancement_points) == null ? void 0 : E[hi.UpgradeOrAbility]) ?? 0, n = v.sum(this.items.filter((F) => te.IsType(F, x.ability, x.crew_ability)).map((F) => F.system.price ?? 1)), l = v.sum( - this.cohorts.map((F) => Math.max(0, v.unique(Object.values(F.system.subtypes)).length - 1)) - ), c = v.sum(this.items.filter((F) => te.IsType(F, x.crew_upgrade)).map((F) => F.system.price ?? 1)), u = Math.max(0, c - r), g = Math.max(0, l - i), f = Math.max(0, n - s), h = Math.max(0, s - n), m = Math.max(0, i - l), y = Math.max(0, r - c), k = Math.max( - 0, - o - u - 2 * f - 2 * g - ); - return t === "Ability" ? h + Math.floor(0.5 * k) : t === "Upgrade" ? y + k : t === "CohortType" ? m + k : 0; - } - get availableAbilityPoints() { - return this.getAvailableAdvancements("Ability"); - } - get availableUpgradePoints() { - return this.getAvailableAdvancements("Upgrade"); - } - get availableCohortPoints() { - return this.getAvailableAdvancements("Cohort"); - } - get availableCohortTypePoints() { - return this.getAvailableAdvancements("CohortType"); - } - get canPurchaseAbility() { - return this.availableAbilityPoints > 0; - } - get canPurchaseUpgrade() { - return this.availableUpgradePoints > 0; - } - get canPurchaseCohort() { - return this.availableCohortPoints > 0; - } - get canPurchaseCohortType() { - return this.availableCohortTypePoints > 0; - } - async advancePlaybook() { - if (!(!Ee.IsType(this, z.pc, z.crew) || !this.playbook)) { - if (await this.update({ "system.experience.playbook.value": 0 }), this instanceof Te) { - kt.getInstance().pushNotice_SocketCall( - "ALL", - { - title: `${this.name} Advances their Playbook!`, - body: `${this.name}, select a new Ability on your Character Sheet.`, - type: Ds.push, - cssClasses: "advancement-alert" - } - ), this.grantAdvancementPoints(hi.Ability); - return; - } - if (this instanceof Lt) { - kt.getInstance().pushNotice_SocketCall( - "ALL", - { - title: "You Advance your Crew Playbook!", - body: "Select new Upgrades and/or Abilities on your Crew Sheet.", - type: Ds.push, - cssClasses: "advancement-alert crew-advancement-alert" - } - ); - const t = this.system.tier.value + 2; - this.members.forEach((s) => { - var i, r; - (i = s.primaryUser) != null && i.id && (kt.getInstance().pushNotice_SocketCall( - (r = s.primaryUser) == null ? void 0 : r.id, - { - title: "Your Stash Increases! (Crew Advancement)", - type: Ds.push, - body: `You gain ${t} Stash from Crew Advancement.`, - cssClasses: "stash-alert" - } - ), s.addStash(t)); - }), this.grantAdvancementPoints(hi.UpgradeOrAbility, 2); - } - } - } - async advanceAttribute(t) { - var i; - if (!(this instanceof Te) || !((i = this.primaryUser) != null && i.id)) - return; - await this.update({ [`system.experience.${t}.value`]: 0 }); - const s = Y.Action[t].map((r) => `${v.tCase(r)}`); - kt.getInstance().pushNotice_SocketCall( - this.primaryUser.id, - { - title: `${this.name} Advances their ${v.uCase(t)}!`, - body: `${this.name}, add a dot to one of ${v.oxfordize(s, !0, "or")}.`, - type: Ds.push, - cssClasses: "advancement-alert" - } - ); - } - get isAtWar() { - var t; - return Br.IsType(this) ? !1 : Te.IsType(this) ? ((t = this.crew) == null ? void 0 : t.isAtWar) ?? !1 : Object.values(this.system.at_war_with ?? {}).filter((s) => s === !0).length > 0; - } - get isSubActor() { - return this.parentActor !== void 0; - } - // #endregion - // #region BladesRoll Implementation ~ - get rollPrimaryModsSchemaSet() { - return ti.ParseDocModsToSchemaSet(this); - } - get rollFactors() { - return { - [H.tier]: { - name: H.tier, - display: "Tier", - value: this.getFactorTotal(H.tier), - max: this.getFactorTotal(H.tier), - baseVal: this.getFactorTotal(H.tier), - isActive: !0, - isPrimary: !0, - isDominant: !1, - highFavorsPC: !0 - }, - [H.quality]: { - name: H.quality, - display: "Quality", - value: this.getFactorTotal(H.quality), - max: this.getFactorTotal(H.quality), - baseVal: this.getFactorTotal(H.quality), - isActive: !1, - isPrimary: !1, - isDominant: !1, - highFavorsPC: !0 - } - }; - } - // #region BladesRoll.PrimaryDoc Implementation - get rollPrimaryID() { - return this.id; - } - get rollPrimaryDoc() { - return this; - } - get rollPrimaryName() { - return this.name; - } - get rollPrimaryType() { - if (![z.pc, z.crew].includes(this.type)) - throw new Error(`BladesActor of type '${this.type}' ("${this.name}") cannot be RollPrimary.`); - return this.type; - } - get rollPrimaryImg() { - return this.img; - } - // #endregion - // #endregion - // #region BladesCrew Implementation ~ - // #endregion - // #region PREPARING DERIVED DATA ~ - prepareDerivedData() { - Ee.IsType(this, z.pc) && this._preparePCData(this.system), Ee.IsType(this, z.crew) && this._prepareCrewData(this.system); - } - _preparePCData(t) { - Ee.IsType(this, z.pc) && (this.playbook && (t.experience.clues = [ - ...t.experience.clues, - ...Object.values(this.playbook.system.experience_clues).filter((s) => !!s.trim()) - ]), this.playbook && (t.gather_info = [ - ...t.gather_info, - ...Object.values(this.playbook.system.gather_info_questions).filter((s) => !!s.trim()) - ])); - } - _prepareCrewData(t) { - Ee.IsType(this, z.crew) && this.playbook && (t.experience.clues = [ - ...t.experience.clues, - ...Object.values(this.playbook.system.experience_clues).filter((s) => !!s.trim()) - ], t.turfs = this.playbook.system.turfs); - } - // #endregion - // #region OVERRIDES: _onCreateDescendantDocuments, update ~ - // @ts-expect-error New method not defined in @league VTT types. - async _onCreateDescendantDocuments(t, s, i, r, o, n) { - await Promise.all(i.map(async (l) => { - te.IsType(l, x.playbook, x.crew_playbook) && await Promise.all(this.activeSubItems.filter((c) => c.type === l.type && c.system.world_name !== l.system.world_name).map((c) => this.remSubItem(c))); - })), await super._onCreateDescendantDocuments(t, s, i, r, o, n), eLog.checkLog("actorTrigger", "_onCreateDescendantDocuments", { parent: t, collection: s, docs: i, data: r, options: o, userId: n }), i.forEach((l) => { - te.IsType(l, x.vice) && Ee.IsType(this, z.pc) && this.activeSubActors.filter((c) => c.hasTag(he.NPC.VicePurveyor) && !c.hasTag(l.name)).forEach((c) => { - this.remSubActor(c); - }); - }); - } - async update(t, s, i = !1) { - if (!t) - return super.update(t); - if (Ee.IsType(this, z.crew)) { - if (!this.playbook) - return; - eLog.checkLog("actorTrigger", "Updating Crew", { updateData: t }); - const r = Object.fromEntries( - Object.entries(flattenObject(t)).filter(([n, l]) => n.startsWith("system.turfs.")) - ); - t = Object.fromEntries(Object.entries(flattenObject(t)).filter(([n, l]) => !n.startsWith("system.turfs."))), eLog.checkLog("actorTrigger", "Updating Crew", { crewUpdateData: t, playbookUpdateData: r }); - const o = diffObject( - flattenObject(this.playbook), - r - ); - delete o._id, v.isEmpty(o) || await this.playbook.update(r, s).then(() => { - var n; - return (n = this.sheet) == null ? void 0 : n.render(!1); - }); - } else if ((Ee.IsType(this, z.npc) || Ee.IsType(this, z.faction)) && this.parentActor && !i) - return this.parentActor.updateSubActor(this.id, t).then(() => this); - return super.update(t, s); - } - // #endregion - // #region Rolling Dice ~ - /** - * Creates modifiers for dice roll. - * - * @param {int} rs - * Min die modifier - * @param {int} re - * Max die modifier - * @param {int} s - * Selected die - */ - createListOfDiceMods(t, s, i) { - let r = ""; - i === "" && (i = 0); - for (let o = t; o <= s; o++) { - let n = ""; - o >= 0 && (n = "+"), r += ``; - } - return r; - } - // #endregion Rolling Dice - // #region NPC Randomizers ~ - updateRandomizers() { - if (!Ee.IsType(this, z.npc)) - return; - const t = 0.05, s = 0.01, { persona: i, secret: r, random: o } = this.system; - function n(f, ...h) { - return f = f.filter((m) => !h.includes(m)), f.length ? f[Math.floor(Math.random() * f.length)] : ""; - } - const l = { - name: (f) => [ - Math.random() <= t ? n(Re.NPC.name_title) : "", - n([ - ...(f ?? "").charAt(0).toLowerCase() !== "m" ? Re.NPC.name_first.female : [], - ...(f ?? "").charAt(0).toLowerCase() !== "f" ? Re.NPC.name_first.male : [] - ]), - `"${n(Re.NPC.name_alias)}"`, - n(Re.NPC.name_surname), - Math.random() <= s ? n(Re.NPC.name_suffix) : "" - ].filter((h) => !!h).join(" "), - background: () => n(Re.NPC.background, o.background.value), - heritage: () => n(Re.NPC.heritage, o.heritage.value), - profession: () => n(Re.NPC.profession, o.profession.value), - gender: () => n(Re.NPC.gender, i.gender.value), - appearance: () => n(Re.NPC.appearance, i.appearance.value), - goal: () => n(Re.NPC.goal, i.goal.value, r.goal.value), - method: () => n(Re.NPC.method, i.method.value, r.method.value), - trait: () => n( - Re.NPC.trait, - i.trait1.value, - i.trait2.value, - i.trait3.value, - r.trait.value - ), - interests: () => n(Re.NPC.interests, i.interests.value, r.interests.value), - quirk: () => n(Re.NPC.quirk, i.quirk.value), - style: (f = "") => n([ - ...f.charAt(0).toLowerCase() !== "m" ? Re.NPC.style.female : [], - ...f.charAt(0).toLowerCase() !== "f" ? Re.NPC.style.male : [] - ], i.style.value) - }, c = i.gender.isLocked ? i.gender.value : l.gender(), u = [ - ...Object.keys(i).filter((f) => { - var h; - return !((h = i[f]) != null && h.isLocked); - }), - ...Object.keys(o).filter((f) => { - var h; - return !((h = o[f]) != null && h.isLocked); - }), - ...Object.keys(r).filter((f) => { - var h; - return !((h = r[f]) != null && h.isLocked); - }).map((f) => `secret-${f}`) - ]; - eLog.checkLog("Update Keys", { updateKeys: u }); - const g = {}; - u.forEach((f) => { - switch (f) { - case "name": - case "heritage": - case "background": - case "profession": { - const h = l[f](); - g[`system.random.${f}`] = { - isLocked: !1, - value: h || o[f].value - }; - break; - } - case "secret-goal": - case "secret-interests": - case "secret-method": { - f = f.replace(/^secret-/, ""); - const h = l[f](); - g[`system.secret.${f}`] = { - isLocked: !1, - value: h || r[f].value - }; - break; - } - case "gender": { - g[`system.persona.${f}`] = { - isLocked: i.gender.isLocked, - value: c - }; - break; - } - case "trait1": - case "trait2": - case "trait3": - case "secret-trait": { - const h = i.trait1.isLocked ? i.trait1.value : n( - Re.NPC.trait, - i.trait1.value, - i.trait2.value, - i.trait3.value, - r.trait.value - ), m = i.trait2.isLocked ? i.trait2.value : n( - Re.NPC.trait, - h, - i.trait1.value, - i.trait2.value, - i.trait3.value, - r.trait.value - ), y = i.trait3.isLocked ? i.trait3.value : n( - Re.NPC.trait, - h, - m, - i.trait1.value, - i.trait2.value, - i.trait3.value, - r.trait.value - ), k = r.trait.isLocked ? r.trait.value : n( - Re.NPC.trait, - h, - m, - y, - i.trait1.value, - i.trait2.value, - i.trait3.value, - r.trait.value - ); - i.trait1.isLocked || (g["system.persona.trait1"] = { - isLocked: !1, - value: h - }), i.trait2.isLocked || (g["system.persona.trait2"] = { - isLocked: !1, - value: m - }), i.trait3.isLocked || (g["system.persona.trait3"] = { - isLocked: !1, - value: y - }), r.trait.isLocked || (g["system.secret.trait"] = { - isLocked: !1, - value: k - }); - break; - } - default: { - const h = l[f](); - g[`system.persona.${f}`] = { - isLocked: !1, - value: h || i[f].value - }; - break; - } - } - }), this.update(g); - } - // #endregion NPC Randomizers - // Unlock lower-level update method for subclasses - async callOnUpdate(...t) { - await this._onUpdate(...t); - } -} -const oe = Ee; -class qo extends ActorSheet { - /** - * Override the default getData method to provide additional data for the actor sheet. - * This includes: cssClass, editable, isGM, actor, system, tierTotal, rollData, activeEffects, - * hasFullVision, hasLimitedVision, hasControl, preparedItems. - * @returns {BladesActorSheetData} The data object for the actor sheet. - */ - getData() { - var s, i; - const e = super.getData(), t = { - // Basic actor data. - cssClass: this.actor.type, - editable: this.options.editable, - isGM: (s = game.eunoblades.Tracker) != null && s.system.is_spoofing_player ? !1 : game.user.isGM, - actor: this.actor, - system: this.actor.system, - gamePhase: ((i = game.eunoblades.Tracker) == null ? void 0 : i.phase) || Fe.Freeplay, - tierTotal: this.actor.getFactorTotal(H.tier) > 0 ? v.romanizeNum(this.actor.getFactorTotal(H.tier)) : "0", - rollData: this.actor.getRollData(), - activeEffects: Array.from(this.actor.effects), - hasFullVision: game.user.isGM || this.actor.testUserPermission(game.user, CONST.DOCUMENT_PERMISSION_LEVELS.OBSERVER), - hasLimitedVision: game.user.isGM || this.actor.testUserPermission(game.user, CONST.DOCUMENT_PERMISSION_LEVELS.LIMITED), - hasControl: game.user.isGM || this.actor.testUserPermission(game.user, CONST.DOCUMENT_PERMISSION_LEVELS.OWNER) - }; - return (Te.IsType(this.actor) || Lt.IsType(this.actor)) && (t.preparedItems = { - abilities: [], - loadout: [], - cohorts: { - gang: this.actor.cohorts.filter((r) => r.type === x.cohort_gang).map((r) => { - const o = v.unique(Object.values(r.system.subtypes).map((c) => c.trim()).filter((c) => /[A-Za-z]/.test(c))), n = [ - ...Object.values(r.system.elite_subtypes) - ]; - Lt.IsType(r.parent) && n.push(...(r.parent.upgrades ?? []).map((c) => (c.name ?? "").trim().replace(/^Elite /, ""))); - const l = [...v.unique( - n.map((c) => c.trim()).filter( - (c) => /[A-Za-z]/.test(c) && o.includes(c) - ) - )]; - if (l.length < 2 && l.push(...o.filter((c) => !l.includes(c))), v.unique(l).length === 1) - r.system.image = Object.values(r.system.elite_subtypes).includes(l[0]) ? `elite-${v.lCase(l[0])}.svg` : `${v.lCase(l[0])}.svg`; - else if (v.unique(l).length > 1) { - const [c, u] = l; - r.system.imageLeft = Object.values(r.system.elite_subtypes).includes(u) ? `elite-${v.lCase(u)}.svg` : `${v.lCase(u)}.svg`, r.system.imageRight = Object.values(r.system.elite_subtypes).includes(c) ? `elite-${v.lCase(c)}.svg` : `${v.lCase(c)}.svg`; - } - return Object.assign( - r.system, - { - tierTotal: r.getFactorTotal(H.tier) > 0 ? v.romanizeNum(r.getFactorTotal(H.tier)) : "0", - cohortRollData: [ - { mode: "untrained", label: "Untrained", color: "transparent", tooltip: "

Roll Untrained

" } - ], - edgeData: Object.fromEntries(Object.values(r.system.edges ?? []).filter((c) => /[A-Za-z]/.test(c)).map((c) => [c.trim(), Y.EdgeTooltips[c]])), - flawData: Object.fromEntries(Object.values(r.system.flaws ?? []).filter((c) => /[A-Za-z]/.test(c)).map((c) => [c.trim(), Y.FlawTooltips[c]])) - } - ), r; - }), - expert: this.actor.activeSubItems.filter((r) => r.type === x.cohort_expert).map((r) => (Object.assign( - r.system, - { - tierTotal: r.getFactorTotal(H.tier) > 0 ? v.romanizeNum(r.getFactorTotal(H.tier)) : "0", - cohortRollData: [ - { mode: "untrained", label: "Untrained", tooltip: "

Roll Untrained

" } - ], - edgeData: Object.fromEntries(Object.values(r.system.edges ?? []).filter((o) => /[A-Za-z]/.test(o)).map((o) => [o.trim(), Y.EdgeTooltips[o]])), - flawData: Object.fromEntries(Object.values(r.system.flaws ?? []).filter((o) => /[A-Za-z]/.test(o)).map((o) => [o.trim(), Y.FlawTooltips[o]])) - } - ), r)) - }, - projects: [] - }), (oe.IsType(this.actor, z.pc) || oe.IsType(this.actor, z.crew)) && (t.playbookData = { - dotline: { - data: this.actor.system.experience.playbook, - dotlineClass: "xp-playbook", - target: "system.experience.playbook.value", - svgKey: "teeth.tall", - svgFull: "full|frame", - svgEmpty: "full|half|frame", - advanceButton: "advance-playbook" - } - }, this.actor.system.experience.playbook.value !== this.actor.system.experience.playbook.max && (t.playbookData.tooltip = new Handlebars.SafeString([ - "

At the End of the Session, Gain XP If ...

", - "
    ", - ...Object.values(this.actor.system.experience.clues ?? []).map((r) => `
  • ${r.replace(/^Y/, "... y")}
  • `) ?? [], - "
" - ].join("")).toString()), t.coinsData = { - dotline: { - data: this.actor.system.coins, - target: "system.coins.value", - iconEmpty: "coin-full.svg", - iconFull: "coin-full.svg" - } - }), { - ...e, - ...t - }; - } - // #region LISTENERS & EVENT HANDLERS - activateListeners(e) { - super.activateListeners(e), game.user.isGM ? e.attr("style", "--secret-text-display: initial") : e.find('.editor:not(.tinymce) [data-is-secret="true"]').remove(), Or(e), Ih.InitListeners(e, this.actor), this.options.editable && (e.find(".dotline").each((t, s) => { - if ($(s).hasClass("locked")) - return; - let i = this.actor, r = $(s).data("target"); - const o = $(s).closest("comp"); - if (r.startsWith("item")) { - r = r.replace(/^item\./, ""); - const l = $(s).closest("[data-comp-id]").data("compId"); - if (!l) - return; - const c = this.actor.items.get(l); - if (!c) - return; - i = c; - } - const n = v.pInt($(s).data("value")); - $(s).find(".dot").each((l, c) => { - $(c).on("click", (u) => { - u.preventDefault(); - const g = v.pInt($(c).data("value")); - g !== n && (o.hasClass("comp-coins") || o.hasClass("comp-stash") ? va.effects.fillCoins($(c).prevAll(".dot")).then(() => i.update({ [r]: g })) : i.update({ [r]: g })); - }), $(c).on("contextmenu", (u) => { - u.preventDefault(); - const g = v.pInt($(c).data("value")) - 1; - g !== n && i.update({ [r]: g }); - }); - }); - }), e.find("[data-comp-id]").find(".comp-title").on({ click: this._onItemOpenClick.bind(this) }), e.find(".comp-control.comp-add").on({ click: this._onItemAddClick.bind(this) }), e.find(".comp-control.comp-delete").on({ click: this._onItemRemoveClick.bind(this) }), e.find(".comp-control.comp-delete-full").on({ click: this._onItemFullRemoveClick.bind(this) }), e.find(".comp-control.comp-toggle").on({ click: this._onItemToggleClick.bind(this) }), e.find(` - select[data-action='player-select'], - select[data-action='gm-select'] - `).on({ change: this._onSelectChange.bind(this) }), e.find("[data-action='toggle-value'").on({ click: this._onToggleValueClick.bind(this) }), e.find(".advance-button").on({ click: this._onAdvanceClick.bind(this) }), e.find(".effect-control").on({ click: this._onActiveEffectControlClick.bind(this) }), e.find("[data-roll-trait]").on({ click: this._onRollTraitClick.bind(this) }), e.find("[data-action*='downtime-action-']").on({ click: this._onDowntimeActionClick.bind(this) }), this.options.submitOnChange && e.on("change", "textarea", this._onChangeInput.bind(this))); - } - async _onSubmit(e, t = {}) { - return !game.user.isGM && !this.actor.testUserPermission(game.user, CONST.DOCUMENT_PERMISSION_LEVELS.OWNER) ? (eLog.checkLog("actorSheetTrigger", "User does not have permission to edit this actor", { user: game.user, actor: this.actor }), {}) : super._onSubmit(e, t); - } - async close(e) { - return this.actor.type === z.pc ? super.close(e).then(() => this.actor.clearSubActors()) : this.actor.type === z.npc && this.actor.parentActor ? super.close(e).then(() => this.actor.clearParentActor(!1)) : super.close(e); - } - // #region Component Handlers - _getCompData(e) { - const t = $(e.currentTarget).closest(".comp"), s = { - elem$: t, - docID: t.data("compId"), - docCat: t.data("compCat"), - docType: t.data("compType"), - docTags: (t.data("compTags") ?? "").split(/\s+/g) - }; - return eLog.checkLog2("dialog", "Component Data", { elem: t, ...s }), s.docID && s.docType && (s.doc = { - Actor: this.actor.getSubActor(s.docID), - Item: this.actor.getSubItem(s.docID) - }[s.docType]), s.docCat && s.docType && (Te.IsType(this.actor) || Lt.IsType(this.actor)) && (s.dialogDocs = { - Actor: this.actor.getDialogActors(s.docCat), - Item: this.actor.getDialogItems(s.docCat) - }[s.docType]), s; - } - _onItemOpenClick(e) { - var s; - e.preventDefault(); - const { doc: t } = this._getCompData(e); - t && ((s = t.sheet) == null || s.render(!0)); - } - async _onItemAddClick(e) { - e.preventDefault(); - const t = $(e.currentTarget).closest(".comp").data("addType"); - if (t && t in x) { - await this.actor.createEmbeddedDocuments("Item", [ - { - name: { - [x.cohort_gang]: "A Gang", - [x.cohort_expert]: "An Expert" - }[t] ?? randomID(), - type: t - } - ]); - return; - } - const { docCat: s, docType: i, dialogDocs: r, docTags: o } = this._getCompData(e); - !r || !s || !i || await Fr.DisplaySelectionDialog( - this.actor, - v.tCase(`Add ${s.replace(/_/g, " ")}`), - i, - r, - o - ); - } - async _onItemRemoveClick(e) { - e.preventDefault(); - const { elem$: t, doc: s } = this._getCompData(e); - s && await va.effects.blurRemove(t).then(async () => { - s instanceof te ? await this.actor.remSubItem(s) : await this.actor.remSubActor(s); - }); - } - async _onItemFullRemoveClick(e) { - e.preventDefault(); - const { elem$: t, doc: s } = this._getCompData(e); - s && await va.effects.blurRemove(t).then(async () => await s.delete()); - } - async _onItemToggleClick(e) { - e.preventDefault(); - const t = $(e.currentTarget).data("target"); - await this.actor.update({ - [t]: !getProperty(this.actor, t) - }); - } - async _onSelectChange(e) { - e.preventDefault(), await v.EventHandlers.onSelectChange(this, e); - } - async _onToggleValueClick(e) { - e.preventDefault(); - const t = $(e.currentTarget), s = t.data("target"), i = t.data("toggleOnVal") || "", r = t.data("toggleOffVal") || ""; - getProperty(this.actor, s) === i ? await this.actor.update({ [s]: r }) : await this.actor.update({ [s]: i }); - } - async _onAdvanceClick(e) { - e.preventDefault(), $(e.currentTarget).data("action") === "advance-playbook" && await this.actor.advancePlaybook(); - } - // #endregion - // #region Roll Handlers - async _onRollTraitClick(e) { - const t = $(e.currentTarget).data("rollTrait"), s = $(e.currentTarget).data("rollType"), i = { - target: this.actor, - targetFlagKey: "rollCollab" - }; - v.lCase(t) in { ...Is, ...vt, ...H } ? i.rollTrait = v.lCase(t) : v.isInt(t) && (i.rollTrait = v.pInt(t)), v.tCase(s) in Ie ? i.rollType = v.tCase(s) : typeof i.rollTrait == "string" && (i.rollTrait in vt ? i.rollType = Ie.Resistance : i.rollTrait in Is && (i.rollType = Ie.Action)), game.user.isGM && (Me.IsDoc(this.actor) ? i.rollPrimaryData = this.actor : Ft.IsDoc(this.actor) && (i.rollOppData = this.actor)), await kr.New(i); - } - // Returns TRUE if can proceed, FALSE if action should stop (i.e. panel revealed for another user click) - async _validateOrRevealSubData(e, t) { - switch (e) { - case we.LongTermProject: { - if (t === "NewProject") - return !1; - const s = game.items.get(t ?? ""); - return !!Ba.IsType(s); - } - case we.Recover: { - const s = game.actors.get(t ?? ""); - return !!(s instanceof oe && s.hasTag(he.NPC.CanHeal)); - } - case we.Train: - return !!/^[a-z]+:\d$/.exec(t ?? ""); - default: - return !0; - } - } - async _onDowntimeActionClick(e) { - var o, n, l; - const t = $(e.currentTarget), s = t.data("action").substring(t.data("action").lastIndexOf("-") + 1), i = t.data("actionSubData"); - if (!await this._validateOrRevealSubData(s, i)) { - $("#eunos-blades-tooltips").children(".tooltip").remove(), await this.actor.update({ "system.downtime_actions_open_submenu": s }), $("#eunos-blades-tooltips").children(".tooltip").remove(); - return; - } - const r = { - target: this.actor, - targetFlagKey: "rollCollab", - rollDowntimeAction: s - }; - switch (s) { - case we.AcquireAsset: - case we.LongTermProject: - case we.ReduceHeat: { - r.rollType = Ie.Action; - break; - } - case we.Recover: { - r.rollType = Ie.Action, Te.IsType(this.actor) && this.actor.healingClock && (r.rollClockKey = this.actor.healingClock.id); - break; - } - case we.IndulgeVice: { - r.rollType = Ie.IndulgeVice; - break; - } - case we.Train: { - const [c, u] = i.split(/:/); - c === "playbook" ? this.actor.update({ [`system.experience.${c}.value`]: v.pInt(((n = (o = this.actor.system.experience) == null ? void 0 : o.playbook) == null ? void 0 : n.value) ?? 0) + v.pInt(u) }) : Te.IsType(this.actor) && this.actor.update({ [`system.experience.${c}.value`]: v.pInt(this.actor.system.experience[c].value) + v.pInt(u) }); - break; - } - } - await this.actor.update({ - "system.downtime_actions_open_submenu": "", - "system.downtime_actions.value": (((l = this.actor.system.downtime_actions) == null ? void 0 : l.value) ?? 0) + 1 - }), "rollType" in r && (s === we.IndulgeVice ? tc.New(r) : kr.New(r)); - } - async _onGatherInfoClick(e) { - $(e.currentTarget).data("isFortuneRoll") ? Wa.New({ - target: this.actor, - targetFlagKey: "rollCollab", - rollType: Ie.Fortune - }) : kr.New({ - target: this.actor, - targetFlagKey: "rollCollab", - rollType: Ie.Action, - rollTrait: "" - }); - } - // #endregion - // #region Active Effect Handlers - _onActiveEffectControlClick(e) { - ls.onManageActiveEffect(e, this.actor); - } - // #endregion - // #endregion -} -class ll extends qo { - static get defaultOptions() { - return foundry.utils.mergeObject(super.defaultOptions, { - classes: ["eunos-blades", "sheet", "actor", "pc"], - template: "systems/eunos-blades/templates/actor-sheet.hbs", - width: 775, - height: 775, - tabs: [{ navSelector: ".nav-tabs", contentSelector: ".tab-content", initial: "abilities" }] - }); - } - getData() { - var o, n, l, c; - const e = super.getData(), { activeSubItems: t, activeSubActors: s } = this.actor, i = {}; - i.preparedItems = Object.assign( - e.preparedItems ?? {}, - { - abilities: t.filter((u) => u.type === x.ability).map((u) => (u.system.uses_per_score.max && Object.assign(u, { - inRuleDotline: { - data: u.system.uses_per_score, - dotlineLabel: "Uses", - target: "item.system.uses_per_score.value", - iconEmpty: "dot-empty.svg", - iconEmptyHover: "dot-empty-hover.svg", - iconFull: "dot-full.svg", - iconFullHover: "dot-full-hover.svg" - } - }), u)), - background: t.find((u) => u.type === x.background), - heritage: t.find((u) => u.type === x.heritage), - vice: t.find((u) => u.type === x.vice), - loadout: t.filter((u) => u.type === x.gear).map((u) => (u.system.load && Object.assign(u, { - numberCircle: u.system.load, - numberCircleClass: "item-load" - }), u.system.uses_per_score.max && Object.assign(u, { - inRuleDotline: { - data: u.system.uses_per_score, - dotlineLabel: "Uses", - target: "item.system.uses_per_score.value", - iconEmpty: "dot-empty.svg", - iconEmptyHover: "dot-empty-hover.svg", - iconFull: "dot-full.svg", - iconFullHover: "dot-full-hover.svg" - } - }), u)), - playbook: this.actor.playbook, - projects: t.filter((u) => u.type === x.project), - cohorts: (o = e.preparedItems) == null ? void 0 : o.cohorts - } - ), i.preparedActors = { - crew: s.find((u) => u.type === z.crew), - vice_purveyor: s.find((u) => u.hasTag(he.NPC.VicePurveyor)), - acquaintances: s.filter((u) => u.hasTag(he.NPC.Acquaintance)) - }, i.hasVicePurveyor = !!(((n = this.actor.playbook) == null ? void 0 : n.hasTag(he.Gear.Advanced)) === !1 && t.find((u) => u.type === x.vice)), i.healing_clock = this.actor.healingClock, i.stashData = { - label: "Stash:", - dotline: { - data: this.actor.system.stash, - target: "system.stash.value", - iconEmpty: "coin-empty.svg", - iconEmptyHover: "coin-empty-hover.svg", - iconFull: "coin-full.svg", - iconFullHover: "coin-full-hover.svg", - altIconFull: "coin-ten.svg", - altIconFullHover: "coin-ten-hover.svg", - altIconStep: 10 - } - }, i.stressData = { - label: this.actor.system.stress.name, - dotline: { - data: this.actor.system.stress, - dotlineClass: this.actor.system.stress.max >= 13 ? "narrow-stress" : "", - target: "system.stress.value", - svgKey: "teeth.tall", - svgFull: "full|half|frame", - svgEmpty: "full|half|frame" - } - }, oe.IsType(this.actor, z.pc) && (i.traumaData = { - label: this.actor.system.trauma.name, - dotline: { - data: { value: this.actor.trauma, max: this.actor.system.trauma.max }, - svgKey: "teeth.short", - svgFull: "full|frame", - svgEmpty: "frame", - isLocked: !0 - }, - compContainer: { - class: "comp-trauma-conditions comp-vertical full-width", - blocks: [ - this.actor.traumaList.slice(0, Math.ceil(this.actor.traumaList.length / 2)).map((u) => ({ - checkLabel: u, - checkClasses: { - active: "comp-toggle-red", - inactive: "comp-toggle-grey" - }, - checkTarget: `system.trauma.checked.${u}`, - checkValue: this.actor.system.trauma.checked[u] ?? !1, - tooltip: Y.TraumaTooltips[u], - tooltipClass: "tooltip-trauma" - })), - this.actor.traumaList.slice(Math.ceil(this.actor.traumaList.length / 2)).map((u) => ({ - checkLabel: u, - checkClasses: { - active: "comp-toggle-red", - inactive: "comp-toggle-grey" - }, - checkTarget: `system.trauma.checked.${u}`, - checkValue: this.actor.system.trauma.checked[u] ?? !1, - tooltip: Y.TraumaTooltips[u], - tooltipClass: "tooltip-trauma" - })) - ] - } - }), i.abilityData = { - dotline: { - dotlineClass: "dotline-right dotline-glow", - data: { - value: this.actor.getAvailableAdvancements("Ability"), - max: this.actor.getAvailableAdvancements("Ability") - }, - dotlineLabel: "Available Abilities", - isLocked: !0, - iconFull: "dot-full.svg" - } - }, i.loadData = { - curLoad: this.actor.currentLoad, - selLoadCount: this.actor.system.loadout.levels[v.lCase(this.actor.system.loadout.selected)], - options: Y.Loadout.selections, - selected: this.actor.system.loadout.selected ?? "" - }, i.armor = Object.fromEntries(Object.entries(this.actor.system.armor.active).filter(([, u]) => u).map(([u]) => [ - u, - this.actor.system.armor.checked[u] - ])), i.attributeData = {}; - const r = Object.entries(this.actor.system.attributes); - for (const [u, g] of r) { - i.attributeData[u] = { - tooltip: Y.AttributeTooltips[u], - actions: {} - }; - const f = Object.entries(g); - for (const [h, m] of f) - i.attributeData[u].actions[h] = { - tooltip: Y.ActionTooltips[h], - value: m.value, - max: game.eunoblades.Tracker.phase === Fe.CharGen ? 2 : this.actor.system.attributes[u][h].max - }; - } - if (((l = game.eunoblades.Tracker) == null ? void 0 : l.phase) === Fe.Downtime) { - const u = { - [we.AcquireAsset]: "Acquire Asset", - [we.IndulgeVice]: "Indulge Vice", - [we.LongTermProject]: "Project", - [we.Recover]: "Recover", - [we.ReduceHeat]: "Reduce Heat", - [we.Train]: "Train" - }, g = [ - ...oe.GetTypeWithTags(z.pc, he.PC.CanHeal), - ...oe.GetTypeWithTags(z.npc, he.NPC.CanHeal) - /* ALSO NEED TO INCLUDE EXPERT COHORTS WITH CANHEAL TAG */ - ]; - this.actor.stress === 0 && delete u[we.IndulgeVice], (this.actor.harmLevel === 0 || g.length === 0) && delete u[we.Recover], (!this.actor.crew || this.actor.crew.system.heat.value === 0) && delete u[we.ReduceHeat]; - let f; - switch (this.actor.system.downtime_actions_open_submenu) { - case we.LongTermProject: { - f = [ - { - actionSubData: "NewProject", - display: "New Project" - } - ]; - break; - } - case we.Recover: { - f = [], g.forEach((C) => { - C.id === this.actor.id ? f == null || f.unshift({ - actionSubData: this.actor.id, - display: "Heal Self" - }) : Te.IsType(C) ? f == null || f.push({ - actionSubData: C.id, - display: v.uCase(C.name) - }) : Br.IsType(C) && (f == null || f.push({ - actionSubData: C.id, - display: C.name - })); - }); - break; - } - case we.Train: { - const C = ((c = this.actor.crew) == null ? void 0 : c.upgrades.filter((I) => /^Training_/.exec(I.system.world_name)).map((I) => v.lCase(I.system.world_name.split(/_/)[1]))) ?? []; - f = [ - { - actionSubData: `playbook:${C.includes("playbook") ? 2 : 1}`, - display: `${C.includes("playbook") ? 2 : 1} Playbook XP` - }, - { - actionSubData: `insight:${C.includes(vt.insight) ? 2 : 1}`, - display: `${C.includes(vt.insight) ? 2 : 1} Insight XP` - }, - { - actionSubData: `prowess:${C.includes(vt.prowess) ? 2 : 1}`, - display: `${C.includes(vt.prowess) ? 2 : 1} Prowess XP` - }, - { - actionSubData: `resolve:${C.includes(vt.resolve) ? 2 : 1}`, - display: `${C.includes(vt.resolve) ? 2 : 1} Resolve XP` - } - ]; - break; - } - } - const h = { - [we.AcquireAsset]: `

Acquire an Asset

-

Roll your Tier to acquire temporary use of an asset or service.

-

The Quality of the acquired asset depends on the result of your roll:

-
    -
  • Critical SuccessTier + 2
  • -
  • SuccessTier + 2
  • -
  • Partial SuccessTier
  • -
  • FailTier − 1
  • -
`, - [we.IndulgeVice]: `

Indulge Your Vice

-

Roll your lowest Attribute. Clear Stress equal to the highest die result.

-

Warning: If you clear more Stress than you have, you will overindulge.

`, - [we.LongTermProject]: `

Work on a Long-Term Project

-

Work to advance the clock of one of your existing Long-Term Projects, or begin a new one.

-

Roll the Action most appropriate to the work you are doing. The results of your roll determine how far you will advance the clock:

-
    -
  • Critical SuccessFive Segments
  • -
  • SuccessThree Segments
  • -
  • Partial SuccessTwo Segments
  • -
  • FailOne Segment
  • -
`, - [we.Recover]: `

Recover from Harm

-

Make a healing treatment roll using the appropriate trait of the character healing you:

-
    -
  • A PC with 'Physicker'Tinker. (You can heal yourself this way, but suffer 2 Stress for doing so.)
  • -
  • An NPCQuality
  • -
-

The results of your roll determine how far you will Advance your healing clock:

-
    -
  • Critical SuccessFive Segments
  • -
  • SuccessThree Segments
  • -
  • Partial SuccessTwo Segments
  • -
  • FailOne Segment
  • -
-

When your healing clock is filled, reduce each Harm by one level of severity.

`, - [we.ReduceHeat]: `

Reduce Heat

-

Work to reduce the Heat on your Crew.

-

Roll the Action most appropriate to the measures you are taking. The results of your roll determine how much Heat you clear:

-
    -
  • Critical SuccessFive Heat
  • -
  • SuccessThree Heat
  • -
  • Partial SuccessTwo Heat
  • -
  • FailOne Heat
  • -
`, - [we.Train]: `

Train

-

Select an Experience Track (i.e. Insight, Prowess, Resolve, or your Playbook). Gain 1 XP in that track, or 2 XP if your Crew has the corresponding Training Upgrade.

` - }, m = this.actor.system.downtime_actions.max + this.actor.system.downtime_action_bonus - this.actor.system.downtime_actions.value - (this.actor.isAtWar ? 1 : 0), y = this.actor.system.coins.value >= 1 || this.actor.system.stash.value >= 2, k = !!(this.actor.crew && this.actor.crew.system.rep.value >= 1), T = m <= 0, S = m > 0 || y && this.actor.system.downtime_action_selected_cost === "Coin" || k && this.actor.system.downtime_action_selected_cost === "Rep"; - i.downtimeData = { - actionsList: u, - actionsTooltips: h, - actionsRemaining: m, - actionsSubmenuData: f, - canPayCoin: y, - canPayRep: k, - isDisplayingCosts: T, - isDisplayingActions: S, - dotline: { - dotlineClass: "dotline-right dotline-glow", - data: { - value: m, - max: m - }, - dotlineLabel: "Actions Remaining", - isLocked: !0, - iconFull: "dot-full.svg" - } - }; - } - return i.gatherInfoTooltip = new Handlebars.SafeString([ - "

Gathering Information

", - "

Questions to Consider

", - "
    ", - ...Object.values(this.actor.system.gather_info ?? []).map((u) => `
  • ${u}
  • `) ?? [], - "
" - ].join("")).toString(), eLog.checkLog("Attribute", "[BladesPCSheet] attributeData", { attributeData: i.attributeData }), eLog.checkLog("actor", "[BladesPCSheet] getData()", { ...e, ...i }), { ...e, ...i }; - } - get activeArmor() { - return Object.keys(v.objFilter(this.actor.system.armor.active, (e) => e === !0)); - } - get checkedArmor() { - return Object.keys(v.objFilter( - this.actor.system.armor.checked, - (e, t) => e === !0 && this.actor.system.armor.active[t] === !0 - )); - } - get uncheckedArmor() { - return Object.keys(v.objFilter( - this.actor.system.armor.active, - (e, t) => e === !0 && this.actor.system.armor.checked[t] === !1 - )); - } - _getHoverArmor() { - return this.activeArmor.length ? this.activeArmor.includes("heavy") ? this.checkedArmor.includes("heavy") ? "light" : "heavy" : this.activeArmor.includes("light") ? "light" : "special" : !1; - } - _getClickArmor() { - return this.uncheckedArmor.length ? this.uncheckedArmor.includes("heavy") ? "heavy" : this.uncheckedArmor.includes("light") ? "light" : "special" : !1; - } - _getContextMenuArmor() { - return this.checkedArmor.length ? this.checkedArmor.includes("light") ? "light" : this.checkedArmor.includes("heavy") ? "heavy" : "special" : !1; - } - async _onAdvanceClick(e) { - e.preventDefault(), super._onAdvanceClick(e); - const t = $(e.currentTarget).data("action").replace(/^advance-/, ""); - t in vt && await this.actor.advanceAttribute(t); - } - activateListeners(e) { - if (super.activateListeners(e), !this.options.editable) - return; - const t = this; - e.find(".main-armor-control").on({ - click() { - const s = t._getClickArmor(); - s && t.actor.update({ [`system.armor.checked.${s}`]: !0 }); - }, - contextmenu() { - const s = t._getContextMenuArmor(); - s && t.actor.update({ [`system.armor.checked.${s}`]: !1 }); - }, - mouseenter() { - const s = t._getHoverArmor(); - eLog.log4("Mouse Enter", s, this, $(this), $(this).next()), s && $(this).siblings(`.svg-armor.armor-${s}`).addClass("hover-over"); - }, - mouseleave() { - const s = t._getHoverArmor(); - s && $(this).siblings(`.svg-armor.armor-${s}`).removeClass("hover-over"); - } - }), e.find(".special-control").on({ - click() { - t.activeArmor.includes("special") && t.actor.update({ "system.armor.checked.special": t.uncheckedArmor.includes("special") }); - }, - contextmenu() { - t.activeArmor.includes("special") && t.actor.update({ "system.armor.checked.special": t.uncheckedArmor.includes("special") }); - }, - mouseenter() { - !t.activeArmor.includes("special") || t.activeArmor.length === 1 || $(this).siblings(".svg-armor.armor-special").addClass("hover-over"); - }, - mouseleave() { - !t.activeArmor.includes("special") || t.activeArmor.length === 1 || $(this).siblings(".svg-armor.armor-special").removeClass("hover-over"); - } - }); - } -} -class wa extends oe { - // #region INITIALIZATION ~ - static async Initialize() { - return Object.assign(globalThis, { BladesPC: wa, BladesPCSheet: ll }), Actors.registerSheet("blades", ll, { types: ["pc"], makeDefault: !0 }), Hooks.on("dropActorSheetData", async (e, t, { uuid: s }) => { - const i = fromUuidSync(s); - i instanceof oe && (e.type === z.crew && i.type === z.pc ? i.addSubActor(e) : e.type === z.pc && i.type === z.crew && e.addSubActor(i)); - }), loadTemplates(["systems/eunos-blades/templates/actor-sheet.hbs"]); - } - // #endregion - // #region Static Overrides: Create, get All ~ - // static override IsType(doc: unknown): doc is BladesActorOfType { - // return super.IsType(doc, BladesActorType.pc); - // } - static IsType(e) { - return super.IsType(e, z.pc); - } - static GetUser(e) { - let t; - return typeof e == "string" ? t = game.users.get(e) ?? game.users.getName(e) : e instanceof User && (t = e), t; - } - static GetFromUser(e) { - var i; - const t = wa.GetUser(e); - if (!t) - throw new Error(`Unable to find user '${e}'`); - const s = game.actors.get(((i = t.character) == null ? void 0 : i.id) ?? ""); - if (wa.IsType(s)) - return s; - } - static async create(e, t = {}) { - e.token = e.token || {}, e.system = e.system ?? {}, eLog.checkLog2("actor", "BladesPC.create(data,options)", { data: e, options: t }), e.token.actorLink = !0, e.system.experience = { - playbook: { value: 0, max: 8 }, - insight: { value: 0, max: 6 }, - prowess: { value: 0, max: 6 }, - resolve: { value: 0, max: 6 }, - clues: [], - ...e.system.experience ?? {} - }; - const s = await super.create(e, t); - return await Et.Create({ - name: "", - target: s, - targetKey: "system.clocksData", - isVisible: !0, - isNameVisible: !1, - isSpotlit: !1 - }, void 0, [ - { - color: Ht.white, - value: 0, - max: 4, - index: 0, - isVisible: !0, - isActive: !0, - isNameVisible: !1, - isHighlighted: !1 - } - ]), s; - } - static get All() { - return new Collection( - super.GetTypeWithTags(z.pc).map((e) => [e.id, e]) - ); - } - // #endregion - constructor(e) { - super(e), eLog.checkLog3("pcConstructor", "new BladesPC()", { data: e }); - } - // #region BladesPrimaryActor Implementation ~ - get primaryUser() { - var e; - return ((e = game.users) == null ? void 0 : e.find((t) => { - var s; - return ((s = t.character) == null ? void 0 : s.id) === (this == null ? void 0 : this.id); - })) || null; - } - async clearLoadout() { - await this.update({ "system.loadout.selected": "" }), this.updateEmbeddedDocuments( - "Item", - [ - ...this.activeSubItems.filter((e) => te.IsType(e, x.gear) && !e.hasTag(he.System.Archived)).map((e) => ({ - _id: e.id, - "system.tags": [...e.tags, he.System.Archived], - "system.uses_per_score.value": 0 - })), - ...this.activeSubItems.filter((e) => te.IsType(e, x.ability) && e.system.uses_per_score.max).map((e) => ({ - _id: e.id, - "system.uses_per_score.value": 0 - })) - ] - ); - } - // #endregion - getSubActor(e) { - var s; - const t = super.getSubActor(e); - if (t) - return (s = this.primaryUser) != null && s.id && (t.ownership[this.primaryUser.id] = CONST.DOCUMENT_PERMISSION_LEVELS.OWNER), t; - } - get isLightArmorEquipped() { - return this.system.armor.active.light; - } - get isLightArmorEquippable() { - return !this.isLightArmorEquipped && this.remainingLoad >= 2; - } - get isLightArmorUsed() { - return this.system.armor.checked.light; - } - get isLightArmorAvailable() { - return (this.isLightArmorEquipped || this.isLightArmorEquippable) && !this.isLightArmorUsed; - } - get isHeavyArmorEquipped() { - return this.system.armor.active.heavy; - } - get isHeavyArmorEquippable() { - return this.isHeavyArmorEquipped ? !1 : this.isLightArmorEquipped ? this.remainingLoad >= 3 : this.remainingLoad >= 5; - } - get isHeavyArmorUsed() { - return this.system.armor.checked.heavy; - } - get isHeavyArmorAvailable() { - return (this.isHeavyArmorEquipped || this.isHeavyArmorEquippable) && !this.isHeavyArmorUsed; - } - get availableArmor() { - const e = []; - return this.isLightArmorAvailable && e.push("Light Armor"), this.isHeavyArmorAvailable && e.push("Heavy Armor"), e; - } - get isSpecialArmorAvailable() { - return this.system.armor.active.special && !this.system.armor.checked.special; - } - // #region BladesScoundrel Implementation ~ - isMember(e) { - var t; - return ((t = this.crew) == null ? void 0 : t.id) === e.id; - } - get vice() { - if (this.type === z.pc) - return this.activeSubItems.find((e) => e.type === x.vice); - } - get crew() { - return this.activeSubActors.find((e) => oe.IsType(e, z.crew)); - } - get abilities() { - return this.playbook ? this.activeSubItems.filter((e) => [x.ability, x.crew_ability].includes(e.type)) : []; - } - get cohorts() { - return this.activeSubItems.filter( - (e) => te.IsType(e, x.cohort_gang, x.cohort_expert) - ); - } - get playbookName() { - var e; - return (e = this.playbook) == null ? void 0 : e.name; - } - get playbook() { - return this.activeSubItems.find((e) => e.type === x.playbook); - } - get attributes() { - if (oe.IsType(this, z.pc)) - return { - insight: Object.values(this.system.attributes.insight).filter(({ value: e }) => e > 0).length + this.system.resistance_bonus.insight, - prowess: Object.values(this.system.attributes.prowess).filter(({ value: e }) => e > 0).length + this.system.resistance_bonus.prowess, - resolve: Object.values(this.system.attributes.resolve).filter(({ value: e }) => e > 0).length + this.system.resistance_bonus.resolve - }; - } - get actions() { - if (oe.IsType(this, z.pc)) - return v.objMap({ - ...this.system.attributes.insight, - ...this.system.attributes.prowess, - ...this.system.attributes.resolve - }, ({ value: e, max: t }) => v.gsap.utils.clamp(0, t, e)); - } - get rollable() { - if (oe.IsType(this, z.pc)) - return { - ...this.attributes, - ...this.actions - }; - } - get stress() { - return this.system.stress.value; - } - get stressMax() { - return this.system.stress.max; - } - get isHealingClockReady() { - const [e] = Object.keys(this.system.clocksData); - return game.eunoblades.ClockKeys.has(e ?? ""); - } - get healingClock() { - if (!this.isHealingClockReady) - return; - const [e] = Object.keys(this.system.clocksData); - return game.eunoblades.ClockKeys.get(e ?? ""); - } - get harmLevel() { - return this.system.harm.severe.one.length > 1 ? 3 : this.system.harm.moderate.one.length + this.system.harm.moderate.two.length > 0 ? 2 : this.system.harm.lesser.one.length + this.system.harm.lesser.two.length > 0 ? 1 : 0; - } - get trauma() { - return oe.IsType(this, z.pc) ? Object.keys(this.system.trauma.checked).filter((e) => ( - // @ts-ignore Compiler linter mismatch. - this.system.trauma.active[e] && this.system.trauma.checked[e] - )).length : 0; - } - get traumaList() { - return oe.IsType(this, z.pc) ? Object.keys(this.system.trauma.active).filter((e) => this.system.trauma.active[e]) : []; - } - get activeTraumaConditions() { - return oe.IsType(this, z.pc) ? v.objFilter( - this.system.trauma.checked, - // @ts-ignore Compiler linter mismatch. - (e, t) => !!(t in this.system.trauma.active && this.system.trauma.active[t]) - ) : {}; - } - get currentLoad() { - if (!oe.IsType(this, z.pc)) - return 0; - const e = this.activeSubItems.filter((t) => t.type === x.gear); - return v.gsap.utils.clamp(0, 10, e.reduce((t, s) => t + v.pInt(s.system.load), 0)); - } - get remainingLoad() { - if (!oe.IsType(this, z.pc) || !this.system.loadout.selected) - return 0; - const e = this.system.loadout.levels[game.i18n.localize(this.system.loadout.selected.toString()).toLowerCase()]; - return Math.max(0, e - this.currentLoad); - } - async addStash(e) { - oe.IsType(this, z.pc) && await this.update({ "system.stash.value": Math.min(this.system.stash.value + e, this.system.stash.max) }); - } - get projects() { - return this.getSubItemsOfType(x.project); - } - get remainingDowntimeActions() { - return oe.IsType(this, z.pc) ? this.system.downtime_actions.max + this.system.downtime_action_bonus - this.system.downtime_actions.value : 0; - } - _processAbilityDialogItems(e) { - this.playbookName && (e[this.playbookName] = this._processEmbeddedItemMatches( - te.GetTypeWithTags(x.ability, this.playbookName) - ), e.Veteran = this._processEmbeddedItemMatches(te.GetTypeWithTags(x.ability)).filter((t) => !t.hasTag(this.playbookName)).map((t) => (t.dialogCSSClasses && (t.dialogCSSClasses = t.dialogCSSClasses.replace(/featured-item\s?/g, "")), t)).sort((t, s) => t.system.world_name > s.system.world_name ? 1 : t.system.world_name < s.system.world_name ? -1 : 0)); - } - processGearDialogItems(e) { - if (this.playbookName === null) - return; - const t = this._processEmbeddedItemMatches([ - ...te.GetTypeWithTags(x.gear, this.playbookName), - ...te.GetTypeWithTags(x.gear, he.Gear.General) - ]).filter((s) => this.remainingLoad >= s.system.load); - e[this.playbookName] = t.filter((s) => s.hasTag(this.playbookName)), e.General = t.filter((s) => s.hasTag(he.Gear.General)).map((s) => (s.dialogCSSClasses && (s.dialogCSSClasses = s.dialogCSSClasses.replace(/featured-item\s?/g, "")), s)).sort((s, i) => s.system.world_name > i.system.world_name ? 1 : s.system.world_name < i.system.world_name ? -1 : 0); - } - getDialogItems(e) { - const t = {}, { playbookName: s } = this; - return e === pt.Heritage ? t.Main = this._processEmbeddedItemMatches(te.GetTypeWithTags(x.heritage)) : e === pt.Background ? t.Main = this._processEmbeddedItemMatches(te.GetTypeWithTags(x.background)) : e === pt.Vice && s !== null ? t.Main = this._processEmbeddedItemMatches(te.GetTypeWithTags(x.vice, s)) : e === pt.Playbook ? (t.Basic = this._processEmbeddedItemMatches( - te.GetTypeWithTags(x.playbook).filter((i) => !i.hasTag(he.Gear.Advanced)) - ), t.Advanced = this._processEmbeddedItemMatches( - te.GetTypeWithTags(x.playbook, he.Gear.Advanced) - )) : e === pt.Gear ? this.processGearDialogItems(t) : e === pt.Ability && this._processAbilityDialogItems(t), t; - } - getTaggedItemBonuses(e) { - return e.length; - } - // #endregion - // #region BladesRoll.PrimaryDoc Implementation - get rollPrimaryModsSchemaSet() { - const e = super.rollPrimaryModsSchemaSet; - [ - [/1d/, ae.roll], - [/Less Effect/, ae.effect] - ].forEach(([s, i]) => { - const { one: r, two: o } = Object.values(this.system.harm).find((l) => s.test(l.effect)) ?? {}, n = v.objCompact([r, o === "" ? null : o]).join(" & "); - n.length > 0 && e.push({ - key: `Harm-negative-${i}`, - name: n, - section: i, - posNeg: "negative", - base_status: se.ToggledOn, - modType: Oe.harm, - value: 1, - tooltip: [ - `

${i === ae.roll ? Sn.Impaired : Sn.Weakened} (Harm)

`, - `

${n}

`, - i === ae.roll ? "

If your injuries apply to the situation at hand, you suffer −1d to your roll.

" : "

If your injuries apply to the situation at hand, you suffer −1 effect." - ].join("") - }); - }); - const { one: t } = Object.values(this.system.harm).find((s) => /Need Help/.test(s.effect)) ?? {}; - return t && t.trim() !== "" && e.push({ - key: "Push-negative-roll", - name: "PUSH", - sideString: t.trim(), - section: ae.roll, - posNeg: "negative", - base_status: se.ToggledOn, - modType: Oe.harm, - value: 0, - effectKeys: ["Cost-Stress2"], - tooltip: [ - "

Broken (Harm)

", - `

${t.trim()}

`, - "

If your injuries apply to the situation at hand, you must Push to act.

" - ].join("") - }), e; - } - async applyHarm(e, t) { - if (e === 4) { - kt.getInstance().pushNotice_SocketCall( - "ALL", - { - title: `${this.name} Suffers FATAL Harm: ${t}`, - body: `${this.name}, will you continue as a Ghost, or create a new character?`, - type: Ds.push, - cssClasses: "harm-alert fatal-harm-alert" - } - ); - return; - } - const s = [ - [["lesser", "one"], ["lesser", "two"]], - [["moderate", "one"], ["moderate", "two"]], - [["severe", "one"]] - ].slice(e - 1).flat(1); - for (; s.length; ) { - const i = s.shift(); - if (!i) - break; - const [r, o] = i; - if (!this.system.harm[r][o]) { - kt.getInstance().pushNotice_SocketCall( - "ALL", - { - title: `${this.name} Suffers ${v.tCase(r)} Harm: ${t}`, - type: Ds.push, - cssClasses: "harm-alert" - } - ), await this.update({ [`system.harm.${r}.${o}`]: t }); - return; - } - } - kt.getInstance().pushNotice_SocketCall( - "ALL", - { - title: `${this.name} Suffers a Catastrophic, Permanent Injury!`, - body: `${this.name}, you're out of the action - either left for dead, or otherwise dropped from the action. You can choose to return at the beginning of the next Phase with a permanent injury, or die.`, - type: Ds.push, - cssClasses: "harm-alert fatal-harm-alert" - } - ); - } - async applyWorsePosition() { - this.setFlag("eunos-blades", "isWorsePosition", !0); - } - // #endregion - // #region BladesRoll.ParticipantDoc Implementation - get rollParticipantID() { - return this.id; - } - get rollParticipantDoc() { - return this; - } - get rollParticipantIcon() { - var e; - return ((e = this.playbook) == null ? void 0 : e.img) ?? this.img; - } - get rollParticipantName() { - return this.name ?? ""; - } - get rollParticipantType() { - return this.type; - } - get rollParticipantModsSchemaSet() { - return []; - } - // #endregion - async adjustStress(e) { - const t = Math.min(this.stressMax, Math.max(0, this.stress + e)); - if (t === this.stressMax) { - kt.getInstance().pushNotice_SocketCall("ALL", { - title: `${this.name} breaks under the stress!`, - body: `${this.name}: Select a Trauma Condition on your sheet. You are taken out of action and will no longer participate in this score. Narrate what happens.`, - type: Ds.push, - cssClasses: "stress-alert" - }), await this.update({ "system.stress.value": 0 }); - return; - } - await this.update({ "system.stress.value": t }); - } - async indulgeStress(e) { - e > this.stress && kt.getInstance().pushNotice_SocketCall("ALL", { - title: `${this.name} Overindulges!`, - body: `${this.name}: Select an option from the list below, and narrate how overindulging your vice led to this result:
  • Attract Trouble: Roll for an Entanglement.
  • Brag About Your Exploits: +2 Heat
  • Go AWOL Vanish for a few weeks. (You will play a different character until the next Downtime Phase, at which point you will return with all Harm healed.)
  • Tapped: Your current Vice Purveyor cuts you off. (Until you find a new source for your vice, you will be unable to Indulge Vice during Downtime.)
`, - type: Ds.push, - cssClasses: "stress-alert" - }), await this.update({ "system.stress.value": this.stress - e }); - } - async spendArmor(e) { - const t = {}; - for (; e > 0; ) { - if (this.isLightArmorAvailable) - this.isLightArmorEquipped || (t["system.armor.active.light"] = !0), t["system.armor.checked.light"] = !0; - else if (this.isHeavyArmorAvailable) - this.isHeavyArmorEquipped || (t["system.armor.active.heavy"] = !0), t["system.armor.checked.heavy"] = !0; - else - throw new Error("No armor available to spend"); - e--; - } - this.update(t); - } - async spendSpecialArmor() { - this.system.armor.active.special && !this.system.armor.checked.special && await this.update({ "system.armor.checked.special": !0 }); - } - get rollTraitPCTooltipActions() { - const e = [""], t = this.actions; - return Object.values(vt).forEach((s) => { - Y.Action[s].forEach((i) => { - e.push([ - "", - ``, - ``, - ``, - "" - ].join("")); - }); - }), e.push("
${v.uCase(i)}${"⚪".repeat(t[i])}(${Y.ShortActionTooltips[i]})
"), e.join(""); - } - get rollTraitPCTooltipAttributes() { - const e = [""], t = this.attributes; - return Object.values(vt).forEach((s) => { - e.push([ - "", - ``, - ``, - ``, - "" - ].join("")); - }), e.push("
${v.uCase(s)}${"⚪".repeat(t[s])}(${Y.ShortAttributeTooltips[s]})
"), e.join(""); - } - // #endregion - render(e) { - if (!this.isHealingClockReady) { - setTimeout(() => this.render(e), 1e3); - return; - } - super.render(e); - } -} -const Te = wa; -class cl extends qo { - static get defaultOptions() { - return foundry.utils.mergeObject(super.defaultOptions, { - classes: ["eunos-blades", "sheet", "actor", "npc"], - template: "systems/eunos-blades/templates/npc-sheet.hbs", - width: 500, - height: 400, - // height: "auto", - tabs: [{ navSelector: ".nav-tabs", contentSelector: ".tab-content", initial: "description" }] - }); - } - getData() { - const e = super.getData(); - e.isSubActor = e.actor.isSubActor, e.parentActor = e.actor.parentActor, e.persona = e.actor.system.persona, e.random = e.actor.system.random, e.secret = e.actor.system.secret; - const t = { - name: { size: 3, label: "Name" }, - gender: { size: "half", label: "Gender" }, - heritage: { size: "third", label: "Heritage" }, - background: { size: "third", label: "Background" }, - profession: { size: "third", label: "Profession" }, - appearance: { size: 2, label: "Appearance" }, - style: { size: 2, label: "Style" }, - quirk: { size: 4, label: "Quirk" }, - goal: { size: 2, label: "Goal" }, - method: { size: 2, label: "Method" }, - interests: { size: 4, label: "Interests" }, - trait: { size: "half", label: "Trait" }, - trait1: { size: "half", label: null }, - trait2: { size: "half", label: null }, - trait3: { size: "half", label: null } - }; - for (const s of ["persona", "random", "secret"]) - for (const [i] of Object.entries(e[s])) - i in t && Object.assign( - e[s][i], - t[i] - ); - return console.log({ persona: e.persona, random: e.random, secret: e.secret }), e; - } - activateListeners(e) { - super.activateListeners(e), this.options.editable && (e.find(".gm-alert-header").on("click", async (t) => { - t.preventDefault(), this.actor.clearParentActor(); - }), e.find('[data-action="randomize"').on("click", () => { - this.actor.updateRandomizers(); - }), e.find(".comp-status-toggle").on("click", () => { - const { tags: t } = this.actor; - this.actor.system.status === 1 ? (v.remove(t, "Friend"), t.push("Rival"), this.actor.update({ - "system.status": -1, - "system.tags": v.unique(t) - })) : (v.remove(t, "Rival"), t.push("Friend"), this.actor.update({ - "system.status": 1, - "system.tags": v.unique(t) - })); - }).on("contextmenu", () => { - this.actor.update({ "system.status": 0 }); - })); - } -} -class Zl extends oe { - // #region INITIALIZATION ~ - static async Initialize() { - return Object.assign(globalThis, { BladesNPC: Zl, BladesNPCSheet: cl }), Actors.registerSheet("blades", cl, { types: ["npc"], makeDefault: !0 }), loadTemplates(["systems/eunos-blades/templates/npc-sheet.hbs"]); - } - // #endregion - static IsType(e) { - return super.IsType(e, z.npc); - } - // #region BladesRoll Implementation - get rollFactors() { - const e = super.rollFactors; - return e[H.scale] = { - name: H.scale, - display: "Scale", - value: this.getFactorTotal(H.scale), - max: this.getFactorTotal(H.scale), - baseVal: this.getFactorTotal(H.scale), - cssClasses: "factor-grey", - isActive: !1, - isPrimary: !1, - isDominant: !1, - highFavorsPC: !0 - }, e[H.magnitude] = { - name: H.magnitude, - display: "Magnitude", - value: this.getFactorTotal(H.magnitude), - max: this.getFactorTotal(H.magnitude), - baseVal: this.getFactorTotal(H.magnitude), - isActive: !1, - isPrimary: !1, - isDominant: !1, - highFavorsPC: !0 - }, e; - } - // #region BladesRoll.OppositionDoc Implementation - get rollOppID() { - return this.id; - } - get rollOppDoc() { - return this; - } - get rollOppImg() { - return this.img; - } - get rollOppName() { - return this.name; - } - get rollOppSubName() { - return this.system.subtitle || this.system.concept || " "; - } - get rollOppType() { - return this.type; - } - get rollOppModsSchemaSet() { - return []; - } - // #endregion - // #region BladesRoll.ParticipantDoc Implementation - get rollParticipantID() { - return this.id; - } - get rollParticipantDoc() { - return this; - } - get rollParticipantIcon() { - return this.img; - } - get rollParticipantName() { - return this.name; - } - get rollParticipantType() { - return this.type; - } - get rollParticipantModsSchemaSet() { - return []; - } - // #endregion - // #endregion -} -const Br = Zl; -class ul extends qo { - static get defaultOptions() { - return foundry.utils.mergeObject(super.defaultOptions, { - classes: ["eunos-blades", "sheet", "actor", "faction"], - template: "systems/eunos-blades/templates/faction-sheet.hbs", - width: 900, - height: "auto", - tabs: [{ navSelector: ".nav-tabs", contentSelector: ".tab-content", initial: "overview" }] - }); - } - getData() { - const e = super.getData(); - if (!oe.IsType(this.actor, z.faction)) - return e; - const t = { - tierData: { - class: "comp-tier comp-vertical comp-teeth", - label: "Tier", - labelClass: "filled-label full-width", - dotline: { - data: this.actor.system.tier, - target: "system.tier.value", - svgKey: "teeth.tall", - svgFull: "full|half|frame", - svgEmpty: "full|half|frame" - } - }, - clockKeys: this.actor.clocks - }; - return { - ...e, - ...t - }; - } - async _onClockAddClick(e) { - e.preventDefault(), this.actor.addClock(); - } - async _onClockDeleteClick(e) { - e.preventDefault(); - const t = $(e.currentTarget).data("clockId"); - t && this.actor.deleteClock(t); - } - activateListeners(e) { - super.activateListeners(e), this.options.editable && (e.find(".item-body").on("click", (t) => { - var r; - const s = $(t.currentTarget).parents(".item"), i = this.actor.items.get(s.data("itemId")); - (r = i == null ? void 0 : i.sheet) == null || r.render(!0); - }), e.find(".comp-control.comp-add-clock").on("click", this._onClockAddClick.bind(this)), e.find(".comp-control.comp-delete-clock").on("click", this._onClockDeleteClick.bind(this))); - } -} -class Jl extends oe { - // #region INITIALIZATION ~ - static async Initialize() { - return Object.assign(globalThis, { BladesFaction: Jl, BladesFactionSheet: ul }), Actors.registerSheet("blades", ul, { types: ["faction"], makeDefault: !0 }), loadTemplates(["systems/eunos-blades/templates/faction-sheet.hbs"]); - } - // #endregion - static get All() { - return new Collection( - super.GetTypeWithTags(z.faction).map((e) => [e.id, e]) - ); - } - static IsType(e) { - return super.IsType(e, z.faction); - } - // #region BladesRoll Implementation - // #region BladesRoll.OppositionDoc Implementation - get rollOppID() { - return this.id; - } - get rollOppDoc() { - return this; - } - get rollOppImg() { - return this.img ?? ""; - } - get rollOppName() { - return this.name ?? ""; - } - get rollOppSubName() { - return this.system.subtitle || this.system.concept || " "; - } - get rollOppType() { - return this.type; - } - get rollOppModsSchemaSet() { - return []; - } - // #endregion - // #endregion - // _clocks: Collection = new Collection(); - // get clocks(): Collection = { - // return new Collection() - // } - get clocks() { - return new Collection( - Object.entries(this.system.clocksData ?? {}).map(([e, t]) => [ - e, - game.eunoblades.ClockKeys.get(e) ?? new Et(t) - ]) - ); - } - async addClock() { - return await Et.Create({ - target: this, - targetKey: "system.clocksData" - }); - } - async deleteClock(e) { - var t; - await ((t = game.eunoblades.ClockKeys.get(e)) == null ? void 0 : t.delete(game.eunoblades.ClockKeys)); - } -} -const Hr = Jl; -class hl extends qo { - static get defaultOptions() { - return foundry.utils.mergeObject(super.defaultOptions, { - classes: ["eunos-blades", "sheet", "actor", "crew"], - template: "systems/eunos-blades/templates/crew-sheet.hbs", - width: 940, - height: 820, - tabs: [{ navSelector: ".nav-tabs", contentSelector: ".tab-content", initial: "claims" }] - }); - } - getData() { - const e = super.getData(); - eLog.checkLog("actor", "[BladesCrewSheet] super.getData()", { ...e }); - const { activeSubItems: t } = this.actor, s = {}; - return s.preparedItems = Object.assign( - e.preparedItems ?? {}, - { - abilities: t.filter((i) => i.type === x.crew_ability), - playbook: this.actor.playbook, - reputation: t.find((i) => i.type === x.crew_reputation), - upgrades: t.filter((i) => i.type === x.crew_upgrade), - preferredOp: t.find((i) => i.type === x.preferred_op) - } - ), s.preparedActors = { - members: this.actor.members, - contacts: this.actor.contacts - }, s.tierData = { - label: "Tier", - dotline: { - data: this.actor.system.tier, - target: "system.tier.value", - iconEmpty: "dot-empty.svg", - iconEmptyHover: "dot-empty-hover.svg", - iconFull: "dot-full.svg", - iconFullHover: "dot-full-hover.svg" - } - }, s.upgradeData = { - dotline: { - dotlineClass: "dotline-right", - data: { - value: this.actor.availableUpgradePoints, - max: this.actor.availableUpgradePoints - }, - dotlineLabel: "Available Upgrade Points", - isLocked: !0, - iconFull: "dot-full.svg" - } - }, s.abilityData = { - dotline: { - dotlineClass: "dotline-right", - data: { - value: this.actor.availableAbilityPoints, - max: this.actor.availableAbilityPoints - }, - dotlineLabel: "Available Ability Points", - isLocked: !0, - iconFull: "dot-full.svg" - } - }, s.cohortData = { - dotline: { - dotlineClass: "dotline-right", - data: { - value: this.actor.availableCohortPoints, - max: this.actor.availableCohortPoints - }, - dotlineLabel: "Available Cohort Points", - isLocked: !0, - iconFull: "dot-full.svg" - } - }, s.repData = { - label: "Rep", - dotlines: [ - { - data: { - value: Math.min(this.actor.system.rep.value, this.actor.system.rep.max - this.actor.turfCount), - max: this.actor.system.rep.max - this.actor.turfCount - }, - target: "system.rep.value", - svgKey: "teeth.tall", - svgFull: "full|half|frame", - svgEmpty: "full|half|frame" - }, - { - data: { - value: this.actor.turfCount, - max: this.actor.turfCount - }, - target: "none", - svgKey: "teeth.tall", - svgFull: "full|half|frame", - svgEmpty: "full|half|frame", - dotlineClass: "flex-row-reverse", - isLocked: !0 - } - ] - }, s.heatData = { - label: "Heat", - dotline: { - data: this.actor.system.heat, - target: "system.heat.value", - svgKey: "teeth.tall", - svgFull: "full|half|frame", - svgEmpty: "full|half|frame" - } - }, s.wantedData = { - label: "Wanted", - dotline: { - data: this.actor.system.wanted, - target: "system.wanted.value", - svgKey: "teeth.short", - svgFull: "full|frame", - svgEmpty: "frame" - } - }, eLog.checkLog("actor", "[BladesCrewSheet] return getData()", { ...e, ...s }), { ...e, ...s }; - } - activateListeners(e) { - super.activateListeners(e), this.options.editable && (e.find(".item-sheet-open").on("click", (t) => { - var r; - const s = $(t.currentTarget).parents(".item"), i = this.actor.items.get(s.data("itemId")); - (r = i == null ? void 0 : i.sheet) == null || r.render(!0); - }), e.find(".hold-toggle").on("click", () => { - this.actor.update({ "system.hold": this.actor.system.hold === "weak" ? "strong" : "weak" }); - }), e.find(".turf-select").on("click", async (t) => { - var r; - const s = $(t.currentTarget).data("turfId"), i = $(t.currentTarget).data("turfStatus"); - (r = this.actor.playbook) == null || r.update({ [`system.turfs.${s}.value`]: !i }).then(() => this.render(!1)); - })); - } -} -class Ql extends oe { - // #region INITIALIZATION ~ - static async Initialize() { - return Object.assign(globalThis, { BladesCrew: Ql, BladesCrewSheet: hl }), Actors.registerSheet("blades", hl, { types: ["crew"], makeDefault: !0 }), loadTemplates(["systems/eunos-blades/templates/crew-sheet.hbs"]); - } - // #endregion - // #region Static Overrides: Create ~ - // static override IsType(doc: unknown): doc is BladesActorOfType { - // return super.IsType(doc, BladesActorType.crew); - // } - static IsType(e) { - return super.IsType(e, z.crew); - } - static GetFromUser(e) { - const t = Te.GetFromUser(e); - if (t) - return t.crew; - } - static GetFromPC(e) { - let t; - if (typeof e == "string" ? t = game.actors.get(e) ?? game.actors.getName(e) : e instanceof Te ? t = e : t ?? (t = Te.GetFromUser(e)), !Te.IsType(t)) - throw new Error(`Unable to find BladesPC from '${e}'`); - return t.crew; - } - static async create(e, t = {}) { - return e.token = e.token || {}, e.system = e.system ?? {}, eLog.checkLog2("actor", "BladesActor.create(data,options)", { data: e, options: t }), e.token.actorLink = !0, e.system.world_name = e.system.world_name ?? e.name.replace(/[^A-Za-z_0-9 ]/g, "").trim().replace(/ /g, "_"), e.system.experience = { - playbook: { value: 0, max: 8 }, - clues: [], - ...e.system.experience ?? {} - }, super.create(e, t); - } - // #endregion - // #region BladesCrew Implementation - getDialogItems(e) { - const t = {}, { playbookName: s } = this; - return e === pt.Playbook ? t.Main = this._processEmbeddedItemMatches(te.GetTypeWithTags(x.crew_playbook)) : e === pt.Reputation ? t.Main = this._processEmbeddedItemMatches(te.GetTypeWithTags(x.crew_reputation)) : e === pt.Preferred_Op && s !== null ? t.Main = this._processEmbeddedItemMatches( - te.GetTypeWithTags(x.preferred_op, s) - ) : e === pt.Ability ? t.Main = this._processEmbeddedItemMatches( - te.GetTypeWithTags(x.crew_ability, this.playbookName) - ) : e === pt.Upgrade && s !== null && (t[s] = this._processEmbeddedItemMatches( - te.GetTypeWithTags(x.crew_upgrade, s) - ), t.General = this._processEmbeddedItemMatches( - te.GetTypeWithTags(x.crew_upgrade, he.Gear.General) - )), t; - } - get members() { - if (!oe.IsType(this, z.crew)) - return []; - const e = this; - return oe.GetTypeWithTags(z.pc).filter((t) => t.isMember(e)); - } - get contacts() { - if (!oe.IsType(this, z.crew) || !this.playbook) - return []; - const e = this; - return this.activeSubActors.filter((t) => t.hasTag(e.playbookName)); - } - get claims() { - return !oe.IsType(this, z.crew) || !this.playbook ? {} : this.playbook.system.turfs; - } - get turfCount() { - return !oe.IsType(this, z.crew) || !this.playbook ? 0 : Object.values(this.playbook.system.turfs).filter((e) => e.isTurf && e.value).length; - } - get upgrades() { - return !oe.IsType(this, z.crew) || !this.playbook ? [] : this.activeSubItems.filter((e) => e.type === x.crew_upgrade); - } - get cohorts() { - return this.activeSubItems.filter((e) => [x.cohort_gang, x.cohort_expert].includes(e.type)); - } - getTaggedItemBonuses(e) { - return e.length; - } - // #endregion - // #region BladesRoll Implementation - // #region BladesRoll.ParticipantDoc Implementation - get rollParticipantID() { - return this.id; - } - get rollParticipantDoc() { - return this; - } - get rollParticipantIcon() { - var e; - return ((e = this.playbook) == null ? void 0 : e.img) ?? this.img; - } - get rollParticipantName() { - return this.name; - } - get rollParticipantType() { - return this.type; - } - get rollParticipantModsSchemaSet() { - return []; - } - async applyHarm(e, t) { - console.error("Attempt to apply harm directly to a Crew document."); - } - async applyWorsePosition() { - console.error("Attempt to apply worse position directly to a Crew document."); - } - // #endregion - // #endregion - get abilities() { - return this.playbook ? this.activeSubItems.filter((e) => [x.ability, x.crew_ability].includes(e.type)) : []; - } - get playbookName() { - var e; - return (e = this.playbook) == null ? void 0 : e.name; - } - get playbook() { - return this.activeSubItems.find((e) => e.type === x.crew_playbook); - } -} -const Lt = Ql, Cn = { - [z.pc]: Te, - [z.npc]: Br, - [z.faction]: Hr, - [z.crew]: Lt -}, cp = new Proxy(function() { -}, { - construct(a, e) { - const [{ type: t }] = e; - if (!t) - throw new Error(`Invalid Actor Type: ${String(t)}`); - const s = Cn[t]; - return s ? new s(...e) : new oe(...e); - }, - get(a, e) { - switch (e) { - case "create": - case "createDocuments": - return function(t, s = {}) { - if (v.isArray(t)) - return t.map((r) => CONFIG.Actor.documentClass.create(r, s)); - const i = Cn[t.type]; - return i ? i.create(t, s) : oe.create(t, s); - }; - case Symbol.hasInstance: - return function(t) { - return Object.values(Cn).some((s) => t instanceof s); - }; - default: - return oe[e]; - } - } -}); -class Cs extends hs { - // #region Static Methods ~ - static async Initialize() { - if (!game.messages) - throw new Error("[BladesConsequence] Messages Not Ready!"); - return (await Promise.all(game.messages.contents.map(async (e) => e.rollConsequences))).flat(); - } - /** - * Checks if the given value is valid consequence data for a Resistance Roll. - * @param val The value to check. - * @param isCheckingResistedTo If the check is being recursively applied to the 'resistTo' value. - * @returns True if the val is valid BladesConsequence.Data, false otherwise. - */ - static IsValidConsequenceData(e, t = !1) { - return !v.isList(e) || typeof e.type != "string" || !(e.type in $t) || typeof e.name != "string" ? !1 : t ? !0 : !(e.attribute && (typeof e.attribute != "string" || !(e.attribute in vt)) || !this.IsValidConsequenceData(e.resistTo, !0)); - } - static ApplySchemaDefaults(e) { - if (!e.primaryID) - throw new Error("A primaryID is required for BladesConsequence.Schema"); - if (typeof e.name == "string" && !e.name && e.type !== $t.None) - throw new Error(`A name must be provided for non-None-type consequences (${e.name}).`); - return { - name: "", - type: $t.None, - ...e - }; - } - static GetCsqTypeValue(e, t) { - if (e === $t.WorsePosition) { - if (!t) - throw new Error(`Cannot resolve consequence type value for '${e}' without roll data.`); - let s; - if ("rollPositionFinal" in t ? s = t.rollPositionFinal : "position" in t && (s = t.position), !s) - throw new Error(`Cannot resolve consequence type value for '${e}' without roll data that includes final position data.`); - return { - [wt.controlled]: 1, - [wt.risky]: 2, - [wt.desperate]: 0 - }[s]; - } - if (e === $t.ReducedEffect) { - if (!t) - throw new Error(`Cannot resolve consequence type value for '${e}' without roll data.`); - let s; - if ("rollEffectFinal" in t ? s = t.rollEffectFinal : "effect" in t && (s = t.effect), !s) - throw new Error(`Cannot resolve consequence type value for '${e}' without roll data that includes final effect data.`); - return { - [dt.extreme]: 1, - [dt.great]: 1, - [dt.standard]: 1, - [dt.limited]: 2, - [dt.zero]: 0 - }[s]; - } - return Y.ConsequenceValues[e]; - } - // #endregion - // #region *** GETTERS *** ~ - // #region Getters (Target Data) ~ - get primaryID() { - var e; - return this.data.primaryID ?? ((e = this.parentConsequence) == null ? void 0 : e.primaryID); - } - get parentCsqID() { - return this.data.parentCsqID; - } - get name() { - return this.data.name; - } - get type() { - return this.data.type; - } - get attribute() { - var e; - return this.data.attribute ?? ((e = this.parentConsequence) == null ? void 0 : e.attribute); - } - get attributeVal() { - var e; - return this.data.attributeVal ?? ((e = this.parentConsequence) == null ? void 0 : e.attributeVal); - } - get specialFooterMsg() { - var e; - return this.data.specialFooterMsg ?? ((e = this.parentConsequence) == null ? void 0 : e.specialFooterMsg); - } - // #endregion - // #region Getters (Derived Data) ~ - get primary() { - const e = fromUuidSync(this.primaryID); - if (!Me.IsDoc(e)) - throw new Error(`Could not find primary with UUID '${this.primaryID}'`); - return this.roll ? new Me(this.roll, e) : new Me(e); - } - get parentConsequence() { - if (!this.parentCsqID) - return; - const e = game.eunoblades.Consequences.get(this.parentCsqID); - if (!e) - throw new Error(`Error locating parent consequence with id '${this.parentCsqID}'`); - return e; - } - get typeDisplay() { - return Y.ConsequenceDisplay[this.type]; - } - get icon() { - return Y.ConsequenceIcons[this.type]; - } - get value() { - return Cs.GetCsqTypeValue(this.type, this); - } - // #endregion - // #region Getters (Resolved Roll Data that Applied This Consequence) ~ - get rollData() { - var e; - return this.data.actionRollData ?? ((e = this.parentConsequence) == null ? void 0 : e.rollData); - } - get roll() { - if (this.rollData) - return game.eunoblades.Rolls.get(this.rollData.id) ?? new xs({ - ...this.rollData, - isScopingById: !1 - }); - } - get position() { - var e; - return (e = this.roll) == null ? void 0 : e.rollPositionFinal; - } - get effect() { - var e; - return (e = this.roll) == null ? void 0 : e.rollEffectFinal; - } - get result() { - var e; - return (e = this.roll) == null ? void 0 : e.rollResultFinal; - } - // #endregion - // #region Getters (Resistibility & Acceptance Status) ~ - isResistible() { - return !!(this.type !== $t.None && !this.isAccepted && this.data.resistSchema); - } - get resistanceModes() { - return this.data.resistanceModes ?? []; - } - get wasResisted() { - return !!this.resistanceModes.length; - } - get wasResistedByRoll() { - return this.resistanceModes.includes("resist"); - } - get wasResistedByArmor() { - return this.resistanceModes.includes("armor"); - } - get wasResistedBySpecialArmor() { - var e; - return (e = this.resistanceModes) == null ? void 0 : e.includes("special"); - } - get canResistWithRoll() { - return !(!this.isResistible() || !Te.IsType(this.primary.rollPrimaryDoc) || this.wasResistedByRoll); - } - get canResistWithArmor() { - return !this.isResistible() || !this.data.canResistWithArmor ? !1 : this.primary.availableArmorCount > 0; - } - get canResistWithSpecial() { - return !this.isResistible() || !this.data.canResistWithSpecial || !Te.IsType(this.primary.rollPrimaryDoc) || this.wasResistedBySpecialArmor ? !1 : this.primary.hasSpecialArmor; - } - get resistWithRollNegates() { - return this.canResistWithRoll ? this.wasResisted ? !0 : !!this.data.resistWithRollNegates : !1; - } - get resistWithArmorNegates() { - return this.canResistWithArmor ? this.wasResisted ? !0 : !!this.data.resistWithArmorNegates : !1; - } - get resistWithSpecialNegates() { - return this.canResistWithSpecial ? this.wasResisted ? !0 : !!this.data.resistWithSpecialNegates : !1; - } - get isAccepted() { - return "acceptanceMode" in this.data; - } - get acceptanceMode() { - return this.data.acceptanceMode; - } - // #endregion - // #endregion - // #region *** RESISTING CONSEQUENCES *** - // #region Constructing Resistable Consequence Schema - get noneSchema() { - return { - name: "", - type: $t.None, - primaryID: this.primaryID - }; - } - get resistSchema() { - if (!this.isResistible()) - return; - const e = { - name: this.data.resistSchema.name, - type: this.data.resistSchema.type, - primaryID: this.primaryID, - resistSchema: { - name: "", - type: $t.None - }, - resistanceModes: this.resistanceModes, - resistWithRollNegates: !0, - attribute: this.attribute, - attributeVal: this.attributeVal, - canResistWithArmor: this.canResistWithArmor, - resistWithArmorNegates: !0, - canResistWithSpecial: this.canResistWithSpecial, - resistWithSpecialNegates: !0, - specialFooterMsg: this.specialFooterMsg - }; - return this.wasResisted && (e.name = "", e.type = $t.None, delete e.resistSchema, e.canResistWithArmor = !1, e.canResistWithSpecial = !1), e; - } - // #endregion - async resistConsequence(e, t) { - if (!this.isResistible()) - throw new Error("Cannot resist a consequence that is not resistible."); - const s = { - resistanceModes: this.resistanceModes, - ...this.resistSchema - }; - if (s.resistanceModes.push(e), s.parentCsqID = void 0, e === "resist") { - if (!(t != null && t.isResolved)) - throw new Error("Cannot transform to resisted consequence without a resolved resistance roll instance."); - s.resistanceRollData = t.data; - } - this.wasResisted || s.type === $t.None ? s.acceptanceMode = "base" : e === "resist" && !this.canResistWithArmor && !this.canResistWithSpecial && (s.acceptanceMode = e), await this.updateTargetData(s), s.acceptanceMode ? socketlib.system.executeForEveryone("acceptConsequence_SocketCall", this.id) : socketlib.system.executeForEveryone("resistConsequence_SocketCall", this.id); - } - // #endregion - // #region *** ACCEPTING CONSEQUENCES *** - async acceptConsequence() { - this.isAccepted || (await this.updateTarget("acceptanceMode", v.getLast(this.resistanceModes) ?? "accept"), socketlib.system.executeForEveryone("acceptConsequence_SocketCall", this.id)); - } - async applyConsequenceEffects() { - if (/Harm/.test(this.type)) - this.primary.applyHarm( - v.pInt(this.type.substring(this.type.length - 1)), - this.name - ); - else if (this.type === $t.WorsePosition) - this.primary.applyWorsePosition(); - else if (this.type === $t.ReducedEffect) { - const e = Object.values(dt).findIndex((t) => t === this.effect); - if (e >= 1) { - const t = Object.values(dt)[e - 1]; - await this.updateTarget("rollData.rollEffectFinal", t); - } - } - } - // #endregion - // #region === CONSTRUCTOR === ~ - // constructor( - // config: BladesConsequence.Config, - // parentCsq?: BladesConsequence.Data - // ) - // constructor( - // data: BladesConsequence.Data - // ) - // constructor( - // schema: Partial, - // parentCsq: BladesConsequence.Data - // ) - // constructor( - // dataConfigOrSchema: BladesConsequence.Config | BladesConsequence.Data | Partial, - // parentCsq?: BladesConsequence.Data - // ) { - // // If a parentCsq is provided... - // if (parentCsq) { - // super({ - // ...BladesTargetLink.BuildLinkConfig(parentCsq), - // ...dataConfigOrSchema - // }); - // } else { - // super(dataConfigOrSchema as BladesConsequence.Config | BladesConsequence.Data); - // } - // } - // #endregion - // #region *** HTML INTERACTION *** - // #region *** BladesDialog *** ~ - // #endregion - // #region *** BladesChat *** ~ - static ApplyChatListeners(e) { - e.elem$.find(".comp.consequence-display-container").each((s, i) => { - if (!$(i).hasClass("consequence-accepted")) { - const r = $(i).find(".consequence-icon-container"), o = $(i).find(".interaction-pad-right"), n = $(i).find(".interaction-pad-left"), l = $(i).find(".interaction-pad-left-resist"), c = $(i).find(".interaction-pad-left-armor"), u = $(i).find(".interaction-pad-left-special"); - $(i).data("hoverTimeline", v.gsap.effects.csqEnter(i)), $(i).on({ - mouseenter: function() { - $(i).css("z-index", 10), $(i).data("hoverTimeline").play(); - }, - mouseleave: function() { - (!(r.data("isToggled") || r.data("isTogglingOn")) || r.data("isTogglingOff")) && $(i).data("hoverTimeline").reverse().then(() => { - $(i).css("z-index", ""); - }); - } - }), r.data("clickTimeline", v.gsap.effects.csqClickIcon(r[0])), r.on({ - click: function() { - r.data("isToggled") || r.data("isTogglingOn") ? (r.data("isTogglingOn", !1), r.data("isTogglingOff", !0), r.data("clickTimeline").reverse().then(() => { - r.data("isTogglingOff", !1), r.data("isToggled", !1); - })) : (r.data("isTogglingOn", !0), r.data("isTogglingOff", !1), Array.from($(i).siblings(".consequence-display-container")).forEach((g) => { - const f = $(g).find(".consequence-icon-container"); - (f != null && f.data("isToggled") || f != null && f.data("isTogglingOn")) && (f.data("isTogglingOn", !1), f.data("isTogglingOff", !0), f.data("clickTimeline").reverse().then(() => { - f.data("isTogglingOff", !1), f.data("isToggled", !1), $(g).data("hoverTimeline").reverse().then(() => { - $(g).css("z-index", ""); - }); - })); - }), r.data("clickTimeline").play().then(() => { - r.data("isTogglingOn", !1), r.data("isToggled", !0); - })); - } - }), o.data("hoverTimeline", v.gsap.effects.csqEnterRight(i)), o.on({ - mouseenter: function() { - r.data("isToggled") && o.data("hoverTimeline").play(); - }, - mouseleave: function() { - o.data("hoverTimeline").reverse(); - } - }), n.data("hoverTimeline", v.gsap.effects.csqEnterLeft(i)), n.on({ - mouseenter: function() { - r.data("isToggled") && n.data("hoverTimeline").play(); - }, - mouseleave: function() { - n.data("hoverTimeline").reverse(); - } - }), l.data("hoverTimeline", v.gsap.effects.csqEnterSubLeft(i, { type: "resist" })), l.on({ - mouseenter: function() { - r.data("isToggled") && l.data("hoverTimeline").play(); - }, - mouseleave: function() { - r.data("isToggled") && l.data("hoverTimeline").reverse(); - } - }), c.data("hoverTimeline", v.gsap.effects.csqEnterSubLeft(i, { type: "armor" })), c.on({ - mouseenter: function() { - r.data("isToggled") && c.data("hoverTimeline").play(); - }, - mouseleave: function() { - r.data("isToggled") && c.data("hoverTimeline").reverse(); - } - }), u.data("hoverTimeline", v.gsap.effects.csqEnterSubLeft(i, { type: "special" })), u.on({ - mouseenter: function() { - r.data("isToggled") && u.data("hoverTimeline").play(); - }, - mouseleave: function() { - r.data("isToggled") && u.data("hoverTimeline").reverse(); - } - }); - } - }); - } - // #endregion - // #endregion -} -function iu(a) { - return !!(a && typeof a == "string" && v.lCase(a) in Is); -} -function ru(a) { - return !!(a && typeof a == "string" && v.lCase(a) in vt); -} -function au(a) { - return !!(a && typeof a == "string" && v.lCase(a) in H); -} -function up(a) { - return typeof a == "string" && a in se; -} -function hp(a) { - return [ - ae.roll, - ae.position, - ae.effect - ].includes(a); -} -function dp(a) { - return !!(a.startsWith("Group_") || ["Assist", "Setup"].includes(a)); -} -class ti extends hs { - constructor(t, s) { - super(t); - Z(this, "isRerendering", !1); - Z(this, "_rollInstance"); - this._rollInstance = s; - } - static ApplySchemaDefaults(t) { - if (!t.name) - throw new Error("name is required for BladesRollMod.Schema"); - return { - key: `${t.name}-positive-roll`, - modType: Oe.general, - section: ae.roll, - posNeg: "positive", - base_status: se.Hidden, - value: 1, - tooltip: "", - ...t - }; - } - static get GMOnlyModStatuses() { - return [se.ForcedOn, se.ForcedOff, se.Hidden]; - } - static getSchemaFromStrings(t) { - const s = v.pullElement(t, (u) => typeof u == "string" && /^na/i.test(u)), i = typeof s == "string" && s.replace(/^.*:/, ""); - if (!i) - throw new Error(`RollMod Missing Name: '${t.join("@")}'`); - const r = v.pullElement(t, (u) => typeof u == "string" && /^cat/i.test(u)), o = typeof r == "string" && r.replace(/^.*:/, ""); - if (!o || !(o in ae)) - throw new Error(`RollMod Missing Category: '${t.join("@")}'`); - const l = (v.pullElement(t, (u) => typeof u == "string" && /^p/i.test(u)) || "posNeg:positive").replace(/^.*:/, ""); - return { - key: `${i}-${l}-${o}`, - name: i, - section: o, - posNeg: l, - base_status: se.ToggledOff, - modType: Oe.general, - tooltip: "", - value: 1, - ...Object.fromEntries( - t.map(c) - ) - }; - function c(u) { - const [g, f] = u.split(/:/); - let h = /\|/.test(f) ? f.split(/\|/) : f, m; - if (/^stat/i.test(g)) - m = "base_status"; - else if (/^val/i.test(g)) - m = "value"; - else if (/^eff|^ekey/i.test(g)) - m = "effectKeys"; - else if (/^side|^ss/i.test(g)) - m = "sideString"; - else if (/^s.*ame/i.test(g)) - m = "source_name"; - else if (/^tool|^tip/i.test(g)) - m = "tooltip"; - else if (/^ty/i.test(g)) - m = "modType"; - else if (/^c.{0,10}r?.{0,3}ty/i.test(g)) - m = "conditionalRollTypes"; - else if (/^a.{0,3}r?.{0,3}y/i.test(g)) - m = "autoRollTypes"; - else if (/^p.{0,10}r?.{0,3}y/i.test(g)) - m = "participantRollTypes"; - else if (/^c.{0,10}r?.{0,3}tr/i.test(g)) - m = "conditionalRollTraits"; - else if (/^a.{0,3}r?.{0,3}tr/i.test(g)) - m = "autoRollTraits"; - else if (/^p.{0,10}r?.{0,3}tr/i.test(g)) - m = "participantRollTypes"; - else - throw new Error(`Bad Roll Mod Key: ${g}`); - m === "base_status" && h === "Conditional" && (h = se.Hidden); - let y; - return ["value"].includes(m) ? y = v.pInt(h) : ["effectKeys", "conditionalRollTypes", "autoRollTypes", "conditionalRollTraits", "autoRollTraits"].includes(m) ? y = [h].flat() : y = h.replace(/%COLON%/g, ":"), [m, y]; - } - } - static ParseDocModsToSchemaSet(t) { - if (t instanceof Ei) - throw new Error("BladesRollMod.ParseDocRollMods cannot be called on a BladesChat document."); - const { roll_mods: s } = t.system; - return !s || s.length === 0 ? [] : s.filter((i) => !!(i && typeof i == "string")).map((i) => this.getSchemaFromStrings(i.split(/@/))); - } - get status() { - return this.userStatus && ti.GMOnlyModStatuses.includes(this.userStatus) ? this.userStatus : this.heldStatus && [se.ToggledOff, se.ToggledOn].includes(this.heldStatus) ? this.userStatus ?? this.heldStatus : this.heldStatus ?? this.userStatus ?? this.baseStatus; - } - get isActive() { - return [se.ToggledOn, se.ForcedOn].includes(this.status); - } - get isVisible() { - return this.status !== se.Hidden; - } - // get flagParams() { - // return [C.SYSTEM_ID, `rollCollab.rollModsData.${this.id}`] as const;} - // async setUserStatusFlag(val: RollModStatus | undefined) { - // } - get isConditional() { - return [ - ...this.conditionalRollTraits, - ...this.autoRollTraits, - ...this.participantRollTraits, - ...this.conditionalRollTypes, - ...this.autoRollTypes, - ...this.participantRollTypes - ].length > 0; - } - get isInInactiveBlock() { - return game.user.isGM ? [se.Hidden, se.ForcedOff, se.ToggledOff].includes(this.status) && (this.isConditional || this.modType === Oe.ability) : [se.ForcedOff, se.ToggledOff].includes(this.status) && (this.isConditional || this.modType === Oe.ability); - } - get isPush() { - return !!(v.lCase(this.name) === "push" || this.effectKeys.find((t) => t === "Is-Push")); - } - get isBasicPush() { - return v.lCase(this.name) === "push"; - } - get stressCost() { - const t = this.effectKeys.filter((i) => i.startsWith("Cost-Stress")); - if (t.length === 0) - return 0; - let s = 0; - return t.forEach((i) => { - const [r] = (i.split(/-/) ?? []).slice(1), [o, n] = (/([A-Za-z]+)(\d*)/.exec(r) ?? []).slice(1); - s += v.pInt(n); - }), s; - } - isValidForRollType() { - switch (this.rollInstance.rollType) { - case Ie.Action: - return !0; - case Ie.Resistance: - case Ie.Fortune: - case Ie.IndulgeVice: - return !(this.isPush || ["bargain", "setup", "assist", "potency"].includes(v.lCase(this.name))); - default: - return !1; - } - } - /** - * Checks if any types or traits apply to the roll instance. - * @param {AnyRollType[]} types The types to check. - * @param {RollTrait[]} traits The traits to check. - * @returns {boolean} - Returns true if any types or traits apply, false otherwise. - */ - checkTypesOrTraits(t, s) { - const i = [this.rollInstance.rollType, this.rollInstance.rollSubType, this.rollInstance.rollDowntimeAction].filter((n) => !!n), r = !this.rollInstance.isParticipantRoll && t.length === 0 || i.some((n) => t.includes(n)), o = !this.rollInstance.isParticipantRoll && s.length === 0 || this.rollInstance.rollTrait && s.includes(this.rollInstance.rollTrait); - return !!(r && o); - } - /** - * Sets the conditional status of the roll mod instance. - * @returns {boolean} - Returns false if the status is ForcedOn or ToggledOff, true if the status is Hidden. - */ - setConditionalStatus() { - return this.isConditional ? this.autoRollTypes.includes(this.rollInstance.rollType) || this.rollInstance.rollSubType && this.autoRollTypes.includes(this.rollInstance.rollSubType) || this.rollInstance.rollDowntimeAction && this.autoRollTypes.includes(this.rollInstance.rollDowntimeAction) ? (this.heldStatus = se.ForcedOn, !1) : this.rollInstance.rollTrait && this.autoRollTraits.includes(this.rollInstance.rollTrait) ? (this.heldStatus = se.ForcedOn, !1) : this.checkTypesOrTraits(this.conditionalRollTypes, this.conditionalRollTraits) ? (this.heldStatus = se.ToggledOff, !1) : this.rollInstance.isParticipantRoll && this.checkTypesOrTraits(this.participantRollTypes, this.participantRollTraits) ? (this.heldStatus = se.ToggledOff, !1) : (this.heldStatus = se.Hidden, !0) : !1; - } - /** - * Sets the auto-reveal/enable status of the roll mod instance. - * @returns {boolean} - Returns false if the status is ForcedOn or ToggledOff, true if the status is Hidden. - */ - setAutoStatus() { - const t = this.effectKeys.filter((s) => s.startsWith("Auto")); - if (t.length === 0) - return !1; - for (const s of t) { - const [i, r] = s.split(/-/) ?? []; - if (v.lCase(r) in wt && this.rollInstance.rollPositionFinal === v.lCase(r)) { - if (i === "AutoRevealOn") - return this.heldStatus = se.ToggledOff, !1; - if (i === "AutoEnableOn") - return this.heldStatus = se.ForcedOn, !1; - } - } - return this.heldStatus = se.Hidden, !0; - } - /** - * Sets the relevancy status of the roll mod instance (i.e. hides irrelevant rollMods). - * @returns {boolean} - Returns true if mod is irrelevant and status is Hidden, false otherwise. - */ - setRelevancyStatus() { - const t = this.effectKeys.filter((i) => /^Negate|^Increase/.test(i)); - return t.length === 0 ? !1 : t.filter((i) => { - const [r, o] = i.split(/-/) ?? []; - if (r === "Negate") { - const n = { - PushCost: () => this.rollInstance.isPushed(), - QualityPenalty: () => { - var l, c; - return this.rollInstance.isTraitRelevant(H.quality) && (((l = this.rollInstance.rollFactors.source[H.quality]) == null ? void 0 : l.value) ?? 0) < (((c = this.rollInstance.rollFactors.opposition[H.quality]) == null ? void 0 : c.value) ?? 0); - }, - ScalePenalty: () => { - var l, c; - return this.rollInstance.isTraitRelevant(H.scale) && (((l = this.rollInstance.rollFactors.source[H.scale]) == null ? void 0 : l.value) ?? 0) < (((c = this.rollInstance.rollFactors.opposition[H.scale]) == null ? void 0 : c.value) ?? 0); - }, - TierPenalty: () => { - var l, c; - return this.rollInstance.isTraitRelevant(H.tier) && (((l = this.rollInstance.rollFactors.source[H.tier]) == null ? void 0 : l.value) ?? 0) < (((c = this.rollInstance.rollFactors.opposition[H.tier]) == null ? void 0 : c.value) ?? 0); - } - }; - if (Object.hasOwn(n, o)) - return n[o](); - throw new Error(`Unrecognized Negate parameter: ${o}`); - } else if (r === "Increase") { - const [n, l] = /(\w+)\d+/.exec(o) ?? []; - return this.rollInstance.isTraitRelevant(l); - } else - throw new Error(`Unrecognized Function Key: ${r}`); - }).length === 0 ? (this.heldStatus = se.Hidden, !0) : !1; - } - /** - * Sets the payable status of the roll mod instance (i.e. forces off rollMods the primary can't pay for). - * @returns {boolean} - Returns true if mod is unpayable and status is ForcedOff, false otherwise. - */ - setPayableStatus() { - const t = this.effectKeys.filter((i) => i.startsWith("Cost")); - return t.length === 0 ? !1 : t.filter((i) => { - const [r] = (i.split(/-/) ?? []).slice(1), [o, n] = (/([A-Za-z]+)(\d*)/.exec(r) ?? []).slice(1), { rollPrimaryDoc: l } = this.rollInstance.rollPrimary ?? {}; - if (!Me.IsDoc(l)) - return !1; - switch (o) { - case "SpecialArmor": - return oe.IsType(l, z.pc) && l.system.armor.active.special && !l.system.armor.checked.special; - case "Stress": { - const c = v.pInt(n); - return oe.IsType(l, z.pc) && l.system.stress.max - l.system.stress.value >= c; - } - case "Heat": - return Te.IsType(l) && Lt.IsType(l.crew) || Lt.IsType( - l - ); - default: - throw new Error(`Unrecognize Payable Key: ${o}`); - } - }).length === 0 ? (this.heldStatus = se.ForcedOff, !0) : !1; - } - applyRollModEffectKeys() { - if (!this.isActive) - return; - const t = this.effectKeys.filter((s) => /^Negate|^Increase/.test(s)).map((s) => s.split(/-/)); - t.length !== 0 && t.forEach(([s, i]) => { - if (s === "Negate") { - const r = { - PushCost: () => { - this.rollInstance.negatePushCost(); - }, - QualityPenalty: () => { - this.rollInstance.negateFactorPenalty(H.quality); - }, - ScalePenalty: () => { - this.rollInstance.negateFactorPenalty(H.scale); - }, - TierPenalty: () => { - this.rollInstance.negateFactorPenalty(H.tier); - } - }; - if (Object.hasOwn(r, i)) - return r[i](); - throw new Error(`Unrecognized Negate parameter: ${i}`); - } else if (s === "Increase") { - const [r, o] = /(\w+)\d+/.exec(i) ?? []; - return this.rollInstance.isTraitRelevant(o); - } else - throw new Error(`Unrecognized Function Key: ${s} (key: ${s})`); - }); - } - get selectOptions() { - return this.modType !== Oe.teamwork ? null : this.name === "Assist" || this.name === "Setup" ? this.rollInstance.rollParticipantSelectOptions[this.name] : this.name.startsWith("Group_") ? this.rollInstance.rollParticipantSelectOptions.Group : null; - } - get selectedParticipant() { - return this.modType !== Oe.teamwork ? null : this.rollInstance.getRollParticipant(this.section, this.name); - } - get allFlagData() { - return this.rollInstance.data; - } - get costs() { - if (!this.isActive) - return; - const t = this.effectKeys.filter((s) => s.startsWith("Cost")); - if (t.length !== 0) - return t.map((s) => { - const [i] = (s.split(/-/) ?? []).slice(1), [r, o] = (/([A-Za-z]+)(\d*)/.exec(i) ?? []).slice(1); - let n = this.name; - if (this.isBasicPush) - if (this.posNeg === "negative") - n = `${this.name} (To Act)`; - else { - const l = this.section === ae.roll ? "+1d" : "+1 effect"; - n = `${this.name} (${l})`; - } - return { - id: this.id, - label: n, - costType: r, - costAmount: o ? v.pInt(o) : 1 - }; - }); - } - get rollInstance() { - return this._rollInstance; - } - get name() { - return this.data.name; - } - get modType() { - return this.data.modType; - } - get sourceName() { - return this.data.source_name ?? this.data.name; - } - get section() { - return this.data.section; - } - get posNeg() { - return this.data.posNeg; - } - get userStatus() { - return this.data.user_status; - } - set userStatus(t) { - if (t === this.userStatus) - return; - const { isRerendering: s } = this; - if (!t || t === this.baseStatus) - this.updateTarget("user_status", null).then(() => { - s && this.rollInstance.renderRollCollab_SocketCall(); - }); - else { - if (!game.user.isGM && (ti.GMOnlyModStatuses.includes(t) || this.userStatus && ti.GMOnlyModStatuses.includes(this.userStatus))) - return; - this.updateTarget("user_status", t).then(() => { - s && this.rollInstance.renderRollCollab_SocketCall(); - }); - } - } - get baseStatus() { - return this.data.base_status; - } - get heldStatus() { - return this.data.held_status; - } - set heldStatus(t) { - if (t === this.heldStatus) - return; - const { isRerendering: s } = this; - t ? this.updateTarget("held_status", t).then(() => { - s && this.rollInstance.renderRollCollab_SocketCall(); - }) : this.updateTarget("held_status", null).then(() => { - s && this.rollInstance.renderRollCollab_SocketCall(); - }); - } - get value() { - return this.data.value; - } - get effectKeys() { - return this.data.effectKeys ?? []; - } - get sideString() { - if (this.data.sideString) - return this.data.sideString; - if (this.selectedParticipant) - return this.selectedParticipant.rollParticipantName; - } - get tooltip() { - let t = this.data.tooltip.replace(/%COLON%/g, ":"); - return t.includes("%DOC_NAME%") && (t = t.replace( - /%DOC_NAME%/g, - this.selectedParticipant ? this.selectedParticipant.rollParticipantName : "an Ally" - )), t.includes("@OPPOSITION_NAME@") && (t = t.replace( - /@OPPOSITION_NAME@/g, - this.rollInstance.rollOpposition ? this.rollInstance.rollOpposition.rollOppName : "Your Opposition" - )), t; - } - get conditionalRollTypes() { - return this.data.conditionalRollTypes ?? []; - } - get autoRollTypes() { - return this.data.autoRollTypes ?? []; - } - get participantRollTypes() { - return this.data.participantRollTypes ?? []; - } - get conditionalRollTraits() { - return this.data.conditionalRollTraits ?? []; - } - get autoRollTraits() { - return this.data.autoRollTraits ?? []; - } - get participantRollTraits() { - return this.data.participantRollTraits ?? []; - } -} -class Me { - constructor(...e) { - // #endregion - Z(this, "rollInstance"); - Z(this, "rollPrimaryID"); - Z(this, "_rollPrimaryDoc"); - Z(this, "rollPrimaryName"); - Z(this, "rollPrimaryType"); - Z(this, "rollPrimaryImg"); - Z(this, "rollPrimaryModsSchemaSet"); - Z(this, "rollFactors"); - let t = !1, s = !1; - if (e[0] instanceof Si && (this.rollInstance = e[0], e.shift()), Me.IsDoc(e[0]) ? s = e[0] : Me.IsValidData(e[0]) ? t = e[0] : v.isList(e[0]) && ("rollPrimaryID" in e[0] ? s = Me.GetDoc(e[0].rollPrimaryID) : "rollPrimaryName" in e[0] && (s = Me.GetDoc(e[0].rollPrimaryName))), s && !Me.IsValidData(t) && (t = { - rollPrimaryID: s.rollPrimaryID, - rollPrimaryName: s.rollPrimaryName, - rollPrimaryType: s.rollPrimaryType, - rollPrimaryImg: s.rollPrimaryImg, - rollPrimaryModsSchemaSet: s.rollPrimaryModsSchemaSet, - rollFactors: s.rollFactors - }), !Me.IsValidData(t) && !Me.IsDoc(s) && this.rollInstance && (t = this.rollInstance.rollPrimary.data), !Me.IsValidData(t)) - throw new Error(`[BladesRoll.constructor] Failed to resolve primary data from provided arguments: ${JSON.stringify(e)}`); - const { - rollPrimaryID: i, - rollPrimaryName: r, - rollPrimaryType: o, - rollPrimaryImg: n, - rollPrimaryModsSchemaSet: l, - rollFactors: c - } = t; - if (this.rollPrimaryID = i, !r) - throw new Error("Must include a rollPrimaryName when constructing a BladesRollPrimary object."); - if (!n) - throw new Error("Must include a rollPrimaryImg when constructing a BladesRollPrimary object."); - if (!o) - throw new Error("Must include a rollPrimaryType when constructing a BladesRollPrimary object."); - if (!c) - throw new Error("Must include a rollFactors when constructing a BladesRollPrimary object."); - this.rollPrimaryName = r, this.rollPrimaryType = o, this.rollPrimaryImg = n, this.rollFactors = c, this.rollPrimaryModsSchemaSet = l ?? []; - } - // #region Static Methods ~ - static IsValidData(e) { - return Me.IsDoc(e) ? !1 : v.isList(e) && typeof e.rollPrimaryName == "string" && typeof e.rollPrimaryType == "string" && typeof e.rollPrimaryImg == "string" && Array.isArray(e.rollPrimaryModsSchemaSet) && v.isList(e.rollFactors) && (!e.rollPrimaryID || typeof e.rollPrimaryID == "string") && (!e.rollPrimaryDoc || Me.IsDoc(e.rollPrimaryDoc)); - } - static GetDoc(e) { - let t = e; - return typeof e == "string" && (t = game.actors.get(e) ?? game.items.get(e) ?? game.actors.getName(e) ?? game.items.getName(e)), Me.IsDoc(t) && t; - } - static IsDoc(e) { - return oe.IsType(e, z.pc, z.crew) || te.IsType(e, x.cohort_expert, x.cohort_gang, x.gm_tracker); - } - static GetDataFromDoc(e) { - return { - rollPrimaryID: e.id, - rollPrimaryName: e.name, - rollPrimaryType: e.type, - rollPrimaryImg: e.img, - rollPrimaryModsSchemaSet: e.rollPrimaryModsSchemaSet, - rollFactors: e.rollFactors - }; - } - static BuildData(e) { - if (Me.IsValidData(e.rollPrimaryData)) - return e.rollPrimaryData; - let t; - const s = game.users.get(e.rollUserID ?? game.user.id); - if ("target" in e && Me.IsDoc(e.target)) - t = e.target; - else if (s && Me.IsDoc(s.character)) - t = s.character; - else - throw new Error("[BladesRollPrimary.BuildData()] A valid source of PrimaryData must be provided to construct a roll."); - return { - rollPrimaryID: t.rollPrimaryID, - rollPrimaryName: t.rollPrimaryName, - rollPrimaryType: t.rollPrimaryType, - rollPrimaryImg: t.rollPrimaryImg, - rollPrimaryModsSchemaSet: t.rollPrimaryModsSchemaSet, - rollFactors: t.rollFactors - }; - } - static Build(e) { - return new Me(this.BuildData(e)); - } - get rollPrimaryDoc() { - if (!this._rollPrimaryDoc) { - let e; - this.rollPrimaryID && (e = game.items.get(this.rollPrimaryID) ?? game.actors.get(this.rollPrimaryID)), !e && this.rollPrimaryName && (e = game.items.getName(this.rollPrimaryName) ?? game.actors.getName(this.rollPrimaryName)), Me.IsDoc(e) && (this._rollPrimaryDoc = e); - } - return this._rollPrimaryDoc; - } - get data() { - return { - rollPrimaryID: this.rollPrimaryID, - rollPrimaryName: this.rollPrimaryName, - rollPrimaryType: this.rollPrimaryType, - rollPrimaryImg: this.rollPrimaryImg, - rollPrimaryModsSchemaSet: this.rollPrimaryModsSchemaSet, - rollFactors: this.rollFactors - }; - } - get isWorsePosition() { - return this.rollPrimaryDoc ? this.rollPrimaryDoc.getFlag("eunos-blades", "isWorsePosition") === !0 : !1; - } - async applyHarm(e, t) { - if (this.rollPrimaryDoc) - return this.rollPrimaryDoc.applyHarm(e, t); - } - async applyWorsePosition() { - if (this.rollPrimaryDoc) - return this.rollPrimaryDoc.applyWorsePosition(); - } - get hasSpecialArmor() { - return Te.IsType(this.rollPrimaryDoc) && this.rollPrimaryDoc.isSpecialArmorAvailable; - } - get availableArmorCount() { - return Te.IsType(this.rollPrimaryDoc) ? this.rollPrimaryDoc.availableArmor.length : te.IsType(this.rollPrimaryDoc, x.cohort_gang, x.cohort_expert) ? this.rollPrimaryDoc.system.armor.max - this.rollPrimaryDoc.system.armor.value : 0; - } - async spendArmor(e) { - var t; - if (!this.rollPrimaryDoc) - throw new Error("[BladesRollPrimary.spendArmor()] Cannot spend armor when rollPrimaryDoc is not defined."); - if (e > this.availableArmorCount) - throw new Error(`[BladesRollPrimary.spendArmor()] Cannot spend more armor (${e}) than ${(t = this.rollPrimaryDoc) == null ? void 0 : t.name} has (${this.availableArmorCount}).`); - if (Te.IsType(this.rollPrimaryDoc)) { - const s = this.rollPrimaryDoc.availableArmor.slice(0, e), i = {}; - s.includes("Light Armor") && (i["system.armor.active.light"] = !0, i["system.armor.checked.light"] = !0), s.includes("Heavy Armor") && (i["system.armor.active.heavy"] = !0, i["system.armor.checked.heavy"] = !0), await this.rollPrimaryDoc.update(i); - } else - te.IsType(this.rollPrimaryDoc, x.cohort_gang, x.cohort_expert) && await this.rollPrimaryDoc.update({ "system.armor.value": this.rollPrimaryDoc.system.armor.value + e }); - } - // #endregion -} -class Ft { - // #region Constructor ~ - constructor(e, { - rollOppID: t, - rollOppName: s, - rollOppSubName: i, - rollOppType: r, - rollOppImg: o, - rollOppModsSchemaSet: n, - rollFactors: l - } = {}) { - // #endregion - Z(this, "rollInstance"); - Z(this, "rollOppID"); - Z(this, "rollOppDoc"); - Z(this, "rollOppName"); - Z(this, "rollOppSubName"); - Z(this, "rollOppType"); - Z(this, "rollOppImg"); - Z(this, "rollOppModsSchemaSet"); - Z(this, "rollFactors"); - this.rollInstance = e; - const c = Ft.GetDoc(t ?? s); - if (c && (this.rollOppDoc = c, t = c.rollOppID, s ?? (s = c.rollOppName), i ?? (i = c.rollOppSubName), r ?? (r = c.rollOppType), o ?? (o = c.rollOppImg), n = [ - ...n ?? [], - ...c.rollOppModsSchemaSet ?? [] - ], l = { - ...c.rollFactors, - ...l ?? {} - }), !s) - throw new Error("Must include a rollOppName when constructing a BladesRollOpposition object."); - if (!r) - throw new Error("Must include a rollOppType when constructing a BladesRollOpposition object."); - if (!l) - throw new Error("Must include a rollFactors when constructing a BladesRollOpposition object."); - this.rollOppID = t, this.rollOppName = s, this.rollOppSubName = i, this.rollOppType = r, this.rollOppImg = o ?? "", this.rollOppModsSchemaSet = n ?? [], this.rollFactors = l; - } - // #region Static Methods ~ - static IsValidData(e) { - return Ft.IsDoc(e) ? !0 : v.isList(e) && typeof e.rollOppName == "string" && typeof e.rollOppType == "string" && typeof e.rollOppImg == "string" && (!e.rollOppSubName || typeof e.rollOppSubName == "string") && (!e.rollOppModsSchemaSet || Array.isArray(e.rollOppModsSchemaSet)) && v.isList(e.rollFactors) && (!e.rollOppID || typeof e.rollOppID == "string"); - } - static GetDoc(e) { - let t = e; - return typeof e == "string" && (t = game.actors.get(e) ?? game.items.get(e) ?? game.actors.getName(e) ?? game.items.getName(e)), Ft.IsDoc(t) ? t : !1; - } - static IsDoc(e) { - return oe.IsType( - e, - z.npc, - z.faction - ) || te.IsType( - e, - x.cohort_expert, - x.cohort_gang - ); - } - static GetDataFromDoc(e) { - return { - rollOppID: e.id, - rollOppName: e.name, - rollOppType: e.type, - rollOppImg: e.img, - rollOppModsSchemaSet: e.rollOppModsSchemaSet, - rollFactors: e.rollFactors - }; - } - // #endregion - get data() { - return { - rollOppID: this.rollOppID, - rollOppName: this.rollOppName, - rollOppSubName: this.rollOppSubName, - rollOppType: this.rollOppType, - rollOppImg: this.rollOppImg, - rollOppModsSchemaSet: this.rollOppModsSchemaSet, - rollFactors: this.rollFactors - }; - } - async updateRollFlags() { - this.rollInstance && (await this.rollInstance.updateTarget("rollOppData", this.data), this.rollInstance.isRendered && socketlib.system.executeForEveryone("renderRollCollab_SocketCall", this.rollInstance.id)); - } - refresh() { - if (!this.rollInstance) - return; - const e = this.rollInstance.data.rollOppData; - return e && (this.rollOppID = e.rollOppID, this.rollOppName = e.rollOppName, this.rollOppSubName = e.rollOppSubName, this.rollOppType = e.rollOppType, this.rollOppImg = e.rollOppImg, this.rollOppModsSchemaSet = e.rollOppModsSchemaSet ?? [], this.rollFactors = e.rollFactors), this; - } -} -class bt { - constructor(e, t, s, i) { - // #endregion - Z(this, "rollInstance"); - Z(this, "rollParticipantID"); - Z(this, "rollParticipantDoc"); - Z(this, "rollParticipantName"); - Z(this, "rollParticipantType"); - Z(this, "rollParticipantIcon"); - Z(this, "rollParticipantSection"); - Z(this, "rollParticipantSubSection"); - Z(this, "rollParticipantModsSchemaSet"); - // As applied to MAIN roll when this participant involved - Z(this, "rollFactors"); - if (this.rollInstance = e, !t) - throw new Error("Must include a rollParticipantSection when constructing a BladesRollParticipant object."); - if (!s) - throw new Error("Must include a rollParticipantSubSection when constructing a BladesRollParticipant object."); - this.rollParticipantSection = t, this.rollParticipantSubSection = s; - const r = bt.IsDoc(i) ? i : bt.GetDoc( - i.rollParticipantID ?? i.rollParticipantName - ); - if (r && (i = r), !i.rollParticipantName) - throw new Error("Must include a rollParticipantName when constructing a BladesRollParticipant object."); - if (!i.rollParticipantType) - throw new Error("Must include a rollParticipantType when constructing a BladesRollParticipant object."); - if (!i.rollFactors) - throw new Error("Must include a rollFactors when constructing a BladesRollParticipant object."); - this.rollParticipantID = i.rollParticipantID, this.rollParticipantName = i.rollParticipantName, this.rollParticipantType = i.rollParticipantType, this.rollParticipantIcon = i.rollParticipantIcon ?? "", this.rollParticipantModsSchemaSet = i.rollParticipantModsSchemaSet ?? [], this.rollFactors = i.rollFactors; - } - // #region Static Methods ~ - static IsValidData(e) { - return bt.IsDoc(e) ? !0 : v.isList(e) && typeof e.rollParticipantName == "string" && typeof e.rollParticipantType == "string" && typeof e.rollParticipantIcon == "string" && (!e.rollParticipantModsSchemaSet || Array.isArray(e.rollParticipantModsSchemaSet)) && v.isList(e.rollFactors) && (!e.rollParticipantID || typeof e.rollParticipantID == "string") && (!e.rollParticipantDoc || bt.IsDoc(e.rollParticipantDoc)); - } - static GetDoc(e) { - let t = e; - return typeof e == "string" && (t = game.actors.get(e) ?? game.items.get(e) ?? game.actors.getName(e) ?? game.items.getName(e)), bt.IsDoc(t) ? t : !1; - } - static IsDoc(e) { - return oe.IsType(e, z.pc, z.crew, z.npc) || te.IsType(e, x.cohort_expert, x.cohort_gang, x.gm_tracker); - } - // #endregion - get data() { - return { - rollParticipantID: this.rollParticipantID, - rollParticipantName: this.rollParticipantName, - rollParticipantType: this.rollParticipantType, - rollParticipantIcon: this.rollParticipantIcon, - rollParticipantModsSchemaSet: this.rollParticipantModsSchemaSet, - rollFactors: this.rollFactors - }; - } - async updateRollFlags() { - await this.rollInstance.updateTarget(`rollParticipantData.${this.rollParticipantSection}.${this.rollParticipantSubSection}`, this.data), this.rollInstance.isRendered && socketlib.system.executeForEveryone("renderRollCollab_SocketCall", this.rollInstance.id); - } - refresh() { - var t; - const e = (t = this.rollInstance.data.rollParticipantData) == null ? void 0 : t[this.rollParticipantSection]; - if (e && this.rollParticipantSubSection in e) { - const s = e[this.rollParticipantSubSection]; - s && (this.rollParticipantID = s.rollParticipantID, this.rollParticipantName = s.rollParticipantName, this.rollParticipantType = s.rollParticipantType, this.rollParticipantIcon = s.rollParticipantIcon, this.rollParticipantModsSchemaSet = s.rollParticipantModsSchemaSet ?? [], this.rollFactors = s.rollFactors); - } - return this; - } -} -const yt = class yt extends hs { - constructor(t) { - super(t); - // #endregion - // #region *** CONSTRUCTOR *** ~ - Z(this, "rollPermission"); - Z(this, "_rollPrimary"); - Z(this, "_rollOpposition"); - Z(this, "_rollParticipants"); - Z(this, "projectSelectOptions"); - Z(this, "_rollTraitValOverride"); - Z(this, "_roll"); - Z(this, "rollFactorPenaltiesNegated", {}); - Z(this, "tempGMBoosts", {}); - Z(this, "getModsDelta", (t) => v.sum([ - ...this.getActiveRollMods(t, "positive").map((s) => s.value), - ...this.getActiveRollMods(t, "negative").map((s) => -s.value) - ])); - Z(this, "_rollMods"); - // #endregion - // #region *** EVALUATING ROLL *** ~ - // #region DICE ~ - Z(this, "_dieVals"); - // #endregion - // #region *** ROLL COLLAB HTML ELEMENT *** - Z(this, "_elem$"); - Z(this, "_overlayPosition", { x: 200, y: 200 }); - // Async _gmControlSelect(event: SelectChangeEvent) { - // event.preventDefault(); - // const elem$ = $(event.currentTarget); - // const section = elem$.data("rollSection"); - // const subSection = elem$.data("rollSubSection"); - // const selectedOption = elem$.val(); - // if (typeof selectedOption !== "string") { return; } - // if (selectedOption === "false") { - // await this.document.unsetFlag(C.SYSTEM_ID, `rollCollab.rollParticipantData.${section}.${subSection}`); - // } - // await this.addRollParticipant(selectedOption, section, subSection); - // } - // #endregion - // #region ACTIVATE LISTENERS ~ - Z(this, "_positionDragger"); - if (this.rollPermission = this.data.userPermissions[game.user.id], this._rollPrimary = new Me(this, this.data.rollPrimaryData), this.data.rollOppData ? this._rollOpposition = new Ft(this, this.data.rollOppData) : this.data.rollDowntimeAction === we.LongTermProject && (this.projectSelectOptions = Array.from(game.items).filter((s) => te.IsType(s, x.project)).map((s) => ({ value: s.id ?? "", display: s.name }))), this.data.rollParticipantData) { - this._rollParticipants = {}; - for (const [s, i] of Object.entries(this.data.rollParticipantData)) - if ([ae.roll, ae.position, ae.effect].includes(s) && !v.isEmpty(i)) { - const r = {}; - for (const [o, n] of Object.entries(i)) - r[o] = new bt( - this, - s, - o, - n - ); - this._rollParticipants[s] = r; - } - } - game.eunoblades.Rolls.set(this.id, this); - } - // #region STATIC METHODS: INITIALIZATION & DEFAULTS ~ - static Initialize() { - return loadTemplates([ - "systems/eunos-blades/templates/roll/partials/roll-collab-gm-number-line.hbs", - "systems/eunos-blades/templates/roll/partials/roll-collab-gm-select-doc.hbs", - "systems/eunos-blades/templates/roll/partials/roll-collab-gm-factor-control.hbs", - "systems/eunos-blades/templates/roll/roll-collab-action.hbs", - "systems/eunos-blades/templates/roll/roll-collab-action-gm.hbs", - "systems/eunos-blades/templates/roll/roll-collab-resistance.hbs", - "systems/eunos-blades/templates/roll/roll-collab-resistance-gm.hbs", - "systems/eunos-blades/templates/roll/roll-collab-fortune.hbs", - "systems/eunos-blades/templates/roll/roll-collab-fortune-gm.hbs", - "systems/eunos-blades/templates/roll/roll-collab-indulgevice.hbs", - "systems/eunos-blades/templates/roll/roll-collab-indulgevice-gm.hbs" - ]); - } - static InitSockets() { - socketlib.system.register("constructRollCollab_SocketCall", yt.constructRollCollab_SocketResponse.bind(yt)), socketlib.system.register("renderRollCollab_SocketCall", yt.renderRollCollab_SocketResponse.bind(yt)), socketlib.system.register("closeRollCollab_SocketCall", yt.closeRollCollab_SocketResponse.bind(yt)); - } - static ParseConfigToData(t, s) { - if (!game.eunoblades.Rolls.get(s.id)) - throw new Error(`[BladesRoll.ParseConfigToData] No BladesRoll instance found with id ${s.id}.`); - return t.rollPrimaryData instanceof Me && (t.rollPrimaryData = t.rollPrimaryData.data), t.rollOppData instanceof Ft && (t.rollOppData = t.rollOppData.data), t.rollParticipantData && (t.rollParticipantData[ae.roll] && Object.keys(t.rollParticipantData[ae.roll]).forEach((r) => { - var n, l; - const o = (l = (n = t.rollParticipantData) == null ? void 0 : n[ae.roll]) == null ? void 0 : l[r]; - o instanceof bt && (t.rollParticipantData[ae.roll][r] = o.data); - }), t.rollParticipantData[ae.position] && Object.keys(t.rollParticipantData[ae.position]).forEach((r) => { - var n, l; - const o = (l = (n = t.rollParticipantData) == null ? void 0 : n[ae.position]) == null ? void 0 : l[r]; - o instanceof bt && (t.rollParticipantData[ae.position][r] = o.data); - }), t.rollParticipantData[ae.effect] && Object.keys(t.rollParticipantData[ae.effect]).forEach((r) => { - var n, l; - const o = (l = (n = t.rollParticipantData) == null ? void 0 : n[ae.effect]) == null ? void 0 : l[r]; - o instanceof bt && (t.rollParticipantData[ae.effect][r] = o.data); - })), super.ParseConfigToData(t); - } - static ApplySchemaDefaults(t) { - if (!t.rollType) - throw new Error("Must include a rollType when constructing a BladesRoll object."); - return t.rollPhase ?? (t.rollPhase = zs.Collaboration), t.GMBoosts = { - [H.tier]: 0, - [H.quality]: 0, - [H.scale]: 0, - [H.magnitude]: 0, - ...t.GMBoosts ?? {} - }, t.GMOppBoosts = { - [H.tier]: 0, - [H.quality]: 0, - [H.scale]: 0, - [H.magnitude]: 0, - ...t.GMOppBoosts ?? {} - }, t.GMOverrides ?? (t.GMOverrides = {}), t.userPermissions ?? (t.userPermissions = {}), t.rollPrimaryData instanceof Me && (t.rollPrimaryData = t.rollPrimaryData.data), t.rollOppData instanceof Ft && (t.rollOppData = t.rollOppData.data), t; - } - // static override get defaultOptions() { - // return foundry.utils.mergeObject(super.defaultOptions, { - // classes: ["eunos-blades", "sheet", "roll-collab", game.user.isGM ? "gm-roll-collab" : ""], - // template: `systems/eunos-blades/templates/roll/roll-collab${game.user.isGM ? "-gm" : ""}.hbs`, - // submitOnChange: true, - // width: 500, - // dragDrop: [ - // {dragSelector: null, dropSelector: "[data-action='gm-drop-opposition'"} - // ] - // // Height: 500 - // }); - // } - static get DefaultRollModSchemaSet() { - return []; - } - static GetDieClass(t, s, i, r) { - switch (t) { - case Ie.Resistance: - return i === 6 && r <= 1 && s === -1 ? "blades-die-critical" : r === 0 ? "blades-die-resistance" : "blades-die-fail"; - case Ie.IndulgeVice: - return r === 0 ? "blades-die-indulge-vice" : "blades-die-fail"; - } - return i === 6 && r <= 1 && s === ze.critical && i++, [ - "", - "blades-die-fail", - "blades-die-fail", - "blades-die-fail", - "blades-die-partial", - "blades-die-partial", - "blades-die-success", - "blades-die-critical" - ][i]; - } - static GetDieImage(t, s, i, r, o = !1, n = !1) { - let l = "systems/eunos-blades/assets/dice/image/"; - return o ? l += "ghost-" : [Ie.Resistance, Ie.IndulgeVice].includes(t) && (l += "grad-"), l += i, !o && i === 6 && r <= 1 && n && (l += "-crit"), l += ".webp", l; - } - static get Active() { - return v.getLast(game.eunoblades.Rolls.filter((t) => t.isActive)); - } - // #endregion - // #region STATIC METHODS: New Roll Creation ~ - // static Current: Record = {}; - // static _Active?: BladesRoll; - // static get Active(): BladesRoll | undefined { - // if (BladesRoll._Active) {return BladesRoll._Active;} - // if (U.objSize(BladesRoll.Current) > 0) {return U.getLast(Object.values(BladesRoll.Current));} - // return undefined; - // } - // static set Active(val: BladesRoll | undefined) { - // BladesRoll._Active = val; - // } - static GetUserPermissions(t) { - var u, g, f, h; - if (!t.rollPrimaryData) - throw new Error("[BladesRoll.GetUserPermissions()] Missing rollPrimaryData."); - const s = (u = game.users.find((m) => m.isGM)) == null ? void 0 : u.id; - if (!s) - throw new Error("[BladesRoll.GetUserPermissions()] No GM found!"); - const i = game.users.filter((m) => Te.IsType(m.character) && !m.isGM && typeof m.id == "string").map((m) => m.id), r = { - [ht.GM]: [s], - [ht.Primary]: [], - [ht.Participant]: [], - [ht.Observer]: [] - }, { rollPrimaryDoc: o } = new Me(t.rollPrimaryData); - Te.IsType(o) && v.pullElement(i, (g = o.primaryUser) == null ? void 0 : g.id) ? r[ht.Primary].push((f = o.primaryUser) == null ? void 0 : f.id) : Lt.IsType(o) ? r[ht.Primary].push(...i) : te.IsType(o, x.cohort_gang, x.cohort_expert) ? t.rollUserID === s ? r[ht.Primary].push(...i) : Te.IsType(o.parent) && ((h = o.parent.primaryUser) != null && h.id) && r[ht.Primary].push(o.parent.primaryUser.id) : Nr.IsType(o) && r[ht.Primary].push(s), t.rollParticipantData && r[ht.Participant].push(...c(t.rollParticipantData, i)), r[ht.Observer] = i.filter((m) => !r[ht.Participant].includes(m)); - const n = {}; - return Object.entries(r).forEach(([m, y]) => { - for (const k of y) - n[k] = m; - }), n; - function l(m) { - return Object.values(flattenObject(m)).map((y) => { - if (bt.IsDoc(y)) - return y; - if (bt.IsValidData(y) && typeof y.rollParticipantID == "string") { - const k = game.actors.get(y.rollParticipantID) ?? game.items.get(y.rollParticipantID); - if (bt.IsDoc(k)) - return k; - } - throw new Error(`[getParticipantDocs] Invalid participant data encountered. Data: ${JSON.stringify(y)}, Expected: "BladesRollParticipant or valid participant data", Function Context: "getParticipantDocs", Participant Data: ${JSON.stringify(m)}`); - }); - } - function c(m, y) { - return l(m).map((k) => { - var T; - return Te.IsType(k) && typeof ((T = k.primaryUser) == null ? void 0 : T.id) == "string" ? k.primaryUser.id : Lt.IsType(k) || te.IsType(k, x.cohort_gang, x.cohort_expert) ? y : null; - }).flat().filter((k) => k !== null && !r[ht.Primary].includes(k)); - } - } - static BuildLinkConfig(t) { - const s = {}; - if ("targetKey" in t && t.targetKey ? s.targetKey = t.targetKey : "targetFlagKey" in t && t.targetFlagKey && (s.targetFlagKey = t.targetFlagKey), "target" in t) - if (v.isDocUUID(t.target)) - s.targetID = t.target; - else if (v.isDocID(t.target)) { - const i = game.actors.get(t.target) ?? game.items.get(t.target) ?? game.messages.get(t.target) ?? game.users.get(t.target); - if (i) - s.targetID = i.uuid; - else - throw new Error(`[BladesRoll.BuildLinkConfig] No target found with id ${t.target}.`); - } else - s.targetID = t.target.uuid; - else if ("targetID" in t) - s.targetID = t.targetID; - else - throw new Error("[BladesRoll.BuildLinkConfig] You must provide a valid target or targetID in the config object."); - if (!s.targetKey && !s.targetFlagKey && (s.targetFlagKey = "rollCollab"), hs.IsValidConfig(s)) - return hs.BuildLinkConfig(s); - throw new Error("[BladesRoll.BuildLinkConfig] Invalid link config."); - } - /** - * Asynchronously creates a new instance of `BladesRoll` or its subclasses. - * - * This generic static method is designed to facilitate the creation of roll instances with - * configurations specific to the type of roll being created. It ensures that the correct type - * of roll instance is returned based on the class it's called on, allowing for a flexible and - * type-safe creation process that can be extended to subclasses of `BladesRoll`. - * - * @template C The class on which `New` is called. This class must extend `BladesRoll` and - * must be constructible with a configuration object that is either a `BladesRoll.Config` or - * a combination of `BladesTargetLink.Data` and a partial `BladesRoll.Schema`. This ensures - * that any subclass of `BladesRoll` can use this method to create instances of itself while - * applying any class-specific configurations or behaviors. - * - * @param {BladesRoll.Config} config The configuration object for creating a new roll instance. - * This configuration includes all necessary data to initialize the roll, such as user permissions, - * roll type, and any modifications or additional data required for the roll's operation. - * - * @returns {Promise>} A promise that resolves to an instance of the class - * from which `New` was called. This allows for the dynamic creation of roll instances based - * on the subclass calling the method, ensuring that the returned instance is of the correct type. - * - * @example - * // Assuming `MyCustomRoll` is a subclass of `BladesRoll` - * MyCustomRoll.New(myConfig).then(instance => { - * // `instance` is of type `MyCustomRoll` - * }); - * - * @remarks - * - The method performs several key operations as part of the roll instance creation process: - * 1. Builds link configuration based on the provided config. - * 2. Prepares roll user flag data to determine permissions for different users. - * 3. Validates that a roll type is defined in the config, throwing an error if not. - * 4. Logs the roll data for debugging or auditing purposes. - * 5. Constructs and initializes the roll instance, including setting up roll modifications - * and sending out socket calls to inform all users about the roll. - * - This method is central to the dynamic and flexible creation of roll instances within the - * system, allowing for easy extension and customization in subclasses of `BladesRoll`. - */ - static async New(t) { - const s = this.BuildLinkConfig(t); - if (t.userPermissions = this.GetUserPermissions(t), !t.rollType) - throw new Error("rollType must be defined in config"); - eLog.checkLog3("bladesRoll", "BladesRoll.NewRoll()", { config: t }); - const i = await this.Create({ ...t, ...s }); - return i.isInitPromiseResolved ? eLog.checkLog3("bladesRoll", "BladesRoll Init Promise Resolved After Awaiting Create") : (eLog.checkLog3("bladesRoll", "BladesRoll Init Promise NOT Resolved After Awaiting Create"), await v.waitFor(i.initPromise)), i.constructRollCollab_SocketCall(i.linkData), i; - } - async initTargetLink() { - this.initialSchema.rollModsData = this.rollModsDataSet, super.initTargetLink(); - } - get rollModsSchemaSets() { - var s; - const t = []; - return this.rollPrimary && t.push( - ...this.rollPrimary.rollPrimaryModsSchemaSet.filter((i) => t.every((r) => r.key !== i.key)) - ), (s = this.rollOpposition) != null && s.rollOppModsSchemaSet && t.push( - ...this.rollOpposition.rollOppModsSchemaSet.filter((i) => t.every((r) => r.key !== i.key)) - ), t.push(...this.constructor.DefaultRollModSchemaSet.filter((i) => t.every((r) => r.key !== i.key))), this.rollDowntimeAction && (t.push({ - key: "HelpFromFriend-positive-roll", - name: "Help From a Friend", - section: ae.position, - base_status: se.ToggledOff, - posNeg: "positive", - modType: Oe.general, - value: 1, - effectKeys: [], - tooltip: "

Help From a Friend

Add +1d if you enlist the help of a friend or contact.

" - }), this.rollDowntimeAction !== we.IndulgeVice && t.push({ - key: "CanBuyResultLevel-positive-after", - name: "Buying Result Level", - section: ae.after, - base_status: se.ForcedOn, - posNeg: "positive", - modType: Oe.general, - value: 0, - effectKeys: [], - tooltip: '

Buying Result Level

After your roll, you can increase the result level by one for each Coin you spend.

' - }), this.rollDowntimeAction === we.AcquireAsset && t.push( - { - key: "RepeatPurchase-positive-roll", - name: "Repeat Purchase", - section: ae.roll, - base_status: se.ToggledOff, - posNeg: "positive", - modType: Oe.general, - value: 1, - effectKeys: [], - tooltip: "

Repeat Purchase Bonus

Add +1d if you have previously acquired this asset or service with a Acquire Asset Downtime activity.

" - }, - { - key: "RestrictedItem-negative-after", - name: "Restricted", - section: ae.after, - base_status: se.Hidden, - posNeg: "negative", - modType: Oe.general, - value: 0, - effectKeys: ["Cost-Heat2"], - tooltip: '

Restricted

Whether contraband goods or dangerous materials, this Acquire Asset Downtime activity will add +2 Heat to your crew.

' - } - )), t; - } - get rollModsDataSet() { - const { linkData: t } = this, s = { - targetID: t.targetID, - isScopingById: !0, - ..."targetKey" in t ? { targetKey: `${this.targetKeyPrefix}.rollModsData` } : {}, - ..."targetFlagKey" in t ? { targetFlagKey: `${this.targetFlagKeyPrefix}.rollModsData` } : {} - }; - return Object.fromEntries( - this.rollModsSchemaSets.map((i) => { - const r = hs.ParseConfigToData( - { - ...ti.ApplySchemaDefaults(i), - ...s - } - ); - return [r.id, r]; - }) - ); - } - // #endregion - // #region SOCKET CALLS & RESPONSES ~ - static GetRollSubClass(t) { - const s = new hs(t); - switch (s.data.rollType) { - case Ie.Action: - return kr; - case Ie.Fortune: - return s.data.rollSubType === ia.Engagement ? Fh : s.data.rollSubType === ia.Incarceration ? Lh : Wa; - case Ie.Resistance: - return s.data.isInlineResistanceRoll ? Oh : ec; - case Ie.IndulgeVice: - return tc; - } - } - constructRollCollab_SocketCall(t) { - socketlib.system.executeForEveryone("constructRollCollab_SocketCall", t); - } - static constructRollCollab_SocketResponse(t) { - const s = new (this.GetRollSubClass(t))(t); - eLog.checkLog3("rollCollab", "constructRollCollab_SocketResponse()", { params: { linkData: t }, rollInst: s }), this.renderRollCollab_SocketResponse(s.id); - } - renderRollCollab_SocketCall() { - socketlib.system.executeForEveryone("renderRollCollab_SocketCall", this.id); - } - static renderRollCollab_SocketResponse(t) { - const s = game.eunoblades.Rolls.get(t); - if (!s) - throw new Error(`[BladesRoll.renderRollCollab_SocketResponse] No roll found with id ${t}.`); - s.renderRollCollab(); - } - closeRollCollab_Animation() { - return v.gsap.effects.blurRemove(this.elem$, { ignoreMargins: !0 }); - } - async closeRollCollab_SocketCall() { - game.user.isGM && (socketlib.system.executeForOthers("closeRollCollab_SocketCall", this.id), await v.waitFor(this.closeRollCollab_Animation())); - } - static closeRollCollab_SocketResponse(t) { - var s; - (s = game.eunoblades.Rolls.get(t)) == null || s.closeRollCollab_Animation(); - } - // #endregion - // #region Roll Participation & User Permissions - async addRollParticipant(t, s, i) { - i || (i = "Assist"); - const r = typeof t == "string" ? game.actors.get(t) ?? game.actors.getName(t) ?? game.items.get(t) ?? game.items.getName(t) : t; - if (!bt.IsValidData(r)) - throw new Error("Bad data."); - await new bt(this, s, i, r).updateRollFlags(), this.isRendered && socketlib.system.executeForEveryone("renderRollCollab_SocketCall", this.id); - } - async removeRollParticipant(t, s) { - await this.updateTarget(`rollParticipantData.${t}.${s}`, null); - } - async updateUserPermission(t, s) { - } - // #endregion - // #region Basic User Flag Getters/Setters ~ - // get data(): BladesRoll.FlagData { - // if (!this.document.getFlag(C.SYSTEM_ID, "rollCollab")) { - // throw new Error("[get flags()] No RollCollab Flags Found on User Document"); - // } - // return this.document.getFlag(C.SYSTEM_ID, "rollCollab") as BladesRoll.FlagData; - // } - get rollPrimary() { - return this._rollPrimary; - } - get rollPrimaryDoc() { - return this.rollPrimary.rollPrimaryDoc; - } - get rollOpposition() { - var t; - return !this._rollOpposition && Ft.IsValidData(this.data.rollOppData) && (this._rollOpposition = new Ft(this, this.data.rollOppData)), (t = this._rollOpposition) == null ? void 0 : t.refresh(); - } - set rollOpposition(t) { - t === void 0 ? this._rollOpposition = void 0 : (this._rollOpposition = t, t.updateRollFlags()); - } - get rollClockKey() { - return this.data.rollClockKey ? game.eunoblades.ClockKeys.get(this.data.rollClockKey) : void 0; - } - set rollClockKey(t) { - this.updateTarget("rollClockKeyID", t ?? null); - } - /** - * This method prepares the roll participant data. - * It iterates over the roll sections (roll, position, effect) and for each section, - * it creates a new BladesRollParticipant instance for each participant in that section. - * The created instances are stored in the rollParticipants object. - */ - prepareRollParticipantData() { - const t = this.data.rollParticipantData; - if (!t) - return; - const s = {}; - [ - ae.roll, - ae.position, - ae.effect - ].forEach((i) => { - const r = t[i]; - if (r) { - const o = {}; - Object.entries(r).forEach(([n, l]) => { - l && (o[n] = new bt(this, i, n, l)); - }), s[i] = o; - } - }), this._rollParticipants = s; - } - get rollParticipants() { - return this._rollParticipants; - } - getRollParticipant(t, s) { - var i; - if (hp(t) && dp(s)) { - const r = (i = this.rollParticipants) == null ? void 0 : i[t]; - if (r) - return r[s] ?? null; - } - return null; - } - get rollParticipantSelectOptions() { - const t = Te.All.filter((s) => s.hasTag(he.PC.ActivePC) && s.id !== this.rollPrimary.rollPrimaryID).map((s) => ({ value: s.id, display: s.name })); - return { - Assist: t, - Setup: t, - Group: t - }; - } - get rollType() { - return this.data.rollType; - } - get rollSubType() { - return this.data.rollSubType; - } - set rollSubType(t) { - this.updateTarget("rollSubType", t ?? null); - } - get rollPhase() { - return this.data.rollPhase ?? zs.Collaboration; - } - get rollDowntimeAction() { - return this.data.rollDowntimeAction; - } - get rollTrait() { - return this.data.rollTrait; - } - get rollTraitVerb() { - if (this.rollTrait && this.rollTrait in Y.ActionVerbs) - return Y.ActionVerbs[this.rollTrait]; - } - get rollTraitPastVerb() { - if (this.rollTrait && this.rollTrait in Y.ActionPastVerbs) - return Y.ActionPastVerbs[this.rollTrait]; - } - get rollTraitValOverride() { - return this._rollTraitValOverride; - } - set rollTraitValOverride(t) { - this._rollTraitValOverride = t; - } - get rollTraitData() { - var t, s; - if (oe.IsType(this.rollPrimaryDoc, z.pc)) { - if (iu(this.rollTrait)) - return { - name: this.rollTrait, - value: this.rollTraitValOverride ?? this.rollPrimaryDoc.actions[this.rollTrait], - max: this.rollTraitValOverride ?? this.rollPrimaryDoc.actions[this.rollTrait], - pcTooltip: this.rollPrimaryDoc.rollTraitPCTooltipActions, - gmTooltip: Y.ActionTooltipsGM[this.rollTrait] - }; - if (ru(this.rollTrait)) - return { - name: this.rollTrait, - value: this.rollTraitValOverride ?? this.rollPrimaryDoc.attributes[this.rollTrait], - max: this.rollTraitValOverride ?? this.rollPrimaryDoc.attributes[this.rollTrait], - pcTooltip: this.rollPrimaryDoc.rollTraitPCTooltipAttributes, - gmTooltip: Y.AttributeTooltips[this.rollTrait] - }; - } - if (v.isInt(this.rollTrait)) - return { - name: `+${this.rollTraitValOverride ?? this.rollTrait}`, - value: this.rollTraitValOverride ?? this.rollTrait, - max: this.rollTraitValOverride ?? this.rollTrait - }; - if (au(this.rollTrait)) - return { - name: v.tCase(this.rollTrait), - value: this.rollTraitValOverride ?? ((t = this.rollPrimary.rollFactors[this.rollTrait]) == null ? void 0 : t.value) ?? 0, - max: this.rollTraitValOverride ?? ((s = this.rollPrimary.rollFactors[this.rollTrait]) == null ? void 0 : s.max) ?? 10 - }; - throw new Error(`[get rollTraitData] Invalid rollTrait: '${this.rollTrait}'`); - } - get rollTraitOptions() { - if (oe.IsType(this.rollPrimaryDoc, z.pc)) { - if (iu(this.rollTrait)) - return Object.values(Is).map((t) => ({ - name: v.uCase(t), - value: t - })); - if (ru(this.rollTrait)) - return Object.values(vt).map((t) => ({ - name: v.uCase(t), - value: t - })); - } - if (v.isInt(this.rollTrait)) - return [1, 2, 3, 4, 5, 6, 7, 8, 9, 10].map((t) => ({ - name: `+${t}`, - value: t - })); - if (au(this.rollTrait)) - return []; - throw new Error(`[get rollTraitOptions] Invalid rollTrait: '${this.rollTrait}'`); - } - get posEffectTrade() { - var t; - return ((t = this.data) == null ? void 0 : t.rollPosEffectTrade) ?? !1; - } - // getFlagVal(flagKey?: string): T | undefined { - // if (flagKey) { - // return this.document.getFlag(C.SYSTEM_ID, `rollCollab.${flagKey}`.replace(/(rollCollab\.)+/g, "rollCollab.")) as T | undefined; - // } - // return this.document.getFlag(C.SYSTEM_ID, "rollCollab") as T | undefined; - // } - // async setFlagVal(flagKey: string, flagVal: unknown, isRerendering = true) { - // await this.document.setFlag(C.SYSTEM_ID, `rollCollab.${flagKey}`.replace(/(rollCollab\.)+/g, "rollCollab."), flagVal); - // if (isRerendering) { - // socketlib.system.executeForEveryone("renderRollCollab_SocketCall", this.id); - // } - // } - // async clearFlagVal(flagKey: string, isRerendering = true) { - // await this.document.unsetFlag(C.SYSTEM_ID, `rollCollab.${flagKey}`.replace(/(rollCollab\.)+/g, "rollCollab.")); - // if (isRerendering) { - // socketlib.system.executeForEveryone("renderRollCollab_SocketCall", this.id); - // } - // } - get initialPosition() { - return this.data.rollPositionInitial ?? wt.risky; - } - set initialPosition(t) { - this.updateTarget("rollPositionInitial", t ?? wt.risky); - } - get initialEffect() { - return this.data.rollEffectInitial ?? dt.standard; - } - set initialEffect(t) { - this.updateTarget("rollEffectInitial", t ?? dt.standard); - } - get isApplyingConsequences() { - return !(this.rollType !== Ie.Action || !this.rollResult || ![ze.partial, ze.fail].includes(this.rollResult)); - } - // Get rollConsequence() --> For resistance rolls. - get rollConsequence() { - const { consequence: t } = this.data.resistanceData ?? {}; - if (t != null && t.id) - return game.eunoblades.Consequences.get(t.id) ?? new Cs(t); - } - // #endregion - // #region GETTERS: DERIVED DATA ~ - get rollPositionFinal() { - return Object.values(wt)[v.clampNum( - Object.values(wt).indexOf(this.initialPosition) + this.getModsDelta(ae.position) + (this.posEffectTrade === "position" ? 1 : 0) + (this.posEffectTrade === "effect" ? -1 : 0), - [0, 2] - )]; - } - get rollEffectFinal() { - return Object.values(dt)[v.clampNum( - Object.values(dt).indexOf(this.initialEffect) + this.getModsDelta(ae.effect) + (this.posEffectTrade === "effect" ? 1 : 0) + (this.posEffectTrade === "position" ? -1 : 0), - [0, 4] - )]; - } - get rollResultDelta() { - var t; - return this.getModsDelta(ae.result) + (((t = this.data) == null ? void 0 : t.GMBoosts.Result) ?? 0) + (this.tempGMBoosts.Result ?? 0); - } - get rollResultFinal() { - if (this.rollResult === !1) - return !1; - if (this.rollResultDelta === 0) - return this.rollResult; - switch (this.rollType) { - case Ie.Action: - case Ie.Fortune: - return Object.values(ze).toReversed()[v.clampNum( - Object.values(ze).toReversed().indexOf(this.rollResult) + this.rollResultDelta, - [0, 3] - )]; - case Ie.Resistance: - return this.isCritical ? -1 : v.clampNum(6 - this.highestDieVal - this.rollResultDelta, [-1, 1 / 0]); - case Ie.IndulgeVice: - return v.clampNum(this.highestDieVal + this.rollResultDelta, [0, 1 / 0]); - } - return !1; - } - get finalDicePool() { - return Math.max(0, this.rollTraitData.value + this.getModsDelta(ae.roll) + (this.data.GMBoosts.Dice ?? 0) + (this.tempGMBoosts.Dice ?? 0)); - } - get isRollingZero() { - return Math.max(0, this.rollTraitData.value + this.getModsDelta(ae.roll) + (this.data.GMBoosts.Dice ?? 0) + (this.tempGMBoosts.Dice ?? 0)) <= 0; - } - get roll() { - return this._roll ?? (this._roll = new Roll(`${this.isRollingZero ? 2 : this.finalDicePool}d6`, {})), this._roll; - } - get rollFactors() { - const t = { - [H.tier]: { - name: "Tier", - value: 0, - max: 0, - baseVal: 0, - display: "?", - isActive: !1, - isPrimary: !0, - isDominant: !1, - highFavorsPC: !0, - cssClasses: "factor-gold" - }, - [H.quality]: { - name: "Quality", - value: 0, - max: 0, - baseVal: 0, - display: "?", - isActive: !1, - isPrimary: !1, - isDominant: !1, - highFavorsPC: !0, - cssClasses: "factor-gold" - }, - [H.scale]: { - name: "Scale", - value: 0, - max: 0, - baseVal: 0, - display: "?", - isActive: !1, - isPrimary: !1, - isDominant: !1, - highFavorsPC: !0, - cssClasses: "factor-gold" - }, - [H.magnitude]: { - name: "Magnitude", - value: 0, - max: 0, - baseVal: 0, - display: "?", - isActive: !1, - isPrimary: !1, - isDominant: !1, - highFavorsPC: !0, - cssClasses: "factor-gold" - } - }, s = v.objMerge( - v.objMerge( - t, - this.rollPrimary.rollFactors, - { isMutatingOk: !1 } - ), - this.data.rollFactorToggles.source, - { isMutatingOk: !1 } - ), i = this.rollOpposition ? v.objMerge( - v.objMerge( - t, - this.rollOpposition.rollFactors, - { isMutatingOk: !1 } - ), - this.data.rollFactorToggles.opposition, - { isMutatingOk: !1 } - ) : {}; - return { - source: Object.fromEntries( - Object.entries(s).map(([r, o]) => (o.value += (this.data.GMBoosts[r] ?? 0) + (this.tempGMBoosts[r] ?? 0), r === H.tier ? o.display = v.romanizeNum(o.value) : o.display = `${o.value}`, [r, o])) - ), - opposition: Object.fromEntries( - Object.entries(i).map(([r, o]) => (o.value += this.data.GMOppBoosts[r] ?? 0, r === H.tier ? o.display = v.romanizeNum(o.value) : o.display = `${o.value}`, [r, o])) - ) - }; - } - // #endregion - // #region ROLL MODS: Getters & Update Method ~ - initRollMods() { - this.rollTraitValOverride = void 0, this.rollFactorPenaltiesNegated = {}, this.tempGMBoosts = {}; - const t = {}; - let s = 0; - const i = (c) => { - if (yt.Debug.modWatch === !1) - return; - const u = `(${s}) == ${c}`, g = this.rollMods.find((f) => yt.Debug.modWatch && yt.Debug.modWatch.exec(f.name)); - g ? t[`${u} : ${g.status}`] = { - inst: g, - data: { ...g.data }, - sourceName: g.sourceName, - status: { - ALL: g.status, - base: g.baseStatus, - held: g.heldStatus, - user: g.userStatus - }, - is: { - active: g.isActive, - visible: g.isVisible, - conditional: g.isConditional, - inInactiveBlock: g.isInInactiveBlock, - isPush: g.isPush, - isBasicPush: g.isBasicPush - } - } : t[u] = "MOD NOT FOUND", s++; - }; - i("INITIAL"), this._rollMods = this.rollMods.filter((c) => c.isValidForRollType()), i("ROLLTYPE VALIDATION"); - const r = this.rollMods.filter((c) => !c.setConditionalStatus()); - i("DISABLE - CONDITIONAL"); - const o = r.filter((c) => !c.setAutoStatus()); - i("DISABLE - AUTO-REVEAL/ENABLE"), o.forEach((c) => { - c.setPayableStatus(); - }), i("DISABLE - PAYABLE"); - const n = (c) => { - var g, f; - const u = c.effectKeys.filter((h) => h.startsWith("ForceOn")); - if (u.length !== 0) - for (; u.length; ) { - const h = (f = (g = u.pop()) == null ? void 0 : g.split(/-/)) == null ? void 0 : f.pop(); - if (h === "BestAction") - Te.IsType(this.rollPrimaryDoc) && (this.rollTraitValOverride = Math.max(...Object.values(this.rollPrimaryDoc.actions))); - else { - const [m, y, k] = (h == null ? void 0 : h.split(/,/)) ?? []; - if (!m) - throw new Error(`No targetName found in thisTarget: ${h}.`); - let T = this.getRollModByName(m) ?? this.getRollModByName(m, y ?? c.section); - if (!T && m === "Push" && ([T] = [ - ...this.getActiveBasicPushMods(y ?? c.section, "negative").filter((S) => S.status === se.ToggledOn), - ...this.getActiveBasicPushMods(y ?? c.section, "positive").filter((S) => S.status === se.ToggledOn), - ...this.getInactiveBasicPushMods(y ?? c.section, "positive").filter((S) => S.status === se.ToggledOff) - ]), T ?? (T = this.getRollModByName(m, y ?? c.section, k ?? c.posNeg)), !T) - throw new Error(`No mod found matching ${m}/${y}/${k}`); - T.isActive ? T.heldStatus = se.ForcedOn : (T.heldStatus = se.ForcedOn, n(T)); - } - } - }; - this.getActiveRollMods().forEach((c) => n(c)), i("FORCE-ON PASS"), this.isForcePushed() && (this.getInactivePushMods().filter((c) => !c.isBasicPush).forEach((c) => { - c.heldStatus = se.ForcedOff; - }), i("PUSH-CHECK: FORCE-OFF IS-PUSH")), [ae.roll, ae.effect].forEach((c) => { - if (this.isPushed(c)) { - if (c === ae.roll && this.isPushed(c, "positive")) { - const u = this.getRollModByKey("Bargain-positive-roll"); - u != null && u.isVisible && (u.heldStatus = se.ForcedOff); - } - i("PUSH-CHECK: FORCE OFF BARGAIN"); - } else - this.getInactivePushMods(c).filter((u) => !u.isBasicPush).forEach((u) => { - u.heldStatus = se.Hidden; - }), i("PUSH-CHECK: HIDE IS-PUSH"); - }), this.getVisibleRollMods().forEach((c) => { - c.setRelevancyStatus(); - }), i("RELEVANCY PASS"), this.getActiveRollMods().find((c) => c.effectKeys.includes("Cost-SpecialArmor")) && (this.getVisibleRollMods().filter((c) => !c.isActive && c.effectKeys.includes("Cost-SpecialArmor")).forEach((c) => { - c.heldStatus = se.ForcedOff; - }), i("OVERPAYMENT PASS")), eLog.checkLog2("rollMods", "*** initRollMods() PASS ***", t); - } - isTraitRelevant(t) { - var s; - if (t in H) { - const { source: i, opposition: r } = this.rollFactors; - return !!(t in i && t in r && ((s = i[t]) != null && s.isActive)); - } - return !1; - } - get isParticipantRoll() { - return this.rollType === Ie.Fortune && !game.user.isGM || this.rollSubType === ia.GroupParticipant; - } - negatePushCost() { - const t = this.getActiveRollMods().find((s) => s.isPush && s.stressCost > 0); - t && v.pullElement(t.effectKeys, (s) => s.startsWith("Cost-Stress")); - } - negateFactorPenalty(t) { - this.rollFactorPenaltiesNegated[t] = !0; - } - isPushed(t, s) { - return this.getActiveBasicPushMods(t, s).length > 0; - } - hasOpenPush(t, s) { - return this.isPushed(t) && this.getOpenPushMods(t, s).length > 0; - } - isForcePushed(t, s) { - return this.isPushed(t) && this.getForcedPushMods(t, s).length > 0; - } - get rollCosts() { - if (!this.isPushed) - return 0; - const t = this.getRollModByKey("Push-negative-roll"), s = this.getRollModByKey("Push-positive-roll"), i = this.getRollModByKey("Push-positive-effect"), r = this.getActiveRollMods(ae.after, "positive").filter((o) => o.effectKeys.includes("Negate-PushCost")); - return ((t == null ? void 0 : t.isActive) && (t == null ? void 0 : t.stressCost) || 0) + ((s == null ? void 0 : s.isActive) && (s == null ? void 0 : s.stressCost) || 0) + ((i == null ? void 0 : i.isActive) && (i == null ? void 0 : i.stressCost) || 0) - r.length * 2; - } - get rollCostData() { - return this.getActiveRollMods().map((t) => t.costs ?? []).flat(); - } - getRollModByID(t) { - return this.rollMods.find((s) => s.id === t); - } - getRollModByName(t, s, i) { - const r = this.rollMods.filter((o) => !(v.lCase(o.name) !== v.lCase(t) || s && o.section !== s || i && o.posNeg !== i)); - if (r.length !== 0 && !(r.length > 1)) - return r[0]; - } - getRollModByKey(t) { - return this.rollMods.find((s) => s.data.key === t); - } - getRollMods(t, s) { - return this.rollMods.filter((i) => (!t || i.section === t) && (!s || i.posNeg === s)); - } - getVisibleRollMods(t, s) { - return this.getRollMods(t, s).filter((i) => i.isVisible); - } - getActiveRollMods(t, s) { - return this.getRollMods(t, s).filter((i) => i.isActive); - } - getVisibleInactiveRollMods(t, s) { - return this.getVisibleRollMods(t, s).filter((i) => !i.isActive); - } - getPushMods(t, s) { - return this.getRollMods(t, s).filter((i) => i.isPush); - } - getVisiblePushMods(t, s) { - return this.getPushMods(t, s).filter((i) => i.isVisible); - } - getActivePushMods(t, s) { - return this.getVisiblePushMods(t, s).filter((i) => i.isActive); - } - getActiveBasicPushMods(t, s) { - return this.getActivePushMods(t, s).filter((i) => i.isBasicPush); - } - getInactivePushMods(t, s) { - return this.getVisiblePushMods(t, s).filter((i) => !i.isActive); - } - getInactiveBasicPushMods(t, s) { - return this.getInactivePushMods(t, s).filter((i) => i.isBasicPush); - } - getForcedPushMods(t, s) { - return this.getActivePushMods(t, s).filter((i) => i.isBasicPush && i.status === se.ForcedOn); - } - getOpenPushMods(t, s) { - return this.getActivePushMods(t, s).filter((i) => i.isBasicPush && i.status === se.ToggledOn); - } - /** - * Compare function for sorting roll mods. - * @param {BladesRollMod} modA First mod to compare. - * @param {BladesRollMod} modB Second mod to compare. - * @returns {number} - Comparison result. - */ - compareMods(t, s) { - const i = ["Bargain", "Assist", "Setup"]; - if (t.isBasicPush) - return -1; - if (s.isBasicPush) - return 1; - if (t.name === "Bargain" && t.isActive) - return -1; - if (s.name === "Bargain" && s.isActive) - return 1; - if (t.isPush) - return -1; - if (s.isPush) - return 1; - const r = i.indexOf(t.name), o = i.indexOf(s.name); - return r !== -1 && o !== -1 ? r - o : t.name.localeCompare(s.name); - } - get rollMods() { - return this._rollMods || (this._rollMods = Object.values(this.data.rollModsData).map((t) => new ti(t, this))), [...this._rollMods].sort((t, s) => this.compareMods(t, s)); - } - // #endregion - // #region CONSEQUENCES: Getting, Accepting, Resisting - get consequences() { - var s, i; - const t = (i = (s = this.data.consequenceData) == null ? void 0 : s[this.rollPositionFinal]) == null ? void 0 : i[this.rollResult]; - return t ? Object.values(t).map((r) => new Cs(r)) : []; - } - getConsequenceByID(t) { - return this.consequences.find((s) => s.id === t) ?? !1; - } - get acceptedConsequences() { - return [zs.AwaitingConsequences, zs.Complete].includes(this.rollPhase) ? this.consequences.filter((t) => t.isAccepted === !0) : []; - } - get unacceptedConsequences() { - return this.rollPhase === zs.AwaitingConsequences ? this.consequences.filter((t) => t.isAccepted !== !0) : []; - } - // #endregion - // #region *** ROLL COLLAB HTML INTERACTION *** ~ - /** - * Retrieve the data for rendering the base RollCollab sheet. - * @returns {Promise} The data which can be used to render the HTML of the sheet. - */ - get context() { - return this.initRollMods(), this.rollMods.forEach((t) => t.applyRollModEffectKeys()), this.getTemplateContext(); - } - /** - * Determines if the user is a game master. - * @returns {boolean} Whether the user is a GM. - */ - getIsGM() { - var t; - return (t = game.eunoblades.Tracker) != null && t.system.is_spoofing_player ? !1 : game.user.isGM; - } - /** - * Gets the roll costs. - * @returns {BladesRoll.CostData[]} The roll costs. - */ - getRollCosts() { - return this.getActiveRollMods().map((t) => t.costs).flat().filter((t) => t !== void 0); - } - /** - * Constructs the sheet data. - * @param {boolean} isGM If the user is a GM. - * @param {BladesRoll.CostData[]} rollCosts The roll costs. - * @returns {BladesRoll.Context} The constructed sheet data. - */ - getTemplateContext() { - var F; - const { - data: t, - rollPrimary: s, - rollTraitData: i, - rollTraitOptions: r, - rollClockKey: o, - finalDicePool: n, - rollPositionFinal: l, - rollEffectFinal: c, - rollResultDelta: u, - rollResultFinal: g, - rollMods: f, - rollFactors: h - } = this; - if (!s) - throw new Error("A primary roll source is required for BladesRoll."); - const m = { - ...this.data, - cssClass: "roll-collab", - isGM: this.isGM, - system: (F = this.rollPrimaryDoc) == null ? void 0 : F.system, - rollMods: f, - rollPrimary: s, - rollTraitData: i, - rollTraitOptions: r, - diceTotal: n, - rollOpposition: this.rollOpposition, - rollParticipants: this.rollParticipants, - rollParticipantOptions: this.rollParticipantSelectOptions, - rollEffects: Object.values(dt), - rollTraitValOverride: this.rollTraitValOverride, - rollFactorPenaltiesNegated: this.rollFactorPenaltiesNegated, - posRollMods: Object.fromEntries(Object.values(ae).map((O) => [O, this.getRollMods(O, "positive")])), - negRollMods: Object.fromEntries(Object.values(ae).map((O) => [O, this.getRollMods(O, "negative")])), - hasInactiveConditionals: this.calculateHasInactiveConditionalsData(), - rollFactors: h, - ...this.calculateOddsHTML(n, u) - }, y = this.calculateGMBoostsData(t), k = this.calculatePositionEffectTradeData(), T = this.getRollCosts().filter((O) => O.costType === "Stress").map((O) => [O.label, O.costAmount]), S = []; - if (this.rollPrimaryDoc instanceof Te) - S.push(...this.rollPrimaryDoc.availableArmor); - else if (te.IsType( - this.rollPrimaryDoc, - x.cohort_gang, - x.cohort_expert - )) - for (let O = 0; O < this.rollPrimaryDoc.system.armor.value; O++) - S.push("Armor"); - const C = this.getRollCosts().filter((O) => O.costType === "Armor").map((O, R) => [O.label, S[R]]).filter(([O, R]) => R !== void 0), I = this.getRollCosts().filter((O) => O.costType === "SpecialArmor").map((O) => O.label), E = m.userPermissions[game.user.id] ?? ht.Observer; - return { - ...m, - rollPrimary: this.rollPrimary, - rollPositionFinal: l, - rollEffectFinal: c, - rollResultFinal: g, - rollPositions: Object.values(wt), - rollEffects: Object.values(dt), - rollResultDelta: u, - isAffectingResult: u !== 0 || this.getVisibleRollMods(ae.result).length > 0 || this.isGM && this.getRollMods(ae.result).length > 0, - isAffectingAfter: this.getVisibleRollMods(ae.after).length > 0 || this.isGM && this.getRollMods(ae.after).length > 0, - ...y, - ...k, - rollClockKey: this.rollClockKey, - totalStressCost: T.reduce((O, [R, L]) => O + L, 0), - totalArmorCost: C.length, - stressCosts: T.length > 0 ? Object.fromEntries(T) : void 0, - armorCosts: C.length > 0 ? Object.fromEntries(C) : void 0, - specArmorCost: I[0], - userPermission: E, - editable: E === ht.Primary || E === ht.GM, - gamePhase: game.eunoblades.Tracker.phase - }; - } - // type BladesSelectOption = { - // value: valueType, - // display: displayType - // }; - // protected processDowntimeActions() { - // const downtimeData: Record; - // if (BladesActor.IsType(this.rollPrimaryDoc, BladesActorType.pc)) { - // downtimeData.canDoDowntimeActions = true; - // downtimeData.downtimeActionsRemaining = this.rollPrimaryDoc.remainingDowntimeActions; - // const availableDowntimeActions: DowntimeAction[] = []; - // if (this.rollType === RollType.Action) { - // availableDowntimeActions.push(...[ - // DowntimeAction.AcquireAsset, - // DowntimeAction.LongTermProject, - // DowntimeAction.Recover, - // DowntimeAction.ReduceHeat - // ]); - // } else if (this.rollType === RollType.Fortune) { - // availableDowntimeActions.push(...[ - // DowntimeAction. - // ]) - // } - // downtimeData.downtimeActionOptions = - // downtimeActionOptions?: Array - // } - calculateGMBoostsData(t) { - return { - GMBoosts: { - Dice: t.GMBoosts.Dice ?? 0, - [H.tier]: t.GMBoosts[H.tier] ?? 0, - [H.quality]: t.GMBoosts[H.quality] ?? 0, - [H.scale]: t.GMBoosts[H.scale] ?? 0, - [H.magnitude]: t.GMBoosts[H.magnitude] ?? 0, - Result: t.GMBoosts.Result ?? 0 - }, - GMOppBoosts: { - [H.tier]: t.GMOppBoosts[H.tier] ?? 0, - [H.quality]: t.GMOppBoosts[H.quality] ?? 0, - [H.scale]: t.GMOppBoosts[H.scale] ?? 0, - [H.magnitude]: t.GMOppBoosts[H.magnitude] ?? 0 - } - }; - } - calculateOddsHTML(t, s) { - return this.rollType === Ie.Resistance ? this.calculateOddsHTML_Resistance(t) : this.calculateOddsHTML_Standard(t, s); - } - /** - * Calculate odds starting & ending HTML based on given dice total. - * @param {number} diceTotal Total number of dice. - * @param {number} rollResultDelta - * @returns {{oddsHTMLStart: string, oddsHTMLStop: string}} Opening & Closing HTML for odds bar display - */ - calculateOddsHTML_Standard(t, s) { - const i = { - crit: "var(--blades-gold)", - success: "var(--blades-white-bright)", - partial: "var(--blades-grey)", - fail: "var(--blades-black-dark)" - }, r = { ...Y.DiceOddsStandard[t] }; - if (s < 0) - for (let n = s; n < 0; n++) - i.crit = i.success, i.success = i.partial, i.partial = i.fail; - else if (s > 0) - for (let n = 0; n < s; n++) - i.fail = i.partial, i.partial = i.success, i.success = i.crit; - const o = []; - return Object.entries(r).reverse().forEach(([n, l]) => { - l !== 0 && o.push(`
 
`); - }), { - oddsHTMLStart: [ - '
', - ...o - ].join(` -`), - oddsHTMLStop: "
" - }; - } - /** - * Calculate odds starting & ending HTML based on given dice total. - * @param {number} diceTotal Total number of dice. - * @returns {{oddsHTMLStart: string, oddsHTMLStop: string}} Opening & Closing HTML for odds bar display - */ - calculateOddsHTML_Resistance(t) { - const s = [ - "var(--blades-gold)", - // -1 - "var(--blades-white)", - // 0 - "var(--blades-red)", - // 1 - "var(--blades-red)", - // 2 - "var(--blades-red)", - // 3 - "var(--blades-red)", - // 4 - "var(--blades-red)" - // 5 - ].reverse(), i = [ - "none", - "none", - "brightness(0.2)", - "brightness(0.4)", - "brightness(0.6)", - "brightness(0.8)", - "none" - ].reverse(), r = [...Y.DiceOddsResistance[t]].reverse(), o = []; - for (let n = 0; n < r.length; n++) { - const l = r[n]; - if (l > 0) { - const c = s[n], u = i[n]; - o.push(`
 
`); - } - } - return { - oddsHTMLStart: [ - '
', - ...o - ].join(` -`), - oddsHTMLStop: "
" - }; - } - /** - * Calculate data for position and effect trade. - * @returns {{canTradePosition: boolean, canTradeEffect: boolean}} - */ - calculatePositionEffectTradeData() { - const t = this.posEffectTrade === "position" || this.posEffectTrade === !1 && this.rollPositionFinal !== wt.desperate && this.rollEffectFinal !== dt.extreme, s = this.posEffectTrade === "effect" || this.posEffectTrade === !1 && this.rollPositionFinal !== wt.controlled && this.rollEffectFinal !== dt.zero; - return { canTradePosition: t, canTradeEffect: s }; - } - /** - * Calculate data on whether there are any inactive conditionals. - * @returns {Record} - Data on inactive conditionals. - */ - calculateHasInactiveConditionalsData() { - const t = {}; - for (const s of Object.values(ae)) - t[s] = this.getRollMods(s).filter((i) => i.isInInactiveBlock).length > 0; - return t; - } - get dieVals() { - return this.roll.terms[0].results.map((t) => t.result).sort().reverse(); - } - // Accounts for rolling zero dice by removing highest. - get finalDieVals() { - return this.isRollingZero ? this.dieVals.slice(1) : this.dieVals; - } - get finalDiceData() { - eLog.checkLog3("rollCollab", "[get finalDiceData()]", { roll: this, dieVals: this.dieVals }); - const t = [...this.dieVals], s = this.isRollingZero ? t.shift() : null, i = t.filter((o) => o === 6).length >= 2, r = t.map((o, n) => ({ - value: o, - dieClass: yt.GetDieClass(this.rollType, this.rollResult, o, n), - dieImage: yt.GetDieImage(this.rollType, this.rollResult, o, n, !1, i) - })); - return s && r.push({ - value: s, - dieClass: "blades-die-ghost", - dieImage: yt.GetDieImage(this.rollType, this.rollResult, s, r.length, !0, !1) - }), r; - } - // get dieValsHTML(): string { - // eLog.checkLog3("rollCollab", "[get dieValsHTML()]", {roll: this, dieVals: this.dieVals}); - // const dieVals = [...this.dieVals]; - // const ghostNum = this.isRollingZero ? dieVals.shift() : null; - // const isCritical = dieVals.filter((val) => val === 6).length >= 2; - // const diceData = dieVals.map((val, i) => ({ - // value: val, - // dieClass: BladesRoll.GetDieClass(this.rollType, this.rollResult, val, i), - // dieImage: BladesRoll.GetDieImage(this.rollType, this.rollResult, val, i, false, isCritical) - // })); - // if (ghostNum) { - // diceData.push({ - // value: ghostNum, - // dieClass: "blades-die-ghost", - // dieImage: BladesRoll.GetDieImage(this.rollType, this.rollResult, ghostNum, diceData.length, true, false) - // }); - // } - // return [ - // ...dieVals.map((val, i) => ``), - // ghostNum ? `` : null - // ] - // .filter((val): val is string => typeof val === "string") - // .join(""); - // } - // #endregion - // #region RESULT GETTERS ~ - get isCritical() { - return this.finalDieVals.filter((t) => t === 6).length >= 2; - } - get isSuccess() { - return !!(!this.isCritical && this.finalDieVals.find((t) => t === 6)); - } - get isPartial() { - return !!(!this.isCritical && !this.isSuccess && this.finalDieVals.find((t) => t && t >= 4)); - } - get isFail() { - return !this.isCritical && !this.isSuccess && !this.isPartial; - } - get highestDieVal() { - return this.finalDieVals[0]; - } - get rollResult() { - throw new Error("[BladesRoll.rollResult] Unimplemented by Subclass."); - } - // #endregion - get isResolved() { - return this.roll.total !== void 0; - } - async evaluateRoll() { - return this.isResolved ? (this.closeRollCollab_Animation(), this.data) : (this.closeRollCollab_SocketCall(), eLog.checkLog3("rollCollab", "[resolveRoll()] Before Evaluation", { roll: this, rollData: { ...this.data } }), await this.roll.evaluate({ async: !0 }), await this.updateTargetData({ - ...this.data, - rollPositionFinal: this.rollPositionFinal, - rollEffectFinal: this.rollEffectFinal, - rollResult: this.rollResult, - rollTraitVerb: this.rollTraitVerb, - rollTraitPastVerb: this.rollTraitPastVerb, - finalDiceData: this.finalDiceData, - rollPhase: this.isApplyingConsequences ? zs.AwaitingConsequences : zs.Complete - })); - } - async resolveRollResult() { - throw new Error("[BladesRoll.resolveRollResult] Unimplemented by Subclass."); - } - async outputRollToChat() { - await Ei.create({ - speaker: this.getSpeaker(Ei.getSpeaker()), - content: await renderTemplate(this.chatTemplate, this.data), - type: CONST.CHAT_MESSAGE_TYPES.ROLL, - flags: { - "eunos-blades": { rollData: this.data } - } - }); - } - async resolveRoll() { - await this.evaluateRoll(), this.resolveRollResult(), await this.outputRollToChat(); - } - // #endregion - // #region *** INTERFACING WITH BLADESCHAT *** - getSpeaker(t) { - var n; - const { rollPrimaryID: s, rollPrimaryName: i, rollPrimaryType: r, rollPrimaryDoc: o } = this.rollPrimary; - return t.alias = i, [x.cohort_gang, x.cohort_expert].includes(r) ? (t.actor = ((n = o == null ? void 0 : o.parent) == null ? void 0 : n.id) ?? t.actor, (o == null ? void 0 : o.parent) instanceof Te && (t.alias = `${t.alias} (${o.parent.name})`)) : [x.gm_tracker, x.score].includes(r) ? (t.actor = null, t.alias = "The Gamemaster") : s && (t.actor = s), t; - } - get overlayPosition() { - return this._overlayPosition; - } - set overlayPosition(t) { - this._overlayPosition = t; - } - get elem$() { - if (this._elem$) - return this._elem$; - const t = $(`#${this.id}`); - return t.length ? this._elem$ = t : (this._elem$ = $(`
`).appendTo("body"), this._elem$.css({ - left: `${this.overlayPosition.x}px`, - top: `${this.overlayPosition.y}px` - })), this._elem$; - } - async renderRollCollab() { - this.prepareRollParticipantData(); - const t = await renderTemplate(this.collabTemplate, this.context); - this.elem$.html(t), this.activateListeners(); - } - get isRendered() { - var t; - return !!((t = this._elem$) != null && t.length); - } - get collabTemplate() { - throw new Error("[BladesRoll.collabTemplate] Unimplemented by Subclass."); - } - get chatTemplate() { - throw new Error("[BladesRoll.chatTemplate] Unimplemented by Subclass."); - } - // #region LISTENER FUNCTIONS ~ - // async _handleConsequenceClick(event: ClickEvent) { - // const clickTarget$ = $(event.currentTarget); - // const csqParent$ = clickTarget$.closest(".comp.consequence-display-container"); - // const csqID = csqParent$.data("csq-id"); - // const chatElem$ = csqParent$.closest(".blades-roll"); - // const chatMessage$ = chatElem$.closest(".chat-message"); - // const chatID = chatMessage$.data("messageId") as IDString; - // const chatMessage = game.messages.get(chatID); - // if (!chatMessage) {return;} - // const csqs = await BladesConsequence.GetFromChatMessage(chatMessage); - // const thisCsq = csqs.find((csq) => csq.id === csqID); - // if (!thisCsq) {return;} - // switch (clickTarget$.data("action")) { - // case "accept-consequence": return thisCsq.resolveAccept(); - // case "resist-consequence": return thisCsq.resistConsequence(); - // case "armor-consequence": return thisCsq.resistArmorConsequence(); - // case "special-consequence": return thisCsq.resistSpecialArmorConsequence(); - // } - // return undefined as never; - // } - _toggleRollModClick(t) { - t.preventDefault(); - const i = $(t.currentTarget).data("id"), r = this.getRollModByID(i); - if (!r) - throw new Error(`Unable to find roll mod with id '${i}'`); - switch (r.isRerendering = !0, r.status) { - case se.Hidden: - r.userStatus = se.ForcedOff; - break; - case se.ForcedOff: - r.userStatus = se.ToggledOff; - break; - case se.ToggledOff: - r.userStatus = se.ToggledOn; - break; - case se.ToggledOn: - r.userStatus = game.user.isGM ? se.ForcedOn : se.ToggledOff; - break; - case se.ForcedOn: - r.userStatus = se.Hidden; - break; - default: - throw new Error(`Unrecognized RollModStatus: ${r.status}`); - } - r.isRerendering = !1; - } - /** - * Handles setting of rollMod status via GM pop-out controls - * @param {ClickEvent} event JQuery click event sent to listener. - */ - _gmControlSet(t) { - if (t.preventDefault(), !game.user.isGM) - return; - const s = $(t.currentTarget), i = s.data("id"), r = s.data("status"); - if (!up(r) && r !== "Reset") - return; - const o = this.getRollModByID(i); - o && (o.userStatus = r === "Reset" ? void 0 : r); - } - /** - * Handles setting values via GM number line (e.g. roll factor boosts/modifications). - * @param {ClickEvent} event JQuery click event sent to listener. - */ - async _gmControlSetTargetToValue(t) { - if (t.preventDefault(), !game.user.isGM) - return; - const s = $(t.currentTarget), i = s.data("target").replace(/flags\.eunos-blades\./, ""), r = s.data("value"); - await this.updateTarget(i, r), socketlib.system.executeForEveryone("renderRollCollab_SocketCall", this.id); - } - async _gmControlCycleTarget(t) { - var u; - if (t.preventDefault(), !game.user.isGM) - return; - const s = $(t.currentTarget), i = s.data("flagTarget"), r = s.data("curVal"), o = (u = s.data("vals")) == null ? void 0 : u.split(/\|/); - if (!o) - throw new Error(`Unable to parse cycle values from data-vals = ${s.data("vals")}`); - const n = o.indexOf(r); - if (n === -1) - throw new Error(`Unable to find current value '${r}' in cycle values '${s.data("vals")}'`); - let l = n + 1; - l >= o.length && (l = 0); - const c = o[l]; - eLog.checkLog3("gmControlCycleTarget", "gmControlCycleTarget", { flagTarget: i, curVal: r, cycleVals: o, curValIndex: n, newValIndex: l, newVal: c }), await this.updateTarget(i, c); - } - /** - * Handles resetting value associated with GM number line on a right-click. - * @param {ClickEvent} event JQuery context menu event sent to listener. - */ - async _gmControlResetTarget(t) { - t.preventDefault(), game.user.isGM && (await this.updateTarget($(t.currentTarget).data("target"), void 0), socketlib.system.executeForEveryone("renderRollCollab_SocketCall", this.id)); - } - /** - * Handles setting of baseline rollPosition via GM button line - * @param {ClickEvent} event JQuery click event sent to listener. - */ - _gmControlSetPosition(t) { - if (t.preventDefault(), !game.user.isGM) - return; - const i = $(t.currentTarget).data("status"); - this.initialPosition = i; - } - /** - * Handles setting of baseline rollPosition via GM button line - * @param {ClickEvent} event JQuery click event sent to listener. - */ - _gmControlSetEffect(t) { - if (t.preventDefault(), !game.user.isGM) - return; - const i = $(t.currentTarget).data("status"); - this.initialEffect = i; - } - /** - * Handles setting of Factor toggles: isActive, isPrimary, highFavorsPC, isDominant - * @param {ClickEvent} event JQuery click event sent to listener. - */ - async _gmControlToggleFactor(t) { - if (t.preventDefault(), !game.user.isGM) - return; - const s = $(t.currentTarget), i = s.data("target"), r = !s.data("value"); - eLog.checkLog3("toggleFactor", "_gmControlToggleFactor", { event: t, target: i, value: r }); - const o = this.data.rollFactorToggles, [n, l, c] = i.split(/\./).slice(-3); - switch (["isActive", "isPrimary", "isDominant", "highFavorsPC"].includes(c) || (await this.updateTarget(i, r), socketlib.system.executeForEveryone("renderRollCollab_SocketCall", this.id)), o[n][l] = { - ...o[n][l] ?? { display: "" }, - [c]: r - }, c) { - case "isDominant": - case "isPrimary": { - r === !0 && Object.values(H).filter((u) => u !== l).forEach((u) => { - var g; - ((g = o[n][u]) == null ? void 0 : g[c]) === !0 && (o[n][u] = { - ...o[n][u], - [c]: !1 - }); - }); - break; - } - case "isActive": { - if (r === !0) { - const u = n === "source" ? "opposition" : "source"; - o[u][l] = { - ...o[u][l] ?? { display: "" }, - isActive: r - }; - } - break; - } - } - await this.updateTarget("rollFactorToggles", o), socketlib.system.executeForEveryone("renderRollCollab_SocketCall", this.id); - } - async _onSelectChange(t) { - t.preventDefault(); - const s = t.currentTarget, { docType: i } = s.dataset; - if (s.value !== "" && (i != null && i.startsWith("BladesRollParticipant"))) { - const [r, o, n] = i.split("."); - await this.addRollParticipant( - s.value, - o, - n - ); - } else - await v.EventHandlers.onSelectChange(this, t), socketlib.system.executeForEveryone("renderRollCollab_SocketCall", this.id); - } - async _onTextInputBlur(t) { - await v.EventHandlers.onTextInputBlur(this, t), socketlib.system.executeForEveryone("renderRollCollab_SocketCall", this.id); - } - async _onGMPopupClick(t) { - const s = $(t.currentTarget), i = s.data("prompt"), r = s.data("flagTarget"); - i && r && Fr.DisplaySimpleInputDialog(this, i, void 0, r); - } - get positionDragger() { - return this._positionDragger ? this._positionDragger : this.spawnPositionDragger(); - } - spawnPositionDragger() { - var s; - const t = this; - if (!this._elem$) - throw new Error(`[BladesRoll.spawnPositionDragger] No elem$ found for roll ${this.id}.`); - return (s = this._positionDragger) == null || s.kill(), this._positionDragger = new Ii(this._elem$, { - type: "top,left", - trigger: ".window-header.dragger", - onDragStart() { - v.gsap.to(this.target, { opacity: 0.25, duration: 0.25, ease: "power2" }); - }, - onDragEnd() { - v.gsap.to(this.target, { opacity: 1, duration: 0.25, ease: "power2" }), t.overlayPosition = { x: this.endX, y: this.endY }; - } - }); - } - activateListeners() { - Or(this.elem$), this.spawnPositionDragger(), this.rollClockKey && this.elem$.find(".roll-clock").removeClass("hidden"), this.elem$.find(".roll-mod[data-action='toggle']").on({ - click: this._toggleRollModClick.bind(this) - }), this.elem$.find("[data-action='tradePosition']").on({ - click: (t) => { - `${$(t.currentTarget).data("value")}` === "false" ? this.updateTarget("rollPosEffectTrade", "effect").then(() => socketlib.system.executeForEveryone("renderRollCollab_SocketCall", this.id)) : this.updateTarget("rollPosEffectTrade", !1).then(() => socketlib.system.executeForEveryone("renderRollCollab_SocketCall", this.id)); - } - }), this.elem$.find("[data-action='tradeEffect']").on({ - click: (t) => { - `${$(t.currentTarget).data("value")}` === "false" ? this.updateTarget("rollPosEffectTrade", "position").then(() => socketlib.system.executeForEveryone("renderRollCollab_SocketCall", this.id)) : this.updateTarget("rollPosEffectTrade", !1).then(() => socketlib.system.executeForEveryone("renderRollCollab_SocketCall", this.id)); - } - }), this.elem$.find("[data-action='roll']").on({ - click: () => this.resolveRoll() - }), this.elem$.find("select[data-action='player-select']").on({ change: this._onSelectChange.bind(this) }), game.user.isGM && (this.elem$.find(".controls-toggle").on({ - click: (t) => { - t.preventDefault(), $(t.currentTarget).parents(".controls-panel").toggleClass("active"); - } - }), this.elem$.find('[data-action="gm-set"]').on({ - click: this._gmControlSet.bind(this) - }), this.elem$.find('[data-action="gm-set-position"]').on({ - click: this._gmControlSetPosition.bind(this) - }), this.elem$.find('[data-action="gm-set-effect"]').on({ - click: this._gmControlSetEffect.bind(this) - }), this.elem$.find('[data-action="gm-set-target"]').on({ - click: this._gmControlSetTargetToValue.bind(this), - contextmenu: this._gmControlResetTarget.bind(this) - }), this.elem$.find('[data-action="gm-cycle-target"]').on({ - click: this._gmControlCycleTarget.bind(this) - }), this.elem$.find('[data-action="gm-toggle-factor"]').on({ - click: this._gmControlToggleFactor.bind(this) - }), this.elem$.find("select[data-action='gm-select']").on({ change: this._onSelectChange.bind(this) }), this.elem$.find('[data-action="gm-text-popup"]').on({ click: this._onGMPopupClick.bind(this) }), this.elem$.find("[data-action='gm-text-input']").on({ blur: this._onTextInputBlur.bind(this) })); - } - // #endregion - // #endregion - // #region OVERRIDES: _canDragDrop, _onDrop, _onSubmit, close, render ~ - // override _canDragDrop() { - // return game.user.isGM; - // } - // override _onDrop(event: DragEvent) { - // const {uuid} = TextEditor.getDragEventData(event) as {uuid: UUIDString}; - // const dropDoc = fromUuidSync(uuid); - // if (BladesRollOpposition.IsDoc(dropDoc)) { - // this.rollOpposition = new BladesRollOpposition(this, {rollOppDoc: dropDoc}); - // } else if (dropDoc instanceof BladesProject && dropDoc.clockKey) { - // // Project dropped on roll: Assign project's clock key to roll. - // this.rollClockKey = dropDoc.clockKey; - // } - // } - async submitChange(t, s) { - await this.updateTarget(t, s), socketlib.system.executeForEveryone("renderRollCollab_SocketCall", this.id); - } - // #endregion -}; -Z(yt, "Debug", { - modWatch: !1, - watchRollMod(t) { - typeof t == "string" ? yt.Debug.modWatch = new RegExp(t, "g") : yt.Debug.modWatch = !1; - } -}); -let Si = yt; -class kr extends Si { - /* Not much -- most action roll things will extend to other rolls, but split out things like Position, Effect, default Mods */ - static ApplySchemaDefaults(e) { - var i, r; - if (e.rollType = Ie.Action, !e.rollPrimaryData) - throw new Error("Must include a rollPrimaryData when constructing a BladesActionRoll object."); - if (!(e.rollTrait === "" || v.isInt(e.rollTrait) || v.lCase(e.rollTrait) in { ...Is, ...H })) - throw new Error(`[BladesActionRoll.ApplySchemaDefaults()] Bad RollTrait for Action Roll: ${e.rollTrait}`); - const t = super.ApplySchemaDefaults(e), s = Me.Build(t); - switch (t.rollDowntimeAction) { - case we.AcquireAsset: { - t.rollTrait = H.tier; - break; - } - case we.LongTermProject: { - if (!Ft.IsValidData(t.rollOppData)) - throw new Error("No rollOppData provided for LongTermProject roll."); - if (![ - x.project, - x.design - ].includes(t.rollOppData.rollOppType)) - throw new Error("rollOppType must be 'project' or 'design' for LongTermProject roll."); - break; - } - case we.Recover: { - if (Te.IsType(s.rollPrimaryDoc)) { - if (!s.rollPrimaryDoc.abilities.find((o) => o.name === "Physiker")) - throw new Error("A PC rollPrimary on a Recovery roll must have the Physiker ability."); - t.rollTrait = Is.tinker; - } else if (((i = s.rollPrimaryDoc) == null ? void 0 : i.rollPrimaryType) === z.npc) - t.rollTrait = H.quality; - else - throw new Error("Only a PC with Physiker or an NPC can be rollPrimary on a Recover roll."); - break; - } - case we.ReduceHeat: { - let o; - if (s.rollPrimaryDoc) { - const { parent: n } = s.rollPrimaryDoc; - Lt.IsType(n) ? o = n : Te.IsType(n) && Lt.IsType(n.crew) && (o = n.crew); - } - if (!Lt.IsType(o)) - throw new Error(`Could not find crew for rollPrimary '${(r = s.rollPrimaryDoc) == null ? void 0 : r.rollPrimaryName}'`); - if (o.system.heat.value === 0) - throw new Error("Attempt to Reduce Heat for a Crew with no Heat."); - break; - } - case void 0: - break; - default: - throw new Error(`Unrecognized Roll Downtime Action: ${t.rollDowntimeAction}`); - } - return { - rollPositionInitial: wt.risky, - rollEffectInitial: dt.standard, - rollPosEffectTrade: !1, - GMBoosts: { - [H.tier]: 0, - [H.quality]: 0, - [H.scale]: 0, - [H.magnitude]: 0 - }, - GMOppBoosts: { - [H.tier]: 0, - [H.quality]: 0, - [H.scale]: 0, - [H.magnitude]: 0 - }, - GMOverrides: {}, - rollFactorToggles: { - source: { - [H.tier]: { - display: "", - isActive: !1, - isPrimary: !1, - isDominant: !1, - highFavorsPC: !0 - }, - [H.quality]: { - display: "", - isActive: !1, - isPrimary: !1, - isDominant: !1, - highFavorsPC: !0 - }, - [H.scale]: { - display: "", - isActive: !1, - isPrimary: !1, - isDominant: !1, - highFavorsPC: !0 - }, - [H.magnitude]: { - display: "", - isActive: !1, - isPrimary: !1, - isDominant: !1, - highFavorsPC: !0 - } - }, - opposition: { - [H.tier]: { - display: "", - isActive: !1, - isPrimary: !1, - isDominant: !1, - highFavorsPC: !0 - }, - [H.quality]: { - display: "", - isActive: !1, - isPrimary: !1, - isDominant: !1, - highFavorsPC: !0 - }, - [H.scale]: { - display: "", - isActive: !1, - isPrimary: !1, - isDominant: !1, - highFavorsPC: !0 - }, - [H.magnitude]: { - display: "", - isActive: !1, - isPrimary: !1, - isDominant: !1, - highFavorsPC: !0 - } - } - }, - ...t, - rollPrimaryData: s.data, - rollOppData: t.rollOppData instanceof Ft ? t.rollOppData.data : t.rollOppData - }; - } - static get DefaultRollModSchemaSet() { - return [ - { - key: "Push-positive-roll", - name: "PUSH", - section: ae.roll, - base_status: se.ToggledOff, - posNeg: "positive", - modType: Oe.general, - value: 1, - effectKeys: ["ForceOff-Bargain", "Cost-Stress2"], - tooltip: "

Push for +1d

For 2 Stress, add 1 die to your pool.

(You cannot also accept a Devil's Bargain to increase your dice pool: It's one or the other.)

" - }, - { - key: "Bargain-positive-roll", - name: "Bargain", - section: ae.roll, - base_status: se.Hidden, - posNeg: "positive", - modType: Oe.general, - value: 1, - effectKeys: [], - tooltip: "

Devil's Bargain

The GM has offered you a Devil's Bargain.

Accept the terms to add 1 die to your pool.

(You cannot also Push for +1d to increase your dice pool: It's one or the other.)

" - }, - { - key: "Assist-positive-roll", - name: "Assist", - section: ae.roll, - base_status: se.Hidden, - posNeg: "positive", - modType: Oe.teamwork, - value: 1, - tooltip: "

%DOC_NAME% Assists

%DOC_NAME% is Assisting your efforts, adding 1 die to your pool.

" - }, - { - key: "Setup-positive-position", - name: "Setup", - section: ae.position, - base_status: se.Hidden, - posNeg: "positive", - modType: Oe.teamwork, - value: 1, - tooltip: "

%DOC_NAME% Sets You Up

%DOC_NAME% has set you up for success with a preceding Setup action, increasing your Position by one level.

" - }, - { - key: "Push-positive-effect", - name: "PUSH", - section: ae.effect, - base_status: se.ToggledOff, - posNeg: "positive", - modType: Oe.general, - value: 1, - effectKeys: ["Cost-Stress2"], - tooltip: "

Push for Effect

For 2 Stress, increase your Effect by one level.

" - }, - { - key: "Setup-positive-effect", - name: "Setup", - section: ae.effect, - base_status: se.Hidden, - posNeg: "positive", - modType: Oe.teamwork, - value: 1, - tooltip: "

%DOC_NAME% Sets You Up

%DOC_NAME% has set you up for success with a preceding Setup action, increasing your Effect by one level.

" - }, - { - key: "Potency-positive-effect", - name: "Potency", - section: ae.effect, - base_status: se.Hidden, - posNeg: "positive", - modType: Oe.general, - value: 1, - tooltip: "

Potency

By circumstance or advantage, you have Potency in this action, increasing your Effect by one level.

" - }, - { - key: "Potency-negative-effect", - name: "Potency", - section: ae.effect, - base_status: se.Hidden, - posNeg: "negative", - modType: Oe.general, - value: 1, - tooltip: "

Potency

By circumstance or advantage, @OPPOSITION_NAME@ has Potency against you, reducing your Effect by one level." - } - ]; - } - /** - * Asynchronously creates a new instance of this subclass of `BladesRoll`. - * - * Overrides the `New` static method from `BladesRoll`, applying subclass-specific configurations - * to the instance creation process. It ensures that the returned instance is correctly typed - * and configured for this subclass. - * - * @param {BladesRoll.Config} config The configuration object for creating a new roll instance, - * extended with any subclass-specific configurations or requirements. - * - * @returns {Promise>} A promise that resolves to an instance of this subclass. - * - * @see {@link BladesRoll.New} for the base method's functionality and the generic creation process - * for roll instances. - */ - static async New(e) { - const t = this.BuildLinkConfig(e), s = { - ...e, - ...t - }; - return await super.New(s); - } - get rollModsSchemaSets() { - const e = super.rollModsSchemaSets; - return this.rollPrimary.isWorsePosition && e.push({ - key: "WorsePosition-negative-position", - name: "Worse Position", - section: ae.position, - base_status: se.ForcedOn, - posNeg: "negative", - modType: Oe.general, - value: 1, - effectKeys: [], - tooltip: "

Worse Position

A Consequence on a previous roll has worsened your Position.

" - }), this.acceptedConsequences.some((t) => t.type === $t.ReducedEffect) && e.push({ - key: "ReducedEffect-negative-effect", - name: "Reduced Effect", - section: ae.effect, - base_status: se.ForcedOn, - posNeg: "negative", - modType: Oe.general, - value: 1, - effectKeys: [], - tooltip: "

Reduced Effect

A Consequence has worsened your Effect.

" - }), e; - } - get collabTemplate() { - return `systems/eunos-blades/templates/roll/roll-collab-action${game.user.isGM ? "-gm" : ""}.hbs`; - } - get chatTemplate() { - const e = [ - "systems/eunos-blades/templates/chat/roll-result/action", - this.rollClockKey ? "-clock" : "" - ]; - return this.rollDowntimeAction && [ - we.AcquireAsset, - // action-acquireasset - we.ReduceHeat, - // action-reduceheat - we.Recover - // action-clock-recover - ].includes(this.rollDowntimeAction) ? e.push(`-${v.lCase(this.rollDowntimeAction)}`) : this.rollSubType && [ - ia.GatherInfo - // action-gatherinfo - ].includes(this.rollSubType) && e.push(`-${v.lCase(this.rollSubType)}`), e.push(".hbs"), e.join(""); - } - get rollResult() { - return this.isResolved ? this.isCritical ? ze.critical : this.isSuccess ? ze.success : this.isPartial ? ze.partial : ze.fail : !1; - } - async resolveRollResult() { - var t, s; - eLog.checkLog2("bladesRoll", "[BladesActionRoll] Costs", this.getRollCosts()); - const e = this.getRollCosts().filter((i) => i.costType === "Armor").length; - if (this.rollPrimaryDoc instanceof Te) { - const i = this.getRollCosts().filter((o) => o.costType === "Stress").reduce((o, n) => o + n.costAmount, 0); - i !== 0 && this.rollPrimaryDoc.adjustStress(i), this.getRollCosts().filter((o) => o.costType === "SpecialArmor").length !== 0 && this.rollPrimaryDoc.spendSpecialArmor(); - } - e !== 0 && this.rollPrimary.spendArmor(e), (t = this.getRollModByKey("WorsePosition-negative-position")) != null && t.isActive && ((s = this.rollPrimaryDoc) == null || s.unsetFlag("eunos-blades", "isWorsePosition")); - } -} -class ec extends Si { - static ApplySchemaDefaults(e) { - var t; - if (!e.resistanceData || !Cs.IsValidConsequenceData((t = e.resistanceData) == null ? void 0 : t.consequence)) - throw eLog.error("rollCollab", "[PrepareResistanceRoll] Bad Roll Consequence Data.", e), new Error("[PrepareResistanceRoll()] Bad Consequence Data for Resistance Roll"); - return e.rollTrait = e.resistanceData.consequence.attribute, eLog.checkLog3("bladesRoll", "BladesRoll.PrepareResistanceRoll() [1]", { config: e }), e; - } - /** - * Asynchronously creates a new instance of this subclass of `BladesRoll`. - * - * Overrides the `New` static method from `BladesRoll`, applying subclass-specific configurations - * to the instance creation process. It ensures that the returned instance is correctly typed - * and configured for this subclass. - * - * @param {BladesRoll.Config} config The configuration object for creating a new roll instance, - * extended with any subclass-specific configurations or requirements. - * - * @returns {Promise>} A promise that resolves to an instance of this subclass. - * - * @see {@link BladesRoll.New} for the base method's functionality and the generic creation process - * for roll instances. - */ - static async New(e) { - const t = this.BuildLinkConfig(e), s = { - ...e, - ...t - }; - return await super.New(s); - } - get collabTemplate() { - return `systems/eunos-blades/templates/roll/roll-collab-resistance${game.user.isGM ? "-gm" : ""}.hbs`; - } - get chatTemplate() { - return "systems/eunos-blades/templates/chat/roll-result/resistance.hbs"; - } - get stressCost() { - if (!this.isResolved) - return 0; - const e = [...this.finalDieVals]; - return this.isCritical ? -1 : 6 - (e.shift() ?? 0); - } - get rollResult() { - return this.isResolved ? this.stressCost : !1; - } - async resolveRollResult() { - this.rollPrimaryDoc instanceof Te && this.stressCost !== 0 && this.rollPrimaryDoc.adjustStress(this.stressCost); - } -} -class Oh extends ec { - get chatTemplate() { - return "systems/eunos-blades/templates/chat/components/inline-resistance.hbs"; - } -} -class Wa extends Si { - static ApplySchemaDefaults(e) { - if (!(v.isInt(e.rollTrait) || v.lCase(e.rollTrait) in { ...Is, ...vt, ...H })) - throw new Error(`[PrepareFortuneRoll()] Bad RollTrait for Fortune Roll: ${e.rollTrait}`); - return e; - } - /** - * Asynchronously creates a new instance of this subclass of `BladesRoll`. - * - * Overrides the `New` static method from `BladesRoll`, applying subclass-specific configurations - * to the instance creation process. It ensures that the returned instance is correctly typed - * and configured for this subclass. - * - * @param {BladesRoll.Config} config The configuration object for creating a new roll instance, - * extended with any subclass-specific configurations or requirements. - * - * @returns {Promise>} A promise that resolves to an instance of this subclass. - * - * @see {@link BladesRoll.New} for the base method's functionality and the generic creation process - * for roll instances. - */ - static async New(e) { - const t = this.BuildLinkConfig(e), s = { - ...e, - ...t - }; - return await super.New(s); - } -} -class tc extends Si { - static ApplySchemaDefaults(e) { - var r; - const t = Me.GetDoc((r = e.rollPrimaryData) == null ? void 0 : r.rollPrimaryID); - if (!t || !Te.IsType(t)) - throw new Error("[BladesRoll.PrepareIndulgeViceRollConfig] RollPrimary must be a PC for Indulge Vice rolls."); - const { attributes: s } = t, i = Math.min(...Object.values(s)); - return e.rollTrait = v.sample( - Object.values(vt).filter((o) => s[o] === i) - )[0], e.rollDowntimeAction = we.IndulgeVice, e; - } - /** - * Asynchronously creates a new instance of this subclass of `BladesRoll`. - * - * Overrides the `New` static method from `BladesRoll`, applying subclass-specific configurations - * to the instance creation process. It ensures that the returned instance is correctly typed - * and configured for this subclass. - * - * @param {BladesRoll.Config} config The configuration object for creating a new roll instance, - * extended with any subclass-specific configurations or requirements. - * - * @returns {Promise>} A promise that resolves to an instance of this subclass. - * - * @see {@link BladesRoll.New} for the base method's functionality and the generic creation process - * for roll instances. - */ - static async New(e) { - const t = this.BuildLinkConfig(e), s = { - ...e, - ...t - }; - return await super.New(s); - } - get collabTemplate() { - return `systems/eunos-blades/templates/roll/roll-collab-indulgevice${game.user.isGM ? "-gm" : ""}.hbs`; - } - get chatTemplate() { - return "systems/eunos-blades/templates/chat/roll-result/indulgevice.hbs"; - } - get rollResult() { - return this.isResolved ? this.highestDieVal : !1; - } - async resolveRollResult() { - Te.IsType(this.rollPrimaryDoc) && this.rollPrimaryDoc.indulgeStress(this.highestDieVal); - } -} -class Fh extends Wa { - static get DefaultRollModSchemaSet() { - return [ - { - key: "BoldPlan-positive-roll", - name: "Bold Plan", - section: ae.roll, - base_status: se.ToggledOff, - posNeg: "positive", - modType: Oe.general, - value: 1, - effectKeys: [], - tooltip: "

" - }, - { - key: "ComplexPlan-negative-roll", - name: "Complex Plan", - section: ae.roll, - base_status: se.ToggledOff, - posNeg: "negative", - modType: Oe.general, - value: 1, - effectKeys: [], - tooltip: "

" - }, - { - key: "ExploitWeakness-positive-roll", - name: "Exploiting a Weakness", - section: ae.roll, - base_status: se.ToggledOff, - posNeg: "positive", - modType: Oe.general, - value: 1, - effectKeys: [], - tooltip: "

" - }, - { - key: "WellDefended-negative-roll", - name: "Well-Defended", - section: ae.roll, - base_status: se.ToggledOff, - posNeg: "negative", - modType: Oe.general, - value: 1, - effectKeys: [], - tooltip: "

" - }, - { - key: "HelpFromFriend-positive-roll", - name: "Help From a Friend", - section: ae.position, - base_status: se.ToggledOff, - posNeg: "positive", - modType: Oe.general, - value: 1, - effectKeys: [], - tooltip: "

Help From a Friend

Add +1d if you enlist the help of a friend or contact.

" - }, - { - key: "EnemyInterference-negative-roll", - name: "Enemy Interference", - section: ae.roll, - base_status: se.ToggledOff, - posNeg: "negative", - modType: Oe.general, - value: 1, - effectKeys: [], - tooltip: "

" - } - ]; - } - get chatTemplate() { - return "systems/eunos-blades/templates/chat/roll-result/fortune-engagement.hbs"; - } -} -class Lh extends Wa { - get chatTemplate() { - return "systems/eunos-blades/templates/chat/roll-result/fortune-incarceration.hbs"; - } -} -const xs = Si; -class sc extends ChatMessage { - static Initialize() { - return Hooks.on("renderChatMessage", (e, t) => { - Or(t); - const { rollData: s } = e.flagData; - s && Cs.ApplyChatListeners(e), t.addClass("display-ok"); - }), loadTemplates([ - "systems/eunos-blades/templates/chat/roll-result/action.hbs", - "systems/eunos-blades/templates/chat/roll-result/action-clock.hbs", - "systems/eunos-blades/templates/chat/roll-result/action-acquireasset.hbs", - "systems/eunos-blades/templates/chat/roll-result/action-reduceheat.hbs", - "systems/eunos-blades/templates/chat/roll-result/action-clock-recover.hbs", - "systems/eunos-blades/templates/chat/roll-result/action-gatherinfo.hbs", - "systems/eunos-blades/templates/chat/roll-result/fortune.hbs", - "systems/eunos-blades/templates/chat/roll-result/fortune-clock.hbs", - "systems/eunos-blades/templates/chat/roll-result/fortune-gatherinfo.hbs", - "systems/eunos-blades/templates/chat/roll-result/fortune-incarceration.hbs", - "systems/eunos-blades/templates/chat/roll-result/fortune-engagement.hbs", - "systems/eunos-blades/templates/chat/roll-result/indulgevice.hbs", - "systems/eunos-blades/templates/chat/roll-result/resistance.hbs", - "systems/eunos-blades/templates/chat/components/inline-resistance.hbs", - "systems/eunos-blades/templates/chat/components/die.hbs" - ]); - } - // static async ConstructRollOutput(rollInst: BladesRoll): Promise { - // const rollData = { - // ...rollInst.data, - // rollTraitVerb: rollInst.rollTraitVerb ?? "", - // rollTraitPastVerb: rollInst.rollTraitPastVerb ?? rollInst.rollTraitVerb ?? "" - // }; - // return await BladesChat.create({ - // speaker: rollInst.getSpeaker(BladesChat.getSpeaker()), - // content: await renderTemplate(rollInst.template, rollData), - // type: CONST.CHAT_MESSAGE_TYPES.ROLL, - // flags: { - // "eunos-blades": { - // template: rollInst.template, - // rollData - // } - // } - // }) as BladesChat; - // } - static IsNewestRollResult(e) { - const t = $("#chat-log .chat-message .blades-roll:not(.inline-roll)").last().attr("id"); - return typeof t == "string" && t === e.id; - } - get flagData() { - return this.flags["eunos-blades"]; - } - get rollData() { - return this.flagData.rollData; - } - async setFlagVal(e, t, s) { - return await this.setFlag(Y.SYSTEM_ID, `${e}.${t}`, s); - } - get allRollConsequences() { - const e = { - [wt.controlled]: { - [ze.critical]: {}, - [ze.success]: {}, - [ze.partial]: {}, - [ze.fail]: {} - }, - [wt.risky]: { - [ze.critical]: {}, - [ze.success]: {}, - [ze.partial]: {}, - [ze.fail]: {} - }, - [wt.desperate]: { - [ze.critical]: {}, - [ze.success]: {}, - [ze.partial]: {}, - [ze.fail]: {} - } - }, { consequenceData: t } = this.flagData.rollData ?? {}; - return t && Object.entries(t).forEach(([s, i]) => { - Object.entries(i).forEach(([r, o]) => { - e[s][r] = Object.fromEntries( - Object.entries(o).filter(([n, l]) => l.id).map(([n, l]) => [ - n, - game.eunoblades.Consequences.get(l.id) ?? new Cs(l) - ]) - ); - }); - }), e; - } - get rollConsequences() { - var r; - if (!this.parentRoll) - return []; - const { rollPositionFinal: e, rollResult: t, consequenceData: s } = this.parentRoll.data; - if (!e || !t || !s) - return []; - if (typeof t != "string" || ![ze.partial, ze.fail].includes(t)) - return []; - const i = ((r = s == null ? void 0 : s[e]) == null ? void 0 : r[t]) ?? {}; - return Object.values(i).map((o) => game.eunoblades.Consequences.get(o.id) ?? new Cs(o)); - } - get elem$() { - return $("#chat-log").find(`.chat-message[data-message-id="${this.id}"]`); - } - get elem() { - return this.elem$[0]; - } - get isRollResult() { - return "rollData" in this.flagData; - } - get parentRoll() { - if (!this.isRollResult) - return; - const { rollData: e } = this.flagData; - if (e) - return game.eunoblades.Rolls.get(e.id ?? "") ?? new xs({ - ...e, - isScopingById: !1 - }); - } - get roll$() { - return this.parentRoll ? this.elem$.find(`#${this.parentRoll.id}`) : void 0; - } - async regenerateFromFlags() { - this.isRollResult && await this.update({ content: await renderTemplate(this.flagData.template, this) }); - } - async render(e) { - await super.render(e), await this.activateListeners(); - } - async activateListeners() { - if (!this.elem$) { - eLog.error("BladesChat", `No BladesChat.elem found for id ${this.id}.`); - return; - } - Or(this.elem$), Cs.ApplyChatListeners(this), this.parentRoll && (this.elem$.addClass(`${this.parentRoll.rollType.toLowerCase()}-roll`), this.parentRoll.rollType === Ie.Action && this.rollConsequences.some((e) => !e.isAccepted) ? this.elem$.addClass("unresolved-action-roll") : this.elem$.removeClass("unresolved-action-roll"), sc.IsNewestRollResult(this.parentRoll) ? ($("#chat-log .chat-message").removeClass("active-chat-roll"), this.elem$.addClass("active-chat-roll")) : this.elem$.removeClass("active-chat-roll")), v.gsap.to(this.elem$, { autoAlpha: 1, duration: 0.15, ease: "none" }); - } -} -const Ei = sc, _n = { - fullName: "eLogger", - aliases: ["dbLog"], - stackTraceExclusions: { - handlebars: [/scripts\/handlebars/] - // From internal Handlebars module - } -}, Rh = { - base: { - background: Y.Colors.BLACK, - color: Y.Colors.dGOLD, - "font-family": "Pragmata Pro", - padding: "0 25px", - "margin-right": "25px" - }, - log0: { - background: Y.Colors.dGOLD, - color: Y.Colors.dBLACK, - "font-size": "16px" - }, - log1: { - background: Y.Colors.dBLACK, - color: Y.Colors.bGOLD, - "font-size": "16px" - }, - log2: { - background: Y.Colors.dBLACK, - color: Y.Colors.dGOLD, - "font-size": "16px" - }, - log3: { - "font-size": "14px" - }, - log4: { - "font-size": "12px" - }, - log5: { - background: Y.Colors.dGREY, - color: Y.Colors.bGREY, - "font-size": "10px" - }, - display: { - color: Y.Colors.bGOLD, - "font-family": "Kirsty", - "font-size": "16px", - "margin-left": "-100px", - padding: "0 100px" - }, - warn: { - color: Y.Colors.dBLACK, - background: Y.Colors.dGOLD, - "font-weight": 500 - }, - error: { - color: Y.Colors.bRED, - background: Y.Colors.ddRED, - "font-weight": 500 - }, - handlebars: { - background: Y.Colors.GREY, - color: Y.Colors.BLUE, - "font-family": "Pragmata Pro", - padding: "0", - "margin-right": "25px" - }, - stack: { - color: Y.Colors.GOLD, - "font-weight": 100, - "font-size": "10px", - "font-family": "Pragmata Pro" - } -}, { base: gp, ...pp } = Rh, ou = Object.fromEntries( - Object.entries(pp).map(([a, e]) => [ - a, - Object.entries({ ...gp, ...e }).map(([t, s]) => `${t}: ${s};`).join(" ") - ]) -), ut = (a = "base", ...e) => { - if (!(["error", "display"].includes(a) || CONFIG.debug.logging)) - return; - const t = v.getLast(e); - let s = typeof t == "number" && [0, 1, 2, 3, 4, 5].includes(t) ? e.pop() : 3, i = !1; - a === "checkLog" && (i = e.shift(), a = `log${s}`); - const [r, ...o] = e; - if (i) { - const u = (v.getSetting("blacklist") ?? "").split(/,/).map((m) => new RegExp(`\\b${m.trim()}\\b`, "igu")), g = (v.getSetting("whitelist") ?? "").split(/,/).map((m) => new RegExp(`\\b${m.trim()}\\b`, "igu")), f = u.some((m) => m.test(i)), h = g.some((m) => m.test(i)); - f && !h && (s = Math.max(4, Math.min(5, s + 2))), h && !f && (s = Math.min(3, Math.max(1, s - 2))); - } - if ((v.getSetting("debug") ?? 5) < s) - return; - a === "log" && (a = `${a}${s}`); - const n = a === "display" ? null : c(_n.stackTraceExclusions[a] ?? []); - let l; - n ? l = console.groupCollapsed : o.length <= 1 ? l = console.log : l = console.group, o.length === 0 ? typeof r == "string" ? l(`%c${r}`, ou[a]) : l("%o", r) : (l(`%c${r}${typeof o[0] == "string" ? "" : " %o"}`, ou[a], o.shift()), o.forEach((u) => { - typeof u == "string" ? console.log(u) : console.log("%o", u); - })), n && (console.group("%cSTACK TRACE", `color: ${Y.Colors.dGOLD}; font-family: "Pragmata Pro"; font-size: 12px; background: ${Y.Colors.BLACK}; font-weight: bold; padding: 0 10px;`), console.log(`%c${n}`, Object.entries(Rh.stack).map(([u, g]) => `${u}: ${g};`).join(" ")), console.groupEnd()), console.groupEnd(); - function c(u = []) { - return u.push(new RegExp(`at (getStackTrace|${_n.fullName}|${_n.aliases.map(String).join("|")}|Object\\.(log|display|hbsLog|error))`), /^Error/), (new Error().stack ?? "").split(/\n/).map((g) => g.trim()).filter((g) => !u.some((f) => f.test(g))).join(` -`); - } -}, $h = { - display: (...a) => ut("display", ...a), - log0: (...a) => ut("log", ...a, 0), - log1: (...a) => ut("log", ...a, 1), - log2: (...a) => ut("log", ...a, 2), - log: (...a) => ut("log", ...a, 3), - log3: (...a) => ut("log", ...a, 3), - log4: (...a) => ut("log", ...a, 4), - log5: (...a) => ut("log", ...a, 5), - checkLog0: (...a) => ut("checkLog", ...a, 0), - checkLog1: (...a) => ut("checkLog", ...a, 1), - checkLog2: (...a) => ut("checkLog", ...a, 2), - checkLog: (...a) => ut("checkLog", ...a, 3), - checkLog3: (...a) => ut("checkLog", ...a, 3), - checkLog4: (...a) => ut("checkLog", ...a, 4), - checkLog5: (...a) => ut("checkLog", ...a, 5), - warn: (...a) => ut("warn", ...a), - error: (...a) => ut("error", ...a), - hbsLog: (...a) => ut("handlebars", ...a) -}; -class Nh extends Scene { - async registerClockKey(e) { - this.update({ [`clockKeys.${e.id}`]: !0 }); - } - async unregisterClockKey(e) { - typeof e == "string" ? this.update({ [`clockKeys.-=${e}`]: null }) : this.update({ [`clockKeys.-=${e.id}`]: null }); - } -} -var Dr, Wi, pi, Tr, fi, Cr, _r, La; -class fp { - constructor(e, t, s = "gpt-4-1106-preview", { isUsingRetrieval: i, functionTools: r, file_ids: o, metadata: n } = {}) { - qt(this, Dr, void 0); - qt(this, Wi, void 0); - qt(this, pi, void 0); - qt(this, Tr, void 0); - qt(this, fi, void 0); - qt(this, Cr, void 0); - qt(this, _r, void 0); - qt(this, La, void 0); - ct(this, Wi, ""), ct(this, pi, ""), ct(this, Tr, t ?? ""), ct(this, fi, []), ct(this, Cr, s), ct(this, _r, o ?? []), ct(this, La, n ?? {}); - const l = v.getSetting("openAPIKey"); - if (!l) - throw new Error("API Key required in Settings to use AI features."); - ct(this, Dr, l), t ? (ct(this, pi, e), i && rs(this, fi).push({ type: "retrieval" }), r && r.length && rs(this, fi).push(...r), this.createAssistant()) : (ct(this, Wi, e), this.retrieveAssistant()); - } - get name() { - return rs(this, pi); - } - async createAssistant() { - const e = { - method: "POST", - headers: { - "Content-Type": "application/json", - Authorization: `Bearer ${rs(this, Dr)}`, - "OpenAI-Beta": "assistants=v1" - }, - body: JSON.stringify({ - name: rs(this, pi), - instructions: rs(this, Tr), - tools: rs(this, fi), - model: rs(this, Cr), - file_ids: rs(this, _r) - }) - }; - eLog.checkLog3("BladesAssistant", "Fetch Request", e); - const t = await fetch( - "https://api.openai.com/v1/assistants", - e - ); - if (!t.ok) - throw console.log("Failed AI Request:", JSON.parse(e.body)), new Error(`OpenAI API request failed with status ${t.status}`); - const s = await t.json(); - e.body = JSON.parse(e.body), eLog.checkLog3("BladesAI", "AI Query", { prompt: e, response: s }), ct(this, Wi, s.id); - } - async retrieveAssistant() { - const e = { - method: "GET", - headers: { - "Content-Type": "application/json", - Authorization: `Bearer ${rs(this, Dr)}`, - "OpenAI-Beta": "assistants=v1" - } - }, t = await fetch( - `https://api.openai.com/v1/assistants/${rs(this, Wi)}`, - e - ); - if (!t.ok) - throw new Error(`OpenAI API request failed with status ${t.status}`); - const s = await t.json(); - eLog.checkLog3("BladesAI", "AI Query", { prompt: e, response: s }), ct(this, pi, s.name), ct(this, Tr, s.instructions), ct(this, fi, s.tools), ct(this, Cr, s.model), ct(this, _r, s.file_ids), ct(this, La, s.metadata); - } -} -Dr = new WeakMap(), Wi = new WeakMap(), pi = new WeakMap(), Tr = new WeakMap(), fi = new WeakMap(), Cr = new WeakMap(), _r = new WeakMap(), La = new WeakMap(); -class mp { - /** - * AI class constructor - * @param {BladesAI.Config} [config] Configuration settings for the API - */ - constructor(e) { - Z(this, "apiKey"); - Z(this, "model"); - Z(this, "temperature", 0.5); - Z(this, "frequency_penalty", 0.8); - Z(this, "presence_penalty", 0.8); - Z(this, "systemMessage"); - Z(this, "examplePrompts"); - Z(this, "_initialMessages", []); - Z(this, "prompts", {}); - Z(this, "responses", {}); - const t = v.getSetting("openAPIKey"); - if (!t) - throw new Error("You must configure your OpenAI API Key in Settings to use AI features."); - this.model = v.getSetting("openAPIModelLevel"), typeof this.model != "number" && (eLog.error("BladesAI", "Set base AI quality in settings. Defaulting to lowest."), this.model = 0), this.apiKey = t, this.systemMessage = e.systemMessage, this.examplePrompts = e.examplePrompts, this.temperature = e.temperature ?? this.temperature, this.frequency_penalty = e.frequency_penalty ?? this.frequency_penalty, this.presence_penalty = e.presence_penalty ?? this.presence_penalty; - } - static async GetModels(e = !1) { - const t = v.getSetting("openAPIKey"); - if (!t) - throw new Error("You must configure your OpenAI API Key in Settings to use AI features."); - const s = { - method: "GET", - headers: { - Authorization: `Bearer ${t}` - } - }, i = await fetch( - "https://api.openai.com/v1/models", - s - ); - if (!i.ok) - throw new Error(`OpenAI API request failed with status ${i.status}`); - const r = await i.json(), o = Object.fromEntries(r.map(({ id: n, ...l }) => [n, l])); - e && eLog.checkLog3("BladesAI", "Available Models", { dataList: o }); - } - get initialMessages() { - if (this._initialMessages.length === 0) { - this._initialMessages.push({ - role: "system", - content: this.systemMessage - }); - for (const { human: e, ai: t } of this.examplePrompts) - this._initialMessages.push({ - role: "user", - content: e - }), this._initialMessages.push({ - role: "assistant", - content: t - }); - } - return this._initialMessages; - } - getResponse(e) { - return this.responses[e] ?? null; - } - hasQueried(e) { - return this.prompts[e] !== void 0; - } - /** - * Query OpenAI API - * @param {string} queryID A label for later retrieval of the query data - * @param {string} prompt The prompt to send to the API - * @param {number} [modelMod] Optional modifier to the base model level. - * If provided, the final model quality will be adjusted by this number. - * @param {boolean} [extendedContext=false] Optional flag to indicate whether to use extended context models. - * If true, extended context models are used; otherwise, base context models are used. - * @returns {Promise} The API response - */ - async query(e, t, s, i = !1) { - if (!t) - return; - this.responses[e] = null; - const r = typeof s == "number" ? v.clampNum(this.model + s, [0, 2]) : this.model, o = i ? Y.AI_MODELS.extendedContext[r] : Y.AI_MODELS.baseContext[r], n = { - method: "POST", - headers: { - "Content-Type": "application/json", - Authorization: `Bearer ${this.apiKey}` - }, - body: JSON.stringify({ - model: o, - temperature: this.temperature, - frequency_penalty: this.frequency_penalty, - presence_penalty: this.presence_penalty, - messages: [ - ...this.initialMessages, - { - role: "user", - content: t - } - ] - }) - }, l = await fetch( - "https://api.openai.com/v1/chat/completions", - n - ); - if (!l.ok) - throw console.log("Failed AI Request:", JSON.parse(n.body)), new Error(`OpenAI API request failed with status ${l.status}`); - const c = await l.json(); - return n.body = JSON.parse(n.body), eLog.checkLog3("BladesAI", "AI Query", { prompt: n, response: c }), this.responses[e] = c.choices[0].message.content, this.responses[e]; - } -} -const yp = { - GeneralContentGenerator: { - systemMessage: `You will act as a creative content generator for a game of Blades In The Dark set in the city of Duskvol. You will be prompted with some element of the game world (a location, a character, an event, a faction, a dilemma) in the form of a JSON object. Your job is to analyze the JSON object and replace any values that equal "" with original content of your own creation. Original content must meet these requirements: (A) it should align with and be consistent with the provided contextual information, as well as your broader understanding of the game's themes. (B) It should be presented in a format that matches (in length and in style) other entries for that particular value, examples of which will also be provided. (C) It should be creative, interesting, and daring: Be bold with your creativity. Specific context for this prompt is as follows:`, - examplePrompts: [] - }, - NPCGenerator: { - systemMessage: `You will play the role of a "creative content generator" for random NPCs generated for the Blades In The Dark roleplaying system. When prompted with a description of a subject (an NPC, a category of NPCs, a faction, or a group of NPCs), you will respond with a pipe-delimited list of sixteen items, divided into four categories, prefacing each category with the associated header in square brackets: [5 KEYWORDS] Five one-word keywords describing the subject. [5 PHRASES] Five evocative phrases that could be used by a GM directly when narrating the subject during play. These should be extremely well-worded, very original, and packed with drama and evocative imagery. Be bold with your responses here. [3 QUIRKS/MOTIFFS] Three phrases describing potential quirks or motiffs that a GM could employ in a scene involving the subject. [3 PLOT HOOKS] Three plot hooks that could directly and specifically involve one or more of the PCs. The PCs are: (1) Alistair, full name Lord Alistair Bram Chesterfield, the crew's boss, a Spider with connections among the nobility; (2) High-Flyer, a former noble himself, now serving as the crew's Slide; (3) Jax, a stoic and laconic Hound with ties to the disenfranchised of Duskvol; (4) Ollie, the youngest of the crew at barely nineteen, a prodigy Leech with knowledge of alchemy and spark-craft, who grew up as an orphan in Duskvol's underground; (5) Wraith, the mysterious Lurk of the crew, who never speaks for reasons unknown; and (6) Spencer, the bookish Whisper of the crew, who harbors a secret fascination for demons and all things related to them.`, - examplePrompts: [ - { - human: "The Billhooks, a hack-and-slash gang of toughened thugs. The Billhooks have a bloody reputation, often leaving the butchered corpses of their victims strewn about in a grisly display. Many wonder why the Bluecoats turn a blind eye to their savagery. Based out of their butcher shop headquarters, they are led by Tarvul, who is currently serving life in prison.", - ai: "[5 KEYWORDS]brutal|unrelenting|savage|fierce|unhinged|[5 PHRASES]blood-flecked, yellowed teeth|eyes that want to flay your skin from your bones|crooked leer like he's looking at his Judas goat|reek like a charnel house|gobbets of a meaty lunch still in his beard|[3 QUIRKS/MOTIFFS]always ready to wreck, vandalize or destroy something|relish in instilling fear in others|have a twisted sense of loyalty|[3 PLOT HOOKS]Tarvul hires the crew to start a war among his most promising underlings, intending to make whoever survives his successor|the Billhooks kidnap a member of High-Flyer's noble family|a Demon of Shadows promises Spencer the answer to three questions, in exchange for an artifact recently stolen by the Billhooks" - }, - { - human: "The hooded proprietor of a half-flooded grotto tavern near the docks. 'Strange passageways lead to stranger chambers beyond.' Vice Purveyor - Weird.", - ai: "[5 KEYWORDS]mysterious|cryptic|enigmatic|peculiar|shrouded|[5 PHRASES]a voice like wet burlap sliding over gravel|the flicker of torchlight dancing on the flooded floor|the scent of brackish water and old spices|a smile that hinted at a thousand secrets hidden in the shadows|hands gnarled as driftwood, eternally damp|[3 QUIRKS/MOTIFFS]has an uncanny knack for knowing patrons' darkest secrets without them telling him|never seems to sleep or leave the tavern, always there no matter what time you visit|always seen with a strange, luminescent creature that lives in one of the flooded chambers behind the bar|[3 PLOT HOOKS]Alistair hears rumors that this tavern is actually a front for a powerful secret society - perhaps they could be useful allies...or dangerous enemies.|The proprietor offers Ollie a rare alchemical ingredient - but it's not for sale. He'll only trade it for something equally valuable.|Wraith overhears whispers about a hidden chamber beneath the tavern where unimaginable treasures are kept." - }, - { - human: "Setarra, a Demon. Patient, Defiant, Ruthless, Cold", - ai: "[5 KEYWORDS]shadowy|sinister|unfathomable|enigmatic|tempting|[5 PHRASES]whispers that crawl under your skin|always watching, always plotting|in tones of silk and venom|intoxicating presence that draws you closer, despite your instincts urging you to run|eyes like black holes, swallowing all light around them|[3 QUIRKS/MOTIFFS]a disorienting mist clings to her form, obscuring her true shape|casually discusses the devastating acts of capricious revenge she has taken on those who crossed her|never forgets a slight or betrayal, no matter how small or insignificant it may seem at the time|[3 PLOT HOOKS]seeks revenge against Alistair for meddling in her affairs years ago|makes Ollie an offer he can't refuse: unlimited access to forbidden alchemical knowledge in exchange for a single favor, to be called in at some future time|tempts Spencer with forbidden knowledge about demons, promising answers to all their questions if they perform a dangerous ritual" - } - /* - "brutish,merciless,terrifying,savage,loyal, - bloody tools,hulking figures,blood-soaked alleys,grimy aprons,grisly displays, - never clean their tools,relishes the terror they inspire,occasional laughter among them, - recruiting a PC to perform a job for them from prison, - the gang blames one of the PCs for Tarvul's imprisonment and they're out for revenge" */ - ] - }, - ConsequenceAdjuster: { - systemMessage: `You will act as a "Setback Adjuster" for a game of Blades In The Dark. You will be prompted with a short phrase describing an injury, lasting consequence or other setback. Your job is to respond with a pipe-delimited list of three possible alternative consequences that are less severe by one level, using the following scale as a rough guide: Level 1 = Lesser (e.g. 'Battered', 'Drained', 'Distracted', 'Scared', 'Confused'), Level 2 = Moderate (e.g. 'Exhausted', 'Deep Cut to Arm', 'Concussion', 'Panicked', 'Seduced'), Level 3 = Severe (e.g. 'Impaled', 'Broken Leg', 'Shot In Chest', 'Badly Burned', 'Terrified'), Level 4 = Fatal or Ruinous (e.g. 'Impaled Through Heart', 'Electrocuted', 'Headquarters Burned to the Ground'). So, if you determine that the consequence described in the prompt is severity level 3, you should respond with three narratively similar consequences that are severity level 2. Your three suggestions should be different from each other, but they should all logically follow from the initial harm described: You should not introduce new facts or make assumptions that are not indicated in the initial prompt. The consequences you suggest should always describe a NEGATIVE setback or complication, just one that is less severe than the one described in the prompt.`, - examplePrompts: [ - { human: "Shattered Right Leg", ai: "Fractured Right Ankle|Dislocated Knee|Broken Foot" }, - { human: "Soul Destroyed", ai: "Fully Corrupted|Lost In Darkness|Spirit Broken" }, - { human: "Humiliated", ai: "Embarrassed|Momentarily Off-Balance|Enraged" }, - { human: "She Escapes!", ai: "She Spots a Means of Escape|She Puts More Distance Between You|She Stops to Gloat" }, - { human: "The fire spreads to the hostages.", ai: "The fire approaches the hostages.|The hostages must be evacuated.|The fire billows choking black smoke." } - ] - } -}; -class Yo extends $r { - // static Get() { return game.eunoblades.Tracker as BladesGMTracker; } - static get defaultOptions() { - return foundry.utils.mergeObject(super.defaultOptions, { - classes: ["eunos-blades", "sheet", "item", "gm-tracker"], - template: "systems/eunos-blades/templates/items/gm_tracker-sheet.hbs", - width: 700, - height: 970 - }); - } - static async Initialize() { - return Items.registerSheet("blades", Yo, { types: ["gm_tracker"], makeDefault: !0 }), loadTemplates([ - "systems/eunos-blades/templates/items/gm_tracker-sheet.hbs" - ]); - } - async activateListeners(e) { - super.activateListeners(e); - } - async _onSubmit(e, t = {}) { - const s = this.item.system.phase, i = await super._onSubmit(e, t), r = this.item.system.phase; - let o = !0; - if (s !== r) { - switch (s) { - case Fe.CharGen: - break; - case Fe.Freeplay: - break; - case Fe.Score: { - o = !1, game.actors.filter((n) => oe.IsType(n, z.pc)).forEach((n) => n.clearLoadout()); - break; - } - case Fe.Downtime: - break; - } - switch (r) { - case Fe.CharGen: - break; - case Fe.Freeplay: - break; - case Fe.Score: - break; - case Fe.Downtime: - break; - } - } - return o && game.actors.filter((n) => n.type === z.pc).forEach((n) => { - var l; - return (l = n.sheet) == null ? void 0 : l.render(); - }), i; - } -} -class Uo extends $r { - // static Get() { return game.eunoblades.ClockKeeper as BladesClockKeeper; } - static get defaultOptions() { - return foundry.utils.mergeObject(super.defaultOptions, { - classes: ["eunos-blades", "sheet", "item", "clock-keeper"], - template: "systems/eunos-blades/templates/items/clock_keeper-sheet.hbs", - width: 700, - height: 970, - // submitOnChange: false, - tabs: [{ navSelector: ".nav-tabs", contentSelector: ".tab-content", initial: "scene-keys" }] - }); - } - static async Initialize() { - return Items.registerSheet("blades", Uo, { types: ["clock_keeper"], makeDefault: !0 }), loadTemplates([ - "systems/eunos-blades/templates/items/clock_keeper-sheet.hbs" - ]); - } - getData() { - const e = super.getData(), t = { - currentScene: game.scenes.current.id, - targetScene: this.item.targetSceneID, - sceneOptions: Array.from(game.scenes), - sceneKeys: this.item.getSceneKeys(this.item.system.targetScene ?? game.scenes.current.id), - pcsWithProjects: Te.All.filter((s) => s.projects.length > 0), - factions: Array.from(Hr.All) - }; - return { ...e, ...t }; - } - addKey(e) { - e.preventDefault(), this.item.addClockKey(); - } - deleteKey(e) { - e.preventDefault(); - const t = e.currentTarget.dataset.id; - t && this.item.deleteClockKey(t); - } - setSelectColor(e, t) { - switch (t ?? (t = e.data("value")), t) { - case Ht.yellow: { - v.gsap.set(e, { - color: "var(--blades-black)", - background: "var(--blades-gold-bright)", - textShadow: "none" - }); - break; - } - case Ht.red: { - v.gsap.set(e, { - color: "var(--blades-white)", - background: "var(--blades-red)" - }); - break; - } - case Ht.cyan: { - v.gsap.set(e, { - color: "var(--blades-black)", - background: "var(--blades-blue-bright)", - textShadow: "none" - }); - break; - } - case Ht.white: { - v.gsap.set(e, { - color: "var(--blades-black)", - background: "var(--blades-white)", - textShadow: "none" - }); - break; - } - } - } - async activateListeners(e) { - await super.activateListeners(e), e.find('[data-action="create-clock-key"').on({ - click: async (o) => { - o.preventDefault(), await this.item.addClockKey(); - } - }); - function t(o) { - const n = $(o.currentTarget).data("keyId") || $(o.currentTarget).closest(".control-flipper").data("clockKeyId"); - if (!n) - throw new Error("No id found on element"); - const l = game.eunoblades.ClockKeys.get(n); - if (!l) - throw new Error(`Clock key with id ${n} not found`); - return l; - } - function s(o) { - const n = t(o), l = $(o.currentTarget).data("clockId") || $(o.currentTarget).closest(".control-flipper").data("clockId"); - if (!l) - throw new Error("No clockID found on element"); - const c = n.getClockByID(l); - if (!c) - throw new Error(`Clock with id ${l} not found`); - return [n, c]; - } - const i = e.find(".clock-key-control-flipper"); - i.find('[data-action="toggle-name-visibility"]').each((o, n) => { - const l = $(n), c = l.closest(".clock-key-control-flipper"); - l.on({ - click: async (u) => { - u.preventDefault(); - const g = t(u), f = !g.isNameVisible; - g.updateTarget("isNameVisible", f), g.isInScene() && g.isVisible && (f ? g.fadeInName_SocketCall(He.overlay) : g.fadeOutName_SocketCall(He.overlay)), c.find('[data-action="toggle-name-visibility"] i').toggleClass("fa-signature").toggleClass("fa-signature-slash").toggleClass("fa-solid").toggleClass("fa-regular"); - } - }); - }), i.find('[data-action="toggle-spotlight"]').each((o, n) => { - const l = $(n), c = l.closest(".clock-key-control-flipper"); - l.on({ - click: async (u) => { - u.preventDefault(); - const g = t(u), f = !g.isSpotlit; - g.updateTarget("isSpotlit", f), g.isInScene() && g.isVisible, c.find('[data-action="toggle-spotlight"] i').toggleClass("fa-message").toggleClass("fa-message-slash").toggleClass("fa-solid").toggleClass("fa-regular"); - } - }); - }), i.find('[data-action="pull-clock-key"]').each((o, n) => { - const l = $(n), c = l.closest(".clock-key-control-flipper"); - l.on({ - click: (u) => { - u.preventDefault(), v.gsap.effects.keyControlPanelFlip(c, { angle: 180 }); - const g = t(u); - g.updateTarget("isVisible", !1), game.eunoblades.Director.pullKey_SocketCall(g.id); - } - }); - }), i.find('[data-action="drop-clock-key"]').each((o, n) => { - const l = $(n), c = l.closest(".clock-key-control-flipper"); - l.on({ - click: (u) => { - u.preventDefault(), v.gsap.effects.keyControlPanelFlip(c, { angle: 0 }); - const g = t(u); - g.updateTarget("isVisible", !0), game.eunoblades.Director.renderClockKey_SocketCall(g.id); - } - }); - }), i.find('[data-action="spawn-position-dragger"]').on({ - click: async (o) => { - o.preventDefault(), t(o).spawnPositionDragger(game.eunoblades.Director.clockKeySection$); - } - }), i.find('[data-action="delete-clock-key"]').on({ - click: async (o) => { - o.preventDefault(), await t(o).delete(game.eunoblades.ClockKeys); - } - }), i.find('[data-action="add-key-to-scene"]').on({ - click: async (o) => { - o.preventDefault(), await t(o).addToScene(this.document.targetSceneID); - } - }), i.find('[data-action="remove-key-from-scene"]').on({ - click: async (o) => { - o.preventDefault(), await t(o).removeFromScene(this.document.targetSceneID); - } - }), i.find('[data-action="add-clock-to-key"]').on({ - click: async (o) => { - o.preventDefault(), await t(o).addClock(); - } - }), i.find("input.clock-key-input:not([readonly])").on({ - change: async (o) => { - o.preventDefault(); - const n = $(o.currentTarget), l = n.val(); - typeof l == "string" && (t(o).updateTarget(n.data("targetProp"), l), i.find("input.clock-key-input").val(l)); - } - }); - const r = e.find(".clock-control-flipper"); - r.find('[data-action="toggle-visible"]').each((o, n) => { - const l = $(n), c = l.closest(".clock-control-flipper"); - l.on({ - click: async (u) => { - u.preventDefault(); - const [g, f] = s(u), h = !f.isVisible; - f.updateTarget("isVisible", h), g.isInScene() && g.isVisible && (h ? f.reveal_SocketCall(He.overlay) : f.hide_SocketCall(He.overlay)), c.find('[data-action="toggle-visible"] i').toggleClass("fa-eye").toggleClass("fa-eye-slash").toggleClass("fa-solid").toggleClass("fa-regular"); - } - }); - }), r.find('[data-action="toggle-active"]').each((o, n) => { - const l = $(n), c = l.closest(".clock-control-flipper"); - l.on({ - click: async (u) => { - u.preventDefault(); - const [g, f] = s(u), h = !f.isActive; - f.updateTarget("isActive", h), f.parentKey.isInScene() && f.parentKey.isVisible && f.isVisible && (h ? f.activate_SocketCall(He.overlay) : f.deactivate_SocketCall(He.overlay)), c.find('[data-action="toggle-active"] i').toggleClass("fa-bolt").toggleClass("fa-bolt-slash").toggleClass("fa-solid").toggleClass("fa-regular"); - } - }); - }), r.find('[data-action="toggle-name-visibility"]').each((o, n) => { - const l = $(n), c = l.closest(".clock-control-flipper"); - l.on({ - click: async (u) => { - u.preventDefault(); - const g = s(u)[1], f = !g.isNameVisible; - g.updateTarget("isNameVisible", f), g.parentKey.isInScene() && g.parentKey.isVisible && g.isVisible && (f ? g.fadeInClockName_SocketCall(He.overlay) : g.fadeOutClockName_SocketCall(He.overlay)), c.find('[data-action="toggle-name-visibility"] i').toggleClass("fa-signature").toggleClass("fa-signature-slash").toggleClass("fa-solid").toggleClass("fa-regular"); - } - }); - }), r.find('[data-action="toggle-highlight"]').each((o, n) => { - const l = $(n), c = l.closest(".clock-control-flipper"); - l.on({ - click: async (u) => { - u.preventDefault(); - const [g, f] = s(u), h = !f.isHighlighted; - f.updateTarget("isHighlighted", h), f.parentKey.isInScene() && f.parentKey.isVisible && f.isVisible && (h ? f.highlight_SocketCall(He.overlay) : f.unhighlight_SocketCall(He.overlay)), c.find('[data-action="toggle-highlight"] i').toggleClass("fa-lightbulb").toggleClass("fa-lightbulb-slash").toggleClass("fa-solid").toggleClass("fa-regular"); - } - }); - }), r.find('[data-action="change-segments"]').each((o, n) => { - const l = $(n), c = l.closest(".clock-control-flipper"); - l.on({ - click: async (u) => { - u.preventDefault(); - const [g, f] = s(u), h = v.pInt($(u.currentTarget).data("value")), m = v.gsap.utils.clamp(0, f.max, f.value + h); - h > 0 ? f.fillSegments(h, !0) : f.clearSegments(Math.abs(h), !0), c.find("select.clock-select-value").val(m), f.changeSegments_SocketCall(He.overlay, f.value, m); - } - }); - }), r.find("select.clock-control-select").each((o, n) => { - $(n).hasClass("clock-select-color"); - }).on({ - change: (o) => { - o.preventDefault(); - const n = $(o.currentTarget), l = n.data("dtype") === "number" ? v.pInt(n.val()) : n.val(), c = n.data("targetProp"); - s(o)[1].updateTarget(c, l), c === "color" && typeof l == "string" && l in Ht && this.setSelectColor(n, l); - } - }), r.find("input.clock-input:not([readonly])").each((o, n) => { - const l = $(n), c = l.closest(".clock-control-flipper"); - l.on({ - change: (u) => { - u.preventDefault(); - const g = $(u.currentTarget), f = g.val(); - typeof f == "string" && (s(u)[1].updateTarget(g.data("targetProp"), f), c.find("input.clock-input").val(f)); - } - }); - }), r.find('[data-action="delete-clock"]').on({ - click: async (o) => { - o.preventDefault(), await s(o)[1].delete(); - } - }); - } -} -class bp { - static async GetSampleSchemas(e = {}) { - const t = e.user || "Alistair", s = e.pc || "Alistair", i = e.npc || "Setarra", r = e.faction || "the Bluecoats", o = game.users.getName(t); - if (!o) - throw new Error(`Sample user with name "${t}" not found.`); - const n = game.actors.getName(s); - if (!Te.IsType(n)) - throw new Error(`Sample BladesPC with name "${s}" not found.`); - const l = game.actors.getName(i); - if (!Br.IsType(l)) - throw new Error(`Sample BladesNPC with name "${i}" not found or is not a valid BladesNPC.`); - const c = game.actors.getName(r); - if (!Hr.IsType(c)) - throw new Error(`Sample BladesFaction with name "${r}" not found or is not a valid BladesFaction.`); - return { - BladesActionRoll_Schema: { - rollType: Ie.Action, - // rollSubType: RollSubType.GatherInfo, - // rollPrompt: "Gathering Information", - rollTrait: Is.skirmish, - // rollUserID: sampleUser.id, - // rollDowntimeAction: DowntimeAction.AcquireAsset, - // rollClockKey: U.getLast(game.eunoblades.ClockKeys.contents)?.id, - rollPrimaryData: Me.GetDataFromDoc(n), - rollOppData: Ft.GetDataFromDoc(c), - // rollParticipantData: {}, - // consequenceData: {}, - // resistanceData: { - // consequence: {} - // }, - rollModsData: {}, - rollPositionInitial: wt.risky, - rollEffectInitial: dt.standard, - rollPosEffectTrade: !1, - rollPhase: zs.Collaboration, - GMBoosts: {}, - GMOppBoosts: {}, - GMOverrides: {}, - rollFactorToggles: { - source: {}, - opposition: {} - }, - userPermissions: { - [o.id]: ht.Primary - } - // rollPositionFinal: Position.risky, - // rollEffectFinal: Effect.standard, - // rollResult: RollResult.success, - // rollResultDelta: 0, - // rollResultFinal: RollResult.success, - // rollTraitVerb: "skirmishes", - // rollTraitPastVerb: "skirmished", - // finalDiceData: [], - // isInlineResistanceRoll: false - } - }; - } -} -CONFIG.debug.logging = !0; -Object.assign(globalThis, { eLog: $h, BladesDebug: bp }); -Handlebars.registerHelper("eLog", $h.hbsLog); -let nu; -class vp { - get clockKeys() { - return game.eunoblades.ClockKeys.filter((e) => e.isInScene() && e.isVisible); - } - get roll() { - return xs.Active; - } - get user() { - return game.users.getName("Alistair"); - } - get actor() { - return game.actors.getName("Alistair"); - } - get rollTarget() { - var e; - return (e = this.roll) == null ? void 0 : e.target; - } - get rollData() { - var e; - return (e = this.roll) == null ? void 0 : e.data; - } - get userFlags() { - var e, t; - return (t = (e = this.user) == null ? void 0 : e.flags) == null ? void 0 : t["eunos-blades"]; - } - get actorFlags() { - var e, t; - return (t = (e = this.actor) == null ? void 0 : e.flags) == null ? void 0 : t["eunos-blades"]; - } - get rollPrimary() { - var e; - return (e = this.roll) == null ? void 0 : e.rollPrimary; - } - get rollPrimaryDoc() { - var e; - return (e = this.roll) == null ? void 0 : e.rollPrimaryDoc; - } - get rollOpposition() { - var e; - return (e = this.roll) == null ? void 0 : e.rollOpposition; - } - get sheetData() { - var e; - return (e = this.roll) == null ? void 0 : e.context; - } - newActionRoll() { - var s; - const e = game.actors.getName("Alistair"); - if (!e) - return; - const t = { - target: e, - targetFlagKey: "rollCollab", - rollType: Ie.Action, - rollTrait: Is.finesse, - rollUserID: (s = game.users.find((i) => { - var r; - return ((r = i.character) == null ? void 0 : r.name) === "Alistair"; - })) == null ? void 0 : s.id, - rollPrimaryData: e - }; - kr.New(t); - } - // async newResistanceRoll() { - // const pc = game.actors.getName("Alistair") as BladesPC|undefined; - // if (!pc?.id) { return; } - // const csq = await BladesConsequence.Create({ - // target: pc, - // targetFlagKey: "rollConsequence" as TargetFlagKey, - // name: "Shattered Knee", - // isScopingById: true, - // type: ConsequenceType.ProwessHarm3, - // primaryID: pc.uuid, - // attribute: AttributeTrait.prowess, - // attributeVal: 3, - // resistSchema: { - // name: "Banged Knee", - // type: ConsequenceType.ProwessHarm2, - // primaryID: pc.uuid, - // canResistWithSpecial: true, - // resistWithSpecialNegates: true, - // specialFooterMsg: "Ability: Spend to Fully Negate." - // }, - // canResistWithRoll: true, - // canResistWithSpecial: true, - // resistWithSpecialNegates: true, - // specialFooterMsg: "Ability: Spend to Fully Negate." - // }); - // const conf: BladesRoll.Config = { - // target: pc, - // targetFlagKey: "rollCollab" as TargetFlagKey, - // rollType: RollType.Resistance, - // rollUserID: game.users.find((user) => user.character?.name === "Alistair")?.id as IDString, - // rollPrimaryData: pc, - // resistanceData: { - // consequence: csq.data - // } - // }; - // BladesResistanceRoll.New(conf); - // } -} -Object.assign( - globalThis, - { - get: new vp(), - // updateClaims, - // updateContacts, - // updateOps, - // updateFactions, - // updateDescriptions, - // updateRollMods, - BladesScene: Nh, - BladesDirector: kt, - BladesActor: oe, - BladesPC: Te, - BladesCrew: Lt, - BladesNPC: Br, - BladesFaction: Hr, - BladesPCSheet: ll, - BladesCrewSheet: hl, - BladesFactionSheet: ul, - BladesClockKey: Et, - BladesNPCSheet: cl, - BladesActiveEffect: ls, - BladesRoll: xs, - BladesRollMod: ti, - BladesRollPrimary: Me, - BladesRollOpposition: Ft, - BladesRollParticipant: bt, - BladesActionRoll: kr, - BladesEngagementRoll: Fh, - BladesFortuneRoll: Wa, - BladesIncarcerationRoll: Lh, - BladesIndulgeViceRoll: tc, - BladesInlineResistanceRoll: Oh, - BladesResistanceRoll: ec, - BladesChat: Ei, - BladesConsequence: Cs, - G: va, - U: v, - C: Y, - BladesItem: te, - BladesClockKeeper: zo, - BladesGMTracker: Nr, - BladesLocation: Ah, - BladesProject: Ba, - BladesScore: Ha, - BladesItemSheet: $r, - BladesClockKeeperSheet: Uo, - BladesGMTrackerSheet: Yo, - BladesAI: mp, - AIAssistant: fp, - AGENTS: yp - } -); -Hooks.once("init", async () => { - game.eunoblades = { - Rolls: new Collection(), - ClockKeys: new Collection(), - Consequences: new Collection(), - Director: kt.getInstance(), - Tooltips: /* @__PURE__ */ new WeakMap() - }, eLog.display("Initializing Blades In the Dark System"), J2(), CONFIG.debug.hooks = v.getSetting("debugHooks"), ap(), CONFIG.Item.documentClass = lp, CONFIG.Actor.documentClass = cp, CONFIG.Scene.documentClass = Nh, CONFIG.ChatMessage.documentClass = Ei, Actors.unregisterSheet("core", ActorSheet), Items.unregisterSheet("core", ItemSheet), Items.registerSheet("blades", $r, { types: Y.ItemTypes, makeDefault: !0 }), ip(), sp(), await Promise.all([ - Te.Initialize(), - Lt.Initialize(), - Br.Initialize(), - Hr.Initialize(), - ls.Initialize(), - Yo.Initialize(), - Uo.Initialize(), - Ha.Initialize(), - Fr.Initialize(), - xs.Initialize(), - Ba.Initialize(), - Ei.Initialize() - ]); -}); -Hooks.once("ready", async () => { - await Promise.all([ - kt.Initialize(), - Nr.Initialize(), - zo.Initialize() - ]), Et.Initialize(), await Cs.Initialize(), tp(), ep(), Q2(), await kt.getInstance().renderOverlay_SocketResponse(), kt.InitSockets(), xs.InitSockets(); -}); -Hooks.once("socketlib.ready", () => { - nu = socketlib.registerSystem("eunos-blades"), Object.assign( - globalThis, - { socket: nu, socketlib } - ); -}); -Hooks.once("diceSoNiceReady", (a) => { - a.addSystem({ id: "eunos-blades", name: "Euno's Blades" }, "preferred"), a.addDicePreset({ - type: "d6", - labels: [1, 2, 3, 4, 5, 6].map((e) => `systems/eunos-blades/assets/dice/faces/${e}.webp`), - system: "eunos-blades", - bumpMaps: [1, 2, 3, 4, 5, 6].map((e) => `systems/eunos-blades/assets/dice/bump-maps/${e}.webp`), - emissiveMaps: [void 0, void 0, void 0, void 0, void 0, "systems/eunos-blades/assets/dice/emission-maps/6.webp"], - emissive: "#d89300" - }); -}); -//# sourceMappingURL=blades.js.map diff --git a/dist/fonts.css b/dist/fonts.css deleted file mode 100644 index fa53618d..00000000 --- a/dist/fonts.css +++ /dev/null @@ -1,356 +0,0 @@ -@font-face { - font-family: "Fjalla One"; - src: url("./assets/fonts/FjallaOne.ttf") format("truetype"); -} -@font-face { - font-family: "Historical FellType"; - src: url("./assets/fonts/HistoricalFellType/HistoricalFellType.otf") format("opentype"); - font-style: normal; -} -@font-face { - font-family: "Historical FellType"; - src: url("./assets/fonts/HistoricalFellType/HistoricalFellType i.otf") format("opentype"); - font-style: italic; -} -@font-face { - font-family: "Historical FellType SC"; - src: url("./assets/fonts/HistoricalFellTypeSC/HistoricalFellTypeSC.otf") format("opentype"); -} -@font-face { - font-family: "IM FELL Double Pica"; - src: url("./assets/fonts/IMFELLDoublePica/IMFELLDoublePica.otf") format("opentype"); - font-style: normal; -} -@font-face { - font-family: "IM FELL Double Pica"; - src: url("./assets/fonts/IMFELLDoublePica/IMFELLDoublePica i.otf") format("opentype"); - font-style: italic; -} -@font-face { - font-family: "IM FELL Double Pica SC"; - src: url("./assets/fonts/IMFELLDoublePicaSC/IMFELLDoublePicaSC.ttf") format("truetype"); -} -@font-face { - font-family: "Kirsty"; - src: url("./assets/fonts/Kirsty/Kirsty.otf") format("opentype"); - font-style: normal; - font-weight: normal; -} -@font-face { - font-family: "Kirsty"; - src: url("./assets/fonts/Kirsty/Kirsty B.otf") format("opentype"); - font-style: normal; - font-weight: bold; -} -@font-face { - font-family: "Kirsty"; - src: url("./assets/fonts/Kirsty/Kirsty i.otf") format("opentype"); - font-style: italic; - font-weight: normal; -} -@font-face { - font-family: "Kirsty"; - src: url("./assets/fonts/Kirsty/Kirsty Bi.otf") format("opentype"); - font-style: italic; - font-weight: bold; -} -@font-face { - font-family: "Pragmata"; - src: url("./assets/fonts/Pragmata/Pragmata.otf") format("opentype"); - font-style: normal; - font-weight: normal; -} -@font-face { - font-family: "Pragmata"; - src: url("./assets/fonts/Pragmata/Pragmata B.otf") format("opentype"); - font-style: normal; - font-weight: bold; -} -@font-face { - font-family: "Pragmata"; - src: url("./assets/fonts/Pragmata/Pragmata i.otf") format("opentype"); - font-style: italic; - font-weight: normal; -} -@font-face { - font-family: "Pragmata"; - src: url("./assets/fonts/Pragmata/Pragmata Bi.otf") format("opentype"); - font-style: italic; - font-weight: bold; -} -@font-face { - font-family: "Minion Pro"; - src: url("./assets/fonts/MinionPro/MinionPro.otf") format("opentype"); - font-style: normal; - font-weight: normal; -} -@font-face { - font-family: "Minion Pro"; - src: url("./assets/fonts/MinionPro/MinionPro M.otf") format("opentype"); - font-style: normal; - font-weight: 500; -} -@font-face { - font-family: "Minion Pro"; - src: url("./assets/fonts/MinionPro/MinionPro S.otf") format("opentype"); - font-style: normal; - font-weight: 600; -} -@font-face { - font-family: "Minion Pro"; - src: url("./assets/fonts/MinionPro/MinionPro B.otf") format("opentype"); - font-style: normal; - font-weight: bold; -} -@font-face { - font-family: "Minion Pro"; - src: url("./assets/fonts/MinionPro/MinionPro i.otf") format("opentype"); - font-style: italic; - font-weight: normal; -} -@font-face { - font-family: "Minion Pro"; - src: url("./assets/fonts/MinionPro/MinionPro Mi.otf") format("opentype"); - font-style: italic; - font-weight: 500; -} -@font-face { - font-family: "Minion Pro"; - src: url("./assets/fonts/MinionPro/MinionPro Si.otf") format("opentype"); - font-style: italic; - font-weight: 600; -} -@font-face { - font-family: "Minion Pro"; - src: url("./assets/fonts/MinionPro/MinionPro Bi.otf") format("opentype"); - font-style: italic; - font-weight: bold; -} -@font-face { - font-family: "Minion Pro Caption"; - src: url("./assets/fonts/MinionProCapt/MinionProCapt.otf") format("opentype"); - font-style: normal; - font-weight: normal; -} -@font-face { - font-family: "Minion Pro Caption"; - src: url("./assets/fonts/MinionProCapt/MinionProCapt M.otf") format("opentype"); - font-style: normal; - font-weight: 400; -} -@font-face { - font-family: "Minion Pro Caption"; - src: url("./assets/fonts/MinionProCapt/MinionProCapt S.otf") format("opentype"); - font-style: normal; - font-weight: 600; -} -@font-face { - font-family: "Minion Pro Caption"; - src: url("./assets/fonts/MinionProCapt/MinionProCapt B.otf") format("opentype"); - font-style: normal; - font-weight: bold; -} -@font-face { - font-family: "Minion Pro Caption"; - src: url("./assets/fonts/MinionProCapt/MinionProCapt i.otf") format("opentype"); - font-style: italic; - font-weight: normal; -} -@font-face { - font-family: "Minion Pro Caption"; - src: url("./assets/fonts/MinionProCapt/MinionProCapt Mi.otf") format("opentype"); - font-style: italic; - font-weight: 400; -} -@font-face { - font-family: "Minion Pro Caption"; - src: url("./assets/fonts/MinionProCapt/MinionProCapt Si.otf") format("opentype"); - font-style: italic; - font-weight: 600; -} -@font-face { - font-family: "Minion Pro Caption"; - src: url("./assets/fonts/MinionProCapt/MinionProCapt Bi.otf") format("opentype"); - font-style: italic; - font-weight: bold; -} -@font-face { - font-family: "Minion Pro Cond"; - src: url("./assets/fonts/MinionProCond/MinionProCond.otf") format("opentype"); - font-style: normal; - font-weight: normal; -} -@font-face { - font-family: "Minion Pro Cond"; - src: url("./assets/fonts/MinionProCond/MinionProCond M.otf") format("opentype"); - font-style: normal; - font-weight: 400; -} -@font-face { - font-family: "Minion Pro Cond"; - src: url("./assets/fonts/MinionProCond/MinionProCond S.otf") format("opentype"); - font-style: normal; - font-weight: 600; -} -@font-face { - font-family: "Minion Pro Cond"; - src: url("./assets/fonts/MinionProCond/MinionProCond B.otf") format("opentype"); - font-style: normal; - font-weight: bold; -} -@font-face { - font-family: "Minion Pro Cond"; - src: url("./assets/fonts/MinionProCond/MinionProCond i.otf") format("opentype"); - font-style: italic; - font-weight: normal; -} -@font-face { - font-family: "Minion Pro Cond"; - src: url("./assets/fonts/MinionProCond/MinionProCond Mi.otf") format("opentype"); - font-style: italic; - font-weight: 400; -} -@font-face { - font-family: "Minion Pro Cond"; - src: url("./assets/fonts/MinionProCond/MinionProCond Si.otf") format("opentype"); - font-style: italic; - font-weight: 600; -} -@font-face { - font-family: "Minion Pro Cond"; - src: url("./assets/fonts/MinionProCond/MinionProCond Bi.otf") format("opentype"); - font-style: italic; - font-weight: bold; -} -@font-face { - font-family: "Minion Pro Caption Cond"; - src: url("./assets/fonts/MinionProCondCapt/MinionProCondCapt.otf") format("opentype"); - font-style: normal; - font-weight: normal; -} -@font-face { - font-family: "Minion Pro Caption Cond"; - src: url("./assets/fonts/MinionProCondCapt/MinionProCondCapt M.otf") format("opentype"); - font-style: normal; - font-weight: 500; -} -@font-face { - font-family: "Minion Pro Caption Cond"; - src: url("./assets/fonts/MinionProCondCapt/MinionProCondCapt S.otf") format("opentype"); - font-style: normal; - font-weight: 600; -} -@font-face { - font-family: "Minion Pro Caption Cond"; - src: url("./assets/fonts/MinionProCondCapt/MinionProCondCapt B.otf") format("opentype"); - font-style: normal; - font-weight: bold; -} -@font-face { - font-family: "Minion Pro Caption Cond"; - src: url("./assets/fonts/MinionProCondCapt/MinionProCondCapt i.otf") format("opentype"); - font-style: italic; - font-weight: normal; -} -@font-face { - font-family: "Minion Pro Caption Cond"; - src: url("./assets/fonts/MinionProCondCapt/MinionProCondCapt Mi.otf") format("opentype"); - font-style: italic; - font-weight: 400; -} -@font-face { - font-family: "Minion Pro Caption Cond"; - src: url("./assets/fonts/MinionProCondCapt/MinionProCondCapt Si.otf") format("opentype"); - font-style: italic; - font-weight: 600; -} -@font-face { - font-family: "Minion Pro Caption Cond"; - src: url("./assets/fonts/MinionProCondCapt/MinionProCondCapt Bi.otf") format("opentype"); - font-style: italic; - font-weight: bold; -} -@font-face { - font-family: "Oswald"; - src: url("./assets/fonts/Oswald.ttf") format("truetype"); -} -@font-face { - font-family: "PWSignaturetwo"; - src: url("./assets/fonts/PWSignaturetwo/PWSignaturetwo.ttf") format("truetype"); -} -@font-face { - font-family: "Ravenscroft"; - src: url("./assets/fonts/Ravenscroft/Ravenscroft.ttf") format("truetype"); -} -@font-face { - font-family: "UglyQua"; - src: url("./assets/fonts/UglyQua/UglyQua.ttf") format("truetype"); - font-style: normal; -} -@font-face { - font-family: "UglyQua"; - src: url("./assets/fonts/UglyQua/UglyQua i.ttf") format("truetype"); - font-style: italic; -} -@font-face { - font-family: "Beaufort"; - src: url("./assets/fonts/Beaufort/Beaufort B.otf") format("opentype"); - font-style: normal; - font-weight: 700; -} -@font-face { - font-family: "Beaufort"; - src: url("./assets/fonts/Beaufort/Beaufort Bi.otf") format("opentype"); - font-style: italic; - font-weight: 700; -} -@font-face { - font-family: "Beaufort"; - src: url("./assets/fonts/Beaufort/Beaufort S.otf") format("opentype"); - font-style: normal; - font-weight: 600; -} -@font-face { - font-family: "Beaufort"; - src: url("./assets/fonts/Beaufort/Beaufort Si.otf") format("opentype"); - font-style: italic; - font-weight: 600; -} -@font-face { - font-family: "Beaufort"; - src: url("./assets/fonts/Beaufort/Beaufort M.otf") format("opentype"); - font-style: normal; - font-weight: 500; -} -@font-face { - font-family: "Beaufort"; - src: url("./assets/fonts/Beaufort/Beaufort Mi.otf") format("opentype"); - font-style: italic; - font-weight: 500; -} -@font-face { - font-family: "Beaufort"; - src: url("./assets/fonts/Beaufort/Beaufort L.otf") format("opentype"); - font-style: normal; - font-weight: light; -} -@font-face { - font-family: "Beaufort"; - src: url("./assets/fonts/Beaufort/Beaufort Li.otf") format("opentype"); - font-style: italic; - font-weight: light; -} -@font-face { - font-family: "Beaufort"; - src: url("./assets/fonts/Beaufort/Beaufort.otf") format("opentype"); - font-style: normal; - font-weight: normal; -} -@font-face { - font-family: "Beaufort"; - src: url("./assets/fonts/Beaufort/Beaufort i.otf") format("opentype"); - font-style: italic; - font-weight: normal; -} - -/*# sourceMappingURL=fonts.css.map */ diff --git a/dist/fonts.css.map b/dist/fonts.css.map deleted file mode 100644 index e41f57ab..00000000 --- a/dist/fonts.css.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sourceRoot":"","sources":["../src/scss/fonts.scss"],"names":[],"mappings":"AACA;EACE;EACA;;AAGF;EACE;EACA;EACA;;AAGF;EACE;EACA;EACA;;AAGF;EACE;EACA;;AAGF;EACE;EACA;EACA;;AAEF;EACE;EACA;EACA;;AAGF;EACE;EACA;;AAGF;EACE;EACA;EACA;EACA;;AAEF;EACE;EACA;EACA;EACA;;AAEF;EACE;EACA;EACA;EACA;;AAEF;EACE;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;;AAEF;EACE;EACA;EACA;EACA;;AAEF;EACE;EACA;EACA;EACA;;AAEF;EACE;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;;AAEF;EACE;EACA;EACA;EACA;;AAEF;EACE;EACA;EACA;EACA;;AAEF;EACE;EACA;EACA;EACA;;AAEF;EACE;EACA;EACA;EACA;;AAEF;EACE;EACA;EACA;EACA;;AAEF;EACE;EACA;EACA;EACA;;AAEF;EACE;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;;AAEF;EACE;EACA;EACA;EAEA;;AAEF;EACE;EACA;EACA;EACA;;AAEF;EACE;EACA;EACA;EACA;;AAEF;EACE;EACA;EACA;EACA;;AAEF;EACE;EACA;EACA;EAEA;;AAEF;EACE;EACA;EACA;EACA;;AAEF;EACE;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;;AAEF;EACE;EACA;EACA;EAEA;;AAGF;EACE;EACA;EACA;EACA;;AAEF;EACE;EACA;EACA;EACA;;AAEF;EACE;EACA;EACA;EACA;;AAEF;EACE;EACA;EACA;EAEA;;AAEF;EACE;EACA;EACA;EACA;;AAEF;EACE;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;;AAEF;EACE;EACA;EACA;EAEA;;AAEF;EACE;EACA;EACA;EACA;;AAEF;EACE;EACA;EACA;EACA;;AAEF;EACE;EACA;EACA;EACA;;AAEF;EACE;EACA;EACA;EAEA;;AAEF;EACE;EACA;EACA;EACA;;AAEF;EACE;EACA;EACA;EACA;;AAEF;EACE;EACA;;AAEF;EACE;EACA;;AAGF;EACE;EACA;;AAGF;EACE;EACA;EACA;;AAEF;EACE;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA","file":"fonts.css"} \ No newline at end of file diff --git a/dist/index.html b/dist/index.html deleted file mode 100644 index d48fdc3d..00000000 --- a/dist/index.html +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - Initial Index (for Vite) - - - - - - \ No newline at end of file diff --git a/dist/index.js b/dist/index.js deleted file mode 100644 index 7f3d636f..00000000 --- a/dist/index.js +++ /dev/null @@ -1,6 +0,0 @@ -// only required for dev -// in prod, foundry loads index.js, which is compiled by vite/rollup -// in dev, foundry loads index.js, this file, which loads lancer.ts - -window.global = window; // some of your dependencies might need this -import "./ts/blades.ts"; diff --git a/dist/json/factions.json b/dist/json/factions.json deleted file mode 100644 index 9f32e83a..00000000 --- a/dist/json/factions.json +++ /dev/null @@ -1,1187 +0,0 @@ -{ - "FACTIONS": { - "The Billhooks": { - "name": "The Billhooks", - "subtitle": "A Hack-and-Slash Group of Toughened Thugs", - "concept": "A tough gang of thugs who prefer hatchets, meat hooks, and pole arms.", - "description": "The Billhooks have a bloody reputation, often leaving the butchered corpses of their victims strewn about in a grisly display. Many wonder why the Bluecoats turn a blind eye to their savagery. Based out of their butcher shop headquarters, they are led by Tarvul, who is currently serving life in prison.", - "clocks": [ - { - "label": "Terrorize magistrates to pardon members in prison", - "value": 0, - "max": 8 - } - ], - "npcs": [ - { - "name": "Tarvul", - "gender": "m", - "keyPhrases": [ - "Savage", - "Arrogant", - "Family Man" - ], - "other": "Leader of the Billhooks, currently serving life in prison." - }, - { - "name": "Erin", - "gender": "f", - "keyPhrases": [ - "Confident", - "Deadly", - "Ambitious" - ], - "other": "Billhooks Captain, sister to Tarvul." - }, - { - "name": "Coran", - "gender": "m", - "keyPhrases": [ - "Fierce", - "Loyal", - "Quiet" - ], - "other": "Billhooks thug, Tarvul's son." - } - ], - "turf": [ - "a butcher shop (HQ), stockyard & slaughterhouse", - "animal fighting pits", - "gambling dens", - "several terrified merchants & businesses (which they extort)" - ], - "assets": [ - "a large gang of bloodthirsty butchers", - "a pack of death-dogs" - ], - "allies": [ - "The Bluecoats", - "The Ministry of Preservation" - ], - "enemies": [ - "Ulf Ironborn", - "The Lost", - "The Citizenry of Crow's Foot", - "The Citizenry of the Docks" - ] - }, - "Bluecoats": { - "name": "Bluecoats", - "subtitle": "Corrupt City Watch of Duskvol", - "concept": "The City Watch of Duskwall. Known as the meanest gang in the city. Corrupt, violent, and cruel.", - "description": "The Bluecoats claim the whole city as their turf, but find their influence severely limited in Whitecrown, where the Imperial Military garrison holds sway under command of the Lord Governor. They are divided into companies by district, and have fierce rivalries, often good-natured, but sometimes violent.", - "clocks": [ - { - "label": "Procure bigger budget, military arms & equipment", - "value": 0, - "max": 8 - } - ], - "npcs": [ - { - "name": "Commander Clelland", - "gender": "m", - "keyPhrases": [ - "Corrupt", - "Cruel", - "Arrogant" - ], - "other": "Chief commissioner of the City Watch." - }, - { - "name": "Captain Michter", - "gender": "m", - "keyPhrases": [ - "Ambitious", - "Fierce", - "Confident" - ], - "other": "Chief instructor." - }, - { - "name": "Captain Vale", - "gender": "m", - "keyPhrases": [ - "Loyal", - "Insightful", - "Quiet" - ], - "other": "Quartermaster." - } - ], - "turf": [ - "The whole city, except Whitecrown" - ], - "assets": [ - "Many large gangs of vicious thugs in uniform", - "Armored coaches and canal patrol boats", - "Public punishment sites (pillories, stocks, hanging cages)" - ], - "allies": [ - "The City Council", - "The Billhooks", - "The Crows", - "Ironhook Prison", - "Lord Scurlock", - "The Unseen" - ], - "enemies": [ - "Imperial Military", - "many criminal organizations" - ] - }, - "The Church of Ecastasy": { - "name": "The Church of Ecstasy", - "subtitle": "The State Religion Honoring Life and Abhorring Spirits", - "concept": "The “state religion” honors the life of the body and abhors the corrupted spirit world. Essentially a secret society.", - "description": "The Church of Ecstasy, also known as the state religion, venerates the sanctity of the physical body while condemning the tainted realm of spirits. Operating as a clandestine organization, the Church's core belief is that the purest entities are those devoid of spirits, such as demons. These demons, immortal and uncorrupted by the madness that afflicts rogue human spirits and vampires, are perceived as the epitome of perfection. The Church's most devout followers aspire to emulate these demons, seeking the elusive secret of ascension. To this end, they conduct numerous sinister experiments and rituals involving hulls, hollows, vampires, and the occasional demon, all within the maze-like dungeons beneath the Church's primary cathedral in Brightstone.", - "clocks": [ - { - "label": "Unlock the secret of ascension", - "value": 0, - "max": 12 - }, - { - "label": "Eliminate the Reconciled", - "value": 0, - "max": 12 - } - ], - "npcs": [ - { - "name": "Elder Rowan", - "gender": "m", - "keyPhrases": [ - "Devout", - "Resolute", - "Visionary" - ], - "other": "Leader of the Church of Ecstasy." - }, - { - "name": "Preceptor Dunvil", - "gender": "m", - "keyPhrases": [ - "Unorthodox", - "Obsessive", - "Enigmatic" - ], - "other": "Arcane researcher for the Church." - } - ], - "turf": [ - "The Sanctorium grand cathedral in Brightstone", - "Many other smaller temples across the city" - ], - "assets": [ - "A large treasury of tithes from citizens", - "Extensive arcane and occult libraries, workspaces, and artifacts", - "Many cohorts of acolytes and hollows who enforce the will of the Church’s leadership" - ], - "allies": [ - "City Council", - "Leviathan Hunters", - "Spirit Wardens" - ], - "enemies": [ - "The Path of Echoes", - "The Reconciled" - ] - }, - "The Circle of Flame": { - "name": "The Circle of Flame", - "subtitle": "A Refined Secret Society with Dark Intentions", - "concept": "A refined secret society of antiquarians and scholars; cover for extortion, graft, vice, and murder.", - "description": "The Circle of Flame operates under the guise of a scholarly society, but in reality, they engage in extortion, graft, vice, and murder. With a vast treasury funded by their wealthy membership, they possess an impressive collection of ancient artifacts, maps, and ephemera. Their operations are protected by a highly trained and discreet private security force. Among their ranks is a demon in disguise, and they have a particular interest in the arcane artifacts and treasures of the Lost District.", - "clocks": [ - { - "label": "Acquire all the ancient artifacts of Kotar", - "value": 0, - "max": 8 - } - ], - "npcs": [ - { - "name": "Elstera Avrathi", - "gender": "f", - "keyPhrases": [ - "Secretive", - "Gracious" - ], - "other": "Iruvian diplomat and member of 'The Seven', the leadership council of the Circle" - }, - { - "name": "Lady Drake", - "gender": "f", - "keyPhrases": [ - "Cunning", - "Ruthless" - ], - "other": "Magistrate and member of 'The Seven'" - }, - { - "name": "Raffello", - "gender": "m", - "keyPhrases": [ - "Visionary", - "Obsessive" - ], - "other": "Painter and member of 'The Seven'" - }, - { - "name": "Lord Mora", - "gender": "m", - "keyPhrases": [ - "Cold", - "Suspicious" - ], - "other": "Noble and member of 'The Seven'" - }, - { - "name": "Lady Penderyn", - "gender": "f", - "keyPhrases": [ - "Charming", - "Patient" - ], - "other": "Noble and member of 'The Seven'" - }, - { - "name": "Madame Tesslyn", - "gender": "f", - "keyPhrases": [ - "Sophisticated", - "Subtle" - ], - "other": "Vice purveyor and member of 'The Seven'" - }, - { - "name": "Harvale Brogan", - "gender": "m", - "keyPhrases": [ - "Shrewd", - "Quiet" - ], - "other": "Vice purveyor and member of 'The Seven'" - } - ], - "turf": [ - "The Centuralia club, Six Towers (HQ)" - ], - "assets": [ - "Vast treasury provided by wealthy membership", - "Impressive collection of ancient artifacts, maps, and ephemera", - "Highly trained and discreet private security force" - ], - "allies": [ - "The Forgotten Gods", - "The Path of Echoes", - "City Council", - "The Foundation" - ], - "enemies": [ - "The Hive", - "The Silver Nails" - ] - }, - "City Council": { - "name": "City Council", - "subtitle": "The Elite Nobility Governing Duskvol", - "concept": "The elite nobility who run the city government, its treasury, magistrates, and public works.", - "description": "The City Council is composed of the scions of the six most powerful noble families in Doskvol. They oversee the city's government, treasury, magistrates, and public works. The council chambers are located in Charterhall, which also houses the government offices and the impregnable city treasury vaults. The council holds ownership of all public spaces in the city, including streets, docks, and waterways.", - "clocks": [ - { - "label": "Strangford eliminates threats", - "value": 0, - "max": 8 - }, - { - "label": "Strangford is removed from council", - "value": 0, - "max": 6 - } - ], - "npcs": [ - { - "name": "Bowmore", - "gender": "", - "keyPhrases": [], - "other": "Noble head of the esteemed Bowmore family." - }, - { - "name": "Clelland", - "gender": "", - "keyPhrases": [], - "other": "Noble head of the esteemed Clelland family." - }, - { - "name": "Dunvil", - "gender": "", - "keyPhrases": [], - "other": "Noble head of the esteemed Dunvil family." - }, - { - "name": "Penderyn", - "gender": "", - "keyPhrases": [], - "other": "Noble head of the esteemed Penderyn family." - }, - { - "name": "Rowan", - "gender": "", - "keyPhrases": [], - "other": "Noble head of the esteemed Rowan family." - }, - { - "name": "Strangford", - "gender": "", - "keyPhrases": [], - "other": "Noble head of the esteemed Strangford family." - } - ], - "turf": [ - "The city council chambers in Charterhall", - "Government offices", - "Impregnable city treasury vaults", - "Ownership of all public spaces in the city, including streets, docks, and waterways" - ], - "assets": [ - "A massive treasury of coin and valuable goods", - "Many officials, barristers, clerks, and officials", - "The public coaches operated by the Cabbies" - ], - "allies": [ - "Bluecoats", - "The Church of Ecstasy", - "The Circle of Flame", - "Lord Scurlock", - "The Brigade", - "Cabbies", - "Sparkwrights", - "The Foundation" - ], - "enemies": [ - "Imperial Military", - "Inspectors", - "Ministry of Preservation", - "The Reconciled" - ] - }, - "The Crows": { - "name": "The Crows", - "subtitle": "An Old Gang with New Leadership", - "concept": "An old gang known for running illegal games of chance and extortion rackets.", - "description": "The Crows claim all of Crow's Foot as their turf, with everyone in the district paying up the chain to them. Their headquarters is in an abandoned City Watch tower, and they operate gambling dens in Crow's Foot and extortion rackets at the Docks. Led by Lyssa, they are known for their veteran gang of thugs and killers. They also possess a number of small boats and a fortified HQ.", - "gm_notes": "Lyssa murdered the former boss of the Crows, Roric. His vengeful ghost is now at large in the city. As the power-play continues, the Crows' hold on the district might slip away due to some members' loyalty to Roric.", - "clocks": [ - { - "label": "Reestablish control of Crow's Foot", - "value": 0, - "max": 6 - }, - { - "label": "Rise in Tier", - "value": 0, - "max": 6 - } - ], - "npcs": [ - { - "name": "Lyssa", - "gender": "f", - "keyPhrases": [ - "Brash", - "Killer", - "Noble Family" - ], - "other": "Leader of The Crows." - }, - { - "name": "Bell", - "gender": "f", - "keyPhrases": [ - "Loyal" - ], - "other": "Second-in-command of The Crows." - } - ], - "turf": [ - "Claims all of Crow's Foot", - "HQ in an abandoned City Watch tower", - "Operates gambling dens in Crow's Foot", - "Extortion rackets at the Docks" - ], - "assets": [ - "A veteran gang of thugs and killers", - "A number of small boats", - "A fortified HQ" - ], - "allies": [ - "The Bluecoats", - "Sailors", - "The Lost", - "Citizens of Crow's Foot" - ], - "enemies": [ - "The Hive", - "Inspectors", - "Dockers" - ] - }, - "Deathlands Scavengers": { - "name": "Deathlands Scavengers", - "subtitle": "Wasteland Wanderers Beyond the Barriers", - "concept": "Convicts from Ironhook and desperate freelancers who roam the wasteland beyond the lightning barriers.", - "description": "The Deathlands Scavengers are a group of convicts and freelancers who have chosen to roam the perilous wastelands beyond Duskvol's lightning barriers. These wastelands, known as the deathlands, are treacherous and filled with spirits and other dangers. The scavengers are led by Lady Thorn, a brave and caring leader who is haunted by her past. They search for lost artifacts and treasures in the wastes, which they sell or trade in the city. Some even manage to gather enough to buy a pardon and return to life within the barriers.", - "gm_notes": "Condemned prisoners are sometimes given “mercy” and sent into the deathlands rather than being executed at Ironhook. A few survive, thanks to Lady Thorn and her deathlands scavengers, who take them in and train them in the ways of deathlands hunting and survival.", - "clocks": [ - { - "label": "Obtain pardons (repeating)", - "value": 0, - "max": 8 - } - ], - "npcs": [ - { - "name": "Lady Thorn", - "gender": "f", - "keyPhrases": [ - "Haunted", - "Brave", - "Caring" - ], - "other": "Leader of the Deathlands Scavengers." - }, - { - "name": "Richter", - "gender": "m", - "keyPhrases": [ - "Patient", - "Quiet", - "Deadly" - ], - "other": "A skilled hunter in the wastelands." - } - ], - "turf": [ - "A few precious hold-fasts in the deathlands, secured by ancient rites against spirits.", - "Hunting grounds to feed on the few strange animals that survived the cataclysm." - ], - "assets": [ - "Generators, lightning hooks, gas-masks, air tanks, and other essentials of deathlands survival.", - "A secret ancient book of ritual sorcery." - ], - "allies": [ - "Forgotten Gods", - "Gondoliers", - "Spirit Wardens" - ], - "enemies": [ - "Ironhook Prison" - ] - }, - "The Dimmer Sisters": { - "name": "The Dimmer Sisters", - "subtitle": "Reclusive Mystics of the Occult", - "concept": "House-bound recluses with an occult reputation.", - "description": "The Dimmer Sisters are enigmatic figures who reside in a fine old manor house, along with the ancient temple ruin and subterranean canal beneath it. They have a reputation in the occult circles of Duskvol, and their true names and exact number remain a mystery. Some believe they are an ancient family of possessing spirits, while others whisper that they might be vampires. One thing is certain: those who enter their house are never seen again. They are served by apothecaries and witches, and their dealings are mostly kept secret from the outside world.", - "gm_notes": "The Sisters have been slowly and secretly consolidating the trade of captured spirits and spirit essences in Doskvol for several decades. Only a few remaining rivals stand between them and domination of the market.", - "clocks": [ - { - "label": "Dominate the spirit trade", - "value": 0, - "max": 6 - }, - { - "label": "Obtain arcane secrets (repeating)", - "value": 0, - "max": 4 - } - ], - "npcs": [ - { - "name": "Roslyn", - "gender": "f", - "keyPhrases": [ - "Patient", - "Loyal", - "Arcane" - ], - "other": "Deals with contacts outside the house." - }, - { - "name": "Irelen", - "gender": "f", - "keyPhrases": [ - "Loyal", - "Enigmatic", - "Obsessive" - ], - "other": "A sparkcraft tinkerer." - } - ], - "turf": [ - "Fine old manor house and grounds (HQ)", - "Ancient temple ruin and subterranean canal beneath", - "Apothecaries and witches in their service" - ], - "assets": [ - "A private electroplasmic generator, lightning barriers, and spirit containment vessels", - "Many spirits bound to service" - ], - "allies": [ - "The Forgotten Gods", - "The Foundation" - ], - "enemies": [ - "Spirit Wardens", - "The Reconciled" - ] - }, - "The Fog Hounds": { - "name": "The Fog Hounds", - "subtitle": "Rough Smugglers Seeking Patronage", - "concept": "A crew of rough smugglers looking for a patron.", - "description": "Led by Margette Vale, The Fog Hounds are a crew of hard-bitten, tough sailors, all former Void Sea transport haulers. These sailors have been put out of work by the new cargo rail lines and are well-worn from years of harrowing work on the Void Sea. The crew is insular and clannish, often skeptical of outsiders. However, once trust is earned, their loyalty is unbreakable. They currently aim to dominate the Northern smuggling routes in and out of Duskwall, hoping to eliminate any rivals and secure a steady patron.", - "gm_notes": "Vale and her crew are working to absorb or eliminate the remaining rivals in their territory. Their ultimate goal is to establish a consistent relationship with a patron who requires a regular flow of contraband.", - "clocks": [ - { - "label": "Eliminate rival smugglers", - "value": 0, - "max": 8 - }, - { - "label": "Obtain a regular patron", - "value": 0, - "max": 6 - } - ], - "npcs": [ - { - "name": "Margette Vale", - "gender": "f", - "keyPhrases": [ - "Quiet", - "Cold", - "Fearless" - ], - "other": "Leader of The Fog Hounds." - }, - { - "name": "Bear", - "gender": "m", - "keyPhrases": [ - "Fierce", - "Moody", - "Brash" - ], - "other": "Second in command." - }, - { - "name": "Goldie", - "gender": "f", - "keyPhrases": [ - "Calculating", - "Patient", - "Confident" - ], - "other": "Navigator for the crew." - } - ], - "turf": [ - "Underground canal dock (HQ)", - "North and East city canal routes", - "Northern Void Sea routes", - "Old North Port supply caches" - ], - "assets": [ - "Medium steamship, Fog Hound", - "A crew of hard-bitten, tough, expert sailors", - "A wide array of Imperial transport and cargo documents, some forged, some legit" - ], - "allies": [ - "Dockers", - "The Lampblacks" - ], - "enemies": [ - "Bluecoats (canal patrol)", - "The Vultures (rival smuggling outfit, Tier I)" - ] - }, - "Gondoliers": { - "name": "Gondoliers", - "subtitle": "Canal Boat Operators with Occult Knowledge", - "concept": "The canal boat operators. Venerated by ancient tradition. Said to know occult secrets.", - "description": "The Gondoliers are the canal boat operators of Doskvol, venerated by ancient tradition and believed to possess occult knowledge. They are beloved by most citizens, who often turn to them for assistance with supernatural problems rather than the Spirit Wardens. The Gondoliers have been protecting citizens from rogue spirits and other supernatural threats since ancient times, long before the Spirit Wardens were established.", - "gm_notes": "Recently, ritually disfigured hollows have been discovered in the canals, prompting an investigation by the Gondoliers. The Spirit Wardens are deliberately ignoring this situation. All Gondoliers are granted the Whisper's Compel special ability.", - "clocks": [ - { - "label": "Investigate desecrated hollows", - "value": 0, - "max": 8 - }, - { - "label": "Destroy spirit wells (repeating)", - "value": 0, - "max": 4 - } - ], - "npcs": [ - { - "name": "Eisele", - "gender": "f", - "keyPhrases": [ - "Serene", - "Knowledgeable", - "Fearless" - ], - "other": "Leader of the Gondoliers." - }, - { - "name": "Griggs", - "gender": "m", - "keyPhrases": [ - "Strange", - "Ruthless", - "Haunted" - ], - "other": "Chief Whisper for the Gondoliers." - } - ], - "turf": [ - "The canals of Doskvol" - ], - "assets": [ - "Fleet of gondolas and other water-craft", - "Map of known spirit wells and arcane sites across the city", - "A dedicated cohort of Adepts" - ], - "allies": [ - "The Lampblacks", - "Citizenry of all districts" - ], - "enemies": [ - "The Red Sashes", - "Spirit Wardens" - ] - }, - "The Gray Cloaks": { - "name": "The Gray Cloaks", - "subtitle": "Former Bluecoats Turned Criminals", - "concept": "A crew of former Bluecoats turned to crime after being framed and expelled from the City Watch.", - "description": "The Gray Cloaks are a group of former Bluecoats who were unjustly framed for a crime they didn't commit. While they were involved in some minor corrupt activities, they were not responsible for burning down the Watch station or destroying evidence against Lord Strangford. Now, having turned to crime, they operate out of the basement of the burned-down City Watch station and have taken over several apartments in Six Towers. They also run a pit-fighting arena and gambling den.", - "gm_notes": "The Gray Cloaks were framed by their Watch station commander for a crime that implicated Lord Strangford of the Leviathan Hunters. Some inspectors know the truth but lack evidence. Lord Strangford would pay handsomely to eliminate these threats.", - "clocks": [ - { - "label": "Secure Six Towers as their turf", - "value": 0, - "max": 8 - }, - { - "label": "Avenge their expulsion", - "value": 0, - "max": 8 - } - ], - "npcs": [ - { - "name": "Nessa", - "gender": "f", - "keyPhrases": [ - "Scrupulous", - "Daring" - ], - "other": "Leader of the Gray Cloaks." - }, - { - "name": "Hutch", - "gender": "m", - "keyPhrases": [ - "Brash", - "Fierce" - ], - "other": "Second in command." - } - ], - "turf": [ - "The basement of a burned-down City Watch station (HQ)", - "Several apartments above a tobacconist in Six Towers", - "A pit-fighting arena and gambling den" - ], - "assets": [ - "A sizeable gang of trained enforcers", - "Old uniforms and badges used to impersonate the City Watch" - ], - "allies": [ - "The Inspectors" - ], - "enemies": [ - "Bluecoats", - "Lord Strangford (Leviathan Hunters)" - ] - }, - "The Grinders": { - "name": "The Grinders", - "subtitle": "Vicious Former Dockers and Refinery Workers", - "concept": "A vicious gang of former dockers and leviathan blood refinery workers.", - "description": "The Grinders are a group of dockers and refinery workers from Lockport, a city to the North in Skovlan. They have come to Doskvol with a mission to raise an army, secure a warship, and take control of Lockport. Their goal is to destroy the Empire's refineries. To fund their mission, they've turned to criminal activities, especially looting and hijacking cargo barges across Doskvol.", - "gm_notes": "The city of Lockport processes 90% of the demon blood siphoned by the leviathan hunter ships of Doskvol. The refineries in Lockport have poisoned the city with toxic fumes and acid rain. The Grinders, affected by this, have come to Doskvol to raise an army and secure a warship to take control of Lockport and destroy the Empire's refineries.", - "clocks": [ - { - "label": "Raise a crew, steal a war ship", - "value": 0, - "max": 12 - }, - { - "label": "Fill war treasury", - "value": 0, - "max": 12 - } - ], - "npcs": [ - { - "name": "Hutton", - "gender": "m", - "keyPhrases": [ - "Confident", - "Volatile" - ], - "other": "Leader of the Grinders." - }, - { - "name": "Sercy", - "gender": "m", - "keyPhrases": [ - "Crippled", - "Defiant" - ], - "other": "Second in command." - }, - { - "name": "Derret", - "gender": "m", - "keyPhrases": [ - "Huge", - "Shrewd" - ], - "other": "Toughest gang member." - } - ], - "turf": [ - "Abandoned dock warehouse (HQ)", - "Underground canal dock" - ], - "assets": [ - "A few small canal boats", - "Wrecking tools and explosives" - ], - "allies": [ - "Ulf Ironborn", - "Dockers" - ], - "enemies": [ - "Bluecoats", - "Imperial Military", - "Leviathan Hunters", - "Sailors", - "The Silver Nails" - ] - }, - "The Hive": { - "name": "The Hive", - "subtitle": "Secretive Guild of Contraband Merchants", - "concept": "A guild of legitimate merchants who secretly trade in contraband. Named for their symbol, a golden bee.", - "description": "The Hive, symbolized by a golden bee, is a guild of merchants that operates legitimately on the surface but secretly trades in contraband. They have a vast presence across Doskvol, owning many shops, taverns, cafes, warehouses, and other mercantile establishments. The Hive is known to avoid business with any occult or arcane groups, and many of its members are followers of the Church of Ecstasy, rejecting the superstitions of the past.", - "gm_notes": "Djera Maha, the leader of The Hive, was once an urchin in the Dagger Isles. She climbed the ranks of every gang along the trade routes to Doskvol, establishing her acquisition and distribution network in the city. She is now poised to dominate all contraband markets. Djera had a close (possibly romantic) relationship with Roric, the leader of the Crows, who was recently murdered.", - "clocks": [ - {"label": "Dominate contraband market", "value": 0, "max": 8}, - {"label": "Avenge Roric’s murder", "value": 0, "max": 6} - ], - "npcs": [ - {"name": "Djera Maha", "gender": "f", "keyPhrases": ["Bold", "Strategic", "Confident"], "other": "Leader of The Hive."}, - {"name": "Karth Orris", "gender": "m", "keyPhrases": ["Ruthless", "Insightful", "Jealous"], "other": "Mercenary commander for The Hive."} - ], - "turf": [ - "Many shops, taverns, cafes, warehouses, and other mercantile establishments all across the city." - ], - "assets": [ - "A massive treasury", - "Elite mercenaries on retainer", - "A fleet of transport ships, carriages, wagons, and private trains" - ], - "allies": [ - "Ministry of Preservation", - "Dagger Isles Consulate" - ], - "enemies": [ - "The Circle of Flame", - "The Unseen", - "The Crows", - "The Wraiths" - ] - }, - "The Lampblacks": { - "name": "The Lampblacks", - "subtitle": "Former Lamp-Lighter Guild Turned Criminal", - "concept": "The former lamp-lighter guild, turned to crime when their services were replaced by electric lights.", - "description": "The Lampblacks, once a guild of lamp-lighters, turned to criminal activities after their services became obsolete due to the advent of electric lights. They now operate out of a coal warehouse in Crow's Foot and run several brothels and cheap drug dens across the district. Led by the charismatic Bazso Baz, they are seen by the working class as 'lovable rogues' standing up against the establishment. The gang is currently at war with the Red Sashes over turf and vengeance for past transgressions.", - "gm_notes": "Bazso Baz is a member of a secret society, the forgotten gods cult named 'The Empty Vessel', and sometimes prioritizes the needs of that group over his gang. The Lampblacks and the Red Sashes are in a turf war, and Bazso is recruiting aggressively, making it clear that one is either with them or against them.", - "clocks": [ - {"label": "Destroy the Red Sashes", "value": 0, "max": 8}, - {"label": "Become ward boss of Crow’s Foot", "value": 0, "max": 8} - ], - "npcs": [ - {"name": "Bazso Baz", "gender": "m", "keyPhrases": ["Charming", "Open", "Ruthless", "Whiskey Connoisseur"], "other": "Leader of The Lampblacks."}, - {"name": "Pickett", "gender": "m", "keyPhrases": ["Shrewd", "Conniving", "Suspicious"], "other": "Second in command."}, - {"name": "Henner", "gender": "m", "keyPhrases": ["Loyal", "Reckless"], "other": "A thug in the gang."} - ], - "turf": [ - "HQ in the office of a coal warehouse", - "Operates a handful of brothels and cheap drug dens across Crow’s Foot" - ], - "assets": [ - "A fearsome gang of leg-breakers and mayhem-makers", - "A number of smugglers on the payroll who run their drugs" - ], - "allies": [ - "The Fog Hounds", - "Gondoliers", - "Ironhook Prison" - ], - "enemies": [ - "The Red Sashes", - "The Bluecoats", - "Cabbies" - ] - }, - "Leviathan Hunters": { - "name": "Leviathan Hunters", - "subtitle": "Captains and Crews of the Void Sea", - "concept": "The captains and crews that grapple with titanic demons of the Void Sea to drain their blood for processing into electroplasm.", - "description": "The Leviathan Hunters are renowned for their daring ventures into the Void Sea, where they grapple with immense demons to extract their blood. This blood is then processed into electroplasm, a vital resource for the city of Doskvol. The hunters operate a fleet of vessels, each owned by a noble house that commands it. They have numerous expert sailors, spark-craft technicians, demonologist Whispers, and void-touched navigators. Additionally, they maintain companies of marines to safeguard their ships and their precious cargo both at sea and in port.", - "gm_notes": "The captains harbor a terrible secret: the known hunting grounds for leviathans are becoming barren. The once-reliable movements of these immortal creatures in the Void Sea have changed, and they are migrating elsewhere. New hunting grounds must be discovered before the surplus of leviathan blood runs out, threatening the lightning barriers and the survival of humanity.", - "clocks": [ - {"label": "Discover new hunting grounds", "value": 0, "max": 12}, - {"label": "Surplus runs dry", "value": 0, "max": 12} - ], - "npcs": [ - {"name": "Lord Strangford", "gender": "m", "keyPhrases": ["Ruthless", "Arrogant", "Tainted"], "other": "A captain of the Leviathan Hunters."}, - {"name": "Lady Clave", "gender": "f", "keyPhrases": ["Daring", "Cruel", "Accomplished"], "other": "Another captain in the fleet."}, - {"name": "Lady Ankhayat", "gender": "f", "keyPhrases": ["Confident", "Charming", "Scoundrel"], "other": "An Iruvian captain of the Leviathan Hunters."} - ], - "turf": [ - "The massive metal docks for the huge hunter ships", - "Construction and repair facilities", - "Several small private leviathan blood processing facilities for the captains’ personal shares" - ], - "assets": [ - "The leviathan hunter fleet", - "Many cohorts of expert sailors, spark-craft technicians, demonologist Whispers, and void-touched navigators", - "Companies of marines" - ], - "allies": [ - "City Council", - "The Church of Ecstasy", - "Sailors", - "Dockers", - "Sparkwrights" - ], - "enemies": [ - "The Grinders", - "Ministry of Preservation", - "The Path of Echoes" - ] - }, - "The Lost": { - "name": "The Lost", - "subtitle": "Protectors of the Downtrodden", - "concept": "A group of street-toughs and ex-soldiers dedicated to protecting the downtrodden and the hopeless.", - "description": "The Lost is a group of former thugs, killers, and Imperial soldiers who have turned their efforts towards protecting the vulnerable. Operating primarily in the districts of Coalridge and Dunslough, they have recently been focusing on sabotaging and attacking the notoriously cruel workhouse foremen in Coalridge. Their actions have emboldened union organizing efforts in the district, leading to increased tensions with local Bluecoat patrols.", - "gm_notes": "The Lost are driven by a need for atonement. Each member keeps a pile of stones under their bed, with each stone representing a sin they've committed. They believe that by performing just deeds, they can balance out these sins. The Coalridge foremen are offering a significant reward to anyone who can eliminate The Lost.", - "clocks": [ - {"label": "Destroy cruel workhouses (repeating)", "value": 0, "max": 4} - ], - "npcs": [ - {"name": "Cortland", "gender": "m", "keyPhrases": ["Idealist", "Candid", "Cavalier"], "other": "The leader of The Lost."} - ], - "turf": [ - "Converted rail car (HQ)", - "The poverty-stricken streets of Coalridge and Dunslough" - ], - "assets": [ - "A very experienced gang of formerly vicious thugs, killers, and Imperial soldiers" - ], - "allies": [ - "Workhouse Laborers", - "Citizens of Coalridge and Dunslough", - "The Crows" - ], - "enemies": [ - "Workhouse Foremen", - "Bluecoats", - "The Billhooks" - ] - }, - "Ministry of Preservation": { - "name": "Ministry of Preservation", - "subtitle": "Overseers of Vital Resources and Transport", - "concept": "Oversees transportation between cities and the disbursement of food and other vital resources.", - "description": "The Ministry of Preservation is responsible for overseeing transportation between cities and managing the distribution of essential resources. They control the electro-rail train lines of the Imperium and have a significant influence over radiant energy farms, eeleries, and other food-growing enterprises throughout the city. The Ministry has a fleet of cargo ships, armed escorts, and the Rail Jacks who work the train lines. They also maintain a private mercenary company that answers only to the ministry.", - "gm_notes": "The Ministry leadership believes that the leviathan hunters are too vital to the public well-being to be controlled by the noble houses. They are taking covert actions to seize control of the hunters and bring them under Ministry control.", - "clocks": [ - {"label": "Seize control of Leviathan Hunters", "value": 0, "max": 12} - ], - "npcs": [ - {"name": "Lord Dalmore", "gender": "m", "keyPhrases": ["Commanding", "Intelligent"], "other": "Executive officer in Doskvol."}, - {"name": "Lady Slane", "gender": "f", "keyPhrases": ["Insightful", "Subtle", "Effective"], "other": "Chief of operations."}, - {"name": "Captain Lannock", "gender": "m", "keyPhrases": ["Shrewd", "Ruthless"], "other": "Mercenary commander."} - ], - "turf": [ - "The electro-rail train lines of the Imperium", - "Radiant energy farms, eeleries, and other food-growing enterprises throughout the city" - ], - "assets": [ - "A fleet of cargo ships and their armed escorts", - "A significant treasury from taxation and transportation licensing", - "The Rail Jacks who work the train lines", - "A private mercenary company" - ], - "allies": [ - "The Billhooks", - "Imperial Military", - "Rail Jacks", - "Sparkwrights" - ], - "enemies": [ - "Leviathan Hunters" - ] - }, - "The Reconciled": { - "name": "The Reconciled", - "subtitle": "Ancient Spirits Seeking Order", - "concept": "An association of ancient spirits who have not gone feral with the passage of time.", - "description": "The Reconciled is a unique association of ancient spirits that, unlike most spirits, have not gone feral over time. They do not have a specific turf within the city. These spirits can possess victims indefinitely without causing any harm, and they have several hidden spirit wells across the city and in the deathlands, which provide them with the arcane energy they need to survive.", - "gm_notes": "The Reconciled view themselves as the rightful rulers of Duskwall. Some members of the City Council have become initiates in the Path of Echoes and will soon be vulnerable to possession by the Reconciled. These councilors are also high-ranking members of the Church of the Ecstasy of the Flesh, providing an opportunity for infiltration.", - "clocks": [ - {"label": "Infiltrate the City Council", "value": 0, "max": 8}, - {"label": "Infiltrate the Church of Ecstasy", "value": 0, "max": 8} - ], - "npcs": [], - "turf": [], - "assets": [ - "Several secret and hidden spirit wells across the city and in the deathlands" - ], - "allies": [ - "City Council", - "Gondoliers" - ], - "enemies": [ - "The Church of Ecstasy", - "Spirit Wardens", - "Sparkwrights" - ] - }, - "The Red Sashes": { - "name": "The Red Sashes", - "subtitle": "Ancient Iruvian Swordsmen Turned Criminals", - "concept": "Originally a school of ancient Iruvian sword arts, since expanded into criminal endeavors.", - "description": "The Red Sashes started as a school teaching ancient Iruvian sword arts. They have since expanded their operations into the criminal world. They operate out of their sword-fighting school which also serves as their headquarters. They have a strong presence in Crow's Foot and the Docks, where they run high-end drug dens. Several members of the Red Sashes are from noble Iruvian families, and their connections to powerful families in Doskvol make them a force to be reckoned with.", - "gm_notes": "The Red Sashes and the Lampblacks are currently at war over turf and for revenge. Mylera is recruiting aggressively, making it clear that neutrality is not an option. The Red Sashes have connections with former sword students in various influential positions.", - "clocks": [ - {"label": "Destroy the Lampblacks", "value": 0, "max": 8}, - {"label": "Become ward boss of Crow’s Foot", "value": 0, "max": 8} - ], - "npcs": [ - {"name": "Mylera Klev", "gender": "f", "keyPhrases": ["Shrewd", "Ruthless", "Educated", "Art Collector"], "other": "Leader of the Red Sashes."} - ], - "turf": [ - "HQ in their sword-fighting school/temple", - "Several high-end drug dens across Crow’s Foot and the Docks" - ], - "assets": [ - "Small contingent of master sword-fighters", - "Master alchemist; many potent potions and essences" - ], - "allies": [ - "Iruvian Consulate", - "The Path of Echoes", - "Dockers", - "Cabbies", - "Inspectors" - ], - "enemies": [ - "The Lampblacks", - "Bluecoats", - "Gondoliers" - ] - }, - "Lord Scurlock": { - "name": "Lord Scurlock", - "subtitle": "Mysterious Noble with Dark Secrets", - "concept": "An ancient noble, rumored to be immortal like the Emperor. Possibly a vampire or sorcerer. Obsessed with the occult.", - "description": "Lord Scurlock is an enigmatic figure in Doskvol, known for his cold demeanor and arcane interests. Rumors suggest he might be immortal, drawing comparisons with the Emperor. Some even whisper that he could be a vampire or a sorcerer. He owns a dilapidated manor house in Six Towers, which hides catacombs beneath. Across the city, he has an array of business holdings and cult shrines, all seemingly connected to a mysterious purpose.", - "gm_notes": "Lord Scurlock is bound by ancient magic to the demon Setarra. Their roles as master and servant have shifted over time. Currently, Scurlock owes a debt: Setarra has discovered sea demons in the harbor, trapped in stone since the cataclysm. She wishes to free them, and Scurlock must assist or face dire consequences.", - "clocks": [ - {"label": "Fulfill debt to Setarra", "value": 0, "max": 12}, - {"label": "Obtain arcane secrets (repeating)", "value": 0, "max": 6} - ], - "npcs": [ - {"name": "Lord Scurlock", "gender": "m", "keyPhrases": ["Enigmatic", "Cold", "Arcane", "Old-fashioned"], "other": "An individual so powerful he's considered a faction on his own. In combat, his personal scale is Tier III, equivalent to a large gang. Immune to spirits and moves silently. Difficult to look at directly."} - ], - "turf": [ - "A secret lair outside the city", - "A dilapidated manor house in Six Towers and the catacombs beneath", - "Various business holdings and cult shrines across the city" - ], - "assets": [ - "An impressive collection of occult and arcane curios, books, and ephemera", - "An ancient demonic temple" - ], - "allies": [ - "City Council", - "Bluecoats", - "Inspectors", - "The Forgotten Gods" - ], - "enemies": [ - "Spirit Wardens", - "The Immortal Emperor" - ] - }, - "The Silver Nails": { - "name": "The Silver Nails", - "subtitle": "Severosi Mercenaries and Ghost Killers", - "concept": "A company of Severosi mercenaries who fought for the Empire in the Unity War. Renowned ghost killers.", - "description": "The Silver Nails are a company of Severosi mercenaries known for their prowess in the Unity War. They are especially renowned as ghost killers. Based in Duskvol, they have their sights set on the Lost District, a forbidden area outside the city's lightning barrier. They aim to drive out or destroy the fierce ghosts that inhabit this district and seize control to uncover the hidden treasures and artifacts within. Their expertise from the deathlands of Severos makes them uniquely qualified for this task.", - "gm_notes": "The Silver Nails are looking to explore the Lost District, which is currently under the control of the Spirit Wardens. The Wardens are doing everything in their power to keep the Silver Nails and others out. Each member wears a ring fashioned from a silver nail, which protects against possession. They are all trained in the Ghost Fighter special ability.", - "clocks": [ - {"label": "Destroy spirits in the Lost District", "value": 0, "max": 8}, - {"label": "Control the Lost District", "value": 0, "max": 8} - ], - "npcs": [ - {"name": "Seresh", "gender": "m", "keyPhrases": ["Bold", "Brash", "Defiant"], "other": "Leader of The Silver Nails."}, - {"name": "Tuhan", "gender": "m", "keyPhrases": ["Bold", "Cunning", "Charming"], "other": "Lead scout for The Silver Nails."} - ], - "turf": [ - "A large inn (The Mustang) and its fine stables (HQ)" - ], - "assets": [ - "A contingent of exquisite Severosian cavalry horses—fearless, swift, and trained to hunt and battle spirits", - "Arcane lances" - ], - "allies": [ - "Imperial Military", - "Sailors", - "Severosan Consulate" - ], - "enemies": [ - "The Circle of Flame", - "The Grinders", - "Skovlan Consulate", - "Skovlander Refugees", - "Spirit Wardens" - ] - }, - "Sparkwrights": { - "name": "Sparkwrights", - "subtitle": "Engineers of Lightning and Pioneers of Spark-Craft", - "concept": "The engineers who maintain the lightning barriers. Also pioneers of spark-craft technology, indulging in dangerous research.", - "description": "The Sparkwrights are the engineers responsible for maintaining Duskvol's lightning barriers. Beyond this crucial role, they are also at the forefront of spark-craft technology. They constantly push the boundaries with their dangerous research, seeking innovations that could revolutionize the city's defenses and power sources.", - "gm_notes": "For centuries, the Sparkwrights have been working secretly to develop an alternative fuel that could replace leviathan blood, which powers the lightning barriers. Some researchers have come close, but mysterious 'accidents' have thwarted their progress. These accidents are likely orchestrated by the nobility who control leviathan hunting.", - "clocks": [ - {"label": "Develop alternative fuel", "value": 0, "max": 12} - ], - "npcs": [ - {"name": "Una Farros", "gender": "f", "keyPhrases": ["Curious", "Vain", "Famous"], "other": "Instructor at Charterhall University."} - ], - "turf": [ - "Massive workshop, factory, and design facility in Coalridge" - ], - "assets": [ - "The electroplasmic generators, city lights, lightning barriers and associated facilities and systems across the city" - ], - "allies": [ - "City Council", - "Leviathan Hunters", - "Ministry of Preservation" - ], - "enemies": [ - "The Path of Echoes", - "The Reconciled", - "The Foundation" - ] - }, - "Spirit Wardens": { - "name": "Spirit Wardens", - "subtitle": "Bronze-Masked Hunters of Rogue Spirits", - "concept": "The bronze-masked hunters who destroy rogue spirits. Also run Bellweather Crematorium to properly dispose of corpses.", - "description": "The Spirit Wardens are the enigmatic bronze-masked hunters responsible for destroying rogue spirits in the city. They operate the Bellweather Crematorium, ensuring the proper disposal of corpses to prevent the rise of these spirits. The Wardens maintain complete anonymity, with members cutting all personal ties and living solely for their duty. They utilize advanced equipment, including spirit-hunter hulls, and have the support of many expert Whispers. Their operations are so secretive that even their allies and enemies are often left guessing their next moves.", - "gm_notes": "The Spirit Wardens are aware of an enemy trying to infiltrate their ranks, though they are unaware that this enemy is the Unseen. They are currently setting a trap to identify and eliminate this threat.", - "clocks": [ - {"label": "Uncover the infiltrators", "value": 0, "max": 8} - ], - "npcs": [ - {"name": "Bakoros", "gender": "unknown", "keyPhrases": [], "other": "A Warden who may be several individuals and sometimes lectures at the College of Immortal studies at Doskvol Academy."} - ], - "turf": [ - "Bellweather Crematorium", - "The Master Warden’s estate in Whitecrown" - ], - "assets": [ - "The death bells that ring whenever someone dies in the city", - "The deathseeker crows that find the body", - "Many cohorts of expert Whispers", - "The most advanced spectrological and spark-craft equipment, including several spirit-hunter hulls" - ], - "allies": [ - "The Church of Ecstasy", - "Deathlands Scavengers" - ], - "enemies": [ - "The Dimmer Sisters", - "Gondoliers", - "Lord Scurlock", - "The Silver Nails", - "The Unseen", - "Path of Echoes", - "The Reconciled" - ] - }, - "Ulf Ironborn": { - "name": "Ulf Ironborn", - "subtitle": "Brutal Skovlander Fighting for Turf", - "concept": "A brutal Skovlander, newly arrived in the Dusk, fighting everyone for turf.", - "description": "Ulf Ironborn is a fierce Skovlander who has recently come to Doskvol. He is aggressively trying to establish his territory in the city, leading his gang in ruthless smash & grab operations. As more Skovlander war refugees come to the city, tensions rise, especially with the appearance of 'NO SKOVS' signs. Ulf's strong distrust for the local Akorosi and anyone loyal to the Imperial government makes him a volatile figure, but those of Skovlander blood can easily earn his trust.", - "gm_notes": "Ulf's anger is on a hair-trigger, especially with the rising bigotry against Skovlanders. He is likely to lead his gang into war against any 'true Duskers' who challenge him.", - "clocks": [ - {"label": "Carve out gang territory", "value": 0, "max": 6}, - {"label": "Rise in Tier", "value": 0, "max": 4} - ], - "npcs": [ - {"name": "Ulf Ironborn", "gender": "m", "keyPhrases": ["Ruthless", "Savage", "Bold"], "other": "Leader of his gang, a brutal Skovlander."}, - {"name": "Havid", "gender": "m", "keyPhrases": ["Ruthless", "Volatile", "Shrewd"], "other": "Ulf's second in command."} - ], - "turf": [ - "Rooms, workshop, and stable at The Old Forge tavern (HQ)", - "A gambling den" - ], - "assets": [ - "A small but powerfully savage gang of thugs" - ], - "allies": [ - "The Grinders" - ], - "enemies": [ - "Citizens of Coalridge", - "The Billhooks" - ] - } - - - - - - - - } -} \ No newline at end of file diff --git a/dist/json/heist-deck.json b/dist/json/heist-deck.json deleted file mode 100644 index fbb102ea..00000000 --- a/dist/json/heist-deck.json +++ /dev/null @@ -1,1407 +0,0 @@ -{ - "obstacles": [ - { - "name": "Centipedes", - "category": "Animal Guards", - "desc": "Centipedes the length of a forearm are almost noiseless. If they bite, their toxin causes living flesh to blacken and die, leading to amputation if the poison isn't countered. People tend to scream when bit.", - "questions": [ - "Were the centipedes brought in as guardians, or are they a local nuisance?", - "There are many different breeds, how will you describe the appearance of yours?", - "Do they have a nasty local nickname?" - ], - "modsHarder": [ - "When one attacks it releases a scent that enrages others nearby, so they tend to swarm.", - "They are excellent swimmers, and they hunt in bog-like areas under the surface." - ], - "modsEasier": [ - "They are bright yellow and red, and hiss before striking, giving all the warning possible.", - "All the guardians and neighbors carry the antidote, the local apothecary knows what you need." - ] - }, - { - "name": "Great Cats", - "category": "Animal Guards", - "desc": "One or more great cats slink through the shadows. They like to attack from high places. Their fur mottles to match the colors and tones and textures around them.", - "questions": [ - "Did the current owners bring them in, or are they inherited from a previous owner?", - "Do they stay on the estate, or go hunting in the local neighborhood?" - ], - "modsHarder": [ - "The cats are trained to alert guards (or wear charm jewelry to alert supernatural guardians) when they detect intruders with their keen senses.", - "Massive old trees draped with moss, or many ledges and overlooks, provide the cats cover." - ], - "modsEasier": [ - "There is only one, with a regular feeding time and place.", - "The cats are well fed and lazy, mostly for show unless provoked." - ] - }, - { - "name": "Hunting Spiders", - "category": "Animal Guards", - "desc": "These lightning-fast nightmares are about twenty pounds and three feet across, built like jumping spiders and loaded with paralytic venom.", - "questions": [ - "Were these spiders bred for a decadent aristocrat, or warped to this impossible size by an insane whisper?", - "Can they survive away from a spirit well?", - "What noise do they make?", - "How do they smell?" - ], - "modsHarder": [ - "They are mostly trained, their handler using a slide whistle to give orders to hunt, attack, withdraw, or guard.", - "The color of the stone, the shape of the underbrush, the leaf litter--everything matches the spider color scheme and hides its movement." - ], - "modsEasier": [ - "Little lasting harm at first; paralyzed prey is dragged back to a lair and webbed up. You have a day or so to rescue the prey before the spider injects acid into the web bundle so it can drink its victim.", - "The poison is weak and easy to resist, requiring several successful bites to put a human down." - ] - }, - { - "name": "Mastiff Pack", - "category": "Animal Guards", - "desc": "A pack of mastiffs have run of the guarded area when it is not in more public use. They only respond to their masters, who have special tunics, whistles, and gloves. They kill anyone or anything else.", - "questions": [ - "What is their heraldry?", - "How many mastiffs are in the pack?", - "Are they trained well enough to ignore poisoned meat or live animal distractions?" - ], - "modsHarder": [ - "Each one is precious to the site owner, who will tirelessly seek vengeance if they are hurt.", - "The pack masters are elite veterans with firearms and excellent tracking and hunting skills." - ], - "modsEasier": [ - "The equipment is properly installed, its vulnerable parts behind the energy curtain, directly guarding what needs protecting.", - "The lightning walls attract loose spirits, intruders may also have to contend with confused ghosts." - ] - }, - { - "name": "Venomous Snakes", - "category": "Animal Guards", - "desc": "Venomous snakes have lairs prepared for them in the guarded area.", - "questions": [ - "How fast acting is their venom?", - "How aggressive are they?", - "Is their hide camouflage for hunting, or bright to warn away predators?", - "Are there only a few big ones, or many small snakes?", - "Do the site guardians feed them, or can they find enough vermin on their own?" - ], - "modsHarder": [ - "Knee-deep plants and elevation shifts intentionally make it difficult to see snakes.", - "Other guardians have a side business in selling venom and meat and hides. They have venom blowdarts and poisoned daggers." - ], - "modsEasier": [ - "The snakes dislike a certain whistle tone. Let out a blast occasionally and they’ll stay away.", - "A former employee knows how guardians got around the site with minimal risk of snakes." - ] - }, - { - "name": "Armor Hosts", - "category": "Ghostly Guards", - "desc": "Guardian spirits are able to inhabit a crystal melded to each suit of armor in a guarded area. When melded, the spirit can control the armor. Spirits use the armor to attack intruders.", - "questions": [ - "Were the suits of armor built for this purpose, or retrofitted by a spirit trafficker?", - "Are the guardian spirits loyal, or were they stripped of their will by a ritual or other power?", - "Are the suits visibly paranormal?" - ], - "modsHarder": [ - "A single powerful (relatively sane) spirit can flit from armor to armor, backed up by two slave spirits. The guardian can form an electroplasmic face in the helmet to sneer at intruders.", - "A swarm of spirits are eager to take their turn in armor. When one tires another drops in.", - "Ceaseless patrol." - ], - "modsEasier": [ - "The ghost(s) that animate the armor are murderous and difficult to control.", - "The guardians can play a chime to recall them to a restraining prism.", - "The suits of armor are old, battered, and prone to physical failure." - ] - }, - { - "name": "Coldrooms", - "category": "Ghostly Guards", - "desc": "The defended area is kept cold. Body heat registers like a plume of blood in the water. Ghosts flood living meat with cold, gorging on body heat, becoming more visible as their outlines swirl with life-blood.", - "questions": [ - "Were they created by ritually starving victims to death in the defended space?", - "Were they stolen from the site of a massive horrific disaster?", - "Does a spirit trafficker maintain the wards on the space?" - ], - "modsHarder": [ - "A dead whisper leads them, countering defensive charms and magic, sniffing out breath even if heat is concealed, dueling any supernatural defense.", - "The guarded area is powerfully warded and underground where temperature is easy to maintain." - ], - "modsEasier": [ - "The guarded area is vulnerable to weather conditions. It is sharp in the cold, but almost dormant in the heat.", - "A relatively simple spirit bane charm can keep them at bay if created in tune with the site." - ] - }, - { - "name": "Cursed Treasure", - "category": "Ghostly Guards", - "desc": "Treasures are infused with a haunting spirit. Anyone touching the treasure will be cursed, dreaming the crimes of the ghost and attracting anger and distaste from strangers. Friends become uncomfortable and suspicious around the cursed scoundrel.", - "questions": [ - "Were those sacrificed to make the haunts loyal, serving past death, or punished by undeath?", - "Is the treasure marked as cursed?" - ], - "modsHarder": [ - "The haunting is so deadly that it drives most victims to suicide within a week. Resourceful scoundrels with access to spirit traffickers have days to somehow break the hold. Others are doomed.", - "Electroplasmic poisoning begins, and within a week the scoundrel will become a vampire." - ], - "modsEasier": [ - "All the bad luck waiting in the wings (unfinished clocks from foes, poorly protected stashes, jilted lovers, false identities) go wrong in quick succession. Then the curse is over.", - "A competent occultist can break the curse as a down time project with a four segment clock." - ] - }, - { - "name": "Darkrooms", - "category": "Ghostly Guards", - "desc": "The defended area is dark. The ragged ghosts hate light. They shriek horribly as they attack light sources with slapping leathery hands, like bat wings. Intruders may glimpse their luminous fangs.", - "questions": [ - "Were these ghosts placed here intentionally, or are they the result of some horror that left a print in the Ghost Field?", - "Is this defense maintained, or passive?" - ], - "modsHarder": [ - "Another guardian lurks in the dark and takes advantage of the distraction to steal from intruders, perhaps killing them too.", - "The ghosts are aggressive, pushing intruders. Surroundings include long drops, spikes, mazes, or other hazards difficult to navigate in darkness." - ], - "modsEasier": [ - "While annoying, they do no real damage, and forewarned scoundrels may prepare unbreakable light sources or supernatural dark vision.", - "There is enough ambient light to see." - ] - }, - { - "name": "Dynastic Hive", - "category": "Ghostly Guards", - "desc": "Ancestors have been ritually infused into the defense site, it is a dynastic holding. The spirits are old, and insane, but strategically placed to act out their madness in the most damaging way.", - "questions": [ - "Did the family get special permission to harbor ghosts?", - "Do they have connections to limmers?", - "Are spirits tied to leviathan bone shards?", - "Are they moving pictures, or conversationalists with clues?" - ], - "modsHarder": [ - "The ghosts are legally protected, like landmarks or artwork. Damaging them is a serious crime.", - "Some of the more powerful or canny ghosts are still somewhat sane collaborators with the site owners." - ], - "modsEasier": [ - "They are out of control, and few dare to enter the site now (or it is abandoned.)", - "They will not harm family members (but may not react well to hostages.)" - ] - }, - { - "name": "Hunting Ghostpack", - "category": "Ghostly Guards", - "desc": "A group of weaponized ghosts haunts the defended area. They are capable of scouting to find intruders, descending on them with lethal force.", - "questions": [ - "Do they appear as a pack with a mounted hunter, spectral hounds, and a ghostly horn call?", - "Or an armored warband?", - "Shapeless lethal electroplasmic stalkers?", - "Are the wounds they inflict bloody cuts, or hard frostbite?", - "Is their area surrounded with runes that let them see into the material world?" - ], - "modsHarder": [ - "The ghost leader feels all life force in its hunting ground, knowing its location.", - "The hunt can only rise when certain conditions like anniversaries, moon phases, etc. are met. However, they have a treasure that can only be taken from them when they manifest." - ], - "modsEasier": [ - "The attack is purely psychological, killing with supernatural fear. The effect can be resisted.", - "They are summoned and directed by a command artifact like a hunting horn or special weapon. If someone else tunes to the weapon, control (and its obligations) may shift to a new bearer." - ] - }, - { - "name": "Possession Gate", - "category": "Ghostly Guards", - "desc": "If an intruder breaks a clearly marked seal, the intruder is attacked by a possessing spirit that takes on the traits of the most strong-willed, brutal person the seal-breaker ever killed. The possessing spirit and the seal-breaker struggle for control. This counts as a harm.", - "questions": [ - "Is the possessing spirit a ghost, or a shape-shifting construct made by an expert that makes a shape out of something in the target?", - "If an innocent triggers the trap, what form does the spirit take then?" - ], - "modsHarder": [ - "The only way to be free is to die, undergo electroplasmic surgery while dead, and be revived. Otherwise the curse is protected by the victim’s life force.", - "The haunting spirit tries to take possession once a day or so, sending the host into a blackout and acting out vicious crimes against allies, loved ones, and bluecoats." - ], - "modsEasier": [ - "The condition can be reduced with a resist roll, but still is likely a 6 segment clock to clear.", - "The curse haunt would rather have a host ally than kill its victim, and may bargain for shared control." - ] - }, - { - "name": "Spirit-Infused Art", - "category": "Ghostly Guards", - "desc": "Art works are haunted by spirits that are capable of spying. They observe their area, and may be able to murmur about what they see to a guardian.", - "questions": [ - "Was art repurposed to host spirits, or was it created for them and around them?", - "Is the art mosaics, portraits, statues, or some other form?", - "How sane and coherent are the spirits?", - "How loyal are they?", - "Do they have the power to attack intruders?" - ], - "modsHarder": [ - "One or more guardians has a signet ring tuned to the haunted art pieces, and can hear what they whisper as they spy.", - "The ghosts inhabiting the art can move from one piece to another, following intruders or retreating to report." - ], - "modsEasier": [ - "One spirit per art piece, and each spirit has its own unbalanced personality.", - "Unhinged art is violent, so it has to be shrouded or restrained when guardians go through the defended area." - ] - }, - { - "name": "Starving Fog", - "category": "Ghostly Guards", - "desc": "The guarded area is in a clinging cold fog. Fog draws energy from those breathing in it until it manifests shadows that increase target fear, which feeds it more. Eventually it can manifest a killing shape.", - "questions": [ - "What do intruders in the fog see when it reflects their fears?", - "Are there sound effects, smells, and sounds, or just fleeting glimpses and silhouettes?", - "Does it project hallucinations or trigger memories?" - ], - "modsHarder": [ - "The fog strengthens the Ghost Field, making ghosts within it more powerful.", - "The fog can move, summoned or controlled by other guardians to provide backup or help search." - ], - "modsEasier": [ - "The fog is generated by an artifact. If the artifact is neutralized so is the fog.", - "Those with the proper energy keyed amulet or other trinket are invisible to the fog." - ] - }, - { - "name": "Sweat Nectar", - "category": "Ghostly Guards", - "desc": "The defended area is kept hot. Sweat tastes like nectar to swarming ghosts, who dehydrate targets into mummies. The stolen life force and moisture flows to prepared corpses, so ghosts can ride them again.", - "questions": [ - "Were they created by dehydrating sacrifices to death in the defended space?", - "Were they gathered from outside the lightning walls to stand guard here?", - "Does a spirit trafficker maintain the wards on the space?" - ], - "modsHarder": [ - "Many prepared corpses are stashed in unexpected places, bursting into combat when rejuvenated.", - "Once they rise, the desiccated spirit-ridden corpses will chase intruders until they can’t." - ], - "modsEasier": [ - "Only a few corpses are left to revive.", - "The site is difficult to keep hot enough to extract the necessary sweat from intruders." - ] - }, - { - "name": "Dartus Weed", - "category": "Supernatural Plants", - "desc": "When something moves near a tangled bank of dartus weed, the vines flex, flicking barbed tips towards the source of motion within arm's reach. The darts are paralytic; a target will pass out for about an hour.", - "questions": [ - "Do they have a distinctive flower or smell?", - "What is the aftertaste of the poison's effect?" - ], - "modsHarder": [ - "Hounds with chemically toughened hides patrol the weed banks, brutally killing intruders.", - "Weed banks are cultivated strategically, flanking important doorways or draped over arborwalks, straggling along verges." - ], - "modsEasier": [ - "The weeds are young. Darts can be stopped with thick leather.", - "Weed banks are out of the way of defended valuables, but too close to very annoyed neighbors who may hold a grudge." - ] - }, - { - "name": "Dreamspore Shrooms", - "category": "Supernatural Plants", - "desc": "Placed on the ceiling, they drizzle sandy spores when they sense motion below. Victims hallucinate, heightening subconscious emotion (so they are very mellow, or super anxious, or filled with rage, etc.).", - "questions": [ - "Were these intended to be a site defense?", - "Did they instead serve a religious or recreational function?", - "Are there special techniques for harvesting them, perhaps selling them to alchemists?" - ], - "modsHarder": [ - "A more intense strain, these can knock out those who succumb, and give them vivid dreams for several hours.", - "They are placed near other guardians as well as hazards like a steep drop or running water." - ], - "modsEasier": [ - "Other guardians come here recreationally, their effectiveness reduced.", - "The spores are weak and easier to resist." - ] - }, - { - "name": "Floormesh", - "category": "Supernatural Plants", - "desc": "Flat vines grow together to make flooring. Connected below is the bulb, covered in venomous spikes. Anyone heavier than a child will fall through. Blood and rot feed the floormesh.", - "questions": [ - "Have site defenders put carpet over the flat vines to further hide the threat?", - "What colors, textures, and patterns does this version have?", - "How dangerous is the venom?" - ], - "modsHarder": [ - "The building’s architecture assumes use of floormesh, the carpets are woven to look like floormesh so the guardians don’t have to cover the actual pits.", - "The mesh itself has venomous thorns in it, so stepping on it or falling through poisons the target." - ], - "modsEasier": [ - "The pit is not cleaned, the area near it stinks heavily of corpserot. The mesh sags visibly.", - "Floormesh is mostly hung like tapestries, living decorations, rather than forming pit traps." - ] - }, - { - "name": "Ghost Crystal Topiary", - "category": "Supernatural Plants", - "desc": "Ghost crystals are worked into the roots of fancifully trimmed bushes. Ghosts may be able to inhabit the bushes and make them move. This gardening curiosity can be weaponized.", - "questions": [ - "Is this a currently maintained garden, or one that is overgrown and abandoned?", - "Who provides the necessary skilled care to create or maintain the topiary?", - "Is there a theme to the sculptures?" - ], - "modsHarder": [ - "Certain of the most powerful bushes can uproot and move around like living green golems driven by electroplasmic energy.", - "The bushes hardly move, but the powerful energies of the crystals make ghosts much more coherent and powerful in the garden." - ], - "modsEasier": [ - "Left unprotected at one point, the garden was raided by thieves after the ghost crystals. Few crystals are left in the shaggy bushes.", - "Incompetent handling has drained most of the power from the crystals." - ] - }, - { - "name": "Keenshrooms", - "category": "Supernatural Plants", - "desc": "These fist-sized mushrooms let out a keening wail when light comes within about thirty feet.", - "questions": [ - "What do they look like?", - "Is their smell distinctive?", - "Are they good eating?" - ], - "modsHarder": [ - "They are strategically placed to surprise intruders; inside doors, on ceilings, in alcoves, behind statues.", - "Masses of keenshrooms have been allowed to coat walls or fill rooms, and their keen is strong enough to deafen or kill." - ], - "modsEasier": [ - "The keenshrooms were placed too close to trafficked paths inside or outside the defended site. Constant false alarms dull vigilance.", - "Too far from site defenders, their keens are seldom investigated." - ] - }, - { - "name": "Murder Tree", - "category": "Supernatural Plants", - "desc": "The willow tree grew around bones wired to it, spirit crystals studded in its bark, and leviathan blood at its roots. lt is dimly self-aware. It senses and hates life, whipping and clubbing any who approach.", - "questions": [ - "How do guardians move around the tree?", - "Suggestions include knowing passwords, having enchanted amulets, or attuning to its blind spots. How many guard the site?", - "Who had the expertise to cultivate this living weapon, how long ago?" - ], - "modsHarder": [ - "The chorus of semi-aware spirits that fuel the tree are enslaved by one domineering will. The tree is as coherent as a person.", - "Multiple murder trees are connected by roots and share knowledge with each other (and any other site guardians.)" - ], - "modsEasier": [ - "No one can communicate with the murder tree, or control it, so it is isolated from other defenses.", - "The tree sleeps most of the time, and it is difficult to rouse it to fighting fury." - ] - }, - { - "name": "Snatchweed", - "category": "Supernatural Plants", - "desc": "It grows in fresh water, lengthening its long winding tendrils almost to the surface. When touched, it snatches and pulls, coiling down to the bottom and holding for a few minutes before relaxing back up.", - "questions": [ - "Is their growth boosted supernaturally, and can you see faces reflecting from the Ghost Field beneath their fronds?", - "Are the locals aware of the threat, willing to talk about it?" - ], - "modsHarder": [ - "Snatchweed is cultivated in areas where intruders must enter the water to get past other obstacles.", - "The bottom of the water has two foot spikes, victims are pulled down onto them." - ], - "modsEasier": [ - "A sign warns of the hazard, as required by law.", - "This particular breed of snatchweed recoils from salt; put enough on the surface and tendrils recoil." - ] - }, - { - "name": "Thirstclimber", - "category": "Supernatural Plants", - "desc": "The vines are red, and when flesh touches them (even through leather) the vine draws blood to the surface in alarming quantities. The vines are slippery, and almost impossible to grasp with wet hands.", - "questions": [ - "Are the vines clearly visible to those who can see in the Ghost Field?", - "Do the vines cause damage that must be healed, or does the blood only flow when they are nearby?" - ], - "modsHarder": [ - "The site has guard creatures that track by scent and are drawn to attack things that smell bloody.", - "Thirstclimber is cultivated at the mid-point of a really difficult climb." - ], - "modsEasier": [ - "Annoyed locals keep it trimmed back on outside walls periodically in spite of the guardian’s threats.", - "Guards know the ingredients to make a special paste, and the symbol to paint on skin with it, to protect from the plant’s effects. A former guard might share the secret." - ] - }, - { - "name": "Thirsty Thorns", - "category": "Supernatural Plants", - "desc": "Strategically placed thornbushes grow on walls and serve as decorations. They live on blood. They only flower if something dies on them; the bigger the life, the more impressive the bloom.", - "questions": [ - "Do they feed on radiant light?", - "Are they along the interior walls, lining the walks, and climbing walls outside?", - "Are there thorns inside, along windows or protecting secret doors?" - ], - "modsHarder": [ - "The thorns are poisonous, inflicting some condition on those who fail to resist.", - "Possibilities include sleep, death by choking, blinding blood from the eyes, or paralysis.", - "The thorns are considered a gardening achievement, with some fame and support as local culture." - ], - "modsEasier": [ - "A custom amulet tuned to their life energy turns the thorns away, allowing its bearer to push through them unharmed. A site defender may have one, or one could be made.", - "They are old and brittle, dying by inches and neglected." - ] - }, - { - "name": "Vine Curtains", - "category": "Supernatural Plants", - "desc": "Curtains of vines connect back to a radiant root that has grown semi­aware, fed on rogue spirits. If touched, the vines slither and writhe to entangle, hoist, and bundle the target for a guardian to find.", - "questions": [ - "What do the vines look like?", - "Do they use their scent to attract or repel?", - "Where is the root relative to the curtain?" - ], - "modsHarder": [ - "Many curtains and roots of different sizes (some quite big) connect back to a central bulb somewhere in the defense site.", - "The vines also have a contact poison that makes their target go limp for 10-60 minutes." - ], - "modsEasier": [ - "The site owner does not have legal permission to have the vine curtains, so they are only used inside.", - "The vine curtains grow wild and the lazy site owner does not keep them trimmed back, so other guards must stay away from them." - ] - }, - { - "name": "Caul Piercers", - "category": "Traps", - "desc": "Piercers are designed to puncture whoever touches them. They pierce the energy caul of the character's life force in the Ghost Field. This causes a harm condition that worsens or costs stress every down time cycle until the caul can be mended (6 segment project.) Interpret as needed.", - "questions": [ - "Do the piercers resemble knives, nails, or thorn-like carvings?", - "What sadistic expert crafted these dire traps?", - "If pried out of their settings, how long do they retain potency?" - ], - "modsHarder": [ - "Those affected will trail life energy like a wounded fish bleeding in the water; demons and ghosts alike will investigate the scent.", - "They are worked into important doorknobs, strategic ledges, and concealed flooring." - ], - "modsEasier": [ - "They all look alike and are similarly placed, relying on surprise to be effective.", - "They are only on the main treasure." - ] - }, - { - "name": "Collapsing Ceilings", - "category": "Traps", - "desc": "If triggered, this trap drops a mass of stone. That seals off the threatened area, and crushes anyone tampering with its defenses.", - "questions": [ - "Who put valuables behind a trap that could seal them away for good?", - "How old is this defense, and who takes care of it?", - "What warning signs tip off an intruder that continuing is dangerous?" - ], - "modsHarder": [ - "Hidden mechanisms can raise the block back up to the ceiling, so the trap can be reused (or defeated remotely.)", - "More than one block falls; the first one cuts off escape, then death seems inevitable." - ], - "modsEasier": [ - "The stone dropped long ago. Site guardians or intruders have developed ways to climb over it or get past it. Other blocks may still be untriggered, but some of them are no longer dangerous.", - "More like a mine collapse, difficult to control and possible to tunnel past." - ] - }, - { - "name": "Combination or Trick", - "category": "Traps", - "desc": "Various portals and defenses of the site are protected by combination locks or riddles to solve. Lockpicks will not work against them, though finesse may solve them eventually.", - "questions": [ - "Are there a series of combination locks expressing a religious or eccentric worldview?", - "Are there picture arranging puzzles, or unusual keys to go in sculpture locks?", - "Are the locks mechanical or supernatural?" - ], - "modsHarder": [ - "Powerful runic work or enslaved ghosts make the obstacle difficult to smash or trick--the right combination or object must be used to bypass it.", - "Clues and needed items are spread across a large estate, or multiple estates." - ], - "modsEasier": [ - "The combination or solution to the puzzle is in a scholarly work, and can be found or bought ahead of time.", - "The solutions are painfully obvious to someone with the right upbringing and background." - ] - }, - { - "name": "Contact Needles", - "category": "Traps", - "desc": "Small needles are worked into contact surfaces and poisoned, to deter intruders. They may be on doorknobs, seat backs or cushions, doorframes, stair treads, ledges, beds—anywhere, really.", - "questions": [ - "Are the needles easily visible if you look for them, or camouflaged?", - "Are they retractable if you know what you're doing?", - "What kind of poison is on them?", - "Will the victim sleep, freeze, die, or hallucinate?" - ], - "modsHarder": [ - "The needles are only corporeal to those who touch them without wearing a certain amulet. Important site guardians are immune to the needles.", - "Anything important or at an unguarded entry point is going to be festooned with needles." - ], - "modsEasier": [ - "They are not well maintained. Many have snapped off, and few retain much poison.", - "They are only on the most important objects or the most useful trap objects (like a chair for guests.)" - ] - }, - { - "name": "Excellent Locks", - "category": "Traps", - "desc": "Beyond simple security, these locks are works of art. They are higher potency than they would normally be. Also, they are equipped with poison needle traps, or pick breakers, or redundancies.", - "questions": [ - "Who put in these superior locks, and for what reason?", - "Are the locks designed to defeat entry, or actively punish intruders?", - "Do the specialized keys have a distinctive look, like two flanges?", - "Is there a master key?" - ], - "modsHarder": [ - "Everything is locked, and all the locks are good. Somebody had a real lock problem.", - "The locks involve supernatural components, like hidden keyholes or paralyzing energy." - ], - "modsEasier": [ - "The locks are in poor repair, of variable quality after indifferent maintenance and many intrusion attempts.", - "Very fancy locks, but they are padlocks, and bolt cutters can circumvent the problem." - ] - }, - { - "name": "Murder Holes", - "category": "Traps", - "desc": "Intruders go past one door, into a hallway or small room, and the door closes behind them. Arrow slits open in the walls, and slots in the ceiling allow boiling oil to be poured down. Intruders are trapped and vulnerable. These are often in doors through defenses.", - "questions": [ - "Was the original site builder often under siege?", - "Are the murder holes obvious or concealed?" - ], - "modsHarder": [ - "Murder holes are automated with self- slamming doors and pre-boiling oil, so a few defenders can trap and/or kill many intruders.", - "The whole layout is built with many murder hole areas to deter invasion." - ], - "modsEasier": [ - "The walls are wooden, and determined captives can break through to face their attackers.", - "This area does not have enough staff to monitor intruders and make best use of murder holes." - ] - }, - { - "name": "Pit Traps", - "category": "Traps", - "desc": "The defended site has pit traps in strategic places. They are between 10 and 40 feet deep.", - "questions": [ - "Do they have slick sides?", - "Are there spikes at the bottom?", - "Are the covers mechanized, or flimsy boards and carpets, grass turf, or leaves over canvas?", - "Are the sides stone, earth, or clay?" - ], - "modsHarder": [ - "Fist sized tunnels connect pits. Predatory creatures (crabs, snakes, spiders, rats) scurry to devour victims.", - "Once someone falls into the pit the covers close again, and will not open until unlocked." - ], - "modsEasier": [ - "The pits drop into a lower area, mostly abandoned except for predators. It is possible to find a way out.", - "The pits are mostly open and filled with junk." - ] - }, - { - "name": "Retractable Spikes", - "category": "Traps", - "desc": "Spring-loaded spears or racks of spears launch at intruders. They can come from the side, behind, ahead, below, or above.", - "questions": [ - "Are the defenses standardized to protect guardians, or random to confuse intruders?", - "Are they in an area that site defenders use, or in an isolated off-limits area?", - "How long have they been in use, and how often are they maintained?" - ], - "modsHarder": [ - "After doing their killing work, they retract, and the launch points are not obvious.", - "The spears are slathered with some toxin, further affecting the victim." - ], - "modsEasier": [ - "The mechanisms are not well maintained. Sometimes they don’t work, and when they do, there is a screech and they are a bit slow.", - "The spears are designed to pin an intruder in place, to be interrogated and punished, rather than to kill outright." - ] - }, - { - "name": "Secret Doors & Spyholes", - "category": "Traps", - "desc": "Guardians are well trained in the use of numerous secret doors and hidden passages with spyholes. They can attack from unexpected directions, escape without a trace, and watch intruders unobserved.", - "questions": [ - "Was this site built by a spy, or a cult, or a paranoid aristocrat?", - "Are there consistent tells, a code built into the decor and architecture, or must all secrets be known individually?" - ], - "modsHarder": [ - "Ongoing rearrangement and construction means old information from plans or people ages out fast.", - "Supernatural locks and keys mean that triggers and spyholes and seams may not be visible in the material world at all." - ], - "modsEasier": [ - "Frequent use has made secret doors easier to spot. Poor baffling of lights may reveal spyholes in use.", - "Current residents are only aware of some secrets; intruders may use back ways to elude security." - ] - }, - { - "name": "Shock Grips", - "category": "Traps", - "desc": "One or more contact points are connected to energy so they will badly shock anyone who touches them. These could be doorknobs, chest lids, floor plates, ladders, and so on.", - "questions": [ - "Are they powered by batteries or enslaved ghosts?", - "Does the site have legal permission to use them?", - "How loud is the shock?", - "How do site guardians avoid getting shocked?" - ], - "modsHarder": [ - "The shock grips are numerous and concealed, connected to their energy source through the Ghost Field.", - "The shock is designed to stop the heart and kill the victim (possibly setting hair on fire.)" - ], - "modsEasier": [ - "The shock grips are connected to control boxes and energy sources by cables.", - "Shock grips are marked by a rune, and shiny, and also give out a palpable hum of energy. They are easy to detect." - ] - }, - { - "name": "Brutal Sadists", - "category": "Twisted Guards", - "desc": "Only brutal sadists are hired on as guards. They have permission to play with captured intruders.", - "questions": [ - "Is the owner of the protected property aware of this cultural rule, or are guards hired by an employee?", - "Do they share cultural roots (slaughterhouse workers, leviathan hunters, soldiers, city guards, etc)?", - "How do the neighbors feel about their occasional scandals?" - ], - "modsHarder": [ - "Several of them are skilled in both torture and interrogation; they extract secrets from intruders. A side business in blackmail helps them avoid legal trouble.", - "They are hardened veterans, exceptionally tough and dangerous. They aim to incapacitate." - ], - "modsEasier": [ - "Their ugly tactics and poorly chosen victims have earned them (and their employer) enemies in lots of unexpected places.", - "They really, really like to drink." - ] - }, - { - "name": "Close-Knit Guard Network", - "category": "Twisted Guards", - "desc": "Guards are only hired by referral. Failure results in punishment for both the guard and the sponsor. Their loyalty is tested many ways before and after they are hired.", - "questions": [ - "Do they favor bastards of the employer?", - "Are they connected to one military unit?", - "Are they refugees from another place?", - "Do they come from a single neighborhood?", - "Does punishment extend to their families?" - ], - "modsHarder": [ - "They are connected to a larger sponsoring organization that would seek vengeance if they are attacked or insulted, and also offer them favors.", - "They speak in code and have passwords that include safewords and warnings." - ], - "modsEasier": [ - "Nepotism has pulled in some really incompetent guards.", - "Endless drama from working with family and friends." - ] - }, - { - "name": "Compulsive Detail Focus", - "category": "Twisted Guards", - "desc": "Only a certain type is hired; a type that checks every lock and every dark corner. Schedules are strict, thoroughness is a guarantee, and they seem unable to cut corners or skip steps. Everything is by the book.", - "questions": [ - "Are they altered to be like this, or just screened for a mindset?", - "What are the detailed parts of the defended site that need this kind of attention?", - "How does their gear reflect this fussy attention to detail?" - ], - "modsHarder": [ - "There are other elements of the defended site that require their focus, like a pattern of stepping over tiles to avoid triggering traps or complex combination locks or dozens of cells with dangerous prisoners.", - "They are trusted with specialty items like firearms or charms because they are responsible with them." - ], - "modsEasier": [ - "Everyone knows that they fall apart if things deviate from the pattern, like distractions or chaos.", - "The locals pick on them when they are off duty, teasing them for their compulsions. They have enemies, and could use friends." - ] - }, - { - "name": "Convict Public Service", - "category": "Twisted Guards", - "desc": "Due to prison overcrowding, some criminals are sentenced to indentured service to a noble to work off their debt to society. This site's guardian uses criminals as guards, under the stern eye of professionals.", - "questions": [ - "Are casualties high due to danger from intruders or other site defenses?", - "Is the patron benevolent and trying to rehabilitate criminals, or using them as disposable fodder?", - "How do the convicts like this place?" - ], - "modsHarder": [ - "Serving here is a known post among criminals, both a resume builder and networking site.", - "Angering these guards could bring consequences from unexpected directions in the criminal underworld.", - "Hand picked as the hardest and deadliest, these criminal guards are canny and tough." - ], - "modsEasier": [ - "Convicts are eager to assist anyone with enough Coin or pull to secure their pardon and freedom.", - "The convicts are bullied and sullen, as much a hindrance to defenders as a defense themselves." - ] - }, - { - "name": "Demonic Mutations", - "category": "Twisted Guards", - "desc": "About a quarter of the guards have been mutated by contact with demonic essence. They are strong, and their senses are sharp.", - "questions": [ - "Do they share one demon patron?", - "Did they become guards to gain this power?", - "Are they worshippers or mercenaries?", - "Did they volunteer or are they victims?", - "What element is their demonic affinity?" - ], - "modsHarder": [ - "They share a supernatural connection and can sense when other demonic guards are in trouble.", - "They are highly resistant to normal damage. They may be vulnerable to supernatural attacks or a specific allergy (silver, garlic, salt, etc.) Or, they may be resistant to supernatural attacks instead." - ], - "modsEasier": [ - "They become physically impressive, but their minds are lost to incoherent lusts and fury.", - "The rest of the staff resent or fear the demonic guards. Loyalty and morale are low among mundane employees." - ] - }, - { - "name": "Enchanted Prosthetics", - "category": "Twisted Guards", - "desc": "Guards are all amputees with at least one prosthetic. Each prosthetic tunes to its owner. The prosthetics can stun on contact.", - "questions": [ - "Are the false limbs the work of one genius?", - "Are they part of a collection?", - "Were they made for this use?", - "Is a ghost bound to each?", - "Are they scientific, with batteries?", - "Are they powered by the bearer's life force?" - ], - "modsHarder": [ - "All guards have some adept training and spirit bane charms, alert against supernatural forces.", - "Veteran guards have learned to tune to their prosthetics to get an additional effect, like life detection or firing energy blasts." - ], - "modsEasier": [ - "Only one use between recharges.", - "The guards are mostly old or broken, relying on reputation and supernatural energy to be effective." - ] - }, - { - "name": "Feral Pen", - "category": "Twisted Guards", - "desc": "Some areas of the defended site have free-range maniacs. Destitute and wretched beggars are treated as guard dogs, expected to attack intruders and draw attention to anything unusual.", - "questions": [ - "Does the guarded site pretend to be charitable, or a madhouse, or a prison?", - "What philosophy leads to treating people this way?", - "How do the city authorities feel about the site?", - "Religious authorities?", - "Does the site feed into the Ghost Field in an unusual way?" - ], - "modsHarder": [ - "Most of the feral guards are killers, possibly haunted, and extremely dangerous.", - "This pet project is as much art and religion as defense, and has support from a variety of decadent aristocrats in positions of power." - ], - "modsEasier": [ - "The rest of the site guards hate the feral pen and ignore it as best they can.", - "It is as much prison hospice as guard dog kennel. Its victims are weak, sick, and starving." - ] - }, - { - "name": "Fighting School", - "category": "Twisted Guards", - "desc": "An onsite training school focuses on the lifestyle and skill of a school of fighting. Site defenders are part of a group identity with specialty training.", - "questions": [ - "Is the school's focus on dueling, a martial art, commando training, or something else?", - "What is their crest, uniform, motto, and lore?", - "What sort of training space do they have?" - ], - "modsHarder": [ - "The school itself is an impressive fortress or defense.", - "The school has an impressive alumni network that visits occasionally and would avenge wrongs to the honor of the school." - ], - "modsEasier": [ - "This is an off-site shrine or expansion, where they send troublemakers and those they can’t eject for political or financial reasons.", - "Leadership is riddled with rivalries and power struggles. Outsiders know some details." - ] - }, - { - "name": "Performance Enhancers", - "category": "Twisted Guards", - "desc": "Guards have ready access to drugs. Some of the drugs enhance performance.", - "questions": [ - "Do the drugs give them a burst of combat effectiveness?", - "Are the drugs recreational, making them popular with a customer base that pays well and owes favors?", - "Who provides them with drugs?" - ], - "modsHarder": [ - "As dealers, the guards are difficult to bribe or intimidate, as they have money and prestige.", - "Guards can medicate flexibly, with concoctions to enhance perception (even to see the supernatural,) gain combat prowess, or heal." - ], - "modsEasier": [ - "Their peddling of illegal drugs has made enemies among bluecoats and inspectors.", - "The guards are junkies. Their employer uses addiction to control them, keeping them near the edge. They are often distractible or unconscious." - ] - }, - { - "name": "Zealots", - "category": "Twisted Guards", - "desc": "Guards share a religion that binds them together and makes them resistant to intimidation or corruption.", - "questions": [ - "Do they worship one of the Forgotten Gods? The Church of the Ecstasy of the Flesh? Weeping Lady?", - "Have they sworn oaths?", - "What does religion require them to hate, or to love?" - ], - "modsHarder": [ - "The defended site includes a shrine or temple. Violating the site angers offended worshippers.", - "Serving as a site guardian is part of a religious duty. Unexpectedly seasoned warriors or important people may serve as lowly guards for a time." - ], - "modsEasier": [ - "Mandatory prayer times, unclean objects or places left uninspected, and restricted areas may create holes in security.", - "Enemies of their religion may offer help to embarrass, discredit, or injure the zealots." - ] - }, - { - "name": "Ghostport Lock", - "category": "Weird Tech", - "desc": "Keys are tuned to locks that cannot be picked by normal means, or bypassed without whisper expertise. Their access point is in the Ghost Field until the key is present.", - "questions": [ - "Are these locks modem scientific triumphs, or old arcane defenses?", - "Does he key look like a key, or does it look like a missing decoration, or a gem?", - "Is the key physical, or energy, like living blood of the right family?" - ], - "modsHarder": [ - "The locks are hidden and trapped. Messing with the lock could hollow the intruder (tearing the spirit out of the body) or other unpleasantness.", - "The precise location of the lock must be known, and it is not near what it is locking." - ], - "modsEasier": [ - "The ghostport lock has been a fad several times in Duskwall. Each time, there was some mass production, and a key to a similar lock might work with a little help.", - "The owner may have stiffed a whisper locksmith on the fee, or otherwise offended the expert, who is knowledgeable and disgruntled." - ] - }, - { - "name": "Lightning Walls", - "category": "Weird Tech", - "desc": "Runic energy twisting technology can make pylons that project a curtain of energy between them. The glowing walls are transparent, but crippling to touch and lethal to pass through. They stop projectiles.", - "questions": [ - "Does the site have the technology legally, or is it stolen?", - "Maybe cobbled together from leftovers by a mad alchemist?", - "Is it on all the time (expensive to fuel) or only if the alarm is raised?", - "Where are the fuel cells kept?" - ], - "modsHarder": [ - "The equipment is properly installed, its vulnerable parts behind the energy curtain, directly guarding what needs protecting.", - "The lightning walls attract loose spirits, intruders may also have to contend with confused ghosts." - ], - "modsEasier": [ - "The walls guard a few key access points, but there are multiple ways around.", - "The walls are installed poorly, so their machinery is vulnerable from the outside while it is on. If no other guards are present, they can be wrecked." - ] - }, - { - "name": "Panopticon", - "category": "Weird Tech", - "desc": "Special crystal lenses transmit their sight through the Ghost Field to mirrors in a central location. From one place, a guardian can monitor views all over the defended site.", - "questions": [ - "Is this new industrial alchemical technology, or an ancient enchanted construction?", - "Does the current owner know how to get the most functionality out of it?", - "Who maintains the system?" - ], - "modsHarder": [ - "The lenses are hidden in mirror frames, statues, and other decor. They are difficult to spot.", - "The lenses can see into the Ghost Field as well, observing ghosts or occult work, and life force." - ], - "modsEasier": [ - "The guardians watching the mirrors are somewhat lax.", - "Over time, many lenses have not been replaced or repaired. Views are limited." - ] - }, - { - "name": "Shadow Lanterns", - "category": "Weird Tech", - "desc": "Guards are equipped with lanterns that detect shadows of recent life force as well as shedding light.", - "questions": [ - "Are the lanterns traditional lantern shape, or a glowing ball, or something else?", - "Does an expert keep the guardians supplied, or is their supply jealously guarded?", - "Does it cost the guards something to activate the lanterns?", - "Will the lanterns work if taken off-site?" - ], - "modsHarder": [ - "Guards are trained to tune into the life force energy to also hear conversations of the life shadows. Guards can tune into the life force energy to know the owner’s current location, if in the defended area.", - "Untended lanterns can be set to transmit detection of a life force to a nearby guardian." - ], - "modsEasier": [ - "The lanterns can be rendered blind by properly tuning a spiritbane charm while near one.", - "Every sunrise wipes all traces of past life forces, and they only work at night." - ] - }, - { - "name": "Shadow Rooms", - "category": "Weird Tech", - "desc": "The Ghost Field sometimes remembers rooms or entire neighborhoods that no longer exist in the material world. Some defended sites hide treasures in these spaces that can only be accessed if you knowhow.", - "questions": [ - "How are colors different in these shadow rooms?", - "Is there a smell or sound that lingers?", - "How does it feel to step out of the material world?", - "What natural laws work differently here, like fire not flickering?" - ], - "modsHarder": [ - "The access point to the shadow rooms is an enchanted lock, its location is known and guarded.", - "The shadow rooms are only connected to the material world a few times a year, or less." - ], - "modsEasier": [ - "Transitioning from the material world to the shadow rooms involves certain proscribed movements; cross the courtyard three times, then back down stairs with eyes closed (for example.) Too many people know the formula.", - "The current site owners do not know these rooms exist." - ] - } - ], - "people": [ - { - "name": "Arturo Montastic", - "concept": "Addicted Gambler, New Money", - "description": "He is impossibly lucky. He wins enough at games of chance to pay for his addictions, and to treat the consequences (transfusions, transplants, cutting-edge treatments.) His relationships are intense but brief. He often loses everything, but then wins it all back and more. He has owned epic treasures many times.", - "hooks": "Risk-averse collectors cannot bear his cavalier attitude on winning and losing priceless art. He does not truly appreciate his treasures, and should not be trusted with them. Losers can take their losses hard." - }, - { - "name": "Baron Kelyr Strathmill", - "concept": "Hardened Industrialist, Old Money", - "description": "His family has controlled the docks for many generations. They quietly destroy competition, and get lucrative city contracts to re-develop blighted areas if the money slows down. Graceful, educated, and pleasant, he is ruthless as barbed steel under a cultured veneer. He is proud of his estate's gardens.", - "hooks": "Competition doesn't like being crippled. He often hires outsiders for the dirtiest work, and his victims often hire outsiders to get revenge." - }, - { - "name": "Baroness Thena Hellyers", - "concept": "Hazy Art Patron, Old Money", - "description": "Thena is one of the least emotionally scarred survivors in her weird family. She is a leading light in the art world. She is patron to many artists and her criticism and evaluation drives a significant element of Duskwall's art scene. Whispers have noted she has an unusual connection to the Ghost Field.", - "hooks": "Sometimes she hires outsiders to sort out one of her artists' problems. She has a private gallery that she updates with her current trending tastes—those in the art market need to know what's in it." - }, - { - "name": "Calvin Dannos", - "concept": "Eerie Assassin, Underworld", - "description": "The Inkvein was a cabal of seven anonymous assassins, named for their maps of the canals. If one of them was identified as a member, the other six were sworn to kill the outed assassin. Dannos was outed a decade ago, and he killed the other members and their undying founder. Now he IS Inkvein.", - "hooks": "Easily bored, he prefers interesting challenges to high paying or easy kills. Of course, many bereaved or power hungry individuals want him dead." - }, - { - "name": "Commissioner Naria Haig", - "concept": "Political Matchmaker, City Law", - "description": "She exudes a plump grandmotherly innocence, but she is one of the sharpest politicians in Duskwall. She supervises over the merging of unexpected allies and the schism of monolithic interests. She cares about one thing—the good of Duskwall as a whole. She is Chair of the Ethics Oversight Committee.", - "hooks": "Always playing a bigger game, she uses outsiders to manage errands whose purpose they cannot see. Those she outmaneuvers tend to want to get back at her with violence." - }, - { - "name": "Doc Sarnin", - "concept": "Lecherous Leech, Underworld", - "description": "Doc can keep life in you if you're alive (or recently dead) when you get to him. His extreme methods are often horrifying. Still, his concoctions can crush ghosts, re-attach limbs, and more. The Crows, a tough crew, protect him. They give him victims for his \"needs,\" which are emotional, physical, and scientific.", - "hooks": "Sometimes the Crows hire outsiders to go after rare components or victims for Doc. He has many, many enemies who want to either steal him and force him to serve them, or punish him." - }, - { - "name": "Doctor Ixit Crichelle", - "concept": "Elegant Spook, Old Money", - "description": "Crechelle calls himself an Oneiric Master. He interprets dreams for a fee. He enters them, alters them, and moves through veils to understand truths and secrets the dreamer may not grasp. If he touches a target, or one of their possessions, he may enter their dreams. He appears feeble, but his mind is deadly.", - "hooks": "Aristocratic patrons invite him to parties. He needs a person's possession to see into their dreams; he pays for objects to visit some people's dreams. Victims will pay to free themselves ." - }, - { - "name": "Dr. Hansel Kryvanntic", - "concept": "Brilliant Scientist, Foreign", - "description": "He is Severosi, bow-legged and wild-haired. His work on electroplasmic poisoning and mutation in animals and humans is ground-breaking. Fleeing persecution because of his ethically questionable methods back in Severos, he found a more open-minded scientific community in Duskwall.", - "hooks": "His research has applications in art, medicine, and war. Those with sufficient resources to further his studies want to control him. He has hurt a lot of people, over time, so he has many enemies." - }, - { - "name": "Dr. Yerial Crabbskidditch", - "concept": "Sleazy Lawyer, New Money", - "description": "He firmly believes those who are wealthy should not be pestered with the law. No matter what you do, if you have means you can arrange for an alternate story that favors you. Deaths, frauds, robberies, and other crimes can be reduced to a few fines. He throws money at problems until they disappear.", - "hooks": "He routinely hires outsiders to destroy evidence, intimidate witnesses, compel confessions, and so forth. He has countless enemies, both those seeking justice and former clients who ran out of money." - }, - { - "name": "Duvrel the Snake", - "concept": "Cunning Smuggler, Foreign", - "description": "She is Tycherosian, with the eyes and horns of a goat. Snake tattoos coil around her arms. Exotic drugs from the Dagger Isles flow through her distribution network in Duskwall. She hires outsiders to remove stubborn people while she has an alibi, or to retrieve drugs misplaced at incriminating locations.", - "hooks": "Inspectors have orders from the Spirit Wardens to take her alive, to study her uncanny ability to flex with the Ghost Field for supernatural stealth." - }, - { - "name": "Dylayzia Finchester", - "concept": "Fashionable Whisper, New Money", - "description": "Her exotic looks, tattoos, and bright green eyes draw attention. She popularized thigh-high buckled leather boots and spirit bane chokers. Her opinions echo in drawing rooms across the city. People enjoy her feud with the Church of the Ecstasy of the Flesh.", - "hooks": "Wealthy figures in the fashion world pay top win for sneak peeks at her clothing designs. Her opinions inflame many enemies­-especially the Church. She hires outsiders to get rare components for her rituals." - }, - { - "name": "Emeline Coleburn", - "concept": "Weary Regulator, City Law", - "description": "She inspects buildings and reports to the Duskwall Council whether they are sound, and whether they serve the purpose listed on the owner's taxation form. She is front-line in the tug-of-war between criminals, politicians, and nobles. She no longer cares about the greater good. Now it's about kickbacks.", - "hooks": "She takes the path of least resistance in her evaluations, so people pay to make their preference easier and other roads harder. She hires outsiders for off-the-books communication with pushy customers." - }, - { - "name": "Eric the White", - "concept": "Vigilante Rebel, Foreign", - "description": "The War of Skovlan Unity is over, but this slender maniac with a brushy beard can't let it go. He plans to destroy the government and turn Duskwall into a Skovlan colony to punish them for the destructive war. He wants to discredit and disrupt the government at every turn.", - "hooks": "He targets gavernment officials as high up as he can reach, hoping to cause enough trouble to make the government vulnerable to change. He has gathered zealots, and he uses outsiders for disposable work." - }, - { - "name": "Gi Aniru Ga of Sultha", - "concept": "Sacrificing Cultist, Supernatural", - "description": "She worships the Gaping Maw, the Runnel of Life, the Cosmic Thirst. She builds a cult, teaching them to hunt and conduct rituals. Then she moves on. Witnesses uneasily describe her supernatural abilities, including shapeshifting, flight, killing people by attacking their shadows, and so on.", - "hooks": "Bereaved relatives, rival cultists, and law enforcers all want her stopped. She hires outsiders to threaten, misdirect, or kill law enforcement. Determined inspectors crush cults she trained, need help to catch her." - }, - { - "name": "Holtz Clermont", - "concept": "Reformed Clerk, City Law", - "description": "He used to be a forger. After he served stint in prison, some respectable family friends got him a position as City Clerk for the whole district. He manages correspondence for permit requests and official notices. When corrupt people inside and outside the system need to adjust evidence, they come to him.", - "hooks": "Jilted clients can be threatening, leading him to take steps to adjust their attitude by hiring outside help. He's smarter than he looks, and knows how to back people off. He also might know too much." - }, - { - "name": "Inspector Lorette Salkha", - "concept": "Crusading Inspector, City Law", - "description": "She needs allies in her hopeless quest to clean up the city. Corruption is everywhere, crime runs rampant, and the bluecoats serve the powerful (on both sides of the law.) Some tragedy in her past propels her into a suicidal effort to restore \"rule of law.” Her peers muse it is a shame she will die young.", - "hooks": "She could be helpful if she focuses on the right bad guys—your enemies. She can't be bought, so maybe someone needs her killed (or otherwise neutralized.)" - }, - { - "name": "Jemma Dropkick", - "concept": "Feminist Vigilante, Underworld", - "description": "She is a legend in the Seven Shallows neighborhood. She attacks men who abuse women. She survives because she has friends—a few bluecoats, a gang of thugs, and a grateful public. She carefully plans attacks to hurt abusers. Lf her victims abuse again, they are mutilated, packed like luggage, and shipped out of town.", - "hooks": "Many powerful men would pay for revenge on Jemma. Sometimes she hires outsiders to help out." - }, - { - "name": "Kheldaria Whinnich", - "concept": "Implacable Developer, New Money", - "description": "She has a vision for developing the Crow's Foot district. It will be divided between businesses, estates, and parks. To realize her vision, she has been selectively buying real estate all around the city, bartering for land in Crow's Foot, and using whatever persuasion is needed to convince owners to sell to her.", - "hooks": "She has an estate where she stores induce­ments of all sorts, a variety of treasure designed to persuade owners to sell in exchange for what they want most. They say you could find almost anything there." - }, - { - "name": "Lady Ashlyn Tyrconnel", - "concept": "Decadent Duelist", - "description": "For centuries, aristocrats of Duskwall have learned the Tyrconnel Method of swordplay and self defense. The Tyrconnel family produces countless public servants and warriors—but also a share of scoundrels. Ashlyn's trademark suite of moves is to duel, win, bed someone, and drink to unconsciousness.", - "hooks": "You're hired to join the spy game in the Tyrconnel family. Or, someone is targeting her. Either way. Watch your back. Outsiders in the games of nobles are uniformly expendable." - }, - { - "name": "Lady Candra Dunvil", - "concept": "Corrupt Fixer, Old Money", - "description": "Her family built Ironhook Prison. Her wealth is built on generations of shady deals with incarcerated aristocrats and business owners. She sees the world as a rigged game and has contempt for anyone who finds corruption shocking or fixable. She is vain, practical, and ruthless.", - "hooks": "She hires outsiders to carry out promises she made to inmates. Her family has casually wrecked reputations and lives over centuries, and that leaves a trail of vengeance seekers." - }, - { - "name": "Lady Polonia Brogan", - "concept": "Desirable Dowry, Old Money", - "description": "She's ugly, smelly, stupid, and rude--and also the key to the Brogan fortune. Her lucky spouse will have access to massive wealth and infrastructure among professional builders and shipwrights of Duskwall. Only her aunt, CECILIA DURWITHE, looks out for her best interests with sharp disapproval.", - "hooks": "Brogan hires outsiders to punish those who slight her, or to investigate potential partners. She collects fake wills rogues have planted during assassination attempts, trying to leave her fortune to usurpers ." - }, - { - "name": "Lord Branon Kinclaith", - "concept": "Romantic Horseman, Old Money", - "description": "Branon looks like a hero from a legendary story. He manages the family's stables, the finest horses in Duskwall (where horses are a rare luxury.) His tumultuous trysts with both men and women are common knowledge. Business suffers from his impulsive romantic gestures, but benefits from his charm.", - "hooks": "Branon sometimes refuses to sell horses, or breed them, if he dislikes the buyer. Some buyers want access to horseflesh anyway. If his horses are attacked, he hires outsiders to get revenge." - }, - { - "name": "Lord Bulward Skinnester", - "concept": "Greedy Banker, New Money", - "description": "This portly curmudgeon does a brisk trade in real estate titles, both lending and foreclosing. He is acutely aware of the value of properties and how neighbors affect value. He takes particular glee in foreclosing on aristocracy and setting up the newly rich in ancient estates.", - "hooks": "Sometimes he hires outsiders to solve problems that his hired bluecoats and bribed councilmen cannot manage. He collects sculpture by Duskwall artists. He has ruined the lives of many formerly influential people." - }, - { - "name": "Lord Orlan Booker", - "concept": "Insulated Mastermind, Old Money", - "description": "Ennui is a danger to the wealthy. Booker fills his days by gathering intelligence and planning heists, then selling the plans to ambitious gangs that lack his patience, experience, resources, and insight. Twice a month he goes to the opera, and meets those who have arranged to purchase a score.", - "hooks": "Sometimes things go wrong, and it is natural to blame the planner and want revenge. Sometimes a target wants to punish those who acted against them, even if the act was planning." - }, - { - "name": "Master Slen Dallicore", - "concept": "Protective Guilder, New Money", - "description": "Master Dallicore is the Guildmaster for the Docker's Guild. They move all cargo on and off ships, boats, and gondolas. Their role is protected by law, as are the fees they charge. The guild uses low-level violence to discourage non-guild laborers and smugglers. However, some challenges require proper scoundrels.", - "hooks": "Dallicore is not above hiring outsiders to punish powerful patrons of smugglers or illegal dock workers. His position of power also gives him access to rare antiquities, both purchased and acquired." - }, - { - "name": "Minister Fourteen", - "concept": "Grungy Fixer, Underworld", - "description": "The blind Skovlander holds court on the docks, moving from one basement to another. He favors baggy shirts, stained vests, shiny jewelry, and fraying lace. He often acts through his massive bodyguard Severen and his weedy messenger Torok.", - "hooks": "He is connected in the Skovlander refugee community, and in Skovlan. For a price (either wealth or an errand) he will share information about Skovlanders. He often hires outsiders to handle sensitive tasks." - }, - { - "name": "Moonslider the Third", - "concept": "Eccentric Artist, New Money", - "description": "She feels moon phases. Her family put her in an asylum for a decade. Later, she won her freedom and inherited the family bootmaking fortune. She makes art. She tries to communicate her moon feelings. She uses oil paint, glass blowing, sculpture, song, and dance in multimedia recitals and art pieces.", - "hooks": "Her family bought nice things before they all died and she inherited them; she ignores most of it. She needs expensive equipment and supplies for her bizarre art shows." - }, - { - "name": "Officer Milos Penderyn", - "concept": "Corrupt Bailiff, City Law", - "description": "Milos has access to trial evidence, and to prisoners awaiting trial. He can't get people out, but he can silence them. He has a network of corrupt peers, judges, bluecoats, and others so he can trade favors to accomplish the impossible. Huge and greasy, he is built like a bull and he enjoys the scent of fear.", - "hooks": "Controlling Milos could mean protecting or killing someone in bluecoat custody. An endless stream of people want revenge on him, and a more select group would like to control or use him." - }, - { - "name": "Officer Veleris Walund", - "concept": "Heroic Bluecoat", - "description": "There are actually songs about him. He is very popular. Veleris is a skilled orator (though he retreats into modesty) and a canny judge of character and situations. (He insists he just tries to do the right thing.) His opinion is influential in his district. He is trusted to guard valuables. His moustaches are his pride and joy.", - "hooks": "He has no family, and he seems to be an idealist. Some try to persuade him, others try to threaten him. Threats don't seem to work. He has been known to quietly hire outsiders to get justice." - }, - { - "name": "Pebbler", - "concept": "Demon Spy, Supernatural", - "description": "This earth demon looks like a fat man built around a boulder gut, leaking sand from joints. It is able to see and hear through sand, earth, and stone within a range of miles. It works with non-cultists voluntarily, selling information in exchange for raids into the rare areas protected from its prying.", - "hooks": "Dozens of powerful people want Pebbler banished or robbed. However, the demon is a peerless information exchange, valuable even if it is difficult to control." - }, - { - "name": "Saithernon", - "concept": "Exotic Fence, Underworld", - "description": "He drapes his python, DELGRAAZ, around his neck. He wears a turban with a jewel on it. He is willing to buy almost anything, no matter how strange. He also knows what you need, sometimes before you know you need it. His bazaar unfurls below the Kennington market in an abandoned gondola dock.", - "hooks": "He pays people to get things for him, then sells them at tremendously inflated prices to those desperate to have them. This can cause hurt feelings among the desperate." - }, - { - "name": "Serlevica the Brander", - "concept": "Spy Whisper, Underworld", - "description": "Gaunt and frizzed, this foul-smelling Whisper has a secret ritual that allows her to control and see through rats she brands. She sells her services as a spy or site guardian. She has survived by retreating into slums and sewers when threatened, and striking from the shadows until it is safe to emerge again.", - "hooks": "She is closely tied to the information marketplace, buying and selling secrets. She often hires outsiders to deal with her enemies through theft or violence, and she is in turn a frequent target." - }, - { - "name": "Sir Mournseller", - "concept": "Anarchist Ghost, Supernatural", - "description": "This ghost possesses old men from the Draymach Asylum, breaking them out to find and hire scoundrels for obscure tasks with no independent purpose. Examples include killing an insignificant chandler or stealing a specific stone from a wall in a noble's estate. Payment is the location of hidden treasure.", - "hooks": "A decade ago, an astute inspector began picking out the connection between errands, seeing a very long and very dangerous game to unseat the city's rulers emerging." - }, - { - "name": "Sir Olen Llanwold", - "concept": "Piratical Industrialist, New Money", - "description": "He is thin and nervous, easy to underestimate. He specializes in stripping foes of their assets and taking over their operations. His father was a butler, and he grew up hating aristocrats. He understands power structures and corrupts retainers. His top agent, Ellsfielder, is a beautiful and ruthless woman.", - "hooks": "Many ruined aristocrats (and their allies) hate Danwold passionately. He does not hesitate to use his assets, legal and otherwise, to defend himself and cripple his foes. He hires outsiders through proxies." - }, - { - "name": "Sir Tocker Farros", - "concept": "Pragmatic Councilman, City Law", - "description": "Sometimes the law works, and sometimes it doesn't. Regardless, the Council must rule and there must be order. Sir Farros ensures the districts he serves do not get too far out of hand before lawless elements are curbed. One way or another. He looks like an affable grandfather, but he has a dark past.", - "hooks": "Sir Farros uses inspectors or scoundrels, politicians or housemaids—anyone who will get the job done. He has an endless list of enemies who feel he wronged them, and want revenge. His agents are disposable." - }, - { - "name": "SLOPSPATTER", - "concept": "Canal Hull, Supernatural", - "description": "This hull learned to consume spirits and bolster its strength with theirs. It cannibalizes machinery and rummages in wrecked boats for parts. It has gondola prow shoulder guards and helm, and strange banded armor made of water-logged wood over intricate mechanical parts. It fears destruction.", - "hooks": "It assassinates targets, with its body or by possessing machines near them. It hunts whispers, leeches, and scholars, stealing their knowledge and killing them. Their allies want revenge." - }, - { - "name": "Syla DuTorrivestria", - "concept": "Famous Connoisseur, Foreign", - "description": "This mysterious Iruvian hides behind a veil. For years, she has been the final word on Duskwall delicacies. She specializes in evaluating high-end cuisine (including spore wines and cooking with leviathan blood.) She stays in the public eye with racy politics and a string of scandalous romances.", - "hooks": "She must keep any real competitors for her fame weakened and embarrassed, and she has countless enemies. Everyone \"knows\" she is an Iruvian spy." - }, - { - "name": "The Honorable Telia Cray", - "concept": "Stern Prosecutor, City Law", - "description": "She's old, she's sour, and she has a reputation for jailing Duskwall's criminals. As thin and hard as an iron poker, she relentlessly pursues her cases, bending the law with a passionate hatred of scoundrels. She runs a special unit of Inspectors dedicated to investigating her cases, run by INSPECTOR ULEK.", - "hooks": "If she is taking a case personally ( as she often does) she may hire outsiders to acquire or create evidence. She also conduds a brutal war of counter-intelligence against rogues looking to free their associates." - }, - { - "name": "The Wooden Judge", - "concept": "Haunted Puppet, Underworld", - "description": "This knee-high ventriloquist dummy looks like a caricature of a grim Judge. It is supernaturally animated. The puppet appears unexpectedly, interrupting a scoundrel's routine by offering jobs in a squeaky voice. He pays by revealing the location of hidden caches of ancient coin.", - "hooks": "Many angry victims want to know who pulls the strings of the Wooden Judge. The puppet often hires fresh talent for dubious work." - }, - { - "name": "Theodore Lysander", - "concept": "Bard Pimp, Underworld", - "description": "Elegant and charismatic, this well-dressed man runs the Tenpenny Court Network. He manages prostitutes and their customers, his personal connections and charm monetized. He is also a skilled composer and performer, often seen at the Worldsedge Theater in Crow's Foot.", - "hooks": "He is a skilled networker. He takes the safety of his friends seriously, and is protedive of his employees, to the point of using blackmail to force powerful patrons to back off." - } - ], - "motivations": [ - { - "name": "Accidental Death", - "category": "Secret Dirty Work", - "description": "Not only must the target die, the target must not know how death came. If by some misfortune the ghost of the victim is interrogated, it must not have any special knowledge. There is a ritual and an amulet for the assassins to ensure secrecy. No one living or dead can know who did this deed.", - "narrative": "By the time the crew knows the job, there is a better than even chance their knowledge is too much risk and their employer plans to kill them. They might want some leverage." - }, - { - "name": "Bayer's Train Heist", - "category": "Misplaced Fortune", - "description": "Bayer was a rail jack fired for being drunk. Over years, he built a crew with one mission in mind--robbing a train. When lruvia completed negotiations with Akoros to buy an unprecedented mass of leviathan blood to pour into industrialization, Bayer's crew hit the train carrying the payment, sabotaging a bridge. Rescuers found the train in the canyon, but no gold--an impossible feat. Bayer's crew vanished.", - "narrative": "An Iruvian ingot stamped with the year \"802\" will attract attention." - }, - { - "name": "Bellweather Architectural Plans", - "category": "Historical Curiosity", - "description": "The Duskwall Archives have the sanitized blueprints of the Bellweather Crematorium on file. The original plans were drawn by a Spirit Warden driven mad by an internal rift, so he haunted himself. He drew peculiar plans with occult underpinnings, and those original drawings were interpreted by architects.", - "narrative": "Are there coded secrets in the original plans that reveal a repellant secret or ominous threat? Or are the plans the scribbling of a madman? Either way, some people would pay top coin to get a good look." - }, - { - "name": "Book of Walls", - "category": "Historical Curiosity", - "description": "Long ago, a nameless rogue cultivated a mass of bloodworms in a wall. He wrote a book with their blood. The words were nonsense, but strangely affecting; if the reader tuned in to them, and held the book, the reader could walk through a wall. Spirit Wardens ruined the book with holy smoke.", - "narrative": "A legend, or is there truth to it? Walking through walls is a neat trick, and the book may hold the key to learning it. It is sought by a wide variety of the curious—scholars, collectors, and scoundrels." - }, - { - "name": "Censer Mace of Udoch", - "category": "Religious Object", - "description": "The head of this ornately carved mace opens on hinges so incense can be put inside to wisp as the mace swings. The haft has a recipe carved into it, instructions to make special incense out of bone and rare sap and unguents. If that incense bums in the mace, it can destroy ghosts or demons with a single hit.", - "narrative": "This was a founding artifact of the Church of the Ecstasy of the Flesh. If it were returned, they would gain a fresh following from critics who feel the church cannot protect against supernatural threats." - }, - { - "name": "Charter of Crows", - "category": "Historical Curiosity", - "description": "This gauntlet is made out of crow beaks. Each beak is carved with arcane symbols. Consulting Whispers officially report it does not have any power in the Ghost Field. It was made by the Spirit Warden who first tamed the deathseeker crows; he claimed it was a treaty that guaranteed their service.", - "narrative": "Spirit Wardens lost this gauntlet decades ago, but they want it back. The idea it is a treaty with the deathseeker crows is probably nonsense. They can't take that chance." - }, - { - "name": "Combination Harpsichord", - "category": "Weird Scholarship", - "description": "TARNALI was a Whisper composer who built a special harpsichord. When two tones are played, often a third \"ghost'' tone can be heard. By attaching the tuning pegs to crystals and runes, Tarnali built a harpsichord that could interact with the Ghost Field through calculated progressions of played tones.", - "narrative": "This effort is intensely interesting to those who want to find doors hidden in the Ghost Field, draw or repel what lurks Behind the Mirror, or develop more portable tonal energies for non-Whispers ." - }, - { - "name": "Dyvik's Chaser Mask", - "category": "Weird Artifact", - "description": "This silvery face mask has the word “Elekthiaron” etched along its inner edge. When the word is spoken, the personality of the one touching the mask is pulled into it. The personality that was in the mask goes in the body. If the one in the body doesn’t touch the mask once a week, madness threatens.", - "narrative": "Has someone been using the mask to pose as someone else? How long has that been going on? Is there someone in the mask that needs rescuing? Was the mask used to cheat biological death?" - }, - { - "name": "Evardian's Song Folios", - "category": "Weird Scholarship", - "description": "Four leather-bound volumes, full of musical notation with heavily annotated margins. The \"music\" is supposed to be transcribed and translated leviathan song. Legend suggests if the music is played correctly, it can drive humans insane with visions of the demon-haunted deep.", - "narrative": "Aristocrats will collect anything. Scholars go to great lengths for research material. Cultists may find religious significance in the folios. (Owning the folios is against the law.)" - }, - { - "name": "Falheim’s Prod", - "category": "Historical Curiosity", - "description": "This ragged pole with a spear and a silver-cable loop was the first prototype of what became the lightning hook. It doesn't work very well, but it was the first historically known charged object that could consistently interact with the Ghost Field.", - "narrative": "Apparently this bit of history is an important prestige piece in the turbulent intrigues of a number of underground cults led by Whispers. The city government would also like to display it in a museum." - }, - { - "name": "Fang of Ibiria", - "category": "Religious Object", - "description": "This brutal stiletto has a green stone in the pommel, and a runic symbol on the blade. The blade transforms electroplasm into a mutagen. The longer the blade is in a victim, the more monstrous the victim becomes. A cut gives nightmares, minutes give mutations, hours or days create a real monster.", - "narrative": "Cultists want this blade so they can make or become monsters." - }, - { - "name": "Goblet of Eletrachtian", - "category": "Weird Artifact", - "description": "The silver and gold cup is big enough to hold with two hands, crusted with obsidian stones. The owner puts a drop of a demon's blood in the goblet with certain other liquids, and conducts a ritual. For days afterwards (maybe longer) the owner can see anything the demon uses remote vision to view, just by watching the surface's illusory reflections.", - "narrative": "There are many legends about the creation of the goblet, and the fate of the Whisper who first energized it. Rumor suggests the Duskwall Council entrusted the goblet to a certain family for safekeeping." - }, - { - "name": "Hollow Shroud", - "category": "Religious Object", - "description": "The Church of the Ecstasy of the Flesh clergy wrapped the funeral shroud around a heretic, then conducted a ritual that severed the heretic's connection to the body, cutting the spirit loose as a ghost. The shroud transferred the spirit of a faithful but sickly member into the heretic's body. New life!", - "narrative": "The Shroud was stolen almost twenty years ago, and rumors suggest it has been used in debased rituals to summon demons or enflesh echoes of the Forgotten Gods." - }, - { - "name": "Idol of the Sleeping Lion", - "category": "Religious Object", - "description": "The hefty iron statue depicts a devilfish-headed humanoid, cloaked in wings. Its presence influences human dreams, so they drift through the ink-black sea but can perceive their surroundings. Sacrificing to the statue gives a cultist a cosmic infection, involving psychic ability and mutations.", - "narrative": "The statue has been retrieved by officers of the law several times, and destroyed several times more. Again and again, it emerges in the heart of fresh tragedy, baleful and singular." - }, - { - "name": "Ink Fleece", - "category": "Family Heirloom", - "description": "Long ago, Captain Manarill claimed he could prove that leviathans had fur, or fleece. He brought back a swatch of curling fur as big as a bedspread. He claimed to have harvested it from a leviathan's skin. The mantle served as a symbol of the Manarill family's heritage of exploration and danger. But it was stolen.", - "narrative": "Does it do more than represent heritage? What dreams might one have while wrapped in it? Might a wealthy Whisper pay more for it than the family that owned it? Who took it?" - }, - { - "name": "Kasavaraya Tea Set", - "category": "Family Heirloom", - "description": "When the Immortal Emperor visited Akoros four centuries ago, he used this tea set with the patriarch of the Kasavaraya family. They are still one of the most decorated and entrenched military families in Duskwall. Their tea set is a symbol of Duskwall's prominence. However, a saucer and a cup are missing.", - "narrative": "This stuff is priceless, literally, so negotiating a price for its return is tricky. If you could find the missing pieces, or forge them adequately, they would be great hostages to ajfed the family's behavior." - }, - { - "name": "Kidnap The Heir", - "category": "Secret Dirty Work", - "description": "People are keys that fit into estate locks. They can be turned to open the way to lots of money. You might be taking a child to ransom back to the guardian, or you might be getting someone out of the way so a more distant heir can inherit. This is about controlling where the money goes.", - "narrative": "How harsh does the employer want this to be? Kid gloves treatment, or is the plan to kill the heir when it is all over? How much input will the employer accept from the hired help? Is the plan already in place?" - }, - { - "name": "Krogs Broken Heart", - "category": "Misplaced Fortune", - "description": "Krog was a savage from the Dagger Isles, pressed into service on a hunting ship. He eventually owned a small fleet. He was old when he fell in love with a young woman who robbed him. Heartbroken, he took the rest of his treasure aboard his last hunting ship, Heartsong, and scuttled her in the harbor.", - "narrative": "Whispers like to brag they found a way under the waves to find the wealth. Gracmaas the Pirate claimed to have recovered it all to his hidden lair—before he was killed." - }, - { - "name": "Limptwitch's Stash", - "category": "Misplaced Fortune", - "description": "Limptwitch was a Whisper who interrogated ghosts to find the location of hidden treasure. He was famous for his Grotto, the place where he stored all his salvaged wealth. Many factions tried to get his treasure, but he never gave up the secret. Then he was jailed and hanged. The Grotto was never found.", - "narrative": "Did a cellmate in prison hear muttered hints as to its location? Maybe a Whisper has clues based on where he left his mark in the sewers. Has someone finally found a real lead?" - }, - { - "name": "Mark of the Void", - "category": "Religious Object", - "description": "It is an eerie black disk of leviathan bone, about the size of a dinner plate but five times as thick. The bone is carved with a strange circular pattern with rays cutting through it. The primitive artwork was polished, and silver inlaid in the pattern, by a decadent nobleman.", - "narrative": "Impressionable people admit the disk whispers to them, they hear the Back of the Mirror when it the disk is near. Many cults see this disk as a conduit to clearer communication with their supernatural patrons." - }, - { - "name": "Naladicha’s Cartography", - "category": "Historical Curiosity", - "description": "The famous cartographer Naladicha died, and his ghost was woven into a spirit anchor connected to a pen on a wire. The drooping pen scribbled nonstop, dipping to indicate a page turn. Two books were filled with scribbles before the pen stilled. These lines and shapes may be maps of the Ghost Field.", - "narrative": "One consulting Whisper reported that when she attuned to the books using an expensive and difficult ritual, the maps became luminous and four dimensional, revealing lost secrets in Duskwall." - }, - { - "name": "Norscye's Lament", - "category": "Famous Jewel", - "description": "This ruby has been set in a series of weapons for the last three centuries. One estimate was that the gem had participated in upwards of a thousand deaths. Legend suggests that the ruby can hold a single ghost, surviving the destruction of the body, bound to the gem until it chooses another guest.", - "narrative": "While the gemstone is priceless because of its unnatural clarity, it is also possible that an important ghost might be inside, and might choose to speak to a Whisper or a blood relative." - }, - { - "name": "Orb Of Sellivas", - "category": "Weird Artifact", - "description": "This fist-sized golden orb tunes to one bearer at a time, though it may respond to others. If commanded, it can release a steady light that radiates in the material world and the Ghost Field, revealing what is hidden. The radiation can also draw or repel ghosts and demons.", - "narrative": "The Sellivas order of witches wrote their research journals in an ink that can only be read by the light of the Orb. If someone had the Orb and the \"blank\" book, they could crack ancient secrets." - }, - { - "name": "Plant Evidence", - "category": "Secret Dirty Work", - "description": "Someone needs to be found guilty of doing something. For that to work out, you need evidence, put in the wrong place at the wrong time. To manage that, you need proper scoundrels.", - "narrative": "Do you know what the target will be accused of doing? Are you to lead the authorities to the evidence? Must someone be seduced before a hidden witness? Are the scoundrels making evidence, or using what they're given? What if they could do better? Must the evidence fool a court, or a powerful individual?" - }, - { - "name": "Plasmic Blade Flail", - "category": "Weird Artifact", - "description": "This weapon can slay ghosts and demons. It appears to be a gladius stitched with runes. Once the bearer attunes to the weapon, it can disconnect into vertebrate-like wedges connected by a steely central cable. The blade-whip is flexible and simmering with energy. It can reform into a straight blade at will.", - "narrative": "Only five of these flails ever existed. One is carried by the Spirit Warden assigned to the Immortal Emperor's defense. The rest are the stuff of legends." - }, - { - "name": "Remote Writer", - "category": "Weird Artifact", - "description": "This little book has a peculiar occult symbol on the cover. If an object is placed between the covers for a full 24 hours, then the book will transcribe any conversation happening in earshot of the object until reset. When the book reaches the end, the writing starts over on the first page, clearing pages as it goes.", - "narrative": "The book provides remote reading, eavesdropping of a sort. A target’s favorite pen or lucky coin can become the broadcaster, and determined spies can copy the magic book writing so they don't lose it." - }, - { - "name": "Rylaria’s Shield", - "category": "Family Heirloom", - "description": "Rylaria Graefwold was a soldier who gained title and wealth. She wrote her life's story on the back of the shield she used to save a general. Later generations added to the family story. The shield represents the family's honor. It was lost at sea when their first leviathan hunting ship was wrecked. Or was it?", - "narrative": "Now the family is wealthy, and this artifact would be important to them. Does it have a secret in code?" - }, - { - "name": "Skovlan Scrip", - "category": "Misplaced Fortune", - "description": "A dense lockbox filled with paper money issued by the Akorosian government to pay soldiers quelling the Skovlander Insurrection. The scrip can be exchanged for coins or services in Duskwall. Scrip is basically untraceable.", - "narrative": "Some of the military supply that got lost during the war. Does the stashs location implicate a corrupt official or other thief?" - }, - { - "name": "Sonurian Ghost Key", - "category": "Family Heirloom", - "description": "The Sonuria family had mansions in the area that is now the Seven Shallows slum. They created a vault for the protected dead, and for their mundane treasures. The only way in is for a family member to present the Sonurian Ghost Key before the hidden location of the vault in the Ghost Field. The key has been lost for decades.", - "narrative": "That key could be hidden anywhere. If it were found, either a family member could be recruited to open the door, or the key could be sold to the family. What does the key look like? What is inside the vault?" - }, - { - "name": "Soultrap Carnelian", - "category": "Famous Jewel", - "description": "This semi-precious stone was carved by the Whisper Ichralia. She suffocated people with hot wax and bound their fresh ghosts in wax seals on scrolls or letters with the Soultrap. When the seal was broken, the insane ghost attacked the opener and anyone nearby.", - "narrative": "The Spirit Wardens destroyed this object decades ago. Didn't they? Maybe someone else made another one, or maybe the original survived." - }, - { - "name": "Steal Blackmail", - "category": "Secret Dirty Work", - "description": "Secrets must be protected. If they come out, people can get hurt, ruined, killed, and so on. You are hired to adjust the circle of people who can prove something. Will it be bigger? Or smaller?", - "narrative": "Do you know what information you're after, or is that secret from you? If you have a chance, will you peek at it? Are you targeting a blackmailer to remove their hold, or getting evidence to give a blackmailer? Is the evidence to be destroyed? Do you plan to do as you are told?" - }, - { - "name": "Terrorize", - "category": "Secret Dirty Work", - "description": "People can be stubborn, to the point where only fear can unseat their decision. Maybe they feel independent and need to reminded that they need protection. Maybe they feel safe and need to be reminded they are not untouchable.", - "narrative": "Are you supposed to be someone in particular, like a random street thug or rival’s employee or bluecoat? How far can the terror go? Do you need to trash a home, or maybe converse with a loved one?" - }, - { - "name": "The Emerald Well", - "category": "Famous Jewel", - "description": "This depthless gem is a chilly pinhole between the material world and the Ghost Field. It provides energy to Whispers and attracts ghosts. The Emerald Well was protected by the Church of the Ecstasy of the Flesh, but a thief stole it decades ago. It is a hotspot for supernatural activity. Disaster flows in its wake.", - "narrative": "This is one of the few objects pursued by demons, Whispers, inspectors, clergy, and collectors. Scholars suggest demons may be able to turn it inside out, creating a fresh gate to incarnate more demons." - }, - { - "name": "The Hellwhisper Ring", - "category": "Weird Scholarship", - "description": "The ring is made of tiny bits of bone wired together. It must be worn for at least a day per year of the bearer's life before it begins to work. When placed on a source of information, the ring sifts it until the ring speaks the information's \"language.\" The bearer can see through riddles, read arcane texts, and break code with ease.", - "narrative": "Legend says 32 demons voluntarily gave some of their bone to be part of this ring, and it was released among humans to cause chaos through greater understanding." - }, - { - "name": "The Helsman Inheritance", - "category": "Misplaced Fortune", - "description": "The final will and testament of the clan's patriarch included a 24 hour locked-house condition. Survivors would split the inheritance. Darayl Helsman left the house at the end of the time with a small bag. Explorers found nothing but corpses in the house, the inheritance was gone. Darayl was found dead the next day, the bag gone. The city locked the house and guards against trespassers.", - "narrative": "Surely Darayl hid the inheritance in the Ghost Field. Find the ghost key and lock in the house, and get it all! Or, did someone else already get it?" - }, - { - "name": "The Key Lens", - "category": "Weird Scholarship", - "description": "The round frame has forty special lenses hinged on its rim. The lenses can layer over each other, flip out past the frame, rotate to take advantage of the angles inside the ground crystal, and take translucent colored filters. Their inventor, VLAS HALDAK, said he had found \"the key.\" He died of shock, the lens on his work table.", - "narrative": "Legends vary. It can see into the Ghost Field, it can see into people, it allows reading demonic texts, it can see the way into ghost neighborhoods, etc. Needs a Whisper to use properly." - }, - { - "name": "The Leviathan's Eye", - "category": "Famous Jewel", - "description": "This sapphire turns impossibly black if dipped in leviathan blood. If the still-bloody stone is pressed against a seer's forehead, the sensitive can see what the ocean sees, looking above the waves or probing the deeps. The gem used to be passed around between leviathan hunter captains, but has since been lost.", - "narrative": "One expert said using the Eye was as close as a human could get to a demon seeing through its elemental affinity, and that it began a slow change in the individual who was exposed to its power." - }, - { - "name": "The Tabissera Diary", - "category": "Weird Scholarship", - "description": "Warden Khalana Uress was the Head Confessor of the Spirit Wardens. She recorded secrets that were only for the use of the order using a book code, coordinates that pointed to words in a specific book. Without that book, the code cannot be cracked. Daring thieves took the book, then lost it.", - "narrative": "Fakes come on the market all the time. Only the Spirit Warden leadership know what the book looked like, and they aren't telling. What is the Diary about?" - }, - { - "name": "The Thousand Facet Diamond", - "category": "Famous Jewel", - "description": "This gem is the elegant centerpiece on the back of a peculiar clockwork gauntlet. A seer can use the gauntlet to travel into the Ghost Field while retaining physical presence, or possibly even other dimensions. Each use burns out some of the diamond facets. The device is reported to have a mind of its own.", - "narrative": "Ever since its theft from the Adelairde family, the gauntlet has surfaced only in rumors of especially daring heists or mind-shattering experiments." - }, - { - "name": "Whitecrown Signet Ring", - "category": "Family Heirloom", - "description": "The Whitecrown family schismed in the wake of the theft of the matriarch's signet ring over two centuries ago. They fell from being players in the intrigues around the throne to bickering over dwindling family holdings. Their wealth and influence is low, but not beyond recall.", - "narrative": "If the ring resurfaced, elements of the feud might put aside their differences and reunite. Besides, legends suggest a ghost matriarch is bound to the ring, and she knows their secrets." - } - ] -} \ No newline at end of file diff --git a/dist/lang/en.json b/dist/lang/en.json deleted file mode 100644 index 36b62366..00000000 --- a/dist/lang/en.json +++ /dev/null @@ -1,266 +0,0 @@ -{ - "TYPES": { - "Actor": { - "pc": "Scoundrel", - "npc": "NPC", - "crew": "Crew", - "faction": "Faction" - }, - "Item": { - "ability": "Scoundrel Ability", - "background": "Background", - "clock_keeper": "Tracker: Clock Keeper", - "cohort_expert": "Cohort (Expert)", - "cohort_gang": "Cohort (Gang)", - "crew_ability": "Crew Ability", - "crew_playbook": "Playbook (Crew)", - "crew_reputation": "Crew Reputation", - "crew_upgrade": "Crew Upgrade", - "design": "Design", - "feature": "Feature", - "gear": "Gear", - "gm_tracker": "Tracker: GM Overview", - "heritage": "Heritage", - "location": "Location", - "playbook": "Playbook (Scoundrel)", - "preferred_op": "Preferred Op", - "project": "Project", - "ritual": "Ritual", - "score": "Score", - "stricture": "Stricture", - "vice": "Vice" - } - }, - "BITD": { - "Heritage": "Heritage", - "Background": "Background", - "TitleDeleteItem": "Delete item", - "Vice": "Vice", - "Class": "Class", - "Stress": "Stress", - "Alias": "Alias", - "Designation": "Designation", - "Look": "Colors/Look", - "System": "System", - "Systems": "Systems", - "Planet": "Planet", - "Planets": "Planets", - "Faction": "Faction", - "Factions": "Active Factions", - "Notables": "Notable Locations", - "NotableNPCs": "Notable People", - "Scene": "Scene", - "Rule": "Rule", - "Stats": "Stats", - "Goal": "Goal", - "Assets": "Assets", - "Quirks": "Quirks", - "Situation": "Situation", - "Update": "Update", - "Warning": "Be aware, this will clear all Heat/Wanted", - "Status": "Status", - "Jobs": "Jobs", - "Allies": "Allies", - "Friends": "Friends", - "Associates": "Associates", - "Neutral": "Neutral", - "Adversaries": "Adversaries", - "Enemies": "Enemies", - "AtWar": "At War!", - "Trauma": "Trauma", - "TraumaCold": "Cold", - "TraumaHaunted": "Haunted", - "TraumaObsessed": "Obsessed", - "TraumaParanoid": "Paranoid", - "TraumaReckless": "Reckless", - "TraumaSoft": "Soft", - "TraumaUnstable": "Unstable", - "TraumaVicious": "Vicious", - "Harm": "Harm", - "Healing": "Healing", - "Armor": "Armor", - "NeedHelp": "Need Help", - "Light": "Light", - "Normal": "Normal", - "Heavy": "Heavy", - "Special": "Special", - "LessEffect": "Less Effect", - "Description": "Description", - "Loadout": "Loadout", - "Load": "Load", - "CrewType": "Crew Type", - "FactionType": "Faction Type", - "Price": "Price", - "Logic": "Logic", - "ExpClues": "Exp Clues", - "AbilityPrice": "Ability Price", - "AbilityClass": "Ability Class", - "Information": "Information", - "CohortType": "Cohort Type", - "GangType": "Gang Type", - "ExpertType": "Expert Type", - "ScaleAndQuality": "Scale and Quality", - "ChooseOneOrTwoEdges": "Choose one or two edges and an equal number of flaws", - "Edges": "Edges", - "Flaws": "Flaws", - "Scale": "Scale", - "Quality": "Quality", - "AddAdditionalTypeOfGangText": "You can add an additional type to a gang or expert by spending two crew upgrades.
When a cohort performs actions for which its types apply, it uses its full quality rating. Otherwise, its quality is zero. A given cohort can have up to two types. Some crew upgrades will add the “Elite” feature to a gang, which gives them +1d when they roll for a given Type.", - "ClassExpClue1": "Every time you roll a desperate action, mark xp in that action's attribute.", - "ClassExpClue2": "You expressed your beliefs, drives, heritage, or background.", - "ClassExpClue3": "You struggled with issues from your vice or traumas during the session.", - "ClassExpClueDescription": "At the end of each session, for each item below, mark 1 xp (in your playbook or an attribute) or 2 xp if that item occurred multiple times.", - "Turf": "Turf", - "Turfs": "Turfs", - "Lair": "Lair", - "Coin": "Coin", - "Coins": "Coins", - "Stash": "Stash", - "CrewReputation": "Crew Reputation", - "CrewUpgrades": "Crew Upgrades", - "Hold": "Hold", - "Weak": "Weak", - "Strong": "Strong", - "Tier": "Tier", - "Rep": "Rep", - "Vault": "Vault", - "Heat": "Heat", - "Wanted": "Wanted", - "Abilities": "Abilities", - "Upgrades": "Upgrades", - "Cohorts": "Cohorts", - "Notes": "Notes", - "AllItems": "All Items", - "CrewXP": "Crew XP", - "CrewExpClue1": "At the end of each session, for each item below, mark 1 xp (or instead mark 2xp if that item occurred multiple times).", - "SpecialAbilities": "Special Abilities", - - "Gang": "Gang", - "Expert": "Expert", - "GangTypeAdepts": "Adepts", - "GangTypeAdeptsDescription": "Scholars, tinkerers, occultists, and chemists.", - "GangTypeRooks": "Rooks", - "GangTypeRooksDescription": "Con artists, spies, and socialites.", - "GangTypeRovers": "Rovers", - "GangTypeRoversDescription": "Sailors, carriage drivers, and deathlands scavengers.", - "GangTypeSkulks": "Skulks", - "GangTypeSkulksDescription": "Scouts, infiltrators, and thieves.", - "GangTypeThugs": "Thugs", - "GangTypeThugsDescription": "Killers, brawlers, and roustabouts.", - - "EdgesFearsome": "Fearsome", - "EdgesFearsomeDescription": "The cohort is terrifying in aspect and reputation.", - "EdgesIndependent": "Independent", - "EdgesIndependentDescription": "The cohort can be trusted to make good decisions and act on their own initiative in the absence of direct orders.", - "EdgesLoyal": "Loyal", - "EdgesLoyalDescription": "The cohort can’t be bribed or turned against you.", - "EdgesTenacious": "Tenacious", - "EdgesTenaciousDescription": "The cohort won’t be deterred from a task.", - - "FlawsPrincipled": "Principled", - "FlawsPrincipledDescription": "The cohort has an ethic or values that it won’t betray.", - "FlawsSavage": "Savage", - "FlawsSavageDescription": "The cohort is excessively violent and cruel.", - "FlawsUnreliable": "Unreliable", - "FlawsUnreliableDescription": "The cohort isn’t always available, due to other obligations, stupefaction from their vices, etc.", - "FlawsWild": "Wild", - "FlawsWildDescription": "The cohort is drunken, debauched, and loud-mouthed.", - - "HarmNoHarm": "No Harm", - "HarmNoHarmDescription": "The cohort is healthy.", - "HarmWeakened": "Weakened", - "HarmWeakenedDescription": "The cohort has reduced effect.", - "HarmImpaired": "Impaired", - "HarmImpairedDescription": "The cohort operates with reduced quality (-1d).", - "HarmBroken": "Broken", - "HarmBrokenDescription": "The cohort can’t do anything until they recover.", - "HarmDead": "Dead", - "HarmDeadDescription": "The cohort is destroyed. You can spend coin equal to your Tier +2 to restore it, plus two downtime activities to recruit new gang members, or hire a new expert.", - - "Roll": "Roll", - "RollFailure": "Failure", - "RollCriticalSuccess": "Critical Success!", - "RollSuccess": "Success", - "RollPartialSuccess": "Partial Success", - "RollSomeDice": "Roll Some Dice!", - "RollTokenDescription": "If you want to pull the numbers from a character, select their Token first.", - "RollNumberOfDice": "Number of Dice", - "RollDoWithIncreasedEffect": "You do it with increased effect.", - "RollDo": "You do it.", - "RollPartialSuccessPositionControlled": "You hesitate. Withdraw and try a different approach, or else do it with a minor consequence: a minor complication occurs, you have reduced effect, you suffer lesser harm, you end up in a risky position.", - "RollPartialSuccessPositionRisky": "You do it, but there’s a consequence: you suffer harm, a complication occurs, you have reduced effect, you end up in a desperate position.", - "RollPartialSuccessPosition": "You do it, but there’s a consequence: you suffer severe harm, a serious complication occurs, you have reduced effect.", - "RollFailurePositionControlled": "You falter. Press on by seizing a risky opportunity, or withdraw and try a different approach.", - "RollFailurePositionRisky": "Things go badly. You suffer harm a complication occurs, you end up in a desperate position, you lose this opportunity.", - "RollFailurePositionDesperate": "It’s the worst outcome. You suffer severe harm, a serious complication occurs, you lose this opportunity for action.", - "RollResistance": "You reduce or avoid the effects of the consequence (GM chooses).
Suffer {stress} stress.", - "RollResistanceCritical": "You reduce or avoid the effects of the consequence (GM chooses).
Clear 1 stress.", - - "PositionControlled": "Controlled", - "PositionRisky": "Risky", - "PositionDesperate": "Desperate", - "EffectLimited": "Limited", - "EffectStandard": "Standard", - "EffectGreat": "Great", - - "SkillsInsight": "Insight", - "SkillsInsightShort": "Insight", - "SkillsHunt": "Hunt", - "SkillsStudy": "Study", - "SkillsSurvey": "Survey", - "SkillsTinker": "Tinker", - - "SkillsProwess": "Prowess", - "SkillsProwessShort": "Prowess", - "SkillsFinesse": "Finesse", - "SkillsProwl": "Prowl", - "SkillsSkirmish": "Skirmish", - "SkillsWreck": "Wreck", - - "SkillsResolve": "Resolve", - "SkillsResolveShort": "Resolve", - "SkillsAttune": "Attune", - "SkillsCommand": "Command", - "SkillsConsort": "Consort", - "SkillsSway": "Sway", - - "AddAbility": "Add Ability", - "AddItem": "Add Item", - "Uses": "No. of Uses", - "NumberAvailable": "Number Available", - "AdditionalInfo": "Additional Information", - - "Position": "Position", - "Effect": "Effect", - "Modifier": "Modifier", - - "Encumbered": "Encumbered", - "OverMax": "Over Max", - - "Drain": "Drain", - "Wear": "Wear", - "Gloom": "Gloom", - - "Add": "Add", - "Effects": "Effects", - "EffectCreate": "Create Effect", - "EffectToggle": "Toggle Effect", - "EffectEdit": "Edit Effect", - "EffectDelete": "Delete Effect", - "EffectWarning": "Managing Active Effects within an Owned Item is not currently supported by FoundryVTT and will be added in a subsequent update.", - - "Name": "Name", - "CampaignName": "Campaign Name", - - "DangerousFriends": "Dangerous Friends", - "EnemiesRivals": "Enemies and Rivals", - "DeadlyFriends": "Deadly Friends", - "Blank": "", - "CleverFriends": "Clever Friends", - "ShadyFriends": "Shady Friends", - "SlyFriends": "Sly Friends", - "ShrewdFriends": "Shrewd Friends", - "DarkServants": "Dark Servants", - "StrangeFriends": "Strange Friends" - } -} \ No newline at end of file diff --git a/dist/lib/greensock/CSSPlugin.js b/dist/lib/greensock/CSSPlugin.js deleted file mode 100644 index 679888fa..00000000 --- a/dist/lib/greensock/CSSPlugin.js +++ /dev/null @@ -1,1532 +0,0 @@ -/*! - * CSSPlugin 3.11.0 - * https://greensock.com - * - * Copyright 2008-2022, GreenSock. All rights reserved. - * Subject to the terms at https://greensock.com/standard-license or for - * Club GreenSock members, the agreement issued with that membership. - * @author: Jack Doyle, jack@greensock.com -*/ - -/* eslint-disable */ -import { gsap, _getProperty, _numExp, _numWithUnitExp, getUnit, _isString, _isUndefined, _renderComplexString, _relExp, _forEachName, _sortPropTweensByPriority, _colorStringFilter, _checkPlugin, _replaceRandom, _plugins, GSCache, PropTween, _config, _ticker, _round, _missingPlugin, _getSetter, _getCache, _colorExp, _parseRelative, _setDefaults, _removeLinkedListItem //for the commented-out className feature. -} from "./gsap-core.js"; - -var _win, - _doc, - _docElement, - _pluginInitted, - _tempDiv, - _tempDivStyler, - _recentSetterPlugin, - _reverting, - _windowExists = function _windowExists() { - return typeof window !== "undefined"; -}, - _transformProps = {}, - _RAD2DEG = 180 / Math.PI, - _DEG2RAD = Math.PI / 180, - _atan2 = Math.atan2, - _bigNum = 1e8, - _capsExp = /([A-Z])/g, - _horizontalExp = /(left|right|width|margin|padding|x)/i, - _complexExp = /[\s,\(]\S/, - _propertyAliases = { - autoAlpha: "opacity,visibility", - scale: "scaleX,scaleY", - alpha: "opacity" -}, - _renderCSSProp = function _renderCSSProp(ratio, data) { - return data.set(data.t, data.p, Math.round((data.s + data.c * ratio) * 10000) / 10000 + data.u, data); -}, - _renderPropWithEnd = function _renderPropWithEnd(ratio, data) { - return data.set(data.t, data.p, ratio === 1 ? data.e : Math.round((data.s + data.c * ratio) * 10000) / 10000 + data.u, data); -}, - _renderCSSPropWithBeginning = function _renderCSSPropWithBeginning(ratio, data) { - return data.set(data.t, data.p, ratio ? Math.round((data.s + data.c * ratio) * 10000) / 10000 + data.u : data.b, data); -}, - //if units change, we need a way to render the original unit/value when the tween goes all the way back to the beginning (ratio:0) -_renderRoundedCSSProp = function _renderRoundedCSSProp(ratio, data) { - var value = data.s + data.c * ratio; - data.set(data.t, data.p, ~~(value + (value < 0 ? -.5 : .5)) + data.u, data); -}, - _renderNonTweeningValue = function _renderNonTweeningValue(ratio, data) { - return data.set(data.t, data.p, ratio ? data.e : data.b, data); -}, - _renderNonTweeningValueOnlyAtEnd = function _renderNonTweeningValueOnlyAtEnd(ratio, data) { - return data.set(data.t, data.p, ratio !== 1 ? data.b : data.e, data); -}, - _setterCSSStyle = function _setterCSSStyle(target, property, value) { - return target.style[property] = value; -}, - _setterCSSProp = function _setterCSSProp(target, property, value) { - return target.style.setProperty(property, value); -}, - _setterTransform = function _setterTransform(target, property, value) { - return target._gsap[property] = value; -}, - _setterScale = function _setterScale(target, property, value) { - return target._gsap.scaleX = target._gsap.scaleY = value; -}, - _setterScaleWithRender = function _setterScaleWithRender(target, property, value, data, ratio) { - var cache = target._gsap; - cache.scaleX = cache.scaleY = value; - cache.renderTransform(ratio, cache); -}, - _setterTransformWithRender = function _setterTransformWithRender(target, property, value, data, ratio) { - var cache = target._gsap; - cache[property] = value; - cache.renderTransform(ratio, cache); -}, - _transformProp = "transform", - _transformOriginProp = _transformProp + "Origin", - _saveStyle = function _saveStyle(property) { - var _this = this; - - var target = this.target, - style = target.style; - - if (property in _transformProps) { - this.tfm = this.tfm || {}; - - if (property !== "transform") { - property = _propertyAliases[property] || property; - ~property.indexOf(",") ? property.split(",").forEach(function (a) { - return _this.tfm[a] = _get(target, a); - }) : this.tfm[property] = target._gsap.x ? target._gsap[property] : _get(target, property); // note: scale would map to "scaleX,scaleY", thus we loop and apply them both. - } - - target._gsap.svg && (this.svg = target.getAttribute(property) || ""); - - if (this.props.indexOf(_transformProp) >= 0) { - return; - } - - property = _transformProp; - } - - style && this.props.push(property, style[property]); -}, - _removeIndependentTransforms = function _removeIndependentTransforms(style) { - if (style.translate) { - style.removeProperty("translate"); - style.removeProperty("scale"); - style.removeProperty("rotate"); - } -}, - _revertStyle = function _revertStyle() { - var props = this.props, - target = this.target, - style = target.style, - cache = target._gsap, - i, - p; - - for (i = 0; i < props.length; i += 2) { - props[i + 1] ? style[props[i]] = props[i + 1] : style.removeProperty(props[i].replace(_capsExp, "-$1").toLowerCase()); - } - - if (this.tfm) { - cache.svg && target.setAttribute("transform", this.svg || ""); - - for (p in this.tfm) { - cache[p] = this.tfm[p]; - } - - i = _reverting(); - - if (i && !i.isStart && !style[_transformProp]) { - _removeIndependentTransforms(style); - - cache.uncache = 1; // if it's a startAt that's being reverted in the _initTween() of the core, we don't need to uncache transforms. This is purely a performance optimization. - } - } -}, - _getStyleSaver = function _getStyleSaver(target, properties) { - var saver = { - target: target, - props: [], - revert: _revertStyle, - save: _saveStyle - }; - properties && properties.split(",").forEach(function (p) { - return saver.save(p); - }); - return saver; -}, - _supports3D, - _createElement = function _createElement(type, ns) { - var e = _doc.createElementNS ? _doc.createElementNS((ns || "http://www.w3.org/1999/xhtml").replace(/^https/, "http"), type) : _doc.createElement(type); //some servers swap in https for http in the namespace which can break things, making "style" inaccessible. - - return e.style ? e : _doc.createElement(type); //some environments won't allow access to the element's style when created with a namespace in which case we default to the standard createElement() to work around the issue. Also note that when GSAP is embedded directly inside an SVG file, createElement() won't allow access to the style object in Firefox (see https://greensock.com/forums/topic/20215-problem-using-tweenmax-in-standalone-self-containing-svg-file-err-cannot-set-property-csstext-of-undefined/). -}, - _getComputedProperty = function _getComputedProperty(target, property, skipPrefixFallback) { - var cs = getComputedStyle(target); - return cs[property] || cs.getPropertyValue(property.replace(_capsExp, "-$1").toLowerCase()) || cs.getPropertyValue(property) || !skipPrefixFallback && _getComputedProperty(target, _checkPropPrefix(property) || property, 1) || ""; //css variables may not need caps swapped out for dashes and lowercase. -}, - _prefixes = "O,Moz,ms,Ms,Webkit".split(","), - _checkPropPrefix = function _checkPropPrefix(property, element, preferPrefix) { - var e = element || _tempDiv, - s = e.style, - i = 5; - - if (property in s && !preferPrefix) { - return property; - } - - property = property.charAt(0).toUpperCase() + property.substr(1); - - while (i-- && !(_prefixes[i] + property in s)) {} - - return i < 0 ? null : (i === 3 ? "ms" : i >= 0 ? _prefixes[i] : "") + property; -}, - _initCore = function _initCore() { - if (_windowExists() && window.document) { - _win = window; - _doc = _win.document; - _docElement = _doc.documentElement; - _tempDiv = _createElement("div") || { - style: {} - }; - _tempDivStyler = _createElement("div"); - _transformProp = _checkPropPrefix(_transformProp); - _transformOriginProp = _transformProp + "Origin"; - _tempDiv.style.cssText = "border-width:0;line-height:0;position:absolute;padding:0"; //make sure to override certain properties that may contaminate measurements, in case the user has overreaching style sheets. - - _supports3D = !!_checkPropPrefix("perspective"); - _reverting = gsap.core.reverting; - _pluginInitted = 1; - } -}, - _getBBoxHack = function _getBBoxHack(swapIfPossible) { - //works around issues in some browsers (like Firefox) that don't correctly report getBBox() on SVG elements inside a element and/or . We try creating an SVG, adding it to the documentElement and toss the element in there so that it's definitely part of the rendering tree, then grab the bbox and if it works, we actually swap out the original getBBox() method for our own that does these extra steps whenever getBBox is needed. This helps ensure that performance is optimal (only do all these extra steps when absolutely necessary...most elements don't need it). - var svg = _createElement("svg", this.ownerSVGElement && this.ownerSVGElement.getAttribute("xmlns") || "http://www.w3.org/2000/svg"), - oldParent = this.parentNode, - oldSibling = this.nextSibling, - oldCSS = this.style.cssText, - bbox; - - _docElement.appendChild(svg); - - svg.appendChild(this); - this.style.display = "block"; - - if (swapIfPossible) { - try { - bbox = this.getBBox(); - this._gsapBBox = this.getBBox; //store the original - - this.getBBox = _getBBoxHack; - } catch (e) {} - } else if (this._gsapBBox) { - bbox = this._gsapBBox(); - } - - if (oldParent) { - if (oldSibling) { - oldParent.insertBefore(this, oldSibling); - } else { - oldParent.appendChild(this); - } - } - - _docElement.removeChild(svg); - - this.style.cssText = oldCSS; - return bbox; -}, - _getAttributeFallbacks = function _getAttributeFallbacks(target, attributesArray) { - var i = attributesArray.length; - - while (i--) { - if (target.hasAttribute(attributesArray[i])) { - return target.getAttribute(attributesArray[i]); - } - } -}, - _getBBox = function _getBBox(target) { - var bounds; - - try { - bounds = target.getBBox(); //Firefox throws errors if you try calling getBBox() on an SVG element that's not rendered (like in a or ). https://bugzilla.mozilla.org/show_bug.cgi?id=612118 - } catch (error) { - bounds = _getBBoxHack.call(target, true); - } - - bounds && (bounds.width || bounds.height) || target.getBBox === _getBBoxHack || (bounds = _getBBoxHack.call(target, true)); //some browsers (like Firefox) misreport the bounds if the element has zero width and height (it just assumes it's at x:0, y:0), thus we need to manually grab the position in that case. - - return bounds && !bounds.width && !bounds.x && !bounds.y ? { - x: +_getAttributeFallbacks(target, ["x", "cx", "x1"]) || 0, - y: +_getAttributeFallbacks(target, ["y", "cy", "y1"]) || 0, - width: 0, - height: 0 - } : bounds; -}, - _isSVG = function _isSVG(e) { - return !!(e.getCTM && (!e.parentNode || e.ownerSVGElement) && _getBBox(e)); -}, - //reports if the element is an SVG on which getBBox() actually works -_removeProperty = function _removeProperty(target, property) { - if (property) { - var style = target.style; - - if (property in _transformProps && property !== _transformOriginProp) { - property = _transformProp; - } - - if (style.removeProperty) { - if (property.substr(0, 2) === "ms" || property.substr(0, 6) === "webkit") { - //Microsoft and some Webkit browsers don't conform to the standard of capitalizing the first prefix character, so we adjust so that when we prefix the caps with a dash, it's correct (otherwise it'd be "ms-transform" instead of "-ms-transform" for IE9, for example) - property = "-" + property; - } - - style.removeProperty(property.replace(_capsExp, "-$1").toLowerCase()); - } else { - //note: old versions of IE use "removeAttribute()" instead of "removeProperty()" - style.removeAttribute(property); - } - } -}, - _addNonTweeningPT = function _addNonTweeningPT(plugin, target, property, beginning, end, onlySetAtEnd) { - var pt = new PropTween(plugin._pt, target, property, 0, 1, onlySetAtEnd ? _renderNonTweeningValueOnlyAtEnd : _renderNonTweeningValue); - plugin._pt = pt; - pt.b = beginning; - pt.e = end; - - plugin._props.push(property); - - return pt; -}, - _nonConvertibleUnits = { - deg: 1, - rad: 1, - turn: 1 -}, - _nonStandardLayouts = { - grid: 1, - flex: 1 -}, - //takes a single value like 20px and converts it to the unit specified, like "%", returning only the numeric amount. -_convertToUnit = function _convertToUnit(target, property, value, unit) { - var curValue = parseFloat(value) || 0, - curUnit = (value + "").trim().substr((curValue + "").length) || "px", - // some browsers leave extra whitespace at the beginning of CSS variables, hence the need to trim() - style = _tempDiv.style, - horizontal = _horizontalExp.test(property), - isRootSVG = target.tagName.toLowerCase() === "svg", - measureProperty = (isRootSVG ? "client" : "offset") + (horizontal ? "Width" : "Height"), - amount = 100, - toPixels = unit === "px", - toPercent = unit === "%", - px, - parent, - cache, - isSVG; - - if (unit === curUnit || !curValue || _nonConvertibleUnits[unit] || _nonConvertibleUnits[curUnit]) { - return curValue; - } - - curUnit !== "px" && !toPixels && (curValue = _convertToUnit(target, property, value, "px")); - isSVG = target.getCTM && _isSVG(target); - - if ((toPercent || curUnit === "%") && (_transformProps[property] || ~property.indexOf("adius"))) { - px = isSVG ? target.getBBox()[horizontal ? "width" : "height"] : target[measureProperty]; - return _round(toPercent ? curValue / px * amount : curValue / 100 * px); - } - - style[horizontal ? "width" : "height"] = amount + (toPixels ? curUnit : unit); - parent = ~property.indexOf("adius") || unit === "em" && target.appendChild && !isRootSVG ? target : target.parentNode; - - if (isSVG) { - parent = (target.ownerSVGElement || {}).parentNode; - } - - if (!parent || parent === _doc || !parent.appendChild) { - parent = _doc.body; - } - - cache = parent._gsap; - - if (cache && toPercent && cache.width && horizontal && cache.time === _ticker.time && !cache.uncache) { - return _round(curValue / cache.width * amount); - } else { - (toPercent || curUnit === "%") && !_nonStandardLayouts[_getComputedProperty(parent, "display")] && (style.position = _getComputedProperty(target, "position")); - parent === target && (style.position = "static"); // like for borderRadius, if it's a % we must have it relative to the target itself but that may not have position: relative or position: absolute in which case it'd go up the chain until it finds its offsetParent (bad). position: static protects against that. - - parent.appendChild(_tempDiv); - px = _tempDiv[measureProperty]; - parent.removeChild(_tempDiv); - style.position = "absolute"; - - if (horizontal && toPercent) { - cache = _getCache(parent); - cache.time = _ticker.time; - cache.width = parent[measureProperty]; - } - } - - return _round(toPixels ? px * curValue / amount : px && curValue ? amount / px * curValue : 0); -}, - _get = function _get(target, property, unit, uncache) { - var value; - _pluginInitted || _initCore(); - - if (property in _propertyAliases && property !== "transform") { - property = _propertyAliases[property]; - - if (~property.indexOf(",")) { - property = property.split(",")[0]; - } - } - - if (_transformProps[property] && property !== "transform") { - value = _parseTransform(target, uncache); - value = property !== "transformOrigin" ? value[property] : value.svg ? value.origin : _firstTwoOnly(_getComputedProperty(target, _transformOriginProp)) + " " + value.zOrigin + "px"; - } else { - value = target.style[property]; - - if (!value || value === "auto" || uncache || ~(value + "").indexOf("calc(")) { - value = _specialProps[property] && _specialProps[property](target, property, unit) || _getComputedProperty(target, property) || _getProperty(target, property) || (property === "opacity" ? 1 : 0); // note: some browsers, like Firefox, don't report borderRadius correctly! Instead, it only reports every corner like borderTopLeftRadius - } - } - - return unit && !~(value + "").trim().indexOf(" ") ? _convertToUnit(target, property, value, unit) + unit : value; -}, - _tweenComplexCSSString = function _tweenComplexCSSString(target, prop, start, end) { - // note: we call _tweenComplexCSSString.call(pluginInstance...) to ensure that it's scoped properly. We may call it from within a plugin too, thus "this" would refer to the plugin. - if (!start || start === "none") { - // some browsers like Safari actually PREFER the prefixed property and mis-report the unprefixed value like clipPath (BUG). In other words, even though clipPath exists in the style ("clipPath" in target.style) and it's set in the CSS properly (along with -webkit-clip-path), Safari reports clipPath as "none" whereas WebkitClipPath reports accurately like "ellipse(100% 0% at 50% 0%)", so in this case we must SWITCH to using the prefixed property instead. See https://greensock.com/forums/topic/18310-clippath-doesnt-work-on-ios/ - var p = _checkPropPrefix(prop, target, 1), - s = p && _getComputedProperty(target, p, 1); - - if (s && s !== start) { - prop = p; - start = s; - } else if (prop === "borderColor") { - start = _getComputedProperty(target, "borderTopColor"); // Firefox bug: always reports "borderColor" as "", so we must fall back to borderTopColor. See https://greensock.com/forums/topic/24583-how-to-return-colors-that-i-had-after-reverse/ - } - } - - var pt = new PropTween(this._pt, target.style, prop, 0, 1, _renderComplexString), - index = 0, - matchIndex = 0, - a, - result, - startValues, - startNum, - color, - startValue, - endValue, - endNum, - chunk, - endUnit, - startUnit, - endValues; - pt.b = start; - pt.e = end; - start += ""; // ensure values are strings - - end += ""; - - if (end === "auto") { - target.style[prop] = end; - end = _getComputedProperty(target, prop) || end; - target.style[prop] = start; - } - - a = [start, end]; - - _colorStringFilter(a); // pass an array with the starting and ending values and let the filter do whatever it needs to the values. If colors are found, it returns true and then we must match where the color shows up order-wise because for things like boxShadow, sometimes the browser provides the computed values with the color FIRST, but the user provides it with the color LAST, so flip them if necessary. Same for drop-shadow(). - - - start = a[0]; - end = a[1]; - startValues = start.match(_numWithUnitExp) || []; - endValues = end.match(_numWithUnitExp) || []; - - if (endValues.length) { - while (result = _numWithUnitExp.exec(end)) { - endValue = result[0]; - chunk = end.substring(index, result.index); - - if (color) { - color = (color + 1) % 5; - } else if (chunk.substr(-5) === "rgba(" || chunk.substr(-5) === "hsla(") { - color = 1; - } - - if (endValue !== (startValue = startValues[matchIndex++] || "")) { - startNum = parseFloat(startValue) || 0; - startUnit = startValue.substr((startNum + "").length); - endValue.charAt(1) === "=" && (endValue = _parseRelative(startNum, endValue) + startUnit); - endNum = parseFloat(endValue); - endUnit = endValue.substr((endNum + "").length); - index = _numWithUnitExp.lastIndex - endUnit.length; - - if (!endUnit) { - //if something like "perspective:300" is passed in and we must add a unit to the end - endUnit = endUnit || _config.units[prop] || startUnit; - - if (index === end.length) { - end += endUnit; - pt.e += endUnit; - } - } - - if (startUnit !== endUnit) { - startNum = _convertToUnit(target, prop, startValue, endUnit) || 0; - } // these nested PropTweens are handled in a special way - we'll never actually call a render or setter method on them. We'll just loop through them in the parent complex string PropTween's render method. - - - pt._pt = { - _next: pt._pt, - p: chunk || matchIndex === 1 ? chunk : ",", - //note: SVG spec allows omission of comma/space when a negative sign is wedged between two numbers, like 2.5-5.3 instead of 2.5,-5.3 but when tweening, the negative value may switch to positive, so we insert the comma just in case. - s: startNum, - c: endNum - startNum, - m: color && color < 4 || prop === "zIndex" ? Math.round : 0 - }; - } - } - - pt.c = index < end.length ? end.substring(index, end.length) : ""; //we use the "c" of the PropTween to store the final part of the string (after the last number) - } else { - pt.r = prop === "display" && end === "none" ? _renderNonTweeningValueOnlyAtEnd : _renderNonTweeningValue; - } - - _relExp.test(end) && (pt.e = 0); //if the end string contains relative values or dynamic random(...) values, delete the end it so that on the final render we don't actually set it to the string with += or -= characters (forces it to use the calculated value). - - this._pt = pt; //start the linked list with this new PropTween. Remember, we call _tweenComplexCSSString.call(pluginInstance...) to ensure that it's scoped properly. We may call it from within another plugin too, thus "this" would refer to the plugin. - - return pt; -}, - _keywordToPercent = { - top: "0%", - bottom: "100%", - left: "0%", - right: "100%", - center: "50%" -}, - _convertKeywordsToPercentages = function _convertKeywordsToPercentages(value) { - var split = value.split(" "), - x = split[0], - y = split[1] || "50%"; - - if (x === "top" || x === "bottom" || y === "left" || y === "right") { - //the user provided them in the wrong order, so flip them - value = x; - x = y; - y = value; - } - - split[0] = _keywordToPercent[x] || x; - split[1] = _keywordToPercent[y] || y; - return split.join(" "); -}, - _renderClearProps = function _renderClearProps(ratio, data) { - if (data.tween && data.tween._time === data.tween._dur) { - var target = data.t, - style = target.style, - props = data.u, - cache = target._gsap, - prop, - clearTransforms, - i; - - if (props === "all" || props === true) { - style.cssText = ""; - clearTransforms = 1; - } else { - props = props.split(","); - i = props.length; - - while (--i > -1) { - prop = props[i]; - - if (_transformProps[prop]) { - clearTransforms = 1; - prop = prop === "transformOrigin" ? _transformOriginProp : _transformProp; - } - - _removeProperty(target, prop); - } - } - - if (clearTransforms) { - _removeProperty(target, _transformProp); - - if (cache) { - cache.svg && target.removeAttribute("transform"); - - _parseTransform(target, 1); // force all the cached values back to "normal"/identity, otherwise if there's another tween that's already set to render transforms on this element, it could display the wrong values. - - - cache.uncache = 1; - - _removeIndependentTransforms(style); - } - } - } -}, - // note: specialProps should return 1 if (and only if) they have a non-zero priority. It indicates we need to sort the linked list. -_specialProps = { - clearProps: function clearProps(plugin, target, property, endValue, tween) { - if (tween.data !== "isFromStart") { - var pt = plugin._pt = new PropTween(plugin._pt, target, property, 0, 0, _renderClearProps); - pt.u = endValue; - pt.pr = -10; - pt.tween = tween; - - plugin._props.push(property); - - return 1; - } - } - /* className feature (about 0.4kb gzipped). - , className(plugin, target, property, endValue, tween) { - let _renderClassName = (ratio, data) => { - data.css.render(ratio, data.css); - if (!ratio || ratio === 1) { - let inline = data.rmv, - target = data.t, - p; - target.setAttribute("class", ratio ? data.e : data.b); - for (p in inline) { - _removeProperty(target, p); - } - } - }, - _getAllStyles = (target) => { - let styles = {}, - computed = getComputedStyle(target), - p; - for (p in computed) { - if (isNaN(p) && p !== "cssText" && p !== "length") { - styles[p] = computed[p]; - } - } - _setDefaults(styles, _parseTransform(target, 1)); - return styles; - }, - startClassList = target.getAttribute("class"), - style = target.style, - cssText = style.cssText, - cache = target._gsap, - classPT = cache.classPT, - inlineToRemoveAtEnd = {}, - data = {t:target, plugin:plugin, rmv:inlineToRemoveAtEnd, b:startClassList, e:(endValue.charAt(1) !== "=") ? endValue : startClassList.replace(new RegExp("(?:\\s|^)" + endValue.substr(2) + "(?![\\w-])"), "") + ((endValue.charAt(0) === "+") ? " " + endValue.substr(2) : "")}, - changingVars = {}, - startVars = _getAllStyles(target), - transformRelated = /(transform|perspective)/i, - endVars, p; - if (classPT) { - classPT.r(1, classPT.d); - _removeLinkedListItem(classPT.d.plugin, classPT, "_pt"); - } - target.setAttribute("class", data.e); - endVars = _getAllStyles(target, true); - target.setAttribute("class", startClassList); - for (p in endVars) { - if (endVars[p] !== startVars[p] && !transformRelated.test(p)) { - changingVars[p] = endVars[p]; - if (!style[p] && style[p] !== "0") { - inlineToRemoveAtEnd[p] = 1; - } - } - } - cache.classPT = plugin._pt = new PropTween(plugin._pt, target, "className", 0, 0, _renderClassName, data, 0, -11); - if (style.cssText !== cssText) { //only apply if things change. Otherwise, in cases like a background-image that's pulled dynamically, it could cause a refresh. See https://greensock.com/forums/topic/20368-possible-gsap-bug-switching-classnames-in-chrome/. - style.cssText = cssText; //we recorded cssText before we swapped classes and ran _getAllStyles() because in cases when a className tween is overwritten, we remove all the related tweening properties from that class change (otherwise class-specific stuff can't override properties we've directly set on the target's style object due to specificity). - } - _parseTransform(target, true); //to clear the caching of transforms - data.css = new gsap.plugins.css(); - data.css.init(target, changingVars, tween); - plugin._props.push(...data.css._props); - return 1; - } - */ - -}, - -/* - * -------------------------------------------------------------------------------------- - * TRANSFORMS - * -------------------------------------------------------------------------------------- - */ -_identity2DMatrix = [1, 0, 0, 1, 0, 0], - _rotationalProperties = {}, - _isNullTransform = function _isNullTransform(value) { - return value === "matrix(1, 0, 0, 1, 0, 0)" || value === "none" || !value; -}, - _getComputedTransformMatrixAsArray = function _getComputedTransformMatrixAsArray(target) { - var matrixString = _getComputedProperty(target, _transformProp); - - return _isNullTransform(matrixString) ? _identity2DMatrix : matrixString.substr(7).match(_numExp).map(_round); -}, - _getMatrix = function _getMatrix(target, force2D) { - var cache = target._gsap || _getCache(target), - style = target.style, - matrix = _getComputedTransformMatrixAsArray(target), - parent, - nextSibling, - temp, - addedToDOM; - - if (cache.svg && target.getAttribute("transform")) { - temp = target.transform.baseVal.consolidate().matrix; //ensures that even complex values like "translate(50,60) rotate(135,0,0)" are parsed because it mashes it into a matrix. - - matrix = [temp.a, temp.b, temp.c, temp.d, temp.e, temp.f]; - return matrix.join(",") === "1,0,0,1,0,0" ? _identity2DMatrix : matrix; - } else if (matrix === _identity2DMatrix && !target.offsetParent && target !== _docElement && !cache.svg) { - //note: if offsetParent is null, that means the element isn't in the normal document flow, like if it has display:none or one of its ancestors has display:none). Firefox returns null for getComputedStyle() if the element is in an iframe that has display:none. https://bugzilla.mozilla.org/show_bug.cgi?id=548397 - //browsers don't report transforms accurately unless the element is in the DOM and has a display value that's not "none". Firefox and Microsoft browsers have a partial bug where they'll report transforms even if display:none BUT not any percentage-based values like translate(-50%, 8px) will be reported as if it's translate(0, 8px). - temp = style.display; - style.display = "block"; - parent = target.parentNode; - - if (!parent || !target.offsetParent) { - // note: in 3.3.0 we switched target.offsetParent to _doc.body.contains(target) to avoid [sometimes unnecessary] MutationObserver calls but that wasn't adequate because there are edge cases where nested position: fixed elements need to get reparented to accurately sense transforms. See https://github.com/greensock/GSAP/issues/388 and https://github.com/greensock/GSAP/issues/375 - addedToDOM = 1; //flag - - nextSibling = target.nextElementSibling; - - _docElement.appendChild(target); //we must add it to the DOM in order to get values properly - - } - - matrix = _getComputedTransformMatrixAsArray(target); - temp ? style.display = temp : _removeProperty(target, "display"); - - if (addedToDOM) { - nextSibling ? parent.insertBefore(target, nextSibling) : parent ? parent.appendChild(target) : _docElement.removeChild(target); - } - } - - return force2D && matrix.length > 6 ? [matrix[0], matrix[1], matrix[4], matrix[5], matrix[12], matrix[13]] : matrix; -}, - _applySVGOrigin = function _applySVGOrigin(target, origin, originIsAbsolute, smooth, matrixArray, pluginToAddPropTweensTo) { - var cache = target._gsap, - matrix = matrixArray || _getMatrix(target, true), - xOriginOld = cache.xOrigin || 0, - yOriginOld = cache.yOrigin || 0, - xOffsetOld = cache.xOffset || 0, - yOffsetOld = cache.yOffset || 0, - a = matrix[0], - b = matrix[1], - c = matrix[2], - d = matrix[3], - tx = matrix[4], - ty = matrix[5], - originSplit = origin.split(" "), - xOrigin = parseFloat(originSplit[0]) || 0, - yOrigin = parseFloat(originSplit[1]) || 0, - bounds, - determinant, - x, - y; - - if (!originIsAbsolute) { - bounds = _getBBox(target); - xOrigin = bounds.x + (~originSplit[0].indexOf("%") ? xOrigin / 100 * bounds.width : xOrigin); - yOrigin = bounds.y + (~(originSplit[1] || originSplit[0]).indexOf("%") ? yOrigin / 100 * bounds.height : yOrigin); - } else if (matrix !== _identity2DMatrix && (determinant = a * d - b * c)) { - //if it's zero (like if scaleX and scaleY are zero), skip it to avoid errors with dividing by zero. - x = xOrigin * (d / determinant) + yOrigin * (-c / determinant) + (c * ty - d * tx) / determinant; - y = xOrigin * (-b / determinant) + yOrigin * (a / determinant) - (a * ty - b * tx) / determinant; - xOrigin = x; - yOrigin = y; - } - - if (smooth || smooth !== false && cache.smooth) { - tx = xOrigin - xOriginOld; - ty = yOrigin - yOriginOld; - cache.xOffset = xOffsetOld + (tx * a + ty * c) - tx; - cache.yOffset = yOffsetOld + (tx * b + ty * d) - ty; - } else { - cache.xOffset = cache.yOffset = 0; - } - - cache.xOrigin = xOrigin; - cache.yOrigin = yOrigin; - cache.smooth = !!smooth; - cache.origin = origin; - cache.originIsAbsolute = !!originIsAbsolute; - target.style[_transformOriginProp] = "0px 0px"; //otherwise, if someone sets an origin via CSS, it will likely interfere with the SVG transform attribute ones (because remember, we're baking the origin into the matrix() value). - - if (pluginToAddPropTweensTo) { - _addNonTweeningPT(pluginToAddPropTweensTo, cache, "xOrigin", xOriginOld, xOrigin); - - _addNonTweeningPT(pluginToAddPropTweensTo, cache, "yOrigin", yOriginOld, yOrigin); - - _addNonTweeningPT(pluginToAddPropTweensTo, cache, "xOffset", xOffsetOld, cache.xOffset); - - _addNonTweeningPT(pluginToAddPropTweensTo, cache, "yOffset", yOffsetOld, cache.yOffset); - } - - target.setAttribute("data-svg-origin", xOrigin + " " + yOrigin); -}, - _parseTransform = function _parseTransform(target, uncache) { - var cache = target._gsap || new GSCache(target); - - if ("x" in cache && !uncache && !cache.uncache) { - return cache; - } - - var style = target.style, - invertedScaleX = cache.scaleX < 0, - px = "px", - deg = "deg", - cs = getComputedStyle(target), - origin = _getComputedProperty(target, _transformOriginProp) || "0", - x, - y, - z, - scaleX, - scaleY, - rotation, - rotationX, - rotationY, - skewX, - skewY, - perspective, - xOrigin, - yOrigin, - matrix, - angle, - cos, - sin, - a, - b, - c, - d, - a12, - a22, - t1, - t2, - t3, - a13, - a23, - a33, - a42, - a43, - a32; - x = y = z = rotation = rotationX = rotationY = skewX = skewY = perspective = 0; - scaleX = scaleY = 1; - cache.svg = !!(target.getCTM && _isSVG(target)); - - if (cs.translate) { - // accommodate independent transforms by combining them into normal ones. - if (cs.translate !== "none" || cs.scale !== "none" || cs.rotate !== "none") { - style[_transformProp] = (cs.translate !== "none" ? "translate3d(" + (cs.translate + " 0 0").split(" ").slice(0, 3).join(", ") + ") " : "") + (cs.rotate !== "none" ? "rotate(" + cs.rotate + ") " : "") + (cs.scale !== "none" ? "scale(" + cs.scale.split(" ").join(",") + ") " : "") + cs[_transformProp]; - } - - style.scale = style.rotate = style.translate = "none"; - } - - matrix = _getMatrix(target, cache.svg); - - if (cache.svg) { - t1 = (!cache.uncache || origin === "0px 0px") && !uncache && target.getAttribute("data-svg-origin"); // if origin is 0,0 and cache.uncache is true, let the recorded data-svg-origin stay. Otherwise, whenever we set cache.uncache to true, we'd need to set element.style.transformOrigin = (cache.xOrigin - bbox.x) + "px " + (cache.yOrigin - bbox.y) + "px". Remember, to work around browser inconsistencies we always force SVG elements' transformOrigin to 0,0 and offset the translation accordingly. - - _applySVGOrigin(target, t1 || origin, !!t1 || cache.originIsAbsolute, cache.smooth !== false, matrix); - } - - xOrigin = cache.xOrigin || 0; - yOrigin = cache.yOrigin || 0; - - if (matrix !== _identity2DMatrix) { - a = matrix[0]; //a11 - - b = matrix[1]; //a21 - - c = matrix[2]; //a31 - - d = matrix[3]; //a41 - - x = a12 = matrix[4]; - y = a22 = matrix[5]; //2D matrix - - if (matrix.length === 6) { - scaleX = Math.sqrt(a * a + b * b); - scaleY = Math.sqrt(d * d + c * c); - rotation = a || b ? _atan2(b, a) * _RAD2DEG : 0; //note: if scaleX is 0, we cannot accurately measure rotation. Same for skewX with a scaleY of 0. Therefore, we default to the previously recorded value (or zero if that doesn't exist). - - skewX = c || d ? _atan2(c, d) * _RAD2DEG + rotation : 0; - skewX && (scaleY *= Math.abs(Math.cos(skewX * _DEG2RAD))); - - if (cache.svg) { - x -= xOrigin - (xOrigin * a + yOrigin * c); - y -= yOrigin - (xOrigin * b + yOrigin * d); - } //3D matrix - - } else { - a32 = matrix[6]; - a42 = matrix[7]; - a13 = matrix[8]; - a23 = matrix[9]; - a33 = matrix[10]; - a43 = matrix[11]; - x = matrix[12]; - y = matrix[13]; - z = matrix[14]; - angle = _atan2(a32, a33); - rotationX = angle * _RAD2DEG; //rotationX - - if (angle) { - cos = Math.cos(-angle); - sin = Math.sin(-angle); - t1 = a12 * cos + a13 * sin; - t2 = a22 * cos + a23 * sin; - t3 = a32 * cos + a33 * sin; - a13 = a12 * -sin + a13 * cos; - a23 = a22 * -sin + a23 * cos; - a33 = a32 * -sin + a33 * cos; - a43 = a42 * -sin + a43 * cos; - a12 = t1; - a22 = t2; - a32 = t3; - } //rotationY - - - angle = _atan2(-c, a33); - rotationY = angle * _RAD2DEG; - - if (angle) { - cos = Math.cos(-angle); - sin = Math.sin(-angle); - t1 = a * cos - a13 * sin; - t2 = b * cos - a23 * sin; - t3 = c * cos - a33 * sin; - a43 = d * sin + a43 * cos; - a = t1; - b = t2; - c = t3; - } //rotationZ - - - angle = _atan2(b, a); - rotation = angle * _RAD2DEG; - - if (angle) { - cos = Math.cos(angle); - sin = Math.sin(angle); - t1 = a * cos + b * sin; - t2 = a12 * cos + a22 * sin; - b = b * cos - a * sin; - a22 = a22 * cos - a12 * sin; - a = t1; - a12 = t2; - } - - if (rotationX && Math.abs(rotationX) + Math.abs(rotation) > 359.9) { - //when rotationY is set, it will often be parsed as 180 degrees different than it should be, and rotationX and rotation both being 180 (it looks the same), so we adjust for that here. - rotationX = rotation = 0; - rotationY = 180 - rotationY; - } - - scaleX = _round(Math.sqrt(a * a + b * b + c * c)); - scaleY = _round(Math.sqrt(a22 * a22 + a32 * a32)); - angle = _atan2(a12, a22); - skewX = Math.abs(angle) > 0.0002 ? angle * _RAD2DEG : 0; - perspective = a43 ? 1 / (a43 < 0 ? -a43 : a43) : 0; - } - - if (cache.svg) { - //sense if there are CSS transforms applied on an SVG element in which case we must overwrite them when rendering. The transform attribute is more reliable cross-browser, but we can't just remove the CSS ones because they may be applied in a CSS rule somewhere (not just inline). - t1 = target.getAttribute("transform"); - cache.forceCSS = target.setAttribute("transform", "") || !_isNullTransform(_getComputedProperty(target, _transformProp)); - t1 && target.setAttribute("transform", t1); - } - } - - if (Math.abs(skewX) > 90 && Math.abs(skewX) < 270) { - if (invertedScaleX) { - scaleX *= -1; - skewX += rotation <= 0 ? 180 : -180; - rotation += rotation <= 0 ? 180 : -180; - } else { - scaleY *= -1; - skewX += skewX <= 0 ? 180 : -180; - } - } - - uncache = uncache || cache.uncache; - cache.x = x - ((cache.xPercent = x && (!uncache && cache.xPercent || (Math.round(target.offsetWidth / 2) === Math.round(-x) ? -50 : 0))) ? target.offsetWidth * cache.xPercent / 100 : 0) + px; - cache.y = y - ((cache.yPercent = y && (!uncache && cache.yPercent || (Math.round(target.offsetHeight / 2) === Math.round(-y) ? -50 : 0))) ? target.offsetHeight * cache.yPercent / 100 : 0) + px; - cache.z = z + px; - cache.scaleX = _round(scaleX); - cache.scaleY = _round(scaleY); - cache.rotation = _round(rotation) + deg; - cache.rotationX = _round(rotationX) + deg; - cache.rotationY = _round(rotationY) + deg; - cache.skewX = skewX + deg; - cache.skewY = skewY + deg; - cache.transformPerspective = perspective + px; - - if (cache.zOrigin = parseFloat(origin.split(" ")[2]) || 0) { - style[_transformOriginProp] = _firstTwoOnly(origin); - } - - cache.xOffset = cache.yOffset = 0; - cache.force3D = _config.force3D; - cache.renderTransform = cache.svg ? _renderSVGTransforms : _supports3D ? _renderCSSTransforms : _renderNon3DTransforms; - cache.uncache = 0; - return cache; -}, - _firstTwoOnly = function _firstTwoOnly(value) { - return (value = value.split(" "))[0] + " " + value[1]; -}, - //for handling transformOrigin values, stripping out the 3rd dimension -_addPxTranslate = function _addPxTranslate(target, start, value) { - var unit = getUnit(start); - return _round(parseFloat(start) + parseFloat(_convertToUnit(target, "x", value + "px", unit))) + unit; -}, - _renderNon3DTransforms = function _renderNon3DTransforms(ratio, cache) { - cache.z = "0px"; - cache.rotationY = cache.rotationX = "0deg"; - cache.force3D = 0; - - _renderCSSTransforms(ratio, cache); -}, - _zeroDeg = "0deg", - _zeroPx = "0px", - _endParenthesis = ") ", - _renderCSSTransforms = function _renderCSSTransforms(ratio, cache) { - var _ref = cache || this, - xPercent = _ref.xPercent, - yPercent = _ref.yPercent, - x = _ref.x, - y = _ref.y, - z = _ref.z, - rotation = _ref.rotation, - rotationY = _ref.rotationY, - rotationX = _ref.rotationX, - skewX = _ref.skewX, - skewY = _ref.skewY, - scaleX = _ref.scaleX, - scaleY = _ref.scaleY, - transformPerspective = _ref.transformPerspective, - force3D = _ref.force3D, - target = _ref.target, - zOrigin = _ref.zOrigin, - transforms = "", - use3D = force3D === "auto" && ratio && ratio !== 1 || force3D === true; // Safari has a bug that causes it not to render 3D transform-origin values properly, so we force the z origin to 0, record it in the cache, and then do the math here to offset the translate values accordingly (basically do the 3D transform-origin part manually) - - - if (zOrigin && (rotationX !== _zeroDeg || rotationY !== _zeroDeg)) { - var angle = parseFloat(rotationY) * _DEG2RAD, - a13 = Math.sin(angle), - a33 = Math.cos(angle), - cos; - - angle = parseFloat(rotationX) * _DEG2RAD; - cos = Math.cos(angle); - x = _addPxTranslate(target, x, a13 * cos * -zOrigin); - y = _addPxTranslate(target, y, -Math.sin(angle) * -zOrigin); - z = _addPxTranslate(target, z, a33 * cos * -zOrigin + zOrigin); - } - - if (transformPerspective !== _zeroPx) { - transforms += "perspective(" + transformPerspective + _endParenthesis; - } - - if (xPercent || yPercent) { - transforms += "translate(" + xPercent + "%, " + yPercent + "%) "; - } - - if (use3D || x !== _zeroPx || y !== _zeroPx || z !== _zeroPx) { - transforms += z !== _zeroPx || use3D ? "translate3d(" + x + ", " + y + ", " + z + ") " : "translate(" + x + ", " + y + _endParenthesis; - } - - if (rotation !== _zeroDeg) { - transforms += "rotate(" + rotation + _endParenthesis; - } - - if (rotationY !== _zeroDeg) { - transforms += "rotateY(" + rotationY + _endParenthesis; - } - - if (rotationX !== _zeroDeg) { - transforms += "rotateX(" + rotationX + _endParenthesis; - } - - if (skewX !== _zeroDeg || skewY !== _zeroDeg) { - transforms += "skew(" + skewX + ", " + skewY + _endParenthesis; - } - - if (scaleX !== 1 || scaleY !== 1) { - transforms += "scale(" + scaleX + ", " + scaleY + _endParenthesis; - } - - target.style[_transformProp] = transforms || "translate(0, 0)"; -}, - _renderSVGTransforms = function _renderSVGTransforms(ratio, cache) { - var _ref2 = cache || this, - xPercent = _ref2.xPercent, - yPercent = _ref2.yPercent, - x = _ref2.x, - y = _ref2.y, - rotation = _ref2.rotation, - skewX = _ref2.skewX, - skewY = _ref2.skewY, - scaleX = _ref2.scaleX, - scaleY = _ref2.scaleY, - target = _ref2.target, - xOrigin = _ref2.xOrigin, - yOrigin = _ref2.yOrigin, - xOffset = _ref2.xOffset, - yOffset = _ref2.yOffset, - forceCSS = _ref2.forceCSS, - tx = parseFloat(x), - ty = parseFloat(y), - a11, - a21, - a12, - a22, - temp; - - rotation = parseFloat(rotation); - skewX = parseFloat(skewX); - skewY = parseFloat(skewY); - - if (skewY) { - //for performance reasons, we combine all skewing into the skewX and rotation values. Remember, a skewY of 10 degrees looks the same as a rotation of 10 degrees plus a skewX of 10 degrees. - skewY = parseFloat(skewY); - skewX += skewY; - rotation += skewY; - } - - if (rotation || skewX) { - rotation *= _DEG2RAD; - skewX *= _DEG2RAD; - a11 = Math.cos(rotation) * scaleX; - a21 = Math.sin(rotation) * scaleX; - a12 = Math.sin(rotation - skewX) * -scaleY; - a22 = Math.cos(rotation - skewX) * scaleY; - - if (skewX) { - skewY *= _DEG2RAD; - temp = Math.tan(skewX - skewY); - temp = Math.sqrt(1 + temp * temp); - a12 *= temp; - a22 *= temp; - - if (skewY) { - temp = Math.tan(skewY); - temp = Math.sqrt(1 + temp * temp); - a11 *= temp; - a21 *= temp; - } - } - - a11 = _round(a11); - a21 = _round(a21); - a12 = _round(a12); - a22 = _round(a22); - } else { - a11 = scaleX; - a22 = scaleY; - a21 = a12 = 0; - } - - if (tx && !~(x + "").indexOf("px") || ty && !~(y + "").indexOf("px")) { - tx = _convertToUnit(target, "x", x, "px"); - ty = _convertToUnit(target, "y", y, "px"); - } - - if (xOrigin || yOrigin || xOffset || yOffset) { - tx = _round(tx + xOrigin - (xOrigin * a11 + yOrigin * a12) + xOffset); - ty = _round(ty + yOrigin - (xOrigin * a21 + yOrigin * a22) + yOffset); - } - - if (xPercent || yPercent) { - //The SVG spec doesn't support percentage-based translation in the "transform" attribute, so we merge it into the translation to simulate it. - temp = target.getBBox(); - tx = _round(tx + xPercent / 100 * temp.width); - ty = _round(ty + yPercent / 100 * temp.height); - } - - temp = "matrix(" + a11 + "," + a21 + "," + a12 + "," + a22 + "," + tx + "," + ty + ")"; - target.setAttribute("transform", temp); - forceCSS && (target.style[_transformProp] = temp); //some browsers prioritize CSS transforms over the transform attribute. When we sense that the user has CSS transforms applied, we must overwrite them this way (otherwise some browser simply won't render the transform attribute changes!) -}, - _addRotationalPropTween = function _addRotationalPropTween(plugin, target, property, startNum, endValue) { - var cap = 360, - isString = _isString(endValue), - endNum = parseFloat(endValue) * (isString && ~endValue.indexOf("rad") ? _RAD2DEG : 1), - change = endNum - startNum, - finalValue = startNum + change + "deg", - direction, - pt; - - if (isString) { - direction = endValue.split("_")[1]; - - if (direction === "short") { - change %= cap; - - if (change !== change % (cap / 2)) { - change += change < 0 ? cap : -cap; - } - } - - if (direction === "cw" && change < 0) { - change = (change + cap * _bigNum) % cap - ~~(change / cap) * cap; - } else if (direction === "ccw" && change > 0) { - change = (change - cap * _bigNum) % cap - ~~(change / cap) * cap; - } - } - - plugin._pt = pt = new PropTween(plugin._pt, target, property, startNum, change, _renderPropWithEnd); - pt.e = finalValue; - pt.u = "deg"; - - plugin._props.push(property); - - return pt; -}, - _assign = function _assign(target, source) { - // Internet Explorer doesn't have Object.assign(), so we recreate it here. - for (var p in source) { - target[p] = source[p]; - } - - return target; -}, - _addRawTransformPTs = function _addRawTransformPTs(plugin, transforms, target) { - //for handling cases where someone passes in a whole transform string, like transform: "scale(2, 3) rotate(20deg) translateY(30em)" - var startCache = _assign({}, target._gsap), - exclude = "perspective,force3D,transformOrigin,svgOrigin", - style = target.style, - endCache, - p, - startValue, - endValue, - startNum, - endNum, - startUnit, - endUnit; - - if (startCache.svg) { - startValue = target.getAttribute("transform"); - target.setAttribute("transform", ""); - style[_transformProp] = transforms; - endCache = _parseTransform(target, 1); - - _removeProperty(target, _transformProp); - - target.setAttribute("transform", startValue); - } else { - startValue = getComputedStyle(target)[_transformProp]; - style[_transformProp] = transforms; - endCache = _parseTransform(target, 1); - style[_transformProp] = startValue; - } - - for (p in _transformProps) { - startValue = startCache[p]; - endValue = endCache[p]; - - if (startValue !== endValue && exclude.indexOf(p) < 0) { - //tweening to no perspective gives very unintuitive results - just keep the same perspective in that case. - startUnit = getUnit(startValue); - endUnit = getUnit(endValue); - startNum = startUnit !== endUnit ? _convertToUnit(target, p, startValue, endUnit) : parseFloat(startValue); - endNum = parseFloat(endValue); - plugin._pt = new PropTween(plugin._pt, endCache, p, startNum, endNum - startNum, _renderCSSProp); - plugin._pt.u = endUnit || 0; - - plugin._props.push(p); - } - } - - _assign(endCache, startCache); -}; // handle splitting apart padding, margin, borderWidth, and borderRadius into their 4 components. Firefox, for example, won't report borderRadius correctly - it will only do borderTopLeftRadius and the other corners. We also want to handle paddingTop, marginLeft, borderRightWidth, etc. - - -_forEachName("padding,margin,Width,Radius", function (name, index) { - var t = "Top", - r = "Right", - b = "Bottom", - l = "Left", - props = (index < 3 ? [t, r, b, l] : [t + l, t + r, b + r, b + l]).map(function (side) { - return index < 2 ? name + side : "border" + side + name; - }); - - _specialProps[index > 1 ? "border" + name : name] = function (plugin, target, property, endValue, tween) { - var a, vars; - - if (arguments.length < 4) { - // getter, passed target, property, and unit (from _get()) - a = props.map(function (prop) { - return _get(plugin, prop, property); - }); - vars = a.join(" "); - return vars.split(a[0]).length === 5 ? a[0] : vars; - } - - a = (endValue + "").split(" "); - vars = {}; - props.forEach(function (prop, i) { - return vars[prop] = a[i] = a[i] || a[(i - 1) / 2 | 0]; - }); - plugin.init(target, vars, tween); - }; -}); - -export var CSSPlugin = { - name: "css", - register: _initCore, - targetTest: function targetTest(target) { - return target.style && target.nodeType; - }, - init: function init(target, vars, tween, index, targets) { - var props = this._props, - style = target.style, - startAt = tween.vars.startAt, - startValue, - endValue, - endNum, - startNum, - type, - specialProp, - p, - startUnit, - endUnit, - relative, - isTransformRelated, - transformPropTween, - cache, - smooth, - hasPriority, - inlineProps; - _pluginInitted || _initCore(); // we may call init() multiple times on the same plugin instance, like when adding special properties, so make sure we don't overwrite the revert data or inlineProps - - this.styles = this.styles || _getStyleSaver(target); - inlineProps = this.styles.props; - this.tween = tween; - - for (p in vars) { - if (p === "autoRound") { - continue; - } - - endValue = vars[p]; - - if (_plugins[p] && _checkPlugin(p, vars, tween, index, target, targets)) { - // plugins - continue; - } - - type = typeof endValue; - specialProp = _specialProps[p]; - - if (type === "function") { - endValue = endValue.call(tween, index, target, targets); - type = typeof endValue; - } - - if (type === "string" && ~endValue.indexOf("random(")) { - endValue = _replaceRandom(endValue); - } - - if (specialProp) { - specialProp(this, target, p, endValue, tween) && (hasPriority = 1); - } else if (p.substr(0, 2) === "--") { - //CSS variable - startValue = (getComputedStyle(target).getPropertyValue(p) + "").trim(); - endValue += ""; - _colorExp.lastIndex = 0; - - if (!_colorExp.test(startValue)) { - // colors don't have units - startUnit = getUnit(startValue); - endUnit = getUnit(endValue); - } - - endUnit ? startUnit !== endUnit && (startValue = _convertToUnit(target, p, startValue, endUnit) + endUnit) : startUnit && (endValue += startUnit); - this.add(style, "setProperty", startValue, endValue, index, targets, 0, 0, p); - props.push(p); - inlineProps.push(p, style[p]); - } else if (type !== "undefined") { - if (startAt && p in startAt) { - // in case someone hard-codes a complex value as the start, like top: "calc(2vh / 2)". Without this, it'd use the computed value (always in px) - startValue = typeof startAt[p] === "function" ? startAt[p].call(tween, index, target, targets) : startAt[p]; - _isString(startValue) && ~startValue.indexOf("random(") && (startValue = _replaceRandom(startValue)); - getUnit(startValue + "") || (startValue += _config.units[p] || getUnit(_get(target, p)) || ""); // for cases when someone passes in a unitless value like {x: 100}; if we try setting translate(100, 0px) it won't work. - - (startValue + "").charAt(1) === "=" && (startValue = _get(target, p)); // can't work with relative values - } else { - startValue = _get(target, p); - } - - startNum = parseFloat(startValue); - relative = type === "string" && endValue.charAt(1) === "=" && endValue.substr(0, 2); - relative && (endValue = endValue.substr(2)); - endNum = parseFloat(endValue); - - if (p in _propertyAliases) { - if (p === "autoAlpha") { - //special case where we control the visibility along with opacity. We still allow the opacity value to pass through and get tweened. - if (startNum === 1 && _get(target, "visibility") === "hidden" && endNum) { - //if visibility is initially set to "hidden", we should interpret that as intent to make opacity 0 (a convenience) - startNum = 0; - } - - inlineProps.push("visibility", style.visibility); - - _addNonTweeningPT(this, style, "visibility", startNum ? "inherit" : "hidden", endNum ? "inherit" : "hidden", !endNum); - } - - if (p !== "scale" && p !== "transform") { - p = _propertyAliases[p]; - ~p.indexOf(",") && (p = p.split(",")[0]); - } - } - - isTransformRelated = p in _transformProps; //--- TRANSFORM-RELATED --- - - if (isTransformRelated) { - this.styles.save(p); - - if (!transformPropTween) { - cache = target._gsap; - cache.renderTransform && !vars.parseTransform || _parseTransform(target, vars.parseTransform); // if, for example, gsap.set(... {transform:"translateX(50vw)"}), the _get() call doesn't parse the transform, thus cache.renderTransform won't be set yet so force the parsing of the transform here. - - smooth = vars.smoothOrigin !== false && cache.smooth; - transformPropTween = this._pt = new PropTween(this._pt, style, _transformProp, 0, 1, cache.renderTransform, cache, 0, -1); //the first time through, create the rendering PropTween so that it runs LAST (in the linked list, we keep adding to the beginning) - - transformPropTween.dep = 1; //flag it as dependent so that if things get killed/overwritten and this is the only PropTween left, we can safely kill the whole tween. - } - - if (p === "scale") { - this._pt = new PropTween(this._pt, cache, "scaleY", cache.scaleY, (relative ? _parseRelative(cache.scaleY, relative + endNum) : endNum) - cache.scaleY || 0, _renderCSSProp); - this._pt.u = 0; - props.push("scaleY", p); - p += "X"; - } else if (p === "transformOrigin") { - inlineProps.push(_transformOriginProp, style[_transformOriginProp]); - endValue = _convertKeywordsToPercentages(endValue); //in case something like "left top" or "bottom right" is passed in. Convert to percentages. - - if (cache.svg) { - _applySVGOrigin(target, endValue, 0, smooth, 0, this); - } else { - endUnit = parseFloat(endValue.split(" ")[2]) || 0; //handle the zOrigin separately! - - endUnit !== cache.zOrigin && _addNonTweeningPT(this, cache, "zOrigin", cache.zOrigin, endUnit); - - _addNonTweeningPT(this, style, p, _firstTwoOnly(startValue), _firstTwoOnly(endValue)); - } - - continue; - } else if (p === "svgOrigin") { - _applySVGOrigin(target, endValue, 1, smooth, 0, this); - - continue; - } else if (p in _rotationalProperties) { - _addRotationalPropTween(this, cache, p, startNum, relative ? _parseRelative(startNum, relative + endValue) : endValue); - - continue; - } else if (p === "smoothOrigin") { - _addNonTweeningPT(this, cache, "smooth", cache.smooth, endValue); - - continue; - } else if (p === "force3D") { - cache[p] = endValue; - continue; - } else if (p === "transform") { - _addRawTransformPTs(this, endValue, target); - - continue; - } - } else if (!(p in style)) { - p = _checkPropPrefix(p) || p; - } - - if (isTransformRelated || (endNum || endNum === 0) && (startNum || startNum === 0) && !_complexExp.test(endValue) && p in style) { - startUnit = (startValue + "").substr((startNum + "").length); - endNum || (endNum = 0); // protect against NaN - - endUnit = getUnit(endValue) || (p in _config.units ? _config.units[p] : startUnit); - startUnit !== endUnit && (startNum = _convertToUnit(target, p, startValue, endUnit)); - this._pt = new PropTween(this._pt, isTransformRelated ? cache : style, p, startNum, (relative ? _parseRelative(startNum, relative + endNum) : endNum) - startNum, !isTransformRelated && (endUnit === "px" || p === "zIndex") && vars.autoRound !== false ? _renderRoundedCSSProp : _renderCSSProp); - this._pt.u = endUnit || 0; - - if (startUnit !== endUnit && endUnit !== "%") { - //when the tween goes all the way back to the beginning, we need to revert it to the OLD/ORIGINAL value (with those units). We record that as a "b" (beginning) property and point to a render method that handles that. (performance optimization) - this._pt.b = startValue; - this._pt.r = _renderCSSPropWithBeginning; - } - } else if (!(p in style)) { - if (p in target) { - //maybe it's not a style - it could be a property added directly to an element in which case we'll try to animate that. - this.add(target, p, startValue || target[p], relative ? relative + endValue : endValue, index, targets); - } else { - _missingPlugin(p, endValue); - - continue; - } - } else { - _tweenComplexCSSString.call(this, target, p, startValue, relative ? relative + endValue : endValue); - } - - isTransformRelated || inlineProps.push(p, style[p]); - props.push(p); - } - } - - hasPriority && _sortPropTweensByPriority(this); - }, - render: function render(ratio, data) { - if (data.tween._time || !_reverting()) { - var pt = data._pt; - - while (pt) { - pt.r(ratio, pt.d); - pt = pt._next; - } - } else { - data.styles.revert(); - } - }, - get: _get, - aliases: _propertyAliases, - getSetter: function getSetter(target, property, plugin) { - //returns a setter function that accepts target, property, value and applies it accordingly. Remember, properties like "x" aren't as simple as target.style.property = value because they've got to be applied to a proxy object and then merged into a transform string in a renderer. - var p = _propertyAliases[property]; - p && p.indexOf(",") < 0 && (property = p); - return property in _transformProps && property !== _transformOriginProp && (target._gsap.x || _get(target, "x")) ? plugin && _recentSetterPlugin === plugin ? property === "scale" ? _setterScale : _setterTransform : (_recentSetterPlugin = plugin || {}) && (property === "scale" ? _setterScaleWithRender : _setterTransformWithRender) : target.style && !_isUndefined(target.style[property]) ? _setterCSSStyle : ~property.indexOf("-") ? _setterCSSProp : _getSetter(target, property); - }, - core: { - _removeProperty: _removeProperty, - _getMatrix: _getMatrix - } -}; -gsap.utils.checkPrefix = _checkPropPrefix; -gsap.core.getStyleSaver = _getStyleSaver; - -(function (positionAndScale, rotation, others, aliases) { - var all = _forEachName(positionAndScale + "," + rotation + "," + others, function (name) { - _transformProps[name] = 1; - }); - - _forEachName(rotation, function (name) { - _config.units[name] = "deg"; - _rotationalProperties[name] = 1; - }); - - _propertyAliases[all[13]] = positionAndScale + "," + rotation; - - _forEachName(aliases, function (name) { - var split = name.split(":"); - _propertyAliases[split[1]] = all[split[0]]; - }); -})("x,y,z,scale,scaleX,scaleY,xPercent,yPercent", "rotation,rotationX,rotationY,skewX,skewY", "transform,transformOrigin,svgOrigin,force3D,smoothOrigin,transformPerspective", "0:translateX,1:translateY,2:translateZ,8:rotate,8:rotationZ,8:rotateZ,9:rotateX,10:rotateY"); - -_forEachName("x,y,z,top,right,bottom,left,width,height,fontSize,padding,margin,perspective", function (name) { - _config.units[name] = "px"; -}); - -gsap.registerPlugin(CSSPlugin); -export { CSSPlugin as default, _getBBox, _createElement, _checkPropPrefix as checkPrefix }; \ No newline at end of file diff --git a/dist/lib/greensock/CSSRulePlugin.js b/dist/lib/greensock/CSSRulePlugin.js deleted file mode 100644 index 49413c78..00000000 --- a/dist/lib/greensock/CSSRulePlugin.js +++ /dev/null @@ -1,134 +0,0 @@ -/*! - * CSSRulePlugin 3.11.0 - * https://greensock.com - * - * @license Copyright 2008-2022, GreenSock. All rights reserved. - * Subject to the terms at https://greensock.com/standard-license or for - * Club GreenSock members, the agreement issued with that membership. - * @author: Jack Doyle, jack@greensock.com -*/ - -/* eslint-disable */ -var gsap, - _coreInitted, - _win, - _doc, - CSSPlugin, - _windowExists = function _windowExists() { - return typeof window !== "undefined"; -}, - _getGSAP = function _getGSAP() { - return gsap || _windowExists() && (gsap = window.gsap) && gsap.registerPlugin && gsap; -}, - _checkRegister = function _checkRegister() { - if (!_coreInitted) { - _initCore(); - - if (!CSSPlugin) { - console.warn("Please gsap.registerPlugin(CSSPlugin, CSSRulePlugin)"); - } - } - - return _coreInitted; -}, - _initCore = function _initCore(core) { - gsap = core || _getGSAP(); - - if (_windowExists()) { - _win = window; - _doc = document; - } - - if (gsap) { - CSSPlugin = gsap.plugins.css; - - if (CSSPlugin) { - _coreInitted = 1; - } - } -}; - -export var CSSRulePlugin = { - version: "3.11.0", - name: "cssRule", - init: function init(target, value, tween, index, targets) { - if (!_checkRegister() || typeof target.cssText === "undefined") { - return false; - } - - var div = target._gsProxy = target._gsProxy || _doc.createElement("div"); - - this.ss = target; - this.style = div.style; - div.style.cssText = target.cssText; - CSSPlugin.prototype.init.call(this, div, value, tween, index, targets); //we just offload all the work to the regular CSSPlugin and then copy the cssText back over to the rule in the render() method. This allows us to have all of the updates to CSSPlugin automatically flow through to CSSRulePlugin instead of having to maintain both - }, - render: function render(ratio, data) { - var pt = data._pt, - style = data.style, - ss = data.ss, - i; - - while (pt) { - pt.r(ratio, pt.d); - pt = pt._next; - } - - i = style.length; - - while (--i > -1) { - ss[style[i]] = style[style[i]]; - } - }, - getRule: function getRule(selector) { - _checkRegister(); - - var ruleProp = _doc.all ? "rules" : "cssRules", - styleSheets = _doc.styleSheets, - i = styleSheets.length, - pseudo = selector.charAt(0) === ":", - j, - curSS, - cs, - a; - selector = (pseudo ? "" : ",") + selector.split("::").join(":").toLowerCase() + ","; //note: old versions of IE report tag name selectors as upper case, so we just change everything to lowercase. - - if (pseudo) { - a = []; - } - - while (i--) { - //Firefox may throw insecure operation errors when css is loaded from other domains, so try/catch. - try { - curSS = styleSheets[i][ruleProp]; - - if (!curSS) { - continue; - } - - j = curSS.length; - } catch (e) { - console.warn(e); - continue; - } - - while (--j > -1) { - cs = curSS[j]; - - if (cs.selectorText && ("," + cs.selectorText.split("::").join(":").toLowerCase() + ",").indexOf(selector) !== -1) { - //note: IE adds an extra ":" to pseudo selectors, so .myClass:after becomes .myClass::after, so we need to strip the extra one out. - if (pseudo) { - a.push(cs.style); - } else { - return cs.style; - } - } - } - } - - return a; - }, - register: _initCore -}; -_getGSAP() && gsap.registerPlugin(CSSRulePlugin); -export { CSSRulePlugin as default }; \ No newline at end of file diff --git a/dist/lib/greensock/CustomBounce.js b/dist/lib/greensock/CustomBounce.js deleted file mode 100644 index 856d7e14..00000000 --- a/dist/lib/greensock/CustomBounce.js +++ /dev/null @@ -1,166 +0,0 @@ -/*! - * CustomBounce 3.11.0 - * https://greensock.com - * - * @license Copyright 2008-2022, GreenSock. All rights reserved. - * Subject to the terms at https://greensock.com/standard-license or for - * Club GreenSock members, the agreement issued with that membership. - * @author: Jack Doyle, jack@greensock.com -*/ - -/* eslint-disable */ -var gsap, - _coreInitted, - createCustomEase, - _getGSAP = function _getGSAP() { - return gsap || typeof window !== "undefined" && (gsap = window.gsap) && gsap.registerPlugin && gsap; -}, - _initCore = function _initCore(required) { - gsap = _getGSAP(); - createCustomEase = gsap && gsap.parseEase("_CE"); - - if (createCustomEase) { - _coreInitted = 1; - - gsap.parseEase("bounce").config = function (vars) { - return typeof vars === "object" ? _create("", vars) : _create("bounce(" + vars + ")", { - strength: +vars - }); - }; - } else { - required && console.warn("Please gsap.registerPlugin(CustomEase, CustomBounce)"); - } -}, - _normalizeX = function _normalizeX(a) { - //scales all the x values in an array [x, y, x, y...] AND rounds them to the closest hundredth (decimal) - var l = a.length, - s = 1 / a[l - 2], - rnd = 1000, - i; - - for (i = 2; i < l; i += 2) { - a[i] = ~~(a[i] * s * rnd) / rnd; - } - - a[l - 2] = 1; //in case there are any rounding errors. x should always end at 1. -}, - _bonusValidated = 1, - //CustomBounce -_create = function _create(id, vars) { - if (!_coreInitted) { - _initCore(1); - } - - vars = vars || {}; - - if (_bonusValidated) { - var max = 0.999, - decay = Math.min(max, vars.strength || 0.7), - // Math.min(0.999, 1 - 0.3 / (vars.strength || 1)), - decayX = decay, - gap = (vars.squash || 0) / 100, - originalGap = gap, - slope = 1 / 0.03, - w = 0.2, - h = 1, - prevX = 0.1, - path = [0, 0, 0.07, 0, 0.1, 1, 0.1, 1], - squashPath = [0, 0, 0, 0, 0.1, 0, 0.1, 0], - cp1, - cp2, - x, - y, - i, - nextX, - squishMagnitude; - - for (i = 0; i < 200; i++) { - w *= decayX * ((decayX + 1) / 2); - h *= decay * decay; - nextX = prevX + w; - x = prevX + w * 0.49; - y = 1 - h; - cp1 = prevX + h / slope; - cp2 = x + (x - cp1) * 0.8; - - if (gap) { - prevX += gap; - cp1 += gap; - x += gap; - cp2 += gap; - nextX += gap; - squishMagnitude = gap / originalGap; - squashPath.push(prevX - gap, 0, prevX - gap, squishMagnitude, prevX - gap / 2, squishMagnitude, //center peak anchor - prevX, squishMagnitude, prevX, 0, prevX, 0, //base anchor - prevX, squishMagnitude * -0.6, prevX + (nextX - prevX) / 6, 0, nextX, 0); - path.push(prevX - gap, 1, prevX, 1, prevX, 1); - gap *= decay * decay; - } - - path.push(prevX, 1, cp1, y, x, y, cp2, y, nextX, 1, nextX, 1); - decay *= 0.95; - slope = h / (nextX - cp2); - prevX = nextX; - - if (y > max) { - break; - } - } - - if (vars.endAtStart && vars.endAtStart !== "false") { - x = -0.1; - path.unshift(x, 1, x, 1, -0.07, 0); - - if (originalGap) { - gap = originalGap * 2.5; //make the initial anticipation squash longer (more realistic) - - x -= gap; - path.unshift(x, 1, x, 1, x, 1); - squashPath.splice(0, 6); - squashPath.unshift(x, 0, x, 0, x, 1, x + gap / 2, 1, x + gap, 1, x + gap, 0, x + gap, 0, x + gap, -0.6, x + gap + 0.033, 0); - - for (i = 0; i < squashPath.length; i += 2) { - squashPath[i] -= x; - } - } - - for (i = 0; i < path.length; i += 2) { - path[i] -= x; - path[i + 1] = 1 - path[i + 1]; - } - } - - if (gap) { - _normalizeX(squashPath); - - squashPath[2] = "C" + squashPath[2]; - createCustomEase(vars.squashID || id + "-squash", "M" + squashPath.join(",")); - } - - _normalizeX(path); - - path[2] = "C" + path[2]; - return createCustomEase(id, "M" + path.join(",")); - } -}; - -export var CustomBounce = /*#__PURE__*/function () { - function CustomBounce(id, vars) { - this.ease = _create(id, vars); - } - - CustomBounce.create = function create(id, vars) { - return _create(id, vars); - }; - - CustomBounce.register = function register(core) { - gsap = core; - - _initCore(); - }; - - return CustomBounce; -}(); -_getGSAP() && gsap.registerPlugin(CustomBounce); -CustomBounce.version = "3.11.0"; -export { CustomBounce as default }; \ No newline at end of file diff --git a/dist/lib/greensock/CustomEase.js b/dist/lib/greensock/CustomEase.js deleted file mode 100644 index 1ea97952..00000000 --- a/dist/lib/greensock/CustomEase.js +++ /dev/null @@ -1,371 +0,0 @@ -/*! - * CustomEase 3.11.0 - * https://greensock.com - * - * @license Copyright 2008-2022, GreenSock. All rights reserved. - * Subject to the terms at https://greensock.com/standard-license or for - * Club GreenSock members, the agreement issued with that membership. - * @author: Jack Doyle, jack@greensock.com -*/ - -/* eslint-disable */ -import { stringToRawPath, rawPathToString, transformRawPath } from "./utils/paths.js"; - -var gsap, - _coreInitted, - _getGSAP = function _getGSAP() { - return gsap || typeof window !== "undefined" && (gsap = window.gsap) && gsap.registerPlugin && gsap; -}, - _initCore = function _initCore() { - gsap = _getGSAP(); - - if (gsap) { - gsap.registerEase("_CE", CustomEase.create); - _coreInitted = 1; - } else { - console.warn("Please gsap.registerPlugin(CustomEase)"); - } -}, - _bigNum = 1e20, - _round = function _round(value) { - return ~~(value * 1000 + (value < 0 ? -.5 : .5)) / 1000; -}, - _bonusValidated = 1, - //CustomEase -_numExp = /[-+=\.]*\d+[\.e\-\+]*\d*[e\-\+]*\d*/gi, - //finds any numbers, including ones that start with += or -=, negative numbers, and ones in scientific notation like 1e-8. -_needsParsingExp = /[cLlsSaAhHvVtTqQ]/g, - _findMinimum = function _findMinimum(values) { - var l = values.length, - min = _bigNum, - i; - - for (i = 1; i < l; i += 6) { - +values[i] < min && (min = +values[i]); - } - - return min; -}, - //takes all the points and translates/scales them so that the x starts at 0 and ends at 1. -_normalize = function _normalize(values, height, originY) { - if (!originY && originY !== 0) { - originY = Math.max(+values[values.length - 1], +values[1]); - } - - var tx = +values[0] * -1, - ty = -originY, - l = values.length, - sx = 1 / (+values[l - 2] + tx), - sy = -height || (Math.abs(+values[l - 1] - +values[1]) < 0.01 * (+values[l - 2] - +values[0]) ? _findMinimum(values) + ty : +values[l - 1] + ty), - i; - - if (sy) { - //typically y ends at 1 (so that the end values are reached) - sy = 1 / sy; - } else { - //in case the ease returns to its beginning value, scale everything proportionally - sy = -sx; - } - - for (i = 0; i < l; i += 2) { - values[i] = (+values[i] + tx) * sx; - values[i + 1] = (+values[i + 1] + ty) * sy; - } -}, - //note that this function returns point objects like {x, y} rather than working with segments which are arrays with alternating x, y values as in the similar function in paths.js -_bezierToPoints = function _bezierToPoints(x1, y1, x2, y2, x3, y3, x4, y4, threshold, points, index) { - var x12 = (x1 + x2) / 2, - y12 = (y1 + y2) / 2, - x23 = (x2 + x3) / 2, - y23 = (y2 + y3) / 2, - x34 = (x3 + x4) / 2, - y34 = (y3 + y4) / 2, - x123 = (x12 + x23) / 2, - y123 = (y12 + y23) / 2, - x234 = (x23 + x34) / 2, - y234 = (y23 + y34) / 2, - x1234 = (x123 + x234) / 2, - y1234 = (y123 + y234) / 2, - dx = x4 - x1, - dy = y4 - y1, - d2 = Math.abs((x2 - x4) * dy - (y2 - y4) * dx), - d3 = Math.abs((x3 - x4) * dy - (y3 - y4) * dx), - length; - - if (!points) { - points = [{ - x: x1, - y: y1 - }, { - x: x4, - y: y4 - }]; - index = 1; - } - - points.splice(index || points.length - 1, 0, { - x: x1234, - y: y1234 - }); - - if ((d2 + d3) * (d2 + d3) > threshold * (dx * dx + dy * dy)) { - length = points.length; - - _bezierToPoints(x1, y1, x12, y12, x123, y123, x1234, y1234, threshold, points, index); - - _bezierToPoints(x1234, y1234, x234, y234, x34, y34, x4, y4, threshold, points, index + 1 + (points.length - length)); - } - - return points; -}; - -export var CustomEase = /*#__PURE__*/function () { - function CustomEase(id, data, config) { - _coreInitted || _initCore(); - this.id = id; - _bonusValidated && this.setData(data, config); - } - - var _proto = CustomEase.prototype; - - _proto.setData = function setData(data, config) { - config = config || {}; - data = data || "0,0,1,1"; - var values = data.match(_numExp), - closest = 1, - points = [], - lookup = [], - precision = config.precision || 1, - fast = precision <= 1, - l, - a1, - a2, - i, - inc, - j, - point, - prevPoint, - p; - this.data = data; - - if (_needsParsingExp.test(data) || ~data.indexOf("M") && data.indexOf("C") < 0) { - values = stringToRawPath(data)[0]; - } - - l = values.length; - - if (l === 4) { - values.unshift(0, 0); - values.push(1, 1); - l = 8; - } else if ((l - 2) % 6) { - throw "Invalid CustomEase"; - } - - if (+values[0] !== 0 || +values[l - 2] !== 1) { - _normalize(values, config.height, config.originY); - } - - this.segment = values; - - for (i = 2; i < l; i += 6) { - a1 = { - x: +values[i - 2], - y: +values[i - 1] - }; - a2 = { - x: +values[i + 4], - y: +values[i + 5] - }; - points.push(a1, a2); - - _bezierToPoints(a1.x, a1.y, +values[i], +values[i + 1], +values[i + 2], +values[i + 3], a2.x, a2.y, 1 / (precision * 200000), points, points.length - 1); - } - - l = points.length; - - for (i = 0; i < l; i++) { - point = points[i]; - prevPoint = points[i - 1] || point; - - if ((point.x > prevPoint.x || prevPoint.y !== point.y && prevPoint.x === point.x || point === prevPoint) && point.x <= 1) { - //if a point goes BACKWARD in time or is a duplicate, just drop it. Also it shouldn't go past 1 on the x axis, as could happen in a string like "M0,0 C0,0 0.12,0.68 0.18,0.788 0.195,0.845 0.308,1 0.32,1 0.403,1.005 0.398,1 0.5,1 0.602,1 0.816,1.005 0.9,1 0.91,1 0.948,0.69 0.962,0.615 1.003,0.376 1,0 1,0". - prevPoint.cx = point.x - prevPoint.x; //change in x between this point and the next point (performance optimization) - - prevPoint.cy = point.y - prevPoint.y; - prevPoint.n = point; - prevPoint.nx = point.x; //next point's x value (performance optimization, making lookups faster in getRatio()). Remember, the lookup will always land on a spot where it's either this point or the very next one (never beyond that) - - if (fast && i > 1 && Math.abs(prevPoint.cy / prevPoint.cx - points[i - 2].cy / points[i - 2].cx) > 2) { - //if there's a sudden change in direction, prioritize accuracy over speed. Like a bounce ease - you don't want to risk the sampling chunks landing on each side of the bounce anchor and having it clipped off. - fast = 0; - } - - if (prevPoint.cx < closest) { - if (!prevPoint.cx) { - prevPoint.cx = 0.001; //avoids math problems in getRatio() (dividing by zero) - - if (i === l - 1) { - //in case the final segment goes vertical RIGHT at the end, make sure we end at the end. - prevPoint.x -= 0.001; - closest = Math.min(closest, 0.001); - fast = 0; - } - } else { - closest = prevPoint.cx; - } - } - } else { - points.splice(i--, 1); - l--; - } - } - - l = 1 / closest + 1 | 0; - inc = 1 / l; - j = 0; - point = points[0]; - - if (fast) { - for (i = 0; i < l; i++) { - //for fastest lookups, we just sample along the path at equal x (time) distance. Uses more memory and is slightly less accurate for anchors that don't land on the sampling points, but for the vast majority of eases it's excellent (and fast). - p = i * inc; - - if (point.nx < p) { - point = points[++j]; - } - - a1 = point.y + (p - point.x) / point.cx * point.cy; - lookup[i] = { - x: p, - cx: inc, - y: a1, - cy: 0, - nx: 9 - }; - - if (i) { - lookup[i - 1].cy = a1 - lookup[i - 1].y; - } - } - - lookup[l - 1].cy = points[points.length - 1].y - a1; - } else { - //this option is more accurate, ensuring that EVERY anchor is hit perfectly. Clipping across a bounce, for example, would never happen. - for (i = 0; i < l; i++) { - //build a lookup table based on the smallest distance so that we can instantly find the appropriate point (well, it'll either be that point or the very next one). We'll look up based on the linear progress. So it's it's 0.5 and the lookup table has 100 elements, it'd be like lookup[Math.floor(0.5 * 100)] - if (point.nx < i * inc) { - point = points[++j]; - } - - lookup[i] = point; - } - - if (j < points.length - 1) { - lookup[i - 1] = points[points.length - 2]; - } - } //this._calcEnd = (points[points.length-1].y !== 1 || points[0].y !== 0); //ensures that we don't run into floating point errors. As long as we're starting at 0 and ending at 1, tell GSAP to skip the final calculation and use 0/1 as the factor. - - - this.ease = function (p) { - var point = lookup[p * l | 0] || lookup[l - 1]; - - if (point.nx < p) { - point = point.n; - } - - return point.y + (p - point.x) / point.cx * point.cy; - }; - - this.ease.custom = this; - this.id && gsap && gsap.registerEase(this.id, this.ease); - return this; - }; - - _proto.getSVGData = function getSVGData(config) { - return CustomEase.getSVGData(this, config); - }; - - CustomEase.create = function create(id, data, config) { - return new CustomEase(id, data, config).ease; - }; - - CustomEase.register = function register(core) { - gsap = core; - - _initCore(); - }; - - CustomEase.get = function get(id) { - return gsap.parseEase(id); - }; - - CustomEase.getSVGData = function getSVGData(ease, config) { - config = config || {}; - var width = config.width || 100, - height = config.height || 100, - x = config.x || 0, - y = (config.y || 0) + height, - e = gsap.utils.toArray(config.path)[0], - a, - slope, - i, - inc, - tx, - ty, - precision, - threshold, - prevX, - prevY; - - if (config.invert) { - height = -height; - y = 0; - } - - if (typeof ease === "string") { - ease = gsap.parseEase(ease); - } - - if (ease.custom) { - ease = ease.custom; - } - - if (ease instanceof CustomEase) { - a = rawPathToString(transformRawPath([ease.segment], width, 0, 0, -height, x, y)); - } else { - a = [x, y]; - precision = Math.max(5, (config.precision || 1) * 200); - inc = 1 / precision; - precision += 2; - threshold = 5 / precision; - prevX = _round(x + inc * width); - prevY = _round(y + ease(inc) * -height); - slope = (prevY - y) / (prevX - x); - - for (i = 2; i < precision; i++) { - tx = _round(x + i * inc * width); - ty = _round(y + ease(i * inc) * -height); - - if (Math.abs((ty - prevY) / (tx - prevX) - slope) > threshold || i === precision - 1) { - //only add points when the slope changes beyond the threshold - a.push(prevX, prevY); - slope = (ty - prevY) / (tx - prevX); - } - - prevX = tx; - prevY = ty; - } - - a = "M" + a.join(","); - } - - e && e.setAttribute("d", a); - return a; - }; - - return CustomEase; -}(); -_getGSAP() && gsap.registerPlugin(CustomEase); -CustomEase.version = "3.11.0"; -export { CustomEase as default }; \ No newline at end of file diff --git a/dist/lib/greensock/CustomWiggle.js b/dist/lib/greensock/CustomWiggle.js deleted file mode 100644 index ee3c56e3..00000000 --- a/dist/lib/greensock/CustomWiggle.js +++ /dev/null @@ -1,162 +0,0 @@ -/*! - * CustomWiggle 3.11.0 - * https://greensock.com - * - * @license Copyright 2008-2022, GreenSock. All rights reserved. - * Subject to the terms at https://greensock.com/standard-license or for - * Club GreenSock members, the agreement issued with that membership. - * @author: Jack Doyle, jack@greensock.com -*/ - -/* eslint-disable */ -var gsap, - _coreInitted, - createCustomEase, - _getGSAP = function _getGSAP() { - return gsap || typeof window !== "undefined" && (gsap = window.gsap) && gsap.registerPlugin && gsap; -}, - _eases = { - easeOut: "M0,1,C0.7,1,0.6,0,1,0", - easeInOut: "M0,0,C0.1,0,0.24,1,0.444,1,0.644,1,0.6,0,1,0", - anticipate: "M0,0,C0,0.222,0.024,0.386,0,0.4,0.18,0.455,0.65,0.646,0.7,0.67,0.9,0.76,1,0.846,1,1", - uniform: "M0,0,C0,0.95,0,1,0,1,0,1,1,1,1,1,1,1,1,0,1,0" -}, - _linearEase = function _linearEase(p) { - return p; -}, - _initCore = function _initCore(required) { - if (!_coreInitted) { - gsap = _getGSAP(); - createCustomEase = gsap && gsap.parseEase("_CE"); - - if (createCustomEase) { - for (var p in _eases) { - _eases[p] = createCustomEase("", _eases[p]); - } - - _coreInitted = 1; - - _create("wiggle").config = function (vars) { - return typeof vars === "object" ? _create("", vars) : _create("wiggle(" + vars + ")", { - wiggles: +vars - }); - }; - } else { - required && console.warn("Please gsap.registerPlugin(CustomEase, CustomWiggle)"); - } - } -}, - _parseEase = function _parseEase(ease, invertNonCustomEases) { - if (typeof ease !== "function") { - ease = gsap.parseEase(ease) || createCustomEase("", ease); - } - - return ease.custom || !invertNonCustomEases ? ease : function (p) { - return 1 - ease(p); - }; -}, - _bonusValidated = 1, - //CustomWiggle -_create = function _create(id, vars) { - if (!_coreInitted) { - _initCore(1); - } - - vars = vars || {}; - var wiggles = (vars.wiggles || 10) | 0, - inc = 1 / wiggles, - x = inc / 2, - anticipate = vars.type === "anticipate", - yEase = _eases[vars.type] || _eases.easeOut, - xEase = _linearEase, - rnd = 1000, - nextX, - nextY, - angle, - handleX, - handleY, - easedX, - y, - path, - i; - - if (_bonusValidated) { - if (anticipate) { - //the anticipate ease is actually applied on the x-axis (timing) and uses easeOut for amplitude. - xEase = yEase; - yEase = _eases.easeOut; - } - - if (vars.timingEase) { - xEase = _parseEase(vars.timingEase); - } - - if (vars.amplitudeEase) { - yEase = _parseEase(vars.amplitudeEase, true); - } - - easedX = xEase(x); - y = anticipate ? -yEase(x) : yEase(x); - path = [0, 0, easedX / 4, 0, easedX / 2, y, easedX, y]; - - if (vars.type === "random") { - //if we just select random values on the y-axis and plug them into the "normal" algorithm, since the control points are always straight horizontal, it creates a bit of a slowdown at each anchor which just didn't seem as desirable, so we switched to an algorithm that bends the control points to be more in line with their context. - path.length = 4; - nextX = xEase(inc); - nextY = Math.random() * 2 - 1; - - for (i = 2; i < wiggles; i++) { - x = nextX; - y = nextY; - nextX = xEase(inc * i); - nextY = Math.random() * 2 - 1; - angle = Math.atan2(nextY - path[path.length - 3], nextX - path[path.length - 4]); - handleX = Math.cos(angle) * inc; - handleY = Math.sin(angle) * inc; - path.push(x - handleX, y - handleY, x, y, x + handleX, y + handleY); - } - - path.push(nextX, 0, 1, 0); - } else { - for (i = 1; i < wiggles; i++) { - path.push(xEase(x + inc / 2), y); - x += inc; - y = (y > 0 ? -1 : 1) * yEase(i * inc); - easedX = xEase(x); - path.push(xEase(x - inc / 2), y, easedX, y); - } - - path.push(xEase(x + inc / 4), y, xEase(x + inc / 4), 0, 1, 0); - } - - i = path.length; - - while (--i > -1) { - path[i] = ~~(path[i] * rnd) / rnd; //round values to avoid odd strings for super tiny values - } - - path[2] = "C" + path[2]; - return createCustomEase(id, "M" + path.join(",")); - } -}; - -export var CustomWiggle = /*#__PURE__*/function () { - function CustomWiggle(id, vars) { - this.ease = _create(id, vars); - } - - CustomWiggle.create = function create(id, vars) { - return _create(id, vars); - }; - - CustomWiggle.register = function register(core) { - gsap = core; - - _initCore(); - }; - - return CustomWiggle; -}(); -_getGSAP() && gsap.registerPlugin(CustomWiggle); -CustomWiggle.version = "3.11.0"; -export { CustomWiggle as default }; \ No newline at end of file diff --git a/dist/lib/greensock/Draggable.js b/dist/lib/greensock/Draggable.js deleted file mode 100644 index 6826519c..00000000 --- a/dist/lib/greensock/Draggable.js +++ /dev/null @@ -1,2670 +0,0 @@ -function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } - -function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; subClass.__proto__ = superClass; } - -/*! - * Draggable 3.11.0 - * https://greensock.com - * - * @license Copyright 2008-2022, GreenSock. All rights reserved. - * Subject to the terms at https://greensock.com/standard-license or for - * Club GreenSock members, the agreement issued with that membership. - * @author: Jack Doyle, jack@greensock.com - */ - -/* eslint-disable */ -import { getGlobalMatrix, Matrix2D } from "./utils/matrix.js"; - -var gsap, - _win, - _doc, - _docElement, - _body, - _tempDiv, - _placeholderDiv, - _coreInitted, - _checkPrefix, - _toArray, - _supportsPassive, - _isTouchDevice, - _touchEventLookup, - _dragCount, - _isMultiTouching, - _isAndroid, - InertiaPlugin, - _defaultCursor, - _supportsPointer, - _windowExists = function _windowExists() { - return typeof window !== "undefined"; -}, - _getGSAP = function _getGSAP() { - return gsap || _windowExists() && (gsap = window.gsap) && gsap.registerPlugin && gsap; -}, - _isFunction = function _isFunction(value) { - return typeof value === "function"; -}, - _isObject = function _isObject(value) { - return typeof value === "object"; -}, - _isUndefined = function _isUndefined(value) { - return typeof value === "undefined"; -}, - _emptyFunc = function _emptyFunc() { - return false; -}, - _transformProp = "transform", - _transformOriginProp = "transformOrigin", - _round = function _round(value) { - return Math.round(value * 10000) / 10000; -}, - _isArray = Array.isArray, - _createElement = function _createElement(type, ns) { - var e = _doc.createElementNS ? _doc.createElementNS((ns || "http://www.w3.org/1999/xhtml").replace(/^https/, "http"), type) : _doc.createElement(type); //some servers swap in https for http in the namespace which can break things, making "style" inaccessible. - - return e.style ? e : _doc.createElement(type); //some environments won't allow access to the element's style when created with a namespace in which case we default to the standard createElement() to work around the issue. Also note that when GSAP is embedded directly inside an SVG file, createElement() won't allow access to the style object in Firefox (see https://greensock.com/forums/topic/20215-problem-using-tweenmax-in-standalone-self-containing-svg-file-err-cannot-set-property-csstext-of-undefined/). -}, - _RAD2DEG = 180 / Math.PI, - _bigNum = 1e20, - _identityMatrix = new Matrix2D(), - _getTime = Date.now || function () { - return new Date().getTime(); -}, - _renderQueue = [], - _lookup = {}, - //when a Draggable is created, the target gets a unique _gsDragID property that allows gets associated with the Draggable instance for quick lookups in Draggable.get(). This avoids circular references that could cause gc problems. -_lookupCount = 0, - _clickableTagExp = /^(?:a|input|textarea|button|select)$/i, - _lastDragTime = 0, - _temp1 = {}, - // a simple object we reuse and populate (usually x/y properties) to conserve memory and improve performance. -_windowProxy = {}, - //memory/performance optimization - we reuse this object during autoScroll to store window-related bounds/offsets. -_copy = function _copy(obj, factor) { - var copy = {}, - p; - - for (p in obj) { - copy[p] = factor ? obj[p] * factor : obj[p]; - } - - return copy; -}, - _extend = function _extend(obj, defaults) { - for (var p in defaults) { - if (!(p in obj)) { - obj[p] = defaults[p]; - } - } - - return obj; -}, - _setTouchActionForAllDescendants = function _setTouchActionForAllDescendants(elements, value) { - var i = elements.length, - children; - - while (i--) { - value ? elements[i].style.touchAction = value : elements[i].style.removeProperty("touch-action"); - children = elements[i].children; - children && children.length && _setTouchActionForAllDescendants(children, value); - } -}, - _renderQueueTick = function _renderQueueTick() { - return _renderQueue.forEach(function (func) { - return func(); - }); -}, - _addToRenderQueue = function _addToRenderQueue(func) { - _renderQueue.push(func); - - if (_renderQueue.length === 1) { - gsap.ticker.add(_renderQueueTick); - } -}, - _renderQueueTimeout = function _renderQueueTimeout() { - return !_renderQueue.length && gsap.ticker.remove(_renderQueueTick); -}, - _removeFromRenderQueue = function _removeFromRenderQueue(func) { - var i = _renderQueue.length; - - while (i--) { - if (_renderQueue[i] === func) { - _renderQueue.splice(i, 1); - } - } - - gsap.to(_renderQueueTimeout, { - overwrite: true, - delay: 15, - duration: 0, - onComplete: _renderQueueTimeout, - data: "_draggable" - }); //remove the "tick" listener only after the render queue is empty for 15 seconds (to improve performance). Adding/removing it constantly for every click/touch wouldn't deliver optimal speed, and we also don't want the ticker to keep calling the render method when things are idle for long periods of time (we want to improve battery life on mobile devices). -}, - _setDefaults = function _setDefaults(obj, defaults) { - for (var p in defaults) { - if (!(p in obj)) { - obj[p] = defaults[p]; - } - } - - return obj; -}, - _addListener = function _addListener(element, type, func, capture) { - if (element.addEventListener) { - var touchType = _touchEventLookup[type]; - capture = capture || (_supportsPassive ? { - passive: false - } : null); - element.addEventListener(touchType || type, func, capture); - touchType && type !== touchType && element.addEventListener(type, func, capture); //some browsers actually support both, so must we. But pointer events cover all. - } -}, - _removeListener = function _removeListener(element, type, func) { - if (element.removeEventListener) { - var touchType = _touchEventLookup[type]; - element.removeEventListener(touchType || type, func); - touchType && type !== touchType && element.removeEventListener(type, func); - } -}, - _preventDefault = function _preventDefault(event) { - event.preventDefault && event.preventDefault(); - event.preventManipulation && event.preventManipulation(); //for some Microsoft browsers -}, - _hasTouchID = function _hasTouchID(list, ID) { - var i = list.length; - - while (i--) { - if (list[i].identifier === ID) { - return true; - } - } -}, - _onMultiTouchDocumentEnd = function _onMultiTouchDocumentEnd(event) { - _isMultiTouching = event.touches && _dragCount < event.touches.length; - - _removeListener(event.target, "touchend", _onMultiTouchDocumentEnd); -}, - _onMultiTouchDocument = function _onMultiTouchDocument(event) { - _isMultiTouching = event.touches && _dragCount < event.touches.length; - - _addListener(event.target, "touchend", _onMultiTouchDocumentEnd); -}, - _getDocScrollTop = function _getDocScrollTop(doc) { - return _win.pageYOffset || doc.scrollTop || doc.documentElement.scrollTop || doc.body.scrollTop || 0; -}, - _getDocScrollLeft = function _getDocScrollLeft(doc) { - return _win.pageXOffset || doc.scrollLeft || doc.documentElement.scrollLeft || doc.body.scrollLeft || 0; -}, - _addScrollListener = function _addScrollListener(e, callback) { - _addListener(e, "scroll", callback); - - if (!_isRoot(e.parentNode)) { - _addScrollListener(e.parentNode, callback); - } -}, - _removeScrollListener = function _removeScrollListener(e, callback) { - _removeListener(e, "scroll", callback); - - if (!_isRoot(e.parentNode)) { - _removeScrollListener(e.parentNode, callback); - } -}, - _isRoot = function _isRoot(e) { - return !!(!e || e === _docElement || e.nodeType === 9 || e === _doc.body || e === _win || !e.nodeType || !e.parentNode); -}, - _getMaxScroll = function _getMaxScroll(element, axis) { - var dim = axis === "x" ? "Width" : "Height", - scroll = "scroll" + dim, - client = "client" + dim; - return Math.max(0, _isRoot(element) ? Math.max(_docElement[scroll], _body[scroll]) - (_win["inner" + dim] || _docElement[client] || _body[client]) : element[scroll] - element[client]); -}, - _recordMaxScrolls = function _recordMaxScrolls(e, skipCurrent) { - //records _gsMaxScrollX and _gsMaxScrollY properties for the element and all ancestors up the chain so that we can cap it, otherwise dragging beyond the edges with autoScroll on can endlessly scroll. - var x = _getMaxScroll(e, "x"), - y = _getMaxScroll(e, "y"); - - if (_isRoot(e)) { - e = _windowProxy; - } else { - _recordMaxScrolls(e.parentNode, skipCurrent); - } - - e._gsMaxScrollX = x; - e._gsMaxScrollY = y; - - if (!skipCurrent) { - e._gsScrollX = e.scrollLeft || 0; - e._gsScrollY = e.scrollTop || 0; - } -}, - _setStyle = function _setStyle(element, property, value) { - var style = element.style; - - if (!style) { - return; - } - - if (_isUndefined(style[property])) { - property = _checkPrefix(property, element) || property; - } - - if (value == null) { - style.removeProperty && style.removeProperty(property.replace(/([A-Z])/g, "-$1").toLowerCase()); - } else { - style[property] = value; - } -}, - _getComputedStyle = function _getComputedStyle(element) { - return _win.getComputedStyle(element instanceof Element ? element : element.host || (element.parentNode || {}).host || element); -}, - //the "host" stuff helps to accommodate ShadowDom objects. -_tempRect = {}, - //reuse to reduce garbage collection tasks -_parseRect = function _parseRect(e) { - //accepts a DOM element, a mouse event, or a rectangle object and returns the corresponding rectangle with left, right, width, height, top, and bottom properties - if (e === _win) { - _tempRect.left = _tempRect.top = 0; - _tempRect.width = _tempRect.right = _docElement.clientWidth || e.innerWidth || _body.clientWidth || 0; - _tempRect.height = _tempRect.bottom = (e.innerHeight || 0) - 20 < _docElement.clientHeight ? _docElement.clientHeight : e.innerHeight || _body.clientHeight || 0; - return _tempRect; - } - - var doc = e.ownerDocument || _doc, - r = !_isUndefined(e.pageX) ? { - left: e.pageX - _getDocScrollLeft(doc), - top: e.pageY - _getDocScrollTop(doc), - right: e.pageX - _getDocScrollLeft(doc) + 1, - bottom: e.pageY - _getDocScrollTop(doc) + 1 - } : !e.nodeType && !_isUndefined(e.left) && !_isUndefined(e.top) ? e : _toArray(e)[0].getBoundingClientRect(); - - if (_isUndefined(r.right) && !_isUndefined(r.width)) { - r.right = r.left + r.width; - r.bottom = r.top + r.height; - } else if (_isUndefined(r.width)) { - //some browsers don't include width and height properties. We can't just set them directly on r because some browsers throw errors, so create a new generic object. - r = { - width: r.right - r.left, - height: r.bottom - r.top, - right: r.right, - left: r.left, - bottom: r.bottom, - top: r.top - }; - } - - return r; -}, - _dispatchEvent = function _dispatchEvent(target, type, callbackName) { - var vars = target.vars, - callback = vars[callbackName], - listeners = target._listeners[type], - result; - - if (_isFunction(callback)) { - result = callback.apply(vars.callbackScope || target, vars[callbackName + "Params"] || [target.pointerEvent]); - } - - if (listeners && target.dispatchEvent(type) === false) { - result = false; - } - - return result; -}, - _getBounds = function _getBounds(target, context) { - //accepts any of the following: a DOM element, jQuery object, selector text, or an object defining bounds as {top, left, width, height} or {minX, maxX, minY, maxY}. Returns an object with left, top, width, and height properties. - var e = _toArray(target)[0], - top, - left, - offset; - - if (!e.nodeType && e !== _win) { - if (!_isUndefined(target.left)) { - offset = { - x: 0, - y: 0 - }; //_getOffsetTransformOrigin(context); //the bounds should be relative to the origin - - return { - left: target.left - offset.x, - top: target.top - offset.y, - width: target.width, - height: target.height - }; - } - - left = target.min || target.minX || target.minRotation || 0; - top = target.min || target.minY || 0; - return { - left: left, - top: top, - width: (target.max || target.maxX || target.maxRotation || 0) - left, - height: (target.max || target.maxY || 0) - top - }; - } - - return _getElementBounds(e, context); -}, - _point1 = {}, - //we reuse to minimize garbage collection tasks. -_getElementBounds = function _getElementBounds(element, context) { - context = _toArray(context)[0]; - var isSVG = element.getBBox && element.ownerSVGElement, - doc = element.ownerDocument || _doc, - left, - right, - top, - bottom, - matrix, - p1, - p2, - p3, - p4, - bbox, - width, - height, - cs; - - if (element === _win) { - top = _getDocScrollTop(doc); - left = _getDocScrollLeft(doc); - right = left + (doc.documentElement.clientWidth || element.innerWidth || doc.body.clientWidth || 0); - bottom = top + ((element.innerHeight || 0) - 20 < doc.documentElement.clientHeight ? doc.documentElement.clientHeight : element.innerHeight || doc.body.clientHeight || 0); //some browsers (like Firefox) ignore absolutely positioned elements, and collapse the height of the documentElement, so it could be 8px, for example, if you have just an absolutely positioned div. In that case, we use the innerHeight to resolve this. - } else if (context === _win || _isUndefined(context)) { - return element.getBoundingClientRect(); - } else { - left = top = 0; - - if (isSVG) { - bbox = element.getBBox(); - width = bbox.width; - height = bbox.height; - } else { - if (element.viewBox && (bbox = element.viewBox.baseVal)) { - left = bbox.x || 0; - top = bbox.y || 0; - width = bbox.width; - height = bbox.height; - } - - if (!width) { - cs = _getComputedStyle(element); - bbox = cs.boxSizing === "border-box"; - width = (parseFloat(cs.width) || element.clientWidth || 0) + (bbox ? 0 : parseFloat(cs.borderLeftWidth) + parseFloat(cs.borderRightWidth)); - height = (parseFloat(cs.height) || element.clientHeight || 0) + (bbox ? 0 : parseFloat(cs.borderTopWidth) + parseFloat(cs.borderBottomWidth)); - } - } - - right = width; - bottom = height; - } - - if (element === context) { - return { - left: left, - top: top, - width: right - left, - height: bottom - top - }; - } - - matrix = getGlobalMatrix(context, true).multiply(getGlobalMatrix(element)); - p1 = matrix.apply({ - x: left, - y: top - }); - p2 = matrix.apply({ - x: right, - y: top - }); - p3 = matrix.apply({ - x: right, - y: bottom - }); - p4 = matrix.apply({ - x: left, - y: bottom - }); - left = Math.min(p1.x, p2.x, p3.x, p4.x); - top = Math.min(p1.y, p2.y, p3.y, p4.y); - return { - left: left, - top: top, - width: Math.max(p1.x, p2.x, p3.x, p4.x) - left, - height: Math.max(p1.y, p2.y, p3.y, p4.y) - top - }; -}, - _parseInertia = function _parseInertia(draggable, snap, max, min, factor, forceZeroVelocity) { - var vars = {}, - a, - i, - l; - - if (snap) { - if (factor !== 1 && snap instanceof Array) { - //some data must be altered to make sense, like if the user passes in an array of rotational values in degrees, we must convert it to radians. Or for scrollLeft and scrollTop, we invert the values. - vars.end = a = []; - l = snap.length; - - if (_isObject(snap[0])) { - //if the array is populated with objects, like points ({x:100, y:200}), make copies before multiplying by the factor, otherwise we'll mess up the originals and the user may reuse it elsewhere. - for (i = 0; i < l; i++) { - a[i] = _copy(snap[i], factor); - } - } else { - for (i = 0; i < l; i++) { - a[i] = snap[i] * factor; - } - } - - max += 1.1; //allow 1.1 pixels of wiggle room when snapping in order to work around some browser inconsistencies in the way bounds are reported which can make them roughly a pixel off. For example, if "snap:[-$('#menu').width(), 0]" was defined and #menu had a wrapper that was used as the bounds, some browsers would be one pixel off, making the minimum -752 for example when snap was [-753,0], thus instead of snapping to -753, it would snap to 0 since -753 was below the minimum. - - min -= 1.1; - } else if (_isFunction(snap)) { - vars.end = function (value) { - var result = snap.call(draggable, value), - copy, - p; - - if (factor !== 1) { - if (_isObject(result)) { - copy = {}; - - for (p in result) { - copy[p] = result[p] * factor; - } - - result = copy; - } else { - result *= factor; - } - } - - return result; //we need to ensure that we can scope the function call to the Draggable instance itself so that users can access important values like maxX, minX, maxY, minY, x, and y from within that function. - }; - } else { - vars.end = snap; - } - } - - if (max || max === 0) { - vars.max = max; - } - - if (min || min === 0) { - vars.min = min; - } - - if (forceZeroVelocity) { - vars.velocity = 0; - } - - return vars; -}, - _isClickable = function _isClickable(element) { - //sometimes it's convenient to mark an element as clickable by adding a data-clickable="true" attribute (in which case we won't preventDefault() the mouse/touch event). This method checks if the element is an , , or