From bedb7b07f5e604da59392fce9c2e38f0b0d897a4 Mon Sep 17 00:00:00 2001 From: sharkykh Date: Fri, 5 Jul 2019 12:14:38 +0300 Subject: [PATCH] [bundle] --- themes/dark/assets/js/medusa-runtime.js | 6 +++--- themes/dark/templates/addShows_addExistingShow.mako | 9 +++++++-- themes/dark/templates/addShows_recommended.mako | 10 +++++++++- themes/dark/templates/addShows_trendingShows.mako | 10 +++++++++- themes/dark/templates/inc_addShowOptions.mako | 2 +- themes/dark/templates/manage_massEdit.mako | 9 +++++++++ themes/light/assets/js/medusa-runtime.js | 6 +++--- themes/light/templates/addShows_addExistingShow.mako | 9 +++++++-- themes/light/templates/addShows_recommended.mako | 10 +++++++++- themes/light/templates/addShows_trendingShows.mako | 10 +++++++++- themes/light/templates/inc_addShowOptions.mako | 2 +- themes/light/templates/manage_massEdit.mako | 9 +++++++++ 12 files changed, 76 insertions(+), 16 deletions(-) diff --git a/themes/dark/assets/js/medusa-runtime.js b/themes/dark/assets/js/medusa-runtime.js index 4a7d91d406..88767e1846 100644 --- a/themes/dark/assets/js/medusa-runtime.js +++ b/themes/dark/assets/js/medusa-runtime.js @@ -248,7 +248,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* WEBPACK VAR INJECTION */(f /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var vuex__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vuex */ \"./node_modules/vuex/dist/vuex.esm.js\");\n/* harmony import */ var _api__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../api */ \"./src/api.js\");\n/* harmony import */ var _utils_core__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../utils/core */ \"./src/utils/core.js\");\n/* harmony import */ var _app_link__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./app-link */ \"./src/components/helpers/app-link.vue\");\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === 'function') { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function (key) { _defineProperty(target, key, source[key]); }); } return target; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n name: 'quality-chooser',\n components: {\n AppLink: _app_link__WEBPACK_IMPORTED_MODULE_3__[\"default\"]\n },\n props: {\n overallQuality: {\n type: Number,\n default: window.qualityChooserInitialQuality\n },\n keep: {\n type: String,\n default: null,\n validator: value => ['keep', 'show'].includes(value)\n },\n showSlug: {\n type: String\n }\n },\n\n data() {\n return {\n // eslint-disable-next-line no-warning-comments\n lock: false,\n // FIXME: Remove this hack, see `watch.overallQuality` below\n allowedQualities: [],\n preferredQualities: [],\n curQualityPreset: null,\n archive: false,\n archivedStatus: '',\n archiveButton: {\n text: 'Archive episodes',\n disabled: false\n }\n };\n },\n\n computed: _objectSpread({}, Object(vuex__WEBPACK_IMPORTED_MODULE_0__[\"mapState\"])({\n qualityValues: state => state.consts.qualities.values,\n qualityPresets: state => state.consts.qualities.presets,\n defaultQuality: state => state.config.showDefaults.quality\n }), Object(vuex__WEBPACK_IMPORTED_MODULE_0__[\"mapGetters\"])(['getQualityPreset', 'splitQuality']), {\n initialQuality() {\n return this.overallQuality === undefined ? this.defaultQuality : this.overallQuality;\n },\n\n selectedQualityPreset: {\n get() {\n return this.curQualityPreset;\n },\n\n set(newValue) {\n const {\n curQualityPreset,\n setQualityFromPreset\n } = this; // If an array was provided - initial or update from parent: [newPreset, oldPreset]\n // If a single value was provided - updated using select box: [newPreset, currentPreset]\n\n const [newPreset, currentPreset] = Array.isArray(newValue) ? newValue : [newValue, curQualityPreset];\n setQualityFromPreset(newPreset, currentPreset);\n this.curQualityPreset = newPreset;\n }\n\n },\n\n explanation() {\n const {\n allowedQualities,\n preferredQualities,\n qualityValues\n } = this;\n return qualityValues.reduce((result, {\n value,\n name\n }) => {\n const isPreferred = preferredQualities.includes(value); // If this quality is preferred but not allowed, add it to allowed\n\n if (allowedQualities.includes(value) || isPreferred) {\n result.allowed.push(name);\n }\n\n if (isPreferred) {\n result.preferred.push(name);\n }\n\n return result;\n }, {\n allowed: [],\n preferred: []\n });\n },\n\n validQualities() {\n return this.qualityValues.filter(({\n key\n }) => key !== 'na');\n }\n\n }),\n asyncComputed: {\n async backloggedEpisodes() {\n const {\n showSlug,\n allowedQualities,\n preferredQualities\n } = this; // Skip if no showSlug, as that means we're on a addShow page\n\n if (!showSlug) {\n return {};\n } // Skip if no qualities are selected\n\n\n if (allowedQualities.length === 0 && preferredQualities.length === 0) {\n return {};\n }\n\n const url = \"series/\".concat(showSlug, \"/legacy/backlogged\");\n const params = {\n allowed: allowedQualities.join(','),\n preferred: preferredQualities.join(',')\n };\n let status = false; // Set to `false` for red text, `true` for normal color\n\n let response;\n\n try {\n response = await _api__WEBPACK_IMPORTED_MODULE_1__[\"api\"].get(url, {\n params\n });\n } catch (error) {\n return {\n status,\n html: 'Failed to get backlog prediction
' + String(error)\n };\n }\n\n const newBacklogged = response.data.new;\n const existingBacklogged = response.data.existing;\n const variation = Math.abs(newBacklogged - existingBacklogged);\n let html = 'Current backlog: ' + existingBacklogged + ' episodes
';\n\n if (newBacklogged === -1 || existingBacklogged === -1) {\n html = 'No qualities selected';\n } else if (newBacklogged === existingBacklogged) {\n html += \"This change won't affect your backlogged episodes\";\n status = true;\n } else {\n html += '
New backlog: ' + newBacklogged + ' episodes';\n html += '

';\n let change = '';\n\n if (newBacklogged > existingBacklogged) {\n html += 'WARNING: ';\n change = 'increase'; // Only show the archive action div if we have backlog increase\n\n this.archive = true;\n } else {\n change = 'decrease';\n }\n\n html += 'Backlog will ' + change + ' by ' + variation + ' episodes.';\n }\n\n return {\n status,\n html\n };\n }\n\n },\n\n mounted() {\n this.setInitialPreset(this.initialQuality);\n },\n\n methods: {\n isQualityPreset(quality) {\n return this.getQualityPreset({\n value: quality\n }) !== undefined;\n },\n\n async setInitialPreset(preset) {\n // Wait for the store to get populated.\n await Object(_utils_core__WEBPACK_IMPORTED_MODULE_2__[\"waitFor\"])(() => this.qualityValues.length > 0, 100, 3000);\n const {\n isQualityPreset,\n keep\n } = this;\n const newPreset = keep === 'keep' ? 'keep' : isQualityPreset(preset) ? preset : 0;\n this.selectedQualityPreset = [newPreset, preset];\n },\n\n async archiveEpisodes() {\n this.archivedStatus = 'Archiving...';\n const url = \"series/\".concat(this.showSlug, \"/operation\");\n const response = await _api__WEBPACK_IMPORTED_MODULE_1__[\"api\"].post(url, {\n type: 'ARCHIVE_EPISODES'\n });\n\n if (response.status === 201) {\n this.archivedStatus = 'Successfully archived episodes'; // Recalculate backlogged episodes after we archive it\n\n this.$asyncComputed.backloggedEpisodes.update();\n } else if (response.status === 204) {\n this.archivedStatus = 'No episodes to be archived';\n } // Restore button text\n\n\n this.archiveButton.text = 'Finished';\n this.archiveButton.disabled = true;\n },\n\n setQualityFromPreset(preset, oldPreset) {\n // If empty skip\n if (preset === undefined || preset === null) {\n return;\n } // [Mass Edit] If changing to/from `keep`, restore the original value\n\n\n if ([preset, oldPreset].some(val => val === 'keep')) {\n preset = this.initialQuality; // If preset is custom, set to last preset (provided it's not null)\n } else if ((preset === 0 || !this.isQualityPreset(preset)) && oldPreset !== null) {\n preset = oldPreset;\n }\n\n const {\n allowed,\n preferred\n } = this.splitQuality(preset);\n this.allowedQualities = allowed;\n this.preferredQualities = preferred;\n }\n\n },\n watch: {\n // eslint-disable-next-line no-warning-comments\n\n /*\n FIXME: Remove this watch and the `this.lock` hack.\n This is causing the preset selector to change from `Custom` to a preset,\n when the correct qualities for that preset are selected.\n */\n overallQuality(newValue) {\n if (!this.lock) {\n this.setInitialPreset(newValue);\n }\n },\n\n /* eslint-disable no-warning-comments */\n allowedQualities(newQuality) {\n // Deselecting all allowed qualities clears the preferred selection\n if (newQuality.length === 0 && this.preferredQualities.length > 0) {\n this.preferredQualities = [];\n }\n\n this.lock = true; // FIXME: Remove this hack, see above\n\n this.$emit('update:quality:allowed', newQuality); // FIXME: Remove this hack, see above\n\n this.$nextTick(() => {\n this.lock = false;\n });\n },\n\n preferredQualities(newQuality) {\n this.lock = true; // FIXME: Remove this hack, see above\n\n this.$emit('update:quality:preferred', newQuality); // FIXME: Remove this hack, see above\n\n this.$nextTick(() => {\n this.lock = false;\n });\n }\n /* eslint-enable no-warning-comments */\n\n\n }\n});\n\n//# sourceURL=webpack:///./src/components/helpers/quality-chooser.vue?./node_modules/babel-loader/lib!./node_modules/vue-loader/lib??vue-loader-options"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var vuex__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vuex */ \"./node_modules/vuex/dist/vuex.esm.js\");\n/* harmony import */ var _api__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../api */ \"./src/api.js\");\n/* harmony import */ var _app_link__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./app-link */ \"./src/components/helpers/app-link.vue\");\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === 'function') { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function (key) { _defineProperty(target, key, source[key]); }); } return target; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n name: 'quality-chooser',\n components: {\n AppLink: _app_link__WEBPACK_IMPORTED_MODULE_2__[\"default\"]\n },\n props: {\n overallQuality: {\n type: Number,\n default: window.qualityChooserInitialQuality\n },\n keep: {\n type: String,\n default: null,\n validator: value => ['keep', 'show'].includes(value)\n },\n showSlug: {\n type: String\n }\n },\n\n data() {\n return {\n // eslint-disable-next-line no-warning-comments\n lock: false,\n // FIXME: Remove this hack, see `watch.overallQuality` below\n allowedQualities: [],\n preferredQualities: [],\n curQualityPreset: null,\n archive: false,\n archivedStatus: '',\n archiveButton: {\n text: 'Archive episodes',\n disabled: false\n }\n };\n },\n\n computed: _objectSpread({}, Object(vuex__WEBPACK_IMPORTED_MODULE_0__[\"mapState\"])({\n qualityValues: state => state.consts.qualities.values,\n qualityPresets: state => state.consts.qualities.presets,\n defaultQuality: state => state.config.showDefaults.quality\n }), Object(vuex__WEBPACK_IMPORTED_MODULE_0__[\"mapGetters\"])(['getQualityPreset', 'splitQuality']), {\n initialQuality() {\n return this.overallQuality === undefined ? this.defaultQuality : this.overallQuality;\n },\n\n selectedQualityPreset: {\n get() {\n return this.curQualityPreset;\n },\n\n set(newValue) {\n const {\n curQualityPreset,\n setQualityFromPreset\n } = this; // If an array was provided - initial or update from parent: [newPreset, oldPreset]\n // If a single value was provided - updated using select box: [newPreset, currentPreset]\n\n const [newPreset, currentPreset] = Array.isArray(newValue) ? newValue : [newValue, curQualityPreset];\n setQualityFromPreset(newPreset, currentPreset);\n this.curQualityPreset = newPreset;\n }\n\n },\n\n explanation() {\n const {\n allowedQualities,\n preferredQualities,\n qualityValues\n } = this;\n return qualityValues.reduce((result, {\n value,\n name\n }) => {\n const isPreferred = preferredQualities.includes(value); // If this quality is preferred but not allowed, add it to allowed\n\n if (allowedQualities.includes(value) || isPreferred) {\n result.allowed.push(name);\n }\n\n if (isPreferred) {\n result.preferred.push(name);\n }\n\n return result;\n }, {\n allowed: [],\n preferred: []\n });\n },\n\n validQualities() {\n return this.qualityValues.filter(({\n key\n }) => key !== 'na');\n }\n\n }),\n asyncComputed: {\n async backloggedEpisodes() {\n const {\n showSlug,\n allowedQualities,\n preferredQualities\n } = this; // Skip if no showSlug, as that means we're on a addShow page\n\n if (!showSlug) {\n return null;\n } // Skip if no qualities are selected\n\n\n if (allowedQualities.length + preferredQualities.length === 0) {\n return null;\n }\n\n const url = \"series/\".concat(showSlug, \"/legacy/backlogged\");\n const params = {\n allowed: allowedQualities.join(','),\n preferred: preferredQualities.join(',')\n };\n let status = false; // Set to `false` for red text, `true` for normal color\n\n let response;\n\n try {\n response = await _api__WEBPACK_IMPORTED_MODULE_1__[\"api\"].get(url, {\n params\n });\n } catch (error) {\n return {\n status,\n html: 'Failed to get backlog prediction
' + String(error)\n };\n }\n\n const newBacklogged = response.data.new;\n const existingBacklogged = response.data.existing;\n const variation = Math.abs(newBacklogged - existingBacklogged);\n let html = 'Current backlog: ' + existingBacklogged + ' episodes
';\n\n if (newBacklogged === -1 || existingBacklogged === -1) {\n html = 'No qualities selected';\n } else if (newBacklogged === existingBacklogged) {\n html += \"This change won't affect your backlogged episodes\";\n status = true;\n } else {\n html += '
New backlog: ' + newBacklogged + ' episodes';\n html += '

';\n let change = '';\n\n if (newBacklogged > existingBacklogged) {\n html += 'WARNING: ';\n change = 'increase'; // Only show the archive action div if we have backlog increase\n\n this.archive = true;\n } else {\n change = 'decrease';\n }\n\n html += 'Backlog will ' + change + ' by ' + variation + ' episodes.';\n }\n\n return {\n status,\n html\n };\n }\n\n },\n\n mounted() {\n this.setInitialPreset(this.initialQuality);\n },\n\n methods: {\n isQualityPreset(quality) {\n return this.getQualityPreset({\n value: quality\n }) !== undefined;\n },\n\n setInitialPreset(preset) {\n const {\n isQualityPreset,\n keep\n } = this;\n const newPreset = keep === 'keep' ? 'keep' : isQualityPreset(preset) ? preset : 0;\n this.selectedQualityPreset = [newPreset, preset];\n },\n\n async archiveEpisodes() {\n this.archivedStatus = 'Archiving...';\n const url = \"series/\".concat(this.showSlug, \"/operation\");\n const response = await _api__WEBPACK_IMPORTED_MODULE_1__[\"api\"].post(url, {\n type: 'ARCHIVE_EPISODES'\n });\n\n if (response.status === 201) {\n this.archivedStatus = 'Successfully archived episodes'; // Recalculate backlogged episodes after we archive it\n\n this.$asyncComputed.backloggedEpisodes.update();\n } else if (response.status === 204) {\n this.archivedStatus = 'No episodes to be archived';\n } // Restore button text\n\n\n this.archiveButton.text = 'Finished';\n this.archiveButton.disabled = true;\n },\n\n setQualityFromPreset(preset, oldPreset) {\n // If empty skip\n if (preset === undefined || preset === null) {\n return;\n } // [Mass Edit] If changing to/from `keep`, restore the original value\n\n\n if ([preset, oldPreset].some(val => val === 'keep')) {\n preset = this.initialQuality; // If preset is custom, set to last preset (provided it's not null)\n } else if ((preset === 0 || !this.isQualityPreset(preset)) && oldPreset !== null) {\n preset = oldPreset;\n }\n\n const {\n allowed,\n preferred\n } = this.splitQuality(preset);\n this.allowedQualities = allowed;\n this.preferredQualities = preferred;\n }\n\n },\n watch: {\n // eslint-disable-next-line no-warning-comments\n\n /*\n FIXME: Remove this watch and the `this.lock` hack.\n This is causing the preset selector to change from `Custom` to a preset,\n when the correct qualities for that preset are selected.\n */\n overallQuality(newValue) {\n if (!this.lock) {\n this.setInitialPreset(newValue);\n }\n },\n\n /* eslint-disable no-warning-comments */\n allowedQualities(newQuality) {\n // Deselecting all allowed qualities clears the preferred selection\n if (newQuality.length === 0 && this.preferredQualities.length > 0) {\n this.preferredQualities = [];\n }\n\n this.lock = true; // FIXME: Remove this hack, see above\n\n this.$emit('update:quality:allowed', newQuality); // FIXME: Remove this hack, see above\n\n this.$nextTick(() => {\n this.lock = false;\n });\n },\n\n preferredQualities(newQuality) {\n this.lock = true; // FIXME: Remove this hack, see above\n\n this.$emit('update:quality:preferred', newQuality); // FIXME: Remove this hack, see above\n\n this.$nextTick(() => {\n this.lock = false;\n });\n }\n /* eslint-enable no-warning-comments */\n\n\n }\n});\n\n//# sourceURL=webpack:///./src/components/helpers/quality-chooser.vue?./node_modules/babel-loader/lib!./node_modules/vue-loader/lib??vue-loader-options"); /***/ }), @@ -574,7 +574,7 @@ eval("exports = module.exports = __webpack_require__(/*! ../../../node_modules/c /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { -eval("exports = module.exports = __webpack_require__(/*! ../../../node_modules/css-loader/dist/runtime/api.js */ \"./node_modules/css-loader/dist/runtime/api.js\")(false);\n// Module\nexports.push([module.i, \"\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n/* Put both custom quality selectors in the same row */\\n#customQualityWrapper > div[data-v-5aba68fa] {\\n display: inline-block;\\n text-align: left;\\n}\\n\\n/* Put some distance between the two selectors */\\n#customQualityWrapper > div[data-v-5aba68fa]:first-of-type {\\n padding-right: 30px;\\n}\\n.backlog-link[data-v-5aba68fa] {\\n color: blue;\\n text-decoration: underline;\\n}\\n\", \"\"]);\n\n\n//# sourceURL=webpack:///./src/components/helpers/quality-chooser.vue?./node_modules/css-loader/dist/cjs.js!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/vue-loader/lib??vue-loader-options"); +eval("exports = module.exports = __webpack_require__(/*! ../../../node_modules/css-loader/dist/runtime/api.js */ \"./node_modules/css-loader/dist/runtime/api.js\")(false);\n// Module\nexports.push([module.i, \"\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n/* Put both custom quality selectors in the same row */\\n#customQualityWrapper > div[data-v-5aba68fa] {\\n display: inline-block;\\n text-align: left;\\n}\\n\\n/* Put some distance between the two selectors */\\n#customQualityWrapper > div[data-v-5aba68fa]:first-of-type {\\n padding-right: 30px;\\n}\\n.backlog-link[data-v-5aba68fa] {\\n color: blue;\\n text-decoration: underline;\\n}\\n\", \"\"]);\n\n\n//# sourceURL=webpack:///./src/components/helpers/quality-chooser.vue?./node_modules/css-loader/dist/cjs.js!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/vue-loader/lib??vue-loader-options"); /***/ }), @@ -924,7 +924,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) * /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return render; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return staticRenderFns; });\nvar render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\"div\", [\n _c(\n \"select\",\n {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model.number\",\n value: _vm.selectedQualityPreset,\n expression: \"selectedQualityPreset\",\n modifiers: { number: true }\n }\n ],\n staticClass: \"form-control form-control-inline input-sm\",\n attrs: { name: \"quality_preset\" },\n on: {\n change: function($event) {\n var $$selectedVal = Array.prototype.filter\n .call($event.target.options, function(o) {\n return o.selected\n })\n .map(function(o) {\n var val = \"_value\" in o ? o._value : o.value\n return _vm._n(val)\n })\n _vm.selectedQualityPreset = $event.target.multiple\n ? $$selectedVal\n : $$selectedVal[0]\n }\n }\n },\n [\n _vm.keep\n ? _c(\"option\", { attrs: { value: \"keep\" } }, [_vm._v(\"< Keep >\")])\n : _vm._e(),\n _vm._v(\" \"),\n _c(\"option\", { domProps: { value: 0 } }, [_vm._v(\"Custom\")]),\n _vm._v(\" \"),\n _vm._l(_vm.qualityPresets, function(preset) {\n return _c(\n \"option\",\n {\n key: \"quality-preset-\" + preset.key,\n domProps: { value: preset.value }\n },\n [_vm._v(\"\\n \" + _vm._s(preset.name) + \"\\n \")]\n )\n })\n ],\n 2\n ),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value: _vm.selectedQualityPreset === 0,\n expression: \"selectedQualityPreset === 0\"\n }\n ],\n attrs: { id: \"customQualityWrapper\" }\n },\n [\n _vm._m(0),\n _vm._v(\" \"),\n _c(\"div\", [\n _c(\"h5\", [_vm._v(\"Allowed\")]),\n _vm._v(\" \"),\n _c(\n \"select\",\n {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model.number\",\n value: _vm.allowedQualities,\n expression: \"allowedQualities\",\n modifiers: { number: true }\n }\n ],\n staticClass: \"form-control form-control-inline input-sm\",\n attrs: {\n name: \"allowed_qualities\",\n multiple: \"multiple\",\n size: _vm.validQualities.length\n },\n on: {\n change: function($event) {\n var $$selectedVal = Array.prototype.filter\n .call($event.target.options, function(o) {\n return o.selected\n })\n .map(function(o) {\n var val = \"_value\" in o ? o._value : o.value\n return _vm._n(val)\n })\n _vm.allowedQualities = $event.target.multiple\n ? $$selectedVal\n : $$selectedVal[0]\n }\n }\n },\n _vm._l(_vm.validQualities, function(quality) {\n return _c(\n \"option\",\n {\n key: \"quality-list-\" + quality.key,\n domProps: { value: quality.value }\n },\n [\n _vm._v(\n \"\\n \" +\n _vm._s(quality.name) +\n \"\\n \"\n )\n ]\n )\n }),\n 0\n )\n ]),\n _vm._v(\" \"),\n _c(\"div\", [\n _c(\"h5\", [_vm._v(\"Preferred\")]),\n _vm._v(\" \"),\n _c(\n \"select\",\n {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model.number\",\n value: _vm.preferredQualities,\n expression: \"preferredQualities\",\n modifiers: { number: true }\n }\n ],\n staticClass: \"form-control form-control-inline input-sm\",\n attrs: {\n name: \"preferred_qualities\",\n multiple: \"multiple\",\n size: _vm.validQualities.length,\n disabled: _vm.allowedQualities.length === 0\n },\n on: {\n change: function($event) {\n var $$selectedVal = Array.prototype.filter\n .call($event.target.options, function(o) {\n return o.selected\n })\n .map(function(o) {\n var val = \"_value\" in o ? o._value : o.value\n return _vm._n(val)\n })\n _vm.preferredQualities = $event.target.multiple\n ? $$selectedVal\n : $$selectedVal[0]\n }\n }\n },\n _vm._l(_vm.validQualities, function(quality) {\n return _c(\n \"option\",\n {\n key: \"quality-list-\" + quality.key,\n domProps: { value: quality.value }\n },\n [\n _vm._v(\n \"\\n \" +\n _vm._s(quality.name) +\n \"\\n \"\n )\n ]\n )\n }),\n 0\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _vm.selectedQualityPreset !== \"keep\"\n ? _c(\"div\", [\n _vm.allowedQualities.length + _vm.preferredQualities.length >= 1\n ? _c(\n \"div\",\n { attrs: { id: \"qualityExplanation\" } },\n [\n _vm._m(1),\n _vm._v(\" \"),\n _vm.preferredQualities.length === 0\n ? _c(\"h5\", [\n _vm._v(\"\\n This will download \"),\n _c(\"b\", [_vm._v(\"any\")]),\n _vm._v(\n \" of these qualities and then stops searching:\\n \"\n ),\n _c(\"label\", { attrs: { id: \"allowedExplanation\" } }, [\n _vm._v(_vm._s(_vm.explanation.allowed.join(\", \")))\n ])\n ])\n : [\n _c(\"h5\", [\n _vm._v(\"\\n Downloads \"),\n _c(\"b\", [_vm._v(\"any\")]),\n _vm._v(\" of these qualities:\\n \"),\n _c(\n \"label\",\n { attrs: { id: \"allowedPreferredExplanation\" } },\n [_vm._v(_vm._s(_vm.explanation.allowed.join(\", \")))]\n )\n ]),\n _vm._v(\" \"),\n _c(\"h5\", [\n _vm._v(\n \"\\n But it will stop searching when one of these is downloaded:\\n \"\n ),\n _c(\n \"label\",\n { attrs: { id: \"preferredExplanation\" } },\n [\n _vm._v(\n _vm._s(_vm.explanation.preferred.join(\", \"))\n )\n ]\n )\n ])\n ]\n ],\n 2\n )\n : _c(\"div\", [_vm._v(\"Please select at least one allowed quality.\")])\n ])\n : _vm._e(),\n _vm._v(\" \"),\n _vm.showSlug &&\n _vm.allowedQualities.length + _vm.preferredQualities.length >= 1\n ? _c(\"div\", [\n _c(\"h5\", {\n staticClass: \"{ 'red-text': !backloggedEpisodes.status }\",\n domProps: { innerHTML: _vm._s(_vm.backloggedEpisodes.html) }\n })\n ])\n : _vm._e(),\n _vm._v(\" \"),\n _vm.archive\n ? _c(\"div\", { attrs: { id: \"archive\" } }, [\n _c(\"h5\", [\n _c(\n \"b\",\n [\n _vm._v(\n \"Archive downloaded episodes that are not currently in\\n \"\n ),\n _c(\n \"app-link\",\n {\n staticClass: \"backlog-link\",\n attrs: { href: \"manage/backlogOverview/\", target: \"_blank\" }\n },\n [_vm._v(\"backlog\")]\n ),\n _vm._v(\".\")\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\"br\"),\n _vm._v(\n \"Avoids unnecessarily increasing your backlog\\n \"\n ),\n _c(\"br\")\n ]),\n _vm._v(\" \"),\n _c(\n \"button\",\n {\n staticClass: \"btn-medusa btn-inline\",\n attrs: { disabled: _vm.archiveButton.disabled },\n on: {\n click: function($event) {\n $event.preventDefault()\n return _vm.archiveEpisodes($event)\n }\n }\n },\n [\n _vm._v(\n \"\\n \" + _vm._s(_vm.archiveButton.text) + \"\\n \"\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\"h5\", [_vm._v(_vm._s(_vm.archivedStatus))])\n ])\n : _vm._e()\n ])\n}\nvar staticRenderFns = [\n function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\"p\", [\n _c(\"b\", [_c(\"strong\", [_vm._v(\"Preferred\")])]),\n _vm._v(\" qualities will replace those in \"),\n _c(\"b\", [_c(\"strong\", [_vm._v(\"allowed\")])]),\n _vm._v(\", even if they are lower.\\n \")\n ])\n },\n function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\"h5\", [_c(\"b\", [_vm._v(\"Quality setting explanation:\")])])\n }\n]\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack:///./src/components/helpers/quality-chooser.vue?./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return render; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return staticRenderFns; });\nvar render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\"div\", [\n _c(\n \"select\",\n {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model.number\",\n value: _vm.selectedQualityPreset,\n expression: \"selectedQualityPreset\",\n modifiers: { number: true }\n }\n ],\n staticClass: \"form-control form-control-inline input-sm\",\n attrs: { name: \"quality_preset\" },\n on: {\n change: function($event) {\n var $$selectedVal = Array.prototype.filter\n .call($event.target.options, function(o) {\n return o.selected\n })\n .map(function(o) {\n var val = \"_value\" in o ? o._value : o.value\n return _vm._n(val)\n })\n _vm.selectedQualityPreset = $event.target.multiple\n ? $$selectedVal\n : $$selectedVal[0]\n }\n }\n },\n [\n _vm.keep\n ? _c(\"option\", { attrs: { value: \"keep\" } }, [_vm._v(\"< Keep >\")])\n : _vm._e(),\n _vm._v(\" \"),\n _c(\"option\", { domProps: { value: 0 } }, [_vm._v(\"Custom\")]),\n _vm._v(\" \"),\n _vm._l(_vm.qualityPresets, function(preset) {\n return _c(\n \"option\",\n {\n key: \"quality-preset-\" + preset.key,\n domProps: { value: preset.value }\n },\n [_vm._v(\"\\n \" + _vm._s(preset.name) + \"\\n \")]\n )\n })\n ],\n 2\n ),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value: _vm.selectedQualityPreset === 0,\n expression: \"selectedQualityPreset === 0\"\n }\n ],\n attrs: { id: \"customQualityWrapper\" }\n },\n [\n _vm._m(0),\n _vm._v(\" \"),\n _c(\"div\", [\n _c(\"h5\", [_vm._v(\"Allowed\")]),\n _vm._v(\" \"),\n _c(\n \"select\",\n {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model.number\",\n value: _vm.allowedQualities,\n expression: \"allowedQualities\",\n modifiers: { number: true }\n }\n ],\n staticClass: \"form-control form-control-inline input-sm\",\n attrs: {\n name: \"allowed_qualities\",\n multiple: \"multiple\",\n size: _vm.validQualities.length\n },\n on: {\n change: function($event) {\n var $$selectedVal = Array.prototype.filter\n .call($event.target.options, function(o) {\n return o.selected\n })\n .map(function(o) {\n var val = \"_value\" in o ? o._value : o.value\n return _vm._n(val)\n })\n _vm.allowedQualities = $event.target.multiple\n ? $$selectedVal\n : $$selectedVal[0]\n }\n }\n },\n _vm._l(_vm.validQualities, function(quality) {\n return _c(\n \"option\",\n {\n key: \"quality-list-\" + quality.key,\n domProps: { value: quality.value }\n },\n [\n _vm._v(\n \"\\n \" +\n _vm._s(quality.name) +\n \"\\n \"\n )\n ]\n )\n }),\n 0\n )\n ]),\n _vm._v(\" \"),\n _c(\"div\", [\n _c(\"h5\", [_vm._v(\"Preferred\")]),\n _vm._v(\" \"),\n _c(\n \"select\",\n {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model.number\",\n value: _vm.preferredQualities,\n expression: \"preferredQualities\",\n modifiers: { number: true }\n }\n ],\n staticClass: \"form-control form-control-inline input-sm\",\n attrs: {\n name: \"preferred_qualities\",\n multiple: \"multiple\",\n size: _vm.validQualities.length,\n disabled: _vm.allowedQualities.length === 0\n },\n on: {\n change: function($event) {\n var $$selectedVal = Array.prototype.filter\n .call($event.target.options, function(o) {\n return o.selected\n })\n .map(function(o) {\n var val = \"_value\" in o ? o._value : o.value\n return _vm._n(val)\n })\n _vm.preferredQualities = $event.target.multiple\n ? $$selectedVal\n : $$selectedVal[0]\n }\n }\n },\n _vm._l(_vm.validQualities, function(quality) {\n return _c(\n \"option\",\n {\n key: \"quality-list-\" + quality.key,\n domProps: { value: quality.value }\n },\n [\n _vm._v(\n \"\\n \" +\n _vm._s(quality.name) +\n \"\\n \"\n )\n ]\n )\n }),\n 0\n )\n ])\n ]\n ),\n _vm._v(\" \"),\n _vm.selectedQualityPreset !== \"keep\"\n ? _c(\"div\", [\n _vm.allowedQualities.length + _vm.preferredQualities.length >= 1\n ? _c(\n \"div\",\n { attrs: { id: \"qualityExplanation\" } },\n [\n _vm._m(1),\n _vm._v(\" \"),\n _vm.preferredQualities.length === 0\n ? _c(\"h5\", [\n _vm._v(\"\\n This will download \"),\n _c(\"b\", [_vm._v(\"any\")]),\n _vm._v(\n \" of these qualities and then stops searching:\\n \"\n ),\n _c(\"label\", { attrs: { id: \"allowedExplanation\" } }, [\n _vm._v(_vm._s(_vm.explanation.allowed.join(\", \")))\n ])\n ])\n : [\n _c(\"h5\", [\n _vm._v(\"\\n Downloads \"),\n _c(\"b\", [_vm._v(\"any\")]),\n _vm._v(\" of these qualities:\\n \"),\n _c(\n \"label\",\n { attrs: { id: \"allowedPreferredExplanation\" } },\n [_vm._v(_vm._s(_vm.explanation.allowed.join(\", \")))]\n )\n ]),\n _vm._v(\" \"),\n _c(\"h5\", [\n _vm._v(\n \"\\n But it will stop searching when one of these is downloaded:\\n \"\n ),\n _c(\n \"label\",\n { attrs: { id: \"preferredExplanation\" } },\n [\n _vm._v(\n _vm._s(_vm.explanation.preferred.join(\", \"))\n )\n ]\n )\n ])\n ]\n ],\n 2\n )\n : _c(\"div\", [_vm._v(\"Please select at least one allowed quality.\")])\n ])\n : _vm._e(),\n _vm._v(\" \"),\n _vm.backloggedEpisodes\n ? _c(\"div\", [\n _c(\"h5\", {\n staticClass: \"{ 'red-text': !backloggedEpisodes.status }\",\n domProps: { innerHTML: _vm._s(_vm.backloggedEpisodes.html) }\n })\n ])\n : _vm._e(),\n _vm._v(\" \"),\n _vm.archive\n ? _c(\"div\", { attrs: { id: \"archive\" } }, [\n _c(\"h5\", [\n _c(\n \"b\",\n [\n _vm._v(\n \"Archive downloaded episodes that are not currently in\\n \"\n ),\n _c(\n \"app-link\",\n {\n staticClass: \"backlog-link\",\n attrs: { href: \"manage/backlogOverview/\", target: \"_blank\" }\n },\n [_vm._v(\"backlog\")]\n ),\n _vm._v(\".\")\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\"br\"),\n _vm._v(\n \"Avoids unnecessarily increasing your backlog\\n \"\n ),\n _c(\"br\")\n ]),\n _vm._v(\" \"),\n _c(\n \"button\",\n {\n staticClass: \"btn-medusa btn-inline\",\n attrs: { disabled: _vm.archiveButton.disabled },\n on: {\n click: function($event) {\n $event.preventDefault()\n return _vm.archiveEpisodes($event)\n }\n }\n },\n [\n _vm._v(\n \"\\n \" + _vm._s(_vm.archiveButton.text) + \"\\n \"\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\"h5\", [_vm._v(_vm._s(_vm.archivedStatus))])\n ])\n : _vm._e()\n ])\n}\nvar staticRenderFns = [\n function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\"p\", [\n _c(\"b\", [_c(\"strong\", [_vm._v(\"Preferred\")])]),\n _vm._v(\" qualities will replace those in \"),\n _c(\"b\", [_c(\"strong\", [_vm._v(\"allowed\")])]),\n _vm._v(\", even if they are lower.\\n \")\n ])\n },\n function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\"h5\", [_c(\"b\", [_vm._v(\"Quality setting explanation:\")])])\n }\n]\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack:///./src/components/helpers/quality-chooser.vue?./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options"); /***/ }), diff --git a/themes/dark/templates/addShows_addExistingShow.mako b/themes/dark/templates/addShows_addExistingShow.mako index 0436cb1fb0..b7ed95dcdf 100644 --- a/themes/dark/templates/addShows_addExistingShow.mako +++ b/themes/dark/templates/addShows_addExistingShow.mako @@ -11,6 +11,8 @@ <%block name="scripts"> % endif diff --git a/themes/dark/templates/addShows_trendingShows.mako b/themes/dark/templates/addShows_trendingShows.mako index f5450013d2..16558cfa8a 100644 --- a/themes/dark/templates/addShows_trendingShows.mako +++ b/themes/dark/templates/addShows_trendingShows.mako @@ -7,6 +7,8 @@ % endif diff --git a/themes/dark/templates/inc_addShowOptions.mako b/themes/dark/templates/inc_addShowOptions.mako index 5f59c44513..abc9185e95 100644 --- a/themes/dark/templates/inc_addShowOptions.mako +++ b/themes/dark/templates/inc_addShowOptions.mako @@ -8,7 +8,7 @@ diff --git a/themes/dark/templates/manage_massEdit.mako b/themes/dark/templates/manage_massEdit.mako index 1bf8e63faf..6ed3ad98ea 100644 --- a/themes/dark/templates/manage_massEdit.mako +++ b/themes/dark/templates/manage_massEdit.mako @@ -8,11 +8,19 @@ %> <%block name="scripts"> % endif diff --git a/themes/light/templates/addShows_trendingShows.mako b/themes/light/templates/addShows_trendingShows.mako index f5450013d2..16558cfa8a 100644 --- a/themes/light/templates/addShows_trendingShows.mako +++ b/themes/light/templates/addShows_trendingShows.mako @@ -7,6 +7,8 @@ % endif diff --git a/themes/light/templates/inc_addShowOptions.mako b/themes/light/templates/inc_addShowOptions.mako index 5f59c44513..abc9185e95 100644 --- a/themes/light/templates/inc_addShowOptions.mako +++ b/themes/light/templates/inc_addShowOptions.mako @@ -8,7 +8,7 @@ diff --git a/themes/light/templates/manage_massEdit.mako b/themes/light/templates/manage_massEdit.mako index 1bf8e63faf..6ed3ad98ea 100644 --- a/themes/light/templates/manage_massEdit.mako +++ b/themes/light/templates/manage_massEdit.mako @@ -8,11 +8,19 @@ %> <%block name="scripts">