From 1d592efa17ae99fa53888b8966de96a6c655cf51 Mon Sep 17 00:00:00 2001 From: Farzad Hayat Date: Wed, 10 Apr 2024 19:36:10 +1000 Subject: [PATCH 01/97] DOC-2358: bump api-version for TinyMCE 7.0.1 (#3222) --- .api-version | 2 +- modules/ROOT/pages/apis/tinymce.editor.adoc | 21 ++++++++++--------- .../apis/tinymce.editor.ui.registry.adoc | 4 ++-- .../apis/tinymce.notificationmanager.adoc | 2 +- modules/ROOT/pages/apis/tinymce.root.adoc | 4 ++-- .../pages/apis/tinymce.util.observable.adoc | 20 +++++++++--------- .../pages/apis/tinymce.windowmanager.adoc | 6 +++--- 7 files changed, 30 insertions(+), 29 deletions(-) diff --git a/.api-version b/.api-version index 4122521804..73a86b1970 100644 --- a/.api-version +++ b/.api-version @@ -1 +1 @@ -7.0.0 \ No newline at end of file +7.0.1 \ No newline at end of file diff --git a/modules/ROOT/pages/apis/tinymce.editor.adoc b/modules/ROOT/pages/apis/tinymce.editor.adoc index f5a4852c8b..f07065caf5 100644 --- a/modules/ROOT/pages/apis/tinymce.editor.adoc +++ b/modules/ROOT/pages/apis/tinymce.editor.adoc @@ -83,11 +83,12 @@ manipulation functions.|`xref:apis/tinymce.editor.adoc[Editor]` that could leak memory. This method will be called automatically when the page is unloaded but you can also call it directly if you know what you are doing.|`xref:apis/tinymce.editor.adoc[Editor]` |xref:#dispatch[dispatch()]|Dispatches the specified event by name. Consult the -link:https://www.tiny.cloud/docs/tinymce/6/events/[event reference] for more details on each event.|`xref:apis/tinymce.util.observable.adoc[Observable]` + +link:https://www.tiny.cloud/docs/tinymce/7/events/[event reference] for more details on each event.|`xref:apis/tinymce.util.observable.adoc[Observable]` |xref:#execCommand[execCommand()]|Executes a registered command on the current instance. A list of available commands can be found in the tinymce command identifiers documentation.|`xref:apis/tinymce.editor.adoc[Editor]` |xref:#fire[fire()]|Fires the specified event by name. Consult the -link:https://www.tiny.cloud/docs/tinymce/6/events/[event reference] for more details on each event. +link:https://www.tiny.cloud/docs/tinymce/7/events/[event reference] for more details on each event. __Deprecated in TinyMCE 6.0 and has been marked for removal in TinyMCE 7.0. Use `dispatch` instead.__|`xref:apis/tinymce.util.observable.adoc[Observable]` |xref:#focus[focus()]|Focuses/activates the editor. This will set this editor as the activeEditor in the tinymce collection it will also place DOM focus inside the editor.|`xref:apis/tinymce.editor.adoc[Editor]` @@ -121,11 +122,11 @@ so all events etc that method has will get dispatched as well.|`xref:apis/tinymc |xref:#nodeChanged[nodeChanged()]|Dispatches out a onNodeChange event to all observers. This method should be called when you need to update the UI states or element path etc.|`xref:apis/tinymce.editor.adoc[Editor]` |xref:#off[off()]|Unbinds an event listener to a specific event by name. Consult the -link:https://www.tiny.cloud/docs/tinymce/6/events/[event reference] for more details on each event.|`xref:apis/tinymce.util.observable.adoc[Observable]` +link:https://www.tiny.cloud/docs/tinymce/7/events/[event reference] for more details on each event.|`xref:apis/tinymce.util.observable.adoc[Observable]` |xref:#on[on()]|Binds an event listener to a specific event by name. Consult the -link:https://www.tiny.cloud/docs/tinymce/6/events/[event reference] for more details on each event.|`xref:apis/tinymce.util.observable.adoc[Observable]` +link:https://www.tiny.cloud/docs/tinymce/7/events/[event reference] for more details on each event.|`xref:apis/tinymce.util.observable.adoc[Observable]` |xref:#once[once()]|Bind the event callback and once it fires the callback is removed. Consult the -link:https://www.tiny.cloud/docs/tinymce/6/events/[event reference] for more details on each event.|`xref:apis/tinymce.util.observable.adoc[Observable]` +link:https://www.tiny.cloud/docs/tinymce/7/events/[event reference] for more details on each event.|`xref:apis/tinymce.util.observable.adoc[Observable]` |xref:#queryCommandState[queryCommandState()]|Returns a command specific state, for example if bold is enabled or not.|`xref:apis/tinymce.editor.adoc[Editor]` |xref:#queryCommandSupported[queryCommandSupported()]|Returns true/false if the command is supported or not.|`xref:apis/tinymce.editor.adoc[Editor]` |xref:#queryCommandValue[queryCommandValue()]|Returns a command specific value, for example the current font size.|`xref:apis/tinymce.editor.adoc[Editor]` @@ -336,7 +337,7 @@ but you can also call it directly if you know what you are doing. dispatch(name: String, args: Object?, bubble: Boolean?): Object ---- Dispatches the specified event by name. Consult the -link:https://www.tiny.cloud/docs/tinymce/6/events/[event reference] for more details on each event. +link:https://www.tiny.cloud/docs/tinymce/7/events/[event reference] for more details on each event. ==== Examples [source, javascript] @@ -385,7 +386,7 @@ the tinymce command identifiers documentation. fire(name: String, args: Object?, bubble: Boolean?): Object ---- Fires the specified event by name. Consult the -link:https://www.tiny.cloud/docs/tinymce/6/events/[event reference] for more details on each event. +link:https://www.tiny.cloud/docs/tinymce/7/events/[event reference] for more details on each event. __Deprecated in TinyMCE 6.0 and has been marked for removal in TinyMCE 7.0. Use `dispatch` instead.__ ==== Examples @@ -751,7 +752,7 @@ need to update the UI states or element path etc. off(name: String?, callback: Function?): Object ---- Unbinds an event listener to a specific event by name. Consult the -link:https://www.tiny.cloud/docs/tinymce/6/events/[event reference] for more details on each event. +link:https://www.tiny.cloud/docs/tinymce/7/events/[event reference] for more details on each event. ==== Examples [source, javascript] @@ -784,7 +785,7 @@ instance.off(); on(name: String, callback: Function, prepend: Boolean): Object ---- Binds an event listener to a specific event by name. Consult the -link:https://www.tiny.cloud/docs/tinymce/6/events/[event reference] for more details on each event. +link:https://www.tiny.cloud/docs/tinymce/7/events/[event reference] for more details on each event. ==== Examples [source, javascript] @@ -813,7 +814,7 @@ instance.on('event', (e) => { once(name: String, callback: Function): Object ---- Bind the event callback and once it fires the callback is removed. Consult the -link:https://www.tiny.cloud/docs/tinymce/6/events/[event reference] for more details on each event. +link:https://www.tiny.cloud/docs/tinymce/7/events/[event reference] for more details on each event. ==== Parameters diff --git a/modules/ROOT/pages/apis/tinymce.editor.ui.registry.adoc b/modules/ROOT/pages/apis/tinymce.editor.ui.registry.adoc index 44025a5f98..f4250cedc0 100644 --- a/modules/ROOT/pages/apis/tinymce.editor.ui.registry.adoc +++ b/modules/ROOT/pages/apis/tinymce.editor.ui.registry.adoc @@ -42,7 +42,7 @@ UI Components - Context Menu].|`xref:apis/tinymce.editor.ui.registry.adoc[Regist |xref:#addContextToolbar[addContextToolbar()]|Registers a new context toolbar that only appears when a content predicate is matched for example the cursor is on an image element. For information on creating context toolbars, see: -link:https://www.tiny.cloud/docs/tinymce/6/contexttoolbar/[ +link:https://www.tiny.cloud/docs/tinymce/7/contexttoolbar/[ UI Components - Context Toolbar].|`xref:apis/tinymce.editor.ui.registry.adoc[Registry]` |xref:#addGroupToolbarButton[addGroupToolbarButton()]|Registers a new group toolbar button for the toolbar. Renders a toolbar button that opens a floating toolbar when clicked. @@ -201,7 +201,7 @@ addContextToolbar(name: String, obj: Toolbar.ContextToolbarSpec) Registers a new context toolbar that only appears when a content predicate is matched for example the cursor is on an image element. For information on creating context toolbars, see: -link:https://www.tiny.cloud/docs/tinymce/6/contexttoolbar/[ +link:https://www.tiny.cloud/docs/tinymce/7/contexttoolbar/[ UI Components - Context Toolbar]. ==== Parameters diff --git a/modules/ROOT/pages/apis/tinymce.notificationmanager.adoc b/modules/ROOT/pages/apis/tinymce.notificationmanager.adoc index ecc9dbd46c..ffba33ce3a 100644 --- a/modules/ROOT/pages/apis/tinymce.notificationmanager.adoc +++ b/modules/ROOT/pages/apis/tinymce.notificationmanager.adoc @@ -69,6 +69,6 @@ Opens a new notification. * `args (Object)` - A `name: value` collection containing settings such as: `timeout`, `type`, and message (`text`). -For information on the available settings, see: link:https://www.tiny.cloud/docs/tinymce/6/creating-custom-notifications/[Create custom notifications]. +For information on the available settings, see: link:https://www.tiny.cloud/docs/tinymce/7/creating-custom-notifications/[Create custom notifications]. ''' diff --git a/modules/ROOT/pages/apis/tinymce.root.adoc b/modules/ROOT/pages/apis/tinymce.root.adoc index 7a72048596..4c9b577c4b 100644 --- a/modules/ROOT/pages/apis/tinymce.root.adoc +++ b/modules/ROOT/pages/apis/tinymce.root.adoc @@ -52,7 +52,7 @@ Checks if the input object `obj` has the property `prop`.|`xref:apis/tinymce.roo |xref:#inArray[inArray()]|Returns an index of the item or -1 if item is not present in the array.|`xref:apis/tinymce.root.adoc[tinymce]` |xref:#init[init()]|Initializes a set of editors. This method will create editors based on various settings. -For information on basic usage of `init`, see: link:https://www.tiny.cloud/docs/tinymce/6/basic-setup/[Basic setup].|`xref:apis/tinymce.root.adoc[tinymce]` +For information on basic usage of `init`, see: link:https://www.tiny.cloud/docs/tinymce/7/basic-setup/[Basic setup].|`xref:apis/tinymce.root.adoc[tinymce]` |xref:#is[is()]|Checks if a object is of a specific type for example an array.|`xref:apis/tinymce.root.adoc[tinymce]` |xref:#isArray[isArray()]|Returns true/false if the object is an array or not.|`xref:apis/tinymce.root.adoc[tinymce]` |xref:#makeMap[makeMap()]|Makes a name/object map out of an array with names.|`xref:apis/tinymce.root.adoc[tinymce]` @@ -315,7 +315,7 @@ init(options: Object): Promise ---- Initializes a set of editors. This method will create editors based on various settings. -For information on basic usage of `init`, see: link:https://www.tiny.cloud/docs/tinymce/6/basic-setup/[Basic setup]. +For information on basic usage of `init`, see: link:https://www.tiny.cloud/docs/tinymce/7/basic-setup/[Basic setup]. ==== Examples [source, javascript] diff --git a/modules/ROOT/pages/apis/tinymce.util.observable.adoc b/modules/ROOT/pages/apis/tinymce.util.observable.adoc index 8f0329ccf1..f76909ab65 100644 --- a/modules/ROOT/pages/apis/tinymce.util.observable.adoc +++ b/modules/ROOT/pages/apis/tinymce.util.observable.adoc @@ -15,17 +15,17 @@ This mixin adds event binding logic to classes. Adapts the EventDispatcher class |=== |Name|Summary|Defined by |xref:#dispatch[dispatch()]|Dispatches the specified event by name. Consult the -link:https://www.tiny.cloud/docs/tinymce/6/events/[event reference] for more details on each event.|`xref:apis/tinymce.util.observable.adoc[Observable]` +link:https://www.tiny.cloud/docs/tinymce/7/events/[event reference] for more details on each event.|`xref:apis/tinymce.util.observable.adoc[Observable]` |xref:#fire[fire()]|Fires the specified event by name. Consult the -link:https://www.tiny.cloud/docs/tinymce/6/events/[event reference] for more details on each event. +link:https://www.tiny.cloud/docs/tinymce/7/events/[event reference] for more details on each event. __Deprecated in TinyMCE 6.0 and has been marked for removal in TinyMCE 7.0. Use `dispatch` instead.__|`xref:apis/tinymce.util.observable.adoc[Observable]` |xref:#hasEventListeners[hasEventListeners()]|Returns true/false if the object has a event of the specified name.|`xref:apis/tinymce.util.observable.adoc[Observable]` |xref:#off[off()]|Unbinds an event listener to a specific event by name. Consult the -link:https://www.tiny.cloud/docs/tinymce/6/events/[event reference] for more details on each event.|`xref:apis/tinymce.util.observable.adoc[Observable]` +link:https://www.tiny.cloud/docs/tinymce/7/events/[event reference] for more details on each event.|`xref:apis/tinymce.util.observable.adoc[Observable]` |xref:#on[on()]|Binds an event listener to a specific event by name. Consult the -link:https://www.tiny.cloud/docs/tinymce/6/events/[event reference] for more details on each event.|`xref:apis/tinymce.util.observable.adoc[Observable]` +link:https://www.tiny.cloud/docs/tinymce/7/events/[event reference] for more details on each event.|`xref:apis/tinymce.util.observable.adoc[Observable]` |xref:#once[once()]|Bind the event callback and once it fires the callback is removed. Consult the -link:https://www.tiny.cloud/docs/tinymce/6/events/[event reference] for more details on each event.|`xref:apis/tinymce.util.observable.adoc[Observable]` +link:https://www.tiny.cloud/docs/tinymce/7/events/[event reference] for more details on each event.|`xref:apis/tinymce.util.observable.adoc[Observable]` |=== [[methods]] @@ -38,7 +38,7 @@ link:https://www.tiny.cloud/docs/tinymce/6/events/[event reference] for more det dispatch(name: String, args: Object?, bubble: Boolean?): Object ---- Dispatches the specified event by name. Consult the -link:https://www.tiny.cloud/docs/tinymce/6/events/[event reference] for more details on each event. +link:https://www.tiny.cloud/docs/tinymce/7/events/[event reference] for more details on each event. ==== Examples [source, javascript] @@ -65,7 +65,7 @@ instance.dispatch('event', {...}); fire(name: String, args: Object?, bubble: Boolean?): Object ---- Fires the specified event by name. Consult the -link:https://www.tiny.cloud/docs/tinymce/6/events/[event reference] for more details on each event. +link:https://www.tiny.cloud/docs/tinymce/7/events/[event reference] for more details on each event. __Deprecated in TinyMCE 6.0 and has been marked for removal in TinyMCE 7.0. Use `dispatch` instead.__ ==== Examples @@ -111,7 +111,7 @@ Returns true/false if the object has a event of the specified name. off(name: String?, callback: Function?): Object ---- Unbinds an event listener to a specific event by name. Consult the -link:https://www.tiny.cloud/docs/tinymce/6/events/[event reference] for more details on each event. +link:https://www.tiny.cloud/docs/tinymce/7/events/[event reference] for more details on each event. ==== Examples [source, javascript] @@ -144,7 +144,7 @@ instance.off(); on(name: String, callback: Function, prepend: Boolean): Object ---- Binds an event listener to a specific event by name. Consult the -link:https://www.tiny.cloud/docs/tinymce/6/events/[event reference] for more details on each event. +link:https://www.tiny.cloud/docs/tinymce/7/events/[event reference] for more details on each event. ==== Examples [source, javascript] @@ -173,7 +173,7 @@ instance.on('event', (e) => { once(name: String, callback: Function): Object ---- Bind the event callback and once it fires the callback is removed. Consult the -link:https://www.tiny.cloud/docs/tinymce/6/events/[event reference] for more details on each event. +link:https://www.tiny.cloud/docs/tinymce/7/events/[event reference] for more details on each event. ==== Parameters diff --git a/modules/ROOT/pages/apis/tinymce.windowmanager.adoc b/modules/ROOT/pages/apis/tinymce.windowmanager.adoc index cebcb7f4d0..2686c2605f 100644 --- a/modules/ROOT/pages/apis/tinymce.windowmanager.adoc +++ b/modules/ROOT/pages/apis/tinymce.windowmanager.adoc @@ -119,8 +119,8 @@ Opens a new window. ==== Parameters -* `config (Object)` - For information on the available options, see: link:https://www.tiny.cloud/docs/tinymce/6/dialog-configuration/#options[Dialog - Configuration options]. -* `params (Object)` - (Optional) For information on the available options, see: link:https://www.tiny.cloud/docs/tinymce/6/dialog-configuration/#configuration-parameters[Dialog - Configuration parameters]. +* `config (Object)` - For information on the available options, see: link:https://www.tiny.cloud/docs/tinymce/7/dialog-configuration/#options[Dialog - Configuration options]. +* `params (Object)` - (Optional) For information on the available options, see: link:https://www.tiny.cloud/docs/tinymce/7/dialog-configuration/#configuration-parameters[Dialog - Configuration parameters]. ==== Return value @@ -138,7 +138,7 @@ Opens a new window for the specified url. ==== Parameters -* `config (Object)` - For information on the available options, see: link:https://www.tiny.cloud/docs/tinymce/6/urldialog/#configuration[URL dialog - Configuration]. +* `config (Object)` - For information on the available options, see: link:https://www.tiny.cloud/docs/tinymce/7/urldialog/#configuration[URL dialog - Configuration]. ==== Return value From ea9aa6c423a74c7c3ae59a095e615c27f830df6e Mon Sep 17 00:00:00 2001 From: Daniel Oakman <141111365+danoaky-tiny@users.noreply.github.com> Date: Mon, 15 Apr 2024 09:34:46 +1000 Subject: [PATCH 02/97] DOC-2369: Added `tabIndex` prop to React's tech ref (#3225) --- .../partials/integrations/react-tech-ref.adoc | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/modules/ROOT/partials/integrations/react-tech-ref.adoc b/modules/ROOT/partials/integrations/react-tech-ref.adoc index ede5ba2302..a83c3a3546 100644 --- a/modules/ROOT/partials/integrations/react-tech-ref.adoc +++ b/modules/ROOT/partials/integrations/react-tech-ref.adoc @@ -22,6 +22,7 @@ ** xref:toolbar[`+toolbar+`] ** xref:tinymcescriptsrc[`+tinymceScriptSrc+`] ** xref:value[`+value+`] +** xref:tabIndex[`+tabIndex+`] * xref:using-the-tinymce-react-component-as-a-uncontrolled-component[Using the TinyMCE React component as a uncontrolled component] * xref:using-the-tinymce-react-component-as-a-controlled-component[Using the TinyMCE React component as a controlled component] * xref:event-binding[Event binding] @@ -154,6 +155,8 @@ xref:event-binding[`+onInit+`]:: An event handler for notifying when the editor xref:value[`+value+`]:: Sets and enforces the value of the editor. Only used for a controlled component. +xref:tabIndex[`+value+`]:: Sets the tabindex of the target element that the editor wraps. + [[available-props]] == Available props @@ -597,6 +600,22 @@ For detailed information on using the `+value+` prop, see: xref:using-the-tinymc *Type:* `+String+` +[[tabIndex]] +=== `+tabIndex+` + +Use the `+tabIndex+` prop to set the https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/tabindex[tabindex] on the target element that the editor wraps. + +*Type:* `+Number+` + +==== Example: using `+tabIndex+` + +[source,jsx] +---- + +---- + [[using-the-tinymce-react-component-as-a-uncontrolled-component]] == Using the {productname} React component as a uncontrolled component From afa1da6f9e847a468e0d4e68eb47be5965fee6b3 Mon Sep 17 00:00:00 2001 From: Mitchell Crompton Date: Mon, 15 Apr 2024 10:45:59 +1000 Subject: [PATCH 03/97] DOC-2324: Add workflows for development on 7 docs branch (#3220) * DOC-2324: Testing development workflows * DOC-2324: Testing latest version pages redirect * DOC-2324: Fix bucket name * DOC-2324: Fix bucket name * DOC-2324: Fix bucket name * DOC-2324: Remove useless redirect --- .github/workflows/codeql.yml | 4 +- .github/workflows/develop_7_docs.yml | 60 ++++++++++++++++++++++++++++ 2 files changed, 62 insertions(+), 2 deletions(-) create mode 100644 .github/workflows/develop_7_docs.yml diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index a69a57aabd..95161eb0ec 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -2,9 +2,9 @@ name: "CodeQL" on: push: - branches: [ "feature/**", "hotfix/**", "staging/**", "release/**" ] + branches: [ "feature/**", "hotfix/**", "tinymce/**" ] pull_request: - branches: [ "staging/**", "release/**" ] + branches: [ "tinymce/**" ] ## Add schedule if needed # schedule: # - cron: "17 23 * * 5" diff --git a/.github/workflows/develop_7_docs.yml b/.github/workflows/develop_7_docs.yml new file mode 100644 index 0000000000..43bb6f727b --- /dev/null +++ b/.github/workflows/develop_7_docs.yml @@ -0,0 +1,60 @@ +name: Develop 7 Docs + +on: + workflow_dispatch: + push: + paths: + - '**' + branches: + - 'feature/7**' + - 'hotfix/7**' + +jobs: + build: + name: Build Docs and Deploy + runs-on: ubuntu-22.04 + + strategy: + matrix: + node-version: [21] + + steps: + - uses: actions/checkout@v1 + + - name: Use Node.js + uses: actions/setup-node@v2 + with: + cache: 'yarn' + node-version: ${{ matrix.node-version }} + + - name: (Develop 7 Docs) Install dependencies + run: yarn install + + - name: (Develop 7 Docs) Build API References + run: yarn build + + - name: (Develop 7 Docs) Build Website + run: yarn antora ./antora-playbook.yml + + - name: (deploy) Prepare for branch deployments + shell: bash + run: | + printf "User-agent: * \nDisallow: /\n" > ./build/site/robots.txt + S3_BUCKET=$(node -e 'console.log(`s3://docs-${process.env.GITHUB_REF.replace("refs/heads/","").replace(/[/\s]/g, "-").replace(/[^0-9a-zA-Z-]/g, "").replace(/-$/g, "").toLowerCase()}.staging.tiny.cloud`)') + printf "S3_BUCKET: ${S3_BUCKET} (${#S3_BUCKET})\n" + if [ ${#S3_BUCKET} -lt 3 ] + then + echo "WARNING! S3_BUCKET name is too short" + fi + if [ ${#S3_BUCKET} -gt 63 ] + then + echo "WARNING! S3_BUCKET name is too long" + fi + echo $S3_BUCKET > S3_BUCKET + + - name: (deploy) Upload website to S3 + run: aws s3 sync --acl=public-read --delete ./build/site $(cat S3_BUCKET)/docs + env: + AWS_ACCESS_KEY_ID: ${{ secrets.STAGING_AWS_ACCESS_KEY_ID }} + AWS_SECRET_ACCESS_KEY: ${{ secrets.STAGING_AWS_SECRET_ACCESS_KEY }} + AWS_EC2_METADATA_DISABLED: true \ No newline at end of file From 93d7ffed18df8cb3e375652998e98692b1665cee Mon Sep 17 00:00:00 2001 From: Karl Kemister-Sheppard Date: Mon, 15 Apr 2024 11:17:21 +1000 Subject: [PATCH 04/97] DOC-2339: On-premises documentation for document converters. (#3180) * DOC-2339: On-premises documentation for document converters. * Update modules/ROOT/pages/individual-export-to-pdf-on-premises.adoc * Update modules/ROOT/pages/individual-export-to-word-on-premises.adoc * Update modules/ROOT/pages/individual-import-from-word-on-premises.adoc * DOC-2351: On-premises `Export to PDF` documentation. (#3182) * DOC-2351: On-premises export to pdf documentation. * Update modules/ROOT/partials/individually-licensed-components/export-to-pdf/export-to-pdf-nightly-releases.adoc * DOC-2351: update docker img with variable replacement. * Update antora.yml * DOC-2351: remove nightly builds, update variable for docker. * DOC-2351: copy edits, and initial cleanup. * Update modules/ROOT/partials/individually-licensed-components/export-to-pdf/export-to-pdf-installation.adoc * Update modules/ROOT/partials/individually-licensed-components/export-to-pdf/export-to-pdf-autorization.adoc * Updating antora.yml - Added another parameter Co-authored-by: Karl Kemister-Sheppard * Update export-to-pdf-fonts.adoc - corrected the file name * Update export-to-pdf-fonts.adoc - image name correction * Update export-to-pdf-installation.adoc - content changes * Update export-to-pdf-installation.adoc - change in instructions * Update export-to-pdf-installation.adoc - updated image name * Update export-to-pdf-installation.adoc - corrections made to yml file * Update export-to-pdf-installation.adoc - removed <> for license key * Update modules/ROOT/partials/individually-licensed-components/export-to-pdf/export-to-pdf-requirements.adoc * Update modules/ROOT/partials/individually-licensed-components/export-to-pdf/export-to-pdf-installation.adoc * Update modules/ROOT/partials/individually-licensed-components/export-to-pdf/export-to-pdf-installation.adoc * Update modules/ROOT/partials/individually-licensed-components/export-to-pdf/export-to-pdf-fonts.adoc * Update modules/ROOT/partials/individually-licensed-components/export-to-pdf/export-to-pdf-autorization.adoc * Update modules/ROOT/partials/individually-licensed-components/export-to-pdf/export-to-pdf-autorization.adoc * Update modules/ROOT/partials/individually-licensed-components/export-to-pdf/export-to-pdf-autorization.adoc * Update modules/ROOT/partials/individually-licensed-components/export-to-pdf/export-to-pdf-logs.adoc * Update modules/ROOT/partials/individually-licensed-components/export-to-pdf/export-to-pdf-overview.adoc * Update modules/ROOT/partials/individually-licensed-components/export-to-pdf/export-to-pdf-api-usage.adoc * Update modules/ROOT/partials/individually-licensed-components/export-to-pdf/export-to-pdf-installation.adoc * Update modules/ROOT/partials/individually-licensed-components/export-to-pdf/export-to-pdf-installation.adoc * Update modules/ROOT/partials/individually-licensed-components/export-to-pdf/export-to-pdf-api-usage.adoc * Update modules/ROOT/partials/individually-licensed-components/export-to-pdf/export-to-pdf-api-usage.adoc * Update modules/ROOT/partials/individually-licensed-components/export-to-pdf/export-to-pdf-requirements.adoc * Update modules/ROOT/partials/individually-licensed-components/export-to-pdf/export-to-pdf-autorization.adoc * Update modules/ROOT/partials/individually-licensed-components/export-to-pdf/export-to-pdf-installation.adoc * Update modules/ROOT/partials/individually-licensed-components/export-to-pdf/export-to-pdf-fonts.adoc --------- Co-authored-by: shirqa <43625458+ShiridiGandham@users.noreply.github.com> * DOC-2352: On-premises `Import from Word and Export to Word` documentation. (#3187) * DOC-2352: On-premises Import from Word and Export to Word documentation. * Apply suggestions from code review Updated content to reflect correct image names and also added login prerequisite details * Update import-from-word-and-export-to-word-overview-on-premises.adoc - content alignment * Update modules/ROOT/partials/individually-licensed-components/import-from-word-and-export-to-word/import-from-word-and-export-to-word-logs-on-premises.adoc * Update modules/ROOT/partials/individually-licensed-components/import-from-word-and-export-to-word/import-from-word-and-export-to-word-overview-on-premises.adoc * Update modules/ROOT/partials/individually-licensed-components/import-from-word-and-export-to-word/import-from-word-and-export-to-word-overview-on-premises.adoc * Update modules/ROOT/partials/individually-licensed-components/import-from-word-and-export-to-word/import-from-word-and-export-to-word-requirements-on-premises.adoc * Update modules/ROOT/partials/individually-licensed-components/import-from-word-and-export-to-word/import-from-word-and-export-to-word-installation-on-premises.adoc * Update modules/ROOT/partials/individually-licensed-components/import-from-word-and-export-to-word/import-from-word-and-export-to-word-logs-on-premises.adoc * Update modules/ROOT/partials/individually-licensed-components/import-from-word-and-export-to-word/import-from-word-and-export-to-word-installation-on-premises.adoc * Update modules/ROOT/partials/individually-licensed-components/import-from-word-and-export-to-word/import-from-word-and-export-to-word-logs-on-premises.adoc * Update modules/ROOT/partials/individually-licensed-components/import-from-word-and-export-to-word/import-from-word-and-export-to-word-api-usage-on-premises.adoc * Update modules/ROOT/partials/individually-licensed-components/import-from-word-and-export-to-word/import-from-word-and-export-to-word-api-usage-on-premises.adoc * Update modules/ROOT/partials/individually-licensed-components/import-from-word-and-export-to-word/import-from-word-and-export-to-word-autorization-on-premises.adoc * Update modules/ROOT/partials/individually-licensed-components/import-from-word-and-export-to-word/import-from-word-and-export-to-word-autorization-on-premises.adoc * Update modules/ROOT/partials/individually-licensed-components/import-from-word-and-export-to-word/import-from-word-and-export-to-word-overview-on-premises.adoc * Update modules/ROOT/partials/individually-licensed-components/import-from-word-and-export-to-word/import-from-word-and-export-to-word-overview-on-premises.adoc --------- Co-authored-by: shirqa <43625458+ShiridiGandham@users.noreply.github.com> --------- Co-authored-by: shirqa <43625458+ShiridiGandham@users.noreply.github.com> --- antora.yml | 6 + modules/ROOT/nav.adoc | 2 + .../individual-export-to-pdf-on-premises.adoc | 21 ++ ...m-word-and-export-to-word-on-premises.adoc | 19 ++ .../export-to-pdf-api-usage.adoc | 42 ++++ .../export-to-pdf-autorization.adoc | 97 ++++++++ .../export-to-pdf/export-to-pdf-fonts.adoc | 65 ++++++ .../export-to-pdf-installation.adoc | 98 ++++++++ .../export-to-pdf/export-to-pdf-logs.adoc | 212 ++++++++++++++++++ .../export-to-pdf/export-to-pdf-overview.adoc | 10 + .../export-to-pdf-requirements.adoc | 23 ++ .../export-to-pdf-ssl-communication.adoc | 68 ++++++ ...-export-to-word-api-usage-on-premises.adoc | 15 ++ ...port-to-word-autorization-on-premises.adoc | 69 ++++++ ...port-to-word-installation-on-premises.adoc | 89 ++++++++ ...d-and-export-to-word-logs-on-premises.adoc | 208 +++++++++++++++++ ...d-export-to-word-overview-on-premises.adoc | 10 + ...port-to-word-requirements-on-premises.adoc | 23 ++ ...to-word-ssl-communication-on-premises.adoc | 68 ++++++ 19 files changed, 1145 insertions(+) create mode 100644 modules/ROOT/pages/individual-export-to-pdf-on-premises.adoc create mode 100644 modules/ROOT/pages/individual-import-from-word-and-export-to-word-on-premises.adoc create mode 100644 modules/ROOT/partials/individually-licensed-components/export-to-pdf/export-to-pdf-api-usage.adoc create mode 100644 modules/ROOT/partials/individually-licensed-components/export-to-pdf/export-to-pdf-autorization.adoc create mode 100644 modules/ROOT/partials/individually-licensed-components/export-to-pdf/export-to-pdf-fonts.adoc create mode 100644 modules/ROOT/partials/individually-licensed-components/export-to-pdf/export-to-pdf-installation.adoc create mode 100644 modules/ROOT/partials/individually-licensed-components/export-to-pdf/export-to-pdf-logs.adoc create mode 100644 modules/ROOT/partials/individually-licensed-components/export-to-pdf/export-to-pdf-overview.adoc create mode 100644 modules/ROOT/partials/individually-licensed-components/export-to-pdf/export-to-pdf-requirements.adoc create mode 100644 modules/ROOT/partials/individually-licensed-components/export-to-pdf/export-to-pdf-ssl-communication.adoc create mode 100644 modules/ROOT/partials/individually-licensed-components/import-from-word-and-export-to-word/import-from-word-and-export-to-word-api-usage-on-premises.adoc create mode 100644 modules/ROOT/partials/individually-licensed-components/import-from-word-and-export-to-word/import-from-word-and-export-to-word-autorization-on-premises.adoc create mode 100644 modules/ROOT/partials/individually-licensed-components/import-from-word-and-export-to-word/import-from-word-and-export-to-word-installation-on-premises.adoc create mode 100644 modules/ROOT/partials/individually-licensed-components/import-from-word-and-export-to-word/import-from-word-and-export-to-word-logs-on-premises.adoc create mode 100644 modules/ROOT/partials/individually-licensed-components/import-from-word-and-export-to-word/import-from-word-and-export-to-word-overview-on-premises.adoc create mode 100644 modules/ROOT/partials/individually-licensed-components/import-from-word-and-export-to-word/import-from-word-and-export-to-word-requirements-on-premises.adoc create mode 100644 modules/ROOT/partials/individually-licensed-components/import-from-word-and-export-to-word/import-from-word-and-export-to-word-ssl-communication-on-premises.adoc diff --git a/antora.yml b/antora.yml index b509a00fa5..df496b588f 100644 --- a/antora.yml +++ b/antora.yml @@ -16,6 +16,12 @@ asciidoc: webcomponent_url: https://cdn.jsdelivr.net/npm/@tinymce/tinymce-webcomponent@2/dist/tinymce-webcomponent.min.js jquery_url: https://cdn.jsdelivr.net/npm/@tinymce/tinymce-jquery@2/dist/tinymce-jquery.min.js default_meta_keywords: tinymce, documentation, docs, plugins, customizable skins, configuration, examples, html, php, java, javascript, image editor, inline editor, distraction-free editor, classic editor, wysiwyg + # product docker variables + dockerimageimportfromwordexporttoword: registry.containers.tiny.cloud/docx-converter-tiny + dockerimageexporttopdf: registry.containers.tiny.cloud/pdf-converter-tiny + dockerimageexporttopdfwindows: registry.containers.tiny.cloud/pdf-converter-windows-tiny + # document converter placeholder variables + exportpdf_service_url: exportpdf_service_url placeholder # product variables productname: TinyMCE productmajorversion: 7 diff --git a/modules/ROOT/nav.adoc b/modules/ROOT/nav.adoc index 241e281c7f..3000691b9c 100644 --- a/modules/ROOT/nav.adoc +++ b/modules/ROOT/nav.adoc @@ -136,6 +136,8 @@ **** Individually licensed plugin services ***** xref:individual-hyperlinking-container.adoc[Hyperlinking service] ***** xref:individual-spelling-container.adoc[Spelling service] +***** xref:individual-export-to-pdf-on-premises.adoc[Export to PDF] +***** xref:individual-import-from-word-and-export-to-word-on-premises.adoc[Import from Word and Export to Word] *** Configure the server-side components **** xref:configure-required-services.adoc[Required configuration] **** xref:configure-common-settings-services.adoc[Optional common settings] diff --git a/modules/ROOT/pages/individual-export-to-pdf-on-premises.adoc b/modules/ROOT/pages/individual-export-to-pdf-on-premises.adoc new file mode 100644 index 0000000000..40f8f4f3d1 --- /dev/null +++ b/modules/ROOT/pages/individual-export-to-pdf-on-premises.adoc @@ -0,0 +1,21 @@ += Deploy the {productname} {pluginname} service server-side component using Docker (individually licensed) +:navtitle: Export to PDF +:description: Setting up Export to PDF using Docker. +:keywords: server-side, docker, export-to-pdf, on-premises +:pluginname: Export to PDF + +include::partial$individually-licensed-components/export-to-pdf/export-to-pdf-overview.adoc[] + +include::partial$individually-licensed-components/export-to-pdf/export-to-pdf-requirements.adoc[] + +include::partial$individually-licensed-components/export-to-pdf/export-to-pdf-installation.adoc[] + +include::partial$individually-licensed-components/export-to-pdf/export-to-pdf-fonts.adoc[] + +include::partial$individually-licensed-components/export-to-pdf/export-to-pdf-autorization.adoc[] + +include::partial$individually-licensed-components/export-to-pdf/export-to-pdf-api-usage.adoc[] + +include::partial$individually-licensed-components/export-to-pdf/export-to-pdf-ssl-communication.adoc[] + +include::partial$individually-licensed-components/export-to-pdf/export-to-pdf-logs.adoc[] \ No newline at end of file diff --git a/modules/ROOT/pages/individual-import-from-word-and-export-to-word-on-premises.adoc b/modules/ROOT/pages/individual-import-from-word-and-export-to-word-on-premises.adoc new file mode 100644 index 0000000000..3cca7d5e1b --- /dev/null +++ b/modules/ROOT/pages/individual-import-from-word-and-export-to-word-on-premises.adoc @@ -0,0 +1,19 @@ += Deploy the {productname} {pluginname} service server-side component using Docker (individually licensed) +:navtitle: Import from Word and Export to Word +:description: Setting up Import from Word and Export to Word using Docker. +:keywords: server-side, docker, import-from-word, export-to-word, on-premises +:pluginname: Import from Word and Export to Word + +include::partial$individually-licensed-components/import-from-word-and-export-to-word/import-from-word-and-export-to-word-overview-on-premises.adoc[] + +include::partial$individually-licensed-components/import-from-word-and-export-to-word/import-from-word-and-export-to-word-requirements-on-premises.adoc[] + +include::partial$individually-licensed-components/import-from-word-and-export-to-word/import-from-word-and-export-to-word-installation-on-premises.adoc[] + +include::partial$individually-licensed-components/import-from-word-and-export-to-word/import-from-word-and-export-to-word-autorization-on-premises.adoc[] + +include::partial$individually-licensed-components/import-from-word-and-export-to-word/import-from-word-and-export-to-word-api-usage-on-premises.adoc[] + +include::partial$individually-licensed-components/import-from-word-and-export-to-word/import-from-word-and-export-to-word-ssl-communication-on-premises.adoc[] + +include::partial$individually-licensed-components/import-from-word-and-export-to-word/import-from-word-and-export-to-word-logs-on-premises.adoc[] \ No newline at end of file diff --git a/modules/ROOT/partials/individually-licensed-components/export-to-pdf/export-to-pdf-api-usage.adoc b/modules/ROOT/partials/individually-licensed-components/export-to-pdf/export-to-pdf-api-usage.adoc new file mode 100644 index 0000000000..6f7b93f9e4 --- /dev/null +++ b/modules/ROOT/partials/individually-licensed-components/export-to-pdf/export-to-pdf-api-usage.adoc @@ -0,0 +1,42 @@ +[[api-usage]] +== API Usage + +The {pluginname} On-Premises converter provides the ability to convert an HTML document to a PDF file via Restful API. + +The API is available on `+http://localhost:[port]+` (by default the `port` is `8080`). + +[NOTE] +The REST API documentation is available at `+http://localhost:[port]/docs+`. +Alternatively, refer to the specifications in link:https://exportpdf.converter.tiny.cloud/docs[https://exportpdf.converter.tiny.cloud/docs^]. + +If the authorization for the API is enabled, provided an authorization token. More instructions can be found in the xref:individual-export-to-pdf-on-premises.adoc#authorization[authorization] section. + +=== Using additional HTTP headers + +If fetching some resources (e.g. images) used in a generated PDF requires passing an additional authorization factor in the form of additional HTTP headers: + +. It can be defined on the application startup by setting `EXTRA_HTTP_HEADERS` environmental variable where the value is a stringified JSON object with required headers. +. It can be defined in a request sent to the PDF Converter API in `options`: + +[source, js, subs="attributes+"] +---- +const data = { + html: '

I am a teapot

', + css: 'p { color: red; }', + options: { + extra_http_headers: { + authorization: 'Bearer ' + } + } +}; + +axios.post( '{exportpdf_service_url}', data, config ) + .then( response => { + fs.writeFileSync('./file.pdf', response.data, 'binary') + }).catch( error => { + console.log( error ); + }); +---- + +[TIP] +Headers defined in the application config and from the request are merged. If the same header is defined in both places, a header value from PDF options is prioritized over the value from the application config. \ No newline at end of file diff --git a/modules/ROOT/partials/individually-licensed-components/export-to-pdf/export-to-pdf-autorization.adoc b/modules/ROOT/partials/individually-licensed-components/export-to-pdf/export-to-pdf-autorization.adoc new file mode 100644 index 0000000000..6bcf161084 --- /dev/null +++ b/modules/ROOT/partials/individually-licensed-components/export-to-pdf/export-to-pdf-autorization.adoc @@ -0,0 +1,97 @@ +[[authorization]] +== Authorization + +To enable authorization, set the `SECRET_KEY` environment variable during the xref:individual-export-to-pdf-on-premises.adoc#installation[installation]. + +If the `SECRET_KEY` variable is set, then all requests must have a header with a JWT (JSON Web Token) signed with this key. The token should be passed as a value of the `Authorization` header for each request sent to the {pluginname} REST API. + +[NOTE] +If the `SECRET_KEY` is not setup during the installation, then {pluginname} On-Premises will not require any headers with tokens when sending requests to the {pluginname} REST API. However, this it is not recommend to skip the authorization when running {pluginname} On-Premises in a public network. + +=== Generating the token + +{companyname} recommends using the libraries listed on link:http://jwt.io/[jwt.io] to generate the token. The token is considered valid, when: + +* it is signed with the same `SECRET_KEY` as passed to the {pluginname} On-Premises instance, +* it was created within the last 24 hours, +* it is not issued in the future (e.i. the iat timestamp cannot be newer than the current time), +* it has not expired yet. + + +If the specific use case involves sending requests from a backend server, then JWT tokens can be generated locally, as shown in the below request example. + +In the case of editor plugins or other frontend usages, a token endpoint should be created, that returns a valid JWT token for authorized users. + +.Example of a endpoint implementation. +[source, js] +---- +const express = require( 'express' ); +const jwt = require( 'jsonwebtoken' ); + +const SECRET_KEY = 'secret_key'; + +const app = express(); + +app.use( ( req, res, next ) => { + res.setHeader( 'Access-Control-Allow-Origin', '*' ); + res.setHeader( 'Access-Control-Allow-Methods', 'GET' ); + + next(); +}); + +app.get( '/', ( req, res ) => { + const result = jwt.sign( {}, SECRET_KEY, { algorithm: 'HS256' } ); + + res.send( result ); +}); + +app.listen( 8080, () => console.log( 'Listening on port 8080' ) ); +---- + +=== Using editor plugins + +Plugins for {productname} will automatically request the token from the given `tokenUrl` variable and set the `Authorization` header when making an export request. + +[NOTE] +Refer to the xref:exportpdf.adoc[{pluginname}] plugin documentation for details on adding the {pluginname} feature to the editor. + +=== Request example with an Authorization header + +The following example presents a request that generates valid JWT token and sets it as `Authorization` header: + +[source, js] +---- +const fs = require( 'fs' ); +const jwt = require( 'jsonwebtoken' ); +const axios = require( 'axios' ); + +const SECRET_KEY = 'secret'; + +const token = jwt.sign( {}, SECRET_KEY, { algorithm: 'HS256' } ); + +const data = { + html: "

I am a teapot

", + css: "p { color: red; }", +}; + +const config = { + headers: { + 'Authorization': token + }, + responseType: 'arraybuffer', +}; + +axios.post( 'http://localhost:8080/v1/convert', data, config ) + .then( response => { + fs.writeFileSync('./file.pdf', response.data, 'binary'); + }).catch( error => { + console.log( error ); + }); +---- + +`SECRET_KEY` it’s the key which has been passed to the {pluginname} On-Premises instance + +Please refer to the link:https://exportpdf.converter.tiny.cloud/docs[{pluginname} REST API documentation] to start using the service. + +[NOTE] +If API clients like Postman or Insomnia are used, then set the JWT token as an `Authorization` header in the `Headers` tab. Do not use the built-in token authorization as this will generate invalid header with a `Bearer` prefix added to the token. \ No newline at end of file diff --git a/modules/ROOT/partials/individually-licensed-components/export-to-pdf/export-to-pdf-fonts.adoc b/modules/ROOT/partials/individually-licensed-components/export-to-pdf/export-to-pdf-fonts.adoc new file mode 100644 index 0000000000..f950c20157 --- /dev/null +++ b/modules/ROOT/partials/individually-licensed-components/export-to-pdf/export-to-pdf-fonts.adoc @@ -0,0 +1,65 @@ +[[fonts]] +== Fonts + +During document writing, the possibility of using many different fonts can be very important to users. + +Using the appropriate font can change the appearance of the document and emphasize its style. + +{pluginname} Converter allows link:https://exportpdf.converter.tiny.cloud/docs#section/Web-Fonts[Web Fonts^] to be used, which provided the integrator with the ability to use standard operating system fonts or use custom fonts without the need to import them using CSS. + +Below is a list of the basic fonts included in the image: + +[source] +---- +OpenSans-Bold.ttf +OpenSans-BoldItalic.ttf +OpenSans-ExtraBold.ttf +OpenSans-ExtraBoldItalic.ttf +OpenSans-Italic.ttf +OpenSans-Light.ttf +OpenSans-LightItalic.ttf +OpenSans-Regular.ttf +OpenSans-Semibold.ttf +OpenSans-SemiboldItalic.ttf +---- + +However, additional fonts can be added to {pluginname} Converter in two ways: + +* Use Unix-like PDF-Converter image `{dockerimageexporttopdf}` and mount fonts directory to it. +** See xref:individual-export-to-pdf-on-premises.adoc#add-custom-fonts-to-pdf-converter[Add custom fonts to PDF Converter] section. +* Use Windows PDF-Converter image `{dockerimageexporttopdf}` and mount to it fonts directory from the Windows operating system on which the container is running. +** See Use Windows fonts in PDF Converter section. + +[NOTE] +The fonts inside the mounted volume will be installed on the docker image operating system. Only the `.ttf` and `.otf` font formats are supported. If other font formats are used, these will need to be converted to the supported format prior or use fonts such as link:https://exportpdf.converter.tiny.cloud/docs#section/Web-Fonts[Web Fonts^]. + +[TIP] +Ensure that the converted fonts can be installed and used on your local machine first, before installing them on the docker container. + +[[add-custom-fonts-to-pdf-converter]] +=== Add custom fonts to PDF Converter + +If custom fonts are being used in PDF files, use the `pdf-converter-tiny` Docker image and mount the directory with the custom fonts for the PDF Converter application running on a machine with a Unix-like system (this includes Docker on Windows with a WSL backend). + +The `{dockerimageexporttopdf}` Docker image need to be run on a Unix-like operating system and mount the `~/your_fonts_dir:/usr/share/fonts/your_fonts_dir` volume. + +Launch the Docker container on Unix-like operating system example: + +[source, bash, subs="attributes+"] +---- +docker run --init -v ~/your_fonts_dir:/usr/share/fonts/your_fonts_dir -p 8080:8080 -e LICENSE_KEY=[your_license_key] {dockerimageexporttopdf}:[version] +---- + +[[use-windows-fonts-in-pdf-converter]] +=== Use Windows fonts in PDF Converter + +If using Windows fonts like Arial, Verdana, etc. in PDF files, use `pdf-converter-windows-tiny` Docker image that allows you to run the application on a machine with Windows operating system and mount fonts from the system. + +You just need to run `{dockerimageexporttopdf}` Docker image on Windows operating system and mount `C:\Windows\Fonts:C:\Windows\Fonts` volume. + +Launch the Docker container on Windows operating system example: + +[source, bash, subs="attributes+"] +---- +docker run -v C:\Windows\Fonts:C:\Windows\Fonts -p 8080:8080 --env LICENSE_KEY=[your_license_key] {dockerimageexporttopdfwindows}:[version] +---- \ No newline at end of file diff --git a/modules/ROOT/partials/individually-licensed-components/export-to-pdf/export-to-pdf-installation.adoc b/modules/ROOT/partials/individually-licensed-components/export-to-pdf/export-to-pdf-installation.adoc new file mode 100644 index 0000000000..45195b0e28 --- /dev/null +++ b/modules/ROOT/partials/individually-licensed-components/export-to-pdf/export-to-pdf-installation.adoc @@ -0,0 +1,98 @@ +[[installation]] +== Installation + +[NOTE] +A valid license key is needed in order to install {pluginname} On-Premises. +link:https://www.tiny.cloud/contact/[Contact us] for a trial license key. + +=== Supported technologies + +The application is provided as a docker image by default. + +It can be run with any Open Container runtime tool e.g. link:https://kubernetes.io/[Kubernetes], link:https://www.redhat.com/en/technologies/cloud-computing/openshift[OpenShift], link:https://podman.io/[Podman], link:https://docs.docker.com/[Docker] and many others. + +Refer to the xref:individual-export-to-pdf-on-premises.adoc#requirements[Requirements guide] for more information about the hardware and software requirements to run the {pluginname} On-Premises. + +=== Setting up the application using a Docker container + +. The username and password credentials supplied by Tiny are utilized for logging into the Docker registry and retrieving the Docker image. +. Containerize the application using `docker` or `docker-compose`. +. Use a demo page to verify if the application works properly. + +==== Containerize example using docker + +Login to Docker registry: + +[source, sh, subs="attributes+"] +---- +docker login -u [username] -p [password] registry.containers.tiny.cloud +---- + +Launch the Docker container: + +[source, sh, subs="attributes+"] +---- +docker run --init -p 8080:8080 -e LICENSE_KEY=[your_license_key] {dockerimageexporttopdf}:[version] +---- + +If using authorization provide the SECRET_KEY: + +[source, sh, subs="attributes+"] +---- +docker run --init -p 8080:8080 -e LICENSE_KEY=[your_license_key] -e SECRET_KEY=[your_secret_key] {dockerimageexporttopdf}:[version] +---- + +Read more about using authorization in the xref:individual-export-to-pdf-on-premises.adoc#authorization[authorization] section. + +==== Containerize example using docker-compose + +. Create the docker-compose.yml file: ++ +[source, yml, subs="attributes+"] +---- +version: "3.8" +services: + pdf-converter-tiny: + image: {dockerimageexporttopdf}:[version] + ports: + - "8080:8080" + restart: always + init: true + environment: + LICENSE_KEY: "license_key" + # Secret Key is optional + SECRET_KEY: "secret_key" + # Custom request origin is optional + CUSTOM_REQUEST_ORIGIN: "https://your_custom_origin" +---- ++ +For details on `SECRET_KEY` usage check the xref:individual-export-to-pdf-on-premises.adoc#authorization[authorization] section. ++ +. Run: + +[source, bash] +---- +docker-compose up +---- + +[NOTE] +==== +* Without a correct `LICENSE_KEY` the application will not start. +** If the license is invalid, a wrong license key error will display in the logs and the application will not run. +* It is advisable to override the SECRET_KEY variable using a unique and hard to guess string for security reasons. +* If the specific infrastructure has strict CORS enabled, then use the `CUSTOM_REQUEST_ORIGIN` variable to set the origin of requests made by the converter. The default value is `https://pdf-internal`. +==== + +=== Windows fonts support + +If using Windows fonts like Calibri, Verdana, etc. in PDF files, use the `pdf-converter-windows-tiny` Docker image and run it on a Windows operating system. + +See xref:individual-export-to-pdf-on-premises.adoc#fonts[Fonts] section for more details. + +=== Next steps + +Use the link:http://localhost:8080/v1/convert[http://localhost:8080/v1/convert] endpoint to export PDF files. Check out the xref:individual-export-to-pdf-on-premises.adoc#authorization[authorization] section to learn more about tokens and token endpoints. + +Use the demo page available on link:http://localhost:8080/demo[http://localhost:8080/demo] to generate an example PDF file. + +Refer to the {pluginname} REST API documentation on link:http://localhost:8080/docs[http://localhost:8080/docs] for more details. \ No newline at end of file diff --git a/modules/ROOT/partials/individually-licensed-components/export-to-pdf/export-to-pdf-logs.adoc b/modules/ROOT/partials/individually-licensed-components/export-to-pdf/export-to-pdf-logs.adoc new file mode 100644 index 0000000000..6a23a39e6d --- /dev/null +++ b/modules/ROOT/partials/individually-licensed-components/export-to-pdf/export-to-pdf-logs.adoc @@ -0,0 +1,212 @@ +[[logs]] +== Logs + +The logs from {pluginname} On-Premises are written to `stdout` and `stderr`. Most of them are formatted in JSON. They can be used for monitoring or debugging purposes. In production environments, It is recommend storing the logs to files or using a distributed logging system (like ELK or CloudWatch). + +=== Monitoring {pluginname} with logs + +To get more insight into how the {pluginname} On-Premises is performing, logs can be used for monitoring. To enable these, add the `ENABLE_METRIC_LOGS=true` environment variable. + +=== Log structure + +The log structure contains the following information: + +* `handler`: A unified identifier of action. Use this field to identify calls. +* `traceId`: A unique RPC call ID. +* `tags`: A semicolon-separated list of tags. Use this field to filter metrics logs. +* `data`: An object containing additional information. It might vary between different transports. +* `data.duration`: The request duration in milliseconds. +* `data.transport`: The type of the request transport. It could be http or ws (websocket). +* `data.status`: The request status. It can be equal to success, fail, warning. +* `data.statusCode`: The response status in HTTP status code standard. + +Additionally, for the HTTP transport, the following information is included: + +* `data.url`: The URL path. +* `data.method`: The request method. + +In case of an error, `data.status` will be equal to failed and `data.message` will contain the error message. + +An example log for HTTP transport: + +[source] +---- +{ + "level": 30, + "time": "2021-03-09T11:15:09.154Z", + "msg": "Request summary", + "handler": "convertHtmlToPdf", + "traceId": "85f13d92-57df-4b3b-98bb-0ca41a5ae601", + "data": { + "duration": 2470, + "transport": "http", + "statusCode": 200, + "status": "success", + "url": "/v1/convert", + "method": "POST" + }, + "tags": "metrics" +} +---- +// verify if this is something we will add. +//// +See example charts to check how to use logs for monitoring purposes. +//// + +=== Docker + +The docker has built-in logging mechanisms that capture logs from the output of the containers. The default logging driver writes the logs to files. + +When using this driver, use the `docker logs` command to show logs from a container. The `-f` flag can be added to view logs in real time. Refer to the link:https://docs.docker.com/engine/reference/commandline/logs/[official Docker documentation^] for more information about the logs command. + +[NOTE] +When a container is running for a long period of time, the logs can take up a lot of space. To avoid this problem, make sure that the log rotation is enabled. This can be set with the `max-size` option. + +=== Distributed logging + +If running more than one instance of {pluginname} On-Premises, It is recommend using a distributed logging system. It allows for viewing and analyzing logs from all instances in one place. + +==== AWS CloudWatch and other cloud solutions + +If running {pluginname} On-Premises in the cloud, the simplest and recommended way is to use a service that is available at the selected provider. + +Here are some of the available services: + +* AWS: link:https://aws.amazon.com/CloudWatch[CloudWatch^] +* Google Cloud: link:https://cloud.google.com/logging[Cloud Logging^] +* Azure: link:https://azure.microsoft.com/en-us/services/monitor/[Azure Monitor^] + +To use CloudWatch with AWS ECS, a log group must be created before, and the log driver must be changed to `awslogs`. When the log driver is configured properly, logs will be streamed directly to CloudWatch. + +The `logConfiguration` may look similar to this: + +[source, json] +---- +"logConfiguration": { + "logDriver": "awslogs", + "options": { + "awslogs-region": "us-west-2", + "awslogs-group": "tinysource", + "awslogs-stream-prefix": "tiny-pdf-converter-logs" + } +} +---- + +Refer to the link:https://docs.aws.amazon.com/AmazonECS/latest/developerguide/using_awslogs.html[Using the awslogs Log Driver] article for more information. + +=== On-Premises solutions + +If using a specific infrastructure such as your own or for some reason cannot use the service offered by a provider, some on-premises distributed logging system can be used. + +There are a lot of solutions available, including: + +* link:https://www.elastic.co/what-is/elk-stack[ELK^] + link:https://www.elastic.co/guide/en/beats/filebeat/current/filebeat-getting-started.html[Filebeat^] + +This is a stack built on top of Elasticsearch, Logstash and Kibana. In this configuration, Elasticsearch stores logs, Filebeat reads logs from Docker and sends them to Elasticsearch, and Kibana is used to view them. Logstash is not necessary because logs are already structured. + +* link:https://www.fluentd.org/[Fluentd^] + +It uses a dedicated link:https://docs.docker.com/config/containers/logging/fluentd[Docker log driver^] to send the logs. It has a built-in frontend, but can also be integrated with Elasticsearch and Kibana for better filtering. + +* link:https://www.graylog.org/[Graylog^] + +It uses a dedicated link:https://docs.docker.com/config/containers/logging/gelf[Docker^] log driver to send the logs. It has a built-in frontend and needs Elasticsearch to store the logs as well as a MongoDB database to store the configuration. + +==== Example configuration + +The example configuration uses Fluentd, Elasticsearch, and Kibana to capture logs from Docker. + +Before running {pluginname} On-Premises, prepare the logging services. For the purposes of this example, Docker Compose is used. Create the fluentd, elasticsearch and kibana services inside the docker-compose.yml file: + +[source, yaml] +---- +version: '3.7' +services: + fluentd: + build: ./fluentd + volumes: + - ./fluentd/fluent.conf:/fluentd/etc/fluent.conf + ports: + - "24224:24224" + - "24224:24224/udp" + + elasticsearch: + image: docker.elastic.co/elasticsearch/elasticsearch:6.8.5 + expose: + - 9200 + ports: + - "9200:9200" + + kibana: + image: docker.elastic.co/kibana/kibana:6.8.5 + environment: + ELASTICSEARCH_HOSTS: "http://elasticsearch:9200" + ports: + - "5601:5601" +---- + +To integrate Fluentd with Elasticsearch, first install `fluent-plugin-elasticsearch` in the Fluentd image. To do this, create a `fluentd/Dockerfile` with the following content: + +[source, dockerfile] +---- +FROM fluent/fluentd:v1.10-1 + +USER root + +RUN apk add --no-cache --update build-base ruby-dev \ + && gem install fluent-plugin-elasticsearch \ + && gem sources --clear-all +---- + +Next, configure the input server and connection to Elasticsearch in the `fluentd/fluent.conf` file: + +[source, xml] +---- + + @type forward + port 24224 + bind 0.0.0.0 + + + @type copy + + @type elasticsearch + host elasticsearch + port 9200 + logstash_format true + logstash_prefix fluentd + logstash_dateformat %Y%m%d + include_tag_key true + type_name access_log + tag_key @log_name + flush_interval 1s + + + @type stdout + + +---- + +The services are now ready to run: + +[source, bash] +---- +docker-compose up --build +---- + +When the services are ready, start {pluginname} On-Premises. + +[source, bash, subs="attributes+"] +---- +docker run --init -p 8080:8080 \ +--log-driver=fluentd \ +--log-opt fluentd-address=[Fluentd address]:24224 \ +[Your config here] \ +{dockerimageexporttopdf}:[version] +---- + +* Open Kibana in your browser. +** It is available at link:http://localhost:5601/[http://localhost:5601/]. +* During the first run, you may be asked about creating an index. +* Use the `fluentd-*` pattern and press the “Create” button. +* After this step, the logs should appear in the “Discover” tab. \ No newline at end of file diff --git a/modules/ROOT/partials/individually-licensed-components/export-to-pdf/export-to-pdf-overview.adoc b/modules/ROOT/partials/individually-licensed-components/export-to-pdf/export-to-pdf-overview.adoc new file mode 100644 index 0000000000..578111b725 --- /dev/null +++ b/modules/ROOT/partials/individually-licensed-components/export-to-pdf/export-to-pdf-overview.adoc @@ -0,0 +1,10 @@ +[[overview]] +== Overview + +The On-Premises version of the {pluginname} Converter is an application that can be installed and run on the customer’s in-house servers and computing infrastructure, including a private cloud. It contains all the features of the {pluginname} Converter available as SaaS. + +A valid license key is required in order to install {pluginname} Converter On-Premises. +link:https://www.tiny.cloud/contact/[Contact us] for a trial license key. + + +The only requirement to run {pluginname} On-Premises is a container runtime or orchestration tool e.g. Docker, Kubernetes, Podman. \ No newline at end of file diff --git a/modules/ROOT/partials/individually-licensed-components/export-to-pdf/export-to-pdf-requirements.adoc b/modules/ROOT/partials/individually-licensed-components/export-to-pdf/export-to-pdf-requirements.adoc new file mode 100644 index 0000000000..e7dc513c9e --- /dev/null +++ b/modules/ROOT/partials/individually-licensed-components/export-to-pdf/export-to-pdf-requirements.adoc @@ -0,0 +1,23 @@ +[[requirements]] +== Requirements + +To run {pluginname} On-Premises a Docker environment is required. Alternatively, use CaaS available from your cloud provider, like AWS ECS, Google GKE, or Azure ACS. + +There are many factors affecting {pluginname} On-Premises performance. The most influential are the size of exported content, the size of images, and the number of concurrent requests. Also, because your application can prioritize fast response times, or it should handle high load, it is impossible to provide one recommended server specification, that will fit all use cases. + +Assuming response time below 10 seconds, one server (2CPU 2GB RAM) with 1 docker container can handle: + +* up to 40 concurrent requests with an average content of 1 A4 page (~1k characters and 1 image) +* up to 25 concurrent requests with an average content of 5 A4 pages (~7,5k characters and 5 images) +* up to 10 concurrent requests with an average content of 20 A4 pages (~30k characters and 20 images) + +[NOTE] +The above concurrent requests numbers are not a hard limit of {pluginname} On-Premises instance. It can handle more concurrent requests, but the response time will be longer. + +=== High availability + +One docker container with {pluginname} On-Premises benefits from additional CPUs on the machine. To scale your app on a single machine, increase the number of CPUs, however, {companyname} recommends scaling on at least three hosts to ensure the reliability of the system. + +A load balancer, like HAProxy or NGINX (see the load balancer configuration examples in the SSL communication guide), is required for scaling on several machines. Of course, it is possible to use any cloud provider for scaling, like Amazon ECS, Azure Container Instances, or Kubernetes. + +link:https://www.tiny.cloud/contact/[Contact us] if you have any questions about server resources needed for your use case of {pluginname} On-Premises. \ No newline at end of file diff --git a/modules/ROOT/partials/individually-licensed-components/export-to-pdf/export-to-pdf-ssl-communication.adoc b/modules/ROOT/partials/individually-licensed-components/export-to-pdf/export-to-pdf-ssl-communication.adoc new file mode 100644 index 0000000000..193cb88f60 --- /dev/null +++ b/modules/ROOT/partials/individually-licensed-components/export-to-pdf/export-to-pdf-ssl-communication.adoc @@ -0,0 +1,68 @@ +[[ssl-communication]] +== SSL Communication + +Its possible to communicate with {pluginname} On-Premises using secure connections. To achieve this, the load balancer like `NGINX` or `HAProxy` needs to be setup with your SSL certificate. + +`HAProxy` and `NGINX` configuration examples below. + +=== HAProxy example + +Here is a basic `HAProxy` configuration: + +[source, nginx] +---- +global + daemon + maxconn 256 + tune.ssl.default-dh-param 2048 + +defaults + mode http + timeout connect 5000ms + timeout client 50000ms + timeout server 50000ms + +frontend http-in + bind *:80 + bind *:443 ssl crt /etc/ssl/your_certificate.pem + http-request set-header X-Forwarded-Proto https if { ssl_fc } + http-request set-header X-Forwarded-Proto http if !{ ssl_fc } + redirect scheme https if !{ ssl_fc } + + default_backend servers + +backend servers + server server1 127.0.0.1:8000 maxconn 32 +---- + +=== NGINX example + +Here is a basic `NGINX` configuration: + +[source, nginx] +---- +events { + worker_connections 1024; +} + +http { + server { + server_name your.domain.name; + + listen 443; + ssl on; + ssl_certificate /etc/ssl/your_cert.crt; + ssl_certificate_key /etc/ssl/your_cert_key.key; + + location / { + proxy_pass http://127.0.0.1:8000; + + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "Upgrade"; + proxy_set_header Host $host; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_http_version 1.1; + } + } +} +---- \ No newline at end of file diff --git a/modules/ROOT/partials/individually-licensed-components/import-from-word-and-export-to-word/import-from-word-and-export-to-word-api-usage-on-premises.adoc b/modules/ROOT/partials/individually-licensed-components/import-from-word-and-export-to-word/import-from-word-and-export-to-word-api-usage-on-premises.adoc new file mode 100644 index 0000000000..8b5081a61a --- /dev/null +++ b/modules/ROOT/partials/individually-licensed-components/import-from-word-and-export-to-word/import-from-word-and-export-to-word-api-usage-on-premises.adoc @@ -0,0 +1,15 @@ +[[api-usage]] +== API usage + +{pluginname} On-Premises consists of two services: + +* xref:exportword.adoc[Export to Word] provides conversion from an HTML document to a `.docx` file via Restful API. +* xref:importword.adoc[Import from Word] allows importing `.docx` file and converting it into a styled HTML document with comments and suggestions attached. + +The API is available on `+http://localhost:[port]+` (by default the port is 8080). + +[NOTE] +The REST API documentation is available at `+http://localhost:[port]/docs+`. +Alternatively you can check specification in our public resources for link:https://importdocx.converter.tiny.cloud/docs#section/Import-from-Word[Import from Word^] and the link:https://exportdocx.converter.tiny.cloud/docs#section/Export-to-Word[Export to Word^] plugins. + +If you have the authorization for the API enabled, you should provide an authorization token. More instructions you can find in the authorization section. \ No newline at end of file diff --git a/modules/ROOT/partials/individually-licensed-components/import-from-word-and-export-to-word/import-from-word-and-export-to-word-autorization-on-premises.adoc b/modules/ROOT/partials/individually-licensed-components/import-from-word-and-export-to-word/import-from-word-and-export-to-word-autorization-on-premises.adoc new file mode 100644 index 0000000000..c36301f913 --- /dev/null +++ b/modules/ROOT/partials/individually-licensed-components/import-from-word-and-export-to-word/import-from-word-and-export-to-word-autorization-on-premises.adoc @@ -0,0 +1,69 @@ +[[authorization]] +== Authorization + +To enable authorization, set the `SECRET_KEY` environment variable during the xref:individual-import-from-word-and-export-to-word-on-premises.adoc#installation[installation]. + +If the `SECRET_KEY` variable is set, then all requests must have a header with a JWT (JSON Web Token) signed with this key. The token should be passed as a value of the `Authorization` header for each request sent to the {pluginname} REST API. + +[NOTE] +If the `SECRET_KEY` is not setup during the installation, then {pluginname} On-Premises will not require any headers with tokens when sending requests to the {pluginname} REST API. However, this it is not recommend to skip the authorization when running {pluginname} On-Premises in a public network. + +=== Generating the token + +{companyname} recommends using the libraries listed on link:http://jwt.io/[jwt.io] to generate the token. The token is considered valid, when: + +* it is signed with the same `SECRET_KEY` as passed to the {pluginname} On-Premises instance, +* it was created within the last 24 hours, +* it is not issued in the future (e.i. the `iat` timestamp cannot be newer than the current time), +* it has not expired yet. + +Tokens for the {pluginname} On-Premises do not require any additional claims such as the environment ID (which is specific for Collaboration Server On-Premises), the token can be created with an empty payload. + +If the specific use case involves sending requests from a backend server, then JWT tokens can be generated locally, as shown in the below request example. + +In the case of editor plugins or other frontend usages, a token endpoint should be created, that returns a valid JWT token for authorized users. + +=== Using editor plugins + +The are are two plugins available for {productname}: the xref:importword.adoc[Import from Word] and the xref:exportword.adoc[Export to Word] plugins. The plugins will automatically request the token from the given `tokenUrl` variable and will set the `Authorization` header when making an export request. Refer to the respective guides for details on adding the {pluginname} features to your WYSIWYG editor! + +=== Request example with an Authorization header + +The following example presents a request that generates a valid JWT token and sets it as an `Authorization` header: + +[source, js] +---- +const fs = require( 'fs' ); +const jwt = require( 'jsonwebtoken' ); +const axios = require( 'axios' ); + +const SECRET_KEY = 'secret'; + +const token = jwt.sign( {}, SECRET_KEY, { algorithm: 'HS256' } ); + +const data = { + html: "

I am a teapot

", + css: "p { color: red; }", +}; + +const config = { + headers: { + Authorization: token + }, + responseType: 'arraybuffer', +}; + +axios.post( 'http://localhost:8080/v1/convert', data, config ) + .then( response => { + fs.writeFileSync('./file.docx', response.data, 'binary'); + } ).catch( error => { + console.log( error ); + } ); +---- + +`SECRET_KEY`: This is the key what has been passed to the {pluginname} On-Premises instance. + +Please refer to the link:https://importdocx.converter.tiny.cloud/docs#section/Import-from-Word[Import from Word^] and the link:https://exportdocx.converter.tiny.cloud/docs#section/Export-to-Word[Export to Word^] REST API documentation to start using the service. + +[NOTE] +If API clients like Postman or Insomnia are used, then set the JWT token as an `Authorization` header in the `Headers` tab. Do not use the built-in token authorization as this will generate invalid header with a `Bearer` prefix added to the token. \ No newline at end of file diff --git a/modules/ROOT/partials/individually-licensed-components/import-from-word-and-export-to-word/import-from-word-and-export-to-word-installation-on-premises.adoc b/modules/ROOT/partials/individually-licensed-components/import-from-word-and-export-to-word/import-from-word-and-export-to-word-installation-on-premises.adoc new file mode 100644 index 0000000000..3694110b64 --- /dev/null +++ b/modules/ROOT/partials/individually-licensed-components/import-from-word-and-export-to-word/import-from-word-and-export-to-word-installation-on-premises.adoc @@ -0,0 +1,89 @@ +[[installation]] +== Installation + +[NOTE] +A valid license key is needed in order to install {pluginname} On-Premises. +link:https://www.tiny.cloud/contact/[Contact us] for a trial license key. + +=== Supported technologies + +The application is provided as a docker image by default. + +It can be run with any Open Container runtime tool e.g. link:https://kubernetes.io/[Kubernetes], link:https://www.redhat.com/en/technologies/cloud-computing/openshift[OpenShift], link:https://podman.io/[Podman], link:https://docs.docker.com/[Docker] and many others. + +Refer to the xref:individual-import-from-word-and-export-to-word-on-premises.adoc#requirements[Requirements guide] for more information about the hardware and software requirements to run the {pluginname} On-Premises. + +=== Setting up the application using a Docker container + +. The username and password credentials supplied by Tiny are utilized for logging into the Docker registry and retrieving the Docker image. +. Containerize the application using `docker` or `docker-compose`. +. Use a demo page to verify if the application works properly. + +==== Containerize example using docker + +Login to Docker registry: + +[source, sh, subs="attributes+"] +---- +docker login -u [username] -p [password] registry.containers.tiny.cloud +---- + +Launch the Docker container: + +[source, sh, subs="attributes+"] +---- +docker run --init -p 8080:8080 -e LICENSE_KEY=[your_license_key] {dockerimageimportfromwordexporttoword}:[version] +---- + +If using authorization provide the SECRET_KEY: + +[source, sh, subs="attributes+"] +---- +docker run --init -p 8080:8080 -e LICENSE_KEY=[your_license_key] -e SECRET_KEY=[your_secret_key] {dockerimageimportfromwordexporttoword}:[version] +---- + +Read more about using authorization in the xref:individual-import-from-word-and-export-to-word-on-premises.adoc#authorization[authorization] section. + +==== Containerize example using docker-compose + +. Create the docker-compose.yml file: ++ +[source, yml, subs="attributes+"] +---- +version: "3.8" +services: + doc-converter: + image: {dockerimageimportfromwordexporttoword}:[version] + ports: + - "8080:8080" + restart: always + init: true + environment: + LICENSE_KEY: "licensekey" + # Secret Key is optional + SECRET_KEY: "secret_key" +---- ++ +For details on `SECRET_KEY` usage check the xref:individual-import-from-word-and-export-to-word-on-premises.adoc#authorization[authorization] section. ++ +. Run: + +[source, bash] +---- +docker-compose up +---- + +[NOTE] +==== +* Without a correct `LICENSE_KEY` the application will not start. +** If the license is invalid, a wrong license key error will display in the logs and the application will not run. +* It is advisable to override the `SECRET_KEY` variable using a unique and hard to guess string for security reasons. +==== + +=== Next steps + +Use the link:http://localhost:8080/v1/convert[http://localhost:8080/v1/convert] endpoint to export DOCX files. Check out the xref:individual-import-from-word-and-export-to-word-on-premises.adoc#authorization[authorization] section to learn more about tokens and token endpoints. + +Use the demo page available on link:http://localhost:8080/demo[http://localhost:8080/demo] to generate an example DOCX file. + +Refer to the {pluginname} REST API documentation on link:http://localhost:8080/docs[http://localhost:8080/docs] for more details. \ No newline at end of file diff --git a/modules/ROOT/partials/individually-licensed-components/import-from-word-and-export-to-word/import-from-word-and-export-to-word-logs-on-premises.adoc b/modules/ROOT/partials/individually-licensed-components/import-from-word-and-export-to-word/import-from-word-and-export-to-word-logs-on-premises.adoc new file mode 100644 index 0000000000..29ff606fee --- /dev/null +++ b/modules/ROOT/partials/individually-licensed-components/import-from-word-and-export-to-word/import-from-word-and-export-to-word-logs-on-premises.adoc @@ -0,0 +1,208 @@ +[[logs]] +== Logs + +The logs from {pluginname} On-Premises are written to `stdout` and `stderr`. Most of them are formatted in JSON. They can be used for monitoring or debugging purposes. In production environments, It is recommend storing the logs to files or using a distributed logging system (like ELK or CloudWatch). + +=== Monitoring {pluginname} with logs + +To get more insight into how the {pluginname} On-Premises is performing, logs can be used for monitoring. To enable these, add the `ENABLE_METRIC_LOGS=true` environment variable. + +=== Log structure + +The log structure contains the following information: + +* `handler`: A unified identifier of action. Use this field to identify calls. +* `traceId`: A unique RPC call ID. +* `tags`: A semicolon-separated list of tags. Use this field to filter metrics logs. +* `data`: An object containing additional information. It might vary between different transports. +* `data.duration`: The request duration in milliseconds. +* `data.transport`: The type of the request transport. It could be http or ws (websocket). +* `data.status`: The request status. It can be equal to success, fail, warning. +* `data.statusCode`: The response status in HTTP status code standard. + +Additionally, for the HTTP transport, the following information is included: + +* `data.url`: The URL path. +* `data.method`: The request method. + +In case of an error, `data.status` will be equal to `failed` and `data.message` will contain the error message. + +An example log for HTTP transport: + +[source] +---- +{ + "level": 30, + "time": "2021-03-09T11:15:09.154Z", + "msg": "Request summary", + "handler": "postConvert", + "traceId": "85f13d92-57df-4b3b-98bb-0ca41a5ae601", + "data": { + "duration": 752, + "transport": "http", + "statusCode": 200, + "status": "success", + "url": "/v1/convert", + "method": "POST" + }, + "tags": "metrics" +} +---- + +=== Docker + +The docker has built-in logging mechanisms that capture logs from the output of the containers. The default logging driver writes the logs to files. + +When using this driver, use the `docker logs` command to show logs from a container. Use the `-f` flag to view logs in real time. Refer to the link:https://docs.docker.com/engine/reference/commandline/logs/[official Docker documentation] for more information about the logs command. + +[NOTE] +When a container is running for a long period of time, the logs can take up a lot of space. To avoid this problem, you should make sure that the log rotation is enabled. This can be set with the `max-size` option. + +=== Distributed logging + +If running more than one instance of {pluginname} On-Premises, It is recommend using a distributed logging system. It allows for viewing and analyzing logs from all instances in one place. + +=== AWS CloudWatch and other cloud solutions + +If running {pluginname} On-Premises in the cloud, the simplest and recommended way is to use a service that is available at the selected provider. + +Here are some of the available services: + +* AWS: link:https://aws.amazon.com/CloudWatch[CloudWatch^] +* Google Cloud: link:https://cloud.google.com/logging[Cloud Logging^] +* Azure: link:https://azure.microsoft.com/en-us/services/monitor/[Azure Monitor^] + +To use CloudWatch with AWS ECS, a log group must be created before, and the log driver must be changed to `awslogs`. When the log driver is configured properly, logs will be streamed directly to CloudWatch. + +The `logConfiguration` may look similar to this: + +[source, json] +---- +"logConfiguration": { + "logDriver": "awslogs", + "options": { + "awslogs-region": "us-west-2", + "awslogs-group": "tinysource", + "awslogs-stream-prefix": "tiny-docx-converter-logs" + } +} +---- + +Refer to the link:https://docs.aws.amazon.com/AmazonECS/latest/developerguide/using_awslogs.html[Using the awslogs Log Driver] article for more information. + +=== On-Premises solutions + +If using a specific infrastructure such as your own or for some reason cannot use the service offered by a provider, some on-premises distributed logging system can be used. + +There are a lot of solutions available, including: + +* link:https://www.elastic.co/what-is/elk-stack[ELK^] + link:https://www.elastic.co/guide/en/beats/filebeat/current/filebeat-getting-started.html[Filebeat^] + +This is a stack built on top of Elasticsearch, Logstash and Kibana. In this configuration, Elasticsearch stores logs, Filebeat reads logs from Docker and sends them to Elasticsearch, and Kibana is used to view them. Logstash is not necessary because logs are already structured. + +* link:https://www.fluentd.org/[Fluentd^] + +It uses a dedicated link:https://docs.docker.com/config/containers/logging/fluentd[Docker log driver^] to send the logs. It has a built-in frontend, but can also be integrated with Elasticsearch and Kibana for better filtering. + +* link:https://www.graylog.org/[Graylog^] + +It uses a dedicated link:https://docs.docker.com/config/containers/logging/gelf[Docker^] log driver to send the logs. It has a built-in frontend and needs Elasticsearch to store the logs as well as a MongoDB database to store the configuration. + +==== Example configuration + +The example configuration uses Fluentd, Elasticsearch and Kibana to capture logs from Docker. + +Before running {pluginname} On-Premises, prepare the logging services. For the purposes of this example, Docker Compose is used. Create the `fluentd`, `elasticsearch` and `kibana` services inside the `docker-compose.yml` file: + +[source, yaml] +---- +version: '3.7' +services: + fluentd: + build: ./fluentd + volumes: + - ./fluentd/fluent.conf:/fluentd/etc/fluent.conf + ports: + - "24224:24224" + - "24224:24224/udp" + + elasticsearch: + image: docker.elastic.co/elasticsearch/elasticsearch:6.8.5 + expose: + - 9200 + ports: + - "9200:9200" + + kibana: + image: docker.elastic.co/kibana/kibana:6.8.5 + environment: + ELASTICSEARCH_HOSTS: "http://elasticsearch:9200" + ports: + - "5601:5601" +---- + +To integrate Fluentd with Elasticsearch, you first need to install `fluent-plugin-elasticsearch` in the Fluentd image. To do this, create a `fluentd/Dockerfile` with the following content: + +[source, dockerfile] +---- +FROM fluent/fluentd:v1.10-1 + +USER root + +RUN apk add --no-cache --update build-base ruby-dev \ + && gem install fluent-plugin-elasticsearch \ + && gem sources --clear-all +---- + +Next, configure the input server and connection to Elasticsearch in the `fluentd/fluent.conf` file: + +[source, xml] +---- + + @type forward + port 24224 + bind 0.0.0.0 + + + @type copy + + @type elasticsearch + host elasticsearch + port 9200 + logstash_format true + logstash_prefix fluentd + logstash_dateformat %Y%m%d + include_tag_key true + type_name access_log + tag_key @log_name + flush_interval 1s + + + @type stdout + + +---- + +The services are now ready to run: + +[source, bash] +---- +docker-compose up --build +---- + +When the services are ready, start the {pluginname} On-Premises. + +[source, bash, subs="attributes+"] +---- +docker run --init -p 8080:8080 \ +--log-driver=fluentd \ +--log-opt fluentd-address=[Fluentd address]:24224 \ +[Your config here] \ +{dockerimageimportfromwordexporttoword}:[version] +---- + +* Open Kibana in your browser. +** It is available at link:http://localhost:5601/[http://localhost:5601/]. +* During the first run, you may be asked about creating an index. +* Use the `fluentd-*` pattern and press the “Create” button. +* After this step, the logs should appear in the “Discover” tab. \ No newline at end of file diff --git a/modules/ROOT/partials/individually-licensed-components/import-from-word-and-export-to-word/import-from-word-and-export-to-word-overview-on-premises.adoc b/modules/ROOT/partials/individually-licensed-components/import-from-word-and-export-to-word/import-from-word-and-export-to-word-overview-on-premises.adoc new file mode 100644 index 0000000000..c6f59f086d --- /dev/null +++ b/modules/ROOT/partials/individually-licensed-components/import-from-word-and-export-to-word/import-from-word-and-export-to-word-overview-on-premises.adoc @@ -0,0 +1,10 @@ +[[overview]] +== Overview + +{pluginname} is a set of two converter services that allow for both exporting a structured HTML content (e.g. created with {productname} WYSIWYG editor) into a `.docx` Microsoft Word file and for importing content from `.docx` and `.dotx` files and converting it into a styled HTML document. + +A valid license key is needed in order to install {pluginname} On-Premises. link:https://www.tiny.cloud/contact/[Contact us] for a trial license key. + +The documentation in this section refers to a simplified version of the {pluginname} On-Premises which was designed to be easy to set up and maintain (while preserving all the features). It also lowers the running costs by reducing the number of servers required to run the whole application to the minimum. + +The only requirement to run {pluginname} On-Premises is a container runtime or orchestration tool e.g. Docker, Kubernetes, Podman. \ No newline at end of file diff --git a/modules/ROOT/partials/individually-licensed-components/import-from-word-and-export-to-word/import-from-word-and-export-to-word-requirements-on-premises.adoc b/modules/ROOT/partials/individually-licensed-components/import-from-word-and-export-to-word/import-from-word-and-export-to-word-requirements-on-premises.adoc new file mode 100644 index 0000000000..b315d08898 --- /dev/null +++ b/modules/ROOT/partials/individually-licensed-components/import-from-word-and-export-to-word/import-from-word-and-export-to-word-requirements-on-premises.adoc @@ -0,0 +1,23 @@ +[[requirements]] +== Requirements + +To run {pluginname} On-Premises, a Docker environment is required. Alternatively, use a CaaS available from your cloud provider, such as AWS ECS, Google GKE or Azure ACS. + +There are many factors that may affect Export to Word On-Premises performance. The most influential are: the size of exported content, the size of images, and the number of concurrent requests. Also, because your application can prioritize fast response times, or it should handle high load, it is impossible to provide one recommended server specification, that will fit all use cases. + +Assuming response time below 10 seconds, one server (2CPU 2GB RAM) with 1 docker container can handle: + +* up to 45 concurrent requests with an average content of 1 A4 page (~1k characters) +* up to 30 concurrent requests with an average content of 5 A4 pages (~7,5k characters) +* up to 10 concurrent requests with an average content of 20 A4 pages (~30k characters) + +[NOTE] +The listed concurrent requests numbers are not a hard limit of a {pluginname} On-Premises instance. It can handle more concurrent requests, but the response time will be longer. + +=== High availability + +One docker container with {pluginname} On-Premises benefits from additional CPUs on the machine. It is recommended that 2 CPUs are allocated for every docker container. To scale your app on a single machine, increase the number of CPUs and docker containers, however, {productname} recommends scaling on at least three hosts to ensure the reliability of the system. + +A load balancer, like HAProxy or NGINX (see the load balancer configuration examples in the SSL communication guide), is required for scaling on several machines. Of course, it is possible to use any cloud provider for scaling, like Amazon ECS, Azure Container Instances or Kubernetes. + +link:https://www.tiny.cloud/contact/[Contact us] if you have any questions about server resources needed for your use case of {pluginname} On-Premises. \ No newline at end of file diff --git a/modules/ROOT/partials/individually-licensed-components/import-from-word-and-export-to-word/import-from-word-and-export-to-word-ssl-communication-on-premises.adoc b/modules/ROOT/partials/individually-licensed-components/import-from-word-and-export-to-word/import-from-word-and-export-to-word-ssl-communication-on-premises.adoc new file mode 100644 index 0000000000..83c159e7f6 --- /dev/null +++ b/modules/ROOT/partials/individually-licensed-components/import-from-word-and-export-to-word/import-from-word-and-export-to-word-ssl-communication-on-premises.adoc @@ -0,0 +1,68 @@ +[[sll-communication]] +== SSL Communication + +Its possible to communicate with {pluginname} On-Premises using secure connections. To achieve this, the load balancer like `NGINX` or `HAProxy` needs to be setup with your SSL certificate. + +`HAProxy` and `NGINX` configuration examples below. + +=== HAProxy example + +Here is a basic `HAProxy` configuration: + +[source, nginx] +---- +global + daemon + maxconn 256 + tune.ssl.default-dh-param 2048 + +defaults + mode http + timeout connect 5000ms + timeout client 50000ms + timeout server 50000ms + +frontend http-in + bind *:80 + bind *:443 ssl crt /etc/ssl/your_certificate.pem + http-request set-header X-Forwarded-Proto https if { ssl_fc } + http-request set-header X-Forwarded-Proto http if !{ ssl_fc } + redirect scheme https if !{ ssl_fc } + + default_backend servers + +backend servers + server server1 127.0.0.1:8000 maxconn 32 +---- + +=== NGINX example + +Here is a basic NGINX configuration: + +[source, nginx] +---- +events { + worker_connections 1024; +} + +http { + server { + server_name your.domain.name; + + listen 443; + ssl on; + ssl_certificate /etc/ssl/your_cert.crt; + ssl_certificate_key /etc/ssl/your_cert_key.key; + + location / { + proxy_pass http://127.0.0.1:8000; + + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "Upgrade"; + proxy_set_header Host $host; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_http_version 1.1; + } + } +} +---- \ No newline at end of file From 2acb970806849d6e55fd0cfaac3310fc7e7ffe46 Mon Sep 17 00:00:00 2001 From: Karl Kemister-Sheppard Date: Mon, 15 Apr 2024 11:39:31 +1000 Subject: [PATCH 05/97] Merge latest changes from `release/docs-7` into `staging/docs-7` (#3223) * DOC-2358: bump api-version for TinyMCE 7.0.1 (#3222) * DOC-2339: On-premises documentation for document converters. (#3180) * DOC-2339: On-premises documentation for document converters. * Update modules/ROOT/pages/individual-export-to-pdf-on-premises.adoc * Update modules/ROOT/pages/individual-export-to-word-on-premises.adoc * Update modules/ROOT/pages/individual-import-from-word-on-premises.adoc * DOC-2351: On-premises `Export to PDF` documentation. (#3182) * DOC-2351: On-premises export to pdf documentation. * Update modules/ROOT/partials/individually-licensed-components/export-to-pdf/export-to-pdf-nightly-releases.adoc * DOC-2351: update docker img with variable replacement. * Update antora.yml * DOC-2351: remove nightly builds, update variable for docker. * DOC-2351: copy edits, and initial cleanup. * Update modules/ROOT/partials/individually-licensed-components/export-to-pdf/export-to-pdf-installation.adoc * Update modules/ROOT/partials/individually-licensed-components/export-to-pdf/export-to-pdf-autorization.adoc * Updating antora.yml - Added another parameter Co-authored-by: Karl Kemister-Sheppard * Update export-to-pdf-fonts.adoc - corrected the file name * Update export-to-pdf-fonts.adoc - image name correction * Update export-to-pdf-installation.adoc - content changes * Update export-to-pdf-installation.adoc - change in instructions * Update export-to-pdf-installation.adoc - updated image name * Update export-to-pdf-installation.adoc - corrections made to yml file * Update export-to-pdf-installation.adoc - removed <> for license key * Update modules/ROOT/partials/individually-licensed-components/export-to-pdf/export-to-pdf-requirements.adoc * Update modules/ROOT/partials/individually-licensed-components/export-to-pdf/export-to-pdf-installation.adoc * Update modules/ROOT/partials/individually-licensed-components/export-to-pdf/export-to-pdf-installation.adoc * Update modules/ROOT/partials/individually-licensed-components/export-to-pdf/export-to-pdf-fonts.adoc * Update modules/ROOT/partials/individually-licensed-components/export-to-pdf/export-to-pdf-autorization.adoc * Update modules/ROOT/partials/individually-licensed-components/export-to-pdf/export-to-pdf-autorization.adoc * Update modules/ROOT/partials/individually-licensed-components/export-to-pdf/export-to-pdf-autorization.adoc * Update modules/ROOT/partials/individually-licensed-components/export-to-pdf/export-to-pdf-logs.adoc * Update modules/ROOT/partials/individually-licensed-components/export-to-pdf/export-to-pdf-overview.adoc * Update modules/ROOT/partials/individually-licensed-components/export-to-pdf/export-to-pdf-api-usage.adoc * Update modules/ROOT/partials/individually-licensed-components/export-to-pdf/export-to-pdf-installation.adoc * Update modules/ROOT/partials/individually-licensed-components/export-to-pdf/export-to-pdf-installation.adoc * Update modules/ROOT/partials/individually-licensed-components/export-to-pdf/export-to-pdf-api-usage.adoc * Update modules/ROOT/partials/individually-licensed-components/export-to-pdf/export-to-pdf-api-usage.adoc * Update modules/ROOT/partials/individually-licensed-components/export-to-pdf/export-to-pdf-requirements.adoc * Update modules/ROOT/partials/individually-licensed-components/export-to-pdf/export-to-pdf-autorization.adoc * Update modules/ROOT/partials/individually-licensed-components/export-to-pdf/export-to-pdf-installation.adoc * Update modules/ROOT/partials/individually-licensed-components/export-to-pdf/export-to-pdf-fonts.adoc --------- Co-authored-by: shirqa <43625458+ShiridiGandham@users.noreply.github.com> * DOC-2352: On-premises `Import from Word and Export to Word` documentation. (#3187) * DOC-2352: On-premises Import from Word and Export to Word documentation. * Apply suggestions from code review Updated content to reflect correct image names and also added login prerequisite details * Update import-from-word-and-export-to-word-overview-on-premises.adoc - content alignment * Update modules/ROOT/partials/individually-licensed-components/import-from-word-and-export-to-word/import-from-word-and-export-to-word-logs-on-premises.adoc * Update modules/ROOT/partials/individually-licensed-components/import-from-word-and-export-to-word/import-from-word-and-export-to-word-overview-on-premises.adoc * Update modules/ROOT/partials/individually-licensed-components/import-from-word-and-export-to-word/import-from-word-and-export-to-word-overview-on-premises.adoc * Update modules/ROOT/partials/individually-licensed-components/import-from-word-and-export-to-word/import-from-word-and-export-to-word-requirements-on-premises.adoc * Update modules/ROOT/partials/individually-licensed-components/import-from-word-and-export-to-word/import-from-word-and-export-to-word-installation-on-premises.adoc * Update modules/ROOT/partials/individually-licensed-components/import-from-word-and-export-to-word/import-from-word-and-export-to-word-logs-on-premises.adoc * Update modules/ROOT/partials/individually-licensed-components/import-from-word-and-export-to-word/import-from-word-and-export-to-word-installation-on-premises.adoc * Update modules/ROOT/partials/individually-licensed-components/import-from-word-and-export-to-word/import-from-word-and-export-to-word-logs-on-premises.adoc * Update modules/ROOT/partials/individually-licensed-components/import-from-word-and-export-to-word/import-from-word-and-export-to-word-api-usage-on-premises.adoc * Update modules/ROOT/partials/individually-licensed-components/import-from-word-and-export-to-word/import-from-word-and-export-to-word-api-usage-on-premises.adoc * Update modules/ROOT/partials/individually-licensed-components/import-from-word-and-export-to-word/import-from-word-and-export-to-word-autorization-on-premises.adoc * Update modules/ROOT/partials/individually-licensed-components/import-from-word-and-export-to-word/import-from-word-and-export-to-word-autorization-on-premises.adoc * Update modules/ROOT/partials/individually-licensed-components/import-from-word-and-export-to-word/import-from-word-and-export-to-word-overview-on-premises.adoc * Update modules/ROOT/partials/individually-licensed-components/import-from-word-and-export-to-word/import-from-word-and-export-to-word-overview-on-premises.adoc --------- Co-authored-by: shirqa <43625458+ShiridiGandham@users.noreply.github.com> --------- Co-authored-by: shirqa <43625458+ShiridiGandham@users.noreply.github.com> --------- Co-authored-by: Farzad Hayat Co-authored-by: shirqa <43625458+ShiridiGandham@users.noreply.github.com> --- .api-version | 2 +- antora.yml | 6 + modules/ROOT/nav.adoc | 2 + modules/ROOT/pages/apis/tinymce.editor.adoc | 21 +- .../apis/tinymce.editor.ui.registry.adoc | 4 +- .../apis/tinymce.notificationmanager.adoc | 2 +- modules/ROOT/pages/apis/tinymce.root.adoc | 4 +- .../pages/apis/tinymce.util.observable.adoc | 20 +- .../pages/apis/tinymce.windowmanager.adoc | 6 +- .../individual-export-to-pdf-on-premises.adoc | 21 ++ ...m-word-and-export-to-word-on-premises.adoc | 19 ++ .../export-to-pdf-api-usage.adoc | 42 ++++ .../export-to-pdf-autorization.adoc | 97 ++++++++ .../export-to-pdf/export-to-pdf-fonts.adoc | 65 ++++++ .../export-to-pdf-installation.adoc | 98 ++++++++ .../export-to-pdf/export-to-pdf-logs.adoc | 212 ++++++++++++++++++ .../export-to-pdf/export-to-pdf-overview.adoc | 10 + .../export-to-pdf-requirements.adoc | 23 ++ .../export-to-pdf-ssl-communication.adoc | 68 ++++++ ...-export-to-word-api-usage-on-premises.adoc | 15 ++ ...port-to-word-autorization-on-premises.adoc | 69 ++++++ ...port-to-word-installation-on-premises.adoc | 89 ++++++++ ...d-and-export-to-word-logs-on-premises.adoc | 208 +++++++++++++++++ ...d-export-to-word-overview-on-premises.adoc | 10 + ...port-to-word-requirements-on-premises.adoc | 23 ++ ...to-word-ssl-communication-on-premises.adoc | 68 ++++++ 26 files changed, 1175 insertions(+), 29 deletions(-) create mode 100644 modules/ROOT/pages/individual-export-to-pdf-on-premises.adoc create mode 100644 modules/ROOT/pages/individual-import-from-word-and-export-to-word-on-premises.adoc create mode 100644 modules/ROOT/partials/individually-licensed-components/export-to-pdf/export-to-pdf-api-usage.adoc create mode 100644 modules/ROOT/partials/individually-licensed-components/export-to-pdf/export-to-pdf-autorization.adoc create mode 100644 modules/ROOT/partials/individually-licensed-components/export-to-pdf/export-to-pdf-fonts.adoc create mode 100644 modules/ROOT/partials/individually-licensed-components/export-to-pdf/export-to-pdf-installation.adoc create mode 100644 modules/ROOT/partials/individually-licensed-components/export-to-pdf/export-to-pdf-logs.adoc create mode 100644 modules/ROOT/partials/individually-licensed-components/export-to-pdf/export-to-pdf-overview.adoc create mode 100644 modules/ROOT/partials/individually-licensed-components/export-to-pdf/export-to-pdf-requirements.adoc create mode 100644 modules/ROOT/partials/individually-licensed-components/export-to-pdf/export-to-pdf-ssl-communication.adoc create mode 100644 modules/ROOT/partials/individually-licensed-components/import-from-word-and-export-to-word/import-from-word-and-export-to-word-api-usage-on-premises.adoc create mode 100644 modules/ROOT/partials/individually-licensed-components/import-from-word-and-export-to-word/import-from-word-and-export-to-word-autorization-on-premises.adoc create mode 100644 modules/ROOT/partials/individually-licensed-components/import-from-word-and-export-to-word/import-from-word-and-export-to-word-installation-on-premises.adoc create mode 100644 modules/ROOT/partials/individually-licensed-components/import-from-word-and-export-to-word/import-from-word-and-export-to-word-logs-on-premises.adoc create mode 100644 modules/ROOT/partials/individually-licensed-components/import-from-word-and-export-to-word/import-from-word-and-export-to-word-overview-on-premises.adoc create mode 100644 modules/ROOT/partials/individually-licensed-components/import-from-word-and-export-to-word/import-from-word-and-export-to-word-requirements-on-premises.adoc create mode 100644 modules/ROOT/partials/individually-licensed-components/import-from-word-and-export-to-word/import-from-word-and-export-to-word-ssl-communication-on-premises.adoc diff --git a/.api-version b/.api-version index 4122521804..73a86b1970 100644 --- a/.api-version +++ b/.api-version @@ -1 +1 @@ -7.0.0 \ No newline at end of file +7.0.1 \ No newline at end of file diff --git a/antora.yml b/antora.yml index b509a00fa5..df496b588f 100644 --- a/antora.yml +++ b/antora.yml @@ -16,6 +16,12 @@ asciidoc: webcomponent_url: https://cdn.jsdelivr.net/npm/@tinymce/tinymce-webcomponent@2/dist/tinymce-webcomponent.min.js jquery_url: https://cdn.jsdelivr.net/npm/@tinymce/tinymce-jquery@2/dist/tinymce-jquery.min.js default_meta_keywords: tinymce, documentation, docs, plugins, customizable skins, configuration, examples, html, php, java, javascript, image editor, inline editor, distraction-free editor, classic editor, wysiwyg + # product docker variables + dockerimageimportfromwordexporttoword: registry.containers.tiny.cloud/docx-converter-tiny + dockerimageexporttopdf: registry.containers.tiny.cloud/pdf-converter-tiny + dockerimageexporttopdfwindows: registry.containers.tiny.cloud/pdf-converter-windows-tiny + # document converter placeholder variables + exportpdf_service_url: exportpdf_service_url placeholder # product variables productname: TinyMCE productmajorversion: 7 diff --git a/modules/ROOT/nav.adoc b/modules/ROOT/nav.adoc index 241e281c7f..3000691b9c 100644 --- a/modules/ROOT/nav.adoc +++ b/modules/ROOT/nav.adoc @@ -136,6 +136,8 @@ **** Individually licensed plugin services ***** xref:individual-hyperlinking-container.adoc[Hyperlinking service] ***** xref:individual-spelling-container.adoc[Spelling service] +***** xref:individual-export-to-pdf-on-premises.adoc[Export to PDF] +***** xref:individual-import-from-word-and-export-to-word-on-premises.adoc[Import from Word and Export to Word] *** Configure the server-side components **** xref:configure-required-services.adoc[Required configuration] **** xref:configure-common-settings-services.adoc[Optional common settings] diff --git a/modules/ROOT/pages/apis/tinymce.editor.adoc b/modules/ROOT/pages/apis/tinymce.editor.adoc index f5a4852c8b..f07065caf5 100644 --- a/modules/ROOT/pages/apis/tinymce.editor.adoc +++ b/modules/ROOT/pages/apis/tinymce.editor.adoc @@ -83,11 +83,12 @@ manipulation functions.|`xref:apis/tinymce.editor.adoc[Editor]` that could leak memory. This method will be called automatically when the page is unloaded but you can also call it directly if you know what you are doing.|`xref:apis/tinymce.editor.adoc[Editor]` |xref:#dispatch[dispatch()]|Dispatches the specified event by name. Consult the -link:https://www.tiny.cloud/docs/tinymce/6/events/[event reference] for more details on each event.|`xref:apis/tinymce.util.observable.adoc[Observable]` + +link:https://www.tiny.cloud/docs/tinymce/7/events/[event reference] for more details on each event.|`xref:apis/tinymce.util.observable.adoc[Observable]` |xref:#execCommand[execCommand()]|Executes a registered command on the current instance. A list of available commands can be found in the tinymce command identifiers documentation.|`xref:apis/tinymce.editor.adoc[Editor]` |xref:#fire[fire()]|Fires the specified event by name. Consult the -link:https://www.tiny.cloud/docs/tinymce/6/events/[event reference] for more details on each event. +link:https://www.tiny.cloud/docs/tinymce/7/events/[event reference] for more details on each event. __Deprecated in TinyMCE 6.0 and has been marked for removal in TinyMCE 7.0. Use `dispatch` instead.__|`xref:apis/tinymce.util.observable.adoc[Observable]` |xref:#focus[focus()]|Focuses/activates the editor. This will set this editor as the activeEditor in the tinymce collection it will also place DOM focus inside the editor.|`xref:apis/tinymce.editor.adoc[Editor]` @@ -121,11 +122,11 @@ so all events etc that method has will get dispatched as well.|`xref:apis/tinymc |xref:#nodeChanged[nodeChanged()]|Dispatches out a onNodeChange event to all observers. This method should be called when you need to update the UI states or element path etc.|`xref:apis/tinymce.editor.adoc[Editor]` |xref:#off[off()]|Unbinds an event listener to a specific event by name. Consult the -link:https://www.tiny.cloud/docs/tinymce/6/events/[event reference] for more details on each event.|`xref:apis/tinymce.util.observable.adoc[Observable]` +link:https://www.tiny.cloud/docs/tinymce/7/events/[event reference] for more details on each event.|`xref:apis/tinymce.util.observable.adoc[Observable]` |xref:#on[on()]|Binds an event listener to a specific event by name. Consult the -link:https://www.tiny.cloud/docs/tinymce/6/events/[event reference] for more details on each event.|`xref:apis/tinymce.util.observable.adoc[Observable]` +link:https://www.tiny.cloud/docs/tinymce/7/events/[event reference] for more details on each event.|`xref:apis/tinymce.util.observable.adoc[Observable]` |xref:#once[once()]|Bind the event callback and once it fires the callback is removed. Consult the -link:https://www.tiny.cloud/docs/tinymce/6/events/[event reference] for more details on each event.|`xref:apis/tinymce.util.observable.adoc[Observable]` +link:https://www.tiny.cloud/docs/tinymce/7/events/[event reference] for more details on each event.|`xref:apis/tinymce.util.observable.adoc[Observable]` |xref:#queryCommandState[queryCommandState()]|Returns a command specific state, for example if bold is enabled or not.|`xref:apis/tinymce.editor.adoc[Editor]` |xref:#queryCommandSupported[queryCommandSupported()]|Returns true/false if the command is supported or not.|`xref:apis/tinymce.editor.adoc[Editor]` |xref:#queryCommandValue[queryCommandValue()]|Returns a command specific value, for example the current font size.|`xref:apis/tinymce.editor.adoc[Editor]` @@ -336,7 +337,7 @@ but you can also call it directly if you know what you are doing. dispatch(name: String, args: Object?, bubble: Boolean?): Object ---- Dispatches the specified event by name. Consult the -link:https://www.tiny.cloud/docs/tinymce/6/events/[event reference] for more details on each event. +link:https://www.tiny.cloud/docs/tinymce/7/events/[event reference] for more details on each event. ==== Examples [source, javascript] @@ -385,7 +386,7 @@ the tinymce command identifiers documentation. fire(name: String, args: Object?, bubble: Boolean?): Object ---- Fires the specified event by name. Consult the -link:https://www.tiny.cloud/docs/tinymce/6/events/[event reference] for more details on each event. +link:https://www.tiny.cloud/docs/tinymce/7/events/[event reference] for more details on each event. __Deprecated in TinyMCE 6.0 and has been marked for removal in TinyMCE 7.0. Use `dispatch` instead.__ ==== Examples @@ -751,7 +752,7 @@ need to update the UI states or element path etc. off(name: String?, callback: Function?): Object ---- Unbinds an event listener to a specific event by name. Consult the -link:https://www.tiny.cloud/docs/tinymce/6/events/[event reference] for more details on each event. +link:https://www.tiny.cloud/docs/tinymce/7/events/[event reference] for more details on each event. ==== Examples [source, javascript] @@ -784,7 +785,7 @@ instance.off(); on(name: String, callback: Function, prepend: Boolean): Object ---- Binds an event listener to a specific event by name. Consult the -link:https://www.tiny.cloud/docs/tinymce/6/events/[event reference] for more details on each event. +link:https://www.tiny.cloud/docs/tinymce/7/events/[event reference] for more details on each event. ==== Examples [source, javascript] @@ -813,7 +814,7 @@ instance.on('event', (e) => { once(name: String, callback: Function): Object ---- Bind the event callback and once it fires the callback is removed. Consult the -link:https://www.tiny.cloud/docs/tinymce/6/events/[event reference] for more details on each event. +link:https://www.tiny.cloud/docs/tinymce/7/events/[event reference] for more details on each event. ==== Parameters diff --git a/modules/ROOT/pages/apis/tinymce.editor.ui.registry.adoc b/modules/ROOT/pages/apis/tinymce.editor.ui.registry.adoc index 44025a5f98..f4250cedc0 100644 --- a/modules/ROOT/pages/apis/tinymce.editor.ui.registry.adoc +++ b/modules/ROOT/pages/apis/tinymce.editor.ui.registry.adoc @@ -42,7 +42,7 @@ UI Components - Context Menu].|`xref:apis/tinymce.editor.ui.registry.adoc[Regist |xref:#addContextToolbar[addContextToolbar()]|Registers a new context toolbar that only appears when a content predicate is matched for example the cursor is on an image element. For information on creating context toolbars, see: -link:https://www.tiny.cloud/docs/tinymce/6/contexttoolbar/[ +link:https://www.tiny.cloud/docs/tinymce/7/contexttoolbar/[ UI Components - Context Toolbar].|`xref:apis/tinymce.editor.ui.registry.adoc[Registry]` |xref:#addGroupToolbarButton[addGroupToolbarButton()]|Registers a new group toolbar button for the toolbar. Renders a toolbar button that opens a floating toolbar when clicked. @@ -201,7 +201,7 @@ addContextToolbar(name: String, obj: Toolbar.ContextToolbarSpec) Registers a new context toolbar that only appears when a content predicate is matched for example the cursor is on an image element. For information on creating context toolbars, see: -link:https://www.tiny.cloud/docs/tinymce/6/contexttoolbar/[ +link:https://www.tiny.cloud/docs/tinymce/7/contexttoolbar/[ UI Components - Context Toolbar]. ==== Parameters diff --git a/modules/ROOT/pages/apis/tinymce.notificationmanager.adoc b/modules/ROOT/pages/apis/tinymce.notificationmanager.adoc index ecc9dbd46c..ffba33ce3a 100644 --- a/modules/ROOT/pages/apis/tinymce.notificationmanager.adoc +++ b/modules/ROOT/pages/apis/tinymce.notificationmanager.adoc @@ -69,6 +69,6 @@ Opens a new notification. * `args (Object)` - A `name: value` collection containing settings such as: `timeout`, `type`, and message (`text`). -For information on the available settings, see: link:https://www.tiny.cloud/docs/tinymce/6/creating-custom-notifications/[Create custom notifications]. +For information on the available settings, see: link:https://www.tiny.cloud/docs/tinymce/7/creating-custom-notifications/[Create custom notifications]. ''' diff --git a/modules/ROOT/pages/apis/tinymce.root.adoc b/modules/ROOT/pages/apis/tinymce.root.adoc index 7a72048596..4c9b577c4b 100644 --- a/modules/ROOT/pages/apis/tinymce.root.adoc +++ b/modules/ROOT/pages/apis/tinymce.root.adoc @@ -52,7 +52,7 @@ Checks if the input object `obj` has the property `prop`.|`xref:apis/tinymce.roo |xref:#inArray[inArray()]|Returns an index of the item or -1 if item is not present in the array.|`xref:apis/tinymce.root.adoc[tinymce]` |xref:#init[init()]|Initializes a set of editors. This method will create editors based on various settings. -For information on basic usage of `init`, see: link:https://www.tiny.cloud/docs/tinymce/6/basic-setup/[Basic setup].|`xref:apis/tinymce.root.adoc[tinymce]` +For information on basic usage of `init`, see: link:https://www.tiny.cloud/docs/tinymce/7/basic-setup/[Basic setup].|`xref:apis/tinymce.root.adoc[tinymce]` |xref:#is[is()]|Checks if a object is of a specific type for example an array.|`xref:apis/tinymce.root.adoc[tinymce]` |xref:#isArray[isArray()]|Returns true/false if the object is an array or not.|`xref:apis/tinymce.root.adoc[tinymce]` |xref:#makeMap[makeMap()]|Makes a name/object map out of an array with names.|`xref:apis/tinymce.root.adoc[tinymce]` @@ -315,7 +315,7 @@ init(options: Object): Promise ---- Initializes a set of editors. This method will create editors based on various settings. -For information on basic usage of `init`, see: link:https://www.tiny.cloud/docs/tinymce/6/basic-setup/[Basic setup]. +For information on basic usage of `init`, see: link:https://www.tiny.cloud/docs/tinymce/7/basic-setup/[Basic setup]. ==== Examples [source, javascript] diff --git a/modules/ROOT/pages/apis/tinymce.util.observable.adoc b/modules/ROOT/pages/apis/tinymce.util.observable.adoc index 8f0329ccf1..f76909ab65 100644 --- a/modules/ROOT/pages/apis/tinymce.util.observable.adoc +++ b/modules/ROOT/pages/apis/tinymce.util.observable.adoc @@ -15,17 +15,17 @@ This mixin adds event binding logic to classes. Adapts the EventDispatcher class |=== |Name|Summary|Defined by |xref:#dispatch[dispatch()]|Dispatches the specified event by name. Consult the -link:https://www.tiny.cloud/docs/tinymce/6/events/[event reference] for more details on each event.|`xref:apis/tinymce.util.observable.adoc[Observable]` +link:https://www.tiny.cloud/docs/tinymce/7/events/[event reference] for more details on each event.|`xref:apis/tinymce.util.observable.adoc[Observable]` |xref:#fire[fire()]|Fires the specified event by name. Consult the -link:https://www.tiny.cloud/docs/tinymce/6/events/[event reference] for more details on each event. +link:https://www.tiny.cloud/docs/tinymce/7/events/[event reference] for more details on each event. __Deprecated in TinyMCE 6.0 and has been marked for removal in TinyMCE 7.0. Use `dispatch` instead.__|`xref:apis/tinymce.util.observable.adoc[Observable]` |xref:#hasEventListeners[hasEventListeners()]|Returns true/false if the object has a event of the specified name.|`xref:apis/tinymce.util.observable.adoc[Observable]` |xref:#off[off()]|Unbinds an event listener to a specific event by name. Consult the -link:https://www.tiny.cloud/docs/tinymce/6/events/[event reference] for more details on each event.|`xref:apis/tinymce.util.observable.adoc[Observable]` +link:https://www.tiny.cloud/docs/tinymce/7/events/[event reference] for more details on each event.|`xref:apis/tinymce.util.observable.adoc[Observable]` |xref:#on[on()]|Binds an event listener to a specific event by name. Consult the -link:https://www.tiny.cloud/docs/tinymce/6/events/[event reference] for more details on each event.|`xref:apis/tinymce.util.observable.adoc[Observable]` +link:https://www.tiny.cloud/docs/tinymce/7/events/[event reference] for more details on each event.|`xref:apis/tinymce.util.observable.adoc[Observable]` |xref:#once[once()]|Bind the event callback and once it fires the callback is removed. Consult the -link:https://www.tiny.cloud/docs/tinymce/6/events/[event reference] for more details on each event.|`xref:apis/tinymce.util.observable.adoc[Observable]` +link:https://www.tiny.cloud/docs/tinymce/7/events/[event reference] for more details on each event.|`xref:apis/tinymce.util.observable.adoc[Observable]` |=== [[methods]] @@ -38,7 +38,7 @@ link:https://www.tiny.cloud/docs/tinymce/6/events/[event reference] for more det dispatch(name: String, args: Object?, bubble: Boolean?): Object ---- Dispatches the specified event by name. Consult the -link:https://www.tiny.cloud/docs/tinymce/6/events/[event reference] for more details on each event. +link:https://www.tiny.cloud/docs/tinymce/7/events/[event reference] for more details on each event. ==== Examples [source, javascript] @@ -65,7 +65,7 @@ instance.dispatch('event', {...}); fire(name: String, args: Object?, bubble: Boolean?): Object ---- Fires the specified event by name. Consult the -link:https://www.tiny.cloud/docs/tinymce/6/events/[event reference] for more details on each event. +link:https://www.tiny.cloud/docs/tinymce/7/events/[event reference] for more details on each event. __Deprecated in TinyMCE 6.0 and has been marked for removal in TinyMCE 7.0. Use `dispatch` instead.__ ==== Examples @@ -111,7 +111,7 @@ Returns true/false if the object has a event of the specified name. off(name: String?, callback: Function?): Object ---- Unbinds an event listener to a specific event by name. Consult the -link:https://www.tiny.cloud/docs/tinymce/6/events/[event reference] for more details on each event. +link:https://www.tiny.cloud/docs/tinymce/7/events/[event reference] for more details on each event. ==== Examples [source, javascript] @@ -144,7 +144,7 @@ instance.off(); on(name: String, callback: Function, prepend: Boolean): Object ---- Binds an event listener to a specific event by name. Consult the -link:https://www.tiny.cloud/docs/tinymce/6/events/[event reference] for more details on each event. +link:https://www.tiny.cloud/docs/tinymce/7/events/[event reference] for more details on each event. ==== Examples [source, javascript] @@ -173,7 +173,7 @@ instance.on('event', (e) => { once(name: String, callback: Function): Object ---- Bind the event callback and once it fires the callback is removed. Consult the -link:https://www.tiny.cloud/docs/tinymce/6/events/[event reference] for more details on each event. +link:https://www.tiny.cloud/docs/tinymce/7/events/[event reference] for more details on each event. ==== Parameters diff --git a/modules/ROOT/pages/apis/tinymce.windowmanager.adoc b/modules/ROOT/pages/apis/tinymce.windowmanager.adoc index cebcb7f4d0..2686c2605f 100644 --- a/modules/ROOT/pages/apis/tinymce.windowmanager.adoc +++ b/modules/ROOT/pages/apis/tinymce.windowmanager.adoc @@ -119,8 +119,8 @@ Opens a new window. ==== Parameters -* `config (Object)` - For information on the available options, see: link:https://www.tiny.cloud/docs/tinymce/6/dialog-configuration/#options[Dialog - Configuration options]. -* `params (Object)` - (Optional) For information on the available options, see: link:https://www.tiny.cloud/docs/tinymce/6/dialog-configuration/#configuration-parameters[Dialog - Configuration parameters]. +* `config (Object)` - For information on the available options, see: link:https://www.tiny.cloud/docs/tinymce/7/dialog-configuration/#options[Dialog - Configuration options]. +* `params (Object)` - (Optional) For information on the available options, see: link:https://www.tiny.cloud/docs/tinymce/7/dialog-configuration/#configuration-parameters[Dialog - Configuration parameters]. ==== Return value @@ -138,7 +138,7 @@ Opens a new window for the specified url. ==== Parameters -* `config (Object)` - For information on the available options, see: link:https://www.tiny.cloud/docs/tinymce/6/urldialog/#configuration[URL dialog - Configuration]. +* `config (Object)` - For information on the available options, see: link:https://www.tiny.cloud/docs/tinymce/7/urldialog/#configuration[URL dialog - Configuration]. ==== Return value diff --git a/modules/ROOT/pages/individual-export-to-pdf-on-premises.adoc b/modules/ROOT/pages/individual-export-to-pdf-on-premises.adoc new file mode 100644 index 0000000000..40f8f4f3d1 --- /dev/null +++ b/modules/ROOT/pages/individual-export-to-pdf-on-premises.adoc @@ -0,0 +1,21 @@ += Deploy the {productname} {pluginname} service server-side component using Docker (individually licensed) +:navtitle: Export to PDF +:description: Setting up Export to PDF using Docker. +:keywords: server-side, docker, export-to-pdf, on-premises +:pluginname: Export to PDF + +include::partial$individually-licensed-components/export-to-pdf/export-to-pdf-overview.adoc[] + +include::partial$individually-licensed-components/export-to-pdf/export-to-pdf-requirements.adoc[] + +include::partial$individually-licensed-components/export-to-pdf/export-to-pdf-installation.adoc[] + +include::partial$individually-licensed-components/export-to-pdf/export-to-pdf-fonts.adoc[] + +include::partial$individually-licensed-components/export-to-pdf/export-to-pdf-autorization.adoc[] + +include::partial$individually-licensed-components/export-to-pdf/export-to-pdf-api-usage.adoc[] + +include::partial$individually-licensed-components/export-to-pdf/export-to-pdf-ssl-communication.adoc[] + +include::partial$individually-licensed-components/export-to-pdf/export-to-pdf-logs.adoc[] \ No newline at end of file diff --git a/modules/ROOT/pages/individual-import-from-word-and-export-to-word-on-premises.adoc b/modules/ROOT/pages/individual-import-from-word-and-export-to-word-on-premises.adoc new file mode 100644 index 0000000000..3cca7d5e1b --- /dev/null +++ b/modules/ROOT/pages/individual-import-from-word-and-export-to-word-on-premises.adoc @@ -0,0 +1,19 @@ += Deploy the {productname} {pluginname} service server-side component using Docker (individually licensed) +:navtitle: Import from Word and Export to Word +:description: Setting up Import from Word and Export to Word using Docker. +:keywords: server-side, docker, import-from-word, export-to-word, on-premises +:pluginname: Import from Word and Export to Word + +include::partial$individually-licensed-components/import-from-word-and-export-to-word/import-from-word-and-export-to-word-overview-on-premises.adoc[] + +include::partial$individually-licensed-components/import-from-word-and-export-to-word/import-from-word-and-export-to-word-requirements-on-premises.adoc[] + +include::partial$individually-licensed-components/import-from-word-and-export-to-word/import-from-word-and-export-to-word-installation-on-premises.adoc[] + +include::partial$individually-licensed-components/import-from-word-and-export-to-word/import-from-word-and-export-to-word-autorization-on-premises.adoc[] + +include::partial$individually-licensed-components/import-from-word-and-export-to-word/import-from-word-and-export-to-word-api-usage-on-premises.adoc[] + +include::partial$individually-licensed-components/import-from-word-and-export-to-word/import-from-word-and-export-to-word-ssl-communication-on-premises.adoc[] + +include::partial$individually-licensed-components/import-from-word-and-export-to-word/import-from-word-and-export-to-word-logs-on-premises.adoc[] \ No newline at end of file diff --git a/modules/ROOT/partials/individually-licensed-components/export-to-pdf/export-to-pdf-api-usage.adoc b/modules/ROOT/partials/individually-licensed-components/export-to-pdf/export-to-pdf-api-usage.adoc new file mode 100644 index 0000000000..6f7b93f9e4 --- /dev/null +++ b/modules/ROOT/partials/individually-licensed-components/export-to-pdf/export-to-pdf-api-usage.adoc @@ -0,0 +1,42 @@ +[[api-usage]] +== API Usage + +The {pluginname} On-Premises converter provides the ability to convert an HTML document to a PDF file via Restful API. + +The API is available on `+http://localhost:[port]+` (by default the `port` is `8080`). + +[NOTE] +The REST API documentation is available at `+http://localhost:[port]/docs+`. +Alternatively, refer to the specifications in link:https://exportpdf.converter.tiny.cloud/docs[https://exportpdf.converter.tiny.cloud/docs^]. + +If the authorization for the API is enabled, provided an authorization token. More instructions can be found in the xref:individual-export-to-pdf-on-premises.adoc#authorization[authorization] section. + +=== Using additional HTTP headers + +If fetching some resources (e.g. images) used in a generated PDF requires passing an additional authorization factor in the form of additional HTTP headers: + +. It can be defined on the application startup by setting `EXTRA_HTTP_HEADERS` environmental variable where the value is a stringified JSON object with required headers. +. It can be defined in a request sent to the PDF Converter API in `options`: + +[source, js, subs="attributes+"] +---- +const data = { + html: '

I am a teapot

', + css: 'p { color: red; }', + options: { + extra_http_headers: { + authorization: 'Bearer ' + } + } +}; + +axios.post( '{exportpdf_service_url}', data, config ) + .then( response => { + fs.writeFileSync('./file.pdf', response.data, 'binary') + }).catch( error => { + console.log( error ); + }); +---- + +[TIP] +Headers defined in the application config and from the request are merged. If the same header is defined in both places, a header value from PDF options is prioritized over the value from the application config. \ No newline at end of file diff --git a/modules/ROOT/partials/individually-licensed-components/export-to-pdf/export-to-pdf-autorization.adoc b/modules/ROOT/partials/individually-licensed-components/export-to-pdf/export-to-pdf-autorization.adoc new file mode 100644 index 0000000000..6bcf161084 --- /dev/null +++ b/modules/ROOT/partials/individually-licensed-components/export-to-pdf/export-to-pdf-autorization.adoc @@ -0,0 +1,97 @@ +[[authorization]] +== Authorization + +To enable authorization, set the `SECRET_KEY` environment variable during the xref:individual-export-to-pdf-on-premises.adoc#installation[installation]. + +If the `SECRET_KEY` variable is set, then all requests must have a header with a JWT (JSON Web Token) signed with this key. The token should be passed as a value of the `Authorization` header for each request sent to the {pluginname} REST API. + +[NOTE] +If the `SECRET_KEY` is not setup during the installation, then {pluginname} On-Premises will not require any headers with tokens when sending requests to the {pluginname} REST API. However, this it is not recommend to skip the authorization when running {pluginname} On-Premises in a public network. + +=== Generating the token + +{companyname} recommends using the libraries listed on link:http://jwt.io/[jwt.io] to generate the token. The token is considered valid, when: + +* it is signed with the same `SECRET_KEY` as passed to the {pluginname} On-Premises instance, +* it was created within the last 24 hours, +* it is not issued in the future (e.i. the iat timestamp cannot be newer than the current time), +* it has not expired yet. + + +If the specific use case involves sending requests from a backend server, then JWT tokens can be generated locally, as shown in the below request example. + +In the case of editor plugins or other frontend usages, a token endpoint should be created, that returns a valid JWT token for authorized users. + +.Example of a endpoint implementation. +[source, js] +---- +const express = require( 'express' ); +const jwt = require( 'jsonwebtoken' ); + +const SECRET_KEY = 'secret_key'; + +const app = express(); + +app.use( ( req, res, next ) => { + res.setHeader( 'Access-Control-Allow-Origin', '*' ); + res.setHeader( 'Access-Control-Allow-Methods', 'GET' ); + + next(); +}); + +app.get( '/', ( req, res ) => { + const result = jwt.sign( {}, SECRET_KEY, { algorithm: 'HS256' } ); + + res.send( result ); +}); + +app.listen( 8080, () => console.log( 'Listening on port 8080' ) ); +---- + +=== Using editor plugins + +Plugins for {productname} will automatically request the token from the given `tokenUrl` variable and set the `Authorization` header when making an export request. + +[NOTE] +Refer to the xref:exportpdf.adoc[{pluginname}] plugin documentation for details on adding the {pluginname} feature to the editor. + +=== Request example with an Authorization header + +The following example presents a request that generates valid JWT token and sets it as `Authorization` header: + +[source, js] +---- +const fs = require( 'fs' ); +const jwt = require( 'jsonwebtoken' ); +const axios = require( 'axios' ); + +const SECRET_KEY = 'secret'; + +const token = jwt.sign( {}, SECRET_KEY, { algorithm: 'HS256' } ); + +const data = { + html: "

I am a teapot

", + css: "p { color: red; }", +}; + +const config = { + headers: { + 'Authorization': token + }, + responseType: 'arraybuffer', +}; + +axios.post( 'http://localhost:8080/v1/convert', data, config ) + .then( response => { + fs.writeFileSync('./file.pdf', response.data, 'binary'); + }).catch( error => { + console.log( error ); + }); +---- + +`SECRET_KEY` it’s the key which has been passed to the {pluginname} On-Premises instance + +Please refer to the link:https://exportpdf.converter.tiny.cloud/docs[{pluginname} REST API documentation] to start using the service. + +[NOTE] +If API clients like Postman or Insomnia are used, then set the JWT token as an `Authorization` header in the `Headers` tab. Do not use the built-in token authorization as this will generate invalid header with a `Bearer` prefix added to the token. \ No newline at end of file diff --git a/modules/ROOT/partials/individually-licensed-components/export-to-pdf/export-to-pdf-fonts.adoc b/modules/ROOT/partials/individually-licensed-components/export-to-pdf/export-to-pdf-fonts.adoc new file mode 100644 index 0000000000..f950c20157 --- /dev/null +++ b/modules/ROOT/partials/individually-licensed-components/export-to-pdf/export-to-pdf-fonts.adoc @@ -0,0 +1,65 @@ +[[fonts]] +== Fonts + +During document writing, the possibility of using many different fonts can be very important to users. + +Using the appropriate font can change the appearance of the document and emphasize its style. + +{pluginname} Converter allows link:https://exportpdf.converter.tiny.cloud/docs#section/Web-Fonts[Web Fonts^] to be used, which provided the integrator with the ability to use standard operating system fonts or use custom fonts without the need to import them using CSS. + +Below is a list of the basic fonts included in the image: + +[source] +---- +OpenSans-Bold.ttf +OpenSans-BoldItalic.ttf +OpenSans-ExtraBold.ttf +OpenSans-ExtraBoldItalic.ttf +OpenSans-Italic.ttf +OpenSans-Light.ttf +OpenSans-LightItalic.ttf +OpenSans-Regular.ttf +OpenSans-Semibold.ttf +OpenSans-SemiboldItalic.ttf +---- + +However, additional fonts can be added to {pluginname} Converter in two ways: + +* Use Unix-like PDF-Converter image `{dockerimageexporttopdf}` and mount fonts directory to it. +** See xref:individual-export-to-pdf-on-premises.adoc#add-custom-fonts-to-pdf-converter[Add custom fonts to PDF Converter] section. +* Use Windows PDF-Converter image `{dockerimageexporttopdf}` and mount to it fonts directory from the Windows operating system on which the container is running. +** See Use Windows fonts in PDF Converter section. + +[NOTE] +The fonts inside the mounted volume will be installed on the docker image operating system. Only the `.ttf` and `.otf` font formats are supported. If other font formats are used, these will need to be converted to the supported format prior or use fonts such as link:https://exportpdf.converter.tiny.cloud/docs#section/Web-Fonts[Web Fonts^]. + +[TIP] +Ensure that the converted fonts can be installed and used on your local machine first, before installing them on the docker container. + +[[add-custom-fonts-to-pdf-converter]] +=== Add custom fonts to PDF Converter + +If custom fonts are being used in PDF files, use the `pdf-converter-tiny` Docker image and mount the directory with the custom fonts for the PDF Converter application running on a machine with a Unix-like system (this includes Docker on Windows with a WSL backend). + +The `{dockerimageexporttopdf}` Docker image need to be run on a Unix-like operating system and mount the `~/your_fonts_dir:/usr/share/fonts/your_fonts_dir` volume. + +Launch the Docker container on Unix-like operating system example: + +[source, bash, subs="attributes+"] +---- +docker run --init -v ~/your_fonts_dir:/usr/share/fonts/your_fonts_dir -p 8080:8080 -e LICENSE_KEY=[your_license_key] {dockerimageexporttopdf}:[version] +---- + +[[use-windows-fonts-in-pdf-converter]] +=== Use Windows fonts in PDF Converter + +If using Windows fonts like Arial, Verdana, etc. in PDF files, use `pdf-converter-windows-tiny` Docker image that allows you to run the application on a machine with Windows operating system and mount fonts from the system. + +You just need to run `{dockerimageexporttopdf}` Docker image on Windows operating system and mount `C:\Windows\Fonts:C:\Windows\Fonts` volume. + +Launch the Docker container on Windows operating system example: + +[source, bash, subs="attributes+"] +---- +docker run -v C:\Windows\Fonts:C:\Windows\Fonts -p 8080:8080 --env LICENSE_KEY=[your_license_key] {dockerimageexporttopdfwindows}:[version] +---- \ No newline at end of file diff --git a/modules/ROOT/partials/individually-licensed-components/export-to-pdf/export-to-pdf-installation.adoc b/modules/ROOT/partials/individually-licensed-components/export-to-pdf/export-to-pdf-installation.adoc new file mode 100644 index 0000000000..45195b0e28 --- /dev/null +++ b/modules/ROOT/partials/individually-licensed-components/export-to-pdf/export-to-pdf-installation.adoc @@ -0,0 +1,98 @@ +[[installation]] +== Installation + +[NOTE] +A valid license key is needed in order to install {pluginname} On-Premises. +link:https://www.tiny.cloud/contact/[Contact us] for a trial license key. + +=== Supported technologies + +The application is provided as a docker image by default. + +It can be run with any Open Container runtime tool e.g. link:https://kubernetes.io/[Kubernetes], link:https://www.redhat.com/en/technologies/cloud-computing/openshift[OpenShift], link:https://podman.io/[Podman], link:https://docs.docker.com/[Docker] and many others. + +Refer to the xref:individual-export-to-pdf-on-premises.adoc#requirements[Requirements guide] for more information about the hardware and software requirements to run the {pluginname} On-Premises. + +=== Setting up the application using a Docker container + +. The username and password credentials supplied by Tiny are utilized for logging into the Docker registry and retrieving the Docker image. +. Containerize the application using `docker` or `docker-compose`. +. Use a demo page to verify if the application works properly. + +==== Containerize example using docker + +Login to Docker registry: + +[source, sh, subs="attributes+"] +---- +docker login -u [username] -p [password] registry.containers.tiny.cloud +---- + +Launch the Docker container: + +[source, sh, subs="attributes+"] +---- +docker run --init -p 8080:8080 -e LICENSE_KEY=[your_license_key] {dockerimageexporttopdf}:[version] +---- + +If using authorization provide the SECRET_KEY: + +[source, sh, subs="attributes+"] +---- +docker run --init -p 8080:8080 -e LICENSE_KEY=[your_license_key] -e SECRET_KEY=[your_secret_key] {dockerimageexporttopdf}:[version] +---- + +Read more about using authorization in the xref:individual-export-to-pdf-on-premises.adoc#authorization[authorization] section. + +==== Containerize example using docker-compose + +. Create the docker-compose.yml file: ++ +[source, yml, subs="attributes+"] +---- +version: "3.8" +services: + pdf-converter-tiny: + image: {dockerimageexporttopdf}:[version] + ports: + - "8080:8080" + restart: always + init: true + environment: + LICENSE_KEY: "license_key" + # Secret Key is optional + SECRET_KEY: "secret_key" + # Custom request origin is optional + CUSTOM_REQUEST_ORIGIN: "https://your_custom_origin" +---- ++ +For details on `SECRET_KEY` usage check the xref:individual-export-to-pdf-on-premises.adoc#authorization[authorization] section. ++ +. Run: + +[source, bash] +---- +docker-compose up +---- + +[NOTE] +==== +* Without a correct `LICENSE_KEY` the application will not start. +** If the license is invalid, a wrong license key error will display in the logs and the application will not run. +* It is advisable to override the SECRET_KEY variable using a unique and hard to guess string for security reasons. +* If the specific infrastructure has strict CORS enabled, then use the `CUSTOM_REQUEST_ORIGIN` variable to set the origin of requests made by the converter. The default value is `https://pdf-internal`. +==== + +=== Windows fonts support + +If using Windows fonts like Calibri, Verdana, etc. in PDF files, use the `pdf-converter-windows-tiny` Docker image and run it on a Windows operating system. + +See xref:individual-export-to-pdf-on-premises.adoc#fonts[Fonts] section for more details. + +=== Next steps + +Use the link:http://localhost:8080/v1/convert[http://localhost:8080/v1/convert] endpoint to export PDF files. Check out the xref:individual-export-to-pdf-on-premises.adoc#authorization[authorization] section to learn more about tokens and token endpoints. + +Use the demo page available on link:http://localhost:8080/demo[http://localhost:8080/demo] to generate an example PDF file. + +Refer to the {pluginname} REST API documentation on link:http://localhost:8080/docs[http://localhost:8080/docs] for more details. \ No newline at end of file diff --git a/modules/ROOT/partials/individually-licensed-components/export-to-pdf/export-to-pdf-logs.adoc b/modules/ROOT/partials/individually-licensed-components/export-to-pdf/export-to-pdf-logs.adoc new file mode 100644 index 0000000000..6a23a39e6d --- /dev/null +++ b/modules/ROOT/partials/individually-licensed-components/export-to-pdf/export-to-pdf-logs.adoc @@ -0,0 +1,212 @@ +[[logs]] +== Logs + +The logs from {pluginname} On-Premises are written to `stdout` and `stderr`. Most of them are formatted in JSON. They can be used for monitoring or debugging purposes. In production environments, It is recommend storing the logs to files or using a distributed logging system (like ELK or CloudWatch). + +=== Monitoring {pluginname} with logs + +To get more insight into how the {pluginname} On-Premises is performing, logs can be used for monitoring. To enable these, add the `ENABLE_METRIC_LOGS=true` environment variable. + +=== Log structure + +The log structure contains the following information: + +* `handler`: A unified identifier of action. Use this field to identify calls. +* `traceId`: A unique RPC call ID. +* `tags`: A semicolon-separated list of tags. Use this field to filter metrics logs. +* `data`: An object containing additional information. It might vary between different transports. +* `data.duration`: The request duration in milliseconds. +* `data.transport`: The type of the request transport. It could be http or ws (websocket). +* `data.status`: The request status. It can be equal to success, fail, warning. +* `data.statusCode`: The response status in HTTP status code standard. + +Additionally, for the HTTP transport, the following information is included: + +* `data.url`: The URL path. +* `data.method`: The request method. + +In case of an error, `data.status` will be equal to failed and `data.message` will contain the error message. + +An example log for HTTP transport: + +[source] +---- +{ + "level": 30, + "time": "2021-03-09T11:15:09.154Z", + "msg": "Request summary", + "handler": "convertHtmlToPdf", + "traceId": "85f13d92-57df-4b3b-98bb-0ca41a5ae601", + "data": { + "duration": 2470, + "transport": "http", + "statusCode": 200, + "status": "success", + "url": "/v1/convert", + "method": "POST" + }, + "tags": "metrics" +} +---- +// verify if this is something we will add. +//// +See example charts to check how to use logs for monitoring purposes. +//// + +=== Docker + +The docker has built-in logging mechanisms that capture logs from the output of the containers. The default logging driver writes the logs to files. + +When using this driver, use the `docker logs` command to show logs from a container. The `-f` flag can be added to view logs in real time. Refer to the link:https://docs.docker.com/engine/reference/commandline/logs/[official Docker documentation^] for more information about the logs command. + +[NOTE] +When a container is running for a long period of time, the logs can take up a lot of space. To avoid this problem, make sure that the log rotation is enabled. This can be set with the `max-size` option. + +=== Distributed logging + +If running more than one instance of {pluginname} On-Premises, It is recommend using a distributed logging system. It allows for viewing and analyzing logs from all instances in one place. + +==== AWS CloudWatch and other cloud solutions + +If running {pluginname} On-Premises in the cloud, the simplest and recommended way is to use a service that is available at the selected provider. + +Here are some of the available services: + +* AWS: link:https://aws.amazon.com/CloudWatch[CloudWatch^] +* Google Cloud: link:https://cloud.google.com/logging[Cloud Logging^] +* Azure: link:https://azure.microsoft.com/en-us/services/monitor/[Azure Monitor^] + +To use CloudWatch with AWS ECS, a log group must be created before, and the log driver must be changed to `awslogs`. When the log driver is configured properly, logs will be streamed directly to CloudWatch. + +The `logConfiguration` may look similar to this: + +[source, json] +---- +"logConfiguration": { + "logDriver": "awslogs", + "options": { + "awslogs-region": "us-west-2", + "awslogs-group": "tinysource", + "awslogs-stream-prefix": "tiny-pdf-converter-logs" + } +} +---- + +Refer to the link:https://docs.aws.amazon.com/AmazonECS/latest/developerguide/using_awslogs.html[Using the awslogs Log Driver] article for more information. + +=== On-Premises solutions + +If using a specific infrastructure such as your own or for some reason cannot use the service offered by a provider, some on-premises distributed logging system can be used. + +There are a lot of solutions available, including: + +* link:https://www.elastic.co/what-is/elk-stack[ELK^] + link:https://www.elastic.co/guide/en/beats/filebeat/current/filebeat-getting-started.html[Filebeat^] + +This is a stack built on top of Elasticsearch, Logstash and Kibana. In this configuration, Elasticsearch stores logs, Filebeat reads logs from Docker and sends them to Elasticsearch, and Kibana is used to view them. Logstash is not necessary because logs are already structured. + +* link:https://www.fluentd.org/[Fluentd^] + +It uses a dedicated link:https://docs.docker.com/config/containers/logging/fluentd[Docker log driver^] to send the logs. It has a built-in frontend, but can also be integrated with Elasticsearch and Kibana for better filtering. + +* link:https://www.graylog.org/[Graylog^] + +It uses a dedicated link:https://docs.docker.com/config/containers/logging/gelf[Docker^] log driver to send the logs. It has a built-in frontend and needs Elasticsearch to store the logs as well as a MongoDB database to store the configuration. + +==== Example configuration + +The example configuration uses Fluentd, Elasticsearch, and Kibana to capture logs from Docker. + +Before running {pluginname} On-Premises, prepare the logging services. For the purposes of this example, Docker Compose is used. Create the fluentd, elasticsearch and kibana services inside the docker-compose.yml file: + +[source, yaml] +---- +version: '3.7' +services: + fluentd: + build: ./fluentd + volumes: + - ./fluentd/fluent.conf:/fluentd/etc/fluent.conf + ports: + - "24224:24224" + - "24224:24224/udp" + + elasticsearch: + image: docker.elastic.co/elasticsearch/elasticsearch:6.8.5 + expose: + - 9200 + ports: + - "9200:9200" + + kibana: + image: docker.elastic.co/kibana/kibana:6.8.5 + environment: + ELASTICSEARCH_HOSTS: "http://elasticsearch:9200" + ports: + - "5601:5601" +---- + +To integrate Fluentd with Elasticsearch, first install `fluent-plugin-elasticsearch` in the Fluentd image. To do this, create a `fluentd/Dockerfile` with the following content: + +[source, dockerfile] +---- +FROM fluent/fluentd:v1.10-1 + +USER root + +RUN apk add --no-cache --update build-base ruby-dev \ + && gem install fluent-plugin-elasticsearch \ + && gem sources --clear-all +---- + +Next, configure the input server and connection to Elasticsearch in the `fluentd/fluent.conf` file: + +[source, xml] +---- + + @type forward + port 24224 + bind 0.0.0.0 + + + @type copy + + @type elasticsearch + host elasticsearch + port 9200 + logstash_format true + logstash_prefix fluentd + logstash_dateformat %Y%m%d + include_tag_key true + type_name access_log + tag_key @log_name + flush_interval 1s + + + @type stdout + + +---- + +The services are now ready to run: + +[source, bash] +---- +docker-compose up --build +---- + +When the services are ready, start {pluginname} On-Premises. + +[source, bash, subs="attributes+"] +---- +docker run --init -p 8080:8080 \ +--log-driver=fluentd \ +--log-opt fluentd-address=[Fluentd address]:24224 \ +[Your config here] \ +{dockerimageexporttopdf}:[version] +---- + +* Open Kibana in your browser. +** It is available at link:http://localhost:5601/[http://localhost:5601/]. +* During the first run, you may be asked about creating an index. +* Use the `fluentd-*` pattern and press the “Create” button. +* After this step, the logs should appear in the “Discover” tab. \ No newline at end of file diff --git a/modules/ROOT/partials/individually-licensed-components/export-to-pdf/export-to-pdf-overview.adoc b/modules/ROOT/partials/individually-licensed-components/export-to-pdf/export-to-pdf-overview.adoc new file mode 100644 index 0000000000..578111b725 --- /dev/null +++ b/modules/ROOT/partials/individually-licensed-components/export-to-pdf/export-to-pdf-overview.adoc @@ -0,0 +1,10 @@ +[[overview]] +== Overview + +The On-Premises version of the {pluginname} Converter is an application that can be installed and run on the customer’s in-house servers and computing infrastructure, including a private cloud. It contains all the features of the {pluginname} Converter available as SaaS. + +A valid license key is required in order to install {pluginname} Converter On-Premises. +link:https://www.tiny.cloud/contact/[Contact us] for a trial license key. + + +The only requirement to run {pluginname} On-Premises is a container runtime or orchestration tool e.g. Docker, Kubernetes, Podman. \ No newline at end of file diff --git a/modules/ROOT/partials/individually-licensed-components/export-to-pdf/export-to-pdf-requirements.adoc b/modules/ROOT/partials/individually-licensed-components/export-to-pdf/export-to-pdf-requirements.adoc new file mode 100644 index 0000000000..e7dc513c9e --- /dev/null +++ b/modules/ROOT/partials/individually-licensed-components/export-to-pdf/export-to-pdf-requirements.adoc @@ -0,0 +1,23 @@ +[[requirements]] +== Requirements + +To run {pluginname} On-Premises a Docker environment is required. Alternatively, use CaaS available from your cloud provider, like AWS ECS, Google GKE, or Azure ACS. + +There are many factors affecting {pluginname} On-Premises performance. The most influential are the size of exported content, the size of images, and the number of concurrent requests. Also, because your application can prioritize fast response times, or it should handle high load, it is impossible to provide one recommended server specification, that will fit all use cases. + +Assuming response time below 10 seconds, one server (2CPU 2GB RAM) with 1 docker container can handle: + +* up to 40 concurrent requests with an average content of 1 A4 page (~1k characters and 1 image) +* up to 25 concurrent requests with an average content of 5 A4 pages (~7,5k characters and 5 images) +* up to 10 concurrent requests with an average content of 20 A4 pages (~30k characters and 20 images) + +[NOTE] +The above concurrent requests numbers are not a hard limit of {pluginname} On-Premises instance. It can handle more concurrent requests, but the response time will be longer. + +=== High availability + +One docker container with {pluginname} On-Premises benefits from additional CPUs on the machine. To scale your app on a single machine, increase the number of CPUs, however, {companyname} recommends scaling on at least three hosts to ensure the reliability of the system. + +A load balancer, like HAProxy or NGINX (see the load balancer configuration examples in the SSL communication guide), is required for scaling on several machines. Of course, it is possible to use any cloud provider for scaling, like Amazon ECS, Azure Container Instances, or Kubernetes. + +link:https://www.tiny.cloud/contact/[Contact us] if you have any questions about server resources needed for your use case of {pluginname} On-Premises. \ No newline at end of file diff --git a/modules/ROOT/partials/individually-licensed-components/export-to-pdf/export-to-pdf-ssl-communication.adoc b/modules/ROOT/partials/individually-licensed-components/export-to-pdf/export-to-pdf-ssl-communication.adoc new file mode 100644 index 0000000000..193cb88f60 --- /dev/null +++ b/modules/ROOT/partials/individually-licensed-components/export-to-pdf/export-to-pdf-ssl-communication.adoc @@ -0,0 +1,68 @@ +[[ssl-communication]] +== SSL Communication + +Its possible to communicate with {pluginname} On-Premises using secure connections. To achieve this, the load balancer like `NGINX` or `HAProxy` needs to be setup with your SSL certificate. + +`HAProxy` and `NGINX` configuration examples below. + +=== HAProxy example + +Here is a basic `HAProxy` configuration: + +[source, nginx] +---- +global + daemon + maxconn 256 + tune.ssl.default-dh-param 2048 + +defaults + mode http + timeout connect 5000ms + timeout client 50000ms + timeout server 50000ms + +frontend http-in + bind *:80 + bind *:443 ssl crt /etc/ssl/your_certificate.pem + http-request set-header X-Forwarded-Proto https if { ssl_fc } + http-request set-header X-Forwarded-Proto http if !{ ssl_fc } + redirect scheme https if !{ ssl_fc } + + default_backend servers + +backend servers + server server1 127.0.0.1:8000 maxconn 32 +---- + +=== NGINX example + +Here is a basic `NGINX` configuration: + +[source, nginx] +---- +events { + worker_connections 1024; +} + +http { + server { + server_name your.domain.name; + + listen 443; + ssl on; + ssl_certificate /etc/ssl/your_cert.crt; + ssl_certificate_key /etc/ssl/your_cert_key.key; + + location / { + proxy_pass http://127.0.0.1:8000; + + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "Upgrade"; + proxy_set_header Host $host; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_http_version 1.1; + } + } +} +---- \ No newline at end of file diff --git a/modules/ROOT/partials/individually-licensed-components/import-from-word-and-export-to-word/import-from-word-and-export-to-word-api-usage-on-premises.adoc b/modules/ROOT/partials/individually-licensed-components/import-from-word-and-export-to-word/import-from-word-and-export-to-word-api-usage-on-premises.adoc new file mode 100644 index 0000000000..8b5081a61a --- /dev/null +++ b/modules/ROOT/partials/individually-licensed-components/import-from-word-and-export-to-word/import-from-word-and-export-to-word-api-usage-on-premises.adoc @@ -0,0 +1,15 @@ +[[api-usage]] +== API usage + +{pluginname} On-Premises consists of two services: + +* xref:exportword.adoc[Export to Word] provides conversion from an HTML document to a `.docx` file via Restful API. +* xref:importword.adoc[Import from Word] allows importing `.docx` file and converting it into a styled HTML document with comments and suggestions attached. + +The API is available on `+http://localhost:[port]+` (by default the port is 8080). + +[NOTE] +The REST API documentation is available at `+http://localhost:[port]/docs+`. +Alternatively you can check specification in our public resources for link:https://importdocx.converter.tiny.cloud/docs#section/Import-from-Word[Import from Word^] and the link:https://exportdocx.converter.tiny.cloud/docs#section/Export-to-Word[Export to Word^] plugins. + +If you have the authorization for the API enabled, you should provide an authorization token. More instructions you can find in the authorization section. \ No newline at end of file diff --git a/modules/ROOT/partials/individually-licensed-components/import-from-word-and-export-to-word/import-from-word-and-export-to-word-autorization-on-premises.adoc b/modules/ROOT/partials/individually-licensed-components/import-from-word-and-export-to-word/import-from-word-and-export-to-word-autorization-on-premises.adoc new file mode 100644 index 0000000000..c36301f913 --- /dev/null +++ b/modules/ROOT/partials/individually-licensed-components/import-from-word-and-export-to-word/import-from-word-and-export-to-word-autorization-on-premises.adoc @@ -0,0 +1,69 @@ +[[authorization]] +== Authorization + +To enable authorization, set the `SECRET_KEY` environment variable during the xref:individual-import-from-word-and-export-to-word-on-premises.adoc#installation[installation]. + +If the `SECRET_KEY` variable is set, then all requests must have a header with a JWT (JSON Web Token) signed with this key. The token should be passed as a value of the `Authorization` header for each request sent to the {pluginname} REST API. + +[NOTE] +If the `SECRET_KEY` is not setup during the installation, then {pluginname} On-Premises will not require any headers with tokens when sending requests to the {pluginname} REST API. However, this it is not recommend to skip the authorization when running {pluginname} On-Premises in a public network. + +=== Generating the token + +{companyname} recommends using the libraries listed on link:http://jwt.io/[jwt.io] to generate the token. The token is considered valid, when: + +* it is signed with the same `SECRET_KEY` as passed to the {pluginname} On-Premises instance, +* it was created within the last 24 hours, +* it is not issued in the future (e.i. the `iat` timestamp cannot be newer than the current time), +* it has not expired yet. + +Tokens for the {pluginname} On-Premises do not require any additional claims such as the environment ID (which is specific for Collaboration Server On-Premises), the token can be created with an empty payload. + +If the specific use case involves sending requests from a backend server, then JWT tokens can be generated locally, as shown in the below request example. + +In the case of editor plugins or other frontend usages, a token endpoint should be created, that returns a valid JWT token for authorized users. + +=== Using editor plugins + +The are are two plugins available for {productname}: the xref:importword.adoc[Import from Word] and the xref:exportword.adoc[Export to Word] plugins. The plugins will automatically request the token from the given `tokenUrl` variable and will set the `Authorization` header when making an export request. Refer to the respective guides for details on adding the {pluginname} features to your WYSIWYG editor! + +=== Request example with an Authorization header + +The following example presents a request that generates a valid JWT token and sets it as an `Authorization` header: + +[source, js] +---- +const fs = require( 'fs' ); +const jwt = require( 'jsonwebtoken' ); +const axios = require( 'axios' ); + +const SECRET_KEY = 'secret'; + +const token = jwt.sign( {}, SECRET_KEY, { algorithm: 'HS256' } ); + +const data = { + html: "

I am a teapot

", + css: "p { color: red; }", +}; + +const config = { + headers: { + Authorization: token + }, + responseType: 'arraybuffer', +}; + +axios.post( 'http://localhost:8080/v1/convert', data, config ) + .then( response => { + fs.writeFileSync('./file.docx', response.data, 'binary'); + } ).catch( error => { + console.log( error ); + } ); +---- + +`SECRET_KEY`: This is the key what has been passed to the {pluginname} On-Premises instance. + +Please refer to the link:https://importdocx.converter.tiny.cloud/docs#section/Import-from-Word[Import from Word^] and the link:https://exportdocx.converter.tiny.cloud/docs#section/Export-to-Word[Export to Word^] REST API documentation to start using the service. + +[NOTE] +If API clients like Postman or Insomnia are used, then set the JWT token as an `Authorization` header in the `Headers` tab. Do not use the built-in token authorization as this will generate invalid header with a `Bearer` prefix added to the token. \ No newline at end of file diff --git a/modules/ROOT/partials/individually-licensed-components/import-from-word-and-export-to-word/import-from-word-and-export-to-word-installation-on-premises.adoc b/modules/ROOT/partials/individually-licensed-components/import-from-word-and-export-to-word/import-from-word-and-export-to-word-installation-on-premises.adoc new file mode 100644 index 0000000000..3694110b64 --- /dev/null +++ b/modules/ROOT/partials/individually-licensed-components/import-from-word-and-export-to-word/import-from-word-and-export-to-word-installation-on-premises.adoc @@ -0,0 +1,89 @@ +[[installation]] +== Installation + +[NOTE] +A valid license key is needed in order to install {pluginname} On-Premises. +link:https://www.tiny.cloud/contact/[Contact us] for a trial license key. + +=== Supported technologies + +The application is provided as a docker image by default. + +It can be run with any Open Container runtime tool e.g. link:https://kubernetes.io/[Kubernetes], link:https://www.redhat.com/en/technologies/cloud-computing/openshift[OpenShift], link:https://podman.io/[Podman], link:https://docs.docker.com/[Docker] and many others. + +Refer to the xref:individual-import-from-word-and-export-to-word-on-premises.adoc#requirements[Requirements guide] for more information about the hardware and software requirements to run the {pluginname} On-Premises. + +=== Setting up the application using a Docker container + +. The username and password credentials supplied by Tiny are utilized for logging into the Docker registry and retrieving the Docker image. +. Containerize the application using `docker` or `docker-compose`. +. Use a demo page to verify if the application works properly. + +==== Containerize example using docker + +Login to Docker registry: + +[source, sh, subs="attributes+"] +---- +docker login -u [username] -p [password] registry.containers.tiny.cloud +---- + +Launch the Docker container: + +[source, sh, subs="attributes+"] +---- +docker run --init -p 8080:8080 -e LICENSE_KEY=[your_license_key] {dockerimageimportfromwordexporttoword}:[version] +---- + +If using authorization provide the SECRET_KEY: + +[source, sh, subs="attributes+"] +---- +docker run --init -p 8080:8080 -e LICENSE_KEY=[your_license_key] -e SECRET_KEY=[your_secret_key] {dockerimageimportfromwordexporttoword}:[version] +---- + +Read more about using authorization in the xref:individual-import-from-word-and-export-to-word-on-premises.adoc#authorization[authorization] section. + +==== Containerize example using docker-compose + +. Create the docker-compose.yml file: ++ +[source, yml, subs="attributes+"] +---- +version: "3.8" +services: + doc-converter: + image: {dockerimageimportfromwordexporttoword}:[version] + ports: + - "8080:8080" + restart: always + init: true + environment: + LICENSE_KEY: "licensekey" + # Secret Key is optional + SECRET_KEY: "secret_key" +---- ++ +For details on `SECRET_KEY` usage check the xref:individual-import-from-word-and-export-to-word-on-premises.adoc#authorization[authorization] section. ++ +. Run: + +[source, bash] +---- +docker-compose up +---- + +[NOTE] +==== +* Without a correct `LICENSE_KEY` the application will not start. +** If the license is invalid, a wrong license key error will display in the logs and the application will not run. +* It is advisable to override the `SECRET_KEY` variable using a unique and hard to guess string for security reasons. +==== + +=== Next steps + +Use the link:http://localhost:8080/v1/convert[http://localhost:8080/v1/convert] endpoint to export DOCX files. Check out the xref:individual-import-from-word-and-export-to-word-on-premises.adoc#authorization[authorization] section to learn more about tokens and token endpoints. + +Use the demo page available on link:http://localhost:8080/demo[http://localhost:8080/demo] to generate an example DOCX file. + +Refer to the {pluginname} REST API documentation on link:http://localhost:8080/docs[http://localhost:8080/docs] for more details. \ No newline at end of file diff --git a/modules/ROOT/partials/individually-licensed-components/import-from-word-and-export-to-word/import-from-word-and-export-to-word-logs-on-premises.adoc b/modules/ROOT/partials/individually-licensed-components/import-from-word-and-export-to-word/import-from-word-and-export-to-word-logs-on-premises.adoc new file mode 100644 index 0000000000..29ff606fee --- /dev/null +++ b/modules/ROOT/partials/individually-licensed-components/import-from-word-and-export-to-word/import-from-word-and-export-to-word-logs-on-premises.adoc @@ -0,0 +1,208 @@ +[[logs]] +== Logs + +The logs from {pluginname} On-Premises are written to `stdout` and `stderr`. Most of them are formatted in JSON. They can be used for monitoring or debugging purposes. In production environments, It is recommend storing the logs to files or using a distributed logging system (like ELK or CloudWatch). + +=== Monitoring {pluginname} with logs + +To get more insight into how the {pluginname} On-Premises is performing, logs can be used for monitoring. To enable these, add the `ENABLE_METRIC_LOGS=true` environment variable. + +=== Log structure + +The log structure contains the following information: + +* `handler`: A unified identifier of action. Use this field to identify calls. +* `traceId`: A unique RPC call ID. +* `tags`: A semicolon-separated list of tags. Use this field to filter metrics logs. +* `data`: An object containing additional information. It might vary between different transports. +* `data.duration`: The request duration in milliseconds. +* `data.transport`: The type of the request transport. It could be http or ws (websocket). +* `data.status`: The request status. It can be equal to success, fail, warning. +* `data.statusCode`: The response status in HTTP status code standard. + +Additionally, for the HTTP transport, the following information is included: + +* `data.url`: The URL path. +* `data.method`: The request method. + +In case of an error, `data.status` will be equal to `failed` and `data.message` will contain the error message. + +An example log for HTTP transport: + +[source] +---- +{ + "level": 30, + "time": "2021-03-09T11:15:09.154Z", + "msg": "Request summary", + "handler": "postConvert", + "traceId": "85f13d92-57df-4b3b-98bb-0ca41a5ae601", + "data": { + "duration": 752, + "transport": "http", + "statusCode": 200, + "status": "success", + "url": "/v1/convert", + "method": "POST" + }, + "tags": "metrics" +} +---- + +=== Docker + +The docker has built-in logging mechanisms that capture logs from the output of the containers. The default logging driver writes the logs to files. + +When using this driver, use the `docker logs` command to show logs from a container. Use the `-f` flag to view logs in real time. Refer to the link:https://docs.docker.com/engine/reference/commandline/logs/[official Docker documentation] for more information about the logs command. + +[NOTE] +When a container is running for a long period of time, the logs can take up a lot of space. To avoid this problem, you should make sure that the log rotation is enabled. This can be set with the `max-size` option. + +=== Distributed logging + +If running more than one instance of {pluginname} On-Premises, It is recommend using a distributed logging system. It allows for viewing and analyzing logs from all instances in one place. + +=== AWS CloudWatch and other cloud solutions + +If running {pluginname} On-Premises in the cloud, the simplest and recommended way is to use a service that is available at the selected provider. + +Here are some of the available services: + +* AWS: link:https://aws.amazon.com/CloudWatch[CloudWatch^] +* Google Cloud: link:https://cloud.google.com/logging[Cloud Logging^] +* Azure: link:https://azure.microsoft.com/en-us/services/monitor/[Azure Monitor^] + +To use CloudWatch with AWS ECS, a log group must be created before, and the log driver must be changed to `awslogs`. When the log driver is configured properly, logs will be streamed directly to CloudWatch. + +The `logConfiguration` may look similar to this: + +[source, json] +---- +"logConfiguration": { + "logDriver": "awslogs", + "options": { + "awslogs-region": "us-west-2", + "awslogs-group": "tinysource", + "awslogs-stream-prefix": "tiny-docx-converter-logs" + } +} +---- + +Refer to the link:https://docs.aws.amazon.com/AmazonECS/latest/developerguide/using_awslogs.html[Using the awslogs Log Driver] article for more information. + +=== On-Premises solutions + +If using a specific infrastructure such as your own or for some reason cannot use the service offered by a provider, some on-premises distributed logging system can be used. + +There are a lot of solutions available, including: + +* link:https://www.elastic.co/what-is/elk-stack[ELK^] + link:https://www.elastic.co/guide/en/beats/filebeat/current/filebeat-getting-started.html[Filebeat^] + +This is a stack built on top of Elasticsearch, Logstash and Kibana. In this configuration, Elasticsearch stores logs, Filebeat reads logs from Docker and sends them to Elasticsearch, and Kibana is used to view them. Logstash is not necessary because logs are already structured. + +* link:https://www.fluentd.org/[Fluentd^] + +It uses a dedicated link:https://docs.docker.com/config/containers/logging/fluentd[Docker log driver^] to send the logs. It has a built-in frontend, but can also be integrated with Elasticsearch and Kibana for better filtering. + +* link:https://www.graylog.org/[Graylog^] + +It uses a dedicated link:https://docs.docker.com/config/containers/logging/gelf[Docker^] log driver to send the logs. It has a built-in frontend and needs Elasticsearch to store the logs as well as a MongoDB database to store the configuration. + +==== Example configuration + +The example configuration uses Fluentd, Elasticsearch and Kibana to capture logs from Docker. + +Before running {pluginname} On-Premises, prepare the logging services. For the purposes of this example, Docker Compose is used. Create the `fluentd`, `elasticsearch` and `kibana` services inside the `docker-compose.yml` file: + +[source, yaml] +---- +version: '3.7' +services: + fluentd: + build: ./fluentd + volumes: + - ./fluentd/fluent.conf:/fluentd/etc/fluent.conf + ports: + - "24224:24224" + - "24224:24224/udp" + + elasticsearch: + image: docker.elastic.co/elasticsearch/elasticsearch:6.8.5 + expose: + - 9200 + ports: + - "9200:9200" + + kibana: + image: docker.elastic.co/kibana/kibana:6.8.5 + environment: + ELASTICSEARCH_HOSTS: "http://elasticsearch:9200" + ports: + - "5601:5601" +---- + +To integrate Fluentd with Elasticsearch, you first need to install `fluent-plugin-elasticsearch` in the Fluentd image. To do this, create a `fluentd/Dockerfile` with the following content: + +[source, dockerfile] +---- +FROM fluent/fluentd:v1.10-1 + +USER root + +RUN apk add --no-cache --update build-base ruby-dev \ + && gem install fluent-plugin-elasticsearch \ + && gem sources --clear-all +---- + +Next, configure the input server and connection to Elasticsearch in the `fluentd/fluent.conf` file: + +[source, xml] +---- + + @type forward + port 24224 + bind 0.0.0.0 + + + @type copy + + @type elasticsearch + host elasticsearch + port 9200 + logstash_format true + logstash_prefix fluentd + logstash_dateformat %Y%m%d + include_tag_key true + type_name access_log + tag_key @log_name + flush_interval 1s + + + @type stdout + + +---- + +The services are now ready to run: + +[source, bash] +---- +docker-compose up --build +---- + +When the services are ready, start the {pluginname} On-Premises. + +[source, bash, subs="attributes+"] +---- +docker run --init -p 8080:8080 \ +--log-driver=fluentd \ +--log-opt fluentd-address=[Fluentd address]:24224 \ +[Your config here] \ +{dockerimageimportfromwordexporttoword}:[version] +---- + +* Open Kibana in your browser. +** It is available at link:http://localhost:5601/[http://localhost:5601/]. +* During the first run, you may be asked about creating an index. +* Use the `fluentd-*` pattern and press the “Create” button. +* After this step, the logs should appear in the “Discover” tab. \ No newline at end of file diff --git a/modules/ROOT/partials/individually-licensed-components/import-from-word-and-export-to-word/import-from-word-and-export-to-word-overview-on-premises.adoc b/modules/ROOT/partials/individually-licensed-components/import-from-word-and-export-to-word/import-from-word-and-export-to-word-overview-on-premises.adoc new file mode 100644 index 0000000000..c6f59f086d --- /dev/null +++ b/modules/ROOT/partials/individually-licensed-components/import-from-word-and-export-to-word/import-from-word-and-export-to-word-overview-on-premises.adoc @@ -0,0 +1,10 @@ +[[overview]] +== Overview + +{pluginname} is a set of two converter services that allow for both exporting a structured HTML content (e.g. created with {productname} WYSIWYG editor) into a `.docx` Microsoft Word file and for importing content from `.docx` and `.dotx` files and converting it into a styled HTML document. + +A valid license key is needed in order to install {pluginname} On-Premises. link:https://www.tiny.cloud/contact/[Contact us] for a trial license key. + +The documentation in this section refers to a simplified version of the {pluginname} On-Premises which was designed to be easy to set up and maintain (while preserving all the features). It also lowers the running costs by reducing the number of servers required to run the whole application to the minimum. + +The only requirement to run {pluginname} On-Premises is a container runtime or orchestration tool e.g. Docker, Kubernetes, Podman. \ No newline at end of file diff --git a/modules/ROOT/partials/individually-licensed-components/import-from-word-and-export-to-word/import-from-word-and-export-to-word-requirements-on-premises.adoc b/modules/ROOT/partials/individually-licensed-components/import-from-word-and-export-to-word/import-from-word-and-export-to-word-requirements-on-premises.adoc new file mode 100644 index 0000000000..b315d08898 --- /dev/null +++ b/modules/ROOT/partials/individually-licensed-components/import-from-word-and-export-to-word/import-from-word-and-export-to-word-requirements-on-premises.adoc @@ -0,0 +1,23 @@ +[[requirements]] +== Requirements + +To run {pluginname} On-Premises, a Docker environment is required. Alternatively, use a CaaS available from your cloud provider, such as AWS ECS, Google GKE or Azure ACS. + +There are many factors that may affect Export to Word On-Premises performance. The most influential are: the size of exported content, the size of images, and the number of concurrent requests. Also, because your application can prioritize fast response times, or it should handle high load, it is impossible to provide one recommended server specification, that will fit all use cases. + +Assuming response time below 10 seconds, one server (2CPU 2GB RAM) with 1 docker container can handle: + +* up to 45 concurrent requests with an average content of 1 A4 page (~1k characters) +* up to 30 concurrent requests with an average content of 5 A4 pages (~7,5k characters) +* up to 10 concurrent requests with an average content of 20 A4 pages (~30k characters) + +[NOTE] +The listed concurrent requests numbers are not a hard limit of a {pluginname} On-Premises instance. It can handle more concurrent requests, but the response time will be longer. + +=== High availability + +One docker container with {pluginname} On-Premises benefits from additional CPUs on the machine. It is recommended that 2 CPUs are allocated for every docker container. To scale your app on a single machine, increase the number of CPUs and docker containers, however, {productname} recommends scaling on at least three hosts to ensure the reliability of the system. + +A load balancer, like HAProxy or NGINX (see the load balancer configuration examples in the SSL communication guide), is required for scaling on several machines. Of course, it is possible to use any cloud provider for scaling, like Amazon ECS, Azure Container Instances or Kubernetes. + +link:https://www.tiny.cloud/contact/[Contact us] if you have any questions about server resources needed for your use case of {pluginname} On-Premises. \ No newline at end of file diff --git a/modules/ROOT/partials/individually-licensed-components/import-from-word-and-export-to-word/import-from-word-and-export-to-word-ssl-communication-on-premises.adoc b/modules/ROOT/partials/individually-licensed-components/import-from-word-and-export-to-word/import-from-word-and-export-to-word-ssl-communication-on-premises.adoc new file mode 100644 index 0000000000..83c159e7f6 --- /dev/null +++ b/modules/ROOT/partials/individually-licensed-components/import-from-word-and-export-to-word/import-from-word-and-export-to-word-ssl-communication-on-premises.adoc @@ -0,0 +1,68 @@ +[[sll-communication]] +== SSL Communication + +Its possible to communicate with {pluginname} On-Premises using secure connections. To achieve this, the load balancer like `NGINX` or `HAProxy` needs to be setup with your SSL certificate. + +`HAProxy` and `NGINX` configuration examples below. + +=== HAProxy example + +Here is a basic `HAProxy` configuration: + +[source, nginx] +---- +global + daemon + maxconn 256 + tune.ssl.default-dh-param 2048 + +defaults + mode http + timeout connect 5000ms + timeout client 50000ms + timeout server 50000ms + +frontend http-in + bind *:80 + bind *:443 ssl crt /etc/ssl/your_certificate.pem + http-request set-header X-Forwarded-Proto https if { ssl_fc } + http-request set-header X-Forwarded-Proto http if !{ ssl_fc } + redirect scheme https if !{ ssl_fc } + + default_backend servers + +backend servers + server server1 127.0.0.1:8000 maxconn 32 +---- + +=== NGINX example + +Here is a basic NGINX configuration: + +[source, nginx] +---- +events { + worker_connections 1024; +} + +http { + server { + server_name your.domain.name; + + listen 443; + ssl on; + ssl_certificate /etc/ssl/your_cert.crt; + ssl_certificate_key /etc/ssl/your_cert_key.key; + + location / { + proxy_pass http://127.0.0.1:8000; + + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "Upgrade"; + proxy_set_header Host $host; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_http_version 1.1; + } + } +} +---- \ No newline at end of file From c0d9f655f287298b43b4543188694a359d4f9856 Mon Sep 17 00:00:00 2001 From: Karl Kemister-Sheppard Date: Mon, 15 Apr 2024 20:48:48 +1000 Subject: [PATCH 06/97] DOC-2370: Add new page that describes Tiny Cloud's UBB. (#3226) * DOC-2370: Add new page that describes Tiny Cloud's UBB. * DOC-2370: change filename. * Update modules/ROOT/pages/usage-based-billing.adoc --- modules/ROOT/nav.adoc | 1 + modules/ROOT/pages/usage-based-billing.adoc | 70 +++++++++++++++++++++ 2 files changed, 71 insertions(+) create mode 100644 modules/ROOT/pages/usage-based-billing.adoc diff --git a/modules/ROOT/nav.adoc b/modules/ROOT/nav.adoc index 3000691b9c..3df19b0b58 100644 --- a/modules/ROOT/nav.adoc +++ b/modules/ROOT/nav.adoc @@ -421,3 +421,4 @@ * xref:invalid-api-key.adoc[Invalid API key] * xref:license-key.adoc[License key] * xref:support.adoc[Support] +* xref:usage-based-billing.adoc[Usage-Based Billing] \ No newline at end of file diff --git a/modules/ROOT/pages/usage-based-billing.adoc b/modules/ROOT/pages/usage-based-billing.adoc new file mode 100644 index 0000000000..32c67bd4bc --- /dev/null +++ b/modules/ROOT/pages/usage-based-billing.adoc @@ -0,0 +1,70 @@ + += About Tiny Cloud's Usage-Based Billing (UBB) +:description_short: About Tiny Cloud's Usage-Based Billing (UBB) | {productname} +:description: Learn more about what Tiny Cloud's Usage-Based Billing (UBB) is, and how it affects your application. +:keywords: {productname}, cloud, script, textarea, ubb, faq, usage-based billing, frequently asked questions, usage, billing + + +[NOTE] +The below information is only relevant to Tiny Cloud users. Users who self-host the open source version of {productname} are not subject to Usage-Based Billing terms, but are required to comply with the open source license terms. + +== Definitions + +Understanding the following terms related to Usage-Based Billing can assist you in making an informed decision when selecting the appropriate link:https://www.tiny.cloud/pricing[pricing plan] to best suit your needs: + +== Tiny Cloud + +Tiny Cloud is our user-friendly cloud-based editor service that hosts {productname} in the cloud. It provides access to the link:https://www.tiny.cloud/tinymce/features/[premium features] of our rich text editor. With link:https://www.tiny.cloud/solutions/on-premise-or-cloud-based-text-editor/[Tiny Cloud], you can enjoy the benefits of automatic updates, ensuring your {productname} editor is always equipped with the latest features, enhancements, and security patches. + +Alternatively, if you prefer to utilize only the free open-source version of {productname} and your project aligns with our open-source software license, you can self-host {productname} in the cloud using any CDN service of your choice, bypassing the need for Tiny Cloud. +If you want to self-host {productname} and still access our Premium features like link:https://www.tiny.cloud/tinymce/features/powerpaste/[PowerPaste], link:https://www.tiny.cloud/tinymce/features/accessibility-checker/[Accessibility Checker], link:https://www.tiny.cloud/tinymce/features/templates/[Templates], link:https://www.tiny.cloud/tinymce/features/ai-integration/[AI Assistant], and many more, link:https://www.tiny.cloud/contact/[contact our sales team] for a quote. + +=== Editor Load + +An xref:understanding-editor-loads.adoc[editor load] is the event that occurs each time {productname} is initialized in your application. The editor dispatches the 'init' event to indicate a successful load. For example, if 100 users load {productname} 10 times each, the result would be 1,000 editor loads. + +Learn more about xref:understanding-editor-loads.adoc#how-are-editor-loads-counted[how we count editor loads]. + +=== How Usage-Based Billing works + +Usage-Based Billing means the cost you incur depends on how much you use the {productname} editor. + +Each of our pricing plans includes a specific number of editor loads. If you require additional editor loads, you have the option to upgrade to a more suitable plan or pay for every block of 1,000 editor loads over your allocated plan limit. + +=== When does my billing month start? + +Your billing month starts the day after your trial ends. + +For example, if the last day of your trial is May 15^th^, we start counting your monthly editor loads on May 16^th^, and then reset that count to 0 every 16^th^ day of each subsequent month. + +[IMPORTANT] +Unused editor loads do not carry over to the next month. + +=== What happens if I exceed my monthly limit? + +If you exceed your monthly limit, you will automatically be charged $40 USD for every block of 1,000 editor loads over your allocated plan limit. + +=== What if I’m using the free {productname} Core plan? + +If you use our free {productname} Core plan without providing a valid payment method and exceed your allocated editor loads, your editor will transition to read-only mode until the next month. If you provide a valid payment method, you will automatically be charged $40 USD for every block of 1,000 editor loads over our allocated plan limit. + +=== How can I ensure I don’t go over my monthly limit? + +All Admin users can check their usage data for the past six months in the {productname} Usage section of the Customer Portal. Usage data for the current billing cycle can be found in the Customer Portal > Settings > Billing Portal. We recommend monitoring your editor loads and choosing a plan that will both meet your needs and minimize your costs. Additionally, we will send an email notification to the address associated with your plan when you reach 70% of your monthly editor loads. + +If your editor loads are consistently exceeding your plan limit, we suggest upgrading your plan to minimize costs. You can review the cost of link:https://www.tiny.cloud/pricing/[upgrading to a higher plan] at any time and can upgrade in the Billing Portal to immediately receive a higher editor load limit and new capabilities. + +[NOTE] +We recommend that the email address associated with your plan is linked to either a group alias, IT, or administrator address that will remain valid over time (e.g. link:http://example.com/[http://example.com/]. By doing so, you'll avoid any disruption of {productname} in your project or application in the event of organizational or staff changes. + +=== How are editor loads counted during the free 14-day trial period? + +During the trial, you can enjoy unlimited editor loads. + +=== I have an annual plan. Are my editor loads calculated monthly or over the entire year? + +If you have an annual plan, your editor loads are calculated on a monthly basis within the structure of your annual plan. Similar to our monthly plans, you have a set monthly editor load limit and are automatically charged $40 USD per every block of 1,000 editor loads over your allocated plan limit. Learn more about Tiny Cloud’s Usage-Based Billing model. + +=== If I’m on the Essential plan and reach 5,000 editor loads, will I automatically be upgraded to the Professional plan? + +You will not automatically be upgraded. You will remain on your current plan and will automatically be charged $40 USD for each additional block of 1,000 editor loads over your plan limit. To avoid these charges, we encourage you to periodically review your editor load count to ensure you’re on the most appropriate pricing plan. You can always upgrade your plan in our Customer Portal > Settings > Billing Portal > Change Plans. \ No newline at end of file From 0a07f413bc3d0ca3bafac0b589ce5fce110b2c5a Mon Sep 17 00:00:00 2001 From: Daniel Oakman <141111365+danoaky-tiny@users.noreply.github.com> Date: Tue, 16 Apr 2024 09:54:22 +1000 Subject: [PATCH 07/97] DOC-2349: Update React integration cloud/self/hybrid hosted setup docs (#3186) * DOC-2349: Replaced create-react-app keyword with vite * DOC-2349: Swapped first couple of steps to vite * DOC-2349: Swap back to javascript template * DOC-2349: More small tweaks * DOC-2349: Swap to `npm run dev` * DOC-2349: Replace with side-effect imports * DOC-2349: removed raw-loader and replaced with vite's `?inline` feature * DOC-2349: Swapped the "deploying" part to reference Vite * DOC-2349: import App.css in App.jsx * DOC-2349: Fix up package manager self-hosted * DOC-2349: Include App.css in BundledEditor versions of App.css * DOC-2349: Added `npm run preview` optional step * DOC-2349: Added licenseKey to other package-manager setup * DOC-2349: Remove other unsused `React` imports * DOC-2349: Fixed zip-hosted App.jsx * DOC-2349: Added eslintrc changes and more js to jsx replacements * DOC-2349: Import skin js files instead * DOC-2349: Fixed error with help plugin * DOC-2349: Import oxide skin with js file instead * DOC-2349: Swapped out these 'gpl' `licenseKey`s --- modules/ROOT/pages/react-cloud.adoc | 2 +- modules/ROOT/pages/react-pm-bundle.adoc | 2 +- modules/ROOT/pages/react-pm-host.adoc | 2 +- modules/ROOT/pages/react-zip-bundle.adoc | 2 +- modules/ROOT/pages/react-zip-host.adoc | 2 +- .../partials/integrations/react-bundling.adoc | 18 +- .../integrations/react-quick-start.adoc | 256 ++++++++---------- 7 files changed, 118 insertions(+), 166 deletions(-) diff --git a/modules/ROOT/pages/react-cloud.adoc b/modules/ROOT/pages/react-cloud.adoc index 5cfc646688..90667b351d 100644 --- a/modules/ROOT/pages/react-cloud.adoc +++ b/modules/ROOT/pages/react-cloud.adoc @@ -1,7 +1,7 @@ = Using TinyMCE from the Tiny Cloud CDN with the React framework :navtitle: React :description: A guide on integrating TinyMCE from the Tiny Cloud into the React framework. -:keywords: integration, integrate, react, reactjs, create-react-app, tinymce-react +:keywords: integration, integrate, react, reactjs, vite, tinymce-react :productSource: cloud include::partial$integrations/react-quick-start.adoc[] diff --git a/modules/ROOT/pages/react-pm-bundle.adoc b/modules/ROOT/pages/react-pm-bundle.adoc index 3bb53c0340..f01456116b 100644 --- a/modules/ROOT/pages/react-pm-bundle.adoc +++ b/modules/ROOT/pages/react-pm-bundle.adoc @@ -1,7 +1,7 @@ = Bundling the TinyMCE package with the React framework :navtitle: Using a package manager with bundling :description: A guide on integrating the TinyMCE package into the React framework by bundling it. -:keywords: integration, integrate, react, reactjs, create-react-app, tinymce-react, bundle +:keywords: integration, integrate, react, reactjs, vite, tinymce-react, bundle :productSource: package-manager :productUse: bundle diff --git a/modules/ROOT/pages/react-pm-host.adoc b/modules/ROOT/pages/react-pm-host.adoc index 7fb69c31ab..d193822346 100644 --- a/modules/ROOT/pages/react-pm-host.adoc +++ b/modules/ROOT/pages/react-pm-host.adoc @@ -2,7 +2,7 @@ :page-aliases: react-pm.adoc :navtitle: Using a package manager with hosting :description: A guide on integrating the TinyMCE package into the React framework by self-hosting it. -:keywords: integration, integrate, react, reactjs, create-react-app, tinymce-react, host +:keywords: integration, integrate, react, reactjs, vite, tinymce-react, host :productSource: package-manager :productUse: host diff --git a/modules/ROOT/pages/react-zip-bundle.adoc b/modules/ROOT/pages/react-zip-bundle.adoc index 072e753695..6281d40ae1 100644 --- a/modules/ROOT/pages/react-zip-bundle.adoc +++ b/modules/ROOT/pages/react-zip-bundle.adoc @@ -1,7 +1,7 @@ = Bundling the TinyMCE .zip package with the React framework :navtitle: Using a .zip package with bundling :description: A guide on integrating a .zip version of TinyMCE into the React framework by bundling it. -:keywords: integration, integrate, react, reactjs, create-react-app, tinymce-react, bundle +:keywords: integration, integrate, react, reactjs, vite, tinymce-react, bundle :productSource: zip :productUse: bundle diff --git a/modules/ROOT/pages/react-zip-host.adoc b/modules/ROOT/pages/react-zip-host.adoc index a91609f9ae..4fdf72456c 100644 --- a/modules/ROOT/pages/react-zip-host.adoc +++ b/modules/ROOT/pages/react-zip-host.adoc @@ -2,7 +2,7 @@ :page-aliases: react-zip.adoc :navtitle: Using a .zip package with hosting :description: A guide on integrating a .zip version of TinyMCE into the React framework by self-hosting it. -:keywords: integration, integrate, react, reactjs, create-react-app, tinymce-react, host +:keywords: integration, integrate, react, reactjs, vite, tinymce-react, host :productSource: zip :productUse: host diff --git a/modules/ROOT/partials/integrations/react-bundling.adoc b/modules/ROOT/partials/integrations/react-bundling.adoc index 6881c67c94..e7fa085598 100644 --- a/modules/ROOT/partials/integrations/react-bundling.adoc +++ b/modules/ROOT/partials/integrations/react-bundling.adoc @@ -5,8 +5,7 @@ import { Editor } from '@tinymce/tinymce-react'; // TinyMCE so the global var exists -// eslint-disable-next-line no-unused-vars -import tinymce from 'tinymce/tinymce'; +import 'tinymce/tinymce'; // Theme import 'tinymce/themes/silver'; @@ -33,22 +32,17 @@ import 'tinymce/plugins/media'; import 'tinymce/plugins/nonbreaking'; import 'tinymce/plugins/table'; import 'tinymce/plugins/help'; +import 'tinymce/plugins/help/js/i18n/keynav/en'; // Content styles, including inline UI like fake cursors -/* eslint import/no-webpack-loader-syntax: off */ -import contentCss from '!!raw-loader!tinymce/skins/content/default/content.min.css'; -import contentUiCss from '!!raw-loader!tinymce/skins/ui/oxide/content.min.css'; +import 'tinymce/skins/content/default/content.js'; +import 'tinymce/skins/ui/oxide/content.js'; export default function TinyEditorComponent(props) { - // note that skin and content_css is disabled to avoid the normal - // loading process and is instead loaded as a string via content_style return ( ); } diff --git a/modules/ROOT/partials/integrations/react-quick-start.adoc b/modules/ROOT/partials/integrations/react-quick-start.adoc index b8697eadec..bbdb4b2c4a 100644 --- a/modules/ROOT/partials/integrations/react-quick-start.adoc +++ b/modules/ROOT/partials/integrations/react-quick-start.adoc @@ -4,7 +4,7 @@ ifeval::["{productUse}" == "bundle"] IMPORTANT: {companyname} does not recommend bundling the `tinymce` package. Bundling {productname} can be complex and error prone. endif::[] -The https://github.com/tinymce/tinymce-react[Official {productname} React component] integrates {productname} into React projects. This procedure creates a https://github.com/facebook/create-react-app[basic React application] containing a {productname} editor. +The https://github.com/tinymce/tinymce-react[Official {productname} React component] integrates {productname} into React projects. This procedure creates a https://github.com/vitejs/vite-plugin-react-swc[basic React application] containing a {productname} editor. For examples of the {productname} integration, visit https://tinymce.github.io/tinymce-react/[the tinymce-react storybook]. @@ -14,11 +14,11 @@ This procedure requires https://nodejs.org/[Node.js (and npm)]. == Procedure -. Use the https://github.com/facebook/create-react-app[Create React App] package to create a new React project named `+tinymce-react-demo+`. +. Use the https://github.com/vitejs/vite[Vite] package and the https://github.com/vitejs/vite-plugin-react-swc[React SWC plugin] to create a new React project named `+tinymce-react-demo+`. + [source,sh] ---- -npx create-react-app tinymce-react-demo +npm create vite@5 tinymce-react-demo -- --template react-swc ---- . Change to the newly created directory. + @@ -28,19 +28,20 @@ cd tinymce-react-demo ---- ifeval::["{productSource}" == "cloud"] -. Install the `+tinymce-react+` package and save it to your `+package.json+` with `+--save+`. +. Install the `+@tinymce/tinymce-react+` package and save it to your `+package.json+` with `+--save+`. + [source,sh] ---- npm install --save @tinymce/tinymce-react ---- -. Using a text editor, open `+./src/App.js+` and replace the contents with: +. Using a text editor, open `+./src/App.jsx+` and replace the contents with: + [source,jsx] ---- -import React, { useRef } from 'react'; +import { useRef } from 'react'; import { Editor } from '@tinymce/tinymce-react'; +import './App.css'; export default function App() { const editorRef = useRef(null); @@ -53,7 +54,7 @@ export default function App() { <> editorRef.current = editor} + onInit={(_evt, editor) => editorRef.current = editor} initialValue="

This is the initial content of the editor.

" init={{ height: 500, @@ -82,7 +83,7 @@ This JavaScript file will create a component "`+App+`" containing a {productname endif::[] ifeval::["{productSource}" == "package-manager"] ifeval::["{productUse}" == "host"] -. Install the `+tinymce+`, `+tinymce-react+` and `+fs-extra+` packages and save them to your `+package.json+` with `+--save+`. +. Install the `+tinymce+`, `+@tinymce/tinymce-react+` and `+fs-extra+` packages and save them to your `+package.json+` with `+--save+`. + [source,sh] ---- @@ -94,9 +95,9 @@ npm install --save tinymce @tinymce/tinymce-react fs-extra .postinstall.js [source,js] ---- -const fse = require('fs-extra'); -const path = require('path'); -const topDir = __dirname; +import fse from 'fs-extra'; +import path from 'path'; +const topDir = import.meta.dirname; fse.emptyDirSync(path.join(topDir, 'public', 'tinymce')); fse.copySync(path.join(topDir, 'node_modules', 'tinymce'), path.join(topDir, 'public', 'tinymce'), { overwrite: true }); ---- @@ -127,12 +128,13 @@ fse.copySync(path.join(topDir, 'node_modules', 'tinymce'), path.join(topDir, 'pu npm run postinstall ---- -. Using a text editor, open `+./src/App.js+` and replace the contents with: +. Using a text editor, open `+./src/App.jsx+` and replace the contents with: + [source,jsx] ---- -import React, { useRef } from 'react'; +import { useRef } from 'react'; import { Editor } from '@tinymce/tinymce-react'; +import './App.css'; export default function App() { const editorRef = useRef(null); @@ -144,8 +146,9 @@ export default function App() { return ( <> editorRef.current = editor} + tinymceScriptSrc='/tinymce/tinymce.min.js' + licenseKey='your-license-key' + onInit={(_evt, editor) => editorRef.current = editor} initialValue='

This is the initial content of the editor.

' init={{ height: 500, @@ -167,24 +170,26 @@ export default function App() { ); } ---- + +. Update the `+licenseKey+` option in the editor element and include your xref:license-key.adoc[License Key]. + endif::[] ifeval::["{productUse}" == "bundle"] -. Install the `+tinymce+`, `+tinymce-react+` and `+raw-loader+` packages and save them to your `+package.json+` with `+--save+`. +. Install the `+tinymce+` and `+@tinymce/tinymce-react+` packages and save them to your `+package.json+` with `+--save+`. + [source,sh] ---- -npm install --save tinymce @tinymce/tinymce-react raw-loader +npm install --save tinymce @tinymce/tinymce-react ---- -. Using a text editor, create `+./src/BundledEditor.js+` and set the contents to: +. Using a text editor, create `+./src/BundledEditor.jsx+` and set the contents to: + [source,jsx] ---- import { Editor } from '@tinymce/tinymce-react'; // TinyMCE so the global var exists -// eslint-disable-next-line no-unused-vars -import tinymce from 'tinymce/tinymce'; +import 'tinymce/tinymce'; // DOM model import 'tinymce/models/dom/model' // Theme @@ -192,7 +197,7 @@ import 'tinymce/themes/silver'; // Toolbar icons import 'tinymce/icons/default'; // Editor styles -import 'tinymce/skins/ui/oxide/skin.min.css'; +import 'tinymce/skins/ui/oxide/skin'; // importing the plugin js. // if you use a plugin that is not listed here the editor will fail to load @@ -208,6 +213,7 @@ import 'tinymce/plugins/directionality'; import 'tinymce/plugins/emoticons'; import 'tinymce/plugins/fullscreen'; import 'tinymce/plugins/help'; +import 'tinymce/plugins/help/js/i18n/keynav/en'; import 'tinymce/plugins/image'; import 'tinymce/plugins/importcss'; import 'tinymce/plugins/insertdatetime'; @@ -229,34 +235,28 @@ import 'tinymce/plugins/wordcount'; import 'tinymce/plugins/emoticons/js/emojis'; // Content styles, including inline UI like fake cursors -/* eslint import/no-webpack-loader-syntax: off */ -import contentCss from '!!raw-loader!tinymce/skins/content/default/content.min.css'; -import contentUiCss from '!!raw-loader!tinymce/skins/ui/oxide/content.min.css'; +import 'tinymce/skins/content/default/content'; +import 'tinymce/skins/ui/oxide/content'; export default function BundledEditor(props) { - const {init, ...rest} = props; - // note that skin and content_css is disabled to avoid the normal - // loading process and is instead loaded as a string via content_style return ( ); } ---- -. Using a text editor, open `+./src/App.js+` and replace the contents with: +. Update the `+licenseKey+` option in the editor element and include your xref:license-key.adoc[License Key]. + +. Using a text editor, open `+./src/App.jsx+` and replace the contents with: + [source,jsx] ---- -import React, { useRef } from 'react'; +import { useRef } from 'react'; import BundledEditor from './BundledEditor' +import './App.css'; export default function App() { const editorRef = useRef(null); @@ -268,7 +268,7 @@ export default function App() { return ( <> editorRef.current = editor} + onInit={(_evt, editor) => editorRef.current = editor} initialValue='

This is the initial content of the editor.

' init={{ height: 500, @@ -293,7 +293,7 @@ endif::[] endif::[] ifeval::["{productSource}" == "zip"] ifeval::["{productUse}" == "host"] -. Install the `+tinymce-react+` package and save it to your `+package.json+` with `+--save+`. +. Install the `+@tinymce/tinymce-react+` package and save it to your `+package.json+` with `+--save+`. + [source,sh] ---- @@ -324,12 +324,33 @@ public └── tinymce.min.js ---- -. Using a text editor, open `+./src/App.js+` and replace the contents with: +. Using a text editor, open `+./eslintrc.cjs+` and add `+'src/tinymce'+` to the `+ignorePatterns+` array. ++ +.Diff of `.eslintrc.js` +[source,patch] +---- +diff --git a/.eslintrc.cjs b/.eslintrc.cjs +index 3b3b3b3..4b4b4b4 100644 +--- a/.eslintrc.cjs ++++ b/.eslintrc.cjs +@@ -7,7 +7,7 @@ modules.exports = { + 'plugin:react/jsx-runtime', + 'plugin:react-hooks/recommended', + ], +- ignorePatterns: ['dist', '.eslintrc.cjs'], ++ ignorePatterns: ['dist', '.eslintrc.cjs', 'src/tinymce'], + parserOptions: { ecmaVersion: 'latest', sourceType: 'module' }, + settings: { react: { version: '18.2' } }, + plugins: ['react-refresh'], +---- + +. Using a text editor, open `+./src/App.jsx+` and replace the contents with: + [source,jsx] ---- -import React, { useRef } from 'react'; +import { useRef } from 'react'; import { Editor } from '@tinymce/tinymce-react'; +import './App.css'; export default function App() { const editorRef = useRef(null); @@ -341,8 +362,9 @@ export default function App() { return ( <> editorRef.current = editor} + tinymceScriptSrc='/tinymce/tinymce.min.js' + licenseKey='your-license-key' + onInit={(_evt, editor) => editorRef.current = editor} initialValue='

This is the initial content of the editor.

' init={{ height: 500, @@ -364,22 +386,15 @@ export default function App() { ); } ---- +. Update the `+licenseKey+` option in the editor element and include your xref:license-key.adoc[License Key]. endif::[] ifeval::["{productUse}" == "bundle"] -. Eject the create-react-app so it is possible to modify the Webpack configuration. -+ -[source,sh] ----- -npm run eject ----- -+ -Press 'y' when prompted. -. Install the `+tinymce-react+`, `+raw-loader+` and `+script-loader+` packages and save them to your `+package.json+` with `+--save+`. +. Install the `+@tinymce/tinymce-react+` and `+script-loader+` packages and save them to your `+package.json+` with `+--save+`. + [source,sh] ---- -npm install --save @tinymce/tinymce-react raw-loader script-loader +npm install --save @tinymce/tinymce-react script-loader ---- . Unzip the content of the `+tinymce/js+` folder from the link:{download-enterprise}[{productname} zip] into the `+src+` folder. Afterwards the directory listing should be similar to below: @@ -408,91 +423,33 @@ src └── tinymce.min.js ---- -. Using a text editor, open `+./config/paths.js+`, after the line with `+appSrc+` add the line: -+ -[source,js] ----- - appTinymce: resolveApp('src/tinymce'), ----- +. Using a text editor, open `+./eslintrc.cjs+` and add `+'src/tinymce'+` to the `+ignorePatterns+` array. + -.Diff of `./config/paths.js` +.Diff of `.eslintrc.js` [source,patch] ---- -diff --git a/config/paths.js b/config/paths.js -index f0a6cd9..a0d2f50 100644 ---- a/config/paths.js -+++ b/config/paths.js -@@ -60,6 +60,7 @@ module.exports = { - appIndexJs: resolveModule(resolveApp, 'src/index'), - appPackageJson: resolveApp('package.json'), - appSrc: resolveApp('src'), -+ appTinymce: resolveApp('src/tinymce'), - appTsConfig: resolveApp('tsconfig.json'), - appJsConfig: resolveApp('jsconfig.json'), - yarnLockFile: resolveApp('yarn.lock'), ----- - -. Using a text editor, open `+./config/webpack.config.js+` and make the following edits: -+ -** Find the `ModuleScopePlugin` and add `require.resolve('script-loader'),` to its array of exceptions. -** Find the rule for processing javascript in the `src` directory and add the new rule above it: -+ -[source,js] ----- -{ - test: /\.(js)$/, - include: paths.appTinymce, - loader: require.resolve('script-loader'), -}, ----- -** Find the `ESLintPlugin` and add `exclude: ["tinymce"],` to its options. - -+ -.Diff of `./config/webpack.config.js` -[source,patch] ----- -diff --git a/config/webpack.config.js b/config/webpack.config.js -index 6b4a4cd..e0d1952 100644 ---- a/config/webpack.config.js -+++ b/config/webpack.config.js -@@ -331,6 +331,7 @@ module.exports = function (webpackEnv) { - babelRuntimeEntry, - babelRuntimeEntryHelpers, - babelRuntimeRegenerator, -+ require.resolve('script-loader'), - ]), - ], - }, -@@ -399,6 +400,11 @@ module.exports = function (webpackEnv) { - and: [/\.(ts|tsx|js|jsx|md|mdx)$/], - }, - }, -+ { -+ test: /\.(js)$/, -+ include: paths.appTinymce, -+ loader: require.resolve('script-loader'), -+ }, - // Process application JS with Babel. - // The preset includes JSX, Flow, TypeScript, and some ESnext features. - { -@@ -724,6 +730,7 @@ module.exports = function (webpackEnv) { - new ESLintPlugin({ - // Plugin options - extensions: ['js', 'mjs', 'jsx', 'ts', 'tsx'], -+ exclude: ["tinymce"], - formatter: require.resolve('react-dev-utils/eslintFormatter'), - eslintPath: require.resolve('eslint'), - failOnError: !(isEnvDevelopment && emitErrorsAsWarnings), ----- - -. Using a text editor, create `+./src/BundledEditor.js+` and set the contents to: +diff --git a/.eslintrc.cjs b/.eslintrc.cjs +index 3b3b3b3..4b4b4b4 100644 +--- a/.eslintrc.cjs ++++ b/.eslintrc.cjs +@@ -7,7 +7,7 @@ modules.exports = { + 'plugin:react/jsx-runtime', + 'plugin:react-hooks/recommended', + ], +- ignorePatterns: ['dist', '.eslintrc.cjs'], ++ ignorePatterns: ['dist', '.eslintrc.cjs', 'src/tinymce'], + parserOptions: { ecmaVersion: 'latest', sourceType: 'module' }, + settings: { react: { version: '18.2' } }, + plugins: ['react-refresh'], +---- + +. Using a text editor, create `+./src/BundledEditor.jsx+` and set the contents to: + [source,jsx] ---- import { Editor } from '@tinymce/tinymce-react'; // TinyMCE so the global var exists -// eslint-disable-next-line no-unused-vars import './tinymce/tinymce.min.js'; // DOM model import './tinymce/models/dom/model.min.js' @@ -501,7 +458,7 @@ import './tinymce/themes/silver/theme.min.js'; // Toolbar icons import './tinymce/icons/default/icons.min.js'; // Editor styles -import './tinymce/skins/ui/oxide/skin.min.css'; +import './tinymce/skins/ui/oxide/skin.min.js'; // importing the plugin js. // if you use a plugin that is not listed here the editor will fail to load @@ -517,6 +474,7 @@ import './tinymce/plugins/directionality/plugin.min.js'; import './tinymce/plugins/emoticons/plugin.min.js'; import './tinymce/plugins/fullscreen/plugin.min.js'; import './tinymce/plugins/help/plugin.min.js'; +import './tinymce/plugins/help/js/i18n/keynav/en.js'; import './tinymce/plugins/image/plugin.min.js'; import './tinymce/plugins/importcss/plugin.min.js'; import './tinymce/plugins/insertdatetime/plugin.min.js'; @@ -538,34 +496,28 @@ import './tinymce/plugins/wordcount/plugin.min.js'; import './tinymce/plugins/emoticons/js/emojis.js'; // Content styles, including inline UI like fake cursors -/* eslint import/no-webpack-loader-syntax: off */ -import contentCss from '!!raw-loader!./tinymce/skins/content/default/content.min.css'; -import contentUiCss from '!!raw-loader!./tinymce/skins/ui/oxide/content.min.css'; +import './tinymce/skins/content/default/content.js'; +import './tinymce/skins/ui/oxide/content.js'; export default function BundledEditor(props) { - const {init, ...rest} = props; - // note that skin and content_css is disabled to avoid the normal - // loading process and is instead loaded as a string via content_style return ( ); } ---- -. Using a text editor, open `+./src/App.js+` and replace the contents with: +. Update the `+licenseKey+` option in the editor element and include your xref:license-key.adoc[License Key]. + +. Using a text editor, open `+./src/App.jsx+` and replace the contents with: + [source,jsx] ---- -import React, { useRef } from 'react'; +import { useRef } from 'react'; import BundledEditor from './BundledEditor' +import './App.css'; export default function App() { const editorRef = useRef(null); @@ -577,7 +529,7 @@ export default function App() { return ( <> editorRef.current = editor} + onInit={(_evt, editor) => editorRef.current = editor} initialValue='

This is the initial content of the editor.

' init={{ height: 500, @@ -607,14 +559,14 @@ endif::[] + [source,sh] ---- -npm run start +npm run dev ---- * To stop the development server, select on the command line or command prompt and press _Ctrl+C_. == Deploying the application to a HTTP server -The application will require further configuration before it can be deployed to a production environment. For information on configuring the application for deployment, see: https://create-react-app.dev/docs/deployment[Create React App - Deployment]. +The application will require further configuration before it can be deployed to a production environment. For information on configuring the application for deployment, see: https://vitejs.dev/guide/build[Building for Production] or https://vitejs.dev/guide/static-deploy.html[Deploying a Static Site]. To deploy the application to a local HTTP Server: @@ -624,7 +576,13 @@ To deploy the application to a local HTTP Server: ---- npm run build ---- -. Copy the contents of the `+tinymce-react-demo/build+` directory to the root directory of the web server. +. You can optionally preview the production build by running: ++ +[source,sh] +---- +npm run preview +---- +. Copy the contents of the `+tinymce-react-demo/dist+` directory to the root directory of the web server. The application has now been deployed on the web server. @@ -639,4 +597,4 @@ endif::[] * For information on customizing: ** {productname} integration, see: xref:react-ref.adoc[]. ** {productname}, see: xref:basic-setup.adoc[]. -** The React application, see: https://create-react-app.dev/docs/getting-started[Create React App] or https://reactjs.org/docs/getting-started.html[the React documentation]. +** The React application, see: https://vitejs.dev/guide/#getting-started[Getting Started with Vite] or https://reactjs.org/docs/getting-started.html[the React documentation]. From edfe5f03430b33f8e6ab86ff095684f5087af350 Mon Sep 17 00:00:00 2001 From: Mitchell Crompton Date: Tue, 16 Apr 2024 13:51:56 +1000 Subject: [PATCH 08/97] DOC-2373: Update versions and branches within workflows (#3231) * DOC-2373: Update versions and branches * DOC-2373: Update codeql branches --- .github/workflows/codeql.yml | 7 ++----- .github/workflows/develop_7_docs.yml | 12 +++++++----- 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index 95161eb0ec..ea8315bbdf 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -2,12 +2,9 @@ name: "CodeQL" on: push: - branches: [ "feature/**", "hotfix/**", "tinymce/**" ] + branches: [ "feature/**", "hotfix/**", "release/**", "staging/**", "tinymce/**" ] pull_request: branches: [ "tinymce/**" ] -## Add schedule if needed -# schedule: -# - cron: "17 23 * * 5" jobs: analyze: @@ -25,7 +22,7 @@ jobs: steps: - name: Checkout - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Initialize CodeQL uses: github/codeql-action/init@v2 diff --git a/.github/workflows/develop_7_docs.yml b/.github/workflows/develop_7_docs.yml index 43bb6f727b..1b17cc862e 100644 --- a/.github/workflows/develop_7_docs.yml +++ b/.github/workflows/develop_7_docs.yml @@ -6,23 +6,25 @@ on: paths: - '**' branches: - - 'feature/7**' - - 'hotfix/7**' + - 'feature/**' + - 'hotfix/**' + - 'release/**' + - 'staging/**' jobs: build: name: Build Docs and Deploy - runs-on: ubuntu-22.04 + runs-on: ubuntu-latest strategy: matrix: node-version: [21] steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v4 - name: Use Node.js - uses: actions/setup-node@v2 + uses: actions/setup-node@v4 with: cache: 'yarn' node-version: ${{ matrix.node-version }} From 8631a515b5158f49535ebb4a407283795c1502b2 Mon Sep 17 00:00:00 2001 From: Mitchell Crompton Date: Fri, 19 Apr 2024 11:48:56 +1000 Subject: [PATCH 09/97] DOC-2384: Added local playbook and dev scripts (#3247) --- antora-playbook-local.yml | 20 ++++++++++++++++++++ package.json | 9 ++++++--- 2 files changed, 26 insertions(+), 3 deletions(-) create mode 100644 antora-playbook-local.yml diff --git a/antora-playbook-local.yml b/antora-playbook-local.yml new file mode 100644 index 0000000000..4abf519a19 --- /dev/null +++ b/antora-playbook-local.yml @@ -0,0 +1,20 @@ +site: + title: TinyMCE Documentation + url: https://www.tiny.cloud/docs + start_page: tinymce::index.adoc +content: + sources: + - url: ./ + branches: HEAD + start_path: ./ +urls: + html_extension_style: indexify + latest_version_segment: latest +ui: + bundle: + url: https://tiny-cloud-docs-antora-themes-staging.s3.amazonaws.com/ui-bundle.zip +asciidoc: + extensions: + - '@tinymce/antora-extension-livedemos' +runtime: + fetch: true diff --git a/package.json b/package.json index a69a23fec9..7997a94896 100644 --- a/package.json +++ b/package.json @@ -11,10 +11,13 @@ "build": "./-scripts/api-reference.sh", "build-local-ref": "./-scripts/api-reference-local.sh", "clean": "rm -rf ./build", - "nodemon-dev": "nodemon --exec yarn antora ./antora-playbook.yml", + "nodemon": "nodemon --exec yarn antora ./antora-playbook.yml", + "nodemon-dev": "nodemon --exec yarn antora ./antora-playbook-local.yml", "server": "http-server build/site/ --port 4000", - "serve": "npm-run-all -p nodemon-dev server", - "start": "yarn clean && yarn serve" + "serve": "npm-run-all -p nodemon server", + "serve-dev": "npm-run-all -p nodemon-dev server", + "start": "yarn clean && yarn serve", + "start-dev": "yarn clean && yarn serve-dev" }, "author": "Tiny Technologies Inc", "license": "CC-BY-NC-SA-3.0", From 64ac405dfc33a2a9feee87756138d934ad25ea3f Mon Sep 17 00:00:00 2001 From: Karl Kemister-Sheppard Date: Fri, 3 May 2024 22:42:19 +1000 Subject: [PATCH 10/97] DOC-2405: Update supported TinyMCE versions to include EOCS and EOES. (#3281) --- .../partials/misc/supported-versions.adoc | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/modules/ROOT/partials/misc/supported-versions.adoc b/modules/ROOT/partials/misc/supported-versions.adoc index ff00f7fb9d..ecddb948e3 100644 --- a/modules/ROOT/partials/misc/supported-versions.adoc +++ b/modules/ROOT/partials/misc/supported-versions.adoc @@ -3,19 +3,19 @@ Supported versions of {productname}: -[cols="^,^,^",options="header"] +[cols="^,^,^,^",options="header"] |=== -|Version |Release Date |End of Support -|7.0 |2024-03-20 |2025-09-20 -|6.8 |2023-12-06 |2025-06-06 -|6.7 |2023-09-13 |2025-03-13 -|6.6 |2023-07-19 |2025-01-19 -|6.5 |2023-06-21 |2024-12-21 -|6.4 |2023-03-29 |2024-09-29 -|6.3 |2022-12-08 |2024-06-08 -|6.2 |2022-09-26 |2024-03-26 -|6.1 |2022-07-13 |2024-01-13 -|6.0 |2022-04-07 |2023-10-07 +|Version |Release Date |End of Community Support |End of Premium Support +|7.0 |2024-03-20 |- |2025-09-20 +|6.8 |2023-12-06 |2024-10-31 |2025-06-06 +|6.7 |2023-09-13 |2023-12-06 |2025-03-13 +|6.6 |2023-07-19 |2023-09-13 |2025-01-19 +|6.5 |2023-06-21 |2023-07-19 |2024-12-21 +|6.4 |2023-03-29 |2023-06-21 |2024-09-29 +|6.3 |2022-12-08 |2023-03-29 |2024-06-08 +|6.2 |2022-09-26 |2022-12-08 |2024-03-26 +|6.1 |2022-07-13 |2022-09-26 |2024-01-13 +|6.0 |2022-04-07 |2022-07-13 |2023-10-07 |=== To view our Software License Agreements, visit: From 70dd8a13726a81c321b6558506d30b64aa1e132b Mon Sep 17 00:00:00 2001 From: Karl Kemister-Sheppard Date: Wed, 8 May 2024 12:33:32 +1000 Subject: [PATCH 11/97] DOC-2375: TinyMCE 7.1 Documentation. (#3242) * DOC-2375: TinyMCE 7.1 Documentation. * DOC-2368: Update bundling documentation for all premium plugins for new index.js files. (#3224) * DOC-2368: Update bundling documentation for all premium plugins for new index.js files. * DOC-2368: additional improvements. * DOC-2368: additional copy edits to bundling-plugins.adoc and related partials,includes. * Revert "DOC-2339: On-premises documentation for document converters. (#3180)" This reverts commit 93d7ffed18df8cb3e375652998e98692b1665cee. * DOC-2368: update plugin code ref. * DOC-2368: delete plugin-file-plugins.adoc pages, update plugin.js for import code blocks. * Update modules/ROOT/partials/plugin-files/plugin-file-bundling-message.adoc Co-authored-by: ltrouton <46954949+ltrouton@users.noreply.github.com> * Update modules/ROOT/partials/plugin-files/plugin-file-index.js.adoc Co-authored-by: ltrouton <46954949+ltrouton@users.noreply.github.com> * Update modules/ROOT/partials/plugin-files/plugin-file-bundling-also-requires.adoc Co-authored-by: ltrouton <46954949+ltrouton@users.noreply.github.com> * Update modules/ROOT/pages/bundling-plugins.adoc * Update modules/ROOT/pages/bundling-plugins.adoc Co-authored-by: ltrouton <46954949+ltrouton@users.noreply.github.com> * DOC-2368: update plugin-file-list-emoticons.adoc file to include note. * DOC-2368: add note to reference back to the tinymce v6 docs if version is equal to or less than 7.0. * Update modules/ROOT/pages/bundling-plugins.adoc Co-authored-by: ltrouton <46954949+ltrouton@users.noreply.github.com> --------- Co-authored-by: ltrouton <46954949+ltrouton@users.noreply.github.com> * DOC-288 (#3262) * DOC-2386: add Google Gemini integration guide (#3250) * Add Google Gemini integration guide * Update Gemini string response example to use Vertex AI * Add admonition about access token security above each code example * Fix indentation in code examples * Update admonition from Mitch's suggestions Co-authored-by: Mitchell Crompton * Improve code example comments about authentication Co-authored-by: Mitchell Crompton * Remove pronouns from admon-ai-proxy.adoc and ai-gemini.adoc * change order of nav items * Apply suggestions from code review Only include ai proxy admon once per page Co-authored-by: Mitchell Crompton Co-authored-by: Karl Kemister-Sheppard --------- Co-authored-by: Mitchell Crompton Co-authored-by: Karl Kemister-Sheppard * DOC-2387: Add live demo to AI Assistant plugin page (#3260) * DOC-2387: Add live demo to AI Assistant plugin page * fix the authorization header in index.js * update live demo content to match website ai demo * add admonition that live demo uses proxy * DOC-2385: add Amazon Bedrock integration guide (#3252) * DOC-2384: Added local playbook and dev scripts (#3247) * Initial draft for Amazon Bedrock integration guide * change order of nav.adoc items * add ai proxy admonition (will be functional once merged into tinymce/7) * Revert "DOC-2384: Added local playbook and dev scripts (#3247)" This reverts commit 8631a515b5158f49535ebb4a407283795c1502b2. * Apply suggestions from code review Co-authored-by: Karl Kemister-Sheppard --------- Co-authored-by: Mitchell Crompton Co-authored-by: Karl Kemister-Sheppard * DOC-2399: Extract OpenAI integration code to separate page (#3270) * add ai-openai.adoc page with OpenAI string and streaming code examples * change ai_request to use minimal string response code example * remove basic setup section from ai.adoc and fix options headings nesting levels * add missing heading to ai-openai.adoc * move openai to above proxy in nav.adoc * add ai proxy admonitions (will be functional once merged into tinymce/7) * only include ai proxy admon once per page * change gemini prerequisites to ordered list * DOC-2381: add new `Math` Plugin documentation for TinyMCE 7.1. (#3253) * DOC-2381: add new Math plugin documentation for TinyMCE 7.1. * Update modules/ROOT/examples/live-demos/math/index.js * DOC-2381: update math demo, and removed examples of using equations. * Update premium-plugins.adoc Co-authored-by: spocke * Update math.adoc Co-authored-by: spocke * Update math.adoc Co-authored-by: spocke * Update math.adoc Co-authored-by: spocke * Update math.adoc Co-authored-by: spocke * Update modules/ROOT/pages/math.adoc * DOC-2381: Demo update, and included examples of block vs inline. * DOC-2381: Updated index.html for demo. * Update modules/ROOT/examples/live-demos/math/index.html * Update modules/ROOT/partials/misc/admon-requires-7.1v.adoc Co-authored-by: Farzad Hayat * add plugin to available-menu-items.adoc * add plugin to available-toolbar-buttons.adoc * add plugin to editor-command-identifiers.adoc * add plugin to full-featured demo * Update modules/ROOT/examples/live-demos/math/index.html Co-authored-by: Farzad Hayat * Update modules/ROOT/pages/math.adoc Co-authored-by: Farzad Hayat * Update modules/ROOT/pages/math.adoc Co-authored-by: Farzad Hayat * Update modules/ROOT/pages/math.adoc Co-authored-by: Farzad Hayat * Update modules/ROOT/pages/math.adoc Co-authored-by: Farzad Hayat * Update modules/ROOT/pages/math.adoc Co-authored-by: Farzad Hayat * Update modules/ROOT/partials/menu-item-ids/math-menu-items.adoc Co-authored-by: Farzad Hayat * Update modules/ROOT/partials/toolbar-button-ids/math-toolbar-buttons.adoc Co-authored-by: ltrouton <46954949+ltrouton@users.noreply.github.com> * Update modules/ROOT/partials/menu-item-ids/math-menu-items.adoc Co-authored-by: ltrouton <46954949+ltrouton@users.noreply.github.com> * Update modules/ROOT/pages/math.adoc Co-authored-by: ltrouton <46954949+ltrouton@users.noreply.github.com> * Update modules/ROOT/pages/math.adoc Co-authored-by: ltrouton <46954949+ltrouton@users.noreply.github.com> * Removed details - Update modules/ROOT/pages/math.adoc * Details amended - Update modules/ROOT/pages/math.adoc * Demo content updated - Update modules/ROOT/examples/live-demos/math/index.html * Updated information - Update modules/ROOT/pages/math.adoc * Added list separator -Update modules/ROOT/pages/math.adoc * italicised some text- Update modules/ROOT/pages/math.adoc * Apply suggestions from code review Co-authored-by: tiny-ben-tran Co-authored-by: Andrew Herron * Update modules/ROOT/pages/math.adoc Co-authored-by: spocke --------- Co-authored-by: spocke Co-authored-by: Farzad Hayat Co-authored-by: ltrouton <46954949+ltrouton@users.noreply.github.com> Co-authored-by: shirqa <43625458+ShiridiGandham@users.noreply.github.com> Co-authored-by: tiny-ben-tran Co-authored-by: Andrew Herron * DOC-2366: Add revision history diff API (#3278) * DOC-2366: Add revision history API section * DOC-2366: Clean up * Update modules/ROOT/partials/plugin-apis/ai-apis.adoc Co-authored-by: Mitchell Crompton --------- Co-authored-by: Mitchell Crompton * DOC-2401: Add integration docs for Azure OpenAI (#3273) * DOC-2401: Add integration docs for Azure OpenAI * Fix indentation in code * DOC-2401: Edits to azure ai page * Apply suggestions from code review Co-authored-by: shirqa <43625458+ShiridiGandham@users.noreply.github.com> Co-authored-by: Mitchell Crompton * DOC-2401: Fix streaming snippet * Update modules/ROOT/nav.adoc * Update modules/ROOT/pages/ai-azure.adoc Co-authored-by: Karl Kemister-Sheppard --------- Co-authored-by: Farzad Hayatbakhsh Co-authored-by: shirqa <43625458+ShiridiGandham@users.noreply.github.com> Co-authored-by: Mitchell Crompton Co-authored-by: Karl Kemister-Sheppard * DOC-2363: TinyMCE 7.1 release notes and changelog. (#3243) * DOC-2363: TinyMCE 7.1 release notes and changelog. * DOC-2384: Added local playbook and dev scripts (#3247) * change default http-server address to 'localhost' * DOC-2363: New `index.js` file that includes all plugin resources. (#3246) * DOC-2363: New index.js file that includes all plugin resources. * Update modules/ROOT/pages/7.1-release-notes.adoc * Update modules/ROOT/pages/7.1-release-notes.adoc * DOC-2363: Removed `aria-pressed` from the `More` button in sliding toolbar mode and replaced it with `aria-expanded` (#3267) * DOC-2363: Removed aria-pressed from the More button in sliding toolbar mode and replaced it with aria-expanded. * Update modules/ROOT/pages/7.1-release-notes.adoc Co-authored-by: Shan --------- Co-authored-by: Shan * DOC-2363: Notification accessibility improvements: added tooltips, keyboard navigation and shortcut to focus on notifications. (#3266) * DOC-2363: Notification accessibility improvements: added tooltips, keyboard navigation and shortcut to focus on notifications. * Update modules/ROOT/pages/7.1-release-notes.adoc Co-authored-by: Shan * Update modules/ROOT/pages/7.1-release-notes.adoc Co-authored-by: Shan --------- Co-authored-by: Shan * DOC-2363: Add TINY-10597 release note entry (#3256) * DOC-2363: Add TINY-10800 release note entry (#3255) * DOC-2363: Dialog title was not announced in macOS VoiceOver, dialogs now use `aria-label` instead of `aria-labelledby` on macOS. (#3271) * DOC-2363: Dialog title was not announced in macOS VoiceOver, dialogs now use aria-label instead of aria-labelledby on macOS. * Update modules/ROOT/pages/7.1-release-notes.adoc Co-authored-by: Farzad Hayat --------- Co-authored-by: Farzad Hayat * DOC-2363: ToggleToolbarDrawer command did not toggle the toolbar in sliding mode when {skipFocus: true} parameter was passed. (#3265) * DOC-2363: Firefox not announcing the iframe title when `iframe_aria_text` was set. (#3275) * DOC-2363: Firefox not announcing the iframe title when was set. * Update 7.1-release-notes.adoc Co-authored-by: Shan * Update modules/ROOT/pages/7.1-release-notes.adoc --------- Co-authored-by: Shan * DOC-2363: release note entry for TINY-10725 (#3251) * DOC-2363: add changelog for TinyMCE 7.1 core changes. * DOC-2396: add Windows High Contrast mode support to 7.1 release notes (#3279) * DOC-2396: add Windows High Contrast mode support to 7.1 release notes * Apply suggestions from code review Co-authored-by: Mitchell Crompton Co-authored-by: Arvin(Jintao) Han <20640097+ArvinJ-H@users.noreply.github.com> --------- Co-authored-by: Mitchell Crompton Co-authored-by: Arvin(Jintao) Han <20640097+ArvinJ-H@users.noreply.github.com> * DOC-2363: Add TINY-10780 release note entry (#3254) * DOC-2363: Included `itemprop`, `itemscope`, `itemtype` as valid HTML5 attributes in the core schema. (#3244) * DOC-2363: Included itemprop, itemscope, itemtype as valid HTML5 attributes in the core schema. * Update modules/ROOT/pages/7.1-release-notes.adoc Co-authored-by: Farzad Hayat * Update modules/ROOT/pages/7.1-release-notes.adoc --------- Co-authored-by: Farzad Hayat * DOC-2363: Accompanying Premium self-hosted server-side component changes in TinyMCE 7.1. (#3274) * DOC-2363: Open link context menu action was not enabled for links on images. (#3277) * DOC-2363: Open link context menu action was not enabled for links on images. * DOC-2363: Add release note for open link context menu action issues * Update modules/ROOT/pages/7.1-release-notes.adoc Co-authored-by: Karl Kemister-Sheppard * Update modules/ROOT/pages/7.1-release-notes.adoc Co-authored-by: Mitchell Crompton --------- Co-authored-by: Ben Tran Co-authored-by: Mitchell Crompton * DOC-2363: Notification width was not constrained to the width of the editor. (#3268) * DOC-2363: Notification width was not constrained to the width of the editor. * Update modules/ROOT/pages/7.1-release-notes.adoc Co-authored-by: Farzad Hayat --------- Co-authored-by: Farzad Hayat * Update modules/ROOT/pages/changelog.adoc * Update modules/ROOT/pages/changelog.adoc * DOC-2363: Video and audio elements could not be played on Safari. (#3258) * DOC-2363: Video and audio elements could not be played on Safari. * Update modules/ROOT/pages/7.1-release-notes.adoc Co-authored-by: Farzad Hayat --------- Co-authored-by: Farzad Hayat * DOC-2363: In the custom view, the scrollbar of the container were not visible if its height was greater than the editor. (#3272) * DOC-2363: In the custom view, the scrollbar of the container were not visible if its height was greater than the editor. * Update modules/ROOT/pages/7.1-release-notes.adoc Co-authored-by: Farzad Hayat * Update modules/ROOT/pages/7.1-release-notes.adoc Co-authored-by: Farzad Hayat * Update modules/ROOT/pages/7.1-release-notes.adoc Co-authored-by: Farzad Hayat * Update modules/ROOT/pages/7.1-release-notes.adoc --------- Co-authored-by: Farzad Hayat Co-authored-by: tiny-ben-tran * Update modules/ROOT/pages/7.1-release-notes.adoc * Update modules/ROOT/pages/7.1-release-notes.adoc * Update modules/ROOT/pages/7.1-release-notes.adoc * DOC-2363: Styles were not retained when toggling a list on and off. (#3269) Co-authored-by: Farzad Hayat * DOC-2363: Added new `A11ycheckStart`, `A11ycheckStop`, `A11ycheckIgnore`, `A11ycheckRepair` and `A11ycheckShowDetails` events.. (#3245) * DOC-2363: Added new A11ycheckStart, A11ycheckStop, A11ycheckIgnore, A11ycheckRepair and A11ycheckShowDetails events. * Update modules/ROOT/pages/7.1-release-notes.adoc Co-authored-by: Farzad Hayat * Update modules/ROOT/pages/7.1-release-notes.adoc Co-authored-by: Farzad Hayat * Update modules/ROOT/partials/events/a11ychecker-events.adoc Co-authored-by: Farzad Hayat * Update modules/ROOT/pages/7.1-release-notes.adoc Co-authored-by: Farzad Hayat * Add Accessibility Checker events to events page * Update modules/ROOT/pages/7.1-release-notes.adoc Co-authored-by: Farzad Hayat --------- Co-authored-by: Farzad Hayat * DOC-2363: Custom block elements with colon characters would throw errors. (#3259) * DOC-2363: Custom block elements with colon characters would throw errors. * DOC-2363: Custom block elements with colon characters would throw errors. * Update modules/ROOT/pages/7.1-release-notes.adoc Co-authored-by: Farzad Hayat --------- Co-authored-by: Farzad Hayat * DOC--2363: Fixed accessibility issue by removing duplicate role (menu) attribute from color swatches. (#3261) Co-authored-by: Farzad Hayat * DOC-2363: final copy edits and removal of trailing template material. * Update modules/ROOT/pages/7.1-release-notes.adoc * DOC-2363: add revisionhistory_diff_classes entry to the TinyMCE 7.1 release notes. * Update modules/ROOT/pages/7.1-release-notes.adoc --------- Co-authored-by: Mitchell Crompton Co-authored-by: Farzad Hayatbakhsh Co-authored-by: Shan Co-authored-by: Arvin(Jintao) Han <20640097+ArvinJ-H@users.noreply.github.com> Co-authored-by: Ben Tran * DOC-2408: update support page EOS dates to include 7.1 entry (#3284) * DOC-2408: update support page EOS dates to include 7.1 entry * Update modules/ROOT/partials/misc/supported-versions.adoc --------- Co-authored-by: Karl Kemister-Sheppard --------- Co-authored-by: ltrouton <46954949+ltrouton@users.noreply.github.com> Co-authored-by: Shan Co-authored-by: Farzad Hayat Co-authored-by: Mitchell Crompton Co-authored-by: spocke Co-authored-by: shirqa <43625458+ShiridiGandham@users.noreply.github.com> Co-authored-by: tiny-ben-tran Co-authored-by: Andrew Herron Co-authored-by: Arvin(Jintao) Han <20640097+ArvinJ-H@users.noreply.github.com> --- antora.yml | 2 + .../examples/live-demos/ai-demo/index.html | 30 -- .../ROOT/examples/live-demos/ai-demo/index.js | 13 - .../ROOT/examples/live-demos/ai/example.js | 125 ++++++ .../ROOT/examples/live-demos/ai/index.html | 13 + modules/ROOT/examples/live-demos/ai/index.js | 121 ++++++ .../live-demos/full-featured/example.js | 6 +- .../live-demos/full-featured/index.js | 6 +- .../ROOT/examples/live-demos/math/index.html | 9 + .../ROOT/examples/live-demos/math/index.js | 9 + modules/ROOT/images/ai-plugin/ai-icon.svg | 5 + modules/ROOT/images/ai-plugin/wand-icon.svg | 15 + modules/ROOT/images/icons/math-equation.svg | 3 + modules/ROOT/nav.adoc | 15 +- modules/ROOT/pages/7.1-release-notes.adoc | 395 ++++++++++++++++++ modules/ROOT/pages/a11ychecker.adoc | 7 + modules/ROOT/pages/ai-azure.adoc | 206 +++++++++ modules/ROOT/pages/ai-bedrock.adoc | 206 +++++++++ modules/ROOT/pages/ai-gemini.adoc | 236 +++++++++++ modules/ROOT/pages/ai-openai.adoc | 206 +++++++++ modules/ROOT/pages/ai.adoc | 22 +- modules/ROOT/pages/available-menu-items.adoc | 5 + .../ROOT/pages/available-toolbar-buttons.adoc | 5 + modules/ROOT/pages/bundling-plugins.adoc | 28 +- modules/ROOT/pages/changelog.adoc | 56 +++ .../pages/editor-command-identifiers.adoc | 10 +- modules/ROOT/pages/events.adoc | 8 + modules/ROOT/pages/keyboard-shortcuts.adoc | 2 + modules/ROOT/pages/math.adoc | 79 ++++ modules/ROOT/pages/release-notes.adoc | 8 +- modules/ROOT/pages/revisionhistory.adoc | 8 +- .../ROOT/pages/tinymce-and-screenreaders.adoc | 5 + modules/ROOT/partials/commands/math-cmds.adoc | 11 + .../partials/configuration/ai_request.adoc | 150 ++----- .../configuration/defaultmenuitems.adoc | 2 +- .../partials/configuration/icon_list.adoc | 1 + .../partials/events/a11ychecker-events.adoc | 9 + .../partials/index-pages/premium-plugins.adoc | 6 + .../integrations/react-quick-start.adoc | 59 ++- .../menu-item-ids/math-menu-items.adoc | 5 + .../ROOT/partials/misc/admon-ai-proxy.adoc | 1 + .../partials/misc/admon-requires-7.1v.adoc | 1 + .../partials/misc/premium-plugin-list.adoc | 1 + .../partials/misc/supported-versions.adoc | 5 +- .../admon-bundling-plugin-langs.adoc | 27 +- .../bundling-browserify-cjs-zip_editor.adoc | 12 +- .../module-loading/bundling-plugin-files.adoc | 327 +-------------- .../bundling-plugin-language-files.adoc | 78 ++-- .../bundling-plugins-that-cant-bundle.adoc | 12 - .../bundling-rollup-es6-npm_editor.adoc | 8 +- .../bundling-rollup-es6-zip_editor.adoc | 18 +- .../bundling-vite-es6-npm_editor.adoc | 4 +- .../bundling-webpack-cjs-zip_editor.adoc | 12 +- .../bundling-webpack-es6-npm_editor.adoc | 4 +- .../bundling-webpack-es6-zip_editor.adoc | 18 +- .../partials/plugin-apis/accordion-apis.adoc | 24 -- .../plugin-apis/revisionhistory-apis.adoc | 26 ++ .../plugin-file-bundling-also-requires.adoc | 2 + .../plugin-file-bundling-message.adoc | 1 + .../plugin-files/plugin-file-index.js.adoc | 9 + .../plugin-file-list-a11ychecker.adoc | 12 - .../plugin-file-list-advcode.adoc | 19 - .../plugin-file-list-advlist.adoc | 5 - .../plugin-file-list-advtable.adoc | 5 - .../plugin-files/plugin-file-list-anchor.adoc | 5 - .../plugin-file-list-autocorrect.adoc | 5 - .../plugin-file-list-autolink.adoc | 5 - .../plugin-file-list-autoresize.adoc | 5 - .../plugin-file-list-autosave.adoc | 5 - .../plugin-file-list-casechange.adoc | 5 - .../plugin-file-list-charmap.adoc | 5 - .../plugin-file-list-checklist.adoc | 5 - .../plugin-files/plugin-file-list-code.adoc | 5 - .../plugin-file-list-codesample.adoc | 5 - .../plugin-file-list-directionality.adoc | 5 - .../plugin-file-list-editimage.adoc | 5 - .../plugin-file-list-emoticons.adoc | 6 +- .../plugin-file-list-exportpdf.adoc | 5 - .../plugin-file-list-exportword.adoc | 5 - .../plugin-file-list-footnotes.adoc | 5 - .../plugin-file-list-formatpainter.adoc | 5 - .../plugin-file-list-fullscreen.adoc | 5 - .../plugin-files/plugin-file-list-help.adoc | 5 - .../plugin-files/plugin-file-list-image.adoc | 5 - .../plugin-file-list-importcss.adoc | 5 - .../plugin-file-list-importword.adoc | 5 - .../plugin-file-list-insertdatetime.adoc | 5 - .../plugin-files/plugin-file-list-link.adoc | 5 - .../plugin-file-list-linkchecker.adoc | 12 - .../plugin-files/plugin-file-list-lists.adoc | 5 - .../plugin-file-list-markdown.adoc | 5 - .../plugin-files/plugin-file-list-media.adoc | 5 - .../plugin-file-list-mediaembed.adoc | 12 - .../plugin-file-list-mentions.adoc | 12 - .../plugin-file-list-mergetags.adoc | 5 - .../plugin-file-list-nonbreaking.adoc | 5 - .../plugin-file-list-pagebreak.adoc | 5 - .../plugin-file-list-pageembed.adoc | 12 - .../plugin-file-list-permanentpen.adoc | 5 - .../plugin-file-list-powerpaste.adoc | 11 - .../plugin-file-list-preview.adoc | 5 - .../plugin-file-list-quickbars.adoc | 5 - .../plugin-files/plugin-file-list-save.adoc | 5 - .../plugin-file-list-searchreplace.adoc | 5 - .../plugin-files/plugin-file-list-table.adoc | 5 - .../plugin-file-list-tableofcontents.adoc | 5 - .../plugin-file-list-tinycomments.adoc | 18 - .../plugin-file-list-tinymcespellchecker.adoc | 5 - .../plugin-file-list-visualblocks.adoc | 5 - .../plugin-file-list-visualchars.adoc | 5 - .../plugin-file-list-wordcount.adoc | 5 - .../math-toolbar-buttons.adoc | 5 + package.json | 2 +- 113 files changed, 2038 insertions(+), 990 deletions(-) delete mode 100644 modules/ROOT/examples/live-demos/ai-demo/index.html delete mode 100644 modules/ROOT/examples/live-demos/ai-demo/index.js create mode 100644 modules/ROOT/examples/live-demos/ai/example.js create mode 100644 modules/ROOT/examples/live-demos/ai/index.html create mode 100644 modules/ROOT/examples/live-demos/ai/index.js create mode 100644 modules/ROOT/examples/live-demos/math/index.html create mode 100644 modules/ROOT/examples/live-demos/math/index.js create mode 100644 modules/ROOT/images/ai-plugin/ai-icon.svg create mode 100644 modules/ROOT/images/ai-plugin/wand-icon.svg create mode 100644 modules/ROOT/images/icons/math-equation.svg create mode 100644 modules/ROOT/pages/7.1-release-notes.adoc create mode 100644 modules/ROOT/pages/ai-azure.adoc create mode 100644 modules/ROOT/pages/ai-bedrock.adoc create mode 100644 modules/ROOT/pages/ai-gemini.adoc create mode 100644 modules/ROOT/pages/ai-openai.adoc create mode 100644 modules/ROOT/pages/math.adoc create mode 100644 modules/ROOT/partials/commands/math-cmds.adoc create mode 100644 modules/ROOT/partials/events/a11ychecker-events.adoc create mode 100644 modules/ROOT/partials/menu-item-ids/math-menu-items.adoc create mode 100644 modules/ROOT/partials/misc/admon-ai-proxy.adoc create mode 100644 modules/ROOT/partials/misc/admon-requires-7.1v.adoc delete mode 100644 modules/ROOT/partials/module-loading/bundling-plugins-that-cant-bundle.adoc delete mode 100644 modules/ROOT/partials/plugin-apis/accordion-apis.adoc create mode 100644 modules/ROOT/partials/plugin-apis/revisionhistory-apis.adoc create mode 100644 modules/ROOT/partials/plugin-files/plugin-file-bundling-also-requires.adoc create mode 100644 modules/ROOT/partials/plugin-files/plugin-file-bundling-message.adoc create mode 100644 modules/ROOT/partials/plugin-files/plugin-file-index.js.adoc delete mode 100644 modules/ROOT/partials/plugin-files/plugin-file-list-a11ychecker.adoc delete mode 100644 modules/ROOT/partials/plugin-files/plugin-file-list-advcode.adoc delete mode 100644 modules/ROOT/partials/plugin-files/plugin-file-list-advlist.adoc delete mode 100644 modules/ROOT/partials/plugin-files/plugin-file-list-advtable.adoc delete mode 100644 modules/ROOT/partials/plugin-files/plugin-file-list-anchor.adoc delete mode 100644 modules/ROOT/partials/plugin-files/plugin-file-list-autocorrect.adoc delete mode 100644 modules/ROOT/partials/plugin-files/plugin-file-list-autolink.adoc delete mode 100644 modules/ROOT/partials/plugin-files/plugin-file-list-autoresize.adoc delete mode 100644 modules/ROOT/partials/plugin-files/plugin-file-list-autosave.adoc delete mode 100644 modules/ROOT/partials/plugin-files/plugin-file-list-casechange.adoc delete mode 100644 modules/ROOT/partials/plugin-files/plugin-file-list-charmap.adoc delete mode 100644 modules/ROOT/partials/plugin-files/plugin-file-list-checklist.adoc delete mode 100644 modules/ROOT/partials/plugin-files/plugin-file-list-code.adoc delete mode 100644 modules/ROOT/partials/plugin-files/plugin-file-list-codesample.adoc delete mode 100644 modules/ROOT/partials/plugin-files/plugin-file-list-directionality.adoc delete mode 100644 modules/ROOT/partials/plugin-files/plugin-file-list-editimage.adoc delete mode 100644 modules/ROOT/partials/plugin-files/plugin-file-list-exportpdf.adoc delete mode 100644 modules/ROOT/partials/plugin-files/plugin-file-list-exportword.adoc delete mode 100644 modules/ROOT/partials/plugin-files/plugin-file-list-footnotes.adoc delete mode 100644 modules/ROOT/partials/plugin-files/plugin-file-list-formatpainter.adoc delete mode 100644 modules/ROOT/partials/plugin-files/plugin-file-list-fullscreen.adoc delete mode 100644 modules/ROOT/partials/plugin-files/plugin-file-list-help.adoc delete mode 100644 modules/ROOT/partials/plugin-files/plugin-file-list-image.adoc delete mode 100644 modules/ROOT/partials/plugin-files/plugin-file-list-importcss.adoc delete mode 100644 modules/ROOT/partials/plugin-files/plugin-file-list-importword.adoc delete mode 100644 modules/ROOT/partials/plugin-files/plugin-file-list-insertdatetime.adoc delete mode 100644 modules/ROOT/partials/plugin-files/plugin-file-list-link.adoc delete mode 100644 modules/ROOT/partials/plugin-files/plugin-file-list-linkchecker.adoc delete mode 100644 modules/ROOT/partials/plugin-files/plugin-file-list-lists.adoc delete mode 100644 modules/ROOT/partials/plugin-files/plugin-file-list-markdown.adoc delete mode 100644 modules/ROOT/partials/plugin-files/plugin-file-list-media.adoc delete mode 100644 modules/ROOT/partials/plugin-files/plugin-file-list-mediaembed.adoc delete mode 100644 modules/ROOT/partials/plugin-files/plugin-file-list-mentions.adoc delete mode 100644 modules/ROOT/partials/plugin-files/plugin-file-list-mergetags.adoc delete mode 100644 modules/ROOT/partials/plugin-files/plugin-file-list-nonbreaking.adoc delete mode 100644 modules/ROOT/partials/plugin-files/plugin-file-list-pagebreak.adoc delete mode 100644 modules/ROOT/partials/plugin-files/plugin-file-list-pageembed.adoc delete mode 100644 modules/ROOT/partials/plugin-files/plugin-file-list-permanentpen.adoc delete mode 100644 modules/ROOT/partials/plugin-files/plugin-file-list-powerpaste.adoc delete mode 100644 modules/ROOT/partials/plugin-files/plugin-file-list-preview.adoc delete mode 100644 modules/ROOT/partials/plugin-files/plugin-file-list-quickbars.adoc delete mode 100644 modules/ROOT/partials/plugin-files/plugin-file-list-save.adoc delete mode 100644 modules/ROOT/partials/plugin-files/plugin-file-list-searchreplace.adoc delete mode 100644 modules/ROOT/partials/plugin-files/plugin-file-list-table.adoc delete mode 100644 modules/ROOT/partials/plugin-files/plugin-file-list-tableofcontents.adoc delete mode 100644 modules/ROOT/partials/plugin-files/plugin-file-list-tinycomments.adoc delete mode 100644 modules/ROOT/partials/plugin-files/plugin-file-list-tinymcespellchecker.adoc delete mode 100644 modules/ROOT/partials/plugin-files/plugin-file-list-visualblocks.adoc delete mode 100644 modules/ROOT/partials/plugin-files/plugin-file-list-visualchars.adoc delete mode 100644 modules/ROOT/partials/plugin-files/plugin-file-list-wordcount.adoc create mode 100644 modules/ROOT/partials/toolbar-button-ids/math-toolbar-buttons.adoc diff --git a/antora.yml b/antora.yml index 6389a6dc11..01f14f3473 100644 --- a/antora.yml +++ b/antora.yml @@ -14,6 +14,8 @@ asciidoc: tinydrive_live_demo_url: https://cdn.tiny.cloud/1/qagffr3pkuv17a8on1afax661irst1hbr4e6tbv888sz91jc/tinydrive/7/tinydrive.min.js webcomponent_url: https://cdn.jsdelivr.net/npm/@tinymce/tinymce-webcomponent@2/dist/tinymce-webcomponent.min.js jquery_url: https://cdn.jsdelivr.net/npm/@tinymce/tinymce-jquery@2/dist/tinymce-jquery.min.js + openai_proxy_url: https://openai.ai-demo-proxy.tiny.cloud/v1/chat/completions + openai_proxy_token: eyJhbGciOiJFUzM4NCJ9.eyJhdWQiOlsiaHR0cHM6Ly9vcGVuYWkuYWktZGVtby1wcm94eS50aW55LmNsb3VkLyJdLCJleHAiOjE3MTk3NTYwMDAsImh0dHBzOi8vb3BlbmFpLmFpLWRlbW8tcHJveHkudGlueS5jbG91ZC9yb2xlIjoicHVibGljLWRlbW8iLCJpc3MiOiJodHRwczovL2FpLWRlbW8tcHJveHkudGlueS5jbG91ZC8iLCJqdGkiOiJlYWU5MjBhMy05ZGQ0LTRkZjUtYTM4Yy04ODY5ZTJkZGIwYTQiLCJzdWIiOiJhaS1hc3Npc3RhbnQtZGVtbyJ9.hX44J5hPOCLOidK8mBAcnlAVh-ae4nVTq3W92xRLuGiF_4mGZWn1W3Ihgd7unlffz7GDayGxD_3hoQx8f64bTJg5hyHjwjKH1AZj1EKRal-NCNbqmoUa0TOm6_VXpRl2 default_meta_keywords: tinymce, documentation, docs, plugins, customizable skins, configuration, examples, html, php, java, javascript, image editor, inline editor, distraction-free editor, classic editor, wysiwyg # product docker variables dockerimageimportfromwordexporttoword: registry.containers.tiny.cloud/docx-converter-tiny diff --git a/modules/ROOT/examples/live-demos/ai-demo/index.html b/modules/ROOT/examples/live-demos/ai-demo/index.html deleted file mode 100644 index 608c7b5fd3..0000000000 --- a/modules/ROOT/examples/live-demos/ai-demo/index.html +++ /dev/null @@ -1,30 +0,0 @@ - diff --git a/modules/ROOT/examples/live-demos/ai-demo/index.js b/modules/ROOT/examples/live-demos/ai-demo/index.js deleted file mode 100644 index d992b1a016..0000000000 --- a/modules/ROOT/examples/live-demos/ai-demo/index.js +++ /dev/null @@ -1,13 +0,0 @@ -// a generic TinyMCE configuration with ai plugin and toolbar added. - -tinymce.init({ - selector: 'textarea#ai', - plugins: [ - "advlist", "anchor", "autolink", "charmap", "code", "fullscreen", - "help", "image", "insertdatetime", "link", "lists", "media", - "preview", "searchreplace", "table", "visualblocks", "ai", - ], - height: 1200, - toolbar: "aidialog | undo redo |link image accordion | styles | bold italic underline strikethrough | align | bullist numlist", -}); - diff --git a/modules/ROOT/examples/live-demos/ai/example.js b/modules/ROOT/examples/live-demos/ai/example.js new file mode 100644 index 0000000000..d1764417e9 --- /dev/null +++ b/modules/ROOT/examples/live-demos/ai/example.js @@ -0,0 +1,125 @@ +const fetchApi = import("https://unpkg.com/@microsoft/fetch-event-source@2.0.1/lib/esm/index.js").then(module => module.fetchEventSource); + +// This example stores the API key in the client side integration. This is not recommended for any purpose. +// Instead, an alternate method for retrieving the API key should be used. +const api_key = ''; + +const ai_request = (request, respondWith) => respondWith.stream(async (signal, streamMessage) => { + // Adds each previous query and response as individual messages + const conversation = request.thread.flatMap((event) => { + if (event.response) { + return [ + { role: 'user', content: event.request.query }, + { role: 'assistant', content: event.response.data } + ]; + } else { + return []; + } + }); + + // System messages provided by the plugin to format the output as HTML content. + const pluginSystemMessages = request.system.map((content) => ({ + role: 'system', + content + })); + + const systemMessages = [ + ...pluginSystemMessages, + // Additional system messages to control the output of the AI + { role: 'system', content: 'Do not include html\`\`\` at the start or \`\`\` at the end.' }, + { role: 'system', content: 'No explanation or boilerplate, just give the HTML response.' } + ]; + + // Forms the new query sent to the API + const content = request.context.length === 0 || conversation.length > 0 + ? request.query + : `Question: ${request.query} Context: """${request.context}"""`; + + const messages = [ + ...conversation, + ...systemMessages, + { role: 'user', content } + ]; + + const requestBody = { + model: 'gpt-3.5-turbo', + temperature: 0.7, + max_tokens: 800, + messages, + stream: true + }; + + const openAiOptions = { + signal, + method: 'POST', + headers: { + 'Content-Type': 'application/json', + 'Authorization': `Bearer ${api_key}` + }, + body: JSON.stringify(requestBody) + }; + + const onopen = async (response) => { + if (response) { + const contentType = response.headers.get('content-type'); + if (response.ok && contentType?.includes('text/event-stream')) { + return; + } else if (contentType?.includes('application/json')) { + const data = await response.json(); + if (data.error) { + throw new Error(`${data.error.type}: ${data.error.message}`); + } + } + } else { + throw new Error('Failed to communicate with the ChatGPT API'); + } + }; + + // This function passes each new message into the plugin via the `streamMessage` callback. + const onmessage = (ev) => { + const data = ev.data; + if (data !== '[DONE]') { + const parsedData = JSON.parse(data); + const firstChoice = parsedData?.choices[0]; + const message = firstChoice?.delta?.content; + if (message) { + streamMessage(message); + } + } + }; + + const onerror = (error) => { + // Stop operation and do not retry by the fetch-event-source + throw error; + }; + + // Use microsoft's fetch-event-source library to work around the 2000 character limit + // of the browser `EventSource` API, which requires query strings + return fetchApi + .then(fetchEventSource => + fetchEventSource('https://api.openai.com/v1/chat/completions', { + ...openAiOptions, + openWhenHidden: true, + onopen, + onmessage, + onerror + }) + ) + .then(async (response) => { + if (response && !response.ok) { + const data = await response.json(); + if (data.error) { + throw new Error(`${data.error.type}: ${data.error.message}`); + } + } + }) + .catch(onerror); +}); + +tinymce.init({ + selector: 'textarea', // change this value according to your HTML + plugins: "ai advlist anchor autolink charmap advcode emoticons fullscreen help image link lists media preview searchreplace table", + toolbar: "undo redo | aidialog aishortcuts | styles fontsizeinput | bold italic | align bullist numlist | table link image | code", + height: 650, + ai_request +}); \ No newline at end of file diff --git a/modules/ROOT/examples/live-demos/ai/index.html b/modules/ROOT/examples/live-demos/ai/index.html new file mode 100644 index 0000000000..8302adecc4 --- /dev/null +++ b/modules/ROOT/examples/live-demos/ai/index.html @@ -0,0 +1,13 @@ + diff --git a/modules/ROOT/examples/live-demos/ai/index.js b/modules/ROOT/examples/live-demos/ai/index.js new file mode 100644 index 0000000000..6902200db5 --- /dev/null +++ b/modules/ROOT/examples/live-demos/ai/index.js @@ -0,0 +1,121 @@ +const fetchApi = import("https://unpkg.com/@microsoft/fetch-event-source@2.0.1/lib/esm/index.js").then(module => module.fetchEventSource); + +const ai_request = (request, respondWith) => respondWith.stream(async (signal, streamMessage) => { + // Adds each previous query and response as individual messages + const conversation = request.thread.flatMap((event) => { + if (event.response) { + return [ + { role: 'user', content: event.request.query }, + { role: 'assistant', content: event.response.data } + ]; + } else { + return []; + } + }); + + // System messages provided by the plugin to format the output as HTML content. + const pluginSystemMessages = request.system.map((content) => ({ + role: 'system', + content + })); + + const systemMessages = [ + ...pluginSystemMessages, + // Additional system messages to control the output of the AI + { role: 'system', content: 'Do not include html\`\`\` at the start or \`\`\` at the end.' }, + { role: 'system', content: 'No explanation or boilerplate, just give the HTML response.' } + ]; + + // Forms the new query sent to the API + const content = request.context.length === 0 || conversation.length > 0 + ? request.query + : `Question: ${request.query} Context: """${request.context}"""`; + + const messages = [ + ...conversation, + ...systemMessages, + { role: 'user', content } + ]; + + const requestBody = { + model: 'gpt-3.5-turbo', + temperature: 0.7, + max_tokens: 800, + messages, + stream: true + }; + + const openAiOptions = { + signal, + method: 'POST', + headers: { + 'Content-Type': 'application/json', + 'Authorization': `Bearer {{ openai_proxy_token }}` + }, + body: JSON.stringify(requestBody) + }; + + const onopen = async (response) => { + if (response) { + const contentType = response.headers.get('content-type'); + if (response.ok && contentType?.includes('text/event-stream')) { + return; + } else if (contentType?.includes('application/json')) { + const data = await response.json(); + if (data.error) { + throw new Error(`${data.error.type}: ${data.error.message}`); + } + } + } else { + throw new Error('Failed to communicate with the ChatGPT API'); + } + }; + + // This function passes each new message into the plugin via the `streamMessage` callback. + const onmessage = (ev) => { + const data = ev.data; + if (data !== '[DONE]') { + const parsedData = JSON.parse(data); + const firstChoice = parsedData?.choices[0]; + const message = firstChoice?.delta?.content; + if (message) { + streamMessage(message); + } + } + }; + + const onerror = (error) => { + // Stop operation and do not retry by the fetch-event-source + throw error; + }; + + // Use microsoft's fetch-event-source library to work around the 2000 character limit + // of the browser `EventSource` API, which requires query strings + return fetchApi + .then(fetchEventSource => + fetchEventSource("{{ openai_proxy_url }}", { + ...openAiOptions, + openWhenHidden: true, + onopen, + onmessage, + onerror + }) + ) + .then(async (response) => { + if (response && !response.ok) { + const data = await response.json(); + if (data.error) { + throw new Error(`${data.error.type}: ${data.error.message}`); + } + } + }) + .catch(onerror); +}); + +tinymce.init({ + selector: 'textarea', + plugins: "ai advlist anchor autolink charmap advcode emoticons fullscreen help image link lists media preview searchreplace table", + toolbar: "undo redo | aidialog aishortcuts | styles fontsizeinput | bold italic | align bullist numlist | table link image | code", + height: 650, + ai_request +}); \ No newline at end of file diff --git a/modules/ROOT/examples/live-demos/full-featured/example.js b/modules/ROOT/examples/live-demos/full-featured/example.js index 937f239e70..43f1319035 100644 --- a/modules/ROOT/examples/live-demos/full-featured/example.js +++ b/modules/ROOT/examples/live-demos/full-featured/example.js @@ -3,13 +3,13 @@ const isSmallScreen = window.matchMedia('(max-width: 1023.5px)').matches; tinymce.init({ selector: 'textarea#full-featured', - plugins: 'preview powerpaste casechange importcss tinydrive searchreplace autolink autosave save directionality advcode visualblocks visualchars fullscreen image link media mediaembed codesample table charmap pagebreak nonbreaking anchor tableofcontents insertdatetime advlist lists checklist wordcount tinymcespellchecker a11ychecker editimage help formatpainter permanentpen pageembed charmap tinycomments mentions quickbars linkchecker emoticons advtable footnotes mergetags autocorrect typography advtemplate markdown revisionhistory', + plugins: 'preview powerpaste casechange importcss tinydrive searchreplace autolink autosave save directionality advcode visualblocks visualchars fullscreen image link math media mediaembed codesample table charmap pagebreak nonbreaking anchor tableofcontents insertdatetime advlist lists checklist wordcount tinymcespellchecker a11ychecker editimage help formatpainter permanentpen pageembed charmap tinycomments mentions quickbars linkchecker emoticons advtable footnotes mergetags autocorrect typography advtemplate markdown revisionhistory', tinydrive_token_provider: 'URL_TO_YOUR_TOKEN_PROVIDER', tinydrive_dropbox_app_key: 'YOUR_DROPBOX_APP_KEY', tinydrive_google_drive_key: 'YOUR_GOOGLE_DRIVE_KEY', tinydrive_google_drive_client_id: 'YOUR_GOOGLE_DRIVE_CLIENT_ID', mobile: { - plugins: 'preview powerpaste casechange importcss tinydrive searchreplace autolink autosave save directionality advcode visualblocks visualchars fullscreen image link media mediaembed codesample table charmap pagebreak nonbreaking anchor tableofcontents insertdatetime advlist lists checklist wordcount tinymcespellchecker a11ychecker help formatpainter pageembed charmap mentions quickbars linkchecker emoticons advtable footnotes mergetags autocorrect typography advtemplate', + plugins: 'preview powerpaste casechange importcss tinydrive searchreplace autolink autosave save directionality advcode visualblocks visualchars fullscreen image link math media mediaembed codesample table charmap pagebreak nonbreaking anchor tableofcontents insertdatetime advlist lists checklist wordcount tinymcespellchecker a11ychecker help formatpainter pageembed charmap mentions quickbars linkchecker emoticons advtable footnotes mergetags autocorrect typography advtemplate', }, menu: { tc: { @@ -18,7 +18,7 @@ tinymce.init({ } }, menubar: 'file edit view insert format tools table tc help', - toolbar: "undo redo | revisionhistory | aidialog aishortcuts | blocks fontsizeinput | bold italic | align numlist bullist | link image | table media pageembed | lineheight outdent indent | strikethrough forecolor backcolor formatpainter removeformat | charmap emoticons checklist | code fullscreen preview | save print | pagebreak anchor codesample footnotes mergetags | addtemplate inserttemplate | addcomment showcomments | ltr rtl casechange | spellcheckdialog a11ycheck", // Note: if a toolbar item requires a plugin, the item will not present in the toolbar if the plugin is not also loaded. + toolbar: "undo redo | revisionhistory | aidialog aishortcuts | blocks fontsizeinput | bold italic | align numlist bullist | link image | table math media pageembed | lineheight outdent indent | strikethrough forecolor backcolor formatpainter removeformat | charmap emoticons checklist | code fullscreen preview | save print | pagebreak anchor codesample footnotes mergetags | addtemplate inserttemplate | addcomment showcomments | ltr rtl casechange | spellcheckdialog a11ycheck", // Note: if a toolbar item requires a plugin, the item will not present in the toolbar if the plugin is not also loaded. autosave_ask_before_unload: true, autosave_interval: '30s', autosave_prefix: '{path}{query}-{id}-', diff --git a/modules/ROOT/examples/live-demos/full-featured/index.js b/modules/ROOT/examples/live-demos/full-featured/index.js index c61b6a307a..6a378a119b 100644 --- a/modules/ROOT/examples/live-demos/full-featured/index.js +++ b/modules/ROOT/examples/live-demos/full-featured/index.js @@ -270,7 +270,7 @@ tinymce.ScriptLoader.loadScripts(['https://cdn.jsdelivr.net/npm/faker@5/dist/fak tinymce.init({ selector: 'textarea#full-featured', - plugins: 'preview powerpaste casechange importcss tinydrive searchreplace autolink autosave save directionality advcode visualblocks visualchars fullscreen image link media mediaembed codesample table charmap pagebreak nonbreaking anchor tableofcontents insertdatetime advlist lists checklist wordcount tinymcespellchecker a11ychecker editimage help formatpainter permanentpen pageembed charmap tinycomments mentions quickbars linkchecker emoticons advtable footnotes mergetags autocorrect typography advtemplate markdown revisionhistory', + plugins: 'preview powerpaste casechange importcss tinydrive searchreplace autolink autosave save directionality advcode visualblocks visualchars fullscreen image link math media mediaembed codesample table charmap pagebreak nonbreaking anchor tableofcontents insertdatetime advlist lists checklist wordcount tinymcespellchecker a11ychecker editimage help formatpainter permanentpen pageembed charmap tinycomments mentions quickbars linkchecker emoticons advtable footnotes mergetags autocorrect typography advtemplate markdown revisionhistory', editimage_cors_hosts: ['picsum.photos'], tinydrive_token_provider: (success, failure) => { success({ token: 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJqb2huZG9lIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.Ks_BdfH4CWilyzLNk8S2gDARFhuxIauLa8PwhdEQhEo' }); @@ -280,7 +280,7 @@ tinymce.ScriptLoader.loadScripts(['https://cdn.jsdelivr.net/npm/faker@5/dist/fak tinydrive_google_drive_key: 'AIzaSyAsVRuCBc-BLQ1xNKtnLHB3AeoK-xmOrTc', tinydrive_google_drive_client_id: '748627179519-p9vv3va1mppc66fikai92b3ru73mpukf.apps.googleusercontent.com', mobile: { - plugins: 'preview powerpaste casechange importcss tinydrive searchreplace autolink autosave save directionality advcode visualblocks visualchars fullscreen image link media mediaembed codesample table charmap pagebreak nonbreaking anchor tableofcontents insertdatetime advlist lists checklist wordcount tinymcespellchecker a11ychecker help formatpainter pageembed charmap mentions quickbars linkchecker emoticons advtable footnotes mergetags autocorrect typography advtemplate', + plugins: 'preview powerpaste casechange importcss tinydrive searchreplace autolink autosave save directionality advcode visualblocks visualchars fullscreen image link math media mediaembed codesample table charmap pagebreak nonbreaking anchor tableofcontents insertdatetime advlist lists checklist wordcount tinymcespellchecker a11ychecker help formatpainter pageembed charmap mentions quickbars linkchecker emoticons advtable footnotes mergetags autocorrect typography advtemplate', }, menu: { tc: { @@ -289,7 +289,7 @@ tinymce.ScriptLoader.loadScripts(['https://cdn.jsdelivr.net/npm/faker@5/dist/fak } }, menubar: 'file edit view insert format tools table tc help', - toolbar: "undo redo | revisionhistory | aidialog aishortcuts | blocks fontsizeinput | bold italic | align numlist bullist | link image | table media pageembed | lineheight outdent indent | strikethrough forecolor backcolor formatpainter removeformat | charmap emoticons checklist | code fullscreen preview | save print | pagebreak anchor codesample footnotes mergetags | addtemplate inserttemplate | addcomment showcomments | ltr rtl casechange | spellcheckdialog a11ycheck", // Note: if a toolbar item requires a plugin, the item will not present in the toolbar if the plugin is not also loaded. + toolbar: "undo redo | revisionhistory | aidialog aishortcuts | blocks fontsizeinput | bold italic | align numlist bullist | link image | table math media pageembed | lineheight outdent indent | strikethrough forecolor backcolor formatpainter removeformat | charmap emoticons checklist | code fullscreen preview | save print | pagebreak anchor codesample footnotes mergetags | addtemplate inserttemplate | addcomment showcomments | ltr rtl casechange | spellcheckdialog a11ycheck", // Note: if a toolbar item requires a plugin, the item will not present in the toolbar if the plugin is not also loaded. autosave_ask_before_unload: true, autosave_interval: '30s', autosave_prefix: '{path}{query}-{id}-', diff --git a/modules/ROOT/examples/live-demos/math/index.html b/modules/ROOT/examples/live-demos/math/index.html new file mode 100644 index 0000000000..dbaa8cd99a --- /dev/null +++ b/modules/ROOT/examples/live-demos/math/index.html @@ -0,0 +1,9 @@ + \ No newline at end of file diff --git a/modules/ROOT/examples/live-demos/math/index.js b/modules/ROOT/examples/live-demos/math/index.js new file mode 100644 index 0000000000..26e2ef1132 --- /dev/null +++ b/modules/ROOT/examples/live-demos/math/index.js @@ -0,0 +1,9 @@ +tinymce.init({ + selector: "textarea#math_demo", + plugins: [ + "math", "advlist", "anchor", "autolink", "charmap", "code", "codesample", "fullscreen", + "help", "image", "insertdatetime", "link", "lists", "media", + "preview", "searchreplace", "table", "visualblocks", + ], + toolbar: "math | codesample | undo redo | styles | bold italic underline strikethrough | alignleft aligncenter alignright alignjustify | bullist numlist outdent indent | link image", +}); \ No newline at end of file diff --git a/modules/ROOT/images/ai-plugin/ai-icon.svg b/modules/ROOT/images/ai-plugin/ai-icon.svg new file mode 100644 index 0000000000..00d8df3ec3 --- /dev/null +++ b/modules/ROOT/images/ai-plugin/ai-icon.svg @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/modules/ROOT/images/ai-plugin/wand-icon.svg b/modules/ROOT/images/ai-plugin/wand-icon.svg new file mode 100644 index 0000000000..c0de6b4b35 --- /dev/null +++ b/modules/ROOT/images/ai-plugin/wand-icon.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/modules/ROOT/images/icons/math-equation.svg b/modules/ROOT/images/icons/math-equation.svg new file mode 100644 index 0000000000..eed6685658 --- /dev/null +++ b/modules/ROOT/images/icons/math-equation.svg @@ -0,0 +1,3 @@ + + + diff --git a/modules/ROOT/nav.adoc b/modules/ROOT/nav.adoc index d5b385b027..7fa2a574b2 100644 --- a/modules/ROOT/nav.adoc +++ b/modules/ROOT/nav.adoc @@ -290,6 +290,10 @@ *** xref:a11ychecker.adoc[Accessibility Checker] *** xref:advanced-typography.adoc[Advanced Typography] *** xref:ai.adoc[AI Assistant] +**** xref:ai-openai.adoc[OpenAI ChatGPT integration guide] +**** xref:ai-azure.adoc[Azure AI integration guide] +**** xref:ai-bedrock.adoc[Amazon Bedrock integration guide] +**** xref:ai-gemini.adoc[Google Gemini integration guide] **** xref:ai-proxy.adoc[AI proxy server reference guide] *** xref:casechange.adoc[Case Change] *** xref:checklist.adoc[Checklist] @@ -314,6 +318,7 @@ *** xref:editimage.adoc[Image Editing] *** xref:inline-css.adoc[Inline CSS] *** xref:linkchecker.adoc[Link Checker] +*** xref:math.adoc[Math] *** xref:markdown.adoc[Markdown] *** xref:mentions.adoc[Mentions] *** xref:mergetags.adoc[Merge Tags] @@ -400,6 +405,14 @@ ** xref:tinymce-and-cors.adoc[Cross-Origin Resource Sharing (CORS)] * Release information ** xref:release-notes.adoc[Release notes for {productname} {productmajorversion}] +*** {productname} 7.1 +**** xref:7.1-release-notes.adoc#overview[Overview] +**** * xref:7.1-release-notes.adoc#accompanying-premium-self-hosted-server-side-component-changes[Accompanying Premium self-hosted server-side component changes] +**** * xref:7.1-release-notes.adoc#new-premium-plugin[New Premium plugin] +**** xref:7.1-release-notes.adoc#accompanying-premium-plugin-changes[Accompanying Premium plugin changes] +**** xref:7.1-release-notes.adoc#improvements[Improvements] +**** xref:7.1-release-notes.adoc#bug-fixes[Bug fixes] +**** xref:7.1-release-notes.adoc#security-fixes[Security fixes] *** {productname} 7.0.1 **** xref:7.0.1-release-notes.adoc#overview[Overview] **** xref:7.0.1-release-notes.adoc#accompanying-premium-plugin-changes[Accompanying Premium Plugin changes] @@ -421,4 +434,4 @@ * xref:invalid-api-key.adoc[Invalid API key] * xref:license-key.adoc[License key] * xref:support.adoc[Support] -* xref:usage-based-billing.adoc[Usage-Based Billing] \ No newline at end of file +* xref:usage-based-billing.adoc[Usage-Based Billing] diff --git a/modules/ROOT/pages/7.1-release-notes.adoc b/modules/ROOT/pages/7.1-release-notes.adoc new file mode 100644 index 0000000000..8233fd6121 --- /dev/null +++ b/modules/ROOT/pages/7.1-release-notes.adoc @@ -0,0 +1,395 @@ += {productname} {release-version} +:release-version: 7.1 +:navtitle: {productname} {release-version} +:description: Release notes for {productname} {release-version} +:keywords: releasenotes, new, changes, bugfixes +:page-toclevels: 1 + +include::partial$misc/admon-releasenotes-for-stable.adoc[] + +[[overview]] +== Overview + +{productname} {release-version} was released for {enterpriseversion} and {cloudname} on Wednesday, May 08^th^, 2024. + +These release notes provide an overview of the changes for {productname} {release-version}, including: + +* xref:accompanying-premium-self-hosted-server-side-component-changes[Accompanying Premium self-hosted server-side component changes] +* xref:new-premium-plugin[New Premium plugin] +* xref:accompanying-premium-plugin-changes[Accompanying Premium plugin changes] +* xref:improvements[Improvements] +* xref:bug-fixes[Bug fixes] +* xref:security-fixes[Security fixes] + + +[[accompanying-premium-self-hosted-server-side-component-changes]] +== Accompanying Premium self-hosted server-side component changes + +The {productname} {release-version} release includes accompanying changes affecting the {productname} **self-hosted** services for the following plugins: + +* **Enhanced Media Embed** plugin `mediaembed`. +* **Image Editing** plugin `editimage`. +* **Link Checker** plugin `linkchecker`. +* **Spell Checker** plugin `tinymcespellchecker`. +* **Spelling Autocorrect** plugin `autocorrect`. + +For information on: + +* The **Enhanced Media Embed** plugin, see: xref:introduction-to-mediaembed.adoc[Enhanced Media Embed plugin]. +* The **Image Editing** plugin, see: xref:editimage.adoc[Image Editing plugin]. +* The **Link Checker** plugin, see: xref:linkchecker.adoc[Link Checker plugin]. +* The **Spell Checker** plugin, see: xref:introduction-to-tiny-spellchecker.adoc[Spell Checkerplugin]. +* The **Spelling Autocorrect** plugin, see: xref:autocorrect.adoc[Spelling Autocorrect plugin]. +* Deploying the **server-side** components, see: xref:introduction-to-premium-selfhosted-services.adoc[Server-side component installation]. + +The Java server-side components have been updated to the following versions: + +* `ephox-hyperlinking.war`: 2.105.25 +* `ephox-image-proxy.war`: 2.106.12 +* `ephox-spelling.war`: 2.118.21 + + +=== Updating the self-hosted server-side components + +The new versions of the server-side services provide updates for the Java-based server-side components. To deploy the updated version of the server-side components: + +. Update your Java Application Server to the minimum required version: + +include::partial$misc/supported-application-servers.adoc[] + +. Replace the existing server-side `.war` files with the `.war` files bundled with {productname} {release-version} or later. + +For information on: + +* Deploying the server-side components, see: xref:introduction-to-premium-selfhosted-services.adoc[Server-side component installation]. +* Deploying the server-side components using Docker, see: xref:bundle-intro-setup.adoc[Containerized service deployments]. + +include::partial$misc/admon-no-functionality-changes-in-updated-server-side-components.adoc[] + +[[new-premium-plugin]] +== New Premium plugin + +The following new Premium plugin was released alongside {productname} 7.1. + +[[math]] +=== Math + +The new Premium plugin, **Math**, provides a way for users to insert complex formulas. + +For information on the **Math** plugin, see: xref:math.adoc[Math]. + +[[accompanying-premium-plugin-changes]] +== Accompanying Premium plugin changes + +The following premium plugin updates were released alongside {productname} {release-version}. + +=== Mentions + +The {productname} {release-version} release includes an accompanying release of the **Mentions** premium plugin. + +This **Mentions** release includes the following fix. + +==== Inline editor no longer grabs focus when it has a mention in it. +// #TINY-10725 + +Previously in **Mentions**, when using an inline editor where the initial content included a mention, the editor automatically grabbed input focus. This unexpected behavior occurred due to the adjustment of the selection range upon initialization. + +{productname} {release-version} resolves this issue, now, the selection range is only adjusted if the editor has focus. As a result, the inline editor no longer grabs focus on initialization when it has a mention in it. + +For information on the **Mentions** plugin, see: xref:mentions.adoc[Mentions]. + +=== Enhanced Code Editor + +The {productname} {release-version} release includes an accompanying release of the **Enhanced Code Editor** premium plugin. + +The **Enhanced Code Editor** includes the following fix: + +==== Inline mode didn't have tab navigation. +// #TINY-10780 + +Previously in {productname} 7.0, the **Enhanced Code Editor** was updated to codemirror 6, but the tab navigation was not implemented for the code editor view when `advcode_inline` was set. As a result, users who rely on keyboard navigation found it difficult to navigate the UI elements in the code editor view. + +In {productname} {release-version}, this issue has been fixed. Now, the tab navigation is implemented for the code editor view when `advcode_inline` is set. As a result, the code editor view UI elements can be navigated using the `tab` and `shift+tab` keys. + +For information on the **Enhanced Code Editor** plugin, see: xref:advcode.adoc[Enhanced Code Editor]. + +=== Accessibility Checker + +The {productname} {release-version} release includes an accompanying release of the **Accessibility Checker** premium plugin. + +**Accessibility Checker** includes the following improvement. + +==== Added new `A11ycheckStart`, `A11ycheckStop`, `A11ycheckIgnore`, `A11ycheckRepair` and `A11ycheckShowDetails` events. +// #TINY-10777 + +{productname} {release-version} introduces five new events within the **Accessibility Checker** premium plugin. These events capture usage statistics, offering valuable insights into the tool's internal usage for customers. + +The events include: + +[cols="1,2",options="header"] +|=== +|Name |Description +|A11ycheckStart |Fired when the Accessibility Checker is `opened` +|A11ycheckStop |Fired when the Accessibility Checker is `closed` +|A11ycheckIgnore |Fired when the `Ignore` button is pressed +|A11ycheckRepair |Fired when the `Repair` button is pressed +|A11ycheckShowDetails |Fired when the `Click for more info` button is pressed +|=== + +For information on the **Accessibility Checker** plugin, see: xref:a11ychecker.adoc[Accessibility Checker]. + +For information on handling events in {productname}, see: xref:events.adoc[Events]. + +=== Revision History + +The {productname} {release-version} release includes an accompanying release of the **Revision History** premium plugin. + +**Revision History** includes the following improvement. + +{productname} {release-version} introduces a new xref:revisionhistory.adoc#diff[diff] API from the **Revision History** plugin. This API allows the the user to compare two HTML strings. It does this by marking changes with annotations, so you can easily identify what's been added, removed, or changed. + +For information on the **Revision History** plugin, see: xref:revisionhistory.adoc[Revision History]. + + +[[improvements]] +== Improvements + +{productname} {release-version} also includes the following improvements: + +=== Included itemprop, itemscope, itemtype as valid HTML5 attributes in the core schema. +// #TINY-9932 + +Previously, using `itemprop`, `itemscope` and `itemtype` as valid HTML5 attributes within the editor was not supported. + +As a consequence, users faced difficulties in effectively working with content that used these attributes resulting in compatibility issues or data misrepresentation. + +{productname} {release-version} addresses this issue, now, the missed attributes have been added to the HTML5 schema, ensuring that users can now use content containing these attributes such as; + +[source, html] +---- +
+

Avatar

+ Director: James Cameron (born August 16, 1954) Science fiction Trailer +
+---- + +As a result, `itemprop`, `itemscope` and `itemtype` are now considered valid HTML5 attributes within {productname}. + +=== Notification accessibility improvements: added tooltips, keyboard navigation and shortcut to focus on notifications. + +In previous versions of {productname}, an accessibility issue was identified that affected keyboard-only, specifically when a user receives a notification and they where unable to close it using the keyboard. + +As a consequence, users who rely on keyboard navigation or screen readers could only close the notifications via mouse "Click". + +{productname} {release-version} addressed this issue with the following changes: + +* Keyboard Shortcut: keyboard shortcut *Alt+F12* (or *⌥+F12*) was added, that allows users to now focus on notifications, providing a way for keyboard-only users to access and interact with them. +* Keyboard Navigation: allows keyboard navigation within the focusable elements in a notification, such as links and buttons, with *Tab* or *Shift+Tab*. +* Tooltip: added a tooltip to the `close` button of the notification, providing additional context for users who may need it. +* Link Styles: improved the styles of links within notifications, including `hover`, `focus`, `active`, and `focus-visible` states, to ensure that they are easily distinguishable and navigable. +* Screen Reader Announcement: content of a notification is announced by screen readers, making it easier for visually impaired users to access and understand the information. + +As a result of these changes notifications now more accessible for all users. + +=== New `index.js` file that includes all plugin resources. +// #TINY-10778 + +Previously, integrating {productname} and its premium plugins necessitated the separate inclusion of the `plugin.js` file along with the corresponding resource API-loaded CSS files. This approach often led to complications due to inconsistent naming conventions for our CSS files, making bundling a cumbersome process. + +To address this, {productname} {release-version} has included `index.js` files to each premium plugin, which will consolidate all necessary resources. + +As a result, when bundling from a distribution bundle or `.zip` build, by including all the {productname} imports for each plugin such as in a `all.js` file for example; + +[source, js] +---- +import './plugins/a11ychecker'; +import './plugins/advcode'; +import './plugins/advtable'; +import './plugins/advtemplate'; +---- +all the specific plugins will load without the need of any additional resources. + +For more information on bundling with {productname}, see xref:bundling-plugins.adoc[bundling plugins] + + +[[bug-fixes]] +== Bug fixes + +{productname} {release-version} also includes the following bug fixes: + +=== Fixed accessibility issue by removing duplicate `role="menu"` attribute from color swatches. +// #TINY-10806 + +The color swatch menu item, which is accessible via **Format** > **Text color** menu, previously contained nested block elements with the same ARIA role ('menu') in its HTML structure, which violated ARIA standards. + +{productname} {release-version} addresses this issue, by removing the duplicated role attribute, ensuring that the structure now aligns with ARIA guidelines and enhances usability for all users. + +=== Custom block elements with colon characters would throw errors. +// #TINY-10813 + +Previously, when `custom_elements` contained special characters such as colons, and these elements included a nested anchor element, an error would be thrown in the dev-console as the corresponding CSS selector was invalid due to the unescaped colon character. + +{productname} {release-version} addresses this issue, now, the CSS selector properly escapes special characters like colons, ensuring its validity. + +As a result, the error in the console is no longer displayed. + +=== Styles were not retained when toggling a list on and off. +// #TINY-10837 + +Previously, toggling a list into a paragraph that had a specific alignment style, did not retain the alignment state when the list was converted to the paragraph. + +{productname} {release-version} addresses this issue, by ensuring that the style attribute of the list item being transformed into a paragraph is carried over to the new paragraph. + +As a result, style attributes are now properly applied to the new paragraph after conversion when toggling lists. + +=== Improved the responsiveness of the custom view on small screens +// #TINY-10741 + +Previously, when opening a custom view on small screens or mobile devices, like the Revision History view, some header buttons and UI components were not completely visible, and in some cases, they were not accessible. For example, users might not have been able to close the view because the Close button was obscured on smaller screens. + +{productname} {release-version} addresses this issue by improving the layout's responsiveness to maximize usability. + +As a result, header buttons and UI components are more accessible and visible on small screens and mobile devices, ensuring that users can interact with the custom view without issues. + +For more information, see the xref:custom-view.adoc[Custom views] documentation. + +=== Video and audio elements could not be played on Safari. +// #TINY-10774 + +In earlier versions of {productname}, a problem occurred when users inserted a video or media element into a {productname} document while using Safari as the host browser. The issue caused media files to be unplayable in Safari. + +{productname} {release-version} resolves this problem by preventing events from propagating outside of the video element, which previously caused the playback issue. + +With this fix, users can now play video and audio elements on Safari without any issues. + +=== Open link context menu action did not work with selection surrounding a link. + +In earlier versions of {productname}, the `Open link` context menu action did not work when a link was part of a larger text selection. This meant that selecting a text block containing a link and then choosing `Open link` from the context menu would not result in any action. + +With {productname} {release-version}, this issue has been addressed. Now, when you select a block of text that includes a link and choose `Open link` from the context menu, the link will open in a new tab as expected. + +=== Open link context menu action was not enabled when an image with a link was selected. + +In previous versions of {productname}, the "Open link" context menu action wasn't available for links embedded in images. This limitation prevented users from using the context menu to open links directly from images, disrupting the usual workflow. + +With {productname} {release-version}, this issue has been resolved. The "Open link" context menu action is now enabled for links on images, allowing users to easily open them with a right-click. + +=== Improved support for Windows High Contrast themes in {productname}. +// #TINY-9810 / #TINY-9811 / #TINY-9873 / #TINY-10781 / #TINY-10782 + +Previously, in Windows High Contrast Mode, the colors of various elements in {productname}, such as toolbar icons, toolbar border, icon hover, focus, and active stage, were not correctly configured. This resulted in low to no color/contrast for the editor elements, leading to a poor user experience. + +In this fix, the following elements have been given the correct configuration to be visible and display high contrast when Windows High Contrast mode is enabled: + +* Checkbox border +* Dialog items +* Dropdown items +* Editor textarea border +* Floating toolbar outline +* Buttons and dropdown items (hover, focus, active state) +* Keyboard focus highlight +* Status bar items +* Toolbar border +* Toolbar icon +* Toolbar number input +* Tooltip +* Table picker UI + +The following item has been disabled when Windows High Contrast mode is enabled: + +* Table context menu arrow (cosmetic change only) + +The following items now maintain their color when Windows High Contrast mode is enabled: + +* Color picker, hue slider, RGBA preview, color swatch + +Additionally, the fix addresses the issue where the black background added to the placeholder text in Windows High Contrast mode was blocking the caret. The fix includes applying a `z-index` to the placeholder to unblock the caret and adding a specific color to the placeholder text when high contrast mode is enabled. This ensures that both the caret and placeholder text are now visible. + +These changes improve the user experience in {productname} by making UI elements, icons, texts, and user actions clearly visible in Windows High Contrast mode. + +=== Firefox not announcing the iframe title when `iframe_aria_text` was set. +// #TINY-10718 + +Previously, there was inconsistencies across browsers in announcing the `aria-label` for the editor body when the host browser was Firefox. + +As a consequence, the `aria-label` of the editor body was not announced. It was intended to be conveyed by the `iframe_aria_text` option but in this case, it was not being announced in Firefox, while Chrome and Safari functioned correctly. + +{productname} {release-version} addresses this issue. Now, the `iframe_aria_text` option is set to the **title** of the iframe specifically in Firefox, to ensure screen readers announce the option across all browsers. + +As a result, when navigating into the editor, screen readers in all supported browsers will now announce the correct label for the editor body. + +=== `ToggleToolbarDrawer` command did not toggle the toolbar in `sliding` mode when `+{skipFocus: true}+` parameter was passed. +// #TINY-10726 + +In link:https://www.tiny.cloud/docs/tinymce/6/6.4.1-release-notes/#added-skip_focus-check-to-the-toggletoolbardrawer-command[{productname} 6.4.1], a boolean `skipFocus` parameter for the `ToggleToolbarDrawer` command was introduced. This parameter manages whether the focus should be set on the overflow toolbar after it is toggled. However, a bug was identified with the `ToggleToolbarDrawer` command when used with `+{skipFocus: true}+`, specifically as `+editor.execCommand('ToggleToolbarDrawer', false, { skipFocus: true })+`. + +As a result, the bug caused the command to behave inconsistently based on the toolbar mode: + +* In `toolbar_mode: floating`, the command correctly preserved focus. +* In `toolbar_mode: sliding`, the command did not toggle the toolbar drawer at all. + +{productname} {release-version} addresses this issue. Now, when using the `ToggleToolbarDrawer` command with the `+{ skipFocus: true }+` argument in both `toolbar_mode: floating` and `toolbar_mode: sliding`, the command will toggle the toolbar drawer as expected while preserving focus. + +=== Dialog title was not announced in macOS VoiceOver, dialogs now use `aria-label` instead of `aria-labelledby` on macOS. +// #TINY-10808 + +In previous versions of {productname}, an issue was identified where **VoiceOver** was not announcing the dialog title when using the `+aria-labelledby+` attribute. + +As a consequence, without announcing the dialog title, users who rely on screen readers would not be informed about the purpose of the dialog. + +{productname} {release-version} addresses this issue. Now, {companyname}'s approach to announcing dialog titles is by switching from using `+aria-labelledby+` to using `+aria-label+` directly on the dialog title element itself. + +As a result, the `+aria-label+` attribute, **VoiceOver** will now announce the dialog title as expected. + +=== Notification width was not constrained to the width of the editor. +// #TINY-10886 + +Previously, when opening a notification containing a large amount of text or when one was displayed by the editor, the notification was not constrained to the width of the editor. + +As a consequence, the notification popup would exceed the fixed width of the editor window. + +In {productname} {release-version}, this issue is resolved by ensuring that notifications do not exceed the width of the editor. + +=== Dialog title markup changed to use an `h1` element instead of `div`. +// #TINY-10800 + +Previously, the dialog component's title was wrapped in a `
` element, visually appearing as a heading and functioning as the main heading for the dialog. However, without the title being semantically marked up as a heading element, screen reader users may struggle to understand the purpose of the dialog box and navigate its content. + +{productname} {release-version} addresses this issue by updating the dialog title markup to use an `

` element, ensuring that the title is semantically identified as a heading. This improves the accessibility experience for users by helping screen readers and other assistive technologies understand the structure of the page and navigate its content more easily. + +=== Removed `aria-pressed` from the `More` button in sliding toolbar mode and replaced it with `aria-expanded` +// #TINY-10795 + +Previously, an issue was identified with the toolbar overflow button **More** button specifically in `+toolbar_mode: 'sliding'+` mode. The button uses the aria-pressed attribute, which is not appropriate for this scenario. + +As a consequence, the aria-pressed attribute was set incorrectly, which prevented screen readers from announcing whether the additional toolbar was in either a expanded or collapsed state. + +{productname} {release-version} addresses this issue. Now, the `aria-pressed` attribute has been replaced with `aria-expanded` attribute. This attribute will be set to `+true+` when the overflow content is visible and `+false+` when it's hidden. + +As a result, screen readers will now announce the expanded/collapsed state of the overflow toolbar correctly. + +[NOTE] +This fix only applies to toolbars configured with `+toolbar_mode: 'sliding'+`. + +=== Fullscreen mode now prevents focus from leaving the editor. +// #TINY-10597 + +Previously, when using the editor in full screen with the xref:fullscreen.adoc[Full Screen] plugin active, users were still able to tab out of the editor window and access content behind it. This created an accessibility issue for keyboard-only users as the editor window could lose focus unintentionally, shifting it to elements outside the editor. Since these elements are hidden in fullscreen mode, keyboard users might have struggled to navigate back to the editor. + +In {productname} {release-version}, the Full Screen plugin has been modified to prevent users from tabbing out of the editor window while in full screen mode. Users are now confined to the editor window while in full screen mode, ensuring focus remains on the editor content and preventing accidental navigation away from the editing area. + +[[security-fixes]] +== Security fixes + + +{productname} {release-version} includes one fix for the following security issue: + +The following server-side component has been updated to include dependency updates addressing the following security issues. + +* https://nvd.nist.gov/vuln/detail/CVE-2024-29025[CVE-2024-29025] + +This update is considered as a **Medium** severity vulnerability fix. + +For information on the server-side components updates, see: xref:#accompanying-premium-self-hosted-server-side-component-changes[Accompanying Premium self-hosted server-side component changes]. + +include::partial$misc/admon-no-functionality-changes-in-updated-server-side-components.adoc[] \ No newline at end of file diff --git a/modules/ROOT/pages/a11ychecker.adoc b/modules/ROOT/pages/a11ychecker.adoc index fe432375a6..219fa00904 100644 --- a/modules/ROOT/pages/a11ychecker.adoc +++ b/modules/ROOT/pages/a11ychecker.adoc @@ -360,6 +360,13 @@ include::partial$misc/plugin-toolbar-button-id-boilerplate.adoc[] include::partial$misc/plugin-menu-item-id-boilerplate.adoc[] +[[events]] +== Events + +The {pluginname} plugin provides the following events. + +include::partial$events/a11ychecker-events.adoc[] + == APIs The {pluginname} plugin provides the following APIs. diff --git a/modules/ROOT/pages/ai-azure.adoc b/modules/ROOT/pages/ai-azure.adoc new file mode 100644 index 0000000000..4e61773d94 --- /dev/null +++ b/modules/ROOT/pages/ai-azure.adoc @@ -0,0 +1,206 @@ += Azure AI integration guide +:pluginname: AI Assistant +:plugincode: ai +:plugincategory: premium +:navtitle: Azure AI integration guide +:description_short: {pluginname} with Azure OpenAI Service +:description: A guide for integrating {pluginname} plugin using Azure OpenAI Service. +:keywords: example, demo, custom, plugin, ai, assistant, guide, azure, openai, service + +include::partial$misc/admon-ai-pricing.adoc[] + +== Introduction + +This guide provides instructions for integrating the {pluginname} plugin using the https://learn.microsoft.com/en-us/azure/ai-services/openai/[Azure OpenAI Service] in {productname}. + +Azure OpenAI Service provides REST API access to OpenAI's language models with Azure specific features such as private networking, regional availability, and responsible AI content filtering. + +To learn more about the difference between string and streaming responses, see the xref:ai.adoc#the-respondwith-object[`respondWith` object] on the plugin page. + +== Prerequisites + +Before beginning, make sure an OpenAI model has been set up in Azure. The model's endpoint URL and API key are required for integration. For more information, see the https://learn.microsoft.com/en-us/azure/ai-services/openai/chatgpt-quickstart?tabs=command-line%2Cpython-new&pivots=rest-api[Quick Start Guide^] provided by Azure. + +include::partial$misc/admon-ai-proxy.adoc[] + +== String response + +This example demonstrates how to integrate the {pluginname} plugin with the https://learn.microsoft.com/en-us/azure/ai-services/openai/reference#chat-completions[Azure OpenAI Service Chat completions API] to generate a string response. + +[source,js] +---- +// This example stores the API key in the client side integration. This is not recommended for any purpose. +// Instead, an alternate method for retrieving the API key should be used. +const AZURE_OPENAI_API_KEY = ''; +const AZURE_OPENAI_ENDPOINT = ''; // e.g. https://.openai.azure.com/openai/deployments//chat/completions?api-version= + +const ai_request = (request, respondWith) => { + const azureOpenAiOptions = { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + 'api-key': AZURE_OPENAI_API_KEY + }, + body: JSON.stringify({ + temperature: 0.7, + max_tokens: 800, + messages: [{ role: 'user', content: request.prompt }], + }) + }; + respondWith.string((signal) => window.fetch(AZURE_OPENAI_ENDPOINT, { signal, ...azureOpenAiOptions }) + .then(async (response) => { + if (response) { + const data = await response.json(); + if (data.error) { + throw new Error(`${data.error.type}: ${data.error.message}`); + } else if (response.ok) { + // Extract the response content from the data returned by the API + return data?.choices[0]?.message?.content?.trim(); + } + } else { + throw new Error('Failed to communicate with the Azure OpenAI API'); + } + }) + ); +}; + +tinymce.init({ + selector: 'textarea', // change this value according to your HTML + plugins: 'ai', + toolbar: 'aidialog aishortcuts', + ai_request +}); +---- + +== Streaming response + +This example demonstrates how to integrate the {pluginname} plugin with the https://learn.microsoft.com/en-us/azure/ai-services/openai/reference#chat-completions[Azure OpenAI Service Chat completions API] to generate streaming responses. + +[source,js] +---- +const fetchApi = import("https://unpkg.com/@microsoft/fetch-event-source@2.0.1/lib/esm/index.js").then(module => module.fetchEventSource); + +// This example stores the API key in the client side integration. This is not recommended for any purpose. +// Instead, an alternate method for retrieving the API key should be used. +const AZURE_OPENAI_API_KEY = ''; +const AZURE_OPENAI_ENDPOINT = ''; // e.g. https://.openai.azure.com/openai/deployments//chat/completions?api-version= + +const ai_request = (request, respondWith) => { + respondWith.stream((signal, streamMessage) => { + // Adds each previous query and response as individual messages + const conversation = request.thread.flatMap((event) => { + if (event.response) { + return [ + { role: 'user', content: event.request.query }, + { role: 'assistant', content: event.response.data } + ]; + } else { + return []; + } + }); + + // System messages provided by the plugin to format the output as HTML content. + const pluginSystemMessages = request.system.map((content) => ({ + role: 'system', + content + })); + + const systemMessages = [ + ...pluginSystemMessages, + // Additional system messages to control the output of the AI + { role: 'system', content: 'Remove lines with ``` from the response start and response end.' } + ] + + // Forms the new query sent to the API + const content = request.context.length === 0 || conversation.length > 0 + ? request.query + : `Question: ${request.query} Context: """${request.context}"""`; + + const messages = [ + ...conversation, + ...systemMessages, + { role: 'user', content } + ]; + + const requestBody = { + temperature: 0.7, + max_tokens: 800, + messages, + stream: true + }; + + const azureOpenAiOptions = { + signal, + method: 'POST', + headers: { + 'Content-Type': 'application/json', + 'api-key': AZURE_OPENAI_API_KEY + }, + body: JSON.stringify(requestBody) + }; + + const onopen = async (response) => { + if (response) { + const contentType = response.headers.get('content-type'); + if (response.ok && contentType?.includes('text/event-stream')) { + return; + } else if (contentType?.includes('application/json')) { + const data = await response.json(); + if (data.error) { + throw new Error(`${data.error.type}: ${data.error.message}`); + } + } + } else { + throw new Error('Failed to communicate with the Azure OpenAI API'); + } + }; + + // This function passes each new message into the plugin via the `streamMessage` callback. + const onmessage = (ev) => { + const data = ev.data; + if (data !== '[DONE]') { + const parsedData = JSON.parse(data); + const firstChoice = parsedData?.choices[0]; + const message = firstChoice?.delta?.content; + if (message) { + streamMessage(message); + } + } + }; + + const onerror = (error) => { + // Stop operation and do not retry by the fetch-event-source + throw error; + }; + + // Use microsoft's fetch-event-source library to work around the 2000 character limit + // of the browser `EventSource` API, which requires query strings + return fetchApi + .then(fetchEventSource => + fetchEventSource(AZURE_OPENAI_ENDPOINT, { + ...azureOpenAiOptions, + openWhenHidden: true, + onopen, + onmessage, + onerror + }) + ) + .then(async (response) => { + if (response && !response.ok) { + const data = await response.json(); + if (data.error) { + throw new Error(`${data.error.type}: ${data.error.message}`); + } + } + }) + .catch(onerror); + }); +}; + +tinymce.init({ + selector: 'textarea', // change this value according to your HTML + plugins: 'ai', + toolbar: 'aidialog aishortcuts', + ai_request +}); +---- diff --git a/modules/ROOT/pages/ai-bedrock.adoc b/modules/ROOT/pages/ai-bedrock.adoc new file mode 100644 index 0000000000..8a1df93e3b --- /dev/null +++ b/modules/ROOT/pages/ai-bedrock.adoc @@ -0,0 +1,206 @@ += Amazon Bedrock integration guide +:pluginname: AI Assistant +:plugincode: ai +:plugincategory: premium +:navtitle: Amazon Bedrock integration guide +:description_short: {pluginname} with Amazon Bedrock +:description: A guide for integrating {pluginname} plugin using Amazon Bedrock. +:keywords: example, demo, custom, plugin, ai, assistant, guide, amazon, bedrock, aws + +include::partial$misc/admon-ai-pricing.adoc[] + +== Introduction + +This guide provides instructions for integrating the {pluginname} plugin using https://docs.aws.amazon.com/bedrock/latest/userguide/setting-up.html[Amazon Bedrock] in {productname}. Amazon Bedrock is a managed service for building generative AI applications on AWS. The advantage of using Amazon Bedrock is that it provides a wide range of foundation models that can be used interchangeably with little to no modification. + +The following examples load the AWS credentials directly on the client side. For security reasons, it is recommended to use an alternate method for retrieving these credentials. It is recommended to hide the API calls behind a server-side proxy to avoid exposing the AWS credentials to the client side. + +These examples use Node.js and https://docs.aws.amazon.com/sdk-for-javascript/v3/developer-guide/welcome.html[AWS SDK for JavaScript] through the `@aws-sdk/client-bedrock-runtime` package to interact with the Amazon Bedrock API. However, you can use any development environment that the https://aws.amazon.com/developer/tools[AWS SDKs] support. + +Here, the Anthropic Claude-3 Haiku model is used as an example. You can replace `modelId` with the model you want to use. See https://docs.aws.amazon.com/bedrock/latest/userguide/models-supported.html[Supported models] for more information. Note that each foundation model comes with its own set of parameters. + +To learn more about the difference between string and streaming responses, see xref:ai.adoc#the-respondwith-object[The `respondWith` object] on the plugin page. + +== Prerequisites + +Before you begin, you need the following: + +. An AWS account with access to Amazon Bedrock. +. The AWS credentials for the account. +. A Node.js environment with the `@aws-sdk/client-bedrock-runtime` package installed. + +include::partial$misc/admon-ai-proxy.adoc[] + +== String response + +This example demonstrates how to integrate the {pluginname} plugin with the https://docs.aws.amazon.com/bedrock/latest/APIReference/API_runtime_InvokeModel.html[InvokeModel command] to generate string responses. + +[source,js] +---- +import { BedrockRuntimeClient, InvokeModelCommand } from "@aws-sdk/client-bedrock-runtime"; + +// Providing access credentials within the integration is not recommended for production use. +// It is recommended to set up a proxy server to authenticate requests and provide access. +const AWS_ACCESS_KEY_ID = ""; +const AWS_SECRET_ACCESS_KEY = ""; +const AWS_SESSION_TOKEN = ""; + +const config = { + region: "us-east-1", + credentials: { + accessKeyId: AWS_ACCESS_KEY_ID, + secretAccessKey: AWS_SECRET_ACCESS_KEY, + sessionToken: AWS_SESSION_TOKEN, + }, +}; +const client = new BedrockRuntimeClient(config); + +const ai_request = (request, respondWith) => { + const payload = { + anthropic_version: "bedrock-2023-05-31", + max_tokens: 1000, + messages: [{ + role: "user", + content: request.prompt + }], + }; + + const input = { + body: JSON.stringify(payload), + contentType: "application/json", + accept: "application/json", + modelId: "anthropic.claude-3-haiku-20240307-v1:0" + }; + + respondWith.string(async (_signal) => { + const command = new InvokeModelCommand(input); + const response = await client.send(command); + const decodedResponseBody = new TextDecoder().decode(response.body); + const responseBody = JSON.parse(decodedResponseBody); + const output = responseBody.content[0].text; + return await output; + }); +}; + +tinymce.init({ + selector: 'textarea', + plugins: 'ai code help', + toolbar: 'aidialog aishortcuts code help', + ai_request +}); +---- + +== Streaming response + +This example demonstrates how to integrate the {pluginname} plugin with the https://docs.aws.amazon.com/bedrock/latest/APIReference/API_runtime_InvokeModelWithResponseStream.html[InvokeModelWithResponseStream command] to generate streaming responses. +[source,js] +---- +import { BedrockRuntimeClient, InvokeModelWithResponseStreamCommand } from "@aws-sdk/client-bedrock-runtime"; + +// Providing access credentials within the integration is not recommended for production use. +// It is recommended to set up a proxy server to authenticate requests and provide access. +const AWS_ACCESS_KEY_ID = ""; +const AWS_SECRET_ACCESS_KEY = ""; +const AWS_SESSION_TOKEN = ""; + +const config = { + region: "us-east-1", + credentials: { + accessKeyId: AWS_ACCESS_KEY_ID, + secretAccessKey: AWS_SECRET_ACCESS_KEY, + sessionToken: AWS_SESSION_TOKEN, + }, +}; +const client = new BedrockRuntimeClient(config); + +const ai_request = (request, respondWith) => { + // Adds each previous query and response as individual messages + const conversation = request.thread.flatMap((event) => { + if (event.response) { + return [ + { role: 'user', content: event.request.query }, + { role: 'assistant', content: event.response.data } + ]; + } else { + return []; + } + }); + + // System messages provided by the plugin to format the output as HTML content. + const pluginSystemMessages = request.system.map((text) => ({ + text + })); + + const systemMessages = [ + ...pluginSystemMessages, + // Additional system messages to control the output of the AI + { text: 'Do not include html\`\`\` at the start or \`\`\` at the end.' }, + { text: 'No explanation or boilerplate, just give the HTML response.' } + ] + + const system = systemMessages.map((message) => message.text).join('\n'); + + // Forms the new query sent to the API + const text = request.context.length === 0 || conversation.length > 0 + ? request.query + : `Question: ${request.query} Context: """${request.context}"""`; + + const messages = [ + ...conversation, + { + role: "user", + content: text + } + ]; + + const payload = { + anthropic_version: "bedrock-2023-05-31", + max_tokens: 1000, + system, + messages, + }; + + const input = { + body: JSON.stringify(payload), + contentType: "application/json", + accept: "application/json", + modelId: "anthropic.claude-3-haiku-20240307-v1:0" + }; + + // Amazon Bedrock doesn't support cancelling a response mid-stream, so there is no use for the signal callback. + respondWith.stream(async (_signal, streamMessage) => { + const command = new InvokeModelWithResponseStreamCommand(input); + const response = await client.send(command); + for await (const item of response.body) { + const chunk = JSON.parse(new TextDecoder().decode(item.chunk.bytes)); + const chunk_type = chunk.type; + + switch (chunk_type) { + case "message_start": + break; + case "content_block_start": + break; + case "content_block_delta": + const message = chunk.delta.text; + streamMessage(message); + break; + case "content_block_stop": + break; + case "message_delta": + break; + case "message_stop": + break; + default: + return Promise.reject("Stream error"); + } + } + }); +}; + +tinymce.init({ + selector: 'textarea', + plugins: 'ai code help', + toolbar: 'aidialog aishortcuts code help', + ai_request +}); +---- \ No newline at end of file diff --git a/modules/ROOT/pages/ai-gemini.adoc b/modules/ROOT/pages/ai-gemini.adoc new file mode 100644 index 0000000000..434f5fe774 --- /dev/null +++ b/modules/ROOT/pages/ai-gemini.adoc @@ -0,0 +1,236 @@ += Google Gemini integration guide +:pluginname: AI Assistant +:plugincode: ai +:plugincategory: premium +:navtitle: Google Gemini integration guide +:description_short: {pluginname} with Google Gemini +:description: A guide for integrating {pluginname} plugin using Google Gemini. +:keywords: example, demo, custom, plugin, ai, assistant, guide, google, gemini, vertexai, ai-studio, console, gcp, platform, cloud + +include::partial$misc/admon-ai-pricing.adoc[] + +== Introduction + +This guide provides instructions for integrating the {pluginname} plugin using Google Gemini in {productname}. + +There are two version of the Google Gemini API: https://ai.google.dev/gemini-api/docs/get-started/rest[Google AI Studio] and https://cloud.google.com/vertex-ai[Google Cloud - Vertex AI]. The Google AI Studio API is ideal for quickly integrating the Google Gemini models into an application with the minimal setup required. The Google Cloud - Vertex AI API is more powerful and flexible than Google AI Studio, but requires more setup to integrate the Google Gemini models into an application. + +In this example, we will demonstrate how to integrate the {pluginname} plugin with the Vertex AI APIs, but the same principles can be applied to the Google AI Studio APIs by changing the API endpoint, request body, and authentication method. + +Vertex AI provides a `systemInstruction` field in the request body that allows controlling the output of the AI model. Google AI Studio does not currently provide this option, so the system messages would need to be provided as part of the user prompt for that use case. + +See https://cloud.google.com/vertex-ai/generative-ai/docs/model-reference/gemini[Google Cloud - Vertex AI Gemini API docs] for more information on the Vertex AI Gemini API. + +To learn more about the difference between string and streaming responses, see xref:ai.adoc#the-respondwith-object[The `respondWith` object] on the plugin page. + +== Authentication + +The access token is used in the Authorization header to authenticate the request to the Google Cloud API. The access token should be stored securely and not exposed to the client side integration. A recommended approach is to use a proxy server to generate the access token and make the API calls. For more information, see the xref:ai-proxy.adoc[AI Proxy Server reference guide]. + +The https://www.npmjs.com/package/google-auth-library[google-auth-library] can be used to programmatically generate an access token for the Google Cloud API. Alternatively, the https://cloud.google.com/nodejs/docs/reference/vertexai/latest[Vertex AI Node.js SDK] or other client library can be used, but may require modifications to the code. + +== Prerequisites + +Before you begin, you need to have the following: + +. A Google Cloud Platform (GCP) account. +. A Google Cloud Project with the Vertex AI API enabled. +. The Project ID and Region of the Google Cloud Project. +. An Access Token for the Vertex AI API. + +include::partial$misc/admon-ai-proxy.adoc[] + +== String response + +This example demonstrates how to integrate the {pluginname} plugin with the Vertex AI API to generate string responses. + +[source,js] +---- +// Providing access credentials within the integration is not recommended for production use. +// It is recommended to set up a proxy server to authenticate requests and provide access. +const ACCESS_TOKEN = ''; // used in the Authorization Header +const PROJECT_ID = ''; // retrieve from the Vertex AI Google Console +const REGION = ''; // e.g. us-central1 +const API_URL = `https://${REGION}-aiplatform.googleapis.com/v1/projects/${PROJECT_ID}/locations/${REGION}/publishers/google/models/gemini-1.0-pro:generateContent`; + +const ai_request = (request, respondWith) => { + const geminiOptions = { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + 'Authorization': `Bearer ${ACCESS_TOKEN}` + }, + body: JSON.stringify({ + contents: { + role: "user", + parts: { text: request.prompt } + }, + generationConfig: { + temperature: 0.9, + maxOutputTokens: 800, + } + }) + }; + respondWith.string((signal) => window.fetch(API_URL, { signal, ...geminiOptions }) + .then(async (response) => { + if (response) { + const data = await response.json(); + if (data.error) { + throw new Error(`${data.error.type}: ${data.error.message}`); + } else if (response.ok) { + // Extract the response content from the data returned by the API + return data?.candidates[0]?.content?.parts[0]?.text?.trim().replace(/^```html\n/, "").replace(/\n```$/, ""); + } + } else { + throw new Error('Failed to communicate with the Gemini API'); + } + }) + ); +}; + +tinymce.init({ + selector: 'textarea', // change this value according to your HTML + plugins: 'ai', + toolbar: 'aidialog aishortcuts', + ai_request +}); +---- + +== Streaming response + +This example demonstrates how to integrate the {pluginname} plugin with the Vertex AI API to generate streaming responses. +[source,js] +---- +const fetchApi = import("https://unpkg.com/@microsoft/fetch-event-source@2.0.1/lib/esm/index.js").then(module => module.fetchEventSource); + +// Providing access credentials within the integration is not recommended for production use. +// It is recommended to set up a proxy server to authenticate requests and provide access. +const ACCESS_TOKEN = ''; // used in the Authorization Header +const PROJECT_ID = ''; // retrieve from the Vertex AI Google Console +const REGION = ''; // e.g. us-central1 +const API_URL = `https://${REGION}-aiplatform.googleapis.com/v1/projects/${PROJECT_ID}/locations/${REGION}/publishers/google/models/gemini-1.0-pro:streamGenerateContent?alt=sse`; + +const ai_request = (request, respondWith) => { + respondWith.stream((signal, streamMessage) => { + // Adds each previous query and response as individual messages + const conversation = request.thread.flatMap((event) => { + if (event.response) { + return [ + { role: 'user', parts: [{ text: event.request.query }] }, + { role: 'model', parts: [{ text: event.response.data }] } + ]; + } else { + return []; + } + }); + + // System messages provided by the plugin to format the output as HTML content. + const pluginSystemMessages = request.system.map((text) => ({ + text + })); + + const systemInstruction = { + parts: [ + ...pluginSystemMessages, + // Additional system messages to control the output of the AI + { text: 'Do not include html``` at the start or ``` at the end of the response.' }, + { text: 'No boilerplate or explanation, just give the HTML response.' } + ] + }; + + // Forms the new query sent to the API + const text = request.context.length === 0 || conversation.length > 0 + ? request.query + : `Question: ${request.query} Context: """${request.context}"""`; + + const contents = [ + ...conversation, + { role: 'user', parts: [ + { text } + ]} + ]; + + const generationConfig = { + temperature: 0.9, + maxOutputTokens: 800, + }; + + const requestBody = { + contents, + generationConfig, + systemInstruction, + }; + + const geminiOptions = { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + 'Authorization': `Bearer ${ACCESS_TOKEN}` + }, + body: JSON.stringify(requestBody) + }; + + const onopen = async (response) => { + if (response) { + const contentType = response.headers.get('content-type'); + if (response.ok && contentType?.includes('text/event-stream')) { + return; + } else if (contentType?.includes('application/json')) { + const data = await response.json(); + if (data.error) { + throw new Error(`${data.error.type}: ${data.error.message}`); + } + } + } else { + throw new Error('Failed to communicate with the Gemini API'); + } + }; + + // This function passes each new message into the plugin via the `streamMessage` callback. + const onmessage = (ev) => { + const data = ev.data; + if (data !== '[DONE]') { + const parsedData = JSON.parse(data); + const message = parsedData?.candidates[0]?.content?.parts[0]?.text?.replace(/^```html\n/, "").replace(/\n```$/, ""); + if (message) { + streamMessage(message); + } + } + }; + + const onerror = (error) => { + // Stop operation and do not retry by the fetch-event-source + throw error; + }; + + // Use microsoft's fetch-event-source library to work around the 2000 character limit + // of the browser `EventSource` API, which requires query strings + return fetchApi + .then(fetchEventSource => + fetchEventSource(API_URL, { + ...geminiOptions, + openWhenHidden: true, + onopen, + onmessage, + onerror + }) + ) + .then(async (response) => { + if (response && !response.ok) { + const data = await response.json(); + if (data.error) { + throw new Error(`${data.error.type}: ${data.error.message}`); + } + } + }) + .catch(onerror); + }); +}; + +tinymce.init({ + selector: 'textarea', // change this value according to your HTML + plugins: 'ai', + toolbar: 'aidialog aishortcuts', + ai_request +}); +---- \ No newline at end of file diff --git a/modules/ROOT/pages/ai-openai.adoc b/modules/ROOT/pages/ai-openai.adoc new file mode 100644 index 0000000000..92147970f8 --- /dev/null +++ b/modules/ROOT/pages/ai-openai.adoc @@ -0,0 +1,206 @@ += OpenAI ChatGPT integration guide +:pluginname: AI Assistant +:plugincode: ai +:plugincategory: premium +:navtitle: OpenAI ChatGPT integration guide +:description_short: {pluginname} with OpenAI ChatGPT +:description: A guide for integrating {pluginname} plugin using OpenAI ChatGPT. +:keywords: example, demo, custom, plugin, ai, assistant, guide, openai, gpt, chatgpt + +include::partial$misc/admon-ai-pricing.adoc[] + +== Introduction + +This guide provides instructions for integrating the {pluginname} plugin using https://platform.openai.com/docs/guides/text-generation[OpenAI ChatGPT] in {productname}. + +To learn more about the difference between string and streaming responses, see xref:ai.adoc#the-respondwith-object[The `respondWith` object] on the plugin page. + +== Prerequisites + +Before you begin, you need the following: + +. An OpenAI API Key. To get an API key, sign up for an account on the https://platform.openai.com/signup[OpenAI Platform]. + +include::partial$misc/admon-ai-proxy.adoc[] + +== String response + +This example demonstrates how to integrate the {pluginname} plugin with the OpenAI API to generate string responses. + +[source,js] +---- +// This example stores the API key in the client side integration. This is not recommended for any purpose. +// Instead, an alternate method for retrieving the API key should be used. +const api_key = ''; + +const ai_request = (request, respondWith) => { + const openAiOptions = { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + 'Authorization': `Bearer ${api_key}` + }, + body: JSON.stringify({ + model: 'gpt-3.5-turbo', + temperature: 0.7, + max_tokens: 800, + messages: [{ role: 'user', content: request.prompt }], + }) + }; + respondWith.string((signal) => window.fetch('https://api.openai.com/v1/chat/completions', { signal, ...openAiOptions }) + .then(async (response) => { + if (response) { + const data = await response.json(); + if (data.error) { + throw new Error(`${data.error.type}: ${data.error.message}`); + } else if (response.ok) { + // Extract the response content from the data returned by the API + return data?.choices[0]?.message?.content?.trim(); + } + } else { + throw new Error('Failed to communicate with the ChatGPT API'); + } + }) + ); +}; + +tinymce.init({ + selector: 'textarea', // Change this value according to your HTML + plugins: 'ai', + toolbar: 'aidialog aishortcuts', + ai_request +}); +---- + +== Streaming response + +This example demonstrates how to integrate the {pluginname} plugin with the OpenAI API to generate streaming responses. + +[source,js] +---- +const fetchApi = import("https://unpkg.com/@microsoft/fetch-event-source@2.0.1/lib/esm/index.js").then(module => module.fetchEventSource); + +// This example stores the API key in the client side integration. This is not recommended for any purpose. +// Instead, an alternate method for retrieving the API key should be used. +const api_key = ''; + +const ai_request = (request, respondWith) => { + respondWith.stream((signal, streamMessage) => { + // Adds each previous query and response as individual messages + const conversation = request.thread.flatMap((event) => { + if (event.response) { + return [ + { role: 'user', content: event.request.query }, + { role: 'assistant', content: event.response.data } + ]; + } else { + return []; + } + }); + + // System messages provided by the plugin to format the output as HTML content. + const pluginSystemMessages = request.system.map((content) => ({ + role: 'system', + content + })); + + const systemMessages = [ + ...pluginSystemMessages, + // Additional system messages to control the output of the AI + { role: 'system', content: 'Remove lines with ``` from the response start and response end.' } + ] + + // Forms the new query sent to the API + const content = request.context.length === 0 || conversation.length > 0 + ? request.query + : `Question: ${request.query} Context: """${request.context}"""`; + + const messages = [ + ...conversation, + ...systemMessages, + { role: 'user', content } + ]; + + const requestBody = { + model: 'gpt-3.5-turbo', + temperature: 0.7, + max_tokens: 800, + messages, + stream: true + }; + + const openAiOptions = { + signal, + method: 'POST', + headers: { + 'Content-Type': 'application/json', + 'Authorization': `Bearer ${api_key}` + }, + body: JSON.stringify(requestBody) + }; + + const onopen = async (response) => { + if (response) { + const contentType = response.headers.get('content-type'); + if (response.ok && contentType?.includes('text/event-stream')) { + return; + } else if (contentType?.includes('application/json')) { + const data = await response.json(); + if (data.error) { + throw new Error(`${data.error.type}: ${data.error.message}`); + } + } + } else { + throw new Error('Failed to communicate with the ChatGPT API'); + } + }; + + // This function passes each new message into the plugin via the `streamMessage` callback. + const onmessage = (ev) => { + const data = ev.data; + if (data !== '[DONE]') { + const parsedData = JSON.parse(data); + const firstChoice = parsedData?.choices[0]; + const message = firstChoice?.delta?.content; + if (message) { + streamMessage(message); + } + } + }; + + const onerror = (error) => { + // Stop operation and do not retry by the fetch-event-source + throw error; + }; + + // Use microsoft's fetch-event-source library to work around the 2000 character limit + // of the browser `EventSource` API, which requires query strings + return fetchApi + .then(fetchEventSource => + fetchEventSource('https://api.openai.com/v1/chat/completions', { + ...openAiOptions, + openWhenHidden: true, + onopen, + onmessage, + onerror + }) + ) + .then(async (response) => { + if (response && !response.ok) { + const data = await response.json(); + if (data.error) { + throw new Error(`${data.error.type}: ${data.error.message}`); + } + } + }) + .catch(onerror); + }); +}; + +tinymce.init({ + selector: 'textarea', // change this value according to your HTML + plugins: 'ai', + toolbar: 'aidialog aishortcuts', + ai_request +}); +---- \ No newline at end of file diff --git a/modules/ROOT/pages/ai.adoc b/modules/ROOT/pages/ai.adoc index 32353c5018..a96924fe87 100644 --- a/modules/ROOT/pages/ai.adoc +++ b/modules/ROOT/pages/ai.adoc @@ -2,7 +2,7 @@ :navtitle: AI Assistant :description: Sends queries to registered AI APIs and sets the results in the document or temporarily stores the results. :description_short: Query AI APIs and accept results. -:keywords: plugin, ai, artificial intelligence, query, search. +:keywords: plugin, ai, artificial intelligence, query, search, llm, gpt, assistant :pluginname: AI Assistant :plugincode: ai :plugincategory: premium @@ -21,11 +21,11 @@ Once a response is generated and displayed within the dialog, the user can choos Users can retrieve a history of their conversations with the AI using the xref:#getThreadLog[`getThreadLog` API], including any discarded responses. -[NOTE] -.{pluginname} demo -==== -Demos containing the {pluginname} plugin are currently only available on our main website. Check out https://www.tiny.cloud/tinymce/features/ai-integration/[the {pluginname} demo], or the https://www.tiny.cloud/[demo on our home page], to try it out today. -==== +== Interactive example + +NOTE: This example uses a proxy endpoint to communicate with the OpenAI API. This is done to avoid exposing the API key in the client-side code. For more information on using a proxy server with the {pluginname} plugin, see the xref:ai-proxy.adoc[AI Proxy Server reference guide]. + +liveDemo::ai[] == Basic setup @@ -33,10 +33,12 @@ To add the {pluginname} plugin to the editor, add both `{plugincode}` to the `pl For example, interfacing with the OpenAI Completions API: +include::partial$misc/admon-ai-proxy.adoc[] + [source,js] ---- -// This example stores the API key in the client side integration. This is not recommended for any purpose. -// Instead, an alternate method for retrieving the API key should be used. +// Providing access credentials within the integration is not recommended for production use. +// We recommend setting up a proxy server to authenticate requests and provide access. const api_key = ''; tinymce.init({ @@ -93,9 +95,9 @@ NOTE: The xref:ai-proxy.adoc[AI Proxy Server reference guide] is, as its name no The following configuration options affect the behavior of the {pluginname} plugin. -include::partial$configuration/ai_request.adoc[][leveloffset=+1] +include::partial$configuration/ai_request.adoc[leveloffset=+1] -include::partial$configuration/ai_shortcuts.adoc[][leveloffset=+1] +include::partial$configuration/ai_shortcuts.adoc[leveloffset=+1] include::partial$misc/plugin-toolbar-button-id-boilerplate.adoc[] diff --git a/modules/ROOT/pages/available-menu-items.adoc b/modules/ROOT/pages/available-menu-items.adoc index 72cb36eab9..87c6c92433 100644 --- a/modules/ROOT/pages/available-menu-items.adoc +++ b/modules/ROOT/pages/available-menu-items.adoc @@ -150,6 +150,11 @@ include::partial$misc/plugin-menu-item-id-boilerplate.adoc[] :plugincode: lists include::partial$misc/plugin-menu-item-id-boilerplate.adoc[] +:plugincategory: premium +:pluginname: Math +:plugincode: math +include::partial$misc/plugin-menu-item-id-boilerplate.adoc[] + :plugincategory: opensource :pluginname: Media :plugincode: media diff --git a/modules/ROOT/pages/available-toolbar-buttons.adoc b/modules/ROOT/pages/available-toolbar-buttons.adoc index ecfe622049..aeb089d9cd 100644 --- a/modules/ROOT/pages/available-toolbar-buttons.adoc +++ b/modules/ROOT/pages/available-toolbar-buttons.adoc @@ -172,6 +172,11 @@ include::partial$misc/plugin-toolbar-button-id-boilerplate.adoc[] :plugincode: lists include::partial$misc/plugin-toolbar-button-id-boilerplate.adoc[] +:plugincategory: premium +:pluginname: Math +:plugincode: math +include::partial$misc/plugin-toolbar-button-id-boilerplate.adoc[] + :plugincategory: opensource :pluginname: Media :plugincode: media diff --git a/modules/ROOT/pages/bundling-plugins.adoc b/modules/ROOT/pages/bundling-plugins.adoc index 721a60c14a..c6853f99f3 100644 --- a/modules/ROOT/pages/bundling-plugins.adoc +++ b/modules/ROOT/pages/bundling-plugins.adoc @@ -7,17 +7,13 @@ include::partial$module-loading/bundling-ref-example.adoc[] :!editorcomponent: -The following table shows examples of the syntax used to bundle the following plugin. +[NOTE] +If using {productname} 7.0.1 or earlier, please refer to link:https://www.tiny.cloud/docs/tinymce/6/bundling-plugins/[Bundling TinyMCE plugins using module loading] from the {productname} v6 documentation guide. -Required files for an example plugin: +include::partial$plugin-files/plugin-file-index.js.adoc[] -[source, js] ----- -./plugins/example/content.js // or './plugins/example/content_css.js' -./plugins/example/plugin.js ----- -Example syntax for including the example "plugin" in a bundle using `content.js` or `content_css.js` files for bundling: +Example syntax for including the example "" plugin in a bundle using `content.js`for bundling: [cols='1,1,4'] |=== @@ -28,18 +24,14 @@ Example syntax for including the example "plugin" in a bundle using `content.js` a| [source, js] ---- -import pluginCss from 'tinymce/plugins/example/content.js'; -//import pluginCss from 'tinymce/plugins/example/content_css.js'; -import 'tinymce/plugins/example'; +import 'tinymce/plugins/'; ---- |`.zip` a| [source, js] ---- -import '../tinymce/plugins/example/content.js'; -//import '../tinymce/plugins/example/content_css.js'; -import '../tinymce/plugins/example/plugin'; +import '../tinymce/plugins/'; ---- .2+|Common JS @@ -47,18 +39,14 @@ import '../tinymce/plugins/example/plugin'; a| [source, js] ---- -const pluginCss = require('tinymce/plugins/example/content.js'); -//require('tinymce/plugins/example/content_css.js'); -require('tinymce/plugins/example'); +require('tinymce/plugins/'); ---- |`.zip` a| [source, js] ---- -const pluginCss = require('../tinymce/plugins/example/content.js'); -//require('../tinymce/plugins/example/content_css.js'); -require('../tinymce/plugins/example/plugin.js'); +require('../tinymce/plugins/'); ---- |=== diff --git a/modules/ROOT/pages/changelog.adoc b/modules/ROOT/pages/changelog.adoc index 04dc8e542c..5bb5830563 100644 --- a/modules/ROOT/pages/changelog.adoc +++ b/modules/ROOT/pages/changelog.adoc @@ -4,6 +4,62 @@ NOTE: This is the {productname} Community version changelog. For information about the latest {cloudname} or {enterpriseversion} Release, see: xref:release-notes.adoc[{productname} Release Notes]. +== 7.1 - 2024-05-08 + +### Added + +- New `math-equation` icon. +// #TINY-10804 + +### Improved + +- Included `itemprop`, `itemscope`, and `itemtype` as valid HTML5 attributes in the core schema. +// #TINY-9932 +- Improved accessibility for notifications: added tooltips, keyboard navigation, and a shortcut to focus on notifications. +// #TINY-6925 +- Removed `aria-pressed` from the `More` button in sliding toolbar mode and replaced it with `aria-expanded`. +// #TINY-10795 +- The editor UI now renders correctly in Windows High Contrast Mode. +// #TINY-10781 + +### Fixed + +- Backspacing in certain HTML setups caused data to move around unexpectedly. +// #TINY-10590 +- Dialog title markup was changed to use an `h1` element instead of a `div`. +// #TINY-10800 +- The dialog title was not announced in macOS VoiceOver; dialogs now use `aria-label` instead of `aria-labelledby` on macOS. +// #TINY-10808 +- The theme loader did not respect the suffix when loading skin CSS files. +// #TINY-10602 +- Custom block elements with colon characters would throw errors. +// #TINY-10813 +- Tab navigation in views didn't work. +// #TINY-10780 +- Video and audio elements couldn't be played on Safari. +// #TINY-10774 +- The `ToggleToolbarDrawer` command did not toggle the toolbar in `sliding` mode when the `skipFocus: true` parameter was passed. +// #TINY-10726 +- The buttons in the custom view header were clipped when overflowing. +// #TINY-10741 +- In the custom view, the scrollbar of the container was not visible if its height was greater than the editor. +// #TINY-10741 +- Fixed an accessibility issue by removing the duplicate `role="menu"` attribute from color swatches. +// #TINY-10806 +- Fullscreen mode now prevents focus from leaving the editor. +// #TINY-10597 +- The "Open Link" context menu action did not work when the selection surrounded a link. +// #TINY-10391 +- Styles were not retained when toggling a list on and off. +// #TINY-10837 +- Caret and placeholder text were invisible in Windows High Contrast Mode. +// #TINY-9811 +- Firefox did not announce the iframe title when `iframe_aria_text` was set. +// #TINY-10718 +- Notification width was not constrained to the width of the editor. +// #TINY-10886 +- The "Open Link" context menu action was not enabled for links on images. +// #TINY-10391 == 7.0.1 - 2024-04-10 diff --git a/modules/ROOT/pages/editor-command-identifiers.adoc b/modules/ROOT/pages/editor-command-identifiers.adoc index 0231070a23..482c72f039 100644 --- a/modules/ROOT/pages/editor-command-identifiers.adoc +++ b/modules/ROOT/pages/editor-command-identifiers.adoc @@ -2,7 +2,7 @@ :navtitle: Available Commands :description_short: Complete list of editor commands. :description: The complete list of exposed editor commands. -:keywords: editorcommands, editorcommand, execcommand, Bold, Italic, Underline, Strikethrough, Superscript, Subscript, Cut, Copy, Paste, Unlink, JustifyLeft, JustifyCenter, JustifyRight, JustifyFull, JustifyNone, InsertUnorderedList, InsertOrderedList, ForeColor, HiliteColor, FontName, FontSize, InsertNewBlockBefore, InsertNewBlockAfter, RemoveFormat, mceBlockQuote, FormatBlock, mceInsertContent, mceToggleFormat, mceSetContent, Indent, Outdent, InsertHorizontalRule, mceToggleVisualAid, mceInsertLink, selectAll, delete, mceNewDocument, Undo, Redo, mceAutoResize, mceShowCharmap, mceCodeEditor, mceDirectionLTR, mceDirectionRTL, mceFullscreen, mceImage, mceInsertDate, mceInsertTime, mceInsertDefinitionList, mceNonBreaking, mcePageBreak, mcePreview, mcePrint, mceSave, SearchReplace, mceVisualBlocks, mceVisualChars, mceMedia, mceAnchor, mceTableSplitCells, mceTableMergeCells, mceTableInsertRowBefore, mceTableInsertRowAfter, mceTableInsertColBefore, mceTableInsertColAfter, mceTableDeleteCol, mceTableDeleteRow, mceTableCutRow, mceTableCopyRow, mceTablePasteRowBefore, mceTablePasteRowAfter, mceTableDelete, mceInsertTable, mceTableRowProps, mceTableCellProps, mceEditImage, mceAddEditor, mceRemoveEditor, mceToggleEditor, mceAutocompleterClose, mceAutocompleterReload +:keywords: editorcommands, editorcommand, execcommand, Bold, Italic, Underline, Strikethrough, Superscript, Subscript, Cut, Copy, Paste, Unlink, JustifyLeft, JustifyCenter, JustifyRight, JustifyFull, JustifyNone, InsertUnorderedList, InsertOrderedList, ForeColor, HiliteColor, FontName, FontSize, InsertNewBlockBefore, InsertNewBlockAfter, RemoveFormat, mceBlockQuote, FormatBlock, mceInsertContent, mceToggleFormat, mceSetContent, Indent, Outdent, InsertHorizontalRule, mceToggleVisualAid, mceInsertLink, selectAll, delete, mceNewDocument, Undo, Redo, mceAutoResize, mceShowCharmap, mceCodeEditor, mceDirectionLTR, mceDirectionRTL, mceFullscreen, mceImage, mceInsertDate, mceInsertTime, mceInsertDefinitionList, mceNonBreaking, mcePageBreak, mcePreview, mcePrint, mceSave, SearchReplace, mceVisualBlocks, mceVisualChars, mceMedia, mceAnchor, mceTableSplitCells, mceTableMergeCells, mceTableInsertRowBefore, mceTableInsertRowAfter, mceTableInsertColBefore, mceTableInsertColAfter, mceTableDeleteCol, mceTableDeleteRow, mceTableCutRow, mceTableCopyRow, mceTablePasteRowBefore, mceTablePasteRowAfter, mceTableDelete, mceInsertTable, mceTableRowProps, mceTableCellProps, mceEditImage, mceAddEditor, mceRemoveEditor, mceToggleEditor, mceAutocompleterClose, mceAutocompleterReload, mceMath, Math == Overview @@ -237,6 +237,7 @@ Commands are available for the following plugins: * xref:link[Link] * xref:lists[Lists] * xref:advancedlists[List Styles] +* xref:math[Math] * xref:media[Media] * xref:nonbreakingspace[Nonbreaking Space] * xref:pagebreak[Page Break] @@ -430,6 +431,13 @@ The following commands require the xref:advlist.adoc[List Styles (`+advlist+`)] include::partial$commands/advlist-cmds.adoc[leveloffset=+3] +[[math]] +==== Math + +The following commands require the xref:math.adoc[Math (`+math+`)] plugin. + +include::partial$commands/math-cmds.adoc[leveloffset=+3] + [[media]] ==== Media diff --git a/modules/ROOT/pages/events.adoc b/modules/ROOT/pages/events.adoc index 83f96be4d5..3cdb272aa1 100644 --- a/modules/ROOT/pages/events.adoc +++ b/modules/ROOT/pages/events.adoc @@ -180,6 +180,7 @@ The following events are provided by the {productname} editor. The following plugins provide events. +* xref:a11ychecker-events[Accessibility Checker events] * xref:autosave-events[Autosave events] * xref:character-map-events[Character Map events] * xref:comments-events[Comments events] @@ -198,6 +199,13 @@ The following plugins provide events. * xref:visual-characters-events[Visual Characters events] * xref:word-count-events[Word Count events] +[[a11ychecker-events]] +=== Accessibility Checker events + +The following events are provided by the xref:a11ychecker.adoc[Accessibility Checker plugin]. + +include::partial$events/a11ychecker-events.adoc[] + [[autosave-events]] === Autosave events diff --git a/modules/ROOT/pages/keyboard-shortcuts.adoc b/modules/ROOT/pages/keyboard-shortcuts.adoc index 1e561b863b..5976e054bb 100644 --- a/modules/ROOT/pages/keyboard-shortcuts.adoc +++ b/modules/ROOT/pages/keyboard-shortcuts.adoc @@ -30,6 +30,7 @@ This is a list of available keyboard shortcuts within the editor body. |Focus to menu bar |Alt+F9 |⌥+F9 |core |Focus to toolbar |Alt+F10 |⌥+F10 |core |Focus to element path |Alt+F11 |⌥+F11 |core +|Focus to notification |Alt+F12 |⌥+F12 |core |Focus to contextual toolbar |Ctrl+F9 |Ctrl+F9 |core |Print |Ctrl+P |⌘+P |core |Open the {productname} Help dialog |Alt+0 |⌥+0 |xref:help.adoc[help] @@ -59,6 +60,7 @@ This is a list of available keyboard shortcuts within the editor user interface. |Close submenu |Left Arrow / Esc |Left Arrow / Esc |Close dialog |Esc |Esc |Close menu |Esc |Esc +|Close notification |Esc |Esc |Move focus back to editor body |Esc |Esc |=== diff --git a/modules/ROOT/pages/math.adoc b/modules/ROOT/pages/math.adoc new file mode 100644 index 0000000000..a60505837d --- /dev/null +++ b/modules/ROOT/pages/math.adoc @@ -0,0 +1,79 @@ += Math plugin +:navtitle: Math Plugin +:description: {pluginname} plugin allows users to insert math equations into the {productname} editor. +:description_short: Insert `++` elements into {productname}. +:keywords: plugin, math, formulas +:pluginname: Math +:plugincode: math +:plugincategory: premium + +include::partial$misc/admon-paid-addon-pricing.adoc[] + +include::partial$misc/admon-requires-7.1v.adoc[] + +The {pluginname} plugin provides a way for users to insert complex formulas. + +== Interactive example + +liveDemo::{plugincode}[] + +== Basic setup + +To set up the {pluginname} plugin user interface in the editor: + +* add `+math+` to the plugins option in the editor configuration; + +For example: + +[source,js] +---- +tinymce.init({ + selector: 'textarea', // change this value according to your HTML + plugins: 'math', + toolbar: 'math', +}); +---- + +== How to Use + +To work with math elements, follow these steps: + +. **Enable Math Plugin** ++ +.. Open the {productname} editor with the {pluginname} plugin enabled. ++ +. **Insert or Edit {pluginname} Elements** +.. Click the {pluginname} plugin icon in the toolbar. +.. This opens the {pluginname} dialog. +.. Select preferred **language** +.. Enter {pluginname} **formula** in the textarea. +.. Choose preferred **text wrap** ++ +. **Preview and Save** +.. Check {pluginname} formula output in **preview.** +.. Review the final {pluginname} equation in the **preview** section. +.. Click the **save** button in the {pluginname} dialog. +.. The {pluginname} equation is inserted into the editor, wrapped accordingly based on the chosen **text wrap.** ++ + + +**Formula Tag Wrapping** + +. The {pluginname} dialog wraps the inserted formula with a specific tag. +. The choice of tag depends on the selected **text wrap** option in the dialog: +.. For block (_Text above and below_) text wrap, the tag used is ``. +.. For inline (_Inline with text_) text wrap, the tag used is ``. + + +[NOTE] +Visit link:https://katex.org/docs/supported.html[https://katex.org/docs/supported^] for a comprehensive list of supported symbols and functions when inserting mathematical equations after selecting "Language (LaTeX)". + +include::partial$misc/plugin-toolbar-button-id-boilerplate.adoc[] + +include::partial$misc/plugin-menu-item-id-boilerplate.adoc[] + +== Commands + +The {pluginname} plugin provides the following {productname} commands. + +include::partial$commands/{plugincode}-cmds.adoc[] \ No newline at end of file diff --git a/modules/ROOT/pages/release-notes.adoc b/modules/ROOT/pages/release-notes.adoc index ca6a9bb2e1..b981f531ff 100644 --- a/modules/ROOT/pages/release-notes.adoc +++ b/modules/ROOT/pages/release-notes.adoc @@ -9,6 +9,12 @@ This section lists the releases for {productname} 7 and the changes made in each [cols="1,1"] |=== +a| +[.lead] +xref:7.1-release-notes.adoc#overview[{productname} 7.1] + +Release notes for {productname} 7.1 + a| [.lead] xref:7.0.1-release-notes.adoc#overview[{productname} 7.0.1] @@ -29,6 +35,6 @@ Release notes for {productname} 7.0 // 2. When the number of cells in the table is even: // * prepend the inline comment markup to this // element. -// a| +a| |=== diff --git a/modules/ROOT/pages/revisionhistory.adoc b/modules/ROOT/pages/revisionhistory.adoc index cc19c429f2..b93aedb225 100644 --- a/modules/ROOT/pages/revisionhistory.adoc +++ b/modules/ROOT/pages/revisionhistory.adoc @@ -113,4 +113,10 @@ include::partial$commands/{plugincode}-cmds.adoc[] The {pluginname} plugin provides the following events. -include::partial$events/{plugincode}-events.adoc[] \ No newline at end of file +include::partial$events/{plugincode}-events.adoc[] + +== APIs + +The {pluginname} plugin provide the following APIs. + +include::partial$plugin-apis/{plugincode}-apis.adoc[] \ No newline at end of file diff --git a/modules/ROOT/pages/tinymce-and-screenreaders.adoc b/modules/ROOT/pages/tinymce-and-screenreaders.adoc index 9c3e34a236..7d16a59194 100644 --- a/modules/ROOT/pages/tinymce-and-screenreaders.adoc +++ b/modules/ROOT/pages/tinymce-and-screenreaders.adoc @@ -16,6 +16,7 @@ The following *Alt+key* and *Option+key* shortcuts can only be used when the con |Focus/jump to menu bar |Alt+F9 |⌥+F9 |Focus/jump to toolbar |Alt+F10 |⌥+F10 |Focus/jump to element path |Alt+F11 |⌥+F11 +|Focus/jump to notification |Alt+F12 |⌥+F12 |Close menu/submenu/dialog |Esc |Esc |Return to the editor content area |Esc |Esc |Navigate left/right through menu/toolbar |Tab and the Arrow Keys |Tab and the Arrow Keys @@ -46,6 +47,10 @@ To open submenus or grid selections on toolbar buttons, use the *Enter*, *Return Dialogs such as *Insert/Edit Image* are opened from either a menu item or a toolbar button. Some dialogs contain multiple tabs or pages of options. To change tabs or pages, use the arrow keys; the highlighted tab will become active immediately. Use the *Tab* key to navigate between the dialog options on the selected dialog tab. The *Save* dialog button stores the changes, and the *Cancel* dialog button or the *Esc* key discards changes. +=== Navigating notifications + +To focus on the editor notifications, press *Alt+F12* (or *⌥+F12*); which moves the keyboard focus to the first notification. To move the focus _between_ notifications and other focusable elements (e.g. links or buttons) within a notification, use the *Tab* key. Use *Shift+Tab* key to navigate backward. When you reach the end of the elements within a notification using *Tab* key, it will either cycle to the next notification in the list or cycle back to the first one if you're already on the last. To close the currently focused notification, press the *Esc* key. + == Accessibility options {productname} has accessibility options that can be set when initializing the editor, see: xref:accessibility.adoc[Accessibility options]. diff --git a/modules/ROOT/partials/commands/math-cmds.adoc b/modules/ROOT/partials/commands/math-cmds.adoc new file mode 100644 index 0000000000..40c90b0f45 --- /dev/null +++ b/modules/ROOT/partials/commands/math-cmds.adoc @@ -0,0 +1,11 @@ +[cols="1,3",options="header"] +|=== +|Command |Description +|Math |This command opens the {pluginname} dialog. +|=== + +.Examples +[source,js] +---- +tinymce.activeEditor.execCommand('Math'); +---- \ No newline at end of file diff --git a/modules/ROOT/partials/configuration/ai_request.adoc b/modules/ROOT/partials/configuration/ai_request.adoc index 4343cfd330..9106c50fbc 100644 --- a/modules/ROOT/partials/configuration/ai_request.adoc +++ b/modules/ROOT/partials/configuration/ai_request.adoc @@ -13,132 +13,50 @@ NOTE: This option is required to use the {pluginname} plugin. *Type:* `+Function+` -=== Example: using `ai_request` and the `stream` callback to interface with the OpenAI Completions API +=== Example: using `ai_request` to interface with the OpenAI Completions API [source,js] ---- -const fetchApi = import("https://unpkg.com/@microsoft/fetch-event-source@2.0.1/lib/esm/index.js").then(module => module.fetchEventSource); - // This example stores the API key in the client side integration. This is not recommended for any purpose. // Instead, an alternate method for retrieving the API key should be used. const api_key = ''; +const ai_request = (request, respondWith) => { + const openAiOptions = { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + 'Authorization': `Bearer ${api_key}` + }, + body: JSON.stringify({ + model: 'gpt-3.5-turbo', + temperature: 0.7, + max_tokens: 800, + messages: [{ role: 'user', content: request.prompt }], + }) + }; + respondWith.string((signal) => window.fetch('https://api.openai.com/v1/chat/completions', { signal, ...openAiOptions }) + .then(async (response) => { + if (response) { + const data = await response.json(); + if (data.error) { + throw new Error(`${data.error.type}: ${data.error.message}`); + } else if (response.ok) { + // Extract the response content from the data returned by the API + return data?.choices[0]?.message?.content?.trim(); + } + } else { + throw new Error('Failed to communicate with the ChatGPT API'); + } + }) + ); +}; + tinymce.init({ - selector: 'textarea', // change this value according to your html + selector: 'textarea', // Change this value according to your HTML plugins: 'ai', toolbar: 'aidialog aishortcuts', - ai_request: (request, respondWith) => { - respondWith.stream((signal, streamMessage) => { - // Adds each previous query and response as individual messages - const conversation = request.thread.flatMap((event) => { - if (event.response) { - return [ - { role: 'user', content: event.request.query }, - { role: 'assistant', content: event.response.data } - ]; - } else { - return []; - } - }); - - // System messages provided by the plugin to format the output as HTML content. - const pluginSystemMessages = request.system.map((content) => ({ - role: 'system', - content - })); - - const systemMessages = [ - ...pluginSystemMessages, - // Additional system messages to control the output of the AI - { role: 'system', content: 'Remove lines with ``` from the response start and response end.' } - ] - - // Forms the new query sent to the API - const content = request.context.length === 0 || conversation.length > 0 - ? request.query - : `Question: ${request.query} Context: """${request.context}"""`; - - const messages = [ - ...conversation, - ...systemMessages, - { role: 'user', content } - ]; - - const requestBody = { - model: 'gpt-3.5-turbo', - temperature: 0.7, - max_tokens: 800, - messages, - stream: true - }; - - const openAiOptions = { - signal, - method: 'POST', - headers: { - 'Content-Type': 'application/json', - 'Authorization': `Bearer ${api_key}` - }, - body: JSON.stringify(requestBody) - }; - - const onopen = async (response) => { - if (response) { - const contentType = response.headers.get('content-type'); - if (response.ok && contentType?.includes('text/event-stream')) { - return; - } else if (contentType?.includes('application/json')) { - const data = await response.json(); - if (data.error) { - throw new Error(`${data.error.type}: ${data.error.message}`); - } - } - } else { - throw new Error('Failed to communicate with the ChatGPT API'); - } - }; - - // This function passes each new message into the plugin via the `streamMessage` callback. - const onmessage = (ev) => { - const data = ev.data; - if (data !== '[DONE]') { - const parsedData = JSON.parse(data); - const firstChoice = parsedData?.choices[0]; - const message = firstChoice?.delta?.content; - if (message) { - streamMessage(message); - } - } - }; - - const onerror = (error) => { - // Stop operation and do not retry by the fetch-event-source - throw error; - }; - - // Use microsoft's fetch-event-source library to work around the 2000 character limit - // of the browser `EventSource` API, which requires query strings - return fetchApi - .then(fetchEventSource => - fetchEventSource('https://api.openai.com/v1/chat/completions', { - ...openAiOptions, - openWhenHidden: true, - onopen, - onmessage, - onerror - }) - ) - .then(async (response) => { - if (response && !response.ok) { - const data = await response.json(); - if (data.error) { - throw new Error(`${data.error.type}: ${data.error.message}`); - } - } - }) - .catch(onerror); - }); - } + ai_request }); ---- diff --git a/modules/ROOT/partials/configuration/defaultmenuitems.adoc b/modules/ROOT/partials/configuration/defaultmenuitems.adoc index f9baee5a60..dd2c811ce9 100644 --- a/modules/ROOT/partials/configuration/defaultmenuitems.adoc +++ b/modules/ROOT/partials/configuration/defaultmenuitems.adoc @@ -6,7 +6,7 @@ tinymce.init({ file: { title: 'File', items: 'newdocument restoredraft | preview | importword exportpdf exportword | print | deleteallconversations' }, edit: { title: 'Edit', items: 'undo redo | cut copy paste pastetext | selectall | searchreplace' }, view: { title: 'View', items: 'code revisionhistory | visualaid visualchars visualblocks | spellchecker | preview fullscreen | showcomments' }, - insert: { title: 'Insert', items: 'image link media addcomment pageembed codesample inserttable | charmap emoticons hr | pagebreak nonbreaking anchor tableofcontents | insertdatetime' }, + insert: { title: 'Insert', items: 'image link media addcomment pageembed codesample inserttable | math | charmap emoticons hr | pagebreak nonbreaking anchor tableofcontents | insertdatetime' }, format: { title: 'Format', items: 'bold italic underline strikethrough superscript subscript codeformat | styles blocks fontfamily fontsize align lineheight | forecolor backcolor | language | removeformat' }, tools: { title: 'Tools', items: 'spellchecker spellcheckerlanguage | a11ycheck code wordcount' }, table: { title: 'Table', items: 'inserttable | cell row column | advtablesort | tableprops deletetable' }, diff --git a/modules/ROOT/partials/configuration/icon_list.adoc b/modules/ROOT/partials/configuration/icon_list.adoc index 17270ee9d3..b98c291f2a 100644 --- a/modules/ROOT/partials/configuration/icon_list.adoc +++ b/modules/ROOT/partials/configuration/icon_list.adoc @@ -103,6 +103,7 @@ | `+list-num-upper-roman+` | image:icons/list-num-upper-roman.svg[list-num-upper-roman.svg] | `+list-num-upper-roman.svg+` | `+lock+` | image:icons/lock.svg[lock.svg] | `+lock.svg+` | `+ltr+` | image:icons/ltr.svg[ltr.svg] | `+ltr.svg+` +| `+math+` | image:icons/math-equation.svg[math-equation.svg] | `+math-equation.svg+` | `+minus+` | image:icons/minus.svg[minus.svg] | `+minus.svg+` | `+more-drawer+` | image:icons/more-drawer.svg[more-drawer.svg] | `+more-drawer.svg+` | `+new-document+` | image:icons/new-document.svg[new-document.svg] | `+new-document.svg+` diff --git a/modules/ROOT/partials/events/a11ychecker-events.adoc b/modules/ROOT/partials/events/a11ychecker-events.adoc new file mode 100644 index 0000000000..a037dcdd8f --- /dev/null +++ b/modules/ROOT/partials/events/a11ychecker-events.adoc @@ -0,0 +1,9 @@ +[cols="1,1,2",options="header"] +|=== +|Name |Data |Description +|A11ycheckStart |N/A |Fired when the Accessibility Checker is `opened` +|A11ycheckStop |N/A |Fired when the Accessibility Checker is `closed` +|A11ycheckIgnore |N/A |Fired when the `Ignore` button is pressed +|A11ycheckRepair |N/A |Fired when the `Repair` button is pressed +|A11ycheckShowDetails |N/A |Fired when the `Click for more info` button is pressed +|=== \ No newline at end of file diff --git a/modules/ROOT/partials/index-pages/premium-plugins.adoc b/modules/ROOT/partials/index-pages/premium-plugins.adoc index 1d5a92f74b..1928b9065b 100644 --- a/modules/ROOT/partials/index-pages/premium-plugins.adoc +++ b/modules/ROOT/partials/index-pages/premium-plugins.adoc @@ -105,6 +105,12 @@ xref:linkchecker.adoc[Link Checker] Validate links, as they are typed. +a| +[.lead] +xref:math.adoc[Math] + +Enable insertion of math formulas using Latex or MathML markup. + a| [.lead] xref:markdown.adoc[Markdown] diff --git a/modules/ROOT/partials/integrations/react-quick-start.adoc b/modules/ROOT/partials/integrations/react-quick-start.adoc index bbdb4b2c4a..20e60ed330 100644 --- a/modules/ROOT/partials/integrations/react-quick-start.adoc +++ b/modules/ROOT/partials/integrations/react-quick-start.adoc @@ -460,37 +460,36 @@ import './tinymce/icons/default/icons.min.js'; // Editor styles import './tinymce/skins/ui/oxide/skin.min.js'; -// importing the plugin js. +// importing the plugin index.js file. // if you use a plugin that is not listed here the editor will fail to load -import './tinymce/plugins/advlist/plugin.min.js'; -import './tinymce/plugins/anchor/plugin.min.js'; -import './tinymce/plugins/autolink/plugin.min.js'; -import './tinymce/plugins/autoresize/plugin.min.js'; -import './tinymce/plugins/autosave/plugin.min.js'; -import './tinymce/plugins/charmap/plugin.min.js'; -import './tinymce/plugins/code/plugin.min.js'; -import './tinymce/plugins/codesample/plugin.min.js'; -import './tinymce/plugins/directionality/plugin.min.js'; -import './tinymce/plugins/emoticons/plugin.min.js'; -import './tinymce/plugins/fullscreen/plugin.min.js'; -import './tinymce/plugins/help/plugin.min.js'; -import './tinymce/plugins/help/js/i18n/keynav/en.js'; -import './tinymce/plugins/image/plugin.min.js'; -import './tinymce/plugins/importcss/plugin.min.js'; -import './tinymce/plugins/insertdatetime/plugin.min.js'; -import './tinymce/plugins/link/plugin.min.js'; -import './tinymce/plugins/lists/plugin.min.js'; -import './tinymce/plugins/media/plugin.min.js'; -import './tinymce/plugins/nonbreaking/plugin.min.js'; -import './tinymce/plugins/pagebreak/plugin.min.js'; -import './tinymce/plugins/preview/plugin.min.js'; -import './tinymce/plugins/quickbars/plugin.min.js'; -import './tinymce/plugins/save/plugin.min.js'; -import './tinymce/plugins/searchreplace/plugin.min.js'; -import './tinymce/plugins/table/plugin.min.js'; -import './tinymce/plugins/visualblocks/plugin.min.js'; -import './tinymce/plugins/visualchars/plugin.min.js'; -import './tinymce/plugins/wordcount/plugin.min.js'; +import './tinymce/plugins/advlist'; +import './tinymce/plugins/anchor'; +import './tinymce/plugins/autolink'; +import './tinymce/plugins/autoresize'; +import './tinymce/plugins/autosave'; +import './tinymce/plugins/charmap'; +import './tinymce/plugins/code'; +import './tinymce/plugins/codesample'; +import './tinymce/plugins/directionality'; +import './tinymce/plugins/emoticons'; +import './tinymce/plugins/fullscreen'; +import './tinymce/plugins/help'; +import './tinymce/plugins/image'; +import './tinymce/plugins/importcss'; +import './tinymce/plugins/insertdatetime'; +import './tinymce/plugins/link'; +import './tinymce/plugins/lists'; +import './tinymce/plugins/media'; +import './tinymce/plugins/nonbreaking'; +import './tinymce/plugins/pagebreak'; +import './tinymce/plugins/preview'; +import './tinymce/plugins/quickbars'; +import './tinymce/plugins/save'; +import './tinymce/plugins/searchreplace'; +import './tinymce/plugins/table'; +import './tinymce/plugins/visualblocks'; +import './tinymce/plugins/visualchars'; +import './tinymce/plugins/wordcount'; // importing plugin resources import './tinymce/plugins/emoticons/js/emojis.js'; diff --git a/modules/ROOT/partials/menu-item-ids/math-menu-items.adoc b/modules/ROOT/partials/menu-item-ids/math-menu-items.adoc new file mode 100644 index 0000000000..4c82bb6de0 --- /dev/null +++ b/modules/ROOT/partials/menu-item-ids/math-menu-items.adoc @@ -0,0 +1,5 @@ +[cols="1,1,2",options="header"] +|=== +|Menu item identifier |xref:menus-configuration-options.adoc#example-the-tinymce-default-menu-items[Default Menu Location] |Description +|`+math+` |Insert |Opens the math modal dialog. +|=== \ No newline at end of file diff --git a/modules/ROOT/partials/misc/admon-ai-proxy.adoc b/modules/ROOT/partials/misc/admon-ai-proxy.adoc new file mode 100644 index 0000000000..3f538a66dc --- /dev/null +++ b/modules/ROOT/partials/misc/admon-ai-proxy.adoc @@ -0,0 +1 @@ +IMPORTANT: The following examples are intended to show how to use the authentication credentials with the API within the client side integration. This is **not recommended** for production purposes. It is recommended to only access the API with a xref:ai-proxy.adoc[proxy server] or by implementing a server-side integration to prevent unauthorized access to the API. \ No newline at end of file diff --git a/modules/ROOT/partials/misc/admon-requires-7.1v.adoc b/modules/ROOT/partials/misc/admon-requires-7.1v.adoc new file mode 100644 index 0000000000..c23475fcae --- /dev/null +++ b/modules/ROOT/partials/misc/admon-requires-7.1v.adoc @@ -0,0 +1 @@ +NOTE: This feature is only available for {productname} 7.1 and later. diff --git a/modules/ROOT/partials/misc/premium-plugin-list.adoc b/modules/ROOT/partials/misc/premium-plugin-list.adoc index 6a30743c91..f3219df51d 100644 --- a/modules/ROOT/partials/misc/premium-plugin-list.adoc +++ b/modules/ROOT/partials/misc/premium-plugin-list.adoc @@ -14,6 +14,7 @@ * xref:inline-css.adoc[Inline CSS] * xref:editimage.adoc[Image Editing] * xref:linkchecker.adoc[Link Checker] +* xref:math.adoc[Math] * xref:markdown.adoc[Markdown] * xref:mentions.adoc[Mentions] * xref:mergetags.adoc[Merge Tags] diff --git a/modules/ROOT/partials/misc/supported-versions.adoc b/modules/ROOT/partials/misc/supported-versions.adoc index ecddb948e3..3d0abacf64 100644 --- a/modules/ROOT/partials/misc/supported-versions.adoc +++ b/modules/ROOT/partials/misc/supported-versions.adoc @@ -6,8 +6,9 @@ Supported versions of {productname}: [cols="^,^,^,^",options="header"] |=== |Version |Release Date |End of Community Support |End of Premium Support -|7.0 |2024-03-20 |- |2025-09-20 -|6.8 |2023-12-06 |2024-10-31 |2025-06-06 +|7.1 |2024-05-08 |- |2025-11-08 +|7.0 |2024-03-20 |2024-05-08 |2025-09-20 +|6.8 |2023-12-06 |2024-03-20 |2025-06-06 |6.7 |2023-09-13 |2023-12-06 |2025-03-13 |6.6 |2023-07-19 |2023-09-13 |2025-01-19 |6.5 |2023-06-21 |2023-07-19 |2024-12-21 diff --git a/modules/ROOT/partials/module-loading/admon-bundling-plugin-langs.adoc b/modules/ROOT/partials/module-loading/admon-bundling-plugin-langs.adoc index 367803cf55..486ad423bf 100644 --- a/modules/ROOT/partials/module-loading/admon-bundling-plugin-langs.adoc +++ b/modules/ROOT/partials/module-loading/admon-bundling-plugin-langs.adoc @@ -1 +1,26 @@ -NOTE: The plugin language files (such as `+./plugins/plugin/langs/sv_SE.js+`) are required where the editor user interface is localized using the xref:ui-localization.adoc#language[language option]. Please refer to xref:bundling-plugins.adoc#plugin-language-files[plugin-language-files] \ No newline at end of file +[NOTE] +==== +Plugin language files (such as `+./plugins//langs/sv_SE.js+`) are required where the editor user interface is localized using the xref:ui-localization.adoc#language[language option]. + +The below plugins require these xref:bundling-plugins.adoc#plugin-language-files[plugin-language-files] + +* AI Assistant (+ai+) +* Accessibility Checker (+a11ychecker+) +* Enhanced Code (+advcode+) +* Enhanced Tables (+advtable+) +* Templates (+advtemplate+) +* Spelling Autocorrect (+autocorrect+) +* Image Editing (+editimage+) +* Export to PDF (+exportpdf+) +* Export to Word (+exportword+) +* Footnotes (+footnotes+) +* Import from Word (+importword+) +* Merge Tags (+mergetags+) +* Page Embedding (+pageembed+) +* PowerPaste (+powerpaste+) +* Revision History (+revisionhistory+) +* Table of Contents (+tableofcontents+) +* Comments (+tinycomments+) +* Spell Checker (+tinymcespellchecker+) +* Typography (+typography+) +==== \ No newline at end of file diff --git a/modules/ROOT/partials/module-loading/bundling-browserify-cjs-zip_editor.adoc b/modules/ROOT/partials/module-loading/bundling-browserify-cjs-zip_editor.adoc index 1e0fac64b6..43e92ea0e4 100644 --- a/modules/ROOT/partials/module-loading/bundling-browserify-cjs-zip_editor.adoc +++ b/modules/ROOT/partials/module-loading/bundling-browserify-cjs-zip_editor.adoc @@ -22,13 +22,13 @@ require('../tinymce/js/tinymce/models/dom/model.js'); require('../tinymce/js/tinymce/skins/ui/oxide/skin.css'); /* Import plugins - include the relevant plugin in the 'plugins' option. */ -require('../tinymce/js/tinymce/plugins/advlist/plugin.js'); -require('../tinymce/js/tinymce/plugins/code/plugin.js'); -require('../tinymce/js/tinymce/plugins/emoticons/plugin.js'); +require('../tinymce/js/tinymce/plugins/advlist'); +require('../tinymce/js/tinymce/plugins/code'); +require('../tinymce/js/tinymce/plugins/emoticons'); require('../tinymce/js/tinymce/plugins/emoticons/js/emojis'); -require('../tinymce/js/tinymce/plugins/link/plugin.js'); -require('../tinymce/js/tinymce/plugins/lists/plugin.js'); -require('../tinymce/js/tinymce/plugins/table/plugin.js'); +require('../tinymce/js/tinymce/plugins/link'); +require('../tinymce/js/tinymce/plugins/lists'); +require('../tinymce/js/tinymce/plugins/table'); /* content UI CSS is required */ const contentUiSkinCss = fs.readFileSync('tinymce/js/tinymce/skins/ui/oxide/content.css', { encoding: 'UTF-8' }); diff --git a/modules/ROOT/partials/module-loading/bundling-plugin-files.adoc b/modules/ROOT/partials/module-loading/bundling-plugin-files.adoc index 9b651ab29f..b8f8884df5 100644 --- a/modules/ROOT/partials/module-loading/bundling-plugin-files.adoc +++ b/modules/ROOT/partials/module-loading/bundling-plugin-files.adoc @@ -1,339 +1,30 @@ == Contents -include::partial$module-loading/bundling-plugins-that-cant-bundle.adoc[] - -* xref:premium-plugins[Premium plugins] -** xref:accessibility-checker[Accessibility Checker (a11ychecker)] -** xref:case-change[Case Change (casechange)] -** xref:checklist[Checklist (checklist)] -** xref:comments[Comments (tinycomments)] -** xref:advanced-code[Enhanced Code Editor (advcode)] -** xref:advanced-code[Advanced Code (advcode)] -** xref:advanced-tables[Enhanced Tables (advtable)] -** xref:case-change[Case Change (casechange)] -** xref:checklist[Checklist (checklist)] -** xref:comments[Comments (tinycomments)] -** xref:enhanced-media-embed[Enhanced Media Embed (mediaembed)] -** xref:exportword[Export to Word (exportword)] -** xref:footnotes[Footnotes (footnotes)] -** xref:format-painter[Format Painter (formatpainter)] -** xref:link-checker[Link Checker (linkchecker)] -** xref:markdown[Markdown (markdown)] -** xref:mentions[Mentions (mentions)] -** xref:mergetags[Merge Tags] -** xref:page-embed[Page Embed (pageembed)] -** xref:permanent-pen[Permanent Pen (permanentpen)] -** xref:powerpaste[PowerPaste (powerpaste)] -** xref:spell-checker[Spell Checker (tinymcespellchecker)] -** xref:autocorrect[Spelling Autocorrect] -** xref:table-of-contents[Table of Contents (tableofcontents)] -* xref:community-plugins[Community plugins] -** xref:advanced-list[List Styles (advlist)] -** xref:anchor[Anchor (anchor)] -** xref:autolink[Autolink (autolink)] -** xref:autoresize[Autoresize (autoresize)] -** xref:autosave[Autosave (autosave)] -** xref:character-map[Character Map (charmap)] -** xref:code[Code (code)] -** xref:codesamplecodesample[Code Sample (codesample)] -** xref:directionality[Directionality (directionality)] -** xref:emoticons[Emoticons (emoticons)] -** xref:full-screen[Full Screen (fullscreen)] -** xref:help[Help (help)] -** xref:image[Image (image)] -** xref:image-editing[Image Editing (editimage)] -** xref:import-css[Import CSS (importcss)] -** xref:insert-datetime[Insert Date/Time (insertdatetime)] -** xref:link[Link (link)] -** xref:lists[Lists (lists)] -** xref:media[Media (media)] -** xref:nonbreaking-space[Nonbreaking Space (nonbreaking)] -** xref:page-break[Page Break (pagebreak)] -** xref:preview[Preview (preview)] -** xref:quick-toolbar[Quick Toolbar (quickbars)] -** xref:save[Save (save)] -** xref:search-and-replace[Search and Replace (searchreplace)] -** xref:table[Table (table)] -** xref:visual-blocks[Visual Blocks (visualblocks)] -** xref:visual-characters[Visual Characters (visualchars)] -** xref:word-count[Word Count (wordcount)] [[premium-plugins]] -== Premium plugins - -[[accessibility-checker]] -=== Accessibility Checker (`+a11ychecker+`) - -include::partial$module-loading/admon-bundling-plugin-langs.adoc[] - -include::partial$plugin-files/plugin-file-list-a11ychecker.adoc[] - - -[[advanced-tables]] -=== Enhanced Tables (`+advtable+`) - -include::partial$module-loading/admon-bundling-plugin-langs.adoc[] - -include::partial$plugin-files/plugin-file-list-advtable.adoc[] - -[[case-change]] -=== Case Change (`+casechange+`) - -include::partial$plugin-files/plugin-file-list-casechange.adoc[] - -[[checklist]] -=== Checklist (`+checklist+`) - -include::partial$plugin-files/plugin-file-list-checklist.adoc[] - -[[comments]] -=== Comments (`+tinycomments+`) - -include::partial$module-loading/admon-bundling-plugin-langs.adoc[] - -include::partial$plugin-files/plugin-file-list-tinycomments.adoc[] - -[[enhanced-code-editor]] -=== Enhanced Code Editor (`+advcode+`) - -include::partial$plugin-files/plugin-file-list-advcode.adoc[] - -[[enhanced-media-embed]] -=== Enhanced Media Embed (`+mediaembed+`) - -include::partial$plugin-files/plugin-file-list-mediaembed.adoc[] - -[[export-word]] -=== ExportWord (`+exportword+`) - -include::partial$module-loading/admon-bundling-plugin-langs.adoc[] - -include::partial$plugin-files/plugin-file-list-exportword.adoc[] - -[[footnotes]] -=== Footnotes (`+footnotes+`) - -include::partial$module-loading/admon-bundling-plugin-langs.adoc[] - -include::partial$plugin-files/plugin-file-list-footnotes.adoc[] - -[[format-painter]] -=== Format Painter (`+formatpainter+`) - -include::partial$plugin-files/plugin-file-list-formatpainter.adoc[] - -[[image-editing]] -=== Image Editing (`+editimage+`) - -include::partial$module-loading/admon-bundling-plugin-langs.adoc[] - -include::partial$plugin-files/plugin-file-list-editimage.adoc[] - -[[link-checker]] -=== Link Checker (`+linkchecker+`) - -include::partial$plugin-files/plugin-file-list-linkchecker.adoc[] - -[[markdown]] -=== Markdown (`+markdown+`) - -include::partial$plugin-files/plugin-file-list-markdown.adoc[] - -[[mentions]] -=== Mentions (`+mentions+`) - -include::partial$plugin-files/plugin-file-list-mentions.adoc[] - -[[mergetags]] -=== Merge Tags (`+mergetags+`) - -include::partial$module-loading/admon-bundling-plugin-langs.adoc[] - -include::partial$plugin-files/plugin-file-list-mergetags.adoc[] - -[[page-embed]] -=== Page Embed (`+pageembed+`) - -include::partial$plugin-files/plugin-file-list-pageembed.adoc[] - -[[permanent-pen]] -=== Permanent Pen (`+permanentpen+`) - -include::partial$plugin-files/plugin-file-list-permanentpen.adoc[] - -[[powerpaste]] -=== PowerPaste (`+powerpaste+`) - -include::partial$module-loading/admon-bundling-plugin-langs.adoc[] - -include::partial$plugin-files/plugin-file-list-powerpaste.adoc[] - -[[spell-checker]] -=== Spell Checker (`+tinymcespellchecker+`) - -include::partial$module-loading/admon-bundling-plugin-langs.adoc[] +=== Premium plugins -include::partial$plugin-files/plugin-file-list-tinymcespellchecker.adoc[] +[NOTE] +Currently `.zip` style bundling is only available for premium plugins. -[[autocorrect]] -=== Spelling Autocorrect (`+autocorrect+`) +include::partial$plugin-files/plugin-file-bundling-message.adoc[] include::partial$module-loading/admon-bundling-plugin-langs.adoc[] -include::partial$plugin-files/plugin-file-list-autocorrect.adoc[] - -[[table-of-contents]] -=== Table of Contents (`+tableofcontents+`) - -include::partial$module-loading/admon-bundling-plugin-langs.adoc[] - -include::partial$plugin-files/plugin-file-list-tableofcontents.adoc[] - [[community-plugins]] -== Community plugins - -[[list-styles]] -=== List Styles (`+advlist+`) - -include::partial$plugin-files/plugin-file-list-advlist.adoc[] - -[[anchor]] -=== Anchor (`+anchor+`) - -include::partial$plugin-files/plugin-file-list-anchor.adoc[] - -[[autolink]] -=== Autolink (`+autolink+`) - -include::partial$plugin-files/plugin-file-list-autolink.adoc[] - -[[autoresize]] -=== Autoresize (`+autoresize+`) - -include::partial$plugin-files/plugin-file-list-autoresize.adoc[] - -[[autosave]] -=== Autosave (`+autosave+`) - -include::partial$plugin-files/plugin-file-list-autosave.adoc[] +=== Community plugins -[[character-map]] -=== Character Map (`+charmap+`) +include::partial$plugin-files/plugin-file-bundling-message.adoc[] -include::partial$plugin-files/plugin-file-list-charmap.adoc[] - -[[code]] -=== Code (`+code+`) - -include::partial$plugin-files/plugin-file-list-code.adoc[] - -[[codesamplecodesample]] -=== Code Sample (`+codesample+`) - -include::partial$plugin-files/plugin-file-list-codesample.adoc[] - -[[directionality]] -=== Directionality (`+directionality+`) - -include::partial$plugin-files/plugin-file-list-directionality.adoc[] +include::partial$plugin-files/plugin-file-bundling-also-requires.adoc[] [[emoticons]] -=== Emoticons (`+emoticons+`) +==== Emoticons (`+emoticons+`) include::partial$plugin-files/plugin-file-list-emoticons.adoc[] -[[full-screen]] -=== Full Screen (`+fullscreen+`) - -include::partial$plugin-files/plugin-file-list-fullscreen.adoc[] - -[[help]] -=== Help (`+help+`) - -include::partial$plugin-files/plugin-file-list-help.adoc[] - -[[image]] -=== Image (`+image+`) - -include::partial$plugin-files/plugin-file-list-image.adoc[] - -[[import-css]] -=== Import CSS (`+importcss+`) - -include::partial$plugin-files/plugin-file-list-importcss.adoc[] - -[[insert-datetime]] -=== Insert Date/Time (`+insertdatetime+`) - -include::partial$plugin-files/plugin-file-list-insertdatetime.adoc[] - -[[link]] -=== Link (`+link+`) - -include::partial$plugin-files/plugin-file-list-link.adoc[] - -[[lists]] -=== Lists (`+lists+`) - -include::partial$plugin-files/plugin-file-list-lists.adoc[] - -[[media]] -=== Media (`+media+`) - -include::partial$plugin-files/plugin-file-list-media.adoc[] - -[[nonbreaking-space]] -=== Nonbreaking Space (`+nonbreaking+`) - -include::partial$plugin-files/plugin-file-list-nonbreaking.adoc[] - -[[page-break]] -=== Page Break (`+pagebreak+`) - -include::partial$plugin-files/plugin-file-list-pagebreak.adoc[] - -[[preview]] -=== Preview (`+preview+`) - -include::partial$plugin-files/plugin-file-list-preview.adoc[] - -[[quick-toolbar]] -=== Quick Toolbar (`+quickbars+`) - -include::partial$plugin-files/plugin-file-list-quickbars.adoc[] - -[[save]] -=== Save (`+save+`) - -include::partial$plugin-files/plugin-file-list-save.adoc[] - -[[search-and-replace]] -=== Search and Replace (`+searchreplace+`) - -include::partial$plugin-files/plugin-file-list-searchreplace.adoc[] - -[[table]] -=== Table (`+table+`) - -include::partial$plugin-files/plugin-file-list-table.adoc[] - -[[visual-blocks]] -=== Visual Blocks (`+visualblocks+`) - -include::partial$plugin-files/plugin-file-list-visualblocks.adoc[] - -[[visual-characters]] -=== Visual Characters (`+visualchars+`) - -include::partial$plugin-files/plugin-file-list-visualchars.adoc[] - -[[word-count]] -=== Word Count (`+wordcount+`) - -include::partial$plugin-files/plugin-file-list-wordcount.adoc[] - [[plugin-language-files]] -== Plugin language files +=== Plugin language files include::partial$module-loading/bundling-plugin-language-files.adoc[] \ No newline at end of file diff --git a/modules/ROOT/partials/module-loading/bundling-plugin-language-files.adoc b/modules/ROOT/partials/module-loading/bundling-plugin-language-files.adoc index 602ebcafe1..d58dac3256 100644 --- a/modules/ROOT/partials/module-loading/bundling-plugin-language-files.adoc +++ b/modules/ROOT/partials/module-loading/bundling-plugin-language-files.adoc @@ -1,43 +1,43 @@ -IMPORTANT: Replace `` with the specific plugin name when adding the plugin language files to your config. +IMPORTANT: Replace `++` placeholder with the specific `plugincode` when adding the plugin language files to your config. [source, js] ---- -./plugins//langs/ar.js -./plugins//langs/bg_BG.js -./plugins//langs/ca.js -./plugins//langs/cs.js -./plugins//langs/da.js -./plugins//langs/de.js -./plugins//langs/el.js -./plugins//langs/es.js -./plugins//langs/eu.js -./plugins//langs/fa.js -./plugins//langs/fi.js -./plugins//langs/fr_FR.js -./plugins//langs/he_IL.js -./plugins//langs/hi.js -./plugins//langs/hr.js -./plugins//langs/hu_HU.js -./plugins//langs/id.js -./plugins//langs/it.js -./plugins//langs/ja.js -./plugins//langs/kk.js -./plugins//langs/ko_KR.js -./plugins//langs/ms.js -./plugins//langs/nb_NO.js -./plugins//langs/nl.js -./plugins//langs/pl.js -./plugins//langs/pt_BR.js -./plugins//langs/pt_PT.js -./plugins//langs/ro.js -./plugins//langs/ru.js -./plugins//langs/sk.js -./plugins//langs/sl_SI.js -./plugins//langs/sv_SE.js -./plugins//langs/th_TH.js -./plugins//langs/tr.js -./plugins//langs/uk.js -./plugins//langs/vi.js -./plugins//langs/zh_CN.js -./plugins//langs/zh_TW.js +./plugins//langs/ar.js +./plugins//langs/bg_BG.js +./plugins//langs/ca.js +./plugins//langs/cs.js +./plugins//langs/da.js +./plugins//langs/de.js +./plugins//langs/el.js +./plugins//langs/es.js +./plugins//langs/eu.js +./plugins//langs/fa.js +./plugins//langs/fi.js +./plugins//langs/fr_FR.js +./plugins//langs/he_IL.js +./plugins//langs/hi.js +./plugins//langs/hr.js +./plugins//langs/hu_HU.js +./plugins//langs/id.js +./plugins//langs/it.js +./plugins//langs/ja.js +./plugins//langs/kk.js +./plugins//langs/ko_KR.js +./plugins//langs/ms.js +./plugins//langs/nb_NO.js +./plugins//langs/nl.js +./plugins//langs/pl.js +./plugins//langs/pt_BR.js +./plugins//langs/pt_PT.js +./plugins//langs/ro.js +./plugins//langs/ru.js +./plugins//langs/sk.js +./plugins//langs/sl_SI.js +./plugins//langs/sv_SE.js +./plugins//langs/th_TH.js +./plugins//langs/tr.js +./plugins//langs/uk.js +./plugins//langs/vi.js +./plugins//langs/zh_CN.js +./plugins//langs/zh_TW.js ---- \ No newline at end of file diff --git a/modules/ROOT/partials/module-loading/bundling-plugins-that-cant-bundle.adoc b/modules/ROOT/partials/module-loading/bundling-plugins-that-cant-bundle.adoc deleted file mode 100644 index 5423d522c6..0000000000 --- a/modules/ROOT/partials/module-loading/bundling-plugins-that-cant-bundle.adoc +++ /dev/null @@ -1,12 +0,0 @@ -[IMPORTANT] -==== -The following premium plugins *can not* be bundled if the {productname} version is earlier than **6.8.0**. However, if the {productname} version is equivalent to **v6.8.0** or **later**, the following premium plugins can be bundled: - -* Accessibility Checker (`+a11ychecker+`) -* Comments (`+tinycomments+`) -* Enhanced Code Editor (`+advcode+`) -* Enhanced Media Embed (`+mediaembed+`) -* Link Checker (`+linkchecker+`) -* Mentions (`+mentions+`) -* Page Embed (`+pageembed+`) -==== diff --git a/modules/ROOT/partials/module-loading/bundling-rollup-es6-npm_editor.adoc b/modules/ROOT/partials/module-loading/bundling-rollup-es6-npm_editor.adoc index 66a0fd0280..ce7dbbdfbd 100644 --- a/modules/ROOT/partials/module-loading/bundling-rollup-es6-npm_editor.adoc +++ b/modules/ROOT/partials/module-loading/bundling-rollup-es6-npm_editor.adoc @@ -28,11 +28,9 @@ import 'tinymce/plugins/link'; import 'tinymce/plugins/lists'; import 'tinymce/plugins/table'; -/* Import premium plugins */ +/* Import premium plugins by replacing */ /* NOTE: Download separately and add these to /src/plugins */ -/* import './plugins/checklist/plugin'; */ -/* import './plugins/powerpaste/plugin'; */ -/* import './plugins/powerpaste/js/wordimport'; */ +/* import './plugins/'; */ /* content UI CSS is required */ import contentUiSkinCss from 'tinymce/skins/ui/oxide/content.css'; @@ -51,4 +49,4 @@ export function render () { content_style: contentUiSkinCss.toString() + '\n' + contentCss.toString(), }); }; ----- +---- \ No newline at end of file diff --git a/modules/ROOT/partials/module-loading/bundling-rollup-es6-zip_editor.adoc b/modules/ROOT/partials/module-loading/bundling-rollup-es6-zip_editor.adoc index 9e26aa0024..f04de11c0a 100644 --- a/modules/ROOT/partials/module-loading/bundling-rollup-es6-zip_editor.adoc +++ b/modules/ROOT/partials/module-loading/bundling-rollup-es6-zip_editor.adoc @@ -20,19 +20,17 @@ import '../tinymce/js/tinymce/models/dom/model'; import '../tinymce/js/tinymce/skins/ui/oxide/skin.css'; /* Import plugins */ -import '../tinymce/js/tinymce/plugins/advlist/plugin'; -import '../tinymce/js/tinymce/plugins/code/plugin'; -import '../tinymce/js/tinymce/plugins/emoticons/plugin'; +import '../tinymce/js/tinymce/plugins/advlist'; +import '../tinymce/js/tinymce/plugins/code'; +import '../tinymce/js/tinymce/plugins/emoticons'; import '../tinymce/js/tinymce/plugins/emoticons/js/emojis'; -import '../tinymce/js/tinymce/plugins/link/plugin'; -import '../tinymce/js/tinymce/plugins/lists/plugin'; -import '../tinymce/js/tinymce/plugins/table/plugin'; +import '../tinymce/js/tinymce/plugins/link'; +import '../tinymce/js/tinymce/plugins/lists'; +import '../tinymce/js/tinymce/plugins/table'; /* Import premium plugins */ /* NOTE: Download separately and add these to /src/plugins */ -/* import './plugins/checklist/plugin'; */ -/* import './plugins/powerpaste/plugin'; */ -/* import './plugins/powerpaste/js/wordimport'; */ +/* import './plugins/'; */ /* content UI CSS is required */ import contentUiSkinCss from '../tinymce/js/tinymce/skins/ui/oxide/content.css'; @@ -51,4 +49,4 @@ export function render () { content_style: contentUiSkinCss.toString() + '\n' + contentCss.toString(), }); }; ----- +---- \ No newline at end of file diff --git a/modules/ROOT/partials/module-loading/bundling-vite-es6-npm_editor.adoc b/modules/ROOT/partials/module-loading/bundling-vite-es6-npm_editor.adoc index 176d1caed3..a26d8d2c51 100644 --- a/modules/ROOT/partials/module-loading/bundling-vite-es6-npm_editor.adoc +++ b/modules/ROOT/partials/module-loading/bundling-vite-es6-npm_editor.adoc @@ -32,9 +32,7 @@ import 'tinymce/plugins/table'; /* Import premium plugins */ /* NOTE: Download separately and add these to /src/plugins */ -/* import './plugins/checklist/plugin.js'; */ -/* import './plugins/powerpaste/plugin.js'; */ -/* import './plugins/powerpaste/js/wordimport.js'; */ +/* import './plugins/'; */ /* content UI CSS is required */ import contentUiSkinCss from 'tinymce/skins/ui/oxide/content.js'; diff --git a/modules/ROOT/partials/module-loading/bundling-webpack-cjs-zip_editor.adoc b/modules/ROOT/partials/module-loading/bundling-webpack-cjs-zip_editor.adoc index 5c8747bd2f..3440348359 100644 --- a/modules/ROOT/partials/module-loading/bundling-webpack-cjs-zip_editor.adoc +++ b/modules/ROOT/partials/module-loading/bundling-webpack-cjs-zip_editor.adoc @@ -20,13 +20,13 @@ require('../tinymce/js/tinymce/models/dom/model.js'); require('../tinymce/js/tinymce/skins/ui/oxide/skin.css'); /* Import plugins - include the relevant plugin in the 'plugins' option. */ -require('../tinymce/js/tinymce/plugins/advlist/plugin.js'); -require('../tinymce/js/tinymce/plugins/code/plugin.js'); -require('../tinymce/js/tinymce/plugins/emoticons/plugin.js'); +require('../tinymce/js/tinymce/plugins/advlist'); +require('../tinymce/js/tinymce/plugins/code'); +require('../tinymce/js/tinymce/plugins/emoticons'); require('../tinymce/js/tinymce/plugins/emoticons/js/emojis'); -require('../tinymce/js/tinymce/plugins/link/plugin.js'); -require('../tinymce/js/tinymce/plugins/lists/plugin.js'); -require('../tinymce/js/tinymce/plugins/table/plugin.js'); +require('../tinymce/js/tinymce/plugins/link'); +require('../tinymce/js/tinymce/plugins/lists'); +require('../tinymce/js/tinymce/plugins/table'); /* content UI CSS is required */ const contentUiSkinCss = require('../tinymce/js/tinymce/skins/ui/oxide/content.css'); diff --git a/modules/ROOT/partials/module-loading/bundling-webpack-es6-npm_editor.adoc b/modules/ROOT/partials/module-loading/bundling-webpack-es6-npm_editor.adoc index 66a0fd0280..0191d2a446 100644 --- a/modules/ROOT/partials/module-loading/bundling-webpack-es6-npm_editor.adoc +++ b/modules/ROOT/partials/module-loading/bundling-webpack-es6-npm_editor.adoc @@ -30,9 +30,7 @@ import 'tinymce/plugins/table'; /* Import premium plugins */ /* NOTE: Download separately and add these to /src/plugins */ -/* import './plugins/checklist/plugin'; */ -/* import './plugins/powerpaste/plugin'; */ -/* import './plugins/powerpaste/js/wordimport'; */ +/* import './plugins/'; */ /* content UI CSS is required */ import contentUiSkinCss from 'tinymce/skins/ui/oxide/content.css'; diff --git a/modules/ROOT/partials/module-loading/bundling-webpack-es6-zip_editor.adoc b/modules/ROOT/partials/module-loading/bundling-webpack-es6-zip_editor.adoc index 9e26aa0024..f04de11c0a 100644 --- a/modules/ROOT/partials/module-loading/bundling-webpack-es6-zip_editor.adoc +++ b/modules/ROOT/partials/module-loading/bundling-webpack-es6-zip_editor.adoc @@ -20,19 +20,17 @@ import '../tinymce/js/tinymce/models/dom/model'; import '../tinymce/js/tinymce/skins/ui/oxide/skin.css'; /* Import plugins */ -import '../tinymce/js/tinymce/plugins/advlist/plugin'; -import '../tinymce/js/tinymce/plugins/code/plugin'; -import '../tinymce/js/tinymce/plugins/emoticons/plugin'; +import '../tinymce/js/tinymce/plugins/advlist'; +import '../tinymce/js/tinymce/plugins/code'; +import '../tinymce/js/tinymce/plugins/emoticons'; import '../tinymce/js/tinymce/plugins/emoticons/js/emojis'; -import '../tinymce/js/tinymce/plugins/link/plugin'; -import '../tinymce/js/tinymce/plugins/lists/plugin'; -import '../tinymce/js/tinymce/plugins/table/plugin'; +import '../tinymce/js/tinymce/plugins/link'; +import '../tinymce/js/tinymce/plugins/lists'; +import '../tinymce/js/tinymce/plugins/table'; /* Import premium plugins */ /* NOTE: Download separately and add these to /src/plugins */ -/* import './plugins/checklist/plugin'; */ -/* import './plugins/powerpaste/plugin'; */ -/* import './plugins/powerpaste/js/wordimport'; */ +/* import './plugins/'; */ /* content UI CSS is required */ import contentUiSkinCss from '../tinymce/js/tinymce/skins/ui/oxide/content.css'; @@ -51,4 +49,4 @@ export function render () { content_style: contentUiSkinCss.toString() + '\n' + contentCss.toString(), }); }; ----- +---- \ No newline at end of file diff --git a/modules/ROOT/partials/plugin-apis/accordion-apis.adoc b/modules/ROOT/partials/plugin-apis/accordion-apis.adoc deleted file mode 100644 index 0adbbef325..0000000000 --- a/modules/ROOT/partials/plugin-apis/accordion-apis.adoc +++ /dev/null @@ -1,24 +0,0 @@ -[cols="1,1,4",options="header"] -|=== -|Name |Arguments |Description -| | | -| | | -| | | -| | | -|=== - - -.Examples -[source,js] ----- -// what this example does -tinymce.activeEditor.plugins.accordion.(); - -// what this example does -tinymce.activeEditor.plugins.accordion.(); - -// what this example does -tinymce.activeEditor.plugins.accordion.(); -// what this example does -tinymce.activeEditor.plugins.accordion.(); ----- diff --git a/modules/ROOT/partials/plugin-apis/revisionhistory-apis.adoc b/modules/ROOT/partials/plugin-apis/revisionhistory-apis.adoc new file mode 100644 index 0000000000..0d4d2fb468 --- /dev/null +++ b/modules/ROOT/partials/plugin-apis/revisionhistory-apis.adoc @@ -0,0 +1,26 @@ +[source,ts] +---- +interface PluginAPI { + diff: (originalHTML: string, changedHTML: string) => string +} +---- + +[[diff]] +=== `diff` +Returns a HTML string with annotations indicating the changes in `originalHTML` relative to `changedHTML`. The styling of annotations can be customized via xref:revisionhistory_diff_classes[`+revisionhistory_diff_classes+`] option. + +== Example +[source,js] +---- +const input1 = `

The banner is red

`; +const input2 = `

The flag is red

`; +tinymce.activeEditor.plugins.revisionhistory.diff(input1, input2); +/* +Expected output: +

The + bannerflag + is +red +

+*/ +---- \ No newline at end of file diff --git a/modules/ROOT/partials/plugin-files/plugin-file-bundling-also-requires.adoc b/modules/ROOT/partials/plugin-files/plugin-file-bundling-also-requires.adoc new file mode 100644 index 0000000000..ee9dd98e20 --- /dev/null +++ b/modules/ROOT/partials/plugin-files/plugin-file-bundling-also-requires.adoc @@ -0,0 +1,2 @@ +[TIP] +The below plugin also requires additional files to be included along side the xref:bundling-plugins.adoc#base-folder[base folder]. \ No newline at end of file diff --git a/modules/ROOT/partials/plugin-files/plugin-file-bundling-message.adoc b/modules/ROOT/partials/plugin-files/plugin-file-bundling-message.adoc new file mode 100644 index 0000000000..6ed4c19012 --- /dev/null +++ b/modules/ROOT/partials/plugin-files/plugin-file-bundling-message.adoc @@ -0,0 +1 @@ +When bundling, replace the `+plugincode+` with the specific plugins in your {productname} configuration. \ No newline at end of file diff --git a/modules/ROOT/partials/plugin-files/plugin-file-index.js.adoc b/modules/ROOT/partials/plugin-files/plugin-file-index.js.adoc new file mode 100644 index 0000000000..d6e51914c7 --- /dev/null +++ b/modules/ROOT/partials/plugin-files/plugin-file-index.js.adoc @@ -0,0 +1,9 @@ +[[base-folder]] +== Required base folder + +The below base folder is required for each plugin when bundling {productname}. + +[source, js] +---- +./plugins/ +---- \ No newline at end of file diff --git a/modules/ROOT/partials/plugin-files/plugin-file-list-a11ychecker.adoc b/modules/ROOT/partials/plugin-files/plugin-file-list-a11ychecker.adoc deleted file mode 100644 index 96654c8258..0000000000 --- a/modules/ROOT/partials/plugin-files/plugin-file-list-a11ychecker.adoc +++ /dev/null @@ -1,12 +0,0 @@ -.Base js file. -[source, js] ----- -./plugins/a11ychecker/plugin.js ----- - -.css or bundled css -[source, js] ----- -./plugins/a11ychecker/css/annotations.css // or -./plugins/a11ychecker/css/annotations.js // bundling requires v6.8.0 or later. ----- \ No newline at end of file diff --git a/modules/ROOT/partials/plugin-files/plugin-file-list-advcode.adoc b/modules/ROOT/partials/plugin-files/plugin-file-list-advcode.adoc deleted file mode 100644 index 9e7c646d1a..0000000000 --- a/modules/ROOT/partials/plugin-files/plugin-file-list-advcode.adoc +++ /dev/null @@ -1,19 +0,0 @@ -.Base js file -[source, js] ----- -./plugins/advcode/plugin.js ----- - -.css or bundled css -[source, js] ----- -./plugins/advcode/codemirror.min.css //or -./plugins/advcode/codemirror_css.js // bundling requires v6.8.0 or later. ----- - -.other js files -[source, js] ----- -./plugins/advcode/codemirror.min.js -./plugins/advcode/customeditor.js ----- \ No newline at end of file diff --git a/modules/ROOT/partials/plugin-files/plugin-file-list-advlist.adoc b/modules/ROOT/partials/plugin-files/plugin-file-list-advlist.adoc deleted file mode 100644 index 1b3bb7d9cc..0000000000 --- a/modules/ROOT/partials/plugin-files/plugin-file-list-advlist.adoc +++ /dev/null @@ -1,5 +0,0 @@ -.Base js file -[source, js] ----- -./plugins/advlist/plugin.js ----- diff --git a/modules/ROOT/partials/plugin-files/plugin-file-list-advtable.adoc b/modules/ROOT/partials/plugin-files/plugin-file-list-advtable.adoc deleted file mode 100644 index 318c0748f1..0000000000 --- a/modules/ROOT/partials/plugin-files/plugin-file-list-advtable.adoc +++ /dev/null @@ -1,5 +0,0 @@ -.Base js file -[source, js] ----- -./plugins/advtable/plugin.js ----- diff --git a/modules/ROOT/partials/plugin-files/plugin-file-list-anchor.adoc b/modules/ROOT/partials/plugin-files/plugin-file-list-anchor.adoc deleted file mode 100644 index 46ead7f860..0000000000 --- a/modules/ROOT/partials/plugin-files/plugin-file-list-anchor.adoc +++ /dev/null @@ -1,5 +0,0 @@ -.Base js file -[source, js] ----- -./plugins/anchor/plugin.js ----- diff --git a/modules/ROOT/partials/plugin-files/plugin-file-list-autocorrect.adoc b/modules/ROOT/partials/plugin-files/plugin-file-list-autocorrect.adoc deleted file mode 100644 index 3761112a86..0000000000 --- a/modules/ROOT/partials/plugin-files/plugin-file-list-autocorrect.adoc +++ /dev/null @@ -1,5 +0,0 @@ -.Base js file -[source, js] ----- -./plugins/autocorrect/plugin.js ----- \ No newline at end of file diff --git a/modules/ROOT/partials/plugin-files/plugin-file-list-autolink.adoc b/modules/ROOT/partials/plugin-files/plugin-file-list-autolink.adoc deleted file mode 100644 index 5302b7ab94..0000000000 --- a/modules/ROOT/partials/plugin-files/plugin-file-list-autolink.adoc +++ /dev/null @@ -1,5 +0,0 @@ -.Base js file -[source, js] ----- -./plugins/autolink/plugin.js ----- diff --git a/modules/ROOT/partials/plugin-files/plugin-file-list-autoresize.adoc b/modules/ROOT/partials/plugin-files/plugin-file-list-autoresize.adoc deleted file mode 100644 index a123e339d9..0000000000 --- a/modules/ROOT/partials/plugin-files/plugin-file-list-autoresize.adoc +++ /dev/null @@ -1,5 +0,0 @@ -.Base js file -[source, js] ----- -./plugins/autoresize/plugin.js ----- diff --git a/modules/ROOT/partials/plugin-files/plugin-file-list-autosave.adoc b/modules/ROOT/partials/plugin-files/plugin-file-list-autosave.adoc deleted file mode 100644 index f58d66cc5a..0000000000 --- a/modules/ROOT/partials/plugin-files/plugin-file-list-autosave.adoc +++ /dev/null @@ -1,5 +0,0 @@ -.Base js file -[source, js] ----- -./plugins/autosave/plugin.js ----- \ No newline at end of file diff --git a/modules/ROOT/partials/plugin-files/plugin-file-list-casechange.adoc b/modules/ROOT/partials/plugin-files/plugin-file-list-casechange.adoc deleted file mode 100644 index c37e517350..0000000000 --- a/modules/ROOT/partials/plugin-files/plugin-file-list-casechange.adoc +++ /dev/null @@ -1,5 +0,0 @@ -.Base js file -[source, js] ----- -./plugins/casechange/plugin.js ----- diff --git a/modules/ROOT/partials/plugin-files/plugin-file-list-charmap.adoc b/modules/ROOT/partials/plugin-files/plugin-file-list-charmap.adoc deleted file mode 100644 index 0febba14b9..0000000000 --- a/modules/ROOT/partials/plugin-files/plugin-file-list-charmap.adoc +++ /dev/null @@ -1,5 +0,0 @@ -.Base js file -[source, js] ----- -./plugins/charmap/plugin.js ----- \ No newline at end of file diff --git a/modules/ROOT/partials/plugin-files/plugin-file-list-checklist.adoc b/modules/ROOT/partials/plugin-files/plugin-file-list-checklist.adoc deleted file mode 100644 index a1f3cff071..0000000000 --- a/modules/ROOT/partials/plugin-files/plugin-file-list-checklist.adoc +++ /dev/null @@ -1,5 +0,0 @@ -.Base js file -[source, js] ----- -./plugins/checklist/plugin.js ----- \ No newline at end of file diff --git a/modules/ROOT/partials/plugin-files/plugin-file-list-code.adoc b/modules/ROOT/partials/plugin-files/plugin-file-list-code.adoc deleted file mode 100644 index 7bef9a5371..0000000000 --- a/modules/ROOT/partials/plugin-files/plugin-file-list-code.adoc +++ /dev/null @@ -1,5 +0,0 @@ -.Base js file -[source, js] ----- -./plugins/code/plugin.js ----- diff --git a/modules/ROOT/partials/plugin-files/plugin-file-list-codesample.adoc b/modules/ROOT/partials/plugin-files/plugin-file-list-codesample.adoc deleted file mode 100644 index c631f9992c..0000000000 --- a/modules/ROOT/partials/plugin-files/plugin-file-list-codesample.adoc +++ /dev/null @@ -1,5 +0,0 @@ -.Base js file -[source, js] ----- -./plugins/codesample/plugin.js ----- diff --git a/modules/ROOT/partials/plugin-files/plugin-file-list-directionality.adoc b/modules/ROOT/partials/plugin-files/plugin-file-list-directionality.adoc deleted file mode 100644 index 237cf87c11..0000000000 --- a/modules/ROOT/partials/plugin-files/plugin-file-list-directionality.adoc +++ /dev/null @@ -1,5 +0,0 @@ -.Base js file -[source, js] ----- -./plugins/directionality/plugin.js ----- diff --git a/modules/ROOT/partials/plugin-files/plugin-file-list-editimage.adoc b/modules/ROOT/partials/plugin-files/plugin-file-list-editimage.adoc deleted file mode 100644 index cd6f1de99d..0000000000 --- a/modules/ROOT/partials/plugin-files/plugin-file-list-editimage.adoc +++ /dev/null @@ -1,5 +0,0 @@ -.Base js file -[source, js] ----- -./plugins/editimage/plugin.js ----- diff --git a/modules/ROOT/partials/plugin-files/plugin-file-list-emoticons.adoc b/modules/ROOT/partials/plugin-files/plugin-file-list-emoticons.adoc index 71f0922db5..c835128770 100644 --- a/modules/ROOT/partials/plugin-files/plugin-file-list-emoticons.adoc +++ b/modules/ROOT/partials/plugin-files/plugin-file-list-emoticons.adoc @@ -1,7 +1,9 @@ -.Base js file +.Requires other js files [source, js] ---- -./plugins/emoticons/plugin.js ./plugins/emoticons/js/emojiimages.js ./plugins/emoticons/js/emojis.js ---- + +[NOTE] +Only one of the above `.js` files are required, depending on which one is chosen through the `emoticons_database` setting. \ No newline at end of file diff --git a/modules/ROOT/partials/plugin-files/plugin-file-list-exportpdf.adoc b/modules/ROOT/partials/plugin-files/plugin-file-list-exportpdf.adoc deleted file mode 100644 index 00513e455e..0000000000 --- a/modules/ROOT/partials/plugin-files/plugin-file-list-exportpdf.adoc +++ /dev/null @@ -1,5 +0,0 @@ -.Base js file -[source, js] ----- -./plugins/exportpdf/plugin.js ----- \ No newline at end of file diff --git a/modules/ROOT/partials/plugin-files/plugin-file-list-exportword.adoc b/modules/ROOT/partials/plugin-files/plugin-file-list-exportword.adoc deleted file mode 100644 index cf939ad20b..0000000000 --- a/modules/ROOT/partials/plugin-files/plugin-file-list-exportword.adoc +++ /dev/null @@ -1,5 +0,0 @@ -.Base js file -[source, js] ----- -./plugins/exportword/plugin.js ----- \ No newline at end of file diff --git a/modules/ROOT/partials/plugin-files/plugin-file-list-footnotes.adoc b/modules/ROOT/partials/plugin-files/plugin-file-list-footnotes.adoc deleted file mode 100644 index f142867931..0000000000 --- a/modules/ROOT/partials/plugin-files/plugin-file-list-footnotes.adoc +++ /dev/null @@ -1,5 +0,0 @@ -.Base js file -[source, js] ----- -./plugins/footnotes/plugin.js ----- diff --git a/modules/ROOT/partials/plugin-files/plugin-file-list-formatpainter.adoc b/modules/ROOT/partials/plugin-files/plugin-file-list-formatpainter.adoc deleted file mode 100644 index 8cd2b84be2..0000000000 --- a/modules/ROOT/partials/plugin-files/plugin-file-list-formatpainter.adoc +++ /dev/null @@ -1,5 +0,0 @@ -.Base js file -[source, js] ----- -./plugins/formatpainter/plugin.js ----- diff --git a/modules/ROOT/partials/plugin-files/plugin-file-list-fullscreen.adoc b/modules/ROOT/partials/plugin-files/plugin-file-list-fullscreen.adoc deleted file mode 100644 index 8c06cc566b..0000000000 --- a/modules/ROOT/partials/plugin-files/plugin-file-list-fullscreen.adoc +++ /dev/null @@ -1,5 +0,0 @@ -.Base js file -[source, js] ----- -./plugins/fullscreen/plugin.js ----- \ No newline at end of file diff --git a/modules/ROOT/partials/plugin-files/plugin-file-list-help.adoc b/modules/ROOT/partials/plugin-files/plugin-file-list-help.adoc deleted file mode 100644 index 513eee5909..0000000000 --- a/modules/ROOT/partials/plugin-files/plugin-file-list-help.adoc +++ /dev/null @@ -1,5 +0,0 @@ -.Base js file -[source, js] ----- -./plugins/help/plugin.js ----- diff --git a/modules/ROOT/partials/plugin-files/plugin-file-list-image.adoc b/modules/ROOT/partials/plugin-files/plugin-file-list-image.adoc deleted file mode 100644 index a9c2602394..0000000000 --- a/modules/ROOT/partials/plugin-files/plugin-file-list-image.adoc +++ /dev/null @@ -1,5 +0,0 @@ -.Base js file -[source, js] ----- -./plugins/image/plugin.js ----- diff --git a/modules/ROOT/partials/plugin-files/plugin-file-list-importcss.adoc b/modules/ROOT/partials/plugin-files/plugin-file-list-importcss.adoc deleted file mode 100644 index ff9ffc5554..0000000000 --- a/modules/ROOT/partials/plugin-files/plugin-file-list-importcss.adoc +++ /dev/null @@ -1,5 +0,0 @@ -.Base js file -[source, js] ----- -./plugins/importcss/plugin.js ----- diff --git a/modules/ROOT/partials/plugin-files/plugin-file-list-importword.adoc b/modules/ROOT/partials/plugin-files/plugin-file-list-importword.adoc deleted file mode 100644 index 2456f79fc2..0000000000 --- a/modules/ROOT/partials/plugin-files/plugin-file-list-importword.adoc +++ /dev/null @@ -1,5 +0,0 @@ -.Base js file -[source, js] ----- -./plugins/importword/plugin.js ----- \ No newline at end of file diff --git a/modules/ROOT/partials/plugin-files/plugin-file-list-insertdatetime.adoc b/modules/ROOT/partials/plugin-files/plugin-file-list-insertdatetime.adoc deleted file mode 100644 index e3075e73cb..0000000000 --- a/modules/ROOT/partials/plugin-files/plugin-file-list-insertdatetime.adoc +++ /dev/null @@ -1,5 +0,0 @@ -.Base js file -[source, js] ----- -./plugins/insertdatetime/plugin.js ----- diff --git a/modules/ROOT/partials/plugin-files/plugin-file-list-link.adoc b/modules/ROOT/partials/plugin-files/plugin-file-list-link.adoc deleted file mode 100644 index 14eacc69af..0000000000 --- a/modules/ROOT/partials/plugin-files/plugin-file-list-link.adoc +++ /dev/null @@ -1,5 +0,0 @@ -.Base js file -[source, js] ----- -./plugins/link/plugin.js ----- \ No newline at end of file diff --git a/modules/ROOT/partials/plugin-files/plugin-file-list-linkchecker.adoc b/modules/ROOT/partials/plugin-files/plugin-file-list-linkchecker.adoc deleted file mode 100644 index 8dce71103c..0000000000 --- a/modules/ROOT/partials/plugin-files/plugin-file-list-linkchecker.adoc +++ /dev/null @@ -1,12 +0,0 @@ -.Base js file -[source, js] ----- -./plugins/linkchecker/plugin.js ----- - -.css or bundled css -[source, js] ----- -./plugins/linkchecker/content.min.css //or -./plugins/linkchecker/content_css.js // bundling requires v6.8.0 or later. ----- \ No newline at end of file diff --git a/modules/ROOT/partials/plugin-files/plugin-file-list-lists.adoc b/modules/ROOT/partials/plugin-files/plugin-file-list-lists.adoc deleted file mode 100644 index e3cd76456b..0000000000 --- a/modules/ROOT/partials/plugin-files/plugin-file-list-lists.adoc +++ /dev/null @@ -1,5 +0,0 @@ -.Base js file -[source, js] ----- -./plugins/lists/plugin.js ----- diff --git a/modules/ROOT/partials/plugin-files/plugin-file-list-markdown.adoc b/modules/ROOT/partials/plugin-files/plugin-file-list-markdown.adoc deleted file mode 100644 index 5bbb27b707..0000000000 --- a/modules/ROOT/partials/plugin-files/plugin-file-list-markdown.adoc +++ /dev/null @@ -1,5 +0,0 @@ -.Base js file -[source, js] ----- -./plugins/markdown/plugin.js ----- \ No newline at end of file diff --git a/modules/ROOT/partials/plugin-files/plugin-file-list-media.adoc b/modules/ROOT/partials/plugin-files/plugin-file-list-media.adoc deleted file mode 100644 index aac8d116e5..0000000000 --- a/modules/ROOT/partials/plugin-files/plugin-file-list-media.adoc +++ /dev/null @@ -1,5 +0,0 @@ -.Base js file -[source, js] ----- -./plugins/media/plugin.js ----- diff --git a/modules/ROOT/partials/plugin-files/plugin-file-list-mediaembed.adoc b/modules/ROOT/partials/plugin-files/plugin-file-list-mediaembed.adoc deleted file mode 100644 index f1364d71a1..0000000000 --- a/modules/ROOT/partials/plugin-files/plugin-file-list-mediaembed.adoc +++ /dev/null @@ -1,12 +0,0 @@ -.Base js file -[source, js] ----- -./plugins/mediaembed/plugin.js ----- - -.css or bundled css -[source, js] ----- -./plugins/mediaembed/content.min.css //or -./plugins/mediaembed/content_css.js // bundling requires v6.8.0 or later. ----- diff --git a/modules/ROOT/partials/plugin-files/plugin-file-list-mentions.adoc b/modules/ROOT/partials/plugin-files/plugin-file-list-mentions.adoc deleted file mode 100644 index 0d76a3595a..0000000000 --- a/modules/ROOT/partials/plugin-files/plugin-file-list-mentions.adoc +++ /dev/null @@ -1,12 +0,0 @@ -.Base js file -[source, js] ----- -./plugins/mentions/plugin.js ----- - -.css or bundled css -[source, js] ----- -./plugins/mentions/css/mentions.css //or -./plugins/mentions/css/mentions.js // bundling requires v6.8.0 or later. ----- \ No newline at end of file diff --git a/modules/ROOT/partials/plugin-files/plugin-file-list-mergetags.adoc b/modules/ROOT/partials/plugin-files/plugin-file-list-mergetags.adoc deleted file mode 100644 index 85cc860a09..0000000000 --- a/modules/ROOT/partials/plugin-files/plugin-file-list-mergetags.adoc +++ /dev/null @@ -1,5 +0,0 @@ -.Base js file -[source, js] ----- -./plugins/mergetags/plugin.js ----- diff --git a/modules/ROOT/partials/plugin-files/plugin-file-list-nonbreaking.adoc b/modules/ROOT/partials/plugin-files/plugin-file-list-nonbreaking.adoc deleted file mode 100644 index bda47311c0..0000000000 --- a/modules/ROOT/partials/plugin-files/plugin-file-list-nonbreaking.adoc +++ /dev/null @@ -1,5 +0,0 @@ -.Base js file -[source, js] ----- -./plugins/nonbreaking/plugin.js ----- diff --git a/modules/ROOT/partials/plugin-files/plugin-file-list-pagebreak.adoc b/modules/ROOT/partials/plugin-files/plugin-file-list-pagebreak.adoc deleted file mode 100644 index e796db7f97..0000000000 --- a/modules/ROOT/partials/plugin-files/plugin-file-list-pagebreak.adoc +++ /dev/null @@ -1,5 +0,0 @@ -.Base js file -[source, js] ----- -./plugins/pagebreak/plugin.js ----- diff --git a/modules/ROOT/partials/plugin-files/plugin-file-list-pageembed.adoc b/modules/ROOT/partials/plugin-files/plugin-file-list-pageembed.adoc deleted file mode 100644 index 635a839e6d..0000000000 --- a/modules/ROOT/partials/plugin-files/plugin-file-list-pageembed.adoc +++ /dev/null @@ -1,12 +0,0 @@ -.Base js file -[source, js] ----- -./plugins/pageembed/plugin.js ----- - -.css or bundled css -[source, js] ----- -./plugins/pageembed/css/empa30.css //or -./plugins/pageembed/css/empa30.js // bundling requires v6.8.0 or later. ----- diff --git a/modules/ROOT/partials/plugin-files/plugin-file-list-permanentpen.adoc b/modules/ROOT/partials/plugin-files/plugin-file-list-permanentpen.adoc deleted file mode 100644 index 716902cd5c..0000000000 --- a/modules/ROOT/partials/plugin-files/plugin-file-list-permanentpen.adoc +++ /dev/null @@ -1,5 +0,0 @@ -.Base js file -[source, js] ----- -./plugins/permanentpen/plugin.js ----- \ No newline at end of file diff --git a/modules/ROOT/partials/plugin-files/plugin-file-list-powerpaste.adoc b/modules/ROOT/partials/plugin-files/plugin-file-list-powerpaste.adoc deleted file mode 100644 index 35ef74418f..0000000000 --- a/modules/ROOT/partials/plugin-files/plugin-file-list-powerpaste.adoc +++ /dev/null @@ -1,11 +0,0 @@ -.Base js file -[source, js] ----- -./plugins/powerpaste/plugin.js ----- - -.other js files -[source, js] ----- -./plugins/powerpaste/js/wordimport.js ----- \ No newline at end of file diff --git a/modules/ROOT/partials/plugin-files/plugin-file-list-preview.adoc b/modules/ROOT/partials/plugin-files/plugin-file-list-preview.adoc deleted file mode 100644 index ca2a54702d..0000000000 --- a/modules/ROOT/partials/plugin-files/plugin-file-list-preview.adoc +++ /dev/null @@ -1,5 +0,0 @@ -.Base js file -[source, js] ----- -./plugins/preview/plugin.js ----- diff --git a/modules/ROOT/partials/plugin-files/plugin-file-list-quickbars.adoc b/modules/ROOT/partials/plugin-files/plugin-file-list-quickbars.adoc deleted file mode 100644 index 123c58c438..0000000000 --- a/modules/ROOT/partials/plugin-files/plugin-file-list-quickbars.adoc +++ /dev/null @@ -1,5 +0,0 @@ -.Base js file -[source, js] ----- -./plugins/quickbars/plugin.js ----- diff --git a/modules/ROOT/partials/plugin-files/plugin-file-list-save.adoc b/modules/ROOT/partials/plugin-files/plugin-file-list-save.adoc deleted file mode 100644 index 0623d5b80f..0000000000 --- a/modules/ROOT/partials/plugin-files/plugin-file-list-save.adoc +++ /dev/null @@ -1,5 +0,0 @@ -.Base js file -[source, js] ----- -./plugins/save/plugin.js ----- diff --git a/modules/ROOT/partials/plugin-files/plugin-file-list-searchreplace.adoc b/modules/ROOT/partials/plugin-files/plugin-file-list-searchreplace.adoc deleted file mode 100644 index 6c89e4a13f..0000000000 --- a/modules/ROOT/partials/plugin-files/plugin-file-list-searchreplace.adoc +++ /dev/null @@ -1,5 +0,0 @@ -.Base js file -[source, js] ----- -./plugins/searchreplace/plugin.js ----- diff --git a/modules/ROOT/partials/plugin-files/plugin-file-list-table.adoc b/modules/ROOT/partials/plugin-files/plugin-file-list-table.adoc deleted file mode 100644 index a2fa6e49d7..0000000000 --- a/modules/ROOT/partials/plugin-files/plugin-file-list-table.adoc +++ /dev/null @@ -1,5 +0,0 @@ -.Base js file -[source, js] ----- -./plugins/table/plugin.js ----- \ No newline at end of file diff --git a/modules/ROOT/partials/plugin-files/plugin-file-list-tableofcontents.adoc b/modules/ROOT/partials/plugin-files/plugin-file-list-tableofcontents.adoc deleted file mode 100644 index 9599110120..0000000000 --- a/modules/ROOT/partials/plugin-files/plugin-file-list-tableofcontents.adoc +++ /dev/null @@ -1,5 +0,0 @@ -.Base js file -[source, js] ----- -./plugins/tableofcontents/plugin.js ----- diff --git a/modules/ROOT/partials/plugin-files/plugin-file-list-tinycomments.adoc b/modules/ROOT/partials/plugin-files/plugin-file-list-tinycomments.adoc deleted file mode 100644 index dcd3744dd9..0000000000 --- a/modules/ROOT/partials/plugin-files/plugin-file-list-tinycomments.adoc +++ /dev/null @@ -1,18 +0,0 @@ -.Base js file -[source, js] ----- -./plugins/tinycomments/plugin.js ----- - -.css or bundled css -[source, js] ----- -./plugins/tinycomments/css/tinycomments.css //or -./plugins/tinycomments/css/tinycomments.js // bundling requires v6.8.0 or later. ----- - -.other js files -[source, js] ----- -./plugins/tinycomments/js/tinycomments-sidebar.js ----- \ No newline at end of file diff --git a/modules/ROOT/partials/plugin-files/plugin-file-list-tinymcespellchecker.adoc b/modules/ROOT/partials/plugin-files/plugin-file-list-tinymcespellchecker.adoc deleted file mode 100644 index f078bb8250..0000000000 --- a/modules/ROOT/partials/plugin-files/plugin-file-list-tinymcespellchecker.adoc +++ /dev/null @@ -1,5 +0,0 @@ -.Base js file -[source, js] ----- -./plugins/tinymcespellchecker/plugin.js ----- diff --git a/modules/ROOT/partials/plugin-files/plugin-file-list-visualblocks.adoc b/modules/ROOT/partials/plugin-files/plugin-file-list-visualblocks.adoc deleted file mode 100644 index c90153f2aa..0000000000 --- a/modules/ROOT/partials/plugin-files/plugin-file-list-visualblocks.adoc +++ /dev/null @@ -1,5 +0,0 @@ -.Base js file -[source, js] ----- -./plugins/visualblocks/plugin.js ----- diff --git a/modules/ROOT/partials/plugin-files/plugin-file-list-visualchars.adoc b/modules/ROOT/partials/plugin-files/plugin-file-list-visualchars.adoc deleted file mode 100644 index a7fe145542..0000000000 --- a/modules/ROOT/partials/plugin-files/plugin-file-list-visualchars.adoc +++ /dev/null @@ -1,5 +0,0 @@ -.Base js file -[source, js] ----- -./plugins/visualchars/plugin.js ----- diff --git a/modules/ROOT/partials/plugin-files/plugin-file-list-wordcount.adoc b/modules/ROOT/partials/plugin-files/plugin-file-list-wordcount.adoc deleted file mode 100644 index cc01decc10..0000000000 --- a/modules/ROOT/partials/plugin-files/plugin-file-list-wordcount.adoc +++ /dev/null @@ -1,5 +0,0 @@ -.Base js file -[source, js] ----- -./plugins/wordcount/plugin.js ----- diff --git a/modules/ROOT/partials/toolbar-button-ids/math-toolbar-buttons.adoc b/modules/ROOT/partials/toolbar-button-ids/math-toolbar-buttons.adoc new file mode 100644 index 0000000000..640532f480 --- /dev/null +++ b/modules/ROOT/partials/toolbar-button-ids/math-toolbar-buttons.adoc @@ -0,0 +1,5 @@ +[cols="1,3",options="header"] +|=== +|Toolbar button identifier |Description +|`+math+` |Opens the math modal dialog. +|=== \ No newline at end of file diff --git a/package.json b/package.json index 7997a94896..9a24a18b76 100644 --- a/package.json +++ b/package.json @@ -13,7 +13,7 @@ "clean": "rm -rf ./build", "nodemon": "nodemon --exec yarn antora ./antora-playbook.yml", "nodemon-dev": "nodemon --exec yarn antora ./antora-playbook-local.yml", - "server": "http-server build/site/ --port 4000", + "server": "http-server build/site/ --port 4000 -a localhost", "serve": "npm-run-all -p nodemon server", "serve-dev": "npm-run-all -p nodemon-dev server", "start": "yarn clean && yarn serve", From ee3a568190fc798c97363da28d760e06af43618e Mon Sep 17 00:00:00 2001 From: Mitchell Crompton Date: Wed, 8 May 2024 12:59:11 +1000 Subject: [PATCH 12/97] DOC-2375: Fix errors (#3289) --- modules/ROOT/pages/math.adoc | 2 +- modules/ROOT/partials/commands/math-cmds.adoc | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/ROOT/pages/math.adoc b/modules/ROOT/pages/math.adoc index a60505837d..94046b7d90 100644 --- a/modules/ROOT/pages/math.adoc +++ b/modules/ROOT/pages/math.adoc @@ -1,6 +1,6 @@ = Math plugin :navtitle: Math Plugin -:description: {pluginname} plugin allows users to insert math equations into the {productname} editor. +:description: Math plugin allows users to insert math equations into the {productname} editor. :description_short: Insert `++` elements into {productname}. :keywords: plugin, math, formulas :pluginname: Math diff --git a/modules/ROOT/partials/commands/math-cmds.adoc b/modules/ROOT/partials/commands/math-cmds.adoc index 40c90b0f45..db31fc2c0f 100644 --- a/modules/ROOT/partials/commands/math-cmds.adoc +++ b/modules/ROOT/partials/commands/math-cmds.adoc @@ -1,7 +1,7 @@ [cols="1,3",options="header"] |=== |Command |Description -|Math |This command opens the {pluginname} dialog. +|Math |This command opens the Math dialog. |=== .Examples From 3b09ff718be52cf72c2a0d8fedb5a19e8656eeb1 Mon Sep 17 00:00:00 2001 From: Karl Kemister-Sheppard Date: Wed, 8 May 2024 15:46:05 +1000 Subject: [PATCH 13/97] DOC-2364: api-version bump for TinyMCE 7.1. (#3290) --- .api-version | 2 +- .../ROOT/pages/apis/tinymce.dom.domutils.adoc | 4 ++ .../pages/apis/tinymce.dom.eventutils.adoc | 4 ++ modules/ROOT/pages/apis/tinymce.editor.adoc | 13 +++- .../apis/tinymce.editor.ui.registry.adoc | 60 +++++++++++++++++++ .../ROOT/pages/apis/tinymce.editor.ui.ui.adoc | 8 +++ .../pages/apis/tinymce.editoroptions.adoc | 24 ++++++++ .../apis/tinymce.notificationmanager.adoc | 4 ++ modules/ROOT/pages/apis/tinymce.plugin.adoc | 8 +++ modules/ROOT/pages/apis/tinymce.root.adoc | 24 ++++++++ modules/ROOT/pages/apis/tinymce.theme.adoc | 8 +++ .../apis/tinymce.util.eventdispatcher.adoc | 4 ++ .../pages/apis/tinymce.util.observable.adoc | 4 ++ 13 files changed, 165 insertions(+), 2 deletions(-) diff --git a/.api-version b/.api-version index 73a86b1970..3769235d3e 100644 --- a/.api-version +++ b/.api-version @@ -1 +1 @@ -7.0.1 \ No newline at end of file +7.1.0 \ No newline at end of file diff --git a/modules/ROOT/pages/apis/tinymce.dom.domutils.adoc b/modules/ROOT/pages/apis/tinymce.dom.domutils.adoc index eaf1691059..f524798708 100644 --- a/modules/ROOT/pages/apis/tinymce.dom.domutils.adoc +++ b/modules/ROOT/pages/apis/tinymce.dom.domutils.adoc @@ -48,6 +48,8 @@ available. If it's not, it will fall back to the custom TinyMCE implementation.| |xref:#encode[encode()]|Entity encodes a string. This method encodes the most common entities, such as `<`, `>`, `"` and `&`.|`xref:apis/tinymce.dom.domutils.adoc[DOMUtils]` |xref:#findCommonAncestor[findCommonAncestor()]|Find the common ancestor of two elements. This is a shorter method than using the DOM Range logic.|`xref:apis/tinymce.dom.domutils.adoc[DOMUtils]` |xref:#fire[fire()]|Fires the specified event name and optional object on the specified target. + + __Deprecated in TinyMCE 6.0 and has been marked for removal in TinyMCE 7.0. Use `dispatch` instead.__|`xref:apis/tinymce.dom.domutils.adoc[DOMUtils]` |xref:#get[get()]|Returns the specified element by ID or the input element if it isn't a string.|`xref:apis/tinymce.dom.domutils.adoc[DOMUtils]` |xref:#getAttrib[getAttrib()]|Returns the specified attribute by name.|`xref:apis/tinymce.dom.domutils.adoc[DOMUtils]` @@ -396,6 +398,8 @@ Find the common ancestor of two elements. This is a shorter method than using th fire(target: Node | Document | Window, name: String, evt: Object): Event ---- Fires the specified event name and optional object on the specified target. + + __Deprecated in TinyMCE 6.0 and has been marked for removal in TinyMCE 7.0. Use `dispatch` instead.__ ==== Parameters diff --git a/modules/ROOT/pages/apis/tinymce.dom.eventutils.adoc b/modules/ROOT/pages/apis/tinymce.dom.eventutils.adoc index 0a97e77422..71e2f5d1d3 100644 --- a/modules/ROOT/pages/apis/tinymce.dom.eventutils.adoc +++ b/modules/ROOT/pages/apis/tinymce.dom.eventutils.adoc @@ -19,6 +19,8 @@ This class wraps the browsers native event logic with more convenient methods. listeners to child nodes within that target.|`xref:apis/tinymce.dom.eventutils.adoc[EventUtils]` |xref:#dispatch[dispatch()]|Dispatches the specified event on the specified target.|`xref:apis/tinymce.dom.eventutils.adoc[EventUtils]` |xref:#fire[fire()]|Fires the specified event on the specified target. + + __Deprecated in TinyMCE 6.0 and has been marked for removal in TinyMCE 7.0. Use `dispatch` instead.__|`xref:apis/tinymce.dom.eventutils.adoc[EventUtils]` |xref:#unbind[unbind()]|Unbinds the specified event by name, name and callback or all events on the target.|`xref:apis/tinymce.dom.eventutils.adoc[EventUtils]` |=== @@ -93,6 +95,8 @@ Dispatches the specified event on the specified target. fire(target: Object, name: String, args: Object): EventUtils ---- Fires the specified event on the specified target. + + __Deprecated in TinyMCE 6.0 and has been marked for removal in TinyMCE 7.0. Use `dispatch` instead.__ ==== Parameters diff --git a/modules/ROOT/pages/apis/tinymce.editor.adoc b/modules/ROOT/pages/apis/tinymce.editor.adoc index f07065caf5..d67d64611b 100644 --- a/modules/ROOT/pages/apis/tinymce.editor.adoc +++ b/modules/ROOT/pages/apis/tinymce.editor.adoc @@ -83,12 +83,13 @@ manipulation functions.|`xref:apis/tinymce.editor.adoc[Editor]` that could leak memory. This method will be called automatically when the page is unloaded but you can also call it directly if you know what you are doing.|`xref:apis/tinymce.editor.adoc[Editor]` |xref:#dispatch[dispatch()]|Dispatches the specified event by name. Consult the - link:https://www.tiny.cloud/docs/tinymce/7/events/[event reference] for more details on each event.|`xref:apis/tinymce.util.observable.adoc[Observable]` |xref:#execCommand[execCommand()]|Executes a registered command on the current instance. A list of available commands can be found in the tinymce command identifiers documentation.|`xref:apis/tinymce.editor.adoc[Editor]` |xref:#fire[fire()]|Fires the specified event by name. Consult the link:https://www.tiny.cloud/docs/tinymce/7/events/[event reference] for more details on each event. + + __Deprecated in TinyMCE 6.0 and has been marked for removal in TinyMCE 7.0. Use `dispatch` instead.__|`xref:apis/tinymce.util.observable.adoc[Observable]` |xref:#focus[focus()]|Focuses/activates the editor. This will set this editor as the activeEditor in the tinymce collection it will also place DOM focus inside the editor.|`xref:apis/tinymce.editor.adoc[Editor]` @@ -103,6 +104,8 @@ holds the iframe or the editable element.|`xref:apis/tinymce.editor.adoc[Editor] |xref:#getDoc[getDoc()]|Returns the iframes document object.|`xref:apis/tinymce.editor.adoc[Editor]` |xref:#getElement[getElement()]|Returns the target element/textarea that got replaced with a TinyMCE editor instance.|`xref:apis/tinymce.editor.adoc[Editor]` |xref:#getParam[getParam()]|Returns a configuration parameter by name. + + __Deprecated in TinyMCE 6.0 and has been marked for removal in TinyMCE 7.0. Use the `editor.options.get` API instead.__|`xref:apis/tinymce.editor.adoc[Editor]` |xref:#getWin[getWin()]|Returns the iframes window object.|`xref:apis/tinymce.editor.adoc[Editor]` |xref:#hasEditableRoot[hasEditableRoot()]|Returns the current editable state of the editor's root element.|`xref:apis/tinymce.editor.adoc[Editor]` @@ -139,6 +142,8 @@ This method will move the HTML contents from the editor into that textarea or di so all events etc that method has will get dispatched as well.|`xref:apis/tinymce.editor.adoc[Editor]` |xref:#setContent[setContent()]|Sets the specified content to the editor instance, this will cleanup the content before it gets set using the different cleanup rules options. + + __Note: The content return value was deprecated in TinyMCE 6.0 and has been marked for removal in TinyMCE 7.0.__|`xref:apis/tinymce.editor.adoc[Editor]` |xref:#setDirty[setDirty()]|Explicitly sets the dirty state. This will fire the dirty event if the editor dirty state is changed from false to true by invoking this method.|`xref:apis/tinymce.editor.adoc[Editor]` @@ -387,6 +392,8 @@ fire(name: String, args: Object?, bubble: Boolean?): Object ---- Fires the specified event by name. Consult the link:https://www.tiny.cloud/docs/tinymce/7/events/[event reference] for more details on each event. + + __Deprecated in TinyMCE 6.0 and has been marked for removal in TinyMCE 7.0. Use `dispatch` instead.__ ==== Examples @@ -534,6 +541,8 @@ Returns the target element/textarea that got replaced with a TinyMCE editor inst getParam(name: String, defaultVal: String, type: String): String ---- Returns a configuration parameter by name. + + __Deprecated in TinyMCE 6.0 and has been marked for removal in TinyMCE 7.0. Use the `editor.options.get` API instead.__ ==== Examples @@ -944,6 +953,8 @@ setContent(content: String, args: Object): String ---- Sets the specified content to the editor instance, this will cleanup the content before it gets set using the different cleanup rules options. + + __Note: The content return value was deprecated in TinyMCE 6.0 and has been marked for removal in TinyMCE 7.0.__ ==== Examples diff --git a/modules/ROOT/pages/apis/tinymce.editor.ui.registry.adoc b/modules/ROOT/pages/apis/tinymce.editor.ui.registry.adoc index f4250cedc0..331a81d878 100644 --- a/modules/ROOT/pages/apis/tinymce.editor.ui.registry.adoc +++ b/modules/ROOT/pages/apis/tinymce.editor.ui.registry.adoc @@ -17,11 +17,15 @@ TinyMCE UI registration API. |xref:#addAutocompleter[addAutocompleter()]|Registers a new auto completer component. When a configured string pattern is matched in the content while typing, the autocompleter will be triggered. Emoticons and Charmap use an autocompleter. + + For information on creating an autocompleter, see: link:https://www.tiny.cloud/docs/tinymce/7/autocompleter/[ UI Components - Autocompleter].|`xref:apis/tinymce.editor.ui.registry.adoc[Registry]` |xref:#addButton[addButton()]|Registers a new toolbar button that executes a command when clicked or activated via keyboard navigation controls. + + For information on creating a basic toolbar button, see: link:https://www.tiny.cloud/docs/tinymce/7/custom-basic-toolbar-button/[ UI Components - Types of toolbar buttons: Basic button].|`xref:apis/tinymce.editor.ui.registry.adoc[Registry]` @@ -31,22 +35,32 @@ form element appearing when a content predicate is matched. An example of a contextual form is the link plugin when the configuration { link_context_toolbar: true } is used. When the cursor is on a link, a contextual input form appears allowing for quick changes to the url field. + + For information on creating context forms, see: link:https://www.tiny.cloud/docs/tinymce/7/contextform/[ UI Components - Context forms].|`xref:apis/tinymce.editor.ui.registry.adoc[Registry]` |xref:#addContextMenu[addContextMenu()]|Registers a new context menu section that only appears when a content predicate is matched, for example, the cursor is inside a table. + + For information on creating context menus, see: link:https://www.tiny.cloud/docs/tinymce/7/contextmenu/[ UI Components - Context Menu].|`xref:apis/tinymce.editor.ui.registry.adoc[Registry]` |xref:#addContextToolbar[addContextToolbar()]|Registers a new context toolbar that only appears when a content predicate is matched for example the cursor is on an image element. + + For information on creating context toolbars, see: link:https://www.tiny.cloud/docs/tinymce/7/contexttoolbar/[ UI Components - Context Toolbar].|`xref:apis/tinymce.editor.ui.registry.adoc[Registry]` |xref:#addGroupToolbarButton[addGroupToolbarButton()]|Registers a new group toolbar button for the toolbar. Renders a toolbar button that opens a floating toolbar when clicked. + + **Note:** Group toolbar buttons can only be used when using the floating toolbar mode. + + For information on creating a group toolbar button, see: link:https://www.tiny.cloud/docs/tinymce/7/custom-group-toolbar-button/[ UI Components - Types of toolbar buttons: Group toolbar button].|`xref:apis/tinymce.editor.ui.registry.adoc[Registry]` @@ -56,17 +70,23 @@ to the editor instance it was configured for.|`xref:apis/tinymce.editor.ui.regis |xref:#addMenuButton[addMenuButton()]|Registers a new menu button. Adds a toolbar button that opens a menu when clicked. The menu can be populated by items created by addMenuItem, addNestedMenuItem or addToggleMenuItem. + + For information on creating a toolbar menu button, see: link:https://www.tiny.cloud/docs/tinymce/7/custom-menu-toolbar-button/[ UI Components - Types of toolbar buttons: Menu button].|`xref:apis/tinymce.editor.ui.registry.adoc[Registry]` |xref:#addMenuItem[addMenuItem()]|Registers a new menu item that executes a command when clicked or activated via keyboard navigation controls. + + For information on creating a basic menu item, see: link:https://www.tiny.cloud/docs/tinymce/7/creating-custom-menu-items/[ UI Components - Custom menu items: Basic menu items].|`xref:apis/tinymce.editor.ui.registry.adoc[Registry]` |xref:#addNestedMenuItem[addNestedMenuItem()]|Registers a new menu item that reveals a submenu when clicked or activated by keyboard navigation controls.The submenu can be populated by items created by addMenuItem, addNestedMenuItem or addToggleMenuItem. + + For information on creating a nested menu item, see: link:https://www.tiny.cloud/docs/tinymce/7/custom-nested-menu-items/[ UI Components - Custom menu items: Nested menu items].|`xref:apis/tinymce.editor.ui.registry.adoc[Registry]` @@ -77,21 +97,29 @@ button with the same sidebar name is created. Additionally there is a ToggleSidebar command and a 'ToggleSidebar' event that can used to manage the sidebar open/closed state. The tinycomments plugin uses a sidebar for its Ui components. + + For information on creating a custom sidebar, see: link:https://www.tiny.cloud/docs/tinymce/7/customsidebar/[ UI Components - Custom sidebar].|`xref:apis/tinymce.editor.ui.registry.adoc[Registry]` |xref:#addSplitButton[addSplitButton()]|Registers a new split button for the toolbar. The list styles plugin uses a split button to simplify its functionality. + + For information on creating a split toolbar button, see: link:https://www.tiny.cloud/docs/tinymce/7/custom-split-toolbar-button/[ UI Components - Types of toolbar buttons: Split button].|`xref:apis/tinymce.editor.ui.registry.adoc[Registry]` |xref:#addToggleButton[addToggleButton()]|Registers a new toggle button for the toolbar. A toggle buttons state can be set in the configuration. + + For information on creating a toggle toolbar button, see: link:https://www.tiny.cloud/docs/tinymce/7/custom-toggle-toolbar-button/[ UI Components - Types of toolbar buttons: Toggle button].|`xref:apis/tinymce.editor.ui.registry.adoc[Registry]` |xref:#addToggleMenuItem[addToggleMenuItem()]|Registers a new menu item that will act like a toggle button, showing a tick in the menu item to represent state. + + For information on creating a toggle menu item, see: link:https://www.tiny.cloud/docs/tinymce/7/custom-toggle-menu-items/[ UI Components - Custom menu items: Toggle menu items].|`xref:apis/tinymce.editor.ui.registry.adoc[Registry]` @@ -103,6 +131,8 @@ When it is off, the specific view is hidden and the main view is shown. There is also a ToggleView command. The ToggleView command can toggle the view visibility. The ToggleView command can be queried for its current state. + + For information on creating a custom view, see: link:https://www.tiny.cloud/docs/tinymce/7/custom-view/[ UI Components - Custom view].|`xref:apis/tinymce.editor.ui.registry.adoc[Registry]` @@ -120,6 +150,8 @@ addAutocompleter(name: String, obj: InlineContent.AutocompleterSpec) Registers a new auto completer component. When a configured string pattern is matched in the content while typing, the autocompleter will be triggered. Emoticons and Charmap use an autocompleter. + + For information on creating an autocompleter, see: link:https://www.tiny.cloud/docs/tinymce/7/autocompleter/[ UI Components - Autocompleter]. @@ -139,6 +171,8 @@ addButton(name: String, obj: Toolbar.ToolbarButtonSpec) ---- Registers a new toolbar button that executes a command when clicked or activated via keyboard navigation controls. + + For information on creating a basic toolbar button, see: link:https://www.tiny.cloud/docs/tinymce/7/custom-basic-toolbar-button/[ UI Components - Types of toolbar buttons: Basic button]. @@ -162,6 +196,8 @@ form element appearing when a content predicate is matched. An example of a contextual form is the link plugin when the configuration { link_context_toolbar: true } is used. When the cursor is on a link, a contextual input form appears allowing for quick changes to the url field. + + For information on creating context forms, see: link:https://www.tiny.cloud/docs/tinymce/7/contextform/[ UI Components - Context forms]. @@ -181,6 +217,8 @@ addContextMenu(name: String, obj: Menu.ContextMenuSpec) ---- Registers a new context menu section that only appears when a content predicate is matched, for example, the cursor is inside a table. + + For information on creating context menus, see: link:https://www.tiny.cloud/docs/tinymce/7/contextmenu/[ UI Components - Context Menu]. @@ -200,6 +238,8 @@ addContextToolbar(name: String, obj: Toolbar.ContextToolbarSpec) ---- Registers a new context toolbar that only appears when a content predicate is matched for example the cursor is on an image element. + + For information on creating context toolbars, see: link:https://www.tiny.cloud/docs/tinymce/7/contexttoolbar/[ UI Components - Context Toolbar]. @@ -219,7 +259,11 @@ addGroupToolbarButton(name: String, obj: Toolbar.GroupToolbarButtonSpec) ---- Registers a new group toolbar button for the toolbar. Renders a toolbar button that opens a floating toolbar when clicked. + + **Note:** Group toolbar buttons can only be used when using the floating toolbar mode. + + For information on creating a group toolbar button, see: link:https://www.tiny.cloud/docs/tinymce/7/custom-group-toolbar-button/[ UI Components - Types of toolbar buttons: Group toolbar button]. @@ -264,6 +308,8 @@ addMenuButton(name: String, obj: Toolbar.ToolbarMenuButtonSpec) Registers a new menu button. Adds a toolbar button that opens a menu when clicked. The menu can be populated by items created by addMenuItem, addNestedMenuItem or addToggleMenuItem. + + For information on creating a toolbar menu button, see: link:https://www.tiny.cloud/docs/tinymce/7/custom-menu-toolbar-button/[ UI Components - Types of toolbar buttons: Menu button]. @@ -283,6 +329,8 @@ addMenuItem(name: String, obj: Menu.MenuItemSpec) ---- Registers a new menu item that executes a command when clicked or activated via keyboard navigation controls. + + For information on creating a basic menu item, see: link:https://www.tiny.cloud/docs/tinymce/7/creating-custom-menu-items/[ UI Components - Custom menu items: Basic menu items]. @@ -303,6 +351,8 @@ addNestedMenuItem(name: String, obj: Menu.NestedMenuItemSpec) Registers a new menu item that reveals a submenu when clicked or activated by keyboard navigation controls.The submenu can be populated by items created by addMenuItem, addNestedMenuItem or addToggleMenuItem. + + For information on creating a nested menu item, see: link:https://www.tiny.cloud/docs/tinymce/7/custom-nested-menu-items/[ UI Components - Custom menu items: Nested menu items]. @@ -327,6 +377,8 @@ button with the same sidebar name is created. Additionally there is a ToggleSidebar command and a 'ToggleSidebar' event that can used to manage the sidebar open/closed state. The tinycomments plugin uses a sidebar for its Ui components. + + For information on creating a custom sidebar, see: link:https://www.tiny.cloud/docs/tinymce/7/customsidebar/[ UI Components - Custom sidebar]. @@ -346,6 +398,8 @@ addSplitButton(name: String, obj: Toolbar.ToolbarSplitButtonSpec) ---- Registers a new split button for the toolbar. The list styles plugin uses a split button to simplify its functionality. + + For information on creating a split toolbar button, see: link:https://www.tiny.cloud/docs/tinymce/7/custom-split-toolbar-button/[ UI Components - Types of toolbar buttons: Split button]. @@ -365,6 +419,8 @@ addToggleButton(name: String, obj: Toolbar.ToolbarToggleButtonSpec) ---- Registers a new toggle button for the toolbar. A toggle buttons state can be set in the configuration. + + For information on creating a toggle toolbar button, see: link:https://www.tiny.cloud/docs/tinymce/7/custom-toggle-toolbar-button/[ UI Components - Types of toolbar buttons: Toggle button]. @@ -384,6 +440,8 @@ addToggleMenuItem(name: String, obj: Menu.ToggleMenuItemSpec) ---- Registers a new menu item that will act like a toggle button, showing a tick in the menu item to represent state. + + For information on creating a toggle menu item, see: link:https://www.tiny.cloud/docs/tinymce/7/custom-toggle-menu-items/[ UI Components - Custom menu items: Toggle menu items]. @@ -409,6 +467,8 @@ When it is off, the specific view is hidden and the main view is shown. There is also a ToggleView command. The ToggleView command can toggle the view visibility. The ToggleView command can be queried for its current state. + + For information on creating a custom view, see: link:https://www.tiny.cloud/docs/tinymce/7/custom-view/[ UI Components - Custom view]. diff --git a/modules/ROOT/pages/apis/tinymce.editor.ui.ui.adoc b/modules/ROOT/pages/apis/tinymce.editor.ui.ui.adoc index f1da76e1a6..5fbc55fcc6 100644 --- a/modules/ROOT/pages/apis/tinymce.editor.ui.ui.adoc +++ b/modules/ROOT/pages/apis/tinymce.editor.ui.ui.adoc @@ -25,6 +25,8 @@ This editor ui instance. |Name|Summary|Defined by |xref:#tinymce.editor.ui.hide[tinymce.editor.ui.hide()]|Hides the editor user interface for inline editors. This method affects all user interface elements, including: menu bar, toolbar, notifications, and dialogs. + + If the `toolbar_persist` option is set to `true` and this method is used, the user interface will remain hidden, regardless of focus.|`xref:apis/tinymce.editor.ui.ui.adoc[Ui]` |xref:#tinymce.editor.ui.isEnabled[tinymce.editor.ui.isEnabled()]|Determines if the editor user interface is `enabled` (`true`) or `disabled` (`false`).|`xref:apis/tinymce.editor.ui.ui.adoc[Ui]` @@ -33,6 +35,8 @@ This method affects all user interface elements, including: menu bar, toolbar, notifications, and dialogs. Can not be set to 'true' when in readonly mode.|`xref:apis/tinymce.editor.ui.ui.adoc[Ui]` |xref:#tinymce.editor.ui.show[tinymce.editor.ui.show()]|Reveals the editor user interface for inline editors. This method affects all user interface elements, including: menu bar, toolbar, notifications, and dialogs. + + If the `toolbar_persist` option is set to `true` and this method is used, the user interface will remain visible, regardless of focus.|`xref:apis/tinymce.editor.ui.ui.adoc[Ui]` |=== @@ -48,6 +52,8 @@ tinymce.editor.ui.hide() ---- Hides the editor user interface for inline editors. This method affects all user interface elements, including: menu bar, toolbar, notifications, and dialogs. + + If the `toolbar_persist` option is set to `true` and this method is used, the user interface will remain hidden, regardless of focus. @@ -91,6 +97,8 @@ tinymce.editor.ui.show() ---- Reveals the editor user interface for inline editors. This method affects all user interface elements, including: menu bar, toolbar, notifications, and dialogs. + + If the `toolbar_persist` option is set to `true` and this method is used, the user interface will remain visible, regardless of focus. diff --git a/modules/ROOT/pages/apis/tinymce.editoroptions.adoc b/modules/ROOT/pages/apis/tinymce.editoroptions.adoc index 6e8e871531..d7fc367ede 100644 --- a/modules/ROOT/pages/apis/tinymce.editoroptions.adoc +++ b/modules/ROOT/pages/apis/tinymce.editoroptions.adoc @@ -8,16 +8,40 @@ TinyMCE Editor Options API. The options API provides the ability to register, lo All options need to be registered before they can be used in the editor. This is done by using the `register()` API which requires a name and an option specification. The specification should contain a `processor` and an optional `default` value. The processor is used to parse and validate the option value either passed in the initial configuration or via the `set()` API. + + + + The processor can either be a custom function that returns if the option value is valid, or one of the following built-in processors: + + + + - `string` + + - `number` + + - `boolean` + + - `array` + + - `function` + + - `object` + + - `string[]` + + - `object[]` + + - `regexp` [[examples]] diff --git a/modules/ROOT/pages/apis/tinymce.notificationmanager.adoc b/modules/ROOT/pages/apis/tinymce.notificationmanager.adoc index ffba33ce3a..5452acd681 100644 --- a/modules/ROOT/pages/apis/tinymce.notificationmanager.adoc +++ b/modules/ROOT/pages/apis/tinymce.notificationmanager.adoc @@ -69,6 +69,10 @@ Opens a new notification. * `args (Object)` - A `name: value` collection containing settings such as: `timeout`, `type`, and message (`text`). + + + + For information on the available settings, see: link:https://www.tiny.cloud/docs/tinymce/7/creating-custom-notifications/[Create custom notifications]. ''' diff --git a/modules/ROOT/pages/apis/tinymce.plugin.adoc b/modules/ROOT/pages/apis/tinymce.plugin.adoc index 96bfa1480b..b07df128c9 100644 --- a/modules/ROOT/pages/apis/tinymce.plugin.adoc +++ b/modules/ROOT/pages/apis/tinymce.plugin.adoc @@ -8,8 +8,16 @@ TinyMCE plugin psuedo class. Allows for custom plugins to be added to TinyMCE wh This is a pseudo class that describes how to create a custom plugin for TinyMCE. + + + + A custom plugin registered using `PluginManager.add` should either not return any value or return plugin metadata as an object that contains the plugin's name and a URL. The URL is intended to link to help documentation. + + + + See AddOnManager for more information about the methods available on the PluginManager instance. [[examples]] diff --git a/modules/ROOT/pages/apis/tinymce.root.adoc b/modules/ROOT/pages/apis/tinymce.root.adoc index 4c9b577c4b..65c46cc4c4 100644 --- a/modules/ROOT/pages/apis/tinymce.root.adoc +++ b/modules/ROOT/pages/apis/tinymce.root.adoc @@ -52,6 +52,10 @@ Checks if the input object `obj` has the property `prop`.|`xref:apis/tinymce.roo |xref:#inArray[inArray()]|Returns an index of the item or -1 if item is not present in the array.|`xref:apis/tinymce.root.adoc[tinymce]` |xref:#init[init()]|Initializes a set of editors. This method will create editors based on various settings. + + + + For information on basic usage of `init`, see: link:https://www.tiny.cloud/docs/tinymce/7/basic-setup/[Basic setup].|`xref:apis/tinymce.root.adoc[tinymce]` |xref:#is[is()]|Checks if a object is of a specific type for example an array.|`xref:apis/tinymce.root.adoc[tinymce]` |xref:#isArray[isArray()]|Returns true/false if the object is an array or not.|`xref:apis/tinymce.root.adoc[tinymce]` @@ -60,8 +64,16 @@ For information on basic usage of `init`, see: link:https://www.tiny.cloud/docs/ one array list into another.|`xref:apis/tinymce.root.adoc[tinymce]` |xref:#overrideDefaults[overrideDefaults()]|Overrides the default options for editor instances. The `overrideDefaults` method replaces the `defaultOptions`, including any set by a previous call to the `overrideDefaults` method. + + + + When using the Tiny Cloud, some of these defaults are required for the cloud-based editor to function. + + + + Therefore, when using `overrideDefaults` with the cloud-based editor, any newly integrated options must be combined with the options in `tinymce.defaultOptions`.|`xref:apis/tinymce.root.adoc[tinymce]` |xref:#remove[remove()]|Removes a editor or editors form page.|`xref:apis/tinymce.root.adoc[tinymce]` |xref:#resolve[resolve()]|Resolves a string and returns the object from a specific structure.|`xref:apis/tinymce.root.adoc[tinymce]` @@ -315,6 +327,10 @@ init(options: Object): Promise ---- Initializes a set of editors. This method will create editors based on various settings. + + + + For information on basic usage of `init`, see: link:https://www.tiny.cloud/docs/tinymce/7/basic-setup/[Basic setup]. ==== Examples @@ -428,8 +444,16 @@ overrideDefaults(defaultOptions: Object) ---- Overrides the default options for editor instances. The `overrideDefaults` method replaces the `defaultOptions`, including any set by a previous call to the `overrideDefaults` method. + + + + When using the Tiny Cloud, some of these defaults are required for the cloud-based editor to function. + + + + Therefore, when using `overrideDefaults` with the cloud-based editor, any newly integrated options must be combined with the options in `tinymce.defaultOptions`. ==== Examples diff --git a/modules/ROOT/pages/apis/tinymce.theme.adoc b/modules/ROOT/pages/apis/tinymce.theme.adoc index ec9eb8f362..795d98a638 100644 --- a/modules/ROOT/pages/apis/tinymce.theme.adoc +++ b/modules/ROOT/pages/apis/tinymce.theme.adoc @@ -8,8 +8,16 @@ TinyMCE theme pseudo class. Allows for a custom theme to be used with TinyMCE wh This is a pseudo class that describes how to create a custom theme for TinyMCE. + + + + See AddOnManager for more information about the methods available on the ThemeManager instance. + + + + **Warning**: Much of TinyMCE's functionality is provided by the default Silver theme. Creating a custom theme may require the re-implementation of this functionality. To change TinyMCE's appearance, Tiny recommends changing the Skin instead. [[examples]] diff --git a/modules/ROOT/pages/apis/tinymce.util.eventdispatcher.adoc b/modules/ROOT/pages/apis/tinymce.util.eventdispatcher.adoc index e90a0f3c96..5bcf4630a3 100644 --- a/modules/ROOT/pages/apis/tinymce.util.eventdispatcher.adoc +++ b/modules/ROOT/pages/apis/tinymce.util.eventdispatcher.adoc @@ -26,6 +26,8 @@ eventDispatcher.dispatch('click', { data: 123 }); |Name|Summary|Defined by |xref:#dispatch[dispatch()]|Dispatches the specified event by name.|`xref:apis/tinymce.util.eventdispatcher.adoc[EventDispatcher]` |xref:#fire[fire()]|Fires the specified event by name. + + __Deprecated in TinyMCE 6.0 and has been marked for removal in TinyMCE 7.0. Use `dispatch` instead.__|`xref:apis/tinymce.util.eventdispatcher.adoc[EventDispatcher]` |xref:#has[has()]|Returns true/false if the dispatcher has a event of the specified name.|`xref:apis/tinymce.util.eventdispatcher.adoc[EventDispatcher]` |xref:#isNative[isNative()]|Returns true/false if the specified event name is a native browser event or not.|`xref:apis/tinymce.util.eventdispatcher.adoc[EventDispatcher]` @@ -70,6 +72,8 @@ instance.dispatch('event', {...}); fire(name: String, args: Object?): Object ---- Fires the specified event by name. + + __Deprecated in TinyMCE 6.0 and has been marked for removal in TinyMCE 7.0. Use `dispatch` instead.__ ==== Examples diff --git a/modules/ROOT/pages/apis/tinymce.util.observable.adoc b/modules/ROOT/pages/apis/tinymce.util.observable.adoc index f76909ab65..ccdad4b6b2 100644 --- a/modules/ROOT/pages/apis/tinymce.util.observable.adoc +++ b/modules/ROOT/pages/apis/tinymce.util.observable.adoc @@ -18,6 +18,8 @@ This mixin adds event binding logic to classes. Adapts the EventDispatcher class link:https://www.tiny.cloud/docs/tinymce/7/events/[event reference] for more details on each event.|`xref:apis/tinymce.util.observable.adoc[Observable]` |xref:#fire[fire()]|Fires the specified event by name. Consult the link:https://www.tiny.cloud/docs/tinymce/7/events/[event reference] for more details on each event. + + __Deprecated in TinyMCE 6.0 and has been marked for removal in TinyMCE 7.0. Use `dispatch` instead.__|`xref:apis/tinymce.util.observable.adoc[Observable]` |xref:#hasEventListeners[hasEventListeners()]|Returns true/false if the object has a event of the specified name.|`xref:apis/tinymce.util.observable.adoc[Observable]` |xref:#off[off()]|Unbinds an event listener to a specific event by name. Consult the @@ -66,6 +68,8 @@ fire(name: String, args: Object?, bubble: Boolean?): Object ---- Fires the specified event by name. Consult the link:https://www.tiny.cloud/docs/tinymce/7/events/[event reference] for more details on each event. + + __Deprecated in TinyMCE 6.0 and has been marked for removal in TinyMCE 7.0. Use `dispatch` instead.__ ==== Examples From 2040565d24c8ad23ab1dbbcd0e4f8dfaf767c7c3 Mon Sep 17 00:00:00 2001 From: Farzad Hayat Date: Thu, 9 May 2024 10:21:11 +1000 Subject: [PATCH 14/97] DOC-2399: Update Basic Setup section in AI Assistant plugin page (#3291) * DOC-2399: Update Basic Setup section in AI Assistant plugin page * Improve wording --- modules/ROOT/pages/ai.adoc | 44 ++++++-------------------------------- 1 file changed, 6 insertions(+), 38 deletions(-) diff --git a/modules/ROOT/pages/ai.adoc b/modules/ROOT/pages/ai.adoc index a96924fe87..566fbbaa4d 100644 --- a/modules/ROOT/pages/ai.adoc +++ b/modules/ROOT/pages/ai.adoc @@ -29,52 +29,20 @@ liveDemo::ai[] == Basic setup -To add the {pluginname} plugin to the editor, add both `{plugincode}` to the `plugins` option in the editor configuration and the `ai_request` function to the editor configuration. +To add the {pluginname} plugin to the editor, follow these steps: -For example, interfacing with the OpenAI Completions API: +- Add `{plugincode}` to the `plugins` option in the editor configuration. +- Add the `ai_request` function to the editor configuration. -include::partial$misc/admon-ai-proxy.adoc[] +For example: [source,js] ---- -// Providing access credentials within the integration is not recommended for production use. -// We recommend setting up a proxy server to authenticate requests and provide access. -const api_key = ''; - tinymce.init({ - selector: 'textarea', // Change this value according to your HTML + selector: 'textarea', // change this value according to your HTML plugins: 'ai', toolbar: 'aidialog aishortcuts', - ai_request: (request, respondWith) => { - const openAiOptions = { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - 'Authorization': `Bearer ${api_key}` - }, - body: JSON.stringify({ - model: 'gpt-3.5-turbo', - temperature: 0.7, - max_tokens: 800, - messages: [{ role: 'user', content: request.prompt }], - }) - }; - respondWith.string((signal) => window.fetch('https://api.openai.com/v1/chat/completions', { signal, ...openAiOptions }) - .then(async (response) => { - if (response) { - const data = await response.json(); - if (data.error) { - throw new Error(`${data.error.type}: ${data.error.message}`); - } else if (response.ok) { - // Extract the response content from the data returned by the API - return data?.choices[0]?.message?.content?.trim(); - } - } else { - throw new Error('Failed to communicate with the ChatGPT API'); - } - }) - ); - } + ai_request: , }); ---- From eb87bf72b56389d97ee9b67ba1d876b1db682899 Mon Sep 17 00:00:00 2001 From: Karl Kemister-Sheppard Date: Mon, 13 May 2024 09:16:15 +1000 Subject: [PATCH 15/97] DOC-2417: Fix domain link and add closing parenthesis. (#3293) --- modules/ROOT/pages/usage-based-billing.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ROOT/pages/usage-based-billing.adoc b/modules/ROOT/pages/usage-based-billing.adoc index 32c67bd4bc..f26a7fe227 100644 --- a/modules/ROOT/pages/usage-based-billing.adoc +++ b/modules/ROOT/pages/usage-based-billing.adoc @@ -55,7 +55,7 @@ All Admin users can check their usage data for the past six months in the {produ If your editor loads are consistently exceeding your plan limit, we suggest upgrading your plan to minimize costs. You can review the cost of link:https://www.tiny.cloud/pricing/[upgrading to a higher plan] at any time and can upgrade in the Billing Portal to immediately receive a higher editor load limit and new capabilities. [NOTE] -We recommend that the email address associated with your plan is linked to either a group alias, IT, or administrator address that will remain valid over time (e.g. link:http://example.com/[http://example.com/]. By doing so, you'll avoid any disruption of {productname} in your project or application in the event of organizational or staff changes. +We recommend that the email address associated with your plan is linked to either a group alias, IT, or administrator address that will remain valid over time (e.g. accounts@example.com). By doing so, you'll avoid any disruption of {productname} in your project or application in the event of organizational or staff changes. === How are editor loads counted during the free 14-day trial period? From 50386023a09a736934fc5fa4f728b75c8499e9d0 Mon Sep 17 00:00:00 2001 From: Karl Kemister-Sheppard Date: Mon, 13 May 2024 09:51:08 +1000 Subject: [PATCH 16/97] DOC-2418: Copy edits to migration from 6x, and replaced ver num with variable. (#3294) --- modules/ROOT/pages/migration-from-6x.adoc | 24 +++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/modules/ROOT/pages/migration-from-6x.adoc b/modules/ROOT/pages/migration-from-6x.adoc index e5ce23071e..fa32c032e7 100644 --- a/modules/ROOT/pages/migration-from-6x.adoc +++ b/modules/ROOT/pages/migration-from-6x.adoc @@ -1,14 +1,14 @@ -= Migrating from TinyMCE 6 to TinyMCE 7 += Migrating from {productname} 6 to {productname} 7 :navtitle: Migrating from TinyMCE 6 :description: Guidance for migrating from TinyMCE 6 to TinyMCE 7 :keywords: migration, considerations, premigration, pre-migration +:release-version: 7.0 -The process for setting up a basic {productname} 7 instance is the same as {productname} 6. +The process for setting up a basic {productname} {release-version} instance is the same as {productname} 6. -Most configuration changes in {productname} 7.0 only affect complex use cases, such as custom plugins and customized user interface components. +Most configuration changes in {productname} {release-version} only affect complex use cases, such as custom plugins and customized user interface components. - -It set outs the {productname} 7.0 changes that customers using {productname} 6 should be aware of as part of upgrading. +This documentation details the changes in {productname} {release-version} that integrators using {productname} 6 should consider when upgrading. NOTE: For support related to migration, please contact https://support.tiny.cloud/hc/en-us/requests/new[Tiny Support]. + Open Source users: please report issues in the https://github.com/tinymce/tinymce/[TinyMCE GitHub Repository]. @@ -25,7 +25,7 @@ Open Source users: please report issues in the https://github.com/tinymce/tinymc [[tinymce-70-core-changes]] == {productname} {productmajorversion} core changes. -For additional details on {productname} 7.0 changes, see xref:7.0-release-notes.adoc[{productname} 7.0 release notes]. +For additional details on {productname} {release-version} changes, see xref:7.0-release-notes.adoc[{productname} {release-version} release notes]. [[commands-and-apis]] @@ -63,10 +63,10 @@ The `remove_trailing_brs` setting was removed from the xref:apis/tinymce.html.do Applying basic formats such as headings, lists, bold and italic from typing them out in Markdown syntax is considered a must-have for WYSIWYG Editor's. In previous versions, {productname} would only apply these formats once the user presses the `Enter` key. -{productname} 7 updates the default behavior of the `text-patterns` option to apply these formats when the user presses the `Space` key. +{productname} {release-version} updates the default behavior of the `text-patterns` option to apply these formats when the user presses the `Space` key. [NOTE] -The previous default `text_patterns` behavior, applying the format on an `Enter` key press, can be configured by replacing the `trigger` property with the value `'space'`. Learn more about how you can configure `text_patterns` in the xref:7.0-release-notes.adoc#a-new-trigger-property-for-block-text-pattern-configurations-allowing-pattern-activation-with-either-space-or-enter-keys[7.0 Release notes] +The previous default `text_patterns` behavior, applying the format on an `Enter` key press, can be configured by replacing the `trigger` property with the value `'space'`. Learn more about how you can configure `text_patterns` in the xref:7.0-release-notes.adoc#a-new-trigger-property-for-block-text-pattern-configurations-allowing-pattern-activation-with-either-space-or-enter-keys[{release-version} Release notes] .Updated default text patterns [source, ts] @@ -111,7 +111,7 @@ For more information, visit the updated xref:autocompleter.adoc[Autocompleter] d [[highlight-on-focus]] ==== `highlight_on_focus` -Previously, the default value for the editor configuration option `highlight_on_focus` was set to `false` by default. In {productname} 7.0 this option is now by default set to `true`. +Previously, the default value for the editor configuration option `highlight_on_focus` was set to `false` by default. In {productname} {release-version} this option is now by default set to `true`. As a result, the focus outline for the editor will by default be displayed when the focus is on the editor. @@ -198,7 +198,7 @@ For more information on using `+media_url_resolver+`, see xref:media.adoc#media_ [[removed-plugins]] === Removed Plugins -In {productname} 7.0 the below plugin has been removed. +In {productname} {release-version} the below plugin has been removed. [[removed-plugins-template-plugin]] ==== Removed open-source `Template` plugin @@ -228,13 +228,13 @@ Removed **Template** options: Previously, {productname} added numerous `height` styles when resizing table rows such as on the `table` element, `tr` elements, and `td` elements. This resulted in unnecessarily verbose HTML output. -{productname} 7.0 addresses this by making a couple of changes: +{productname} {release-version} addresses this by making a couple of changes: * The height input field has been removed from the "Cell Properties" dialog. Now, the "Row Properties" dialog is the only way to update row heights. * When a table is resized using the resize handles or the "Row properties" dialog, existing `height` styles will be stripped from `td/th` elements where applicable and only applied to the `table` element and `tr` elements. [NOTE] -{productname} 7.0 does not provide any fallback to revert to the old behavior. +{productname} {release-version} does not provide any fallback to revert to the old behavior. === Removed From d7e2744f6298b5f5990d37e6d800c2769f4ec1ac Mon Sep 17 00:00:00 2001 From: Karl Kemister-Sheppard Date: Tue, 14 May 2024 13:14:34 +1000 Subject: [PATCH 17/97] DOC-2392: Re-write of `editor-plugin-version.adoc` page. (#3292) * DOC-2392: Re-write of editor-plugin-version.adoc page. * DOC-2392: added admon for placement for script tag, and minor copy edits. * Update modules/ROOT/pages/editor-plugin-version.adoc Co-authored-by: Andrew Herron * Update modules/ROOT/pages/editor-plugin-version.adoc Co-authored-by: Andrew Herron * DOC-2392: remove mention of plugin versions, remove plugin version links. * Update modules/ROOT/pages/editor-plugin-version.adoc Co-authored-by: Farzad Hayat * Update modules/ROOT/pages/editor-plugin-version.adoc * Update modules/ROOT/partials/misc/admon-script-tag-placement.adoc Co-authored-by: Andrew Herron * Update modules/ROOT/pages/editor-plugin-version.adoc Co-authored-by: Andrew Herron * Update modules/ROOT/pages/editor-plugin-version.adoc Co-authored-by: Andrew Herron * Update modules/ROOT/pages/editor-plugin-version.adoc Co-authored-by: Andrew Herron * Update modules/ROOT/pages/editor-plugin-version.adoc Co-authored-by: Andrew Herron * Update modules/ROOT/pages/editor-plugin-version.adoc * DOC-2392: update note to include second line. --------- Co-authored-by: Andrew Herron Co-authored-by: Farzad Hayat --- modules/ROOT/nav.adoc | 2 +- .../ROOT/pages/cloud-deployment-guide.adoc | 4 +- modules/ROOT/pages/editor-plugin-version.adoc | 178 ++++++++---------- .../misc/admon-script-tag-placement.adoc | 2 + 4 files changed, 79 insertions(+), 107 deletions(-) create mode 100644 modules/ROOT/partials/misc/admon-script-tag-placement.adoc diff --git a/modules/ROOT/nav.adoc b/modules/ROOT/nav.adoc index 7fa2a574b2..3c72c7acba 100644 --- a/modules/ROOT/nav.adoc +++ b/modules/ROOT/nav.adoc @@ -123,7 +123,7 @@ ** xref:cloud-deployment-guide.adoc[Cloud deployment guide] *** xref:editor-and-features.adoc[Cloud deployment of editor & plugins] *** xref:features-only.adoc[Cloud deployment of plugins Only] -*** xref:editor-plugin-version.adoc[Specify editor & plugin versions] +*** xref:editor-plugin-version.adoc[Specify editor & plugins] *** xref:plugin-editor-version-compatibility.adoc[Version compatibility reference] *** xref:cloud-troubleshooting.adoc[Cloud Troubleshooting] ** Premium server-side services guide diff --git a/modules/ROOT/pages/cloud-deployment-guide.adoc b/modules/ROOT/pages/cloud-deployment-guide.adoc index 5dd9c1a977..e9ba81f8c5 100644 --- a/modules/ROOT/pages/cloud-deployment-guide.adoc +++ b/modules/ROOT/pages/cloud-deployment-guide.adoc @@ -21,9 +21,9 @@ Connect to Tiny Cloud within a hybrid deployment. | [.lead] -xref:editor-plugin-version.adoc[Specify editor & plugin versions] +xref:editor-plugin-version.adoc[Specify editor & plugins] -Specifying editor and plugin versions for Tiny Cloud deployments. +Specifying editor and plugins for Tiny Cloud deployments. | [.lead] diff --git a/modules/ROOT/pages/editor-plugin-version.adoc b/modules/ROOT/pages/editor-plugin-version.adoc index 5fa389cee4..6964b9bc8c 100644 --- a/modules/ROOT/pages/editor-plugin-version.adoc +++ b/modules/ROOT/pages/editor-plugin-version.adoc @@ -1,160 +1,130 @@ -= Specify editor & plugin versions -:description_short: Specifying editor and plugin versions for Tiny Cloud deployments. -:description: Specifying editor and plugin versions for Tiny Cloud deployments. += Specify editor version & plugins +:description_short: Specifying editor version and plugins for {cloudname} deployments. +:description: Instructions on setting the {productname} editor version and plugins for {cloudname} deployments. :keywords: tinymce, cloud, script, textarea, apiKey, hybrid [[specifying-the-tinymce-editor-version-deployed-from-cloud]] -== Specifying the TinyMCE editor version deployed from Cloud +== Specifying the {productname} Editor Version from the Cloud -Use the URL provided to specify the {productname} version when deploying via {cloudname}. Refer to the xref:editor-and-features.adoc[{productname} editor via the {cloudname}] for more information. - -The following example is the default for loading {productname} {productmajorversion} via {cloudname}. Substitute 'no-api-key' with your api key in the examples below. +To set the {productname} version when deploying from {cloudname}, use the following URL: [source,html,subs="attributes+"] ---- ---- -This URL specifies the latest and quality assured release of {productname}. +The example above shows the default way to load {productname} {productmajorversion} from {cloudname}. This URL ensures the most recent and verified version of {productname} is used. -=== Selecting specific version numbers +[TIP] +Replace 'no-api-key' with your own API key. -NOTE: All {cloudname} channels are based on the {enterpriseversion} version. For information on the latest version of the {cloudname} `{productmajorversion}` release channel, see: xref:release-notes.adoc[{productname} Release Notes]. For a list of changes that *may* be present in the {cloudname} testing channel, see: xref:changelog.adoc[{productname} Changelog]. +For more details, check out the xref:editor-and-features.adoc[{productname} editor via {cloudname}]. -[#{productmajorversion}-{productmajorversion}-testing-and-{productmajorversion}-dev-release-channels] -=== {productmajorversion}, {productmajorversion}-testing, and {productmajorversion}-dev release channels +[[specifying-the-cloud-deployment-of-plugins]] +== Specifying the Cloud Deployment of Plugins -Choose from the `{productmajorversion}`, `{productmajorversion}-testing`, or `{productmajorversion}-dev` release channels to load the latest version of {productname} from {cloudname}. +When self-hosting {productname}, integrators have the choice to host premium plugins or load them from {companyname} Cloud (a.k.a. hybrid mode). Depending on your requirements, you can use a combination of both approaches. -These channels are updated automatically and provide the latest {productname} version that matches the criteria below. +include::partial$misc/admon-script-tag-placement.adoc[] -[#{productmajorversion}-release-channel] -==== {productmajorversion} release channel +{companyname} offers the following configuration scripts to assist: -This channel deploys the latest release of {productname} that has passed our quality assurance process. The current version of {productname} available through the `/{productmajorversion}` channel can be found on the https://cdn.tiny.cloud/1/no-api-key/tinymce/{productmajorversion}/version.txt[{cloudname} {productname} {productmajorversion} version page]. The {productname} {productmajorversion} channel can be loaded from `{cdnurl}`. +=== `plugin.min.js` Standalone with No Exclusions. -[#example-using-the-{productmajorversion}-release-channel] -===== Example: using the `{productmajorversion}` release channel +The `plugins.min.js` script loads every premium plugin the API key is entitled to from the CDN. [source,html,subs="attributes+"] ---- - + ---- -[#{productmajorversion}-testing-release-channel] -==== {productmajorversion}-testing release channel - -This channel deploys the current *release candidate* for the `{productmajorversion}` channel. The {productname} release candidate is undergoing quality assurance. The current version of {productname} available through the `{productmajorversion}-testing` channel can be found on the https://cdn.tiny.cloud/1/no-api-key/tinymce/{productmajorversion}-testing/version.txt[{cloudname} {productname} {productmajorversion}-testing version page]. +=== `plugins.min.js` with Exclusions for Specific Plugins. -[#example-using-the-{productmajorversion}-testing-release-channel] -===== Example: using the `{productmajorversion}-testing` release channel +To exclude specific premium plugins from `plugins.min.js` because you are self-hosting them, add the excluded plugins to the script query parameters as shown below: [source,html,subs="attributes+"] ---- - + ---- -[#{productmajorversion}-dev-release-channel] -==== {productmajorversion}-dev release channel +[NOTE] +==== +Ensure that the excluded plugins' names are appended with `=sdk`, such as `mentions=sdk`. -This channel deploys nightly builds of {productname}. This channel includes the unreleased changes documented in the https://github.com/tinymce/tinymce/blob/develop/modules/tinymce/CHANGELOG.md[{productname} changelog]. The current version of {productname} available through the `{productmajorversion}-dev` channel can be found on the https://cdn.tiny.cloud/1/no-api-key/tinymce/{productmajorversion}-dev/version.txt[{cloudname} {productname} {productmajorversion}-dev version page]. +When {companyname} Cloud releases a new premium plugin, if you wish to self-host it this script tag will need to be updated to exclude it. +==== -[#example-using-the-{productmajorversion}-dev-release-channel] -===== Example: using the `{productmajorversion}-dev` release channel +=== `cloud-plugins.min.js` for Specific Premium Plugins from {companyname} Cloud. + +The `cloud-plugins.min.js` script allows loading of specific premium plugins from {companyname} Cloud. [source,html,subs="attributes+"] ---- - + ---- -== Specifying the version of premium plugins deployed from Tiny Cloud - -Each {productname} version is bundled with a set of premium plugins, but it is possible to specify different versions of each premium plugin to use with {productname}. Use the URL query parameters to specify the version of each premium plugin to load. This approach works with both the xref:editor-and-features.adoc[{productname} editor and premium plugins deployment via {cloudname}] or just the xref:features-only.adoc[premium plugins deployment from {cloudname}]. - -The `+identifier+` of the plugin is used as a query parameter. This table summarises the possible options. - -[cols=",,",options="header"] -|=== -|Plugin |Identifier |Supported Versions -|xref:a11ychecker.adoc[Accessibility Checker] |`+a11ychecker+` |http://cdn.tiny.cloud/1/no-api-key/tinymce-plugins/a11ychecker/available-versions[Versions] -|xref:advtable.adoc[Enhanced Tables] |`+advtable+` |http://cdn.tiny.cloud/1/no-api-key/tinymce-plugins/advtable/available-versions[Versions] -|xref:advanced-typography.adoc[Advanced Typography] |`+typography+` |http://cdn.tiny.cloud/1/no-api-key/tinymce-plugins/advtable/available-versions[Versions] -|xref:casechange.adoc[Case Change] |`+casechange+` |http://cdn.tiny.cloud/1/no-api-key/tinymce-plugins/casechange/available-versions[Versions] -|xref:checklist.adoc[Checklist] |`+checklist+` |http://cdn.tiny.cloud/1/no-api-key/tinymce-plugins/checklist/available-versions[Versions] -|xref:introduction-to-tiny-comments.adoc[Comments] |`+comments+` |http://cdn.tiny.cloud/1/no-api-key/tinymce-plugins/tinycomments/available-versions[Versions] -|xref:advcode.adoc[Enhanced Code Editor] |`+advcode+` |http://cdn.tiny.cloud/1/no-api-key/tinymce-plugins/advcode/available-versions[Versions] -|xref:introduction-to-mediaembed.adoc[Enhanced Media Embed] |`+mediaembed+` |http://cdn.tiny.cloud/1/no-api-key/tinymce-plugins/mediaembed/available-versions[Versions] -|xref:footnotes.adoc[Footnotes] |`+footnotes+` |http://cdn.tiny.cloud/1/no-api-key/tinymce-plugins/footnotes/available-versions[Versions] -|xref:formatpainter.adoc[Format Painter] |`+formatpainter+` |http://cdn.tiny.cloud/1/no-api-key/tinymce-plugins/formatpainter/available-versions[Versions] -|xref:inline-css.adoc[Inline CSS] |`+inlinecss+` |http://cdn.tiny.cloud/1/no-api-key/tinymce-plugins/formatpainter/available-versions[Versions] -|xref:editimage.adoc[Image Editing] |`+editimage+` |http://cdn.tiny.cloud/1/no-api-key/tinymce-plugins/editimage/available-versions[Versions] -|xref:linkchecker.adoc[Link Checker] |`+linkchecker+` |http://cdn.tiny.cloud/1/no-api-key/tinymce-plugins/linkchecker/available-versions[Versions] -|xref:mentions.adoc[Mentions] |`+mentions+` |http://cdn.tiny.cloud/1/no-api-key/tinymce-plugins/mentions/available-versions[Versions] -|xref:mergetags.adoc[Merge Tags] |`+mergetags+` |http://cdn.tiny.cloud/1/no-api-key/tinymce-plugins/mergetags/available-versions[Versions] -|xref:pageembed.adoc[Page Embed] |`+pageembed+` |http://cdn.tiny.cloud/1/no-api-key/tinymce-plugins/pageembed/available-versions[Versions] -|xref:permanentpen.adoc[Permanent Pen] |`+permanentpen+` |http://cdn.tiny.cloud/1/no-api-key/tinymce-plugins/permanentpen/available-versions[Versions] -|xref:introduction-to-powerpaste.adoc[PowerPaste] |`+powerpaste+` |http://cdn.tiny.cloud/1/no-api-key/tinymce-plugins/powerpaste/available-versions[Versions] -|xref:introduction-to-tiny-spellchecker.adoc[Spell Checker] |`+tinymcespellchecker+` |http://cdn.tiny.cloud/1/no-api-key/tinymce-plugins/tinymcespellchecker/available-versions[Versions] -|xref:autocorrect.adoc[Spelling Autocorrect] |`+autocorrect+` |http://cdn.tiny.cloud/1/no-api-key/tinymce-plugins/autocorrect/available-versions[Versions] -|xref:tableofcontents.adoc[Table of Contents] |`+tableofcontents+`|http://cdn.tiny.cloud/1/no-api-key/tinymce-plugins/tableofcontents/available-versions[Versions] -|xref:tinydrive-introduction.adoc[Tiny Drive] |`+tinydrive+` |http://cdn.tiny.cloud/1/no-api-key/tinymce-plugins/tinydrive/available-versions[Versions] -|=== - -=== Specifying versions for the editor and premium plugin deployment - -When deploying xref:editor-and-features.adoc[both the editor and premium plugins from {cloudname}], {productname} will load the premium plugins bundled with that version of the editor. To load a different version of a premium plugin, append the name of the plugin and the version to load as query parameters. The version must match one of the versions listed in the `+Supported Versions+` link for the relevant plugin. - -Combine multiple plugin specifications using `+&+` in your query string. For example, to load: - -* mentions v3.0 -* powerpaste v6.0 -* all other premium plugins from those bundled with `{productmajorversion}` - -Append `+?mentions=3.0&powerpaste=6.0+`, such as: +[NOTE] +This approach is intended for edge cases where you self-host most premium plugins on your own servers and only need one or two from {companyname} Cloud. -[source,html,subs="attributes+"] ----- - ----- +''' -=== Specifying a self-hosted deployment of features/plugins +=== Selecting Specific Editor Versions -When deploying xref:features-only.adoc[only premium plugins from {cloudname}], some features are served from {cloudname} and some features served from a self-hosted installation. There are two ways to achieve this: `+plugins.min.js+` and `+cloud-plugins.min.js+`. +[IMPORTANT] +==== +All {cloudname} channels are based on the {enterpriseversion} version. -==== plugins.min.js +* For information on the latest version of the {cloudname} `{productmajorversion}` release channel, see: xref:release-notes.adoc[{productname} Release Notes]. +* For a list of changes that *may* be present in the {cloudname} testing channel, see: xref:changelog.adoc[{productname} Changelog]. +==== -Instead of loading `+tinymce.min.js+` from {cloudname}, serve {productname} from a self-hosted server, and load `+plugins.min.js+` from {cloudname}. {productname} which will attempt to load every *premium* plugin from {cloudname}, unless the version of the plugin is specified as the special version `+sdk+`. The query string for `+plugins.min.js+` works the same way as `+tinymce.min.js+`, except for the addition of `+sdk+`. For example, this script tag: +[#{productmajorversion}-{productmajorversion}-testing-and-{productmajorversion}-dev-release-channels] +=== Difference between using {productname} {productmajorversion}, {productmajorversion}-Testing, and {productmajorversion}-Dev release channels -The following example: +Choose from the `{productmajorversion}`, `{productmajorversion}-testing`, or `{productmajorversion}-dev` release channels to load the latest version of {productname} from {cloudname}. -* Assumes {productname} has already been loaded by another script on the page. -* Attempts to load `+mentions+` `+v3.0+` and `+powerpaste+` `+v6.0+` from {cloudname}. -* Attempts to load `+advcode+` from the self-hosted installation. -* Attempts to load all other premium plugins from those bundled with version `{productmajorversion}` of {productname}. +These channels are updated automatically and provide the latest {productname} version based on the following criteria: + +[#{productmajorversion}-release-channel] +==== {productmajorversion} Release Channel + +This channel deploys the latest release of {productname} that has passed our quality assurance process. The current version of {productname} available through the `/{productmajorversion}` channel can be found on the https://cdn.tiny.cloud/1/no-api-key/tinymce/{productmajorversion}/version.txt[{cloudname} {productname} {productmajorversion} version page]. The {productname} {productmajorversion} channel can be loaded from `{cdnurl}`. + +[#example-using-the-{productmajorversion}-release-channel] +===== Example: using the `{productmajorversion}` release channel [source,html,subs="attributes+"] ---- - + ---- -The disadvantage of `+plugins.min.js+`: to load only one plugin from the {cloudname} and the rest from a self-hosted deployment, *ALL* other plugins need to be added as query parameter with the version as `+sdk+`. When {cloudname} releases a new plugin, this will need to be updated. In situations where most premium plugins need to be loaded from a self-hosted deployment, use `+cloud-plugins.min.js+`. +[#{productmajorversion}-testing-release-channel] +==== {productmajorversion}-Testing Release Channel + +This channel deploys the current *release candidate* for the `{productmajorversion}` channel. The {productname} release candidate is undergoing quality assurance. The current version of {productname} available through the `{productmajorversion}-testing` channel can be found on the https://cdn.tiny.cloud/1/no-api-key/tinymce/{productmajorversion}-testing/version.txt[{cloudname} {productname} {productmajorversion}-testing version page]. + +[#example-using-the-{productmajorversion}-testing-release-channel] +===== Example: Using the `{productmajorversion}-testing` Release Channel -==== cloud-plugins.min.js +[source,html,subs="attributes+"] +---- + +---- -Instead of loading `+tinymce.min.js+` from {cloudname}, serve {productname} from a self-hosted server, and load `+cloud-plugins.min.js+` from {cloudname}. Unlike `+plugins.min.js+`, `+cloud-plugins.min.js+` defaults to loading every *premium* plugin from the *self-hosted {productname} installation*, not {cloudname}. However, plugins can be loaded from {cloudname} by specifying them as query parameters. +[#{productmajorversion}-dev-release-channel] +==== {productmajorversion}-Dev Release Channel -With `+cloud-plugins.min.js+`, the plugins listed in the query strings do not require a version. If there is no version specified, {productname} uses the version bundled with the {productname} version requested. There is also no need to specify `+sdk+` as the version for any plugin, as that is the default. +This channel deploys nightly builds of {productname}, which includes **unreleased changes** from the link:https://github.com/tinymce/tinymce/tree/main[{productname} repository^]. -The following example: +The current version of {productname} is available on the `{productmajorversion}-dev` channel can be found on the link:https://cdn.tiny.cloud/1/no-api-key/tinymce/{productmajorversion}-dev/version.txt[{cloudname} {productname} {productmajorversion}-dev version page^]. -* Assumes {productname} has already been loaded by another script on the page. -* Attempts to load `+mentions+` `+v3.0+` and `+powerpaste+` `+v6.0+` from {cloudname}. -* Attempts to load `+advcode+` from the version bundled with version `{productmajorversion}` of {productname} because it doesn't specify a version. -* Attempts to load all other premium plugins from the self-hosted installation. +[NOTE] +{productname} now uses `main` branch for nightly builds instead of `develop` as of {productname} `7.0.0`. + +[#example-using-the-{productmajorversion}-dev-release-channel] +===== Example: Using the `{productmajorversion}-dev` Release Channel [source,html,subs="attributes+"] ---- - ----- - -The disadvantage of `+cloud-plugins.min.js+`: every plugin to be loaded from {cloudname} must be added to the query parameter. When {cloudname} releases a new plugin, this will need to be updated. In situations where most premium plugins need to be loaded from {cloudname}, use `+plugins.min.js+`. + +---- \ No newline at end of file diff --git a/modules/ROOT/partials/misc/admon-script-tag-placement.adoc b/modules/ROOT/partials/misc/admon-script-tag-placement.adoc new file mode 100644 index 0000000000..312001c8fa --- /dev/null +++ b/modules/ROOT/partials/misc/admon-script-tag-placement.adoc @@ -0,0 +1,2 @@ +[IMPORTANT] +The cloud plugin script tag must be positioned between the {productname} script tag and the `tinymce.init()` call. For applications that bundle {productname}, delay the `tinymce.init()` call until after the cloud plugin script tag has loaded. This ensures that the cloud plugins are available when the editor is initialized. \ No newline at end of file From 0be99910151b4546d17b48238037f18a47a49e4a Mon Sep 17 00:00:00 2001 From: Andrew Herron Date: Mon, 20 May 2024 16:44:37 +1000 Subject: [PATCH 18/97] Rearrange advtemplate_list docs to make the example clearer (#3295) --- .../configuration/advtemplate_list.adoc | 52 +++++++++---------- 1 file changed, 26 insertions(+), 26 deletions(-) diff --git a/modules/ROOT/partials/configuration/advtemplate_list.adoc b/modules/ROOT/partials/configuration/advtemplate_list.adoc index 1ca1af3167..34148ff307 100644 --- a/modules/ROOT/partials/configuration/advtemplate_list.adoc +++ b/modules/ROOT/partials/configuration/advtemplate_list.adoc @@ -10,7 +10,32 @@ None *Return data:* `+Array+` -=== Example of `advtemplate_list` response +=== Example: using `advtemplate_list` + +[source,js] +---- +tinymce.init({ + selector: 'textarea#advtemplate', // change this value according to your html + plugins: ["advtemplate"], + advtemplate_list: () => + fetch('/categories', { + method: 'GET', + }) + .then((response) => response.json()) + .then((data) => data) + .catch((error) => console.log('Failed to get template list\n' + error)), +}); +---- + +The data returned by `advtemplate_list` must adhere to the following requirements: + +. Each list item must have a unique `id` value. +. Each list item must have a non-empty `title` value. +. Each category item is required to include an `items` sublist, which can be empty. +. Category items must not contain nested subcategories. +. Template item is not required to include a `content` value. + +=== Sample `advtemplate_list` response [source,js] ---- @@ -33,28 +58,3 @@ None } ] ---- - -The data returned by `advtemplate_list` must adhere to the following requirements: - -. Each list item must have a unique `id` value. -. Each list item must have a non-empty `title` value. -. Each category item is required to include an `items` sublist, which can be empty. -. Category items must not contain nested subcategories. -. Template item is not required to include a `content` value. - -=== Example: using `advtemplate_list` - -[source,js] ----- -tinymce.init({ - selector: 'textarea#advtemplate', // change this value according to your html - plugins: ["advtemplate"], - advtemplate_list: () => - fetch('/categories', { - method: 'GET', - }) - .then((response) => response.json()) - .then((data) => data) - .catch((error) => console.log('Failed to get template list\n' + error)), -}); ----- From 13ba869cd3931b0b19c59a016433d13a451ba8dd Mon Sep 17 00:00:00 2001 From: Farzad Hayat Date: Wed, 22 May 2024 17:03:35 +1000 Subject: [PATCH 19/97] DOC-2414: TinyMCE 7.1.1 Release Documentation (#3305) * DOC-2411: TinyMCE 7.1.1 Release Notes and Changelog. (#3285) * DOC-2411: 7.1.1 Release Notes template outline * DOC-2411: Resolved an issue where emojis were not loading correctly due to a broken CDN. (#3300) * DOC-2411: Add TINY-10892 release note entry (#3303) * DOC-2411: Clearing the formula input and then saving didn't remove the element (#3298) * DOC-2411: Clearing the formula input and then saving didn't remove the element. * Update 7.1.1-release-notes.adoc Co-authored-by: Farzad Hayat * Update 7.1.1-release-notes.adoc Co-authored-by: Farzad Hayat * Update 7.1.1-release-notes.adoc Co-authored-by: Farzad Hayat * Update 7.1.1-release-notes.adoc Co-authored-by: Farzad Hayat --------- Co-authored-by: Farzad Hayat * DOC-2411: Add TINY-10421 release note entry (#3287) * DOC-2411: Add TINY-10885 release note entry (#3286) * DOC-2411: Add TINY-10885 release note entry * Update modules/ROOT/pages/7.1.1-release-notes.adoc Co-authored-by: Karl Kemister-Sheppard --------- Co-authored-by: Karl Kemister-Sheppard * DOC-2411: Iframes in dialogs were not rendering rounded borders correctly. (#3302) * DOC-2411: Iframes in dialogs were not rendering rounded borders correctly. * Update modules/ROOT/pages/7.1.1-release-notes.adoc Co-authored-by: Farzad Hayat * Update modules/ROOT/pages/7.1.1-release-notes.adoc --------- Co-authored-by: Farzad Hayat * Add TinyMCE 7.1.1 to changelog.adoc * DOC-2411: Add TINY-10942 release note entry (#3304) Co-authored-by: Karl Kemister-Sheppard * DOC-2411: List with start attribute separated by tags resulted in wrong numbering of the lists. (#3299) * DOC-2411: List with start attribute separated by tags resulted in wrong numbering of the lists. * Update modules/ROOT/pages/7.1.1-release-notes.adoc Co-authored-by: tiny-ben-tran * Update modules/ROOT/pages/7.1.1-release-notes.adoc Co-authored-by: Karl Kemister-Sheppard --------- Co-authored-by: tiny-ben-tran * Clean up 7.1.1-release-notes.adoc and nav.adoc * Update modules/ROOT/pages/changelog.adoc * Update modules/ROOT/pages/7.1.1-release-notes.adoc * DOC-2411: re-arrange bug fixes to be inline with changelog.adoc. * fix 7.1.1 release date in changelog.adoc --------- Co-authored-by: Karl Kemister-Sheppard Co-authored-by: tiny-ben-tran * DOC-2426: copy edits to changelog.adoc and release notes 7.1.1. (#3306) --------- Co-authored-by: Karl Kemister-Sheppard Co-authored-by: tiny-ben-tran --- modules/ROOT/nav.adoc | 4 + modules/ROOT/pages/7.1.1-release-notes.adoc | 122 ++++++++++++++++++ modules/ROOT/pages/changelog.adoc | 76 +++++++---- modules/ROOT/pages/release-notes.adoc | 6 + .../configuration/emoticons_images_url.adoc | 4 +- 5 files changed, 182 insertions(+), 30 deletions(-) create mode 100644 modules/ROOT/pages/7.1.1-release-notes.adoc diff --git a/modules/ROOT/nav.adoc b/modules/ROOT/nav.adoc index 3c72c7acba..b49d86fdba 100644 --- a/modules/ROOT/nav.adoc +++ b/modules/ROOT/nav.adoc @@ -405,6 +405,10 @@ ** xref:tinymce-and-cors.adoc[Cross-Origin Resource Sharing (CORS)] * Release information ** xref:release-notes.adoc[Release notes for {productname} {productmajorversion}] +*** TinyMCE 7.1.1 +**** xref:7.1.1-release-notes.adoc#overview[Overview] +**** xref:7.1.1-release-notes.adoc#accompanying-premium-plugin-changes[Accompanying Premium Plugin changes] +**** xref:7.1.1-release-notes.adoc#bug-fixes[Bug fixes] *** {productname} 7.1 **** xref:7.1-release-notes.adoc#overview[Overview] **** * xref:7.1-release-notes.adoc#accompanying-premium-self-hosted-server-side-component-changes[Accompanying Premium self-hosted server-side component changes] diff --git a/modules/ROOT/pages/7.1.1-release-notes.adoc b/modules/ROOT/pages/7.1.1-release-notes.adoc new file mode 100644 index 0000000000..5ad3024d23 --- /dev/null +++ b/modules/ROOT/pages/7.1.1-release-notes.adoc @@ -0,0 +1,122 @@ += {productname} {release-version} +:release-version: 7.1.1 +:navtitle: {productname} {release-version} +:description: Release notes for {productname} {release-version} +:keywords: releasenotes, new, changes, bugfixes +:page-toclevels: 1 + +include::partial$misc/admon-releasenotes-for-stable.adoc[] + + +[[overview]] +== Overview + +{productname} {release-version} was released for {enterpriseversion} and {cloudname} on Wednesday, May 22^nd^, 2024. + +These release notes provide an overview of the changes for {productname} {release-version}, including: + +* xref:accompanying-premium-plugin-changes[Accompanying Premium plugin changes] +* xref:bug-fixes[Bug fixes] + + +[[accompanying-premium-plugin-changes]] +== Accompanying Premium plugin changes + +The following premium plugin updates were released alongside {productname} {release-version}. + + +=== Math Plugin + +The {productname} {release-version} release includes an accompanying release of the **Math** premium plugin. + +This **Math** premium plugin release includes the following fix: + +==== Clearing the formula input and then saving didn't remove the element. + +In the initial release of the Math Plugin, {productname} did not remove the selected formula and element when the user saved an empty formula. + +As a consequence, when the user cleared the formula and clicked "save", the selected formula and element remained in the editor. + +{productname} {release-version} addresses this issue. Now, when a user has a formula selected, clears it, and clicks "save", the selected formula and element are properly removed from the editor. + +For information on the **Math** plugin, see: xref:math.adoc[Math]. + +=== Enhanced Tables + +The {productname} {release-version} release includes an accompanying release of the **Enhanced Tables** premium plugin. + +This **Enhanced Tables** plugin release includes the following fix: + +==== The sort algorithm would sometimes incorrectly compare words that start with a digit. +// #TINY-10421 + +Previously in **Enhanced Tables**, when trying to sort a table where the cells contained text that started with numbers followed by words, the table would only consider the number part of the text when sorting. This would cause the table to incorrectly sort the words. + +For example, when trying to sort the following table by column ascending (A-Z): + +[cols="1", options="header"] +|=== +| Column 1 + +| 3banana +| 3apple +|=== + +The table would not sort them correctly due to it only considering the number part, so `3banana` would remain above `3apple`, even though `3apple` should come before `3banana` alphanumerically. + +This has been fixed in {productname} {release-version}. Now, when sorting a table with text that starts with a digit, the table considers the whole word not just the digits part. As a result, the table now correctly sorts words that start with a digit. + +For information on the **Enhanced Tables** plugin, see: xref:advtable.adoc[Enhanced Tables]. + + +[[bug-fixes]] +== Bug fixes + +{productname} {release-version} also includes the following bug fixes: + +=== Insert/Edit image dialog lost focus after the image upload completed. +// #TINY-10885 + +Previously, when using the {productname} editor's `Insert/Edit Image` dialog and uploading an image from the 'Upload' tab, the focus would move outside of the dialog after the image was successfully uploaded. + +As a consequence, users were unable to navigate within the dialog using the tab key. + +In {productname} {release-version}, this issue has been addressed. Now, the focus remains inside the `Insert/Edit Image` dialog after uploading an image, allowing users to navigate within the dialog using the keyboard as expected. + +=== Deleting into a list from a paragraph that has an `img` tag could cause extra inline styles to be added. +// #TINY-10892 + +Previously in {productname}, there was an issue with lists when the host browser was Google Chrome. The issue occurred when there was content with a list followed by a paragraph that contained an `img` element. If the cursor was placed at the start of the paragraph and the backspace key was pressed, the content of the paragraph would be merged into the list item, but the `img` element and other neighboring elements would get undesired inline font styles. + +This issue has been fixed in {productname} {release-version}. Now, a check has been added to prevent the inline styles from being added following this action. As a result, the resulting HTML no longer gets undesired inline styles, and the behavior is as expected. + +=== Resolved an issue where emojis configured with the `emojiimages` database were not loading correctly due to a broken CDN. +// #TINY-10878 + +Recently, the original CDN url {productname} used for the twitter emoji database was discontinued. + +As a consequence, all emoji's would not render, however this issue was resolved by the CDN owner by a redirect to an active link + +{productname} {release-version} addresses this issue. Now, {producname} has set the default CDN link to the actively maintained one. + +As a result, emoji's now render in all occasion without redirecting. + +For more information about these changes, see xref:emoticons.adoc#emoticons_images_url[Emoticons (emoticons_images_url)]. + +=== Iframes in dialogs were not rendering rounded borders correctly. +// #TINY-10901 + +Previously, when opening a dialog with an `iframe` element that had a different background color than the dialog, the corners of the dialog did not round off as expected as the border radius was applied to the `iframe` parent element and not the `iframe`. + +{productname} {release-version} addresses this issue by additionally applying the border radius to the `iframe` itself, ensuring that it renders correctly. + +As a result, borders now render properly, and the background of the `iframe` is no longer visible through to the parent dialog. + +=== Autocompleter possible values are no longer capped at a length of 10. +// #TINY-10942 + +Previously in {productname}, the Autocompleter option values were constrained to lengths of less than 10. + +As a consequence, the Autocompleter popover would close after only one value being selected if the selected value was greater than or equal to 10. This created a limitation for users who needed to select multiple values consecutively with lengths greater than 10. + +In {productname} {release-version}, this hardcoded limit of 10 has been removed. The Autocompleter now allows selection of multiple options consecutively with values of any length, while keeping the same popover open. \ No newline at end of file diff --git a/modules/ROOT/pages/changelog.adoc b/modules/ROOT/pages/changelog.adoc index 5bb5830563..bf25a8c50d 100644 --- a/modules/ROOT/pages/changelog.adoc +++ b/modules/ROOT/pages/changelog.adoc @@ -4,66 +4,82 @@ NOTE: This is the {productname} Community version changelog. For information about the latest {cloudname} or {enterpriseversion} Release, see: xref:release-notes.adoc[{productname} Release Notes]. -== 7.1 - 2024-05-08 +== 7.1.1 - 2024-05-22 -### Added +=== Fixed + +* Insert/Edit image dialog lost focus after the image upload completed. +// #TINY-10885 +* Deleting into a list from a paragraph that has an `img` tag could cause extra inline styles to be added. +// #TINY-10892 +* Resolved an issue where emojis configured with the `emojiimages` database were not loading correctly due to a broken CDN. +// #TINY-10878 +* Iframes in dialogs were not rendering rounded borders correctly. +// #TINY-10901 +* Autocompleter possible values are no longer capped at a length of 10. +// #TINY-10942 -- New `math-equation` icon. +== 7.1.0 - 2024-05-08 + +=== Added + +* New `math-equation` icon. // #TINY-10804 -### Improved +=== Improved -- Included `itemprop`, `itemscope`, and `itemtype` as valid HTML5 attributes in the core schema. +* Included `itemprop`, `itemscope`, and `itemtype` as valid HTML5 attributes in the core schema. // #TINY-9932 -- Improved accessibility for notifications: added tooltips, keyboard navigation, and a shortcut to focus on notifications. +* Improved accessibility for notifications: added tooltips, keyboard navigation, and a shortcut to focus on notifications. // #TINY-6925 -- Removed `aria-pressed` from the `More` button in sliding toolbar mode and replaced it with `aria-expanded`. +* Removed `aria-pressed` from the `More` button in sliding toolbar mode and replaced it with `aria-expanded`. // #TINY-10795 -- The editor UI now renders correctly in Windows High Contrast Mode. +* The editor UI now renders correctly in Windows High Contrast Mode. // #TINY-10781 -### Fixed +=== Fixed -- Backspacing in certain HTML setups caused data to move around unexpectedly. +* Backspacing in certain HTML setups caused data to move around unexpectedly. // #TINY-10590 -- Dialog title markup was changed to use an `h1` element instead of a `div`. +* Dialog title markup was changed to use an `h1` element instead of a `div`. // #TINY-10800 -- The dialog title was not announced in macOS VoiceOver; dialogs now use `aria-label` instead of `aria-labelledby` on macOS. +* The dialog title was not announced in macOS VoiceOver; dialogs now use `aria-label` instead of `aria-labelledby` on macOS. // #TINY-10808 -- The theme loader did not respect the suffix when loading skin CSS files. +* The theme loader did not respect the suffix when loading skin CSS files. // #TINY-10602 -- Custom block elements with colon characters would throw errors. +* Custom block elements with colon characters would throw errors. // #TINY-10813 -- Tab navigation in views didn't work. +* Tab navigation in views didn't work. // #TINY-10780 -- Video and audio elements couldn't be played on Safari. +* Video and audio elements couldn't be played on Safari. // #TINY-10774 -- The `ToggleToolbarDrawer` command did not toggle the toolbar in `sliding` mode when the `skipFocus: true` parameter was passed. +* The `ToggleToolbarDrawer` command did not toggle the toolbar in `sliding` mode when the `skipFocus: true` parameter was passed. // #TINY-10726 -- The buttons in the custom view header were clipped when overflowing. +* The buttons in the custom view header were clipped when overflowing. // #TINY-10741 -- In the custom view, the scrollbar of the container was not visible if its height was greater than the editor. +* In the custom view, the scrollbar of the container was not visible if its height was greater than the editor. // #TINY-10741 -- Fixed an accessibility issue by removing the duplicate `role="menu"` attribute from color swatches. +* Fixed an accessibility issue by removing the duplicate `role="menu"` attribute from color swatches. // #TINY-10806 -- Fullscreen mode now prevents focus from leaving the editor. +* Fullscreen mode now prevents focus from leaving the editor. // #TINY-10597 -- The "Open Link" context menu action did not work when the selection surrounded a link. +* The "Open Link" context menu action did not work when the selection surrounded a link. // #TINY-10391 -- Styles were not retained when toggling a list on and off. +* Styles were not retained when toggling a list on and off. // #TINY-10837 -- Caret and placeholder text were invisible in Windows High Contrast Mode. +* Caret and placeholder text were invisible in Windows High Contrast Mode. // #TINY-9811 -- Firefox did not announce the iframe title when `iframe_aria_text` was set. +* Firefox did not announce the iframe title when `iframe_aria_text` was set. // #TINY-10718 -- Notification width was not constrained to the width of the editor. +* Notification width was not constrained to the width of the editor. // #TINY-10886 -- The "Open Link" context menu action was not enabled for links on images. +* The "Open Link" context menu action was not enabled for links on images. // #TINY-10391 == 7.0.1 - 2024-04-10 === Fixed + * Toggle list behavior generated wrong HTML when the `forced_root_block` option was set to `div`. // #TINY-10488 * Tapping inside a composed text on Firefox Android would not close the autocompleter. @@ -75,13 +91,13 @@ NOTE: This is the {productname} Community version changelog. For information abo * The status bar was invisible when the editor's height was set to the minimum. // #TINY-10705 - == 7.0.0 - 2024-03-20 [NOTE] {productname} 7.0 is licensed under GPL Version 2 or later. This version introduces a new `license_key` configuration setting that gives self-hosted users the ability to select a usage under the GPL or to authenticate their paid license with Tiny. === Added + * New `license_key` option that must be set to `gpl` or a valid license key. // #TINY-10681 * New custom tooltip functionality, tooltip will be shown when hovering with a mouse or with keyboard focus. @@ -107,6 +123,7 @@ NOTE: This is the {productname} Community version changelog. For information abo * Added importword, exportpdf and exportword menu items to default file menu. === Improved + * Included keyboard shortcut in custom tooltip for `ToolbarButton` and `ToolbarToggleButton`. // #TINY-10487 * Improved showing which element has focus for keyboard navigation. @@ -119,6 +136,7 @@ NOTE: This is the {productname} Community version changelog. For information abo // #TINY-10658 === Changed + * {productname} is now licensed GPL Version 2 or later. // #TINY-10578 * `convert_unsafe_embeds` editor option is now defaulted to `true`. @@ -151,6 +169,7 @@ NOTE: This is the {productname} Community version changelog. For information abo // #TINY-10694 === Removed + * Deprecated `force_hex_color` option, with the default now being all colors are forced to hex format as lower case. // #TINY-10436 * Deprecated `remove_trailing_brs` option from DomParser. @@ -167,6 +186,7 @@ NOTE: This is the {productname} Community version changelog. For information abo // #TINY-10654 === Fixed + * When deleting the last row in a table, the cursor would jump to the first cell (top left), instead of moving to the next adjacent cell in some cases. // #TINY-6309 * Heading formatting would be partially applied to the content within the `summary` element when the caret was positioned between words. diff --git a/modules/ROOT/pages/release-notes.adoc b/modules/ROOT/pages/release-notes.adoc index b981f531ff..0e3b097167 100644 --- a/modules/ROOT/pages/release-notes.adoc +++ b/modules/ROOT/pages/release-notes.adoc @@ -9,6 +9,12 @@ This section lists the releases for {productname} 7 and the changes made in each [cols="1,1"] |=== +a| +[.lead] +xref:7.1.1-release-notes.adoc#overview[{productname} 7.1.1] + +Release notes for {productname} 7.1.1 + a| [.lead] xref:7.1-release-notes.adoc#overview[{productname} 7.1] diff --git a/modules/ROOT/partials/configuration/emoticons_images_url.adoc b/modules/ROOT/partials/configuration/emoticons_images_url.adoc index 91c79c0cba..9fed184349 100644 --- a/modules/ROOT/partials/configuration/emoticons_images_url.adoc +++ b/modules/ROOT/partials/configuration/emoticons_images_url.adoc @@ -3,11 +3,11 @@ This option sets the base URL for the images used to represent emojis when using the `+emojiimages+` database. -By default, this option loads the required image _assets_ from the Twemoji CDN. To use self-hosted emoji images, download the image _assets_ from the https://github.com/twitter/twemoji/#download[Twitter Emoji (twemoji) GitHub repository]. +By default, this option loads the required image _assets_ from the Twemoji CDN. To use self-hosted emoji images, download the image _assets_ from the https://github.com/jdecked/twemoji/#download[Twitter Emoji (Twemoji) GitHub repository]. *Type:* `+String+` -*Default value:* `+'https://twemoji.maxcdn.com/v/13.0.1/72x72/'+` +*Default value:* `+'https://cdnjs.cloudflare.com/ajax/libs/twemoji/15.1.0/72x72/'+` === Example: using `+emoticons_images_url+` From 0a075477538eaf2a5418965270d0cdff46781bb1 Mon Sep 17 00:00:00 2001 From: Karl Kemister-Sheppard Date: Wed, 22 May 2024 18:51:42 +1000 Subject: [PATCH 20/97] DOC-2413: api-version bump for TinyMCE 7.1.1. (#3307) --- .api-version | 2 +- modules/ROOT/pages/apis/tinymce.util.eventdispatcher.adoc | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.api-version b/.api-version index 3769235d3e..ef09838cb2 100644 --- a/.api-version +++ b/.api-version @@ -1 +1 @@ -7.1.0 \ No newline at end of file +7.1.1 \ No newline at end of file diff --git a/modules/ROOT/pages/apis/tinymce.util.eventdispatcher.adoc b/modules/ROOT/pages/apis/tinymce.util.eventdispatcher.adoc index 5bcf4630a3..db67455205 100644 --- a/modules/ROOT/pages/apis/tinymce.util.eventdispatcher.adoc +++ b/modules/ROOT/pages/apis/tinymce.util.eventdispatcher.adoc @@ -28,7 +28,7 @@ eventDispatcher.dispatch('click', { data: 123 }); |xref:#fire[fire()]|Fires the specified event by name. -__Deprecated in TinyMCE 6.0 and has been marked for removal in TinyMCE 7.0. Use `dispatch` instead.__|`xref:apis/tinymce.util.eventdispatcher.adoc[EventDispatcher]` +__Marked for removal in TinyMCE 8.0. Use `dispatch` instead.__|`xref:apis/tinymce.util.eventdispatcher.adoc[EventDispatcher]` |xref:#has[has()]|Returns true/false if the dispatcher has a event of the specified name.|`xref:apis/tinymce.util.eventdispatcher.adoc[EventDispatcher]` |xref:#isNative[isNative()]|Returns true/false if the specified event name is a native browser event or not.|`xref:apis/tinymce.util.eventdispatcher.adoc[EventDispatcher]` |xref:#off[off()]|Unbinds an event listener to a specific event by name.|`xref:apis/tinymce.util.eventdispatcher.adoc[EventDispatcher]` @@ -74,7 +74,7 @@ fire(name: String, args: Object?): Object Fires the specified event by name. -__Deprecated in TinyMCE 6.0 and has been marked for removal in TinyMCE 7.0. Use `dispatch` instead.__ +__Marked for removal in TinyMCE 8.0. Use `dispatch` instead.__ ==== Examples [source, javascript] From 7899eff85587c3f4f83d8974b295c27b199b3250 Mon Sep 17 00:00:00 2001 From: Daniel Oakman <141111365+danoaky-tiny@users.noreply.github.com> Date: Wed, 5 Jun 2024 10:00:16 +1000 Subject: [PATCH 21/97] DOC-2346: Updated Angular technical reference page to support tinymce-angular v8 changes (#3314) * DOC-2346: Added licenseKey info * DOC-2346: Updated Angular version table * DOC-2346: Updated event list * Update modules/ROOT/partials/integrations/angular-tech-ref.adoc Co-authored-by: Karl Kemister-Sheppard * Update modules/ROOT/partials/integrations/angular-tech-ref.adoc Co-authored-by: Karl Kemister-Sheppard --------- Co-authored-by: Karl Kemister-Sheppard --- .../integrations/angular-tech-ref.adoc | 31 ++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/modules/ROOT/partials/integrations/angular-tech-ref.adoc b/modules/ROOT/partials/integrations/angular-tech-ref.adoc index bad6fddeb7..f915cab951 100644 --- a/modules/ROOT/partials/integrations/angular-tech-ref.adoc +++ b/modules/ROOT/partials/integrations/angular-tech-ref.adoc @@ -5,6 +5,7 @@ * xref:using-the-tinymce-angular-integration[Using the TinyMCE Angular integration] * xref:configuring-the-editor[Configuring the editor] ** xref:apikey[`+apiKey+`] +** xref:licensekey[`+licenseKey+`] ** xref:cloudchannel[`+cloudChannel+`] ** xref:disabled[`+disabled+`] ** xref:id[`+id+`] @@ -32,7 +33,9 @@ The following table shows the supported versions of Angular and the required ver [cols="^,^",options="header"] |=== |Angular Version |`+tinymce-angular+` version -|13+ |5.x or newer +|16+ |8.x +|14 or 15 |7.x +|13 |6.x |9 to 12 |4.x |5 to 8 |3.x |4 or older |Not Supported @@ -126,6 +129,28 @@ include::partial$misc/get-an-api-key.adoc[] > ---- +[[licensekey]] +=== `+licenseKey+` + +{cloudname} License key. + +Use this when self-hosting {productname} instead of loading from {cloudname}. For more information, see: xref:license-key.adoc[License Key]. + +*Type:* `+String+` + +*Default value:* `+undefined+` + +*Possible values:* `undefined`, `'gpl'` or a valid {productname} license key + +==== Example: using `+licenseKey+` + +[source,jsx] +---- + +---- + [[cloudchannel]] === `+cloudChannel+` @@ -406,6 +431,9 @@ The following events are available: * `+onBlur+` * `+onClick+` * `+onContextMenu+` +* `+onCompositionEnd+` +* `+onCompositionStart+` +* `+onCompositionUpdate+` * `+onCopy+` * `+onCut+` * `+onDblclick+` @@ -418,6 +446,7 @@ The following events are available: * `+onFocus+` * `+onFocusIn+` * `+onFocusOut+` +* `+onInput+` * `+onKeyDown+` * `+onKeyPress+` * `+onKeyUp+` From 91b829f58e30cd59db514e0a3b7ce0720e3070d8 Mon Sep 17 00:00:00 2001 From: Karl Kemister-Sheppard Date: Wed, 5 Jun 2024 11:33:38 +1000 Subject: [PATCH 22/97] DOC-2383: Update Svelte Integration's Technical Reference page for TinyMCE V7 release. (#3315) * DOC-2383: Update Svelte Integration's Technical Reference page for TinyMCE V7 release. * DOC-2383: Update Svelte tech ref to include ID as an anchor point. * Update modules/ROOT/partials/integrations/svelte-tech-ref.adoc Co-authored-by: Mitchell Crompton --------- Co-authored-by: Mitchell Crompton --- .../integrations/svelte-tech-ref.adoc | 37 ++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) diff --git a/modules/ROOT/partials/integrations/svelte-tech-ref.adoc b/modules/ROOT/partials/integrations/svelte-tech-ref.adoc index 90aadb9d79..cd0b263586 100644 --- a/modules/ROOT/partials/integrations/svelte-tech-ref.adoc +++ b/modules/ROOT/partials/integrations/svelte-tech-ref.adoc @@ -1,6 +1,14 @@ Covered in this section: * xref:configuring-the-tinymce-svelte-integration[Configuring the TinyMCE Svelte integration] +** xref:apikey[apiKey] +** xref:licensekey[licenseKey] +** xref:channel[channel] +** xref:id[id] +** xref:inline[inline] +** xref:disabled[disabled] +** xref:scriptsrc[scriptsrc] +** xref:conf[conf] * xref:component-binding[Component binding] * xref:event-binding[Event binding] @@ -43,6 +51,28 @@ The `+tinymce-svelte+` `+Editor+` component accepts the following properties: /> ---- +[[licenseKey]] +=== `+licenseKey+` + +{cloudname} License key. + +Use this when self-hosting {productname} instead of loading from {cloudname}. For more information, see: xref:license-key.adoc[License Key]. + +*Type:* `+String+` + +*Default value:* `+undefined+` + +*Possible values:* `undefined`, `'gpl'` or a valid {productname} license key + +==== Example: using `+licenseKey+` + +[source,jsx] +---- + +---- + [[channel]] === `+channel+` @@ -229,6 +259,10 @@ The following events are available: * `+change+` * `+clearundos+` * `+click+` +* `+CommentChange+` +* `+CompositionEnd+` +* `+CompositionStart+` +* `+CompositionUpdate+` * `+contextmenu+` * `+copy+` * `+cut+` @@ -248,6 +282,7 @@ The following events are available: * `+getcontent+` * `+hide+` * `+init+` +* `+input+` * `+keydown+` * `+keypress+` * `+keyup+` @@ -279,4 +314,4 @@ The following events are available: * `+show+` * `+submit+` * `+undo+` -* `+visualaid+` +* `+visualaid+` \ No newline at end of file From b1742a19df8761161a821dfca7673c81c8b2e83d Mon Sep 17 00:00:00 2001 From: Karl Kemister-Sheppard Date: Wed, 5 Jun 2024 11:52:35 +1000 Subject: [PATCH 23/97] DOC-2382: Add license key documentation to Vue integration guide. (#3317) --- .../partials/integrations/vue-tech-ref.adoc | 30 ++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/modules/ROOT/partials/integrations/vue-tech-ref.adoc b/modules/ROOT/partials/integrations/vue-tech-ref.adoc index 354b9c98a2..d2ea3334aa 100644 --- a/modules/ROOT/partials/integrations/vue-tech-ref.adoc +++ b/modules/ROOT/partials/integrations/vue-tech-ref.adoc @@ -4,6 +4,7 @@ * xref:using-the-tinymce-vuejs-integration[Using the TinyMCE Vue.js integration] * xref:configuring-the-editor[Configuring the editor] ** xref:api-key[`+api-key+`] +** xref:license-key[`+licenseKey+`] ** xref:cloud-channel[`+cloud-channel+`] ** xref:disabled[`+disabled+`] ** xref:id[`+id+`] @@ -124,6 +125,28 @@ include::partial$misc/get-an-api-key.adoc[] /> ---- +[[license-key]] +=== `+licenseKey+` + +{cloudname} License key. + +Use this when self-hosting {productname} instead of loading from {cloudname}. For more information, see: xref:license-key.adoc[License Key]. + +*Type:* `+String+` + +*Default value:* `+undefined+` + +*Possible values:* `undefined`, `'gpl'` or a valid {productname} license key + +==== Example: using `+licenseKey+` + +[source,html] +---- + +---- + [[cloud-channel]] === `+cloud-channel+` @@ -412,6 +435,10 @@ The following events are available: * `+clearUndos+` * `+click+` * `+contextMenu+` +* `+commentChange+` +* `+compositionEnd+` +* `+compositionStart+` +* `+compositionUpdate+` * `+copy+` * `+cut+` * `+dblclick+` @@ -430,6 +457,7 @@ The following events are available: * `+getContent+` * `+hide+` * `+init+` +* `+input+` * `+keyDown+` * `+keyPress+` * `+keyUp+` @@ -460,4 +488,4 @@ The following events are available: * `+show+` * `+submit+` * `+undo+` -* `+visualAid+` +* `+visualAid+` \ No newline at end of file From 96731400d33626dd05d23019e926fa95369ad36d Mon Sep 17 00:00:00 2001 From: Karl Kemister-Sheppard Date: Wed, 5 Jun 2024 13:12:13 +1000 Subject: [PATCH 24/97] DOC-2432: Update mention text of `radio` buttons to read `checkbox` instead. (#3316) * DOC-2432: Update mention text of radio buttons to read checkbox instead. * Update modules/ROOT/pages/pageembed.adoc Co-authored-by: Mitchell Crompton --------- Co-authored-by: Mitchell Crompton --- modules/ROOT/pages/pageembed.adoc | 4 ++-- modules/ROOT/pages/permanentpen.adoc | 2 +- modules/ROOT/pages/tinydrive-dropbox-integration.adoc | 2 +- modules/ROOT/pages/tinydrive-googledrive-integration.adoc | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/modules/ROOT/pages/pageembed.adoc b/modules/ROOT/pages/pageembed.adoc index a3f9c25a5f..74775ba05d 100644 --- a/modules/ROOT/pages/pageembed.adoc +++ b/modules/ROOT/pages/pageembed.adoc @@ -58,8 +58,8 @@ NOTE: The *Responsive* option has pre-defined width and height values. The *Widt . In the *Advanced* tab, provide a name and title for the iframe in the *Name* and *Title* fields. . The *Long description URL* field can be used to describe an iframe by including text in a separate resource when a short text alternative does not adequately convey the function or information provided in the iframe. * Click on the image:icons/browse.svg[Source](*Long description URL*) icon to upload a description file. -. Click on the *Show iframe border* radio button to display iframe borders. -. Click on the *Scrollbar* radio button to add scrollbars to the iframe. +. Click on the *Show iframe border* checkbox to display iframe borders. +. Click on the *Scrollbar* checkbox button to add scrollbars to the iframe. . Click *Save* to save and exit or *Cancel* to dismiss and exit. *Result*: An iframe of the configured size is inserted in the desired location within the content. diff --git a/modules/ROOT/pages/permanentpen.adoc b/modules/ROOT/pages/permanentpen.adoc index 6cbe0f5166..1710e2dcfe 100644 --- a/modules/ROOT/pages/permanentpen.adoc +++ b/modules/ROOT/pages/permanentpen.adoc @@ -87,7 +87,7 @@ NOTE: The Permanent Pen has to be enabled to access the *Permanent Pen Propertie . Open the *Permanent Pen Properties* dialog box using any of the above methods. image:permanent-pen-props.png[Permanent pen properties] . Select the desired settings from the *Font* and *Size* drop-down menus. -. To select the desired *Styles*, click on the radio button next to *Bold*, *Italic*, *Strikethrough*, or *Underline*. +. To select the desired *Styles*, click on the checkbox button next to *Bold*, *Italic*, *Strikethrough*, or *Underline*. . Choose the desired *Text color*. . Select the desired *Background color* . Press *Ok* to save or *Cancel* to dismiss. diff --git a/modules/ROOT/pages/tinydrive-dropbox-integration.adoc b/modules/ROOT/pages/tinydrive-dropbox-integration.adoc index d20dcc2b3a..96ee746f35 100644 --- a/modules/ROOT/pages/tinydrive-dropbox-integration.adoc +++ b/modules/ROOT/pages/tinydrive-dropbox-integration.adoc @@ -51,7 +51,7 @@ For information on other {cloudfilemanager} config options refer to the xref:tin . From the {productname} user interface, click on the image:insertimage.png[Insert/edit image] button to access the {cloudfilemanager} user interface. . Click on the image:upload.png[Upload/Create] button to select Dropbox from the list of storages. -. Select the file to upload/import from Dropbox by clicking on the radio button next to it and click the *Choose* button to upload or *Cancel* to abort the operation. +. Select the file to upload/import from Dropbox by clicking on the checkbox button next to it and click the *Choose* button to upload or *Cancel* to abort the operation. . Alternatively, files from your local browser can be uploaded to the Dropbox by clicking on the *Upload files* option and selecting the files to upload. *Result:* You should be able to view the selected files in your {cloudfilemanager} storage. diff --git a/modules/ROOT/pages/tinydrive-googledrive-integration.adoc b/modules/ROOT/pages/tinydrive-googledrive-integration.adoc index 5a2f518778..296616bafa 100644 --- a/modules/ROOT/pages/tinydrive-googledrive-integration.adoc +++ b/modules/ROOT/pages/tinydrive-googledrive-integration.adoc @@ -74,7 +74,7 @@ For information on other {cloudfilemanager} config options refer to the xref:tin . From the {productname} user interface, click on the image:insertimage.png[Insert/edit image] button to access the {cloudfilemanager} user interface. . Click on the image:upload.png[Upload/Create] button to select Google Drive from the list of storages. -. Select the file to upload/import from Google Drive by clicking on the radio button next to it. Alternatively, to directly insert the file into the editor, double-click on it. +. Select the file to upload/import from Google Drive by clicking on the checkbox button next to it. Alternatively, to directly insert the file into the editor, double-click on it. . Choose *Save* to upload/import the selected file/files to {cloudfilemanager}. *Result:* You should be able to view the selected files in your {cloudfilemanager} storage. From a540b4f13390d9a08ec39513d32711e74196b04d Mon Sep 17 00:00:00 2001 From: Karl Kemister-Sheppard Date: Wed, 5 Jun 2024 13:57:50 +1000 Subject: [PATCH 25/97] DOC-2432: remove button reference in previous PR. (#3318) --- modules/ROOT/pages/pageembed.adoc | 2 +- modules/ROOT/pages/permanentpen.adoc | 2 +- modules/ROOT/pages/tinydrive-dropbox-integration.adoc | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/ROOT/pages/pageembed.adoc b/modules/ROOT/pages/pageembed.adoc index 74775ba05d..cc88b7a8c9 100644 --- a/modules/ROOT/pages/pageembed.adoc +++ b/modules/ROOT/pages/pageembed.adoc @@ -59,7 +59,7 @@ NOTE: The *Responsive* option has pre-defined width and height values. The *Widt . The *Long description URL* field can be used to describe an iframe by including text in a separate resource when a short text alternative does not adequately convey the function or information provided in the iframe. * Click on the image:icons/browse.svg[Source](*Long description URL*) icon to upload a description file. . Click on the *Show iframe border* checkbox to display iframe borders. -. Click on the *Scrollbar* checkbox button to add scrollbars to the iframe. +. Click on the *Scrollbar* checkbox to add scrollbar to the iframe. . Click *Save* to save and exit or *Cancel* to dismiss and exit. *Result*: An iframe of the configured size is inserted in the desired location within the content. diff --git a/modules/ROOT/pages/permanentpen.adoc b/modules/ROOT/pages/permanentpen.adoc index 1710e2dcfe..a9e6bf4056 100644 --- a/modules/ROOT/pages/permanentpen.adoc +++ b/modules/ROOT/pages/permanentpen.adoc @@ -87,7 +87,7 @@ NOTE: The Permanent Pen has to be enabled to access the *Permanent Pen Propertie . Open the *Permanent Pen Properties* dialog box using any of the above methods. image:permanent-pen-props.png[Permanent pen properties] . Select the desired settings from the *Font* and *Size* drop-down menus. -. To select the desired *Styles*, click on the checkbox button next to *Bold*, *Italic*, *Strikethrough*, or *Underline*. +. To select the desired *Styles*, click on the checkbox next to *Bold*, *Italic*, *Strikethrough*, or *Underline*. . Choose the desired *Text color*. . Select the desired *Background color* . Press *Ok* to save or *Cancel* to dismiss. diff --git a/modules/ROOT/pages/tinydrive-dropbox-integration.adoc b/modules/ROOT/pages/tinydrive-dropbox-integration.adoc index 96ee746f35..26d76ffb91 100644 --- a/modules/ROOT/pages/tinydrive-dropbox-integration.adoc +++ b/modules/ROOT/pages/tinydrive-dropbox-integration.adoc @@ -51,7 +51,7 @@ For information on other {cloudfilemanager} config options refer to the xref:tin . From the {productname} user interface, click on the image:insertimage.png[Insert/edit image] button to access the {cloudfilemanager} user interface. . Click on the image:upload.png[Upload/Create] button to select Dropbox from the list of storages. -. Select the file to upload/import from Dropbox by clicking on the checkbox button next to it and click the *Choose* button to upload or *Cancel* to abort the operation. +. Select the file to upload/import from Dropbox by clicking on the checkbox next to it and click the *Choose* button to upload or *Cancel* to abort the operation. . Alternatively, files from your local browser can be uploaded to the Dropbox by clicking on the *Upload files* option and selecting the files to upload. *Result:* You should be able to view the selected files in your {cloudfilemanager} storage. From 186b6b83cc094844dd545faabc74a6cb87e6b10c Mon Sep 17 00:00:00 2001 From: Karl Kemister-Sheppard Date: Wed, 5 Jun 2024 15:21:53 +1000 Subject: [PATCH 26/97] DOC-2433: TinyMCE `7.1.2` release documentation. (#3309) * DOC-2433: Create release/7.1.2 release target branch. * DOC-2419: TinyMCE 7.1.2 release notes and changelog. (#3310) * DOC-2419: TinyMCE 7.1.2 release notes and changelog. * DOC-2419: add changelog date. * DOC-2419: Acronyms were not managed correctly. (#3313) * DOC-2419: Acronyms were not managed correctly. * DOC-2419: remove spellchecker entry. * DOC-2419: CSS color values set to `transparent` were incorrectly converted to `#000000`. (#3312) * DOC-2419: CSS color values set to transparent were incorrectly converted to #000000. * Update modules/ROOT/pages/7.1.2-release-notes.adoc Co-authored-by: Arvin(Jintao) Han <20640097+ArvinJ-H@users.noreply.github.com> * Update modules/ROOT/pages/7.1.2-release-notes.adoc * Update modules/ROOT/pages/7.1.2-release-notes.adoc Co-authored-by: Mitchell Crompton --------- Co-authored-by: Arvin(Jintao) Han <20640097+ArvinJ-H@users.noreply.github.com> Co-authored-by: Mitchell Crompton * DOC-2419: Math icon state was not set to `active` on math element selection. (#3311) * DOC-2419: Math icon state was not set to active on math element selection. * Update modules/ROOT/pages/7.1.2-release-notes.adoc * Update modules/ROOT/pages/7.1.2-release-notes.adoc Co-authored-by: Mitchell Crompton --------- Co-authored-by: Mitchell Crompton * DOC-2419: cleanup release notes template and added changelog. --------- Co-authored-by: Arvin(Jintao) Han <20640097+ArvinJ-H@users.noreply.github.com> Co-authored-by: Mitchell Crompton --------- Co-authored-by: Arvin(Jintao) Han <20640097+ArvinJ-H@users.noreply.github.com> Co-authored-by: Mitchell Crompton --- modules/ROOT/nav.adoc | 6 +- modules/ROOT/pages/7.1.1-release-notes.adoc | 2 +- modules/ROOT/pages/7.1.2-release-notes.adoc | 63 +++++++++++++++++++++ modules/ROOT/pages/changelog.adoc | 6 ++ modules/ROOT/pages/release-notes.adoc | 6 ++ 5 files changed, 81 insertions(+), 2 deletions(-) create mode 100644 modules/ROOT/pages/7.1.2-release-notes.adoc diff --git a/modules/ROOT/nav.adoc b/modules/ROOT/nav.adoc index b49d86fdba..39e3d50c27 100644 --- a/modules/ROOT/nav.adoc +++ b/modules/ROOT/nav.adoc @@ -405,7 +405,11 @@ ** xref:tinymce-and-cors.adoc[Cross-Origin Resource Sharing (CORS)] * Release information ** xref:release-notes.adoc[Release notes for {productname} {productmajorversion}] -*** TinyMCE 7.1.1 +*** {productname} 7.1.2 +**** xref:7.1.2-release-notes.adoc#overview[Overview] +**** xref:7.1.2-release-notes.adoc#accompanying-premium-plugin-changes[Accompanying Premium Plugin changes] +**** xref:7.1.2-release-notes.adoc#bug-fixes[Bug fixes] +*** {productname} 7.1.1 **** xref:7.1.1-release-notes.adoc#overview[Overview] **** xref:7.1.1-release-notes.adoc#accompanying-premium-plugin-changes[Accompanying Premium Plugin changes] **** xref:7.1.1-release-notes.adoc#bug-fixes[Bug fixes] diff --git a/modules/ROOT/pages/7.1.1-release-notes.adoc b/modules/ROOT/pages/7.1.1-release-notes.adoc index 5ad3024d23..dcfed4d2dc 100644 --- a/modules/ROOT/pages/7.1.1-release-notes.adoc +++ b/modules/ROOT/pages/7.1.1-release-notes.adoc @@ -97,7 +97,7 @@ Recently, the original CDN url {productname} used for the twitter emoji database As a consequence, all emoji's would not render, however this issue was resolved by the CDN owner by a redirect to an active link -{productname} {release-version} addresses this issue. Now, {producname} has set the default CDN link to the actively maintained one. +{productname} {release-version} addresses this issue. Now, {productname} has set the default CDN link to the actively maintained one. As a result, emoji's now render in all occasion without redirecting. diff --git a/modules/ROOT/pages/7.1.2-release-notes.adoc b/modules/ROOT/pages/7.1.2-release-notes.adoc new file mode 100644 index 0000000000..03476faf9f --- /dev/null +++ b/modules/ROOT/pages/7.1.2-release-notes.adoc @@ -0,0 +1,63 @@ += {productname} {release-version} +:release-version: 7.1.2 +:navtitle: {productname} {release-version} +:description: Release notes for {productname} {release-version} +:keywords: releasenotes, new, changes, bugfixes +:page-toclevels: 1 + +include::partial$misc/admon-releasenotes-for-stable.adoc[] + +[[overview]] +== Overview + +{productname} {release-version} was released for {enterpriseversion} and {cloudname} on Wednesday, June 05^th^, 2024. These release notes provide an overview of the changes for {productname} {release-version}, including: + +* xref:accompanying-premium-plugin-changes[Accompanying Premium plugin changes] +* xref:bug-fixes[Bug fixes] + + +[[accompanying-premium-plugin-changes]] +== Accompanying Premium plugin changes + +The following premium plugin updates were released alongside {productname} {release-version}. + +=== Math Plugin + +The {productname} {release-version} release includes an accompanying release of the **Math** premium plugin. + +This **Math** premium plugin release includes the following fix: + +==== Math icon state was not set to active on math element selection. +// #TINY-10931 + +Previously, the Math icon was not set to active when a math element was selected within the editor. + +As a consequence, users had no visual indication that a math element was selected or that it could be edited by selecting it and then clicking the toolbar button. + +{productname} {release-version} addresses this issue. Now, when any Math element is selected, the button's active state is triggered. + +For information on the **Math** plugin, see: xref:math.adoc[Math]. + +[[bug-fixes]] +== Bug fixes + +{productname} {release-version} also includes the following bug fixes: + +=== CSS color values set to `transparent` were incorrectly converted to `+#000000+`. +// #TINY-10916 + +Previously, transparent color values were incorrectly converted to `+#000000+`, deviating from the behavior observed in earlier major versions. Additionally, {productname} does not export the last two digits of the hex string, so the alpha value is lost, causing transparent to be converted to `+#000000+`. + +{productname} {release-version} addresses this issue by, removing the if statement that handles transparent since it is no longer needed. As a result, the transparent property will be retained as a transparent string instead of converting to other values. This change is consistent with the behavior in {productname} v5, v6. + +[[acronyms-were-not-managed-correctly]] +=== Acronyms were not managed correctly. +// #TINY-10904 + +Previously, acronyms were not managed correctly which caused false positive results with Spell Checker premium plugin. In this case, the check was separating the words excluding the dot at the end also when we check the acronyms. + +As a consequence, Spell Checker Premium plugin would identify acronyms without the last dot, highlighting them as errors. + +{productname} {release-version} addresses this issue. Now, If the word is an abbreviation, {productname} includes the next character if it is a period. + +As a result, acronyms are now managed correctly, and the Spell Checker retrieves the correct word (with the dot included) and provides accurate results. \ No newline at end of file diff --git a/modules/ROOT/pages/changelog.adoc b/modules/ROOT/pages/changelog.adoc index bf25a8c50d..299f2dbbac 100644 --- a/modules/ROOT/pages/changelog.adoc +++ b/modules/ROOT/pages/changelog.adoc @@ -4,6 +4,12 @@ NOTE: This is the {productname} Community version changelog. For information about the latest {cloudname} or {enterpriseversion} Release, see: xref:release-notes.adoc[{productname} Release Notes]. +== 7.1.2 - 2024-06-05 + +### Fixed +- CSS color values set to `transparent` were incorrectly converted to '#000000`. +// #TINY-10916 + == 7.1.1 - 2024-05-22 === Fixed diff --git a/modules/ROOT/pages/release-notes.adoc b/modules/ROOT/pages/release-notes.adoc index 0e3b097167..903464bb90 100644 --- a/modules/ROOT/pages/release-notes.adoc +++ b/modules/ROOT/pages/release-notes.adoc @@ -9,6 +9,12 @@ This section lists the releases for {productname} 7 and the changes made in each [cols="1,1"] |=== +a| +[.lead] +xref:7.1.2-release-notes.adoc#overview[{productname} 7.1.2] + +Release notes for {productname} 7.1.2 + a| [.lead] xref:7.1.1-release-notes.adoc#overview[{productname} 7.1.1] From a11d134116e2c8f10507a0ee0ca22bf753222f7f Mon Sep 17 00:00:00 2001 From: Karl Kemister-Sheppard Date: Wed, 5 Jun 2024 15:57:41 +1000 Subject: [PATCH 27/97] DOC-2442: api-version bump for TinyMCE 7.1.2. (#3319) --- .api-version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.api-version b/.api-version index ef09838cb2..0e7b60da8a 100644 --- a/.api-version +++ b/.api-version @@ -1 +1 @@ -7.1.1 \ No newline at end of file +7.1.2 \ No newline at end of file From 4a46217e1fbab5c4d2d1fdc2b783ba3378288ad1 Mon Sep 17 00:00:00 2001 From: Karl Kemister-Sheppard Date: Thu, 6 Jun 2024 15:28:45 +1000 Subject: [PATCH 28/97] DOC-2441: update ai assistant to use new GPT4o model. (#3324) --- modules/ROOT/examples/live-demos/ai/example.js | 2 +- modules/ROOT/examples/live-demos/ai/index.js | 2 +- modules/ROOT/pages/ai-openai.adoc | 4 ++-- modules/ROOT/partials/configuration/ai_request.adoc | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/modules/ROOT/examples/live-demos/ai/example.js b/modules/ROOT/examples/live-demos/ai/example.js index d1764417e9..9d11969aa3 100644 --- a/modules/ROOT/examples/live-demos/ai/example.js +++ b/modules/ROOT/examples/live-demos/ai/example.js @@ -42,7 +42,7 @@ const ai_request = (request, respondWith) => respondWith.stream(async (signal, ]; const requestBody = { - model: 'gpt-3.5-turbo', + model: 'gpt-4o', temperature: 0.7, max_tokens: 800, messages, diff --git a/modules/ROOT/examples/live-demos/ai/index.js b/modules/ROOT/examples/live-demos/ai/index.js index 6902200db5..eeb60c0a5e 100644 --- a/modules/ROOT/examples/live-demos/ai/index.js +++ b/modules/ROOT/examples/live-demos/ai/index.js @@ -38,7 +38,7 @@ const ai_request = (request, respondWith) => respondWith.stream(async (signal, ]; const requestBody = { - model: 'gpt-3.5-turbo', + model: 'gpt-4o', temperature: 0.7, max_tokens: 800, messages, diff --git a/modules/ROOT/pages/ai-openai.adoc b/modules/ROOT/pages/ai-openai.adoc index 92147970f8..424f1cece5 100644 --- a/modules/ROOT/pages/ai-openai.adoc +++ b/modules/ROOT/pages/ai-openai.adoc @@ -41,7 +41,7 @@ const ai_request = (request, respondWith) => { 'Authorization': `Bearer ${api_key}` }, body: JSON.stringify({ - model: 'gpt-3.5-turbo', + model: 'gpt-4o', temperature: 0.7, max_tokens: 800, messages: [{ role: 'user', content: request.prompt }], @@ -122,7 +122,7 @@ const ai_request = (request, respondWith) => { ]; const requestBody = { - model: 'gpt-3.5-turbo', + model: 'gpt-4o', temperature: 0.7, max_tokens: 800, messages, diff --git a/modules/ROOT/partials/configuration/ai_request.adoc b/modules/ROOT/partials/configuration/ai_request.adoc index 9106c50fbc..badb897832 100644 --- a/modules/ROOT/partials/configuration/ai_request.adoc +++ b/modules/ROOT/partials/configuration/ai_request.adoc @@ -29,7 +29,7 @@ const ai_request = (request, respondWith) => { 'Authorization': `Bearer ${api_key}` }, body: JSON.stringify({ - model: 'gpt-3.5-turbo', + model: 'gpt-4o', temperature: 0.7, max_tokens: 800, messages: [{ role: 'user', content: request.prompt }], From 07968c98b97efaf85b68bbdbaaac7684402b299f Mon Sep 17 00:00:00 2001 From: Karl Kemister-Sheppard Date: Thu, 6 Jun 2024 15:42:18 +1000 Subject: [PATCH 29/97] Revert "DOC-2441: update ai assistant to use new GPT4o model. (#3324)" (#3325) This reverts commit 4a46217e1fbab5c4d2d1fdc2b783ba3378288ad1. --- modules/ROOT/examples/live-demos/ai/example.js | 2 +- modules/ROOT/examples/live-demos/ai/index.js | 2 +- modules/ROOT/pages/ai-openai.adoc | 4 ++-- modules/ROOT/partials/configuration/ai_request.adoc | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/modules/ROOT/examples/live-demos/ai/example.js b/modules/ROOT/examples/live-demos/ai/example.js index 9d11969aa3..d1764417e9 100644 --- a/modules/ROOT/examples/live-demos/ai/example.js +++ b/modules/ROOT/examples/live-demos/ai/example.js @@ -42,7 +42,7 @@ const ai_request = (request, respondWith) => respondWith.stream(async (signal, ]; const requestBody = { - model: 'gpt-4o', + model: 'gpt-3.5-turbo', temperature: 0.7, max_tokens: 800, messages, diff --git a/modules/ROOT/examples/live-demos/ai/index.js b/modules/ROOT/examples/live-demos/ai/index.js index eeb60c0a5e..6902200db5 100644 --- a/modules/ROOT/examples/live-demos/ai/index.js +++ b/modules/ROOT/examples/live-demos/ai/index.js @@ -38,7 +38,7 @@ const ai_request = (request, respondWith) => respondWith.stream(async (signal, ]; const requestBody = { - model: 'gpt-4o', + model: 'gpt-3.5-turbo', temperature: 0.7, max_tokens: 800, messages, diff --git a/modules/ROOT/pages/ai-openai.adoc b/modules/ROOT/pages/ai-openai.adoc index 424f1cece5..92147970f8 100644 --- a/modules/ROOT/pages/ai-openai.adoc +++ b/modules/ROOT/pages/ai-openai.adoc @@ -41,7 +41,7 @@ const ai_request = (request, respondWith) => { 'Authorization': `Bearer ${api_key}` }, body: JSON.stringify({ - model: 'gpt-4o', + model: 'gpt-3.5-turbo', temperature: 0.7, max_tokens: 800, messages: [{ role: 'user', content: request.prompt }], @@ -122,7 +122,7 @@ const ai_request = (request, respondWith) => { ]; const requestBody = { - model: 'gpt-4o', + model: 'gpt-3.5-turbo', temperature: 0.7, max_tokens: 800, messages, diff --git a/modules/ROOT/partials/configuration/ai_request.adoc b/modules/ROOT/partials/configuration/ai_request.adoc index badb897832..9106c50fbc 100644 --- a/modules/ROOT/partials/configuration/ai_request.adoc +++ b/modules/ROOT/partials/configuration/ai_request.adoc @@ -29,7 +29,7 @@ const ai_request = (request, respondWith) => { 'Authorization': `Bearer ${api_key}` }, body: JSON.stringify({ - model: 'gpt-4o', + model: 'gpt-3.5-turbo', temperature: 0.7, max_tokens: 800, messages: [{ role: 'user', content: request.prompt }], From ed087388d941ab376a3a2b1d993d976b3e061229 Mon Sep 17 00:00:00 2001 From: Farzad Hayat Date: Tue, 11 Jun 2024 10:04:43 +1000 Subject: [PATCH 30/97] DOC-2441: update ai assistant to use new GPT4o model. (#3333) * DOC-2441: update ai assistant to use new GPT4o model. * Add markdown fix and increase max_tokens to 4000 to match tiny.cloud AI demos --------- Co-authored-by: Karl Kemister-Sheppard --- .../ROOT/examples/live-demos/ai/example.js | 240 ++++++++++-------- modules/ROOT/examples/live-demos/ai/index.js | 240 ++++++++++-------- modules/ROOT/pages/ai-openai.adoc | 4 +- .../partials/configuration/ai_request.adoc | 2 +- 4 files changed, 267 insertions(+), 219 deletions(-) diff --git a/modules/ROOT/examples/live-demos/ai/example.js b/modules/ROOT/examples/live-demos/ai/example.js index d1764417e9..5da681e52d 100644 --- a/modules/ROOT/examples/live-demos/ai/example.js +++ b/modules/ROOT/examples/live-demos/ai/example.js @@ -1,125 +1,149 @@ -const fetchApi = import("https://unpkg.com/@microsoft/fetch-event-source@2.0.1/lib/esm/index.js").then(module => module.fetchEventSource); +const fetchApi = import( + 'https://unpkg.com/@microsoft/fetch-event-source@2.0.1/lib/esm/index.js' +).then((module) => module.fetchEventSource); // This example stores the API key in the client side integration. This is not recommended for any purpose. // Instead, an alternate method for retrieving the API key should be used. const api_key = ''; -const ai_request = (request, respondWith) => respondWith.stream(async (signal, streamMessage) => { - // Adds each previous query and response as individual messages - const conversation = request.thread.flatMap((event) => { - if (event.response) { - return [ - { role: 'user', content: event.request.query }, - { role: 'assistant', content: event.response.data } - ]; - } else { - return []; - } - }); +const ai_request = (request, respondWith) => { + respondWith.stream((signal, streamMessage) => { + // Adds each previous query and response as individual messages + const conversation = request.thread.flatMap((event) => { + if (event.response) { + return [ + { role: 'user', content: event.request.query }, + { role: 'assistant', content: event.response.data }, + ]; + } else { + return []; + } + }); - // System messages provided by the plugin to format the output as HTML content. - const pluginSystemMessages = request.system.map((content) => ({ - role: 'system', - content - })); + // System messages provided by the plugin to format the output as HTML content. + const systemMessages = request.system.map((content) => ({ + role: 'system', + content, + })); - const systemMessages = [ - ...pluginSystemMessages, - // Additional system messages to control the output of the AI - { role: 'system', content: 'Do not include html\`\`\` at the start or \`\`\` at the end.' }, - { role: 'system', content: 'No explanation or boilerplate, just give the HTML response.' } - ]; + // Forms the new query sent to the API + const content = + request.context.length === 0 || conversation.length > 0 + ? request.query + : `Question: ${request.query} Context: """${request.context}"""`; - // Forms the new query sent to the API - const content = request.context.length === 0 || conversation.length > 0 - ? request.query - : `Question: ${request.query} Context: """${request.context}"""`; + const messages = [ + ...conversation, + ...systemMessages, + { role: 'user', content }, + ]; - const messages = [ - ...conversation, - ...systemMessages, - { role: 'user', content } - ]; + let hasHead = false; + let markdownHead = ''; - const requestBody = { - model: 'gpt-3.5-turbo', - temperature: 0.7, - max_tokens: 800, - messages, - stream: true - }; + const hasMarkdown = (message) => { + if (message.includes('`') && markdownHead !== '```') { + const numBackticks = message.split('`').length - 1; + markdownHead += '`'.repeat(numBackticks); + if (hasHead && markdownHead === '```') { + markdownHead = ''; + hasHead = false; + } + return true; + } else if (message.includes('html') && markdownHead === '```') { + markdownHead = ''; + hasHead = true; + return true; + } + return false; + }; - const openAiOptions = { - signal, - method: 'POST', - headers: { - 'Content-Type': 'application/json', - 'Authorization': `Bearer ${api_key}` - }, - body: JSON.stringify(requestBody) - }; + const requestBody = { + model: 'gpt-4o', + temperature: 0.7, + max_tokens: 4000, + messages, + stream: true, + }; - const onopen = async (response) => { - if (response) { - const contentType = response.headers.get('content-type'); - if (response.ok && contentType?.includes('text/event-stream')) { - return; - } else if (contentType?.includes('application/json')) { - const data = await response.json(); - if (data.error) { - throw new Error(`${data.error.type}: ${data.error.message}`); - } - } - } else { - throw new Error('Failed to communicate with the ChatGPT API'); - } - }; + const openAiOptions = { + signal, + method: 'POST', + headers: { + 'Content-Type': 'application/json', + 'Authorization': `Bearer ${api_key}`, + }, + body: JSON.stringify(requestBody), + }; - // This function passes each new message into the plugin via the `streamMessage` callback. - const onmessage = (ev) => { - const data = ev.data; - if (data !== '[DONE]') { - const parsedData = JSON.parse(data); - const firstChoice = parsedData?.choices[0]; - const message = firstChoice?.delta?.content; - if (message) { - streamMessage(message); - } - } - }; + const onopen = async (response) => { + if (response) { + const contentType = response.headers.get('content-type'); + if (response.ok && contentType?.includes('text/event-stream')) { + return; + } else if (contentType?.includes('application/json')) { + const data = await response.json(); + if (data.error) { + throw new Error( + `${data.error.type}: ${data.error.message}` + ); + } + } + } else { + throw new Error('Failed to communicate with the ChatGPT API'); + } + }; - const onerror = (error) => { - // Stop operation and do not retry by the fetch-event-source - throw error; - }; + // This function passes each new message into the plugin via the `streamMessage` callback. + const onmessage = (ev) => { + const data = ev.data; + if (data !== '[DONE]') { + const parsedData = JSON.parse(data); + const firstChoice = parsedData?.choices[0]; + const message = firstChoice?.delta?.content; + if (message && message !== '') { + if (!hasMarkdown(message)) { + streamMessage(message); + } + } + } + }; - // Use microsoft's fetch-event-source library to work around the 2000 character limit - // of the browser `EventSource` API, which requires query strings - return fetchApi - .then(fetchEventSource => - fetchEventSource('https://api.openai.com/v1/chat/completions', { - ...openAiOptions, - openWhenHidden: true, - onopen, - onmessage, - onerror - }) - ) - .then(async (response) => { - if (response && !response.ok) { - const data = await response.json(); - if (data.error) { - throw new Error(`${data.error.type}: ${data.error.message}`); - } - } - }) - .catch(onerror); -}); + const onerror = (error) => { + // Stop operation and do not retry by the fetch-event-source + throw error; + }; + + // Use microsoft's fetch-event-source library to work around the 2000 character limit + // of the browser `EventSource` API, which requires query strings + return fetchApi + .then((fetchEventSource) => + fetchEventSource('https://api.openai.com/v1/chat/completions', { + ...openAiOptions, + openWhenHidden: true, + onopen, + onmessage, + onerror, + }) + ) + .then(async (response) => { + if (response && !response.ok) { + const data = await response.json(); + if (data.error) { + throw new Error( + `${data.error.type}: ${data.error.message}` + ); + } + } + }) + .catch(onerror); + }); +}; tinymce.init({ - selector: 'textarea', // change this value according to your HTML - plugins: "ai advlist anchor autolink charmap advcode emoticons fullscreen help image link lists media preview searchreplace table", - toolbar: "undo redo | aidialog aishortcuts | styles fontsizeinput | bold italic | align bullist numlist | table link image | code", - height: 650, - ai_request -}); \ No newline at end of file + selector: 'textarea', // change this value according to your HTML + plugins: 'ai advlist anchor autolink charmap advcode emoticons fullscreen help image link lists media preview searchreplace table', + toolbar: 'undo redo | aidialog aishortcuts | styles fontsizeinput | bold italic | align bullist numlist | table link image | code', + height: 650, + ai_request, +}); diff --git a/modules/ROOT/examples/live-demos/ai/index.js b/modules/ROOT/examples/live-demos/ai/index.js index 6902200db5..deccd1ebc6 100644 --- a/modules/ROOT/examples/live-demos/ai/index.js +++ b/modules/ROOT/examples/live-demos/ai/index.js @@ -1,121 +1,145 @@ -const fetchApi = import("https://unpkg.com/@microsoft/fetch-event-source@2.0.1/lib/esm/index.js").then(module => module.fetchEventSource); +const fetchApi = import( + 'https://unpkg.com/@microsoft/fetch-event-source@2.0.1/lib/esm/index.js' +).then((module) => module.fetchEventSource); -const ai_request = (request, respondWith) => respondWith.stream(async (signal, streamMessage) => { - // Adds each previous query and response as individual messages - const conversation = request.thread.flatMap((event) => { - if (event.response) { - return [ - { role: 'user', content: event.request.query }, - { role: 'assistant', content: event.response.data } - ]; - } else { - return []; - } - }); +const ai_request = (request, respondWith) => { + respondWith.stream((signal, streamMessage) => { + // Adds each previous query and response as individual messages + const conversation = request.thread.flatMap((event) => { + if (event.response) { + return [ + { role: 'user', content: event.request.query }, + { role: 'assistant', content: event.response.data }, + ]; + } else { + return []; + } + }); - // System messages provided by the plugin to format the output as HTML content. - const pluginSystemMessages = request.system.map((content) => ({ - role: 'system', - content - })); + // System messages provided by the plugin to format the output as HTML content. + const systemMessages = request.system.map((content) => ({ + role: 'system', + content, + })); - const systemMessages = [ - ...pluginSystemMessages, - // Additional system messages to control the output of the AI - { role: 'system', content: 'Do not include html\`\`\` at the start or \`\`\` at the end.' }, - { role: 'system', content: 'No explanation or boilerplate, just give the HTML response.' } - ]; + // Forms the new query sent to the API + const content = + request.context.length === 0 || conversation.length > 0 + ? request.query + : `Question: ${request.query} Context: """${request.context}"""`; - // Forms the new query sent to the API - const content = request.context.length === 0 || conversation.length > 0 - ? request.query - : `Question: ${request.query} Context: """${request.context}"""`; + const messages = [ + ...conversation, + ...systemMessages, + { role: 'user', content }, + ]; - const messages = [ - ...conversation, - ...systemMessages, - { role: 'user', content } - ]; + let hasHead = false; + let markdownHead = ''; - const requestBody = { - model: 'gpt-3.5-turbo', - temperature: 0.7, - max_tokens: 800, - messages, - stream: true - }; + const hasMarkdown = (message) => { + if (message.includes('`') && markdownHead !== '```') { + const numBackticks = message.split('`').length - 1; + markdownHead += '`'.repeat(numBackticks); + if (hasHead && markdownHead === '```') { + markdownHead = ''; + hasHead = false; + } + return true; + } else if (message.includes('html') && markdownHead === '```') { + markdownHead = ''; + hasHead = true; + return true; + } + return false; + }; - const openAiOptions = { - signal, - method: 'POST', - headers: { - 'Content-Type': 'application/json', - 'Authorization': `Bearer {{ openai_proxy_token }}` - }, - body: JSON.stringify(requestBody) - }; + const requestBody = { + model: 'gpt-4o', + temperature: 0.7, + max_tokens: 4000, + messages, + stream: true, + }; - const onopen = async (response) => { - if (response) { - const contentType = response.headers.get('content-type'); - if (response.ok && contentType?.includes('text/event-stream')) { - return; - } else if (contentType?.includes('application/json')) { - const data = await response.json(); - if (data.error) { - throw new Error(`${data.error.type}: ${data.error.message}`); - } - } - } else { - throw new Error('Failed to communicate with the ChatGPT API'); - } - }; + const openAiOptions = { + signal, + method: 'POST', + headers: { + 'Content-Type': 'application/json', + 'Authorization': `Bearer {{ openai_proxy_token }}`, + }, + body: JSON.stringify(requestBody), + }; - // This function passes each new message into the plugin via the `streamMessage` callback. - const onmessage = (ev) => { - const data = ev.data; - if (data !== '[DONE]') { - const parsedData = JSON.parse(data); - const firstChoice = parsedData?.choices[0]; - const message = firstChoice?.delta?.content; - if (message) { - streamMessage(message); - } - } - }; + const onopen = async (response) => { + if (response) { + const contentType = response.headers.get('content-type'); + if (response.ok && contentType?.includes('text/event-stream')) { + return; + } else if (contentType?.includes('application/json')) { + const data = await response.json(); + if (data.error) { + throw new Error( + `${data.error.type}: ${data.error.message}` + ); + } + } + } else { + throw new Error('Failed to communicate with the ChatGPT API'); + } + }; - const onerror = (error) => { - // Stop operation and do not retry by the fetch-event-source - throw error; - }; + // This function passes each new message into the plugin via the `streamMessage` callback. + const onmessage = (ev) => { + const data = ev.data; + if (data !== '[DONE]') { + const parsedData = JSON.parse(data); + const firstChoice = parsedData?.choices[0]; + const message = firstChoice?.delta?.content; + if (message && message !== '') { + if (!hasMarkdown(message)) { + streamMessage(message); + } + } + } + }; - // Use microsoft's fetch-event-source library to work around the 2000 character limit - // of the browser `EventSource` API, which requires query strings - return fetchApi - .then(fetchEventSource => - fetchEventSource("{{ openai_proxy_url }}", { - ...openAiOptions, - openWhenHidden: true, - onopen, - onmessage, - onerror - }) - ) - .then(async (response) => { - if (response && !response.ok) { - const data = await response.json(); - if (data.error) { - throw new Error(`${data.error.type}: ${data.error.message}`); - } - } - }) - .catch(onerror); -}); + const onerror = (error) => { + // Stop operation and do not retry by the fetch-event-source + throw error; + }; + + // Use microsoft's fetch-event-source library to work around the 2000 character limit + // of the browser `EventSource` API, which requires query strings + return fetchApi + .then((fetchEventSource) => + fetchEventSource('{{ openai_proxy_url }}', { + ...openAiOptions, + openWhenHidden: true, + onopen, + onmessage, + onerror, + }) + ) + .then(async (response) => { + if (response && !response.ok) { + const data = await response.json(); + if (data.error) { + throw new Error( + `${data.error.type}: ${data.error.message}` + ); + } + } + }) + .catch(onerror); + }); +}; tinymce.init({ - selector: 'textarea', - plugins: "ai advlist anchor autolink charmap advcode emoticons fullscreen help image link lists media preview searchreplace table", - toolbar: "undo redo | aidialog aishortcuts | styles fontsizeinput | bold italic | align bullist numlist | table link image | code", - height: 650, - ai_request -}); \ No newline at end of file + selector: 'textarea', // change this value according to your HTML + plugins: 'ai advlist anchor autolink charmap advcode emoticons fullscreen help image link lists media preview searchreplace table', + toolbar: 'undo redo | aidialog aishortcuts | styles fontsizeinput | bold italic | align bullist numlist | table link image | code', + height: 650, + ai_request, +}); diff --git a/modules/ROOT/pages/ai-openai.adoc b/modules/ROOT/pages/ai-openai.adoc index 92147970f8..424f1cece5 100644 --- a/modules/ROOT/pages/ai-openai.adoc +++ b/modules/ROOT/pages/ai-openai.adoc @@ -41,7 +41,7 @@ const ai_request = (request, respondWith) => { 'Authorization': `Bearer ${api_key}` }, body: JSON.stringify({ - model: 'gpt-3.5-turbo', + model: 'gpt-4o', temperature: 0.7, max_tokens: 800, messages: [{ role: 'user', content: request.prompt }], @@ -122,7 +122,7 @@ const ai_request = (request, respondWith) => { ]; const requestBody = { - model: 'gpt-3.5-turbo', + model: 'gpt-4o', temperature: 0.7, max_tokens: 800, messages, diff --git a/modules/ROOT/partials/configuration/ai_request.adoc b/modules/ROOT/partials/configuration/ai_request.adoc index 9106c50fbc..badb897832 100644 --- a/modules/ROOT/partials/configuration/ai_request.adoc +++ b/modules/ROOT/partials/configuration/ai_request.adoc @@ -29,7 +29,7 @@ const ai_request = (request, respondWith) => { 'Authorization': `Bearer ${api_key}` }, body: JSON.stringify({ - model: 'gpt-3.5-turbo', + model: 'gpt-4o', temperature: 0.7, max_tokens: 800, messages: [{ role: 'user', content: request.prompt }], From 0b7d7c7e59ca596bc56d1f8b8437e71ccbf11529 Mon Sep 17 00:00:00 2001 From: Farzad Hayat Date: Wed, 12 Jun 2024 09:40:28 +1000 Subject: [PATCH 31/97] DOC-2449: 7.1.2 Post Release Clean-Up (#3330) * DOC-2449: 7.1.2 Post Release Clean-Up * Move "Acronyms were not managed correctly." back down to the "Bug fixes" section --- modules/ROOT/pages/7.1.2-release-notes.adoc | 20 +++++++------------- modules/ROOT/pages/changelog.adoc | 2 +- 2 files changed, 8 insertions(+), 14 deletions(-) diff --git a/modules/ROOT/pages/7.1.2-release-notes.adoc b/modules/ROOT/pages/7.1.2-release-notes.adoc index 03476faf9f..a60fcae1bb 100644 --- a/modules/ROOT/pages/7.1.2-release-notes.adoc +++ b/modules/ROOT/pages/7.1.2-release-notes.adoc @@ -30,13 +30,12 @@ This **Math** premium plugin release includes the following fix: ==== Math icon state was not set to active on math element selection. // #TINY-10931 -Previously, the Math icon was not set to active when a math element was selected within the editor. - -As a consequence, users had no visual indication that a math element was selected or that it could be edited by selecting it and then clicking the toolbar button. +Previously, the Math icon was not set to active when a math element was selected within the editor. As a consequence, users had no visual indication that a math element was selected or that it could be edited by selecting it and then clicking the toolbar button. {productname} {release-version} addresses this issue. Now, when any Math element is selected, the button's active state is triggered. -For information on the **Math** plugin, see: xref:math.adoc[Math]. +For more information on the **Math** plugin, see: xref:math.adoc[Math]. + [[bug-fixes]] == Bug fixes @@ -46,18 +45,13 @@ For information on the **Math** plugin, see: xref:math.adoc[Math]. === CSS color values set to `transparent` were incorrectly converted to `+#000000+`. // #TINY-10916 -Previously, transparent color values were incorrectly converted to `+#000000+`, deviating from the behavior observed in earlier major versions. Additionally, {productname} does not export the last two digits of the hex string, so the alpha value is lost, causing transparent to be converted to `+#000000+`. +Previously, transparent color values were incorrectly converted to `+#000000+`, deviating from the behavior observed in earlier major versions. Additionally, {productname} did not export the last two digits of the hex string, so the alpha value was lost, causing transparent to be converted to `+#000000+`. -{productname} {release-version} addresses this issue by, removing the if statement that handles transparent since it is no longer needed. As a result, the transparent property will be retained as a transparent string instead of converting to other values. This change is consistent with the behavior in {productname} v5, v6. +{productname} {release-version} addresses this issue by removing the check that handles transparency, therefore retaining the alpha component. As a result, the transparent property will be retained as a transparent string instead of being converted to other values. This change is consistent with the behavior in {productname} v5 and v6. -[[acronyms-were-not-managed-correctly]] === Acronyms were not managed correctly. // #TINY-10904 -Previously, acronyms were not managed correctly which caused false positive results with Spell Checker premium plugin. In this case, the check was separating the words excluding the dot at the end also when we check the acronyms. - -As a consequence, Spell Checker Premium plugin would identify acronyms without the last dot, highlighting them as errors. - -{productname} {release-version} addresses this issue. Now, If the word is an abbreviation, {productname} includes the next character if it is a period. +Previously, acronyms were not managed correctly, which caused false positive results with the Spell Checker premium plugin. In this case, the check was excluding the period at the end when separating words, even when checking acronyms. As a consequence, the Spell Checker Premium plugin would identify acronyms without the trailing period, therefore highlighting them as errors. -As a result, acronyms are now managed correctly, and the Spell Checker retrieves the correct word (with the dot included) and provides accurate results. \ No newline at end of file +{productname} {release-version} addresses this issue. Now, if the word is an acronym, {productname} includes the next character if it is a period. As a result, acronyms are now managed correctly, and the Spell Checker retrieves the correct word (with the period included) and provides accurate results. \ No newline at end of file diff --git a/modules/ROOT/pages/changelog.adoc b/modules/ROOT/pages/changelog.adoc index 299f2dbbac..642d3df028 100644 --- a/modules/ROOT/pages/changelog.adoc +++ b/modules/ROOT/pages/changelog.adoc @@ -7,7 +7,7 @@ NOTE: This is the {productname} Community version changelog. For information abo == 7.1.2 - 2024-06-05 ### Fixed -- CSS color values set to `transparent` were incorrectly converted to '#000000`. +- CSS color values set to `transparent` were incorrectly converted to `+#000000+`. // #TINY-10916 == 7.1.1 - 2024-05-22 From 1d13ac0d4411202eae9dd17e545729fbf5d73ab8 Mon Sep 17 00:00:00 2001 From: Farzad Hayat Date: Fri, 14 Jun 2024 14:21:12 +1000 Subject: [PATCH 32/97] DOC-2450: Restructure editor-plugin-version.adoc (#3331) * DOC-2450: Restructure editor-plugin-version.adoc * Apply suggestions from code review Co-authored-by: Karl Kemister-Sheppard * Improve wording * Remove redundant sentence in '7 Release Channel' section * More wording improvements * Replace instances of the version number 7 with {productmajorversion} --------- Co-authored-by: Karl Kemister-Sheppard --- modules/ROOT/nav.adoc | 2 +- modules/ROOT/pages/editor-plugin-version.adoc | 126 ++++++++++-------- 2 files changed, 68 insertions(+), 60 deletions(-) diff --git a/modules/ROOT/nav.adoc b/modules/ROOT/nav.adoc index 39e3d50c27..d1a7911232 100644 --- a/modules/ROOT/nav.adoc +++ b/modules/ROOT/nav.adoc @@ -123,7 +123,7 @@ ** xref:cloud-deployment-guide.adoc[Cloud deployment guide] *** xref:editor-and-features.adoc[Cloud deployment of editor & plugins] *** xref:features-only.adoc[Cloud deployment of plugins Only] -*** xref:editor-plugin-version.adoc[Specify editor & plugins] +*** xref:editor-plugin-version.adoc[Specify editor version & plugins] *** xref:plugin-editor-version-compatibility.adoc[Version compatibility reference] *** xref:cloud-troubleshooting.adoc[Cloud Troubleshooting] ** Premium server-side services guide diff --git a/modules/ROOT/pages/editor-plugin-version.adoc b/modules/ROOT/pages/editor-plugin-version.adoc index 6964b9bc8c..34356c31a5 100644 --- a/modules/ROOT/pages/editor-plugin-version.adoc +++ b/modules/ROOT/pages/editor-plugin-version.adoc @@ -1,86 +1,46 @@ -= Specify editor version & plugins += Specify Editor Version & Plugins :description_short: Specifying editor version and plugins for {cloudname} deployments. :description: Instructions on setting the {productname} editor version and plugins for {cloudname} deployments. -:keywords: tinymce, cloud, script, textarea, apiKey, hybrid +:keywords: tinymce, cloud, script, textarea, apiKey, hybrid, dev, testing, production [[specifying-the-tinymce-editor-version-deployed-from-cloud]] -== Specifying the {productname} Editor Version from the Cloud +== Specifying the {productname} Editor Version from {cloudname} -To set the {productname} version when deploying from {cloudname}, use the following URL: +The example below shows the default way to load {productname} {productmajorversion} from {cloudname}. This URL ensures the most recent and verified version of {productname} is used. [source,html,subs="attributes+"] ---- ---- -The example above shows the default way to load {productname} {productmajorversion} from {cloudname}. This URL ensures the most recent and verified version of {productname} is used. - -[TIP] -Replace 'no-api-key' with your own API key. - -For more details, check out the xref:editor-and-features.adoc[{productname} editor via {cloudname}]. - -[[specifying-the-cloud-deployment-of-plugins]] -== Specifying the Cloud Deployment of Plugins - -When self-hosting {productname}, integrators have the choice to host premium plugins or load them from {companyname} Cloud (a.k.a. hybrid mode). Depending on your requirements, you can use a combination of both approaches. - -include::partial$misc/admon-script-tag-placement.adoc[] - -{companyname} offers the following configuration scripts to assist: - -=== `plugin.min.js` Standalone with No Exclusions. - -The `plugins.min.js` script loads every premium plugin the API key is entitled to from the CDN. - -[source,html,subs="attributes+"] ----- - ----- - -=== `plugins.min.js` with Exclusions for Specific Plugins. - -To exclude specific premium plugins from `plugins.min.js` because you are self-hosting them, add the excluded plugins to the script query parameters as shown below: +To load a specific version of {productname} {productmajorversion} other than the latest release, replace the `{productmajorversion}` in the URL with the desired version. For example, to load a minor version such as {productname} `{productmajorversion}.1`, use the following URL: [source,html,subs="attributes+"] ---- - + ---- -[NOTE] -==== -Ensure that the excluded plugins' names are appended with `=sdk`, such as `mentions=sdk`. - -When {companyname} Cloud releases a new premium plugin, if you wish to self-host it this script tag will need to be updated to exclude it. -==== - -=== `cloud-plugins.min.js` for Specific Premium Plugins from {companyname} Cloud. - -The `cloud-plugins.min.js` script allows loading of specific premium plugins from {companyname} Cloud. +To load a specific patch version, replace the `{productmajorversion}` in the URL with the desired patch version. For example, to load {productname} `{productmajorversion}.1.2`, use the following URL: [source,html,subs="attributes+"] ---- - + ---- -[NOTE] -This approach is intended for edge cases where you self-host most premium plugins on your own servers and only need one or two from {companyname} Cloud. - -''' +[TIP] +Replace 'no-api-key' with your own API key. -=== Selecting Specific Editor Versions +[#{productmajorversion}-{productmajorversion}-testing-and-{productmajorversion}-dev-release-channels] +=== Difference between using {productname} {productmajorversion}, {productmajorversion}-Testing, and {productmajorversion}-Dev Release Channels [IMPORTANT] ==== All {cloudname} channels are based on the {enterpriseversion} version. -* For information on the latest version of the {cloudname} `{productmajorversion}` release channel, see: xref:release-notes.adoc[{productname} Release Notes]. -* For a list of changes that *may* be present in the {cloudname} testing channel, see: xref:changelog.adoc[{productname} Changelog]. +* For complete information on the latest version of the {cloudname} `{productmajorversion}` Release Channel including premium changes, see: xref:release-notes.adoc[{productname} Release Notes]. +* For a summarized list of only the changes that affect the open-source version of {productname}, see: xref:changelog.adoc[{productname} Changelog]. ==== -[#{productmajorversion}-{productmajorversion}-testing-and-{productmajorversion}-dev-release-channels] -=== Difference between using {productname} {productmajorversion}, {productmajorversion}-Testing, and {productmajorversion}-Dev release channels - Choose from the `{productmajorversion}`, `{productmajorversion}-testing`, or `{productmajorversion}-dev` release channels to load the latest version of {productname} from {cloudname}. These channels are updated automatically and provide the latest {productname} version based on the following criteria: @@ -88,10 +48,10 @@ These channels are updated automatically and provide the latest {productname} ve [#{productmajorversion}-release-channel] ==== {productmajorversion} Release Channel -This channel deploys the latest release of {productname} that has passed our quality assurance process. The current version of {productname} available through the `/{productmajorversion}` channel can be found on the https://cdn.tiny.cloud/1/no-api-key/tinymce/{productmajorversion}/version.txt[{cloudname} {productname} {productmajorversion} version page]. The {productname} {productmajorversion} channel can be loaded from `{cdnurl}`. +This channel deploys the latest release of {productname} that has passed our quality assurance process. The current version of {productname} available through the `{productmajorversion}` channel can be found on the link:https://cdn.tiny.cloud/1/no-api-key/tinymce/{productmajorversion}/version.txt[{cloudname} {productname} {productmajorversion} version page]. [#example-using-the-{productmajorversion}-release-channel] -===== Example: using the `{productmajorversion}` release channel +===== Example: Using the `{productmajorversion}` Release Channel [source,html,subs="attributes+"] ---- @@ -101,7 +61,7 @@ This channel deploys the latest release of {productname} that has passed our qua [#{productmajorversion}-testing-release-channel] ==== {productmajorversion}-Testing Release Channel -This channel deploys the current *release candidate* for the `{productmajorversion}` channel. The {productname} release candidate is undergoing quality assurance. The current version of {productname} available through the `{productmajorversion}-testing` channel can be found on the https://cdn.tiny.cloud/1/no-api-key/tinymce/{productmajorversion}-testing/version.txt[{cloudname} {productname} {productmajorversion}-testing version page]. +This channel deploys the current *release candidate* for the `{productmajorversion}` channel. The {productname} release candidate is undergoing quality assurance. The current version of {productname} available through the `{productmajorversion}-testing` channel can be found on the link:https://cdn.tiny.cloud/1/no-api-key/tinymce/{productmajorversion}-testing/version.txt[{cloudname} {productname} {productmajorversion}-testing version page]. [#example-using-the-{productmajorversion}-testing-release-channel] ===== Example: Using the `{productmajorversion}-testing` Release Channel @@ -116,7 +76,7 @@ This channel deploys the current *release candidate* for the `{productmajorversi This channel deploys nightly builds of {productname}, which includes **unreleased changes** from the link:https://github.com/tinymce/tinymce/tree/main[{productname} repository^]. -The current version of {productname} is available on the `{productmajorversion}-dev` channel can be found on the link:https://cdn.tiny.cloud/1/no-api-key/tinymce/{productmajorversion}-dev/version.txt[{cloudname} {productname} {productmajorversion}-dev version page^]. +The current version of {productname} available on the `{productmajorversion}-dev` channel can be found on the link:https://cdn.tiny.cloud/1/no-api-key/tinymce/{productmajorversion}-dev/version.txt[{cloudname} {productname} {productmajorversion}-dev version page^]. [NOTE] {productname} now uses `main` branch for nightly builds instead of `develop` as of {productname} `7.0.0`. @@ -127,4 +87,52 @@ The current version of {productname} is available on the `{productmajorversion}- [source,html,subs="attributes+"] ---- ----- \ No newline at end of file +---- + +For more details, check out the xref:editor-and-features.adoc[{productname} editor via {cloudname}]. + +[[specifying-the-cloud-deployment-of-plugins]] +== Specifying the Cloud Deployment of Plugins + +When self-hosting {productname}, integrators have the choice to host premium plugins or load them from {companyname} Cloud (a.k.a. hybrid mode). Depending on your requirements, you can use a combination of both approaches. + +include::partial$misc/admon-script-tag-placement.adoc[] + +{companyname} offers the following configuration scripts to assist: + +=== `plugin.min.js` Standalone with No Exclusions + +The `plugins.min.js` script loads every premium plugin the API key is entitled to from the CDN. + +[source,html,subs="attributes+"] +---- + +---- + +=== `plugins.min.js` with Exclusions for Specific Plugins + +To exclude specific premium plugins from `plugins.min.js` because you are self-hosting them, add the excluded plugins to the script query parameters as shown below: + +[source,html,subs="attributes+"] +---- + +---- + +[NOTE] +==== +Ensure that the excluded plugins' names are appended with `=sdk`, such as `mentions=sdk`. + +When {companyname} Cloud releases a new premium plugin, if you wish to self-host it, this script tag will need to be updated to exclude it. +==== + +=== `cloud-plugins.min.js` for Specific Premium Plugins from {companyname} Cloud + +The `cloud-plugins.min.js` script allows loading of specific premium plugins from {companyname} Cloud. + +[source,html,subs="attributes+"] +---- + +---- + +[NOTE] +This approach is intended for edge cases where you self-host most premium plugins on your own servers and only need one or two from {companyname} Cloud. \ No newline at end of file From 1b32c0b75487d423739efc7e552d3e4ff44e7ff2 Mon Sep 17 00:00:00 2001 From: Farzad Hayat Date: Wed, 19 Jun 2024 16:22:40 +1000 Subject: [PATCH 33/97] DOC-2456: Update DOMPurify version in security guide (#3352) --- ...ing-against-xss-attacks-dom-parser-and-dom-purify.adoc | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/modules/ROOT/partials/security/sanitizing-html-input-and-protecting-against-xss-attacks-dom-parser-and-dom-purify.adoc b/modules/ROOT/partials/security/sanitizing-html-input-and-protecting-against-xss-attacks-dom-parser-and-dom-purify.adoc index ffa4d749db..4038fe8c91 100644 --- a/modules/ROOT/partials/security/sanitizing-html-input-and-protecting-against-xss-attacks-dom-parser-and-dom-purify.adoc +++ b/modules/ROOT/partials/security/sanitizing-html-input-and-protecting-against-xss-attacks-dom-parser-and-dom-purify.adoc @@ -5,18 +5,18 @@ Previously, before HTML content was passed to {productname} 5.x, it was parsed u The `SaxParser` API was developed in the then-absence of alternatives. -When this API’s validate setting was enabled — `validate: true` — `SaxParser` removed elements and attributes that did not fit the declared schema. +When this API's validate setting was enabled — `validate: true` — `SaxParser` removed elements and attributes that did not fit the declared schema. And, over its lifetime, `SaxParser` was extended. For example, as of {productname} 5.9, the `SaxParser` API marked attributes with certain names or IDs as unsafe, because some names or IDs can cause the host browser to overwrite existing properties or functions. -For {productname} 6.0, however, this basic parser was removed and replaced with two significantly more thorough alternatives: +Since {productname} 6.0, this basic parser was removed and replaced with two significantly more thorough alternatives: . the https://developer.mozilla.org/en-US/docs/Web/API/DOMParser[native browser API], `DOMParser()`; and . the Free and Open Source _https://github.com/cure53/DOMPurify[XSS sanitizer for HTML, MathML and SVG]_, DOMPurify. -NOTE: {productname} uses DOMPurify 2.x, which was current at the time version 6 was developed. +NOTE: {productname} uses DOMPurify 3.x, which was current at the time {productname} {productmajorversion} was developed. -Before HTML (or XML) content is passed to {productname} 6.x, the `DOMParser` API parses the HTML (or XML) string into a https://developer.mozilla.org/en-US/docs/Web/API/Document_Object_Model[DOM object]. As part of this process, `DOMParser` attempts to correct malformed HTML. +Before HTML (or XML) content is passed to {productname} {productmajorversion}, the `DOMParser` API parses the HTML (or XML) string into a https://developer.mozilla.org/en-US/docs/Web/API/Document_Object_Model[DOM object]. As part of this process, `DOMParser` attempts to correct malformed HTML. For example, the following string: From ae0d8504e372427eeb1510ec76fc187b0e78bc9e Mon Sep 17 00:00:00 2001 From: Karl Kemister-Sheppard Date: Wed, 19 Jun 2024 19:31:52 +1000 Subject: [PATCH 34/97] DOC-2445: TinyMCE 7.2 release documentation. (#3320) * DOC-2445: TinyMCE 7.2 release documentation. * DOC-2246: TinyMCE 7.2 Release notes & community changelog. (#3321) * DOC-2246: TinyMCE 7.2 Release notes & community changelog. * Update modules/ROOT/nav.adoc Co-authored-by: Farzad Hayat * DOC-2446: Added release note entry for new options debug API TINY-10605 * Revert "DOC-2446: Added release note entry for new options debug API TINY-10605" This reverts commit ff24241b39163f3d1ae663f5c4c2452adc33c64e. Sorry, this should be PR from a separate branch. * DOC-2446: Add TINY-10428 release note entry (#3329) * DOC-2446: Add TINY-10428 release note entry * Update modules/ROOT/pages/7.2-release-notes.adoc Co-authored-by: Karl Kemister-Sheppard --------- Co-authored-by: Karl Kemister-Sheppard * DOC-2446: Add TINY-10374 release note entry (#3327) * DOC-2446: Add TINY-10374 release note entry * Update modules/ROOT/pages/7.2-release-notes.adoc Co-authored-by: Karl Kemister-Sheppard --------- Co-authored-by: Karl Kemister-Sheppard * DOC-2446: Add TINY-10605 release note entry (#3322) * DOC-2446: Add TINY-10605 release note entry * Simplify explanation of data types * DOC-2446: Add TINY-10900 release note entry (#3326) * DOC-2446: Add TINY-10820 release note entry (#3335) * DOC-2446: Add TINY-10820 release note entry * Fix grammatical error in heading * Update modules/ROOT/pages/7.2-release-notes.adoc Co-authored-by: Karl Kemister-Sheppard --------- Co-authored-by: Karl Kemister-Sheppard * DOC-2446: Add TINY-11001 release note entry (#3336) * DOC-2446: Add TINY-11001 release note entry * Apply suggestions from code review Co-authored-by: Karl Kemister-Sheppard --------- Co-authored-by: Karl Kemister-Sheppard * DOC-2446: Add TINY-10807 release note entry (#3337) * DOC-2446: Add TINY-10869 release note entry (#3339) * DOC-2446: Add TINY-10869 release note entry * Apply suggestions from Mitch's code review Co-authored-by: Mitchell Crompton --------- Co-authored-by: Mitchell Crompton * DOC-2446: Add TINY-10962 release note entry (#3342) * DOC-2446: Improved `Search & Replace` dialog accessibility by changing placeholders to labels. (#3347) * DOC-2446: Improved Find & Replace dialog accessibility by changing placeholders to labels. * Update modules/ROOT/pages/7.2-release-notes.adoc * Update modules/ROOT/pages/7.2-release-notes.adoc * Update modules/ROOT/pages/7.2-release-notes.adoc Co-authored-by: Farzad Hayat * Update modules/ROOT/pages/7.2-release-notes.adoc Co-authored-by: Farzad Hayat * Update modules/ROOT/pages/7.2-release-notes.adoc Co-authored-by: Farzad Hayat --------- Co-authored-by: Farzad Hayat * DOC-2446: Fixed cases where adding a newline around a br, table or img would not move the cursor to a new line. (#3345) * DOC-2446: Bump `spelling.war` version to `2.119.6` for release 7.2. (#3344) * DOC-2446: Bump spelling.war version to 2.119.6 for release 7.2. * DOC-2446: update introduction-to-tiny-spellchecker/supported-languages.adoc. * DOC-2446: Update index.js demo to include new supported langs Added new entry to release notes outlining the new supported langs Updated default values for spellchecker_languages partial Updated example for spellchecker_content_langs to inculde full list of supported langs. --------- Co-authored-by: Farzad Hayat * DOC-2446: Temporary elements such as incorrect spelling highlights were interfering with accessibility checking. (#3341) * DOC-2446: Temporary elements such as incorrect spelling highlights were interfering with accessibility checking. * Update modules/ROOT/pages/7.2-release-notes.adoc Co-authored-by: Farzad Hayat * Update modules/ROOT/pages/7.2-release-notes.adoc Co-authored-by: Farzad Hayat * Update modules/ROOT/pages/7.2-release-notes.adoc Co-authored-by: Farzad Hayat --------- Co-authored-by: Farzad Hayat * DOC-2446: Deleting in a div with preceding br elements would sometimes throw errors. (#3343) * DOC-2446: New `revisionhistory_fetch_revision` option to support updating a revision when it is selected. (#3349) * DOC-2446: Release note entry for new `revisionhistory_fetch_revision` option * Improve `revisionhistory_fetch` option's return data layout and change `content` field to optional * Add `revisionhistory_fetch_revision` option and include it in revisionhistory.adoc * Update Revision History live demo to include revisionhistory_fetch_revision * Update Revision History demo to include more plugins and toolbar buttons * Revert addition of extra plugins/toolbar buttons. * Apply suggestions from Ben's code review Co-authored-by: tiny-ben-tran * change revisionhistory_fetch_revision return data to link back to revisionhistory_fetch * Reword revisionhistory_fetch_revision option description to not use 'should' * DOC-2446: Improve the wording for fetch_revision option * Update modules/ROOT/pages/7.2-release-notes.adoc Co-authored-by: Karl Kemister-Sheppard * Apply suggestions from Karl's code review Co-authored-by: Karl Kemister-Sheppard --------- Co-authored-by: tiny-ben-tran Co-authored-by: Karl Kemister-Sheppard * DOC-2446: Add TINY-10891 release note entry (#3334) * DOC-2446: Add TINY-10891 release note entry * Improvements from Karl's code review * DOC-2446: `autoresize_bottom_margin` was not reliably applied in some situations. (#3346) * DOC-2446: autoresize_bottom_margin was not reliably applied in some situations. * Update modules/ROOT/pages/7.2-release-notes.adoc Co-authored-by: Farzad Hayat * Update modules/ROOT/pages/7.2-release-notes.adoc Co-authored-by: tiny-ben-tran --------- Co-authored-by: Farzad Hayat Co-authored-by: tiny-ben-tran * Add for attribute to label component in dialog-components.adoc. (#3348) * Add 7.2 release entries to changelog.adoc * 7.2 Release Cleanup (release notes, changelog, and nav) * DOC-2446: Added support for querying the state of the `mceTogglePlainTextPaste` command. (#3351) --------- Co-authored-by: Farzad Hayat Co-authored-by: Mitchell Crompton Co-authored-by: tiny-ben-tran * Fix merge conflict in changelog.adoc (#3356) * Attempt 2 at fixing merge conflict (#3358) --------- Co-authored-by: Farzad Hayat Co-authored-by: Mitchell Crompton Co-authored-by: tiny-ben-tran --- .../live-demos/revisionhistory/index.js | 63 +++- .../examples/live-demos/spellchecker/index.js | 32 +- modules/ROOT/nav.adoc | 8 + modules/ROOT/pages/7.2-release-notes.adoc | 356 ++++++++++++++++++ modules/ROOT/pages/changelog.adoc | 40 ++ modules/ROOT/pages/dialog-components.adoc | 1 + .../pages/editor-command-identifiers.adoc | 2 + modules/ROOT/pages/powerpaste-options.adoc | 2 + modules/ROOT/pages/release-notes.adoc | 7 + modules/ROOT/pages/revisionhistory.adoc | 3 + .../powerpaste_autolink_urls.adoc | 23 ++ .../configuration/revisionhistory_fetch.adoc | 25 +- .../revisionhistory_fetch_revision.adoc | 79 ++++ .../partials/configuration/smart_paste.adoc | 2 + .../configuration/spellchecker_languages.adoc | 7 +- .../partials/misc/spellchecker-languages.adoc | 16 +- .../plugins/spellchecker-content_langs.adoc | 36 +- 17 files changed, 652 insertions(+), 50 deletions(-) create mode 100644 modules/ROOT/pages/7.2-release-notes.adoc create mode 100644 modules/ROOT/partials/configuration/powerpaste_autolink_urls.adoc create mode 100644 modules/ROOT/partials/configuration/revisionhistory_fetch_revision.adoc diff --git a/modules/ROOT/examples/live-demos/revisionhistory/index.js b/modules/ROOT/examples/live-demos/revisionhistory/index.js index efc3a59a25..90001a6d42 100644 --- a/modules/ROOT/examples/live-demos/revisionhistory/index.js +++ b/modules/ROOT/examples/live-demos/revisionhistory/index.js @@ -1,3 +1,41 @@ +const getRandomDelay = () => { + const minDelay = 500; + const maxDelay = 2000; + return Math.floor(Math.random() * (maxDelay - minDelay + 1)) + minDelay; +}; + +const lightRevisions = [ + { + revisionId: '4', + createdAt: '2023-11-29T10:11:21.578Z', + }, + { + revisionId: '3', + createdAt: '2023-11-25T08:30:21.578Z', + }, + { + revisionId: '2', + createdAt: '2023-11-24T22:26:21.578Z', + }, + { + revisionId: '1', + createdAt: '2023-11-23T20:26:21.578Z', + }, +]; + +const revisionhistory_fetch = () => + new Promise((resolve) => { + setTimeout(() => { + resolve( + lightRevisions + .sort((a, b) => + new Date(a.createdAt) < new Date(b.createdAt) ? -1 : 1 + ) + .reverse() + ); + }, getRandomDelay()); + }); + const revisions = [ { revisionId: '4', @@ -82,21 +120,30 @@ const revisions = [

And those use cases are just the start. TinyMCE is incredibly flexible, and with hundreds of APIs there’s likely a solution for your editor project. If you haven’t experienced Tiny Cloud, get started today. You’ll even get a free trial of our premium plugins – no credit card required!

--> `, - } + }, ]; -const get_revisions = () => new Promise((resolve) => { +const revisionhistory_fetch_revision = (_editor, revision) => + new Promise((resolve) => { setTimeout(() => { - resolve(revisions.sort((a, b) => new Date(a.createdAt) < new Date(b.createdAt) ? -1 : 1).reverse()); - }, 1000); + let newRevision = null; + for (let i = 0; i < revisions.length; i++) { + const temp = revisions[i]; + if (temp.revisionId === revision.revisionId) { + newRevision = temp; + break; + } + } + resolve(newRevision); + }, getRandomDelay()); }); - tinymce.init({ selector: 'textarea#revisionhistory', height: 800, plugins: 'revisionhistory', toolbar: 'revisionhistory', - revisionhistory_fetch: get_revisions, - content_style: 'body { font-family:Helvetica,Arial,sans-serif; font-size:16px }' -}); \ No newline at end of file + content_style: 'body { font-family:Helvetica,Arial,sans-serif; font-size:16px }', + revisionhistory_fetch, + revisionhistory_fetch_revision, +}); diff --git a/modules/ROOT/examples/live-demos/spellchecker/index.js b/modules/ROOT/examples/live-demos/spellchecker/index.js index 36843325fd..6ccd6f0d1c 100644 --- a/modules/ROOT/examples/live-demos/spellchecker/index.js +++ b/modules/ROOT/examples/live-demos/spellchecker/index.js @@ -5,15 +5,29 @@ tinymce.init({ height: 500, spellchecker_language: 'en', content_langs: [ - { title: 'English (US)', code: 'en_US' }, - { title: 'English (US Medical)', code: 'en_US', customCode: 'en_US-medical' }, - { title: 'English (UK)', code: 'en_UK' }, - { title: 'English (UK Medical)', code: 'en_UK', customCode: 'en_UK-medical' }, - { title: 'Spanish', code: 'es' }, + { title: 'Afrikaans (South Africa)', code: 'af_ZA', customCode: 'af_ZA' }, + { title: 'English (Australia)', code: 'en_AU' }, + { title: 'English (Canada)', code: 'en_CA' }, + { title: 'English (United Kingdom)', code: 'en_GB' }, + { title: 'English (United States)', code: 'en_US' }, + { title: 'Medical English (US)', code: 'en_US', customCode: 'en_US-medical' }, + { title: 'Medical English (UK)', code: 'en_GB', customCode: 'en_GB-medical' }, + { title: 'Danish', code: 'da' }, + { title: 'Dutch', code: 'nl_NL' }, + { title: 'Finnish', code: 'fi' }, { title: 'French', code: 'fr' }, - { title: 'German', code: 'de' }, - { title: 'Portuguese', code: 'pt' }, - { title: 'Chinese', code: 'zh' } + { title: 'German', code: 'de_DE' }, + { title: 'Hungarian', code: 'hu' }, + { title: 'Italian', code: 'it_IT' }, + { title: 'Maori (New Zealand)', code: 'mi_NZ' }, + { title: 'Norwegian Bokmål', code: 'nb_NO' }, + { title: 'Norwegian Nynorsk', code: 'nn' }, + { title: 'Polish', code: 'pl' }, + { title: 'Portuguese (Brazil)', code: 'pt_BR' }, + { title: 'Portuguese (Portugal)', code: 'pt_PT' }, + { title: 'Spanish', code: 'es' }, + { title: 'Swedish', code: 'sv_SE' }, + { title: 'Swedish (Finland)', code: 'sv_FI' } ], content_style: 'body { font-family:Helvetica,Arial,sans-serif; font-size:16px }' -}); \ No newline at end of file +}); diff --git a/modules/ROOT/nav.adoc b/modules/ROOT/nav.adoc index d1a7911232..13dd7a545c 100644 --- a/modules/ROOT/nav.adoc +++ b/modules/ROOT/nav.adoc @@ -405,6 +405,14 @@ ** xref:tinymce-and-cors.adoc[Cross-Origin Resource Sharing (CORS)] * Release information ** xref:release-notes.adoc[Release notes for {productname} {productmajorversion}] +*** {productname} 7.2 +**** xref:7.2-release-notes.adoc#overview[Overview] +**** xref:7.2-release-notes.adoc#accompanying-premium-self-hosted-server-side-component-changes[Accompanying Premium self-hosted server-side component changes] +**** xref:7.2-release-notes.adoc#accompanying-premium-plugin-changes[Accompanying Premium plugin changes] +**** xref:7.2-release-notes.adoc#improvements[Improvements] +**** xref:7.2-release-notes.adoc#additions[Additions] +**** xref:7.2-release-notes.adoc#changes[Changes] +**** xref:7.2-release-notes.adoc#bug-fixes[Bug fixes] *** {productname} 7.1.2 **** xref:7.1.2-release-notes.adoc#overview[Overview] **** xref:7.1.2-release-notes.adoc#accompanying-premium-plugin-changes[Accompanying Premium Plugin changes] diff --git a/modules/ROOT/pages/7.2-release-notes.adoc b/modules/ROOT/pages/7.2-release-notes.adoc new file mode 100644 index 0000000000..ee973a721e --- /dev/null +++ b/modules/ROOT/pages/7.2-release-notes.adoc @@ -0,0 +1,356 @@ += TinyMCE {release-version} +:release-version: 7.2 +:navtitle: TinyMCE {release-version} +:description: Release notes for TinyMCE {release-version} +:keywords: releasenotes, new, changes, bugfixes +:page-toclevels: 1 + +include::partial$misc/admon-releasenotes-for-stable.adoc[] + + +[[overview]] +== Overview + +{productname} {release-version} was released for {enterpriseversion} and {cloudname} on Wednesday, June 19^th^, 2024. These release notes provide an overview of the changes for {productname} {release-version}, including: + +* xref:accompanying-premium-self-hosted-server-side-component-changes[Accompanying Premium self-hosted server-side component changes] +* xref:accompanying-premium-plugin-changes[Accompanying Premium plugin changes] +* xref:improvements[Improvements] +* xref:additions[Additions] +* xref:changes[Changes] +* xref:bug-fixes[Bug fixes] + + +[[accompanying-premium-self-hosted-server-side-component-changes]] +== Accompanying Premium self-hosted server-side component changes + +The {productname} {release-version} release includes accompanying changes affecting the {productname} **self-hosted** services for the following plugin: + +* **Spell Checker** plugin `tinymcespellchecker`. + +For information on: + +* The **Spell Checker** plugin, see: xref:introduction-to-tiny-spellchecker.adoc[Spell Checker plugin]. +* Deploying the **server-side** components, see: xref:introduction-to-premium-selfhosted-services.adoc[Server-side component installation]. + +The Java server-side component has been updated to the following version: + +* `ephox-spelling.war`: 2.119.6 + +=== Updating the self-hosted server-side components + +The new versions of the server-side services provide updates for the Java-based server-side components. To deploy the updated version of the server-side components: + +. Update your Java Application Server to the minimum required version: + +include::partial$misc/supported-application-servers.adoc[] + +. Replace the existing server-side `.war` files with the `.war` files bundled with {productname} {release-version} or later. + +For information on: + +* Deploying the server-side components, see: xref:introduction-to-premium-selfhosted-services.adoc[Server-side component installation]. +* Deploying the server-side components using Docker, see: xref:bundle-intro-setup.adoc[Containerized service deployments]. + +include::partial$misc/admon-no-functionality-changes-in-updated-server-side-components.adoc[] + + +[[accompanying-premium-plugin-changes]] +== Accompanying Premium plugin changes + +The following premium plugin updates were released alongside {productname} {release-version}. + +=== Accessibility Checker + +The {productname} {release-version} release includes an accompanying release of the **Accessibility Checker** premium plugin. + +**Accessibility Checker** includes the following fix. + +==== Temporary elements such as incorrect spelling highlights were interfering with accessibility checking. +// #TINY-10771 + +Previously, elements with certain attributes, such as highlights from the xref:introduction-to-tiny-spellchecker.adoc[Spell Checker] plugin, were not being ignored by some checks in the Accessibility Checker plugin. + +As a consequence, these checks were not functioning correctly and were missing accessibility failures that should have been detected by the Accessibility Checker plugin. + +{productname} {release-version} addresses this issue. Now, the checks have been modified to ignore all elements that should be excluded, such as those with specific attributes added by the Spell Checker plugin. + +As a result, the Accessibility Checker now accurately identifies the accessibility issues in the content, even when temporary elements are present. + +For information on the **Accessibility Checker** premium plugin, see: xref:a11ychecker.adoc[Accessibility Checker]. + +=== Image Editing + +The {productname} {release-version} release includes an accompanying release of the **Image Editing** premium plugin. + +**Image Editing** includes the following improvement. + +==== Dialog slider components now emit an onChange event when using arrow keys. +// #TINY-10428 + +Previously in the Edit Image dialog, when using the left/right arrow keys to adjust settings with sliders, the slider component did not properly update the image preview. As a consequence, users were unable to use the keyboard to update image properties controlled by sliders such as Brightness, Contrast, Color Levels, and Gamma settings. + +In {productname} {release-version}, this issue has been resolved. Now, the slider component emits an `onChange` event when the slider value is adjusted using the left/right arrow keys. As a result, users can now update the Edit Image dialog sliders using the keyboard. + +For information on the **Image Editing** premium plugin, see: xref:editimage.adoc[Image Editing]. + +=== Math + +The {productname} {release-version} release includes an accompanying release of the **Math** premium plugin. + +**Math** includes the following fix. + +==== Math preview was not rendered with the colors from the current skin. +// #TINY-10900 + +Previously, the **Math** preview did not follow the editor skin UI colors. As a consequence, the equation preview dialog was always rendered with black text on white background even if the UI skin was a dark skin. + +This has been addressed in {productname} {release-version}. Now, the editor renders the equation preview inline with the **Math** dialog, and not using an iframe, so that the preview container's colors are inherited from the dialog. As a result, the text color and background color of the equation preview container now follows the editor skin UI colors. + +For information on the **Math** premium plugin, see: xref:math.adoc[Math]. + +=== PowerPaste + +The {productname} {release-version} release includes an accompanying release of the **PowerPaste** premium plugin. + +**PowerPaste** includes the following addition. + +==== New option to disable the auto-linking feature in PowerPaste. +// #TINY-10962 + +Previously in {productname}, it was not possible to configure PowerPaste to exclude converting text that resembles a URL into a hyperlink. As a consequence, all text that resembled a URL was automatically converted into a hyperlink when pasting plain text or rich text from HTML. + +In {productname} {release-version}, the `powerpaste_autolink_urls` option has been introduced. This option allows users to customize the auto-linking behavior on paste. As a result, users can now disable the auto-linking feature in PowerPaste. + +NOTE: This option is enabled by default and does not exhibit any change in behavior when upgrading to {productname} {release-version}. + +For more information on the `powerpaste_autolink_urls` option, refer to: xref:powerpaste-options.adoc#powerpaste_autolink_urls[PowerPaste - powerpaste_autolink_urls]. + +For information on the **PowerPaste** premium plugin, see: xref:introduction-to-powerpaste.adoc[PowerPaste]. + +=== Revision History + +The {productname} {release-version} release includes an accompanying release of the **Revision History** premium plugin. + +**Revision History** includes the following addition. + +==== New `revisionhistory_fetch_revision` option to support updating a revision. +// #TINY-10362 + +In {productname} {release-version}, a new `revisionhistory_fetch_revision` option has been added to enable updating a revision after the initial fetch. If configured, when a revision is selected, the plugin uses this option to update the selected or closest revision that has no content. + +NOTE: As part of this addition, the `content` property is now optional. For the fetched revisions, an empty string is considered as valid content. + +IMPORTANT: The `revisionhistory_fetch` option must be configured when using the new `revisionhistory_fetch_revision` option, as it is required to provide the initial revisions. + +For more information on the `revisionhistory_fetch_revision` option, see: xref:revisionhistory.adoc#revisionhistory_fetch_revision[Revision History - revisionhistory_fetch_revision]. + +This option is useful for handling revisions with large content or for loading content only when needed. + +For information on the **Revision History** premium plugin, see: xref:revisionhistory.adoc[Revision History]. + +=== Spell Checker + +The {productname} {release-version} includes an accompanying release of the **Spell Checker** premium plugin. + +**Spell Checker** includes the following improvement. + +==== Enhanced spelling service to support spellchecking for additional languages using customer-provided Hunspell dictionaries. +// #TCLOUD-4297 + +{productname} {release-version} introduces the following improvements for specified languages: + +* Medical English (US) was updated from `"en_US-medical"` to include `"en-medical"` as an additional code. +* Dutch was updated from `"nl"` to `"nl, nl_NL"`. +* German was updated from `"de"` to `"de, de_DE"`. +* Italian was updated from `"it"` to `"it, it_IT"`. +* Norwegian Bokmål was updated from `"nb"` to `"nb, nb_NO"`. +* Portuguese (Brazil) was updated from `"pt"` to `"pt, pt_BR"`. +* Swedish was updated from `"sv"` to `"sv, sv_SE"`. + +For information on the **Spell Checker** premium plugin, see: xref:introduction-to-tiny-spellchecker.adoc[Spell Checker plugin] or for an complete list of supported languages, see: xref:introduction-to-tiny-spellchecker.adoc#supported-languages[Supported languages]. + + +[[improvements]] +== Improvements + +{productname} {release-version} also includes the following improvements: + +=== Accessibility for element path buttons, added tooltip to describe the button and removed incorrect `aria-level` attribute. +// #TINY-10891 + +In previous versions of {productname}, Axe-DevTools (web accessibility testing extension) identified that the element path buttons contained an invalid `aria-level` attribute that is not permitted on `role="button"` elements. As a consequence, screen readers were unable to describe the purpose of these buttons to visually impaired users. + +{productname} {release-version} addresses this issue by adding tooltips to the buttons in the element path which now provides a description of the button's functionality. In addition, the `aria-describedby` attribute has been added when the tooltip is focused, allowing screen readers to announce and describe the purpose of the button when in-focus. Now, a tooltip appears when hovering over an element path button with the mouse or focusing on it using the keyboard. + +[NOTE] +With this change {productname} also removed of the incorrect `aria-level` attribute that was added to these buttons previously. This change ensures that the editor complies with the "Elements must only use supported ARIA attributes" rule. + +=== Improve merging of inserted inline elements by removing nodes with redundant inheritable styles. +// #TINY-10869 + +In previous versions of {productname}, when inserting inline elements into existing inline elements, the editor would attempt to merge the contents of identical inline elements. Inserted inline elements would only be removed if they were identical to inline parents of the element being inserted into, and this check would only occur until it found a non-inheritable style or a conflict. + +In {productname} {release-version}, this behavior has been improved. Now, inserted inline elements are removed when they contain no non-inheritable styles, have only one child element, and either: + +* Contain no styles which are inherited in a child element, or +* Are identical to any inline parent of the selected element and don't contain any styles which conflict with another inserted parent's styles. + +As a result, many redundant inline elements are automatically stripped when inserted into the editor, while maintaining their appearance and overall element structure. + +=== Improved Search & Replace dialog accessibility by changing placeholders to labels. +// #TINY-10871 + +In previous versions of {productname}, the Search & Replace dialog inputs were initially implemented with placeholders. + +As a consequence, the dialog was less accessible because the input placeholders were hidden once the user started typing. This posed difficulties for users who rely on consistent visual cues for context. + +{productname} {release-version} addresses this issue. Now, placeholders have been replaced by input labels located above the input fields. + +As a result, the Search & Replace dialog is now more accessible and there are input labels that remain visible at all times. + + +[[additions]] +== Additions + +{productname} {release-version} also includes the following additions: + +=== Added `options.debug` API that logs the initial raw editor options to console. +// #TINY-10605 + +This release introduces a new `options.debug` API that logs the initial raw editor options passed to `tinymce.init` to the console. This API is useful for debugging and troubleshooting issues with the editor, especially when dynamically composing many editor options from different sources. + +Usage: + +[source,js] +---- +tinymce.activeEditor.options.debug(); +---- + +The following data types are logged exactly as they are passed to `tinymce.init`: + +* `string` +* `number` +* `boolean` +* `object` +* `array` +* `null` + +All other data types not mentioned above are logged as `[object X]` where "X" is the type of the object, such as: + +* `Function` +* `Undefined` +* `RegExp` +* `Promise` +* and more + +==== Example: using the `options.debug` API: + +[source,js] +---- +tinymce.init({ + selector: 'textarea', + height: 500, + paste_as_text: true, + context_menu: [ 'image', 'lists' ], + menu: { insert: { title: 'Insert', items: 'table | image | accordion' }}, + inline: null, + myUndefined: undefined, + init_instance_callback: (editor) => editor.options.debug(), +}); +---- + +The above code will log the following to the console: + +[source,js] +---- +{ + selector: 'textarea', + height: 500, + paste_as_text: true, + context_menu: [ 'image', 'lists' ], + menu: { insert: { title: 'Insert', items: 'table | image | accordion' }}, + inline: null, + myUndefined: [object Undefined], + init_instance_callback: [object Function], +} +---- + +=== Added `referrerpolicy` as a valid attribute for an iframe element. +// #TINY-10374 + +Previously in {productname}, the `referrerpolicy` attribute was not considered as valid for iframe elements. In {productname} {release-version}, this attribute has been added to the schema, allowing users to include the `referrerpolicy` attribute in iframes. + +=== Added support for querying the state of the `mceTogglePlainTextPaste` command. +// #TINY-10938 + +In {productname} {release-version}, the `mceTogglePlainTextPaste` command has been updated to support querying its state. This allows users to determine whether the paste-as-text mode is currently active. + +The `mceTogglePlainTextPaste` command can be queried using the following API: + +[source,js] +---- +tinymce.activeEditor.queryCommandState('mceTogglePlainTextPaste'); +---- + + +[[changes]] +== Changes + +{productname} {release-version} also includes the following change: + +=== Replaced {companyname} branding logo with `Build with TinyMCE` text and logo. +// #TINY-11001 + +Previously, the branding logo in the {productname} status bar was set to the {companyname} logo. + +Now, the branding logo in the {productname} status bar is set to `Build with` and the {productname} logo. + + +[[bug-fixes]] +== Bug fixes + +{productname} {release-version} also includes the following bug fixes: + +=== Deleting in a `div` with preceding `br` elements would sometimes throw errors. +// #TINY-10840 + +Previously, when deleting the last character in a `
` element with preceding `
` elements, an error _(Uncaught DOMException: Failed to execute 'setStart' on 'Range': There is no child at offset)_ was thrown to the console, and the `
` element was incorrectly converted to a `

` element. + +{productname} {release-version} addresses this issue. The delete logic has been modified to properly handle this situation. After the fix, the `

` element remains a `
`, and no error is thrown to the console when deleting the last character. + +=== `autoresize_bottom_margin` was not reliably applied in some situations. +// #TINY-10793 + +In {productname} 6.4.1, a link:https://www.tiny.cloud/docs/tinymce/6/6.4.1-release-notes/#editor-increases-the-height-indefinitely-when-using-autoresize-with-content_css-document[fix] addressed an issue where the editor's height would increase indefinitely when using the xref:autoresize.adoc[Autoresize] plugin with `content_css` set to `document`. This fix inadvertently caused a regression, resulting in the editor occasionally failing to apply bottom padding correctly. + +As a result, the `autoresize_bottom_margin` was not consistently applied in certain scenarios. + +In {productname} {release-version}, this issue has been resolved, and the `autoresize_bottom_margin` is now reliably applied. + +=== Fixed cases where adding a newline around a br, table or img would not move the cursor to a new line. +// #TINY-10384 + +In previous versions of {productname}, an issue affecting cursor positioning was identified when adding new lines around specific HTML elements such as `
`, ``, and `` tags. + +As a consequence, the cursor failed to move to a new line when adding a newline around these elements, resulting in unexpected behavior while editing content within the editor. + +With the release of {productname} {release-version}, this issue has been addressed. The editor now accurately interprets the presence of spaces or newlines after certain HTML elements. As a result, cursor movement behaves as expected when adding new lines around `
`, `
`, and `` tags. + +=== Focusing on `contenteditable="true"` element when using `editable_root: false` and inline mode caused selection to be shifted. +// #TINY-10820 + +Previously in {productname}, there was an issue where focusing on `contenteditable="true"` elements, such as media elements, while using `editable_root: false` and inline mode would cause the selection to be shifted. When saving the media dialog, the focus would first shift to the editor to ensure the changes are inserted into the editor. However, this caused the selection to change, leading to a duplicated element being inserted into the editor. + +This issue has been resolved in {productname} {release-version}. Now, after focusing on the `contenteditable="true"` root, the editor bookmark is restored, ensuring that the selection remains at the correct location when saving the media. + +As a result, when focusing on `contenteditable="true"` elements in inline mode with `editable_root: false`, the selection will remain correct after saving the media dialog. This prevents the duplication of elements and ensures that the changes are inserted at the intended location within the editor. + +=== Corrected the `role` attribute on listbox dialog components to `combobox` when there are no nested menu items. +// #TINY-10807 + +Previously in {productname}, the `role` attribute on listbox dialog components was set to `menu` when there were no nested menu items. This caused confusion for users, as screen readers would announce non-hierarchical listboxes as menu buttons. + +In {productname} {release-version}, this issue has been addressed by setting the `role` attribute to `combobox` when there are no nested menu items. + +As a result, screen readers now announce the listbox as a combobox and the menu it opens as a listbox. This improvement ensures that the currently selected value is announced when tabbing to the select box, and the selected items are announced as a listbox. \ No newline at end of file diff --git a/modules/ROOT/pages/changelog.adoc b/modules/ROOT/pages/changelog.adoc index 642d3df028..35a66b6619 100644 --- a/modules/ROOT/pages/changelog.adoc +++ b/modules/ROOT/pages/changelog.adoc @@ -4,6 +4,46 @@ NOTE: This is the {productname} Community version changelog. For information about the latest {cloudname} or {enterpriseversion} Release, see: xref:release-notes.adoc[{productname} Release Notes]. +== 7.2.0 - 2024-06-19 + +=== Added +* Added `options.debug` API that logs the initial raw editor options to console. +// #TINY-10605 +* Added `referrerpolicy` as a valid attribute for an iframe element. +// #TINY-10374 +* New `onInit` and `stretched` properties to the `HtmlPanel` dialog component. +// #TINY-10900 +* Added support for querying the state of the `mceTogglePlainTextPaste` command. +// #TINY-10938 +* Added `for` option to dialog label components to improve accessibility. The value must be another component on the same dialog. +// #TINY-10971 + +=== Improved +* Dialog slider components now emit an onChange event when using arrow keys. +// #TINY-10428 +* Accessibility for element path buttons, added tooltip to describe the button and removed incorrect `aria-level` attribute. +// #TINY-10891 +* Improve merging of inserted inline elements by removing nodes with redundant inheritable styles. +// #TINY-10869 +* Improved Find & Replace dialog accessibility by changing placeholders to labels. +// #TINY-10871 + +=== Changed +* Replaced tiny branding logo with `Build with TinyMCE` text and logo. +// #TINY-11001 + +=== Fixed +* Deleting in a `div` with preceding `br` elements would sometimes throw errors. +// #TINY-10840 +* `autoresize_bottom_margin` was not reliably applied in some situations. +// #TINY-10793 +* Fixed cases where adding a newline around a br, table or img would not move the cursor to a new line. +// #TINY-10384 +* Focusing on `contenteditable="true"` element when using `editable_root: false` and inline mode causing selection to be shifted. +// #TINY-10820 +* Corrected the `role` attribute on listbox dialog components to `combobox` when there are no nested menu items. +// #TINY-10807 + == 7.1.2 - 2024-06-05 ### Fixed diff --git a/modules/ROOT/pages/dialog-components.adoc b/modules/ROOT/pages/dialog-components.adoc index 8efa8d3383..73a169131f 100644 --- a/modules/ROOT/pages/dialog-components.adoc +++ b/modules/ROOT/pages/dialog-components.adoc @@ -162,6 +162,7 @@ A *label* is a layout component that wraps other components and adds a label abo { type: 'label', // component type label: 'Caption', // text for the group label + for: 'findtext', // identifier of the dialog label component items: [ ... ] // array of panel components } ---- diff --git a/modules/ROOT/pages/editor-command-identifiers.adoc b/modules/ROOT/pages/editor-command-identifiers.adoc index 482c72f039..ef8c1b54ab 100644 --- a/modules/ROOT/pages/editor-command-identifiers.adoc +++ b/modules/ROOT/pages/editor-command-identifiers.adoc @@ -601,6 +601,7 @@ The following command states can be queried using the xref:apis/tinymce.editor.a |JustifyLeft |Returns `+true+` if the content is formatted using the same markup as the {productname} `+JustifyLeft+` command. |JustifyRight |Returns `+true+` if the content is formatted using the same markup as the {productname} `+JustifyRight+` command. |mceBlockQuote |Returns `+true+` if the content is formatted using the same markup as the {productname} `+mceBlockQuote+` command. +|mceTogglePlainTextPaste |Returns `+true+` if the {productname} `+mceTogglePlainTextPaste+` command is active. |Outdent |Returns `+true+` if the content is formatted using the same markup as the {productname} `+Outdent+` command. |Strikethrough |Returns `+true+` if the content is formatted using the same markup as the {productname} `+Strikethrough+` command. |Subscript |Returns `+true+` if the content is formatted using the same markup as the {productname} `+Subscript+` command. @@ -622,6 +623,7 @@ tinymce.activeEditor.queryCommandState('JustifyFull'); tinymce.activeEditor.queryCommandState('JustifyLeft'); tinymce.activeEditor.queryCommandState('JustifyRight'); tinymce.activeEditor.queryCommandState('mceBlockQuote'); +tinymce.activeEditor.queryCommandState('mceTogglePlainTextPaste'); tinymce.activeEditor.queryCommandState('Outdent'); tinymce.activeEditor.queryCommandState('Strikethrough'); tinymce.activeEditor.queryCommandState('Subscript'); diff --git a/modules/ROOT/pages/powerpaste-options.adoc b/modules/ROOT/pages/powerpaste-options.adoc index 9d5b68b347..62b788dc5f 100644 --- a/modules/ROOT/pages/powerpaste-options.adoc +++ b/modules/ROOT/pages/powerpaste-options.adoc @@ -19,6 +19,8 @@ include::partial$configuration/powerpaste_googledocs_import.adoc[leveloffset=+1] include::partial$configuration/powerpaste_html_import.adoc[leveloffset=+1] +include::partial$configuration/powerpaste_autolink_urls.adoc[leveloffset=+1] + include::partial$configuration/powerpaste_allow_local_images.adoc[leveloffset=+1] include::partial$configuration/paste_block_drop.adoc[leveloffset=+1] diff --git a/modules/ROOT/pages/release-notes.adoc b/modules/ROOT/pages/release-notes.adoc index 903464bb90..fbbe602fb7 100644 --- a/modules/ROOT/pages/release-notes.adoc +++ b/modules/ROOT/pages/release-notes.adoc @@ -9,6 +9,13 @@ This section lists the releases for {productname} 7 and the changes made in each [cols="1,1"] |=== +a| +[.lead] +xref:7.2-release-notes.adoc#overview[{productname} 7.2] + +Release notes for {productname} 7.2 + + a| [.lead] xref:7.1.2-release-notes.adoc#overview[{productname} 7.1.2] diff --git a/modules/ROOT/pages/revisionhistory.adoc b/modules/ROOT/pages/revisionhistory.adoc index b93aedb225..89318b1c22 100644 --- a/modules/ROOT/pages/revisionhistory.adoc +++ b/modules/ROOT/pages/revisionhistory.adoc @@ -89,12 +89,15 @@ The table below summarizes how versions are handled in the {pluginname}: |Yes |N/A |Yes |The saved versions and the current version are shown |=== + == Options The following configuration options affect the behavior of the {pluginname} plugin. include::partial$configuration/revisionhistory_fetch.adoc[leveloffset=+1] +include::partial$configuration/revisionhistory_fetch_revision.adoc[leveloffset=+1] + include::partial$configuration/revisionhistory_css_url.adoc[leveloffset=+1] include::partial$configuration/revisionhistory_diff_classes.adoc[leveloffset=+1] diff --git a/modules/ROOT/partials/configuration/powerpaste_autolink_urls.adoc b/modules/ROOT/partials/configuration/powerpaste_autolink_urls.adoc new file mode 100644 index 0000000000..9a71d1e86e --- /dev/null +++ b/modules/ROOT/partials/configuration/powerpaste_autolink_urls.adoc @@ -0,0 +1,23 @@ +[[powerpaste_autolink_urls]] +== `+powerpaste_autolink_urls+` + +This option enables or disables the automatic linking of text that resembles URLs in pasted content. + +*Type:* `+Boolean+` + +*Default value:* `+true+` + +*Possible values:* `+true+`, `+false+` + +NOTE: Setting the `+powerpaste_autolink_urls+` option to `+false+` overrides the auto-linking behavior of the xref:smart_paste[`+smart_paste+`] option. + +=== Example: Disable auto-linking of URLs + +[source,js] +---- +tinymce.init({ + selector: 'textarea', // change this value according to your HTML + plugins: 'powerpaste', + powerpaste_autolink_urls: false, +}); +---- \ No newline at end of file diff --git a/modules/ROOT/partials/configuration/revisionhistory_fetch.adoc b/modules/ROOT/partials/configuration/revisionhistory_fetch.adoc index ee5801b7eb..aa340dd976 100644 --- a/modules/ROOT/partials/configuration/revisionhistory_fetch.adoc +++ b/modules/ROOT/partials/configuration/revisionhistory_fetch.adoc @@ -1,18 +1,27 @@ [[revisionhistory_fetch]] == `revisionhistory_fetch` -The plugin uses the `revisionhistory_fetch` function to retrieve the saved versions. +The `revisionhistory_fetch` function retrieves saved versions and is **required** for the Revision History plugin to work. It is called when the user opens the Revision History view. -The `revisionhistory_fetch` option is an asynchronous function that returns a https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise[Promise] which resolves to an array of revisions. +The `revisionhistory_fetch` option is an asynchronous function that returns a link:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise[Promise] which resolves to an array of revisions. [NOTE] -The {pluginname} plugin does not sort the result before displaying. This allows the integrators to sort the result according to their preference. It is recommended that the result should be sorted in reverse chronological order because it is more intuitive for the users when they can only identify a version by its date. +The {pluginname} plugin does not sort results before displaying them, allowing integrators to sort the results according to their preference. {companyname} recommends to sort the results in reverse chronological order, as this makes it easier for users to identify versions by date. *Type:* `+Function+` (Returns a https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise[Promise]) *Input parameters:* None -*Return data:* `+Array+` +*Return data:* `+Array+` of revision `+Objects+` + +Each revision `+Object+` must have the following fields: +[cols="1,1,1,3",options="header"] +|=== +|Field |Type |Required? |Description +|`+revisionId+` | `+string+` | required | The unique string ID of the revision. +|`+createdAt+` | `+string+` | required | A UTC datetime string in ISO-8061 format. +|`+content+` | `+string+` | optional | HTML string of the revision content. Empty string is considered as valid content. +|=== === Example of `revisionhistory_fetch` response @@ -42,15 +51,9 @@ const revisions = [

Welcome to Tinymce!

`, } -] +]; ---- -The data returned by `revisionhistory_fetch` requires the following fields for the {pluginname} to work: - -. `revisionId`: Unique string Id. -. `createdAt`: A UTC datetime string in ISO-8061 format. For example: `2019-11-14T10:55:31.820Z`. -. `content`: HTML string. - === Example: using `revisionhistory_fetch` [source,js] diff --git a/modules/ROOT/partials/configuration/revisionhistory_fetch_revision.adoc b/modules/ROOT/partials/configuration/revisionhistory_fetch_revision.adoc new file mode 100644 index 0000000000..dc3aa28aac --- /dev/null +++ b/modules/ROOT/partials/configuration/revisionhistory_fetch_revision.adoc @@ -0,0 +1,79 @@ +[[revisionhistory_fetch_revision]] +== `revisionhistory_fetch_revision` +When a revision is selected, the plugin uses this option to update the selected or closest revision that has no content. The function is expected to return a Promise that resolves with an updated revision. + +*Type:* `+Function+` (Returns a link:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise[Promise]) + +*Input parameters:* +[cols="1,1,1,3",options="header"] +|=== +|Field |Type |Required? |Description +|`+editor+` | `+Editor+` | required | The editor instance to load the revision into (useful if there are multiple editors on the page). +|`+revision+` | `+Object+` | required | The revision object to load (must include `revisionId` field). +|=== + +*Return data:* revision `+Object+` as described in the return data of the xref:revisionhistory.adoc#revisionhistory_fetch[revisionhistory_fetch] option. + +=== Example: using `revisionhistory_fetch_revision` + +[source,js] +---- +const lightRevisions = [ + { + revisionId: '3', + createdAt: '2023-11-29T10:11:21.578Z', + }, + { + revisionId: '2', + createdAt: '2023-11-25T08:30:21.578Z', + }, + { + revisionId: '1', + createdAt: '2023-11-24T22:26:21.578Z', + } +]; + +const revisions = [ + { + revisionId: '3', + createdAt: '2023-11-29T10:11:21.578Z', + content: ` +

Welcome to TinyMCE Docs!

+

Here is some content that is bold and italic.

+ `, + }, + { + revisionId: '2', + createdAt: '2023-11-25T08:30:21.578Z', + content: ` +

Welcome to TinyMCE Docs!

+

Here is some content that is bold and italic.

+ `, + }, + { + revisionId: '1', + createdAt: '2023-11-24T22:26:21.578Z', + content: ` +

Welcome to Tinymce!

+ `, + } +]; + +tinymce.init({ + selector: 'textarea', // change this value according to your HTML + plugins: 'revisionhistory', + toolbar: 'revisionhistory', + revisionhistory_fetch: () => Promise.resolve(lightRevisions), + revisionhistory_fetch_revision: (_editor, revision) => new Promise((resolve) => { + let newRevision = null; + for (let i = 0; i < revisions.length; i++) { + const temp = revisions[i]; + if (temp.revisionId === revision.revisionId) { + newRevision = temp; + break; + } + } + resolve(newRevision); + }) +}); +---- diff --git a/modules/ROOT/partials/configuration/smart_paste.adoc b/modules/ROOT/partials/configuration/smart_paste.adoc index a3beabff10..185eec6089 100644 --- a/modules/ROOT/partials/configuration/smart_paste.adoc +++ b/modules/ROOT/partials/configuration/smart_paste.adoc @@ -14,6 +14,8 @@ To disable the `+smart_paste+` functionality, set `+smart_paste+` to `+false+`. *Possible values:* `+true+`, `+false+` +NOTE: Setting the xref:powerpaste_autolink_urls[`+powerpaste_autolink_urls+`] option to `+false+` overrides the auto-linking feature of the `+smart_paste+` option. + === Example: using `+smart_paste+` ifdef::plugincode[] diff --git a/modules/ROOT/partials/configuration/spellchecker_languages.adoc b/modules/ROOT/partials/configuration/spellchecker_languages.adoc index 9a72e15343..d44edd128f 100644 --- a/modules/ROOT/partials/configuration/spellchecker_languages.adoc +++ b/modules/ROOT/partials/configuration/spellchecker_languages.adoc @@ -8,9 +8,10 @@ This option specifies the spellchecker languages that are available to the user, *Default value:* [source,js] ---- -'English (United States)=en_US,English (United Kingdom)=en_GB,Danish=da,Dutch=nl,Finnish=fi,French=fr,German=de,Italian=it,Norwegian=nb,Portuguese=pt,Portuguese (Portugal)=pt_PT,Spanish=es,Swedish=sv' +'English (United States)=en_US,English (United Kingdom)=en_GB,Danish=da,Dutch=nl,Finnish=fi,French=fr,German=de,Italian=it,Norwegian Bokmål=nb_NO,Norwegian Nynorsk=nn,Brazilian Portuguese=pt_BR,Portuguese=pt,Portuguese (Portugal)=pt_PT,Spanish=es,Swedish=sv,Swedish (Finland)=sv_FI,Afrikaans (South Africa)=af_ZA,English (Australia)=en_AU,English (Canada)=en_CA,English (United Kingdom)=en_GB,English (United States)=en_US,Medical English (US)=en_US-medical,Medical English (UK)=en_GB-medical,Maori (New Zealand)=mi_NZ' ---- + === Example: using `spellchecker_languages` [source,js] @@ -18,6 +19,6 @@ This option specifies the spellchecker languages that are available to the user, tinymce.init({ selector: 'textarea', plugins: 'tinymcespellchecker', - spellchecker_languages: 'US English=en_US,UK English=en_GB,Danish=da,Dutch=nl,Finnish=fi,French=fr,German=de,Italian=it,Norwegian=nb,Brazilian Portuguese=pt,Iberian Portuguese=pt_PT,Spanish=es,Swedish=sv' + spellchecker_languages: 'US English=en_US,UK English=en_GB,Danish=da,Dutch=nl,Finnish=fi,French=fr,German=de,Italian=it,Norwegian Bokmål=nb_NO,Norwegian Nynorsk=nn,Brazilian Portuguese=pt_BR,Portuguese=pt,Portuguese (Portugal)=pt_PT,Spanish=es,Swedish=sv,Swedish (Finland)=sv_FI,Afrikaans (South Africa)=af_ZA,English (Australia)=en_AU,English (Canada)=en_CA,English (United Kingdom)=en_GB,English (United States)=en_US,Medical English (US)=en_US-medical,Medical English (UK)=en_GB-medical,Maori (New Zealand)=mi_NZ' }); ----- +---- \ No newline at end of file diff --git a/modules/ROOT/partials/misc/spellchecker-languages.adoc b/modules/ROOT/partials/misc/spellchecker-languages.adoc index c1378726ee..e6bc1bb04a 100644 --- a/modules/ROOT/partials/misc/spellchecker-languages.adoc +++ b/modules/ROOT/partials/misc/spellchecker-languages.adoc @@ -11,22 +11,22 @@ The following languages are supported for the Spell Checker plugin. All of the l |English (Canada) |en_CA |{cross} |{tick} |English (United Kingdom) |en_GB, en_UK, en_BR |{tick} |{tick} |English (United States) |en, en_US |{tick} |{tick} -|Medical English (US) |en_US-medical |{tick} |{tick} +|Medical English (US) |en-medical, en_US-medical |{tick} |{tick} |Medical English (UK) |en_GB-medical |{tick} |{cross} |Danish |da |{tick} |{tick} -|Dutch |nl |{tick} |{tick} +|Dutch |nl, nl_NL |{tick} |{tick} |Finnish |fi |{tick} |{cross} |French |fr |{tick} |{tick} -|German |de |{tick} |{tick} +|German |de, de_DE |{tick} |{tick} |Hungarian |hu |{cross} |{tick} -|Italian |it |{tick} |{tick} +|Italian |it, it_IT |{tick} |{tick} |Maori (New Zealand) |mi_NZ |{cross} |{tick} -|Norwegian Bokmål |nb |{tick} |{tick} +|Norwegian Bokmål |nb, nb_NO |{tick} |{tick} |Norwegian Nynorsk |nn |{cross} |{tick} |Polish |pl |{cross} |{tick} -|Portuguese (Brazil) |pt |{tick} |{tick} +|Portuguese (Brazil) |pt, pt_BR |{tick} |{tick} |Portuguese (Portugal) |pt_PT |{tick} |{tick} |Spanish |es |{tick} |{tick} -|Swedish |sv |{tick} |{tick} +|Swedish |sv, sv_SE |{tick} |{tick} |Swedish (Finland) |sv_FI |{cross} |{tick} -|=== +|=== \ No newline at end of file diff --git a/modules/ROOT/partials/plugins/spellchecker-content_langs.adoc b/modules/ROOT/partials/plugins/spellchecker-content_langs.adoc index c5c713ff82..f7d077b457 100644 --- a/modules/ROOT/partials/plugins/spellchecker-content_langs.adoc +++ b/modules/ROOT/partials/plugins/spellchecker-content_langs.adoc @@ -18,19 +18,33 @@ For example: [source,js] ---- tinymce.init({ - selector: 'textarea', // change this according to your HTML + selector: 'textarea', toolbar: 'language', plugins: 'tinymcespellchecker', content_langs: [ - { title: 'English (US)', code: 'en_US' }, - { title: 'English (US Medical)', code: 'en_US', customCode: 'en_US-medical' }, - { title: 'English (UK)', code: 'en_UK' }, - { title: 'English (UK Medical)', code: 'en_UK', customCode: 'en_UK-medical' }, - { title: 'Spanish', code: 'es' }, + { title: 'Afrikaans (South Africa)', code: 'af_ZA', customCode: 'af_ZA' }, + { title: 'English (Australia)', code: 'en_AU' }, + { title: 'English (Canada)', code: 'en_CA' }, + { title: 'English (United Kingdom)', code: 'en_GB' }, + { title: 'English (United States)', code: 'en_US' }, + { title: 'Medical English (US)', code: 'en_US', customCode: 'en_US-medical' }, + { title: 'Medical English (UK)', code: 'en_GB', customCode: 'en_GB-medical' }, + { title: 'Danish', code: 'da' }, + { title: 'Dutch', code: 'nl_NL' }, + { title: 'Finnish', code: 'fi' }, { title: 'French', code: 'fr' }, - { title: 'German', code: 'de' }, - { title: 'Portuguese', code: 'pt' }, - { title: 'Chinese', code: 'zh' } - ] + { title: 'German', code: 'de_DE' }, + { title: 'Hungarian', code: 'hu' }, + { title: 'Italian', code: 'it_IT' }, + { title: 'Maori (New Zealand)', code: 'mi_NZ' }, + { title: 'Norwegian Bokmål', code: 'nb_NO' }, + { title: 'Norwegian Nynorsk', code: 'nn' }, + { title: 'Polish', code: 'pl' }, + { title: 'Portuguese (Brazil)', code: 'pt_BR' }, + { title: 'Portuguese (Portugal)', code: 'pt_PT' }, + { title: 'Spanish', code: 'es' }, + { title: 'Swedish', code: 'sv_SE' }, + { title: 'Swedish (Finland)', code: 'sv_FI' } + ], }); ----- +---- \ No newline at end of file From 789304e0c7d3de61e04b72a99acaf00def4e4cac Mon Sep 17 00:00:00 2001 From: Karl Kemister-Sheppard Date: Wed, 19 Jun 2024 20:01:49 +1000 Subject: [PATCH 35/97] DOC-2457: TinyMCE 7.2 Security Patch. (#3360) * DOC-2457: TinyMCE 7.2 Security Patch. * Update modules/ROOT/pages/7.2-release-notes.adoc * Update modules/ROOT/pages/7.2-release-notes.adoc Co-authored-by: shirqa <43625458+ShiridiGandham@users.noreply.github.com> --------- Co-authored-by: shirqa <43625458+ShiridiGandham@users.noreply.github.com> --- modules/ROOT/nav.adoc | 1 + modules/ROOT/pages/7.2-release-notes.adoc | 32 ++++++++++++++++++++++- modules/ROOT/pages/changelog.adoc | 5 ++++ 3 files changed, 37 insertions(+), 1 deletion(-) diff --git a/modules/ROOT/nav.adoc b/modules/ROOT/nav.adoc index 13dd7a545c..32abc03ae4 100644 --- a/modules/ROOT/nav.adoc +++ b/modules/ROOT/nav.adoc @@ -413,6 +413,7 @@ **** xref:7.2-release-notes.adoc#additions[Additions] **** xref:7.2-release-notes.adoc#changes[Changes] **** xref:7.2-release-notes.adoc#bug-fixes[Bug fixes] +**** xref:7.2-release-notes.adoc#security-fixes[Security fixes] *** {productname} 7.1.2 **** xref:7.1.2-release-notes.adoc#overview[Overview] **** xref:7.1.2-release-notes.adoc#accompanying-premium-plugin-changes[Accompanying Premium Plugin changes] diff --git a/modules/ROOT/pages/7.2-release-notes.adoc b/modules/ROOT/pages/7.2-release-notes.adoc index ee973a721e..f3863bf9ed 100644 --- a/modules/ROOT/pages/7.2-release-notes.adoc +++ b/modules/ROOT/pages/7.2-release-notes.adoc @@ -19,6 +19,7 @@ include::partial$misc/admon-releasenotes-for-stable.adoc[] * xref:additions[Additions] * xref:changes[Changes] * xref:bug-fixes[Bug fixes] +* xref:security-fixes[Security fixes] [[accompanying-premium-self-hosted-server-side-component-changes]] @@ -353,4 +354,33 @@ Previously in {productname}, the `role` attribute on listbox dialog components w In {productname} {release-version}, this issue has been addressed by setting the `role` attribute to `combobox` when there are no nested menu items. -As a result, screen readers now announce the listbox as a combobox and the menu it opens as a listbox. This improvement ensures that the currently selected value is announced when tabbing to the select box, and the selected items are announced as a listbox. \ No newline at end of file +As a result, screen readers now announce the listbox as a combobox and the menu it opens as a listbox. This improvement ensures that the currently selected value is announced when tabbing to the select box, and the selected items are announced as a listbox. + +[[security-fixes]] +== Security fixes + +{productname} {release-version} includes two fixes for the following security issues: + +=== HTML entities that were double decoded in `noscript` elements caused an XSS vulnerability. +// #TINY-11019 + +A https://owasp.org/www-community/attacks/xss/[cross-site scripting] (XSS) vulnerability was discovered in {productname}'s content parsing code. This allowed specially crafted `noscript` elements containing malicious code to be executed when that content was loaded into the editor. + +This vulnerability has been patched in {productname} {release-version}, {productname} 6.8.4 and {productname} 5.11.0 LTS by ensuring that content within `noscript` elements are properly parsed. + +GHSA: link:https://github.com/tinymce/tinymce/security/advisories/GHSA-w9jx-4g6g-rp7x[GitHub Advisory]. + +CVE: Pending. + +NOTE: Tiny Technologies would like to thank link:https://malavkhatri.com/[Malav Khatri (devilbugbounty)] and another reporter for discovering this vulnerability. + +=== It was possible to inject XSS HTML that was not matching the regexp when using the `noneditable_regexp` option. +// #TINY-11022 + +A https://owasp.org/www-community/attacks/xss/[cross-site scripting] (XSS) vulnerability was discovered in {productname}'s content extraction code. When using the `noneditable_regexp` option, specially crafted HTML attributes containing malicious code were able to be executed when content was extracted from the editor. + +This vulnerability has been patched in {productname} {release-version}, {productname} 6.8.4 and {productname} 5.11.0 LTS by ensuring that, when using the `noneditable_regexp` option, any content within an attribute is properly verified to match the configured regular expression before being added. + +GHSA: link:https://github.com/tinymce/tinymce/security/advisories/GHSA-9hcv-j9pv-qmph[GitHub Advisory]. + +CVE: Pending. \ No newline at end of file diff --git a/modules/ROOT/pages/changelog.adoc b/modules/ROOT/pages/changelog.adoc index 35a66b6619..de7a933656 100644 --- a/modules/ROOT/pages/changelog.adoc +++ b/modules/ROOT/pages/changelog.adoc @@ -43,6 +43,11 @@ NOTE: This is the {productname} Community version changelog. For information abo // #TINY-10820 * Corrected the `role` attribute on listbox dialog components to `combobox` when there are no nested menu items. // #TINY-10807 +* HTML entities that were double decoded in `noscript` elements caused an XSS vulnerability. +// #TINY-11019 +* It was possible to inject XSS HTML that was not matching the regexp when using the `noneditable_regexp` option. +// #TINY-11022 + == 7.1.2 - 2024-06-05 From a52d1c761274c5009bba6ee913d996b76360cc7c Mon Sep 17 00:00:00 2001 From: Karl Kemister-Sheppard Date: Wed, 19 Jun 2024 20:41:44 +1000 Subject: [PATCH 36/97] DOC-2447: api-version bump for TinyMCE 7.2.0. (#3361) --- .api-version | 2 +- modules/ROOT/pages/apis/tinymce.editoroptions.adoc | 13 ++++++++++++- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/.api-version b/.api-version index 0e7b60da8a..4b49d9bb63 100644 --- a/.api-version +++ b/.api-version @@ -1 +1 @@ -7.1.2 \ No newline at end of file +7.2.0 \ No newline at end of file diff --git a/modules/ROOT/pages/apis/tinymce.editoroptions.adoc b/modules/ROOT/pages/apis/tinymce.editoroptions.adoc index d7fc367ede..4057cd02e9 100644 --- a/modules/ROOT/pages/apis/tinymce.editoroptions.adoc +++ b/modules/ROOT/pages/apis/tinymce.editoroptions.adoc @@ -1,7 +1,7 @@ = tinymce.EditorOptions :navtitle: tinymce.EditorOptions :description: TinyMCE Editor Options API. The options API provides the ability to register, lookup and set editor options. -:keywords: get, isRegistered, isSet, register, set, unset +:keywords: debug, get, isRegistered, isSet, register, set, unset :moxie-type: api TinyMCE Editor Options API. The options API provides the ability to register, lookup and set editor options. @@ -69,6 +69,7 @@ editor.options.set('custom_option', 'value'); [cols="2,5,1",options="header"] |=== |Name|Summary|Defined by +|xref:#debug[debug()]|Logs the initial raw editor options to the console.|`xref:apis/tinymce.editoroptions.adoc[EditorOptions]` |xref:#get[get()]|Get the value of a registered option.|`xref:apis/tinymce.editoroptions.adoc[EditorOptions]` |xref:#isRegistered[isRegistered()]|Check if an option has been registered.|`xref:apis/tinymce.editoroptions.adoc[EditorOptions]` |xref:#isSet[isSet()]|Checks to see if a value has been set for the specified option.|`xref:apis/tinymce.editoroptions.adoc[EditorOptions]` @@ -80,6 +81,16 @@ editor.options.set('custom_option', 'value'); [[methods]] == Methods +[[debug]] +=== debug() +[source, javascript] +---- +debug() +---- +Logs the initial raw editor options to the console. + +''' + [[get]] === get() [source, javascript] From b5000ec450570471997ab0c9a274106dc5393b28 Mon Sep 17 00:00:00 2001 From: Karl Kemister-Sheppard Date: Thu, 20 Jun 2024 10:33:28 +1000 Subject: [PATCH 37/97] DOC-2461_2: Add CVE's for TinyMCE 7.2 release notes. (#3364) --- modules/ROOT/pages/7.2-release-notes.adoc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/ROOT/pages/7.2-release-notes.adoc b/modules/ROOT/pages/7.2-release-notes.adoc index f3863bf9ed..49e7b4eec5 100644 --- a/modules/ROOT/pages/7.2-release-notes.adoc +++ b/modules/ROOT/pages/7.2-release-notes.adoc @@ -370,7 +370,7 @@ This vulnerability has been patched in {productname} {release-version}, {product GHSA: link:https://github.com/tinymce/tinymce/security/advisories/GHSA-w9jx-4g6g-rp7x[GitHub Advisory]. -CVE: Pending. +CVE: link:https://www.cve.org/CVERecord?id=CVE-2024-38357[CVE-2024-38357]. NOTE: Tiny Technologies would like to thank link:https://malavkhatri.com/[Malav Khatri (devilbugbounty)] and another reporter for discovering this vulnerability. @@ -383,4 +383,4 @@ This vulnerability has been patched in {productname} {release-version}, {product GHSA: link:https://github.com/tinymce/tinymce/security/advisories/GHSA-9hcv-j9pv-qmph[GitHub Advisory]. -CVE: Pending. \ No newline at end of file +CVE: link:https://www.cve.org/CVERecord?id=CVE-2024-38356[CVE-2024-38356]. \ No newline at end of file From 8871a387eb8aabc166253d2921fc17cc391630e3 Mon Sep 17 00:00:00 2001 From: Daniel Oakman <141111365+danoaky-tiny@users.noreply.github.com> Date: Fri, 21 Jun 2024 07:25:22 +1000 Subject: [PATCH 38/97] DOC-2435: Updated Angular quick start guides (#3332) --- .../integrations/angular-quick-start.adoc | 112 ++++++++++-------- 1 file changed, 65 insertions(+), 47 deletions(-) diff --git a/modules/ROOT/partials/integrations/angular-quick-start.adoc b/modules/ROOT/partials/integrations/angular-quick-start.adoc index 90bd0a0615..76d2c8b6b4 100644 --- a/modules/ROOT/partials/integrations/angular-quick-start.adoc +++ b/modules/ROOT/partials/integrations/angular-quick-start.adoc @@ -1,6 +1,8 @@ :packageName: tinymce-angular -The https://github.com/tinymce/tinymce-angular[Official {productname} Angular component] integrates {productname} into Angular projects. This procedure creates a https://angular.io/guide/setup-local[basic Angular application] containing a {productname} editor. +The https://github.com/tinymce/tinymce-angular[Official {productname} Angular component] integrates {productname} into Angular projects. This procedure creates a https://angular.dev/tools/cli/setup-local[basic Angular application] containing a {productname} editor. + +This procedure uses standalone components. If using Angular Modules, see xref:angular-modules[Angular Modules]. For examples of the {productname} Angular integration, visit https://tinymce.github.io/tinymce-angular/[the tinymce-angular storybook]. @@ -45,44 +47,36 @@ ifeval::["{productSource}" != "package-manager"] npm install --save @tinymce/tinymce-angular ---- endif::[] -. Using a text editor, open `+/path/to/tinymce-angular-demo/src/app/app.module.ts+` and replace the contents with: -+ -[source,ts] ----- -import { BrowserModule } from '@angular/platform-browser'; -import { NgModule } from '@angular/core'; -import { EditorModule } from '@tinymce/tinymce-angular'; -import { AppComponent } from './app.component'; - -@NgModule({ - declarations: [ - AppComponent - ], - imports: [ - BrowserModule, - EditorModule - ], - providers: [], - bootstrap: [AppComponent] +. Using a text editor, open `+/path/to/tinymce-angular-demo/src/app/app.component.ts+` and replace the contents with: ++ +[source,ts,subs="attributes+"] +---- +import { Component } from '@angular/core'; +import { EditorComponent } from '@tinymce/tinymce-angular'; + +@Component({ + selector: 'app-root', + standalone: true, + imports: [EditorComponent], + template: ` +

{productname} {productmajorversion} Angular Demo

+ + ` }) -export class AppModule { } +export class AppComponent { + init: EditorComponent['init'] = { + plugins: 'lists link image table code help wordcount' + }; +} ---- -. Using a text editor, open `+/path/to/tinymce-angular-demo/src/app/app.component.html+` and replace the contents with: -+ -[source,tsx,subs="attributes+"] ----- -

{productname} {productmajorversion} Angular Demo

- ----- - ifeval::["{productSource}" == "cloud"] . Include the `+apiKey+` option in the editor element and include your link:{accountsignup}/[{cloudname} API key]. Such as: + [source,tsx] ---- - + ---- endif::[] ifeval::["{productSource}" == "package-manager"] @@ -96,17 +90,16 @@ ifeval::["{productSource}" == "package-manager"] ---- . Load TinyMCE. -* To load TinyMCE when the editor is initialized (also known as lazy loading), add a dependency provider to the module using the `+TINYMCE_SCRIPT_SRC+` token. +* To load {productname} when the editor is initialized (also known as lazy loading), add a dependency provider to the component using the `+TINYMCE_SCRIPT_SRC+` token. + [source,ts] ---- -import { EditorModule, TINYMCE_SCRIPT_SRC } from '@tinymce/tinymce-angular'; +import { EditorComponent, TINYMCE_SCRIPT_SRC } from '@tinymce/tinymce-angular'; /* ... */ -@NgModule({ +@Component({ /* ... */ - imports: [ - EditorModule - ], + standalone: true, + imports: [EditorComponent], providers: [ { provide: TINYMCE_SCRIPT_SRC, useValue: 'tinymce/tinymce.min.js' } ] @@ -123,12 +116,16 @@ import { EditorModule, TINYMCE_SCRIPT_SRC } from '@tinymce/tinymce-angular'; ---- .. Update the editor configuration to include the `+base_url+` and `+suffix+` options. + -[source,html] +[source,ts] ---- - +export class AppComponent { + /* ... */ + init: EditorComponent['init'] = { + /* ... */ + base_url: '/tinymce', // Root for resources + suffix: '.min' // Suffix to use when loading resources + }; +} ---- endif::[] ifeval::["{productSource}" == "zip"] @@ -143,8 +140,6 @@ To use an independent deployment of {productname}, add a script to either the `+ ---- + -To use an independent deployment of {productname} with the create a Angular application, add the script to `+/path/to/tinymce-angular-demo/src/app/app.component.html+`. -+ * Bundling {productname} with the Angular application using a module loader (such as Webpack). + -- @@ -174,7 +169,7 @@ endif::[] == Deploying the application to a HTTP server -The application will require further configuration before it can be deployed to a production environment. For information on configuring the application for deployment, see: https://angular.io/guide/build[Angular Docs - Building and serving Angular apps] or https://angular.io/guide/deployment[Angular Docs - Deployment]. +The application will require further configuration before it can be deployed to a production environment. For information on configuring the application for deployment, see: link:https://angular.dev/tools/cli/build[Angular Docs - Building Angular Apps] or link:https://angular.dev/tools/cli/deployment[Angular Docs - Deployment]. To deploy the application to a local HTTP Server: @@ -190,10 +185,33 @@ The application has now been deployed on the web server. NOTE: Additional configuration is required to deploy the application outside the web server root directory, such as +http://localhost:/my_angular_application+. +[[angular-modules]] +== Angular Modules +`+EditorModule+` is available to import from `+@tinymce/tinymce-angular+`. Which should be included in your `+my.module.ts+` file. + +[source,ts] +---- +import { NgModule } from '@angular/core'; +import { EditorModule, TINYMCE_SCRIPT_SRC } from '@tinymce/tinymce-angular'; + +@NgModule({ + /* ... */ + imports: [ + EditorModule + ], + providers: [ + // If you're self hosting and lazy loading TinyMCE from node_modules: + { provide: TINYMCE_SCRIPT_SRC, useValue: 'tinymce/tinymce.min.js' } + ], + /* ... */ +}) +export class MyModule {} +---- + == Next Steps * For examples of the {productname} integration, see: https://tinymce.github.io/tinymce-angular/[the tinymce-angular storybook]. * For information on customizing: ** {productname} integration, see: xref:angular-ref.adoc[Angular framework Technical Reference]. ** {productname}, see: xref:basic-setup.adoc[Basic setup]. -** The Angular application, see: https://angular.io/docs[the Angular documentation]. +** The Angular application, see: https://angular.dev[the Angular documentation]. From e56c901a6944a116251801da9656cf84b6026d4e Mon Sep 17 00:00:00 2001 From: Farzad Hayat Date: Thu, 27 Jun 2024 15:25:50 +1000 Subject: [PATCH 39/97] DOC-2425: Update migration guide and 7.0 release notes regarding force_hex_colour (#3350) --- modules/ROOT/pages/7.0-release-notes.adoc | 4 +-- modules/ROOT/pages/content-formatting.adoc | 2 -- modules/ROOT/pages/migration-from-6x.adoc | 24 ++++++++++++++---- .../configuration/force_hex_color.adoc | 25 ------------------- 4 files changed, 21 insertions(+), 34 deletions(-) delete mode 100644 modules/ROOT/partials/configuration/force_hex_color.adoc diff --git a/modules/ROOT/pages/7.0-release-notes.adoc b/modules/ROOT/pages/7.0-release-notes.adoc index 6585b4dda3..99f52461d6 100644 --- a/modules/ROOT/pages/7.0-release-notes.adoc +++ b/modules/ROOT/pages/7.0-release-notes.adoc @@ -543,9 +543,9 @@ Previously, the bespoke `styles` select toolbar button in {productname} defaulte === Removed `force_hex_color` option, with the default now being all colors are forced to HEX format and as lower case. // #TINY-10436 -Previously in {productname} 6, all colors in the content HTML were set to use `rgb` values by default. As the common practice is using `hex` values this change has been **reverted**. +Previously in {productname} 6, all colors in the content HTML were set to use `rgb` values by default. As the common practice is using `hex` values, this change has been **reverted**. -As a result, in {productname} 7, all colors are converted to use `hex` values and the `forced_hex_color` option is removed. The exception being `rgba` color values, they are left as is. +As a result, in {productname} 7, only RGB values in absolute value like `rgb(255, 255, 255)` are converted to HEX values. Other RGB formats such as those with non-absolute values, and color options such as RGBA and HSL remain unchanged. The `forced_hex_color` option has been removed. For more information, see xref:migration-from-6x.adoc#force-hex-color[Migrating from {productname} 6 to {productname} 7]. diff --git a/modules/ROOT/pages/content-formatting.adoc b/modules/ROOT/pages/content-formatting.adoc index ef133a3f01..bd4f7fd81b 100644 --- a/modules/ROOT/pages/content-formatting.adoc +++ b/modules/ROOT/pages/content-formatting.adoc @@ -7,5 +7,3 @@ include::partial$configuration/formats.adoc[] include::partial$configuration/format_empty_lines.adoc[] include::partial$configuration/format_noneditable_selector.adoc[] - -include::partial$configuration/force_hex_color.adoc[] diff --git a/modules/ROOT/pages/migration-from-6x.adoc b/modules/ROOT/pages/migration-from-6x.adoc index fa32c032e7..f28052f085 100644 --- a/modules/ROOT/pages/migration-from-6x.adoc +++ b/modules/ROOT/pages/migration-from-6x.adoc @@ -125,19 +125,33 @@ This change does not impact editors using inline mode. [[force-hex-color]] ==== `force_hex_color` -Previously in {productname} 6, all colors in the content HTML were set to use `rgb` values by default. As the common practice is using `hex` values this change has been reverted. +Previously in {productname} 6, all colors in the content HTML were set to use `rgb` values by default. As the common practice is using `hex` values, this change has been reverted. .Example [source, html] ---- - + +// RGB value

Hello red color

- - +// RGBA value +

Hello red color

+// HSL value +

Hello red color

+// RGB value with alpha parameter +

Hello red color

+// RGB value with calculation +

Hello red color

+ +

Hello red color

+

Hello red color

+

Hello red color

+// non-absolute values and absolute values with calculation will not be converted to HEX color +

Hello red color

+

Hello red color

---- -In {productname} 7.0, all colors (excluding `rgba` values) are converted to use `hex` values and the `forced_hex_color` option has been removed. +In {productname} 7.0, only RGB values in absolute value like `rgb(255, 255, 255)` are converted to HEX values. Other RGB formats such as those with non-absolute values, and color options such as RGBA and HSL remain unchanged. The `forced_hex_color` option has been removed. [[plugins]] == Plugins diff --git a/modules/ROOT/partials/configuration/force_hex_color.adoc b/modules/ROOT/partials/configuration/force_hex_color.adoc deleted file mode 100644 index b46ab9677a..0000000000 --- a/modules/ROOT/partials/configuration/force_hex_color.adoc +++ /dev/null @@ -1,25 +0,0 @@ -[[force_hex_color]] -== `+force_hex_color+` - -This option allows the integrator to optionally force the conversion of either RGB or RGBA colors into HEX colors. - -*Type:* `+String+` - -*Default value:* `+'off'+` - -*Possible values:* `+'always'+`, `+'rgb_only'+`, `+'off'+` - -=== Example: using `+force_hex_color+` - -[source,js] ----- -// Output elements in XHTML style -tinymce.init({ - selector: 'textarea', // change this value according to your HTML - force_hex_color: 'always' -}); ----- - -* **force_hex_color: 'always'**: all colors are converted and applied as HEX format. -* **force_hex_color: 'rgb_only'**: only RGB and not RGBA colors are converted and applied as HEX. -* **force_hex_color: 'off'**: (default option) no conversion to hex is applied, and they are left as their input format. \ No newline at end of file From e42a0ed2e289cf9e91968b14875802ee79934b06 Mon Sep 17 00:00:00 2001 From: Karl Kemister-Sheppard Date: Fri, 28 Jun 2024 11:02:47 +1000 Subject: [PATCH 40/97] DOC-2460: Update the supported versions table in misc/supported-versions.adoc. (#3370) --- .../partials/misc/supported-versions.adoc | 38 ++++++++++++------- 1 file changed, 25 insertions(+), 13 deletions(-) diff --git a/modules/ROOT/partials/misc/supported-versions.adoc b/modules/ROOT/partials/misc/supported-versions.adoc index 3d0abacf64..8367b88de5 100644 --- a/modules/ROOT/partials/misc/supported-versions.adoc +++ b/modules/ROOT/partials/misc/supported-versions.adoc @@ -3,22 +3,34 @@ Supported versions of {productname}: -[cols="^,^,^,^",options="header"] +[cols="^,^,^",options="header"] |=== -|Version |Release Date |End of Community Support |End of Premium Support -|7.1 |2024-05-08 |- |2025-11-08 -|7.0 |2024-03-20 |2024-05-08 |2025-09-20 -|6.8 |2023-12-06 |2024-03-20 |2025-06-06 -|6.7 |2023-09-13 |2023-12-06 |2025-03-13 -|6.6 |2023-07-19 |2023-09-13 |2025-01-19 -|6.5 |2023-06-21 |2023-07-19 |2024-12-21 -|6.4 |2023-03-29 |2023-06-21 |2024-09-29 -|6.3 |2022-12-08 |2023-03-29 |2024-06-08 -|6.2 |2022-09-26 |2022-12-08 |2024-03-26 -|6.1 |2022-07-13 |2022-09-26 |2024-01-13 -|6.0 |2022-04-07 |2022-07-13 |2023-10-07 +|Version |Release Date |End of Premium Support +|7.2 |2024-06-19 |2025-12-19 +|7.1 |2024-05-08 |2025-11-08 +|7.0 |2024-03-20 |2025-09-20 +|6.8 |2023-12-06 |2025-06-06 +|6.7 |2023-09-13 |2025-03-13 +|6.6 |2023-07-19 |2025-01-19 +|6.5 |2023-06-21 |2024-12-21 +|6.4 |2023-03-29 |2024-09-29 +|6.3 |2023-12-08 |2024-06-08 +|6.2 |2022-09-26 |2024-03-26 +|6.1 |2022-07-13 |2024-01-13 +|6.0 |2022-04-07 |2023-10-07 |=== +The date listed under "End of Premium Support" indicates the last day you may receive technical assistance for using and integrating the editor. + +Bug fixes and new features are always released in the latest version of {productname} (currently {productname} 7). + +=== Security updates: + +* Security updates are released in the latest minor version of each major version of {productname} that is still under active premium or LTS support ({productname} 7, {productname} 6, {productname} 5 LTS). +* Security updates for the free open source edition of {productname} are issued only for around six months after the new major version is available. Security support for the free open source version of {productname} 6 ends on October 31, 2024. +* For customers with a commercial license, security support for {productname} 6 ends on June 6, 2025. +* {productname} 5 (both open source and commercial versions) is no longer receiving security updates. However, it is possible to extend security support for {productname} 5 by purchasing a dedicated LTS (Long Term Support) agreement. If you are interested in purchasing a {productname} 5 LTS license, please link:https://www.tiny.cloud/contact/[contact us]. + To view our Software License Agreements, visit: * link:{legalpages}/cloud-use-subscription-agreement/[The {cloudname} Services Subscription Agreement]. From 4ab0ab7f564385622d4d91cbb610a3847dee589a Mon Sep 17 00:00:00 2001 From: Karl Kemister-Sheppard Date: Fri, 28 Jun 2024 14:32:26 +1000 Subject: [PATCH 41/97] DOC-2475: Remove old link to Tiny Blog - How to use TinyMCE premium plugins in WordPress 5. (#3377) --- modules/ROOT/pages/wordpress.adoc | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/modules/ROOT/pages/wordpress.adoc b/modules/ROOT/pages/wordpress.adoc index daaae0703c..dea3255600 100644 --- a/modules/ROOT/pages/wordpress.adoc +++ b/modules/ROOT/pages/wordpress.adoc @@ -20,5 +20,4 @@ https://wordpress.org/plugins/tinymce-advanced/[Advanced Editor Tools] is a Word For details, visit: -* https://wordpress.org/plugins/tinymce-advanced/[WordPress.org Plugins - Advanced Editor Tools]. -* link:{blogurl}/how-to-use-tinymce-premium-plugins-in-wordpress-5[{companyname} Blog - How to use TinyMCE premium plugins in WordPress 5]. +* https://wordpress.org/plugins/tinymce-advanced/[WordPress.org Plugins - Advanced Editor Tools]. \ No newline at end of file From ec68d939195318790b5c9ab5f54d779c35b09b4d Mon Sep 17 00:00:00 2001 From: Karl Kemister-Sheppard Date: Fri, 28 Jun 2024 14:54:33 +1000 Subject: [PATCH 42/97] DOC-2471: Update inline-demo to support toolbar_sticky_offset, to correct visual issue. (#3374) --- modules/ROOT/examples/live-demos/inline/index.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/modules/ROOT/examples/live-demos/inline/index.js b/modules/ROOT/examples/live-demos/inline/index.js index 83ae4d0fea..cd72c6dccc 100644 --- a/modules/ROOT/examples/live-demos/inline/index.js +++ b/modules/ROOT/examples/live-demos/inline/index.js @@ -2,6 +2,8 @@ const emailHeaderConfig = { selector: '.tinymce-heading', menubar: false, inline: true, + toolbar_sticky: true, + toolbar_sticky_offset: 110, plugins: [ 'lists', 'powerpaste', @@ -20,6 +22,8 @@ const emailBodyConfig = { selector: '.tinymce-body', menubar: false, inline: true, + toolbar_sticky: true, + toolbar_sticky_offset: 110, plugins: [ 'link', 'lists', 'powerpaste', 'autolink', 'tinymcespellchecker' From 603bf10ab7e54d4b68ef8a23e3d438178a7a1719 Mon Sep 17 00:00:00 2001 From: Karl Kemister-Sheppard Date: Mon, 1 Jul 2024 16:40:02 +1000 Subject: [PATCH 43/97] DOC-2471_2: Revert toolbar_sticky_offset fix. (#3378) --- modules/ROOT/examples/live-demos/inline/index.js | 4 ---- 1 file changed, 4 deletions(-) diff --git a/modules/ROOT/examples/live-demos/inline/index.js b/modules/ROOT/examples/live-demos/inline/index.js index cd72c6dccc..83ae4d0fea 100644 --- a/modules/ROOT/examples/live-demos/inline/index.js +++ b/modules/ROOT/examples/live-demos/inline/index.js @@ -2,8 +2,6 @@ const emailHeaderConfig = { selector: '.tinymce-heading', menubar: false, inline: true, - toolbar_sticky: true, - toolbar_sticky_offset: 110, plugins: [ 'lists', 'powerpaste', @@ -22,8 +20,6 @@ const emailBodyConfig = { selector: '.tinymce-body', menubar: false, inline: true, - toolbar_sticky: true, - toolbar_sticky_offset: 110, plugins: [ 'link', 'lists', 'powerpaste', 'autolink', 'tinymcespellchecker' From 43c733ff2265e6477b02cbea3f6f4f9e8c611a72 Mon Sep 17 00:00:00 2001 From: Farzad Hayat Date: Wed, 3 Jul 2024 15:29:44 +1000 Subject: [PATCH 44/97] DOC-2465: TinyMCE 7.2.1 Release Documentation (#3367) * DOC-2465: TinyMCE 7.2.1 Release Documentation * DOC-2466: TinyMCE 7.2.1 Release notes & community changelog (#3368) * DOC-2466: TinyMCE 7.2.1 Release notes & community changelog * DOC-2466: Add TINY-10127 release note entry (#3372) * DOC-2466: update changelog.adoc for TinyMCE 7.2.1. * DOC-2466: `Open Link` button was disabled when selection partially covered a link or when multiple links were selected. (#3379) * DOC-2466: Open Link button was disabled when selection partially covered a link or when multiple links were selected. * Update modules/ROOT/pages/7.2.1-release-notes.adoc Co-authored-by: Mitchell Crompton --------- Co-authored-by: Mitchell Crompton * DOC-2466: Long translations of the bottom help text would cause minor graphical issues. (#3376) * DOC-2466: Long translations of the bottom help text would cause minor graphical issues. * Update modules/ROOT/pages/7.2.1-release-notes.adoc Co-authored-by: Farzad Hayat --------- Co-authored-by: Farzad Hayat * DOC-2466: Text content could move unexpectedly when deleting a paragraph. (#3375) * Update modules/ROOT/pages/changelog.adoc --------- Co-authored-by: Karl Kemister-Sheppard Co-authored-by: Mitchell Crompton --------- Co-authored-by: Karl Kemister-Sheppard Co-authored-by: Mitchell Crompton --- modules/ROOT/nav.adoc | 3 + modules/ROOT/pages/7.2.1-release-notes.adoc | 84 +++++++++++++++++++++ modules/ROOT/pages/changelog.adoc | 12 +++ modules/ROOT/pages/release-notes.adoc | 6 ++ 4 files changed, 105 insertions(+) create mode 100644 modules/ROOT/pages/7.2.1-release-notes.adoc diff --git a/modules/ROOT/nav.adoc b/modules/ROOT/nav.adoc index 32abc03ae4..461d4b0802 100644 --- a/modules/ROOT/nav.adoc +++ b/modules/ROOT/nav.adoc @@ -405,6 +405,9 @@ ** xref:tinymce-and-cors.adoc[Cross-Origin Resource Sharing (CORS)] * Release information ** xref:release-notes.adoc[Release notes for {productname} {productmajorversion}] +*** {productname} 7.2.1 +**** xref:7.2.1-release-notes.adoc#overview[Overview] +**** xref:7.2.1-release-notes.adoc#bug-fixes[Bug fixes] *** {productname} 7.2 **** xref:7.2-release-notes.adoc#overview[Overview] **** xref:7.2-release-notes.adoc#accompanying-premium-self-hosted-server-side-component-changes[Accompanying Premium self-hosted server-side component changes] diff --git a/modules/ROOT/pages/7.2.1-release-notes.adoc b/modules/ROOT/pages/7.2.1-release-notes.adoc new file mode 100644 index 0000000000..da60dc9cc3 --- /dev/null +++ b/modules/ROOT/pages/7.2.1-release-notes.adoc @@ -0,0 +1,84 @@ += {productname} {release-version} +:release-version: 7.2.1 +:navtitle: {productname} {release-version} +:description: Release notes for {productname} {release-version} +:keywords: releasenotes, new, changes, bugfixes +:page-toclevels: 1 + +include::partial$misc/admon-releasenotes-for-stable.adoc[] + + +[[overview]] +== Overview + +{productname} {release-version} was released for {enterpriseversion} and {cloudname} on Wednesday, July 3^rd^, 2024. These release notes provide an overview of the changes for {productname} {release-version}, including: + +* xref:bug-fixes[Bug fixes] + + +[[bug-fixes]] +== Bug fixes + +{productname} {release-version} also includes the following bug fixes: + +=== Text content could move unexpectedly when deleting a paragraph. +// #TINY-10590 + +Previously, pressing backspace within specific block elements could cause the HTML structure to change unexpectedly. This issue arose because pressing the backspace key would merge content before and after a tag boundary, leading to unintended restructuring of elements within a `+
+`. + +.Example of Original Content Structure +[source, html] +---- +
Hi ,

Thank you for contacting support.
+

Pasted text.

+

Best regards.
+
Bli ,

Thank you for contacting support.
+

Pasted text.

+

Best regards.
+---- + +after pressing backspace, the content was merged into a single `+
+`, which resulted in a disrupted layout and structure such as the below. + +.Example of Unintended Merged Content Structure After Pressing Backspace +[source, html] +---- +
+

Pasted text.Hi ,

Thank you for contacting support.

+

Best regards.
+
Bli ,

Thank you for contacting support.
+

Pasted text.

+

Best regards.
+---- + +As a consequence, the content before the `+

+` tag was merged into the `+

+` tag. + +In {productname} {release-version}, this issue has been addressed by preventing the merging of content across tag boundaries, ensuring the intended HTML structure is maintained. In addition to this change, adjustments were made to handle line breaks more effectively. + +As a result, pressing backspace no longer reduces the number of `+
+` tags before `+

+` tag, such as "Best regards," preserving the original HTML layout. + +=== Long translations of the bottom help text would cause minor graphical issues. +// #TINY-10961 + +Previously, resizing the editor caused the statusbar to render the help text incorrectly if it was too long. This was particularly problematic for long translations, as the statusbar did not handle extended text properly, leading to visual misalignment and hiding important elements. + +To fix this, the statusbar's CSS was updated to handle this by retaining the help text on one line and hiding any overflowing text. + +As a result, the help text now overflows without disrupting the statusbar layout, ensuring a consistent appearance and visibility. + +=== Open Link button was disabled when selection partially covered a link or when multiple links were selected. +// #TINY-11009 + +Previously, the “Open link” toolbar button and menu item were disabled when a link was partially selected or when the selection included multiple links. + +{productname} {release-version} addresses this issue. Now, the "Open link" toolbar button and menu item are enabled when any part of a link or multiple links are within the selection. + +=== Cursor would shift to the start of the editor body when focus was shifted to a noneditable cell of a table. +// #TINY-10127 + +Previously in {productname}, when the editor did not have focus and a non-editable cell of a table was clicked, the selection was set to the non-editable cell of the table instead of the offscreen element. + +As a consequence, placing the selection on the non-editable cell caused the cursor to be incorrectly placed in the editor body and unexpectedly scroll to the top of the editor. + +In {productname} {release-version}, the selection handling logic has been updated. Now, the selection is maintained on the offscreen div when necessary to prevent the selection from being changed. + +As a result, the selection correctly shifts to the offscreen element when required, maintaining the cursor position and no longer causing the editor to scroll unexpectedly. \ No newline at end of file diff --git a/modules/ROOT/pages/changelog.adoc b/modules/ROOT/pages/changelog.adoc index de7a933656..04c217617a 100644 --- a/modules/ROOT/pages/changelog.adoc +++ b/modules/ROOT/pages/changelog.adoc @@ -4,6 +4,18 @@ NOTE: This is the {productname} Community version changelog. For information about the latest {cloudname} or {enterpriseversion} Release, see: xref:release-notes.adoc[{productname} Release Notes]. +== 7.2.1 - 2024-07-03 + +=== Fixed +* Text content could move unexpectedly when deleting a paragraph. +// #TINY-10590 +* Cursor would shift to the start of the editor body when focus was shifted to a noneditable cell of a table. +// #TINY-10127 +* Long translations of the bottom help text would cause minor graphical issues. +// #TINY-10961 +* Open Link button was disabled when selection partially covered a link or when multiple links were selected. +// #TINY-11009 + == 7.2.0 - 2024-06-19 === Added diff --git a/modules/ROOT/pages/release-notes.adoc b/modules/ROOT/pages/release-notes.adoc index fbbe602fb7..6cc767b351 100644 --- a/modules/ROOT/pages/release-notes.adoc +++ b/modules/ROOT/pages/release-notes.adoc @@ -9,6 +9,12 @@ This section lists the releases for {productname} 7 and the changes made in each [cols="1,1"] |=== +a| +[.lead] +xref:7.2.1-release-notes.adoc#overview[{productname} 7.2.1] + +Release notes for {productname} 7.2.1 + a| [.lead] xref:7.2-release-notes.adoc#overview[{productname} 7.2] From ea3c113d7e5fc38c4452628cd1947e1933f7ba59 Mon Sep 17 00:00:00 2001 From: Karl Kemister-Sheppard Date: Wed, 3 Jul 2024 15:38:05 +1000 Subject: [PATCH 45/97] DOC-2467: api-version bump for TinyMCE 7.2.1. (#3382) --- .api-version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.api-version b/.api-version index 4b49d9bb63..468c41f93c 100644 --- a/.api-version +++ b/.api-version @@ -1 +1 @@ -7.2.0 \ No newline at end of file +7.2.1 \ No newline at end of file From b5c00141e44e4b6e9b320216d80a522372f8a07c Mon Sep 17 00:00:00 2001 From: Farzad Hayat Date: Fri, 5 Jul 2024 11:17:02 +1000 Subject: [PATCH 46/97] DOC-2477: Update OpenAI Proxy Token (#3384) --- antora.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/antora.yml b/antora.yml index 01f14f3473..78dcaf5b4e 100644 --- a/antora.yml +++ b/antora.yml @@ -15,7 +15,7 @@ asciidoc: webcomponent_url: https://cdn.jsdelivr.net/npm/@tinymce/tinymce-webcomponent@2/dist/tinymce-webcomponent.min.js jquery_url: https://cdn.jsdelivr.net/npm/@tinymce/tinymce-jquery@2/dist/tinymce-jquery.min.js openai_proxy_url: https://openai.ai-demo-proxy.tiny.cloud/v1/chat/completions - openai_proxy_token: eyJhbGciOiJFUzM4NCJ9.eyJhdWQiOlsiaHR0cHM6Ly9vcGVuYWkuYWktZGVtby1wcm94eS50aW55LmNsb3VkLyJdLCJleHAiOjE3MTk3NTYwMDAsImh0dHBzOi8vb3BlbmFpLmFpLWRlbW8tcHJveHkudGlueS5jbG91ZC9yb2xlIjoicHVibGljLWRlbW8iLCJpc3MiOiJodHRwczovL2FpLWRlbW8tcHJveHkudGlueS5jbG91ZC8iLCJqdGkiOiJlYWU5MjBhMy05ZGQ0LTRkZjUtYTM4Yy04ODY5ZTJkZGIwYTQiLCJzdWIiOiJhaS1hc3Npc3RhbnQtZGVtbyJ9.hX44J5hPOCLOidK8mBAcnlAVh-ae4nVTq3W92xRLuGiF_4mGZWn1W3Ihgd7unlffz7GDayGxD_3hoQx8f64bTJg5hyHjwjKH1AZj1EKRal-NCNbqmoUa0TOm6_VXpRl2 + openai_proxy_token: eyJhbGciOiJFUzM4NCJ9.eyJhdWQiOlsiaHR0cHM6Ly9vcGVuYWkuYWktZGVtby1wcm94eS50aW55LmNsb3VkLyJdLCJleHAiOjE3MzMwMTEyMDAsImh0dHBzOi8vb3BlbmFpLmFpLWRlbW8tcHJveHkudGlueS5jbG91ZC9yb2xlIjoicHVibGljLWRlbW8iLCJpc3MiOiJodHRwczovL2FpLWRlbW8tcHJveHkudGlueS5jbG91ZC8iLCJqdGkiOiIyMmM0MjBkNy1hNjVmLTQ3NDQtODEwZS1jZWY3ZDY2ODQ1ZGYiLCJzdWIiOiJhaS1hc3Npc3RhbnQtZGVtbyJ9.H0MgAgu6EUFLO2zx6fnsnmCMw_0MWtc3Ne4ue6N_CFAowPkIjBqr022ypJqj5i3FMJNad5cWYj84jKKfPHTUaFN5RNurl09K2SDnY2OqNnhcXOT9rl3owhrGxgODOR9G default_meta_keywords: tinymce, documentation, docs, plugins, customizable skins, configuration, examples, html, php, java, javascript, image editor, inline editor, distraction-free editor, classic editor, wysiwyg # product docker variables dockerimageimportfromwordexporttoword: registry.containers.tiny.cloud/docx-converter-tiny From 1f46d5b5f124658279eb2dc078f1686ccefd7527 Mon Sep 17 00:00:00 2001 From: Farzad Hayat Date: Fri, 5 Jul 2024 15:32:39 +1000 Subject: [PATCH 47/97] DOC-2469: Windows Repo Folder Compatibility and Template Updates (#3373) * DOC-2469: Replace <> in file names with {} * DOCS-2469: Clean up and improve templates * Update {productminorversion} in antora.yml and its template version * Fix the correct instance of supported-versions.adoc * Update -new-material-templates/release-notes-template/ROOT/partials/misc/supported-versions.adoc Co-authored-by: Karl Kemister-Sheppard * DOC-2469: Delete template files for antora.yml and supported-versions.adoc --------- Co-authored-by: Karl Kemister-Sheppard --- ...ce-behavior-filtering-or-formatting}.adoc} | 0 ...tion>.adoc => {configuration_option}.adoc} | 0 .../index.html | 0 .../index.js | 0 ... => ie-{hyphen-delimited-descriptor}.adoc} | 0 .../live-demos/full-featured/index.html | 3 +- .../live-demos/full-featured/index.js | 2 +- .../{ => {plugincode}}/example.js | 2 +- .../{ => {plugincode}}/index.html | 0 .../{ => {plugincode}}/index.js | 0 .../ROOT/nav.adoc | 15 ++-- .../ROOT/pages/available-menu-items.adoc | 13 +-- .../ROOT/pages/available-toolbar-buttons.adoc | 13 +-- .../pages/editor-command-identifiers.adoc | 12 ++- .../ROOT/pages/events.adoc | 10 +-- .../ROOT/pages/pluginpage.adoc | 24 ++---- .../partials/commands/-cmds.adoc | 62 -------------- .../partials/commands/{plugincode}-cmds.adoc | 33 ++++++++ .../partials/configuration/icon_list.adoc | 7 +- ...tion>.adoc => {configuration_option}.adoc} | 20 +---- ...>-events.adoc => {plugincode}-events.adoc} | 6 +- .../index-pages/opensource-plugins.adoc | 6 +- .../partials/index-pages/premium-plugins.adoc | 6 +- .../-menu-items.adoc | 10 --- .../{plugincode}-menu-items.adoc | 7 ++ ...code>-apis.adoc => {plugincode}-apis.adoc} | 17 +--- .../-toolbar-buttons.adoc | 11 --- .../{plugincode}-toolbar-buttons.adoc | 7 ++ .../release-notes-template/ROOT/nav.adoc | 6 +- .../ROOT/pages/release-notes.adoc | 15 +--- ...otes.adoc => {x.y[.z]}-release-notes.adoc} | 41 ++++----- .../partials/misc/supported-versions.adoc | 32 ------- .../release-notes-template/antora.yml | 83 ------------------- antora.yml | 2 +- modules/ROOT/pages/release-notes.adoc | 12 +-- 35 files changed, 118 insertions(+), 359 deletions(-) rename -new-material-templates/configuration-options-templates/ROOT/pages/{content..adoc => content.{appearance-behavior-filtering-or-formatting}.adoc} (100%) rename -new-material-templates/configuration-options-templates/ROOT/partials/configuration/{.adoc => {configuration_option}.adoc} (100%) rename -new-material-templates/integration-example-(ie)-templates/ROOT/examples/live-demos/{ie- => ie-{hyphen-delimited-descriptor}}/index.html (100%) rename -new-material-templates/integration-example-(ie)-templates/ROOT/examples/live-demos/{ie- => ie-{hyphen-delimited-descriptor}}/index.js (100%) rename -new-material-templates/integration-example-(ie)-templates/ROOT/pages/{ie-.adoc => ie-{hyphen-delimited-descriptor}.adoc} (100%) rename -new-material-templates/plugin-documentation-templates/ROOT/examples/live-demos/{ => {plugincode}}/example.js (91%) rename -new-material-templates/plugin-documentation-templates/ROOT/examples/live-demos/{ => {plugincode}}/index.html (100%) rename -new-material-templates/plugin-documentation-templates/ROOT/examples/live-demos/{ => {plugincode}}/index.js (100%) delete mode 100644 -new-material-templates/plugin-documentation-templates/ROOT/partials/commands/-cmds.adoc create mode 100644 -new-material-templates/plugin-documentation-templates/ROOT/partials/commands/{plugincode}-cmds.adoc rename -new-material-templates/plugin-documentation-templates/ROOT/partials/configuration/{.adoc => {configuration_option}.adoc} (66%) rename -new-material-templates/plugin-documentation-templates/ROOT/partials/events/{-events.adoc => {plugincode}-events.adoc} (90%) delete mode 100644 -new-material-templates/plugin-documentation-templates/ROOT/partials/menu-item-ids/-menu-items.adoc create mode 100644 -new-material-templates/plugin-documentation-templates/ROOT/partials/menu-item-ids/{plugincode}-menu-items.adoc rename -new-material-templates/plugin-documentation-templates/ROOT/partials/plugin-apis/{-apis.adoc => {plugincode}-apis.adoc} (58%) delete mode 100644 -new-material-templates/plugin-documentation-templates/ROOT/partials/toolbar-button-ids/-toolbar-buttons.adoc create mode 100644 -new-material-templates/plugin-documentation-templates/ROOT/partials/toolbar-button-ids/{plugincode}-toolbar-buttons.adoc rename -new-material-templates/release-notes-template/ROOT/pages/{-release-notes.adoc => {x.y[.z]}-release-notes.adoc} (72%) delete mode 100644 -new-material-templates/release-notes-template/ROOT/partials/misc/supported-versions.adoc delete mode 100644 -new-material-templates/release-notes-template/antora.yml diff --git a/-new-material-templates/configuration-options-templates/ROOT/pages/content..adoc b/-new-material-templates/configuration-options-templates/ROOT/pages/content.{appearance-behavior-filtering-or-formatting}.adoc similarity index 100% rename from -new-material-templates/configuration-options-templates/ROOT/pages/content..adoc rename to -new-material-templates/configuration-options-templates/ROOT/pages/content.{appearance-behavior-filtering-or-formatting}.adoc diff --git a/-new-material-templates/configuration-options-templates/ROOT/partials/configuration/.adoc b/-new-material-templates/configuration-options-templates/ROOT/partials/configuration/{configuration_option}.adoc similarity index 100% rename from -new-material-templates/configuration-options-templates/ROOT/partials/configuration/.adoc rename to -new-material-templates/configuration-options-templates/ROOT/partials/configuration/{configuration_option}.adoc diff --git a/-new-material-templates/integration-example-(ie)-templates/ROOT/examples/live-demos/ie-/index.html b/-new-material-templates/integration-example-(ie)-templates/ROOT/examples/live-demos/ie-{hyphen-delimited-descriptor}/index.html similarity index 100% rename from -new-material-templates/integration-example-(ie)-templates/ROOT/examples/live-demos/ie-/index.html rename to -new-material-templates/integration-example-(ie)-templates/ROOT/examples/live-demos/ie-{hyphen-delimited-descriptor}/index.html diff --git a/-new-material-templates/integration-example-(ie)-templates/ROOT/examples/live-demos/ie-/index.js b/-new-material-templates/integration-example-(ie)-templates/ROOT/examples/live-demos/ie-{hyphen-delimited-descriptor}/index.js similarity index 100% rename from -new-material-templates/integration-example-(ie)-templates/ROOT/examples/live-demos/ie-/index.js rename to -new-material-templates/integration-example-(ie)-templates/ROOT/examples/live-demos/ie-{hyphen-delimited-descriptor}/index.js diff --git a/-new-material-templates/integration-example-(ie)-templates/ROOT/pages/ie-.adoc b/-new-material-templates/integration-example-(ie)-templates/ROOT/pages/ie-{hyphen-delimited-descriptor}.adoc similarity index 100% rename from -new-material-templates/integration-example-(ie)-templates/ROOT/pages/ie-.adoc rename to -new-material-templates/integration-example-(ie)-templates/ROOT/pages/ie-{hyphen-delimited-descriptor}.adoc diff --git a/-new-material-templates/plugin-documentation-templates/ROOT/examples/live-demos/full-featured/index.html b/-new-material-templates/plugin-documentation-templates/ROOT/examples/live-demos/full-featured/index.html index 4896337a72..18c2f7c5fb 100644 --- a/-new-material-templates/plugin-documentation-templates/ROOT/examples/live-demos/full-featured/index.html +++ b/-new-material-templates/plugin-documentation-templates/ROOT/examples/live-demos/full-featured/index.html @@ -1,6 +1,5 @@ \ No newline at end of file diff --git a/-new-material-templates/plugin-documentation-templates/ROOT/examples/live-demos/full-featured/index.js b/-new-material-templates/plugin-documentation-templates/ROOT/examples/live-demos/full-featured/index.js index 962b99b07b..27f5ea1887 100644 --- a/-new-material-templates/plugin-documentation-templates/ROOT/examples/live-demos/full-featured/index.js +++ b/-new-material-templates/plugin-documentation-templates/ROOT/examples/live-demos/full-featured/index.js @@ -1,6 +1,6 @@ /* -Add new plugin to this file’s extant configuration +Update tinymce-docs/modules/ROOT/examples/live-demos/full-featured/index.js to include the new plugin. */ diff --git a/-new-material-templates/plugin-documentation-templates/ROOT/examples/live-demos//example.js b/-new-material-templates/plugin-documentation-templates/ROOT/examples/live-demos/{plugincode}/example.js similarity index 91% rename from -new-material-templates/plugin-documentation-templates/ROOT/examples/live-demos//example.js rename to -new-material-templates/plugin-documentation-templates/ROOT/examples/live-demos/{plugincode}/example.js index 30d2613ffa..6b8e2b18e0 100644 --- a/-new-material-templates/plugin-documentation-templates/ROOT/examples/live-demos//example.js +++ b/-new-material-templates/plugin-documentation-templates/ROOT/examples/live-demos/{plugincode}/example.js @@ -23,7 +23,7 @@ NB: there is one UX consequence of setting up demos to work in these cases. The *Edit on CodePen* tab does not — and cannot — present in the documentation. -The initial setup of these ‘inclues-an-emulated-back-end’ examples +The initial setup of these ‘includes-an-emulated-back-end’ examples will almost certainly include significant initial input from the plugin’s developer. diff --git a/-new-material-templates/plugin-documentation-templates/ROOT/examples/live-demos//index.html b/-new-material-templates/plugin-documentation-templates/ROOT/examples/live-demos/{plugincode}/index.html similarity index 100% rename from -new-material-templates/plugin-documentation-templates/ROOT/examples/live-demos//index.html rename to -new-material-templates/plugin-documentation-templates/ROOT/examples/live-demos/{plugincode}/index.html diff --git a/-new-material-templates/plugin-documentation-templates/ROOT/examples/live-demos//index.js b/-new-material-templates/plugin-documentation-templates/ROOT/examples/live-demos/{plugincode}/index.js similarity index 100% rename from -new-material-templates/plugin-documentation-templates/ROOT/examples/live-demos//index.js rename to -new-material-templates/plugin-documentation-templates/ROOT/examples/live-demos/{plugincode}/index.js diff --git a/-new-material-templates/plugin-documentation-templates/ROOT/nav.adoc b/-new-material-templates/plugin-documentation-templates/ROOT/nav.adoc index a91d9c153d..a36b79c6e7 100644 --- a/-new-material-templates/plugin-documentation-templates/ROOT/nav.adoc +++ b/-new-material-templates/plugin-documentation-templates/ROOT/nav.adoc @@ -1,13 +1,8 @@ * xref:plugins.adoc[Plugins] ** Premium plugins -// If the new plugin is a Premium plugin -// Replace the boilerplate below with the file-name of the new Premium plugin. -// Also, place this new Premium plugin into alphabetical place within the Premium plugin sub-section. -*** xref:.adoc[] -** Open source plugins -// If the new plugin is an open source plugin -// Replace the boilerplate below with the file-name of the new open source plugin. -// Also, place this new open source plugin into alphabetical place within the open source plugin sub-section. -*** xref:.adoc[] +// If Premium plugin, place the following entry into Premium plugins list in alphabetical order by plugin name. +*** xref:.adoc[] -// This file is instructional and is never included in the published name-space. +** Open source plugins +// If Open source plugin, place the following entry into Open source plugins list in alphabetical order by plugin name. +*** xref:.adoc[] diff --git a/-new-material-templates/plugin-documentation-templates/ROOT/pages/available-menu-items.adoc b/-new-material-templates/plugin-documentation-templates/ROOT/pages/available-menu-items.adoc index b25859f6a6..79b053e32e 100644 --- a/-new-material-templates/plugin-documentation-templates/ROOT/pages/available-menu-items.adoc +++ b/-new-material-templates/plugin-documentation-templates/ROOT/pages/available-menu-items.adoc @@ -1,13 +1,6 @@ -// 0. Set :plugincategory: to appropriate value -// 1. premium; or -// 2. opensource. -// Note neither value is capitalised. -// Note the second value has no space between the two words. -// 1. Replace instances with appropriate material. -// 2. Add the edited material to -// /tinymce-docs/modules/ROOT/pages/available-menu-items.adoc -// in alphabetical order by . (*not* ). -// 3. Do not bring these comments over with the edited material. +// Add the edited material to +// tinymce-docs/modules/ROOT/pages/available-menu-items.adoc +// in alphabetical order by . (*not* ). :plugincategory: :pluginname: diff --git a/-new-material-templates/plugin-documentation-templates/ROOT/pages/available-toolbar-buttons.adoc b/-new-material-templates/plugin-documentation-templates/ROOT/pages/available-toolbar-buttons.adoc index 564aeb501e..f4864cd218 100644 --- a/-new-material-templates/plugin-documentation-templates/ROOT/pages/available-toolbar-buttons.adoc +++ b/-new-material-templates/plugin-documentation-templates/ROOT/pages/available-toolbar-buttons.adoc @@ -1,13 +1,6 @@ -// 0. Set :plugincategory: to appropriate value -// 1. premium; or -// 2. opensource. -// Note neither value is capitalised. -// Note the second value has no space between the two words. -// 1. Replace instances with appropriate material. -// 2. Add the edited material to -// /tinymce-docs/modules/ROOT/pages/available-toolbar-buttons.adoc -// in alphabetical order by . (*not* ). -// 3. Do not bring these comments over with the edited material. +// Add the edited material to +// tinymce-docs/modules/ROOT/pages/available-toolbar-buttons.adoc +// in alphabetical order by . (*not* ). :plugincategory: :pluginname: diff --git a/-new-material-templates/plugin-documentation-templates/ROOT/pages/editor-command-identifiers.adoc b/-new-material-templates/plugin-documentation-templates/ROOT/pages/editor-command-identifiers.adoc index cbc92854c5..dd4ba23052 100644 --- a/-new-material-templates/plugin-documentation-templates/ROOT/pages/editor-command-identifiers.adoc +++ b/-new-material-templates/plugin-documentation-templates/ROOT/pages/editor-command-identifiers.adoc @@ -1,16 +1,14 @@ -// 0. Replace instances with appropriate material. -// 1. Add the edited material to -// /tinymce-docs/modules/ROOT/pages/editor-command-identifiers.adoc -// in alphabetical order by . (*not* ). -// 2. Do not bring these comments over with the edited material. +// Add the edited material to +// tinymce-docs/modules/ROOT/pages/editor-command-identifiers.adoc +// in alphabetical order by . (*not* ). -// add an xref in alphabetical order to the summary list that is below the following lines: +// add an xref in alphabetical order by to the summary list that is below the following lines: // [[plugin-commands]] // === Plugin Commands * xref:[] -// add the include in alphabetical order to the body of the "Plugin Commands" section +// add the include in alphabetical order by to the body of the "Plugin Commands" section [[]] ==== diff --git a/-new-material-templates/plugin-documentation-templates/ROOT/pages/events.adoc b/-new-material-templates/plugin-documentation-templates/ROOT/pages/events.adoc index b71e0f83d6..8898c1f2f8 100644 --- a/-new-material-templates/plugin-documentation-templates/ROOT/pages/events.adoc +++ b/-new-material-templates/plugin-documentation-templates/ROOT/pages/events.adoc @@ -1,15 +1,13 @@ -// 0. Replace instances with appropriate material. -// 1. Add the edited material to -// /tinymce-docs/modules/ROOT/pages/events.adoc -// in alphabetical order by . (*not* ). -// 2. Do not bring these comments over with the edited material. +// Add the edited material to +// tinymce-docs/modules/ROOT/pages/events.adoc +// in alphabetical order by . (*not* ). // add the xref in alphabetical order to the summary list that is below the following line: // == Plugin events * xref:-events[ events] -// add the include in alphabetical order to the body of the "Plugin events" section +// add the include in alphabetical order by to the body of the "Plugin events" section [[-events]] === events diff --git a/-new-material-templates/plugin-documentation-templates/ROOT/pages/pluginpage.adoc b/-new-material-templates/plugin-documentation-templates/ROOT/pages/pluginpage.adoc index 7ecc5c616f..398444a855 100644 --- a/-new-material-templates/plugin-documentation-templates/ROOT/pages/pluginpage.adoc +++ b/-new-material-templates/plugin-documentation-templates/ROOT/pages/pluginpage.adoc @@ -1,6 +1,3 @@ -// Replace instances with material then remove this, and other comments. - -// : the product name. Reference on this page with the {pluginname} variable. = plugin :navtitle: :description: . @@ -11,25 +8,22 @@ // opensource plugin = tieroneplan // premium plugin = tiertwoplan or tierthreeplan or enterpriseplan :pluginminimumplan: -// : adds the plugin to an editor configuration. -// Reference on this page with the {plugincode} variable :plugincode: -:plugincategory: premium|opensource +:plugincategory: // Remove the line below (and this comment) for open source plugins include::partial$misc/admon-premium-plugin.adoc[] -// Edit the line below to add the correct requires- file from `/partials/misc`. +// Edit the line below to add the correct requires- file from `tinymce-docs/modules/ROOT/partials/misc`. include::partial$misc/admon-requires-v.adoc // Add an introduction. What does the plugin do? Why would I use this plugin? Keep it concise. == Interactive example -// No Lorem Ipsum. Add test material, or, at least, a description of how end-users use the feature. liveDemo::{plugincode}[] -// Logic for customising what presents from this included file relies on +// Logic for customizing what presents from this included file relies on // the :pluginminimumplan: attribute value above. // // 2023-09-06 addendum: the logic in purchase-premium-plugins.adoc needs @@ -49,9 +43,9 @@ For example: ---- tinymce.init({ selector: 'textarea', // change this value according to your HTML - plugins: '{{plugincode}}', + plugins: '', toolbar: '', - an_essential_option: false + : false }); ---- @@ -65,9 +59,7 @@ The following configuration options affect the behavior of the {pluginname} plug // The template file for each such file is // -new-material-templates/partials/commands/.adoc // Add one include:: statement for each added file as per the example immediately below. -include::partial$configuration/.adoc[][leveloffset=+1] - - +include::partial$configuration/.adoc[leveloffset=+1] // If the plugin offers toolbar buttons // 1. Add an entry to /pages/available-toolbar-buttons.adoc @@ -131,6 +123,4 @@ include::partial$events/{plugincode}-events.adoc[] The {pluginname} plugin provides the following APIs. -include::partial$plugin-apis/{plugincode}-apis.adoc[] - -// Remove all comment lines and comment blocks before publishing. +include::partial$plugin-apis/{plugincode}-apis.adoc[] \ No newline at end of file diff --git a/-new-material-templates/plugin-documentation-templates/ROOT/partials/commands/-cmds.adoc b/-new-material-templates/plugin-documentation-templates/ROOT/partials/commands/-cmds.adoc deleted file mode 100644 index 33fcc82704..0000000000 --- a/-new-material-templates/plugin-documentation-templates/ROOT/partials/commands/-cmds.adoc +++ /dev/null @@ -1,62 +0,0 @@ -[cols="1,3",options="header"] -|=== -|Command |Description - -|mceCommandOne |Description one. -// Boilerplate for commands that require further documentation -|mceCommandTwo |Description two. For details, see xref:using-mcecommandtwo[Using `+mcecommandtwo+`]. -|mceCommandThree |Description three. -|mceCommandFour |Description four. -|mceCommandFive |Description five. -|mceCommandSix |Description six. -// Boilerplate for commands that require further documentation -|mceCommandSeven |Description seven. For details, see xref:using-mcecommandseven[Using `+mcecommandtwo+`]. -|mceCommandEn |Description en. -|=== - -.Examples -[source,js] ----- -tinymce.activeEditor.execCommand('mceCommandOne'); -tinymce.activeEditor.execCommand('mceCommandTwo', true|false, { : '', : '', : '', : '' }); -tinymce.activeEditor.execCommand('mceCommandThree'); -tinymce.activeEditor.execCommand('mceCommandFour'); -tinymce.activeEditor.execCommand('mceCommandFive'); -tinymce.activeEditor.execCommand('mceCommandSix'); -tinymce.activeEditor.execCommand('mceCommandSeven', true|false, { : '' }); ----- - -// Boilerplate for further documentation of commands that require it. -[[using-mcecommmandtwo]] -== Using `+mcecommandtwo+` - -`+mceCommandTwo+` accepts an object with the following key-value pairs: - -[cols="1,,1,2",options="header"] -|=== -|Name |Value |Requirement |Description - -| |`+'this'+` or `+'that'+` | [Rr]equired |Key-value description one. -| |`+number+` | [Rr]equired |Key-value description two. -| |`+'other'+`, `+'thing'+`, `+'doohickie'+`, or `+'widget'+` | [Rr]equired |Key-value description three. -| |`+'word'+` or `+'notword'+` | [Rr]equired |Key-value description four. -|=== - -// Further notes as required. Delete this comment once notes are added or if they are not required. - -// Boilerplate for further documentation of commands that require it. -[[using-mcetabletoggleseries]] -== Using `+mceTableToggleSeries+` - -`+mceCommandSeven+` accepts an object with the following key-value pair: - -[cols="1,1,1,2",options="header"] -|=== -|Name |Value |Requirement |Description - -| |`+string+` | [Rr]equired |Key-value description five. -|=== - -// Further notes as required. Delete this comment once notes are added or if they are not required. - -// Remove all comment lines and comment blocks before publishing. diff --git a/-new-material-templates/plugin-documentation-templates/ROOT/partials/commands/{plugincode}-cmds.adoc b/-new-material-templates/plugin-documentation-templates/ROOT/partials/commands/{plugincode}-cmds.adoc new file mode 100644 index 0000000000..9d61f6860b --- /dev/null +++ b/-new-material-templates/plugin-documentation-templates/ROOT/partials/commands/{plugincode}-cmds.adoc @@ -0,0 +1,33 @@ +[cols="1,3",options="header"] +|=== +|Command |Description + +| | +// Boilerplate for commands that require further documentation +| |Description two. For details, see xref:using-[Using `++`]. +|=== + +.Examples +[source,js] +---- +tinymce.activeEditor.execCommand(''); +tinymce.activeEditor.execCommand('', , { : '', : '' }); +---- + +// Boilerplate for further documentation of commands that require it. +[[using-]] +== Using `++` + +`++` accepts an object with the following key-value pairs: + +[cols="1,,1,2",options="header"] +|=== +|Name |Value |Requirement |Description + +| |`+''+` or `+''+` |equired | +| |`++` |equired | +|=== + +// Further notes as required. Delete this comment once notes are added or if they are not required. + +// Remove all comment lines and comment blocks before publishing. diff --git a/-new-material-templates/plugin-documentation-templates/ROOT/partials/configuration/icon_list.adoc b/-new-material-templates/plugin-documentation-templates/ROOT/partials/configuration/icon_list.adoc index 692ae906f5..531b26502b 100644 --- a/-new-material-templates/plugin-documentation-templates/ROOT/partials/configuration/icon_list.adoc +++ b/-new-material-templates/plugin-documentation-templates/ROOT/partials/configuration/icon_list.adoc @@ -1,7 +1,6 @@ -// 0. Replace instances with appropriate material. -// 1. Add the edited material to -// /tinymce-docs/modules/ROOT/partials/configuration/icon_list.adoc +// 1. Replace instances with appropriate material. +// 2. Add the edited material to +// tinymce-docs/modules/ROOT/partials/configuration/icon_list.adoc // in alphabetical order by . (*not* ). -// 2. Do not bring these comments over with the edited material. | `++` | image:icons/.svg[.svg] | `+.svg+` diff --git a/-new-material-templates/plugin-documentation-templates/ROOT/partials/configuration/.adoc b/-new-material-templates/plugin-documentation-templates/ROOT/partials/configuration/{configuration_option}.adoc similarity index 66% rename from -new-material-templates/plugin-documentation-templates/ROOT/partials/configuration/.adoc rename to -new-material-templates/plugin-documentation-templates/ROOT/partials/configuration/{configuration_option}.adoc index 05bc7e93ea..391b450c3b 100644 --- a/-new-material-templates/plugin-documentation-templates/ROOT/partials/configuration/.adoc +++ b/-new-material-templates/plugin-documentation-templates/ROOT/partials/configuration/{configuration_option}.adoc @@ -1,12 +1,6 @@ [[]] == `` -// Replace all instances of with the -// configuration option name then remove this comment. - -// Add explanatory material as per the comment block below then remove -// the block and this comment. - //// What does the option do? Why use it? @@ -32,7 +26,7 @@ Are there risks? [source,js] ---- tinymce.init({ - selector: 'textarea', // change this value according to your html + selector: 'textarea', // Change this value according to your HTML : '' }); ---- @@ -46,24 +40,18 @@ To disable , set `` to `false`. [source,js] ---- tinymce.init({ - selector: 'textarea', // change this value according to your HTML + selector: 'textarea', // Change this value according to your HTML : 'false' }); ---- // Remove if not applicable. -// Edit the sub-head to singular or plural as required. -=== Limitation(s) of the `` option +=== Limitation of the `` option The `` option has the following limitations. -// Add explanatory material as per the comment block below then remove -// the block and this comment. - //// Known limitations. Complicated scenarios. Anything that warrants a CAUTION or WARNING admonition. -//// - -// Remove all comment lines and comment blocks before publishing. +//// \ No newline at end of file diff --git a/-new-material-templates/plugin-documentation-templates/ROOT/partials/events/-events.adoc b/-new-material-templates/plugin-documentation-templates/ROOT/partials/events/{plugincode}-events.adoc similarity index 90% rename from -new-material-templates/plugin-documentation-templates/ROOT/partials/events/-events.adoc rename to -new-material-templates/plugin-documentation-templates/ROOT/partials/events/{plugincode}-events.adoc index 245d8f32a5..2ac4644b64 100644 --- a/-new-material-templates/plugin-documentation-templates/ROOT/partials/events/-events.adoc +++ b/-new-material-templates/plugin-documentation-templates/ROOT/partials/events/{plugincode}-events.adoc @@ -3,8 +3,6 @@ The following events are provided by the xref:.adoc[ pl [cols="1,1,2",options="header"] |=== |Name |Data |Description - -// Five boilerplate rows. |EventOne |`+{ : }+` |Fired when event one description. |EventTwo |`+{ : , : }+` |Fired when event two description. |EventThree |N/A |Fired when event three description. @@ -16,6 +14,4 @@ The following events are provided by the xref:.adoc[ pl include::partial$misc/admon-requires-v.adoc[] |EventFour |`+{ : }+` |Fired when the event seven description. |EventEn |`+{ : , : }+` |Fired when event en description. -|=== - -// Remove all comment lines and comment blocks before publishing. +|=== \ No newline at end of file diff --git a/-new-material-templates/plugin-documentation-templates/ROOT/partials/index-pages/opensource-plugins.adoc b/-new-material-templates/plugin-documentation-templates/ROOT/partials/index-pages/opensource-plugins.adoc index ee3711a78f..92e47189f3 100644 --- a/-new-material-templates/plugin-documentation-templates/ROOT/partials/index-pages/opensource-plugins.adoc +++ b/-new-material-templates/plugin-documentation-templates/ROOT/partials/index-pages/opensource-plugins.adoc @@ -1,10 +1,8 @@ // Table row for an open-source plugin. -// Place this row into the extant table in `partials/index-pages/opensource-plugins.adoc` in alphabetical order. +// Place this row into the existing table in `partials/index-pages/opensource-plugins.adoc` in alphabetical order by . a| [.lead] xref:.adoc[] - - -// This file is instructional and is never included in the published name-space. + \ No newline at end of file diff --git a/-new-material-templates/plugin-documentation-templates/ROOT/partials/index-pages/premium-plugins.adoc b/-new-material-templates/plugin-documentation-templates/ROOT/partials/index-pages/premium-plugins.adoc index 472431f303..d8905d4459 100644 --- a/-new-material-templates/plugin-documentation-templates/ROOT/partials/index-pages/premium-plugins.adoc +++ b/-new-material-templates/plugin-documentation-templates/ROOT/partials/index-pages/premium-plugins.adoc @@ -1,10 +1,8 @@ // Table row for a Premium plugin. -// Place this row into the extant table in `partials/index-pages/premium-plugins.adoc` in alphabetical order. +// Place this row into the existing table in `partials/index-pages/premium-plugins.adoc` in alphabetical order by . a| [.lead] xref:.adoc[] - - -// This file is instructional and is never included in the published name-space. + \ No newline at end of file diff --git a/-new-material-templates/plugin-documentation-templates/ROOT/partials/menu-item-ids/-menu-items.adoc b/-new-material-templates/plugin-documentation-templates/ROOT/partials/menu-item-ids/-menu-items.adoc deleted file mode 100644 index c6cc961a91..0000000000 --- a/-new-material-templates/plugin-documentation-templates/ROOT/partials/menu-item-ids/-menu-items.adoc +++ /dev/null @@ -1,10 +0,0 @@ -[cols="1,1,2",options="header"] -|=== -|Menu item identifier |xref:menus-configuration-options.adoc#example-the-tinymce-default-menu-items[Default Menu Location] |Description - -|`+menu-identifier-1+` |

|Description one. -|`+menu-identifier-2+` | |Description two. -|`+menu-identifier-n+` | |Description en. -|=== - -// Remove all comment lines and comment blocks before publishing. diff --git a/-new-material-templates/plugin-documentation-templates/ROOT/partials/menu-item-ids/{plugincode}-menu-items.adoc b/-new-material-templates/plugin-documentation-templates/ROOT/partials/menu-item-ids/{plugincode}-menu-items.adoc new file mode 100644 index 0000000000..f7bc1b666e --- /dev/null +++ b/-new-material-templates/plugin-documentation-templates/ROOT/partials/menu-item-ids/{plugincode}-menu-items.adoc @@ -0,0 +1,7 @@ +[cols="1,1,2",options="header"] +|=== +|Menu item identifier |xref:menus-configuration-options.adoc#example-the-tinymce-default-menu-items[Default Menu Location] |Description + +|`+menu-item-id-1+` | | +|`+menu-item-id-2+` | | +|=== \ No newline at end of file diff --git a/-new-material-templates/plugin-documentation-templates/ROOT/partials/plugin-apis/-apis.adoc b/-new-material-templates/plugin-documentation-templates/ROOT/partials/plugin-apis/{plugincode}-apis.adoc similarity index 58% rename from -new-material-templates/plugin-documentation-templates/ROOT/partials/plugin-apis/-apis.adoc rename to -new-material-templates/plugin-documentation-templates/ROOT/partials/plugin-apis/{plugincode}-apis.adoc index 29c7a14c12..6ed4b64b52 100644 --- a/-new-material-templates/plugin-documentation-templates/ROOT/partials/plugin-apis/-apis.adoc +++ b/-new-material-templates/plugin-documentation-templates/ROOT/partials/plugin-apis/{plugincode}-apis.adoc @@ -2,18 +2,14 @@ |=== |Name |Arguments |Description -// Four boilerplate rows. | | | -| | | -| | | // Markup to add a ‘requires this version of TinyMCE’ admonition into its own row // immediately above the event requiring such a notice. // If not needed, remove the markup and this comment. // If needed, edit the file-name and remove this comment. 3+| include::partial$misc/admon-requires-v.adoc[] -| | | -| | | +| | | |=== .Examples @@ -24,15 +20,4 @@ tinymce.activeEditor.plugins..(); // what this example does tinymce.activeEditor.plugins..(); - -// what this example does -tinymce.activeEditor.plugins..(); - -// what this example does -tinymce.activeEditor.plugins..(); - -// what this example does -tinymce.activeEditor.plugins..(); ---- - -// Remove all comment lines and comment blocks before publishing. diff --git a/-new-material-templates/plugin-documentation-templates/ROOT/partials/toolbar-button-ids/-toolbar-buttons.adoc b/-new-material-templates/plugin-documentation-templates/ROOT/partials/toolbar-button-ids/-toolbar-buttons.adoc deleted file mode 100644 index 8d7d27663a..0000000000 --- a/-new-material-templates/plugin-documentation-templates/ROOT/partials/toolbar-button-ids/-toolbar-buttons.adoc +++ /dev/null @@ -1,11 +0,0 @@ -[cols="1,3",options="header"] -|=== -|Toolbar button identifier |Description - -|`+ai-button-1+` |Description one. -|`+ai-button-2+` |Description two. -|`+ai-button-3+` |Description three. -|`+ai-button-n+` |Description en. -|=== - -// Remove all comment lines and comment blocks before publishing. diff --git a/-new-material-templates/plugin-documentation-templates/ROOT/partials/toolbar-button-ids/{plugincode}-toolbar-buttons.adoc b/-new-material-templates/plugin-documentation-templates/ROOT/partials/toolbar-button-ids/{plugincode}-toolbar-buttons.adoc new file mode 100644 index 0000000000..3a8f5f30be --- /dev/null +++ b/-new-material-templates/plugin-documentation-templates/ROOT/partials/toolbar-button-ids/{plugincode}-toolbar-buttons.adoc @@ -0,0 +1,7 @@ +[cols="1,3",options="header"] +|=== +|Toolbar button identifier |Description + +|`+toolbar-button-id-1+` | +|`+toolbar-button-id-2+` | +|=== \ No newline at end of file diff --git a/-new-material-templates/release-notes-template/ROOT/nav.adoc b/-new-material-templates/release-notes-template/ROOT/nav.adoc index c04931033b..839dc79e6d 100644 --- a/-new-material-templates/release-notes-template/ROOT/nav.adoc +++ b/-new-material-templates/release-notes-template/ROOT/nav.adoc @@ -1,4 +1,4 @@ -// The following two lines are already extant in `nav.adoc` and are here as a guidepost. +// The following two lines already exist in `nav.adoc` and are here as a guidepost. // The new navigation material is added immediately below these lines. * Release information ** xref:release-notes.adoc[Release notes for {productname} {productmajorversion}] @@ -18,6 +18,4 @@ **** xref:-release-notes.adoc#bug-fixes[Bug fixes] **** xref:-release-notes.adoc#security-fixes[Security fixes] **** xref:-release-notes.adoc#deprecated[Deprecated] -**** xref:-release-notes.adoc#known-issues[Known issues] - -// This file is instructional and is never included in the published name-space. +**** xref:-release-notes.adoc#known-issues[Known issues] \ No newline at end of file diff --git a/-new-material-templates/release-notes-template/ROOT/pages/release-notes.adoc b/-new-material-templates/release-notes-template/ROOT/pages/release-notes.adoc index 969edeb032..0b66f575d4 100644 --- a/-new-material-templates/release-notes-template/ROOT/pages/release-notes.adoc +++ b/-new-material-templates/release-notes-template/ROOT/pages/release-notes.adoc @@ -5,17 +5,4 @@ xref:-release-notes.adoc#overview[{productname} ] Release notes for {productname} -//rest of extant table here - -// Dummy table cell. -// 1. When the number of cells in the table is odd: -// * remove the inline comment markup pre-pending this -// element. -// -// 2. When the number of cells in the table is even: -// * prepend the inline comment markup to this -// element. -//a| - -|=== - +// Remember to uncomment the dummy cell when the number of cells in the table is odd to ensure the table renders correctly. diff --git a/-new-material-templates/release-notes-template/ROOT/pages/-release-notes.adoc b/-new-material-templates/release-notes-template/ROOT/pages/{x.y[.z]}-release-notes.adoc similarity index 72% rename from -new-material-templates/release-notes-template/ROOT/pages/-release-notes.adoc rename to -new-material-templates/release-notes-template/ROOT/pages/{x.y[.z]}-release-notes.adoc index aac899c021..fd60f60040 100644 --- a/-new-material-templates/release-notes-template/ROOT/pages/-release-notes.adoc +++ b/-new-material-templates/release-notes-template/ROOT/pages/{x.y[.z]}-release-notes.adoc @@ -1,15 +1,17 @@ -= TinyMCE -:navtitle: TinyMCE -:description: Release notes for TinyMCE += {productname} {release-version} +:release-version: +:navtitle: {productname} {release-version} +:description: Release notes for {productname} {release-version} :keywords: releasenotes, new, changes, bugfixes :page-toclevels: 1 include::partial$misc/admon-releasenotes-for-stable.adoc[] + [[overview]] == Overview -{productname} was released for {enterpriseversion} and {cloudname} on ,
^^, . These release notes provide an overview of the changes for {productname} , including: +{productname} {release-version} was released for {enterpriseversion} and {cloudname} on ,
^^, . These release notes provide an overview of the changes for {productname} {release-version}, including: // Remove sections and section boilerplates as necessary. // Pluralise as necessary or remove the placeholder plural marker. @@ -31,7 +33,7 @@ include::partial$misc/admon-releasenotes-for-stable.adoc[] [[new-premium-plugin]] New Premium plugin -The following new Premium plugin was released alongside {productname} . +The following new Premium plugin was released alongside {productname} {release-version}. === @@ -43,7 +45,7 @@ For information on the **** plugin, see xref:.a [[new-open-source-plugin]] == New Open Source plugin -The following new Open Source plugin was released alongside {productname} . +The following new Open Source plugin was released alongside {productname} {release-version}. === @@ -51,14 +53,15 @@ The new open source plugin, **** // description here. For information on the **** plugin, see xref:.adoc[]. + [[accompanying-premium-plugin-changes]] == Accompanying Premium plugin changes -The following premium plugin updates were released alongside {productname} . +The following premium plugin updates were released alongside {productname} {release-version}. === -The {productname} release includes an accompanying release of the **** premium plugin. +The {productname} {release-version} release includes an accompanying release of the **** premium plugin. **** includes the following . @@ -92,13 +95,13 @@ The following open source plugin has been announced as reaching its end-of-life: [[accompanying-enhanced-skins-and-icon-packs-changes]] == Accompanying Enhanced Skins & Icon Packs changes -The {productname} release includes an accompanying release of the **Enhanced Skins & Icon Packs**. +The {productname} {release-version} release includes an accompanying release of the **Enhanced Skins & Icon Packs**. === Enhanced Skins & Icon Packs The **Enhanced Skins & Icon Packs** release includes the following updates: -The **Enhanced Skins & Icon Packs** were rebuilt to pull in the changes also incorporated into the default {productname} skin, Oxide. +The **Enhanced Skins & Icon Packs** were rebuilt to pull in the changes also incorporated into the default {productname} {release-version} skin, Oxide. For information on using Enhanced Skins & Icon Packs, see: xref:enhanced-skins-and-icon-packs.adoc[Enhanced Skins & Icon Packs]. @@ -106,7 +109,7 @@ For information on using Enhanced Skins & Icon Packs, see: xref:enhanced-skins-a [[improvements]] == Improvements -{productname} also includes the following improvement: +{productname} {release-version} also includes the following improvement: === // #TINY-vwxyz1 @@ -117,7 +120,7 @@ For information on using Enhanced Skins & Icon Packs, see: xref:enhanced-skins-a [[additions]] == Additions -{productname} also includes the following addition: +{productname} {release-version} also includes the following addition: === // #TINY-vwxyz1 @@ -128,7 +131,7 @@ For information on using Enhanced Skins & Icon Packs, see: xref:enhanced-skins-a [[changes]] == Changes -{productname} also includes the following change: +{productname} {release-version} also includes the following change: === // #TINY-vwxyz1 @@ -139,7 +142,7 @@ For information on using Enhanced Skins & Icon Packs, see: xref:enhanced-skins-a [[removed]] == Removed -{productname} also includes the following removal: +{productname} {release-version} also includes the following removal: === // #TINY-vwxyz1 @@ -150,7 +153,7 @@ For information on using Enhanced Skins & Icon Packs, see: xref:enhanced-skins-a [[bug-fixes]] == Bug fixes -{productname} also includes the following bug fix: +{productname} {release-version} also includes the following bug fix: === // #TINY-vwxyz1 @@ -161,7 +164,7 @@ For information on using Enhanced Skins & Icon Packs, see: xref:enhanced-skins-a [[security-fixes]] == Security fixes -{productname} includes : +{productname} {release-version} includes : === // #TINY-vwxyz1 @@ -172,7 +175,7 @@ For information on using Enhanced Skins & Icon Packs, see: xref:enhanced-skins-a [[deprecated]] == Deprecated -{productname} includes the following deprecation: +{productname} {release-version} includes the following deprecation: === The `` configuration property, ``, has been deprecated @@ -182,9 +185,9 @@ For information on using Enhanced Skins & Icon Packs, see: xref:enhanced-skins-a [[known-issues]] == Known issues -This section describes issues that users of {productname} may encounter and possible workarounds for these issues. +This section describes issues that users of {productname} {release-version} may encounter and possible workarounds for these issues. -There known issue in {productname} . +There known issue in {productname} {release-version}. === // #TINY-vwxyz1 diff --git a/-new-material-templates/release-notes-template/ROOT/partials/misc/supported-versions.adoc b/-new-material-templates/release-notes-template/ROOT/partials/misc/supported-versions.adoc deleted file mode 100644 index cce8334762..0000000000 --- a/-new-material-templates/release-notes-template/ROOT/partials/misc/supported-versions.adoc +++ /dev/null @@ -1,32 +0,0 @@ -[[supported-tinymce-versions]] -== Supported {productname} versions - -Supported versions of {productname}: - -[cols="^,^,^",options="header"] -|=== -|Version |Release Date |End of Support -// add new row with version, release date, and end-of-support date. -// use the internal spreadsheet to calculate the end-of-support date from the release date. -|6.6 |2023-07-19 |2025-01-19 -|6.5 |2023-06-21 |2024-12-21 -|6.4 |2023-03-29 |2024-09-29 -|6.3 |2022-12-08 |2024-06-08 -|6.2 |2022-09-26 |2024-03-26 -|6.1 |2022-07-13 |2024-01-13 -|6.0 |2022-04-07 |2023-10-07 -|=== - - - - - -To view our Software License Agreements, visit: - -* link:{legalpages}/cloud-use-subscription-agreement/[The {cloudname} Services Subscription Agreement]. -* link:{legalpages}/tiny-self-hosted-enterprise-agreement/[The {companyname} Self-Hosted Software License Agreement - (Enterprise Users)]. -* link:{legalpages}/tiny-self-hosted-oem-saas-agreement/[The {companyname} Self-Hosted Software License Agreement - (OEM & SaaS Users)]. - -Support for Partner Plugins is provided by Partner companies and is not the responsibility of {companynameformal}. For information on Partner Plugins, see: link:{companyurl}/partners/[https://www.tiny.cloud/partners/]. - -// This file is instructional and is never included in the published name-space. diff --git a/-new-material-templates/release-notes-template/antora.yml b/-new-material-templates/release-notes-template/antora.yml deleted file mode 100644 index f382848b8e..0000000000 --- a/-new-material-templates/release-notes-template/antora.yml +++ /dev/null @@ -1,83 +0,0 @@ -name: tinymce -title: TinyMCE Documentation -# update the version value if required. Almost certainly *not* required. -version: '6' -asciidoc: - attributes: - # anchor configuration (the @ allows it to be overridden if required) - idprefix: '@' - idseparator: '-@' - # generic variables - companyurl: https://www.tiny.cloud - cdnurl: https://cdn.tiny.cloud/1/no-api-key/tinymce/7/tinymce.min.js - tdcdnurl: https://cdn.tiny.cloud/1/_your_api_key_/tinydrive/7/tinydrive.min.js - tinymce_live_demo_url: https://cdn.tiny.cloud/1/qagffr3pkuv17a8on1afax661irst1hbr4e6tbv888sz91jc/tinymce/7/tinymce.min.js - tinydrive_live_demo_url: https://cdn.tiny.cloud/1/qagffr3pkuv17a8on1afax661irst1hbr4e6tbv888sz91jc/tinydrive/7/tinydrive.min.js - webcomponent_url: https://cdn.jsdelivr.net/npm/@tinymce/tinymce-webcomponent@2/dist/tinymce-webcomponent.min.js - jquery_url: https://cdn.jsdelivr.net/npm/@tinymce/tinymce-jquery@2/dist/tinymce-jquery.min.js - default_meta_keywords: tinymce, documentation, docs, plugins, customizable skins, configuration, examples, html, php, java, javascript, image editor, inline editor, distraction-free editor, classic editor, wysiwyg - # product variables - productname: TinyMCE - productmajorversion: 6 - # update the productminorversion value if required. Likely required. - # Note: this value is not changed for .z updates. - # For example, an update from 6.6.0 to 6.6.1 does not require a change to this variable’s value. - productminorversion: '6.6' - ##### product name in codeblock - prodnamecode: tinymce - #### more names - companyname: Tiny - companynameformal: Tiny Technologies, Inc. - cloudname: Tiny Cloud - cloudfilemanager: Tiny Drive - enterpriseversion: TinyMCE Enterprise - communityname: TinyMCE Community - accountpage: Tiny Account - supportname: Tiny Support - betaprogram: Tiny Insights Program - #### some plugin names - prem_skins_icons: Enhanced Skins & Icon Packs - #### Plan names - tieroneplan: Tiny Cloud Core Plan - tiertwoplan: Tiny Cloud Essential Plan - tierthreeplan: Tiny Cloud Professional Plan - enterpriseplan: Tiny Custom Plans - ## common tiny.cloud URLs - supporturl: https://support.tiny.cloud - plugindirectory: https://www.tiny.cloud/tinymce/features/ - gettiny: https://www.tiny.cloud/get-tiny - blogurl: https://www.tiny.cloud/blog - download-community: https://www.tiny.cloud/get-tiny/self-hosted/ - download-enterprise: https://www.tiny.cloud/my-account/downloads/ - accountpageurl: https://www.tiny.cloud/my-account - accountkeyurl: https://www.tiny.cloud/my-account/key-manager/ - accountjwturl: https://www.tiny.cloud/my-account/jwt/ - accountsignup: https://www.tiny.cloud/auth/signup - pricingpage: https://www.tiny.cloud/pricing - contactpage: https://www.tiny.cloud/contact - legalpages: https://www.tiny.cloud/legal - communitysupporturl: https://stackoverflow.com/questions/tagged/tinymce - betaprogramurl: https://www.tiny.cloud/insights-program/ - # plugin-specific tiny.cloud URLs - aipricingurl: https://www.tiny.cloud/tinymce/features/ai-integration/ - revisionhistorypricingurl: https://www.tiny.cloud/tinymce/features/revision-history/ - importwordpricingurl: https://www.tiny.cloud/tinymce/features/import-from-word/ - exportwordpricingurl: https://www.tiny.cloud/tinymce/features/export-word/ - exportpdfpricingurl: https://www.tiny.cloud/tinymce/features/export-pdf/ - # HTML entities - tick: '✔' - cross: '✖' - tab: '  ' - newline: '
' - virt_ellps: '⋮' - ellps: '…' - # Demo logos - logofordemos: 'https://www.tiny.cloud/docs/images/logos/android-chrome-256x256.png' - logofordemoshtml: '

TinyMCE Logo

' - logofordemoshtmlright: '

TinyMCE Logo

' - -nav: -- modules/ROOT/nav.adoc -- modules/ROOT/moxiedoc_nav.adoc - -# This file is instructional and is never included in the published name-space. diff --git a/antora.yml b/antora.yml index 78dcaf5b4e..a2461636df 100644 --- a/antora.yml +++ b/antora.yml @@ -26,7 +26,7 @@ asciidoc: # product variables productname: TinyMCE productmajorversion: 7 - productminorversion: '7.0' + productminorversion: '7.2' ##### product name in codeblock prodnamecode: tinymce #### more names diff --git a/modules/ROOT/pages/release-notes.adoc b/modules/ROOT/pages/release-notes.adoc index 6cc767b351..6a63389db0 100644 --- a/modules/ROOT/pages/release-notes.adoc +++ b/modules/ROOT/pages/release-notes.adoc @@ -21,7 +21,6 @@ xref:7.2-release-notes.adoc#overview[{productname} 7.2] Release notes for {productname} 7.2 - a| [.lead] xref:7.1.2-release-notes.adoc#overview[{productname} 7.1.2] @@ -52,14 +51,7 @@ xref:7.0-release-notes.adoc#overview[{productname} 7.0] Release notes for {productname} 7.0 -// Dummy table cell. -// 1. When the number of cells in the table is odd: -// * remove the inline comment markup pre-pending this -// element. -// -// 2. When the number of cells in the table is even: -// * prepend the inline comment markup to this -// element. -a| +// Uncomment this dummy cell when the number of cells above is odd to ensure the table renders correctly. +// a| |=== From f02bea009a0b88609939b27ed5bccb7d547a9f6f Mon Sep 17 00:00:00 2001 From: Farzad Hayat Date: Tue, 9 Jul 2024 11:36:23 +1000 Subject: [PATCH 48/97] DOC-2469: Fix release-notes.adoc table (#3387) --- modules/ROOT/pages/release-notes.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ROOT/pages/release-notes.adoc b/modules/ROOT/pages/release-notes.adoc index 6a63389db0..2993513b92 100644 --- a/modules/ROOT/pages/release-notes.adoc +++ b/modules/ROOT/pages/release-notes.adoc @@ -52,6 +52,6 @@ xref:7.0-release-notes.adoc#overview[{productname} 7.0] Release notes for {productname} 7.0 // Uncomment this dummy cell when the number of cells above is odd to ensure the table renders correctly. -// a| +a| |=== From 540d13b19859a901568b1b6bf26beb2f1898d254 Mon Sep 17 00:00:00 2001 From: Farzad Hayat Date: Tue, 16 Jul 2024 16:49:39 +1000 Subject: [PATCH 49/97] DOC-2486: Add requires 7.1v admon to Revision History Diff API (#3391) --- modules/ROOT/partials/plugin-apis/revisionhistory-apis.adoc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/modules/ROOT/partials/plugin-apis/revisionhistory-apis.adoc b/modules/ROOT/partials/plugin-apis/revisionhistory-apis.adoc index 0d4d2fb468..155cb23d1a 100644 --- a/modules/ROOT/partials/plugin-apis/revisionhistory-apis.adoc +++ b/modules/ROOT/partials/plugin-apis/revisionhistory-apis.adoc @@ -9,6 +9,8 @@ interface PluginAPI { === `diff` Returns a HTML string with annotations indicating the changes in `originalHTML` relative to `changedHTML`. The styling of annotations can be customized via xref:revisionhistory_diff_classes[`+revisionhistory_diff_classes+`] option. +include::partial$misc/admon-requires-7.1v.adoc[] + == Example [source,js] ---- From 1cd8f718a8b16be86f72106b3e5188f87848b946 Mon Sep 17 00:00:00 2001 From: Farzad Hayat Date: Wed, 17 Jul 2024 11:16:22 +1000 Subject: [PATCH 50/97] DOC-2480: Update `svelte-quick-start.adoc` to use Vite v5 (#3388) * DOC-2480: Update svelte-quick-start.adoc to use Vite v5 * DOC-2480: Improve wording on the "replace src/App.svelte contents" step --- .../integrations/svelte-quick-start.adoc | 130 +++++++++++------- 1 file changed, 81 insertions(+), 49 deletions(-) diff --git a/modules/ROOT/partials/integrations/svelte-quick-start.adoc b/modules/ROOT/partials/integrations/svelte-quick-start.adoc index 8bb82caf85..057ef53980 100644 --- a/modules/ROOT/partials/integrations/svelte-quick-start.adoc +++ b/modules/ROOT/partials/integrations/svelte-quick-start.adoc @@ -1,4 +1,4 @@ -The https://github.com/tinymce/tinymce-svelte[Official {productname} Svelte component] integrates {productname} into https://svelte.dev/[Svelte applications]. This procedure creates a basic Svelte application using the https://github.com/sveltejs/template[`+sveltejs/template+` project] adds a {productname} editor based using the {productname} Svelte integration. +The https://github.com/tinymce/tinymce-svelte[Official {productname} Svelte component] integrates {productname} into https://svelte.dev/[Svelte applications]. This procedure creates a basic Svelte application containing a {productname} editor. For examples of the {productname} integration, visit https://tinymce.github.io/tinymce-svelte/[the tinymce-svelte storybook]. @@ -8,21 +8,26 @@ This procedure requires https://nodejs.org/[Node.js (and npm)]. == Procedure -. Create a Svelte application using the https://github.com/sveltejs/template[Svelte template project], for example: +. Use the https://github.com/vitejs/vite[Vite] package to create a new Svelte project named `+tinymce-svelte-demo+`, such as: + [source,sh] ---- -npx degit sveltejs/template my-tiny-app -cd my-tiny-app +npm create vite@5 tinymce-svelte-demo -- --template svelte +---- +. Change to the newly created directory. ++ +[source,sh] +---- +cd tinymce-svelte-demo ---- ifeval::["{productSource}" == "package-manager"] . Install the `+tinymce+` and the `+tinymce-svelte+` editor component, such as: + -[source,sh] +[source,sh,subs="attributes+"] ---- -npm install tinymce @tinymce/tinymce-svelte +npm install tinymce@^{productmajorversion} @tinymce/tinymce-svelte ---- endif::[] @@ -38,23 +43,33 @@ npm install @tinymce/tinymce-svelte endif::[] ifeval::["{productSource}" == "cloud"] -. Open `+src/App.svelte+` and add: -* An `+import+` statement for the {productname} component. -* The `++` as a placeholder for the editor. +. Open `+src/App.svelte+` and replace the contents with: + -For example: -+ -_File:_ `+src/App.svelte+` -+ -[source,html] +[source,html,subs="+macros"] ---- -

Hello Tiny

---- @@ -62,50 +77,59 @@ import Editor from '@tinymce/tinymce-svelte'; endif::[] ifeval::["{productSource}" == "package-manager"] -. Install the `+rollup-plugin-copy+` development dependency, such as: +. Install the `+vite-plugin-static-copy+` development dependency, such as: + [source,sh] ---- -npm install rollup-plugin-copy -D +npm install -D vite-plugin-static-copy ---- -. Open `+rollup.config.js+` and configure the rollup copy plugin `+rollup-plugin-copy+` to copy {productname} to the `+public/+` directory, such as: +. Open `+vite.config.js+` and configure the `+vite-plugin-static-copy+` plugin to copy {productname} to the `+public/+` directory, such as: + [source,js] ---- -/* Existing import statements */ -import copy from 'rollup-plugin-copy' +import { defineConfig } from 'vite' +import { svelte } from '@sveltejs/vite-plugin-svelte' +import { viteStaticCopy } from 'vite-plugin-static-copy' -/* Skip to the export statement, `plugins` item and add `copy`*/ -export default { - /* Existing key: values... */ +// https://vitejs.dev/config/ +export default defineConfig({ plugins: [ - copy({ + viteStaticCopy({ targets: [ - { src: 'node_modules/tinymce/*', dest: 'public/tinymce' } + { src: 'node_modules/tinymce/*', dest: 'tinymce' } ] }), - /* More existing configuration... */ - ] -} + svelte() + ], +}) ---- -. Open `+src/App.svelte+` and add: -* An `+import+` statement for the {productname} component. -* The `++` as a placeholder for the editor. -* The xref:svelte-ref.adoc#scriptsrc[`+scriptSrc+`] property for the `+Editor+` placeholder. -+ -For example: -+ -_File:_ `+src/App.svelte+` +. Open `+src/App.svelte+` and replace the contents with: + [source,html] ---- -

Hello Tiny

---- @@ -113,24 +137,33 @@ import Editor from '@tinymce/tinymce-svelte'; endif::[] ifeval::["{productSource}" == "zip"] -. Open `+src/App.svelte+` and add: -* An `+import+` statement for the {productname} component. -* The `++` as a placeholder for the editor. -* The xref:svelte-ref.adoc#scriptsrc[`+scriptSrc+`] property for the `+Editor+` placeholder. -+ -For example: -+ -_File:_ `+src/App.svelte+` +. Open `+src/App.svelte+` and replace the contents with: + [source,html] ---- -

Hello Tiny

---- @@ -145,7 +178,6 @@ endif::[] npm run dev ---- + -This will start a local development server, accessible at http://localhost:8080. * To stop the development server, select on the command line or command prompt and press _Ctrl+C_. == Next Steps From 9a194909d99ec4b6d15bffbc2475c09f7e4ba223 Mon Sep 17 00:00:00 2001 From: Karl Kemister-Sheppard Date: Thu, 18 Jul 2024 11:14:19 +1000 Subject: [PATCH 51/97] DOC-2489: update code block for importword basic-setup. (#3396) --- modules/ROOT/pages/importword.adoc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/ROOT/pages/importword.adoc b/modules/ROOT/pages/importword.adoc index 3c1f74bc95..40ba64686a 100644 --- a/modules/ROOT/pages/importword.adoc +++ b/modules/ROOT/pages/importword.adoc @@ -33,8 +33,8 @@ For example: ---- tinymce.init({ selector: 'textarea', - plugins: 'code importword', - toolbar: 'importword code', + plugins: 'importword', + toolbar: 'importword', importword_service_url: '' }); ---- From b8071aaa407bb6d55086cca73aa61b368aa0289c Mon Sep 17 00:00:00 2001 From: Farzad Hayat Date: Thu, 18 Jul 2024 12:18:44 +1000 Subject: [PATCH 52/97] DOC-2487: Replace 'en' with 'en_US' in Spellchecker docs and demo (#3392) --- modules/ROOT/examples/live-demos/spellchecker/index.js | 2 +- modules/ROOT/pages/introduction-to-tiny-spellchecker.adoc | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/ROOT/examples/live-demos/spellchecker/index.js b/modules/ROOT/examples/live-demos/spellchecker/index.js index 6ccd6f0d1c..617b1a579d 100644 --- a/modules/ROOT/examples/live-demos/spellchecker/index.js +++ b/modules/ROOT/examples/live-demos/spellchecker/index.js @@ -3,7 +3,7 @@ tinymce.init({ plugins: 'code tinymcespellchecker link', toolbar: 'spellchecker language spellcheckdialog', height: 500, - spellchecker_language: 'en', + spellchecker_language: 'en_US', content_langs: [ { title: 'Afrikaans (South Africa)', code: 'af_ZA', customCode: 'af_ZA' }, { title: 'English (Australia)', code: 'en_AU' }, diff --git a/modules/ROOT/pages/introduction-to-tiny-spellchecker.adoc b/modules/ROOT/pages/introduction-to-tiny-spellchecker.adoc index 78c36aafe7..5d9cfa5fd6 100644 --- a/modules/ROOT/pages/introduction-to-tiny-spellchecker.adoc +++ b/modules/ROOT/pages/introduction-to-tiny-spellchecker.adoc @@ -29,7 +29,7 @@ With {cloudname} the server-side spellchecking component is automatically config tinymce.init({ selector: 'textarea', plugins: 'tinymcespellchecker', - spellchecker_language: 'en' + spellchecker_language: 'en_US' }); ---- @@ -47,7 +47,7 @@ tinymce.init({ selector: 'textarea', plugins: 'tinymcespellchecker', spellchecker_rpc_url: 'localhost/ephox-spelling', - spellchecker_language: 'en' + spellchecker_language: 'en_US' }); ---- From fa1d22a4c0ce9304c5743fe9f9b468a7cc1151e2 Mon Sep 17 00:00:00 2001 From: Karl Kemister-Sheppard Date: Fri, 19 Jul 2024 13:52:02 +1000 Subject: [PATCH 53/97] DOC-2488: Remove reference of `Cloud Service` from various plugin pages. (#3397) * DOC-2488: Remove reference of Cloud Service from various plugin pages. * DOC-2488: remove mention of option from importword_service_url. * Update modules/ROOT/pages/exportpdf.adoc Co-authored-by: shirqa <43625458+ShiridiGandham@users.noreply.github.com> * Update modules/ROOT/pages/exportword.adoc Co-authored-by: shirqa <43625458+ShiridiGandham@users.noreply.github.com> * Update modules/ROOT/partials/configuration/exportpdf.adoc Co-authored-by: shirqa <43625458+ShiridiGandham@users.noreply.github.com> * Update modules/ROOT/partials/configuration/exportword.adoc Co-authored-by: shirqa <43625458+ShiridiGandham@users.noreply.github.com> * DOC-2488: update description for IFW ETW and ETPDF regarding self-hosting. * Update modules/ROOT/partials/configuration/importword.adoc * Update modules/ROOT/partials/configuration/exportword.adoc * Update modules/ROOT/partials/configuration/exportpdf.adoc --------- Co-authored-by: shirqa <43625458+ShiridiGandham@users.noreply.github.com> --- modules/ROOT/pages/exportpdf.adoc | 2 +- modules/ROOT/pages/exportword.adoc | 2 +- .../partials/configuration/exportpdf.adoc | 7 ++++-- .../partials/configuration/exportword.adoc | 7 ++++-- .../partials/configuration/importword.adoc | 23 +++++++++++-------- 5 files changed, 26 insertions(+), 15 deletions(-) diff --git a/modules/ROOT/pages/exportpdf.adoc b/modules/ROOT/pages/exportpdf.adoc index c01dad352a..392a31a7de 100644 --- a/modules/ROOT/pages/exportpdf.adoc +++ b/modules/ROOT/pages/exportpdf.adoc @@ -12,7 +12,7 @@ include::partial$misc/admon-export-pdf-paid-addon-pricing.adoc[] include::partial$misc/admon-requires-7.0v.adoc[] -The {pluginname} functionality gathers the HTML produced using the `editor.getcontent()` method and the default editor content styles, along with the styles specified in the configuration options for the plugin. This data is transmitted to the {productname} Cloud Services HTML to PDF converter service. The service processes this information to create a PDF file, which is then sent back to the user's browser for saving to their local disk. +The {pluginname} functionality gathers the HTML produced using the `editor.getcontent()` method and the default editor content styles, along with the styles specified in the configuration options for the plugin. This data is transmitted to the HTML to PDF converter service. The service processes this information to create a PDF file, which is then sent back to the user's browser for saving to their local disk. == Interactive example diff --git a/modules/ROOT/pages/exportword.adoc b/modules/ROOT/pages/exportword.adoc index d8de057d31..56ab5cbe9a 100644 --- a/modules/ROOT/pages/exportword.adoc +++ b/modules/ROOT/pages/exportword.adoc @@ -11,7 +11,7 @@ include::partial$misc/admon-export-word-paid-addon-pricing.adoc[] include::partial$misc/admon-requires-7.0v.adoc[] -The export to Microsoft Word feature collects the HTML generated with the `tinymce.editor.getContent()` method and combines it with the default editor content styles along with the styles provided in the configuration. The combined content and styles are then transmitted to the {productname} Cloud Services HTML to DOCX converter service. Following this, the service generates a Word file, which is subsequently returned to the user’s browser, enabling them to save it in the Word format onto their disk. +The export to Microsoft Word feature collects the HTML generated with the `tinymce.editor.getContent()` method and combines it with the default editor content styles along with the styles provided in the configuration. The combined content and styles are then transmitted to the HTML to DOCX converter service. Following this, the service generates a Word file, which is subsequently returned to the user’s browser, enabling them to save it in the Word format onto their disk. == Interactive example diff --git a/modules/ROOT/partials/configuration/exportpdf.adoc b/modules/ROOT/partials/configuration/exportpdf.adoc index 981c7e1198..51183cb930 100644 --- a/modules/ROOT/partials/configuration/exportpdf.adoc +++ b/modules/ROOT/partials/configuration/exportpdf.adoc @@ -1,9 +1,12 @@ [[exportpdf-service-url]] == `exportpdf_service_url` -The {pluginname} uses the {productname} Cloud Services HTML to PDF converter service to generate the `document-name.pdf` files. +The {pluginname} uses the HTML to PDF converter service to generate the `document-name.pdf` files. -NOTE: The {pluginname} feature is currently only available `on-premise` and requires the `exportpdf_service_url` option to be configured. https://www.tiny.cloud/contact/[Contact us] if you require this feature. +The {pluginname} feature is currently only available exclusively for `on-premise` setups, requiring a self-hosted HTML to PDF converter service and the `exportpdf_service_url` option to be properly configured. If you require access to this feature, please link:https://www.tiny.cloud/contact/[contact us]. Refer to our xref:individual-export-to-pdf-on-premises.adoc[on-premises documentation] for detailed instructions on deploying the {pluginname} service server-side component using Docker. + +[TIP] +Update the `exportpdf_service_url` configuration in your {productname} setup to point to your host. For instance, if your host is `mycustomhost.com`, the URL will be `https://mycustomhost.com/v1/convert`. *Type:* `+String+` diff --git a/modules/ROOT/partials/configuration/exportword.adoc b/modules/ROOT/partials/configuration/exportword.adoc index 23a6163a7f..04f2efeb1d 100644 --- a/modules/ROOT/partials/configuration/exportword.adoc +++ b/modules/ROOT/partials/configuration/exportword.adoc @@ -1,9 +1,12 @@ [[exportword-service-url]] == `exportword_service_url` -The {pluginname} uses the {productname} Cloud Services HTML to DOCX converter service to generate the Word files. +The {pluginname} uses the HTML to DOCX converter service to generate the Word files. -NOTE: The {pluginname} feature is currently only available `on-premise` and requires the `exportword_service_url` option to be configured. https://www.tiny.cloud/contact/[Contact us] if you require this feature. +The {pluginname} feature is currently only available exclusively for `on-premise` setups, requiring a self-hosted HTML to DOCX converter service and the `exportword_service_url` option to be properly configured. If you require access to this feature, please link:https://www.tiny.cloud/contact/[contact us]. Refer to our xref:individual-import-from-word-and-export-to-word-on-premises.adoc[on-premises documentation] for detailed instructions on deploying the {pluginname} service server-side component using Docker. + +[TIP] +Update the `exportword_service_url` configuration in your {productname} setup to point to your host. For instance, if your host is `mycustomhost.com`, the URL will be `https://mycustomhost.com/v1/convert`. *Type:* `+String+` diff --git a/modules/ROOT/partials/configuration/importword.adoc b/modules/ROOT/partials/configuration/importword.adoc index 54b0102a9e..95c51550e0 100644 --- a/modules/ROOT/partials/configuration/importword.adoc +++ b/modules/ROOT/partials/configuration/importword.adoc @@ -1,11 +1,12 @@ -[[importword-service-url-option]] -== `importword_service_url` option +[[importword-service-url]] +== `importword_service_url` -This option is used for setting the URL endpoint for the conversion service. +This option is used for setting the URL endpoint for the DOCX to HTML conversion service. -[IMPORTANT] -If this string value is **not configured** it will return a console.error: -_The {pluginname} plugin requires the `importword_service_url` to be configured_. If the editor detects an `invalid_URL`, it will return a console.error: _The value provided in `importword_service_url` is not a valid URL_. +The {pluginname} feature is currently only available exclusively for `on-premise` setups, requiring a self-hosted version of the DOCX to HTML conversion service and the `importword_service_url` option to be properly configured. If you require access to this feature, please link:https://www.tiny.cloud/contact/[contact us]. Refer to our xref:individual-import-from-word-and-export-to-word-on-premises.adoc[on-premises documentation] for detailed instructions on deploying the {pluginname} service server-side component using Docker. + +[TIP] +Update the `importword_service_url` configuration in your {productname} setup to point to your host. For instance, if your host is `mycustomhost.com`, the URL will be `https://mycustomhost.com/v1/convert`. *Type:* `+String+` @@ -15,8 +16,12 @@ _The {pluginname} plugin requires the `importword_service_url` to be configured_ ---- tinymce.init({ selector: 'textarea', - plugins: 'code importword', - toolbar: 'importword code', + plugins: 'importword', + toolbar: 'importword', importword_service_url: '' }); ----- \ No newline at end of file +---- + +[IMPORTANT] +If this string value is **not configured** it will return a console.error: +_The {pluginname} plugin requires the `importword_service_url` to be configured_. If the editor detects an `invalid_URL`, it will return a console.error: _The value provided in `importword_service_url` is not a valid URL_. \ No newline at end of file From 6781163536d9add3f0bbde107d8d9ee534778e91 Mon Sep 17 00:00:00 2001 From: Karl Kemister-Sheppard Date: Fri, 26 Jul 2024 10:10:51 +1000 Subject: [PATCH 54/97] DOC-2492: Remove IMPORTANT mention regarding prefix and suffix cannot match in config. (#3404) --- modules/ROOT/pages/mergetags.adoc | 8 ++++---- modules/ROOT/partials/configuration/mergetags_prefix.adoc | 4 +--- modules/ROOT/partials/configuration/mergetags_suffix.adoc | 4 +--- 3 files changed, 6 insertions(+), 10 deletions(-) diff --git a/modules/ROOT/pages/mergetags.adoc b/modules/ROOT/pages/mergetags.adoc index a8ce2f9f15..d5b1a2fbf3 100644 --- a/modules/ROOT/pages/mergetags.adoc +++ b/modules/ROOT/pages/mergetags.adoc @@ -66,13 +66,13 @@ For example, a merge tag can be set to any available typeface, type-size, foregr + A selected merge tag can be changed to any other merge tag by using the {pluginname} toolbar menu button. -. Text that matches an existing merge tag will be recognised as a merge tag when it is pasted or otherwise inserted into a {productname} document. +. Text that matches an existing merge tag will be recognized as a merge tag when it is pasted or otherwise inserted into a {productname} document. + -Content containing the specified prefix and suffix, and matching a specified merge tag, will be inserted as a merge tag when pasted into the editor. For example, if `Sender.Firstname` is a merge tag value, and the merge tag prefix and suffix have their default values, adding the string, `{{Sender.FirstName}}`, to a {productname} document will result in the string automatically being recognised as a merge tag. +Content containing the specified prefix and suffix, and matching a specified merge tag, will be inserted as a merge tag when pasted into the editor. For example, if `Sender.Firstname` is a merge tag value, and the merge tag prefix and suffix have their default values, adding the string, `{{Sender.FirstName}}`, to a {productname} document will result in the string automatically being recognized as a merge tag. . {pluginname} can be nested within the `+mergetags_list+` option. + -The `+mergetags_list+` option allows for the specification of a nested menu item within the {pluginname} toolbar menu button. This option allows any number of nested menus and items for merge tag categorisation. +The `+mergetags_list+` option allows for the specification of a nested menu item within the {pluginname} toolbar menu button. This option allows any number of nested menus and items for merge tag categorization. == Styling Merge Tags @@ -126,4 +126,4 @@ include::partial$configuration/mergetags_list.adoc[leveloffset=+1] include::partial$misc/plugin-toolbar-button-id-boilerplate.adoc[] -include::partial$misc/plugin-menu-item-id-boilerplate.adoc[] +include::partial$misc/plugin-menu-item-id-boilerplate.adoc[] \ No newline at end of file diff --git a/modules/ROOT/partials/configuration/mergetags_prefix.adoc b/modules/ROOT/partials/configuration/mergetags_prefix.adoc index 1030f12087..3b22e26659 100644 --- a/modules/ROOT/partials/configuration/mergetags_prefix.adoc +++ b/modules/ROOT/partials/configuration/mergetags_prefix.adoc @@ -19,6 +19,4 @@ tinymce.init({ toolbar: 'mergetags', mergetags_prefix: '{{' }); ----- - -IMPORTANT: Whatever character or characters are set as the Merge Tags prefix, it or they must be different to the characters set as the Merge Tags suffix. For example, if the Merge Tags prefix is set to `%`, the Merge Tags suffix cannot also be `%`. +---- \ No newline at end of file diff --git a/modules/ROOT/partials/configuration/mergetags_suffix.adoc b/modules/ROOT/partials/configuration/mergetags_suffix.adoc index dc041cf340..715e9c45c8 100644 --- a/modules/ROOT/partials/configuration/mergetags_suffix.adoc +++ b/modules/ROOT/partials/configuration/mergetags_suffix.adoc @@ -17,6 +17,4 @@ tinymce.init({ toolbar: 'mergetags', mergetags_suffix: '}}' }); ----- - -IMPORTANT: Whatever character or characters are set as the Merge Tags suffix, it or they must be different to the characters set as the Merge Tags prefix. For example, if the Merge Tags suffix is set to `%`, the Merge Tags prefix cannot also be `%`. +---- \ No newline at end of file From 2612ac1af1732cf77a7171ab378b45eea5876ab0 Mon Sep 17 00:00:00 2001 From: Farzad Hayat Date: Fri, 26 Jul 2024 17:05:10 +1000 Subject: [PATCH 55/97] DOC-2151: Improve events.adoc explanation event handling (#3394) * DOC-2151: Improve events.adoc explanation event handling * DOC-2151: Expand upon the "`+setup+` and `+init_instance_callback+` options" section --- modules/ROOT/pages/events.adoc | 75 ++++++++++++++++++++++++++++++---- 1 file changed, 68 insertions(+), 7 deletions(-) diff --git a/modules/ROOT/pages/events.adoc b/modules/ROOT/pages/events.adoc index 3cdb272aa1..abe61a14af 100644 --- a/modules/ROOT/pages/events.adoc +++ b/modules/ROOT/pages/events.adoc @@ -2,15 +2,42 @@ :navtitle: Available Events :description_short: List of common editor events :description: List of common editor events -:keywords: Click, DblClick, MouseDown, MouseUp, MouseMove, MouseOver, MouseOut, MouseEnter, MouseLeave, KeyDown, KeyPress, KeyUp, ContextMenu, Paste, Init, Focus, Blur, BeforeSetContent, SetContent, GetContent, PreProcess, PostProcess, NodeChange, Undo, Redo, Change, Dirty, Remove, ExecCommand, PastePreProcess, PastePostProcess, AutocompleterStart, AutocompleterUpdate, AutocompleterEnd - -{productname} supports some browser-native events, and provides additional events for working with the editor and plugins. +:keywords: Click, DblClick, MouseDown, MouseUp, MouseMove, MouseOver, MouseOut, MouseEnter, MouseLeave, KeyDown, KeyPress, KeyUp, ContextMenu, Paste, Init, Focus, Blur, BeforeSetContent, SetContent, GetContent, PreProcess, PostProcess, NodeChange, Undo, Redo, Change, Dirty, Remove, ExecCommand, PastePreProcess, PastePostProcess, AutocompleterStart, AutocompleterUpdate, AutocompleterEnd, setup, init, init_instance_callback, AddEditor, RemoveEditor, BeforeUnload, browser-native events, editor-core events, plugin events, editor-manager events, event handlers, event binding +[[handling-editor-events]] == Handling Editor events -The following examples illustrate how to use supported native events, editor core events, and plugin events with {productname}. +{productname} supports several types of events for working with the editor and plugins. + +* xref:browser-native-events[Supported browser-native events] +* xref:editor-core-events[Editor core events] +* xref:plugin-events[Plugin events] +* xref:editor-manager-events[Editor Manager events] + +The following examples illustrate how to use supported native events, editor core events, and plugin events with {productname}. Editor Manager events are handled separately using `+tinymce.on+`, rather than `+editor.on+`. + +=== Defining an event handler + +Event handlers can be initialized anywhere using the `+editor.on+` method, as shown in the following example: + +[source,js] +---- +tinymce.activeEditor.on('click', (e) => { + console.log('Editor was clicked at: ' + e.pageX + ', ' + e.pageY); +}); +---- + +=== `+setup+` and `+init_instance_callback+` options + +A common use case for setting up events is to use the `+setup+` and `+init_instance_callback+` options. These options allow you to bind events before and after the editor instance is initialized. + +The `+setup+` option can be used to bind an event **before** the editor instance is initialized. + +The `+init_instance_callback+` option can be used to bind an event **after** the editor instance is initialized. + +TIP: The `+init_instance_callback+` is functionally equivalent to binding an event listener to the `init` event on the `+setup+` option. -The following example uses a function to create a console log entry when the editor has initialized. This is also an example of handling an event which does not return any data. +For example, the following code: [source,js] ---- @@ -18,13 +45,45 @@ tinymce.init({ selector: 'textarea', setup: (editor) => { editor.on('init', (e) => { - console.log('The Editor has initialized.'); + console.log('Editor is initialized.'); }); } }); ---- -The following example uses a function to create a console log entry when a command is executed in the editor. This is also an example of handling an event that returns data. +Is equivalent to: + +[source,js] +---- +tinymce.init({ + selector: 'textarea', + init_instance_callback: (editor) => { + console.log('Editor is initialized.'); + } +}); +---- + +For more information on these options, see xref:editor-important-options.adoc#setup[setup] and xref:editor-important-options.adoc#init_instance_callback[init_instance_callback]. + +=== Binding an event before editor initialization + +The following example uses the `+setup+` option to bind an event before the editor instance is initialized. This is an example of handling an event that does not return data, such as the `+ResizeEditor+` editor event. Therefore, the `+e+` parameter is not used. + +[source,js] +---- +tinymce.init({ + selector: 'textarea', + setup: (editor) => { + editor.on('ResizeEditor', (e) => { + console.log('Editor was resized.'); + }); + } +}); +---- + +=== Binding an event after editor initialization + +The following example uses the `+init_instance_callback+` option to bind an event after the editor instance is initialized. This is an example of handling an event that returns data, such as the `+ExecCommand+` event. Therefore, we can use the `+e+` parameter to access the data returned by the event. [source,js] ---- @@ -38,6 +97,7 @@ tinymce.init({ }); ---- +[[browser-native-events]] == Supported browser-native events {productname} supports the following browser-native events. Click the event name for details (links open https://developer.mozilla.org/[MDN Web Docs]). @@ -176,6 +236,7 @@ The following events are provided by the {productname} editor. |FontFamilyTextUpdate |`+{ value: string }+` |Fired after the visible text label of the `fontfamily` bespoke toolbar button is updated. `value` refers to the updated visible text label. |=== +[[plugin-events]] == Plugin events The following plugins provide events. From 124892b008670cea7179a069c956b520dca16d28 Mon Sep 17 00:00:00 2001 From: Karl Kemister-Sheppard Date: Mon, 29 Jul 2024 11:55:17 +1000 Subject: [PATCH 56/97] DOC-2440: Document Converters Self-Hosted Advert Pages. (#3323) * DOC-2440: Document Converters SService. * DOC-2438: `Docx to HTML` and `HTML to Docx` converter api documentation. (#3381) * DOC-2438: Docx to HTML and HTML to Docx converter api documentation. * Update modules/ROOT/pages/html-to-docx-converter-api.adoc Co-authored-by: ltrouton <46954949+ltrouton@users.noreply.github.com> * Update modules/ROOT/pages/html-to-docx-converter-api.adoc * Update modules/ROOT/pages/docx-to-html-converter-api.adoc * Update modules/ROOT/pages/docx-to-html-converter-api.adoc --------- Co-authored-by: ltrouton <46954949+ltrouton@users.noreply.github.com> * DOC-2439: Export to PDF Standalone Service. (#3338) * DOC-2439: Export to PDF Standalone Service. * DOC-2439: RE-write, removal of curl examples, and more simplified documentation. * DOC-2439: add demo, restructure nav.adoc, update content. * DOC-2439: Remove index.html page, add raw demo and update placeholder content. * DOC-2439: fix container alignment and margins. * Update modules/ROOT/pages/html-to-pdf-converter-api.adoc * Update modules/ROOT/pages/html-to-pdf-converter-api.adoc Link update * Update modules/ROOT/pages/html-to-pdf-converter-api.adoc Update link text. * Update modules/ROOT/pages/html-to-pdf-converter-api.adoc Open link in new tab. * DOC-2439: Copy edits, and replacing string with variables. * DOC-2439: remove Options Available for HTML to PDF Conversion, Demo and Export to PDF Plugin reference and rename the API Reference to PDF Converter API reference. --------- Co-authored-by: shirqa <43625458+ShiridiGandham@users.noreply.github.com> * DOC-2440: console error fix. --------- Co-authored-by: ltrouton <46954949+ltrouton@users.noreply.github.com> Co-authored-by: shirqa <43625458+ShiridiGandham@users.noreply.github.com> --- modules/ROOT/nav.adoc | 3 ++ .../pages/docx-to-html-converter-api.adoc | 53 +++++++++++++++++++ .../export-to-word-standalone-service.adoc | 5 ++ .../pages/html-to-docx-converter-api.adoc | 44 +++++++++++++++ .../ROOT/pages/html-to-pdf-converter-api.adoc | 43 +++++++++++++++ .../import-from-word-standalone-service.adoc | 5 ++ 6 files changed, 153 insertions(+) create mode 100644 modules/ROOT/pages/docx-to-html-converter-api.adoc create mode 100644 modules/ROOT/pages/export-to-word-standalone-service.adoc create mode 100644 modules/ROOT/pages/html-to-docx-converter-api.adoc create mode 100644 modules/ROOT/pages/html-to-pdf-converter-api.adoc create mode 100644 modules/ROOT/pages/import-from-word-standalone-service.adoc diff --git a/modules/ROOT/nav.adoc b/modules/ROOT/nav.adoc index 461d4b0802..6269519194 100644 --- a/modules/ROOT/nav.adoc +++ b/modules/ROOT/nav.adoc @@ -311,10 +311,13 @@ **** xref:mediaembed-server-integration.adoc[Integrate Enhanced Media Embed Server] *** xref:advtable.adoc[Enhanced Tables] *** xref:exportpdf.adoc[Export to PDF] +**** xref:html-to-pdf-converter-api.adoc[HTML to PDF Converter API] *** xref:exportword.adoc[Export to Word] +**** xref:html-to-docx-converter-api.adoc[HTML to DOCX Converter API] *** xref:footnotes.adoc[Footnotes] *** xref:formatpainter.adoc[Format Painter] *** xref:importword.adoc[Import from Word] +**** xref:docx-to-html-converter-api.adoc[DOCX to HTML Converter API] *** xref:editimage.adoc[Image Editing] *** xref:inline-css.adoc[Inline CSS] *** xref:linkchecker.adoc[Link Checker] diff --git a/modules/ROOT/pages/docx-to-html-converter-api.adoc b/modules/ROOT/pages/docx-to-html-converter-api.adoc new file mode 100644 index 0000000000..cb2a034337 --- /dev/null +++ b/modules/ROOT/pages/docx-to-html-converter-api.adoc @@ -0,0 +1,53 @@ += Docx to HTML Converter API +:navtitle: Docx to HTML Converter API +:description: The DOCX to HTML converter provides an API for converting Microsoft Word .docx and .dotx files to HTML, allowing users to import content from Word documents directly into their web applications. +:description_short: The DOCX to HTML converter provides an API for converting Microsoft Word .docx and .dotx files to HTML. +:keywords: service, exportword, export to docx, export to word, html to docx converter api +:pluginname: Import from Word +:servicename: Docx to HTML Converter API + +[NOTE] +This is a premium feature. link:https://www.tiny.cloud/contact/[Contact us] to purchase a license or to learn more about our tailored offers. Note that any documents generated without authentication will be watermarked. + +== Overview + +The {servicename} provides an API for converting Microsoft Word `.docx` and `.dotx` files to HTML, allowing users to import content from Word documents directly into their web applications. This feature ensures that the imported content retains its original formatting, making it an essential tool for users who require high fidelity in document conversion. + +== Key Features + +* **High Fidelity Conversion**: Ensures that the content from Word documents is imported with accurate formatting, including styles, lists, tables, images, and hyperlinks. +* **Seamless Integration**: Easily integrates with a WYSIWYG editor, allowing users to convert Word documents directly within their existing content management workflows. +* **API Accessibility**: Accessible via a simple REST API, making it easy to incorporate into various applications and services. +* **Support for Complex Documents**: Handles complex Word documents with multiple sections, headers, footers, and different page layouts. +* **Customization Options**: Provides options to customize the conversion process to meet specific needs. + +[[options]] +== Flexible Configuration Options + +=== Formatting Customization + +* **Custom CSS**: Apply custom CSS to the converted content for consistent styling. +* **Formatting**: Allows which Word styles and formatting are output alongside the document. +* **Document properties**: Set document size and margins in pixels. + +=== Output Options + +* **Output Format**: Content is returned as a JSON object for easier integration into applications such as: +** **HTML Content**: Provides the converted HTML, ready for web use. +** **Document Information**: Offers document size and margin details for precise layout control. + +These configuration options enhance the flexibility and control users have over the import process, making it adaptable to various needs and use cases. + +[[ideal-use-cases]] +== Ideal for Various Use Cases + +* **Corporate Documentation**: Organizations can seamlessly import Word documents into their web-based content management systems, preserving formatting and styles. +* **Academic Publishing**: Researchers and educators can easily convert and publish their Word documents on educational platforms or academic journals' websites. +* **Legal Document Management**: Law firms can streamline the review and editing of Word documents while preserving essential formatting elements. +* **Content Creation and Blogging**: Bloggers can import their drafts directly into their blogging platform, saving time on reformatting. +* **Online Learning Platforms**: Instructors can import educational materials directly from Word, improving the learning experience for students. +* **Government and Public Services**: Government agencies can import documents into their web platforms, ensuring they are accessible in a consistent and professional manner. + +== Docx to HTML Converter API Reference + +> Explore the comprehensive API documentation at link:https://exportdocx.converter.tiny.cloud/docs#section/Import-from-Word[Docx to HTML Converter API Reference documentation.^] \ No newline at end of file diff --git a/modules/ROOT/pages/export-to-word-standalone-service.adoc b/modules/ROOT/pages/export-to-word-standalone-service.adoc new file mode 100644 index 0000000000..24d50e771c --- /dev/null +++ b/modules/ROOT/pages/export-to-word-standalone-service.adoc @@ -0,0 +1,5 @@ += Export to Word Standalone Service +:navtitle: Export to Word Standalone Service +:description: The Export to Word service feature, provides the ability to generate a .docx Word files directly without the need for an editor. +:description_short: Generate a Word file directly from standalone application. +:keywords: service, exportword, export to Word \ No newline at end of file diff --git a/modules/ROOT/pages/html-to-docx-converter-api.adoc b/modules/ROOT/pages/html-to-docx-converter-api.adoc new file mode 100644 index 0000000000..114db73d98 --- /dev/null +++ b/modules/ROOT/pages/html-to-docx-converter-api.adoc @@ -0,0 +1,44 @@ += HTML to Docx Converter API +:navtitle: Export to Word Standalone Service +:description: The Export to Microsoft Word feature collects the HTML generated with the tinymce.editor.getContent() method and combines it with the default editor content styles along with the styles provided in the configuration. +:description_short: Generate a .docx file directly from any application. +:keywords: service, exportword, export to docx, export to word, html to docx converter api +:pluginname: Export to Word +:servicename: HTML to Docx Converter API + +[NOTE] +This is a premium feature. link:https://www.tiny.cloud/contact/[Contact us] to purchase a license or to learn more about our tailored offers. Note that any documents generated without authentication will be watermarked. + +== Overview + +The {servicename} allows developers to convert HTML content into DOCX files seamlessly. It is designed to integrate effortlessly into your applications, providing high-quality document conversions with ease. + +== Key Features + +- **HTML to DOCX Conversion**: Transform HTML content into DOCX files with precision, maintaining the structure and styling. +- **Customizable Outputs**: Tailor the DOCX output to match your requirements, including custom headers, footers, and styles. +- **High Performance**: Engineered for efficiency, ensuring fast and reliable document conversions. +- **Ease of Integration**: Simple RESTful API interface that can be integrated into any application or workflow. + +[[options]] +== Flexible Configuration Options + +You can customize the DOCX output by specifying various options in your request: + +- **Headers and Footers**: Add custom headers and footers to your DOCX documents. +- **Styles**: Define custom styles for different HTML elements to ensure your documents look exactly as desired. +- **Page Format**: Select from a wide range of page formats, including Letter, Legal, Tabloid, and A4, ensuring your documents look perfect every time. + +== Ideal for Various Use Cases + +Examples on how you can use the API to convert an HTML document with custom styles and a header and footer. + +* **Legal Document Automation**: Automate the generation of legal documents by converting pre-defined HTML templates into standardized DOCX files, complete with custom headers, footers, and styling. +* **Dynamic Report Generation**: Generate dynamic reports from HTML data, allowing for consistent formatting and styling across all generated documents. +* **Educational Material Distribution**: Convert HTML-based educational content into DOCX files for easy distribution and offline access by students. +* **Newsletter Archiving**: Archive HTML newsletters as DOCX files, preserving the layout and design for future reference. + + +== HTML to Docx Converter API Reference + +> Explore the comprehensive API documentation at link:https://exportdocx.converter.tiny.cloud/docs#section/Export-to-Word[HTML to Docx Converter API Reference documentation.^] \ No newline at end of file diff --git a/modules/ROOT/pages/html-to-pdf-converter-api.adoc b/modules/ROOT/pages/html-to-pdf-converter-api.adoc new file mode 100644 index 0000000000..a566d242c9 --- /dev/null +++ b/modules/ROOT/pages/html-to-pdf-converter-api.adoc @@ -0,0 +1,43 @@ += HTML to PDF Converter API +:navtitle: Export to PDF Standalone Service +:description: The HTML to PDF Converter API service feature, provides the ability to generate a PDF files directly without the need for an editor. +:description_short: Generate a .pdf file directly from any application. +:keywords: service, exportpdf, export to pdf, HTML to PDF Converter API +:pluginname: Export to PDF +:servicename: HTML to PDF Converter API + +[NOTE] +This is a premium feature. link:https://www.tiny.cloud/contact/[Contact us] to purchase a license or to learn more about our tailored offers. Note that any documents generated without authentication will be watermarked. + +== Overview + +The {servicename} is a powerful tool that seamlessly integrates advanced document conversion capabilities into developers workflows. This API allows for the efficient conversion of HTML content into PDF documents, catering to a wide range of use cases. + +=== Key Features + +* **Versatile Document Conversion**: Convert HTML content into high-quality PDF documents, providing flexibility for various document needs. +* **Preprocessing Capabilities**: Pre-process content before conversion, such as resolving merge tags, ensuring fully customized and ready-to-use PDF documents. +* **Customizable Output**: Tailor the appearance and structure of the converted PDFs with customizable output xref:html-to-pdf-converter-api.adoc#options[options], including page sizes, margins, and formatting. +* **Scalability**: Handle large volumes of PDF documents with consistent performance and reliability, supporting business growth and varying demands. +* **Ease of Integration**: Integrate the API into existing workflows easily with comprehensive documentation and straightforward API endpoints. +* **Security and Compliance**: Ensure secure document conversion processes that adhere to data protection standards and industry regulations, crucial for handling sensitive information. + +[[options]] +== Flexible Configuration Options + +Tailor your PDF documents to suit your needs: + +* **Custom CSS Styling:** Apply link:https://exportpdf.converter.tiny.cloud/docs#section/General/CSS[custom CSS^] styles to your PDFs for brand consistency and enhanced presentation. +* **Header and Footer Options:** Add link:https://exportpdf.converter.tiny.cloud/docs#section/PDF-options/Header-and-footer[headers, footers^], and other branding elements to your PDF documents for a professional touch. +* **Page Formatting:** Control page settings such as orientation, link:https://exportpdf.converter.tiny.cloud/docs#section/PDF-options/Margins[margins^], and link:https://exportpdf.converter.tiny.cloud/docs#section/PDF-options/Page-format[page size] to optimize readability. + +== Ideal for Various Use Cases + +* **Aggregating Content from Multiple Sources**: Combine content from various editors into a single cohesive PDF document, simplifying content management for organizations using multiple tools. +* **Centralized Document Management**: Store generated PDF documents centrally for better organization and accessibility, facilitating team collaboration and efficient document retrieval. +* **Preprocessing and Customization**: Pre-process content to resolve merge tags and customize PDF document formatting, ensuring that the final output meets specific requirements and is ready for immediate use. +* **Large-Scale Document Processing**: Utilize the API’s scalability to handle large volumes of PDF documents, maintaining consistent performance and reliability, essential for growing businesses. + +== PDF Converter API Reference + +> Explore the comprehensive API documentation at link:https://exportpdf.converter.tiny.cloud/docs[PDF Converter API Reference documentation.^] \ No newline at end of file diff --git a/modules/ROOT/pages/import-from-word-standalone-service.adoc b/modules/ROOT/pages/import-from-word-standalone-service.adoc new file mode 100644 index 0000000000..13f01a683a --- /dev/null +++ b/modules/ROOT/pages/import-from-word-standalone-service.adoc @@ -0,0 +1,5 @@ += Import from Word Standalone Service +:navtitle: Import from Word Standalone Service +:description: The Import from Word service feature lets you import .docx (Word document) or .dotx (Word template) files into standalone application. +:description_short: Import a Word file directly into a standalone application while preserving formatting and rich media. +:keywords: service, importword, Import from Word \ No newline at end of file From 6e45d120ea2140e467bb3897c5f1d5bdb8615707 Mon Sep 17 00:00:00 2001 From: Ky Eltis Date: Tue, 6 Aug 2024 11:32:41 +1000 Subject: [PATCH 57/97] DOC-2499: 7x Remove UI Bundle Cache (#3421) * DOC-2499: Remove UI Bundle Cache * DOC-2499: Use production UI Bundle --- antora-playbook-local.yml | 3 ++- antora-playbook.yml | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/antora-playbook-local.yml b/antora-playbook-local.yml index 4abf519a19..3f6ce3c0fe 100644 --- a/antora-playbook-local.yml +++ b/antora-playbook-local.yml @@ -12,7 +12,8 @@ urls: latest_version_segment: latest ui: bundle: - url: https://tiny-cloud-docs-antora-themes-staging.s3.amazonaws.com/ui-bundle.zip + url: https://tiny-cloud-docs-antora-themes-production.s3.amazonaws.com/ui-bundle.zip + snapshot: true asciidoc: extensions: - '@tinymce/antora-extension-livedemos' diff --git a/antora-playbook.yml b/antora-playbook.yml index 0cc29750e2..c5fc872959 100644 --- a/antora-playbook.yml +++ b/antora-playbook.yml @@ -14,7 +14,8 @@ urls: latest_version_segment: latest ui: bundle: - url: https://tiny-cloud-docs-antora-themes-staging.s3.amazonaws.com/ui-bundle.zip + url: https://tiny-cloud-docs-antora-themes-production.s3.amazonaws.com/ui-bundle.zip + snapshot: true asciidoc: extensions: - '@tinymce/antora-extension-livedemos' From 5219a712579626d62dd48ee505407c0a0519560e Mon Sep 17 00:00:00 2001 From: Farzad Hayat Date: Wed, 7 Aug 2024 16:35:01 +1000 Subject: [PATCH 58/97] DOC-2462: TinyMCE 7.3 Release Documentation (#3365) * DOC-2462: TinyMCE 7.3 Release Documentation * Update export to Word config options to support v2 improved flexibility, and plugin descriptions. (#3390) * Update export to Word config options to support v2 improved flexibility, and plugin descriptions * Update modules/ROOT/partials/configuration/exportword.adoc Co-authored-by: Farzad Hayat * DOC-2482: update links and Import from Word and Export to Word service server-side component using Docker sub-section config changes to support v2. * Update modules/ROOT/partials/configuration/exportword.adoc Co-authored-by: Farzad Hayat * Update modules/ROOT/partials/individually-licensed-components/import-from-word-and-export-to-word/import-from-word-and-export-to-word-logs-on-premises.adoc Co-authored-by: Farzad Hayat * Update modules/ROOT/pages/importword.adoc Co-authored-by: Farzad Hayat * DOC-2482: update link, add note regarding header and footer styling. --------- Co-authored-by: Farzad Hayat * DOC-2463: TinyMCE 7.3 Release notes & community changelog (#3366) * DOC-2463: TinyMCE 7.3 Release notes & community changelog * By default, code is now formatted automatically when the Enhanced Code Editor view is opened. (#3401) * By default, code is now formatted automatically when the Enhanced Code Editor view is opened. * Update modules/ROOT/pages/7.3-release-notes.adoc Co-authored-by: ltrouton <46954949+ltrouton@users.noreply.github.com> * Update modules/ROOT/pages/7.3-release-notes.adoc --------- Co-authored-by: ltrouton <46954949+ltrouton@users.noreply.github.com> * DOC-2463: Notifications didn't position and resize properly when resizing the editor or toggling views. (#3409) * DOC-2463: Notifications didn't position and resize properly when resizing the editor or toggling views. * Update modules/ROOT/pages/7.3-release-notes.adoc * DOC-2463: Unnecessary nbsp entities were inserted when typing at the edges of inline elements. (#3398) * DOC-2463: Double-clicking on a math element now opens the Math dialog. (#3410) * DOC-2463: Added new option `advcode_prettify_getcontent` to Enhanced Code Editor. (#3400) * DOC-2463: Added new option advcode_prettify_getcontent to Enhanced Code Editor. * Update modules/ROOT/partials/configuration/advcode.adoc Co-authored-by: ltrouton <46954949+ltrouton@users.noreply.github.com> * Update modules/ROOT/partials/configuration/advcode.adoc Co-authored-by: ltrouton <46954949+ltrouton@users.noreply.github.com> * Update modules/ROOT/pages/7.3-release-notes.adoc Co-authored-by: ltrouton <46954949+ltrouton@users.noreply.github.com> * Update modules/ROOT/partials/configuration/advcode.adoc Co-authored-by: ltrouton <46954949+ltrouton@users.noreply.github.com> * Update modules/ROOT/pages/7.3-release-notes.adoc * Update modules/ROOT/pages/7.3-release-notes.adoc * Update modules/ROOT/partials/configuration/advcode.adoc Co-authored-by: Farzad Hayat * Update modules/ROOT/partials/configuration/advcode.adoc --------- Co-authored-by: ltrouton <46954949+ltrouton@users.noreply.github.com> Co-authored-by: Farzad Hayat * DOC-2463: TINY-10973 Split button popup positioning in fullscreen (#3411) * DOC-2463: The pattern commands would execute even if the command was not enabled. (#3403) * Fix typo in TINY-10894 entry * DOC-2463:Add Translate options to AI Assistant default shortcuts. (#3399) * DOC-2463: Fixed JavaScript error when inserting a table using the context menu by adjusting the event order in `renderInsertTableMenuItem`. (#3406) * DOC-2463: Fixed JavaScript error when inserting a table using the context menu by adjusting the event order in renderInsertTableMenuItem. * Update modules/ROOT/pages/7.3-release-notes.adoc Co-authored-by: Farzad Hayat --------- Co-authored-by: Farzad Hayat * DOC-2463: Markdown will now respect the 'Paste as Text' menu option. (#3414) * DOC-2463: Attempting to use focus commands on an editor where the cursor had last been in certain contentEditable=true elements would fail. (#3417) * DOC-2463: The listbox component had a fixed width and was not a responsive ui element. (#3408) * DOC-2463: The listbox component had a fixed width and was not a responsive ui element. * Update modules/ROOT/pages/7.3-release-notes.adoc Co-authored-by: Farzad Hayat --------- Co-authored-by: Farzad Hayat * DOC-2463: Colorpicker number input fields now show an error tooltip and error icon when invalid text has been entered. (#3413) * DOC-2463: Colorpicker number input fields now show an error tooltip and error icon when invalid text has been entered. * DOC-2463: update png files to reflect recent color change, included note for read aloud variations. * DOC-2463: Added success notification when all misspellings are resolved. (#3416) * DOC-2463: Sequential html comments would in some cases generate unwanted elements. (#3415) * DOC-2463: Sequential html comments would in some cases generate unwanted elements. * Update modules/ROOT/pages/7.3-release-notes.adoc --------- Co-authored-by: Farzad Hayat * Update 7.3 release date to 2024-08-07 * Remove the following unused template sections: enhanced skins/icon packs, changes, removed, security fixes, known issues. * DOC-2463: `preventDefault` on mousedown on toolbar buttons was causing misplaced focus bugs. (#3412) * DOC-2463: preventDefault on mousedown on toolbar buttons was causing misplaced focus bugs. * Update modules/ROOT/pages/7.3-release-notes.adoc Co-authored-by: Arvin(Jintao) Han <20640097+ArvinJ-H@users.noreply.github.com> --------- Co-authored-by: Arvin(Jintao) Han <20640097+ArvinJ-H@users.noreply.github.com> * DOC-2463: When a full document was loaded as editor content the head elements were added to the body. (#3402) * DOC-2463: When a full document was loaded as editor content the head elements were added to the body. * Update modules/ROOT/pages/7.3-release-notes.adoc * DOC-2463: changelog entries for 7.3.0. * DOC-2481: 7.3 Revision History changes - update plugin page and add release notes (#3407) * DOC-2481: Add revisionhistory_author.adoc * DOC-2481: Add revisionhistory_display_author.adoc * DOC-2481: Update "Understanding types of versions" section and replace 'current' with 'draft' when referring to the version * DOC-2481: Note that "Restore this version" button is disabled for `initial` and `draft` versions. * DOC-2481: Extract Revision object and Author object into separate subheadings in plugin page * DOC-2481: Replace `version` with `revision` and add `author` property to Revision object * DOC-2481: Live demo add author options to init and author object in revisions lists. * DOC-2481: Two release note entries for TINY-11014 * DOC-2481: TINY-11042 "Restore this version" button is now disabled when a draft or initial revision is selected. * DOC-2481: TINY-11045 Enhance the appearance of the Revision History sidebar. * DOC-2481: TINY-11073 Add labels to the `initial` and `draft` revisions. * DOC-2481: TINY-11079 New `revisionhistory_display_author` option that determines whether the author is displayed. * DOC-2481: TINY-11090 It is easier to identify the selected revision. * DOC-2481: Fix diff API heading in revisionhistory-apis.adoc * DOC-2481: Add new options and features to revision history page * DOC-2481: Update descriptions and minor changes to the options * Update modules/ROOT/pages/7.3-release-notes.adoc Co-authored-by: Karl Kemister-Sheppard * Update modules/ROOT/pages/7.3-release-notes.adoc Co-authored-by: Karl Kemister-Sheppard * Update modules/ROOT/pages/revisionhistory.adoc Co-authored-by: Karl Kemister-Sheppard * Update modules/ROOT/partials/plugin-apis/revisionhistory-apis.adoc Co-authored-by: Karl Kemister-Sheppard * Update modules/ROOT/partials/configuration/revisionhistory_fetch.adoc Co-authored-by: Karl Kemister-Sheppard * Update modules/ROOT/partials/configuration/revisionhistory_display_author.adoc Co-authored-by: Karl Kemister-Sheppard * Update modules/ROOT/pages/revisionhistory.adoc * Update modules/ROOT/pages/revisionhistory.adoc Co-authored-by: Karl Kemister-Sheppard * Update modules/ROOT/pages/7.3-release-notes.adoc Co-authored-by: Karl Kemister-Sheppard * Update modules/ROOT/pages/revisionhistory.adoc Co-authored-by: Karl Kemister-Sheppard * Update modules/ROOT/pages/revisionhistory.adoc Co-authored-by: Karl Kemister-Sheppard * Update modules/ROOT/pages/revisionhistory.adoc Co-authored-by: Karl Kemister-Sheppard * Update modules/ROOT/pages/revisionhistory.adoc Co-authored-by: Karl Kemister-Sheppard * Update modules/ROOT/pages/revisionhistory.adoc Co-authored-by: Karl Kemister-Sheppard * Update modules/ROOT/pages/revisionhistory.adoc Co-authored-by: Karl Kemister-Sheppard * Update modules/ROOT/pages/7.3-release-notes.adoc Co-authored-by: Karl Kemister-Sheppard * Update modules/ROOT/pages/7.3-release-notes.adoc Co-authored-by: Karl Kemister-Sheppard * Update modules/ROOT/pages/7.3-release-notes.adoc Co-authored-by: Karl Kemister-Sheppard * DOC-2481: Clean up code example * DOC-2481: remove duplicate admonition * Fix revisionhistory author xref * Add "for more info" for revisionhistory_display_author in release notes * Update modules/ROOT/pages/7.3-release-notes.adoc Co-authored-by: shirqa <43625458+ShiridiGandham@users.noreply.github.com> * Update modules/ROOT/pages/revisionhistory.adoc Co-authored-by: shirqa <43625458+ShiridiGandham@users.noreply.github.com> * DOC-2481: Add revisionhistory_display_author to revisionhistory_author partial * DOC-2481: Move Spell Checker below Revision History * DOC-2481: Update the release notes * DOC-2481: Update demos --------- Co-authored-by: Ben Tran Co-authored-by: Karl Kemister-Sheppard Co-authored-by: shirqa <43625458+ShiridiGandham@users.noreply.github.com> * DOC-2463: typo correction. --------- Co-authored-by: Karl Kemister-Sheppard Co-authored-by: ltrouton <46954949+ltrouton@users.noreply.github.com> Co-authored-by: Arvin(Jintao) Han <20640097+ArvinJ-H@users.noreply.github.com> Co-authored-by: Ben Tran Co-authored-by: shirqa <43625458+ShiridiGandham@users.noreply.github.com> * DOC-2463: merge tinymce/7 changes into release/7.3 branch. (#3422) * Revert "DOC-2463: merge tinymce/7 changes into release/7.3 branch. (#3422)" (#3423) This reverts commit 21bb3719ded24cf28c9aeaac946a545461a3b312. * DOC-2463: Sync with release/7.3 (#3424) * DOC-2435: Updated Angular quick start guides (#3332) * DOC-2425: Update migration guide and 7.0 release notes regarding force_hex_colour (#3350) * DOC-2460: Update the supported versions table in misc/supported-versions.adoc. (#3370) * DOC-2475: Remove old link to Tiny Blog - How to use TinyMCE premium plugins in WordPress 5. (#3377) * DOC-2471: Update inline-demo to support toolbar_sticky_offset, to correct visual issue. (#3374) * DOC-2471_2: Revert toolbar_sticky_offset fix. (#3378) * DOC-2465: TinyMCE 7.2.1 Release Documentation (#3367) * DOC-2465: TinyMCE 7.2.1 Release Documentation * DOC-2466: TinyMCE 7.2.1 Release notes & community changelog (#3368) * DOC-2466: TinyMCE 7.2.1 Release notes & community changelog * DOC-2466: Add TINY-10127 release note entry (#3372) * DOC-2466: update changelog.adoc for TinyMCE 7.2.1. * DOC-2466: `Open Link` button was disabled when selection partially covered a link or when multiple links were selected. (#3379) * DOC-2466: Open Link button was disabled when selection partially covered a link or when multiple links were selected. * Update modules/ROOT/pages/7.2.1-release-notes.adoc Co-authored-by: Mitchell Crompton --------- Co-authored-by: Mitchell Crompton * DOC-2466: Long translations of the bottom help text would cause minor graphical issues. (#3376) * DOC-2466: Long translations of the bottom help text would cause minor graphical issues. * Update modules/ROOT/pages/7.2.1-release-notes.adoc Co-authored-by: Farzad Hayat --------- Co-authored-by: Farzad Hayat * DOC-2466: Text content could move unexpectedly when deleting a paragraph. (#3375) * Update modules/ROOT/pages/changelog.adoc --------- Co-authored-by: Karl Kemister-Sheppard Co-authored-by: Mitchell Crompton --------- Co-authored-by: Karl Kemister-Sheppard Co-authored-by: Mitchell Crompton * DOC-2467: api-version bump for TinyMCE 7.2.1. (#3382) * DOC-2477: Update OpenAI Proxy Token (#3384) * DOC-2469: Windows Repo Folder Compatibility and Template Updates (#3373) * DOC-2469: Replace <> in file names with {} * DOCS-2469: Clean up and improve templates * Update {productminorversion} in antora.yml and its template version * Fix the correct instance of supported-versions.adoc * Update -new-material-templates/release-notes-template/ROOT/partials/misc/supported-versions.adoc Co-authored-by: Karl Kemister-Sheppard * DOC-2469: Delete template files for antora.yml and supported-versions.adoc --------- Co-authored-by: Karl Kemister-Sheppard * DOC-2469: Fix release-notes.adoc table (#3387) * DOC-2486: Add requires 7.1v admon to Revision History Diff API (#3391) * DOC-2480: Update `svelte-quick-start.adoc` to use Vite v5 (#3388) * DOC-2480: Update svelte-quick-start.adoc to use Vite v5 * DOC-2480: Improve wording on the "replace src/App.svelte contents" step * DOC-2489: update code block for importword basic-setup. (#3396) * DOC-2487: Replace 'en' with 'en_US' in Spellchecker docs and demo (#3392) * DOC-2488: Remove reference of `Cloud Service` from various plugin pages. (#3397) * DOC-2488: Remove reference of Cloud Service from various plugin pages. * DOC-2488: remove mention of option from importword_service_url. * Update modules/ROOT/pages/exportpdf.adoc Co-authored-by: shirqa <43625458+ShiridiGandham@users.noreply.github.com> * Update modules/ROOT/pages/exportword.adoc Co-authored-by: shirqa <43625458+ShiridiGandham@users.noreply.github.com> * Update modules/ROOT/partials/configuration/exportpdf.adoc Co-authored-by: shirqa <43625458+ShiridiGandham@users.noreply.github.com> * Update modules/ROOT/partials/configuration/exportword.adoc Co-authored-by: shirqa <43625458+ShiridiGandham@users.noreply.github.com> * DOC-2488: update description for IFW ETW and ETPDF regarding self-hosting. * Update modules/ROOT/partials/configuration/importword.adoc * Update modules/ROOT/partials/configuration/exportword.adoc * Update modules/ROOT/partials/configuration/exportpdf.adoc --------- Co-authored-by: shirqa <43625458+ShiridiGandham@users.noreply.github.com> * DOC-2492: Remove IMPORTANT mention regarding prefix and suffix cannot match in config. (#3404) * DOC-2151: Improve events.adoc explanation event handling (#3394) * DOC-2151: Improve events.adoc explanation event handling * DOC-2151: Expand upon the "`+setup+` and `+init_instance_callback+` options" section * DOC-2440: Document Converters Self-Hosted Advert Pages. (#3323) * DOC-2440: Document Converters SService. * DOC-2438: `Docx to HTML` and `HTML to Docx` converter api documentation. (#3381) * DOC-2438: Docx to HTML and HTML to Docx converter api documentation. * Update modules/ROOT/pages/html-to-docx-converter-api.adoc Co-authored-by: ltrouton <46954949+ltrouton@users.noreply.github.com> * Update modules/ROOT/pages/html-to-docx-converter-api.adoc * Update modules/ROOT/pages/docx-to-html-converter-api.adoc * Update modules/ROOT/pages/docx-to-html-converter-api.adoc --------- Co-authored-by: ltrouton <46954949+ltrouton@users.noreply.github.com> * DOC-2439: Export to PDF Standalone Service. (#3338) * DOC-2439: Export to PDF Standalone Service. * DOC-2439: RE-write, removal of curl examples, and more simplified documentation. * DOC-2439: add demo, restructure nav.adoc, update content. * DOC-2439: Remove index.html page, add raw demo and update placeholder content. * DOC-2439: fix container alignment and margins. * Update modules/ROOT/pages/html-to-pdf-converter-api.adoc * Update modules/ROOT/pages/html-to-pdf-converter-api.adoc Link update * Update modules/ROOT/pages/html-to-pdf-converter-api.adoc Update link text. * Update modules/ROOT/pages/html-to-pdf-converter-api.adoc Open link in new tab. * DOC-2439: Copy edits, and replacing string with variables. * DOC-2439: remove Options Available for HTML to PDF Conversion, Demo and Export to PDF Plugin reference and rename the API Reference to PDF Converter API reference. --------- Co-authored-by: shirqa <43625458+ShiridiGandham@users.noreply.github.com> * DOC-2440: console error fix. --------- Co-authored-by: ltrouton <46954949+ltrouton@users.noreply.github.com> Co-authored-by: shirqa <43625458+ShiridiGandham@users.noreply.github.com> * DOC-2499: 7x Remove UI Bundle Cache (#3421) * DOC-2499: Remove UI Bundle Cache * DOC-2499: Use production UI Bundle * DOC-2462: TinyMCE 7.3 Release Documentation * Update export to Word config options to support v2 improved flexibility, and plugin descriptions. (#3390) * Update export to Word config options to support v2 improved flexibility, and plugin descriptions * Update modules/ROOT/partials/configuration/exportword.adoc Co-authored-by: Farzad Hayat * DOC-2482: update links and Import from Word and Export to Word service server-side component using Docker sub-section config changes to support v2. * Update modules/ROOT/partials/configuration/exportword.adoc Co-authored-by: Farzad Hayat * Update modules/ROOT/partials/individually-licensed-components/import-from-word-and-export-to-word/import-from-word-and-export-to-word-logs-on-premises.adoc Co-authored-by: Farzad Hayat * Update modules/ROOT/pages/importword.adoc Co-authored-by: Farzad Hayat * DOC-2482: update link, add note regarding header and footer styling. --------- Co-authored-by: Farzad Hayat * DOC-2463: TinyMCE 7.3 Release notes & community changelog (#3366) * DOC-2463: TinyMCE 7.3 Release notes & community changelog * By default, code is now formatted automatically when the Enhanced Code Editor view is opened. (#3401) * By default, code is now formatted automatically when the Enhanced Code Editor view is opened. * Update modules/ROOT/pages/7.3-release-notes.adoc Co-authored-by: ltrouton <46954949+ltrouton@users.noreply.github.com> * Update modules/ROOT/pages/7.3-release-notes.adoc --------- Co-authored-by: ltrouton <46954949+ltrouton@users.noreply.github.com> * DOC-2463: Notifications didn't position and resize properly when resizing the editor or toggling views. (#3409) * DOC-2463: Notifications didn't position and resize properly when resizing the editor or toggling views. * Update modules/ROOT/pages/7.3-release-notes.adoc * DOC-2463: Unnecessary nbsp entities were inserted when typing at the edges of inline elements. (#3398) * DOC-2463: Double-clicking on a math element now opens the Math dialog. (#3410) * DOC-2463: Added new option `advcode_prettify_getcontent` to Enhanced Code Editor. (#3400) * DOC-2463: Added new option advcode_prettify_getcontent to Enhanced Code Editor. * Update modules/ROOT/partials/configuration/advcode.adoc Co-authored-by: ltrouton <46954949+ltrouton@users.noreply.github.com> * Update modules/ROOT/partials/configuration/advcode.adoc Co-authored-by: ltrouton <46954949+ltrouton@users.noreply.github.com> * Update modules/ROOT/pages/7.3-release-notes.adoc Co-authored-by: ltrouton <46954949+ltrouton@users.noreply.github.com> * Update modules/ROOT/partials/configuration/advcode.adoc Co-authored-by: ltrouton <46954949+ltrouton@users.noreply.github.com> * Update modules/ROOT/pages/7.3-release-notes.adoc * Update modules/ROOT/pages/7.3-release-notes.adoc * Update modules/ROOT/partials/configuration/advcode.adoc Co-authored-by: Farzad Hayat * Update modules/ROOT/partials/configuration/advcode.adoc --------- Co-authored-by: ltrouton <46954949+ltrouton@users.noreply.github.com> Co-authored-by: Farzad Hayat * DOC-2463: TINY-10973 Split button popup positioning in fullscreen (#3411) * DOC-2463: The pattern commands would execute even if the command was not enabled. (#3403) * Fix typo in TINY-10894 entry * DOC-2463:Add Translate options to AI Assistant default shortcuts. (#3399) * DOC-2463: Fixed JavaScript error when inserting a table using the context menu by adjusting the event order in `renderInsertTableMenuItem`. (#3406) * DOC-2463: Fixed JavaScript error when inserting a table using the context menu by adjusting the event order in renderInsertTableMenuItem. * Update modules/ROOT/pages/7.3-release-notes.adoc Co-authored-by: Farzad Hayat --------- Co-authored-by: Farzad Hayat * DOC-2463: Markdown will now respect the 'Paste as Text' menu option. (#3414) * DOC-2463: Attempting to use focus commands on an editor where the cursor had last been in certain contentEditable=true elements would fail. (#3417) * DOC-2463: The listbox component had a fixed width and was not a responsive ui element. (#3408) * DOC-2463: The listbox component had a fixed width and was not a responsive ui element. * Update modules/ROOT/pages/7.3-release-notes.adoc Co-authored-by: Farzad Hayat --------- Co-authored-by: Farzad Hayat * DOC-2463: Colorpicker number input fields now show an error tooltip and error icon when invalid text has been entered. (#3413) * DOC-2463: Colorpicker number input fields now show an error tooltip and error icon when invalid text has been entered. * DOC-2463: update png files to reflect recent color change, included note for read aloud variations. * DOC-2463: Added success notification when all misspellings are resolved. (#3416) * DOC-2463: Sequential html comments would in some cases generate unwanted elements. (#3415) * DOC-2463: Sequential html comments would in some cases generate unwanted elements. * Update modules/ROOT/pages/7.3-release-notes.adoc --------- Co-authored-by: Farzad Hayat * Update 7.3 release date to 2024-08-07 * Remove the following unused template sections: enhanced skins/icon packs, changes, removed, security fixes, known issues. * DOC-2463: `preventDefault` on mousedown on toolbar buttons was causing misplaced focus bugs. (#3412) * DOC-2463: preventDefault on mousedown on toolbar buttons was causing misplaced focus bugs. * Update modules/ROOT/pages/7.3-release-notes.adoc Co-authored-by: Arvin(Jintao) Han <20640097+ArvinJ-H@users.noreply.github.com> --------- Co-authored-by: Arvin(Jintao) Han <20640097+ArvinJ-H@users.noreply.github.com> * DOC-2463: When a full document was loaded as editor content the head elements were added to the body. (#3402) * DOC-2463: When a full document was loaded as editor content the head elements were added to the body. * Update modules/ROOT/pages/7.3-release-notes.adoc * DOC-2463: changelog entries for 7.3.0. * DOC-2481: 7.3 Revision History changes - update plugin page and add release notes (#3407) * DOC-2481: Add revisionhistory_author.adoc * DOC-2481: Add revisionhistory_display_author.adoc * DOC-2481: Update "Understanding types of versions" section and replace 'current' with 'draft' when referring to the version * DOC-2481: Note that "Restore this version" button is disabled for `initial` and `draft` versions. * DOC-2481: Extract Revision object and Author object into separate subheadings in plugin page * DOC-2481: Replace `version` with `revision` and add `author` property to Revision object * DOC-2481: Live demo add author options to init and author object in revisions lists. * DOC-2481: Two release note entries for TINY-11014 * DOC-2481: TINY-11042 "Restore this version" button is now disabled when a draft or initial revision is selected. * DOC-2481: TINY-11045 Enhance the appearance of the Revision History sidebar. * DOC-2481: TINY-11073 Add labels to the `initial` and `draft` revisions. * DOC-2481: TINY-11079 New `revisionhistory_display_author` option that determines whether the author is displayed. * DOC-2481: TINY-11090 It is easier to identify the selected revision. * DOC-2481: Fix diff API heading in revisionhistory-apis.adoc * DOC-2481: Add new options and features to revision history page * DOC-2481: Update descriptions and minor changes to the options * Update modules/ROOT/pages/7.3-release-notes.adoc Co-authored-by: Karl Kemister-Sheppard * Update modules/ROOT/pages/7.3-release-notes.adoc Co-authored-by: Karl Kemister-Sheppard * Update modules/ROOT/pages/revisionhistory.adoc Co-authored-by: Karl Kemister-Sheppard * Update modules/ROOT/partials/plugin-apis/revisionhistory-apis.adoc Co-authored-by: Karl Kemister-Sheppard * Update modules/ROOT/partials/configuration/revisionhistory_fetch.adoc Co-authored-by: Karl Kemister-Sheppard * Update modules/ROOT/partials/configuration/revisionhistory_display_author.adoc Co-authored-by: Karl Kemister-Sheppard * Update modules/ROOT/pages/revisionhistory.adoc * Update modules/ROOT/pages/revisionhistory.adoc Co-authored-by: Karl Kemister-Sheppard * Update modules/ROOT/pages/7.3-release-notes.adoc Co-authored-by: Karl Kemister-Sheppard * Update modules/ROOT/pages/revisionhistory.adoc Co-authored-by: Karl Kemister-Sheppard * Update modules/ROOT/pages/revisionhistory.adoc Co-authored-by: Karl Kemister-Sheppard * Update modules/ROOT/pages/revisionhistory.adoc Co-authored-by: Karl Kemister-Sheppard * Update modules/ROOT/pages/revisionhistory.adoc Co-authored-by: Karl Kemister-Sheppard * Update modules/ROOT/pages/revisionhistory.adoc Co-authored-by: Karl Kemister-Sheppard * Update modules/ROOT/pages/revisionhistory.adoc Co-authored-by: Karl Kemister-Sheppard * Update modules/ROOT/pages/7.3-release-notes.adoc Co-authored-by: Karl Kemister-Sheppard * Update modules/ROOT/pages/7.3-release-notes.adoc Co-authored-by: Karl Kemister-Sheppard * Update modules/ROOT/pages/7.3-release-notes.adoc Co-authored-by: Karl Kemister-Sheppard * DOC-2481: Clean up code example * DOC-2481: remove duplicate admonition * Fix revisionhistory author xref * Add "for more info" for revisionhistory_display_author in release notes * Update modules/ROOT/pages/7.3-release-notes.adoc Co-authored-by: shirqa <43625458+ShiridiGandham@users.noreply.github.com> * Update modules/ROOT/pages/revisionhistory.adoc Co-authored-by: shirqa <43625458+ShiridiGandham@users.noreply.github.com> * DOC-2481: Add revisionhistory_display_author to revisionhistory_author partial * DOC-2481: Move Spell Checker below Revision History * DOC-2481: Update the release notes * DOC-2481: Update demos --------- Co-authored-by: Ben Tran Co-authored-by: Karl Kemister-Sheppard Co-authored-by: shirqa <43625458+ShiridiGandham@users.noreply.github.com> * DOC-2463: typo correction. --------- Co-authored-by: Karl Kemister-Sheppard Co-authored-by: ltrouton <46954949+ltrouton@users.noreply.github.com> Co-authored-by: Arvin(Jintao) Han <20640097+ArvinJ-H@users.noreply.github.com> Co-authored-by: Ben Tran Co-authored-by: shirqa <43625458+ShiridiGandham@users.noreply.github.com> --------- Co-authored-by: Daniel Oakman <141111365+danoaky-tiny@users.noreply.github.com> Co-authored-by: Farzad Hayat Co-authored-by: Karl Kemister-Sheppard Co-authored-by: Mitchell Crompton Co-authored-by: shirqa <43625458+ShiridiGandham@users.noreply.github.com> Co-authored-by: ltrouton <46954949+ltrouton@users.noreply.github.com> Co-authored-by: Ky Eltis Co-authored-by: Arvin(Jintao) Han <20640097+ArvinJ-H@users.noreply.github.com> --------- Co-authored-by: Karl Kemister-Sheppard Co-authored-by: ltrouton <46954949+ltrouton@users.noreply.github.com> Co-authored-by: Arvin(Jintao) Han <20640097+ArvinJ-H@users.noreply.github.com> Co-authored-by: Ben Tran Co-authored-by: shirqa <43625458+ShiridiGandham@users.noreply.github.com> Co-authored-by: Daniel Oakman <141111365+danoaky-tiny@users.noreply.github.com> Co-authored-by: Mitchell Crompton Co-authored-by: Ky Eltis --- .../live-demos/full-featured/index.js | 20 + .../live-demos/revisionhistory/index.html | 90 +++-- .../live-demos/revisionhistory/index.js | 210 ++++++---- .../color-picker-error-message-hex.png | Bin 0 -> 49977 bytes .../color-picker-error-message-rbg.png | Bin 0 -> 43622 bytes modules/ROOT/nav.adoc | 6 + modules/ROOT/pages/7.3-release-notes.adoc | 369 ++++++++++++++++++ modules/ROOT/pages/changelog.adoc | 32 ++ modules/ROOT/pages/exportpdf.adoc | 2 +- modules/ROOT/pages/exportword.adoc | 4 +- modules/ROOT/pages/importword.adoc | 2 +- modules/ROOT/pages/release-notes.adoc | 6 + modules/ROOT/pages/revisionhistory.adoc | 71 ++-- .../ROOT/partials/configuration/advcode.adoc | 62 +++ .../partials/configuration/ai_shortcuts.adoc | 51 ++- .../partials/configuration/exportword.adoc | 60 ++- .../configuration/revisionhistory_author.adoc | 24 ++ .../revisionhistory_css_url.adoc | 1 + .../revisionhistory_diff_classes.adoc | 4 +- .../revisionhistory_display_author.adoc | 21 + .../configuration/revisionhistory_fetch.adoc | 25 +- .../revisionhistory_fetch_revision.adoc | 8 +- ...-export-to-word-api-usage-on-premises.adoc | 4 +- ...port-to-word-autorization-on-premises.adoc | 4 +- ...port-to-word-installation-on-premises.adoc | 2 +- ...d-and-export-to-word-logs-on-premises.adoc | 2 +- .../partials/misc/admon-requires-7.3v.adoc | 1 + .../plugin-apis/revisionhistory-apis.adoc | 3 +- 28 files changed, 888 insertions(+), 196 deletions(-) create mode 100644 modules/ROOT/images/color-picker/color-picker-error-message-hex.png create mode 100644 modules/ROOT/images/color-picker/color-picker-error-message-rbg.png create mode 100644 modules/ROOT/pages/7.3-release-notes.adoc create mode 100644 modules/ROOT/partials/configuration/revisionhistory_author.adoc create mode 100644 modules/ROOT/partials/configuration/revisionhistory_display_author.adoc create mode 100644 modules/ROOT/partials/misc/admon-requires-7.3v.adoc diff --git a/modules/ROOT/examples/live-demos/full-featured/index.js b/modules/ROOT/examples/live-demos/full-featured/index.js index 6a378a119b..46b7d6cf88 100644 --- a/modules/ROOT/examples/live-demos/full-featured/index.js +++ b/modules/ROOT/examples/live-demos/full-featured/index.js @@ -149,6 +149,11 @@ tinymce.ScriptLoader.loadScripts(['https://cdn.jsdelivr.net/npm/faker@5/dist/fak { revisionId: '3', createdAt: '2023-11-24T22:26:21.578Z', + author: { + id: 'husky', + name: 'A Tiny Husky', + avatar: '{{imagesdir}}/tiny-husky.jpg' + }, content: `

TinyMCE Logo

Welcome to the TinyMCE editor demo!

@@ -184,6 +189,11 @@ tinymce.ScriptLoader.loadScripts(['https://cdn.jsdelivr.net/npm/faker@5/dist/fak { revisionId: '2', createdAt: '2023-11-25T08:30:21.578Z', + author: { + id: 'tiny.user', + name: 'A Tiny User', + avatar: '{{imagesdir}}/logos/android-chrome-192x192.png' + }, content: `

TinyMCE Logo

Welcome to the TinyMCE editor demo!

@@ -225,6 +235,11 @@ tinymce.ScriptLoader.loadScripts(['https://cdn.jsdelivr.net/npm/faker@5/dist/fak { revisionId: '1', createdAt: '2023-11-29T10:11:21.578Z', + author: { + id: 'tiny.user', + name: 'A Tiny User', + avatar: '{{imagesdir}}/logos/android-chrome-192x192.png' + }, content: `

TinyMCE Logo

Welcome to the TinyMCE editor demo!

@@ -421,5 +436,10 @@ tinymce.ScriptLoader.loadScripts(['https://cdn.jsdelivr.net/npm/faker@5/dist/fak } ], revisionhistory_fetch: fetchRevisions, + revisionhistory_author: { + id: 'john.doe', + name: 'John Doe' + }, + revisionhistory_display_author: true, }); }); diff --git a/modules/ROOT/examples/live-demos/revisionhistory/index.html b/modules/ROOT/examples/live-demos/revisionhistory/index.html index 8f8c1bb3c9..06069edad2 100644 --- a/modules/ROOT/examples/live-demos/revisionhistory/index.html +++ b/modules/ROOT/examples/live-demos/revisionhistory/index.html @@ -1,34 +1,26 @@ \ No newline at end of file diff --git a/modules/ROOT/examples/live-demos/revisionhistory/index.js b/modules/ROOT/examples/live-demos/revisionhistory/index.js index 90001a6d42..4b8566497e 100644 --- a/modules/ROOT/examples/live-demos/revisionhistory/index.js +++ b/modules/ROOT/examples/live-demos/revisionhistory/index.js @@ -5,20 +5,31 @@ const getRandomDelay = () => { }; const lightRevisions = [ - { - revisionId: '4', - createdAt: '2023-11-29T10:11:21.578Z', - }, { revisionId: '3', - createdAt: '2023-11-25T08:30:21.578Z', + author: { + id: 'tiny.husky', + name: 'A Tiny Husky', + avatar: '{{imagesdir}}/tiny-husky.jpg', + }, + createdAt: '2023-11-25T08:30:21.578Z' }, { revisionId: '2', + author: { + id: 'tiny.user', + name: 'A Tiny User', + avatar: '{{imagesdir}}/logos/android-chrome-192x192.png', + }, createdAt: '2023-11-24T22:26:21.578Z', }, { revisionId: '1', + author: { + id: 'tiny.user', + name: 'A Tiny User', + avatar: '{{imagesdir}}/logos/android-chrome-192x192.png', + }, createdAt: '2023-11-23T20:26:21.578Z', }, ]; @@ -38,89 +49,137 @@ const revisionhistory_fetch = () => const revisions = [ { - revisionId: '4', - createdAt: '2023-11-29T10:11:21.578Z', + revisionId: '3', + createdAt: '2023-11-24T22:26:21.578Z', + author: { + id: 'tiny.husky', + name: 'A Tiny Husky', + avatar: '{{imagesdir}}/tiny-husky.jpg', + }, content: ` -

The world’s first Rich Text Editor in the cloud

-

 

-
Have you heard about Tiny Cloud? It’s the first step in our journey to help you deliver fantastic content creation experiences, no matter your level of expertise. 50,000 developers already agree. They get free access to our global CDN, image proxy services and auto updates to the TinyMCE editor. They’re also ready for some exciting updates coming soon.
-

An editor for every project

-

Here are some of our customer’s most common use cases for TinyMCE:

-
    -
  1. Content Management Systems (e.g. WordPress, Umbraco)
  2. -
  3. Customer Relationship Management and marketing automation (e.g. Marketo)
  4. -
  5. Email marketing (e.g. Constant Contact)
  6. -
  7. Content creation in SaaS systems (e.g. Eventbrite, Evernote, GoFundMe, Zendesk)
  8. -
+

TinyMCE Logo

+

Welcome to the TinyMCE editor demo!

+

A simple table to play with

+
+ + + + + + + + + + + + + + + + + + + +
ProductCostReally?
TinyMCEFreeYES!
PluploadFreeYES!
+

Found a bug?

+

If you think you have found a bug please create an issue on the GitHub repo to report it to the developers.

+

Finally ...

+

Don't forget to check out our other product Plupload, your ultimate upload solution featuring HTML5 upload support.

+

Thanks for supporting TinyMCE! We hope it helps you and your users create great content.
All the best from the TinyMCE team.

`, }, { - revisionId: '3', + revisionId: '2', createdAt: '2023-11-25T08:30:21.578Z', + author: { + id: 'tiny.user', + name: 'A Tiny User', + avatar: '{{imagesdir}}/logos/android-chrome-192x192.png', + }, content: ` -

The world’s first rich text editor in the cloud

-

 

-
Have you heard about Tiny Cloud? It’s the first step in our journey to help you deliver great content creation experiences, no matter your level of expertise. 50,000 developers already agree. They get free access to our global CDN, image proxy services and auto updates to the TinyMCE editor. They’re also ready for some exciting updates coming soon.
-

 

-

An editor for every project

-

Here are some of our customer’s most common use cases for TinyMCE:

+

TinyMCE Logo

+

Welcome to the TinyMCE editor demo!

+

Got questions or need help?

    -
  1. Content Management Systems (e.g. WordPress, Umbraco)
  2. -
  3. Learning Management Systems (e.g. Blackboard)
  4. -
  5. Customer Relationship Management and marketing automation (e.g. Marketo)
  6. -
  7. Email marketing (e.g. Constant Contact)
  8. -
  9. Content creation in SaaS systems (e.g. Eventbrite, Evernote, GoFundMe, Zendesk)
  10. +
  11. Our documentation is a great resource for learning how to configure TinyMCE.
  12. +
  13. Have a specific question? Try the tinymce tag at Stack Overflow.
  14. +
  15. We also offer enterprise grade support as part of TinyMCE premium plans.
-

 

-

And those use cases are just the start. TinyMCE is incredibly flexible, and with hundreds of APIs there’s likely a solution for your editor project. If you haven’t experienced Tiny Cloud, get started today. You’ll even get a free trial of our premium plugins – no credit card required!

+

A simple table to play with

+ + + + + + + + + + + + + + + + + + + + +
ProductCostReally?
TinyMCEFreeYES!
PluploadFreeYES!
+

Found a bug?

+

If you think you have found a bug please create an issue on the GitHub repo to report it to the developers.

+

Finally ...

+

Don't forget to check out our other product Plupload, your ultimate upload solution featuring HTML5 upload support.

+

Thanks for supporting TinyMCE! We hope it helps you and your users create great content.
All the best from the TinyMCE team.

`, }, { - revisionId: '2', - createdAt: '2023-11-24T22:26:21.578Z', + revisionId: '1', + createdAt: '2023-11-29T10:11:21.578Z', + author: { + id: 'tiny.user', + name: 'A Tiny User', + avatar: '{{imagesdir}}/logos/android-chrome-192x192.png', + }, content: ` -

The world’s first rich text editor in the cloud

-

 

-
Have you heard about Tiny Cloud? It’s the first step in our journey to help you deliver great content creation experiences, no matter your level of expertise. 50,000 developers already agree. They get free access to our global CDN, image proxy services and auto updates to the TinyMCE editor. They’re also ready for some exciting updates coming soon.
-

 

-

One of these enhancements is Tiny Drive: imagine file management for TinyMCE, in the cloud, made super easy. Learn more at Tiny Cloud - Tiny Drive, where you’ll find a working demo and an opportunity to provide feedback to the product team.

-

An editor for every project

-

Here are some of our customer’s most common use cases for TinyMCE:

+

TinyMCE Logo

+

Welcome to the TinyMCE editor demo!

+

Got questions or need help?

    -
  • Content Management Systems (e.g. WordPress, Umbraco)
  • -
  • Learning Management Systems (e.g. Blackboard)
  • -
  • Customer Relationship Management and marketing automation (e.g. Marketo)
  • -
  • Email marketing (e.g. Constant Contact)
  • -
  • Content creation in SaaS systems (e.g. Eventbrite, Evernote, GoFundMe, Zendesk)
  • +
  • Our documentation is a great resource for learning how to configure TinyMCE.
  • +
  • Have a specific question? Try the tinymce tag at Stack Overflow.
  • +
  • We also offer enterprise grade support as part of TinyMCE premium plans.
-

 

-

And those use cases are just the start. TinyMCE is incredibly flexible, and with hundreds of APIs there’s likely a solution for your editor project. If you haven’t experienced Tiny Cloud, get started today. You’ll even get a free trial of our premium plugins – no credit card required!

+

A simple table to play with

+ + + + + + + + + + + + + + + + + + + + +
ProductCostReally?
TinyMCEFreeYES!
PluploadFreeYES!
+

Found a bug?

+

If you think you have found a bug please create an issue on the GitHub repo to report it to the developers.

+

Finally ...

+

Don't forget to check out our other product Plupload, your ultimate upload solution featuring HTML5 upload support.

+

Thanks for supporting TinyMCE! We hope it helps you and your users create great content.
All the best from the TinyMCE team.

`, - }, - { - revisionId: '1', - createdAt: '2023-11-23T20:26:21.578Z', - content: ` - - `, - }, + } ]; const revisionhistory_fetch_revision = (_editor, revision) => @@ -146,4 +205,9 @@ tinymce.init({ content_style: 'body { font-family:Helvetica,Arial,sans-serif; font-size:16px }', revisionhistory_fetch, revisionhistory_fetch_revision, + revisionhistory_author: { + id: 'john.doe', + name: 'John Doe' + }, + revisionhistory_display_author: true }); diff --git a/modules/ROOT/images/color-picker/color-picker-error-message-hex.png b/modules/ROOT/images/color-picker/color-picker-error-message-hex.png new file mode 100644 index 0000000000000000000000000000000000000000..c53a5983795654860e62272004529df2e7e93f67 GIT binary patch literal 49977 zcmZU)1yozj)<2B9JH@3)fndeGP$&*9#a)V9aCdiiD-_yd!QI`V#odCtBshQi^m*^S z>-)0S$(fv)J$q))o-MyKiBM6J!9;t71_J|wDf>a{BMb~|^2^1Bg7or)9VV3m1_rIz zQc_YyR#K8$1!(`p(#8x1=0ikEDzaMA0-pcrb4ge*QFHQS))kSs917djs!cGxI1?ul zT=;x^AEBnIl$5yM)O#GnIk>?$a9=ew5m;sswFr`3stn=5kDW9}Cqk!fmpj?FyFy7# zPUa^~eC9CJNt$pHXsnpxZ^ZOSHo?*{k+B7v(y&o@Gx(G5$5(9qvFF*|Dg4?LK1=3e*w+`R_uk8rBiL^aMmHB&k}X?-h!X1((4LH?}s@skv~*B*_W z9D!#TwK|?aO~5u!yYbEdA_9OTj+E zP7o4)xO>sIOa#3qfaYdG(tJG>&KIwGIqV%z%lht`yzh+1YndEv$tzk0j1?OB_2W+% zR^{XI=wo+_-6I|?NeedX_6I|Bb;;;Od+1Y@C*k0cKuC~IGIyFaR+wK+TKhGM9J461 zs2->h`)Yz0&5ddddA7~TR+e^_n4L#DIUQ)HNIR?4Mg9g?wjh~`vo8p_fV+2zuojds z;)0e_CHAQPYHTnR9X0Q}qdllRAwjTG+f?FMOzB-3AcXo(+(tO;b$B=ll5nI_ z7&7`mHEM(mYGfPO+kBiO1TS$!eiW=AZ3nn)xUqHNJs6En%t_>vKp8`vXnzeuIB%Fw zI0zfmTv7qaG?*WVxk6cKUTtG|i2JIb5McJbL&c%OlMt9x|Bmw};7z`y3dI$-GuDBB zg~a0|yamdupw)KOe2%daulw4p+MpWr-ErFdEs>(c zrzr*tnOZ(U@-gYk_x4i61uTr$xj?oYK?N*U}%o4t(v7m-Tx1wUV4}3Q6LP zLgH)E1d<{`dR$B7eWo8dSN>PA3Jiw{dPAJs&KFofid(!}=G!Ft_rKH9v>_ z=sn~w>Ifv{G$H|Ya&L5gDjd{KEBS zQO*o&uEJ`5EfFnjtyr7fBclcR>K+1u_gUTfAZ8tA8KyL5I-sV2k3g|*qHe)5YLk8w zs)v?`^)1RR>#f`^`b7{L6QT%W@w>=(Ro%=XUT6jcGX(pQx_!ryn2`+xVsF?~fuA?u z5Hj(+S^0eTRpB#4MM-`2+j7~16k@q?5nfs151=@>diVyf>2<99ygXWJw)TYzp*qh; zOjW%~Pt7_Rmye2iWAcjm^~%SIi;c~J&841+oHDaw}4$+%w zL?V2%pBBfK757|ckLh{>ssg4?Vu4T~yTj>q{51;n`6Oyd&fbW_mnF~rK<3fBJ7< zzeK9(fgHoER+7^(7AY3`&hi)l2HIkVFTkdO3y~2S_4%?v14sLBPs3#?bLv0JZYw`4}Mpr&kxRtZf>s+i>I!_z=B&VP2)?IXWp1bUecQ!s zlJ)wuTAVPZpJm;E(?D;3%QGk3Ko5PK z9V{>Ru=2>d4DGnQs}MEdGD!FH%i5|BS}W|>^;v6KvAS27xIjq$j0|_e+bG8=u9H;lv`(7DA`cj zMA+?%?K)M|%v4<;u@`rci&T2FUj#mcZ1NiG=r4`-9YrM_2SUzcgJUB6x%&N%ek z4`R$-KksVq_Dr33#0o$EYd|D4xqJbB{CPeNqK2)lkTc~Rsx>BqfTX~ z;EOc6N`%Vd{>$h1+ropou0w9W=BEX2TprE~>6k^j?-+6Oz%6I>z?U> zK;_{)E3x0AZhjFD7shX#Uh(NY&74^u@~zp&nSV6@g1|~+ZATzZgElY#e+FTK*|vaT z@`1rgo0$0J1UEME?1b=yKQXc7WQ;B@DFjnPSBPwEjXNW$hBrm60n@DuYh(6$Hl)eT zPCAcJ44>YWkdAA4cW8w7OgSTO?fD~Aj4gf43iHYG88K%T39)mc_~<2YRX5X={i3J{ z^X8?D0s|Xn34`!bf_=GOy<9Lb@QI-?$S-%imrE)i?*D3Glk?&KQ)c_qP~wxMtnADE zlL^qw%+ATe-kBzpWbLJ^SxYrdXH7)~K@)phfRU-au^GVK*5MBcjIg`lOVQTM*@)WR z*2d0B&|QS~pB92I}jY_y~-ZC}Lm!b6msgH!mQ_W!?{|8o2vO3nXLzU6rPzm)$|^Z%v% z>|_R%w6}d>=`8x+mHC(We=Gkb6lVW3^Z${=Uorpl^hM61Xu|COSu;^I#aa(}7#MLF zSt$uMci1Bz0%xv84WSsWowOW`V(G4bNX zsG3B`zJ2P)^D0A0wU~Zzo&Ju2GRlE5`ruXGHrI5&>b3@LgDQGZjS5`0wJa@K=XtFz zJFT`sQ+Sr@ZI|@Fy2#BCXsgd+yqVGFs{Hzs_9j>|fME%x7T1Cf6c*E&`ScVja0cNN z8Hsn=r4QuE6_#(~St_TgQ`)d&sQ)%2agn(00g}hV46Hka7aMyWWP&<2C!HT7P8L8x z9`O3h+Us{LOs{MhQg?HZh4zM{qtJ+x1$W1*(np*5og1~yCV#gtNM1*aR@8ifb2%%n zdto~%ZMZ=PdbrBd2q&Gak_o-)cn#s0Pwm5G`l6{eYZJwt%(Z3wvBdt(%)#fAcU$Ke zC!h;J9^Ljw;4X;ub3xzY-@#v@^iH?EwJ5eQ&h(&hFdQaVI|wf}31yDW4uv9`<@T8Z z5x*0*Ox`%J_N7!KD8+LM8z#rR+PqeNViEdMk>GFM_`b^z(y z4IWOO_OJ6F*h_SuGA$)Gq*iP_k9>jL0x521zGdc$eA218YV~Pp4~n)g^Usgz46#M% zH}^Z~GiCDVpPBbUzgru$C}Xao#4wfzW8`zl5T%$AClj)fWS_NYb^I>FpZPAg`;JkF zugoH8Ts97*SpSb8*Sk64EEPXcP@Xerd}L!R+gA8FFg67(NETvzq$D$Nz#*&c`pV@Z zu@U?-9@di+<$a3UOO0~$#FA5Dmusa8X1x#V|0;vS6nQ`w>l$AYq1DB_dwN}PM;zkv zxVp5=lt;e_v(XNs83-lZ_$c~YOUWs>U(PeW%$ml+U6c$Wb1Z%;t~qh;^iHrc-dkm| zfIkv)y+C0V;)Wi^C|ySM%%I9>ld}?SV1XC67Y4564U^`5#Vo(QH@m_xbDk1sU_7+z zKT&|rd?4OS4I)smI$qi9Rt+HJEx4lbv4&eF|FdAVxSI1Q7$p!h!Czf0poU2);Z)Rt zD{qGklSuaEuH(k`iOV!SwNz~t{?~3LhrKW<|O6Qw-V z8!0uegp%egC=T3W6nnxq*5(i;piOfT#%{|X3)cKbYWbDHEiUNr`(M>0lj+? z=bAi*Bk=^134R4z%D;yNfw8R2y+V@7GrBL z7^7~*ZZ9@B-Kj6TKe93Ga^o2g*&IezCm!qm#MBipweC)WkyX4Y{;Q*g*D?OeXH%8A zum)=qrMo}n--oCx`#WKoB;+}sRF^-`j9-l_FpTR?whiM6_*Ct{Jy4>VZ`*0RIxU~% z3$Pug-(eE&;|m_lIUu4^ww3w^bgbPT{mVilR(y18>orMs?DquN3j6+T z%5}k+ED=2!HDZ{6x#_2G zs72vrsFi>{vXstF+k^O;oxy*w!l_!|`+&4y8*Ji9vF#(a%^lg^chj*bfetU@Lj?+D z_W9_)hD7(fjK7m>PGf1e&rkKt1tITj)nJoRs&GvOj19m3oU8ROPrbBUy5b*K4X2MW zz=7%I0&{b+6#Q%q(?T-W+zHkQeB$%jr=F}r^vB+@du$lm`RO8fl~3Ur;Vvb_mePMU z2M|p+S&lE7v+I*zvc$1nY|^6A08+W+NDZ~4k>FLlT~;v)xB`D6PVIu<*SS3DcfO+xlN)=8iCX_2u{}*8O|d zChnN1G;K#o%SKetzP8#sGS)W;z3;db&A~(R2I^VgJ~kW%cJB)){;C+SPxrS61}x}9 z^cpIT>gM!k6O0z7gZ@>U7aOTW2HQGc&!TKL;;}o^Clw{92iNFo0h=I2eCKI@kgF*k zJ+|KDf*x7P6bGxkp_p;OZ;yP2=bZi_Kc)?{w z9qzr_#`DcbS1zo|ZHT58Y1Ksc1AVmh%LZR1cQfmYbzTKwgS8a9> zM&|)Wsw(4syc%;`-s+RHljKm&r7Lwo!f{>ugpd;8BjzV80oLwFJW@KCa$9uo9GJj!Z5 z`%#$LH61XiFq$qTH=q4i1}{N|{EIQ%6P$qVoN4`hGgtMv&|Y&8h?k1QIjRVkhCv?>*@_4J1%>vUrJFZQBhqBy7H zYZm^)ViGrA&mpnNEcm z|1hQaLdDsYtLKN*(MN@+Ad2n4uQ+BCXWc>Ba(k1l6f)xnkGGZ`tmfIbEm|8Q%YMH5 z*5EL)JK2eb(wI}-Xw`wLar;R^{<2gJ)J!ZF{0h>AdEZ$|$^J#J$Uk=-p?%rl#b5xCW)>YZ<}? z8(}vq-}V&RNk8X2Z_}7FKcGJL}<9?qgVDLYk&lL(HmvMOIb_ zqA81ovisfTh!asJT;kW5TxTKnBK z@Hg4xs@=-&@e-#@Wz2iTq-G!95No6z$KO>hE`5)3P?cU->9=WB-fCGiTCgGEw;CH6 z^ng!BoK1%mPoUOo7j||(=iQ|guazx8HVC_Y*=#sV$#YjhxCO2D`RP6dc~J|S($8g- zd!$6{B98Ss?(|thE?Z({N1bo&GnmZ&kD!RBaNQ@TlmV3*fqePuYTs&ya@a7IMd%YjmP`qn-scN{jSls_S0!)V!yo+KXTrvE((2hkCcx z65+i)#uV(S+so!?Z4$oQz<$|` z=PiNqnvAVr3h-XoYKQLOD~&_2GPgs=-fqW@SvhpX;IWd;-5fu*?-(}D+qmf<+fcUrI^?{z8`n=y9}*% zIh?(iFQls8eA>xWwEq(;UPpH(QQo7tBB6(865;o4uQlO8Taclmnw>ii9ZxgtVLw&? zQI3QGM+7ABr4|zBFt}Ai^1Z=IVO}1d$*>uwq>qPd53aW+SyyS+2Db;y;ADI6mem%R zCn7(GE#P#{iQd!cfaqsR?`N-Trq#1qw`85wBL?tIns6Fl-ic?)QffH_{mVedUGK#Q z9r5Yai^a6GQho6AAbCpq^pvl0)B>{D!|98Oda`VqTR9aDcpSj?4sUO0f4XTF*WUt_ zrubE5*GveMY<8S|tGsxcOnN%n07pQ??+36SthMY7I3H8zC=4J=_V7NtI(}8uB0IR) zUt`8tAIsN^|Jjf~WyI0LhzPSY1{+3RkcVs67S-;ob4{!RAA-v8AK8bYLuGV=wHsvh zZ4s|L)2bv!+Yw?RXyFy^AtPzek7N5IYAi2C^9jHiX7DUX=ye;!u2bQ4Y@J-W^e%}w z+3A>g*Z~qy6Z~M7($IdZI3l!q{dBQK^;`yIZAi~{8ZQRskge5k7A!-RPt;?5H5-_i zZ>~ReXq^E--t{g^I%}=#1+Ev&Yum^Tx4K^PC!}CtTARXx=hH1>(%E9&BNS&n%ml#y9H{@q`>_12 zZbM`Lv~6Pb>M%N}A0w+F?}kt6xMo5Woat(L-uWb5MO1;5~tG|BX9E&m}cbz|&Ub5##}k z+4-cf%46u%zR$&$Sh%}1r;qDlgn?Pt?tOlbhkB)V`Rj>OMjCCv+lzHQJcIi?z6hZs zD~;l8v!J18Y`eRA@8!L4G6g+_&g**!?Rf+dQhLbQRr1$)lHDI{|PMiH{o)J)i+Y8U%jo9^}KnpELc(%qHLtMxhen2>07f zpH8ogIn|D>c-)0191BCesDN*;t=1`7nNS;}7tfs+xtQ@cTGp;1U^~~X$Mm!(MUQVj zjpr-|LUrCR-|WhMC-TD`zS~>iA=fygp1W&se}^AG<1(Z0u?ILQ@5%f2#iM@{9un;c zM5RhP0g2rB`h66AIDJ-q+PSvhDEWPkRXI1``vgLM+V9O6;c)u~Svl6n0qBSft#XFC zIc%(A5yedSoRGIpw?hJ1D5J1;J8wG9I-rd zto7QmO&>i%*rMIz1YWI@I4noCcH9Cf+Ev$kH9BgSF9YHLeoxuNm)!jBjPs>R?$%Au zbh(|&bjOm)m40CPMwsz=!kxdVYN;2(S?c;}-bKcglCf&jevI1+G9{;m$z9Ef5!Yin_?=kC@=P>eGNMBVUaM(md@8pV6RgiGPuig zR=@58)zbiYWymWl_9;S-)ybg5Uo3AP(1?n>gM3q4DY~*T*$N|oaP0mt$->K(B=(0n6RY3w1ddZ+OqeZ&+A9Qz8j zYm&BgxJR143TV*qTbCFcldjFtjI?Zos(}7y1plBu#xjPfO`gR9e#3SO0HzTTr*L4G zS>^0s*x<#-xWsnuk=y=;RC7bC{q6i1iIV~K(Y!J#X6f3Ee}ncHXa$OL6fMv?!P%Vu z2On`e1(yB`$nnCpI3Y9(bo?%!n@FER{8s#hK4&Ol+UWZZ-?#sxRv$oN6)?vRgm;>y z(DanhN;M1loCdb_{~Nv5;?BF!fvk7z08C#~b?q3x^sx>6-uzFT-H4m+0w7ibYR8$2 zNovJfYKQFnagG0=fiq%om!s#OKsD@4rGEU{*#F7A0_Y}*k`b|dSyuiwjQWLAiwORD zWmE5C`By4%GKR&7W=FtzQiYb zFVnR+S*=1eOFOouv!eq!Nw4dy-Kl$Q(@|+*32fu|_Pn7#viG}R5-Jfl`G-}kxQ@z! z%3JVPUbs_VXv+wuokI}tYDy+8?_rzq;gRwKE7M%d>NVPC`5&ATbSdrM5!PKpwRAS8 zQeA70vm*wR7`rCEP(S9oo!kD7q9YEtFJHGNw&tO%XtJ1q+etcjUFr8&?YPwsjF8tg z4m=p;o~SiIYcuU49d)VnT8VIfffO3Q$8_5Jwj_vs4>5?F!TzGUYhO5jTGW~4{Inzc zAdM#3-ZiUzM?tXNYgosfOcKrj(55?^^Lw0oiI;D>_lyHY`e=jr9sUl{Njg8L;3(VC zhPBiN!J!f%tpQS>_bGSwPr3ozD+o)?dw$scO+B_Iy-v#w*Rq9Sb~jZ|7K)oTbkt4i zCpuq|yI}u&t2#^U!RZ#Rb;y^T7t3lw@7-Y zah@+e%?@SD+O>iULVJe9(sz=OeIWzfGxMsGJ7ZZdkU-9ETA5pN8TfP-w-fy1C16Xz zB;!4rZN4PX*$b>*@r|NHUUkjduU~TECkHPXWu+w{6V&9la6g>5V!VsQ-xl8H5i>zm z{(4Lbj{_6IsCxwe5FHxa#m_sn+snw|^uhlTwTw{^7j{!_*?}gMK)5?JxNgO2gHnA( z%uS<}MIYZ}-*ix-`NCL%j&JUV9{nn887hzVH{-7};l2_*+`~$e)mm&`b_?dw_(8sp zDJ!U>4sb-j1bz|qmDFa}oZum+8Duxrk$Vn(^sTMx==jhvEMYxtX>P-I2ypbMiJnfJ zOW%Xo$|byBam|0p3Y*2am*nwIlh?J(b3Q{Btt)|5QF_t9l6c<4m6r@f*Fj>T+DyLd z(!CQF`KbOy3fg;tf!qX7HHDhy^sO8AUY$*7zP}Gy4nep<9X&U}8~hx!MCLS;_yag} zSQCy)#=UDv`e6cBhYADMc0H>ksy-mQ8&-8_knbrmNG}g5Dg@D~L-+Is$CT|F7m{B* z@Tmhs!eHA9R(zF&Dv$W0kX@SuCU$X3CO$Gqm`AC|ZB)p_h_=OZPo93m1D!;5npC4L zeiQrdL!8f&K34My#R#(4Q_4ljT!*E=(}w(R$_?`5O1h<<>N1mwps2QpBJk{(||)sy8^kf5~q#9Fap7FzDajC*nQBw|QX zn21JtEys_|&p8Ynd8R&ahl+1PH;ZtpiMg>BnUO@#APhfovl&K4=dz0M%qxuSI@2iR`7LS5wq;dDI3Ke#v5-EvU<@XZgGk=<^6wwujS;@|} zc1q>7wx0@pYC1pXD!Npa6>RDsh*FseOt@lMJ&6E2Lfc=QKeiIPpW`9?u$PiZ$HQL3 z(nt!nwsq9dDmebyJjH7n`W@I~?%Q|4Z#ByJe$yz1l+SwDQ*x7nUCIBwDP`7~UTv2d zAUmVhb%QFv2fEUb?E_h`l^_*OaX;k55&=*$@a)gkU`GK1IB^*0pl(rEKH;2moRdDB za=wxdT=2YS`rLUuH@&G&j90phm%%4I-oT&N$&#dx>GhovG6K~!my+iNZ*d$&{N|_- z>N;Tt0_bLmDRzo8!<8>QwEK|sb@2rvdN`*Bv6q|5gT3Gs7cMS@)@sRtL)WdN*UD7)$~p>mpDUi?lZHKe&izso;;E9U zbyb(e7b>FYN`S;G* zv7RXVy{jGh=RyXZH#fNb2XrF`wyGKt^j&BYq>RY!dS(~Yz^ZJ$@FvDzJ2d%+4yP$f zfW_NE_+y8C{Aw+SCgmdCVWtyqt*0gTjd=oLeJa$Ag+$0EWdI*o-nI*71Dd2w93+Q> zWVq%Dp=f`e?XR$S93NhruYL17)dz>~>Xwk-56`8Pko)8TS2H@+MUv$8?;+sOi5p`r zzq7iG0dI%+l8+f&_BDuR?h~esAcdF-ozjgZl(KeQ&9lH?igu5Eos4#h9NF~0w!2KI zc&Yl0wuWVCiWpGtdP+h%87Bu7-5u2|2@|!+v;fgWXs8PS#QQICrRa zQ1i@=*;DMEL(V;^Yl!YOug{t=14*)Q0nPDwoC^N%a@!yGuXGJO!Q$gE>;QJP9|1r* zt7Esbx?v-1cRf!)8-taz()U~(%W;Wn58nFx-q+F{XCYBpz7S;DU(DwoKi}HCWd4G1 z=z1#7pD2^ObN6^|57Q@H`;D;t$NC1P)A18zZ#bq@)E3zEFU$dK7FRRb%#YQLTgM7P zE{;uoJ}QHiPyXoG*DMc5TPUIPoh;Z~P#%-$Zj(U?+|swp$j!L0q2ci$FggVW9IQ|m zPba*jFal;n!KQx0<-k0*DZcgQnYP@O?zuO&%NYW&G+#K{lmw9fvm8V$?A7c|oafv7oueT9er$`c=#Vx>rx@h!Z-EVhgyL2~$w zfgc>b+j`7kRq&l@SQDm40=g{ar|-r=p&BUx=Yn=P6OB&zQ5r=kQSeD`m_Px&L1c6L z98{kBPkZ*=XEQYm!-Q!auf~fg8a%AWeg^r6+7^v`>2%UWj@KR}4)8BhliZvL2{S3{ zR*_@GJgOB{;!wekd9vyZ5EGFNmZ}&~TcXRs)}lyL+>?OK{_&x7DVFY-4(0&4s>aUY zQ+pjRoYx5otFwgGT~Lgx!jgoDV_tW*uX=tX)xD;B?algrksaRe&od#a%Qn;N@R|;c zI-bYyoUz0u9I5@fQL~-`p|3zwMRV^NjZq3aBC{ep7E3af$=%6EgqJ}2-9cfT>jjJo zb%nVdBbelS5@FDX@9Otl-=n)|pIZMnHtQ3*#viCj|0_$UYD!kW!$>2tE?A%H(%1T7q z%NpEZ#(o1pWKs5B_bnqM2G{);KhxSk%hyT`Y;oS*+{5Og&_2}6Kj{Ig!An3iNC$ec z+2&0AvB#>!sE2yF96wJ6ymD+FI!_rYy>Yx)-9ZhibocvMO1Fo>8js^*0p*TTtpRj9 z^rvFWo%=LoC!N1S_zA49B7q94_g3VRjUkd{ADa%6p-Zq(2eJsRpV*f0YL%Ia1 z28f1z^-qS;xDer=`;lZCp@6uU2ptsZOm9X&( zdQWH5ON*t&SXCrMjJ1YUs?jnU;e7)$%>Uvd; z9EK%c%3G(ifA9k5`Z*6=fGcykbb$FF3ti~q9FwxwX5q*q<ge~Es{*e1?8NR5M2aK zbbC!&?!$M~MV7!K6Ko_Jy(x#A@nFJ(u}3b)nlXct}rB(cprfqS0y0Y3Xd!{v64 z+aEzh)^we?ntOqprx%fk-LcynUjyM=auJ#AR%VMf&h79fO~pGLc7pSw;`zH7bL|2S z)+BMU88Zh{u#~``b{dVp2Zh-T9mIvuJnSKB_l*!y;+?aW?0<5od!~j%id#R^Y|!M2 z)$C=)Pjv^IM|;zBZH0VS<>UA0-^;OKTNtVL0D;5Q;p|?l|J8ZXNAsK^sO0{(C?qj^6nV&=sSPO&@*aozY(KHM!gw? z6&D2AbYfjuNn`L*EnrcQm!W$pU{g7e;CRt#9hWe2{5lMJSPuf|XM#x2g!_A5UP7ae zDs+#l6nl^NvilcstW6A{8i1gvJ0LzjAF3=7cZ+L-N?;TQ=%cuhx84dfZCl+8pCb9xOz9=hNRZ-&X- z7Y4Vasxd-2wqK14B?;Uov2bph7%TpWJb;=i9yQMJ$*xbOr(KOl7$&0*J#jG`4^`fE zs|lSggpP+k6z%F3GgFeFy*4ycBio>!dnq{!nl=Y>=$2D5C(}uR@R=yo^cTDD^&zlZXHE6Q`Cey<{o*)# zZL|mTey(l*ba;#EIv$e3b}7Q+_13chJrdxt0Xif~c%m=Y*h}P}_h?;`jvCS|8(7$C z5H`WV-fikd?QoBfVBM^X%b0LR*N6u8Mp2&-&WNIsWoInC!xv5=i`@KW#F*DO9rkJ@ z{il#@U;0Ovo_xhK)I!bq?nD?)5u7=bcu5T73v8!u`>%8udXE>HchB#_w)&#rNGqQv zscsHNZmH8-_OrYbve|LRj3@NU7=$;wpv?Ay`#Ipkyc_4H%j0LzotxCHo6w=aVOh<{ z%8B`y^m#fJ~?!x|msAB3AVH99zb@Wui=x-vLElq$2jH6E7_>kDnLg0Jm;y*#=LsjS5IYA47= zEGI>L5Qy&ZJH;ONCk|NL$VXj_s?5K&e{BfD4>K1L3J((9LBAvXZA>GatK0jN%5z&j z5?NsKFbn1<#U;A&hDoe@xB1rz3P;~Z6yt!y8SavYJ8>hhM7tIJirT69hgh9WqC8;f zTMURtIB}k-pRTu&szRc0m&PrdrpvVqUKOX$9@+etey7ckyoU&kJ^_*mMma}hzx%Yz zHudo~%MM|PCl$!<6%~n-31!6|Z+U>$K z#c3x>n*{TuL6q?Y9LDHd5gP<1ILUw*k=`Mt8kLJ7EGL~)T@MU)n(@fd`$1=UK-|sRtn^(7r=%j>N(SbZ)_Iq0El@}AgZ_@{rJJWA{ zaACZgiJpjnR$vneb>6(45w$*f_-BQ)U%T!T$8$9fmA>q2#;eN9Dd$5mK6Q$5=sdwZ zw$Vu*KM8Mg?K9G$bWU00Ay_ls?vm+2x5X7_vUEsGyd-nuSayRLQQS*xfyv2 zH8-c$_OK;BfI<=3(Yo1u;{wK5bhzvUvX=1UUbTUnPxll>(OIZVzY`xOCGGMzL z=8Ci-Pi*JAmjiPdeO;6To;h!Uy7*++-ej_dRYUj<%0DSf`5oY2ee8(%=yRr{g8uos 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�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 JQYEDC|9_JeS=#^r literal 0 HcmV?d00001 diff --git a/modules/ROOT/images/color-picker/color-picker-error-message-rbg.png b/modules/ROOT/images/color-picker/color-picker-error-message-rbg.png new file mode 100644 index 0000000000000000000000000000000000000000..343392ad4944977d8bfe1cf2597c5e9c01a8d8f3 GIT binary patch literal 43622 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 Promise.resolve([]), // Required option for the plugin - replace with actual API request + revisionhistory_display_author: true, + revisionhistory_author: { + id: 'john.doe', + name: 'John Doe', + avatar: 'https://example.com/avatar.jpg' + } +}); +---- + +For more information on the `revisionhistory_author` option, see: xref:revisionhistory.adoc#revisionhistory_author[revisionhistory_author option]. + +==== New `revisionhistory_display_author` option that determines whether the author is displayed. +// #TINY-11079 + +In {productname} {release-version}, the **Revision History** premium plugin includes a new option `revisionhistory_display_author` that expects a boolean value. When set to `true`, the author is displayed on each revision in the Revision History sidebar. + +.Example +[source, js] +---- +tinymce.init({ + selector: 'textarea', // Change this value according to your HTML + plugins: 'revisionhistory', + toolbar: 'revisionhistory', + revisionhistory_fetch: () => Promise.resolve([]), // Required option for the plugin - replace with actual API request + revisionhistory_display_author: true +}); +---- + +For more information on the `revisionhistory_display_author` option, see: xref:revisionhistory.adoc#revisionhistory_display_author[revisionhistory_display_author option]. + +==== Enhance the appearance of the Revision History sidebar. +// #TINY-11045 + +In {productname} {release-version}, the **Revision History** premium plugin features an enhanced design for the Revision History sidebar. The sidebar has been updated to align better with the new author information and the {productname} `oxide-dark` skin. + +==== Add a label to the `initial` and `draft` revisions. +// #TINY-11073 + +In {productname} {release-version}, the **Revision History** premium plugin now includes labels for the `initial` and `draft` revisions. These labels are displayed in the Revision History sidebar, providing users with a clear identification of the `initial` and `draft` revisions when present. + +==== It is easier to identify the selected revision. +// #TINY-11090 + +In {productname} {release-version}, the **Revision History** premium plugin now includes a check icon to improve identification of the selected revision. Additionally, improvements have been made to the layout of the selected revision for enhanced visibility and clarity. + +==== "Restore this version" button is now disabled when a draft or initial revision is selected. +// #TINY-11042 + +Previously in {productname}, the **Revision History** premium plugin allowed users to restore any revision. In {productname} {release-version}, the **Revision History** now disables the "Restore this version" button when a `draft` or `initial` revision is selected. + +For information on the **Revision History** premium plugin, see: xref:revisionhistory.adoc[Revision History]. + +=== Spell Checker + +The {productname} {release-version} includes an accompanying release of the **Spell Checker** premium plugin. + +**Spell Checker** includes the following improvement. + +==== Added success notification when all misspellings are resolved. +// #TINT-10999 + +Previously, when all misspelled words within the spelling dialog were resolved, the editor displayed a misleading notification: "No misspellings found." This message did not accurately reflect the user's actions. + +To address this issue, {productname} {release-version} introduces a new success notification. Now, when all misspelled words are resolved, the editor displays a success notification with the text "Spell check complete." + +As a result, users are now correctly informed when all misspellings have been resolved within the spelling dialog. + +For information on the **Spell Checker** premium plugin, see: xref:introduction-to-tiny-spellchecker.adoc[Spell Checker plugin]. + + +[[accompanying-enhanced-skins-and-icon-packs-changes]] +== Accompanying Enhanced Skins & Icon Packs changes + +The {productname} {release-version} release includes an accompanying release of the **Enhanced Skins & Icon Packs**. + +=== Enhanced Skins & Icon Packs + +The **Enhanced Skins & Icon Packs** release includes the following updates: + +The **Enhanced Skins & Icon Packs** were rebuilt to pull in the changes also incorporated into the default {productname} {release-version} skin, Oxide. + +For information on using Enhanced Skins & Icon Packs, see: xref:enhanced-skins-and-icon-packs.adoc[Enhanced Skins & Icon Packs]. + + +[[improvements]] +== Improvements + +{productname} {release-version} also includes the following improvements: + +=== When a full document was loaded as editor content the head elements were added to the body. +// #TINY-11053 + +When loading a full document as editor content, HTML, head, and body tags were wrapped within a body tag before parsing. Since these tags are not meant to be inside a body tag, they were unwrapped. + +As a consequence, this resulted in the unintended inclusion of head tag content within the editor. For example, `++` was treated as if it were just `++` during parsing. + +{productname} {release-version} addresses this issue by implementing detection for HTML, head, and body elements. This fix ensures that head content is appropriately wrapped in HTML tags instead of body tags, preventing it from appearing in the editor. + +As a result, the editor now correctly handles full document content without misplacing head elements into the body, ensuring cleaner and more accurate content loading. + +=== Unnecessary `nbsp` entities were inserted when typing at the edges of inline elements. +// #TINY-10854 + +Previously, the replacement mechanism for `+ +` did not account for nearby elements when converting non-breaking spaces to regular spaces. + +As a consequence, when typing a sequence like "a space b," the output was correct. However, if the "b" was wrapped in an inline element (such as bold), the `+ +` remained instead of being replaced. + +{productname} {release-version} addresses this issue. Now, the normalization process triggers when an inline format is applied, affecting the previous sibling element to ensure spaces are properly converted. + +As a result, non-breaking spaces between different inline elements are now normalized, preventing unnecessary `+ +` entities. + + +[[additions]] +== Additions + +{productname} {release-version} also includes the following addition: + +=== Colorpicker number input fields now show an error tooltip and error icon when invalid text has been entered. +// #TINY-10799 + +Previously, the color picker HEX value input field only displayed a red outline and an aria label reading "invalid data" when users entered invalid values. This lacked sufficient detail to help users correct their input. + +As a consequence, users experienced confusion due to the vague error indication and insufficient guidance, potentially leading to repeated input errors. + +In {productname} {release-version}, improvements were made to the color picker input field to enhance user feedback and accessibility. The input field now includes: + +* A red outline to indicate errors. +* An error icon for visual clarity. +* On `hover` and `focus`, tooltips provide clear instructions such as "Numbers only, 0 to 255" or "Hexadecimal only, 000000 to FFFFFF." +* Voice over reads aloud as example: "Number 256. Contents selected. Range from 0 to 255. Invalid data. Edit text." + +[NOTE] +Although there may be slight variations in pronunciation and phrasing across different operating systems or specific screen readers, most screen readers will convey similar messages, emphasizing numerical values and the status of the content. + +These enhancements improve user understanding and facilitate error correction. + +image::color-picker/color-picker-error-message-rbg.png[color picker error rbg] + +image::color-picker/color-picker-error-message-hex.png[color picker error message hex] + + +[[bug-fixes]] +== Bug fixes + +{productname} {release-version} also includes the following bug fixes: + +=== Consecutive HTML comments would in some cases generate unwanted elements. +// #TINY-10955 + +Previously in {productname}, consecutive HTML comments would generate unwanted elements in the editor. For example, when inserting the following HTML into the editor: + +[source,html] +---- +
a
+ + +
b
+---- + +The editor would generate a `+ +` paragraph between the comments, resulting in extra paragraphs being generated. + +[source,html] +---- +
a
+ +

 

+ +
b
+---- + +In {productname} {release-version}, this issue has been resolved. The editor now correctly handles consecutive HTML comments by removing the whitespace before parsing. + +[source,html] +---- +
a
+ +
b
+---- + +As a result, no extra paragraphs are generated. + +=== `preventDefault` on mousedown on toolbar buttons was causing misplaced focus bugs. +// #TINY-10638 + +In previous versions of {productname}, the `preventDefault` on mousedown in the toolbar button component caused focus issues. As a consequence, when clicking on different toolbar buttons, the focus was not updated, leaving the initial button highlighted. + +{productname} {release-version} addresses this issue by removing the `preventDefault`, allowing the focus to change as expected when users click on the image controls (ie. zoom in and out). + +=== The listbox component had a fixed width and was not a responsive ui element. +// #TINY-10884 + +Previously, the listbox component was not responsive as a UI element, due to a fixed width being applied in the `CommonDropdown` component during dialog initialization. + +This issue has been resolved in {productname} {release-version} by removing the fixed width setting, allowing the listbox component to function as a responsive UI element. + +=== Attempting to use focus commands on an editor where the cursor had last been in certain `+contentEditable="true"+` elements would fail. +// #TINY-11085 + +Previously, when `+contentEditable="true"+` (CET) fields where not wrapped in `+contentEditable="false"+` (CEF) elements, the elements did not respond properly to focus commands. As a consequence, the focus was not given to the editor as expected, leading to disruptions in user interactions. + +{productname} {release-version} addresses this issue. Now, when (CET) fields are **not wrapped** in (CEF) elements, the editor directs the focus to the body of the editor first. + +As a result, the editor now correctly returns focus as expected, ensuring seamless user interactions. + +=== Fixed JavaScript error when inserting a table using the context menu by adjusting the event order in `renderInsertTableMenuItem`. +// #TINY-6887 + +Previously in {productname}, a JavaScript warning would appear when attempting to insert a table from the context menu while using both the `table` and `autoresize` plugins. This warning was caused by the `onAction` event hiding the context menu, followed by an attempt to close the already hidden context menu, resulting in the warning message: + +[quote] +"Uncaught Error: The component must be in a context to send: triggerEvent is not in context." + +NOTE: This warning did not impact the functionality of table insertion, but it could be confusing for users. + +In {productname} {release-version}, this issue has been resolved by adjusting the order of function calls in the code. Now, the context menu is closed before the `onAction` event is triggered when inserting a table from the context menu. As a result, the table is now inserted as expected without any JavaScript warnings. + +=== Notifications didn't position and resize properly when resizing the editor or toggling views. +// #TINY-10894 + +Previously, the function responsible for recalculating the width of notifications only added a width if the notification's width exceeded the boundaries. + +As a consequence, when notifications were constrained by boundaries, an additional width was added. However, if the boundaries were later increased, the added width was not adjusted accordingly. + +{productname} {release-version} addresses this issue. Now, the function adds width when the notification's width exceeds the boundaries but also removes this width when necessary. + +As a result, notifications now resize correctly when the boundaries increase, ensuring their width adjusts as expected. + +=== Split button popups were incorrectly positioned when switching to fullscreen mode if the editor was inside a scrollable container. +// #TINY-10973 + +Previously in {productname}, there was an issue where split button popups would be positioned incorrectly when opened within a scrollable container and the editor was in `fullscreen` mode. The behavior occurred because the box constraints for the split button popup did not take the `fullscreen` mode into account when calculating the position, resulting in an incorrect placement of the popup. + +In {productname} {release-version}, this issue has been fixed. The box constraints for the split button popup are now correctly calculated when the editor is in a scrollable container and in `fullscreen` mode. As a result, the split button popup is now positioned correctly. + +=== The pattern commands would execute even if the command was not enabled. +// #TINY-10994 + +Previously in {productname}, the `text_patterns` commands would attempt to execute even if the functionality were not supported in the current editor context. As a consequence, the command would fail and the editor would display unexpected behavior. For example, typing "1. " without the `lists` plugin enabled would delete the text instead of converting it to a list. + +This issue has been resolved in {productname} {release-version}. The editor now filters `text_patterns` to only the supported commands. For example, typing "1. " without the `lists` plugin enabled will no longer fire a text pattern and instead retain the text as plain text. \ No newline at end of file diff --git a/modules/ROOT/pages/changelog.adoc b/modules/ROOT/pages/changelog.adoc index 04c217617a..819cb9b9ac 100644 --- a/modules/ROOT/pages/changelog.adoc +++ b/modules/ROOT/pages/changelog.adoc @@ -4,6 +4,38 @@ NOTE: This is the {productname} Community version changelog. For information about the latest {cloudname} or {enterpriseversion} Release, see: xref:release-notes.adoc[{productname} Release Notes]. +== 7.3.0 - 2024-08-07 + +=== Added +* Colorpicker number input fields now show an error tooltip and error icon when invalid text has been entered. +// #TINY-10799 + +=== Improved +* When a full document was loaded as editor content the head elements were added to the body. +// #TINY-11053 + +=== Fixed +* Unnecessary nbsp entities were inserted when typing at the edges of inline elements. +// #TINY-10854 +* Fixed JavaScript error when inserting a table using the context menu by adjusting the event order in `renderInsertTableMenuItem`. +// #TINY-6887 +* Notifications didn't position and resize properly when resizing the editor or toggling views. +// #TINY-10894 +* The pattern commands would execute even if the command was not enabled. +// #TINY-10994 +* Split button popups were incorrectly positioned when switching to fullscreen mode if the editor was inside a scrollable container. +// #TINY-10973 +* Sequential html comments would in some cases generate unwanted elements. +// #TINY-10955 +* The listbox component had a fixed width and was not a responsive ui element. +// #TINY-10884 +* Prevent default mousedown on toolbar buttons was causing misplaced focus bugs. +// #TINY-10638 +* Attempting to use focus commands on an editor where the cursor had last been in certain `+contentEditable="true"+` elements would fail. +// #TINY-11085 +* Colorpicker's hex-based input field showed the wrong validation error message. +// #TINY-11115 + == 7.2.1 - 2024-07-03 === Fixed diff --git a/modules/ROOT/pages/exportpdf.adoc b/modules/ROOT/pages/exportpdf.adoc index 392a31a7de..e5e42130b1 100644 --- a/modules/ROOT/pages/exportpdf.adoc +++ b/modules/ROOT/pages/exportpdf.adoc @@ -12,7 +12,7 @@ include::partial$misc/admon-export-pdf-paid-addon-pricing.adoc[] include::partial$misc/admon-requires-7.0v.adoc[] -The {pluginname} functionality gathers the HTML produced using the `editor.getcontent()` method and the default editor content styles, along with the styles specified in the configuration options for the plugin. This data is transmitted to the HTML to PDF converter service. The service processes this information to create a PDF file, which is then sent back to the user's browser for saving to their local disk. +The {pluginname} feature collects the HTML generated with the `tinymce.editor.getContent()` method and combines it with the default editor content styles along with the styles provided in the plugin configuration. The combined content and styles are then processed by the included server-side converter service, which can be either self-hosted or cloud-based. Following this processing, a PDF file is generated, which is subsequently returned to the user’s browser, enabling them to save it onto their disk or drive. == Interactive example diff --git a/modules/ROOT/pages/exportword.adoc b/modules/ROOT/pages/exportword.adoc index 56ab5cbe9a..f82785c76f 100644 --- a/modules/ROOT/pages/exportword.adoc +++ b/modules/ROOT/pages/exportword.adoc @@ -11,7 +11,7 @@ include::partial$misc/admon-export-word-paid-addon-pricing.adoc[] include::partial$misc/admon-requires-7.0v.adoc[] -The export to Microsoft Word feature collects the HTML generated with the `tinymce.editor.getContent()` method and combines it with the default editor content styles along with the styles provided in the configuration. The combined content and styles are then transmitted to the HTML to DOCX converter service. Following this, the service generates a Word file, which is subsequently returned to the user’s browser, enabling them to save it in the Word format onto their disk. +The export to Microsoft Word feature collects the HTML generated with the `tinymce.editor.getContent()` method and combines it with the default editor content styles along with the styles provided in the plugin configuration. The combined content and styles are then processed by the included server-side converter service, which can be either self-hosted or cloud-based. Following this processing, a Word file is generated, which is subsequently returned to the user’s browser, enabling them to save it in the Word format onto their disk or drive. == Interactive example @@ -58,4 +58,4 @@ include::partial$commands/{plugincode}-cmds.adoc[][leveloffset=+1] == API Reference -> Explore the comprehensive API documentation for the {pluginname} Premium plugin at https://exportdocx.converter.tiny.cloud/docs#section/Export-to-Word[Export to Word.^] \ No newline at end of file +> Explore the comprehensive API documentation for the {pluginname} Premium plugin at link:https://exportdocx.converter.tiny.cloud/v2/convert/docs#section/Export-to-Word[Export to Word.^] \ No newline at end of file diff --git a/modules/ROOT/pages/importword.adoc b/modules/ROOT/pages/importword.adoc index 40ba64686a..36e7bf33b2 100644 --- a/modules/ROOT/pages/importword.adoc +++ b/modules/ROOT/pages/importword.adoc @@ -57,4 +57,4 @@ include::partial$commands/{plugincode}-cmds.adoc[] == API Reference -> Explore the comprehensive API documentation for the {pluginname} Premium plugin at https://importdocx.converter.tiny.cloud/docs#section/Import-from-Word[Import from Word.^] \ No newline at end of file +> Explore the comprehensive API documentation for the {pluginname} Premium plugin at link:https://importdocx.converter.tiny.cloud/v2/convert/docs#section/Import-from-Word[Import from Word.^] \ No newline at end of file diff --git a/modules/ROOT/pages/release-notes.adoc b/modules/ROOT/pages/release-notes.adoc index 2993513b92..2fd7890c7a 100644 --- a/modules/ROOT/pages/release-notes.adoc +++ b/modules/ROOT/pages/release-notes.adoc @@ -9,6 +9,12 @@ This section lists the releases for {productname} 7 and the changes made in each [cols="1,1"] |=== +a| +[.lead] +xref:7.3-release-notes.adoc#overview[{productname} 7.3] + +Release notes for {productname} 7.3 + a| [.lead] xref:7.2.1-release-notes.adoc#overview[{productname} 7.2.1] diff --git a/modules/ROOT/pages/revisionhistory.adoc b/modules/ROOT/pages/revisionhistory.adoc index 89318b1c22..06fc18b2b1 100644 --- a/modules/ROOT/pages/revisionhistory.adoc +++ b/modules/ROOT/pages/revisionhistory.adoc @@ -2,7 +2,7 @@ :navtitle: Revision History :description: A view that allows {productname} users to see historical snapshots of a document and an ability to restore from a snapshot :description_short: View containing historical snapshots of a document. -:keywords: plugin, Revision History, history, version, snapshots, restore, changes +:keywords: plugin, Revision History, history, version, snapshots, restore, changes, revision, diff :pluginname: Revision History :plugincode: revisionhistory :plugincategory: premium @@ -11,7 +11,7 @@ include::partial$misc/admon-revisionhistory-paid-addon-pricing.adoc[] include::partial$misc/admon-requires-7.0v.adoc[] -The {pluginname} plugin offers users the ability to view document changes over time and restore previous versions effortlessly. +The {pluginname} plugin offers users the ability to view document changes over time and restore previous revisions effortlessly. == Interactive example @@ -26,24 +26,24 @@ The {pluginname} view is accessible via either the `revisionhistory` toolbar but The key components are: 1. In the {pluginname} view header, there are two buttons. -* `Restore this version`: Set the selected version's content to the editor and close the view. -* `Close`: Close the view. +* `Restore this version`: Sets the selected revision's content to the editor and closes the view. Note: the button is disabled for the `initial` and `draft` revisions. +* `Close`: Closes the **Revision History** view. -2. The readonly diff view presents the changes between the selected version and its immediate predecessor, clearly highlighting for easy recognition. The changes are also color-coded for clarity: +2. The readonly diff view presents the changes between the selected revision and its immediate predecessor, clearly highlighting for easy recognition. The changes are also color-coded for clarity: * Red: Removed content. * Green: New content. * Yellow: Content being modified. Modifications to HTML content implies attributes or formatting (e.g. bold, italic, etc.). -3. The revisions sidebar displays all available document versions. When a new version is selected, the diff view is updated accordingly. +3. The revisions sidebar displays all available document revisions. When a revision is selected, the diff view is updated accordingly. [NOTE] The default highlighting colors can be customized using the xref:revisionhistory_css_url[`+revisionhistory_css_url+`] option. [NOTE] -The {pluginname} plugin interprets commented HTML as valid content, yet it disregards this content during the version comparison process. Consequently, a version containing solely commented content appears as empty in the user interface displaying the differential content. +The {pluginname} plugin processes commented HTML as valid content but disregards it during the revision comparison process. Revisions containing only commented content appear as empty in the view. == Basic setup -To setup the {pluginname} plugin user-interface in the editor: +To setup the {pluginname} plugin in the editor: * add `{plugincode}` to the `plugins` option in the editor configuration; * add `{plugincode}` to the `toolbar` option in the editor configuration; @@ -57,36 +57,47 @@ tinymce.init({ selector: 'textarea', // change this value according to your HTML plugins: 'revisionhistory', toolbar: 'revisionhistory', - // Required - revisionhistory_fetch: () => new Promise((resolve) => { - const revisions = []; // Replace this with an API request to get saved versions - resolve(revisions); - }) + revisionhistory_fetch: () => Promise.resolve([]), // Replace this with an API request to get saved revisions }); ---- -== Understanding initial and current versions +== Understanding revision types -When dealing with a new document, that has no saved versions, {pluginname} plugin will always typically maintain two versions: the `initial` and `current` versions. +The {pluginname} plugin offers three revision types: -* Initial Version: This version is generated during the {productname} `Loaded` event, with the editor's initial content. -* Current Version: This is generated upon accessing the {pluginname}, reflecting the editor's current content. When included, it becomes the `latest version` and is placed at the top of the revisions list. +. **Initial**: This revision is generated during the {productname} `Loaded` event, capturing the editor's initial content. +. **Draft**: Generated upon opening the {pluginname}, this revision reflects the editor's current content. When included, it becomes the `latest revision` in the revisions list. +. **Saved**: These revisions are fetched from the client's storage when opening the {pluginname} view, using the `revisionhistory_fetch` and `revisionhistory_fetch_revision` options. -[TIP] -When the editor is initialized with content and both versions contain the same content, the {pluginname} retains only the `current version`. +When working with a document that has no saved revisions, the {pluginname} plugin typically maintains two revisions: `initial` and `draft`. If no changes have been made to the content since initialization, the `initial` revision is not displayed, as it is identical to the `draft` revision. -For documents with saved versions, the `initial version` is disregarded by the {pluginname} assuming it's already part of the version history. The current version is discarded if its content matches the closest saved version. +For documents with saved revisions, the `initial` revision is disregarded, assuming it already exists among the saved revisions. To include the initial content, add it as a revision using the `revisionhistory_fetch` option. -The table below summarizes how versions are handled in the {pluginname}: +== Data structure -[cols="1,1,1,3", options="header"] +=== Revision + +The revision is an `+Object+` that contains the following fields: + +[cols="1,1,1,3",options="header"] |=== -|Has Initial Version |Current Version |Has Saved Versions |Expectation -|No |N/A |No |No versions are shown -|No |N/A |Yes |Only the saved versions are shown -|Yes |N/A |No |Only the current version is shown -|Yes |Different |No |Both the initial and current versions are shown -|Yes |N/A |Yes |The saved versions and the current version are shown +| Field | Type | Required? | Description +| `+revisionId+` | `+string+` | required | The unique string ID of the revision. +| `+createdAt+` | `+string+` | required | A UTC datetime string in ISO-8061 format. +| `+content+` | `+string+` | optional | HTML string of the revision content. Empty string is considered as valid content. +| `+author+` | xref:#author[Author] `+Object+` | optional | The author of the revision. +|=== + +=== Author + +The author is an `+Object+` that represents the author or creator of a revision. It contains the following fields: + +[cols="1,1,1,3",options="header"] +|=== +| Field | Type | Required? | Description +| `+id+` | `+string+` | required | The unique string ID of the author. +| `+name+` | `+string+` | optional | The name of the revision author. If not provided, the default value is `Anonymous`. +| `+avatar+` | `+string+` | optional | The URL of the author's avatar image. If not provided or invalid, the {pluginname} will use a generated avatar using the author's initials. |=== @@ -98,6 +109,10 @@ include::partial$configuration/revisionhistory_fetch.adoc[leveloffset=+1] include::partial$configuration/revisionhistory_fetch_revision.adoc[leveloffset=+1] +include::partial$configuration/revisionhistory_author.adoc[leveloffset=+1] + +include::partial$configuration/revisionhistory_display_author.adoc[leveloffset=+1] + include::partial$configuration/revisionhistory_css_url.adoc[leveloffset=+1] include::partial$configuration/revisionhistory_diff_classes.adoc[leveloffset=+1] diff --git a/modules/ROOT/partials/configuration/advcode.adoc b/modules/ROOT/partials/configuration/advcode.adoc index f568c2ef71..3a2847bddb 100644 --- a/modules/ROOT/partials/configuration/advcode.adoc +++ b/modules/ROOT/partials/configuration/advcode.adoc @@ -20,3 +20,65 @@ tinymce.init({ toolbar: 'code', }); ---- + +[[advcode_prettify_getcontent]] +== `+advcode_prettify_getcontent+` + +include::partial$misc/admon-requires-7.3v.adoc[] + +As part of the {productname} 7.3 release, the {pluginname} plugin includes a new option, `advcode_prettify_getcontent`, which is set to `false` by default. + +When this option is set to `true` it will format the HTML code when `editor.getContent` is called. + +This is equivalent to retrieving formatted content by calling `+tinymce.activeEditor.getContent({ prettify: true })+`, regardless of the option's status. + +*Type:* `+Boolean+` + +*Default value:* `+false+` + +*Possible values:* `+true+`, `+false+` + +== Example: basic setup + +[source,js] +---- +tinymce.init({ + selector: 'textarea', // change this value according to your HTML + plugins: 'advcode', + advcode_prettify_getcontent: true, + toolbar: 'code', +}); +---- + +[IMPORTANT] +If existing HTML content in the database is not well-formatted or has inconsistent indentation, enabling this option may **change the formatting** of previously saved content which may be undesirable in some cases. + +[[advcode_prettify_editor]] +== `+advcode_prettify_editor+` + +include::partial$misc/admon-requires-7.3v.adoc[] + +As part of the {productname} 7.3 release, the {pluginname} plugin includes a new option, `advcode_prettify_editor`, which is set to `true` by default. + +By default, any code rendered inside **Enhanced Coded Editor** will be formatted with correct indentation. + +Type : `boolean`, + +Default: `+true+` + +*Possible values:* `+true+`, `+false+` + +== Example: basic setup + +[source,js] +---- +tinymce.init({ + selector: 'textarea', // change this value according to your HTML + plugins: 'advcode', + advcode_prettify_editor: true, // default value + toolbar: 'code', +}); +---- + +[NOTE] +To disable this default behavior, set the `advcode_prettify_editor` option to `false`. \ No newline at end of file diff --git a/modules/ROOT/partials/configuration/ai_shortcuts.adoc b/modules/ROOT/partials/configuration/ai_shortcuts.adoc index 44a48cd4ae..c3fdc64ac1 100644 --- a/modules/ROOT/partials/configuration/ai_shortcuts.adoc +++ b/modules/ROOT/partials/configuration/ai_shortcuts.adoc @@ -24,20 +24,41 @@ When configured with an instance-specific object array, the {pluginname} shortcu { title: 'Simplify language', prompt: 'Rewrite this content with simplified language and reduce the complexity of the writing, so that the content is easier to understand.', selection: true }, { title: 'Expand upon', prompt: 'Expand upon this content with descriptive language and more detailed explanations, to make the writing easier to understand and increase the length of the content.', selection: true }, { title: 'Trim content', prompt: 'Remove any repetitive, redundant, or non-essential writing in this content without changing the meaning or losing any key information.', selection: true }, - { title: 'Change tone', subprompts: [ - { title: 'Professional', prompt: 'Rewrite this content using polished, formal, and respectful language to convey professional expertise and competence.', selection: true }, - { title: 'Casual', prompt: 'Rewrite this content with casual, informal language to convey a casual conversation with a real person.', selection: true }, - { title: 'Direct', prompt: 'Rewrite this content with direct language using only the essential information.', selection: true }, - { title: 'Confident', prompt: 'Rewrite this content using compelling, optimistic language to convey confidence in the writing.', selection: true }, - { title: 'Friendly', prompt: 'Rewrite this content using friendly, comforting language, to convey understanding and empathy.', selection: true }, - ] }, - { title: 'Change style', subprompts: [ - { title: 'Business', prompt: 'Rewrite this content as a business professional with formal language.', selection: true }, - { title: 'Legal', prompt: 'Rewrite this content as a legal professional using valid legal terminology.', selection: true }, - { title: 'Journalism', prompt: 'Rewrite this content as a journalist using engaging language to convey the importance of the information.', selection: true }, - { title: 'Medical', prompt: 'Rewrite this content as a medical professional using valid medical terminology.', selection: true }, - { title: 'Poetic', prompt: 'Rewrite this content as a poem using poetic techniques without losing the original meaning.', selection: true }, - ] } + { + title: 'Change tone', subprompts: [ + { title: 'Professional', prompt: 'Rewrite this content using polished, formal, and respectful language to convey professional expertise and competence.', selection: true }, + { title: 'Casual', prompt: 'Rewrite this content with casual, informal language to convey a casual conversation with a real person.', selection: true }, + { title: 'Direct', prompt: 'Rewrite this content with direct language using only the essential information.', selection: true }, + { title: 'Confident', prompt: 'Rewrite this content using compelling, optimistic language to convey confidence in the writing.', selection: true }, + { title: 'Friendly', prompt: 'Rewrite this content using friendly, comforting language, to convey understanding and empathy.', selection: true }, + ] + }, + { + title: 'Change style', subprompts: [ + { title: 'Business', prompt: 'Rewrite this content as a business professional with formal language.', selection: true }, + { title: 'Legal', prompt: 'Rewrite this content as a legal professional using valid legal terminology.', selection: true }, + { title: 'Journalism', prompt: 'Rewrite this content as a journalist using engaging language to convey the importance of the information.', selection: true }, + { title: 'Medical', prompt: 'Rewrite this content as a medical professional using valid medical terminology.', selection: true }, + { title: 'Poetic', prompt: 'Rewrite this content as a poem using poetic techniques without losing the original meaning.', selection: true }, + ] + }, + { + title: 'Translate', subprompts: [ + { title: 'Translate to English', prompt: 'Translate this content to English language.', selection: true }, + { title: 'Translate to Spanish', prompt: 'Translate this content to Spanish language.', selection: true }, + { title: 'Translate to Portuguese', prompt: 'Translate this content to Portuguese language.', selection: true }, + { title: 'Translate to German', prompt: 'Translate this content to German language.', selection: true }, + { title: 'Translate to French', prompt: 'Translate this content to French language.', selection: true }, + { title: 'Translate to Norwegian', prompt: 'Translate this content to Norwegian language.', selection: true }, + { title: 'Translate to Ukrainian', prompt: 'Translate this content to Ukrainian language.', selection: true }, + { title: 'Translate to Japanese', prompt: 'Translate this content to Japanese language.', selection: true }, + { title: 'Translate to Korean', prompt: 'Translate this content to Korean language.', selection: true }, + { title: 'Translate to Simplified Chinese', prompt: 'Translate this content to Simplified Chinese language.', selection: true }, + { title: 'Translate to Hebrew', prompt: 'Translate this content to Hebrew language.', selection: true }, + { title: 'Translate to Hindi', prompt: 'Translate this content to Hindi language.', selection: true }, + { title: 'Translate to Arabic', prompt: 'Translate this content to Arabic language.', selection: true }, + ] + }, ] ---- @@ -49,7 +70,7 @@ The default {pluginname} shortcuts are only available in English. They have not Also, the default {pluginname} shortcuts are subject to change. If you prefer to keep these shortcuts, include them within your integration. ==== -=== Example: using `ai_shortcuts` to present a customised set of {pluginname} shortcuts +=== Example: using `ai_shortcuts` to present a customized set of {pluginname} shortcuts [source,js] ---- diff --git a/modules/ROOT/partials/configuration/exportword.adoc b/modules/ROOT/partials/configuration/exportword.adoc index 04f2efeb1d..ca51360cdd 100644 --- a/modules/ROOT/partials/configuration/exportword.adoc +++ b/modules/ROOT/partials/configuration/exportword.adoc @@ -3,10 +3,10 @@ The {pluginname} uses the HTML to DOCX converter service to generate the Word files. + The {pluginname} feature is currently only available exclusively for `on-premise` setups, requiring a self-hosted HTML to DOCX converter service and the `exportword_service_url` option to be properly configured. If you require access to this feature, please link:https://www.tiny.cloud/contact/[contact us]. Refer to our xref:individual-import-from-word-and-export-to-word-on-premises.adoc[on-premises documentation] for detailed instructions on deploying the {pluginname} service server-side component using Docker. -[TIP] -Update the `exportword_service_url` configuration in your {productname} setup to point to your host. For instance, if your host is `mycustomhost.com`, the URL will be `https://mycustomhost.com/v1/convert`. +NOTE: The {pluginname} feature is currently only available `on-premise` and requires the `exportword_service_url` option to be configured. link:https://www.tiny.cloud/contact/[Contact us] if you require this feature. *Type:* `+String+` @@ -41,12 +41,36 @@ tinymce.init({ toolbar: 'exportword', exportword_service_url: '', exportword_converter_options: { - header: [ - { - html: '

First page header.

', //example - css: 'h1 { font-size: 30px; }', //example + headers: { + first: { + html: "

My document header

", + css: "p { color: gray; }" + }, + default: { + html: "

My default header

", + css: "p { color: blue; }" + } + }, + footers: { + odd: { + html: "

My odd footer

", + css: "p { font-size: 10px; }" + }, + even: { + html: "

My even footer

", + css: "p { font-size: 12px; }" } - ], + }, + document: { + orientation: "landscape", + size: "a3", + margins: { + top: "10mm", + bottom: "10mm", + left: "20mm", + right: "15mm" + } + }, }, }); ---- @@ -54,12 +78,12 @@ tinymce.init({ [NOTE] To use this option, the Export to Word plugin requires the `exportword_service_url` option to be configured. -> For comprehensive details regarding the `exportword_converter_options`, please refer to the https://exportdocx.converter.tiny.cloud/docs#section/Export-to-Word[API documentation^] available for the {pluginname} Premium plugin. +> For comprehensive details regarding the `exportword_converter_options`, please refer to the link:https://exportdocx.converter.tiny.cloud/v2/convert/docs#section/Export-to-Word[API documentation^] available for the {pluginname} Premium plugin. [[exportword-converter-style]] == `exportword_converter_style` -The `exportword_converter_style` option allow for customization of the styles applied to the exported Word document, providing flexibility in controlling its appearance. +The `exportword_converter_style` option allows for customization of the styles applied to the exported Word document, providing flexibility in controlling its appearance; however, this option does **not affect** the distinct styling of the `header` and `footer`. *Type:* `+String+` @@ -74,14 +98,18 @@ tinymce.init({ plugins: 'exportword', toolbar: 'exportword', exportword_service_url: '', // required - exportword_converter_options: { // required to support "exportword_converter_style" - header: [ - { - html: '

First page header.

', //example - css: 'h1 { font-size: 30px; }', //example + exportword_converter_options: { + headers: { + first: { + html: "

My document header

", + css: "p { color: gray; }" + }, + default: { + html: "

My default header

", + css: "p { color: blue; }" } - ], + }, }, - exportword_converter_style: 'p { color: cyan !important }' + exportword_converter_style: 'p { color: cyan !important }' // will override the set

tag styles in the HTML content }); ---- \ No newline at end of file diff --git a/modules/ROOT/partials/configuration/revisionhistory_author.adoc b/modules/ROOT/partials/configuration/revisionhistory_author.adoc new file mode 100644 index 0000000000..5e9d867c4e --- /dev/null +++ b/modules/ROOT/partials/configuration/revisionhistory_author.adoc @@ -0,0 +1,24 @@ +[[revisionhistory_author]] +== `revisionhistory_author` + +This option configures the author for the `initial` and `draft` revisions. + +*Type:* xref:#author[Author] `+Object+` + +=== Example: using `revisionhistory_author` + +[source,js] +---- +tinymce.init({ + selector: 'textarea', // Change this value according to your HTML + plugins: 'revisionhistory', + toolbar: 'revisionhistory', + revisionhistory_fetch: () => Promise.resolve([]), + revisionhistory_display_author: true, + revisionhistory_author: { + id: 'john.doe', + name: 'John Doe', + avatar: 'https://example.com/avatar.jpg' + } +}); +---- diff --git a/modules/ROOT/partials/configuration/revisionhistory_css_url.adoc b/modules/ROOT/partials/configuration/revisionhistory_css_url.adoc index 8dde046723..d2ccd5a871 100644 --- a/modules/ROOT/partials/configuration/revisionhistory_css_url.adoc +++ b/modules/ROOT/partials/configuration/revisionhistory_css_url.adoc @@ -18,6 +18,7 @@ tinymce.init({ selector: 'textarea', // change this value according to your HTML plugins: 'revisionhistory', toolbar: 'revisionhistory', + revisionhistory_fetch: () => Promise.resolve([]), // Required option for the plugin - replace with actual API request revisionhistory_css_url: './revisionhistory.css' }); ---- \ No newline at end of file diff --git a/modules/ROOT/partials/configuration/revisionhistory_diff_classes.adoc b/modules/ROOT/partials/configuration/revisionhistory_diff_classes.adoc index a43582b02c..a0eb0778bb 100644 --- a/modules/ROOT/partials/configuration/revisionhistory_diff_classes.adoc +++ b/modules/ROOT/partials/configuration/revisionhistory_diff_classes.adoc @@ -26,12 +26,12 @@ tinymce.init({ selector: 'textarea', // change this value according to your HTML plugins: 'revisionhistory', toolbar: 'revisionhistory', + revisionhistory_fetch: () => Promise.resolve([]), // Required option for the plugin - replace with actual API request revisionhistory_css_url: './revisionhistory.css', revisionhistory_diff_classes: { addition: 'added', removal: 'removed', modification: 'modified' - }, - revisionhistory_fetch: () => Promise.resolve([]) + } }); ---- diff --git a/modules/ROOT/partials/configuration/revisionhistory_display_author.adoc b/modules/ROOT/partials/configuration/revisionhistory_display_author.adoc new file mode 100644 index 0000000000..007e042deb --- /dev/null +++ b/modules/ROOT/partials/configuration/revisionhistory_display_author.adoc @@ -0,0 +1,21 @@ +[[revisionhistory_display_author]] +== `revisionhistory_display_author` + +This option configures the display of the revision's author. When set to `+true+`, the author's name appears in each revision within the Revision History sidebar. If the author's name is not provided, it defaults to `Anonymous`. + +*Type:* `+Boolean+` + +*Default value:* `+false+` + +=== Example: using `revisionhistory_display_author` + +[source,js] +---- +tinymce.init({ + selector: 'textarea', // Change this value according to your HTML + plugins: 'revisionhistory', + toolbar: 'revisionhistory', + revisionhistory_fetch: () => Promise.resolve([]), + revisionhistory_display_author: true +}); +---- diff --git a/modules/ROOT/partials/configuration/revisionhistory_fetch.adoc b/modules/ROOT/partials/configuration/revisionhistory_fetch.adoc index aa340dd976..9861d28d54 100644 --- a/modules/ROOT/partials/configuration/revisionhistory_fetch.adoc +++ b/modules/ROOT/partials/configuration/revisionhistory_fetch.adoc @@ -1,27 +1,22 @@ [[revisionhistory_fetch]] == `revisionhistory_fetch` -The `revisionhistory_fetch` function retrieves saved versions and is **required** for the Revision History plugin to work. It is called when the user opens the Revision History view. +The `revisionhistory_fetch` function retrieves saved revisions and is called when the user opens the Revision History view. -The `revisionhistory_fetch` option is an asynchronous function that returns a link:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise[Promise] which resolves to an array of revisions. +[IMPORTANT] +The `revisionhistory_fetch` function is required for the Revision History plugin to function. + + +It expects an asynchronous function that returns a link:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise[Promise] which resolves to an array of revisions. [NOTE] -The {pluginname} plugin does not sort results before displaying them, allowing integrators to sort the results according to their preference. {companyname} recommends to sort the results in reverse chronological order, as this makes it easier for users to identify versions by date. +The {pluginname} plugin does not sort results before displaying them, allowing integrators to sort the results according to their preference. {companyname} recommends to sort the results in reverse chronological order, as this makes it easier for users to identify revisions by date. *Type:* `+Function+` (Returns a https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise[Promise]) *Input parameters:* None -*Return data:* `+Array+` of revision `+Objects+` - -Each revision `+Object+` must have the following fields: -[cols="1,1,1,3",options="header"] -|=== -|Field |Type |Required? |Description -|`+revisionId+` | `+string+` | required | The unique string ID of the revision. -|`+createdAt+` | `+string+` | required | A UTC datetime string in ISO-8061 format. -|`+content+` | `+string+` | optional | HTML string of the revision content. Empty string is considered as valid content. -|=== +*Return data:* `+Array+` of xref:#revision[Revision] `+Objects+` === Example of `revisionhistory_fetch` response @@ -54,7 +49,7 @@ const revisions = [ ]; ---- -=== Example: using `revisionhistory_fetch` +=== Example: Using `revisionhistory_fetch` [source,js] ---- @@ -66,6 +61,6 @@ tinymce.init({ fetch('') // Update the URL and response handling code according to your API .then((response) => response.json()) .then((data) => data) - .catch((error) => console.log('Failed to get versions\n' + error)) + .catch((error) => console.log('Failed to get revisions\n' + error)) }); ---- diff --git a/modules/ROOT/partials/configuration/revisionhistory_fetch_revision.adoc b/modules/ROOT/partials/configuration/revisionhistory_fetch_revision.adoc index dc3aa28aac..d729459112 100644 --- a/modules/ROOT/partials/configuration/revisionhistory_fetch_revision.adoc +++ b/modules/ROOT/partials/configuration/revisionhistory_fetch_revision.adoc @@ -8,13 +8,13 @@ When a revision is selected, the plugin uses this option to update the selected [cols="1,1,1,3",options="header"] |=== |Field |Type |Required? |Description -|`+editor+` | `+Editor+` | required | The editor instance to load the revision into (useful if there are multiple editors on the page). -|`+revision+` | `+Object+` | required | The revision object to load (must include `revisionId` field). +|`+editor+` | `+Editor+` | required | The current editor instance (useful if there are multiple editors on the page). +|`+revision+` | xref:#revision[Revision] `+Object+` | required | The targeted revision. |=== -*Return data:* revision `+Object+` as described in the return data of the xref:revisionhistory.adoc#revisionhistory_fetch[revisionhistory_fetch] option. +*Return data:* xref:#revision[Revision] `+Object+` -=== Example: using `revisionhistory_fetch_revision` +=== Example: Using `revisionhistory_fetch_revision` [source,js] ---- diff --git a/modules/ROOT/partials/individually-licensed-components/import-from-word-and-export-to-word/import-from-word-and-export-to-word-api-usage-on-premises.adoc b/modules/ROOT/partials/individually-licensed-components/import-from-word-and-export-to-word/import-from-word-and-export-to-word-api-usage-on-premises.adoc index 8b5081a61a..0fb62308f1 100644 --- a/modules/ROOT/partials/individually-licensed-components/import-from-word-and-export-to-word/import-from-word-and-export-to-word-api-usage-on-premises.adoc +++ b/modules/ROOT/partials/individually-licensed-components/import-from-word-and-export-to-word/import-from-word-and-export-to-word-api-usage-on-premises.adoc @@ -9,7 +9,7 @@ The API is available on `+http://localhost:[port]+` (by default the port is 8080). [NOTE] -The REST API documentation is available at `+http://localhost:[port]/docs+`. -Alternatively you can check specification in our public resources for link:https://importdocx.converter.tiny.cloud/docs#section/Import-from-Word[Import from Word^] and the link:https://exportdocx.converter.tiny.cloud/docs#section/Export-to-Word[Export to Word^] plugins. +The REST API documentation is available at `+http://localhost:[port]/v2/convert/docs+`. +Alternatively you can check specification in our public resources for link:https://importdocx.converter.tiny.cloud/v2/convert/docs#section/Import-from-Word[Import from Word^] and the link:https://exportdocx.converter.tiny.cloud/v2/convert/docs#section/Export-to-Word[Export to Word^] plugins. If you have the authorization for the API enabled, you should provide an authorization token. More instructions you can find in the authorization section. \ No newline at end of file diff --git a/modules/ROOT/partials/individually-licensed-components/import-from-word-and-export-to-word/import-from-word-and-export-to-word-autorization-on-premises.adoc b/modules/ROOT/partials/individually-licensed-components/import-from-word-and-export-to-word/import-from-word-and-export-to-word-autorization-on-premises.adoc index c36301f913..18861d092d 100644 --- a/modules/ROOT/partials/individually-licensed-components/import-from-word-and-export-to-word/import-from-word-and-export-to-word-autorization-on-premises.adoc +++ b/modules/ROOT/partials/individually-licensed-components/import-from-word-and-export-to-word/import-from-word-and-export-to-word-autorization-on-premises.adoc @@ -53,7 +53,7 @@ const config = { responseType: 'arraybuffer', }; -axios.post( 'http://localhost:8080/v1/convert', data, config ) +axios.post( 'http://localhost:8080/v2/convert/html-docx', data, config ) .then( response => { fs.writeFileSync('./file.docx', response.data, 'binary'); } ).catch( error => { @@ -63,7 +63,7 @@ axios.post( 'http://localhost:8080/v1/convert', data, config ) `SECRET_KEY`: This is the key what has been passed to the {pluginname} On-Premises instance. -Please refer to the link:https://importdocx.converter.tiny.cloud/docs#section/Import-from-Word[Import from Word^] and the link:https://exportdocx.converter.tiny.cloud/docs#section/Export-to-Word[Export to Word^] REST API documentation to start using the service. +Please refer to the link:https://importdocx.converter.tiny.cloud/v2/convert/docs#section/Import-from-Word[Import from Word^] and the link:https://exportdocx.converter.tiny.cloud/v2/convert/docs#section/Export-to-Word[Export to Word^] REST API documentation to start using the service. [NOTE] If API clients like Postman or Insomnia are used, then set the JWT token as an `Authorization` header in the `Headers` tab. Do not use the built-in token authorization as this will generate invalid header with a `Bearer` prefix added to the token. \ No newline at end of file diff --git a/modules/ROOT/partials/individually-licensed-components/import-from-word-and-export-to-word/import-from-word-and-export-to-word-installation-on-premises.adoc b/modules/ROOT/partials/individually-licensed-components/import-from-word-and-export-to-word/import-from-word-and-export-to-word-installation-on-premises.adoc index 3694110b64..1888f97a9a 100644 --- a/modules/ROOT/partials/individually-licensed-components/import-from-word-and-export-to-word/import-from-word-and-export-to-word-installation-on-premises.adoc +++ b/modules/ROOT/partials/individually-licensed-components/import-from-word-and-export-to-word/import-from-word-and-export-to-word-installation-on-premises.adoc @@ -82,7 +82,7 @@ docker-compose up === Next steps -Use the link:http://localhost:8080/v1/convert[http://localhost:8080/v1/convert] endpoint to export DOCX files. Check out the xref:individual-import-from-word-and-export-to-word-on-premises.adoc#authorization[authorization] section to learn more about tokens and token endpoints. +Use the link:http://localhost:8080/v2/convert/html-docx[http://localhost:8080/v2/convert/html-docx] endpoint to export DOCX files. Check out the xref:individual-import-from-word-and-export-to-word-on-premises.adoc#authorization[authorization] section to learn more about tokens and token endpoints. Use the demo page available on link:http://localhost:8080/demo[http://localhost:8080/demo] to generate an example DOCX file. diff --git a/modules/ROOT/partials/individually-licensed-components/import-from-word-and-export-to-word/import-from-word-and-export-to-word-logs-on-premises.adoc b/modules/ROOT/partials/individually-licensed-components/import-from-word-and-export-to-word/import-from-word-and-export-to-word-logs-on-premises.adoc index 29ff606fee..40c33a8887 100644 --- a/modules/ROOT/partials/individually-licensed-components/import-from-word-and-export-to-word/import-from-word-and-export-to-word-logs-on-premises.adoc +++ b/modules/ROOT/partials/individually-licensed-components/import-from-word-and-export-to-word/import-from-word-and-export-to-word-logs-on-premises.adoc @@ -42,7 +42,7 @@ An example log for HTTP transport: "transport": "http", "statusCode": 200, "status": "success", - "url": "/v1/convert", + "url": "/v2/convert/html-docx", "method": "POST" }, "tags": "metrics" diff --git a/modules/ROOT/partials/misc/admon-requires-7.3v.adoc b/modules/ROOT/partials/misc/admon-requires-7.3v.adoc new file mode 100644 index 0000000000..6708f6f266 --- /dev/null +++ b/modules/ROOT/partials/misc/admon-requires-7.3v.adoc @@ -0,0 +1 @@ +NOTE: This feature is only available for {productname} 7.3 and later. diff --git a/modules/ROOT/partials/plugin-apis/revisionhistory-apis.adoc b/modules/ROOT/partials/plugin-apis/revisionhistory-apis.adoc index 155cb23d1a..17dd3a5c2b 100644 --- a/modules/ROOT/partials/plugin-apis/revisionhistory-apis.adoc +++ b/modules/ROOT/partials/plugin-apis/revisionhistory-apis.adoc @@ -7,11 +7,12 @@ interface PluginAPI { [[diff]] === `diff` + Returns a HTML string with annotations indicating the changes in `originalHTML` relative to `changedHTML`. The styling of annotations can be customized via xref:revisionhistory_diff_classes[`+revisionhistory_diff_classes+`] option. include::partial$misc/admon-requires-7.1v.adoc[] -== Example +.Example [source,js] ---- const input1 = `

The banner is red

`; From 6c25b0f0d95a9b27eca464ecfbb3abd96770cd4d Mon Sep 17 00:00:00 2001 From: Karl Kemister-Sheppard Date: Thu, 8 Aug 2024 09:15:02 +1000 Subject: [PATCH 59/97] DOC-2464: api-version bump for 7.3 (#3425) --- .api-version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.api-version b/.api-version index 468c41f93c..8b23b8d47c 100644 --- a/.api-version +++ b/.api-version @@ -1 +1 @@ -7.2.1 \ No newline at end of file +7.3.0 \ No newline at end of file From daa732e15944410234f3a8b4fcb373c3a29a5433 Mon Sep 17 00:00:00 2001 From: Karl Kemister-Sheppard Date: Fri, 16 Aug 2024 16:05:39 +1000 Subject: [PATCH 60/97] DOC-2502: Update code example for running tinymce in shadow dom. (#3429) --- modules/ROOT/pages/shadow-dom.adoc | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/modules/ROOT/pages/shadow-dom.adoc b/modules/ROOT/pages/shadow-dom.adoc index 4aa811784d..b4bd46641f 100644 --- a/modules/ROOT/pages/shadow-dom.adoc +++ b/modules/ROOT/pages/shadow-dom.adoc @@ -31,11 +31,12 @@ For example: // Do not use ‘selector’. target: node, plugins: [ - "advlist autolink lists link image charmap print preview anchor", - "searchreplace visualblocks code fullscreen", - "insertdatetime media table help" - ].join(' '), - toolbar: "insertfile undo redo | styleselect | bold italic | alignleft aligncenter alignright alignjustify | bullist numlist outdent indent | link image" + "advlist", "anchor", "autolink", "charmap", "code", "fullscreen", + "help", "image", "insertdatetime", "link", "lists", "media", + "preview", "searchreplace", "table", "visualblocks", + ], + toolbar: "undo redo | styles | bold italic underline strikethrough | alignleft aligncenter alignright alignjustify | bullist numlist outdent indent | link image", + }); ---- From 13ffdd8098f2e226c2d19132176a402175ba8a7a Mon Sep 17 00:00:00 2001 From: Farzad Hayat Date: Thu, 22 Aug 2024 09:10:23 +1000 Subject: [PATCH 61/97] DOC-2494: Add AI Assistant to full-featured demo (7 Docs) (#3428) * DOC-2494: Add AI Assistant to full-featured demo * DOC-2494: Remove AI Assistant from Excluded plugins in full-featured-premium-demo.adoc --- .../live-demos/full-featured/example.js | 165 ++++++++++++++++-- .../live-demos/full-featured/index.html | 14 ++ .../live-demos/full-featured/index.js | 139 ++++++++++++++- .../pages/full-featured-premium-demo.adoc | 3 - 4 files changed, 302 insertions(+), 19 deletions(-) diff --git a/modules/ROOT/examples/live-demos/full-featured/example.js b/modules/ROOT/examples/live-demos/full-featured/example.js index 43f1319035..773e8f45c2 100644 --- a/modules/ROOT/examples/live-demos/full-featured/example.js +++ b/modules/ROOT/examples/live-demos/full-featured/example.js @@ -1,15 +1,23 @@ +const fetchApi = import( + "https://unpkg.com/@microsoft/fetch-event-source@2.0.1/lib/esm/index.js" +).then((module) => module.fetchEventSource); + +// This example stores the OpenAI API key in the client side integration. This is not recommended for any purpose. +// Instead, an alternate method for retrieving the API key should be used. +const openai_api_key = ""; + const useDarkMode = window.matchMedia('(prefers-color-scheme: dark)').matches; const isSmallScreen = window.matchMedia('(max-width: 1023.5px)').matches; tinymce.init({ selector: 'textarea#full-featured', - plugins: 'preview powerpaste casechange importcss tinydrive searchreplace autolink autosave save directionality advcode visualblocks visualchars fullscreen image link math media mediaembed codesample table charmap pagebreak nonbreaking anchor tableofcontents insertdatetime advlist lists checklist wordcount tinymcespellchecker a11ychecker editimage help formatpainter permanentpen pageembed charmap tinycomments mentions quickbars linkchecker emoticons advtable footnotes mergetags autocorrect typography advtemplate markdown revisionhistory', + plugins: 'ai preview powerpaste casechange importcss tinydrive searchreplace autolink autosave save directionality advcode visualblocks visualchars fullscreen image link math media mediaembed codesample table charmap pagebreak nonbreaking anchor tableofcontents insertdatetime advlist lists checklist wordcount tinymcespellchecker a11ychecker editimage help formatpainter permanentpen pageembed charmap tinycomments mentions quickbars linkchecker emoticons advtable footnotes mergetags autocorrect typography advtemplate markdown revisionhistory', tinydrive_token_provider: 'URL_TO_YOUR_TOKEN_PROVIDER', tinydrive_dropbox_app_key: 'YOUR_DROPBOX_APP_KEY', tinydrive_google_drive_key: 'YOUR_GOOGLE_DRIVE_KEY', tinydrive_google_drive_client_id: 'YOUR_GOOGLE_DRIVE_CLIENT_ID', mobile: { - plugins: 'preview powerpaste casechange importcss tinydrive searchreplace autolink autosave save directionality advcode visualblocks visualchars fullscreen image link math media mediaembed codesample table charmap pagebreak nonbreaking anchor tableofcontents insertdatetime advlist lists checklist wordcount tinymcespellchecker a11ychecker help formatpainter pageembed charmap mentions quickbars linkchecker emoticons advtable footnotes mergetags autocorrect typography advtemplate', + plugins: 'ai preview powerpaste casechange importcss tinydrive searchreplace autolink autosave save directionality advcode visualblocks visualchars fullscreen image link math media mediaembed codesample table charmap pagebreak nonbreaking anchor tableofcontents insertdatetime advlist lists checklist wordcount tinymcespellchecker a11ychecker help formatpainter pageembed charmap mentions quickbars linkchecker emoticons advtable footnotes mergetags autocorrect typography advtemplate', }, menu: { tc: { @@ -105,17 +113,6 @@ tinymce.init({ a11y_advanced_options: true, skin: useDarkMode ? 'oxide-dark' : 'oxide', content_css: useDarkMode ? 'dark' : 'default', - /* - The following settings require more configuration than shown here. - For information on configuring the mentions plugin, see: - https://www.tiny.cloud/docs/tinymce/6/mentions/. - */ - mentions_selector: '.mymention', - mentions_fetch: mentions_fetch, // TODO: Implement mentions_fetch - mentions_menu_hover: mentions_menu_hover, // TODO: Implement mentions_menu_hover - mentions_menu_complete: mentions_menu_complete, // TODO: Implement mentions_menu_complete - mentions_select: mentions_select, // TODO: Implement mentions_select - mentions_item_type: 'profile', autocorrect_capitalize: true, mergetags_list: [ { @@ -157,5 +154,145 @@ tinymce.init({ content: '

Initial content

' }, ]); - } + }, + ai_request: (request, respondWith) => { + respondWith.stream((signal, streamMessage) => { + // Adds each previous query and response as individual messages + const conversation = request.thread.flatMap((event) => { + if (event.response) { + return [ + { role: "user", content: event.request.query }, + { role: "assistant", content: event.response.data }, + ]; + } else { + return []; + } + }); + + // System messages provided by the plugin to format the output as HTML content. + const systemMessages = request.system.map((content) => ({ + role: "system", + content, + })); + + // Forms the new query sent to the API + const content = + request.context.length === 0 || conversation.length > 0 + ? request.query + : `Question: ${request.query} Context: """${request.context}"""`; + + const messages = [ + ...conversation, + ...systemMessages, + { role: "user", content }, + ]; + + let hasHead = false; + let markdownHead = ""; + + const hasMarkdown = (message) => { + if (message.includes("`") && markdownHead !== "```") { + const numBackticks = message.split("`").length - 1; + markdownHead += "`".repeat(numBackticks); + if (hasHead && markdownHead === "```") { + markdownHead = ""; + hasHead = false; + } + return true; + } else if (message.includes("html") && markdownHead === "```") { + markdownHead = ""; + hasHead = true; + return true; + } + return false; + }; + + const requestBody = { + model: "gpt-4o", + temperature: 0.7, + max_tokens: 4000, + messages, + stream: true, + }; + + const openAiOptions = { + signal, + method: "POST", + headers: { + "Content-Type": "application/json", + Authorization: `Bearer ${openai_api_key}`, + }, + body: JSON.stringify(requestBody), + }; + + const onopen = async (response) => { + if (response) { + const contentType = response.headers.get("content-type"); + if (response.ok && contentType?.includes("text/event-stream")) { + return; + } else if (contentType?.includes("application/json")) { + const data = await response.json(); + if (data.error) { + throw new Error(`${data.error.type}: ${data.error.message}`); + } + } + } else { + throw new Error("Failed to communicate with the ChatGPT API"); + } + }; + + // This function passes each new message into the plugin via the `streamMessage` callback. + const onmessage = (ev) => { + const data = ev.data; + if (data !== "[DONE]") { + const parsedData = JSON.parse(data); + const firstChoice = parsedData?.choices[0]; + const message = firstChoice?.delta?.content; + if (message && message !== "") { + if (!hasMarkdown(message)) { + streamMessage(message); + } + } + } + }; + + const onerror = (error) => { + // Stop operation and do not retry by the fetch-event-source + throw error; + }; + + // Use microsoft's fetch-event-source library to work around the 2000 character limit + // of the browser `EventSource` API, which requires query strings + return fetchApi + .then((fetchEventSource) => + fetchEventSource("https://api.openai.com/v1/chat/completions", { + ...openAiOptions, + openWhenHidden: true, + onopen, + onmessage, + onerror, + }) + ) + .then(async (response) => { + if (response && !response.ok) { + const data = await response.json(); + if (data.error) { + throw new Error(`${data.error.type}: ${data.error.message}`); + } + } + }) + .catch(onerror); + }); + }, + /* + The following settings require more configuration than shown here. + For information on configuring the mentions plugin, see: + https://www.tiny.cloud/docs/tinymce/latest/mentions/. + */ + mentions_selector: ".mymention", + mentions_fetch: mentions_fetch, // TODO: Implement mentions_fetch + mentions_menu_hover: mentions_menu_hover, // TODO: Implement mentions_menu_hover + mentions_menu_complete: mentions_menu_complete, // TODO: Implement mentions_menu_complete + mentions_select: mentions_select, // TODO: Implement mentions_select + mentions_item_type: "profile", }); diff --git a/modules/ROOT/examples/live-demos/full-featured/index.html b/modules/ROOT/examples/live-demos/full-featured/index.html index 392d932bdc..a35479e914 100644 --- a/modules/ROOT/examples/live-demos/full-featured/index.html +++ b/modules/ROOT/examples/live-demos/full-featured/index.html @@ -54,6 +54,20 @@

Character strings to demonstrate some of the Advanced Typography plugin’s
  • 30C is 86F
  • +

    🤖 Try out AI Assistant!

    + +

    Below are just a few of the ways you can use AI Assistant within your app. Since you can define your own custom prompts, the sky really is the limit!

    +

     🎭 Changing tone  Lighten up the sentence below by selecting the text, clicking , and choosing Change tone > Friendly.

    +
    +

    The 3Q23 financial results followed a predictable trend, reflecting the status quo from previous years.

    +
    +

    📝 Summarizing – Below is a long paragraph that people may not want to read from start to finish. Get a quick summary by selecting the text, clicking , and choosing Summarize content.

    +
    +

    Population growth in the 17th century was marked by significant increment in the number of people around the world. Various factors contributed to this demographic trend. Firstly, advancements in agriculture and technology resulted in increased food production and improved living conditions. This led to decreased mortality rates and better overall health, allowing for more individuals to survive and thrive. Additionally, the exploration and expansion of European powers, such as colonization efforts, fostered migration and settlement in new territories.

    +
    +

    💡 Writing from scratch – Ask AI Assistant to generate content from scratch by clicking , and typing Write a marketing email announcing TinyMCE's new AI Assistant plugin.

    +

     

    +

    Note on the included Templates demonstration

    diff --git a/modules/ROOT/examples/live-demos/full-featured/index.js b/modules/ROOT/examples/live-demos/full-featured/index.js index 46b7d6cf88..2404c2e0ec 100644 --- a/modules/ROOT/examples/live-demos/full-featured/index.js +++ b/modules/ROOT/examples/live-demos/full-featured/index.js @@ -1,3 +1,7 @@ +const fetchApi = import( + "https://unpkg.com/@microsoft/fetch-event-source@2.0.1/lib/esm/index.js" +).then((module) => module.fetchEventSource); + /* Script to import faker.js for generating random data for demonstration purposes */ tinymce.ScriptLoader.loadScripts(['https://cdn.jsdelivr.net/npm/faker@5/dist/faker.min.js']).then(() => { @@ -140,6 +144,136 @@ tinymce.ScriptLoader.loadScripts(['https://cdn.jsdelivr.net/npm/faker@5/dist/fak const useDarkMode = window.matchMedia('(prefers-color-scheme: dark)').matches; const isSmallScreen = window.matchMedia('(max-width: 1023.5px)').matches; + const ai_request = (request, respondWith) => { + respondWith.stream((signal, streamMessage) => { + // Adds each previous query and response as individual messages + const conversation = request.thread.flatMap((event) => { + if (event.response) { + return [ + { role: "user", content: event.request.query }, + { role: "assistant", content: event.response.data }, + ]; + } else { + return []; + } + }); + + // System messages provided by the plugin to format the output as HTML content. + const systemMessages = request.system.map((content) => ({ + role: "system", + content, + })); + + // Forms the new query sent to the API + const content = + request.context.length === 0 || conversation.length > 0 + ? request.query + : `Question: ${request.query} Context: """${request.context}"""`; + + const messages = [ + ...conversation, + ...systemMessages, + { role: "user", content }, + ]; + + let hasHead = false; + let markdownHead = ""; + + const hasMarkdown = (message) => { + if (message.includes("`") && markdownHead !== "```") { + const numBackticks = message.split("`").length - 1; + markdownHead += "`".repeat(numBackticks); + if (hasHead && markdownHead === "```") { + markdownHead = ""; + hasHead = false; + } + return true; + } else if (message.includes("html") && markdownHead === "```") { + markdownHead = ""; + hasHead = true; + return true; + } + return false; + }; + + const requestBody = { + model: "gpt-4o", + temperature: 0.7, + max_tokens: 4000, + messages, + stream: true, + }; + + const openAiOptions = { + signal, + method: "POST", + headers: { + "Content-Type": "application/json", + Authorization: `Bearer {{ openai_proxy_token }}`, + }, + body: JSON.stringify(requestBody), + }; + + const onopen = async (response) => { + if (response) { + const contentType = response.headers.get("content-type"); + if (response.ok && contentType?.includes("text/event-stream")) { + return; + } else if (contentType?.includes("application/json")) { + const data = await response.json(); + if (data.error) { + throw new Error(`${data.error.type}: ${data.error.message}`); + } + } + } else { + throw new Error("Failed to communicate with the ChatGPT API"); + } + }; + + // This function passes each new message into the plugin via the `streamMessage` callback. + const onmessage = (ev) => { + const data = ev.data; + if (data !== "[DONE]") { + const parsedData = JSON.parse(data); + const firstChoice = parsedData?.choices[0]; + const message = firstChoice?.delta?.content; + if (message && message !== "") { + if (!hasMarkdown(message)) { + streamMessage(message); + } + } + } + }; + + const onerror = (error) => { + // Stop operation and do not retry by the fetch-event-source + throw error; + }; + + // Use microsoft's fetch-event-source library to work around the 2000 character limit + // of the browser `EventSource` API, which requires query strings + return fetchApi + .then((fetchEventSource) => + fetchEventSource("{{ openai_proxy_url }}", { + ...openAiOptions, + openWhenHidden: true, + onopen, + onmessage, + onerror, + }) + ) + .then(async (response) => { + if (response && !response.ok) { + const data = await response.json(); + if (data.error) { + throw new Error(`${data.error.type}: ${data.error.message}`); + } + } + }) + .catch(onerror); + }); + }; + // revisionhistory_fetch const fetchRevisions = () => { return new Promise((resolve, _reject) => { @@ -285,7 +419,7 @@ tinymce.ScriptLoader.loadScripts(['https://cdn.jsdelivr.net/npm/faker@5/dist/fak tinymce.init({ selector: 'textarea#full-featured', - plugins: 'preview powerpaste casechange importcss tinydrive searchreplace autolink autosave save directionality advcode visualblocks visualchars fullscreen image link math media mediaembed codesample table charmap pagebreak nonbreaking anchor tableofcontents insertdatetime advlist lists checklist wordcount tinymcespellchecker a11ychecker editimage help formatpainter permanentpen pageembed charmap tinycomments mentions quickbars linkchecker emoticons advtable footnotes mergetags autocorrect typography advtemplate markdown revisionhistory', + plugins: 'ai preview powerpaste casechange importcss tinydrive searchreplace autolink autosave save directionality advcode visualblocks visualchars fullscreen image link math media mediaembed codesample table charmap pagebreak nonbreaking anchor tableofcontents insertdatetime advlist lists checklist wordcount tinymcespellchecker a11ychecker editimage help formatpainter permanentpen pageembed charmap tinycomments mentions quickbars linkchecker emoticons advtable footnotes mergetags autocorrect typography advtemplate markdown revisionhistory', editimage_cors_hosts: ['picsum.photos'], tinydrive_token_provider: (success, failure) => { success({ token: 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJqb2huZG9lIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.Ks_BdfH4CWilyzLNk8S2gDARFhuxIauLa8PwhdEQhEo' }); @@ -295,7 +429,7 @@ tinymce.ScriptLoader.loadScripts(['https://cdn.jsdelivr.net/npm/faker@5/dist/fak tinydrive_google_drive_key: 'AIzaSyAsVRuCBc-BLQ1xNKtnLHB3AeoK-xmOrTc', tinydrive_google_drive_client_id: '748627179519-p9vv3va1mppc66fikai92b3ru73mpukf.apps.googleusercontent.com', mobile: { - plugins: 'preview powerpaste casechange importcss tinydrive searchreplace autolink autosave save directionality advcode visualblocks visualchars fullscreen image link math media mediaembed codesample table charmap pagebreak nonbreaking anchor tableofcontents insertdatetime advlist lists checklist wordcount tinymcespellchecker a11ychecker help formatpainter pageembed charmap mentions quickbars linkchecker emoticons advtable footnotes mergetags autocorrect typography advtemplate', + plugins: 'ai preview powerpaste casechange importcss tinydrive searchreplace autolink autosave save directionality advcode visualblocks visualchars fullscreen image link math media mediaembed codesample table charmap pagebreak nonbreaking anchor tableofcontents insertdatetime advlist lists checklist wordcount tinymcespellchecker a11ychecker help formatpainter pageembed charmap mentions quickbars linkchecker emoticons advtable footnotes mergetags autocorrect typography advtemplate', }, menu: { tc: { @@ -435,6 +569,7 @@ tinymce.ScriptLoader.loadScripts(['https://cdn.jsdelivr.net/npm/faker@5/dist/fak title: 'Salutation' } ], + ai_request, revisionhistory_fetch: fetchRevisions, revisionhistory_author: { id: 'john.doe', diff --git a/modules/ROOT/pages/full-featured-premium-demo.adoc b/modules/ROOT/pages/full-featured-premium-demo.adoc index 97f77ccbd6..1e6e1c0faa 100644 --- a/modules/ROOT/pages/full-featured-premium-demo.adoc +++ b/modules/ROOT/pages/full-featured-premium-demo.adoc @@ -18,9 +18,6 @@ The following plugins are excluded from this example: |Excluded plugins |Notes -|xref:ai.adoc[AI Assistant] -|Logistical concerns regarding exposing API keys preclude adding this. - |xref:autoresize.adoc[Autoresize] |Resizes the editor to fit the content. From a6ab98073a012fabd92e4043de427f7bda1671bc Mon Sep 17 00:00:00 2001 From: Farzad Hayat Date: Thu, 22 Aug 2024 13:32:31 +1000 Subject: [PATCH 62/97] DOC-2501: 7.3 Post Release Clean-ups (#3426) * DOC-2501: Add explanation for Export to Word service URL version appending * DOC-2501: Add #TINY-11115 to "Colorpicker number input fields now show an error tooltip and error icon when invalid text has been entered." entry * DOC-2501: Move "Unnecessary `nbsp` entities were inserted when typing at the edges of inline elements." to bug fixes * DOC-2501: Add "Accompanying Enhanced Skins & Icon Packs changes" xref to nav.adoc and 7.3-release-notes.adoc Overview * DOC-2501: Move "Fixed JavaScript error when inserting a table using the context menu by adjusting the event order in `renderInsertTableMenuItem`." * DOC-2501: Move "Notifications didn't position and resize properly when resizing the editor or toggling views." * DOC-2501: Move "The pattern commands would execute even if the command was not enabled." * DOC-2501: Move "Split button popups were incorrectly positioned when switching to fullscreen mode if the editor was inside a scrollable container." * DOC-2501: Move "The listbox component had a fixed width and was not a responsive ui element." * DOC-2501: Change 7.3-release-notes.adoc entry titles to match changelog.adoc * DOC-2501: Update productminorversion in antora.yml * DOC-2501: Add 'format-code' icon to icon_list.adoc * DOC-2501: Update Revision History demo editor content --- antora.yml | 2 +- .../live-demos/revisionhistory/index.html | 58 +++------ modules/ROOT/images/icons/format-code.svg | 3 + modules/ROOT/nav.adoc | 1 + modules/ROOT/pages/7.3-release-notes.adoc | 117 +++++++++--------- modules/ROOT/pages/exportword.adoc | 5 +- .../partials/configuration/icon_list.adoc | 1 + 7 files changed, 86 insertions(+), 101 deletions(-) create mode 100644 modules/ROOT/images/icons/format-code.svg diff --git a/antora.yml b/antora.yml index a2461636df..8e9ef1e30c 100644 --- a/antora.yml +++ b/antora.yml @@ -26,7 +26,7 @@ asciidoc: # product variables productname: TinyMCE productmajorversion: 7 - productminorversion: '7.2' + productminorversion: '7.3' ##### product name in codeblock prodnamecode: tinymce #### more names diff --git a/modules/ROOT/examples/live-demos/revisionhistory/index.html b/modules/ROOT/examples/live-demos/revisionhistory/index.html index 06069edad2..624dbac699 100644 --- a/modules/ROOT/examples/live-demos/revisionhistory/index.html +++ b/modules/ROOT/examples/live-demos/revisionhistory/index.html @@ -1,22 +1,12 @@ \ No newline at end of file +

    All the best from the TinyMCE team.

    + diff --git a/modules/ROOT/images/icons/format-code.svg b/modules/ROOT/images/icons/format-code.svg new file mode 100644 index 0000000000..889a8848fc --- /dev/null +++ b/modules/ROOT/images/icons/format-code.svg @@ -0,0 +1,3 @@ + + + diff --git a/modules/ROOT/nav.adoc b/modules/ROOT/nav.adoc index c3c56efb9d..2a62df0521 100644 --- a/modules/ROOT/nav.adoc +++ b/modules/ROOT/nav.adoc @@ -411,6 +411,7 @@ *** {productname} 7.3 **** xref:7.3-release-notes.adoc#overview[Overview] **** xref:7.3-release-notes.adoc#accompanying-premium-plugin-changes[Accompanying Premium plugin changes] +**** xref:accompanying-enhanced-skins-and-icon-packs-changes[Accompanying Enhanced Skins & Icon Packs changes] **** xref:7.3-release-notes.adoc#improvements[Improvements] **** xref:7.3-release-notes.adoc#additions[Additions] **** xref:7.3-release-notes.adoc#bug-fixes[Bug fixes] diff --git a/modules/ROOT/pages/7.3-release-notes.adoc b/modules/ROOT/pages/7.3-release-notes.adoc index b6e5e8c4e3..05929c129d 100644 --- a/modules/ROOT/pages/7.3-release-notes.adoc +++ b/modules/ROOT/pages/7.3-release-notes.adoc @@ -14,6 +14,7 @@ include::partial$misc/admon-releasenotes-for-stable.adoc[] {productname} {release-version} was released for {enterpriseversion} and {cloudname} on Wednesday, August 7^th^, 2024. These release notes provide an overview of the changes for {productname} {release-version}, including: * xref:accompanying-premium-plugin-changes[Accompanying Premium plugin changes] +* xref:accompanying-enhanced-skins-and-icon-packs-changes[Accompanying Enhanced Skins & Icon Packs changes] * xref:improvements[Improvements] * xref:additions[Additions] * xref:bug-fixes[Bug fixes] @@ -227,17 +228,6 @@ As a consequence, this resulted in the unintended inclusion of head tag content As a result, the editor now correctly handles full document content without misplacing head elements into the body, ensuring cleaner and more accurate content loading. -=== Unnecessary `nbsp` entities were inserted when typing at the edges of inline elements. -// #TINY-10854 - -Previously, the replacement mechanism for `+ +` did not account for nearby elements when converting non-breaking spaces to regular spaces. - -As a consequence, when typing a sequence like "a space b," the output was correct. However, if the "b" was wrapped in an inline element (such as bold), the `+ +` remained instead of being replaced. - -{productname} {release-version} addresses this issue. Now, the normalization process triggers when an inline format is applied, affecting the previous sibling element to ensure spaces are properly converted. - -As a result, non-breaking spaces between different inline elements are now normalized, preventing unnecessary `+ +` entities. - [[additions]] == Additions @@ -245,7 +235,7 @@ As a result, non-breaking spaces between different inline elements are now norma {productname} {release-version} also includes the following addition: === Colorpicker number input fields now show an error tooltip and error icon when invalid text has been entered. -// #TINY-10799 +// #TINY-10799 / #TINY-11115 Previously, the color picker HEX value input field only displayed a red outline and an aria label reading "invalid data" when users entered invalid values. This lacked sufficient detail to help users correct their input. @@ -273,7 +263,55 @@ image::color-picker/color-picker-error-message-hex.png[color picker error messag {productname} {release-version} also includes the following bug fixes: -=== Consecutive HTML comments would in some cases generate unwanted elements. +=== Unnecessary nbsp entities were inserted when typing at the edges of inline elements. +// #TINY-10854 + +Previously, the replacement mechanism for `+ +` did not account for nearby elements when converting non-breaking spaces to regular spaces. + +As a consequence, when typing a sequence like "a space b," the output was correct. However, if the "b" was wrapped in an inline element (such as bold), the `+ +` remained instead of being replaced. + +{productname} {release-version} addresses this issue. Now, the normalization process triggers when an inline format is applied, affecting the previous sibling element to ensure spaces are properly converted. + +As a result, non-breaking spaces between different inline elements are now normalized, preventing unnecessary `+ +` entities. + +=== Fixed JavaScript error when inserting a table using the context menu by adjusting the event order in `renderInsertTableMenuItem`. +// #TINY-6887 + +Previously in {productname}, a JavaScript warning would appear when attempting to insert a table from the context menu while using both the `table` and `autoresize` plugins. This warning was caused by the `onAction` event hiding the context menu, followed by an attempt to close the already hidden context menu, resulting in the warning message: + +[quote] +"Uncaught Error: The component must be in a context to send: triggerEvent is not in context." + +NOTE: This warning did not impact the functionality of table insertion, but it could be confusing for users. + +In {productname} {release-version}, this issue has been resolved by adjusting the order of function calls in the code. Now, the context menu is closed before the `onAction` event is triggered when inserting a table from the context menu. As a result, the table is now inserted as expected without any JavaScript warnings. + +=== Notifications didn't position and resize properly when resizing the editor or toggling views. +// #TINY-10894 + +Previously, the function responsible for recalculating the width of notifications only added a width if the notification's width exceeded the boundaries. + +As a consequence, when notifications were constrained by boundaries, an additional width was added. However, if the boundaries were later increased, the added width was not adjusted accordingly. + +{productname} {release-version} addresses this issue. Now, the function adds width when the notification's width exceeds the boundaries but also removes this width when necessary. + +As a result, notifications now resize correctly when the boundaries increase, ensuring their width adjusts as expected. + +=== The pattern commands would execute even if the command was not enabled. +// #TINY-10994 + +Previously in {productname}, the `text_patterns` commands would attempt to execute even if the functionality were not supported in the current editor context. As a consequence, the command would fail and the editor would display unexpected behavior. For example, typing "1. " without the `lists` plugin enabled would delete the text instead of converting it to a list. + +This issue has been resolved in {productname} {release-version}. The editor now filters `text_patterns` to only the supported commands. For example, typing "1. " without the `lists` plugin enabled will no longer fire a text pattern and instead retain the text as plain text. + +=== Split button popups were incorrectly positioned when switching to fullscreen mode if the editor was inside a scrollable container. +// #TINY-10973 + +Previously in {productname}, there was an issue where split button popups would be positioned incorrectly when opened within a scrollable container and the editor was in `fullscreen` mode. The behavior occurred because the box constraints for the split button popup did not take the `fullscreen` mode into account when calculating the position, resulting in an incorrect placement of the popup. + +In {productname} {release-version}, this issue has been fixed. The box constraints for the split button popup are now correctly calculated when the editor is in a scrollable container and in `fullscreen` mode. As a result, the split button popup is now positioned correctly. + +=== Sequential html comments would in some cases generate unwanted elements. // #TINY-10955 Previously in {productname}, consecutive HTML comments would generate unwanted elements in the editor. For example, when inserting the following HTML into the editor: @@ -308,13 +346,6 @@ In {productname} {release-version}, this issue has been resolved. The editor now As a result, no extra paragraphs are generated. -=== `preventDefault` on mousedown on toolbar buttons was causing misplaced focus bugs. -// #TINY-10638 - -In previous versions of {productname}, the `preventDefault` on mousedown in the toolbar button component caused focus issues. As a consequence, when clicking on different toolbar buttons, the focus was not updated, leaving the initial button highlighted. - -{productname} {release-version} addresses this issue by removing the `preventDefault`, allowing the focus to change as expected when users click on the image controls (ie. zoom in and out). - === The listbox component had a fixed width and was not a responsive ui element. // #TINY-10884 @@ -322,6 +353,13 @@ Previously, the listbox component was not responsive as a UI element, due to a f This issue has been resolved in {productname} {release-version} by removing the fixed width setting, allowing the listbox component to function as a responsive UI element. +=== Prevent default mousedown on toolbar buttons was causing misplaced focus bugs. +// #TINY-10638 + +In previous versions of {productname}, the `preventDefault` on mousedown in the toolbar button component caused focus issues. As a consequence, when clicking on different toolbar buttons, the focus was not updated, leaving the initial button highlighted. + +{productname} {release-version} addresses this issue by removing the `preventDefault`, allowing the focus to change as expected when users click on the image controls (ie. zoom in and out). + === Attempting to use focus commands on an editor where the cursor had last been in certain `+contentEditable="true"+` elements would fail. // #TINY-11085 @@ -329,41 +367,4 @@ Previously, when `+contentEditable="true"+` (CET) fields where not wrapped in `+ {productname} {release-version} addresses this issue. Now, when (CET) fields are **not wrapped** in (CEF) elements, the editor directs the focus to the body of the editor first. -As a result, the editor now correctly returns focus as expected, ensuring seamless user interactions. - -=== Fixed JavaScript error when inserting a table using the context menu by adjusting the event order in `renderInsertTableMenuItem`. -// #TINY-6887 - -Previously in {productname}, a JavaScript warning would appear when attempting to insert a table from the context menu while using both the `table` and `autoresize` plugins. This warning was caused by the `onAction` event hiding the context menu, followed by an attempt to close the already hidden context menu, resulting in the warning message: - -[quote] -"Uncaught Error: The component must be in a context to send: triggerEvent is not in context." - -NOTE: This warning did not impact the functionality of table insertion, but it could be confusing for users. - -In {productname} {release-version}, this issue has been resolved by adjusting the order of function calls in the code. Now, the context menu is closed before the `onAction` event is triggered when inserting a table from the context menu. As a result, the table is now inserted as expected without any JavaScript warnings. - -=== Notifications didn't position and resize properly when resizing the editor or toggling views. -// #TINY-10894 - -Previously, the function responsible for recalculating the width of notifications only added a width if the notification's width exceeded the boundaries. - -As a consequence, when notifications were constrained by boundaries, an additional width was added. However, if the boundaries were later increased, the added width was not adjusted accordingly. - -{productname} {release-version} addresses this issue. Now, the function adds width when the notification's width exceeds the boundaries but also removes this width when necessary. - -As a result, notifications now resize correctly when the boundaries increase, ensuring their width adjusts as expected. - -=== Split button popups were incorrectly positioned when switching to fullscreen mode if the editor was inside a scrollable container. -// #TINY-10973 - -Previously in {productname}, there was an issue where split button popups would be positioned incorrectly when opened within a scrollable container and the editor was in `fullscreen` mode. The behavior occurred because the box constraints for the split button popup did not take the `fullscreen` mode into account when calculating the position, resulting in an incorrect placement of the popup. - -In {productname} {release-version}, this issue has been fixed. The box constraints for the split button popup are now correctly calculated when the editor is in a scrollable container and in `fullscreen` mode. As a result, the split button popup is now positioned correctly. - -=== The pattern commands would execute even if the command was not enabled. -// #TINY-10994 - -Previously in {productname}, the `text_patterns` commands would attempt to execute even if the functionality were not supported in the current editor context. As a consequence, the command would fail and the editor would display unexpected behavior. For example, typing "1. " without the `lists` plugin enabled would delete the text instead of converting it to a list. - -This issue has been resolved in {productname} {release-version}. The editor now filters `text_patterns` to only the supported commands. For example, typing "1. " without the `lists` plugin enabled will no longer fire a text pattern and instead retain the text as plain text. \ No newline at end of file +As a result, the editor now correctly returns focus as expected, ensuring seamless user interactions. \ No newline at end of file diff --git a/modules/ROOT/pages/exportword.adoc b/modules/ROOT/pages/exportword.adoc index f82785c76f..87f47b0b3e 100644 --- a/modules/ROOT/pages/exportword.adoc +++ b/modules/ROOT/pages/exportword.adoc @@ -40,10 +40,13 @@ tinymce.init({ selector: 'textarea', plugins: 'exportword', toolbar: 'exportword', - exportword_service_url: '' + exportword_service_url: 'http://localhost:8080/' // update to your own self-hosted service URL }); ---- +[IMPORTANT] +The `exportword_service_url` option automatically appends `/v2/convert/html-docx` to the URL provided, so only the base URL is required. For example, if the service is hosted at `http://localhost:8080/v2/convert/html-docx`, the `exportword_service_url` option should be set to `http://localhost:8080/`. + == Options The following configuration options affect the behavior of the {pluginname} plugin. diff --git a/modules/ROOT/partials/configuration/icon_list.adoc b/modules/ROOT/partials/configuration/icon_list.adoc index b98c291f2a..772dab3b63 100644 --- a/modules/ROOT/partials/configuration/icon_list.adoc +++ b/modules/ROOT/partials/configuration/icon_list.adoc @@ -64,6 +64,7 @@ | `+flip-horizontally+` | image:icons/flip-horizontally.svg[flip-horizontally.svg] | `+flip-horizontally.svg+` | `+flip-vertically+` | image:icons/flip-vertically.svg[flip-vertically.svg] | `+flip-vertically.svg+` | `+footnote+` | image:icons/footnote.svg[footnote.svg] | `+footnote.svg+` +| `+format-code+` | image:icons/format-code.svg[format-code.svg] | `+format-code.svg+` | `+format-painter+` | image:icons/format-painter.svg[format-painter.svg] | `+format-painter.svg+` | `+format+` | image:icons/format.svg[format.svg] | `+format.svg+` | `+fullscreen+` | image:icons/fullscreen.svg[fullscreen.svg] | `+fullscreen.svg+` From c4d4193e61c325783acd4cee3f391a4d7a895902 Mon Sep 17 00:00:00 2001 From: Karl Kemister-Sheppard Date: Wed, 28 Aug 2024 16:24:06 +1000 Subject: [PATCH 63/97] DOC-2510: Temporarily remove api-ref link from importword plugin documentation. (#3431) --- modules/ROOT/pages/importword.adoc | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/modules/ROOT/pages/importword.adoc b/modules/ROOT/pages/importword.adoc index 36e7bf33b2..d56f7151b4 100644 --- a/modules/ROOT/pages/importword.adoc +++ b/modules/ROOT/pages/importword.adoc @@ -53,8 +53,4 @@ include::partial$misc/plugin-menu-item-id-boilerplate.adoc[] The {pluginname} plugin provides the following {productname} commands. -include::partial$commands/{plugincode}-cmds.adoc[] - -== API Reference - -> Explore the comprehensive API documentation for the {pluginname} Premium plugin at link:https://importdocx.converter.tiny.cloud/v2/convert/docs#section/Import-from-Word[Import from Word.^] \ No newline at end of file +include::partial$commands/{plugincode}-cmds.adoc[] \ No newline at end of file From 22f23a47a00593ca9e349cd56c84212a2313d05b Mon Sep 17 00:00:00 2001 From: Karl Kemister-Sheppard Date: Wed, 9 Oct 2024 15:34:31 +1000 Subject: [PATCH 64/97] DOC-2511: TinyMCE 7.4 Release Documentation. (#3433) * DOC-2511: TinyMCE 7.4 Release Documentation. * DOC-2524: Comments Premium Plugin Documentation Improvements (#3453) * DOC-2524: EPIC branch initial commit. * DOC-2524: Update: Commands, Events and APIs (Comments) (#3462) * DOC-2524: Update: Embedded Mode (Comments). (#3459) * DOC-2524: Update: Introduction (Comments) (#3456) * DOC-2524: Update: Toolbar Buttons and Menu Items (Comments) (#3460) * DOC-2524: New `tinycomments` option: Comments can be made and read, but the editor is in a readonly state. (#3461) * DOC-2524: New comments option: Comments can be made and read, but the editor is in a readonly state. * DOC-2524: revert live_demo testing url. * Update modules/ROOT/examples/live-demos/comments-readonly-mode/index.js Co-authored-by: Mitchell Crompton * Update modules/ROOT/examples/live-demos/comments-readonly-mode/index.js Co-authored-by: Mitchell Crompton * Update modules/ROOT/partials/configuration/comments-tinycomments_access.adoc Co-authored-by: Mitchell Crompton * Update modules/ROOT/partials/configuration/comments-tinycomments_access.adoc Co-authored-by: shirqa <43625458+ShiridiGandham@users.noreply.github.com> * Update modules/ROOT/pages/comments-options.adoc Co-authored-by: shirqa <43625458+ShiridiGandham@users.noreply.github.com> * Update modules/ROOT/examples/live-demos/comments-readonly-mode/index.js Co-authored-by: Mitchell Crompton * Update modules/ROOT/partials/configuration/comments-tinycomments_access.adoc Co-authored-by: shirqa <43625458+ShiridiGandham@users.noreply.github.com> * DOC-2524: file name change, remove button from demo and update headers. * Update modules/ROOT/partials/configuration/comments-tinycomments_access.adoc Co-authored-by: Shan * DOC-2524: Restructured tinycomments_access.adoc, removed basic config. * Update modules/ROOT/partials/configuration/comments-tinycomments_access.adoc Co-authored-by: Mitchell Crompton * Update modules/ROOT/partials/configuration/comments-tinycomments_access.adoc Co-authored-by: Mitchell Crompton * Update modules/ROOT/partials/configuration/comments-tinycomments_access.adoc Co-authored-by: Mitchell Crompton * Update modules/ROOT/partials/configuration/comments-tinycomments_access.adoc Co-authored-by: Mitchell Crompton * Update modules/ROOT/partials/configuration/comments-tinycomments_access.adoc Co-authored-by: shirqa <43625458+ShiridiGandham@users.noreply.github.com> * Update modules/ROOT/partials/configuration/comments-tinycomments_access.adoc Co-authored-by: shirqa <43625458+ShiridiGandham@users.noreply.github.com> * Update modules/ROOT/partials/configuration/comments-tinycomments_access.adoc Co-authored-by: Mitchell Crompton * Update modules/ROOT/partials/configuration/comments-tinycomments_access.adoc Co-authored-by: Mitchell Crompton * Update modules/ROOT/partials/configuration/comments-tinycomments_access.adoc Co-authored-by: Mitchell Crompton * Update modules/ROOT/examples/live-demos/comments-ui-mode/index.html Co-authored-by: tiny-ben-tran --------- Co-authored-by: Mitchell Crompton Co-authored-by: shirqa <43625458+ShiridiGandham@users.noreply.github.com> Co-authored-by: Shan Co-authored-by: tiny-ben-tran * DOC-2524: Update: Callback Mode (Comments) (#3458) * DOC-2524: Callback Mode (Comments) * Revert live_demo_url from testing. * Update modules/ROOT/examples/live-demos/comments-callback/example.js Co-authored-by: Hamza Benkhaldoun * Update modules/ROOT/examples/live-demos/comments-callback/index.js Co-authored-by: Hamza Benkhaldoun * Update modules/ROOT/partials/configuration/tinycomments_delete_comment.adoc Co-authored-by: Hamza Benkhaldoun * Update modules/ROOT/partials/configuration/tinycomments_fetch.adoc Co-authored-by: Hamza Benkhaldoun * Update modules/ROOT/pages/comments-callback-mode.adoc * Update modules/ROOT/pages/comments-callback-mode.adoc * DOC-2524: move tinycomments_fetch to optional options, updated examples to reflect optional callback. * DOC-2524: fix optional options header level. * Update modules/ROOT/partials/configuration/tinycomments_lookup.adoc Co-authored-by: tiny-ben-tran * Update modules/ROOT/examples/live-demos/comments-callback/example.js * Update modules/ROOT/examples/live-demos/comments-callback/index.js * Update modules/ROOT/partials/configuration/tinycomments_resolve.adoc Co-authored-by: tiny-ben-tran * DOC-2524: Update comments callback demo * Update modules/ROOT/partials/configuration/tinycomments_reply.adoc Co-authored-by: Karl Kemister-Sheppard * Update modules/ROOT/pages/comments-callback-mode.adoc Co-authored-by: tiny-ben-tran * Update modules/ROOT/pages/comments-callback-mode.adoc Co-authored-by: tiny-ben-tran * DOC-2524: update example.js and tinycomments_fetch example to match demo updates. * Update modules/ROOT/pages/comments-callback-mode.adoc Co-authored-by: Farzad Hayat * Update modules/ROOT/pages/comments-callback-mode.adoc Co-authored-by: Farzad Hayat * DOC-2524: Add initial comments to callback demo * DOC-2524: Fix initialDB structure * Update modules/ROOT/examples/live-demos/comments-callback/index.js Co-authored-by: Farzad Hayat * Update modules/ROOT/examples/live-demos/comments-callback/example.js Co-authored-by: Farzad Hayat --------- Co-authored-by: Hamza Benkhaldoun Co-authored-by: tiny-ben-tran Co-authored-by: Farzad Hayat * DOC-2524: Update: Using Comments (Comments) (#3457) * DOC-2524: Update: Using Comments (Comments) * DOC-2524: update png files. * Update modules/ROOT/pages/comments-using-comments.adoc Co-authored-by: Farzad Hayat * Update modules/ROOT/pages/comments-using-comments.adoc Co-authored-by: Farzad Hayat * DOC-2524: Relocate .png in delete-a-comment. * DOC-2524: remove comment-edit-comment-ellipsis.png duplicate. * DOC-2524: add guide to replying to comment and supporting screenshots. * Update modules/ROOT/pages/comments-using-comments.adoc Co-authored-by: Farzad Hayat * DOC-2524: Replace png files with hi-res. --------- Co-authored-by: Farzad Hayat --------- Co-authored-by: Mitchell Crompton Co-authored-by: shirqa <43625458+ShiridiGandham@users.noreply.github.com> Co-authored-by: Shan Co-authored-by: tiny-ben-tran Co-authored-by: Hamza Benkhaldoun Co-authored-by: Farzad Hayat * DOC-2513: TinyMCE 7.4 Release notes & community release. (#3434) * DOC-2513: TinyMCE 7.4 Release notes & community changelog. * DOC-2513: Sidebar could not be toggled until the skin was loaded. * Revert "DOC-2513: Sidebar could not be toggled until the skin was loaded." This reverts commit 847c9a9a2d15899dc0be2cfcf55dd5673a5c4af0. * DOC-2513: New option to opt-in to keep math annotations with specific encodings. (#3447) * DOC-2513: New option to opt-in to keep math annotations with specific encodings. * Update modules/ROOT/pages/7.4-release-notes.adoc Co-authored-by: Farzad Hayat * Update modules/ROOT/pages/7.4-release-notes.adoc --------- Co-authored-by: Farzad Hayat * DOC-2513: Dialog list dropdown menus now close when the browser window resizes. (#3443) * DOC-2513: Formatter would not remove empty lines. (#3442) * DOC-2513: Formatter would not remove empty lines. * DOC-2513: copy edits. * Update modules/ROOT/pages/7.4-release-notes.adoc Co-authored-by: Farzad Hayat --------- Co-authored-by: Farzad Hayat * DOC-2513: Formatting indent size would be different than CodeMirror indent size. (#3441) * DOC-2513: Formatting indent size would be different than CodeMirror indent size. * DOC-2513: correct paragraph styling. * Update modules/ROOT/pages/7.4-release-notes.adoc * DOC-2513: Caret would unexpectedly shift to the `non-editable` table row above when pressing Enter. (#3437) * DOC-2513: Caret would unexpectedly go to a not editable table row above when user pressed enter. * DOC-2513: fix type in title. * DOC-2513: Mouse hover on partially visible dialog collection elements no longer scrolls. (#3435) * DOC-2513: Mouse hover on partially visible dialog collection elements no longer scrolls * Update modules/ROOT/pages/7.4-release-notes.adoc Co-authored-by: Farzad Hayat * Update modules/ROOT/pages/7.4-release-notes.adoc --------- Co-authored-by: Farzad Hayat * DOC-2513: Sidebar could not be toggled until the skin was loaded. (#3439) * DOC-2513: Pasting a table now places the cursor after the table instead of into the last table cell. (#3438) * DOC-2513: Pasting a table now places the cursor after the table instead of into the last table cell. * DOC-2513: move to improvements sections. * DOC-2513: Format button would lose focus after action while navigating through keyboard. (#3440) * DOC-2513: Format button would lose focus after action while navigating through keyboard. * Update modules/ROOT/pages/7.4-release-notes.adoc * Update modules/ROOT/pages/7.4-release-notes.adoc * DOC-2513: Copying tables to the clipboard did not correctly separate cells and rows for the "text/plain" MIME type. (#3449) * DOC-2513: Copying tables to the clipboard did not correctly separate cells and rows for the text/plain MIME type. * Update modules/ROOT/pages/7.4-release-notes.adoc Co-authored-by: ltrouton <46954949+ltrouton@users.noreply.github.com> --------- Co-authored-by: ltrouton <46954949+ltrouton@users.noreply.github.com> * DOC-2513: New `importword_converter_options` option that allows customizing the conversion. (#3448) * DOC-2513: New importword_converter_options option that allows customizing the conversion. * Update modules/ROOT/partials/configuration/importword.adoc Co-authored-by: Farzad Hayat * Update modules/ROOT/partials/configuration/importword.adoc * DOC-2513: Copy edits, fixes and seperation of partials. --------- Co-authored-by: Farzad Hayat * DOC-2513: The editor resize handle was incorrectly rendered when all components were removed from the status bar. (#3450) * DOC-2513: Add TINY-11257 release note entry * Fix grammer * Update modules/ROOT/pages/7.4-release-notes.adoc Co-authored-by: Karl Kemister-Sheppard --------- Co-authored-by: Karl Kemister-Sheppard * DOC-2513: The image dialog lost focus after closing an image upload error alert. (#3446) * Placing the cursor after a table with a `
    ` element would misplace added newlines before the table instead of after it. (#3445) * Placing the cursor after a table with a BR element would misplace added newlines before the table instead of after it. * Update modules/ROOT/pages/7.4-release-notes.adoc * DOC-2513: Deleting a selection in a list element would sometimes prevent the input event from being dispatched. (#3444) * DOC-2513: Insert lists will no longer unexpectedly generate indented lists. (#3466) * DOC-2513: Insert lists will no longer unexpectedly generate indented lists. * DOC-2513: update to reflect fix rather than improvement. * DOC-2513: Cursor would jump to the previous line after pressing `shift + enter` if the annotation was applied. (#3464) * DOC-2513: Cursor would jump to the previous line after pressing shift + enter if the annotation was applied. * DOC-2513: add header and link to plugin doc in release notes. * DOC-2513: As you type spellchecking did not update when scrolling with the `autoresize` plugin active. (#3465) * DOC-2513: As you type spellchecking did not update when scrolling with the plugin active. * Update modules/ROOT/pages/7.4-release-notes.adoc * Update modules/ROOT/pages/7.4-release-notes.adoc Co-authored-by: tiny-ben-tran --------- Co-authored-by: tiny-ben-tran * DOC-2513: Made importword_service_url, exportword_service_url and exportpdf_service_url option more fault tolerant. (#3451) * DOC-2513: In read-only mode the editor now allows normal cursor movement and block element selection, including video playback & New property for all ui components. (#3463) * DOC-2513: In read-only mode the editor now allows normal cursor movement and block element selection, including video playback & New property for all ui components. * DOC-2513: Add state update section * DOC-2513: Fix including admon in tables * DOC-2513: Copy edits. * DOC-2513: Add `context` property to Custom Dialog Components and Custom Dialog Footer Buttons. * Update modules/ROOT/pages/dialog-components.adoc * Update modules/ROOT/pages/dialog-components.adoc * Update modules/ROOT/pages/dialog-components.adoc * Update modules/ROOT/pages/dialog-footer-buttons.adoc * Update modules/ROOT/pages/dialog-footer-buttons.adoc --------- Co-authored-by: shanmen-tiny Co-authored-by: Farzad Hayatbakhsh * DOC-2513: Added changelog for TinyMCE 7.4 core changes. * DOC-2513: Categories can now be declared as `locked`, making them readonly. (#3467) * DOC-2513: Categories can now be declared as locked, making them readonly. * Update modules/ROOT/pages/advanced-templates.adoc * Update modules/ROOT/examples/live-demos/advtemplate-readonly-template/example.js Co-authored-by: tiny-ben-tran * Update modules/ROOT/examples/live-demos/advtemplate-readonly-template/example.js Co-authored-by: tiny-ben-tran * Update modules/ROOT/examples/live-demos/advtemplate-readonly-template/index.js Co-authored-by: tiny-ben-tran * Update modules/ROOT/examples/live-demos/advtemplate-readonly-template/index.js Co-authored-by: tiny-ben-tran * Update modules/ROOT/pages/advanced-templates.adoc Co-authored-by: Farzad Hayat * Update modules/ROOT/pages/advanced-templates.adoc Co-authored-by: tiny-ben-tran * DOC-2513: Add advtemplate commands to editor-command-identifiers.adoc * DOC-2513: fix store variable declaration issue, add missing semicolons and added advtemplate_get_template throw error. * Update modules/ROOT/pages/7.4-release-notes.adoc * Update modules/ROOT/pages/advanced-templates.adoc Co-authored-by: Farzad Hayat * Update modules/ROOT/pages/7.4-release-notes.adoc * Update modules/ROOT/pages/advanced-templates.adoc Co-authored-by: Farzad Hayat * Update modules/ROOT/pages/advanced-templates.adoc Co-authored-by: Farzad Hayat * Add missing semi colons and replace double quotes with single qoutes --------- Co-authored-by: tiny-ben-tran Co-authored-by: Farzad Hayat * DOC-2513: copy edits, template cleanup. * DOC-2513: remove Added focus function to view button api, as duplicate. * DOC-2513: Add known issues to 7.4 release notes. --------- Co-authored-by: Farzad Hayatbakhsh Co-authored-by: ltrouton <46954949+ltrouton@users.noreply.github.com> Co-authored-by: tiny-ben-tran Co-authored-by: shanmen-tiny --------- Co-authored-by: Mitchell Crompton Co-authored-by: shirqa <43625458+ShiridiGandham@users.noreply.github.com> Co-authored-by: Shan Co-authored-by: tiny-ben-tran Co-authored-by: Hamza Benkhaldoun Co-authored-by: Farzad Hayat Co-authored-by: ltrouton <46954949+ltrouton@users.noreply.github.com> --- antora.yml | 2 +- .../advtemplate-readonly-template/example.js | 102 +++++ .../advtemplate-readonly-template/index.html | 52 +++ .../advtemplate-readonly-template/index.js | 348 ++++++++++++++++ .../live-demos/comments-callback/example.js | 44 +- .../live-demos/comments-callback/index.html | 2 +- .../live-demos/comments-callback/index.js | 89 +++- .../live-demos/comments-embedded/index.js | 8 +- .../comments-readonly-mode/index.html | 36 ++ .../comments-readonly-mode/index.js | 26 ++ .../live-demos/comments-ui-mode/index.html | 38 ++ .../live-demos/comments-ui-mode/index.js | 11 + modules/ROOT/images/comment-add-comment.png | Bin 0 -> 47630 bytes .../ROOT/images/comment-comment-created.png | Bin 0 -> 49419 bytes ...ent-delete-all-conversations-file-menu.png | Bin 0 -> 46442 bytes .../comment-delete-all-conversations.png | Bin 0 -> 56225 bytes .../images/comment-delete-comment-dialog.png | Bin 0 -> 192159 bytes .../ROOT/images/comment-delete-comment.png | Bin 0 -> 89722 bytes .../comment-delete-conversation-dialog.png | Bin 0 -> 218568 bytes .../images/comment-delete-conversation.png | Bin 0 -> 89618 bytes modules/ROOT/images/comment-edit-comment.png | Bin 0 -> 62921 bytes ...comment-edit-existing-comment-ellipsis.png | Bin 0 -> 49753 bytes .../ROOT/images/comment-edited-comment.png | Bin 0 -> 52451 bytes .../comment-reply-add-comment-focus.png | Bin 0 -> 56119 bytes .../comment-reply-add-comment-pre-submit.png | Bin 0 -> 92821 bytes .../comment-reply-add-comment-textarea.png | Bin 0 -> 70625 bytes .../ROOT/images/comment-reply-add-comment.png | Bin 0 -> 17704 bytes .../images/comment-reply-to-comment-done.png | Bin 0 -> 29278 bytes .../comment-reply-to-comment-submitted.png | Bin 0 -> 103879 bytes .../images/comment-resolve-conversation.png | Bin 0 -> 127558 bytes .../ROOT/images/comments-delete-comment.png | Bin 43382 -> 0 bytes .../images/comments-delete-conversation.png | Bin 32697 -> 0 bytes .../images/comments-delete-conversations.png | Bin 21163 -> 0 bytes modules/ROOT/images/comments-edit.png | Bin 37432 -> 0 bytes .../images/comments-resolve-conversation.png | Bin 32917 -> 0 bytes modules/ROOT/nav.adoc | 9 + modules/ROOT/pages/7.4-release-notes.adoc | 380 ++++++++++++++++++ modules/ROOT/pages/advanced-templates.adoc | 37 ++ modules/ROOT/pages/changelog.adoc | 39 ++ .../ROOT/pages/comments-access-options.adoc | 13 + .../ROOT/pages/comments-callback-mode.adoc | 42 +- .../pages/comments-commands-events-apis.adoc | 109 ++++- .../ROOT/pages/comments-embedded-mode.adoc | 11 +- .../ROOT/pages/comments-toolbars-menus.adoc | 2 +- .../ROOT/pages/comments-using-comments.adoc | 136 +++++-- modules/ROOT/pages/content-filtering.adoc | 2 + modules/ROOT/pages/context.adoc | 109 +++++ .../ROOT/pages/custom-basic-menu-items.adoc | 3 + .../pages/custom-basic-toolbar-button.adoc | 3 + .../pages/custom-group-toolbar-button.adoc | 3 + .../pages/custom-menu-toolbar-button.adoc | 3 + .../ROOT/pages/custom-nested-menu-items.adoc | 3 + .../pages/custom-split-toolbar-button.adoc | 3 + .../ROOT/pages/custom-toggle-menu-items.adoc | 3 + .../pages/custom-toggle-toolbar-button.adoc | 3 + modules/ROOT/pages/dialog-components.adoc | 53 ++- modules/ROOT/pages/dialog-footer-buttons.adoc | 15 +- .../pages/editor-command-identifiers.adoc | 8 + modules/ROOT/pages/importword.adoc | 10 +- .../pages/introduction-to-tiny-comments.adoc | 56 ++- modules/ROOT/pages/release-notes.adoc | 5 + .../allow_mathml_annotation_encodings.adoc | 18 + .../comments-tinycomments_access.adoc | 54 +++ .../partials/configuration/exportword.adoc | 3 + .../importword-converter-options.adoc | 26 ++ ...tword.adoc => importword-service-url.adoc} | 2 +- .../ROOT/partials/configuration/readonly.adoc | 70 +++- .../configuration/tinycomments_author.adoc | 1 + .../tinycomments_author_avatar.adoc | 10 +- .../tinycomments_author_name.adoc | 5 +- .../tinycomments_can_delete.adoc | 14 +- .../tinycomments_can_delete_comment.adoc | 8 +- .../tinycomments_can_edit_comment.adoc | 7 +- .../tinycomments_can_resolve.adoc | 8 +- .../configuration/tinycomments_create.adoc | 15 +- .../configuration/tinycomments_delete.adoc | 8 +- .../tinycomments_delete_all.adoc | 11 +- .../tinycomments_delete_comment.adoc | 16 +- .../tinycomments_edit_comment.adoc | 19 +- .../configuration/tinycomments_fetch.adoc | 85 ++++ .../configuration/tinycomments_lookup.adoc | 10 +- .../configuration/tinycomments_reply.adoc | 18 +- .../configuration/tinycomments_resolve.adoc | 13 +- .../partials/misc/admon-requires-7.4v.adoc | 1 + .../misc/annotation-supported-content.adoc | 21 +- .../plugins/comments-highlighting-css.adoc | 4 +- .../plugins/comments-open-sidebar.adoc | 10 +- .../comments-toolbar-buttons.adoc | 2 +- 88 files changed, 2023 insertions(+), 254 deletions(-) create mode 100644 modules/ROOT/examples/live-demos/advtemplate-readonly-template/example.js create mode 100644 modules/ROOT/examples/live-demos/advtemplate-readonly-template/index.html create mode 100644 modules/ROOT/examples/live-demos/advtemplate-readonly-template/index.js create mode 100644 modules/ROOT/examples/live-demos/comments-readonly-mode/index.html create mode 100644 modules/ROOT/examples/live-demos/comments-readonly-mode/index.js create mode 100644 modules/ROOT/examples/live-demos/comments-ui-mode/index.html create mode 100644 modules/ROOT/examples/live-demos/comments-ui-mode/index.js create mode 100644 modules/ROOT/images/comment-add-comment.png create mode 100644 modules/ROOT/images/comment-comment-created.png create mode 100644 modules/ROOT/images/comment-delete-all-conversations-file-menu.png create mode 100644 modules/ROOT/images/comment-delete-all-conversations.png create mode 100644 modules/ROOT/images/comment-delete-comment-dialog.png create mode 100644 modules/ROOT/images/comment-delete-comment.png create mode 100644 modules/ROOT/images/comment-delete-conversation-dialog.png create mode 100644 modules/ROOT/images/comment-delete-conversation.png create mode 100644 modules/ROOT/images/comment-edit-comment.png create mode 100644 modules/ROOT/images/comment-edit-existing-comment-ellipsis.png create mode 100644 modules/ROOT/images/comment-edited-comment.png create mode 100644 modules/ROOT/images/comment-reply-add-comment-focus.png create mode 100644 modules/ROOT/images/comment-reply-add-comment-pre-submit.png create mode 100644 modules/ROOT/images/comment-reply-add-comment-textarea.png create mode 100644 modules/ROOT/images/comment-reply-add-comment.png create mode 100644 modules/ROOT/images/comment-reply-to-comment-done.png create mode 100644 modules/ROOT/images/comment-reply-to-comment-submitted.png create mode 100644 modules/ROOT/images/comment-resolve-conversation.png delete mode 100644 modules/ROOT/images/comments-delete-comment.png delete mode 100644 modules/ROOT/images/comments-delete-conversation.png delete mode 100644 modules/ROOT/images/comments-delete-conversations.png delete mode 100644 modules/ROOT/images/comments-edit.png delete mode 100644 modules/ROOT/images/comments-resolve-conversation.png create mode 100644 modules/ROOT/pages/7.4-release-notes.adoc create mode 100644 modules/ROOT/pages/comments-access-options.adoc create mode 100644 modules/ROOT/pages/context.adoc create mode 100644 modules/ROOT/partials/configuration/allow_mathml_annotation_encodings.adoc create mode 100644 modules/ROOT/partials/configuration/comments-tinycomments_access.adoc create mode 100644 modules/ROOT/partials/configuration/importword-converter-options.adoc rename modules/ROOT/partials/configuration/{importword.adoc => importword-service-url.adoc} (98%) create mode 100644 modules/ROOT/partials/configuration/tinycomments_fetch.adoc create mode 100644 modules/ROOT/partials/misc/admon-requires-7.4v.adoc diff --git a/antora.yml b/antora.yml index 8e9ef1e30c..4405bd2983 100644 --- a/antora.yml +++ b/antora.yml @@ -26,7 +26,7 @@ asciidoc: # product variables productname: TinyMCE productmajorversion: 7 - productminorversion: '7.3' + productminorversion: '7.4' ##### product name in codeblock prodnamecode: tinymce #### more names diff --git a/modules/ROOT/examples/live-demos/advtemplate-readonly-template/example.js b/modules/ROOT/examples/live-demos/advtemplate-readonly-template/example.js new file mode 100644 index 0000000000..4d380e6211 --- /dev/null +++ b/modules/ROOT/examples/live-demos/advtemplate-readonly-template/example.js @@ -0,0 +1,102 @@ +const headers = { + 'Accept': 'application/json', + 'Content-Type': 'application/json', +}; + +const handleResponse = (message) => (response) => { + if (!response.ok) { + return response.text().then((error) => { + console.error(error); + throw new Error(message); + }); + } + return response.json(); +}; + +const advtemplate_list = () => + fetch('/categories', { + method: 'GET', + headers, + }).then(handleResponse('Failed to get template list')); + +const advtemplate_get_template = (id) => + fetch(`/templates/${id}`, { + method: 'GET', + headers, + }).then(handleResponse('Failed to get template')); + +const advtemplate_create_category = (title) => + fetch('/categories', { + method: 'POST', + body: JSON.stringify({ title }), + headers, + }).then(handleResponse('Failed to create category')); + +const advtemplate_create_template = (title, content, categoryId) => + fetch('/templates', { + method: 'POST', + body: JSON.stringify({ title, content, categoryId }), + headers, + }).then(handleResponse('Failed to create template')); + +const advtemplate_rename_category = (id, title) => + fetch(`/categories/${id}`, { + method: 'PUT', + body: JSON.stringify({ title }), + headers, + }).then(handleResponse('Failed to rename category')); + +const advtemplate_rename_template = (id, title) => + fetch(`/templates/${id}`, { + method: 'PUT', + body: JSON.stringify({ title }), + headers, + }).then(handleResponse('Failed to rename template')); + +const advtemplate_delete_template = (id) => + fetch(`/templates/${id}`, { + method: 'DELETE', + headers, + }).then(handleResponse('Failed to delete template')); + +const advtemplate_delete_category = (id) => + fetch(`/categories/${id}`, { + method: 'DELETE', + headers, + }).then(handleResponse('Failed to delete category')); + +const advtemplate_move_template = (id, categoryId) => + fetch(`/templates/${id}`, { + method: 'PATCH', + body: JSON.stringify({ categoryId }), + headers, + }).then(handleResponse('Failed to move template')); + +const advtemplate_move_category_items = (id, categoryId) => + fetch(`/categories/${id}`, { + method: 'PATCH', + body: JSON.stringify({ categoryId }), + headers, + }).then(handleResponse('Failed to move all templates to new category')); + +tinymce.init({ + selector: 'textarea#readonly-locked-template', + plugins: [ + 'advlist', 'anchor', 'autolink', 'charmap', 'code', 'fullscreen', + 'help', 'image', 'insertdatetime', 'link', 'lists', 'media', + 'preview', 'searchreplace', 'table', 'visualblocks', 'advtemplate' + ], + contextmenu: 'advtemplate', + toolbar: 'addtemplate inserttemplate | undo redo | styles | bold italic underline strikethrough | alignleft aligncenter alignright alignjustify | bullist numlist outdent indent | link image', + + advtemplate_list, + advtemplate_get_template, + advtemplate_create_category, + advtemplate_create_template, + advtemplate_rename_category, + advtemplate_move_category_items, + advtemplate_delete_category, + advtemplate_rename_template, + advtemplate_move_template, + advtemplate_delete_template, +}); diff --git a/modules/ROOT/examples/live-demos/advtemplate-readonly-template/index.html b/modules/ROOT/examples/live-demos/advtemplate-readonly-template/index.html new file mode 100644 index 0000000000..23fe3723c5 --- /dev/null +++ b/modules/ROOT/examples/live-demos/advtemplate-readonly-template/index.html @@ -0,0 +1,52 @@ + diff --git a/modules/ROOT/examples/live-demos/advtemplate-readonly-template/index.js b/modules/ROOT/examples/live-demos/advtemplate-readonly-template/index.js new file mode 100644 index 0000000000..c52d9a58ee --- /dev/null +++ b/modules/ROOT/examples/live-demos/advtemplate-readonly-template/index.js @@ -0,0 +1,348 @@ +const data = [ + { + title: 'Quick replies', + items: [ + { + title: 'Message received', + content: '

    Hey {{prefix}}Customer.FirstName\}}!

    \n

    Just a quick note to say we’ve received your message, and will get back to you within 48 hours.

    \n

    For reference, your ticket number is: {{mergetag-open}}Ticket.Number{{suffix}}

    \n

    Should you have any questions in the meantime, just reply to this email and it will be attached to this ticket.

    \n

     

    \n

    Regards,

    \n

    {{prefix}}Agent.FirstName{{suffix}}

    ' + }, + { + title: 'Thanks for the feedback', + content: '

    Hi {{prefix}}Customer.FirstName{{suffix}},

    \n

    We appreciate you taking the time to provide feedback on {{prefix}}Product.Name{{suffix}}.

    \n

    It sounds like it wasn’t able to fully meet your expectations, for which we apologize. Rest assured our team looks at each piece of feedback and uses it to decide what to focus on next with {{prefix}}Product.Name{{suffix}}.

    \n

     

    \n

    All the best, and let us know if there’s anything else we can do to help.

    \n

    -{{prefix}}Agent.FirstName{{suffix}}

    ' + }, + { + title: 'Still working on case', + content: '

    Hi {{prefix}}Customer.FirstName{{suffix}},

    \n

    Just a quick note to let you know we’re still working on your case. It’s taking a bit longer than we hoped, but we’re aiming to get you an answer in the next 48 hours.

    \n

    Stay tuned,

    \n

    {{prefix}}Agent.FirstName{{suffix}}

    ' + } + ] + }, + { + title: 'Closing tickets', + items: [ + { + title: 'Closing ticket', + content: '

    Hi {{prefix}}Customer.FirstName{{suffix}},

    \n

    We haven’t heard back from you in over a week, so we have gone ahead and closed your ticket number {{prefix}}Ticket.Number{{suffix}}.

    \n

    If you’re still running into issues, not to worry, just reply to this email and we will re-open your ticket.

    \n

     

    \n

    All the best,

    \n

    {{prefix}}Agent.FirstName{{suffix}}

    ' + }, + { + title: 'Post-call survey', + content: '

    Hey {{prefix}}Customer.FirstName{{suffix}}!

    \n

     

    \n

    How did we do?

    \n

    If you have a few moments, we’d love you to fill out our post-support survey: {{prefix}}Survey.Link{{suffix}}

    \n

     

    \n

    Thanks in advance!
    {{prefix}}Company.Name{{suffix}} Customer Support

    ' + } + ] + }, + { + title: 'Locked Product support', + locked: true, + items: [ + { + title: 'How to find model number', + content: '

    Hi {{prefix}}Customer.FirstName{{suffix}},

    \n

     

    \n

    My name is {{prefix}}Agent.FirstName{{suffix}} and I will be glad to assist you today.

    \n

    To troubleshoot your issue, we first need your model number, which can be found on the underside of your product beneath the safety warning label. 

    \n

    It should look something like the following: XX.XXXXX.X

    \n

    Once you send it over, I will advise on next steps.

    \n

     

    \n

    Thanks!

    \n

    {{prefix}}Agent.FirstName{{suffix}}

    ' + }, + { + title: 'Support escalation', + content: '

    Hi {{prefix}}Customer.FirstName{{suffix}},

    \n

    We have escalated your ticket {{prefix}}Ticket.Number{{suffix}} to second-level support.

    \n

    You should hear back from the new agent on your case, {{prefix}}NewAgent.FirstName{{suffix}}, shortly.

    \n

     

    \n

    Thanks,

    \n

    {{prefix}}Company.Name{{suffix}} Customer Support

    ' + } + ] + } +]; + +class StoreError extends Error { + constructor(status, message) { + super(message); + this.name = "StoreError"; + this.status = status + } +} + +const isStoreError = (e) => + e instanceof StoreError; + + +const create = (data = []) => { + const storeItems = { + items: [] + }; + + let id = 0; + const genId = () => (++id).toString(); + const categoryIndex = {}; + const templateIndex = {}; + + const isNonEmptyString = (value) => + typeof value === 'string' && value.length > 0; + + const isPositiveInteger = (str) => { + const number = Number(str); + return Number.isInteger(number) && number > 0; + } + + const isValidId = (value) => + isNonEmptyString(value) && isPositiveInteger(value); + + const validate = (value, predicate, message) => { + if (predicate(value)) { + return; + } else { + throw new StoreError(400, message); + } + }; + + const validateId = (id) => + validate(id, isValidId, `Invalid "id" parameter: ${id}`); + + const validateTitle = (title) => + validate(title, isNonEmptyString, `Invalid "title" parameter: ${title}`); + + const getParent = (id) => + typeof id === 'undefined' ? storeItems : getCategory(id); + + const filterOut = (items, id) => + items.filter((item) => item.id !== id); + + const list = () => { + const resp = [...storeItems.items]; + return resp; + }; + + const getCategory = (id) => { + validate(id, isValidId, `Invalid "id" parameter: ${id}`) + const category = categoryIndex[id]; + if (typeof category !== 'undefined') { + return category; + } else { + throw new StoreError(404, 'Category not found'); + } + }; + + const getTemplate = (id) => { + validateId(id) + const res = templateIndex[id]; + if (typeof res !== 'undefined') { + return res + } else { + throw new StoreError(404, 'Template not found'); + } + }; + + const createCategory = (title, locked) => { + validateTitle(title); + + const id = genId(); + const category = { + id, + title, + locked, + items: [] + }; + categoryIndex[id] = category; + storeItems.items = [...storeItems.items, category]; + return category; + }; + + const createTemplate = (title, content, categoryId) => { + validateTitle(title); + validate(content, isNonEmptyString, `Invalid "content" parameter: ${content}`); + + const id = genId(); + const template = { + id, + title, + content, + }; + const parent = getParent(categoryId); + parent.items = [...parent.items, template]; + templateIndex[id] = [template, categoryId]; + + return template; + }; + + const renameCategory = (id, title) => { + validateTitle(title); + const category = getCategory(id); + category.title = title; + }; + + const renameTemplate = (id, title) => { + validateTitle(title); + const [template] = getTemplate(id); + template.title = title; + }; + + const deleteTemplate = (id) => { + const [, categoryId] = getTemplate(id); + const parent = getParent(categoryId); + parent.items = filterOut(parent.items, id); + delete templateIndex[id]; + }; + + const deleteCategory = (id) => { + const category = getCategory(id); + category.items.forEach((template) => deleteTemplate(template.id)); + store.items = filterOut(storeItems.items, id); + delete categoryIndex[category.id]; + }; + + const moveTemplate = (id, newCategoryId) => { + const [template, categoryId] = getTemplate(id); + if (categoryId === newCategoryId) { + return; + } + + const oldParent = getParent(categoryId); + const newParent = getParent(newCategoryId); + newParent.items = [...newParent.items, template]; + oldParent.items = filterOut(oldParent.items, id); + templateIndex[id] = [template, newCategoryId]; + }; + + const moveCategoryItems = (id, newCategoryId) => { + const oldCategory = getCategory(id); + if (id === newCategoryId) { + return; + } + oldCategory.items.forEach((item) => moveTemplate(item.id, newCategoryId)); + }; + + const load = (items, id) => { + items.forEach((item) => { + if (item.items) { + const category = createCategory(item.title, item.locked); + load(item.items, category.id); + } else { + createTemplate(item.title, item.content, id); + } + }); + }; + + load(data); + + return { + list, + getTemplate, + createCategory, + createTemplate, + renameCategory, + renameTemplate, + deleteTemplate, + deleteCategory, + moveTemplate, + moveCategoryItems + }; +} + + +const store = create(data); + +const advtemplate_list = async () => store.list(); + +const advtemplate_create_category = async (title) => { + try { + return store.createCategory(title); + } catch (e) { + console.error(e); + throw new Error('Failed to create category'); + } +}; + + +const advtemplate_create_template = async (title, content, categoryId) => { + try { + return store.createTemplate(title, content, categoryId); + } catch (e) { + console.error(e); + throw new Error('Failed to create template'); + } +}; + + +const advtemplate_get_template = async (id) => { + try { + const [template] = store.getTemplate(id); + return template; + } catch (e) { + console.error(e); + throw new Error('Failed to get template'); + } +}; + +const advtemplate_rename_category = async (id, title) => { + try { + store.renameCategory(id, title); + return {}; + } catch (e) { + console.error(e); + throw new Error('Failed to rename category'); + } +}; + +const advtemplate_rename_template = async (id, title) => { + try { + store.renameTemplate(id, title); + return {}; + } catch (e) { + console.error(e); + throw new Error('Failed to rename template'); + } +}; + +const advtemplate_delete_category = async (id) => { + try { + store.deleteCategory(id); + return {}; + } catch (e) { + console.error(e); + throw new Error('Failed to delete category'); + } +}; + +const advtemplate_delete_template = async (id) => { + try { + store.deleteTemplate(id); + return {}; + } catch (e) { + console.error(e); + throw new Error('Failed to delete template'); + } +}; + + +const advtemplate_move_template = async (id, categoryId) => { + try { + store.moveTemplate(id, categoryId); + return {}; + } catch (e) { + console.error(e); + throw new Error('Failed to move template'); + } +}; + +const advtemplate_move_category_items = async (id, categoryId) => { + try { + store.moveCategoryItems(id, categoryId); + return {}; + } catch (e) { + console.error(e); + throw new Error('Failed to move category items'); + } +}; + +tinymce.init({ + selector: 'textarea#readonly-locked-template', + plugins: [ + 'advlist', 'anchor', 'autolink', 'charmap', 'code', 'fullscreen', + 'help', 'image', 'insertdatetime', 'link', 'lists', 'media', + 'preview', 'searchreplace', 'table', 'visualblocks', 'advtemplate' + ], + contextmenu: 'advtemplate', + toolbar: 'addtemplate inserttemplate | undo redo | styles | bold italic underline strikethrough | alignleft aligncenter alignright alignjustify | bullist numlist outdent indent | link image', + + advtemplate_list, + advtemplate_get_template, + advtemplate_create_category, + advtemplate_create_template, + advtemplate_rename_category, + advtemplate_move_category_items, + advtemplate_delete_category, + advtemplate_rename_template, + advtemplate_move_template, + advtemplate_delete_template, +}); diff --git a/modules/ROOT/examples/live-demos/comments-callback/example.js b/modules/ROOT/examples/live-demos/comments-callback/example.js index 68e5977e10..824c745418 100644 --- a/modules/ROOT/examples/live-demos/comments-callback/example.js +++ b/modules/ROOT/examples/live-demos/comments-callback/example.js @@ -169,15 +169,47 @@ const tinycomments_lookup = ({ conversationUid }, done, fail) => { }); }; +const tinycomments_fetch = (conversationUids, done, fail) => { + const requests = conversationUids.map((uid) => fetch(`https://api.example/conversations/${uid}`, { + method: 'GET', + headers: { + 'Content-Type': 'application/json', + }}) + .then((response) => response.json()) + .then((data) => ({ + [uid]: { + uid: uid, + comments: data + } + })) + ); + + Promise.all(requests) + .then((data) => { + console.log('data', data); + const conversations = data.reduce((conv, d) => ({ + ...conv, + ...d + }) + , {}); + console.log(`Fetch success ${conversationUids}`, conversations); + done({ conversations }); + }) + .catch((err) => { + console.error(`Fetch failure ${conversationUids}`, err); + fail('Fetching conversations failed'); + }); +}; + tinymce.init({ selector: 'textarea#comments-callback', height: 800, plugins: 'code tinycomments help lists', toolbar: - 'undo redo | blocks | ' + + 'addcomment showcomments | undo redo | blocks | ' + 'bold italic backcolor | alignleft aligncenter ' + 'alignright alignjustify | bullist numlist outdent indent | ' + - 'removeformat | addcomment showcomments | help', + 'removeformat | help', menubar: 'file edit view insert format tc', menu: { tc: { @@ -192,10 +224,6 @@ tinymce.init({ tinycomments_delete_all, tinycomments_delete_comment, tinycomments_lookup, - /* The following setup callback opens the comments sidebar when the editor loads */ - setup: (editor) => { - editor.on('SkinLoaded', () => { - editor.execCommand('ToggleSidebar', false, 'showcomments'); - }); - }, + tinycomments_fetch, + sidebar_show: 'showcomments', }); diff --git a/modules/ROOT/examples/live-demos/comments-callback/index.html b/modules/ROOT/examples/live-demos/comments-callback/index.html index 06a2740b8a..92c933f6e6 100644 --- a/modules/ROOT/examples/live-demos/comments-callback/index.html +++ b/modules/ROOT/examples/live-demos/comments-callback/index.html @@ -7,7 +7,7 @@

    Welcome to Tiny Comments!

  • Type your comment into the text field at the bottom of the Comment sidebar.
  • Click Comment.
  • -

    Your comment is then attached to the text, exactly like this!

    +

    Your comment is then attached to the text, exactly like this!

    If you want to take Tiny Comments for a test drive in your own environment, Tiny Comments is one of the premium plugins you can try for free for 14 days by signing up for a Tiny account. Make sure to check out our documentation as well.

    A simple table to play with

    diff --git a/modules/ROOT/examples/live-demos/comments-callback/index.js b/modules/ROOT/examples/live-demos/comments-callback/index.js index 5a5d2e8abd..8f8e3daf05 100644 --- a/modules/ROOT/examples/live-demos/comments-callback/index.js +++ b/modules/ROOT/examples/live-demos/comments-callback/index.js @@ -46,8 +46,47 @@ tinymce.ScriptLoader.loadScripts( }; /* Our server "database" */ - const getDB = () => - JSON.parse(localStorage.getItem('fakedb') ?? '{}'); + const initialDB = { + "mce-conversation_19679600221621399703915": [ + { + uid: "mce-conversation_19679600221621399703915", + author: "Another Tiny User", + authorName: "Another Tiny User", + content: "Please revise this sentence, exclamation points are unprofessional!", + createdAt: "2021-05-19T04:48:23.914Z", + modifiedAt: "2021-05-19T04:48:23.914Z", + }, + { + uid: "mce-conversation_19679600221621399703917", + author: "Another Tiny User", + authorName: "Another Tiny User", + content: "Replied", + createdAt: "2021-05-19T04:48:23.914Z", + modifiedAt: "2021-05-19T04:48:23.914Z", + }, + { + uid: "mce-conversation_19679600221621399703918", + author: "Another Tiny User", + authorName: "Another Tiny User", + content: "Replied again", + createdAt: "2021-05-19T04:48:23.914Z", + modifiedAt: "2021-05-19T04:48:23.914Z", + }, + ], + "mce-conversation_420304606321716900864126": [ + { + uid: "mce-conversation_420304606321716900864126", + author: "john_smith", + authorName: "John Smith", + authorAvatar: "https://i.pravatar.cc/150?img=11", + content: "I think this is a great idea!", + createdAt: "2024-05-28T12:54:24.126Z", + modifiedAt: "2024-05-28T12:54:24.126Z", + }, + ], + }; + + const getDB = () => JSON.parse(localStorage.getItem('fakedb') ?? JSON.stringify(initialDB)); const setDB = (data) => { localStorage.setItem('fakedb', JSON.stringify(data)); }; @@ -621,16 +660,48 @@ tinymce.ScriptLoader.loadScripts( fail(err); }); }; + + const tinycomments_fetch = (conversationUids, done, fail) => { + const requests = conversationUids.map((uid) => fetch(`https://api.example/conversations/${uid}`, { + method: 'GET', + headers: { + 'Content-Type': 'application/json', + }}) + .then((response) => response.json()) + .then((data) => ({ + [uid]: { + uid: uid, + comments: data + } + })) + ); + + Promise.all(requests) + .then((data) => { + console.log('data', data); + const conversations = data.reduce((conv, d) => ({ + ...conv, + ...d + }) + , {}); + console.log(`Fetch success ${conversationUids}`, conversations); + done({ conversations }); + }) + .catch((err) => { + console.error(`Fetch failure ${conversationUids}`, err); + fail('Fetching conversations failed'); + }); + }; tinymce.init({ selector: 'textarea#comments-callback', height: 800, plugins: 'code tinycomments help lists', toolbar: - 'undo redo | blocks | ' + + 'addcomment showcomments | undo redo | blocks | ' + 'bold italic backcolor | alignleft aligncenter ' + 'alignright alignjustify | bullist numlist outdent indent | ' + - 'removeformat | addcomment showcomments | help', + 'removeformat | help', menubar: 'file edit view insert format tc', menu: { tc: { @@ -645,13 +716,7 @@ tinymce.ScriptLoader.loadScripts( tinycomments_delete_all, tinycomments_delete_comment, tinycomments_lookup, - /* The following setup callback opens the comments sidebar when the editor loads */ - setup: (editor) => { - editor.on('SkinLoaded', () => { - editor.execCommand('ToggleSidebar', false, 'showcomments', { - skip_focus: true, - }); - }); - }, + tinycomments_fetch, + sidebar_show: 'showcomments', }); }); diff --git a/modules/ROOT/examples/live-demos/comments-embedded/index.js b/modules/ROOT/examples/live-demos/comments-embedded/index.js index 13517fd03f..e09fbb2121 100644 --- a/modules/ROOT/examples/live-demos/comments-embedded/index.js +++ b/modules/ROOT/examples/live-demos/comments-embedded/index.js @@ -4,7 +4,7 @@ const userAllowedToResolve = 'Admin1'; tinymce.init({ selector: 'textarea#comments-embedded', plugins: 'code tinycomments', - toolbar: 'bold italic underline | addcomment showcomments', + toolbar: 'addcomment showcomments | bold italic underline', menubar: 'file edit view insert format tools tc', menu: { tc: { @@ -22,10 +22,4 @@ tinymce.init({ }); }, content_style: 'body { font-family:Helvetica,Arial,sans-serif; font-size:16px }', - /* The following setup callback opens the comments sidebar when the editor loads */ - setup: (editor) => { - editor.on('SkinLoaded', () => { - editor.execCommand('ToggleSidebar', false, 'showcomments', { skip_focus: true }); - }); - } }); diff --git a/modules/ROOT/examples/live-demos/comments-readonly-mode/index.html b/modules/ROOT/examples/live-demos/comments-readonly-mode/index.html new file mode 100644 index 0000000000..fe676301b3 --- /dev/null +++ b/modules/ROOT/examples/live-demos/comments-readonly-mode/index.html @@ -0,0 +1,36 @@ +
    + +
    \ No newline at end of file diff --git a/modules/ROOT/examples/live-demos/comments-readonly-mode/index.js b/modules/ROOT/examples/live-demos/comments-readonly-mode/index.js new file mode 100644 index 0000000000..22cbbbaa73 --- /dev/null +++ b/modules/ROOT/examples/live-demos/comments-readonly-mode/index.js @@ -0,0 +1,26 @@ +tinymce.init({ + selector: "textarea#comment-readonly-ui-mode", + plugins: [ + "tinycomments", "advlist", "anchor", "autolink", "charmap", "code", "fullscreen", + "help", "image", "insertdatetime", "link", "lists", "media", + "preview", "searchreplace", "table", "visualblocks", + ], + toolbar: "addcomment showcomments togglereadonly | undo redo | styles | bold italic underline strikethrough | alignleft aligncenter alignright alignjustify | bullist numlist outdent indent | link image", + tinycomments_mode: 'embedded', + readonly: true, + setup: (editor) => { + const isReadonlyMode = () => editor.mode.get() === 'readonly'; + editor.ui.registry.addToggleButton('togglereadonly', { + text: 'Readonly mode', + context: 'any', // Available from 7.4 + onSetup: (buttonApi) => { + const activate = (api) => () => api.setActive(isReadonlyMode()); + editor.on('SwitchMode', activate(buttonApi)); + return (teardownApi) => editor.off('SwitchMode', activate(teardownApi)); + }, + onAction: (api) => { + editor.mode.set(isReadonlyMode() ? 'design' : 'readonly'); + } + }); + } +}); \ No newline at end of file diff --git a/modules/ROOT/examples/live-demos/comments-ui-mode/index.html b/modules/ROOT/examples/live-demos/comments-ui-mode/index.html new file mode 100644 index 0000000000..4c34ab043b --- /dev/null +++ b/modules/ROOT/examples/live-demos/comments-ui-mode/index.html @@ -0,0 +1,38 @@ +
    + +
    \ No newline at end of file diff --git a/modules/ROOT/examples/live-demos/comments-ui-mode/index.js b/modules/ROOT/examples/live-demos/comments-ui-mode/index.js new file mode 100644 index 0000000000..5224935f09 --- /dev/null +++ b/modules/ROOT/examples/live-demos/comments-ui-mode/index.js @@ -0,0 +1,11 @@ +tinymce.init({ + selector: "textarea#comments-ui-mode", + plugins: [ + "tinycomments", "advlist", "anchor", "autolink", "charmap", "code", "fullscreen", + "help", "image", "insertdatetime", "link", "lists", "media", + "preview", "searchreplace", "table", "visualblocks", + ], + toolbar: "addcomment showcomments | undo redo | styles | bold italic underline strikethrough | alignleft aligncenter alignright alignjustify | bullist numlist outdent indent | link image", + tinycomments_mode: 'embedded', + tinycomments_access: 'comment' +}); \ No newline at end of file diff --git a/modules/ROOT/images/comment-add-comment.png b/modules/ROOT/images/comment-add-comment.png new file mode 100644 index 0000000000000000000000000000000000000000..23bbd04bd22d1546bfe78fb9c8f5486a711e7725 GIT binary patch literal 47630 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 literal 0 HcmV?d00001 diff --git a/modules/ROOT/images/comment-comment-created.png b/modules/ROOT/images/comment-comment-created.png new file mode 100644 index 0000000000000000000000000000000000000000..fb5bc11442481ba309cc5ee82e11cdc938e0224e GIT binary patch literal 49419 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 G?0*4GA-y#K literal 0 HcmV?d00001 diff --git a/modules/ROOT/images/comment-delete-all-conversations-file-menu.png b/modules/ROOT/images/comment-delete-all-conversations-file-menu.png new file mode 100644 index 0000000000000000000000000000000000000000..8f50ca819cb0ed52801a2a6ff8b1aba8e318f645 GIT binary patch literal 46442 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 YVHE`|F}C@7&<#qRNP zUsqoocs$t890w%^WzrK^0T(mZB=^5{p%3@Q_EuQUFl>jZn6_+aWI|N};6MpmUA|P* zx*+jNvB0a6S@jOy57{o#y3rRY0|iPKmX%v?S3`azR6Pt}JB#@TSe@_!z7EpReL)cw zNwk2(jeTQG)n!$Iz@-41@)7xrcgS`&($D}11avP9tS};{06>v|c@DEO-${8OKg$d( zh!hOm9ulp$?qUt=SZDYn7!^nlx7^G#-jW0dL69jZWyYk8V7PG!z^k_2IxRz8(e*xR z8W0kIp9eBN^gM?*)0&FlTO1Xb9bfu$G6}%XaGw$TN98P_1tQz^c4?{?rmGK?=gV3E zyF5_s_QiH0vVT2(`W}1E0;VWQ1otxLM?kJy@&KMBrL#CD+L( z>Yh9ELW#7iSH3s01+}Z+8ubJ#f=D6XI{$^HKOu_%O={DLy0@YmY{Vq+J}oC#(%-hhPKvS14=bk)g0r z(|wfJf40C+isa;Ae7POhShYyTO z!DEvFi06p9iNDLM_--P|owFfRhl_kbfG!-moV-OJAWw(a!ka^m9qCZ0XH6y3>zPdM zb_I-*W+Q>GCZvA^sR4cgFrV=~5x{SM&!5d!-V4=G(Op8zkeFwja6!>BUvBO{}-Q#PEGC?8vfNhZ@}LN zjFjJtBxPiZI_{`;2ywL7WtWNlqn26MHw4{|$v4&$i2O9ro)VLKf?`GEB3}Ce<=B1q zvu}Ss#@)*mj?|f@qgdpG{!J1B^21fX(G|Hg$^qVi2-hs_iXL$P#6OZ1fZ9NqKUN1N z2J-rGnA+QKgOdxdJj-y~jCZ|Goy0qUTj=ot_15ltx^eVG5-9E7BLvSP&i zy-dhcu+FUYgHz_;)J-76BXH4Xsv6&6Jrlu^k|s(3Qp6A%T<}$2hz!~HBK%|;(+JI^ z#?k_)q8tRBc<6!QjPKqv+o9N%xk6D(cm)G-`|ZPnf6soktRM#Pxr^(sx4XQr0sQm@ zEUR|+K*aOKSM=aTiKc8Tz$yZl6dE}`x(iwpbTvZElX%+K0)8QgIv8MXPXC)CSEOEM zFg~SV=9l!3SA#<&U)z4xkYi~<=U*R03NP_J@x~5KB<>-li3gWtgKWrt*>t%E`=+NZ zITSao!Km?7hW@u$CSb#pgW;UP>;^t~1a^`U0Dh>0CZ&1c2I)YoDFRPBKM0`59Ow{v zWu?XuWp^_{bwPM?ivlW6H6OWsVdOVT=xr`m6LUQ&g)`8F#3y#2OM zNd{^Es|{Ls5&*w4@_}70E9KrD19)PCRwj8U528t`GeuzM&qk9u;4phdaC^3YT)uT^ z;Lql5J7rd?Yp%SwV3HpARIg8Dur$cZ?frnO=|;dG!juEA0P_EhdEJVe_DwUT{jFyg z5JSxdZu{fI?KvgzP?03ZKVq$;&1PVJ-$Ob{&52M4M19*nuE?lmoP#4IX{U?k_@I zCgs2c-k*IhbLfh5-26yvEbysSJm8_Af*Vy!ON6E17y0K5ne`YG#Tg2y9YFz_W366CrrO^I&_Z0;Pj`47gyC_D%QR)-~Q=AJW)Y zHV-asp&%Df!Zt#}^F}ojC9sO1pX%WIzIC04`fcx)`1hlU1+?|H@6G70`Bqj&=EYUBLz@ZfW9WiMbR(_4X8-m6TwiEt*#ptn;7&vHchNH zcxTzrqvGgEg}CURv5k^rfhs~Wc^5+i$F?*>0I_?n_g(4P!bjsi4DA9)Tm>CH*mOP3 zT3QuosT*(k?NSYBDJ5*#t)T`iGmLA5T=}l2OnN^yuw_BMo&MvRi`3STh38tUtTJdc z^f;WOd3ROmpvZ-FYR1sux?VIAjKp+*s7|#pXM+F#u=SQJXA(((I?v!+W zrA@Ck^kGKmIE$?3hhdiuyrQFy@&dr1I3Y0t%5h+{SgsU_TTetGd3ImE_A}?~^KX5? zAkBc~`#;cYVt{!bj2vr7vcF9F=)K)q?y--!>j7i7x_B0@*OR!wzI1yM<@~ z(b*+P6JK*RQq8eE)-l39oUIzQlJaPdcY5;S)ez_27CLrb?n1b*@?DYs(aFuX^|jk~ ziV&kSxi#N3xS}?+xm*zuCPrhd^&Q1A8C?_GKC`oKlkC!3b;TOGKEY4R((vIMqqbi( z3+kCUP3q|CFScE!9cNny5uas$0Vq(pdgLnHI|>|b5A)>WuZn7p=i0(ul0Eh?9R_yW z+RdF6z5!C;re=$&Y~2?~1S&kXt1ISFUxbojS!1Bdh51;)z*_5Z`)OV(%XI zMdp{!7*YBRMP1W#(nrKNEbSo#9iKji)H)1Xticc8u%ms{jMWPaievN0`tCJv&)=ox zvv*1|aFjveGCir0*-3>yTvmRF#k6q9Vz!PaqtE2kMew>RRIicW!=X0hFyo#IzG_0& ztLKFvX+jMHF0MPr{EyjSOG|HY9swMebT)5F<};nD!@5zb-o_*Y*i^a9#y9z<&9Xfz zsq_18%>+^S*x5-Hlps>T^wrG5?T#AhI{k}eiK2F&xa}Vkjcbq@(nxJ$LGxkzu!{T zwEO4@?W_gfZEMKCFW7yrro8;~Bg!*(H^b!|hizC}E{z?o@6L#$`zVCq@wt2o85%mkRDJgmZ|K70JDrwecQ#f>+4!R+%woE7f~|szp>%L{MeytXF>= ztZg9THbd?Jh~SG$8Z#w1Fj|JVdo7HoMDVU_T`J~rCzl|-g0t=#b3!S8rcVMch%bb_ z7@zgu{-Sc5#6-E;`$kSSwvg;4(JQdRBu&9h>|G@>?!0BZ;u$RBY3l#gl)m=K$G`v* z|K%Uf3PMU(dRGO^SWTD+o*8$2kI6qXf+g_7S67#IDP{m5X-~YPiX~=NSJ_YRC+Ud@ z5>qag}h3K31?2P70oX6A@&2b8}6Vn_1fgrX`Jr&<*^zKIlDbA=*!aJOA4%# z!u93FHy1!&EkmU^>UmasQKt%6sAT@6K0W>x3D-Jzc-zjFukc$5qls zrUQw@lo-Ktvw(Y>@x7kN~CLtmQ66xCPm4}OodVujS2?-QF(*5onYvX9h8tbe}1 z0%T^9i&aAJIMMfd6Z5YbOY01fpS&psgf2c-$ zAFve=P2df?9&gdb>JIg51v;N|9)2@uCp03redOW1$x!ZO6(XMd#SFVlSRp5;phQPM zT<8o#6I@Zddgg!I69NWhQLzK5xq}Q1-^Gr&@o+X*=b`bB$?Khka1L2v56O;R%sj7zmh>Dh*rhdX9|`N9eHF}zi^F}QhwEws$=i@Hs~ueb&J;-L0<}`Il@r!F zh@Z@xrj9$ToDp7JSz#18pBgzqeOv5YwNa)`Zg}P}jL3`j4@nT59FSWq@x1|JL-ufwg&m>YST7Hd6aPG+0{xa3q{VLiH zA{O2U=`-EkIb3(FhdJcL2yAU1#Oi%Lr?^-1sjWLEWI8b~WL);G`P4V@lIx~&({ba2 z*Bhi&o%6r+wG%;*5lK*v8KGCjTzSr5OIYt$`cHy*@8XC3kLj&xpT?o*-9({a+~VJa&K}_zyBf_J zV1~|h+DkQcS!2_$dl|0}CJQg}QsC0*dK|_af4=KX-RGTWb8UB`uJ3Bi`QT7agymc^ z-|UeW{GpInq>i1Qca9YRR+~X)0)5=z8o!vP;jFn|VzEJXxNjIj8h&J^jH2eKuX~>7 z4a}Wc9%LAZTEq}>ZA$Kvk3Y))3IZRbJ!XXZdy{yN?D;lA`H#x94HgXV<66%V zcx}uiA45t>y#-y5zC`|f0H=Bt7j+jb6N9OQ?wG{4v8)0hC==&{c!1Npsynzv4C0xL zj~YP8VE^ZxRL)7iQEPCESFAZ|ds6mlE%;AgXM17an51x`h;+7E&O2NE{zWZ;qUOlJ zttduPbjiI7w2*X_a$$ANlML$agfh4J8s7RhL7(iW!o

    wuOC19d{B~wo99zG?Ut3 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 literal 0 HcmV?d00001 diff --git a/modules/ROOT/images/comment-delete-all-conversations.png b/modules/ROOT/images/comment-delete-all-conversations.png new file mode 100644 index 0000000000000000000000000000000000000000..c8a7fa461dca5cc4683eae7c1a9d35022ec97ef6 GIT binary patch literal 56225 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 z z_hm{4%v_QD9q9SJ*bd5N@ZgWDCmdYwGOM&@!2_!G6^56tnX~K>8yzv z<(A)s;^P(YjB9xv_U(*F+67__KHV#Y$q7{@5`QUNS~F;A9=uU!6zuk;@f}DPq(<fsv__Di!4NsW?E}90}v3+uy;IqJ3&yP%r{c&YyM^d845w$eFTDSSBAevkCLAR=0{D1%`_7`@lg zl88Et-dpt1qj%1m{o8wA=kx7zo&2BiKJC8OTK9UMJ4geW=zb<%OKqnOwow9h8jV|f zuC&3dM4T!4@g?zqpAO(9y~L_~7emCbNWYVHDg(dM!$M2R10%oK$Xcdb#Nlz@#!X9O z8RmR0xq4}MU+(}UPH4cs_YMKX=t-81zzaf&q88Sq3E=PNj*GYBNF1HjATvgkK{apX zQQW`25d0mVp+*4=pQKt{zs=H9F}$-f-|PNKMn7s~EgB)O-hM-3T;ris56^?%d1aeQ zr)!J^kT=-Nn1mZp2cXU9$8P4bsAP%#UE@bRY6O#kx1XlmY`}&%U?_F>gc`%3nqaK0 zVKxPx^a@Z}U8bElt>%|k<2#bXyZD2iFSAO|cGkSLxCX&}xWqU8l^y_ynj~sG8|b$w z;%UGrHQ-K(-+k($iR|zDObR{NSx+6MgA=k%di8KfAu|D%=rNL z-_AVkQZ z*0>Z>{>Ll`0yAaeW|{++o^*Q`U6{7WcL93 z>({H6Ml@P+u`?Ap2v{oZ@d;nP)YZ3iBLx*PD%f5HY=6l4GEWaLgkR2b-%?9y|LvyF zTW!7jIs9c+M)4qg!TbD8rq31hq0?2$Di`w8w-3q)2v8vphEhjiM^x$d_&1? zroTf3NrYMDdmGc4q-h+Jefwg~ae{Nn)O|R6I*{-Fftbg(Ikn!b!>LhP9saAd&Kj)( zThBQGlA;%egt{2;N~;1Na@EBa0>Uq_Fx;mz3xR$L{KsKu>ER@pbg13nF+JUFeKVAg z$SBRDz~jW$2|Zf+Q=iz5tKCk-5lof@Z}2EGm6|WyaU2nPbW*=ZcMn#yWD8rXoU}Xo z9=u=R);JsJ_j!7%v~no8M8MzuF8;pfTU{3xuFjl&5fgt9&0eXN-tWokPGFY~H61*@ z@T9(Jh_&hg-}J}1&foakddZ+Hh+&~JXqk&;i{Lh|Dc|{QyE}L~mLwbjQmbaa?&_PF ziIvBL-M*U+M{V+OAwu|8<2tMQ+xgQ_(;#swyjW$5Of4ylD|MN=kS(26@L&7*%i`%% zrErnK_^mc&@b{C7KjFSUyEUho5tldukWF%n-YuQfXI26Z9z3`+I|)qL znny(!_!hr}tXi3a7&K3UVB|;!f%VR};x+iLaH(^dy)*bX@WlL+n)$EwWFiG(V7XN1 z3CD$v>!Nzzvx7t>?{|XobF-DH3O<2R{recr_sed_1w0|}mB`j&FGb`B0|Sji zoe4Qq*!${BTBG$Xe>Dm`@T?FEjo+5{sO3@Vhi~L~y7cH}P!A`9DXk%Gt=wCWs4qww z!pZJ?J`{Skt$h%!xG7d;*0`2?eE~@`p;KZ`OYgr7oRpdfo6@TLmJd?^K0_juoDmGf z%P*JXohB1|{-wSAy9j z*Q*1cY>`CLOlnplZxc#HpShbpph5mV>@XjI_b@tj7Fj?_Syp5BjX6xE&Yj~7kj_;X zPs>rz3b~{go6jA7I>-fu%O|p#vPWUZTW;Y z`>JVhvUY?@0#8f=)A2*`)3^(1jyiv!2@ZN)aurNj@atcmFo*5>I-GF zg@nqwZ;S0PexF4sLez?;G-<>wQH>UxO=D*Iw$=nCv77Zx8L9Kg=7x{oHkZ zud92~Wa?xa@)a$a?5InBu$ny7L658Z;vV8)A4tvruqP;3!?WDvI1fCVI}<@DQIYpz zX}ItMN5KcF+2$$TrCA{%Pw*_=veP9gum^}zTs@p6-AKQzwY}=6+`lWIql_9G)YT-< zjE{QN3-jk~-n{M1fG6~;`!w1$PKGKl^FkF-JCO=RGHP+gH|c}tE6{+9;53d=j;$&4oZs2>$X~1V zax)KAcH+l(Ha2x1#v1#b90PyD!VxfSt4Fz79W?irZp`NfOSj7Em4O?;U8LZGftJ1z z8v;U!uGl=+oEQ4+JvO_2tYLdUuKYb}{6(Ppu&141GSogEt1s=B+Lsr0hTR>K7`qJF#G z+kRHkntD8`;H}0bK~Zd#?~%;+^A#%xZZt!K(RY#fP*B`iEgZs~H$-LC=X3V6{!Q9s z3kcWT07Go}J0Ld3-XI)yE5@k&K~JKM%UnNjbl3D9H#8Ur$L#R!_zzP|$` zxyb>a@X)vA`fPd{;1@*^>F4!*XoU*EQ6yc6QQqNHII0uR%kil4cr(9fnt4;)F5!vT z=kxt<3LaVGHNsCT!9sGrzC#qygfA=MbzV$Uj|3r1SZdshWQzsq$r2Nj?ag6}J;nS) zUg_gVpE6Iw>LFf>`sIzArNbq3$#x1`C?AC>c%2+-t776NEUXwV{JRa5W zq$#!izQo-t3Iz1;HN@zOXJ?hmk&HEbh6CX;OUq7|5&bBkggi>}$TTv}(fg#wDQbU*SFdDJ-P-apiyY;KK-4A|D^2sde10W7MwsU?lC|4@-kILN z!(B6Ko$BZPq6Lg8(@@DaTryVr24X8HzL%o=acVB#nBwELFthv5Y#aAblTC!(IiW4B+sVJ*UfQFwD z$+iI8_fkvwCp1vIgO_^S=e6$RTIAU;P?0_++TiWKR@Z;41;#^w1VMdToi9v0u3cv= zF7iGNzg-PiT=27o_K2sQ@*VZ*^X2@EEC82me$xsIxl}omVUB6*_gAojcL8*I=`)*_8_w;!T5A1Zo8p-(w1}TqC>Hb zK24j-C+&P{x?|FTePnmUYuIBuoSjEW)#b$J%w@UAg}LaL-52Fr5?IZ-9`Lr9ALsU8 z8Bf^!K~M&!P7W1gVV<-*G|DsS62E^(=?D5qEd6FO)oo0EZ8bv-yGL=kn8z0QC((9$ z3{7KipC4Gc{J4(GM)gO~pRdMRb%fume@yMa(HZGy*l@h3!tK$p6{n8HN$NF6t0s%I zOV`a;P&qp}Rw*_6)pT)y->*Q3+B!^RO<08~iVadac9^$%`I+!XZhnw8@;rXzvbB)>%UJHjYe zjsHr1POG7I3Dzblp!x|Vh}=5-ykCM&HZJrM>o;`yV$DB!HYE~b;Psn2M@M{xp!q~e z_@~p|S{f=ln}veSC(jCxx|p_^X&5zR@{5W#HhAM3X1aGcv8GkEsCGv1dQN5kZ-Z%Rj;hIV zz>&8@N3pj16u$0Wjs|jn^Vy;L`6uxp$8N0JJ_nl~s{gb6(?T{oqAZMN``#1>#$XV=&;{lONFG*yP+lpG=N#lA_ zhl}n_-#jnBNy$mCwaWdTNqwfBZhZ?IoQq^1b4h^?}s@pYWi!LGN)yp+=8obc7#!KLQ%C}$2F{lti z34o~?i%z^PtJ`RUe?l08QC`b=pR$R)yM0@<7n;xv)BH<*K3fmPFUm~w5B*M&WESUj z9#mf3bO2D3jtjf6=kxf%vZPM{I>b%7EH=Y+)@;SL25UQ3Q|loGjw<15X|YeIPxEAB zBN_KNJZ55Zlhr8$l;c(%P5FY6?)BNfhF26NNnp37>$niiOK*fOoHy^@h)IITj{2t= z`>Umudrcj;0Rrr7nVIoW?sou6zrV!(zI`Rf>-ek9EN9)scr+P&DwR3Ns;Wbmvg9|k zZiJ;B88pGr$aCkTp#|yu!=m%{s`cC3p&3LsiD3~;9h||NY(>6{m2vMxk!My%M|*0h z9Pv-y-*0VCHM!@!6|rNm<%sD*4Dw>abrULDteV)llFeZp$dmw8ZDP0n9v ztbQ4bm~8SXBaH6Xlp)PTT_EVH!j->EG&0(M@}=m!B?+U~X(N`esF0N2BGJNs<1ki= zNB?w}W`VzErFFV+?H66(`H_8V`({xsv)($!EP27@s5y=MUngn!a5-EN<+X9HvQU@7 z1X1!_Lp#J^i+qdCn2MgkeV+d6C0iIh;r&;+;{JjNB2ln^oz2h{A2ZR)h~P^oAh99Q zJ|Tf2yhT=SU~*+>#@UjL9Z0)b9PZq){8g|y9+d~Bo3-6)3;RO(Q1u-E^b`L9^zRWM zd3reKuiy86VX{A#!Bv|V&m;pzNp1#oW0x9ToW(oc-wYzb*j71*ka1U2&$pvIe=4Y5TGlf*=@`p$|Zaxl@H*=45up00}TqA>IuGYMM=sM-WemTlCqpPD$- zTQ$Ak7wv7A0F=!4BBpKeRb2e&{A`dxL zzdSh#W(V=!mSA6P={;0wyVBn&vL)EFmL0bvH{w* z5V%$=q~Yfrk_YBlieU|t1A#6D?+1X!+YdZy<-m0I(`td6#wU;Y2Y}W5&<*$n$C$VS zX$_m50W<>#pY(1}>E={qY~zGWviH)7bi4}a%!F0#=Jds4!o+;6d_{wv(8C^KU#>Zz z%cZ9DWd&+ni(`&HE|wMcx+ZNEmiE?Le0k-4}28y#h-9OEDa z_#U2}uUj5^RV2)^txA1VF`h3)GsI`@jy^bzN|EfIgf0pTEbMBGOacjfg`@;@R2$i)~qxA5Qb8Y z=@Ln(O7jrIQYo!2F}|*c{18Hk1^Bq>=4bu7je-h}Rp2L{%%zacr#l+!jaxpN`;(Q7 zop8aKXtc@adpYYm$G~9vnTh}|nRc2Ov>kLH1sW|WbC$N~K9Pp!d9N>V3zlvC_8b&H z!KQoEBkc2u(9`W$^;(lZM5sgrQCjUzji2op0%^Z+tx#>Q$j>6mvx-kIl96&01vXDa zzz8*nIbvffSITj(S?EXH-rT9f=1>&NF;b?gTB1Pk(c&dd`7Z(rnO71du+Y`ygfkhb zw=FePE&wN-B-tl(DEp}Hy+{@(5^;mibE<6q5Z;jaI~Ai)QeX*`sZO6)0_Y>(@1RmV6y7SK(>=(K4H z)=NvUE{9?SJoC~QRB;gS#oTAVIIE{~7ZD_GHb*1R2Ep2{%m-PdGKX}nL!6iNWY_j@j6X&Qv0jWWh?+BL2z7OJY9ij|C~|LnSW-P`+3& zUu}D)&hB4`YNz7LZS|1D)af!E9ui9EP6cc%22~rs*S<~wQ9K7ZYyT~7%FqL{I5aR= zC`1m>o}Z7vgdhG9wYacGdmBwRFad1(xj$_syl_blBR!jJ-#q+zd0ut-vtf*Q3|~I% zv2pT1!Sgcay#5B}5gyJgWa%4N6acHz~RPHHb{ti1LW1>35Xr)CxlmzV)ttX47Q==<#O; zS}Pd^ff<<7UhNcM=@B-W%2lt+17vK~5Sav>jKM;+cV#Se5LTqTD8O-#{=sqEf!|=e z_cjb3EHgZN+nVlXkv$QnI9g63u+ZHjPc756Qmu`9)p00_pm%#f1M|U8u84Ex(`1Ctz+m8j*16S%1`1U|2CG zeU+luE||E#U&k0)T{l=!e9wJrIgY3r)i&6b+Rp}5Y2!*d(*cA6{ephkz2ljZ9AyR6 zs0tq<4Sk3SkY9fN|88V>3Xm0@z|1sw7wxz489a_|nkJ}zr~W<{fi4wWX7%5z7LWXK zr(C#90!WI|Qc4&NUmy8D{F2spfdR1j+xM3P133OA;WT2;-h*h%Vn3LZ7V!dVwu1y` zr(&W_INPbuPnu5|-7R^JDlpAJ?cl9*7IL#a%(F6O@E!n_fGXts*j-uR+u2+0U4mF; zf3|p-o!25T_uWfFAsG&Ef3<|lq^QM0lc0X|XKs5v+Xp?(N3J&$s%+WDAIZ8ZAbG(t zN%sbeg2Q@?qX{MU5HDzEn^Gj9A7#)Qm+Lk{k%0ekXQa~Hk`UwWZHp9NtOSzosw6)B zaFM9yKGouYM3M|mGPt~=O^|Br_+6Cn9sEEc!341KG?aT!(s+kty{NYAnuvMdDgk!J zsM$;T3iYR!m!wp6<^mj{X~ETjJ3v`zcyL`LnD};<8VV~Uj(nD&>mB%GOu&3Qp{V}&eu8J5c%-tx__~!#LHS2 zFILPj^Q|mf-fdW0O}gn1`Y!)ZsGAQiV>?MMBw1D(RUp(MH>h@+saCA}zk>H@?_3r+ zWG@=>2AA(}^fMFQ-U_M_1p20avnKrX6lNuU9K~qS)WR(Os~%4I!)<7EZ)wf2Sk=N} zaK#w4y0QZFnML&I-NmO*w$ug@ARXy(qmuYpWUy(2@mCdJdPw+S0I~iYNqR~oeQ7mq zkPOWo*UM@z&%YfA-z_uQ9qI4jmzSfDc7Vt1e_m&V2j{O2FN+>+mG!&FSde)wa7zO! z@cFEL4NxOeV0P-5scp|ot0{O=Z7FkpK7FqDF%|IV6-xLd1lV(N=g17N6G|YZtR5$s z*x$^f8H9y^q7Eo;X2Gh{<=jZyE;3o;bal zTT6|dVKfn@HQgB0Kb-0}N$f_7pNZIy4fI5sACo7FyJmGF1g$1Sz1yyD#u#mm8(aIe zZ;f|kz*AWM7`p2AccuSrUHD^N5yuOVE%3qZqvWJrOqqA1$8k|A>LVquk~@?s@jBsx z(OovyY#GbIuB|JlR>-9ai)4x1Hn!F#zIAlhqv(qadf6o!_eOm6wT?edr{=+Y%`av` z%;B4VFfGU<#Di3}vB3EVMNtg3|qb=fl$^ZS-SH_Lz2ts?*0 z`~tl{?%rNkv6wZ#PQ*1{|z6`)i{{!fjB;<%D6Rt0Qx(yNc%mbaPYjHXGcghh={hwc9*o|9Ujs10Lmb=3Tbegks~X7q^p} z75!)vil`&hP~+CNM(I^Yzh8YUoAwrNgFSOniK`izY7G|aU-1U76T@bdF8i8#o)a7& z43AYn%LZSnu7wWpzK|jE2TWxnH&6wPQ{UMqIS&fB93-}<9jDc9O*DmZcBYRT{yBYH_35yUhfQdaC1xkFs(;#=Mf zrk9k+ph;3zMABtw%wkkN@{z)N8?9#ucrT~>cQUagc!fKd*MzOREGT+8{Ixq2&M9Z> z!3)xU<(MejO~uZboyZA=_-ZihplFIGIMoG7u{DzT^{n)Py1?OLj zdTsEgHJBEjK%Lz;lhf*7Ozq9G^2*yqP~b~hDDZWt%4PzHW^h?~&3hV8X90i%%aIQT zbc2M;@H|{N)J|6^HC-y1XYK}qd57;g3TvQo$q(0KN3ez;v-?qy;0J{}@J{zK9yrD? zrFrU)@-TT!ifpG}T|_|OFrPnGz}L@%`gTR|E#zrl2j=!mdaTZ)MZ?%F)9OZogvc)Z@8Xr|lDV9LQV9Tm1*moFy2xXRVJl2N)JVUA6x9eU#UfpbjT=`V zqW!11KB+GuhT-02{uC?!4grgm_gpzf;1RCN$S1|_8YXzl-h$OXUGJ&)+5qET{aRh! z@DI0|)nL9;;LVY&-&wE0)8YpW`cgmQD^}L0kG{Pdx0}BYuE89FnvTk97hFWW9F77~ z<1^j>psw(U@nN~d>{`up)Og>hE9onkzgmWlIho*$4s>S$g~>6E{7MJ6-&6g;SG>d0 z)j1dx=L1h( zcpf@N9?qyHGc9mXJ1)|(obcq)@TBHMf$-Gvcdza^*GPjqdA#sJzuUtFrkgEPjX$|C zN3Vyv!^vh-DxDfLsOgf~;7h6@ES$Cm`WGz`721nj7uG@j{vW)HE?zth} ztw{L*)#i=hYYQulc2V7s5`_(ju*NOyN&yJBEVJilylX%5OLw83N+O^Qt$p+I$LZJYQWI78l;w%s#d{+Aro$O6WV z1Q+bzj^u@yq;iMC0PH-ip8$UX$Jxc#EQ)db^G@hk{I{#n>kFrwg)wABFX8oeZ)Hj3bO!W0|{;-1?KAk^^5m@;}1$$s&iUOhZ138#L%NEYz2!1$ZM2tB7!NAW}mx~T-nOTgbz+E3SG}z!d9}w<^lM&(YH6I`PiEX`$vpu>b$< z)L|n*da6Xp!L$afS9t&Po&(Dj5mJW(b|Z$yP|cl*YY+Ye*g|g0wmCS0^ZJH>(f+iL zyFjt3ZLUQD1YKK|#73jA?(i5vMUw!4j+7M_P>WD?x{OuUOJ8h%ke2(FGbqUZZZrbI zJUkju!BLpg%jdf1kD#^c6&5ifpWR(sIev``;TO+KQ+mzlH1n?$_Rr(7xrO9eWpSapL}Bj`ohw!yT)`eU-q zrhOhTfQ5r-=!t4H-1gpFCBbGslZs3o9G`QqN|g3E%X@7ShS}dxq*X&usNx7n-E>Z@Go|#Tqex=a@}# zv|8fmvB^}3)OKB_b?-kP&ECc>NPL1yZ_LpZ_n>) ztlM^txjplAMd*fc+dzA1(Q!ZEb@?g zBmH-Jfp(uA&W&|{<%M*qdMHtd`8&kYCvaNC^YeiR)07pEds(u^>oc8l4xy;~bTduf zli}YtkhUZqI$vF}kg}Wrfy7JKQT}V~VSD#(1q_`m9eQ9;6RyTVraiA5gV+%ZyGS&# zNYWK(Q+UHx<^TM}%kL1*PPI+|qUw=`( z`_pc?nEkQi1_MIe^+VaX^iv`8kf=INAXv1fi{1FU zRFg=U15k!GTlF%(xJ(iMGk$&rf@8W$x7Fb=Tq^fR2ZX{R={d#Y7KGCVoz+-Q<0G7n zQ+PNDPbM-nkUJ?_6W`Q|BajfIi~*_{5y7je*OnOXJ?O#J$mRLLfq%J8j{E@cOg_O#wrY*hkgo(WK)36l!l{D(Rn z*ol5?=9C#-^0TERgXbD!>8gS`lZFQGy3IuZlVdUXDPikcliC&JjOAcgQZI0Iu(O!+ z15cpti_4DZe>sDIYvVm&mt0}{sXDNT!~LkPji;{8EZ5^^(qB&_ZOt;8UZp(D6Z3Gi8asDNQ4=*r*N;U zRsI?7q3v@CN3Ejn*Q~ndW_Ea7n12llUA9$94HDt5{qc%ekGXqXID|eycX!3_F51X& z)m#?-I>&xWV#kt=x0>mq#1f(M^mXhFS4uSxoj0)|Ce@L zH7Z)ss=izwKC{$`(ll;chjprbLDs(4x{KeJS0&=4iPkk2w8E1rCmeVLSB4#!iFY!L zwU#cpQk{sU?c1T9dfy-S8jogol3R{=Wb9Fx%NehYS7D8UshJ()2S}T<&3Het*!Nc0 z>{z0&uqtb>sOsdGzI_vraF07RUzakWl)oqj@gi$7donry%~K;zQe)h`@nhmV#9xa~ z3pb<%q8Ivo*QFC$t9~;!my&qD<`Iy|Q-aO-ycOYB)ifg3gEC!>F|eoEWQPyO_gQ?a zxDp~zs``@h66N_b-b72n^ta`#RgCh*y<^Xxsm*DHw09t$k$ussd%ugrOKGO;Fh4U^ zxx1P;TW=5^`ex(zY|3q&MugA1O<~#r%GTA#Hdj}NgO4%Cfvu7d)nvuwJx40Xm+K7- zyz!H1`F;s3&aBNn>UWFeX~;K)b(#q!3I@Vph(~c@+H`BTcJQ2}5X%U5J~#P0oMD4{ zdRu2fW-ng%FLoly3_{C6O7eLh-2kA(c$8qMdExcx z7At;7ypX*qAlH%aZfQR0yuQM4ZhmEoDZnRoB)XQ`d{8r-XNc#Cd&*C0B8jdTVg*Ch zn>pByt(>VIh!ips-`yJq35iFRhQEvQKwRnBCM1yL?#$^q}ewGs`c?8GjZ}i6!Yc^0& z^_eB|Jr@8O)}v^=ZOhYXj?KUk-|em#ev&M^7HR)GN_g1%tQsdQl3Jm~jSKo9r8iDR zDZh6tca^6E*=5PLxz~`tmbb7(H7Dq=HmCYIM>o>NoM%*6dN5bzsCG7>mQ9MLQApt` zY$&GfUjBM(V6N?snY*si2tOhKch7!uwb@&=oOZ(!E9BSBJQgC z+)Oz%h;mG=|4q97uHn^96<73ZO8n%TTG?rlulyja&3W;=!H(P}8xwsJH;U=<6vX3T zEE7#55RWoI?+<5=KiHCLN;Se4m-1D`r9Qm5GDV)d?5fH_N`R~!aft>|A!i?KLn)VC zRJo$ljWwYjX_{ta>0s;66&ztO2Wm(qzX;(`SQ$nZv}@Dw<|Qs?kHdIbINs;;?R|S8 ze#bo4f~=abDYJqBA$U^8JY!8#74p4Sbn7G73!1+rgFh+4{}yvpD8IIkN)GYoh|E{v z9h!^0l%!vX)broYsBYGfC+h~hqi$*%oUKr0`!$Tzf>1MQ+tE! zdpC{nU?g*-a#EDDM2H&XHSEl2>dLR!YN7wW~tpOSTsXQC|^-p8wqWwM^=dp zjz~QEA1`_MtFe-Qe&EN6m7S|uj%tVKIB~t<(bam!wf}~B40J9QJX|1a4p&;0SmoV( z^zk(~yL(Po;wF~i3+1Zs^-&GiBOkSCbq0iq&-*d+!j7ju9}RU9P|WZxauI^Zgw)$t z1#@K3nWfY^e0@|IcKe1kZUT>pVM)>-O&1PF;3UWF8RW-)C$YF+pnR20zwK#_s zjWlo&^wjJ!^vt07QHra7KQuUZQ&VGyWVZP9Ni{4Zbj`;lXCom(x3w^i$H=|=NUZb~ z)6#4i^B_^qGZ3Z%fJ6g;IoMQC1xxpM5WA1?;tba;Ql96T|&=PKXw~A zXET!;NqzO+*w~jv$X_ez=zBiHH6K2k*iG~N@lwAQG0D}PGsJHT-*o}Dkjx(CGf;_V zy~d()1)%Db{Yq?iV4)ZmdbV7ApLAcg`C3fHZF`kF;1+;Q4C$n_KhGYpR&@=GFBRKi zMUzvX=?QP~Ix=O{cgG-<#@9NYSSSVt5-Yj`yg^u+<46JK5a8b0w6H!o zQ^oCz_UrT~w>uy&k|V|GVyG=$YFzY9N{cmkC*XYz1~8A=yTb#~wt||*d7-LO9k>n3 z#j;ErZ?KQa_fkycuxm+BRq!ISiGAhTKuSYU1*u!aC$LUindcf-*W6%?Ev+U?dvlw1 z+JK@Z+_JsJp(cgTaq}#qn^~RV{k4`7Ve8KyM2Kx%U6-a`Crdy0aQnaf=ilR{B4C}# zoOP6L%7%XqwE~I7eNm`2qG}>d*NMR%-%J+#`NXn}Ryvm>>&S9y(cG9!|D$=kh{uaZ zkB6P#GNm}8LCE@qipY|9_D|pXFrjIBG=@onR9ANJw41Sqhvm8-b>K%+{f~lNuKKH) zYjHLcRt`k5D#>T37smy?f1~-eOlUM`giWw@3i-^w=Ec&SPYMz#+8y0h876CBz1ccD zD;sP4X6K5>HKyg-?zzAUjv;Y#Z!5@dq;G_|+C%8e75i6ebXxxteVemrurMEesQ6@P zZm-BCE6>bT8M-&}4VL>nKa|nP+qV?q;4x@bR%Xh)n&jaDqFEA(Rlw7huR-x zlpS?9;;`mJrb9V=*7^I$s)H>lk)O}Sxm(6=TFXoB&4k6-~X#fF8`^$UiqExwRaDaA^-7-dn6Gr)ZDcMY`C?a4F~b zz+U6hdE_InSvCD8nx2|S>Y5l*{D@t|TDYb0wPd%&XNI#{X&CixKoMD40$|pCQ`-yy zrFfp)tb*=T`A0z$bA*^H=&b?l6ALKY%Qyx-VdoA>Wrx*~v1`GR`mW&&@?ZO3Kz`(= zy-Co=lE+xw<6#@>TpkdM2(KqfZV@-C*GN!=a!T6%#Nfm1WZeZ7jl#D?e?e`GH-@#Y zs$X?2Ss#H?q&TcGQjlEUe&p|Df@DC0I>zRr;hai78kQBn^_+$bgE+&Cf+u2pxtY;) zGpp`6e}hA9QcR9zuqM9BHpDO>OA`y&r5c=RQ-4&4Wp@*#+@UrPaHPn!v8{|#Mj z7A*C95oH0B6H51|Q_TIh{sG;?}8 zM@L#YabP3qK+vsR6BAA&K}}9)gI=|o7ie&7RKSZk^=cIs?=XpIwTygI?!)Q;Rn-mJ z()&n7>7fv6;XcOY=8l~2wXRwwb?;>wCARbv!9%~YdRh0>K z-hV0hk8~$vb?3$I*R9DBJ@)K%5vp{$y{J+1?}a5=YOCuAQO=)cY@Ig!6V@SS!ebfF z@y#_4*5uJ5x9QakYB@gDD1V70FLFqmPAg~{$*WM}5lGmNPL{KoZ5CHe=|qJ+9pV;r z8+ys_s@j!?4DGeyrTR)20@KvM?t#*tb=#yBnw?SGiNy2B?QdY7$T8S?bm9tw$->VL zMZR0BZSomzXVb<&6rF;m%6iPymTuPeQ4_FLJf8iy*%1MAav!Fe2~%{Xf1hZGLBz=NxHm%#>?e9xHkd^)4f~Z2(My5?eX{* zQRafZIl}Qg*H1ialo-@~g!KNgEC33j@Ym4^J%Gdnqj zyje!K0*z&dTTM`Y$kToM1G+WMw`5()vnk3ppdK^x)xLFT0PUo zfB~G0k)2fyr5mmA_-21sQ|}#*VnN9e1rZBHM?QE=gs)XAeE1FctE!*-Dqt}p# zjE{>`0yOW--fB;(~;ZQvbVuJcLM$CT9wA#B_Y2gmQ_Bi?Hv!PE=dz-(AQ8O z{M&jNbi5%T2V1YNKH>VyBf4;ncc}lM4#AGm*6j3DB7Bl}BHC%Anfz67aX_ncfyb9W z$Vgke_rBz9CE*&$yLlqNTi&YWDhZ5QKfES_$tvher1Og4wC@eyev5g23T=sfz<#+9 zQGV6GR6{UcAdf?kQ_)`0twqAW!#q+~I@$o0=FY-9 z?Vk#yB=omrSNmvpQgWp0`KBN2*(y4GEwSNw-aRvWz$I9rpklft zuvOqbYAb*-`AR0BWUa?TSx1XzqxeADFfa1Mmx_*JUXmWp;LRYH%3EFL-C&X{kx`}- zQBmn)kZD4FVM`J090B8Gzt2g{bouiEuC}i9fJ$A`*RQ@OVvQa~! z9;gzAIkWMQ=&?k8m8z~>3hk{o!m(DRiIMUCd|pz3N|iSiK~12xd<%_>!9!6`8g+Cr zPvo5$h7>#F-0*_puJDn>^m(PcOczdlE!EJW#fz)SYj+_55sEMV0{$tq9ReMYf z;LLVn!EF>2?0oYlPZXq{JfTvsw>2@hGDbm>433Grrl7P&^yNXiVdI-;lBlooA5*;wN@*k1#$mXx{yZ1E=vic2z{4uBQUjd`F;NX-oQ#ZZ7Pi;Z zo`{(wXOrG!c&hs;xc98@#IzUv6;t1>U`2gbl!4b8-|#4Jx+yzcC+9)?E<%C#iaz~i zO~QQ>1qBolqmfe`p_yx6qZV`I&(xmJ{otrY5fQ~~M}TV0G1DIJ5UNr4qM|sW z{McAD3eKt_(9gSLjyFF;FPA(YNgtMG!Wkcig`rHB%tYV`g_YdH_dAeOIwbkw4UIaePW~~Fd{-_b+H?=Z>>@9k^)ROV z_)H+|jM+RFGERCF1c9_R-3wBA+FQUwGp*P8`9RF4oM}$BT^v&-~2eU3j~;j_umaAn2@2?}}C(HzR$wTAg#R_L;{$FpH^4 zbOjH^?4TtJtu`rZ=XS&hekO+0!eOqEqPK}tj)OJPwrFo5E+kbS)Xr)adj;o%pYqeT zS2s{2=;Tq#4r(=&$n-NqVnfh_r8FF9?OP5Usv<0Ho>f;>RH46EZ|e290XHAq$IH-3 zLKHfqe9U}dZ(ruwyW)-ZDykm^58iutUFa%R_SKIup4!2W+`sU6#<9J^Ttp$vLBUPG zdfkVl1Y_?bNzGN(xofDRcY-jauMkuFaDG7Cjkr1D`&i+6m2XP=-OX!(BDjw*^{nDct0U(?5j@n}l=j_Q%s47ICWy(ymNPiM=6_B4y0l8_z)?rwd2KqJ zLd?58g5BZ{!CQiW(BRM12KH?J@rp8pSy*5!@J)`O!=N?;bM>nQS4W7+LS?@ceYE)u zYvVTPGjuPxI>vtYMz$}N$(LJW}kx-W#d;Cbo?7bS; zy_JSH+ttxw*7c|ptqap=q$3)7H?H>nAS)u_gCvNyRI-#B%bX)O(IIswVkcFGb|Y#U z%D%|7ZDP-Sc>j>(Fp5cRL_3zbD@uo1>)s@jyVhRlT~RstF#2j`7WpD&*oP_E+FP!^ z4NU^lsSlc;H9bD9IKFzwj{e3s=5hMt#Lu+;eE#{^Pu@Hd^AuwhOEvKMcCRhu&DGnt z#R5NP*wJs$2hztq^iyUUe$|;ps}z#ko-;l4oJNdBD-$zQI} zU**2S2AjH-(%O^T)2d(Uwlqv4zQn9B)-xhvLZZoH;Pl?l-{rgHe#o&>GJo!x_ePaV z6<4+A`E<6Ml%tW5V-vyycARlYw=AsaH~e<^@sMf`xnli0?yRDBu=gyAvxQ#IJ)inz z%@;)$ls;J~_)HhOSKEF{kOKD$ zvPF_1G68mKvN{rzJF28JT%SqV-zvV{Bb^2Xgl@f!ddv9MHt{3v9xZBABduW89VH2+ zcjlRES2-XggG`eJGX=BBCKNB4dK=n~L;Z`y-nMavu!O*4onmui1DPqc=rs>D3d=3Z z-At{mdMb-bnk=7G{ixEg9<)G=jI_qu*7sG7h8a|UweiyloaS-A=3eUQcT(b4^dz~3 zBJkREh6h2V!7tlxEv(MhOq5RlD35AXiXFtt7Eb9&R!ZJT4kWt6G{^d=;l)R>N&f}= zubF)@FwzybkClD0U7-uAYkN~V?I|m|OQ#U?Rv8lt%P&Q*Im->Yp84_XxwO&@Z9uJJxJbfJ2*nxAUr>+nu5nGH=he%YmV_sIi)^R zII}-nx$@=8w^vpE-yb*oPZA4he5jVJ$)UkRE4x~KO$Zl+*@<~XbBFBiZS7mf_gfjL zg+DMxBmx^6*8p1?X}KRSAQ7zaO;Y+0*g!1W>SN& zs{jpKCZ92g3slLDn?@Apq?z+j=9W{I<%gB5{UDjA{uxczv)`tWyf^TEsX`lFOI^+t z^5(iY4|M>9lKN!4Xq<37&Hlc<+%m%=HrSSlN4M$aVV3~B;Q`}U#u`Sx?aJ-Z<^5u# zB7qugO~U3p!^+-u-(f#XkCCAQnj%>ZlCzNn1)khC#Y<94 z`wRjMr29Er<29xpthVqiPZ*MPFCWf2bGGzqP6RHR=GPN*6q6ZP5?FS#@zLFvH5-@< zlGZU6DldntE%Y7rWF=)y3!hk9r)W;cy4C0^3VU$wtri-lwri4gliuJSAPoukTYxMS zdxaqnPqEGj$mvMv$mG^iCI+9HGgt&9#_@z#QCIF%idXL?@9|IfFHeo^gdDOCZ)t83 znnw3p@k$G5**R@%&(xM8G7t}l@ma4sFm1Sau&;lc?w#v}NuS0QY40_8l!lBu!rpYn z?B&a;$?F+vTh`imHy#E|hi2(*d0DSl!EKt>?8!+LS+7Z1=^_%sh zaOS#Eu<)@L+;8lfXJf<6yTII=vqGI-oIhN82)d&(vbW`>({cs#k9$_DzX&0lI8IVe zcv1s}yahgzyPUW$!}YG==tk&8Hw}4c@EZvZ32h2`Yz%)>^D7oBrW40LQ#df}BWvNw zK6N-ld@&nZozwa;33X1I$!{n=eSv&u$Yi!T-d+(-uppMEEHvz4;sHCtKU`XR+N(A- zT4pOgJJE#n_68+z^U{9{;vIaCg8lr_y(_PrhfyLT$9?Q^5-5rKx(5eQdycQl5FE%0 zaDe4Q1W|B<5=cYTSFSt?%Q+=QF^XKtjeOWm{*jwoF(t(_du50I(|vEIYXaG;^LsRw zABBxf0?wpo&njLp

    +pAbJJ!N}##`6>ZKuWyXirA%aHQ5b+@Ocb;$q$udX(G}n& zbcO7nWAQ5wQLg@V9u);8&>RKr*BCkA{roQic%9$#^ZhC$0OcC+2_Ja5q@(^l8Vizs z_3z`W_P{k1QKctRQoy^Cp}n!O4cN@q0g`fy890GuC#eBOK_Q|!e_fGMr2Y;(f7D!A z-9cSehR@K}nnmBp*1(v>#oF%tIVb`ye88c#v4cL9i?x*vn9oJ<{$C^bfaCMitoNz@ z8scCncwb#sf$E8^y)hLx3mXgDeIaZrDk=ecBNINwr{ceE2R;ejH*;{X<6~uYc6MfQ z=3ue4H)Un#<>h5%1F?cY%)kg{u&a%Oz6-Mr_`%PI{QaD##$ZExb2|rfTN|qL=jt2S zIywm6zkfc_KYu^hY3ySD?@Tt}Ut|FUvYuaIWoKby{pZ=htpev~`4r4ujIA`Dnp*=r z1LhEV^av#I*ZBXr^6!in?o|KxP7o&-+r?WiT>AZ16|k}W6I*LwP6wfX<@M|4ix+?0 zD8PD7`UO_}j;{z- z@;{>9K|v8gk$Nhs>~dvu+SGk=3{o_IUu-GakIPk|wyPR~;^(KkT z9s>IpXd;t>ThkYtR%&;EP;*O8AFlfoL+ICIv*$c39lP<-m}s3cX1 z!-J*n|8af=tt-ApmAfnJm)0nfiH-?T(Tqnt_~VUsIA|v{tW55~{1tIOn z?~FT^bA)y+ez`1SlR}ex~rK_`i!xzlCN{YG9~csdi6N6>0kM`Xz~8B0Z=< zMDQ9EGfeDs*TDAza;DsT+%RKrQP=Ml-{T4TpV|K&`LPFmonBJhZgaUWiQ|$yjL|dh zFg=h|9XIVA|4kMbR#QWWx_g_to^Wmo?UK+Hi~-cCV652xJ<(WJMAN5vC>>61N-7FRZ_~>1*Wp zJtF@8r3GFRO(ju{tZ13l4x{(Gk#23ui|bieoii<9+J9dJ3!u`_5oDna`Cm$Y@lC`U zZJk%rWT_1^ba=UKKJNnQoE0A(^9m^P;%-q}uExbA{RYSjP^U^35yXHNT{RlNtx=O? z%z8=F(l=3QpE>P%8w-PL5tv?0mYE-v+4+&hKjf^5M^t&M6X^z6Kp2#+RlHG3xDJsr@9KxKwdS&7?Zb z6P$lR7wnSID;CwKrd~V-{ZK8RG7;hz`^N0}au5x={*9eo>JmZ!LLNA>U{oj;EmOD9 zYdsFml()p`7{0igbbWNt52wg1U1+@Ua|$$Q#<4>@*`Gyv>sC%ZmBzZlH>kCeolJf> z`(@r>Vzz41q}<_rR|dnBq4mZ_gKo>J`(0$t1?ip3m&L~o3u6Ah^I)m2RnfhOpH0U& zk+1s;cYdJ^Q|!UG{g;YV{fqj8f@*w=?Mw_JB~2T3TS_lp*c2j_vY5ggFPPtQiWb-U)IPVdOXxZii{VRXetSe~8Xc@Pu2UTN*r6UsTBOj=2!@x?3-YQp(9}xRBnac$mtyMQ5Of{6eBUj?4(fdx zaII+%3xRE%10vcoYZxc$7B#pZLHHj6*haS?q3&9BD1sP`2e*NU@tf7Vy~3+y6+@Zw zKV1^@Q0OaF8h&JKicOudDyTGe)7kQ#$!DWlONQ-GDh)ApUiwR*xFn5g>2y_5P%&OY z=NCoytiq)L|GSp!5$avvw@_DXEj3Mu zAMdoJrHxOGcwtKTXCg2cv4`$UIt}*>JcBIBeetjaV70~4SGZd`!XDhFh1keB_@cpj zV5iQiE|p38vZ)fpia)E8O7pBwEIqVMQtlF*9dDNj>3W9iYZL=nYPdA`633?Q`&e9q z`sPK_TMi!5A^P&uH5xo8nABjbN;_`XFQGo&9+gBYjparKXOvM^m97fB?U#$vn@XW<#4v!~6b0%iCi zoOw@jIk)H8rA1s;Jv(e=F2FQVgLQ>$6R0#Ouoy34C=C4#HYDMW1`Qt|)BFYEpxi&l z{0huI7UG~WmJ&F{y4ISG3mO&xrEtLjWD(C2*?Q(iAdL9uq&ht^;t)U7EmXQ-Y(m42yX?Lx9@_K zaY{hH#F2Cg^kmU8qm8Qs1dIX(#xPr{h=LMc_si_P2!OBOQHL=hI)o2!Zc%g8Q?p<~ zxQ?Zk3;aNab(-VE)Ke6EHF8XM2vimgj-C|prrdc zi@g{4SQCosDheWaz<3uQr(E8J8CYxK7{MQv$tQp?$04G-h?5A-L#KqvP*Y1WlBwg3 z^~Jdr^iXw0LCjLBC3EUIoyPM_0M%fF%kko6sx{NUiI#0d#}}7#Scyk;$4L!fFvJkm z$^>i23$NtH@8-_#$}Hqm zi`N7lHz5fNkNsOa)y~0IW7?*Bahbods6vF=*C?z6FpL|c?B z3Dccb#5OFN#cx1zTWWKes=SG!3JsNXm_8QZCvj$R59Q96z0K8iQW-A5ADvIWux?I> z$eJkV#Cd!BI9v*V+yGg7<7LNnVK9|K#<{;!Rquqgo59}Q@-v#qvft;VO`;Vb%4D~C zY<#k%w#D|IlXcnmU)+iaV!2#{c9Xw0J6D0!R8FwiWhyQx7oejIB-G%*)`pxZBl+YrvMysK|ANRb6}fU*TP!3O2iq~*l~W~{^!UCv8CBcX18P~{XS<31gC!y& zK*hy%7S&p>)(tPJQA^jqTfVSQnJ#G+8dTM2bdlm$n4%znEq_+092_8*UvigOk&5h_ zd}+ROmf395v3zZCAn{=uv+2Jm5J}esYE{D5X4_LV2{NulqcJbRtUt)2W2BP? zJk}g0_K&^5+k$f|0n!{RCw>IH%{9>>T_2Lu^xhO%a_^5#3@|Y>V{ORWItNy8s&PYe z_OtgBcw{zmpDMkCKL#16`nTu4@w~y8*79D7_Yohv5PdDD`1*Ue2^bu87!?s#MYOiH z#;MzOh}OvJih-_b=3Yd5^MT&rD?|*!lywed^^@*7aR5*@t?i%wOfi)LGr&KdxEWsd zEvB0xIAK%AdAlzIf?*Zc9fsPqQ_7DwcGVbj7PZyPG+OvbjRr)NB-}%;?>Q&+eT#C) z)aEy{X%|9RXj z9lm-X!(DaL$a3Z5eliT#&vP0iF!VrBXDj1VrhPc8^hOinaNid3t~i17UE5jH@i*Sa z(s`kTgu8oF%i6i`>fo0AWu=vHZStC_;eOhv1wUG4)q`slUy=AO_rgPu%D4OU;7isT z>bh~Vh-7IJ>q2H#$)e_B>7#DJ7*bWHrHQ*gQ)!WV0OkI#$1YbCFMdNhgfjnTm_o+oyr)S8|uxy_=3K7He_qimSM6gjJPDgiMQJ*K9R4p~973#G=oAZcHf94w}D`W+o=#wBmNL$>;1c?K!mf0mi>rfgbZBGFZpPSaeA4vBlcHN zlJim4&nS_ze$Cqvk9tAp=|8^Vf*bpJ&c_!}8Ekx4m`G4}6pfv+pg**ed|B}hE{9+Z zKZ{PvrN7Phd1Hd_V2nXDlF? zTWS4|NQFwl5WsGmFv^4mk*x{kb5?7XF7o9vxL%7iLA7x=)`rJ1lE*Umvxx#=LE9t&Kg zJo?s?p{rpz`YzXY?2~HkXlzG`9`&$ z;r3?#)oVv}i>FgAdv{^}C8JK1EBl_U-8}u#WZF1n*9X3b2H1TL+wJkxIIenbx1UZm zK2R;IF*$`J&@N&d_cnAVAwoHXTIL~Z0!TEsTv}stENZK<<)fiQfSa+61+`ro8<`~u z_2dL^G^_OKaECaCyRp3i8(m2}_Z2~F{v$`%C!7T@;uA z&m<)$5%4p4&%yWp!?D!_17p6s1+Ltec1OGQIph$|I~W%WQ$5?NocTt)jBT+W&#sbj zBTUZN(R$P)u~q+Ld>VP&r&E?b!DqEqE5WF$80db^&^J z6tJ&1Q;q+C);64$+;yqIc;hBB2erLRk=7a5m*1pMF9?HP9sD*>AmSB1FWpJ z+~vHFdL!P3@3`9x#*jJ;ie5(n^vFK8%_c!+>h6CVV!pVlO!*hc6DUlrGlJnLnZ^rEW>Ug3vo&Qn_jN7n)77A?}rRIuxsIcr7h&;?T1_<3S#M&;1W zH9z`(Y;}L}cOsg+d5~d{3jH!b0LGZ?&PMUXv{*YaAIuO-c+$UG4bXxqG68V$>7UJ`>Qp!I^s+dE{uc$Qiy_7b^XRKSrChvec z>C(B1D8fI;#=P53Dc3e-kcgMo!nCn+R|_3*Jw3IOtN0e@9=$LD1J^ZQL-(6P-oV}I zXiRv%zuo``jQL`FfVWGp>npVg89x#4MqSP=Y*~vz!`ozNNBX`VUHMuRruelMjxM7W zd`u@x`GC;clEirHYjzr{y-(bVU*NPWGca!m5%vJ!-u5*Ug-e(AwSfnO)nYXxyM?l= zV8=Bj7T!IFce(c+o$J24Cxh|yeui8RqW~0wMD0oc1F1O$z?jcXvwMbR&Z=&6AHEZk zI)^t^y_MM$XU$LxV^aggK;mrUJpG=RN40?XrsDR$cfH(dh^kXXL-*6J*VH@v5t3^^ zJhWH|)yytLKl7->8%j8J5E; zI}aDz$472_ILU3^U}nH7CvLAUc7yFnV+Xz}^GX1c%%mEJj{7&bRWG`392M*)aQvhz z#~)a;W)4{PKj?a>2}qG`{8MemHU%@YUyMzaV;w8AU~S5djnik)U7aGf(fvyD{GQCw z=p*;~#ZS{e8f2I1oMwW_8IOHMHSfvht7OVxcJX5SM;$YWR#sMZj34?Vlt;<{F;4pA z#f{$K@Tn&uXkc_ID6j~54hM&Y?{w{?yfctbm~M_0EtA*t?&zI)?!*G~5AOHsM@my4 zw|K)0eVdSttZp*VzD9xV+1q>Xo$tIHQy!@&%P7;0xH|buY%0LgbM5c`xfG3pszOL5 zx!jk+sgby!^t$8Nzq5L&-%b<%RtAe&{Kn#rwr-=|-s^QM+ZfaEEJRhz#)K=KQ^9u} zjLPatNqOhM0$UjG9?=@iDvs_ZEqH{t*+Y}XJBhA@{5unHA=hgm7|42KFQi;myRDmANFu%zWb0S(78Pj7Gxlu>qT$dQtC7M`}2OrDb&;>M=b_l1?U zIk^IC%(Rt9Deh?gSZBMF4XuW!%mIC@EK6{n5SWrlb6;Or*9&j8J^o*1AY~;$zFd{H zME_xgqM3l)Gzr$~u%I=DOI-F{=&EH1Va;S(Y*?&8cwYCZmp%*byZ{TxV`qCBlAO9! z?L3rlHu>7npvdm+Y^8MVVC~v15|Ygx{vp;oA4Ea8ZyR0eqemgzy<@LbJUczhxRe^L z)+SAQEpVYHr&g+*cZs+qi57RxyqeR%rv^<2=!X-UiA$r|1_k{DIrX z=FFyYZC)f4n~~24xhoVz`r)4Rdv1HDUhi5JeT^mp9G&6nL~7guSCiaiaqCZP9w+Jh zf%gOse@1QT+5iALX`rruP6t4s>_R^ni3qJNh?8F#Hz49LwOrJLZs=HRE zg$Xpqvq?3YWR^x{cC#|83%5t<9nhQE)aXUaoYR_IRhI^Mj}dY114GfsqC=hfugQ&7 zair9PcD;HOTMU%b^$!{a$;YM1(~`S3Zg!2s_dbJ_h6`Ghc@XvcK-%#k|G~Z}5*>Q1 z`D$X6VaGMe&&Un#eyzQ%qHK*UmT}S07S3j^R5_fD^c>oHjtLn@Fzs=yHoXxfM*b`{ zDC7Z#RdMOjjX#!GuAt>H0K4dMTKN%;(;c{bi?C1C&u|1tq(W5b@|V8jfMbA70}BH4 z*(5bFre@2@_S*;ziwK$GAM;&#go^gMwk6G4%ckvR`4yR&RaFi*aD&VhWF&w#h~iF@ zJ=ezMO>2Llvz21`)cPTJOX(F^V;Pb*^1+#xV0XQ}oASv?Z!{@ZHy}vxf@}MbWrWO= zpgs!OVAV>)pP8S6G!R)=4y{c57L;84hkfKy z0iq}cwB_I!KASe3UEPF4PdF|re0Rs1SfhItW)W94vfS_l@DE#AZ^l@&663>C8Xp|) z>`Kg(p0RB`BFG{)Ss26xMb230*9dM*>u%~)fSHrkYRBDk5|E6bST8fuW1 ziM;#V%z7;~%4^hJh>tI-Wr2fNh&@drdxWppvvEYwo0D0yt&8_~h8S2z{S(d?>fLu% z;oDa4YfCCvlK8K+C3iZ{0-1GxZ0u3duRYG3%5%3Ue5EM-VqNMY?Lfig9T3Iqa3pkx zH@qVq=aR&YOHIr(DkW8=LEwN1$%Obo`l&pWY63L%{F6&iKWKyXzfQ52DnU=dY6PuK zTvnk#;j0X*noNY1{`hO4?DOR5O_-ddw{7;qjnB+5%H$3t>#U$N1!z9oJ#5_~l^?y} ztwlt)pfN7TIzs4?KxOLqr{{KUWx@SE4IeXRkr|_jcPT4SwO|{u+l|_Q06v>jh5f9q zi6{dL7F&{HySzhr*>7Oprjm5(0lTo2RY-7^Sw>DU_v~b5@>f4pRH0J>Jbg9gj?1vzQF#KqeoZ=e3hBKw3O7 zs^oF-74A{+vwdTZ7O;Uf8SSON3Gd=Z1ug*VqeE#`2KK3W`XmJ#xtzy}mP+EVn+fMwL({?s0OjIU_N^p@J~eU7*fc z!p)tpEI$P3M)^m)uEfEz5ezA70D}tpuXMEcJQ!g9pA*_S_}OOOjWF$ z*p?VPGOpLj+n)Z$={ zq!x+Te6w}m_%W7Ne~$P_Y>x@TOW-+$O%IlbcGeUprOa6z|83o=+9lB~4a zptR=DTetl5u@{d%tEpXfJix^lK$R`S_Iv&qwt?vIT*GoAnB!hkfi+BnaI(RPIm=h` ztNS-X$w8tRvPq2 zCU0>mkjwMti>p8BCd3D_uY2lpmv_=Hm%NsMu+V9#*6Vgu&w`oqgQRua+LsaCC$VPn zn{!O`S`t!>>dP|}ZSa;95|XVvSu_}}eo+P18k6^A^e!{JBwX|6o@3YXR6HG0wrI=s zad?c^Cn{$#kf4Kg3tCo_ty?mU^KeS(6-MPnZ7rDynQ$$QX~?i6oI$Vdq`x88WyDkG zhs>yJs9y_#>;7T=D6ORquckN*Mw#$NU09&_ooIdgOH;i`_Uss`+|JJ7%OqBp8q9Zof znBgT*Dqz}PSd*MkuE{&)l*R&Q$`aNz`Wfa=zr%3!{W5q>X<&GKxmKEfbWh;<$7g`) z0CJpfAae$PPuxe7!&!P1eL)oPyKNXyIk~>2VfQm^B{!Sq*z`R|=l$@)*uXvK;y%-x z*_q`J9xX08CWCc=%<8O3+pefnV}xy-0Flf;0hZlNsjyzHm!Cy2)Q?Z@9tfxQNlkh1 zNkl}dYPvg|g*nuu`XO9W_T$t{lZh>jF zdGPORXCwc14bgyWcm}oC{jZEEA4L>&ODRWM$aW=wtMiTaB9sA$h}O(fihEk5$Jx9y z1kOwIPUS3VG}Ebi@zO1VEq;Q$D-AMPi{I{>qiarWQGlI}4>J`)z8Dm3IeP8$72b}O zT-?Ll#ldg|OrD3Pt2CqCAuev4`J-OJH@J|sAEM0kTL|YQ1|6V|scKhPTPwxFs-%kS zsSMQtO6Qf%h-0QjxNAgTCykP;oR;Y*tp;R7R&%29JBK zi%0jLudGsJqCt1=rZpEq_h#N99Y&mSM^BC%XqCI<`v^+#|B8itK$t+3clCbu{}dhn z4V8R4f!YT_u%ec<=Qm(udE9nn#$2&!OLt7~!M;ZRUaXgXQ4;ETCRr|_eG)BJ%ZGfbE#+ew5p1rjg8wnV#{`F7$34qj02ep2a~<9^V{ z3Oo7iHHt*86z^|4u>!pU_D=VTXAXq}*MjenP;T|rQ~c@}$cY7zVj%@4{|}_pL;^?| z9I+R)QCY3KWkhoG1~w#9ri0e3Rfba18eKz%r(-(mgU4)$NxTevVa;sU-7Xd=8TZLB z@|bIV0b;0hiHA!~PQ1QGq_87Ij5lF{_p!YizHF^Z-wv%b7G&+^MA3J^0r{v@J2V>v z1jJFyrZv2jmfq*W@!y<61|FWS&X5C}DBq`5(gLechN-l80|PcUJI#9$;)0S{;FGcn z7A^j3z2>HIyW?kj4&22cJ*R8G8mMwg00ObEg5Cauz=z=?@2^22wC{JkIQXoYcXN-> zp>J?K9IIN5(>dJM9JB!CC-o6J;-0{3aL0}h@&s&wpFKPoCH zu!(VV>3vzQ^Z>*+lvLik5mJ@yvA^a%{@F+~ScVbe8tR4#NdaOu)~k6CbH*O%57FXD zL-JoP;(YJ(r2)(DmhWObxP)i6Lp45Mi`B8I!kei)_bG-^a=D>fLG7`)yCy1QjHfz( zOcyF)U-C-9$hM50W}Q~PV`ctEG-LPh=pg+A+S^03lO#tNosQN>-z99wuUur$ygW_x z%7-LCkx(ZfKQ^`ltl;D(#cG?MMfBpj6GoDPvpP?c;gqRCRVG8P)ac(AW@^BC!=5>t zy05md_Ec81WvYrXI-1q@)viT;+!%QRYy}ACaAnz?os1{j)+MnF-E`nvg{eKurkfzjZbEQ2ZVI|^)g*6J>_^D1uzyrauO2w z4VyI$7)hf``9o9UII$GfeBH__>JM$l{dT=TL8MZ9NUFOR*e_cpZ5B%C$!~S^ii~ca z_2}U*7_6A}*fZm^ZESozNpCSJ<<3cmPn*nPIg#sjcD?cJScmh)5=CDRSH-aD*t^lG zDWQ_n4+Ha>DPcGEp&c*epO0ekQ#PM)9#l0|+E%I$VQc6IB;LH?pyl(#`jdL+BLP0b z!Z%gUc6X2L8et_^ym^tch;sSm{idjZ{!_&x?Z=TH%bDrTwKXHCqt?umo61hT?5S zl1RXQ0nmFjo{JSNW={Q$#FbNfno1)YmR75cW2Uh2{Xm&T22YOB+x#QFVczN*a>{_g z%{-_$llLC5IXIv^k8LzszOBm#WO}$R=EEgjUD4D^^p@>Um7+M4c&j*hq~x9Ju?{O; z($Zg7R)wpEOVcXZo1X?9_Ct+8%ZaiOwks^S{1!OUl?J~e9uY^to2#@Zm{3*<8H$d-ej$uK&&K=>4CpS*_j_q1r&8p>HK-iRQz9osi*ltGZA_75*8Zqv z9z^y~nFiV9e6OAks>!jaeP-jW$=5l0g>7Z(VmDPfadXPVv%qpgLX_T69pd|htt8;D+y zXmn|=13A0pR?ojU)1AY~Lx&1ywphVRwnF2;3w9Hto|AZJ_FIRu;sT?IOp!W|H;_?4x&i{{PN$;cJw}Be%pvLY`bB z)hI|J6}LOXOY%1zKwJOMdh84{^Ys2S;AL*YWoy*5X5Twe^ht?((1?}=2~%bLS2t zS~XCvfD0On|AGacwa;0@!Tnr^8t*h5Y>3#FK)>pKD!C}gmiV`RY#J2?A**rAhzeOD~ zc2%G6(jzZJbB_5Onm3c!Yh{4FtL?13i3tl8>he5~gppX?h28bw(e=ba%P`Z$dAr+W zkt1(kklT*N59}!27yc?<44MP`Pj4q&?P=BM^ngYksGmXNpXcVRJBJIA zlYzbcc#UXT)l->ei3x-k+5l~FCLuI~lP{6O-Wjkg(WzMAUqw})Rh$N|W~TP+6(0if z)h!6px&7*X@c)}ySQ!h`B259c*f_WTry~t<_Y*ohkh_BoyOrAgzf3@-2ZlD;-zGqQ z?)aPHjJIw~IRd8-y6@zCzN=?$Bj;jMtp;#ovf2ya5-?>Wu zG=RX|NhD@5u&S(vv{&U_6&^DJU0Qlwgnwn@_a#-kOg~osveM~7=!$C7QR&{v z?R1yft(LTP_fiS^D@I2Y(LV3IO&MM(tt22US?!q|O^IBpm!k)RDLKyTqQ@-Bu<46m z+!I+mFUY|n+3x*^c6`S_pEMZyjCqsWB!WpF)hHaOgIaoUS~IiCxOY7atv@keGYcMg z8-KCobN<{L{%5BtUQX#bc370|Q&y33NOD_GXzsaGRLW#=Y% z9+>}F{k-OSv*1Dx3e_{fy=LriULxdo>>r#vL7C?>wqK|d!VZsy3|js&l62cFjqZ?W zxO*1m3U2$9LcT+lOWgh&1Ff#70uRCi-Va+K0>WRl{Oh<$B>^(73R>Cx`3np_Zbawt zeRxZ}RT`&U#HO5H$d2=3;Lr}akbKtC;1`WW-IY&aZ{Io-P=`$U=|BE=ssDGe$op&1 z8+~H2dl|zsWr~DQarZ>yn*8zo7-Ypui_b>=I9BJC*ZN`S39FiSAE9gh6;-q!=qU=* z{K#gA0w3VH`WP|L#KqB@+gb)6YbQ{h`+$!Nzm{n>d;&mmR=pvMf| ztdpF2!z#GT$UC2t=TJ>|l2@*C{j_J&MD<&xCuef((+Y~`G&beyD?@l)Ncq{NgPket z$R647ju+m}!@y6>+yi$tu>4+kgf6Oz}#ghs157#%-xI=XX$hpj$NyBAmALMV;mwCHDQlLO> zZfy(J;Z)EBNeZyB3!f#=qzpUsE;m$ePBjympDqPR#)pHm2}mIwNvb#dTb)+5YI%k zN}9Zyla~$_#*;aDM!&~BaiTrM@%J@yYvmbCMF4F&jwJz)yj?-e!CA+13t8q%wIvOy zjUB~V7B93crT5%#6Msg7I?MoJ^fpj>sPiX6Fjd|+7-TkwleDdTPR0{SuL59dvC((w zYmxr|^rw-e0$QPg^57k@87ofJh|Nt9Gme&N2H>v+Qo}yT`WLMCu_Zj~g5-KtRD$Q+ ze@x;j54=iN{b9jn%{-}@_A{uo6pvgzgdHZ8mZ=hiMu946M}P)h`!z8wjPn){pUHbz0aXcNBz6~d(YS_3eZbblPY^1n#=I~E&?0g6%i?T(T7 zhc$$uc}4_{%%HEXh*)b)YbN8)dPK+!(;&h5B3xLJx>{nITVE*VOdJX|if&=e_(SB>D~wAw);Y9*^h zs3n~u5%t?ZY5`b^?;iI!Ymmze&zvTskWmBE!>K>N%4nx`Zjxi^pq{@)6Bj<(bpcfc z9pO27Ep}dc*J|SWnUG8i%nEMf#Zv|ABO5+HBTauR6MOZ<#BZu(b@o6GE7#ZKTFj6} zga5;7>@g$T7Wv(-!`g8ZU1(U9>fmWn&(Xr3FbC4COV~QfS$|^Du_DQnf8xXY_bT`% zGhR<7JGWqzT7^1}X+^!N`E8kCZ^7C5{)EbBT5tCf7!+QXN62IunZj4|xY9J_s1rXl z7PcJ?S}&8}tV-k|1b7=udULmqu~lN9CAq?Qm&d1vX_w4N^8fD@SPQ zPItMT3*oC>kgBA`X1fQ+g?|oJs+*Vo{vx1f4KbZ_! z=aTR1p+w{^TjcgV7uM3k_es?S5A3hZtv>B#g^ZLBRAssqQ4lPb!WV${rUpGVAL#Nj z?Hbmt8D1V1U(=xV9Pf3jw`%3Qh04I( zRYx4}3bpxr`T{XxeP>jP3Dyz)X=EqkL&l!O!>WD8)q%JK)Hp}HUstlOFp?t!+cQ+4 zo9u$@MhTO%?sb#peM7n{$3tnu(`n7pI}JzgbN7qEu#L46)Uw_a9OeyVUA;3C>6Efx z&5xn9d^rTagtx@nS9kDf(RFOd8vI?eE~`mPJ;D2{ATD-wGg7Pbt;%&dARw6*1pU{~ zFBk&75A|NKz?H0?kyP*R%Wm?q49slj?T{nS^xBZeP7zjKPBK7OQ8|BY%dI6d>sqsk zy23N7jggUw`#`UMDkO|O>K{)j+bD*rQ$?$Zu&biCW+s=9Fb$VUdYzhu3 z=3!q5>$nOSsGNd^l1_?nNQscZ*1Xd+yl=T6q667CTfQ-cqv>j9<3`OIZ35rlY7g_! zt1n{N1$xfMlLUmh3J{|k#pBk9@`dGE?dhn1*SZZl-8MLy@pra(uEgBy)8Ve#6I)p- zc)Bw4a%gPz2Pp&7=vR?}(WTIj8x~>>fd~TH4~vw(Nj>Bp=Z;}%)Ouh! zH*iXV1C$Hghg3gn3D1fl_g}=jn^FSteR?Wj2Zjd+4T}D3!#K|i>KlQ!*zY@%LZ_NH zn`b%|xzGWpP}s>k+>qs2C`Qmq!r_BgUl-BXL@HYLBU0$lqKJ}{b0_0UX*iB>L7uTF za=q%BGo3)b7tlU3__Z^THQ%4b9Nm!f_ULiBeLUjTLv&~b=>R0)5cRWYZ>@78gZ|C8 zK03F0Y766y8;dYPIoWQTn9WJ#^NkaxHH7u&IUHFXKNjjWguTVpB+LZ7A7}I)`=aYE zDQWM({?mNj7(+9zBLAfgh2iqRK~=8Obg-oucO@n^248p@*S%-B*hjd9>%02;Tv{~U zw!%8aF;EO-U4ckWqh6(-QJhIrS~onf#Skv?PLLI;bT!W+oe;G#U>BTmuP*JKTCwM* z<57_XyMq^go#Qu`o8Av_ ze@WVJ|6}Z{&e%m^d!?xRnD@1vjJKlcipv(MgZuf6)a zcBi00J^=Db1kYS;JQCor#zP%6S4eWn1C zT#E|}*%j!%3g2PBm7y}GQJGrDOAZ8Kp&=(d4phTP%Jk6)b{#H5)0(_D9uC~G7`>2H zBgWZJ62l51zUn+OxZC=VN(b}p8YuVW))_fc$>6$IU}9-Smd58L(Is_$Y$*)IJauzo zh3_+5q}Fr@*GP8`rInpW8az=a1$^`3B2*oVBX^&SXFS&9^=ib=fc_&A{>i4{nKcN^ zL$z{ag~SLK4#BLw7Z5}v!%hhiwX8sahFcMEtbBWyqh2+k!9VHPm12ECzd4IE!ULET zA{oCv?-SIh!PwTrZPk^Q)@VjI-$%NdRN+m7+S;Iz2srqhI>O<27tOkZswOq%u+>Lh zWsid*<x5I>yL2+vTGv(w8&nVYZsU}C}z*%2VPaHE4Ns;B-+v8_?HBUR1Ypxa~eb-1{t%%-}U8k)}ImtE-rWI!kkBh3k zN=tZ{`(%pwP?qG76y3hkma+I7`Ol)DO$5a@7q1oP(r4E;mpTNHtS0m1<6H;ZOr^7E zm1bznI}>ho%-&9c=V5FLk7Ubn`OR)_Tgr=P9;KeSx8Z9V;{36Ue$^>I2R&PC zV2;|$M_o0Rat2*hpdYlc((id#Q5=R4oE|x-gPj!T_&9SE0dnzW+ye{82IZs>M6`N$ zTd_^1)a^|2_O~Cd8bcTDzOXjfU+ykCBJSMi$M|LW3_j%sb+Gg$LcZ`-+jIHvIH~<5 zctUau8Kr`y)Wltf$2G90-SH8o19snrAJQeUYK+}11Qqzb=EV%~ypRKRR5EI+tu~6P zt(R7|oMbyB0JNa6JE=~i>0TH?(-&q?S6@GZf93}HGkBR!KUV|g-V}vRpPxv=O6B`3 z7#H7!(VbzU-&9fMO<;p;HHii=@Ds!)U-h@1>Zj}GwhjyK<+!R>=X4Uz?yZ!m^&uY^ zSzdRHTsoK;yJs)yHP=3_5xSwpBkBF`E>MA(`V?N|nhxr7@_k>zQ!av1Wm3`J z`a@ZcdfngaE3CNrUF^I+ff~3}{u-UrCt>#t%kwPfa%;KWtFX`GrJ97qzA!yOWuvTy zk4rW=0|d4Ah-TrvK|3RfgCW|Xl#(f~WXM42PSm&R&2#o|V)E@FCL}QpM!y+taY$_0 zuKf{VTIh0t5TEBkR7$ut6u`tP&2!Zz&+o&2e`NDcExYrFch&)WYcRNNa4u70ODQj=-WQyJfP+&IW6pj%1 z^Q{XAUV9}bbC7nRhX3u7{EOY+@`1e9%;s&)pNS_PX&*x8u>0ZBB~8^}@3ee(D5l$EZbRJBlCh4>43P)>i$F_X*hA?4^B9@pr}^^w728zwi+7^t7mbrT;BXZ1;d zf@15jGU2jdgEKmQiJNmYT7ZQ|_r8J{dk^+8o9(^sXB?;LBDWqO z0JHO6b6RpBr0PvVvQQB2budmuX$|0c$X{!{3U#tfaaW&sB?Z)NCFn$VEZ~MuSNG1l zREG`T1}F|AV@Y%_j{8JLFQV*2_Q9`<-xeY<&Lc+NEaii`41HQR)4qB7T*zj30wrLm z<;03bgr$5r)Fy58iOMEJ@sfmeUz0SgNCaLmW%$SqY_YYFOP*UMn++n1-GSRyf@c6w55{lL^DceS zX3J)uxg0%ek;%N?xU?u2Tlc`ai{;gz=hDh$8PED{Pu=f~BJ}k$O!W0g@?%4N25K8j zQ+{Joow`gCe1Kpve8Evq7I*tGdX%*Y7;qU4;%~SUlNTa=IJ#ou`+?gaRY<6i&Qf2i zcoXA$^c16fpEsIWQ|&`JzAHcP2_EZX5fr%5C2873(Fzj)u;F;$@D6h+yL{5j3vOchJ~pe5|A{xRRW>u-=ir#|pcepb@lv-G4~l#xLjzwF zWW@RRBMh4H+)pe5a8*28k0>J~coq)m*;6G*L70%hi-298FZWuw{(tNLuf7TgrGGJ* zUrjDwW-uIoez&m|KC^~$hcGXNpHc+mgkFx&vcW6&@J=uFilrKTD2z&bCs4@d6|Z*E z^NoR4$7yD6j{E5@+M*XTnwZ$&2KiLRPgT&<&QCE8Mt5NF@-KaeMw-HXq%TXBUZm84 zJiLV6F>dz>AaZ(!-RWaI8aTJVPZzNz6v^AlW%qNNGrlN=q*a$z8e+*(ru+d?Kcct9 zO+J*+U{ZOX+W2KB)1ISrZ19TPo|UKgh|EJ!YqTe?fEK<8qo4U(BNZPIRasVA*1spr z$4|1q6OYplrAGj?i1mA8qhXSA_#%;_bwG@0JxBIbZ35LX4(q3xOH(Qb?S{)-Ux=F? zP#sYxOH<#XmkQPBDtH~ea+&)6nwPhdu`!B`mXc2YnQG*EdWw0h_|)Q;p5ZZ28{=yC zy@pbrzM8>%jo&+5O@Js9fN0aWF(TpkB&WN3Ws5ZZzya;hCXtZFr*LkZ=N=O46PX+3 z3G*X&Oue>ezuYi^MB(YOo*8kt7|kc(!%A+d$*74I;hm+FNPf$U6Hy*sC;VqrvrMy4 z)Q*5;=NR(c!`HR~G{FvkI>= z#UT|{;+FWjM@3ZMirNce`}?8$_Hi9fmr0}}5eV@mhI029>BiCLBYiwd#4nweVsEpS z)XEu6)9(DMk_In!#oowLBiQL_y!6NN&qssDPM?Wt{kC_IdC)uwPAsh+7aoluOIO(q z`_aUUr966!8cxI;7qVasbPl*Q=_;UFWYiM7-lN5mh}D)bwEF#TZY#_~7Zz7M8X_$o zSi8w29Pw!}pkHo0$gt$|4NBMb1p#LBy{ppk&mRf2mjbjpcoX}1)FYK#w#2l0*!v*S zooe))n(BhyAqi5Jl0T=Celke5teF~u$PsK(Mr|llf@Sebk*jVfsOXF76T46BerD~h z7MIUBSv+Vy{be~XGgIHpcllP2xKcKK{g!WCoJ-&weW)Z%LR>FB2BqUB9Nm+g0N*(9 zq|9gtKsqtqq0F=NY~-&tdPJI{eB(zB3$w0|E{k5WJ}_Mx$z$I^KX*2 zE8Y`}EiqddBPhq6Ou^?l`39OODxTQF_}&Wuc;MkW zFY0oB7wx`n(igZF_I06(OngP56j>273AxP_c@|ns7lN`}7CjtXtWXR#Kdoh`)4~(! z<5_=eYxk=kM(qG|@^jv$e>hf3xxB`HmXke~&Z{8PvGHgEu)8wj_Y%dl*X;~C63*?q z$5DzyESS|K)=!@yC0thUwO@g*-qCS+c+4n!Z$VH~{xjuj`6dIoy_Xy4BzT-1Jb4P; zr^QEEFBP-IGcO#SnDusv%;jS*H%*7nA_5GJ7z)d#&q9{i{amdlDhi4OnE*6pjx^*R zxQwT9;?{y^lUt*29JVn)Kaj6Lm0cfa&H}4<{zpTA`Jn+3&@$#H(DwhV_UK8sy)~}t zAES(<&yJ}fUG+9PDCs`f-z4s>bRoyna)=Bt)m#gSegk+$+a5;+5J9bXAdCB5@w?2I z#I)sb#qQ0={D{bd=>Sys93lDb$k?0wKnFhs7x*cWRiv*glUd+#>LvSVF27aa)CAQ` z5(km!{d6imxFeb0f&GPJ5@AhP$CMyfBpP@Fuo36Z)L`_aO${dU-)I)=QQvY|I%`cj zc4XDsd->*V{UJvuhZtN~Haq^)fcD5$|L@DDt97Vga|kASbv*ufEZn{vRr0dld5yb} zSXN(^LbqB92@eRwfXhGN$FQIy-QVxT8}IG2gsUkS8BxE#$Uw(dGxyy-&v zOwXY=jh)RBycaZEYBC20WKGRAvvDG$d@xU$F|5Ss()qR1_Vg0P`WfUI3H!J%X;+{U zw~zX6A|;DS^P8oVkK_AR&=YII_HL?~Jy{83DiySGFFDFE3xp`43OHqRKi7?#e>S!rA5(=6csh!EnOsOf2#4j)a6)oC> zz-1}gq*m%ABosBKbg8H^M)`iTy>!O6cT-eJFW32K0R0?&eC z<9aqi;D{yLdAca-`#a;1+CgeT`^PY^Up}rBk)5e0POeM!Smhayd0aM@ov-o_aBO_R zw`I{xuXAr!q1l1;4Oo*y=R9Q)nyZL@T-pT} zZpWoX=GHH5*SpBpE+X5Y!BB^3v__K$$yTv2&w2yaVycHLa~!Wh4+iQa1wAfZm0l1b z#DS28Y*tz&JzdrnVfxm^iT*Eo0Yzopqa_!RS$jeIi3#Mq&BjWJbK}FV&Bc|IMt# z15g@$$C%N<*l<5qv8CWS5#eDz|-+Mnw z|Dlx7J2BE%UwtBs(WEC&d-{~`lK8peI_A-&*YY>~aRXnm#;68^ROPUe2f8vmGZN^3 zMC=+!dg#mv8Is>CJ>nv_qc1=^ww6_6&5P@O5B9B&nx*l0dtM$xGy4lwf@XiSI6 z3)$q;mn-Midu&6!=;g=6Zs7xPcJvaPcu_@Dw`1O(Zv!?Z-AvZEiz|)+oX%}2$W{-< zeKh@xt-b(k_2@0o)bmkgKIwS;I6yrvA876CHFZ!KtO`EpDe~~kQQ8CGOrbye)C1JC z&Nau6Rc%J&V=^&eRQWy&b^7+kn$#mh(K)q5N|Z*vI6@>%-0pkx!W%zft1Q~#r$d3o zAi5(RtlvF6G|b@Qoy+V?O`SehVx+9bqvODy|7dz`(Pt9`8er1?@5)`+#sG``aZ2{+_f91~x%p;K4y>X&FY zbFqbceP6eEU2M$Jd~m9toVhpyX6%B=FZA;~;i#M_%>{vkWs{(O9H>Lh9)B*0u-64r zMBHz=tcrKh0KLSUwg#Q(P{Xv~#b>l9kqY}Z3M#+W$g^5OKj2DYq%B?65ypUod1bFhS*hJ&k4^pK zUbhd=_Di z`B>8LQ8kS3$4C8;9!FhG=Ih=kyuXtw~v}=*?x`b@t78VB5roY!YrX)hK;QwP;5QqX~Qr20tOmXWU zn@l6QWiWA8_X>4?Qu6MoJIRw8c#b;9KK1H;&8Jr*%M!FyB#cHJK40Gtm!ws{gO-hk z*AKVdz}>NUAm|&#oDToyNWxvgbF}+zGuBoK4)z~$E-ZZdwoOaCDrV)T-Dk}pAI5Gf z;fUO*=|~a11~sGhBPT1$*b1tGCF-LPqk-3{O&q@pEh=$zB14Kr?cm|C-k6!J2ZSK( z`r5sXjabn9#4SPy{)B+qTfd1LJsy|}pZzYPiFF+jrrJecSPhe*p zFO}s<+l`){v3Zjwp?!y=jAeuD1+e__^G*h7%!QU&g%ovp;h4d3G5S0ZOu(2I=9vr+ zU&>PmQVob#@!rV2kkezTO9=Gwp{m`q9yZ!4IF%j!eRa$Rl30~Dpg`ljyiq!+BI&nS z*uQ?P)B;*yoq66zduqjNG|yVM9yNfCS9^Ij{+!x#u7dZ#QRhAk037Y}8yZBF;gh;S z7Df{t5+WWIDDNn`^Sw)G^+&~_=eh4mpbZOcTnJU)QSQ+dH-1dFs@=L-WVG@{GLy<) z71My_wblIEQMRz;%!xoAfVu^{LS+KRYnQ7||5-=57K3M&Va7|ZDxtn?!XY}MyjcUxGJ)!kG@eAf#} zgKO@F3b%{L1={B@k3<{RF_%s+5<;g;;&m_Yb#cfoa|E-nLGDu1D6lbqEx0Zbbm2!*N<$3G6tRtAa-q&fXOjnU7crVW31 z*#DDm2-^0gPm7JwlOD)!QXvy%F#!Cv4)^Il(o^>6MPi<2XQz747=}NIsnC;w1(l*A z6dwVgPLF+;aNpV5?->X`=@*>(S0jP{d4gos zfsLRSYfAO{Y@DSemS$d9OAKSR&)Vg@QOJv3y%eEL3%!`--yq*VGd9ClC%?|c~7)CzNUh2mP zVQ3GuJ(d#g!6v_q$r?U$Y5$JnHxG4bse?((g#2%50jcpIK*8r-`vo~ zZejC$Ns(qT>qe_Om(vcS6PNPB^rBOq|EDbd@TfMJXXWZUcjG@wqQj$N;F(W|SAc)# zGArJ`h`$}LBxE}N%;xEv$Ib7{3Oba?+ja!l$jJ4cGU`}&aD_=3QlX}|Kl!~r8L(qSZ$nUF6^#=#BpD+ra-bs5ce=yZ)@tLDL zfBD;qKMqCLP92}yw~K&Z{{cCr{h*EU|3AlnKc@uYPpvx-rSHt11P(*kcjJ}T{+-0$ zeeSeSz>jnEa;y^EIl2;**rib0r||pIc1XIwM)2m5GbOvo%Ay4|#&|n3R=;~GEP?(#d4a=p$5{r0JO&k=`ya;sWgElQz*e^+8LmT${y(%YX9dd^ zn|Yc4XQHOgK%DdA1U&G+uK~4l4GgFE9@n??m%CTPa@-6o=PnO%M~yuo>ML+&o^v;E z{pCe1dT4M9T*l64v^XK}-uhLQ+D@+6J?|cV(9vc|_~ZAT&K656croIN)C=mJd;1&T z0u9*ee&WhbRt2;MAl#EuTugu2MOg_TCZZLhVLQLLClFG~qm(kANp~<2VlP z!kchGnV+7gRzrV&vo8@avv1;^B8Hu-;pPJS7%`0evy|IQ@eBUQbZGZ#4nPW;&GOKn ziF#b=0r(_a$3Cl_#11rq%!GX5cF*0MxO3)OR)DIG&hk}fcaE+EbuhT9ekf=+v3GBX z3?Prc(9g=m|NcP*0!3G|O8_fn^UsmdT!Yot@9fjsc#_AIZfv?%JiD1U#-3 z3ufif$&kKNh6Z{-;&$-fC8M1S*hvN;B=iB7k7-CV>}p_34>efaYpt=%82W9xnIIR) zGZxPL-vvVd`kyP`^+@1VXjXk5f~R)QD(4a)nW$Kr3C)i4{o5DIAt|SC7qhUVA@iO< zHqa13wUJlw;LhQ8FY@?BP=j5-@{iO`vhLXjwTR?N2;Ki@vdaDov}!t9#m~>*kKek1 z|2!~Y+uz&&(r?MXv@)PzK+Idu$|{JFXOZ~D_QDwWwuVa$jVs4{t4($$02okn9b`i92GbZ=30{+)UI~j)TT%! zCHx@0-(6*S>tbv`dq`nrjm}sD;sR;d2cRzs%<4DiYdc_D9s&BEWtF}a{qs~+UYBkU z2aV|DWsfkwffFZwrkYr8eqL&!FR$|pADQdwR2Bt|dHg!*AS(WEMYLN6u*m{Pb&ajI zS0>7>%KxH(jiW!}p74MppGA=Mxmf*v0LrkNjkMbD=<7a&D%3XzEZiSIT@4J31aPeK za?t<>oT?Aly}wP(o$0ro-tlAK8^GBMlwtwk6T<-rkzymG1l74lxHHJm;EEUK$s3`# zq1>meo>up|QJp@ln`Wk)IgJC^u{=)p-R%9^!$84#d^zQ%ysw-n!A}_!)PDZf79!)k zp<&$I32-Bm37~z5reN%!QJu1dfWvB%l~;n7wPz}gch1VAQ?a?gbQ+|cM)?yl+P=G z?;<*c4R%S;9qR@RGY^EDsb<=`f=_ZfLr`J4fR837yZNi)!9d&i+6spKpgwHo!2xqO$ z+nMthq^d|$phb0y z9V@!NS}szv;mKt7b#CI*Q=^g5cJP#YQI`O}F6jL{KWnd7H#yX;z`M_Ez zYpoFB`3kqFYrfKosdDVm7cyVks0Iy?^+0Ph+U=YrT~c`(88kq{N6nOoL5gM+1KQ>^S>Sez5!7wB)EsUIH1a(%&%DlAvI^``9q z7K@g%nq0H%T{M_+#dx~4k;i=Nr(xWEQ{>x<0k}6KQCrCo=%!eHI&I-Kex<(|SeX^mUY1&U=ahfppQOg|fW*S%W8oH9=|LV2YB;SVE?qI9F=lALM z$`I$fY_ndG-RP;IRLSml!GnZ`X|L!#{hK4=?!`%*v|Rv?rHHd3elu?v?W&9U+#DO- zIl3UIIogs)c5@}zBO*#gKEiKDA`_JMVdaw|zxh{vXii zMN)Sl4d59gZ*_keEO-9cE_}HCdCZKhCvN7U=pGx4X_8aZhvEgt1wv|y%Q;d-$;&P0 zk7$7_7sx6%XNnC{;K9l{^RbF6m_3n08=`Y?FJHDZA}1k&8jtq(1wHN+B)VjK{5(Lhn6K?-qwjb zN!sLe?Es4u7+<)uQls6*=8B~*b02$ULt2UsE5%%$frR0+ceo-E0_jX zRwwoGtO)Zs)O(@_m>IkwsOGpoTNF78K=ceox^8Kify#`Bf*F=K(~dtSivi@k_N1i9 z>V|^*18aAt_WY3zqgRi5ri@%WLk=AbnHpw4%lfWLaIa{~{MHiJn%*IgjE#_9=2;gD z9{lB&@6sx77sj&b8!8c%0v(~oK_dA58LtLLjnYt2TT`ZM@DI-^vCBWVs1Mi*J4v`z&Uux~0ZXo$J{?I(49~ zgRHZ0^vI)D^7CPh2X8bYzYb24QPoFG{imy<%a@$H`!V8+lN}-dh+Z0Y8yh=|x<|}g zk1q{TY>Y&k2XLLz_2Sn$I!)HWt2fwgAI zrn^6P%Xb~)Tk!CK~ink!-kd`+%1>{ zUCT&EqY4gHNm#F56I+IrnBBT~Jdcc~A#C+q-P~e%VoM?`osT(k6c@1`Q8FU$S6ZxV zXVj~zQJsiHDGM0dk7swmG^Y7*<>XICBU+KwIJKgx8v>Nv^wG}h+>y#pK8_S?JW$g(H(j05$rA5V=NJn!#x_Tj#|g~-ckPCa)CIvY8o4{Q!qv_$wdCu+h)wK*xd%vpBE|CtI62K= zTT)r#dFwXjlf09Wu$om;2rrx$>xaK2Noc=0?eE5KX?QF97&ACfff>LJQl0M*uPGL&AO0KIp!Uxo7C;Mz;oFg*$C_p3DdRogeoXcAss zQt5bY0dmoqieKrl9QQS98V}q)0op4sW#4^?U8{Y2U$>fZkw8R__^_(lsIaqoN3wL6 znVok7m|TW~?i;b2oAQcxC|cQuIOGI`?L`6R%hXF(UREP=Pv>K^F0B}TktPwDxjf|= z+UM@n?pWnDX79*6HJwNW%rmPlFO0!H7xy}$Lm*$4qOq{qX`9Gnmr^zNY4Pl3)z;Rv zRufR!cDZIsx=W2FKkZ$z$pMk7>xMMTz1sed3b84?Q}_ekinie$KANyYlNS(Gj#o=Z zGbsduxWlNAwVgd`9dwhH|3rFFQ>63f)>TpsgY)$}V`%VvmA+3D`w6md^_3Jq%Jcp= zO*+Z7Psk7JHH>+PaOVXc`@|(9wucv04cbaeyCTZJ)MqM~(8h`4WMeM5^rqN&M@k6q zcdXFT;ecl*HyAFDl9!pzW7%yZVcVp8pXjtYx^m5m^qS|HgYMN&*9_F6AA8<+mov~5 zNnG;3L(FZq!DTqhwcT984TAuMBg0oz_dP+z~I`~*GF(Gcb@CltSeD~{;{)=Tyo z%AQbalFtK2+Jh&(0UEHLYKkBLMMH9+&ZFgG=_Y@6Uid|NYill1VYX=#(ue6x-xYt1PN8b( z`t&Cg{?X5iz&Zn|2Q?%5f{ON#IQxJPV{=0+fYUx7|XB7(=J6?YZ?Um9I>H_IADsxEy_p+i zh`*%FvOw%q#mh)HzCuZ;uO!H9ez(x7rN-X3^wn19lNtkg6hyD z$g=r@ivE6&j+J3<4?P|wue|(@AM2K%gs(Qp2KsRt54}4nQp&fv{(W4{t4hr~UiN6XLeKmurCSQoC$j&u6DfLYn!YmF0u{VSeNM!I5*n=F=IGOw~)$l`LuX`-1-5T zpp6NrixA5k@RK573NMcB_Mdh{q4!dhLcWw61<;h1ZpVzn)naJ<*6{h+?Se9^?RzWk zD}dTy+v!|<7t#6fN4Nz{V0=NvAW@23m`txjsNL`J=kkikGMW7)Q1?YJf1%x7T~p~!*E{f1#4vt47( ztdV|H;<_M+;wO%V=RR3WX{db%iaX-Wyo5mMWL*YLm?pgDyXo`OY%5enQ<6QJ)-=}q z$deoo9S#b*^uKOH$c#MDt!TT`Jee_DPHWW;cQw zkDI{(Xt$n$IMS04fp7&DN@x1Lt!clvWBz{kbdE}Pt={(@1uo%ESTl_ zijC6R3A{EYre`(s| zxDzM@KNTO{TsWfwhIu8>@jJP;9qX4M zpCEr%3r-C+u}~Tj3R5PlVVWmN7*y3zjAn(NrSLXv7*;tWRA!Mc-uA}1|I^mDDSiIC zPG^206w09B;>e3je`zo~5AIdLti4Z^iBi4Elj9zVT>_2V3S;j%eXFg@$yZcfyO15v z%57JJoy=xuY99LWPjilbc*jvArRl_R=IwcX{DOoe>;`RzyHSmp@AB;~pIqm5o$&_I zOfuo)65ZEsR7%M-y2(v)ttRumoiOlh8yK8;S+up%Y`oc0;AQhz z?Lmx^M@rMti1kNtqb+fy9P_vj1sm3(n6d1Y(W4P#316<)nt#i_W7F z)T^Fcl%F3utiuIkNp6MN4jj_DZF15?AXW!=0pXYe}k-t>Bk3fUY# z99i<-aK1v$2NB8-Ny(-;D=So{bC=SEsgCb&QScRG<5LeTMGX z4Hp6&%#|qk_%Au9I$+1uB>MpIBB&SEI4(?p&1Ft_(YV)yg{&^v&@^qob>)9&0HAxP zU0Y4HUTSWwwJ(jn)TUH=AdR=pe=+Hg-5k}I$n9f^mvEc(9k;#Ek?41C1`g*EZ(yJ9 zm_!a%d} znwQok@n`o?mZcQ(QiK3;E(ci`k0UxCpGLMm9j-LY%w_~*+~N|KF6XsRoQ37!ch5Chl6-?a9`j1)RofD zlg$J58(-J`TpNtQjisVud07AIc;oY$+y{XH#O@ukJVoNHE)5+Qa25{I14_Tc&(hsl zOI?%Z5tGJee;y|($GH(-*OZ)g+u;XVw(P9J*7D&6_vD0D{9~RLg6o==;PEvM&+pP^ zoyPzOm@oN`L@_D8)k5@=Sa{{w=cQ1*7HJ$S13jY|32QQk6giW}dQY)M zQr$k}A74eV+hot!?sD`|FCDhC0{%0%8m9@RxjzCyWD&SNvWHTBJc zOKJwLk?6o0%s!K!f@Klh%LT%kou2fbl(^BrpLtA2==Q4+4c^#Y8Q)#ZBU=cBeNFO> zUxc!K&FXA(5oadMQ>P2SJ=n1|AGgiQ%fbR0_E$Z zS=s#F9!56Qqgtes&^Z^ZLIn#58GiDjSs|EI(kw~$!LR-7UHS%KU7M43Ct7xgG;%>^ z&P!T-=GgQdz}}f$(=Qq}%Tf~(8~H}Qx1coVe|$ObEd$JATYco*!klg?($b`};5a>d zPDMpkHf*lV4X^JQ?(Bq6t*9CqpX64P+yEH_0fQW1F$@pG?OS_JSdf}u89b-D*hb#I>#iDL zzM0ddIdpA1f7ke_ z8%vDrDcuj3sUgtyinrj%$ba1hQ8YJ%ohe;e z6{TkG9^%xy0!QxSZz8#`qOteB@v3reMuUyhvx?aBoI>=7C`vwoZ+1;SZ2j{r+o0YM zyC(bU`S!0#;O3)Hre7MjYH%5#wQh$OjFRBMQho$$Nls*YPX%`{HH57N(%fy8HqB|Z zGlP*eoSgdGRg7S0JKu%|GXznW);NyI0JO4q^h6l&`J2M4Kf*Rl)9)ou!KYoff2_y2 z3s}tgqkUW-4_VhNodt$b{N&3!s<+lS*T;DUWtQvK2YCpjC%X5eRKjf`GwFdf!v&?* zASb4!>UgK#h1sx9D{eue#?M&QmA`|NRyNY{iXBd7-_24@&~bcyVhgf8KXa8uS#v~w z(({Aeeaw}1z_7l<)TJF2sLlP7=YB4d^l5>cYzEpRf>cGpUr?)=#IGY+xMIGCdIsp-0jU0E^6k%qdIt^X&4!G z$<V<(y;W7+O6P9J4tUep8Ou4VnAXtICN)$oEi^c@&`;_ZuzOt^HVI&=kF9{Q4u&=cV5|zR|iOz{fm>)iao%-Fj6i=8Z_Bw)TOq zbM4pA(bDze`I1sUnu-)#vM~fs?|#L(w?qleVY{}oVekpWht5x4Vc@Jl#MMpWqpN38j4PJf)Aaji`4dC_aFt09k%vdF%bGY{ikds?mf+ z0SjIdZ5V#*3-EV8Ud;=rN_@D7UFp+Ezgdfc46ZkE$>H2xvAU7u>W+R=6&8H4jm9D`aNxSOF=BUAOlK`-44 z9?IEeD@N&t2_-&6!w`lmx|C7qPJuAoO1=4jm=}s%O%{wzztWeY0Dr1#e3Lu9Wy9?P zOX8+kFIKan?XjQaC|N%MT^$tJb-Cv(Tcp$RlrxhGKJB_22)Bv_SzJ0<*k|Pe0;CQB zR)aPsrn{`BwN^E*AYXW!fPB;L{boJsWQAom0MS7`s3M^9ojKw6-*?db_sw7d^|gx| z*Fk_X_FThrBO_HiZam+R0u=#Plv8Nxma5XlugXYV^PHExZdKtM`|u3t^i*`nb{%`? zK&$iQ%h#Vko4SZhP8*3gluXxei&Hv&?72hxT4*H4%VKX%$MNQg=U+R~xqCRH zXPi5KkY^d#BCQx2iWUg(l4@P2{2DY#0s+Pu!!u9K+T7t}76Bz5tC&m)7uD1m&o-zi zgykAAxwJ(LkN&k;DWq1(K&@tu(lyLa?>F{%^U;}hpYIwzF&l7n*t(IwZc6f5ZD5YU z-9FF*jiB6~G)3Ut-k7ea;yQEOZ*wbAv@fa>Rg$JCaL3Ca_@i@wAkuU*CeLHMQd(s? zNxCj7Ao5nPQq?1vLBH5E(i4YOpCAuy>JkwHF4Dy#3 zl{nIjFxa}NlA7XF+%icckLM))7n=Dv(oX>cRoT2{6QuZyfVl{T>xMu6NUME~+-3$b zTnTyZl8@Ssha}6ia$3XYyRHID6vE||>itks@?kagAV zcm%jw)~?BM#;aja+d`T9u(BY!_#ZYZ1~$3|_fhnWG%u;?M@J6U!>0l#ARw7NyxJ4w zUpRy=F%R$`nO@H*{G`)bZ723@*>dWbX_03!pStvN=t8bZH@z-@Klj;Ab3j zF7o(G3_nPb2W)S|jqtW?ZCSIDhKX1AX=^*!yI7%(c^hon}L-hM#dh&>FTUa(ufVX zlq-5E{-5ZH89g_&BD+6&54w9%p(Y0w1hU+6n>o{Xvy~r-8~Tgp#P_4XJ&66C@g=DW zmJKPLw^RAPPKl@HXk^|C-E96`xhZde93CAvzz%xd%jaqH4&%MXGw7V(bx|*WYh~~d znyY!W9)6vr1J#5TaK`p)GI!X-)_D?AKGAoueXpwV&Ye~Pvpfc z(0qphUEP2(8Z)(xjYDj>U#ct|PRUJuox>}`8{ImJeOeW`z}d7RWo;rr;%c8g=}2H$ z!zxPSG^mUY_F@#7+3#M&V&yDs3=?#>U`nazqi3qgU!c1Ga4)c#4k>cYf4(D6HVK@$ z{PC-*-xauVAGMun3+%hMd&kEksF!pn4|(REzhEKa;A@|E?ND^1Zg0eE~!OpGQRr_^u7Dc6g$UA3ip^WjdB3h|#4Z1Cngo0~q#)bCoo6%+3%ww`qeRuMfN zL}4>+_L8i#RrC>Y9_z52qyc$7^H905bcfL3lid|KJKP{yYKRnp%2TvIkH@?Qi&}UA zUhB;*NW7;3@lGpw>FD38M{B_|wam4@3I|!J!B0JcsxP22xc{5W74yu&GW?hGc^Bj@ zd@kRGN+a2zD;!^C2fzDs5$XN=7r+IoFF!+{0(ROeBu3FDm$bo8_gPMp{??&rr?!#IGouJz$=v$;=1;7E2BVMb(NApqK-oaSxaUuQdFF5)^g-#l8D? zInujl@mq24eMOeY)|{oWrqPP5tn2;Qk^fW)PC<+5G7+Tx^^N~2xefz=_2m7g-4GJl zr(gqAD5h@z<;9#A!24^v3_rQ^nH)_p`85fGiRhn`M!5hF5mU`&^>*hH!_R{kxe|CE zgL1N+zu(DY(!hq!$6;{8J3}+6&{e^0d}`Z&cncct_;WDTo2TafbCJbQtM4^%O;M$< ze{KBF-T(jo6Tty?#X-37?oQIB#y~}pJ}+K%b%ns*=6>XI?pgnw62cpfl73+8p+ z?%6rqZ{7e4L{>qS#oZkZdq@PQYy1uKzxE0cOKO`(4?tJvO<)(uA$2(_s6JZ)cyTFWn|5m(s3cUB> ziL$}2q3;9lr(@3q`=7QS(3cIm4_OHJ=*G_DEb9V^o)DiY?mtsC#|JD?ROW*T%g)ht z0hH5_{+q;Kc=hl@K!%g!&!l&<+@8Q3z;myjmB{QIZ8sSX>s|wc>kUb8?R=*1DcD@e zczga|m(2gRgFk-^EQ35n@=+oGo##pkiaN8QX{>f`?r*OLBEd6f4`}WpL*NiZYYmm) zU9{fCt1MbHfI8D!nGhWLzufp4$j;N=f4eZ^H~IIAIb>D92cd#qv7HOwO`J7wtO~|$ zkqf(u;Z?wS%+C#&=1?#n{yY8CN}L%S&dKUco{>nu0Gi?pIlM-T4&y(5H( z3Q@lpyIcD0rDy@V58A?nXTBIOt%75dh!A8^6++v-6XwVvwF|zT!^5 zi(tFH*#~7p5>hPrkMG>ZJP6J4>^qWi=P!2-4L;cj#2l5|hvZ#j%R;RxZhZLJ<8Aj0 z|NC~{c`!KlA`)N&{`<@MtAKHm)I?(cQmsD>2`0OP!Uig)wo#G|y8n-{w+@SP-TsFa zK|llq1VtK#kQM}_ySqCirID@ykrL_dl&H16uffAM}CP#UQJKdSt{zTV_8G!T|CX7mk_M5E1Ek<>-u z>q=8XU*L{O(oY_l{8k4;E)VQ-__=P_{}H?4xfzU?4o!rapjya)7wo^P_r&0nvx`rs zl#jX(#Ty{S(wpUDR{SQk{{PnFs=Gd6;}NQN%Nd<$>+a2XkzXSZH&?T7Q3;0*ws$$# zIsYa{{w%8ghtY3}K<|-ns!E|$x2fi}Z{@QKnbXUkYzS!+;rGftGWhMjjR0xFF7E#C z1|46nQZ`1Wr{l8mjZ-hDl zc8s?dVP=yl+u|ymi=8$=t*$`G$RFtytxnU`YqS%+&G^q5!frms zV$hVZk6J&lG-EofT!E%ffA~La1vDuQ22O;Gfbahz#hci6sGFndS?@~Q-8$7J^`6Vo za~GFt=sW{;pTU1UPUtD%+n{8l9Qi8#*WZ7;20tz29^22IT5jpUQ|)^dS>ik)Q-v_Z z^)btWcta3daTzyYUjAkzkeA(%AdeG1v0K}w^|WpmpXP&9|DB=SGihaCXX)$;Pr>y(i!*-8$M?wUBuQKyT&HBK%r zu9b|IOg%llW<$>mE||3?V|J;YMB-|nDO-lX9Lr_*^8A*K)Q$;3NAhTl68rR@uN?dtM1Z%C`seHS>OG=J_-wm9-0WaVxXkDGD#+ zUl17J3Oe^1?Qy7pZSN@I>b-9PpSHqyGkmYS8IHJFoL}uje8H7i_TIUM0}A0<3r_ZN zN^=dnx>mL(6K&jk9zbzTO3LHm?CMUkuOcV1-$NMfdo5N@XfZr?z4dg|H$5{#Ew^pU zrlMwrd>ddB6KXbERY^{NwUq(nT_8aH__)QNPSB&q7IU4Tzn{-P;t(W8ew8_d=lJqI z6#>AadC$s8pBKVK1s(r85)rBI)c(Jkv?-L?6o>TbRVV4jj*sUNQIr$z((ObCB ze#`XSgyjIGZX{OBTn5pQ#u9xs#^y`1qejm9ld@fLpj)o>;mVgnGnhg>os3{;?a(hvyE>bzpE!*P_GlOdbJC)kqqiaJ|K90;Q~pBngy~z((&+F z#Qx72mVPQXav(?3!)|7cW8Xkz3 zM?n21se-4^Up5LLHGl!TazW*930A$O(PGLx1P zF2{MWoUj!L*SG!*t-QH${thq5`L7Ap*6_MkeiP9D+#$Kr7bG!5nEOGvEG=LO1$axp zV+6%nH#`r7{=jlV_YX+knN3rg)9;9H{2}00CCsLcdjQmMOxzFhI^P+2KRwNjHru2G z^dDRoYjZ!Ou8cIE_s*)2q>t-t-EHI0SpyvghuGp7{I9j^l;g}R2iDq~>T4X~Llt>SQ=zh#zcz{D^ z{TN)o?$o91`;M@1^^oDj*aB+e!lSFHlK& zd1eb%3ncHHpdXrZ_?rTwDq){2uB}Wzh=Q%G9DDGz`q$rNF!G*TTFOgn4ULidb@ckdHhwft#ngOjsM~5bHAq(C)<`L?cVStqJs-mX89Nkn>}3UxOFA zz0AAVpO%mi2Ox&jmH78>vvr!_w-UYhvl>T3zIS?gi^yFLWdWq5A#5{I1a#?UMasy4 z;V;kI;!X&yKdgV zaYhYOq2uh57khEdr__V{&4w`m>}E4&Xf74I&&q9q^hcOeS_D<(Pi6@Kd}{)Y;s69L z2{{#?MrXex-5<>pG&M2uj%+q0GyJAIjrIiYifn%3d;-yrg*5duy2Jr;>|0iM!ZQL-e)@@`H72IU2UDX(G9&R zzV3tIH%vg$P1ZHP;bVASjPEuRM{bwJ4E?@oKdMs4?3J6?buT zwQH;Q<*865a1rQ6_iv~s?08?ip7Pl6ApSPt z;*`G!-r|1u=;!u71Fdx!X{2&-3zI#HnF(ewgH0zQ6gy`*C z;qLOOL2z!m zSp-33lmI&iwtUn-r+(Z7Tyme^`^2*F&5v`XSo7kxh6!dN%3hhkL@ukz%Fmt{-BIM>_ra4=G=W{ZI&Ltn^ZI4 ziPC8R3ZTj{VX2suoa(uGGCt?;5!wIvHA4FL)VTE|vP${ffI-H-6By}v9&HNm`VHyY z-FCuF)tufIF5Pn?A;~PZs7NeT(kHQneQQf@J^8`oX7HsP)2AZ~D6$@#87Trrf#`WL z0Bs$zNoSJ}Y@8tOC(5X)u5BIp*;g4h9QAGfCMV@nYxU&XU#o*o?B zUX`z2Wk~`+?Z{~}yK8`%O`&SqJatNVHGWriV{=pGrgowFy(7Cm(TB88r3h-%EYp@4 zmj^F?Qg0IATF6CH8fbC|Nw}B3BV2m$X9-=%;71?Six$`ARR9dSIJwM8terKJmi5hg zys$AMtEWKwDx~klC%tQrbBc=2#II1taEL(0km?a{!xr6Q4c&J4=cp&^eTMDdSRR93 zQWXgt|JY7!9l3P&9}<(|U~c9Z_wcTk)^v-XeP7^L7#bYQWFZ(}cB-%+kT1;k+nKe_`01`H zNdwA@`c>jXa;jSzZ~21%&1qGCfOe|f`1KW996s*769HkimXTSyjgX@y<1x?!|@giH)KHmm%?A$&3Gmbe#SOh(tT8&9ftf}E&!N7Gvt0bxIOiBIn)>!Qg1y2V5NiB7!_Xh-*2BnGKw|v z2U>a1wUnAp0;6ZX%hGEi4(K3`sTK~mSu$Ys>a@)|@n!M2N+qsQa^-73G3X<%meKX$ zSSLk5DR#SX2?!Z#^RmH7KN-OPer6cG6p0FqSOWjt&tE%LsRrs*D1``AQs(}&N#JjO zacFT#a-o#Ved-6IJ@bK}d4=pgR81O2RZWf!TH#a9Q z)CsoomNoOX;cY(x9qJ;Da%*OP(ZPy=*6nVQ6b~7WgFiV2dZ(T6!mEp_M+-azdoKXb zf_o|K{IRpX@`bVQ&wbsrBP0+h&wW66yZS-r*1yfU$<@jV5F&h8{pwI5s(+JOy~m*3 z!=Hbi-(B6#5A_2f^%%5x3NXF8fD`N!xAXOl&W}Xdx=IbBKv~ zRH*B;)FfY>o5yIoVTb!5HY=%?4nV+~u@@Mo#vU4Ef4M$^xQ*)%w*wU)Ips(81-hOd zU*H4!buGTjJ`BT$9anY$s+@8+srD`u6mYseUmH{G`pc6j2Ew@gk`RCzkEGx9OC}8b z6k`7bng0GN6n-!60Ucg6y@j&Mv!_7feWcc@baaCMt*JqLZ+i-Cpztc9H)Dh^)i8;{ zDoPFss2N@Js=3&*hLFcDG*LgK>Jyi+8i2&0Ai#RTuyl$TTVk`3*eU9E^1@k zw(LE*2hH1vEdaI3HZF@;w*xRkG6^zq1k_UI80Fjuo;7EKU~pWObRN5IC{Lm}nY7mQ zFmY^ag0;Yl7s?mGw6HxXK~mzif#~fQ7BhgUB~$F)l)8YR1ST~))1yC@umswQkDEOg z^f6H1)b&zsKA3X@!UWKm1jmYBk)^_VAi+Ly{{gAf%f0^!7XMDVS?;$*%(`Y!h=F+^ zs1cXfHIS?)Q`k}T0$znBG4ZF-ES5(;FUt!TKinZ%_1HfSbz$V!CxLaO7yYKB$lap) zS?D+m{Eba`=rrhF(G-N@f-V|!Ma5E&AACzsjkU_E=yO3?%-Go>DViW_*LEWvUo1e; zbm7=kxJ?xM1jHW9_);Qyw+*qhm9|ZStjU;4Ow^CTcs|GCSbhU}GV0^Ae^#+{FGl)- z0@CYWmmLGd!R3a;q;Ip)M^djCm=phfyZ=$Ye|-{SLy?h6Qp)S+1?KwsxNl|B!##qn zOa;Y?Pi*Q1KX|r^N7M5pHFoM5YI2SN!Ikl<$ot2|0P@LWx65UxHA0{0@~tocNZqp2 zZLXFLb|&438k~vjv+_FmI#$xFk?+U?CZv`+2AZnq+IpTl8H8=XRDi(-Tw4 z6(ca$KaN%&vK^QxMadO6hnOW1Jmick)~ONKbNlLXf*m>561gyT))nZ|&>_&)x+1@O zkl=F?>a0{mo;>RmUJgO9(KMkVrso2s#}3XlE zrZoUeW#!H~>lg_P=eFA4)VcZj3sIdNAMB&n_R9W}tr5UVA)QZm-OVU_b$qmvW087D zIr!|ZI_TodPy-);;)5{tuZPJN$M6qNe0#72p?U#6{0Y?&Qu9l}jOn_n*bMlRGq1b# zuUMuBpa+N8-S7ubDWzP&qUriDrA`U9;^;aquEO?+)hyn&?_Q6R8C+an=P9tT!7dMq zYvWDtWt8#p&Jqq5j_);PYoX#uCT)HK5Q9}_hQ-QvFD_zHsBb^5>3VHfqj=~7s3hW( ziIO4M>2m)_VAus)?7j^E?$>~b-5f{s%QBjAlg}zvtRHj{e|B{pnrj*H_;5c7yHpOieJrq`3{4?129Y z%UX(o^O!D`HKFTMvj~=Mc-^x9WxUY%rC`K#J-PA4@@FFK{u43(T`T}voDb<)P_GrY zk_3PUF4yLNrL-9gP1@M-8;|if%@}&?L-De@Ef%BhwL>)6u08Yf#LsZxxM7iqq50F7 z;wiRJ$;2 zb5Ze~GJuL4XA@U|F^*Oh2h_U@EqM$X@XJDXni(5g`)jE-&+CC>4Od-aSqZyc()IUR z4C78xUw5w3pHla|xm%ZI#GprU0~a-J-}~1&Hm8)w<(x0{Cf%jRAE{E6LQ)=$TM5iWOjj%s^7`NEr^9 zBv1ZD$lOBmLwXk28-v4suXVV`9v7r49yN;>^bTY||pold`$ zaesReaAO;bFIhv;oy?r^8`Il9Z8-+xj-p#(@5+_zl)G*+cL67*{80j86vZUv>gtot z5D31vzI|Q>6p7Gt&(G!Dg+@duj@3+D;pgYtL#Tz*4}k+QPvmnpm?0&bOIOxU@1S6r zdA(!%C@~QR#F1}8(}}E8cld|WNeu8TXtg;^)#%R!)KVOo;@brGzC^EVt*k ziHb*(P*3*RcCbTBro6`5<~-~$g3bVO9A@iVP*E7EoLC=s<42Q4yw^D4*ikG9~AnWTa&BbTQ}F{08tM!=Uqo~+WWl;{cBz_flCz_5h1 z0+=yhSKPAT2&cOIYiY+8jyUD*ys`uB(Ur5nCeSQ9+vw)T;pGn%AV_9{RLW>7EBR$)H%-TdPOz$fE}7{17-<@~ZJruL5)&fQQ!RQA&7lWX)yKeSqXz zZ4a!jXzRumvtb?D_3pAu-1KsG?uVnodXn!@Ryfd`@0RwJJoBWckDI(Y;-q4>Nh}8EdtJ%ev5zfr$yvdTFrm(@qDw#h*n{3sLtFSj0x9t8x#_*$?}hvW;T{@zL(_46n(iHMSEVyC5wvjio}%*XOJ;3z2VkOiC2sN| z3C>B=5?Ty&@-pFdoHbC@o}MW*#3VKk)_cOnybb%pOUZMKP+p3%jK~WuGIHMn0UTX)Kg>=TDpWd-4D+!fNy* z%6K2O7+PE&cyNky%p{;1G>b*DyU z$l`*%xS&kMqD4Sa?`8SbJTphJsPG-Iel`nvxf3sK7|@^t=pP5Ph;eKl;J=F!B?DYH zx~X)xqO3K*l!9*Ug^Iw$^|4k1&zh#9*382>1QoR`yUfRuq;bHZwi^sD$|#Tc8l1Ta zgd-DG@XID?`oM!jVRtjQFooHguCnr;tso3Z2QHW&(eM6>l+h&$!QPriBZ&v}^tvp3 zp105S2uEx={|ma9)2}u-!e&CPW(Ee5)7TZRjz`?B^N1@|H0OS6dcYlDY~a?-6L0vs zI`%Nk6XFxo7XvkO`TXQHypaL&0tJAK7`GV5eM;Btjq(yjbPS4h` zc)rA2>US0brToj-5N>csLMy# zY-b8C(7zZI@oV^5M~`)NQ`GDggR#!)2w?O_7ZH(aku8ml zYHR0Yd4fEe=Unpy;C6G8?=h7h7+*fs_&Y;Z7$#%|P|Q_)>H}>XH$~9N?2X%KW-VM_mQ?xIYe1=e>A?awKwAv%WD%t@h5Ye+)^|pFWU7O%8{bX&P`_2fQrfc z)sPR;@|cq)!X#-1#a#nr_yxu-g}A()tSS3txf;e3#J?e9g|tyra6qAPw3K2RN0@lf zru7;vtkUTaCX<(Ve-3QBqZG$+77tstO=OH~auCy$tdS=(!Cx^H^Lth<^A?My-W6?c3NWE(hrD@Awruzt4A}@6Qu`L`<`3+URsQn%3`#V)j`S z6sL_^FxvbPa0?(DiyzF;AH<21YLwuu`Re0znkvv*R+g=iPkl>PA!|7Nq&9e|zF9Sk z4_$6PcUG^q%q%uta2*^y{w7|>yx=*XdWUd~aN*vYai`yr(teI;AZ95IHJf+0lHv1o zy(*sc=R%vT_iRenq4&Z98~$une`Hqbc&8j)K!3n`u`)h9{sbd#%qhxdO{=KF3r+}% zja>c&RWQ3q+a)n9%(G3emQ_lH4Xjgh<2@%2`YkXcB;_ZD0;QCEj}~QCz+Ii{!yfBcly)5jItv3n zzAh&Au~_r_TsWTPp86~|j&OCq`e!k%&vPZ~L>EP&S3?m!s1gF?$JTkGe^%&)Tz>B; zlHaxPrihcS5@+mui9_uLmUwK|AiSLc+TAHri?SD#DX?Wcj5w`vKnacRO`3@_qS zc9z@{iWQJ(e}y0YM$yyK4GRJ5)oS9s}&8Sj^ zI{;IuQVkCdl4y?#4|eeVTPWA;Asyulyu~QAmW2H$C0|`+?wG-eff&bFR>WYe+ZPRb zsqwMt!qwoJGO~mHsP+N^N(F z0abU*6s-1Qn)FgMZiiHv%Kv_(5E!G?=URSyXC|@sx!Ji_%P0`^04hXX{$39es3i6Qu%6PVjsCMQvt4CQ z%X;?y$8Y`nE5M=w?*i~A^FGe3Ja%?D4|_}#E37e{pW$!HqCtdrW-UbRZ>kdA?>YpY zexV#}0Y$fiJ|>Hxw%{8(6Im?%XHD*Y*H>_5eLaI9o~*h&ZN$N=`DXjS7xV~J;tw3q zq~>=lKYN->R}=TYfA>F^CWMP@qZ|kMg1?urrTl#xq^GxGBIS@3My|avLga>xj~OGs zPM*9XdioL}Mv_TO+ej@6k|H=sm-t(}EA=4(*%M)X^G?Kto)S=%fyjM52(*?j`Sw7& za9#7ef}efHB!4sMN1DCMfk!Ux&c`rK#9EXae{!+t|k=K zO5Z9zrUP8nQ5HW>L76$LOVBOEn})RgfSc8jM2ZJNmw)t{ zDGv!(b8TY6_*9vve%M20)IqTfiFr)6+h+&SwoYU9bOGRlI9X{XI&V1&YN6RmWh>D1jzX3)BC1 zalnn8-UG3y{NNpZ*sd(pP}?xFqAZdn$6R|$9Te(`6$75NQj%PIZ6%R&GS{RcTz$NH z*TuS)%AWWDBUTM0tFmd+q{4-IW=1LP)T#B049U-sh74JXJ}r%W^us!KDVYJv@lT|6 z1pWNwzXP)cWzyo_UK1*vV^K%2k_108r9UxK1K(O{7drn_B1I}sD4v~4T>$(xzx0im zr9JIB55|4!+kVwIi<`1lYN183t4C7RifCZK2W{@YQc=BQ>yha2+9S`Pf^^NcVl}A! zn1N&N3pVyx+MU6_fsq?{KvA}4#RAJs>*&qzz*MQR&aEUXOUwH9T^l(a!NJDi10WsU zlYH-T;`$@kN&t!*oue9*zjT>_xygTdnw9NuLiw-UPce;>F-_j*PbIEXdFhQG)lpkX z_B1R-i;uohBlpU16apF;ChV^x$f(YGm6`_}=Tryh*vNdG+ilu4LbwkCWbehn73Qp8 zRAuKgS-48R?~BfaKnjukk%Ws9qw5YJh;}-$UM# ziemf$LcX&0-M5z@7C&&sZaotD#I*5UBptQQunrFu^Zl=E?r&c7%?|c(3RT|Z28<*) z6h;aUbE4|Kd~Hv?jdU&OwL3@C5Wcb~LNY4My~YT%;{pLz2^>)^6O-sMGWpi|5AOMNt{u zg#IbF3{S4Z2X?2GeYDNi*g^DT0aTfKjAubV|LeCO{QAg)hZgu`ikc_i_5P5Zi5C)) zYperx|IEl0dCBopx=oAg7Hz3x1M57y_Q`aSYCwIp|Fkqp6BkPIW<{a%XIW7<~U3m+Sm`?MW2LE82fQ z8&?!Rxnwm_Eq`kyG@9nfB&vM$NyFSO0c5i#uY~~-wz6auL4kQNa4c;rii#`}K40TJ z%PZ0GwCR*qE!N>;xeLV*NNHN!!#l=@DklYvxTW7&bpS;L_xo3Nq8bAiFznG9dnM%&x=m)g4bb^4Nvuwf&3WxgA1Xzb)++a*$M(IEX#T>m3+Ng}yq3 zZ-hM5PH`uy%d|yb>iGKrDSQjO9Bk$#FlRibd=ENEGG7wG7(~gT?QRBEopWz(4d;zy z0o&~R^EhR}S&V-`wSHewRrp$R(A4Mg(cXt~;`O^n4KsnJ_8M`` zhmNh~4aD(LTR<&>i}7{o;n_?qQDkCmlFem%2gKQ3l_aT#*X;g(j_H;kl%mo)(Da+2 z&N5NMHeN*it7c1Q871pCMbE2t(;=Ti5U*Yl|B=LvFwkp5Ue{N~<1mj^_uX~#w+=vX z#z#2ESy<8Y__R~JgSxgv$&q#DRW!^_iByBV3P#VUoUB}V4zPvKR1ueR&CStsV+KxPY5Wc_NG@&iJhOXJ!ib*8z{3E$-gY$^{d(55pe=TqQdheB0 z>D66w7s{#B6-;=R_!dW=Z&m@^p7O~I7gw2>Sbc+dU|rRjFyhj|vh;D1Fa2`n5Q~Ck z9U1mt!s^$HY2rSXMtkl}4Q-(Vcd)sxqA^3fQhzl>0D)^3LVAt^Ky> z`hbrCg@N6W0kPn@e%*uUiBPeWKK3!{Zt(LrN%tv|RU+qilojX2edy{poD|Wa65k@m zql!`$6Gjgn8(2QQ;IG>C=c&ttyn5Vap*XNlQQ2CZuQ4$m8kArA!1?;e<>_-t+P`W3 zzMPRJ8Z_s+H^ZLzv7?>eE7=%g7qRdr*>I3uAJ24kpv2pdoWKA1e-3rh07*Aja4N@) zr#j3T|C#i+fTkr+{{Tsz9(K&?_3@SCr!=Bc`L*w4iWV}$hvq_bsX@96r&&HDlx$7& zPI{S}UpU7u`x{*)4Iezl@>|&DQ&G%>Fuxxd>@S4)dYHWkEJFHqdmptPOzw+R3pqV} zyzKPuNyG9Tnev-u>JAsQ^?Yr4>?zzbQ}$T#@@_p6uJ!+{@-HRgr!PmIbCnEwB5LQ` zvvQZ5a06r$@-Wuz59t z$Rvr`kq5mN#diJk4`Sd+kt6Vg4}8&E2w1-7si!*BYnH6Mj`&3J-BpnIEsCj1DHYV8 z{K=Yu?3x?J7=>L&RKGleKFwMpL8ANt`WWh!g^wy@H!~;|+Q1Y+_D5#Eg~XfoCVD;0 zDD_SpDY?s=a50VWBvZctk2iHrs%`P91x?}&EX=A>G?={_I5BX6;xWuTA21JTK}R3$6P=UOG!?EwZeA#HjP3Y7~+XAfa-ci)gAAoGg*-e)E1iO zzh_nmw09<>CXO}(8$MPOga>Yr@4Q0sf?5A@4fUl_PJTpKITTx%_~>uT)Ivy_~q zv@Q4g9B(2R`-h62BD9@7=GQs$GD=(8>$6YTKdc^A_@feFl-t%BUqllZUBKWmI{Lb* zWVP;22G@H1L)+@8$3wJD5HE;|cYe(E-aZCgWA_{11WV?#Pd}_CsLm|_hqUBPzh9-U zj=_jE3=bVX1fbC@M0^qgAV-XX_WGn#pEer~*mFE!nfzxSvA#3`Yo%9uE79Px(xWS1 zb5~a#-$9Hr*;0F(!o&(sL9c_uhN9%&HISfhu(Pdp@ZSV1jqDm1#dxae{N=k`{WAOe z@+5m=tH^I=P8#dH%I~q`(nd(0{flsV^KtUQ`thS?g&A=Eaq=qToIprvjD-~ozeB*- zJC3;OdFSu(5(ea|56Ed_!j0{_8m9R3v>Z$L8!p;TT<<~WOX*zJRvg5Hq4G;Tlnxtv z`8=$N_&n9*INh^nhee*}mo7_B))dIp53H54hYl0%$HH~7i|ekA6Bz<4w;E>Z${b-G zK1_wpo*QZuvpCUT@#faZPBLJs>pvzEGPpg&^!eOonQ=%$Z*60@?LMlQmq2v8!#=-s zS?sTppqTUZX;no_02RCw^pZn(FDXhsH-kYheoQUFj-a1V`sxMDEzC#P$TAs_bzQ?J zPvJAvE}FYg0_(Ha!Pq;hiGyVJrE9yA?(>ajLKsW)XDjc|jz;5}-LC?8ULOhV9lkys z{P2T4l*Y5$*V{!N0dl&Y z%&%%7k~p41mhA(yVKy9JpH00@wbIZu%M>yxHsH29NDDK`(f*^#=0ujD@F7ecsN-b& zxWk+4ie|h0g7kql#n3|*u7@QPLWjNdeO>B(QIGsHTqU{ zfBZ_Pgme01IiFx&ZG?%e^&3($5ir)Yt{?A0jMeF^6FNxCGevY5Xi5n?gRg>lL61X| zU?oG$#b1UDN?J}b@A@o|zil|wxs3M|dwjIHdlGB>Tu@OV^L%+)8?2*t89*oL?s6HW zGeKKSs2pwB*Dp@)eA#mwJ~!m1dv@~Kbd5-{5Z5pLUA-ePE&=R_DCMbS@v%yPWXj|0 zSsvRehFxf&LrM9;d3M&{G6djmiMu>n)T}+j%1d88dy6yhA6ggf ze%7jrp6rHvindApH)Z|`R2kkJ)ZMOUk*RN$0R= zH;2J40Y?N*Omcp3UBwUHRdl=`+cK_3+++;$7KAqhD__5s4Mis*GCN8$^8PBGUZr& zS-$w1X6@Q4edks}7twe?+tON{1;JU@a8K7C>m5I)MHeYG<=Wj>GTNz)t0CTw z&pZcmnOdtc`lMAHi{sLS;5vp*8z*#{!R-tv;*h1 z1Ysjc@;t$sc|}L&0>^K7BGXW%2AEx`3W&v~_i9$X99f+`k0^W)XJ(RnG?@*hEJGOl z^@Ke`F&@jlokN!Uh7;Db)Q07OM}n%0beeYemfk|H2&;U3KrAk7Qz`8}>W@zg=1KTl zA&r!(SJ$HD192rB zkrtI&UKY;!ujG0HmWAjhMTw(E)SSv1GOq{S()O+q-AoqR?`G$3RwPZz$I8##{=(~% z;u7u>J-3(uR726jh@`t(ED5l(uYBS7kFj{Ldr)U zL{HLA3~^69dB3-jxX`Kk$+N(zNt53WM)sOa)BR$!* zo{F-W%(rdrUC44AJGV=puW@I|W};$=$@%AJhwt7=DXg&-Xb`rvn*881B&KP--X9zL z4wJ&+1(%2`QWmmDj`FOJ8p@$(_D&8N1)$!YIgf#O}kDnw8FN+P(fXtee03zeiZ zEil$&A+kL?mwPQs%KuL8S} zEOBJ<_N3n0lf8Xem$e~U^Wyf)BjeX>s%Gn~dx552@DMHEvt^MZQ%3G&=>VDI! zqiHW&)o1fxC#0`-8z7pl+%LCad8%W2ciZU{juCn7Z0s&(d1xbIUrk6ut}hZb{Z*mf zi}8B8mYMZt2jcxl11AmXs;v>SnU54DP(*xTL+csTeDBj`s3*Yl)sLY?+LXqj=n>!7nZoeA#b)*ckR_T9A#$L$kHoTkB!tss)=;S8*~hYnhOK{ zC{07R4Lxz5rE{Ap3Mk@;Pe-zzPq=Z}#>%AI(F)7M%<}2c%A&X*Rl-%^y1~e{a1nOQN@g_~=cq&Am$$6@o165zT zoaS)Bq(6mUkJ@@#aH>KTp&$TWrE#>;4!0u} z@s3XRv-T=U+$rPYe3YJfmhn#{2`E-eh-%bP-1&fPS#lBTl|vZ30(obG9`Y0c_e zUEa~^xF5&kv6Y3lv%9vdV?)q_Gy+28EAFw;mUVsBrWu^SU{wUM!=2`_Nr94u%d^^h zh&9b~=eCWML>7Zq=bZo^@PPw98PTcW$TNy$-%h=)(dQ7?Bqz1ZTGxJT6Re*{2E@kj zC_orjTO)RlpBPy@wV;$m4$3Z_(Q(;((|%#2-@Mza@gsrJxNO4X#WAMqJP!Jw%|2ae zqkeT%-LLbn5?>VwBze6dduadC+6oi3FjEFz%%!L*UO!>?)a5};m*D%85}7$~weTNHPUzO1_X)?UuV}$o?m{B6f zSoqjgoSz@cDio#>n;AYjUGQzo;A`pyol`bXa>Ui|70Yj}8rrX8B=H6}^=VJ(9}Bdg1QA;3Wq=S7RhrSc_WP| zbUQG1gHF?|)ca{&!ZV~}k@>p5R<@7`pDiZ#7fwDH{{G}mzUEkp&Zpb3 zFDg{={IOi&_)`YDPid@iW2F5NJ0DJ6JwyOHA?u&h^g7~5MBuWjyRSWX@%&m?|Hbom zU)rkb=KOhxiRHGdmo$Z($*XDYIIY!;@(d1P@%21 zjgOM^u}espsC}U5li(%zsVx(T3sqj8v9_IyuwB4pL(W*3IMb@dpfp3iz9kjeaez4y zf)3qklMREEPZ~!u`PlGmGbM!n3Jh0{A$O|)u>#HAkB=V*but&i9;ZP+Zq{j7-+$$7 ze!`hXKkg{X@S;{k!|DFNoc}F9b0ksR?E6Jw8!qlEPv|)sb0Y~FEbBha6u-ihtVyse z0aLJaf+D`?hTfVEFhv|Nv`1$+P)wcYs|ao~FndTSepdzOt@I~lC*XB1>vVG2Co)8< z6NO~ogC1FGI>OYq2=k-*D_le}Kf8?ahA@o#Pqv?3CEzM2@}Zuv6b=bER!r0eY8EIE z+dXu`RFzuIOwf2fx!(|Y)^=k(b8G7#Q-ws1M+A#-Rbhy&v%{im*-f zY~tr#xpSM}D=1Yoa(v57IA7^$DXy-z&2T!c`a{_Xod--tGl2C*cg-2Lgt)X7*LxI z%|yJ9KCQ16L!WsS90NREFT`}rZhF4Ia220)eJW$v#m&DR{4DtAHp5W-s&Hdaa?)Kt zeI@6S&7%cZti>Ib9PJ)4pd5A&3)fn#^ET~@RruMBY-`u)MvDC@pbSW0qY|_us(eBP zdvN)zMamJMkX6%4&^<&GPfjgC2sZC{A9@2p%-*V{LI+dGQw308V@Cgsg0+3uNguC} z6b(^ZK}DlC6hE;n(?jrfFg!kC?aP*o>;*D)O#veGuG0+C#Xz_fwj|az!?7|U?j4+2#6kmCJleNqZf}Rb{4Cn$&^;?a2)OMg zj-5be%RITW6lHl|Zy9kYVsgS=B2~|w;w8nTJ3D=vw92FU>h-@hXqE-UHAEw+;+4`ku-YzgsQ;Nb9lm2p-C&S`;CM} zsgBtuLyeQlT0k*mwqsqhXWJBG$#o^aA&Ny-_z#gkKRqOUb-E^(FE8w@>t|obM=ZW= zhPNfmZkJ{aub32#@6y4@ zQW4J8fQ)bET&@LlXvBiH&Y_?Wd;A?&TWxD`J7Pnj?)^JkG2(jrXFjGWWP(K^)xb~% zU8ah1{EGzsYk9+xspHbp@)F-`hmw1E+2doO1;tJGo6#zQo`Md&HXVCYYHr&Pn+e7= zr;D)p+Txt+H@UNU=ogdiVnDCFPxa=!_DU&Z4r{J_EXBbmhh*vsfcvfK+dI8_c7E7r z){1{vv`gv+bog`hk`ubpLYJ01jVEOq(?Hfm9f@`)E!%mZKk4M7BB{ zH}ZJFq|`<4>IZ0kdKd%sAi7@g^(pb>E>r|vY<)N!Yh4gdMD#pqf3cZqXgEUqCh(e< zvS6B@N%0~jJz3fJ`alN4q~USkH09i>g|CHm8G8y)b;}9Ed0d0eLmELzLvL?`fpxrd z;EyzO$IW#mcq6TO((ADp)0^BU&fkD-J?Pur4K2)jkV z6YG?qSaHV-=5~X5VL@Q;uc){_ zJ!09gFOlkP(R(ld?T0b^9>+R!mmk`5YPOMCaI6rQGno-m>wQDaMdDzy9E3BD0id;L z_)j|vSp?g(^c1a5)*=ntJSzJ06fq8K&P_|NPN?cGaAKtAS<5Xifyfa2hq@y1B#pvh z#nX6FZ;Ir}ts&J_%I~;UdA|60qj;}pYaZEyN~(Tl7`ANHB~Vs@#ovF z)u2P69_4y3iWEo%P4ioSDRmP`BfbDrqWQ6eIWv_hqdR5MCJr>(9J=gJ?mS8V2In=a zz1whC%&RioU$e5rV=0>8WPEyjqkL+;Ud89Z?N`*?YB(WgJ`C@n)D86&4eAPqgx`?G!5le@@4^vu!ri5Kh@yw zO!)|PaO%QKmhHG(5Iw7YPMK2i@BE+`>tPe`DP4Qq8g)vg6SxfH$#>)MZLR zkvcXORrr}Sl2+UceMIQ$){@!InY=)h=k;4C_Cki6UpW|nA@~_)l7n#i zFnvqG9dHMDIJhMkY^LZr;+drfPYBKUqTclL)i&v7{aw7@iY&i694zX}-sV24kZ~-gxQ?l_6b?$Io|-oAw^I5ZS(-&Dw}90?9)Y;gT)Ex@~F86?FJ_ zGud{R)$prlslquO#)89%o=dU*RNL5^&mYZNT{Z8TxXBrQpj_Ef{#xLZy=Q~ zYam%@^E>;mB61L!7aM*=@Ty*Ca_)eHP)PI883_$XLt<(5l2 zus8d>_OH3GJNxf%p5|4xm{GrvQD@F5eT=)-ji#^~Z%jFzb+v||V_tPRx1F}mhV@$L z9^@C)ofFMkxQ|R_w#ypbxB$WkS-W0Fs}2hdkk~=$Mox~H!pf|P$K?TuJL&9I^EhxJ zk{GG+SA{QNJeq^VSEu7#T!QmE)DqJ_Jw2-NFZ(W1wY9pcGQExQ7+dRvuiSuu_>KPJ z`&y5c^4jbUe^7lC9St>p>R4p$)#zavomj=7kYyvvXi?X%W_~d_a;Jn$C0m3izHY#=KI75c$*qe)>m%Fc>7FV~JP`26r^mixqB3?V@T zL4QV_tm|e);9iJxahQTrKwSP+{j5|Z2o&j_QF!+AxZ2JD{IbD8&ON(mg=3H!18$5B z5~_7s3y;{k`vyqkC1Xb_zuRW2Ug4Xr%`$H&ELNH%6j)^9Tpgys`>NmM%&hlq=Ow@VX!a#{ zT8tUX0y5|kAAEBzK3%SzXKO2Q6DYptst7kYfyqZE^^bnmzeN<{T*l2cU9SWrjAwu9 zpxD^+yt>q0iP+*%+VD^b)k!ojTzdFuzJ2g{TcD_J`k{?GvfVOqi@ zjLjqz6zO7RvCg9y4K4;66I?y8d4BavKRoWxgLlTgaAzZh6^nn9@C6T6e+S%!tW^xf^{$gz1%xUu7N;KBQ zYpnS|hrw4Gk7lf`Nl9ixp8j)PkQI)+P8&y(==*W1`>fL!I!>qL zPb_=)skcq5h_^=MNw-;bW#Ms#k9p#mJsqxNe}6xBKv$(vs(o$j#T%sF$Va_`ftT zg@Pm?C9`V&ZY0vW9gG$kZO2K{A^>d-l|!K+SNA#cW9JkoW|((2T$DeR?^>l|rqISA z`(OQyFp5!tHB7-`t0ge8 zMX>-_1jKT)>?GGE78UN@@n>L}r0_cUP&i=iCa~1EeHfhs%yd|D-NF6le!iS6=0|6> zr=6slsw+JCG&c(Wa$9v^Aca5oS(0GoctIJ(uheiBO`$%lZy1*k-++v`^qq7Wl99f7 z{ygbTQj?3Ap*oWcSFc&85-znA5G1xNIb@IAJRMpaL}cv7HvUtMr@0ty+af9w)3pLE ze=?(TqdM6(vsRL*z&OL$dtJr2*wM;LY^S+&Z>^+@-l8P)?8% z`MP^)wt1DlrfyPWsN!vKTY!(Z+dW#m{quPP?CjP z%uRtF+^}P5TAHY`QH4}l6(*U=3rKu!S-1XIr0@h1+IBsXFw|dx%k9Vm7+*rJRE*;O zL`=mZNM-qyG8}{(dEFL;tCICLd_nC!h}N^l*CpPDpu`u;rRG^4)Gbc?i>gi@z@LD4 z&7id(ee~>M1j$JeLOs@VyEN|^%Vr)EwtaNwDehM+FLGIt!n}G!mr+GYO?*RB+x_F5 z(845T)u#$&@wopQ&=d%4ZbySZa#w+kY^d7z$e8NOkbZDX%b{i1P~Z>fGc9^xffdHS z@u@spQ|MBA(SIYN^TU(AFmspC9~|adB)>`^w`&-2Oh_?9CZ(i{Gq%zUB3nN>%)wSi zgoii%jams1$RLJ`Oh-~4VHYkl_+4>pEI&M&{IRLJ|NRaO=)~KZcN3yOH074xwUjsU zl8GAs*%s7n|7N7p@?$F4NhTFoGi|=l#X(cI3MkZx-)nr_(Q#`Rpr=CAbruW&BVs?z zLK*mit(87JsVPAP|I4nLA3R}I7Gsy@h)gl|WC8$&fcWkQe}{!&Wo5H5&2j6a&Ekna z=n1d`wDU6CMAy8FCHmN38F$QY;7?V-`PPl&`zrD=IY(avFm@vYs zXZZepaeXkXXZR|O4Kj8NqPUS7R9qG8%WZ0gzJj_#rKV%+gb_5_~V;tiVQio6oZ?)o#M$-HewdM5rQ9Vw(d9qnL~GH}$M6Ewrw&ldl#p z=-tOxwztdqi|s^rw3Ea|VlX0k{}gs=7`QYts~0Yr32Gm}k5xDs7uWL%6ghAKQO()$ zMv8ipM|>+#IEySZdy7?zW49Em)S0;3-QUg{qW`0)e|YUv;iz_5E60ix#5+z&^KL23~=Qdl=86B!~ ziO*~eotPaGVf$<6?O?4=nA}KEru(7S+nb9@7B@0_k&}s|0BNF_zNCXExAt43ar z%?qqkpym)DB}4c}tSVfWh0$>jVT|50@OTWV)FtyfCp*P0@cNY8JcR*gAXnxJQ{;<0 zddY2qoQWjgU>s~p2UP^@9AoM zJI1_6&=?7D;&d*~<4S_=BW!sYS`28xQKOAC@SMjZE}WOdP#D!{IA73C`lLPN9*OwLf( zsXCynf{$`Fb1UEukK2A=I$JUGPfnwt&t?@T;X`S^uq!P8HhzluGb4^TCK<8oK!#; z_mh*6#8*sA^@j3n8&?BU^PHFsEa=_2lh0@c{DoUixC6cu8k(>*E#E$mwL6B=zyHBs zN3>0fw47;2Y_;tkSgle=ig!NXUXf4c+*QyqarS0Ijb%7-W{Ok?5=XS6NW*GadY~%) z=lQ6qe3j0 zC<{~Q;d&aRkO+(*pu!WrRlS|$iH1TW8Cj3bU&pI#CHmUR8)mth%1Ic>>1mycGWRiX zaYV<<5dUt3Pr?-Sx4n&{xwA>TbpaVy(}qtwb3Hg|X29(1^Dg`}wTmI&#woT%7sU!X zJ9Y>Xy4;Hvbt>ltGOlKcKuEu<>$gLk716JT25)0I;5l)r@049{Bgi(pUcR;}@$qIf zc;>w0(vTw>$x2q`Aq_fEfCNtsF{l79kTHGkFg5A=$b8zr+vshqQYxtcaSIL#%O~-W z-plf>{oKL1=Xd$XAA-uV5~6A*R%c`EH4omH7%AV_=gLze zjMTFiT$yv&OOT6KvKpR>Li`*nA!xl71bQhT8PQPZ9SV($IDJzfts)5S_Goo#vRFAr%_f(7R{6j!fyM^CE7X4lPqSumETNc*rY-)itTf--Q0_V-WV8a?}Mg zHsdGLNGwHIW-}$(`CQtTzPm#zh&W&`hM#%KKQ6AqQC z!S)Gjy43RwJIeSdE1XDzJQ8(Pw+)rU?;hd;Ww7*s6lk?tFv)*}JaH08MpV>!SL*~1 zN~<9jP7Xly()*T4#08sW;-CW71h6k1>qwH<&r=sz1tPm%xWg%p~VSOttn72))nf0dGW9@E~ zo?V}F$TR-Lsz}s9Ka5>DT~(MAm-w!@GL@|jbfW*28CaXIAXbnQvO&;~x(}KBekOAe z*zG1`Vwh>8U1d@$IlJ}O5YT_9=UwvzZgCVZbKt6UZl3Dr` z4ylw+^yjPABik`>QDqs@A6LmlnH^-=!WHX_;KEZT+5_Etz&6F8q@>eOA_f4B4Bkl}=LM?R|bgA-S40q0$-qod)8 zKkk*?)6XghswlPO9z%QiInz8lavI|(>vT4d8b)hpDMz;eao{Uw@=u~I1EN80n){7j zKE^6+Alk?xFmA-XYPQ=-stamhK6 zGXI>G`UrN}BLu7VdbCbPAx-)=%n530BS6Cy5*whc%2nAXlx1TxeWitZ`;32eiuHMs znMC_vp+Crzo62iB5Q(MAq5+eYFU%<9_s4ficw zMr9gpO4E8jo0Qz;=(@o^EopjhQy*jGaRS$LA(d^s{ln_<0kX5VWHFD%#712DK0M!a(_rHfokf^Ba>XbGqi+J(>D_?vvZKYpk_}+ zt2zR6RbJq13L(;(@Q*5+uqA^|?;B`)wF*B3s+W*h8I!ec_P;mBz3Q|`D>Is?5?!_4`Tz9X;!9J#@@VwGm#Vc zZ4n(?3jJ+ z`|s$wGx%L*6p6i6dY%q9fBC&Rv0Wy7In$9RhOBjw6a3*GVyfn{^i`nnTJl~?ta+gw zE$eL>m@3>a&d_I5hOvc|)?USwkwZv<26FT{S%#K?nN4fI-&Tnpl5bL>Q4k!KFV^xG z9RBM&r#|201ccFR$iRuXS<4nJzoM1&FdtsUG?MZgO;v#U=nbdY#!ryaK2L`{FBeav z|JwBNg_zuf?7mmIC)&pUU}HDd?DY-DPZnCM4!qV_v+x3aTyj&n(}Vqkc87kcntZ_o zY52v^L#W}FRN5TM@|_YD3JD+#GSx5MjE3*_9ypUggWEp_cT@sXuZo&G1cH>*Ru|^4 zZm+@!yla*K){xj!fyYI#S|;RO(9+fEC+RW3by7Vnu!& zKVt?hKcArZNWiK&+P3+g|33`qSEXWEtXbo;wU*u`%bc_6qCZk5xKNt8m>miD>ANGt z_sFcMVXyjk^EIglGsFu-tju{5ShXp2y?LUW{op-SA5AjOOYiar6{rhLkmZIc@IO-m zuE;_Kn3^N8gkK#Mj!Cd^>wBBQG_3JJ{#m@N@P3ef1M86&<(Rtw=siwpohe0# z!(v~ZoS}q8j7{c=gSxsX0V`PqTe+{i$QAl&xE4m&`$~QPsnYb)o#LG!bo_tX5S#Ks zwjS;ZnOcakergw9|1=b~mcjp-!iDS7LP|gViNa>Zn0a65ci*g`r6Ll4RI=Ji*^*ve;+br|*z=8iXh5RziW{4R&`*>a8F9c(>h#0<~8OQN+FX#K7jod+aBG zD1|M_(I(nK%)2sn!$JIoZ=LbK;T;%SjCq*ts&tp8*S`N=LIb3Z{BBt*$NSoV*8C8} z06vC9-)DH)+fiPCM>{cL0nc=K!j7?(v~#k2B*`G&d_`NFuGD>`VZsR*N@#ef$62?? zJ($1nrIN4WRSqe~??4ZHC#(NWLbH0MtdQ=AIY9k2<&gh@naUU{^HnV#M0z|O)Nrgl zX08(q&hry^B;jVtFwQthwH(-}-3pXrj9n#)Z9hgm_}s$Y#uKE$)3*4S;GZE2g=(m& z&$QUFZ5y2IfX;2jMaSjp7(DTZb8`NVm`@o`6=E#AcM{fO?9ECX>;3GPW5!8I8JL-? zCS;<@d+WG*yf5ly=*wL4{J1djq(Ic8d2U155z*2i_pBhkOL_Xo=lb5p1mw3$0q<_A zHZfxC$DsxZr9cn7MH&Zz0^rv(O7%9JuBj!bGs}nXB{2{qWIw4hC?_4OkZW7mF;X0S z%Cp6B>B_|=>57`*s2XGj8&^kigtrj>ul+Ef7sZ*Qhobv7qa%5@RHNrX)WQDO>T%0# zu1|&Yq%(L!>cpnC3agS6Zxna)zpTaAThwHjA+oq|M-8@ZXtdhubySNK9P~P;zu9nw zDPvG--7ojP4PZFyGB*i}*HPB|3mZOE0wo~WC82Z#3+BcI=MVqnLT^d)LFtX$uC*52 zR1dybz`+AT)bJiBDz7^6=qFY4tRjdzDzoP^jeg{{1v__pdj7%Yg2?a4`?5PVV2url zkdZyDDcR}l2?jS=6F-9HCrM@dZ{4f#$zQx^5CYTHWZ6z zX~lKazJDq&$U(29nJ}@!P`)4>4G!gJn(K%y*ySlql8Lz+LVPRO)>lCdstW77{26CT zO3W~z9BSl1E2(Sl&#Vksoc(n3i;8psMP7VUxWejTlH-2&muK3cAOl5ID)Oo^%MC^< zff+;d?R1sL^hdRKvt~1i|2u~K6Q`dfzN5*854=V?XBg6mD9cwM%>yP<>3O=7UnmgUrf++?er&i=)-VL1_9ekz>-wx%v?;FOn{0r3UU954gNHoQ>{oP zP%455_n}41UV_-1?31Ob%Ohe+Ep$Ss+XCXD1x1JToi4|6;Ff!RULr^EN|~vA_lcRp zb5s*#h{eJbbQLx%_OLgusP%!VIjuF~?N;;IGNT`@*}KXPkOm|s-SjjU+%w|TZo7hi z!$cf064prUAw_9K>H7#PPE%(G+P26CqY#!)Z22wm4?kj2b}@e&a7&Ke?hJg&W3E;3 zxz3g2=c4X=t_oj|2p$%y`BWLB>y(<&DTMIE5%~Ig8d67=AEK_7Z~YLG0@A~0|mmDYf0bFiNq5qJ*To&q~Vl^ z&CAdwi6@~{5#(SR?|xP#ZWnv~N3r`YrQO6Fz@634QE+Out+dCO{$7ey_Wu2jWLcV2 zBq_gmU`Q~jB9_ZB5@{Q0(#v}$HT$~}yG)gIENOF}Oe%a$k8vYktLvbDAX--}c;u-m zRm&p$)QEyb|G0!kjD3TXmX@&*>e!?wDHF3_g7?=7@W1q_fa$gWFoMtX!5i8KQ(wB+ z_#;6)#mFdVTO?#Ux{rrtR6G5-A`8@ek05_NxUOvTe?U zKBkV>=Si@Js3yD6bm+Wkn!kiCF*!8grLBUD?Y9_q9Q~k`DpHZ?`A~<3dNUXHDEji_nlHg$( z;t()zh_&|+Dw8y%zK$lEomU?r3*fOTLww{ zR892^z%Yf5qk4uBvhR}|{{EQD6kn6SB(XZbG?y`{eJ20>pV9sqjlMVgT{~f|ryIoP z@XlOWvk_$kUa%i2O{UXWdT!KCWsvDquivVyOe-6VP0M&+hUGK7R8!o!%G9)}K;MdZ zqZNG6X_9t+U}&EOxx0Wvsr5kkKQom>Y5jU{;}H9f7FF`MRxS{R4cmg|~ zndH+uxJ9aYJpK|Z@t_KO1>M(nqm#(!F8d35i~@JaeeaSBIxY@c7dv{3`E^X7nIgDdVXinv+6gb_Hy+iRtv zSLS%77u9i)E73`~tcoN>&me!ksGhR4#?^6=HguQ2hzCRynXTXLNl^Ebx(5XSVFHvE?6o7?e-IViPsRPZ&) zKXCYCq|V`78jJ%%d-!@$>JbwXgvn0J^v}$#GbL^|%*i-IBs6KQ*2hp2{E?*;bg?`w zO*F*?7z`@K&xoDB%utSTjz|Z{uKW+y0j~k%GrTSbxy^@3PifDi_D1eyzW0o%>Ys_xgVl=vh0*eYDe<4B0G^CwvX6uk(8dycPF>vwDuPWcfCI8QRvv^p_p8q*H zoOPCxWVw$ayx5Q4NKouo@_b9HfIYKLBd0ATd||5`+-}yiH;{(_WjJcBUf%cSK$55s zz{nopJJtzP%jEeIl~!7$YnbtZvv%-C)*3Q!h3e|t96WM19|&VN=@Fs)m9A86k+H*! zG7-S-l;!;?%vJ@|N06*9vp%{B!jv0 zCjJoMC8jH5l;%RUcmIGNpQ2{5L+L0X$S`{M13g*vM?_M1l5sgvBK}%dHHRM7s>{40 zaBP;`xr;Gfq;l_gD(o)|NH!WTKE=2+%$!N>NwCX)DPZ0p*i~&}no&-g_27wE&_fhzemD z&D9_wk@btq&0iIj&ssam>d)*NnZ14hZ7L$}y&So162HWZb3<}PQOUxLs^9tXe)sN& zMMJB1sW1A{wW3Q%CEf%N`^zaQR5SA0FDc5{#9nIrmc%X_A zyVOzgAAlc+gJi@=jX})|h&@%COW`zGU{mp#B0BYjewg{-x*`pS-v&u<+HPJf1@jWh zW<1%-fOYm-$>z<`1|U9~ypJ{mfoOrJ6X;5xm+{zq;X&6p9@lP^CzgyHyAAJu88FZV zbfc78m^h1E_&#nMf)06rNh`d;dZ$GoK^eFxVP=?M37BCkV~di(tECPVvQ6b^%Q|u+ z&Ix9Xjy1Fn5P@JMfJqbF0gi%2m0E;Wapu#(p~x;Y)S!bXF$nn(7WV6x zq6TFGEHiicd|@h~a_d;WC>jWVEIkRre9|vvbEwXyj5W^z+J4m`^ip3)z917-y@;J9 zokVB2d9N`RRn28wYXGxn;hq`p{~~TGUPiU{8S2A*$cO)d!;%xcMlJ#Iwfx$i=)bH8 znC~zMu?nt_vlJI(P`xY8B4qF^a&z)15S|Y%Ft8(XOx^89FZb=|bMj$_1C=k5>q72WJ$+`k34NZ;!_08(Q3m)>w}r8u zl8+`)Krs{AwY5d&*!PFyCa6JqzrdlFXap7RX4!YE8swEMrT^aBxT0D{2-!J?ySz)b z;0c4~6S}P3yqc6PM>8kJ6zQI=uF}qr4aHxb$*ntFqu;O3gngTXNBXg=(sK6^#KO4`GQ@JQ1f~b5i=3X*6!Z5AEF5NZTR2TF zz%oXY{I&QQt^+zz!oy*rK}^dXYjcX&NIr=wf?C_7k#JT^$wx|kG93NZfj*_jAmkT64Bmc z-#hL_F5SU1#jK}G1~h27uagq;m^&&}y^VopbXE4CULL@8nMd{UD91<|`%C zJ<0E#vbjXsV8Of!DdMmYE(`uv;BwPGIXFt2!wWy5RehPaGPs~9iE==RN{0FveoGI3 zYX@Jd8CAQocE_()z}AzPb)cX$;u?(8k798WR+xSaSgnVDn_FN z?aH+q`zYvuHB1*F>xsp-Z0CvXX^skMMI}W(QQ_;OY#6ZNVr!jd*}-Vwc+#DJ14FYhJ~0`k769irmNT-ekoZVkFh|-$Vejs&9Bw@D zzkiIS&~p`BGp3MS>RENiKA%NMDutpp{f`{)rl9hU^2zn*+>403hdkWeW2+w(mq+%X zrD~y%%J8?^{peWz;2f|~UFeu*!3wM(o-2q&52d_QU4Fxh;L+ommW8R8gL219trozZ zI8K#LT$BNQW7lI~w=b24i2~xshb!@(d|)Z>+Zfwgr2g%C)$d_|{sC&YtO-a>Yc!3W z%GAF7#X$QuOW3=3HGG_a_V(rR05$*ixCqhG*AML`t@@Y5>8g1A??WeKLfE2}cYApw z_W(+WG=YhIqNk06(lQYJ)5{}q#9>Dw`tSz+$MMXcbh)S1*dDd7l^Q(i)GAzdM(7|wG^jQIpHI!v(?!OI~*cr))i8{|j6KOb}FLEZ4RUlO~Q6yiZKks2Otg|-QP;fc= zxlt9qcL1MCGQAef?wl?+3fB)(U|C^Rj81=jS7Xgar$KjPDF4F%lO~^ ztJw*kn1wQ4S&u+%6R^_Pe?}z^NgNw1_dx7yuCGNEzJ}5w2%mb!KCEd4_MP@5F2D6m zBjewSY5tP&Ux8LP=t*lLu-CWL(<@?&&nBTT!0+{fNyeNgvW9-5kF+OkcPv4xjdj3w z5)81C4Gyf#-U5FSvy+GNKw)(t|4ZZK&r5c?4eq-2n zsSw+Cln`Ig&GbO}CB29YH?&dh*LpXg_E|-J1t4;S^~Uqzw@h;InwpJ>KSFKa9Mct1 zhRX+m)1~r!Ro=KB=f=lx^mN|--M2ePPC{M?1Xe|9Eop!slDhH}0*okWQHdAgDrueQ z4m$x6ia!+d{+8HI&Fpi}n*!n;xW{l&ayHWq(y&H~(00>n~XO zEff3eBQW>wHg)l7frVujmb-x0GTDhs5=VqD@z#TWj!-pwjH-#RS5L=3bxeJmv-ni1C3bX=d1V zN1pR0BJo)LLs!V77w59xWBX&TZieS^pas|as9Yw6Bf=PT%`dF6*F2s>)TWR_~2P?PPbmG%tc!l zORjzCkuPF!!OI;(GMPaHdmxEF?Py?NDhs?U{1~8xTDEz}=jxzzLx49rs%mNBqAuuh zCI=TX-W%!K?h86wio`hMPCS8ak&$g~l<_nqjdLM9EHb~+xTYi~sssLKwCN}>CrBJq z;ydE-bjyUuJA}LVu!jZwKi}9&4E6_csDA7hwsLTNQ#fV(c}W#|t0K&T<#e z_Qo?R^CQpa8dy#d*B(y&gD*e+Yb5$#X;9eB%n)R<$1^eiI#UJeXgZK_#1Gt?S?ecw zTU1%GOEgeb+;HZ;K?LD<=l|o{zk5epTs}uj8`$0a9HB~`hWCu5+lI{%4paMn6As2O zGpDpACJ-LZ9<+bF$!k8$$C7^yS{7qRL&MOt;pH-nTw?U}HolhtY~$rpXtw6duPFf= z;t%dmc{Kg(#$|rlbhfz8%&t_EKg zC%oZ_P@Y|_@SQdmp++2nt_rgw&<*d2*tY4?^;yS?7^?I60=|*`f}W=b-?}!k21q7S z&nDDw_*sfTVaQ{_Az}tlZKCJ%TthI0Kt`d?^PH3>x4hl;1%MWoQP28GYN*=+C_rA2 zPps6=vpzkh;_1M1vx--Ht<%e})0to~PP%xszdgx25xSe4zRUsI zfW_y#(9R|sWhNpqv0>(=|9@zfnBB_;KhlLE7X}RtI_j~WJ}{5uD)YtLQdETP>;n}) z0y|&+G)&9DWWXicB6qRifU~ka4=|D_Nq>9n%Gtu#=_`Tm9!9^tw4oahEfh zqamLxA9)*tB5GZ)E%N7ES25rcBFE=DALYQFTL(!3?h2_MP7;eD_}6e?efR-|rdrdy zM_5BplF%`Hyv)+nls{n<*pAOQ57p&;{{1@#?ri2+B@v!Ma+0|z1ujmHzwIwtl0UtI zwzz(fw{anQUpx&h+8fblIN|=|vSAkbuf81DZxHV@J!5*6oGBjso2vefd;bbAh>`5O z$ImlqG+sP37Xg_CxUh+Ouf-w~4Ch{15k8LDi3KxeRe?7i=tA_}h>Z_15&RG+XC<)e zs|CTeA}%ls>R3cRbOmYEWO-JYSa8c@A_POkO2<%Epz^q2xW9?LV%Br}2Pe=noGyU{!GT8BSd$xnbJ1&8i+W0->F>GM^` z$Mz;!I)d>~@xr^8+v#tVziEVoSxcr$9qm1~6)0FsK{|fS*KeJ9)yJX-?89&5vAO(K z!>IJVnQVTv5yOG|RPck56RqH@9S|D}J%2E1;Jx-TUg4r6<2l*IEx*OT-Ti+lRYac$ z@8rq*;1v_?#qWN}Fa;zMO&q|3Fyu6|_!Pv!G(!U_3UasW>qFDMV<=)eE{P zK1lB43}8_m4GV*Fyfl!=lk8nszR1X)zcIHGU$O$Ya;Azm+cYa1Lv$=kNU}FcW+j!M zrpEsAb5b>z$z?+zYA(R*mGo3r*UHPWx`rQqsq@}=gh2q#5ouZ zE|Eb4DsqQ@udHU(*fudT8m(a%A##<)#$(jbpqOL%NOb67DJgMuA-N|fr}x4XV{}`v z-IDB@(w%+Ur>rYrAxN>^cu=>VzOdnNvKpqWCkg9o2v9o!{50P2Xs|G1?T4;!N93CZ zlWk}(K&7nSPYagjsQ8Oo@J8d9q0MmsN|JX#X505MFb0bWK&3Seu90155B8Qn-ygHabewk)usQ4IYI!;aoNYL?r%0^2mBQYb#sM zz`d@#2DmR&OH;0`W5X2M^+C3gR*zJbwyC*sL*1!0WWgU@!}<4OA>*M<3yxqq`F%NH zVc=@BBQjd1e{Zir2(e?vd;!(gE7EB_+SAh=Hsq};(xIFlU9%h8bKZM#roSw?;?)mRJ9mt%-c{dZ#mb>|s&k_o`iT zp*>!%+>BVw8WNi)eMA~lF&Av&kKN1rli@?Y=Kfn%eCq~BiRTpo7QiySrsgO2`2%62 zRDDXVdtcg~IF9Q#iItw#G;D4SE*tVU6#%T0*$ee~MXAq$7^BwyTgKywNjCv+<6k5d z<~zr~Hu}})0Cvd0Em}r#!zb6X`<{yn4q%!<|9pV!<574D6Qh;eb??i|CS^u-q7rw2 zDIue~Um$cWa;+#2mXped_M@m`JK4{v0tX9nkN7u(2})|#1X9bFnuZaqM4x6P4Z%*Q zbZrT*2gyR&CbTZ~qPLTi3nGdCi8ttP6JtlqFD%HZIH1mw`>KYe5H7+1*+`GT)eZji zex=H{Hi;_`yO%~jn}F(p-DW53&i)j8=GzTF_NN4i%+zHQ;PFz8XIBsOUryg7%eqF6D!rQTgXfGJTJ?gbZE%*EHH^p&9=Pr`;6FK{J5u-@wjgY z>YQl#=z{N|J*ZFNAvd}>C!D8pO9mb4vdGx8vAKJpOs9%|l4N(W>JuT+ky9h3DPTQ(h6NP}EJV?s?Tog1E7LJb(tYUL z;{hRN1&qCCuG!T9q1W~0i+r58JyTyq@8iXwYk^v(e(9R!H3?rj0FJ}z)+>R<`YOB zL+<^K#k&f{VcUIhs?GM24@WW3t}>2MOR4LFR1Y6xfDjx4q#{3hY1XhGH>o*axkVh3 zeM~w8>JFkbNM$)Wl}ai(J2(-Sh`?STj`*3Qcf-Fqo4OlkgLNTfZ{BovvPqI1!a_aU zWT)%@gz?zrr<3gE+vODeD?KPsySitx3aBPB$rU?=p3kQ5c}e7t3oB+Ly3g@$zYklb z|2cGp-}>>ArFoKlSg!{i**TVA z3*qcc* zo)^|fG}Hk&E#Ms%fItebh2*yblZ>ENNHZ7UwbEOlc?C{vsGkl+cB70WeBWfQ9 zT+bL9cr-#||8Ka}Lz3_9wJgIKJfxP29{NHW*W;y@k0(t-RZl8DvrSh6?CJnd{SA{zMZv&P5BDU>Z|46yaBi);0jfiKkDt~ z0%Qy(n$NE)qOU4q_~`26p?@(b-JGSbyuLFU9BA2#mhc3V2FECLAufKtd1DFVf4<~W z{rLX)f8)X5CZNxQGc`5!0!Z3dAg;MNa{B66nEoQ@t555ZieeYP7m06$7g3Zwul;Pl zN*X-QxxJkir@22d6d0SMy%^e$AK~N36o~mD`y}xXFg0Vf^@_jo)qP63NdFhI5f@@^&@Kda%>kOV*^O!8o!-|+Z2L;oiNCnKoH7Bzjod|B;a5x7 z=S7prvoHXK;P5v9j23RrOlmjkLDd&8-Len-U;HQwT}rhfX#cI&qi>AdDG$&p)WRbD za^AC@SQvvH(@7XNCsP*87nckxp56UFlCgKqp8$a50mY~2^x!J;;fHJ7LoquQy>MKC z8MBya^>WDvt`z%1^kTSx#^jCx$#!GFAKu1-V1W$@_VdW&n|{(JKnlMJum`jtVm&A6 zO!^1B@Bb0B ziWu$lbhzc;NBf&{{`Jv`+bfd>c+}}*zkQ_OxLQu~=5)P3M>Oi-S3h`yo31T6G_-Z5 zAqLhI`x;WMF@j$C{-%S6Ie!L$u8zm(^4Ri~`Tcx$#r>%WA8xzO-*7LB@Yw{{@zl%X zzR#Ht_V{O*#n{_uoK}{)GzOp6EDU=BY;5E5*<=3c_b-dRR5Yt_GGov8y&bv%` zT2ruWtF=@a(*hf2Q>+3+Pm`F441|>gF&>k6W?Wd|NcBn0QYz5b-dkLF{zSFG!wS5w z%0Sb4;A0#+ko+QBiNZ-}Pn7Nw9lpEZnG3`g%FIpGtl2`>C-n&_mPFtJfRfPBou<%b z^>9%eP2e2RQ3$!vr$RkGn~#!R08`SYu<(MDo5r&wHM-Ep_SV23(yfPOdo;K-<SvniJ&dzt|WW9{qnMmLsTs zpQOMvc@+@B_(&?J1KI&K?roAsY+8|ny#?Z1%9^vZI-OeIbY&T*&;zoyN=(;L63|iM zFt>}ybbvSOGdP(zMALFith7r>FGt(?aUwPp&h-%}*=Su02AxJRYH)>FQ8o={zk|;{ z|9^yiWmuH$*0v%_Np}kjAT1!$DKT_+DGd_R4N}rD4Ba7}(hVXd-O}AHT?2f#dq4Z# zkNUmOdmQs)eh@R)z2aQwI@h`i7%;rAZd=^0u2Yee^Qtg*D)2;6Pqx*;=jZbk*TC{; zIR?9(_>|HbTDy=`q!{J?miwzxdt@!kdtl4*_$6?KgQwf9fHJd-_b{atH>*sC-uX|I zpI_h1UL$$N0GgeHDd^ak3%tIX6U(NVG*8+b+r2Ivdeq*yGdBKru@gl8=bAc(BA>!O zHm)R=X{|osVTsEzx*{( zmiu~O&%4`JXNZE8m$eJ$&?y5b+IvH6>wHJnvm)u#`*@1Nar-M02QFrG@TH8uvt4r@ zz>8G2db(0`^)Lck9GZ6Hhw=?2z7`2ha=w}<5hUZDl#}wrvf+Sz85ogLLWZ zs>-pbu|a@j1oL~|HAppiT~*=Hljd&}_yiSrU9Ok9nIe4xIlc9=DIaXuG zlfm_XDFMqTc-Ge(n7EA@&V!crYVe}3h5%yuY+H+;H8I7XgO`0j&}ire7uo|?&H(CU z7AcJGM#m$OnQOf0YomL+BCR_)4RqX_Jhfb$b?hMwtn2VEG4p^`&Ar^)vMZwb=M$Up zA!92>)`CEF3)5*l0BWl<$DD3UY{UPiC?Bh5FVKKBrQ{DD+}{&C!$bJbMeBR12p?3$ zM!Q3Gvp#?%k>N~+!njlNOa}=oeUZd)a1>c7LMZbQL!JwFJTMr{T5)zuXfJS113)<)9N)y@Vw7TqCRHcD1@SBp8Oko)) z@(uTy`oL)7S$=lUN3SxsBWHrcv&P(ao+tAIs`a$mgK{~o1PYl)ZK7CGJ2FGL36PbT!0Imdz{U&p3zIpGnX)#J^yNp;t0Se_adH>-7;y=7_K0H9_ zxrEqMxgXX9E_hrR6b5b{6H%0F6ebX+psL$%ID~Mj1};(g#&CPBXGni5+O5ae9j{+w z07(-mdyzrnAz}WI;!s{!<8F`Mm5h)L)2)JS5w@0r36URXw~;87Sls28p^x85QdT_B z*HFN{^n2%s(&IuV9bW?SBGDDrdeNHwE-%8$?Do8*BhdM1DC>u3?Yl8w9-HBhCZ3#; zcN&Fy@1Pb4cTBIQKWM#_*Ly>uPeB-pqglK~CL2ItwaeIHX01Q<-&1-37eK8bD#AuR zi`=1o{Hj^}tXRD31fVTH%k!u_`bRTWfajwiYzz|+CCuIKRA~vG5wB|s(NlB}wJLwqN z_3#7_Cdbg1RpemXJPO4spV2|7r`Pd&X$Y)0x~y+QD0_3!J`{@8t=a1Nj$5wbMuWM| zi$)C>CBkI)Wp2r{|qXZ>P&Oz;-KvXRM&Z^dc@T1_~K zW4@4Lt+XTp9C)Dz|Le;_&_@W|SV4~AMzY! zQq`Lcy)WB@GT%4KC1^V~xphT?r-5sG{5r$w1hMleDH7SKF2vuWz%@xthg3|cFvF`g zZK>T}=Zx1WzAn_)g5sx#gj8pla0iDLt0tK?H_>2^B|dg6nv9XQo!OaKKVBdXa^H-d zOc2hMpr_DOFbpR!&3U6!V^RG^Q3{p#d;DrlOvkMWd^55$YMEJAY$FPV9#53cvdIUj zzZ+EnB2F2kU)3&{7fg+_N_@H!)k5z#bo_p$H;n5U2t{KV`9E&@KmPjnHwxzPzz`-` z&zQZ7-RJRgg++xS1$}F`M~QW3TGDXulOoJ%_qa%vovLX`ZLvtkatZr}%4`8QicGLV zR9>vCcO`fR!S#{xH`2r{_Fv-`WXg6$@#c)xuC)|zN+L!3Tk!Q+d8PmosbDKuvs=@- zgTC>NrNuFHlC#^W+uK3-zdpKuKUHM#o9znYtfW|6LIxxM zq`{{mb}ypym72^73G#St-)S)j95^^Ak+LKYE`!X+j<{S)&9NtgN|?qr8$G9MZvDV@ zA7L&TY-*tB_CN`CcH~??21Fcxp>mX-m73}~gJ{&CTISAQ?2H6HL>X*?s|Qu0&m^FA zIRfj)QlNAu$st(rkZF;{wbP$5PFD|jSoF~lSaarErQ&s(vbKTL^S%6y3;DD z+DI{PJHalZV6`nKMQ_G|PgrTo0{a9DYOAW@pFh~xw zX3}kddR@9wFlj5ASeHw#eyke6BMuR}8Er*QkbCiW+oz8e8bR#gJBph`MCv36#J&(U ziqiPD{L%`^>I#1lC(up=oNKo9^q;Ln15OIu#ZdzJszE_D?m&YD^-C0uT@h36gqe2? zd`r#6cIM$ZBOOb8S5q&nt|$vzqXC6R5T+%=US?GI8`)j{2qNoUqOpDK(}akV46&@4 z>Z&NV6l|QT|jW0KcVD+;DAMt9JsUhDe69vc*YdK2i_T=l`v}KN|$@i z#*J4i&rT7f{M{WVBr=`@0KBia_+y_IGz2j5NNjmh6lz{sZ4vFe0QSzesTfc?N-n>D zPJVG8aG|!k3^r_P-w-)cd;Hf7XcTi?MpRh6iEP>J^0qrtBjh~0Pd6-xcqjyhjF4U% zkJC^PF6v(2I1zq%;xi6!5dyIUGFQHG_p7N~Gtp%U6>0Y)D2;)+I3*DGWbaV&T|_zDt~<#YVA^!OYZ z3BD3?FT|WgPs^puX6DMU>d|f`@X&e`NCW`(Z0yW;Wh;bR2F6Q!eQ7=N#K#gTrbO#C zkaAzl6LDIAWhc#zW>l?UKTgV2fH;T~#$i4Oxm@ItB~n}!M=f-tCqVyOV0iW#u9F&c zGNB_fh->RoyWW|qV$6efkdyptQod7{a%-~w5 zmVCA$aBPHiLIM#38jzWZ`l~xBbR&+FP$ZU}O3|??7sv$$ZS$tYxm-H-)dOXCw->|v z#=qOp@9!1F;KLwc-R!+IhR@@zdb1VA63xNP8`O4JLG7oqq$r~)cSpG?>HTtHw3BuX z@RFHDfbl%@Y?+M z1{KvNxaH^@U&}6HFN&$1$X_A$)IkLyytG%Y57a;>wx1sVc1oLw<6sI+`lv)K@5fj# zj$FiL7MH6|{aE;B2s@sEitJnQ>)!q?qx^xH^0DC3AYl?QJ2dJmIGe~lolU1ItflK9 z-dv&?+m57ixmttwkHjlG9k1TI(Fg82`bKQ8Y1$7Y*(o#XmhR(fGz5A_2?HO_-{|3U z9pPWU^3HRg6=3I0A=9mpi$S@Lp^o%LHMK|J*-cL=a9+0=OK`t_nZGAl;JtzZoDU={ zRLV12QG&2N6hpZMEV^XpDY}xD#gz=*Ciq7yUyYQH`_5*b_mMrjIRxaE89`*uZMc3vKs=unJZON5 zZW^RNn2vn~5}AEw(bu{qq0OaynatT8V&u3x3FnORPnNIxdTB_oGsH+q$QW0>OKN-b zsz4^%M%V2)4a5kJFINC@Z{XDCR>K{s8*M#X$`-d5AxkCRq1+@+34_Qu%f=F)9+lla z6ZXEseCTf^KwtIyM1uLOfDG|||5m^K z1!UQ0a^NmQu#a+v9kQsV&mu^JibmChxK-9znk)@?zNfI1?M?&IhP0-w=!3OW)H4U@ z?VJKWZ6u-y8#)5fAJJL?jzbxYr{qB$+;5pw0}FjZmtqdXfa0EV2O9kT!@ov}qz^dI za;6DoH4)?D7_YGri)I-K4j~K0gy_9Qxpp)Pl$oGv-!{_7Z;o0=xk(w?99DWN;I8>p zYqMTAWrBezqxZ54u}Y%XW_FEADJoyqp-mJg5* zdg}tYQt1EAmE=IKEHJO2W%oTC?WM&$yG;l;{+LF{pPR$zggEgK<3pR?#t& zY^cY=PPkhgM>>_gea+J?xh|By?Y`2u<)#tU|KYPM*NbHMHsRt)5F z#p(EFw!32le+YwfZ6~7ow2n$Dy*-Z!OXyfG4(hby<;GidwTA-#u?|>!{Q*Ev;M*8} z&2;jZJC}G`B$R?`sG(kmqKm5+dj`=$u6ZAi2xYk$pNbT2jH%!x-S(Qlzfpt6zm6}( z(iD8QA=w(lJrK!Hq(SSU>!Y_}blCs=zfseXaJ{ zSchUe{-`hOl|IK6BYIio zk!0G@$G(uEEwPw9b{i8Hr{qpixIL9gT5Yo!#}hPBuVFS;Ep0ku^r@74g0V{u@X*yy zN>kheskI++1@4~m^X=1V)mXZAb@DoErAG+Bp7EHqwvL!2TgTW6g8o;GEQIAlZ6L<> zot=<1=A{h7Ye98&PZ@c`e2x4bIoF?|IGBMaLWBML_Boc}R?4LcKT3;H90En6-&303 z4-+Rr$QHS$>PzS$NA(vOV*+4ACc%-5+E{hE`=cyU0W-E2TF+;$YK_`+#2yVU`*x;J zDK|`EJw+U6T<3^9r(Zk^#6lfWl&g{o0hB4bRP<)*9(Ez^_NI6B6m~j!Otv5N`aF*T zK?iI#`7YX-3Fmi1`cFp8Z-kG7QPkAn5YfjeO47yhOFpmYQ5%1MY$YO-v}Xx>70cub zLg{MKGeP_Qj)_+=+N5w-*g;!2B`w%>gk)ict$~sdKd5gaz>t||wmyI8(Hb|6e*L(w zv6tMfYNd>qWHfVE1cyk`fUTUmbCNzKr>=8--nS0-{ajHNdi=2))Hf%{wJ9nb#L*e3 zw8F^|-JsWC6NN9opR|uJcD|zs8^hDFIPZ}M0qgV!92R6xSi=Xma_7BJoT<@tR|iCh#r^zlj7*VpZETO`Q5Yeuc(JEN&S>d7|UG63|8 z&m5AB+YiMCiJAX-%&71&z{pN8Mr8SWsgS%q$%QOTm7G)i z!rs#pV65K?^el?Wrx`Ti#HQ1g*Q4($AbYFc_wjN(mGbZl1^f}2ZR)yM zN0Uz76~=wrP=>%^Vw;xaqY~?u>8|l|PhPDCOTq#D9}KsbV=RPc>zmh~Dbz(|;xL&& zK0vK_w zGpDB-AJ^coPtevIf5Fe!O2j5$()=B{my7IBz_-qs!OdwW%N>Y^%DFhe((wK-q(a{H zbIH)L50HMJhrdTcHLT|XKy7)AMfsu|la&fBb^j(c&IQ9!TE{~$aNO*U-0xjMXT$FI zBm_b8cYQ#QiFdz#b};xtv%JO^k4a0$eschb^@Dlbf-uogFYT0s!zZt%^BH7G+!;z1 zGn;prwTMM3vOLWylBTqdLOlip9&Hae3xKD~?DNhFhU!g+^)IFZzP}qwk`mEYxvRN! zPP#h3IfY5HkACMl|Mq$-j`&Fq3A!*~i$*~GLR~2g|7$3J0IvfFGyWRwuJ?Rlu{Dt6fF#pXkl-fH%3z(qPj1+WWv1&Yv>q4M%hLgT~Q{$5) z32yMG(+-$gV0+Gxx7pLV2eETtVddV))*RDnv*IE{6?aehV7Noll08&3BEsexdY5{` zgz#AAS2X?*BmW7U7!#;ZO|%O(u1$N5igTZJgly`YzUX`;W>jdPivcaa3=n%UO=9l_ zOH6aUGfq11us0Vop08c}m^`-BvN6S_P8_oW-qjC^h;47jU42$QT#c7Jet6p z^sw}JSjlW=`(gIICnsG#RJnz;yOQmOE)b#}yk(s5$ zP9Yt3w*6@*RH<`CHhb>gvo?*m{O3#j^)X`U7!UQqUBXN>(a2N`>}+aMtp|q@Z+U>o z#KxW%xv5TV@l#07*yRgnxe0452@d^m|U0BSu=CKEQ2Zz44`=T)a2?;6njjnHxl zqVL~(@1ND04WHFw*ia`pJgwW}+wnX%mt4*|dJR^4i7qyXy{y`C&I`-#*rc-2zxqhNgbvb%q(g>g}PW8ys zmO5wcOy%p2;l_ZPtJM8o*9uW%E+`uKQS@1I>?C)>1BjCoy01y=#ej6^3^qJNjsV6Mu55j?@_HWZ5Sa% zO|caj@lc1Ro}Qe#9%q=#L}lG4{q)N1uP1|HC~XLE&mg`4k3qNe4F31(49&;u5yIFh zVHq#k;@q2Cw3m*f1V9)|CI9xB!{$z;-f?5dev|r~3kJD0U;Dg^wTfsYCuB`bKcS?? zmXjp%HFoSgt}vp&3n16LPA0Dv`JOJL{^tWyysB#&?lmzfJ!^0Z$JrH}??o*d+M9{F{lH>I} z`D>IXnNzpxyJ-LxFx+6Za|vkd5s(GUZT={ezoV+v2`c(Bt0{1?1+tiNNUeLXCg4>{ z?&TrBVzc=Xz4U&hAD?}JjeU;X3M0P=9-xtmBKZz}kyZuMXxUzt!BLsVz;CMM3x!~%ILU)*=iJjtc69O!UB8-$rQK-WN(O?}DOUupCO z6T=J}b6)&WVxd!wT>ti4yeBAF(FQe*)xJGkWV-)~K-b)JcD@lnR-*|(`PFD2AgVm^ zS;2yuN8vB#*S<!=b3IbbNWiS8i@}r5G@B2R(FILCFz^Q#~K?u7)4f^ou`l+ z@`klIB9hvDX(=z4NrjcL-e(epk5CtXjmm)E)s<-e_36makAva|JqZJQp4Pt>)H(JaaW@sNf&=6g3o z+R@4T1=!=4>aZKtDOBQD5D#9&uKmZ09%?Gmybo!8Hjnq6?bmd?5^F#7GW43Smg<^C zhc}M8tvE9$`>A`a-CP~qkedyn3o1%VB2`<>ir*brH`vxnd7dQJ&fj_sqQ6w1Yll5< zRa)%|59*!+z`Q03%9Zm~Ah~zup~+BYddIFjI|Yeltsb$(q&2^0WmVNnVn)Jswa#4$ zKzq^+(VyL9(E)KWXLq);L}_r;igR2LkdN#_mrNV`Q{T34>uun@2aG^Y`?KW9HK_ zF=}RvcS6rPGr#^DGDkvbbi-23rVzAqjRZG4dVe>i4?+v@7AX*!+u#jYX0GgRIohtF z+>zII$x-n;z6ai0BOSOy zb8va5TuFd>P=gM~_I7(u1f_@m-5|_lxlJN{V}3Ae5zpPKb|lx4q1Jq_=OO}hhi6WM zU}O5icxLS7k&nb^?%~Pge8HqSzgewrgGAht{494jJRbjk)y3P6tjr(fo7TJ|w<~%m zo+(~(f^PSpq-L?`67yC8mFiF%>=Kzg|tR7*FCwMbXyG%LBilgR%0AqM6X5)sEqSKe`XdsCPQ!IX5ebSZ~jz*V^d7j78S|bwogUNcX1my^SVRXOYOOZk9RAnR#PNPnI*aUMrM$&oX zRxB%ntTf~&i$sSjrlyw7Xv=)`{Sit|z_IMushS@_E79|D6>d9ZxeoT!kMtBb8fDcw z9Pz8M6R%U}R0x%5=lizz66gT7=FYlQ`DI&`;gRXXvu7abC3wzXO-x9aLZQ#!2$q*7 zP=&~7CMB7GhM;-e>rD{i?Zc8XwWmZH4uYwtFAqk1n_$5aBcDvrHhrW#Kz|U{xbo>l@MCsfQs0z=hY@%%LY~-g|dJ zf`e_dwrH)ZWCjmSn7eyuNvH#Oo9K0Dx`zyKOFYr{F(voy4+zKazuK>HCJr6gC+eKB zKyg-=aJQ@*ue4^2yZ4*74qNYqofmk6$?#S_Sw<|FriJ1^k9s5%BDQjHv zVouI|zlFV-Zxyw{Wyz5ceITnl89^Tt^TX|7g+Ol|9&H4X7eA@n@M7f- zHc0(^SKt$Wkw-JEt_zp~N( zI3Yh*T6N*sB6lDAya_8M2I>uyF{saux)m0@mb75&-Mg}=g zn+?{b8V-HTqh^{MDa-6)4_sgc_**-~;@Q&D#G6)+0mvk*%VPt1#Tg5+Z1p_PVjtWk zZ!FYq_*(itq?-%opT<40YQg;)PtW;_eFZJLoRD=I8iP&0}bA9SEY?GXoL_hrs z?X2apcdAJyMIF5y?Q`Gb|d^4 z5JzN+vi<5n4-m6KUkobPhZ_Aa`-CLBzk5%okfphp8mS(w_o)vTnCi#aJ+{V+;(z(p zA=_qDXv7iO^BY zxe$lFh0$Yo{)P?szt7@YW*T3b;Uw!6V^&-LbsQ!xB}a97a>5iBB<;+gE743{$yDT~{=@LzjJ57!8bA4QV7)fw*ihxx#hY z;B(APRI6G%E0{XadhzHcom>)FNazdy2O07$^a09OIl)@}-q!BgMJI;(LXGII@O2H? zW9|i_lf`t;C@v=;d(i0Jx~DoOfi|8&$RARHR@szTjg6ISG${>*JFaDE8D@~7{@n?$ z!kGkDK(72G-a7&n*~RosdFh5TT(sN|yJO~~eTCCnDK)D!AbFuV^;?#<%R`8TMq+H- z#@=yW3PgO`itkc~hp;Vya#K<85G@`GAzAnjjcWjPOMYROZ1y&rns4%7-iKLQr# zppS{qzmf^t1jMPm-1kSDN<15D_CbrFrx9YUOlbYzs%3Z8Fv)qz2%HhDYPQ9rriyJ^ z^V%bL*;mkcUEcXe?9XDhE_Zs42FqF3zr`SRU!z!NbFGaJI&!|#h9SHBt8lL!&_5>o z1bKYmeaTAXG@DRGooKUp#*5WjezSjJZxCQ-jd_=va5w(CV^)@iR8piO+ruk5v9{$B zz^k%1mt+9a9dA&TPCA|%i?V}}%!$m&yNW$-zG&-?a!FbByDhIz8nlKF6ty0y)x&P$c9Iu_g~={@=(Zo1t6p7W_J@~A zim-8ZS6|(6jx#KJvhU7T4M`r{^s=KX*OuPx0&vt*{e`)BH#9m!6b&O3&_5(;fDjR-Im&@9neAoxr5G_0vK3sr{4{JqEmeUExI3 zv3{)&;75^rT%OkJBtl%xJENKi&Z1aj1o~daVp{AFxT-gJZE7fqX|C|DT+ps*Z~>ao)l{x zA-n0cF}(yT-~yl$E_cLdgvFxqTvv&X^a^;-r@Ey%!R@#7MJ(*70g9Hb*vUJ(T22|P z*vCbvu`xk5N1Y_~z|~gvgKbtnlKp8@r)kZS7|M1!ig=CPJ`ZoMrQwg}-Cyz5^wAJI z=A5{tiXf2Jm0gHamLZ?t1*U&ftnz*{%BVV(pnM?1!*&2us zkurn6oP2Y@NVYq_tHN{n!870M_S#2VZ<9p>j4pWn5@6^HIu_COj%>c_wl^=L)`D|I zD*9OJKge-yytgQ~wjaCwS?xP7+y|95AH7*b^uXs7{_?QOo~0>8;BqoAxCge-wlh(* zJ%4c@n@~B+Ja0aiTC4EcP1Ar9&J`O>4O(4MvZt1JQe~Sy^|K>;H3?sm(C463uAqD# zDVmZEIqeVXw+yNF6()@=E#sH_!g@=>LAcM}9#B&gMkBVHh{gIb72VtD18$E2M%(Yg zj6B3~K<}vX(L6SxehXo&@GFWaoL`M9*Rxf4%x5 z*m+^&C^PsI)!mNW=b+%tM9?VjZW#9V@f|)vo9Zav=72ufG-Xmhqd=gE@LxJ~D;{0W!}_H6EwS@1v`}bW~u1wt;4NjNC|>*c?@Dz=+tB68PY^zLQWYNTD5A zmA%GbU=iqziC*aVnOeJz&d-YJO7kHFq4Kv|uJz)Ua_yd<9IfM`S2FnRf>Xpz2dSYo zxfH@dt+USamDP#zQewA89lGZvMsGW2%lJtdkbA_yYV-DJ2W1!{Yzs+tf&A!bQf`xJ zd1*p^%)7~Tqp|UfL_^Il{g@kfx;|^yC?g>m@@Cr}OF7`{I$42s70NAU@-bgi0?)Wf z;DmI?^C-5wUEiZkbG+7hXi6i+{^(FTJAu*qjNdDwl{#%Thn3+l2OB!?vTy9LVk^;w zx_vbo+~cy|Ko@@D4HMQA^ffbHcUOh!78q_q#THU>TwgX->_;PhL&a2F5Wypk)wfV!lA54PdrYY6 zMT%eYbAQO*I-$*Q=c7+W0geY%0?j`<){1M{xel`!w!%3VQFF~o{hsK6o8<&Ys!lj^ z1gMAbX{!*vI`Bb4lY8+^s$T3tfyRo-Jpv2Hv4sx z54*)5eLb1JDO3C;j!IRo0+%l%DlOc0*mCcKCa_VJv8{XMdcRYtoL^NnenQLPLM^7J z%joghEUvTCR>HB>D|^L7vvt8vy06Za_Uefqze)(~>yeDtCItvZ`Sowa;{*6(sxQ9D z_BVQIVQm(hxXD7r2&6SjpdPrE`$C}!gJ5+{7&tI%+rN#6=Z{aIr>LZ1b z$;l*Q1|CqcTxZ*_D5rLqi7ZLdf>tSoOO;;)6jZp1RnTKYk1RzDD)u%~R-7>4e#ZuU zh&X`|%TB3Jvs$}Sbzz(sPGTf-H4(v~(bU5l2sitjA7d7WjG+ckC}{nS`l&Arr>qRO z?gGg}aR@vns2waK4fzDiwkpRK0x`=%a0M2;SFgg?*9c+`u5dp`6V95?c`&E+%ya=z2JyLJm8L`Wrzq>LMT z)iXD+)lH2x39TA;AKFsDKF#Y+kFZ`%0wGINgWPX(y3PE~c(aK| zI}n~W_@t%ZC7C01{p?8{5W8y+_iyzwEO*`>+@Gw|<{Jh&MG;8?8Q!}*s6=mTpbq?S z|BbNDMKfA3sr#GzlkK^*kxd(=l0(ybAp}xV+?=D7yTbtUDC^E2*HIl&v^UHB_{!GO zMD-NQV6C^|wV;iXU}aJaXik>jAKJDx@eg90p3L<;=b>KKVt7$NCfEpTm03RzNF{%$ z4(^H_*CuKy2G{gUf}8!V*uwM&+HDFM1vwMSXbJ6+E6m-DwrV+Ya2Iv`9liwHdjV>d zlxN8pP*zrw--I*I6u99nf*~>tt*}rUnv@+0q<$l`^y0;=SYd#Mf%s||cFE@Q9wy=x zI7%+sZ~58}{(wos`FqsRuI=AD&2J*wkXVC|cq?$Bxb1*j_NjwwfMR;ay7rNu-A3;$ zir49ev}RcxF3wWP!AgyO%2jXlc&6v`n@Hiwq129}m2F^O~sr)=xd^Ed#@>uj*@2XA)ZRVcP;)W9*Od5rEjO3r4`AZ0*B zvoM7ss3e81ru;63&u6XIjdEXU64b0m+=xRj%Uv$Whs0t3dJIP&S`TG`RyI+hJx}+X zE6SD)0y(+ltYaSO)=v=NHTjStQToxV-|KChj{s*8u&j}&x)NZ-m!+y8*_Yy<>80}V zs7SLncXB=|ATdJ~b*pJ&mf|`h$;@1Ns1u0$Q%a?F_B_+VzgY9N12ZGLT z5;CC-3#9R96p2`_l6;uTys%JkHCl}kgNC(?zT?MSX008G+KI;uP*<)B>#(|2vZTu| zR8d}j2*J2La;NGbX{^-nzbO1DqC_4!?xHdsYTA_h!wbD|%ZY>%pxLoOGN;}mQgI;w z^B?4@)mIqQIhiM83m#dsr81Ayb!J;#GYlhhC!goP^8p8QwHbg4LP)5(Wis4p1#k$N z7FEaS>FLdeZX<)|4cM&Rdq5PL%(LAzRslSAQ;rUo6gLtF9I>nCyxo{6!Cxh6L@JWY zT74q~uRp&}jM>lLr(SfqvejyReG}u^F1%n7Q%m9)3H*uCLvhuX4QiwwJIqJN{ItQ_ z4NlvPwMdTj{#J-RUqy%is9j-*pO>C!Yj1RargxJ7I zZF~Hh33+PAl(|%SF5wxFL(?+3%4tjqh=E0igVdmH7h-=tgfS@Sor4QnF1JeF&cY0o z)|@*xk?rdrP9X_zQ3dG_`BH_8>2u|kLu!~VHLi$YH9n+mRbw&owWnZuqkSxm5>LiI zQrnt9w42NoJf#acU!R;49cua^mHj=nc0mY%{Bz`H>&8dz?ee^|3y(RMcU{WkrTcD} z-nkL8;*p<@E+ih)m&xPLUOJxE9`ylt7(cZ~;{t}z+z)aH9i~+|pRD(D=qvX1*Didr zzt*$fdE8~isV^--M$|fC2#MZy?ENG^26^i&I_jS02B*vMBP*ztheTahFeS}}rs1)1 zO_5&b0Kd6=U)>DgJwOd56@Ru%sxB}R4+1qhpT4-hSv;57!^a2Dq`lOpn7(ZMh;7py zH4p`id;LgfQ3%D`HBkA+KCZSn#rK=G%|Ng6r{edQOz-6Ks`D9xpS z^p0!z4_%5B?PrS#3jl24o}Rmt8*_Y5YupzF&`HMi*{|{6H{pWRc2F+2wUo* zLljl6K*62?26THnFU=Znq#ABvrkZ+1IRa}Wv}`)6$KZMPZvfc{ECg$Hh|;9ETdcoS zk1SI>Q~H=gPhH{?V1!0%EKY(ZMT(72EB&An?c9_Sgo4M2V)h!02l;k8vkQ|pT>PBG zWBzo1+*7;k{pfe6rrWnb>!^9ok_e~<36k&DVvagyuj+q#fkA@(i+hg%qYJ^)=ctXh z2N@~O#+cwz39NhJN6guJdFcu7G|Lu&MyfJU=J1nqMqm^f%rmQX(|`2qbYLt*A+HaL z{mMbZfBAf#jqQ3WoYawhzja7Y&kYJG26Ph&_b5Y0c4HhNir`npBgVzvsa!T*px{Va*DIf^# z>6+(GA$nyAQTBG|jSvE4`ppwx4O_M(YWjPCEfr`R9Uq}6i3fnV+E@=PWg@B#h`!1N&~BcO9%h^@()iDehs-otk@7=Hu^lM+qxL*Ko%CX+^mlTlYM1)dgf5yfpA$x zkbW}1qj)h4UuDd3ibZxLPgS}YY{G49L+UbKfI|y%TTcuu(4ItX_O)Gk#FF_Xye>BM z-&yJr;}vobw1xt82mjj5dPq5_c8H%cB|ZU z_`W5XlyJK*axr5R3R@U=-KpPpSa)ovthQ-7XX81lqv8idretW-`ON=u5j)Ja$409M zC?XXf&`SS^F7@zgaj_$=D}9!So(YVUC@mk(zBiK7$mJ$1C`+aoF(EPDc?M&sx*jt! zfmVsDDk#mTqqhxpGj+-ul^1h+t}|&apn+rUsUH)f#(s*@8{(LEYW{`e;M|c}K&up; zL=SXyygx35^$XkQe?Fn`4Z_g^cll9=+t5JYsC=8~CJGvQWmf`GAh7g!{K{-dFlp%=`sVRYU{@onuWBAg;RiR${eW3 zB4n@LZ-kB;%x~z0+1JaflGZLbpprUH`7FHu3&NoSv5nZ}Ou;}=Qk9gJ#GYXOJc|JI1*IRU_wM3NS8BI5X&wCPNr1{u!1ZSRM^&YDD^RtS>vqOQc>&!$ytDoJ zv6I)}jb%vq4i>bNpEj$KA%*sU16`!z>ya4suU`q!+pLmLyUH^w5XM>6XUXa$h*)f%Q29_s!tk>1Dw*f$HfP zTvXCF?~eschX)NXp|NGg4>iqSsQx}4V)5L^&A_o@)UBw<>YPIqyz#BE%AEiEThIQn zi&?=R{`$B684|be#Axp(8&vxgtOu+F0DY-Jo9JcT`bS}hy{JI{dDq(Ln&#E7iyl1e zO05K5@hkcb~sAl^VyX}^IFf_*jis#!HX%-j6tQWuSvD;YT6<& zVAXuI(bzEy`iTBB|E|npKvBa#w1pU9g8mS83n^l2w0JyDb!__(Ls_w3bA`gs^%e&h zx6)YX`zZvLq2RkY6-=jH&<1$!+@96L4+)G>3U?2^^g~u$^(H!^Vd0d}vd4x|j2@R3q%9Bi{>wH{SHNH341M)0Mt^ z{Oz7a6A!bMtsp^j;(nk@L)`41N+2#i6!|0eDTTq(MI_J{#0mX7}84+W7d)fdW& zv7vp5bk950mGRmcJNBfX?a@IV*(Q<$_Ze>dG4IyPnUh9TyyzqRh_9aWBvbX+i2g>! z$o8GD8L^ZDSygmiU9BPZaE)B1>g5)(iO42ygx=iSrO(i5 z`FCu6tASxpXA5#O&&8dUxr$9^Vi>o0=ZyFYRisSCeA?&VCZj@9A9&B_Wb0|h-nZUn z;X}=X<2_+9uS42n#(1i7?8T&S^L0L9Ro=Z@IW_Ga`dfv=&yZ^zz zMj022E@@iTmY7HCAE~r~tk}=J1Sx~;1)J(+7nPEe#jsD7f3nWKy_oK+3Y~D-yp7B^ zJ(M=gySSE)9C@dDzaxpZHyVD)I>TkFE z%1o){Tt8V8kA8~o&b`eV2c)7H-rPI0hnt}9Gj=Dk=Dpdx6g1MH810`;)NyPPw(oL} zkLg^iX=AB|*fce@tY|oaJpia7+ra$AQ#6-~7wiv*cGm;lwi0B6x%&AFB#T&cfII3p zxwb7uz%)IIS2Isms31xcUw)fZ&-jj&FR?BnQ`69UQ09c#Qw7I};k$j-5d-Px@&h?? zSO;rWjmr-!0Tq&+7vAR!ezpXO}fGe?-@!AT?GpmkInnfc`MO zjk*3pJ!k;x`Pmoc0T?o0yN#KfV&$L064^$L@QEVzG3FZ*;l4PgNSUMIM;AGYR3AlQ zS3G~g&ju_4n^kT==~o8ZcMi|9z2M)wskMqe?}cC$K0jP)UP0h<@<4Rpk^4?&ulT7|lni zfm_t7rH5QSp&MT$aozb?akvx3&)9>h$yDDZV{52v^Ni5 z0CmFxxudXpat@Pi!3()p9fI?(4&De6LuWPZC_~vVznzBTCF-o@WvhPuPjB;aq9@RK zO!XS$Z2{If>OeNR^fmc_N0gNGtqqL` z7*AO2pIvDRshE-B)2jTg>|*~lvuzwp&I?6OZ%&J)w%NmmO_ks4&`TrKW4RQ zzQ#GKu86b@FzS4<`9Ts2+4DC<`;`1dLY)ZZx?X+Z>(Z*cpuO(@W9+TtqFUGf;f`6FIQJEvk`-hVr6qz2!XZW;tw0BA9K*MeCqM0FA)f-EJbf=nWHHr^&} zQz&3YnVzhHb_U#03`#v`x@9-})B6)PaT`*G%S*TkbC!wT+YV0axM#}yp=jG&?4J9L zF^hh&U-g@eJw2Xw9ZJRl^6RA5E)h>Xj*77EpLR(**(4#z$gHO+)QSs74)&KH)b|o# z-N069!)hwk{PwbH>8lOzd>F7Q!5eqI1vo5+9x^AEhPS#f)&}#%5ATFeli{Z!ytGYS z%5K7Y4a!eM9$(K{G>ea8%Lxf?fB)F>seDzQ?{ORGIC_yW0g_D7E8b^0D4^t|6<0O( z8>Yw4X7*HM>!$Wc<F$HD>5xa9#_6UK5AIn9_)8qeq7p1U95=bT2LmBeY~5b zJ}2_sRO%ihl`#n)m^n6*@1zpS9@A=sedUT)#F-m>@tW81 zyX>%fa{3KW*so6cwz%uGLJi|Ex9Z-mKyO_lrG0&0-j(!MmRPx@E&U5y*12OL%p!ZBSd3@ zX?o1mitpF4s7zk@nvZ7Mk#D`?q|f2)WBmb3Ii&RquG&?w&i3r--=&yC@BQ0OA3tT^ zkaO%cv+4rVAn9JWmkp0=+x(Z3q|S~L*J}qR2F>f`&u(Ibecf7dvXk}Uw|k_XQDUD_ zi_~|qN?P|Ze)5%aG)?GyZT4QK)?Nso0x4J2{+M(27;kaIIn7?p*OjrmKEZK53akR> zI<>NaR1e;QDh>SrwS~5fydOBOd@WD|K08*D6@mX>=gLwwd z&+$jZ;GQ#igI%^q)f9e|qoI~uRl(T8qWz3zhl-pA%}?I87Ys_Isi!2Y)EX>F-us;Y z*tp<1e7kU0gq7ooK++S-Z#9x&V~;9;eTad%JpROvV(o#h%K=SMi8_wo;G`8CmI|R6 zG9@RlGw+<#n!A!9%Sk|V^X&d?^$;rdmk4ViqcH*uCz8bi%r+6-?|uy2jDR}=u}s?X z51RIG%6Y8;%@sVEZWY(JyOw^S6y3J$&u40y|1FTT;l5OiOE>zhS1&8m4!VUwHTNUe=C>+6<~Fh-Ik2u#%IT#^8)uKGU}qUwo`$ z#MtHc`5SWHhg&U6IHNps5ogPw$W9%rQ)Y&qWPg0L3tDko7I&Mz6R&`d$x@clPP>Q6 z(@XFcUeO{_VcHb?n90^LfKGtZCV3~(`>-EB2h1MI>CuQ!?UyhnJ_FhNHkV>hBQ*k1 z>cuBor(>Qi28BkBc{-SQpcuN5+1UddGY%Bq545!Sle zc<=ou4)ItaQdOWij+#m(sh-Pl(vW%r0kkb-s%`W znK|_@rLF`GXCAW8_}Dfb9CL3_=H*P7Qy2OQVgQ|>AI-oK1omcyuhPNk57p}mJJ z;e3@KAY7q?^v$UO5S8sFgiC*+USv9uZ$s*cxKk_@n=6irtUtY-06znlX9MItS0?MS z-I$%T2R=H!wko@4J5p8F3W05Y6u>46!fn0b_*w0po|g-Kg>JF)=b#2}wpBh}&>vaK z;^BQ zulE8gfxJ(jvNtxzO^Nyd##|4R&sCX8^tJlWT-ormUlI>W#jP9k**;VuCpdULGH6N} z_nGf(fAD2>;|k@?gl5x~;y0#wQ1)e`wGi|J2PfXvQ2oYA-$UZ`q0Sd5zfaUC#vuoC z1hwwR<}>WY25U)XofA8r-yh6cI(XJ2Ex{0CieLuTcVW(9O%^gEcdkw2jTk-Z?$ExO zjXTm3+9i_l`ZoU^d{#j`37c9euFFY_(!=H8;>OpwN-&HM2BrNmCmU%^)}^_toGwLR z{q`z;>|?amJbE}N3|&hAdpU_D?UBh17-Ki2BKn0 z?Tu=?vGt0hgEZ~YK9NIBfSAUaiefBI6-3hzcGc~_i~@us?|cV!KdG%&&9@Xr9xk79BaerRs|bn^Sr5o%XldhrCQ#vWuK)QF=rKdNO3!Q{OlvlIrpces;s&S*eUD z08T3vSe#^3awQzKWJ5Sdy=7;o36mhX6NO?Le~hwK?#)07`b!b%vKMOv6yC}_;Ej`( zaXbmYDQ0vTR}-~p6Ea(5_g2nsC##LCoLqb$Wk^Rl;dqfwxus`xqX;;Bp@+H>&b{MF z&FvTG50aeB$VQ<9W=hk2e75)rY_pxd;Ya*`>I4KN++aPPfjAq%|$$)h?NbwGyd8?9G1U)-^kvh zr!wA(!3?lKSF`8%z(BAkPoL87j~Vrv7c#$qTtnQ%nxyei9ixMi(70;8f~kEu9v(C* ziUc}5pV(gsAabI?K--|vgQIUqFNzgK>-Ml8mmf;#`aKA=Z0b|S$3=rssHo#b-tbbz ztE}8jZRK%;Eola?IM0b6YtJ9BZ^$m%X>xn9DE6kQwW z>t?*K3U$P2yH!-*yVNVfy|=sb0I8_OikFXe{&P6 zr_xF^o0!G6uCp)02SE2_tSi%u-sa`V256p4IjHmiQ#j!PLG4yxbj|S%{!W9fqE8L3 z8O@D*RKd#hc;uQ7%krL`-RC4HVEb(I6iLTf)WoyrdAKL&FU&-^62)8sS<&3F2U30E zq0AGT9ud+CQMS)iQ;*Cl)6A5M)O?%u-GQ#3Xuuh)xzGx)n7R|D4jFyfftGUW){*`a zcq=;pz*4&B%L}}>Mk9YUTTL06cjc7+vna2#1D|Y#*XC3{n|so9K(+1V{77=Yh3&zB z+UV_r`zC`1Te5NJd`j&Y>p8|JE|(}EDy4{nL#dBmT1%TIb>~Z;sUX{C@gK8a zcGO#(?C69GY-6s_Rc3%F+XF#UF+xm(Z_`WTBl~D$gXcgiexm6F?5-NeQbx@)V1H{p zPp`A@Bpq0c!xu^|U|^|b*u~i#L(RbWyh796>N~}Z%%_vdbptn+RGXeN@^@agKanOL zBbGj=nKZsEhCMnt3%!J}nDb;DQX+@UdR{auJXx9V|Hx2$#%7~Qnoy-Ju<=dQ;$;}g zz+xQ=7><4Hx#1JC8nypCxGxq|>+hfPi;X&&|TAqTV8UGizhg4qIMfywPTto6zSXMzXKnP9fV&Em$>I; zO|``3Sm&^L`rdS6iLP2Png7?jQ_WHW4?>VR-7C6ivqNqx59l48A5|Rz1a~-wz&uoZQvX}4_Wf@ZV z#^%;z)Jyfu4)exVGPkjQ$NW*GMG=4LuvIjvey%)?GzP$|Yal7z37=+9~V|9+q68e*7c_PJZbY48wuPVqI!vagV z4C(`5uJKM2iyFmD;^)~&m(_~Mw08po0|mAYN87l&-StOL{kgq~W0`fOadEBu$IJy* zrYyXUifIbIRvCOLHiA|Zw>mx%JUiUcIhHy-`I4PN9Sn!7wM>dt;^vQmS;~OQsb?w^ z+Q{=D%NvQCuM?%&!>wSSl%F!om}5w8fJFZJD~~fKMcH4hq#q~3CZ!SVE+xvQsvE8F?-n|yUo$o;-zk*Tl14=C@LbyIcR#vtCRl5-d z-F-N%JCe8w&K>ft6K{E>1S>ubGVQS0_~aCo#6WWobj?v0Ib1YlXZdHA5mZIqV0$PA zVf>XctaF$!34Rn0`~i?|XALqTp~o_(Uzw@q3z^n;LV7t1wX~2Jf44ioy7)h??_>Ik z%>}1~#Rlye&tYcM<3=q|+;ub~0XPa$-CKE{Lsj%IN3hxV)D8ylkvm1)KK>RZfWo8- z(7Lf!A=Ja{`vjA39U^AhRGjG!Z{?^?@a`%2);TXRl-E)q@2gXCW9B%+1iuH z(Wj~xk@i(-g&0Svbgim{U2WIo1@ALCTord3T0suUprO1(+|I-FYsrCUIPYPxFtCdA z=8apw)7#gQ;xBT|zw|E7vY7Rnj|Sy~TOW_%N0m08VSl8{JKMi43`WC0zQ?_a2=SYH zmHHHg3boU(L~8Xz`C?ZbXJ@QHr<4{s0he0i^1|IP3tJ2k)+`FahxQoFQYULm$ebt) zQJQ#HT{QX>;UwIsT%plKp^5V4BLOm@y8zDj@V1abjwRFj(V zn}pR0CGiL~`;fq5H3ZtLG@`ns(JXeTJNgoz2$=0sMF)rW?*Hr1IDC76>0@Kaivskp zP|u8z?QQF$jeoQK`0RWw2{Z!NlR0l=)2m6gk=;FP=Gnp2myRQ2_|{MBga~@k0zY1P zy_`#QjvLSSX3bXSIOx?SX#y+jlY`;#=K^9t`AC4jxee5s? zS)gL_j7nnAm268NqeC9F%HioKi@q!OiGVla?rqc~6atja-S6`KsTy<6OtXM-UO)St zCJ31KF|IkwNM`LBhRk4xXujISmy*XHm+_{QJf04eb`p4`&==?JrIp{P+(JnRS~u<> z$zM?pS3cgLc?YUK4{OqB!Sl%PGdK|3wl2#sRd@7BVm?eA{a$}1g)4y5e02SadQ0uYdL9u%_EZ8POLiR-A9%E* zkesE!nXk$m+zd2vz|*jJ{10S^DV+5(WkYO~C@XPc?VgJ86gMY^`Mas+@-L2ODlP zKCVB{)6BB|(F-(I(%tK>JLT~5-J6Qg>)8Kv^g(9K`!lqSq1p|DWI*9|DF#d zr9!?%suBzM;NPUuY{_1Eee_;hKQcsO@72%_vY@463N@lU5Ue{_1xxh?P}fwB=XVFQ z_B3AYZ8b+0N67BFqDreIPL$hf;)ZjyU6GY5A9IWmK~L!|-(lIgl*3#?a)R5q#i?Cw zb_^N}ZwneFJh5UEy5t-Vo$vkm+;oHM3fj7P3lyjqt0)LA@$N=%{X5>>uqYtx`{~i3 zR(?$0M>_NhKw{Aa?Iq*Gk10GNGO|E-sSzo2^%ZfY4+UMYAtNho>`zv|Uzp?r?idNe z?bK46xE}J49?D;B)L++}8Gv)gnGu>wDTQh0~#R+|FxwsGy46bNxz6M_8Bo zFAz{}L%7U{CQ|eyX;_DDAJ}6o6c~gve#rh9WRge`%dK53XO&I%4-}p&VK0E*YJ^iPk(i34SnXJHk2`O_~4Zk*RyA zg7Y2c7uA;yAih76HYkXA7ma=(+3@6JDuVM&s_|HodL4axmsQ%g|0_dP_z5S0+PSWJ zD(O6uGS6K20Sr@jB_RYZtp zf#&2Gg)bNfQ&dHSfJ7z0Qebe9&!o;QpXSsK8m3LcuWwm9y{<;Lk=IqaP5Tn{Z>_7i z1AOAP@VD6{JA{uqsOZRHeUaf!CBxy?xzRy8Rj)Ek*I*D3^t*iUrF%UvofY&$FHMlSEAa}u=^ zg&tXD)=Q}Fy7;w(fa$B7NR9X4Gg(Z1aT;SW))WFQ@Sw5peqbHCqZLrLUBUof_Pw!0 zeyGb+o>GGv<0j+KzYreA{LExWL-m6+=l7Q;cH!8(RDTk(A!j;q>&hX344-g}C}h;FSSdNmK9 zm0OO#;9RLS91H!?`kn!t3WE8qa$`M8WLQQ4*i@RBSHr0od1Kg*2q@&g{?QV4McLl; ze4%?e->$JYrvqcsR*ah3Y`i1n_-m9Z zbgn3mm;oQ}+x2U$!T?m($PMQq5@wFT592g280LOStPx0{T5ElK%B4t!<=m>N$Yg(6 zS^HG^b3jDT%hy*t+~1$;5=b8hXp>zCb$tK<*$QE~lge?rAe3y$m9zeq^i%kKbGWEC zE>x;BtKgpFTzC9NR&_`7NGt~4W$+;O=<_A4<*9#@89Tn7d!YKgytQ=tR$Vn7h^eEf z7iJD4@PX9uG>2~Z)=H&rAa@o7$e_Kaz?dy==9JMmr5rLGX;&azKS&lD$;KmB5h$U6 zA))+Z=Jz-CciGq)Gso)(!Bv;*e<(00l?Z0kaHIaUDXjkyJpV@pfFwM} zBgwWkusw+O)(+vep>lGL{%|DS&k>`?370UHH^8`{a0T|E<1#CNW|%eQ2w$%{LW9P} znhn!R7Gd(S6>3!kb+rh23s?gk%V9ed2zrq*GdiruTL773xsKS;&l%lXgP?$|Ewvgv zLchM7^dBkK*Z-cQ(EFw+`e6TUKBO=U4rgV%sqos0ZBsmyP#G+}8SEJdaBsxL#T|Le zlw3C5_NK)x{|ShLRVzK9r`Gij^WsAp4#qrs8D%c^(@=))C;o@+{b=5LTl@)JR`l*v zduXRqDNFc*9~`x57Au}+8ZcJ_OwbN@4m`*C(kKjX@0*Us31lhabM6xbnrvH#+!tRI z=p#Nay*WMAFC@FT!;%s(=kUcx?hSk2VX1kJqLYhmnSfA|D!+Cm9@EY$T@M5g> zxFP#>7xbbtwlnY530c>>&_X5w`~Q{2{zVvYB7|u~SoIJJ{Mutu>LzaM+YBD~t5XHL zIGY$&<`dr=`dYMY?{O;RX^ucE5qY*%MRb69fO+QypXRcg<{PAxTMRj2#x7Jx&BU)G3;`c@o`SXW6y58&|O($q6eAnjE zVV~-kb}yTOJ(~;BEODWZbCxnyQCG9Zd@js%=PsY^3)v)2fhA;K*R^|&i+#~GJBtfz z+NJ8ZEoN=~i9Hh^2_!Fbt7OT>W#Vc&1kGkWa=*SjQyA>@r0E5%eBSGbf*9kY_7s!4 zcgS^F3Mq!%r^_Y=2cIhCh?WO(UzR^igJ(#MzBcbUmC1s!nDxW3Cksr2@kp)ERV;(U zbV9{X1;x+ba4?w1ks8kmHt-{ik}q7oCNa;`$nMJVOztxj z+-vY~2^MH9ZagE;P9pT!`$j{;SAKw~I^U)c;VxdiBn<%TqDjqW#y@0J%fxmazK*`t zE~G2>c*$~(ugtvUBC=``(J}Mx6xTL(O{C%yJ z`CEyVhwUvahOi;X&s^4&#(@wGA~i z#a=rIz!(Y!y`WxJh|v|&-sXLUO*Eg^%Lz3#{Y>Pa-X&M`LHYLPtE;=zigg1SyrQ09P5x`9~J(9O~VrCjrV~ z3*j)6{JGN7`8L{I!kod*z_+!otClUQ`-A+7tqeI_#gXZ4gpmWMQ%Nj%3k^|NFI!*7 zir;1Vq%W?DBfs)G50s9?t=Z|7o(w@xitZPN+DrL+H%o-D>UB)bF?%L*7HYe{Rki6i z-#@=kuGzn#8(LK;&T84CQCG`W>}Xk`cIA!Z$wX2oDku20X?F>mU^qzijr*e$i#B7W?930 zrH#}M;W_7&{y^o>O8{Sw1Q5>+9pWCKs6?t8U}S)d&^5*T!v8&*tCzwgG>WSttftYL z`nNk;8SBj0pn2uyR#}dkFQ;W(K6jj*`*%Y$;Ou>rnx9ST=X)x5PoCN}?A`SF^xo3M z6f3IclcB$G12rZ!j*?*~uT|k9ioW+b$7;pLn-%+n`Kez;jqrc^*m}#EKIHnYDlY>UtqVtdrY*Y z$3ThclnK^D2i3Fl8z;VEsuMz=u5PnDGadRSM9~m8zIRsdA*gN9n(X`V&3PlBJMFxZ zLTjK@H0#E6S>5Swcgf>4?xtB%@vo!fZehXFj2jLb4DFChr66}kDW+i{u5baWElohH|DE$>s69i#4UlKBGlH$k5S9|3bh6OSq@X7x8lwC%p* zlN8*9fNBOaCnILgD57{c0qvl9PlsVD`Hf-G$SgANV>LX2Qbq2)l~2=t7$M<-8CJ>k zJ(^GIO>ybPP&%b~Ac9M*XZ-}M9&6Rl-f*wFtQytpJ9qARXX-Jlt!3*qT1Kf#W>6FZ zB}Lj5zad@bAPn&^&M@Am$;tmz_CL=6C; z+w5{Ix?FLzwPZMq7kPB{ILR|HqQ@?wAJRO&U-H-rxpVuigf7q{`T(eXK!56V(~jUM zp2fr_h{H6eWM0K%QI*Mj+Nn%cq2?_U14FqQ^;;$=Hp+jO$^U~zQRRjGO_F81{ifk! zGK5L2)V{0)I}a?L$k?bQ-z(3Yt+Oq=jucLAbrAM3pRi!F(!8HCVdn(SIPS}o4($zF z;^M^fGr_|Hix`Cqv2t>9BJ3J3I(ZsBnv`$Ly=eJCs#i!V$a*hq`kYdas6bxruV|xIbGzWo7{23(Csu8SK5n+Mq*HM}4KF+OOAix`-i= zx6bGC({p&eD{VIfsMq^*cX-?~4t1{BCGXWo+XH#vU4P|<(-o>H@gxaAhG!T%6}zc*WpQADUpX1&NN zh=Z@acN57rm6XhqNX9kK1WLN%foGTt8h_NdPKW4U*DA#Bbw#U@<`+tFo`&cO zi|GlsTdPSHX=$mzfSPr=h_@QhL+H`G8Z9rHWiRN%o>GrGzs8QL-~i=a1ANkKdOIBk zqJHzjP$YJ~T=OD*qYq9+Rr`d>ddYWMkJjh>Op1|-_be~>Ef-CQxWg%o|vcSsk9j}YeHe4|QDrQMq- zv9s8F&8Ga}v#!Fy69e^)k?*=4CGXfO7CwXAgjg!M@HeBX>c1nz=^qcB&G*s zdWVxN%Yk+L)247=Wo%(dvp`C!ZkP*RR8J!{)b;@_4Atb`U%pY8iY&cVLZ@rQ`Egq< z8Oa4}88h)&{T+J`hYKuJG`)tQ>v^zxkIW!ct8us(+VX6%LfB!4T|shgmVCkn{&nrR zOBeG722B>`Qe<8Qig`7h=OSl!v|yZd?%)$oU9(=zTzyGl%>?~GhSYqb;81FEuJ`E? z*ODNKaZ&{YO(%gHG@R!bzoD!h2utsKbkLe~5iisxv(g}9b#su{s)zsWHUt>jK=T9y_P|Efa}^T}qg<*-UQ6g-JhtxCtlzHjoP&%)p)F ziVOEPGc0U~FOo)X7gz)ALA2#n0bfVmn`s}#q+XS>U^wcY4a0d#}m~?BjG~qWm zqLY?fti|(AXbr~iJ`g%v0f(a=FW&S56d397eOOmgL*8bro|g!qZnTW-q=r7Ofn~HA@}?cP4A*n`+6jw8Me= zRK+97#kAMx*D!OK0Uhb4)uneAlzIpUYS^_^STA0Xb}CmUdSu-I9W?S%6TfWwzN!F( z-y#p$k;9bPDM}0Ed-}8j%WyHHG&MRzfS`-qqc7Kuc~#2&MXHK9Netj8;n1pTnfDHd zn&;m9LgV{1riv-fE%%c3ShFx`16S<)oC=NnoLHvKTzd5lL|(ml7*X^URe_)gA0Llx z?TB7la-_{KYt39lwN`m5Q7K$!1=bCnLv#alnd7%=b(aa=`HHtd_kfWqxQ?^PQQmTO zyg^&o4=|FpYvFL_qnF=28M~qZ>U)OzOAm0ka+h`~{~g@u(k`j=WSN|kQ{^wmq=T%^ zUw_hdF_%FI&=xhZ&_2_HI}@zkFNhH>gWt`y%1{W9a@dWisy?5WZWa%F3d?-GrB|7? zWrQc+gh50H;ONm3TB#Acb4_k3%{^2<0e(I&B+lkTODC(tHqI#XYgDA=0%F5N0nf0< zy3u+3$rf=AddsTBSrjZnz;~Lcv}N*AUs+d2v!3@i5eSVaut{yyzaJA(V17^}?lk;< zld~igHwso$;5Y$|LhYO@3eBI*sAQ&51==4zpaAwiqmSrz7cWkEpPco>%Z)7h1pQ2S zBtfglH8Bc+z#rJmp2;hXC!Zt-+a#$@-MRY7ZLw!@}hSECc*MHrteS{eZhF{1` zP3dW+Q3~sI#C2mjGx*)yTMKN)QEZlzGS55RsJoNJx)P5QD&``47DY&b40HJA4xY2W zz21)RG**Jduzs4YAJF;2AI-7NV!XblV4%q^Ou+ik`1CQ1)mdw74JQryv>@?%(8E*1 z4{Y)*hJ?BnXU-$CK7zITG-a(QMIS^Ss)v`E^~Zjpl&Eu&N||ZMm_{AP3_|Wyj{iv! zY&Vf~)Opo=OSB*Zg;I(6{2g2}H5s*&QAwRQp~3`RGeJ)a@IPi0Q}AG-aljwdv7!*l z5ED6Ur3Ri>Xuw$`pv{(mwr{Gx>Xh`kt;k?|+#77m`>5#m7oxQEXRdiV>#$}O4LJ;o zH9D!2Ai``A;A;ZApHFPtvT6Jk#7Iw9YWSo6emB`fb}<^Te`JaXU+~lTJHwD2kKud? zSFqtFDP3)Z-RAff!A^U1!TYX4YyPN;HcFTn6;zJ?lH+-j77dYKF^WmXBJt+|0dx)n ziOK?7MlXj;Gh-zo30b0fh;$iA|H+DfLX4Flhb7xcA474UYid2@OUSh#Duh_rYl3lc z_B)(FW;#(AwaO*IqUWj?;j4FCLy0-W&Ca0=h=cD(H61xD#!3v=9G+dwKY+V+MkVrA z2tfJ}#O}`VHx*8eB3Edcib{w(VOb>u_v7?*)!sa*WQkrqa|@fMGlNb=x6Y(O4T6X6 zxI)Vxl_^Pu8`Y|tAlTq3-HpfetlZs(h|~HWNJGIm0g(Fr4)7A)_kP-d<84#)VZ10< zz{H4E%DL#1Zqx4@pCkUvuZ;7Tqgu-~9&hprO6awFCi2K8;15YVSzi&n#pours5E=5 zR%oDH3Dh4B);XYLChbGudlPUO8Y$h>%bb-SfSW?@u`PygMIAruASr6fo$SgZDk^P3 z?r3BaVO4*68R^8X#_Mq6e#(vSgMt)_8Gk^9>-x5J?P8t5`wv6B_FZ#KsQHIQz!goV z4pUl%FqtkidQqH=k|>eRI?Ya470`qdn)(C4;h3QKh!Sj*JW3slK^i%e(Bb23dRUXg zD9!7tYFP<26OhQsZrI z?mwS>H?{8^YA24SwBN#+oaxI-YusMg1Wej{&~ieh!96s+%uK<9|DXi6=q&(ZmOGa* zixkS~_M|dA>Ko-5p?Kwqu&C6oc^L|KStO)){ghrJfA z#LtkigmJt84B&N@!X@scXqVW(1rhK=b83MLwUYxVob}-7!u0VIN@9v~fFRkaWmWKI zdFNG%H&iSb-@MDk>~9-vtwKZQYR%jTsBoiAQka!ew5%>xR0Ye- z-Z8-g&!db?8HV~3p%v1=mHae{%!r&7O&KAr{-t)_%IJ%u+6+2&6QRVDFO z#`CZzqBjOtcvZQycOe7=GU!;yE!;IMoy9ShllDrS>{=jqIF1p$Na2TBWUQwQLx;we zd#(Vh>rW1Fuf30lnXI+m+7M}4wCcUS8HCC+o?7o)P&Q&o;GmkQA%%pB20Zk65fMw0 zxR1b^9<_t)(OX)Mp0^Cn>r+y-&g+R~G9<5V5wS=w_9P{gJ$RPXrjW=OO{376n|%{q zuEz4h8@BpIec;@OgmVBHbvo@`9|@mi_=fJ;$_$A0Q6&UL;3$g|vLV%+9>vQQPMH8p zpWx`^Znm&uvk|A=4C7!y5pw75jJ{{DT0TzNimyU~peT)OVhoD*WS*&v!gE4uk6i_q zzA5+ZS6ErcI}rb3UWLi>u-jPL(=O-L*5rVeSi+LA=kl==h^Ql@6$K3dC)vqP*+S5o z-TBFEk(+va@}H$yICbXEchNW~G|uyuHG)#tpkHamdFHO1p1*aWHH#Gh8XIC(+3(R~ zFg9g7-N6qr_1Joank3=TRHwCgnAV~VyDp;+ew|tb16U*y-`5}~=_eJPbUjZva~jnq z>EuJ(eU{J>ZTC#v%nItY!>y%RlP_svUzk}JAWRsoO-cWU1)wFFP+6GiKA4p?V{~LS z!uTm7!l9FzYVbIdm|^2^%?l75x+Ttz4TY=?H_vZ)nrd0s2cNNcr}e}i#g$2MGp2dO zsXTC0l4{W3`!*xSPL-8KEfd#uh!Ra98fHnd7c-LP4#t@70HqX^Q$vPflUuQrV724e zQ=vKT_TAEk-+f%_Mx=3jSll=U*4q(n;ApXqDtBk%MWK`NNSpO0r;9F8;kG%i4veEU z@PQGy6m5;gmdd-e+0rs-bd53HcnJ^3fNcsVU3qXn8}riYv9Noo^S zY=$Qx++7MvAFzCUoGXZcaoWSPBvW^-y8j6o7Is4*UTAjmNH=eL?Xi@WVJ&GcV3>ue*4od23Tc&!~%?b~Q}Rk_6=ZwVg& zPakx{Up1-!QlpIHT1doU?yT=TX`u~L6^hS5_UPI~sW1S!+*%@|{G%}i3K9!Am;emq zjb7~asvcVrZ8OCPU!XO661eoe2{=FSn90oJT0^1gPd6M1ICf{afV)1iFg~K~87drD zr|(S^i6VhNem|T9gih;eF~-yaCVM5EPlw_&hACG;imew7iLfYDug&}1RD(v-t=3k$#!D?h~cNpT&?jCVYl-CNOSy z>8QLuUQnID$Bh!p1a+0p?^x+OM%D+J6mai0Y)vpVZtX}D9>M5Op-&F0q;IMCWS=gV zz}cyDTS&zcBx~RA>LqjeH2NS%PL=?qxl7MD(y<(bPy>Zl=H@;Q{Y2=^dCzomYu9zW z3_)~`ssLKrg!%C9Bl?>x>kgyYXp%3ECrNo%4xG{pN7vR-{Y$6>{#)*zo@7=!?4gdh zXeKMYf;9AOoafnu_y20oN|6r4` zz**BzbFBz<`KgAaCxt^2S@D=2%v;)Ei^d5^u@udR!+R4g_@hHfu`BonW-4T8l_KR} z7d3a497_#PPI5|F+XK6{rFs)Mq8q(DqyVNAWdb>s%-h^BAYv;O1Qtc1LE!H;S`|^G zG+)zY9%r4!fSjN)vqrU|lOUr`xnyu8(1Jt)W{I*XEY0I)P;Uk?RDyZ_x4DP1o43{T zZ28pn$3Pb21ITaSeGI#Sirk4RH2V#($)Ce_NpK2U5VPFwf&yo1Wyt^eBcD)mzKb@m z)+l3Bl4?2bsp-@i*~r8)Ms9|1_d_g%23Uw3i=A6OM#E8)LsvNkKG<6Lhc!#zkzO^KUJ;?$R0inbT>gd)SvS|S_PMHq#v_ai6 z$w6BX?aY*XskTLZA}{j+E1Wnjn0=XUZ^K9W52A^)E?q;*+wF%aK>3B%BC+Ah(n#w} z{LJ8{>kh+4S2GUEP`U7#w1~g6XU!Lzw7f3VuDDe`ywqk-DT3z7zBhTjZe!k@?wf9<6r-inBp2U|)5C>$?3;d-0ntz_Zi3OMOGGv*-L^{_ecYj8nKML3U zc!1$wltByD{lExWq>}o=&ykFB{Oaj=?sWB;*EYl9J&-c^atDofrfO0^aDX{|9M@`6 zCvBg`Xs@kt`08YwDh>YQLz^++e|M81;HomQl7^~UtInkAykWPXKo`CCRwT)puDxq1 zUhR2$a^CJCJ-u^Mm9nbr=*PhLAqMS4ZkkSRaQu6B^YOWRSJSn`G(u%BBWA1g9#|iTzsD1-$k%}rE+Jo44AhdQNWMKe43WgOc{sGkC zY~BX@ba8zCoKg@@%|Mg}jzaWyixh!>6mAQv@gT3SNPrlHrx~VpFmy7-bSu2e)`0Ah z*|Vl=q@9dZCck+@z8(^n@^Is4S=2)$UU>raOUz7DCO-V*x%isK0<&IT(4!ouskvI4 zRRAD0|L1KXd}hqvl@WcJw0?A%pnrE|THpf;@R9;o4k5v7LvD2x*3Crw1IU$AfljvktA?Hh0>H- z>U|n+0jqZFUr#5Q^2tnDuMbu{m^9^FYA+~foN?2Wi2c-M*7hB#l@jLf$M_o|6gL4w z%dCD-POyF-6%3Oy1k8N-W=#M3W-gc6qV6`vy?AH^vvn6pM2cKVGUm7f*T=NNcyZ1g z)Tcc}GE_}0(LAZpMg~`)S@L_8=i|co(tp_Dk9qSYubhUf)-2 zb7g$?>{@}Mrs$8cKN21P4PLlI=+ORe9c(v%j5I#$~@2bBWFre#x{PpIMR5RRi}J& zIsrGz)MmLY*F!HUMr<{^+`_L?7VFD{Umx(7XT7|Pi4xuer6oVj8faYiIm?#^g9FUn zu@;dQv0Z+7Zf5~`PgK~n+E$?JMh5z|T9q!GOI4+edi{E@z>{UQ!RbM3?>|Z4d(1?& z6QgHQ80WfN2C^;!o#ReeV9|3_8W`Z-{vz>GJ@E?h|LJmMs;9oXI^yDD`>TDN0VN8+%rH3+d(~k}Q+mZnhj52Y=|3WC7SC?mR-J=|? zsfp(C2gY9kpvyC-5oMBU5NRaX3hyoe zZ`sN=7mz2(xS9c_udKPe**O8H%-TOvtB*R!{!orKvVAN?#8++?H!TJ70lz%+l}p8Y zmrVpRw??F2LM!fP7s$jiZ&`2f)^<-s_i5qfHyLo&>3v@Nke{f&_Y87-A?NFbl3_l0=iZ17p7ns7&&c(LU9q=f)YQ*B2eL6(X_vwSSm6iD7NzI zXlm9hg>>WNnNpGijGJQS;&?a|COw{(pFCRT$_ZIx z8Kg}wh1N`?w)UOv2ko2oioYJUa09twP)RH*HehDBhog!^+Mn;WLI@55xl_lH71ZIK zIqEY5YOVx?doP~{lns@{W=dWP7t|=3<>r;M{PktHftv!-2l05NtffI+PqBfYluvL) z0C=brnS(Rx3(}~}1HgM|O3@I${FUCnX*J->UzYm-NSnET3rLur4|IvIM86xx`CY-3 z5M$ks&TJzZpNmSux~z6lCs^P5x4OZjAG+d(`QyA8D*J_jt~PO5$cAOu??SJEfgD4i z--6zS2i=v$j3TFE0LX|Be|_I8&)xAug)#CG!E2~QSj+0kaiMY{@r+XI*0W!K<1pV^ zg;ZG|PUXsyuXZPwgdIMsdr1kZFTZ{3zZ#|_@o(i=5iQ-UY{beRU31syR~7jVE-fq& z2_;f6k!r%n+2+T(eA=(i(jNTV)4u#EEz41xFFpafw&_2*uC5Lu+yDOVU%sY+!Z1dT zFO2x36Ief((<(aL_s=3YPq? z@E~RMWn!?(LWFgxTX(5Q0<(k_}qjh$FbtZOSWWNeL2Y|3>yNhJfOyjJ_cRa`y!Z1YE${u^Ve*S4;UxUv z%hqJ$U69TF%vq6K47=Tx$eUGvGYN97E3k8cFJZF4W>!P?hi3t^CWXB=t*Yda#Zx( zY>Xy${rU*@^ewAQ95a*+Nsqa>Vb43O`#RDZdE6TwkzdSTPRdVu^*;L}y%^2ILv?jMIYP6Ksz4afyOyxweh7WI~Z8CdLY+rCjdfGMhJs9cQ zpWO6`LU@&odH19(|3TEW%LJ!Ex?&abuD7l zYd6DIO?P@Z`$~<05sMYNhD{?EYu9+DlqH+MJeYMx2l~&UE)3<+Fp>$G;^gUtO`-yZ zP$Dj^bNNKJAFt;t`L|Sok={Q@RV-WkM&l+Hfm6E|!bwnrXP5Q^LDCYX|60uoIpAO0 z==(01pDLqtGS_)T@C%we!KelcZnWh27e5m7-2|@N5&8EGB(m;i1^(!xFOVTv#gk7u zF0<}nqsPZw<5xMBV?TJ!fah-x;QccP`0_wBHR&eTJf5Gj*owR>@?T1+#xFMEQN8SK z05;EyJoU>rCxq&>Gz!NqhP`E`vy;8f7__9^P!=>VjMfbhp?Lc_`>u2sH{E8Rus^G~ zjMES%;Tk#1XUg;d>(F)jf$PkPJ;t2O&17bz^(yl)lItK+J3+KOeg@;RYt(UWw%P9a zsJ_EXfE%-1W*Dwp*`H4W{rLjpAndwi;Sq{Ivam1D{+_E)*ZHfYyCp~dlo+Ja}!RnaKFq_yL2qpUIJKZk(Q{b|3FWkZ}3}^_rR7 zW*i_o==#@knPB+lF55~`EOe3Mv^>RPZ*w2e!}+DKT=D~Y5xzM;w)|ZYJl8CB-DhEI zb)(D86bW=Csa@kZ;%__(^XV2i5Fm6vUBQJr=R>xqZwqzr3YkA1@!WpTXYz7yBy6f5 ziZbY!=3JnU!XN;FqTj2vq4&YTJ}r4B4*z{lp8g!g6?#`DmG(Z3P>p zBM?47-AD;Zyx#m65%{-sgWKT9@ljL{cHFv#Ea2mno(qY}CoT*fBwV`Ws|6sdYd!X` zOuxP6IDqdf*o)gUcG}bCqpwd|bAZ>>@zd(Xvi+2(S=>3%B=&QNy7 zsok;8b+ehgX63Q~ap_Jl+9BrE1?pg9RIr%Ig;jA*P*8P;gU;9|dH_;*yaegmUXrl0 zQ26HE(}*dTgX;*-81^^lZr>)Q(yens9Xopw@S%RYcJk{Mxu}ltl2DX2$-ZXa_iao_vW|VMgDhho z+Zc@D`S|wxo#&kAob&wSs_Vj~yx;fxzF*s|^RHsSkNNwf^8f#TR9|Md_a|abRu^V_ z6j+KMe{oh+3~_4gOOwbHyk-XZxY67`7Ib=kcmcp@_g`)$~Gd+H!qU;dBzXbtF8;!>9GLXb zy^`O!^0}n%n%%Mz#C{;7^>H7^YAe#b{An&=#~IE$;}J*_$M+-DlMOzOb210}A5nh; zYK?DH|B2&QelbrSOqFcatK<@NU5Li1%)?P2dS(x!it0~oMuu_VH4lw|L&CJho$m3d zb41YrYO{vfYEz8Ji96~YMMeUy&n3?fibYbM%lw0TC?p;&)1;a#R+4H-tD~HYWuxKJ zh>`GIRwe+7=?JimnElYWgiFfKzn`RhkA+eCE*B~1yXBlbho1FX$elN2U37w`9C5j7 zxU>eqEGL40#ce-Y>6P9p3OA3v-sL5`c0WC^)(+G@?7cFe0k9}Ziym~ZWa>S_G}r!B8~+`C*JdpAipdx!?QH8 zENFaWPBYH0^YjsDzhw+OoN3ndPR^_?gC?X0Caj@LR6*0Cw-@S3<8lD0>2ed0 zM+h5Z~7n5N$`!&+90zPQg&F?sdu22*Ze9dWx4bE!7J4NPy&jzsMHzs56gv$A)x zLY03g{e?@uQvJQcHXg)7#AK;(=YIxyE?ytu`log_AK_QxkX^K>8OCoBnlfH_#Z?E4 zmBuRx1CAvXh0^##IN-!23uA#K0jv+VF0e|yF4mG#PK!n)fCW_7XPB-jXt@OD5rcnSzQzN1%u?O9EOA)n9K65RVeRASJ4#6_;fF%^U)C)Y^ zqMUN#>16hH`(dE}jGlo~a_zRU9o-dT&bxGo3;dVRvQteTO!inW&2L%pXu!z~P}Bm*2_ zUjV8>x@YwGpU3e5aaadi;x$Q7``oet%RlHM`>p_^g8QxpY?GEG4> zWTHuGHf_xV7sN@O^gsA~ppMw8Sf`93USV9+&hI10Q~e_l%1eW4gCOhBLEHCytDY8T zP@ja&TJ*HZ1MgANDHr&9;L#l7tmm74v=>Ui(6(FOT5rI2U&S^e-1h`nR&lK>a_TDm z9U@evwyIZHA8XizgdU6=Q%<@fd6TIC6-9r;cHvVvO_YRQ?To`7kis<30B#q+U-2=6 zO#D#BGV)&c-&n;g5vk;MN;NYq8Z(f5(6Np3&99XmHg~!GK^-%4$4-806A8`bTBYEO zbnCNmKLv^Te1%VUG7{ILIeHCyV4sqsbq&)W&3j=tQ4sQN3yA*Go2Y`UNJ9|JFfDM4 z^Jq1}qQ70cHH<9n>IS@Me{*=sIL}B44#PrLRF1aekRDs+GNs;QugvyajA5yw!eLsv zY!i67Q{cCG`l;D=InS|lr5>_bo6Te=tEwLz!!fF-Z15Z7cbF&**m6?#MhLDQAel>f zU-tpU+mIFb&no?51HF0APD(bj!>q~aEZ4G`6RR<**^urr?QtNWvWF5ksdjU~82_Eo zx|F;Os&oXLeI}?K9iisY zp7IFa_rttIfxCMV=Xjw{g&yB)Z28gt=^m z6l~xz+VdplTF>(G-e^1;e1=#)NsDKN9rYarj6?9Li$9?F==kG(57DR^+Fh^>)oow+ zTDR2O_0Cr>SQ^t)e1EAN6g*$X5q3ny(bVIxZqgUsU7gJTZhwQ8{)GZ0e)?aBAh0Jt zlZOJmx?G@bK7QSsn7$v(>L>k>e)i6>5t^KIzC*(73w&i-cj-%&(ATrTU2p~raTA~i zJ8qdhXn<}9OGGdSPHh{|kCws%US}yLxlQF)`rjV6L0!Jo6hHGK)J!(b+lx($K6E4J zO{A1-%eix*QOoP}J4%8+`*FNH11;r@+Y$--et?~!#-o4|uR*N;Fi_x0`m2Plvk-)% z&~bJfIhOgTIGEi2`|}P$CD{-C(4}eK<7n#Y`t#bskT#hEIo|TKHB}@nErvs#-qgoT zLwVd{HgLr$a0Ag#@gdIZG+=j&{P9XZVKI%s0;qc|zeKAk+9#NL$LVg|8lCu2rSTQ$ zb8ps2xk8+0=(Clg;;VX_b=h7H0!+;*_2aquY2+`BC77Xw0O=*)C09kk&J$`h1GA-zTse5$~kVMaX}1N zMn!+ksk99jyhTT=Hn~bfg(>4p&79&A%KG;lblJBX|72CkSXgU>eQotVTM-=u(r1^X zi)_5awyG>DcZ&C6Q=7~)Pi&CMLegANgI-uG+{m(Ud>gc99Jt4P7AdhdZN@8EzdW>8 z$QjJ zBSoCuIG+Je+Ju)5AT0aupXxJ5ZK3c2P?$-BYx?+FvMZu)Cre6H7jt&HrNQqTN@Rh7NlaxtV(r(&sQ=MueWYR0M0U?83smp z0Edq)*jFlx1bA74?nbNCTgc^78i&-<+h*cZaAV$^JEz}DMt^iOVk><(`yxb4MWo{& z!FvAkr1$STj4yC)Mf_J3{=yXpfWAmP`eSHpO#LH&mP9}Q%c;QwW;MI)B?+RKQ%-(# zug048dM}K5J<+s{kqG<)870#fUmXrazp4#OcY_JCC7vP=Rm)hu*i~>$r+?K~%Z+#t z@{;jbSLVj}YC#y5%ulrf->{nif>vSl`_R6qj3Q~*Tea$#@8RNYX>T_q^_Sw_kCB-d zHF9y7RNGZxMEPB|e!6RwsY-?cO6YI8eWJ6f0vu8YA1*H?CBM6rz8%!~-U@jGs;~Fc zAT=k=M{j&}H%GhV^rfHq%Fe3%5~9EH!M*%$OufFcZ~rRy&or3X?bua`Lc_bb7Mnb* z9Hi-`rXw$i0#c=IF_XaB!r1eyb7Jpp_GNUjSLSI6eegR=3QdSSMWtxGxk00Ty|z74%1kNhh&|U}t29lfv1?EB#KdQOVeW0Y65M3)sNe^s&%~hXJY{KlDGU>;Zvk_0r~S`LGmV1T0u-Qkzb}tuHr0 zr~U3VZ6rNA66+a3EadXZU^5tk*>wx?<|y0lj?0>Hy2zHF?s_h9;c@1WQ)*2o|3i1% zC-C3~licDLOqJ<3q=hF<^!*~&d>JWI6maX&vab@W+S9@oiA>Feua2Mc zX4Nl48_7ES(k2$_OHq}ll&{m%PwkWt*obWN)Y`FuHMHo&)h_Fj|$BOYqdfS63?68>Pv3k~L=`DuBqw$q*;~ zCg1Q=QttZa0eJ;RrSID{g^u!-5vBEmVtz%t>-zusd#LT(QE$z#g2Nh8Fr46?C}Z7npBBud~X&K>CF-x8v`<^i^Zg zprSc944kU3CoTr+#LKArC=S|JbSoB$Z%0;Q+4RG1R(FzOys6Ci0u#1HI}#pVALAdCoM5`Zma#*DdTHwn+T0+*B|qZVT+n(=IQNw zp?nZddJ*>PM~_*%pIB;?KU}2OZe+*h1dm&qZw9;oy@!>MP$()-v2Qp-Vu5e zd`7n>Y>j~X?nwuR$oO(C-Npxhk?+&S@gMAa3Ps2k?W!NA9nU8tt(%h?Ch6C~ zHc|Td>))Yc@xB)bCoYXd5JSM3Wo=i_*~t}vDIrq>K1YT=w%~((l{21<|3{;APkr+}>0PXe^#Y zN$~B;eS{$6h{)>w!>h?8GAZ^5l@OoO@~`Lfx@iFD;mA^y+}X0gbYrBU0^MqsKI;N) zzHwD>VGN zSe~`k`e(1KCH@&#@c?S}G}^Q947x6{I?eMtLl8(VzdWkw1V@euw`Xm3N8ffe1NQuW;YpoIm~?&)zizcc;-AGVs1{KC_Z6#8DX^P zT(CvXY}+(L>6I1{x+t|9eX$ZyW`6&?^PmcF0lNl4S5#dW-&^l%>cQ{um>3oo0ejt+ zt2-zOS16A@#YM#|M9Ffzt|DLS)1-fG#`Dr@6-C_6)?5O{$ejrEL1wG?wYIA-LgI%o zCl=Q>`54>O;U_CHg?m~dPZ|65WvoJn&FV}Arkom#$2a25B7XaHEJRBGrs*pkFA5`7 z(dMGz)}VuTiZZ1$>-4*3qscU-R_zcg&bUJn{+!%%2hLjs&F$S&R@{cid_&%$qH7Ub zk;9+9>S#;Z<3&#{r-_oFh2eLBl==Af)VkSMfURKTquGe+is9_Z+zhLr`!oHvZz<1i z-5DYL367FY)zyu{*0WRYHve4RS;ZwkwoYosr$;SCwo*x8!HBpgfbh6_WV_?o_?E_6 z%+?(7;5O~UT06Aqm#{!3xz~}%CGfg=Co9`=I^Pmd<(EB8XL0+cC;Q=~QGR`&egFCK zB7I50i;mOv71j1Lyjq&%+HYJaObXD+rKZ2vud_q47ED>C%ZNpg>67!fGoAaD4(y01+k3In-$m!_b ztzyrIf~(VmzPQh)wJms!$KI1($fCT^tP?DEI!5F(%|Rzn1it38WS`lzXzJgIn)3g= zFZ1N%xF&Yi%y;rvwHYcPeT6Ms>5NV8bT^rPXp~dq6G2IasB#t+}Bax3$$;G z-fqzCfo^MrP`+T@N`L&fk2)uY?I*r{XQ`?j>rgQU#4i7@Cg$dYhrs9HOqCDjJJXlm zUl@-5$~ZZsk^R}0o7Qo>fEO#{W7gLx5TLj8@#z#2Ff};U>;+1IdPPi;eJE3=?fcm{ zVot<^FjkmSf0k#saToiWrvFB=Oof`>O4)Wzcfu&JR)Evi+|BxRZ(%bN32*1^ z^GV-TyQj4B96nVyH0K96j>^8o=Fm`WSN?geZ-xx>6D^R<*n+%7plTGoyphvcB+o>F zq@&c%za#=L^MB#@{J7`3sHW^*7L$!ag_Qs0`jb(WjuxT)Z>AO&qbzkl3JCf) zb26FRBeMN9;r8+(wLs2G5y|din<$1B@3SV*(Ob3vbQ z8j=oy`<)*zjj|`pW}}bh*dY&u}w z+rl$tOyaixOw!00xA0`4#(Wqtqbc=W9V$$g7fRTt^u>UWNFyk-(^S6)Mk4knr#!wk zpf+xMJNYp86+Kv*%YN6UQd8u&lw(O1vG4O8k6Xo<2NbXE*BTuqF1a=LQYo@o0yM?@b#kw4e%v1b?VcPg_EOJ(-u;ZyR zx|cQ!h%uY}eB00k-g7E}nvtCqI^7G$boA989c|kN`3E*3Kg4d_-ZEFbgM~XZ_uWB? zxT}<{0@LQ*dalVaT978;S^*C8-9t7U0CzFUv>DxtCQt4Fd5|rbf+v6-?ek6B74d zmCyrli!EC6E=Kll?1zaO^Mog3v}5|~%L_5ZBgma3Aj$acT{^)g=_8(CH~*~;l+_$3 z>T2&AadU}{>Z+3{&&XonpnE%3&S4m-N87#*r%A~A>7o5+BnL2ue)v%+{bJ31O=`K6 zz(ReKp-KK%XR7W<%L5CYAy$fJ+*X)UZ=gj6WT|N0b5m~(Kbw!d4Yeu!A<7HbxVqo3 z$ne|N^`}0#m}Cw{Hy>55)vC7%Zi6d2h>%y$n^um3J1M8I2#E1 zSh!*r_`M84&_0mccn-Y!*;_OJ99&f8F=YliPE&HBjcG9L5(h+zWiIq0Mx+67(VEdIMjxJg{ z!F2HEs~i2Osn;X!bc7Z+aLcfkJ#f7sPd_kt2RNVx%>7{#Dl(qaFvG1kj%IYR4f2ah zV8t6@DMK9u&@a!_&>Q>1o8ln0wN;@Mz-!63?%HViBcSWY@X|dR$^i}D@xgU0HyoKH zX8(uYvaU2_o>dmoxysX_Z`dAY=JTwSUI~>U$fi5ao-1zE**A&Fda=5 z!;RBZX5OWg0Ii)**x~ChuFca7VK(Jz(d-!T*DoJcGYYaK6Z{56Uo14c9(5M7Y1YlM zueiU$bCUWN&g-L22xEbUXahwL$-4G}FGyh&?v=spMV7#miQhLHcn^m0l~1VN&#yma z_(#C=Rs9?)s(hp>V`E(skyLsAzYDnUX}tzMXRRW-cZs2m^ZGVs`b)vEbj26*F=zex z;f==m5GqYO>nl%H+C1y!9hE}#Dmtt88q4#@fA|cQf5T7ve|9ePK`$MBFYNH4T`qWv z)W9OdIBrU+z)Me{J!Y55QLoO{qs+^OEF)&hdiYGfhz9{9wJJ~+lv@H6y~PsTT7Zcp zi;k+jvoK;eIrROV#&Y~pSQ%GiS+!ik_;Z3*l%7S5ncoS=(wiB2Ngt!}@3mo9XZg>@ z?G*aBUJ6zui+O?hZbaoF%O7YOm$sULcKT(A&n4E%=RCVcYk8B&0>{vHQ%`HEG^Ie1 z5+^_2s*|7hIHn$>>I?+;7c3kyjlQ(BR}bxh;WLg;P_jqJrdALzrDhTzf8On_Z!UtK z^pp3K=%Macl98U(wn~0ff*ynzE}f_b%eOrV@={mi{Yc5HSI}sA3K+Wofsf#;Z}xS$ ze!h}jUB!UNdMTXmE`{)=2OMY2?WG7GIL2R-Ao zualqpsQ|2$aNQjhm$O<+NJ#h?cyMUZo&AevnNYSatcc)V!G{#a_VnxlbU)9OGaRh1 zzBHMP{Q?vkNiCsn@+8MdC9qJH)CeAq6Q6p7Av{l^*Jy&TUz4$Lg?tZ8YXESbL&~{h z?J(piu*WvWQ&W!ZF@L>z)L#`iKkL5)MOJm+`t@o4s~{6_#{mXugD7B;;LgV4aYwWN zpOwk)y75(yo3~@4t_#d|oaP4ubFac>w!mH5ch7M}2Nvu~i4TLqND6<3)ahO92~EZ_ z84XO>wd0!0IeoZG-6XVG;x>Fr1N;Vc*6Zn%+fjvrq+K8w0V;vpQ1#Hzl)1^|c;(Sd zlTX(~LR2PjCqqqg1y#i|GY6CND?Z;cgM~1&uO6X;yI@SEHKm3lcPHlrz@sZmhKD9NBywp3M^AR z-R#DPiQ1`0g#K%+V0^R;8fOT)cPwF_m&4NKupj{fl23Z7RtaTycOWe3O@d`Mj4zE8 z$msv0050;iG_TgSK0XZUByKftsw%KV1EB@v!6hCwR0 zOAZT(=xzVl#m2LCz!oisG(|ZYL#}<3u`R`PX{CSm8DjO$$F$17PpTtu{#EsP|CRZb zG624$|51InRuJv9!Mb3bY({mxw~V7r5O3C#f3plkEc2|F zROJ=}`&vI%$o;#CWPW}{O7c;WoS>%YEj6EY*>}!EHOYoPQ{3aEYgTbWsBbiwHGtC>|XCivp zsez}v@VB-S6z;WSO08~oa?qVp%<7w_8LHSp%hTT?u%*PX97IFdM)lb|H%Z$Nv&d`B zL0flO6@?OYAkY9vR$Y*Z67Aic2JczbPV}eA7?$4kGSu(|(udl}rzBE|UJ?HP&H^yL znvnNvNl|(E)}qYbicDqyt0I#tvDTx>dCa9{l9!6Nl}p`*N5NYsqK>sEeIF_}7lAyI zW)o<8$%X@{zO}W^>~6Wf{vmY4sNt}?7%vN)7^;`N97Ufoe&;MwKcE%#(P49FS)I$) zAQdUts*)N|Y1Fb~n>g3vxHQNf9?dbL>SScC@=bkk_kf1ak(XmwqYa-S^ENzafA6Kt zqe4Rju(D{fi9F3WL??3ht#Mqd;{s8fU#%PCiRR?+{5Wc=2J$HFm)- zsK~o^sb4lW%Z19hsuHEi&4ozr$mU)c(aIETzFgm8vTo7hEPr|+sP%hxz+U$s{dJJ! zIhy$DaXfnEdu8QVys9y&v;F@JV2|no+tI&yZ!TT7E}QZBl=`NWWGV+?LlqI{#m_9P z;t}#zZAegsnPMIVB=d3T7Zoq;mfxa94|!{py2%K}^kg^+#iaU>J}zmA29)d?=L|)H0&oJ_ND`mI(zmT!?MTGIGQ?xDA>p`Vyo8KwB)G#S z`Q#rRYHjJ3>DTvG+USWw>8>lZv7sI>2jYP<_e}&`i0SKKF^3PC`Lrh1@@Ss|vI~0L zfL-2R{}Yu+X)n1cJxqv|pys`Kf)xL2{rUM4ant2g+b20zMp~i(t!Hc-mr=h}YEt^u zxptcW2alx8GQcl39_gtfVPNsy$G2o)kq(Oo1av)dGeSGr6Z-!!cE%6Za~?)#%$7r0q**(yrYj zS$!uq`oy*`@r&gEfl|jrr*4BmReuavcZ2w|(F4OCi0-F=!i| z{%>GDaFAy2_|l*9-~1cjhn7N?d(K+8084i7zOC)Z@OWx4Yd2}K14<r3pNPIqh zE3K?svcNZG+goBYMb)F3E^ueQXeiga$ZhoJl01v~xJev9=-mG`bCoIa@NlSD@8K@!W@FRQ zp9B{F69z!QICU9UL;x|aaOmZK#?K~Qj|0~D?S);=?0L1BwGOZ5La9>a06jtElhYgL z(8*;}hvOs0l~0%c>JxSUwleBQ|9dL~{9esrgkU?rO8Hy`s_7Sk(%g3nA56piEu zGxp28H|?w5?b@>ajbleI-s@BOiaPyH+q{6>*_w&#qk%192kNcX&d?8n8WXDkk#a8Q zE?57!tB?jW7HmEVeLBJ{F|1Y}@@ln4Eivip<)>~>_uD=rw!TRJ>gduaylSzeFEr~}TDT`a zOD}hNQncYcR}o}!=6yn)b+(l3#j;tCVGFVmyl7{17>leK>Q@DJ*$fs4wh-)#1jJ}@ zf|xwBYfNkiio2`y9S2%VWc0@~XXsd)J{^mpw#-}NrZ8vlpP;#_F09{L^(q>pW>mg` zMfyfW^TXICcJe5{;7|A5FW{om5$9@cvhmp4{Y-uh%_qlFL51nC?eJ=66R2z2yluMA zX}c{}8JKS`FL3a1P{$Iths!GQ&suGjVq4-y+@VSUo((k5Ol-#c`V@#W4r=E~IBgGm zqTH`fi7@b+R6<`95)hgNc*dL14#~OU)hp$v#Pr8X3gv+%Q8hcKcLN2N_9OsPa?S{{ zD#=tR6$2~{q@z4TXDNCfEiZ@{Hd0LdZAf}}{t?2N>fZfdM8u;CY>9l+`s&#@a#}#hA58FL5yqKw0Uur%!kRfgg4gw^-1LEK* zYZc{#Ha^#G33?FilhZ)Hk_S>Q3A5AZiM@%!wkl0N&caZ8)=9%molI=RIhP{mOBU`( ziG~R^95xT{$}av3dinXZsY*jeBU0v1##?7&V13f{uJfMCZ5k1PYr#8_h8=i@#7O}S z_;Ur_qtzCv(u6+osc}9QkNtuyP|wNYn;gQ(!XK7vOw170!u(8M^d}RoA7Vw{mr^1GI$nBa*?@s5% zT*uh3n1F!aS`8a(&w|{;c{s>#Sdqc{k_2X+9pyQVt>Gm5`>Et;NM;qwi~o zIb24HBj2gNLtaV%EZ+bGxg}Ri#njOP+2S`e^KkiLkT0(T*gvE@0eOaQl*`&gpC%)v z8JuzKyB^?5w^#<0c*AAwpYk^xg>E<-eOgD&c76Ei+Hm?9VN_DW*SjN;mwxXBtIyM# z;|K@6yI6!MH5VHPjpn#fH-6~6;`pAgDFsRdgvF6a$N;kL!Qf{HQx*SsCH~Rh0XYS{ z@WCPn0OU!j6f|!9S=F%q{#72IBC4iQeBxylXpXZeC|(_l=lfnLW-8KVrBl0W16M=4 z#1zsHP$%OP@zVx|>i>`B`3jk0h7Rv?l)A40mntKk+}o6k+T7wXZX{DzT{qEqx+h@o zrS(w9+^wm*)2+e}&85!(9+Ck9!xpXZ_6S zG%xlKX%^bQ)4rz{VrCwASU6l|J}qGeZQsnwY}{D%Z+RbL_3A872pzBVIW~mM3vA5? ztX7Cx9kA4-Fa%uyIfXo>Ga+>t3G1rdHqp&leiH#B;Q}j$Qh}uGv2x zk25@j_VHXN7us-OH;?|hdXH2p$pf6W}?hiNRs zidkmokKyS__Y0BrTIxF@fj~)Q9l2joX2B0=T_mpqoNw1KpHU+P^ba0hlu4#@H*sS0{R$8Y z$S}f!*q~Mv^h6gARk#j#m__Nu*gZJ+JlC6;j=p;q>3aX!z6!8PTFjT?RlmP!t@rA= zs-#ReRPhZfqz^TGrfk5xT{F&gA~%iGVyP!^oy)S9y!C*XoEU_2h3b#>uRhxo*Mxci z0{sc0u&b>zkIM;}*_pz);`=W|kneR7ABowIDa>3(*drjf+DI*%1v*ltspkPU8Eljb zJaut;Fz5z5H=YUjj*GuOP`rOJo9BJ|`=xd7ML^6DLnU`CGT;o%2`9mB0?LhadM_dw z*`>C?A7*=}mW5Fw(<2V+t_*f%A=__~&DjDpm#gd~Q12Z^9j){79UV{wB>`+$a+xr< ze8n0H@S+Qlq$(DO#enHAO)fMrk|3_nPioWD3hJNY$2&B6HQeOEh{FY?hf%Nvb zx8l!c{_V=Cq}}UnkpARAe-ut;+n2_EZsDU{z9w^gnT6JLA}tgc+3UElfT8;*r1QZN z#9qBLp&!^p@-pbJTig31kleBV_{K)eC3!Zn{jZ5<@aKbOy3l1^+si5FwOcm z8Y}8p&bQBL|Es3#_7z?}x|d6BDrl{EYjrDoc3h(q=Xp&jpjO8 z#LthUmuQ(ua5r<)+BO!+Xjiah9|3}oQYXr+-9(8Lb>hBR5-L5?a&o@NC@RQYaKwQA zXYK65+>bx0p>@)j>ILg_osr+Kmw(unt33sG-56PG;wu z!cuiyBqe~e9T;WQy2^odlf+$fC&qI?2(by?JAyiQ&sAqpY#RkC&a7}^GmzEwtO}I$ zXisRuuIKfgo&agF`sM|@&JLjOLI_elTBCgq59UyBG%CuxPaMf;Hl3`t-=rt671)Pn zf~ZFq!c$E_%NxY`lP1;xe(n^php!FTlE{YIx@we9w&$Kzb}8L`U$p!MH%;~AkJZuf z6ze4daK3=ly6Y3pKVlNy_l=J-sBcg`*?<4Z8N*!r6;MUS@=PVVDL<#!ECdl{0f1ah z)VT;+uXAXOc!N#b9gB!+DqJ3KV;MXl^EOsCFr$h&ZP2grCbf+Hw0b-}QUPMw%{ceS z>9_k6^zSr9k=oulaL{AE=L*wuM16+sY((2#U<#<5rFK`O(-NW^`5Q`=p1lCay9R?C%nJsIg@8dj8&j*Gcjw^nUH`fce7>zShNlr)awJ;;C|N z0BM)0MGmEm8*9UMitamlSql{sY65GZPKJ-^xBTrtrm~qvUN>n!y>GYQa%g@%ZPjeS zq0%0DCfKwA@yl>{B)@Zb`GkNoyK`aT-U?uaQHUw&VRyFCE%)Hainw`c|6bN0%Mtksz=h1U7QYd1%lh)R z22Z!8iY!ZxhlbcMt>1( z-s^qPiz6s@QXz`QYJvD1+dXQvbpHd+EYy^SrnFla_l0Wbqvg@{V*jWcdE%k6TzoiE z;$t4ut}kX;&rwp~f?1g3eKnw(Hx7IcNE==BUmaZL148BZI29ip8qT(-gXi@bWdHcu zj}<546>dUp+5bsfcuM2|(lrGVE5GO(j3wRXaWtcejTcJgSyI)N1O7H(+Rf-&9Vzh) zh~vGatoL6RTfKai;W4OJV4CD{MSCzKTTkTrsx}Z{ZZ2QxR{uEFDzLs|P3=j7(K7-V zx{^Iqr-@AwY>)6fBI^n~Ts54S@>3$s1DqIh0)f8-Bpt^a+oR;zUp(}{eaCdmLN=JT zD(_hvK2V{cwuhvTJ4Bq>Vr4JvKj@Z=l=E%akEUe1a_PZ?OGA3wQDj56uh?H2ipjdi zeC0|`@N@q%rD(3}%G4y(SDxSIc{ca0AvEvf<74B4 zuYx2rL12l*P*d>WdkuV^u#$805|!@!r+C@Acc!+NE~-Yd#7q6U>k7AIz4+~hkKGFP z;BHxWiXw;ORq|9e`F52pHR`TZhkH+hFB+FQTlJ2r+0ZXGf@)Gy=~S$ELBM7V=H zS+O*!&)T6&eP6zadM1L3RQqKF#HBOYzIh5Z>Xe?%Y;Fm*d1#V!?Nj8dBM_=<=z;Rz zoR~Dh_Am^RUkq@J9vyw8(P?F-xMM$%&kY(qX&zYUNjj3pl0v1?z^aQh2$^K|Ku{Q~ zkiRCUd6)6pyUk-|X{ZQj*Sp76h$gj05c}P{X}_<35tC7i{dg}ivS^-_;^Go~w_ke- z6CxN~Aqin}9b33eMO>Bj*glmb3sn~IuKgVxCC#?yZ@1u28tct%mn6CRn6I%4nE(Qt z)y{xtN76*zmqc+n+uN%+lk-+yVrtyvhG4l~FxSEcicNZoI}O&~N>0s8EFbQ+IY<`8 z%W@qgt;5nA&YJHfipkEEFDzyv&Vr+0!S#nbb>cl>`p)*8V|-(O zWKwl8hqA$X*@AHtgF$fE77?0vanaGWSzqK~TtNKZhaQ;BPW6f18GD@B(rJ^+#y)mi zFE1s0E1+d1x(lmM?;EXl8R-~Elq#qaur;Wtn*}5LBa=5$@Hml)(vf2ztaL-JU->Eq zCp*Nj_A;ak4LMVofFcwuXQ|d(xIjLUPTQYxZ<a%);$EMfsSe7)_Ro0P~HADrgM&>?C z$GS9HR7!fvxE@@Sp`x&J!V~)}qta4jEpw+m2&{^>Z->OaW6N}e%bSlUle1de7gaAy z9^34QpJ5&6@18J9g4a{=O97rj9J49D1VeV^T-W?kL|1LW-r&NJ)||~)9lX+EE!r? z(`5{Q*|P5$a0c~Fz`9l>-Y|QkTyM;J4eu+Q{2Q>(rZTv6Lv9#8c`8nReoH3U_8(Om zG3Gqx2r5>Qr2&2Cb;#WRItj1iR{-J|MlF>KpUH@O_-Kz!Gaamwo#XQ$+Ffi5H^k! zCVY{pmaT@O(339P#a>TAY6|!=eD@tyO(2bNl+gMh;)hr*E?XMxRW0~kcAw7T~k~NQ=EfUU6IT?5UyK#Z_`o8o6Ae8>|l$ppCU zvaZZNq%s|_mNwAWMldH|4Lx&1!9BY4QMsr6W3W3r7&+5~qo}(MM?_cOQ;n`;hVRs@ z&IRJnOIrT9jqbp09G0CqI?f`_7!!f~=VTgKrJwj**uoJq#P$_e6XI(YB% zY2_qziKJy(EH%FBk^`fY|3<5nrK{TdlP+;g<1LQifqvh*83ECVAV`X2k6r|r!=OOx zT`fv{XrH1cEr7U#zP6aZP&IpRRD6;Jw&KDtfPhVeWe7X0_PzoOLF3HLBj^Np?Y(}s z5)v=8rh(hXkBf~PrYV;suR#l`Ifg4LZRp4kGVy4Cb2HUn{53hf-y~E)ft#Ou#ZPPC zSLL=4gxuZVsxX7%aWxk1wXzI=0jC>ST-ve2NKC&BlO2}{4u|T*65Q{weXff6;G0dN!M`dLR zo2l|nTfos;99hOdh9bp z3U|8|1KTxKboN%}nwo++p*zV%zph6&H;{k!xS#4}WHxNp?yU-TeR0QrZbLwLFV@5y zC`M94(Kr>`l;kE&A`^>@e~wzRn2fN~U9XWBJ7&-><3w1LA#freIUadSuTxjIf=N_~ zY4WU@sR2tNeZfA*64E}sI=d5XA&EgV8L5)%_^U2%LgQnp)_-r&m_oE#uwSxk9YpYB z|F_28@ka-qi~4(a@P_6v;e(?&pOMb(HPoB~oGZmQku=Q)c_W`N08uX6v!W^Xv0YT( zI(uiH>STLgZS2~5s@bpu^lU2i^{r=>a}MC1R{=8X{kWm*jhE5IRggzo4=|9oI+?^` zhU0e?#{V4i+lFuNC7uZe@7VfgHa!Wp@_&e)x{8KSw6==YAiv6%=r)h$+SqTo z25OpY6X=UT z=wi=omzv+nig~YGxuCYmGk~?h9EJ5u8c77NqIR2H675)K8_fB)M~#8Sv}4;5p|2Z{hbEdzTlR~4 zA67Hj)%7UOrOTS3;^-X** zdz?pb2bn8fw{!LC>rCs@4$+3NUrz|{_@1+ZCr459*EVf!Sow)SCC34k{GG~`u0Os{ z1^yQCK_5=#vD7jl_spRvHiX3=MW3&~tyssX&wHY9fv3^EQEC!hJb5do0cEu;z>$oG z(!p(QI0?NhuDa=L%cKvpQ!ItFfqwB)nEJnK_4$F+A`glTNmqU`#ne<3nR{v@R=LB_ zB*4vKpppD3lScna*R6Y_pg#Zq!`@qlRoSg=ql%yiQc}_&NFxo>pc0QrNluWGNk~hF zfPjF~-AGCIq+3B^(%m6Qr*y*}xZYbTMod2+bE%+6Rt zPWg0pp!h}d{mH00_o}Yg9Q)Vh!!IwKj|Pt->aS0Y`eVU8dwCn&jLBmT;k!g|nV40e zT;KE}pWHm|t$##4lnz*sOv&)hY3E+~2rsLi0E3?Rjhn~xFe?MJs`WsTG^96acF9zJ zJKg*cSzfVn^;_`WiUDzoqsTim;rs@Z=@v^AU?RtUuYW>m-q8N1!y1Rvj~A`(lIJP2 zI-bH-Tfh}91>G-SSfVmWFSz9@(^3$@I2gdcDK@5D)oM>t*5nvX7qSvjyFkood{} zqv_YHTa`O#XQw;u6FOC@j1_|!uNCK5tgJFS^REsuYO68W1`g)-K%O2PEq6cbQlHz9 zGgRhZ1(CQxWtGUeHT8L9xJ|C)`Bp^&N^ak^aaZT{R}>6+oMa2Nmu9cX_{jG3eSa7H z?fci3vS}XBF$s~D1K#URFF1v6>Qzd+#HYD-l1<;Bg6W88o{`G97O1m|aR?PiUL3tY zop`&cv2g%(_v%{82r|pxH}&{>Sao_vaZXS7>61u%;y4fe>a=7Fh3$u>;d3i(p|k(t z%|6wljQ@fAfH%|6s*d->PpSa=T@l_p5E+emKe-?NFZN`;WX}M;W%i7viECPBwKw6h zV~f!cIIUO9_<;Rq$8Y+lZ+2%S%E7-4Ci!1gliUPLMrQ+peO68t!)1|0fIF#XoRsK) zv8U0u8lbfWV;BduZH_EVE54C!WH#;-Cb(o07vyR;tdevGOwzFzx5f-V4AyNDKPz z`14a-wJkHhUU1j*eGN|Zr&+xCdl=tp?Iy+QE^0fWOLrlOYa1bH?Ny1Z=2e|thv5eX z)pbOf?)O|c3xgbUm(H-xH8J^CzK!S%#$N9x+x_u6F%X zVa{+-KBc-Ht3R|Vl-_)tt}rEi<1yXosXWB3wqT4lBhfZw!qVF2V)Z=nY*Cw|n!>dM zZnddRfmy!1cbwxmXJD_ze-eCi)cp7?;lU{-M(>AI#G)q)2IDP8 zHY$%35(??GAY!0A>NGHZryaL#EW!Kk-X_+8?E-^Hd7`AbW)@6%VSB0o`bQf;x50s?KF;#%nvJyi+_ub~PI2HS>YF{b;MZRcpHEpQc*huA9Do zeS6gzR%khMzw+R`9zIX|JX$~dWXQ5V#OL&B*|gIR8+J@Q(Vp}4sMJHjlK~i}vZ2&K z3(~6pvoztTJrnP)vZK^V`_KoSdaMG@`a;Jiu$}JUPM)cx;(R;jyt+V<{X@l+9BQ` zX$%q7iS@yU-SK?mCw05&8qzl(?>PtMbsl`KKC=`c0^OzEX>)H@Y}d0k-Kux&eTDbc zDcsiUv>diA`U#EqmXcpP3mwo6hZ%kMoWr7?z%1$yJ(W)%}-aJ zmv?j4W_{~!vk%6X*Zsu_UTU-Rah&FO#Q5^Uu89P_aoFl<_Jr{}Hs+$T_AHSSNIko%I9!^a@02FXaNXfH z9{4aJNp8oXG#Xc3Emuo>yr&C0a(=R@edd&;P0<_(X>*B0?+mUjb>zT2_?|=o*#R2 zQMJ9hH=o?3@{Fq@ZKj2Y({QXn;P~u2Hm<`!cSLvGJ7>cng=ZxJ0#Itdu8 zr;%pit1`q4SNLUsRhus}EL#rIQh4txnsFy4r!joWl%+?N9hgZj&&c;icBS-h)p zz+Y>%;ZaHrp#!p+)p9{r7{^g#FOucPTlyx1nR=URD*FtBrFO3ExM_#6u9{3`z2-5S z4JkcTe}$@oa2M{ONDDr9aS2x0IBBI%9`9Tr;ogsnTIrnk+@Lwh-IUO;as#!xdwih0D)}p*F9tB)80tCAfDR>(vX%} z@22=0{!S7YpDXq9xyohi$!%lqu@@2hM=6q-8X&rqHV{z?{n07I&n3JV`z>rD?hbAo zAV|^qT1#c56oGao#AS>gNr2pz5Iq+v94BSP(=Y&9CTC z&Lx|+hS$qWW-Jvtl?sv3^piQUb8PDE7a`+@I-13MmNd~z5|~+-Ukr4}@{A+55qyhV zT%*k3pNitXDng=3NY`Eb^__R*cP{SAvhMWz9JFLv`^|T7smPMpcl7CdK+{}C#-x$? z(K}9Om!4dfoi9BwY}CCkPX?qY`$sGNKZqy)5)jW7+V+<$pZH>fbEz#ZO+WSO?p9=3 zh&ASzVMt7xX&pv5w=FZ*=5VxRr&P81hthVQ58S#a2;9_))00Rao0gi@bUNLAD)Oa6 zn5PxF`IvU>M8q*#e50FEzmrQMnE84;BhvjeB+iTk%kaw~m~2!%mY0N^c(C~XpM-l1 zw$@8RcwKX!f)mMkHkQ z{tkuk^Go9o+g?-+2Zi>U5;6Q*s9Y&P&I23<`3w;*7W zAUx2@1L~A)ZSbHtZkED^WzU$yqGIVSbf&#KP@lwzsX-r6HxkQIUeKXP&zRcz@;yuU zI-oPG&U(m6nJzM{v?Csz8yoBI^|w;_pD5wKf9)~33_V&rdbBC2vaW2)Q0vDHCHv{K;@81h3&#h z`>|01c+fY|U$jLsCUbW5a5$^~`^ zl`6A}K~^O;D#%9NDB{&X(Z9J(wVgxS*I%nUxJ|UhTcNlY$Kz~g-wvIJ%Lo0DqDJ6o zTf98GuMF!eX9kD(rP7_(>FrfGgbwKy(oHH0DCG^NoZgHfm&)RcBcAU5^+m%w^-BZc z_uwVl=ix@UW-IW~h})s!UEx<~hj>zAsY}U82w3Cgs~KwoiiZSN6Ra9e%~ViZp%|K0 z^_h`)iPKY2{8GyP=bP@^$ah7=_;O^6!jhj$Z_3fFdvpr%lEiF)OxO30yZ`w|#GjIq ze~F3NqfJX7CR#s@2_-=ZeM4M$ZjDZq8NQ2U7nP>X1-_f{u9A3_TTS{b=GI0o)fJkG zlA%H`o`yT?d|dcAIAPviZu7?8lpjH(TO=VBAO%8-6DM)kLW$1?#PHD zbM@Z6?@~%Fv^1Z3X}twe5Ol5eSr8??Zp;1L;KZAv21$&=_B(=-6r#gE>xeijR^fBb z*ZlB2$eR)Zitc!>Z2IbEz}rA^DWwQ%vv6Kctnu>Jj5(o(F2Av(15ZDpGnoq9l8zAK z=->Q?guqs<*dH$9@lOXrdJFxt$Gls2-=T&^ynz^b{87FHf63RQT{OdbIFK)CP~KHs zt;<2yC^+8tumP(`5Muhk^zn6sRX!lcCo-I-DB^OjzR21KxAEKqs#&FG^Y{vR5WcXq z4%BkrrVX@y8LXig{Crc0WN-VfJ{bHAfV&%>(D=kX$cA@584@DmBm^v;6uyJ?CfibY z!7w6TQ$_b@-xF*aru9aZe+wYON}|`?JW-5x$+&hO}VFx+xdY!s7PG13ItK`)9Egy)-bFX>RFNyacB8!6Ch1=0~j$ zg;qi-AzxY$zDH2~W!5oVf4k&%=mYWp7wrwQ-OCsnTWe5cIPvUGeAv_fkTR(brK4Ma zDzWMjAhYcoqDQC*oBz*0UUOGR2eeTMX0C8+!vqi>y;Th%k=Kc`!X!!%FDwQV^?2|{ z`FwI4Jj4JznxK9hdQuE05k)cVA2Nb6Q_kviXh-XPix8|Knp7ewmb@ zN1LHQvvN3>BEw1VA{_pm=%w<-|CwU-?8*v=Y9|5k5VcgKZ4}gJ8K(Zi2SIb-Ndx;> zluu{)M+7FHeoYLx+K_TIF&H!c%HLM16!wlso#Zj_0y~S zqkJG5>`w_- z_5ZRB_Eemq`dRV_rX_$;ys(qTYKa>zobB&8t`Wi9y>EsRPz@6?(1|~ z-l;j$_Us@Y$+VEQuDNdYHby5KfQXVaYps_xP*AMTOOA4doQ)T;fEG++7xDi&%S<iL<{bOK6oK3yUQH?s003rFW@XiQBS@vVr$(!PPN@1>V6B+D^H3B;_K_E$;b4^ z`;q-6{q0rautpmQOV(9r2dZrz^rVV$q-`fcmvdscH-l6yc(;w(UroM<$N0l0djyaf zZ-NtAW~9;p9Ycs?nr3gKq%LhY=iXGxy`Go`|4ZL!ak54rZEA) z&!bsIsU{kE#e4fVI75$ung6(sF?|oN7;Hf&k}0m%_Z4JI*^s;_^W&q^S1JvvkiD_7 zO{8|NnfuCd^R2H<@cGTL3*&G2D;Hl|jHSAlgTeNhy_%Nk;AsIZRX2be2>y z(fBrYbauu+-gnV6vsISkC-dg!061*(!_QaWJsj(PmMIr}BC9y(F^UKl0! zG;ZJCURAvD$fY5L;qZq6)+X03aYZ%I1gn*{gj3u>*YFu-T@Rj~ z8aKYx$vTE(8n-rcw$Ur$0TsTDj_{zQB&1TTP$H>>cO8lT&xbpl*sx->3rahrRC+W5 z`~P&sD^HSAC?U}qXy{XGFYUOqO@<)(cWt+n3-S(nAHDZ_@wHGb6*~yDpY)a@afaG< z1|S$|c{Lz8UbQ9h_YjVJ)h;o(-@ge@X@w~H`V79rsh4>>!^1XjL~1}I-Baj$RqdhT zJ*Nb%Acjlb*aX_&R#N%Co$jZnY3L`Y# zO7xi@E-aLHP(3~IC+y!-kWunIxE-h!l`dn)nV~QM;`5D<5o0mGl1oThO0u{ADTeg0 zFCCTZRtI6$bFAH65sOntxvd#(l~jdl$U|z$^`>?EI->@YR2*+DcV6*%tFMRul6Gen z-!6T#wBMvXA4vPGmPXfqk#_p(d79o9FCtqs?fx`g}1?_&r1wc4tHKqt0Q; zUI}TrMV?UCmu-K^fCP1!zi~`Rhi)>W+kz*bbjuSe(JolP;h>}sT@-5W8}gxWDAAvL z@?Xv-O37e3f5tiA=WKYFQo5lqP!t21OWyA1fp`1$X)-O(+Ce+Qh+FU!`3UkXO}|f$ zud(V51jqVB2p7XamXj()-2;k={#*9z9e_k=4hnq##nVipM`Eq3m+z`r$0gT=grm1P z?iycrnVY{Y5EwcbxjLNF-6-VX0hOR``&cRN!(a@GIRAM*ogz@b8Vj>)f=a-Ure4G& zWN`oGwaJsYiwJW|2G+k(k20Vl=_&tYJwsDe)`TVP zpO?|+e?aoKr|8VKznP%Ve_dRNNVDv)qt-77@QxfT`$S?(Cq>}uwJZ(*V$i4-o?B;@ z4d6;YV*sw1{{illxTVtTdxFlMO<$n6<;rSAizI+n$;8+dhg8V`W=esK_XwJXGMElj zOFo8_7=>U2&zB~XUq{YnO45bZxtu(!cir2nsIqzt)$=|G5#k|zMP4+lT36MFjq9D0 ze>;_`=K~ULF^gP1yQJ1zw~&dS2Yej*1{!~P-+vG1l1jg>vGetl33kl3imgofM`))M zK?%n3%C#~dGFG+zG}X;cBZB+~s%ANs9hota&ovCCbMI+vjgNV)*vQ}gko_8;caDpub-c_*rT_l(&HbZ`jg%61%!$(K<=~@;Fm0O$?T4 z$flB|U)iE)?2lG{biDyu&=x2#8fS}Wrw-7-m6a&E$G*gt&n%EjYhr`5Y-P{gSdEo-40Opfg7xTOTkF;wuNWHlOQ;mX?*nk}Rv8{=m#_vJoilCH1pfZI3xxid_ zUhyDaLa9=_jo0+p@*G}&XO6;?;9O!~fA_0whH`gl6x7?@Yd_pv>xezVbt_5BdM11` zOj3hjiRXvX6_^Dg<)-d-J9k(xLYCt~L9uC49rEs*C}LWZ{25Madp@^N!GkWt7;KVU z9{K$#qr%)1FRGb+zMb*8;R6>MUJ(v)gN~V1Dby#|-5;X)-|M?y{npw4)WJ_5+WJL! zhF-3YM>5~VAz$!#_O!5zCAa9YTjfz}k-2gK!{RNt2Wl83R-`hhtfbSUOv|#(St65OxOc}!&Eb=y`nTRuI zsoajAuPGOEvH&>qE>9$`;OlGdk8j)XNu{GHh<2d+q>-Eb6`U*2i%y4_4pCAReFEKC z==`A&Irvnc89AFdDX5B+%Sc|P0jfGBqWJJ=r=x?j2Ya-R1S_&2pVX_>{Gz4BYTs=0 zE@eAj>RtDZ+eS%i(PU9kWOb#`M?L)o-67M0;S{t2(DoUtFZMn@>(0{21OVpUna7Jy zd4lif<#ohjhCP1Qt}Fk5r-j(-#L{>@)6Vl!1chhZqXYDB!B5>`E!N(F`27its}v-; zHTWRW$%p8V5les+$v^AzGFja#trt0PAugJC18=%NzvSVc-@nF;XDjo)mdG)+Yr7Q_ zR5H*4`Lx}rTNKkOTe)Rcxtz=}I41N11U~}5n3DvBDB5YWPh@k3C2XHSVuC6M1iNlz zFf#!d@qXR;Nir`;##3>K+x96JnYq@Mf8a)A^-?6km{a0!DwL~uQXKN%z`{F1ntt4! z48k3P-j{kYdqrgmi-G%rNtJT?#7=IfdzpE!S2p`e{DBYs^fxu@fxh&EnegFDwV%av zyV&%BqV=w4YkCizSNywbT&gB^m)1IFx-WXAjyCw8G@40j?Rih^d@Hd`0I`$Z+%E^i zBrJ=Y^)D*IP7-5SB+u=fDmDo0#&t4D>l>xYvp3oSwHw|mtNq*tFjQ-JfHc>+U55qj z9p6@gW$Fw4VS!TJbf#W@g-x@;p#Ax^Muu3K^H^|IXI)hv#&Bq?)#wp}m?)QF*Dro; z42Z7W9&@2l@BI_0b|+zpK#c3ieMrY2+JW9r=d~#|SeURoTG-mu?~<_VS$H!4jz!{G zFkFWgX8x+53`kZ5XV|g`cHMT}vel?|-;7*B#99$&OZ(5SothJh>(w|koC~r}9Sr=0 zo|G}3V!xrZ646Ou`<-Bz_WK;gDaGLdqI|1hR-gE7RjkJfHRFyu3U#>PuH* z;6;*LqA&-vH8^{7yUNF~ebhePke8UVCTPhNYU0x6oV&1oai|tpz2BL=nRp#XG)d6? zwzHd--QiGZ*_PXMtcl@+I1bLUgCq9wfbd!#UjrOwi`}MSMo>ZGUO}&^uhNl7*+V>d zlBT9n5J&{SFWj!UKfk9TkP!cBG*xM!r+Osop-|oQ0D0C`nZAy^@&qux%gbAVh}9IJ zt_t+o2oHr4f_s;BcfWDVS9k#yTcFvMNYh=r12Jw*EhD0Jw%}+O>W-PFCAm0-#IR>@ z4+f$ERUh!>0~O1555%NB*xh9fv*2v}4&T8BBrBodf0S0%u~QzUltI3KSge(A*Ml9C zP7lDU|3n1L-jp$n$HhT0M6D%jwb3CRJ~{}>85K`OXJevrAEUM56D6Iu=vNeVb#>@Z z9SiS5xF-IUJI-#GoM7!^@Ot|7vB9=+cnaywXhel)+% zsdx)Ee)GxvAz2MiR)DQaueBJAK0#l)Hyg*u7p5Uws~CrB-$d-?0a;ItRA3l`n5sFG z+7+&)&$u>drE5MA<1kb+%zYtV@6+GQ5Vqb|AN+uLv$_}NwHxz(27%qSfB*TC)-gLI^*a-%k;{;;nx}JccRmEF8V!5V#@9# zi+%7*eEULAv-E=gXu()|Gv+0og>q zF&FC@B|A8**F@KE=-@Md%a^MH&&@yWqe)DggXXOPP*ZKqhn<)Se-9P=tOiB04_p57YXb6!Lw*cIX zkGi|uFX??JtBZQI&Uxk5_E);RtlH@}9ruoAVK>aqFb!)cFPu$e|31&q=>&G=+55ru zF6}d&I#V}0{-w&bOoGabIeo(J>nath9?+YY1q1nSq+X0?USScCJ@91)5vf+yC~L$} z^NN(t{@SQP-^$_JL0cOKQjmiSXXt^Z&lB<67{%mC^PY_LZo+H2#}os|F9xkRY~(34 z>Nk?*+Wq;K3nAIKfSu%V-Ep3%&%yobjSsk;wc<{vi#9X%1v1@=1#P$(53_22_{)HdF9D8-ocl~9puv%#zDUo*zHjTgMvrT9k)sf5VZJF zf4;eq%Cg50ZQ%c<$<5kbQsX8iGeRoBeTs$6WGHva1&LG$3H3cvqc;Y6`y@lI>xjU@ zf!G$#&0VulI+<%}K`vbJt%L_>f);g5=O@JcA%^ei^R?hIHLEaNfEdWO=PTE^we<6OUklLq8f4FY zd97E1CrWZjYk;}?P7)F>;slC6Twr#ihl;OzcPxQ-SW}P3*)XXyIDecXF(882IEA2uc(60xBc%uvlytMC=Y+*_*bB| zkZHkoKKDQCf}h;0E;-0P>ivz!N$r4ARnH|QkrS+zOuYA~c>nZtaJ5i{@(+wQw9qsk%$rO_&+V=DU#4jD^0I?0()DG8I&*PcwdcSN zJ9nH8=f|H97^p-N!F}yK-w0p5sCS|ujm{jb^HFq@5Y#K36i^wy6SYSs=9D4`;vOws z@|?e;VuC~C=hbSnc@AEH=hl=ZhZja>W6k!SMUrAxZ_g;WV^sNk>#3wl1Zc(0X5&D; z$_RLpl$=uO85v>)Kj#T+#Z8-D>pO*?8A-dn#ij9EZ^_*$h-lmp}_0{SxU?qAxfP9Ztd8|AeYieV4`$r7>PpS*yV3E(v9gcEVU@ zz%K^|UW6LT$MqY8M?$lqy7a@MJ6IvHmYhnl@2Jn9*Mh8mtTW$vidW=0#WsFEgeUHX8!~UA#<5}XH z0y(4So@6k@yvNFAr$@p|R7}JK8hsVe5h>cbT?HYR=j|I@c!?tg$iE|Vmx_i&n1cc} z)KPfer|2|N_Etu8-Sr$uScUi39`13s!Y7f4`%OR%2O)o)W9tu1ghj_A%z6*V&6fSs z#W`Wi;Ps+uSu3b^3oMcWq`Kofh(*GpN%mmH)yd(YRLL*+fY!$H5=mRgzGO6hk{{Nn z={mz0Cne>)S-_4oEQFQFX{;rA4-_jr4_!ez?1Y_1)WMU#RDlHK?7dwYicSHnTy7&z)4*z1bJ~CrC*0K0tnZpo{PlGOCbg)JVNg0|h zn$)cE5mDiSDs5x(Ed5~7GZ~dR^Ii@(5`)=jWHe8{kr=gDwz2djTF+67h*o}huhQTI z%dQo1?Mz&Eb1+pw(1R@oBlHMgEW!R$>^;9RN14;Ar{HaEW@T*!i@lMbC@Fq3_z!{h zFV_|eq;S7%lz@uec9+1THxBM-_iv(pDiZ-pqw_)GCMlc&6rc|M^|aaJ%>-U_8KwYT zilOd_PODmDQr|i`M&#tcX4sTeF!S8!EBO^*$njoKlGF4n?&9i9HE6?gf=anH_j)5; zH8L`?*ugv@i)z(Wvb76y4G$<44zS8sggi<9GTv>=#}{++Qt^G~y_PZk6Di;>O))zo z360;a+8U=?jFcp0B}3!5*ma@1=C)|Ey_G@nTa7nIb&Hb1`l$u|Gjp_k8RMw~BtB3; zA3g8+!rXrYo5tGVAKrMTLU2dx5vM;&GJ7>ZAzw6n6%lh%FmRvx)$)F#7MIk#dKrd9;9HxA+Xw(_h4qi{eI*#@pqfC&{Pw6RlQtW5 zh2K=IBiGTbA-_!CF8Dd8A^$sG#-K8PP8h&bS44JK1+aMSUfY`q)X!iWX)>8&z+v$P zH0a!!?`(;P4q^6JnZF6|xOdJo&aD9Q(W`@~-mfB< zZq^kaB<|bHC0b2HC8SLAmVxmrW}PPcG^@tuA6ro=F$u@^AUn zuS^BadDqM2Pj%hPdWcLcEM;J^x8#Z??dl@q37zTkbWqD~nBtVpgB%RUKLafoda`-i z%%HDp*QU9h={WC)UrqC1o*Xig=T|0y^Q7OKpAOKO&w;QxFVMhiQnE}Ao&g8y#Db#> zq4Eb?-d*BOD2v+97{T*7x4APcIyiV+-CXKliXGc}L{;DJ!UkTX>Sy()&h0P-Mp@+7 z=QFcI*?6C^;*V^8*PCic`D*RdeQ`KQkj6m(GcK_VcM+>NVD(nCaj~$c*dIon}{G9GzHm&WBcu1ivmOR2Gz#vjY+nR<*~+BgRqtP@$EPdGxU> zP|1X=j~0A5$W2jI~NxD<55yGR}m+A?P>j)xJp#+27k2Sw{Z zglbm!r1p0bBBS1<9;Zcra+z-&W@xR$UR6pEzDymhj5a+9>E3f# z>>dXSF}D=K&3IF)mpij6Gb^*8JG~mKLEDKX^;!8nGmur8Ky|&5K_&+K;{6+1dVZY* zD11)qcaDZjtTk0jsgw6i?rLl`=zhJU=gMnHKd!m94_a5#Wt^+mIgRH~3s@0N(sg8~ zQqd4ks2@S8ulGkSr}@2X&D5>-fUxP8c4c=ccuI`*IOMxQap-CllNc<297Sk4o=dw- z_{b45vU2v2C9_~2-~^V^RXy#dJE4y5jg*}FQD1MlNx*dCXbg(bVjWd8_{Cr&xqAGT z71jU~u9>G2*W)SElnHq9nZ>7=ZMsMWi3fMg{Fb`{3E&ek4srI6>=*%#KurU|&q6_r zBVD_WPj3}$I%`|rsysZQw1-~1Pn-i+CX{2_R5h%x)z~BB(22VA`aX8r-M*_A8}n^(-nRCfbg{%)OJ7 zAKgr6%p3RA0ysrMOU~=>gbBok9W}3N6!l$pnwg7*7oBrs$)CjdJmW;PsRT$MEwV8v z_s$WW4wE1!h<88+P8rkx*l$5!-O;T^^ATtCQCI{@HP8CkIP%-HH62}Ow zJzo%jtqS{u*9hjko!Qy`L9u=xyiUW{|DLcCt=yTKmg_u*XQ3UPwVqKi!}UI=VP|CJ&I0_qnCIFLcF7=e29w+}-#f%y zJ2XyY>}WOc%O>Db(Au?FDc!lBB)nXh(lygdNtf-3~w0j|%zf zdCO~^k>&ZBLu}2-ln=*x*fNLh7+p#b)?mxqKvMRXkrX1b!u7M;5tu|K7t8UL+u-#P z#5u2dM#{l79*EU0J;WFu0$Z!lhgQDP(_5F$o1455XHk_L?>eiHR<%E72Eso%ZAG{= zJNM)+CIzg{Ji|C;>eL}niz41 ztu3ARnY(^HIB!9JN&zNc5*olY3?N-OV62u!0sBi8ZQT#K6}#7nIBOC+AU%K&Ae0tz zpI8qr468cg`_;FDkGXi^p^Yg83RsD?WhJ|BUa+}t0*eB-%Mhj@S^WX=`z(XQ@5sWL zUBC3kb*h3z#NeIL&rNEK8?is$?gz-tPZxA-K;KW*1F^D^^Ln81a|qOT^0C9%@Y3z2 zAbVO*oS%5L;CyRN@l9$jlV1B);5Qg)DjCd7llnV?OrAC#P| zd5roxc^j4Dn&J9Shd~n#?PS{noZa)>w^xU?H<@@w%9>ZS(N$2t&*p2}h$K%o>*qOOi?q`1naK*@8BLyJNNVm3|7A6K zW0a~qNzUFAN*%St)Ux(St4!S@977-F2W`}G&Nss81g6Ea86n5DCJ4OK?kqziAdI?P z`=PalVMNsQPV!63#god;vcoZYKGSi1vvhZsLb zOy7g@Xwb~&G{v(&fBjJ00!M@W!kFENaPSs)@~7$aNlX$`ZqV{wLf0=#5dlwSdBTU# z6!=cGfPns0Fc`!&#X|U!hkd8YsAqX-l{KhyDq^&!KyYWGeXh&-JalxfB9V+{+@jXe zIIfG|Ztbu7(2G-E;T+j)U5O^FveCzZ!lrJ^{TXu2Dj}Ei?8x1=V+P7B^6K+R_xoMI zq(V9D1n%78;lugnkHVjexfjWJ2bC;g)PS6kg=~k4L0I^ zv()uGjyEB7*Vo6iIG5D;e6wwJ#aSfO+T4wGP`TK7_} z%__c`A0Z7V;V2gVa)Qxj^OENzK^J-~Dn(@{=-jaGX*M5_Ug=;Z7<#Z$t9)jpEgPgW zBD-Q+%;{jqZX8xUxj}23k>jeNSyE=uiFS{o1JXaGUlUIjJrr@ksz(Ts@mLKXQ7Jy7 z+Xs_Bu7V?ZEF>W?*H6)}L3ayxZ$(jzV|~U4ZtASbuIEq6et#+faq`JEcP$3_ZJ5*cn>rgZ5&Mp z^Ir`Op=KMUw&G}^GKtB<%};$MKrJTCHo8IFSw~UMjD+)9N_OTaN=RCHS&`r2#H+L$ z%0u8+eXSCSD;}4-H#RD0M<_GEWZV3F=A}yLQbM9Alj3V6!BH<)0=L@}j()a7M^3Xd zhD&1|{kvz5ORpYm+BH!L>pigRs(t2Gzo|mRWu&vQpNmm{zTV06IbveJDMEy9+*PiWft zqH&+m3=dVGF94P>7Z{Oc zJ<7z2C8o+&AMK;6(<8XttMR=zkz7QAMycdJdi zOO3O2<8w1}`E0sRdMg8O9q0wH3tp>AWla3YEO@WJu&`8fNMx2MhMU)fHUqjkRWx-E z3Nh|;OxOx;{>=#$TfsezB18Pa!w1DuDDcxa zDP;=cpx^vX^r*p@9}zs<12JzPkL;d;0-w70PCe>ce#Xh#sXBBF18*OQ0ktCvM?>SA zU{;`w{DwSn_VF0MNo#akWH^>^Jk5pEtVpF9@7X@DenXasoEbQ~>E+bS)qH-D(!?Fs z1bW_SJNxXZydG;JHl24hdtJ^C40XmW3KH}$TVQ1xdUIr%aO3Kh9mYtx2hIDYL z=Le_lDc4hSho`DHX~1yypj;W{tm^eHk@itStr)(cHzER3mjfF|%7&-kwvd|)rBZX- zq!(vA(7vo^WDj*-FH6m>ZO#Tm4n-X2_ju=biyuDZD;^08I_-TgmQrpclEA6TGsWSi zQhsUZ;w?LpQ-UJzXt}wq-R4`4TAUZYxs!-BMRj((j}hD6OBc@&boyhg(XOn#5ch4L27X+B36@XvP-p6O{@xoqB_#Y5diNn?)sOx9eTnPjB=V`jOT)Ivl|d zB0n<5hYHVH0bFZk{FD(RGy=_Nxd0i9vp9S5K#40S_U5>`h^{Tf?C5Y&%Mx3zem`q% zJBQG7aAdnFXSnli{30kJ)%Q&O^s!VX|8&)(p!E{S(rwr!B$&l1eu_FmUl)lgjjO91 zW2;mv=Dr2%;wIbr+#rhTz{!b>$XNYq zjq*4nv$3M#16DQ_m0C^}uFrs3CMI8F?PMnf^b68Q-T}F%A@hWq*@XBfo1a1Mi7r1a zP^H+#ey0a90foBzSu_TCJ;;mYf4TN*JZ0LVjG1mR-Pd@usEcH%o_HrThG2#@59DgJ zev3IxvC5ZFjy49JO9%43dA#7oxBdML8bwwPpHK;S=JI)d`ux0mK;9(3E_xeh%l}}oxUA`+p9{=IR*+8*Xs{)$0-z{eSrS>aeKZc3nkOz@Vf=N(NB6JCu+ChL8>kVF2l7fFT4yq)TE*Q9>F9=@@B- zl$KUfYUqwR%Wr?*-apvq9RFI^rQ=%bd7rrN`+45=j^`@QHopA8{_|*d**KPtE;T({ zxhmrzjL|%7)Aj*>g^~p*%t`Z`bac;rK0nyK^`IN=ZxGS_%@;tY$V1PUrA~gNcw$|+ zEl8tm99@*8H`(#Q!-3_3NxwvVuCAdHzlYjd4?(Br+XZM*wlWP>~#-8)Izl=ap!}HKJd$zbT4a~UiNnZ z*!Hs`>f722vxQ*^ZODjCTW=I3Ca%~|%*DW=fZa8k9YPv(lltziv;506BfdIvpVGva zIxg>^Wtg&RUG}yIlXH6^Bf+&a|= zWN9(%YXaM~1`GK%_FWU8v1H!@v2(>|c84pw6OQ!@pPJU3_7euKJ%4VgAm-N`(v)uqv>X3t zSu4A%Iy$Z3#YtA@gK(D(h+b3sZRSFAIvuLQ+e-J0iw@#gdgs~aQ5AP8*LLDV))X?9 zTnp#@Epxj46C23|i+}?rS{nA&)}3b4YM%*89H4$zqnmZKjil{G>?@!ZhEhALLJR4B zs!Dci*3s*(^L6D;eO?>xqe?pq1?A;}C<<1 z5>S1$H0cs}S5un%sY|r#?Ht=k%SuaQZnc=QJr5??e@==rc83i;X)uI~_MZEvCd-z6 zea^eg?{njdxM@bf4`_e%2^R!9sk028ZJKh?#C*=aVTHgc7RkLT4hFAT9`Vs3SM6wk zv8P9u<*HBIIC6Jlr?)#$oq@ZY-Sv_zbnt51iZ*7%B)QJwP`@OLl*AbYqOOD=oZ#)9 zCHBV*>!lbejNz|hWjA)eSV3ZRMhV8MrWZSQ0K(g{|0(*gy4R$RbJq9J=h$O{#Xg=R zin{JwxPgV0LE|rE$WEQXrb@*?=qaXJB{^l|Mh|b*tXD_Ig3uUNvO>9|ac#-CV--KP zO_)`mp=9-e?M zsnqJ)yQ{M-y7v-Ge1ugi#kXr58)E6lm)q}uJoT%w_&LUL*3ska-t0DDCNgcOKPvxf z#%1*(+Pcnn!*^j-s# z@x-!{#nQLO^`XEC3EVH8mw2eTdE>|Tn?}M-!S3Pqxab{eXl-u2-OS7vGsn2sDn&F+ zv}Hi!dxLrN9iZXAdkA1M(*M;SItDVa-tr+sS*K2+r1e+6SUDRNw5FJ0z2MA8Xoy#N z;wO&hylbtu|4Y%kKs6j*D_!{7S7~DzCs;xvz3>DYVEZ~&iZp_|^Q{7oBrgu+76UsG zRm_*)EJ=^TdGI8=DItB7+|Nw{h!k+~Zw5Y_h!@O7oUZ|$mfF*q8rV|bdS6;DVnftT zT}uiEg3E7e%3Q-CdJ7zk$<2w|t_(h?aPaPsSi4#B=gdRJbH{9|h0Yt*_w$u73{VSw zx8_}@9k{B07@h=6t!8i-RIL`!l+;>>O@2GhZ|uI$2ogI;qOK)uJjJe!ZziHnir`1{ zDl6eaLC~tkp$4(tNGXg3#?Zmj&C-@~*`?nj;&f04B?3V|tC>CBRMqyxL$f}TQ6`GL z`KpBgt>X8?ZE7Cl6rnO|yp11_KVGXz3o9TrRm?#k3x1wzYmx<=f5ST@&%n;`01GVi0=-_G5? z^owUE5WMh|==D?=KMd{ZM@yKmXq49<1x%i*ho+_NM-`FYwX{ua>1m-~(7bK&>p-Ys ziTgJjW5?fZ82>1bSU2-Y0<`=3)FQ?;>h@BS00y=RuU<|&c(9fnGp+PX;EP4hpMs3z z4+eEPshYz!Y4B7>mO~^(x&>=T$5iR-7BKBC2EFgXh0*Ipsv_;v=UjwqXLm35mHZqB zRf~ObxRjHA+byR*g-wz6_l=y79v@Y4!uq}XOI$F(f_xJ@e?Hc``;toPVnYx%*geTo z*sBRX_);}JQ6!S(^KjDk5FYGz=6~94Kj5I6Edcf8O(O;isMdtBzXu5q%RboKs^{t!V?|BcL zsyv$ZPCkazi|+bdPvX+3!0n78rnY45bMJp$M{DSN^#ZJ-59y zGK{lkcp94-wR!f&-f1YM`mo`AKdtPgh}8Z#S6yO#?IGHvrO<^w5SnOQhEDUq%DdU` z($St19UjHeO;Ay{AHNNj8Zh)2U~2hz_v7htl-~~;_do5az{&JqC?}qQ$)oSFfy7RG ztDJ+24M))iMw?GcJU_1ev?;+Hvv&5)T~C7_Zoq_myglXSxutoDV?vT_hsU@$Cw?!) z$MxFeNFy^E)++6fkptaID&9>|(~;jYqpdOh&{DT^*?cS z<}#9)_v}5b`Cu-;H<`0SOxd~$G#28?lbMoAc|7(H54q*pKw)Bqx62bnc!^_siFGHW z|Hpv=U!H$v;u{E+&i{k{m=fBRlM`A*E{*))fBnC*!+-q!`%hv@A%^it8nNj#6>qiv z{*~?w(V-&as!GdxwylkF?3mqjZ39{Dl0Y%W{=l*WiuLo`t;2jOGHN!@OvAiR@arMyA4};z8W@WxscIF_>3GoOv`^oW!kV51 zD=4La6pgt!qpO=W3XLw@e@^qPBd1qqb=6QB$=;fr^c7cUwZF+W@R5|nCut-y&AR`( z)7|^Aj5le3RD`2|`B!56&#Pa z`t>N_s6UCVh2m(j-+fiE5-;@1!<5uiSLeZm`cdQ>$-sD;gP#~|dhL})n~KdD8|7G$ z;k@sD%I>t1@p(=$2@LR7Br)+^2z`m?^xjYEI>P$hd&-ADc9+w)A0B3x_?BzIDj1_2 zH_w;HD$m{tGoR)0t2=N7LKE5@1*MVSZ73PWZ)f;u!0OD#U;*~&5118}8xGx#h6h!o zu!ME_Ix3ZXUhvBGpUYX2hUd68y*dWzj%S&e4b?gY)}nSozkS}rGVHO&BDJeCda-VL z(cqwR(2^B&da~xQ0;r*K1+xpozK6eb+_7*}{FEc)cp~G~5Ar)ggXFEQWvSpC?4M3M z^d4}Ma1=r)Hk$o(K|>(UUxkM6ICDx^wD-??c!ePS{RW8Fq*(x37EI2=^N$?-_mWZr zM}`0$7!dPLj_>Z`NJ2!Rn#N)~aDp^08O4<(AotwlQ4rM9=Zp^{;NT5kUWWb5q@L=K z+M%sljg}FeS6()lJ-&YEPna>{x^_mT>RAZ?`3_TXpz3>|beP1FHi|g>aeKN$;yi?< zE?X(Fa&Go)^l&P#-^Z$(EAj>tXzg$nU5+|1-j-^G*^i%Zt0va<>b%!TTu2-kLl^n1x_1b4Wtmyat=780HNe3LLEa{ko4|xCETV%1*$JG&- z>3-o#mJtW6cNlzO%~!h(j-SUlxvqNitb(I9ZHjMZ zyP)qUB&{JGJE#nwqETHtKg$rFC&%QB=?&?RV%OSfPOCSCOYjYb$4tp%nVxG&`m+17 z==v#v6W+zXLU-OGNvg<)piEyB2p765kHt&gvvkoX@!HD^f^LB32Nq9eP2DB-xDa;V zG7D+!QRRlIUjHnNz@pri@*lW^UO=1^s;_2bKak&9`}q_U=Y=L*{_OO4ya}t^dY|Ec zLhNs1zbpNBY5Z!>2o7O{9-2wNlkZ~>cv9F zj?WTN7^AJhF}LDlDdUqQgEDVV%XK#guiR5Vx>HTd^=J5KqrFg}>VDtf1!-`v>F$hW zj5jc<5+1Uf8ReNQWxf%heU{ztmm{|Au=)9-|7eEmz{b_k(r1gt%i2K4R+mm1`8p&X zIDOu~jb0jgirtUFXhqdz?gr28*Qf6#7}s*0JGziz=L#;G4L845e$on5tMX_bS25BM znFOK=u?`#$+E`>Tu}x2Ls?mnoS*PoB7t`|LVi=E~Jg6~{IzQDaPOD#!8G~UD`{ea> zDpfCXGwK{J_VUGz!`rLz(R*}k#FWQU2Xtk>4l_zcV%R%exV>-xT=^OV-7khpE!J@+ zaRf6{Iy~i7F-v%#SA+j>hyld+mHUcm!x{XE3DB~qWPV#9(NY5KR4SC$0=bRpi?1?Z z?Ey2KD;VVwUig=2h-6}})LI*6((+JpWT}a;x=L(OAK%!^_4xIE-+ zP;=25Ewbxw3&g<{bIt1?Ei(po!sc5x;bCza=!FTSTT0zp1MO$`UFMR0?~W9s@!eKo z;_8NFW2p)D-GD~3>9CC5@UE!n!e*XfTmaIHsDhbG%Eb3C#@wsw2WlH_h2XD;?L-4# zsvgzZR1c}ts#tDtan1b3?0OUB+GF`3P}1*1j*{H8 zkjPkW$UqG@oP0rbHxxOwo-ATqF8Iqw*d}v1(=Qrlt5toMol}b4xfl>srBmuveqTyjBwC$d;WS9CV!g3!l%mT=ixp7uA;xRTKdbgf{#4@)#UkUuOi&e*&- zl$UbKINGB)9Swc6V#G2du)IfVJiVL_bIBDyF0-GW*bx=fTh7aED9!xnSp57!Hw`W|ESr!*=`5^);Bl+1y4#@ek*#W?$Ub zU#(w&7UiNg#H-wvp^?VjVP65}SeEvfSHY{Bh11>Pz;93h0L-lhbeNg5Eb82y(WCcK zh6^+Mh}k-Y-HT4KDeo_%g@z;KF$(WUjknAW*Jd|u_fIYi>=y+KSIBp|)+CI#{AX)j z`erfOMX8R7N2CMm`$a+**<#KzhfkyYYOPD)KiK-*oI~|%wK+2!OR&MzHSno?j<@lt zz>k(_w~#IxCjqn_DnO<5K1utMf9pd|S z7Bv7-#Ahw3mnSbo+;R|OriDL7JV+|!4!hsmi*G2+i+>B736$4cSIg^7Rg+gi(4D4E zHbyvpl*Mk7A=Ycm-SULAGJ%t$Ib@fsx>MrMOI6I|!Dy9uAB|fDc~ITfXQh)R z#VsIVLpKh+e=%axHcz9IB)CLgLu5@U49`v*1FCZ+wg)gVgr3hv=!#qf2qShQcX`7&bDsX&KjaCNtdPikrAEb_4GtVJ|^hcL=D z%J=AofjJ&pAAHN59z;#4)!$lj_NE-(oN|giHECw!UvMpIIWJ(agg2b^+?l%Fcodx9 z3kigdNjhhr4i-egkX7TaoUO;tjl7CakApUber9bJs5JVE<;@Gk8QOF`eN!T~*37zx zv3#_K@t#_rO`>N(rJbotm3VP2psVkocdD{OBhT2qshkkrULpmH#-=KQd{+7z`T69M zy|S!BkX3VKxgMUpc3V!6;al>1nT~@@G0H!8^+6v04Ohx&;A+~^1aJX_dK_%ell%;yT2#7{KMy&{iU($HKXO^ zw1x$@_$c_qN?HkQoqelMZ1#7FSL59Fvve@?X?$FJ`ce4up#*;6m`jMU3L6|dX|!qY zc)sSE6Y^uzyu_#cbl4I#MMc-@Ip~A!OY>cg6V)J&bu*>v42ia-homX&z!4>9otslA z@9n`pk0H-5Higb~@Bxn0`c>zgM7&NT-=&*HI|w{UzElBC3h~1sVCIiGdr%%NfAgDqsd68D$!SyZ!+=OMl>p*G04YNLu>L{bd6l@Z|dvGi$ANwHoPrlvPeGCyf;p zhR%8L2`et=#Ir_8s;>oLqeG7lRAUiolg60arywXYm&2g4mIAdCfk~OYFd8F=pDa`) za(T}1O-DGmo~MgE<&NurA#1HFeEb>%U?`pa(1Br%7yqGNzdaNxrQUXx;taq*#y-L?hi80FrzfR+Lf}9>!q`e^Fd+Er+V)4Q3DbP}s;n0s zafCd{mRB}UBjQNMbLudTyAc?}+^N=(Cxx>kOdzFW2k+*H=>~haNAi9Ct|&#+`XQ`q z(r@u#{SJy>Ozk%g_@NX7!rS3U>Nne)=Do@6qg~jWgJ43%T+@eU&7tu~DUd);W=KK` z*gRR`O{PGbK_T*XIZeuRT0Yfpa?+Cp0C86TUl3=yG_U9Axxzjf^YOOaRy^73_QF8u z0G+e>W1ZCFO!8QTC#}{}(!6c$SMbPpN+Ml$fG~d*H1>=?-CJ&)>l0r?-I6q43#^-( zk=SZHbgeoIOCdb7GA^?!hp&lA{gT|T!NgVC!wXQ3s^04@)4dK}q=&o47ZVaY+qv!s z7wa98zaoXtN?F|}c8xI?rzx{V-n=6JA=?~&&L2uQ8VQes`HR|N4T~d~qj`Jn<8@h; z`(md+3sVxvZ8cop$7_PaNC&TVz?Q1wP1A=)erpLF2BV>e&Yc&M=f@@0*sTDRa!Sc+ z{L+GE_36|u2J;(x=xYyv7KvTZ)`CXHX5-2u$KJj-Qy4 z#5QbYj=4mM|6Y}GA|3dNk+`|vaKNW6`x=`Yuy_2DDxN5);K0v9-#Y!hD%0ACCjk(SPhjs@STQ|6k);mo)>Qb7blG+3m^M8Bq&!bxNGG(*@H32T|qGg?R0;$z4F_@EmRaz+kn@ z_gFXaXfx{1nGYPeZQQmKVA`!RR*tI7Twp%3u;?dq?V}6Xlf2gtRg^y15%&{Wm z(;k+Inj)?pvLrRQkJ=>01ZiKYUe|E%OXE~TLj?c${fH?>;G?rd1-IW>jqTjt(CxxQ z1Ak*=Cz4DD$+0vIyd3Y>{BOvZ@Zh6KUK77KKVp$`p@44>n)}sH{gt(AX~bZw#tBiv zXKJu&3J1e}RO3!%mE=s3D72b1VDKR?W~!nako`6rxUI_#YD}{YP`*Wf5r$+zdL`Ds zw90<6IJd~q_m~-WoTGdJ$~3n>4qd!h#$A&rx2Y+h@oX)u6abJb=U&P1+0dfSkyOf* zZ^>EoP)Fco#aV`cjdp)Nwwi(wL>;Ai^kKhy+AhklB!Jh`ZN69{4ufPntfj-crx0XT zdJT+v8}AVG%@?Car+@v?!j!soYf`uXY4+T=vL@qIY41h~L`o_3yl>R=`jk2s_hdN? zHCYDVvNWvmZayE$D1sr!)@UobJe8B{tWPCjn46Q+hkg|!hLxWE>q4+-7$p~j9tjy- zAqLADPzK`J;VmKR5@j>P-OyHyP%PHNM?05nDXWF_Knj!ELc4Prd?_mCNw{Z{EbE!y zKza>+NF(2W=n*e_{TBZUt#l&QMcRznmn`#2z0K>fj#aqn035jmiu*=c5UjhI_M44X znmq0^DT7{n`1LD4EyQDg!7#4t^H%&W?%nHw&|9~damg9{+c-dMgZZ`s;V<#gti%ZK zj77IXse0{ z(js2*MQ>H^s{&$MDE(*I04fMO6bBDYzLVQA!=Og`46MCta?8K% z#b4yRxWL0^7s?WAt|J&gSpYe&dLHe|p%9QAse56>Q>Ms0+RYWDRXCKnp{)NjKdmx; z)Rlj;Q$d<{h&{QT^mLzk_49A*)BQB&1WAfGK?j=@0iG*B<53R)x?|BA!zZN)U+~Zn zXF3KwA_O95X5c{*1Bf)?)s)4kM1Xmvq6~WL?9xuxDOfT7O)IYwey1z?#W&ofSfr;Xok_KBQFXE)$Naac`$j*RXI=h7cNmO#};AqhRk=OXJ88x6KNA-5=wanJq}8?ozF8DM@`Ga zCY?T%40=rD-3`*4MrEfc73wK<+KBfAzy^*yf(`?6|8J zi!^eDD(13pv3udLf=CIpaRjLu^nh^6OB~3FAIW*RrYIW)Vgsb{=Gd$BsF~$$wC!)d z_u|)aNdW7H;4n-IVA@LD7XIG3Y8iYa@hR?zSdkdVf&Z zuxyZ@+d|P956w$(_Y#P?hGV8+f(e2K^cHklGw3}C^<>bC2@f$mQ}_uqk{o|uZ6sv^ zo>%!p>iGeozw|W*z1RLX{oBAMwn0!-jlDr@$ z@0t54HL`>2&XWx#Z_))a#SW0NmK~(hFBfrL$loQ*QBAR=fdR47eone{O#dU}J0NKV zq@!o41IjLZ`=1bG#>V6*F~>4JqP7ehSL3rbjmZBdt2d}C(Sv+GB(x639Pr`~@YAN~ z-a+S}iwJhJI9DrFfa%=l28I|D7=U>IyQE7 zgY$|<>_;2&vtOyzz}h;;z82f8+Q&n+X)2SS`PWsHBNWp;OpBlLct((3ep>%%TTRf) zjY}ylT*RLp6t`RmGJG*T(mh)^zA5)wflRyWixwe+@~#a1;@X=tY9V{d-Ke)6?=Iyl z`ch#akPRMX@Tu1P_Z7as5pKHz*nKfxC#b^~4~_humn$`Zk6<$1d*iv}rq?z~z*l72 zaHg)=w(4f58aG*uje*K@Pu z7YruR43u6x2C=!FM8w85S1FSTly!0C{mqH@{*w~}4IufqNx7C9ed5gLcBwa%3Ujr% zc)fl4+s|*jn6e~Yw)3fbB6tbQU-N&L^!=GM@3>!y23m8MEZ+P;7O57OE)H$urwK5D zU@oHYZ=;48KuUX*S2Ak&4IqZ+x1R3YB?8XsiQP`S=HI4lG8F{XdzJMbCC8w*k+|vq z3w`nDp)7dRnB79uJvpuK{a3c7q+z64*`PT|t&;lZ$iFRY$Q6$Yr}3WwF!1n`ErJ}x zH&Y%N6%b#U`oKYf{H_wD@RzFcL0ts3M@2U8;;l=*@yx{kZ)|^;dR9qzUFI4C!rvd? zUk+>nz-JwF0f*f4MQmUReP`(B{9kvGTx$e$@GbuH=it%k(8VlGt4Hl0-)LEx0wC+B z?J8Bf^=O(k$s~Te*-ii=2+EUZY+q1qR^BpFC3b)Pw=B~CWenb>o3q>F#79Ha_C!4k zjoHCX-sUo3a_cU`LXgVta)hT?XlE-`?=RI5Jai!LRq@A(9>|N2B<0et~b=4~XU zFRlJdaeGj|cwgl^Dq80;6(1yKDdNQswS8SM$(LVyDIi7ExO7u+oLe&N& zZis^Cqmbwxc9Wj^_Ebtd^b#(c@}))d-)1a@j$x+nZRnD~+JXg!UYN?s3?6LiQ0Z=U z)T$ea=>w9@&eMwMo?}wjR hrvhSJSEzik3C_7Efx9uvYiM?uEvOn(o_^xhW2&O8#=f4HzIGqiDK`Chss`xToWhKH~45=d2C#V z_4A}QA#+vGoe2I{te+Qemlc|@dj#~K5Xb5@|Gbi9$vOX`io;xhTgziA)Hni@b-+xff!zr}>h`8wxqL5D(9wf{4I_&A`7yoE> z#@4H>{u4fs9e>c#r362dGtrbrrerujztB_D{}sKcG&NpQ7il0$yl_{@a~(FNc^spz zXa>-P`$X4|<#!V|8`6p;SFpduF;pm<4cS1Q<;E2+4s6q(>Ye;8>u#p))_m?jKWyOn z3kHOn=eV|+HEl2I7T6+wN~PzgO`i~@7IvGS<>a!yw1z!A} zaS*h9zzQ&Q>sdeknvoos85PNjNCh*0s=ktD*}ZWlEA3q3;^OXLp94jl-5EzIk<-m) zte6Hrs1CJY3fm^Li}~4+?(?w@U7@}5kfq`5)#3cCJvG{k-~Sq}h3c<!PhE_J6wKMnI14cctnZz?%@ zVC}Xn`RE?25#KaBxsywy&Z_|2wWs>|rEv`+N(vk?_jO13A%-TgcLM|Dv1FbarDqaAM6-x1Dnvw) zFPH#u+E<$ADTa(o=|T7EK)6obpBL7-%43ezZJ@t_Y}xx5lp;Ac8X^(5pDba)1IWpD zJU(82;joZr!~lJv$WG+_3Nku3EfZ{rZQpY;;#&M40}s1n|pFRib@*BO!QYj_%?l9z$knI6l$Yf~lU7*vyI^BA|sv z7Mz7Zy_9h?j z#49sF=b_;{Xy%ruu|vx_$^3oL22HU5Vuo=%`azsa@1cA5FNwpCP$aTo<{8xhTUcwv zE25!uK~UyLiCdD}r@(ARXz?JV&jKJIelwdQ-YwpcZ@~I?_%TdHs!%N{QoNg?%+&T zIlxX27;aI85yk}rKoij6mPQNp_>h(;*Ih|ia~Kz9{qQ1}_P4zYgy?hqwi!iDmCtHy zpLi{L&;KoJS{7i7=8)ogPOGLZ?3Ku-* z6Qbe{zKq(rFK|x?&nYFpxv?e`}Gs* z&mFH|e(qbi9u13>-XFx9KQnW8jp;K-6MD8}V^Z(9=UUOK*7e_l?HCe{99O2rVH{Mj z47su9qLf5QemKq#$90Tc>J93w^EfXqxE$O|u&r7}5szRE@t7V<+UXs-!pMTkRviP* zr@(9!w|dL$nU%KbsPCz4{DU5jkP%OVjH9Ul&4E>lQgAmr)a=FrUNgl@{$9m-|83bq|Z z(S>_GX$3Q^q)O7r*!2MK9x>Cq48TFWSHk{#HPO#XyA)t1>e0V*9v-`4?QoHy*on@F z&#wZ5DI2VdM%esI>cmtsSfL{EziID`$YTU8CVVM*{|L-IbZ+qW4Ii4Wv5U-~*ZXj2909^CPNbSKW5^)(}C zjpe~wVPvmjzo|l_VO``m0=xW#_bGYSiAmx%39Wz*F}AZ(e`ob52SyYd!l>9``cN7fPJZK3u6X-hm*i(1 ztYosxtV36ln((H-6EiR|WL@Qbyb~ie7eARhwUGgPeU#Sx;xKp0tN}h35?qso7M`E& zgVCLInMbha05AWF^nY?bmFLqoF<^uH`R?+Zf{}&Oz?%1N{FoE77kYy@aTv8bxr7uTap#|Adu1{)PjZBe_v#vKy?gq&Xc|g(yl;!|tV!>cG z5wz5fA&Tu?J8{|7bPc-V|17xm(Y8_80zWk;IS!p24riwk6T4Fa1<(_edS#+r&I|0hjJ)FbF4Pwka)#{fAz8AL*_V|(O-0lC) z{4L?jzl2IAkOH=YVG**gvT(jAn)7D{#{)`URw2{Pp<4>z(NOIQnh_qO!O-j!ehsr6 z!wz6zb0qbqd}D{=(Dx*f0!p`wEWe7yEuHBvSg#gXMkNlz__q(>D+o0j&-D%(G$F&D zKwwu-5-VVBAdRHdY0^~-*9r^qWv||kjAp;lapgzcM!1y@vzP_VJDdP+`^8*pJI-5W zq3qGH@M>dku=jLoy05x=R};BLTQilm{p%h^u;b&HwKMPdD<6`*pl8b8(`A`s{wBM= zBS7SW`ArzGoFLw~HF~sHObrBc+O*xbkOx>vUMh5M(Zp8`Mi!TA4Q>OzIsqR2YNy$L z6DKcLpS|EN-;7#xz~7ky#&_E<{u;Ge;5?=P=;=^y-XSupbhIY>iDL2z@k;fFBFK77}ZF#~B;vcXev3yidCNE@1WJtcO2Qdh_;f^N*Ru)~NlQOU@5xYkDV%vfQOx z@cs4vg>etpZySxJxdt=3ByM7@Q{bCAm31XpSIYyvd8@;zKj|Ka5u+9K>mX3~TuEUe z!Fz(n`n>W-aq>0_O-L0buZquFcJdV=6y>@!4@*0RmRxfMCEvYv*03_h;F(tl z>zV$^07@C#U&f&S+`Yo&RPbbhiQPzP&N|4Thn%sfCwp#^2NNhRkag4%tUH$+SNlHT zk2ILM^D4Ft7r9OxhqmDqLD=?4y`gn@P7)p0x!{(t%kWs~E$z;GrD+k0b(JCO2R!3w zn4U%&r1EcT=g`t`v+r!e9IuO2A41Q~hx3>o-kBEVjCGt7n3~X1av>E7SwA=4;CL*C z@nV}s^oxrwbAi49U_a<3F%{EOUB}9O@Kf51$_FQ;JrAXMN#oXEWE+0dmvZ6XZ!e?} zyl%EcE$dcs-ZSq`1`UjPtQGrD+{T#>`&kJ1*hM~x%1(BC>fik ztl+G{#flt!>YXw6bnDIsny_vgPSu)aQCQXdSY60_^|`-@?_$|fr^bcrCx-KEo)b25 z;B#TAMWgHpfN8~N7gQ6a7KpmOk^4?UsF{a{V?xuvFz($gtfD*pKPddF+ZtAe48)8r zpQ1kx9sjW!a}=sO2+eoTgaCLPD;jef-*`u}_S~DoFR8V|TA@ijq@5*!U&X1=nyF&( zgO43`+>qT#G9|Z@)o@b#O#7rE`R=+JOP6h>G;jHxx*tQXZbO`x(wr`xxw_y210dd!u{3 zjDQN%llnc%w{F^JjiPQ^%FkYDmbt{Ml^C<>U}z*ZDRfMK*M3`?x1k1n7N z5@KiBSj$rs2#wH1O~mRKS~!qCy+fVL)8euS4^P51TPmFRY6BHajqWK_tIAJA6zBy< z_pHAu*3Ra-LSk#ZQ23-HkMOu3E+DkHS*KuKC`Ls zM1&Xp5S{?dG{Rf*yLi-i=HAl(c~>>7AW2+Vh9H5oB~DS($PU3}7FzN$En#R6Fh+IS z3vpLDq$`rI+Vz?z5i`6?731{KphkZGJG{?GIdod+Jm39Rv^icUT)g7*v z-3~eqDx6{~wrMq)vwDz4Qi2}`W)l&_msu_TGW9tc@;Of(-ug3Hpdjr`ko}4p2Xv`8 zaWpPa7GX({iw_)r3!7;`Z|M6v-iPn6n+u8;qVPHwqJG|<6!?(DzHuBluU$7uTi$HA zyp@gVyw?rXgd#_q`v^y+s*Iu4|59+YVMRIxz0*BM4b+b zi0RiDMh0;{j`!SkeQu!{65$MC)#oi${1VTLj4reuerY!c$dVc>=8tPB z^h*39Eru1!6sFl0$IDb8$1V8hYqWzB`(f`lst%Gek0Y*R2z^a{)K~;X!PBAfS-DA*G`KTMx2efj^J{FTx zj6ApBNPRyBqU0N+V0@vh4s59)Q`Eh3!}gfJ`vu~d$Py*ZlU%EL-*J}dp7d@N>vD!G zS*bh-8?R_1n`%nd<^2t~wpn-CmDT@uT$AJbXBd6!XgHfKaa?{yZ%X*L@INCF{+qGy z(0Ww+Wv_dj&23iNO->K{VkK3zVs6Ihl0cqXrX8jD3dllZ)tI{Zg*CyWj5$8k6-*Vn z8#6UXcH2Q}4rQdms-UtxubHXD8%IY5JvdOl?(|M~hCp3968bK^%y(VVBtZNpN>PC< z8G~aVm|ZW;?+AG6=SFDFTQOBzVRODRw|g?yQ%Zbw)5O11+wGhFFz*Y+!_od%=oRSg zw%jIWa_Z~H1M3=C`!DdhX`#s8FWp>n4%3w!l2LvQC4TLzOsM0Ifteq=?t#gp--KTP zE#5TJi$6Tq&2m6e4;`wkoQtU9)}E8TCy%{XQ9Rwkz8;B9FsbATYri5j5CI+o$VUCv zt*@*Ge|Kpno0gqxXt{GR7szmaXlu2?8L%ZlYnSLR0_-titnCWm`uCuat~V~{bbWsV zw%cGT7*%%j`S{%Fk>}ivXV3P82^(6x0NOQH_l1zAB%?o+-nyeNEyfy9V)G);THk$@ zwNN*A9#nv?0AJ>R9gwWwzc%qIK0Lolcx_d_C$ znt@F&0--o1nN+)|y~Ps8)g)an&x~pr2uGFeih7mT{%X?qe+)GJqL@ zLZ=Fe2wZ?`T!w(3a1++Y%URx3k`R%>M&j=4D1KF;iJSipfdAO!+=T4vgJIV)S8}g> zu4=^%Un2*qKaN*2{J-Cd8+YL&a`W6PQS1-~pDMwYb{IOhNmf}+ew?ha4Atnq%L2jU z$Nw;D0ZjJ7eoo-SdRr1}s11FB>W@lHgrBzrOGAw4EALTZkog5h5gKWNnZn=GN-vbHh z#+OrqpAJN2kTC7 z_sxNcPlz4ZF#+iiAJD`@5j%vnf?lIGNl7N1h9*+74a>rZlFPW45U%+AId1lhnPNf- ze}3_qs_S6XfFXkKN$zC>lgBOj2K|#K`^cVu-UBcryD-q|jx*FzFOF0QW|Ojwh2K0+ z>Mx8npKyL-*F`uG`z4`q8!4OBaZ+KkYuvm$M|pKM|KVZR{IBD6a>+Q1SN7Uu7xr{_ zho4c4+myWwJ>|JMNI9lJ<*65uc!u%lJ`W>khb%L5mPo30 z0jOpz1^-O`Y$prw)MEdyr@jGb;^@%f0ug-EGWxq=2rcKTB#4IT%b0M5hJK3R5VUKy zRLnY&A1~GaDuVw6NhZ2Db!Q6Dy7Lg|WA?7O$6S*6`|>Yvn0fR-EWu>TFPs-ZDQ zc}+b6q5?LQd=@WM8Gj^=*6{M-w}*T7Hd(f28P)I+$L_C=yz&9IbC&~`M`sGsk=3HL;myj1Hnq_DK^~`9rmH9QK)`I}Ez-?Kr!E8^yY?EW%a?=Z zvYGKA%E~oGlkQ)2^H1>0KeQnyzA{`dFnyi*;sv=eli6o}HnHw=jf6nav{CA{+r3KN zZQdHAx*SY`FN}W}Chy)Nk402OAWnNi2HK{%_#M{z(J}*xav^v z)oew9Q3&0G0tV8H21P zYOi~P3&a;cZDC}mayJm_5)gkmrF@@ztOoFifiL!KYJZY6i(mNTH3Sg#K&kk$D1!Al z81#AuO?viak`=Kd1^0o?DqMu{g)5U2m-X~NGA5fd4fY*X z0R|Hib}NI&*E965B=g(&*SSEGDNy~|>?hL%lLgFk1d&~K%)cM-pw-=U|Gezl5zi1! zFwNt(04w$K_zJicsWsSdJT!7bgqZ%*i!VR^+h-L1TZ-KqFV!A=RFB7Wsy1UEj>JA_ zrfAvH`necK-Wys!0HA*8gj#|(ko*4 z<#VpIWxI1E=xQ(Srt&9%tmg7el%~fOr)Hg6PJ->I>$HaCZA$xvjyk&|Gineuh< zLL^a-7VURL@9I1cYPmcSa@oaMaZbKSp<0 z1wnKCd0fs@DJ5i~$kFRqeP@b2X;fpm< zU$6CuA-Slff5`hNFA`t~9Qr;4F!u_{wXr7%a%-5i&kPLV@#k33F%Q}$zp`mx@G8ZR zZ-@rw@?`e!ULAvY_DRT}34VYP@G7DI8M|lNHrMr%xotAa-ofye(RJCbupDw?L4k~hYlui{NO&p2UDVT?x3v^1~A zxLv|6m)CNb-cbv-UZSfC2GO7ApBO-Kh4d5oMY@L4BK@_)2?kOOdS9HtWAIm?Z+#7C zzQZbJ1V=mwQ#3W#Sc$<}!pWGS^OgSHKjYy093%INv007znxN;qY*hWnC*E@L9}%a| zh#pcIJIcNp3hQhp$N}Rj|7JV*(7oETwCKn;xBPBtoOW8E-6oE@vOhHB-NGSREaFzX zZK2Sd6(KRAkkM!!U zv-R$hXPLN(f5WeE)=|(iYVCi=Cq&9Ko~%_c6-w5v%y<=>{u!@UO!#A7 zPkk#9opNh>H zjzK8!T3}vM^L(LQ{n%c}0pcrgO^LYAn4UmbWo=ujevG*6uS9R3`Qgw=^FGC!E1C$6 zQ2ZL7D5EhRD)$mM!7@A1qTN6g&YpcUQ+I_a!H3MExOe~gt4iB(^(u>fR-vX9C_WS8 zW&Pp5OBc`~ECX>bsxnMAn&kprCUv>j&t(@jOcTnXmgiauu9*tchc+r`s$(|v|@Up&~JeBR4# z+Tr`XMOH;mDq-1Ui#}~`G8@;yHO-kxIbaoOXA{|8{$ahOR#2@Y`!G;=L`Kn@-sA}*|7xT$k8?UC* z|D6&1E0X-*A-;daA~x-bqc^7F+YCrwP?GuHUC);N%_bSz|8;4GhDO0v^G>U&4?#Pp zn~HmWjBjSm#|Lbn*0b6|2|n}o!Z0_B&(jw2%Fb;8Uf`y5GY*gqm$kSAJe>W<{PH<4 zt`H+}H{uGCe)I^}8ra>dAg3RnDb{PBHeN5PQ}OD>k=992vxmLz>Sr^exAA1^kzRuw z@4Gb%lMtzM`1TR;Ej=IyltHB{BD5=k%V5dx#dl*CGRdp6bpP;<+alMG7Z)2&5Ar;K z9chv!#Bmv$CsG&PbgT&*J7%*)aqJ3%XTQ{=hOk@$cOjuqH!ef>-;Dj&t0c8YnW)uZEjAiHDpDOZ@^-1j zq1)$nhY?&`iY=5QYXNLH9EEy1sCAE=UT4nx2K+??2m0kq_fqExDGO1vlPn+DS0U9N z5V~3p(RR<`V*+Y@+$^-SG4ZVoB@gdGZA1-+hE*T~La$Lc)P7}VN0TW>*j!|6BdGGvrV+e z1x=Y|2Y?j6w8?k_Sz5(zyOPyRqdt|W0w=wCKx#e^Kr-JAaLBcKLP=|~R%Cuffai^6 z_x3$#$R9G9H{HILGY8EjmfInPK*2T0!_~^;;w!booobmH&~ICo0a|UB>WefA z^QDctH~pqkjBwixs<0CbbnA0d0Ny=o+bKRbzvnX``N`O&rd1i;LB=X$oA*xKd2}lt z4;3rAZnyOB0Ed30&IfYOxX%&KAm0CtzweX*ebM<3Bbs{@6ochoQpW^f5F~JmCEsY; z7I2c6+BWx``=R37%+*Ue`+>EMPt;t#YP_yJB(kV1)5^mY_J)R5`G{!iy8d#>aqb)Z z3v^ar1Bpm!dyz+sgEc~a;ZF#>+{iW%GjV@XG2^(nO%@&QP}JNuE~-$g+XY1;wzJ*H zW$|vNGlx`Zu#hjOqFdq+3Uwz(_gCn&mb1^QSQ71s^eUif`NW)b_PBGQv*=Z zVfc@XS7G%tb1?~z9?!!Q!av)pn(3*lNKQ>|EY=ECnSJcqt!Z2U&-hCvlIn5<*VVTo zL3h=hPy-B9U)DcuG^D?TRXSNo@+>L6GCabGMuU=)c|48boU&a4ne7rnOVU zSK+g#tMiauVI{v7erS6~<3ujx{X>^d2Y`co>DJ>+enLX{{nW&<$p}Y}}IW-$T zyGZGt!C$qseIu{ZdH-LXFHLO5>haE;9Nc$oePw@8#EDbmOKn_+CidVk2oX>lZ zkuv#|OJKBsG?J*ydqFI;t|#njNR?1&W;HC5V2EZp&2a3+T#Yl9fR|QUCVc+IFiu2A z-DBs}c9H)GY$=BijH7sCb86$RWp z$vM+LUF5JO!?k4}CL*2VTX)Kz7nZXNOcXbcJt~IIa#hW&T&DWM&+VDwR^XT19RbuV zZ1TopBdX_QAXgQSSYe8!ObP6P4<}1fGqPso7jj2RwbY?dwNSl2rnsK+tE7m`AFU9- z(m$l;mMQ>fqPDZ#y)I{=TkDPaHH?P=2T!~MHZf7iSCW2Js-A8=t1EssQ0FOKO3|Q6 z^E2O6%Y3Q-7-Zfx1D5i&u#3HXcKf3w0*lu*_>0=G+i01~j%#*nVx7`*7HgSflH$py z(MOPMT7|0nfr>mvl4fekn)oJH)ZCB+T|1`Ywd1x+K%F&_Dff>}IcD}eXrPP%qoXR= zvh^s>lCv(r>m|7GkCAXb=x2kqQx8Cj7y}Yffp~muoiQ z-7WAxydU@>bVkd8`>d+y2ip>R2GO|@sD&!T?UJQL{81-PI+&h(JY#i=*}edUHAP3h zA-XcH`rt7;d^4ss?fdN!Y_a_;m{i0yVQsiKP{)_@LOMIi24oLBc8&iDRLbL%mP&3Q zF7~G7)q@HY+FeoErNfoxkyF;g!u2$ z?h$G}X~d`fmaE|-aVa^V+IZ#ovEXF)aD(l4h&t0?&@~&0`Py>jQ;x76sf$@*-Hz_y zvi21O1}(Dk0JGtF2sBpu%gJ!W&-0VLLC3%| zeB%9QfKAQ1NQZ|Msa8a2y&&<?l)VJ^`r#aqjNz^9m*kWsmDVNmRXBPcyFMp11@H zQ057(>hDUeHBmsDKd{uttJK|dG^1YD@lg9o62hzg&B|c|j6^ng87-ga>DFQJu(Z}P zpv1&^Tw7f#9x);_VXq2{T}GZ6ul)bKAn?M==qy9`vb0)9O+hz25n8zRx{+>ffjTu} znM7ORs|P94%t2%<^ssqG--J+{qH0{Rq7$Rq*;#^At@pJpt(q?VLwh+NpGO7ZNNior z+oJeJ2Fl~-YNXS^VRl}HU4w?L!vGk^+U5k39OYB>Nq7W<)USUn_dIrQxDV@V!#Q)S zMMmVBU&ugZ{*25XV5cKKEY$4`lJ}%)P#rL^Vg8=ab69!do}~XaePFkQ4&_rV?h1nN z<)kfL#;kAxT*@yqC+r9aU8XBAi!+wy;CGDkj;HAZN<^Zp2PNdzd>li?QbnaH7{kbp zT}al8TY3CF6?cnEOw?XvKY|ppSN2|C7e^fBq^7V~je`v7px?#2>Hn?Z|F_p?7a{lW zn?T&1N)+msZZIQm2ZGWHqAokOJfif8cpqw%W#r(WLJKOti0+O?v@|$85X-2nd#0Ss zgwWP;$?q6s`rbWO7C)5gR8==qXSfwSkFbIdIzG5PP@Oc2<1Z&`W~d}c3F(*gaNJ(g z(5rf(1Q-~@AQf>G44j%8o?j?_maD%YK{xZ^+!{TMy0Ju5Z2JsalQ9~O{MaC$#AtCn zMZ|oW1K7;lp*ET0V1v(K36(3F+~y)-y0yB}0!-=zN3us?gNv#F zsEhGv52N;Fh;%U078?VxO1rh1wN_wkf?1D%TT*8KR=70Gm9zqqeoxBomvBw4*&c4|>D?$Cs%-iEFE18rI5?slN@1X z1a3p!uQlz@*(BwnIoBfpq|O$c`F($7(Olf;1)Z^>L+K!_?;)Fv(-e38RLoKNeZ|rM z+pE=4;7LS9KpTbeL&lszATO!(l|r&T!B90elz1f&m2uI%kM;8};+s-$SkTp4tG?v+ zKzl5`)$2rXmbhmwQ$MvMx*(g^{HE8k#kcj9p3fW1)^wpVG>9(r^N}qHy!)v{X}$plC|v zg}~}EDK^Gs(`p-R;K zsWbWLztR>m)3e_paq?@vWig(kd1y9dao3>d#wy^s0dnD1m%1gpFay7c`*G+)FuA9` zQcSgh|?lx2(C8uN`e@WA8z~J zT})0FXuz66K`kp?x|+_Oo;WvhMZDYSxxjiSkVt#l>Qg)9MmvGN{=?iqHx0m9x%Bmg zPt}UmQS~^FsQn@ep-ynESvdpMv;WYcE?#tUv?vE*c!B9oi#r=;9k}jDqqEPUS?vBg zxlZP8dT47uP+j*@3`ToRJ*?6gYR_LHB$~NmT>zQfE6{St6oY`OS*#RGY$+|sD(O)?XQ~0> zCHKVZNZ5IJ6^S=VUTQgS-zMXI`OU!o3|`ZM-=JR3CgkyZ6MeOSENQs`HD|+z?0Gg8 z8o0-7@Xca<9<7?(`PkVVFd^L}e5y0`q{ei-)Z`-uAKk-M53Q5qZ8^o`Nf>%MpkOKYG)$0%y_p zoYD%xxAXK?kW(Af?Ap;>0u5G7CuaiE-)GfYmNpJR2oipz>b`qo|I%D`f@7EitWg=z z|2Q$i~C%nB_t`rPjoufa~0hChm_ZvLqJJal9^{tuZF zG%Dc^X4xcbLIH7A`fUKAULqE3TFeCbGbBo{D1D4-q*OV#2`#;^K~*6%TYcqHi>KgM zYMiNWRuld>17_!*VOd3~gN;>VcgKMT>${eNo&{3BFA#qqxp}VX)dj!;=J*m4z>VV1 z0Ok;TzB>b{PIbSf?nIn}U+%hh(W?&cDA|0{4o=*eoj8qYH^{d$Wd(GRvJ4{}zk%>Z zJN26=NVJLj{QVCvOF}nP0%LR?iq|JU*o(mK@|t8XUlTZ!LH-xG<-Y5q6}!#5cbS~@ zHUz1eJ;5lYXH&)!a~&Y@(<#&sEIT;IsK|fwASb)ERAHBeI!&|Fd?2}*WME?I=5Py3 z)7sB^(6K4R6azU@jQpDaYv<=g@tqsUTGirQgPDL>9I5!;H#xVm@BZCsiCkvUNQCFO zTo1Ke=*u2-we-g9NCP1^puOmU3Dtssbm{I3(^7RpL;T{9rRMOD7jJ9~ z5aWH!a>Pt9rUBWqeDPZ}M0zgM~;JAnSJVxQ|asWS-^d4>%C3%C5! z09+Cedf#19@Sm-?)6h|VnQM%YlZ|YX`Oa{}w^3`DS8CS2%p~1liPzb<$_P%v(wn_W zsF8>|{v+g`=#@Tg`=dW7N{+e}HgfgQ{{S2V)MFHqUn<&(5 zVwVle7JUi0OY=de*S1+-5;4PwY1Yi*4x9HfvJ>skhm%kLBcarnU8z>C(vdH99xQ&ar3zE^O5KZHVJ-Q~$GJ=v^A^l%_nw zIMKJvV7x=YRON&A#+GHQSrb}8S^LU(MqalaA4zJF!%81|p=J|0BJ$khLb0xriy=MJ za!b=Lt5rtfvi4%W;riq?uW`1u##hj7Tcg)LyZGSRPgk6%cd2oI;&~PDlpXH-j_~YJ zV>2MXsrimyF6TceV%b#MG(YmL86W10Mk0++L!-Eb4Yt2MeNFZDT=9J#PcCVd=c(K=XKrzQ9%VV1Io;V8cH`SEx7Ex+ehHs? zGBo2f&o~pQ{;_RVnrPqAX0wFmDS>}WKLLRlwsPj*bm?}I4l@3f*a7k`^9OWr3ELcg zC}LAIa}F7UTahd1vt?iTSgtBH47FV%GJeSozh%3MJ?k~+XyZiEsFtxo#QtTO$}zA{ zG4;cVl4!(uz>(^nE4P)w{!gy$j#hv0!X(G#_C>+Y6qyC0ghV0MYp1MMdT3xLv3d;K zLCik>>|^6@Eq%~uB$}%_B*|MhrDGACd)Z|df&NZU+#=H8=Np-w(ep@O=zl(AH)Xk= z!IRDCd}Z}#Z>r3<9Jyt`l0%XV+AOr)Cn=zlwq=0P)dF|Dl#UT~s`im?iW$rzmV5CW zM3$%4Xbkif5Fl|5Gu(<>BZ?qOP(3N|ErpQ*J*g) z`yyX`SPh)x;I!{JB(>Aha9%$Xgr4upY=;RBX0MyGo&3DsK`^tbI-2AB-5{g*&1T0< zy8g~NmW#F0x{7GdRWX6`Oxx44J)x;SKd6=_X9nVpB}^|HgNf7q_>*EjCfD=+|AjIo rSy(l7hakT|_WJJvXDNn3hLd0D52a0v2TXS7sE>h;p>~z#{pkM#i{KD2 literal 0 HcmV?d00001 diff --git a/modules/ROOT/images/comment-delete-comment.png b/modules/ROOT/images/comment-delete-comment.png new file mode 100644 index 0000000000000000000000000000000000000000..fc1bebfca92f53b506609e02f7229ed40c0c5e47 GIT binary patch literal 89722 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�B$C!G|(1Cs|-36%=QI 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 PK>oypqy)?OwY~ly-|5W- literal 0 HcmV?d00001 diff --git a/modules/ROOT/images/comment-delete-conversation-dialog.png b/modules/ROOT/images/comment-delete-conversation-dialog.png new file mode 100644 index 0000000000000000000000000000000000000000..e1ccddab1db1921c725bcc2620b1680e75e3ff32 GIT binary patch literal 218568 zcmb5W1z1$u-Z)H4DJUX>l%&$#jR?{T3=IO(-3^WisC0LTbaywx(A_yoNq5(Ob3ErB z#{21aU!DhM&&=9u{kk_FZhqZ6RR!NJ{rA@S@L92{C892{ajDhlvP78y<*92|O% zv8bs03sF&0c^gXuV>5j?IEjxDQMcq3Rvx^)avc&Ck^1m9yx-LlKJ|S+!jrmBk`f5- z?}?DU{gBX#tARm7rt&fiJzp}U)#pjMSdp$~u$Zta9!5&aE(6p18TY-}I7frt_^m|O zOWWS7z6--%&h5119^Ekp*N$K zngX-8`ort=I3m{O=B|`qLU&lJ;Dm%xA$u%U#;8dm`?$&!y$Epja64-YZ$741;^<^Q zG{*im`&2gmTgcPEBm=hSKr{@U$I{4fa^J1KeuNAD@gXU(N9NgX@bumC`@2XY@5NAS z($muRumu7OAK&vjmQXms-|_4SJFbY|8H^{CO$j$VWTAJG6Hb2;QF4C87kEW)oE17j zaQY!M^lSa&4@%E^b2%wzv^$%R#lR(WP#K7vZRl4{x5%oP+-TJ$Yrcy#Qw2QaZku_;ia6!b3>*K zR2l?~ox8!K_tH>a%%5Zlyz(?~$h0$muq)h~cRMsuhXulD6bX-!>ZSOs_3a&mU}`zI z;^Qh+g-1GRevy92A77~2QQ5Q{+m#2KT1ZxumzE>HUajwSyR&6HbcCIv8Ml|`2-leQ z+Qz2Xy?5CY>225m9QIc438nxdX$E3rguBK^F4s0r_b8^fs0(nonQ*t05i!B|g(!!O z_?3u^&|3(?4?mzt!Q)YY*;4ligRw^6iO6G?ze`9aT)*WjbejuB_U(iII}C5Tpgfhx zn_x&X7UsLL*Z19!aIlfSk+M7kE0W4cV6lL6AEPXwI}5|hqu#&WD*Q1RJ5=bT-zD=Q z4Y>2OmpuJGs~tf#oTj%+vah@#8)ltXedCj8Bn2IN6_WC|_)Iv5zAaEnE3$a_|IPSM*f{4XDA;HWh4{`i) zd;&f;Q|Q_-c}KsJ#!W}FMYF|X{c!T3Ro7SrF&A+Z?@@qETYjTO^JXiDZl9iOA>ueQ z;hl_ktW8x=1ZzT#2l?0)j~wqi-f?`y`Qhw+RFmoVyq($Ohqc%ZceFnhv?R68wKaT| z!(KphL82BR1&gc5j*D~5X6S5Qh zlQ255QH@CYt}sn{^~Y0muIh&Ygu=3Nfln(G8RYU6H&dr&s_r_!tF7mgN+fTPtQWZ~ zJx4rYM*j3JLL^xvwwcPC$2$jI^b?nuyBMQbqAvLR<5s^FS?Oudm_@juer=BlA=Qw4hW|}D&zjV(21Y!r>2KBt0$#8jL|3<*R ze$Q?5JmrLXN${1|i2sPlFesDgRn2FP^!(48Ul?A^<$1hxf993`Ek7i;NOV58t&mD= zNJ$~NN^~!NiMIM)!V9^yr~%%UFKQ-g^=kL>ywqmYa3)bEzfG={J}OIE#kPOQgT}*a z$7A>0p4}dAb!lyMO<<7x2lIaDzQcrF+= zcgj`GhfMZHN54i|*7TK+1?pDxTX<>u&TzWkaxHTAx+wI@7maTr_PvEkL;j)Yqjl@u z`5)gZCyQowO2X^0N^GQJ#EM%2w^>j-QBNr!J|euYard0;D-DHUDsA|^YPwQ}eZ6S$ z@yJ5RH=l2z+kvQ6AI3jSe%O)dYY%O&f8v)J@p9~o(ih}`Jm$*i57F7tMXg$Xjts>9 zWq$Pjbq!x%zt{}Tky46EXW%c9w!k->=-`spc%z{?tt?BL5z6|YFK`Y=uv6dK(OP?N z+L_m>#SPB`?MnZhl*o%_`4p+|hhM)@RHP23-i4QvXK;#JkE<1Q=A&dvK4Ywg%udH|V z-H4Z|+vspEWxkB+*&0umJ>{A}ZjiI z1#e(faBd}UJ(=9mSuRdcmNJ(*+9KNwU0Zh|`;g9Ls-Uh|>z1s;KCCzohfI7HO= z)Q@CW5+;Y98Pk~f#71!jl~a`Mmp!jIj6dX^8CaSg-S<0T9NAFYz%>l-HRG1zQ@3*1 z)tId++Dq9Z$GgXfX-Bu_e#NTfAaXvhJQ11S(6VNx-U_nUyI8YcGqy!vJ!UI-?y==H ze#^bCcJ{Mx7S^0Vrw7}PQx8seSW3pOoK#X4f6jT&kBT;dvwGHx#0$|3v%ja{G^=F=* zEHND1PrrZQ9{K`@{*vo4{9DHnxZscpunk5G$%DS`p&^8xb3|#JV>v!nTRA^|xZ59M z2>eu*;kg1cFA3n@ge+%;Jn1HC!Ny#KU`%#-dGU&fDbhm@v`f^Q6buB7I! zN?+6D&>v@9;61@d$>PZD7YCx(Px>k^3}j^BXn<=}I3#!iIAq`o9{3f2fApX0=kQP9 z5dZod0S?aB7!K+0HL}3#^-nPHdwtK(SHw^sxLd%xd%&+#GQvNr(E^hZ|G7r22fl+7 zRuFyh0(e!>v(eYLur;!@3qiD?06svol2EmUgL^=E{R{u%6~#8N|Cq6&ik*s#G>@L8 zIfKp{OI>{iCv&UoecbJ*MxT^}fr){MOaPsfl$6irjRDWAXV3q>9eBr2W@Kk)#ly(x=;+Ac$jV@8W5~$N z&CSio#KOqJLJzELF}AWZwzMF<-d9K0(%z1rjO_ZL z|NQ)fQ{Tz>-;*qC|3(Wykn#E(MrH;k#{cXM+{$mT?z;LnqvufR3DE_Az5Z2%5V z2=2u*VMQnS^%+CgDV4$UwUlRz@s#QVHg^)J)~~L1+zrxeW;O^T^cUmt4{6%p3Sq+u ze}ZQ#V4tV@P-%rQ$n1WcnEh-NQ-|~|90Kb9`iIS5=p9t0h0oODK0Fe(5ZwRvrw|D> zaEI)FJ>z=aZ7LzF+$LhK3cvpYaM*xK+MATCjradV zv1quaA{1BXG{gT+Wl|w4f5-okwtoR-#039N@AhG1mFEA>6rs1!hg<&#>XP=qMnHlP ztb=W9{%3IkSlPrp`+uOWP;wI>E9~Ql%MN#c%gQIup}V^*hDW&`H7DY|9A|!I6BB(} zYc(Z#^rytqR^3tF5x<;%^KCMMM-#KArC6oK<>wp`aiaxVJG~#q z6CYq0%9bu9K|}XOArQBzi11GR9~AJdda{+3^brHYiPH4!=0u@C%s!-0YHW5o2U{}{ z)W8{|!uPOW!cdeLoD7ZLTtaHhMP80u#&i>d72^+4Z$HMYc$OG^HP!7#`2+2~lUX@C z>!;tlR7R_+D%y6Rx6$rKgjsLI2i~&p$hXx4gmMcR8u)v8`M_Z1tp85$?xo-lSq(bR z$EU61I51lYB_kkkf|>bGjx3QNG^9OGf4|qU4pP3f)jAL75=FDfR?kG2YX6LF{d?lR z=f6mv4eIy~lWqR=bhNFFni9`_x<650xe+~ZMUwUmmme;&#IP6d2p55~(oq*57D`h2 zMqF&$t$DQ#HM=e0)*`~&e`2Xn;9C@koyy&UIM0Q3oJFbE&*-c~!%K>>V8pJ!5dr>V z;oA{sc}2o5avfxtFJU-~I*#CA)qUv^MwDarJ*U{PV#`Mk24~VsgqL2gTW8Uliga7Y zNnl~WAqHTSd)p|G{m~p;VpCEB3tX6mnbm-~%nq{^hS~bY-S9}O;*E@427QTeG4xH; zF!0J-BA`9y0$KL?pOC@AeuMb(V&Fn(G=D%GTulDwj?|52*gdcr!CNwnJ-!Tg3H`=~ zbU1D*9qgW8B}pZ%x)Td=@NFOLmXFgOKZ5}iJ2SKKC^*_ZAg(*Q&IcMz-h==HEbL|r zX!mglyLiWQ+dG06-FBvG`l|se(T_YH2%~JnDvdbDG!7j3Et-DyhM&JjGh)#GURZ^M zkS!h&(xyt>&ke?&f?ekc7HML-`eHG9kFcibH5v>PU@b2nLd2awX9kEeEK9&NXxM}~ z_t>I@VbQ*Eb22e9YT(Gcf?h8S6@_#FZ{-~@4y(^M?t=sS;8seeJn`<5(vuRZn3dx`{(4dGH`K8lQ858R5-h$RZsq0Or?ljV9%g!!qH9lwg~} z^Ku!;4So!mq3Bqbar;G{hC=``<#ADwhLv6z9855ry!1BLmJJ~B5;3lLk+Aef(xnbA zG!-*j*+r<-KzckHuX+e-*{ogNT?MlA5nL7rGc?}6t$`7QNog58S8J|IEgCKCePskgb(&f&QoMT&tA+S8W;{uHxWYruq`c>mu`{HCH+0oQyV z7=5~N_gf)Nv|$CS-2B%ubTAZ_*8{|r-2+a8_~xEBz!QQ4b75c;`t1$rSis8J3J@_# zR?JKMo*^Di;OA(8`ZIDY%YLq2uH1vNn}{mUZ%X?(It6-PcbT7Q(Y7`7tQS-O+*(PS-`#tktC`#h+85z<=40}#~5<3*M8?~!XpUS;NTzC(X~pI5>o~N`dn?j=!l$0DeYrU>D3lF?TxI+-}vvpl)>?ODK#BCjd1n@UEXJ z_f1w00vY#tPJDpbX)@+mRU8hv5~)(uKeGf-AS$@}BYy(n7@_^oQ!o zETM#jnwzk8Z7h{YrDm~@a>`iIjRyI4{9bG20YSbUNI7_mY)OvH7Njne4`aq}(*~Qb zVjFLU<(}X`gstcT<-ECnzZo_TxEdocEhzPAnI8HlV|!*481ckL1V4*=6DmseY!t_< zV_F&v9S=a3f{{a5k%!*RjDkjUB$`!E20wF|v%QrrC2gBAF>X=z@dZWboO*jShy@dt zS9AzVa}ve)9R>zi`Vv^n`Sk^9oIuF>VmWJ?nQgLwyk2wUnB3wvBs=yb1VCe(;1n;m!TroVwlB13z_=tvPKP(RB# zK(#W8KW06G5p)TO{dZ~3As*U^XE}Q_Y7)`g zDx0yz9^_mgkgO~$&NqqG7(^+b1C7=;lGevraUV*z84{6YbCgW6Uw|MiTile7WF4g9 zDD_a8B(*%T20#zn~K~lMsIEjYgFDgI)Y=7A^Bl?&V8SsmRU6GiI1K> z>q<6OmBf1P5$(A_ZWR+DIwA~TrB3O|%D?c@(tf#b~i zz2g%SO66!`zUq$_2wLjuqvDDzCzeq-OI^{N=++Z~F#@X!jpsEoOKyuUn@e-%gL!-4 zqYx%~+Ae<7zzFs5z26)3ZA3IhUakiqb7|E$MuAvQty^8OJn20)Cs(`A3R-UJ9Xt{Z zV{kNUBYJ8BX zWz{ViI1zPlG0Y!|M-p!?L&Vz4f&qhs5I=gQmtI!6FVzE(6Gi86K`2y3$Mg`EZ8zmT zSqC}$E@2G=$AiaQ1`aQ@?h%@fM}^!>X`r|6x1$A?#X?m|7gSQ;sy=1_@}u{^q<%Mb zPY4l1k@7DtD3!P9cXS2ydMFb9YO{H8+iwT*W6K2M_6Ekdqi-q7zlW*_lR5kWQfp*g z9KthV26C>^$}KX-8$nBB(34<1Le`?9=Ff#s&hC$rae>A^@ZUreMmMmHRKSwAAnTI4 zI*pvj9mVNNl(>-Q+;JESbwCNlBOD6VL&o?dmM#6j0*HjBee+<5eN+2U*-C|4z4SP< z3WW?ED*-(w4SR#B$U|-u@t}&$lVK2TO`%~e$&TZ(D#p;N2YJuO+)_5bgNzZka&|*8 zL3>TxFbRdGhAi|%4E39Elg0{pSalQPJ-zR6b}b|+{N#tQihgr-@?&IOz%hAu0hO>? zpQkwYcx&!)*GsoIRY}k&%%&wNJvwbB~M9ZCCoMLy~Y+vtaCEc*LL7y5n z=}7jGj{KZRrSClPH)3M&^LtN#kn1Y$+~H~&2+#ud)2$1BPuu%X<=3FmxPirIw6Rs3 zx>nLtvYQE%Z@S*MerJ0w{lP4GzPe67eyLUC1~D?J;jf_4RbHqYG-!b%LtzH_zu$j2 zMu-ydqw>)t0gg#P#$ycHJbtw>^|DzJ-%t5<_gVa8YzfP37&|?EmdH{WOpfb~WPwBI zcaH(1MgWi@J6IWlIZ?<9Ly-+o3v>)zhl;FWBF}xON?SBxqF*i{hj;Z?`}sGP&t0a( zV!tQY`_Yo@{mW$|A#fu!nt}}v^!nKZ_3?cq$UF1#cQC>Sqkb(wx|h>Sn+#vof)TRl zb&Bcl9Fcx1{WdoM{f!o0{f(pxic8A1gbRZY49LJ4Uqyg6#3D&cmhp?K!Z`{x^L23o zHG8viLGpxjZ%P;eItS_&CpCo+ek(ZeNG5dhUC?oR>aJ>d~vjwkhpxzhV@C{Oh6E7TC7h~I?uF6y1Y7$TX1&TUWiWTiCUus;Y4sXPO?69r-; zsx!-d1xTm4RMneofA+y>juA+yJ1p21NEU#io2fdLt}jWRNPW!3Kgm(``Ym~ZFFs%s z(r&3IZ#)^hgHwFvrHqg9YK?OQvbk>{Hl@OHLk5L}-a{W+!v8)9Mg0m?i&RdCyTl|H zhGfIoPOrXbv+5oBvJ6JjCD9xHD+5BwTGv&fwJ^QeUpe$I@6Vw?M&G&jHb~mEvlYcu zMpeS1tu%i1&w6Ex7_Be^q1VMoM`Z(lx>_NLjC+`2khyWh^N%lQ_I+mFILu8!bc-J zsqhXi_XYNRj430`7&bK}(t1j^xs{6ggqLmY+^BpZ8Ew?`%54(v`!i<7#vGoZgA=nf z?sb}NIb2DFN0fcZjp*hTBkOwijRYgrX^suB~ehE=T$#M`&JscKC{mIc%`iY5xiM&|b# zaS%Xx1-PSn5=19v`7!x299!f)gZwd%BrP3%jpVbY=l8xphq_%}bX~NMNyh|#zq&kK z=dIfb@ra2b+?iR@%6eQqVp&sMO$-I;JmP1-&fyV8q&H=Q)y}SW~%zC!uJ&SqUWwIO=#F-X1`Pr z5)eLmv>6uidA40R#YS@~@zf8(3JUJI%uiZQe>K*{iLt5V+;w$sJX=AdI2)LVi;uH^ zx;G+{IaeaCkkXVUBATP&u69gyOPne}_4^OzrlMOV^PsZ4dvf1g#|>EvHtNXd%*Bu) z-TaqZTa5L~_^eGu69`SrxBckzETni+o8z`R8VU&6gmbF02Ktkg!jCA|31-c~P0ToL zQ#53RKllsIYJ9#^J-=n4#NFpE@OKTfGC;`4O8VZCC$&$~1;^v#_b*z%z%!cz7%ng#W<&z!%tG;Pcq45rN!Z|>f`A> zQrO&%ESHT>!uPwcMRQapbvv-9&%bN?wcJ3E@fP%%fSW1?KZB&z`u@6zfQM?7tpd?T z`4`HVaPd7yGG%T*n>sEe$SCJgZof+SiO_zTmcZ zGMf+)PBD-4mJ+B}J@>SX!Y$tA)vg0tBw8-jJPSo=t?cX(r(+u)WVt^R&SWkCf>!4u z&OcZ^#TS6p+vzXOpquR$NYR=EMe^3_&o%f!wD@8;9v2(9D$N@H1e5x3Z%EbH(zGK^ zum2P6ki*W=+j756z28!+;)3nl!B>2+@1#P2SmGTtlv^ zMYqhz-clEL^_yTM>e%bJc(Jn4fi*f}YbBjDHM1i;FdFf9Ey)BhBe|emjXyQpMF0!z zy}MvO&5x_fYtpIS_vr_MqYDemIKKOp+B*LI*+J6YV~HeIO7r>{7M-lFu5hD>ToGYn zeyhR;b>eOruH|ipXLaRAmC0LQ4C*_Urjyl%NrQdN+3axa&CH0}n>!7fW?J6q`O&KH znwtvl6MDJNun0_AioDDVWqVw!IEnP7w_ssvseXN(#G9CxXPVkp;mhZ%bPd(fW zanr)g=iuNOrVexTu|fERkJCQHk)j>NA=cvTA*!BjV$ZOJ>Z)D(ZuV^!2-I!Fu{9sP zw%jgo*!A7VY=d}G+g2bc+L>}%sihk$2?f{QLY>$5b5rF~I@QTWYkU?@+twzb;?JI* zq71;lk<2RWKk)cIxsVlI_2__i`*(pRuOGTiuD$z)sTuT6u6Y$m-WAQ0oCY$unJx3I zs%Pbf0y51^Z>EzHfT=J+M6%C|m>fP9d_)4s;u`Pzv+l4N)DdggK*rEF{rJmk^+ zlcD1sE8ev(4fkD2Q9iiHG(I&VOo;C|lQRW>d&0lDB05w&Sjtq}0~9aT*LKs*EJ%)J zJx@0arTy<5TMR`ISPXL{3qOWDnFY>E?1MX#G-rbLXMKwZ-fQG(I8^`*CTg|2c^nt13sR6kqXWX-? zdn}#Q$?Um_{sz*xpLY{VGz@9Pout$eEH;moy$78yPu*loQ=%Nh=O<@vT^f9m!L?_1 zuns%VyQ3ZLXOGfG%vI+w?{rmRZDRx)Z!ZTaW29dszc4=a*Yy%yqpGYZE#I)E3RxTV zK9XK*9@MT^LxE`3YX$Fh(ayP^jrHvztFxpJ;ZLAussQ30hsTHEs{P5Gp+4-gzIgbP z-XV7x?y@hV>ET#>-(6enqjZc02=}d>pTiGe7N8MGi$js|`%)$xco!X5vtDHr9DK1i zh)CsK&|m4gUty?U%;*tPYxBP1)k^94fx%NIRCZo&GClGOXRHRov0mORLopTX_L7`~ z0}{a)8c3mGEY$GEsv;a6Xg z-=~(u{WInUtDyo>zBkXT>1_RD^jKRm3+6OqWqY#gYIpA=4Wb*V1<;s_C~v-e;(uRpC95t^sh5#q zCZjm=0x-X`3U%jgm1yHV(aD-cdd@QHKBq~xx^_b8TX*nWB@M3t9twD9M$KI488Xaz z^Xeg{97Rc^_+HdP-n(PDXzxb@hy}{_F7({G+Wz(-E8dY&WU-d%R{77$lzcYO!hE&J zb>|NZutyqKN|W-Kxu%yE}epEJO<^F+QiRxhAH*5W`K) zJpBf!ib`BFbJ4aZY{ReY_<@#z-Rf81{z3@M+x^W~}TZLg%#I5Aw?=5ln)qO{~^uGL*QvczSq)@}CUT3>}e{ zyqZ$FgdCp*BwFD3xMCCf?D4kMOxpWc8F zJK#)}6yi*OUx<7w^aij~mx>wbHM3E5MxW8ISPRQlz^;h+D`xbEnVst-fXD6c2_tKH z?pdc9Ub1)Y5WutN8OJ2ujN^k=?eNr*hm)V?i>SM^FA6f4jVm3#D9ZA|o|^P55lLyb zl(XDnk0Q0Y#zd!T-sei~q`pr+O(`gl=J?A7ZIXrfhG<6NrnJX3QC#6BUt7 z%n9v(x!Lnb)(qVSf6Rl+ieryIv(@>plf?&7A5APcn?IxO#Y*x^$l@ z5BA4BnZn$ziGR0+4=8q|BSsnr4lF#A+%(0FdsLz1t8@K&U=99hNq-5uY=z!(`dt!?5*4)y+8Vpifhv8T-l6`?>s&qJHbYg*sW|I`gFLaK4%R-Y6Me zYjJWeux6JVt5+-%E0ZIVQQ?GL!5x3awBXzxUGwpiS|uP{-hklFWvlb}dS0?I_ViS3 zsr8p(^h{W~W&v5j{Q0*bkKLVf&6TwcI|h3jm&XOOjNEe@-gxOIsu@{Y5A3%3h-F?l z8g6>sK@UVO+b=Cp`mrZ|Cvc^1izKoA`!47;SAK9%UENTr@W^Pw?9s~#2vGCvD;e)A zJfk_(SP%N?9kT#1B_rm!{-B_lnSg?7XyvgS8nAMe|lwOhHdN-0MDriK_&8H**IcL`-H6^0Q&5H!%^lB0O*!PtQF)-S%hFX4RFdEon?UDK=vr0@QhL*;v`F&MFS?zV@u(i;ipOP1o|$ zBj9nnbdoGJA^OKL0M0BYOOzaSc^OFuFZ z{+6c;?E2%RK~T_H&e9zVodH=>U6g6^vM73BXy!4X?#{kQ$Y37nh{7c4GA1G*dDz`q zbD1r=V%lI2ORqDa3M-m4N$<&U?Uo7nR4y?55*Qd{%rrSqgPAo;(s@bHJAR-KOOWa2sJRIK=0MqGC=?Ww`D=i(h=8M%1vmZ5S-@OysgsR9h znT;Z~v`I7N$`?vADg*O&U7={VH;#RMh-Yia5#2TOc|Vjp0acSNfr8UbKC@=oz5G?< zdS35be^aY&Uj5sQt9t@`JSB+}->jX)ih1?CoZ(xOkHiYtxtZS}m)4HaFS=H}(<5*j zf+PH!rImoM_v;FKP5cLw5e&rJ>pt^8MBZ2@ndotnm8r+B^hwBB41CF!P1pFA7jZxY zsP!7}QAm?k6(?(CMV}Ht~b=}J?>ES;zrcqSvc zG50ok*Q>>;4R?3CIIASn+#DaRvu@CAEtcnC0^T2K1ehu09b1qLTaDi*!XyY<+LG|J z+|g-C-Yfb!$pW4Nkgf?JhWw%3156hIob30QmTecS_R-I`NFUsmGVf7!W-^m(95D(f zueFbm?CKiB0GlI_bj!5A_H>*jikzQxras6;MMrQ362;Z+k+btp#sr-MqoK1qPM7)n z2M#Aif_%k85?cs9m(WcyCf#l2xWg`Y8x=Wu#jycw6Hq+;jqkiG2MU8={g{mETY0HQx8 z9c7FoG9D;iR&@AA7wPEf9dl+G+Y6l zyRHDG4x9m{a=cJyTvfb0*{d}o?d0vWHs9i|n*%(?er3ZfL+8Yae(zJe*%fIjLrp1` zrwy@IQM{Q7(m*kR=5oj6G1CtvGw;Ge6H5=iju z8KMw3qWrYRG!#HuB2pOtry8>bHJ}KSmh)VX)v0$fIXKw+U4Z7nQC|P{_%~F%HvpPObr>fdSXn^^ZRgfCi!BP7~m9_Tal*ZK2djVRncS5tD z^jv;a$lwI4&FpeZZD!ZZdx1W**Of;DBiR+T<@BbHE|qHS&gRe3Q&jt8#8@?#Iqw9? zE^cHfHOP!s+mybY=H=qREf{q#_}o-YjYTas<>C`i$PwW(9d;|7M$OSeiS0JI$#}PA zw`@S?xK+|zdc3{P7!e1(;xhkF(ij6(4VQ}`?J<4FD;2!G=dPxHwN5-?%2{-l;-J56 z-}U4oF3QsWAFPCYEHLwaH*7CtEbb&CNfM{-;$;MCV3nc0OH4@Gj4g9(yRKkjfPpk} z&Z=BV_%^6b(RoUcuV@m_go)aW&y|Z32m$MB!fnjwaJ+Ld(GgCNAq)kt((jFr1(#@A zp00HG|Jd1lY4%s)>(T>HLs+tpX!!e3{pM`b$C2j#%gv*c^MO)3dmrEG^FZ4IskEWp zhKBk|H6JNNuP2p#%SA1)lBT8-W?}ZVB2feh({U9{#>2 z_uAgGy=I?-{OYl(E)U^Cz7bUfpXAkfBI{!H2#z}t^fSo?%{&(uG2vn0* z(%x`0{vmb0t~f`3c>0wx$-$-tze1#Lu?ZM2UD+=U92*^oFpCwmCcZAtd(`A7P|j${ zJ4vQ*EC+ zN`4#RmtGuSo{LFvc$OldnJ^|SeA}NW=JmJ3UY*xQ(tVDOZtd@jQTAl>%&FK59~|bd zu#R==nCHF7u+OZ|ATZKUnZ17-5#@G+yk`Gd%JL63rIA{tfp@*;1!G4qmwynYAwl*D zlj=Rf5-!NMR&uup($7vNq*EUx)>FTx{7Eu>Y@o1#@=O-|hvvv49w`^qy$p_s)Au=d z2}|ZuFG|95*EJ`#^^R0?93p_=VhW+GqO5ZdqVV}~q>c7j>wHXYwz9BrGBBE7jxZeg zR(O7PUqvff_K2R6D?MUL%TuNNos;kwt$p3>+@83Cvr?@j|J+GyTCH1&%IY^T#2C6x zJ)~Py)+)$erPFMJK~?%d{|9fBtl}7bzZNXJ^ZOd(Jgc z1cbc&4dD%QD1yE#ye%xu9KnwK|0ohYphzR3OFVy4q;NoyfKin%9odaa_cf3m?*LP9 zGMQ9n6w=z_<{K)~j*z;c@Z3!ZD_{E2j#=(0KYJI^?4V(KL`-RquB*D#IC;2@b`2pA z*xFuPI$A~Kc%IwIh4xe__3Tqgp#`p3PkLT&H99jNM&(B^7>iztgr-mi=tkxPUa79Cq(E>AyM2JlsWy4-uw|4FZ(?;A*#%rU3_X_I1x#sH~yOR!CzRQH1yzDf3 zE$-ZF=k-Q49Tg*YQk7XrwG(Ou3uEJR?)~0bi4PO(Dz+e zE%VfrYwBgIn$<7rG+9hUgn%e7#4=f9tejCL|DRIio21bbObo&qDz0?A{s(?Q;Z@)8 zs=Z392*c}QhQ(0Lm@1C;%+|xoj%L#2C8B1UKagBjaq?2}YZ8TEHL#2gMn@_MvAoNoD-r&n$k5y0wbY%W%27f&AZ zW_%l|v_RHqZUXH53R|hkSWA&C8jXO1M?{F6`Z8sAWw9@&y@7rTb*-3TmErd8!Mk{E zEnIuGJd=^p*l^IEcng>41^=kcOKN7`D4UH!)AMsXj)K9_R(;7!w+r^ILI$7)e=@&P zdvJ(u9+YWLu`v)T9m~|4YaFzC#k#*alx>vU$*UD@YP8myDOylfW@~iu!Z4+bf#}gn z)WGN2lzbd}0pT;_esjIEMw6IK+`<%0b`pa1A_SkwS4H90Knqdr!0c+9V)vWN%v~H4 z#V^UrhDmfk+>0vk&a$?8EE$(}@0?ZFK8)W#G3k_z2?D~W5g4;`<`d!Nd3`8n#9jHRna+B-d-g2<)!e1scJ@R(Ps9vn?Y ztT?28LlPYNi#rnbUV7Hmo=Z05$xXRm!dR==nmF^;)4=JuS)mzQwmDhjX`kyxBUASs z93^bMY5ixqJ3Uv1ksxgSX-Z9il@FE7$Ri5t=^4~r8lN1btK%o48XjBqe0OhjQb3J} z0f=2APRN(UspEQLO*y0nk;>VoGwGj>eEP=#kK6?eGLd2a?}q{45X8{gY^gz10rzpO}DS-CMiL-(u25FpBWdr^-@{M`d z2~%t^&cChZ|GE;QL?YnkGWZ17akkNh5xC;IZ&j+PR_2&yXrx)dX_}#y`UEsTVAZB5 zoLx31wOjnosPx*Ga5cw^LETdTc`l4?}_626`SdLvQbDdUF77qumyuF$I z)vH5Ug<0c~{j)l-zg=X(7j2m>Z@+)X2iPKkjJ?fecAEai$-kI)d-DGFrlJehkcgHx z%)k|l({1Mj2JZ|rgxAdc93UCuwjpMMQMM<7nI z{dc^C>`m5ftvmu;$bPJ?sQKVXh3dy{=nm z++3E^&~X(xKmTaK+0Q$IM*?x-67sL84fpfcx~N}TN+G&MZ?TM)V1~(gkI?U%sE*_>#Ju^IbP%8`V+|U2oyjy*McFj0`*y|I z<-^)fs#durl(a`EXn`jJbpOuv!6R4-=l{spsBjR#G-p1#?0DFqO5z*i%Yq7WUje_(vu z(74nKcGH~PpZlTeYUv{V+{cCAw4kAFgRef!{{$F_V)hi0{(ZXy{2bS4;gg;vM;rxC z3*F$bP|m*nLIuVouT014rM{~6$TECWkzAaiP2wjk*{~N?{6szB2eaJx{|M1GIY#YS zDa|eMOM05RqnWuWN+2C}QdXavcOag7(dI_kR1_^pn(q6rM*eao^yON~*AJeDeWfO_ z-$Mbha;4)!&Q0>&X9S|cx{i^`a#xM?c4GQ^hIIe)Fx7{QMqoODEX$5(a6wHyba!o! zd(Qp;a3WBWmEG$?xXQ)c{TsQj>QJCwEyaVg;o0Yn z4EgSm=#+ET7YL1Rz%c#&(41W4KYNiXzP3FRs%NnD+0?UiWAhY0 zb*))1;7+pUmFrztUBCdIymFS8zA@`|)58EE7Wg^N^~q5)@8h-DEv$0+V}j4V5IGmP zwJnsCepiWqZYTxXybUPT5UUQu-?(CXf|a)-7Z%pZ>{5WH@Gf-r*$)BWz#nh)Dnp5H%5hisk_3#hdjR%NKZns0Ijw5(z_t)Vd3tNJkkr6G+dl%Q=L6k%l~28*QrR- zRHP<=nE#L6KcKd}B`8)IYH5rHz6mAAV zzY^XJ4A5aCE=7&jSLWmiyA~^ZKaD%li4qCmI*O~ewCPjAp9jPve(t@5dFI;cpQks{AS2?MEnfY>+F9k4wgc`K zGf*auBce{goJJugxAx3HvZ&RJkDymV%0sy)x+iqyhO-W41bSw3@7ezVGVsU_K&Kf0 z@Y)HpTByq4^zQtQ>|BNASZS7qpK6?B!jGW=|6{w6{kmKKnru{3Y-#{#YZrp8**QO>mpXL&s+>LHIwqvC>v}T|+wC zAw7HJb@ieNsxdzvb3LfJ)$;z|Th2+v0fm!ws0f0aJoSVO;vNzxej7?aXEg8tY0qUF%hk>~TK)zz*X)!&!;AUY# z(mu8*W0(YVMAuo?ymkZcRIjqBnJbm5pswjnqD( z_s!x=MTrXjIAh-PnZ$q?JMG($&C4Pq)OqNSVaErE?lU%yZt~SUYYlXhZKGhiTn%5D zeS;}=^@WTK)=&u~-#hLvRXz$4p=+cK?gF__D(hH-EimgBxY&1);cY2vC5@=iM=ZN& zWLT_vvN!ThBQ0Mvzk26#{TK@efu9#BAj~rG9GxFu0$r&UyZW_e2;*9@tCd+^T>Qgg z5Ao&oMm#`7lRJT)QZ{Dq;=fY%Ust5pmAR0B`S)fCU#TDB+$Z!qeC9XR^`>p1YcwVv zQYe--+aaM0YO6NISsPka$B4N9TUH2eb!WP7Io2b{P8%(t40|uB&T8 zc|Z(5BAK}MJ5O-E2I!eF@8K<{Kk3Ryc(^Zeewmt$ODL6AvfJ^#tyI%c19I`%zmz&h zuqGFcuIAUUC_l6sel1&!^BW!pjB$$>WO`#{4XURk=P2bk#@-Dih8 z9U3xz!LjU1^>?MDWDdwAa~HX;$R(|$mka3m$AIxXb^P_M2j<2d*KXy19TEE&?H^n_ zYnBTgKT&#KZW$BR7()wDoec8ROI5}G7?vVA~xrt7V%}Cbu9%LUWu2sH)r|FNpKkz} z(8wkJa0{latV~(a5$8zT-z~AC1eal8oaxaqkbt;c0qy!y1iNa!al`DunJ=r+YD|EN zoL;MlWiRd@frD5 zG0JcN^UHhYQoS2%yi#eV#=F`NDs2E7uc!E9!dB~p=z)G_mQ&x#KcG=)|raaOTcJ>i#Tf?CRM zxY%T6erjZ4M$+EAn{FEiSe+P*AVq&{RXd)tKF6P$`oea2R%pwC1L2GhB zI~aTY&L-;IM3b)y3K{5#8L8g;&O(`$Q(9V174Txv#5vW|U9Ag}{kpbiQFDjbRd&X7@f{Xzby*UT2UBj34vU{5#su!oH7sZ60p2Xx{>AFzq z{ZHUUH^E^^&t9yck;YofrDch!*6ak7FZ+g);=owNcwe}dsHgak5i#<#4!_A1YM*4i80p@;&R#3qY* zFTC`}(T}8o8(RNi$)=34CX?b_>;AM>cXuj}p3%c>`D?OHF^w+|cR;_lV*ue^`Mf+i zo|TfrHvXn#;E!_WPb%#_d^O||yoHV(Z9|P-#oN{TJ3C9SYlkH-?KGw<#4Xjg=;!_s zrtH92KaWcF5nmuG4&*z1taQXPGK~Geb)kB);d%GznXw*?E1}O?0GG>WXn!}b=d2=v z=&6&{J^BNxpvdnrkm<)J0@Cd*6T^LPo$ty8C!SJL%I|;8-^ezP%LrKs*f@RXQ%`2h zY~}l8jD$#Y{T!gBXua`~r%XqxQ6;%*em#~Trvr^Jx3GV7j}w{vDOAe5J)p+!xAm3& zY~w8LDfJ$oqPK*_gOq!O^aY3zAw5K}DT8Xa#};A$jogIxy8-{s*^MBhgj%b%jqMB1 z*5F3&HRay-xc8$ES6k{e<)b`~wEtMzdxJpCIL+_?t(A)DJ!`8ozYsWxR3BHxt}+|e z+r_K26it;q;>s;bRI!)Zd_X`AUh>!*!e$W8V{nH*?54yW^HJXDy@}$aX~W*$m1PfB z#-&%A8o}cemr`o>r+iTbY+}R(Q2=kFGK#|2(vCyJt*VrczGpfoUUjG{%! zcz+mZlE1eW3+ix%ouXAq3T_5LfJH?@QA8$t#=hQ0#n)1Ca!m>8j>3&=lSN!R=_s_yMSwybb8F+5gYeY{c zL6cKgGW{;C9n*RMVxtGFNTLPKA?@0t4!7ZwbdFw8r(m@=vcj~^ZwSSzp0uq0H4p9H z$m&mR6oTE)5xqWf(c8?Y?R3#g$8DnStLc%LJfUoqK|#?SdIskd(U4E+$BG+EUU5p; zp0RG}$-^!0!@nnEB+UUSevaJi{9=Z)PFs-tPIFz`g4K= z!8+rf=?7dXu~ja^dT)!>tjgDLF$tSe44wV4Dcf4toJtm1q->g&?HGCndZQQuP6{tG zUwk>x8?RsHL0#lIWN!2(yW3b)Vh$>2l%?FFpB0gUuo&oB&*n-_RZ@ID)~_RvzC$Q0 z5EvcqTXysA(hNum+D%xLrKa3|aGcMHI=|@tmZ|5W7=cI!!n)Y#;Kbf6AKTvC$p;SU z_b}IrJm*<lf@3;g6y8o`TENJE?w z#s;^43USikv`OpzLE`{d=&qc-R=2DsVSnZO(@+Z|KfnSSoyoZ_JcKIWPazF!N@pO2 z02xTpzjvOu(rrnrX-Ti+wMwbi?tVXiZ!IrROg~-NGREd&pd{t}hMm%=fgS;s*7wuG zFI^y=f&+Z+ZIuQdH3FLykVQXHrYzb75o2>|%Ed*QD&90%Q<>D*o`{J~l`PO}UA^(MMZqjyd=dqt3M%Z+o zGOT?0PWqOZOz$;(#mshAp(bV7KCXnnr*5VCtq(q#k56ZVFn;H{V-^YvirJhWJ@MyK zU>6_s`fQ+yR@{!3xMc%#jTX~a+~ehNj|=t#VviZ@J*eejQ&R~#&2X!sBHI&1n!+}J%R`LeB-1X7Sz3RyA#vr;HKl#mu zE{AcyBCGwN@WuMQ`4)TAD}Xf^50&4|bKw1ANN2m43@Pc5(N7?HLw}Y z@rR9jtA&ZeYjbziZM$VFjr!V4#Lu%t%@$6e={=f=#*EX9F)MuoUrJK@v zl(9->AfLR|_SW6-XA_}nYZiNQqR(f7G+fM|ss^O*Lx2K)Z9hjMh{Y4W$4C z%}YqP=-LnR4W8Pp8*|qWp5K3VnpX7I0t*^cC+c_F3!Wygk5z>0gz##BT*b=Ht1AKf z<6aZ(Zyx&bPpjU@a?9A146LV~uAj&d3`jCH!#KH+)!l9`!@uIbaK)rl(*iNGTP#d6 zqxK}qV7A!sKY)lKU%=+v$P=mg?p>fsU0%U)eheRGrPyiVQSc~l;wW_;Qy(@#KNF{ zLU4k;(RO^2n7N3~{V%fLXqY?PMw2F&VL1Gg?ljX>wyq23g&>3%%LjvX~cP@4)&Kwi;FQC~aiqNtoTmX^CW z+n=Op*4SxjV*;3soYV`7$=c7c1E_%N6zuPBdEdO=pnpSRet%Nj;Y68& zd1nK~&v7m{U|>rKDY!HIJyLc4MhQrbgHbvyw}yK=@I$hRO)m5c2^X`=(l};QUN>){6@z&@jf~x%UoWQ#r-8x zMmL+wb`sp^SytW5IBiA)dg^Bsh3t&v>y(&6EvEeJ(btO(E{ZjTTr9$hx^TfquUTm4 z9`4{_`{>=l-k1JQ$@<-?a@Q|Wve+NHA70HkNSBTM4loiOJ@th`oJB?kdSD9LnCH9z zwE6TiQqN=Zt#=sF2HJ`Dr;7G^EK0iKJ=cRxr({^0^i#GQV|?WsoVd~wRUl*bVve@s zqw?LtWlBEniLtqIGl3J;>-#XaaOi+2U8&KK%qpmVx;89gC&a_B(JGeNl z#l1?BS46X#RN8X}zQCFCucOO;^&VHmfYyexwr(igrs`3r=egTTwmViKgf?L1n9@M; z6?(fdu$P6K(eegB%F+P06R@iG9P{JJC|$_XZ!1vwKpNf2+JpRsbV{?{*XP5`p5LHq z7Icx87EMcGB7g5Qw1O`WH(S30S+NVyB=jB|n!Z&7YQ08I2OzhfNa|`VT;s0VfN;eK zqO1C&s^x^ERBS9;^yrcN65EFdKNgYgxP#<3#ZS3C5P+KRHS|N)!{>P)uCAxKm@EZ% zcu;4TB_+~pQAOjmrakz+ZtrWN%?QekV~W~Ev?jQr)}ZuJhWIJHZct6Qb3teVK}FBC zS((=}Kdjxqe_pJby3hw@O4!UGZ}&0@pJ_noY00eR;5!S5k~#KqozeCF>Kd+v zMS4L&QWt(4`*xm*xV4j9S$(P|cA%qPkuiwvJ!pGuKo_3qQxx;8ta*8QY2upGCk@ud z!j7*5Zz$GjyL|Tz72(C{j859C1M5R$ZK-yOeq0NevY$M9@|DunufXvR<@RFMr&PH3 zp2#Dvs!0z$dy1s|(+H9EtjuBEg?|0wEGo*71JL;)xp%Po#P9SZz#wk}iTSLkI?en@ zvU|f|wTQd2KRSHBdpbU#@&5c$4Jr&yPQThDwym$$U}J=cs5L_DGMB7SMX24W*A%B+ zdw;5ZA_o6#SAE*mS!Qvwkc2~XT?KT4tA)w`G-%ivbb9a@udm;>v}>ZGQU6-=`^wM$ z8>d%W7mGUV9^4sU8O@+IF;siYxy($%#63aP2f4|0V?8tEW>L9yWa-0~HHi06HNi9m z+HWF{tKd-E1E!1T-0WPfdnzl`*i}lrbJ=nLk;dah#C>cFBiMuu@AZFdobG8bSHNvQ z3W}KE<*Qe7=w3)2O1zI9m}-aI;VE3R=a`BF?B+XZF%gfjttPF-iGceO=+yE^9*2s6 z99Nd@aoAm-Vy0hQ;qp~+ndS#mBu&0*1h;Ma9RI(#_(B2nOFKijW>@DYEsoVb7b9Jb zA%$0+pq0c$u6VZ6m{FMay|o&5%lN6ly)OVZ;*{`q_vb576X<1;%}&&dURI*lxnG#K zBW0ZE=*)LHP*QBT@8fHINPnktkRrE`-N)=`A5~PzS1v;DQ2dy6IRepId0S1TA6YZH z*M}-mO>z(Nvs%Lff}M)bH0O=W3yraS0R>^KPnP}csfdWKt?k>j;9#iWnpnyB z=WT*_N9N9_cCr-l7!AlmMa>Ed54`EV=t2bzE?ocpxU_^@F&<}zRq~$)0G4OaB|Tw@ z`4pEyF1G~Fp}p6}XV|J_9Uv=SPj8njAx&oFmvOi&31m+D`ClaifTM$BY5-YU$ZE`y zG$G(WcDZMDtje!~9=y+i0-ZO~1w*fAa(e3cn`a62aQ@I`(DpmD>$aoJ35d<)((R>X z1T!`Go}LhydZ{>&G^RLT^$y*0Fdt<5wz{vX|EVx zA@nIulLF)3lf{-GJrnl+t6X`8Zh`~-NNX6zwPH6d?UnNsA>GiZ)qi$lGX30EiBiV7#d>SA^;qX*RM?yJ6`qT zx8tGnjlbu6pH@@RWMlPH{6!kz+-$uMX|K z@h#A@eJB5%Zs!}3N3Q<@^q7k=Y7%)I?8&o561t#DEw^&mus4g$7}jM9*m&5#W4c7< za@iVmlA_O6jjSAeUoIHXsH(3p0WDJ01R5 zo{Z9=Rg1(^L;z$v7VohYnWlE7Ti20-acbz9k*G?TTMfN)iJ*>?ho{{7#anNY} zH`i@0#g@pn+n;W4z@yWs_a$$7`Ko7Duk6{5m10?#q~myjpsK4W9h8@oqe%ml(viU7 zb)M^7`qc~m7xwsPD4s3@zVlw1g;c(}!19WZu3B&Qw?%%x&A=|KP=e=GcRxWfH~fI%`JvZAlerrfia zL0Fha&W12^7bB9jH^fwXE_A$L<32af1TZE@UE@LN)rCuOl1Y0YZM0hJ>VH;YmT}h9 zeh)ifuQAtjNz?kadI~I@#}=aLgv-m+>OzuYx=ufa&47*RVi7Xk@Bxf6tD0>mvn8*M zs~Y8}{QZ;^vzOH!mF=bEefIU8rLp-&dZ1N*7kV##IciJ@jc7XUA^MwrlvztD8X^q{O@vX7|q?fjZ4*q5liA^KH;u^UhGjZ;`Y)vGs(M)Ys?Q_He7B>1DNb zyhctPEDT(IkF|B41~`a4az#RZw*~wjmZ_xDB@ekOr}x#Go{@kaOK33ST{&2-CH5xI zA;K6TtEy*LZGyi)OKWHrp=5E!v5eIx1=LwQg(cG#lToJI33RgP za3*K*a=v25o;6ytp5jkcBc6UIa(?>&pKp8l3k#UoJvm?WEPF*{BD07LeZ%3v!`+?F zA=^DUF(BN`70DPqV6i#6D7?Y=DtmcUd>CaBPX2Y@GSs4mnc?#o(G;PAo2$9h%qt91 zmc@xlUg<63Vk!AKjh!>6_fuP(z_3}2xIa`>Z#?~bO&(`XhRG5G!%^u=)V%rt(` z&wIhZ;Nar$E;hD**R?K;$q2E$kkkA%KJ$VOv|ZP?Tq)z$=PvPA8qZrwc+I3>??Afg znAUT))b?$wY=hI)V5r>nA~LKVDsN%v_lqKKxJ;s5Yf+xGV$|MLxpsk}QzDmMS8;4? zU0MWK%G1XVaj2wiSRHO+GyYuS`G+2OuVaHI`}YXJ1Uq%ANcG#B#9o{9wetaLs&dfc zy2xk6pvlD2gZOc(dv~)MvZ=4s{}Bng6qc5jU5iW3*t;$PKD@<;l~mbe8cH%+=?1+r zk@Z|uU3;=Bw_)DQJ90m}w{6AGtj(_7kcbsTVN>#c%OPB_THM-JqrEBp2i+!exN)ts ze8^-s)n?AP}@q`b|Sw7v$7=Ng%v7~b#qO`} zQ;@X-;?4YC;Q>BpCpk@?DD$(YGKSP}uWZuuZ|chbh6Zu~$}{&H=bwz&C+#o$7?+Wq ze`xM0TAT^b-hkzO_Dm84ZB0+TR3w!^ze{CZ(p0^VE$t0v>|5Ar)rpX3ux2bdyaJO& z`<^MXdneS#OgCck@-5Fyu0pp4&b9_pe}oUOxc4$O&?c_Vh^!Ap+eTd&;OqU0 zotjXg_m?Z$m=$kuu8RyX0oVy)K+=9hjr$LPmhW{Z_M(6XJbSubh*RVPdL}~sZMXDZ zYCR(Ibc{6;^+58ODRC>Dv7|KL)gJ-G?%xy1DN#*CEGGojgr|iR4;;&UcGnBYd>#=@ z9NW$@`_c*7@18P{_X@(M=>;S`<6!N^e5Z7L+O2@fX}&{1eM!%|x46x9k;&um9Ef`i z@udr`q(S3a{~__c?0v1fH>XT&%kR5crnfEpF9a10+;-`)0pvX6i$0=)O{KAjnwni0 zVroC{D=+2C+7>wlKvLI$2p$}+P7;F0r4n&&wS+0=n$JsH(Fvo6hwb$hIUfk0y=kP2 z-Egt|EIV3kY;Uh}s9epW#yaTJQ2f@YaI<0s2VGy?dSCx)A|Q`lOja_PxY{5oC#mP+ zH7DpJ(LHJtKxy>oeypW&FKy%pZAd&PDni#!m|OO#Qjypxc<=qR04MQDl7Ao zZEnfckK^j34Dj;ko#eGgoV3%9w7tm|6D5ecm!rIhO-ImR7ErN(a3VKC9X|}byo~GM z`?|Z=jly{XMM*8Wt#{FB*qjlp&-ogVg4Nzx`gXk5Ct)jP z;yavTNt{M4>U>nCd|Gg4W9MP57xXsew$FlGlFJ8`Xr5QKMFk!30ygysO6#~5k;pjI zfWI%$A;gC)&oybW`sQ(Kka%4vp`yi)+fZe43Iclt$Qe84Kf&QCN%L9dGL3lh9 zKPrZ2|E4O_*x35R5{7{gDRPz8$q!LuWAiZz@$1RP^4JB%bF(!{Ck(@jtr$}RVpN=m zIZsz~eNyRlHj&rtXOH&64MlrAz-}c4O{F}H(_PzL>)V=;!@toDf(&3J!O-DqUWxf+ z{w8_to31T6XH#_PlbBewwCA|hV7R;|-#%zobof{r9h!DT#h2@@4j53t6=x4xn}?8? z0y7q5p4j9i(#*ZwN>VER%0u=aQt{uwv>Kj^I@1aesfE&p;mf{i2yF6dM{aYEKOz8I z|KK=z-@WIvtE)1MD)vLoJmdi)VzG@fg->$XuUuE>x|xu1-2*8^m&f3p-yQ|8MMh+( z^V44D2GL5MWS?FG**qGQIP*W~aQ_|dcJcw)uzW*Y$fB#EI1G_ZEy&7@8$EcvY^U1( zfF5)*jgWmffiCbd^N`N^l&JfL!XC?I?LINN4ky;i}lmK}`Yb_-HZ=U8~pJ{1E7jME}!PUhsr5>vs zJ$L+7k=)#-4%Wc1Sm%UGzop^lc7hEaTQXshe&|akwndYu?WUF}6RydEe3qY1hr6*z zQlnZLa262kXejgx4-ov}1@M}5xXLeQeY@%@?TNLU99!R*4XylFT$*%Y2!F|@-G=?n zD;~6`xOhsd5GA0H_}#clk6%fm7gJ=krTwz}!?zcvsoJrDp84LAXH>s9TILS##E%#l zx^L_xad>$KCNj@-!`(zhdSN5qg-RbD_v1`!GVSlmmcmPBEL2GUVBaRug{(-<`>t`_ zKeelWBbE7FE_u!uo7TDK^~4q@_o?b^my1~SS~Sa@(!O~mBfo?@$=+{E>BILNr;heX z#I>#67Ib;CZthDF^b2WUFDQgJ&;%7xP*blsiST=K*8N2i$LS}xprlrslAU?yzh|A? zdjoWCLmlmRH!lWpx=LpT-M;G?Q}!ZN6+Q7lPSyYJv5;koRaT~g$X5k$E{&jT%d56J z6*|{cPDtB1Xd9|?6)LMj)_I+V<`{6JJ5T+0-PsKGv3-;D94Pjm`~7FlWZA>%ANKn? zX-=c+h4BbQg!WKqu^eaDgCT9$+>HhBAU#7yb=+7$x(q$_VHZqAN-*vJ&ck>`T2|J8 zet%}DFs{(i$w?n7%bbtkMaZ9Bkn*g|IqBYSDcMu3aY9J}rAR~QaL?10)i46nq?VP< z9}B)Heho#f69Fi1l{>f61?Q z`Clh=NF14#{>!~cSIY;dR280G+>O!>aWvyM-+`7Wq!_bHKSd9D=CuXz>D8D*BhFf& z{Y-1Qz<&O7o80mTYL?}Ly)5}(AN>zTuP86L?(RTB=IN@Sw}r<>?+s@$EY|84 zsiVaoo%;91z<+)qWgbR05pI7kLaiB)ibn}IYd>B6Bm9eZ1moZ{s&`9~v`#b-#v${v z#%)z}cFQB(O9eONFa0@Qjg-sh-UsGKRH|%(?(ZMe4hTGUf?fu7!^@LX)kthnAVGT} z!IwKqR9xkr+7ibNem$jE+TCwDsvcVYe>`))a5KG0=<4n8jvh}vA;YPS+4pQjuCzJ% zOL287qw-drAB-O8v}D=$#k9=Imrqzi2GHfO4Y+dnXNH;XjI1+J?|z{QYAJyCq5V9s z{mX;=RoTv)0%7`cM;sk@^d1zhUU9X3|A&9n`ki!f^ZBd4en%?@$bH%K8~h)3T@=ZY zED3-9@vCZG=?4GUFB9wP0+%CCx%}+!=cM04ka|xE*B=xA zo6Zg3P;Ed&LUeQCrOX+>xn(+N9u1Z=m(z-}{VQRv?Eh;o*s!ziv=n zk_yjt!>|7O;a~Lp33ybx6E75heT-uvS4sYlyxs0sS^xXx{`HxbDY)g_R@RZZQn@aq z=a4;|kp25xz5u=@b|laI;jb6hItkv~{vi$g=uq|}K%)J9@H)IbT!bUNSjr&%h>cEo z$n@*w{_?ET;5+kQr%xVvsPhG2AsW8Xh2v>ouQ8|wcs5&75& zav;{&$I1_X`}L``Do8KsZ4VbbqESa)vLD!co=JTB;;)N+Wfc5ll&t*gzn@MPQU}DU zU!#M1^Q%VRA_Kcd?^uHB(HHpjp&sAz1Z&pUE%9fw@4w&vH&QLB@M8O~Cgm^6e(Mg& z!bB&%`t>`vQb-X_1^GXnSa|OhkbEWb;>@o*Aw&f1NY$A_LF>O4&N4Wq@d2}%P|cBZ zF!V@)gQ!2>Ury;eq5}#*fT5lvM?2c0Nylo6$oKqHB>3kvKc2~7ya%|j5jZU}@}I^m zvy;XwU(I={a6~q5NF(&#y_gj{vfKVG@;`$TQLq|SVwn?1AVzl5{L(1vu(E$zM-A|u zh*0sPi@OS5{L%F+#lIKo`R9t@ADLcm{=3Qd&kKxz#T_*ndHI(`|MgcrlHZvl|E~_Y zpAy#^ASt=OKV0(fZ`n^$E`&$>mm^9}+E!8WO0Ul!5y-DWTSy%#c8?qAQ9q*OPf1Gt zTVmHg3Fl{rQ$xPn=FZO3u~BKHNnKTy;g+Y@tXw^270aAg)y<3^8A-nzzN_nFP#@r< z-h>&K*Uqt7fCsFutm$^EtHV(ZKRx1ezS3aVLJbX+`}OT@&-_^HAc)76pMSaymX{*r zGux3B_*Gyak@Ew~YcPK);dLF-I9BdBCD(Ro)RVTUz#p-U5Eq}EI-eCIYz5vLH+>J` zPeAX)L!p5#`d*ba{?+K^GjJb4*Rg$wPJYffOQ}c1*PrK5U3oA)nM1o}VI%L;yT%B! zPcPvnB>brbPf2E6?AvdDzY^zjNfdYPO~Nkq45V28b(|1wlWg7Z4x+K8po3Jkz#i%` zEWFuKc3f0ea&=U{fE765Wu&_qcoTK-Cg{P1G4LZdY00fP;naVBBYSYV>3d@Ib;#eJQdpQQQ z$3Ud)`R%f|@`a3-c&1E9pbQW(E z)9ISp-D-Q48cxhNMV@N^wv`1suyd(_6t)CW6aSi6^1m&89)Z4j^4(&C=# ztMe5K-KaNt*==oCd#ciCs=vi2L*4z0tE&mRVF$sACnpZtJ;C18C->L(~p{PySgnh$WQBVO}}RsHP` z;2*tPtq#nSryqQ1zw!H-3rwn?MFgIo1)?sv;>~Qq zYWDxK*MG)k_5GrU0)W?%tZCx6%PFDHV&Jb{4AytHN1gW#^5+$KyZHzpgp2|A*S~33 z{7=*KN$vh7ZV5o~d|X$*UCk7$_D1(iy^{hsu2OqWepQyCmsfROPlTAL%t!&C(UgZ# z)azPt!tR?HR1eP0S#39DXWtbS6^ssG@g_tLMy~Cz+DJa~f=btDPMxFN%#EGTo~UkX zyDKWYgWsE=8fJtKMW%!~Hnm^3870>C&Mexxpl4k4K<|S69~jk&0<+;IG7Jk7OF>ol zB=}al&GPD=v6oMEK}3W;dVDgkeWHkgfuVd~mrH`v!U!{_)9&A+u_?=%mYT=u#DPZ_ z;{rgfZj0c}^*wS-!_$nh4!0j>!GW8DyY4zWIQ6A6?~X2#&-n!fWi&!Dos=1OHK?>NM)?yym@+) z^mwF4!`h#Bpr)hxyl#(VKWa7OK(2!@ykpw&Kzb85cq=$=c>psypPkke zT-_M8opP2T63^4+v%LO;J>bw?b0e^-rp7WjZZ6^605X_0^Hlq+VH`$e2O+b&AZ{Ea z{@L^Z!AQT{wGX*u>~>{(qWi7jus6wfIVgSrkaEZp@9}72~1V^i}?16VeXof~Y=NArGXzPh3{M-`!b-uCN?k=WoI z{gXLGRga1~sKqA+-*Tqnp31MEhP|q`G)qz5uLH(M?gfhtE?kOzXTiaQU)_3y6(PUB zzq{@)R?1!-q`sS+!qRbCb@nnjIdmZ8GwyD0uZ-F48$Qlzr%%rx1Rh8-N_h0_&ow7U zou9*ttM+iN6v)Wa2*Ct0PdyqE^G3(bP2=7oLjpC~kr%UD_hnQCkZUseCxwP>?rznJ zqc@gOx6+&(X$s+T!rA@-8)33;!I4hGgmKPongfqBH2V>>hY1cXqv@G`uXR-dwzgHp zHW#J{vj@fxpWjPuwJC{}L1~$3=F|zx+wD8OOCMQiMX$Q#5~ZpM8xvi7_Z|4rpcH)z#<0slTmZ_oqeYb7h z`NbF7PKMoa$I(1{n{FI`E75`k@9*ZHl+>PVvmoH#))wzn4t9T$V4u-Uq z{D(B1f=Lz0NywPA9G)|~i&)R?scw9?){E6k*9ldYjh3s`Z&R7L(Q!kYG*MX2VaI;e z^NFZDkJmbeT|28mfVd=-gO!8@I1j1@sgJ_+y-!|2$3GR|tQ@Lol95To z9rxW-w0WVM>Sfi~u9(gTSTT9&Sd;u=g!+`~4c+{+bxCFd9{Bdg-O`8D{++(kTiP`n z6GYh-YG+MI0U75SX?X+Xt#&MOOu8fYeFh}&rj}gam4wYXI)OC?v%5G|^BRM2Dc5sQ zeER{{y6C!asR6Hhg6IomaNT!!@GG0mq|-6pl19TTr_i_k1AvnP0GxXNV@Ube?aWND zhdpNeatpFf<+IbD7a!+5ir|sF8FIF1ZW_$CgY)yLw(b*f)L3;XiSrF=$xMzET=y1l zaVbzzc`lsbqY(iI6@QA`YIyuux13=Ww{1MWb4ArmCF_b0Y#LQ*y5S6h=Sv4}yMRu1 z`>xxmcJ?ov&3wWSM1=;EOz!I5me+uNL_RZ3)r!3;(jpw`rN{2k@dx~jANGS(WW6#v zE3YHN@s6NPJrnnFF}PX6NgvppTF%yY>x%9e59GwAtv6M2*4Nns%i^HbRq60qM2{L( zK}K_`@l#>AlHt^Mymk;-QLtj5t^@@_Zlj)pg zm;nvv#mxP%8OM(un}h&5$GdK_C~H?F+`un}<9E=B?<$tym7H0gROoOj7uyUG;e#PLDj(29pgL z;s)c@CJt+u+@XKjG&#HVf-Zj(mxWiPLL+7a;vi?!A|)VMQgAJ?d%HoRU3W&BR)l3| zGC6@kUwf%9fwk-%#%dgw9hk;mY2yGwX2ADJz+Wnf8~nbMki$sc6G2Jv3$>#;p!LCv zD+N)^V$6P4x*SNkgwtI(>p$cYe~@yCKR_?2_mogCxSO9|7@2_yZ*8JO zf#>DgpF;TYUee!K9b{$y@f|x*J~m+fTgA@Pr^uO5Io02g#zvk-2IrGD^R940nVC{8 zxv{lj!qr^HpjKUO;bRv3N4Pk)0;j^&V{+bkT*zuU3#77RF;=ZNN&pz}lpby2Eth>*ialG$apHzqHks&c%3sNA-; z=3c-%Qb0Pk!a`v*@vz5v#L;)tsFWRLkHt|G7_`e!L%|UQ`M7{GKJ+Nai`oVn^zc@a% z1~6fXJIerqX#1uo_s2Z2#pv_9u zan&2$^EEMz2-@2yD9VPUW`mv#@^hWk;q6AC{9NjTn^Zg*Apy%X z?+FYvu`pZ`kKGSlezO&41w1<~W3c04Ve)m=YrA?9p1aXk(5$=SW0RkaS0{PxFgM42 zEgQ^34XPI~CH@&ZxXiReoqb$b{aC#2Ky<#Rf_meOb&OC`x{a3nDyc~GzZMRTpo-^n zbx1z*g3EzDL5x1_2^-y3e`MU@Ieqv0prV&w z_MPjB6~!MrdM7F-OLUjsJ$^S(=Xq=;gK89>#H;J>bC9?U=BcyJ`|;D39N-efb2(;M z2D0;J$RZ8#I;kOz6Z{~ zfEIH(98wJyTmG0l%Jn-_KuMgAmq7-Fu#J!gxv9!!)l{#X9kK|^rX5DMj3Oof7Y6Xg z`pyj9F4zJ$)>ksRvm>B1ztkXv#^#bdXDsCddH2wmumW*hUG!XjS_~l^FZQS@Iw4hz;t!yAw@(& zmydGm2aH!M`?yd*^-5>CL-}6f02oXWKy)*7!m&uSe9@13ckDsDwLb51pX#J?X_p<1 z&<>^vp;r(ZtK`|^VQOV8B>Bo?`fVp8S}W1`(`K|&lYABkgqQ?^fXB?X7xMWmQSz7sVv3Dbi=9b{4voOxElb4G``|@e7~M zIgJ8HKQPs*aQ^aa06%TbSy4!CZ^f|^PQXa?i&?xrQV2PMnubULP~Tg$4}^gn z$+Wr&9k}n885W0BYpZ;{`4^Y9v?ssVS=)AwVhOu`%HjNC!O!@Cl!e1+wMVmS+ME1i zh(T15;9%CWsWR~%a$Mu?FoLtj(t)&l`zb^j8MO*!M1mf|zs_@HZ5vez>GeIk zRzW7Vm#;FqDNG;{wsBo-9e6wIvZxoRUPrpS`60etn6s#wDP9-&$ zC3(!K+KrC;A~KgKADTc+KSWpuS!oh`#BVgbU(cbR$J^8>K>WP21+? ztraT<2qt@n0-roB)bT(P;HnLfaUQD+ZLYrpw12TEmq->x*y+GrMollX6!nFO^3SVT z+n@Lf&a3es{j?seB_20epzn%2S263H`$hZ^zfv@jpuMCNDucBy2%MS11-TTw*0py< zCfB&hx>Wo=-z_VLN5DmrFf?xSemyo2JudPp<=SpL>)a1xY?tWc=$VLj!q0T4X9))_ zR2esyxyzx1yoDv`tjHBS9D_7K%A0_CD}24Rk!sUxWqsn0=_LwK8_q9KN$@Cj@`Ko< zVO9>B-Mn|kS68Moa-vc(l0Dm%r`r#*xT(dS7JiBCFwQ@e+tT-M2+-lTaX1y)9n9*~ zTt;0dlzvKV#$N2Ob~l?8mHex1xJUHwg>&m?m5}=?z#84a(Lzm!iIn^ju-~g(D$Z(( zhFVlVjP;OjZLEufPE5*cf17p2K1>Lx#{_sNqqM^;vU-v*5>~_-9AtT=(;E9$fjJkh zcSQ>({Uc3081W;yXmH+9yoJenF?@O?UNNh4U#9D+Jvdl`XgYuXmG3q5rw{fIv?`un zo%?Ykb)Lz=-ch$nzVRJoLxbxCB9Or06S*;O zrs+Ay1T`M9KAlI}g{aT7Bk75$OlPH&KhEe6RipcBwk8Dc$2C`yr6E-mtaHIxzB{27 z^LU;M5Q=8Oae@$`m+m{KT5B1r^qJ+!oVkW68_sa_=aE}e-X1M*Q}2y8RD#TlT+f~+ zA|a|CF#DmyQF)ndrqni&vp<%8y8>rRqqg>vhTK5z@m4Zh97r#Cz31X4}##+k}F>)>Cx!E`O$fT!l$djGQ`WV53&~$@ZJ3@bQD0FwpQb0qDI|)O37&EU-8S4nRQy zdfxM}aZ}wNBhiBLgU^6r#znGq(gkVX^~Z}R#PVjZ)9z2GbGf~V+{`QP@kS2~y$^fz zW>m{wQBe^qV8~?+E0#Yj%fNuLU`YJi)8t%6c@uy^vfKCCy$ zk>GKC<1`S)e@Y$k77YXXGIK5>LE%|xOj@!{SK+L7(ew!5&7ncKA-rFC880`aQ{bIo4pp|MpUw`Su;-3a2^S1)w` z20k#9h9?0*b{ozi1o9nys<3VN_ z7^Z6+e}SyvlFGxi2WK9n#12iz^A65Uz;^73%;jV#(wh$p9Hy)cu_4a*7u)^}1q^`u z@})WAuYOew;NaeoqTuXS5CtbU3wq=!!@uDo7xX-IYOO9G1|Aruq@*pRrh!Np`BDff zo1zk{^tvE{HvRpnfgv#;w2jGV_axXCPEI&(^72|pw7qKkb&cQVv_+RWzOxG~Rs!c> zV%`l|x~_7?=8i!+q(5dc*}C8XI4fO3LLa*Trwg^%2u#3q*&!@vEuV8-OR*7NEhsvR zL5%AxKP^5r@2qn{ae1s3nrAjn=%jn%PPmQ}PEg&#cnw5N#DVKpOk}lenx>tX0`8&c8-N(}4nY_uSs;rXR zV#nL9o_Zz5(QLOmLw_iUuj3|dW9mejo;ukHZ*8l^)^Yw+tN9O2z_eD|tI|Ap_wa6p zwf?ONvU<~HK^!Z~LfzT=CwWhdEe#Pfuz?BqpDtH~U^oTJc~lWGM89Hv*TP=H2>$Jp z9}oFrxVti@hC}%LvMEG&db)ftc1}h931EoHjxH+!u*Gw_@_^rJzFxhV#PuT=EL6z9t`&NxeMxDKjfe^5-@w|92@zQ2JWt4 zR{W0Q{^7w|QK^ot-4`{^%z}-;&DRFE&z3VK)F;L+9NSkY-kNVIADfg%t}!q#>kQj8 zDCGP}h8&&{+^`P(VAiei#EJOll5cYU;>EH3Vhhrgf3A?~r~`h8UMGY6`(vN`S%^rygT=;13Y%DIPu zw=@8!wIc}|-?vI2CCL>jGzX+A8csvaU&8XyhpSF}C0*J_a%F5ibBF4V8sf zEiN^IUcpI(7jLO{_XdG?%gSniUS(UajlVg|+T;$>QQPg_Z4+(D?n(B|zO0f3=jzAL zSJN&tf6?C&iqnM6a0JeomiJAX0Zkx}x#z|21M5vYbsfO;E$3-!qt3_Bi@`eW)|{r+ zU+ONtdns@Iu$8}ojlgYAO>S5V(KHCBvN7(W_#U4TRcij)pFHA)xn$ac3aGEJyaY#3 z`f36-#8tgXSuMlLA?G-#HwnGQ z<^6OKor`4$!@qsD4j$gb!HV3!7E|FH2bwCd=^un6M9zSVe_j~-p*2+w3u;PQllr)` zKBYFbchBrk2#Q=u_1@T|i2a|EY2$+tlR<4m zDMdG*DHd(tL%TapYrZFS-MtLomzI?1oDpECK*QOQrDats#6Q|-nJV5WeYyjt^Q**0 zMbAxgdj9x0$sW(9+N_-3>6qyc|AXA_-mRJ0O`dw)_fKq)V!hYVFFCurNu@ifD;qggzFy37q{K`SDvBsL5iwL`>Nqdjfv9bpGA;NDoC24>yAUeD<#D%}by_W&DzBgM^#0U%b7m|53`^;i(9T2h2rf_)Mzp$zCZXgneB>->(* zdNBzlL&Sl;2LDI*GuF~0MoGjcb`pE)1ZN1_Kk;N5Npz44z(?$8f35jJ*8bs4UgcHQ z%(a!bw=+0{|7e0*TxE=Z`|uS>2+F}}bOvbuTVBEtu%58>XHV`~D%X`dfwL-2(pV_Z zy^(|_WH18QNG}$dG@v@4z!nXp?ye5z5Y7qiXpY31bh@bU&ke^nMW>Cnw+)$!C0jca zh&;5>A8x-r^?i?_xy-d$@H=-q-chb)L&i9bek+L&wY@iYdqFqJRHe6smMFWuf^w-3 z#LU(78=InWzN2!WP+zpoL3?h}=?;IrJ)bafdb={JG|Q~w>1>qFrwCFfUsYQMEyv|1&x{?5HDY30tV5s zK9@VP$jP6(sY9-b6U_x`iN7=8Pd)-u*FKQwmdiPB8IM}*U!%ZuF;Ys&=#iP2SQdMqeLZ%+86|I%T)4W2pDF;%V;0mKj z6YIFw&|Q1BnxZjGUb<^8&vl-d_KBt!@Q@YpmR)g6V}8udu5WbqtaO`Ak^Vg?bd`l! z9uN;>XHeSTOB9KzyF;bNndYYcpDRdO|`>$U`NvDALUjQC4 z@AWm+0_C^w6%L!Ww__de(nv+xI`Lh>`-L zNFz#jcM1a1-R%(4Idn)XDcvpI-5}kdba%JJAPn&wu5t16^L}5?e+OpHp1s%FYwcC< zwXZbh{S?fsqe8IZFVT*c1_M6lzJpd^D^u~)RO zUotrIW-zLy%77xa+pO|0d|!VQYm`2$dk$#46q;ZY#nKz}H&bxl{9u{shNK(U)C!x} z+G{R_+-@vlEUH0&?&QOLe{QnFc+#fL8)GGf0Eh~Vwo==K{3j*gKi%My5Xpj`|KkRX zH1NkPsLT@Gy&)VikkC;PAobM!O}GDdn0LxRarwBH^p8(Iy#(ICG5El6lW6$==WU^L z&>$oJM#jbpz@0+BiWy%A-_%w0-6#4#iv90K z1Kpx9A6Wcx^!^@}KYA{zi%~ zAa0`vE7m6e@8m9Hpm9oPXXNReBR0LHmOme{P0hlWhRkz!t6N&;q7{-hn_~%CabN5*T-?4u3qr~_3CvSiR&r>c6{Qpj8zT?LOUR;v- z^k?nsXJ7~S?X@WV_Z~;fE(O>@DSapU4_r#zO-=RiaBu(Z!tpOv6;vv9DMu# z-8Z?Y3ywG5|HlT%0DiGH!Or}TpyiJ%F288}Uy3LVAZx%{``16l=6?drL$;j#|GFEK z@}|W8&4>p4Z3b`MoCNq%P7~^l$j*fS2{E`2i-Wjh$Ogj-{0u9`&wJW`?W}KrXa;na zWI8>kSCSv@?!UbYev{=R`CS;j4{^b5sJ;s-OIh#l-sU5}|IP93aJWRk>G6MH+%I6^ zKc00L&jPipeFe?Ve=wBrh7;eMGE3QDKsgDl5B}N@f?pCIjWF+n5%shr06D^?!T(dV z{cp-+VPQMA91d&1e~kX?Bta+Te@CtRIPBvh5FO}xMUQ;@TiK$(6j(S4uGoZB`sRIk z{@~ERgh0M4pw}JaM;z$6pn`7T!El>g`~^4Fx}&j|>y2V4{+dxUfg~PCzjZ@aQ$#BCd5oh&c^~w zLX^*XyVQkH#B{)y84o(>^e zGBBU-)QWFzhIx~qUwiu$_*Ygu{1J(nZ-!x%25xlfVF$p`w-j5pG{Ad?KIb$Tkaydg z7}?s}Gq^R#DBqnz)k8PcTfYY(Bm{Wn?|_nvgGEHG)D~!U`@XVU-y4bK#}L$m?OJjj0`P;| zq87J41Mq|DfQhG`{uvqu1A=Wt+$hEUcM*R)y^i5WxXTQq_pJ}Osp>xrjOxnBCr`uO z-~(%z9Rq%EyMJeV^Ylq3#rsa|49)Y>rFEc!{hM9FA7?836QI0&jp&t5ADnOhA2a=T zJpKkmK)S#8J;uvp=fJ#O+3vv!yloJ>6D9ysz$$xR`uiTN|KU>ha}RVFJ%wih5WN3V zve$2K*1`)PDCD^JpX&B?6F?Nk8b<*=pBprwPtgD1mC2P-3cY~c=I?6C{+}p`&qVz1 z`&u83!vR<8h(9#`ihSZeJZ^+ z8Z9!Dj26?zh3nHfK{|4ya8Wl-2J84Zf)g%XafI) z{P`iH%r)L~;&Zi=`%o`N&X~bBz>9PMX zBbP9;Cl^#i7wLy%ieo5R3~vj|ZK`|F!;pA)_3bSOt;RHv9WmXQzyTLIE3cGMra8=I zaN%m5RDAqM2d^!oy}N0_V8(_K6CStcl%}^YR58|0G4KSHT+@+zw;Nw?uA|&mUbmL$ zA%@tNV4LGNgABCU;7x&;beD$n1>=m=q6CoS1Z|*A@^_9NMv3BJf^M0agpx2hsKM82z91RGS#@8D2%@vrE^@3s_QX4Hh?aCyPU*BhMShQ}O~ypa>==wF=8T(N3b` zxgUKJwS)f!b@P9I^xDjly7DuYF2lO&!arD|Thsn6a6r17!KW(>f1d&+YC*-yyge!M ztGml2kJ8q*IjBTa;iNuiE^y0CIk)6#6S89D>e9cGQbGB#XF;Vqm7(QL#W}YPfExN! z{(k<+UwdB+IdoJ_3pl0q2@KE5y7xZFY1<89V=+Z$LT%sW2O;WZA|>CVFa3QvOgt)1 zW?_}S1ZUnq57b*fLadt7g{Dg5(+Q-kukZ4Vh|AHMvQYx5$5@@qXDXx`$H-9YFHto zlC+ty^0V+&sy|*kkSD}wE_t2G00ZJPWNY7l(eLQLAD;SGlE{d9sKKKv4pEhi`=b$x zLlc0xoKi%rl1JO)j@Sh$V;{+HkB@eeI@3i`gG6ublsk7b(4XN2JRy9+92IBCIaHsy zR)|IZ#{uw*v71i`#Y5B1^1=_WfCDb6JKQFN*OWEa>AGpKcYmfoHPF~3crYsImgv9E z<4^Mfgxmw#*Ao8s#{Jl=ai?(EJ1Z!~UlWdXZTY|Xw_px%uk z=U9o3D)%Oav!sK;U?!fm#92Ww5L5v$7NgzWv0-L3=LFMg>Ix<%HV{4_2@61l>br$% z_yFHI^LqBJxj%$DL3^X7*cJm!pvUbD6*0EImVs(yGnorq0Y~wU^yM5i1o}#CVB!Q@z1c4rGSDu^dL2!w~!=c<);ni{WeJ+3Ni|%uv7J77^ z4s#}+dtb!weB>lncCeECStGSY_Uh=f#w_l7ru16Q*2&lJEUp(+3e5I$g9E0UvJW0+3 zmus)zW514TdUT}iBT6X7mFH6@Ef_kzNs9T%n_B4UBO@clf^A3IOdvsNAZT^(ayD0c zUcO|p?M-1n#}5I0g8o|1l3LE~{TG!~4#@1Y?#Zg?7j_D}Ekc2j^0&6yzh^);o5%NS zH+->TvFL{^m2Jb3R6u`?cQtX0~ z+au)K(eiiLwXtFf;>)lXbgC;x6`WRArx?$<*KETcsC$A2Oof2kz)WP~{fuH(H%_0P zVhbh$dXJ39J^4LXJ&8Ekz+kWsB3--d?i()iM48GwO&t8HW%{kXV*rK$d|2rKhbgZh`9uix(v^qVw_n`Sbwlb%vF zOU9mB)2ZX=_457@idQLH%_V79ChQ&z+r#P+8OI98AI5Z_OsISfz`#PPyLD{*%YXjQ zv@*@bqM^~0hs@C3v7s>>q>n(pW^a+0`ROc;YR+mtXZ9do~OPu#HqJ8TSr= zJOMg^v#o`&Usqg$q+^klcHP864DwF*CCBL8SQwjd(?dh2$#y>1C{5dB;10NO5=;QH zlNLS94NgYybz9d1_vx}I2h~NK196nOdXDW92SeZ`AbKM@S%&gUyx)DQh~G2u4n^Y@U97Ha z_+>~*4@N3L=_PnvOfVJurW)L5LPyR;YLJ-Qz z;%@rw@|;+GZJL_ckV%eNJtoOZ}mYO{JKpBgwoMNs`EX{^vD5BH7S~b;( zu}{gJ4CAL=9H+xexd5;e%{lb z(vdIxRVVM?6q@al>wsj?x?JNFHqLqaU9Rbr%$8KlokOm+|5V_T1 zUNvwotc*iYf^Se3jf>pDlD9xZ?qj5>$7_EtF~n25a%|6#N7 zv%rR7de&Mw z|2Eg`m1UoWLH)G!vA^X$8$ytyq8QZHggkvJPJBCE!!R0sF6_?ac%&r0-q|8oeaam* zig8FoN(m7;ydGXI;{A$*WmK@vP7O-1j}g#?Spc|#ZYD`dZZTJe>Ir{9`j!d+;{r0! z{k~7kP@4E^Lkn6Arq@l8a*C|MIAL}w+)^gWR z4_o(s7zWT$16U+Gu*g26U>DEHySI(uTUzaoM+E$*ng9DJn!))^251 zCVgZBFrC}Zp;)CFiy(Y}(hLYRIUwrqk0(B;aMjq1rQj}9 zV^3?kl#@Im*|%V{@~#>H077NT;*Bq}YjPg3unr}&1zBlu70H7H0b;N-L%*GN*7_^T zhnp$e#ZzN^Uq6!e=oPG$uDsuAcN#phjjBECw>nqF%$7%nYEb4;G}8fN!5ACpbZ-3B zUbKVjC_J~RDvzJ;sxA*30AY}xqJ|WBgdSxP z1p=dCQGIWcgC#(#F2fl_9={!I`1e@2Dc(jy%SD(VVN=zy@4<8NjbFHf-OP~80R@`) zeUKBMrk2IdSD2cM1zHrI6b34*`7tEmD?4mYpBC(tMpiz5cnr=1j=e*>cJOX}uqN(> zC%@cX$y`~@jW3aP7>Gn?icZEBCW@V8S$l=0`)17ys&n%7re+#&I|kq{w8qdnpp$q>+lyvI@;aqvz)g=F=`Q%{k$`-%V z9M}-RTf&Pg9DmUQvi4eq0CAjati{vo}11{JU`c-GbbzEct>$i@IQ?+^jso*(RRV$+fG4t8f&?T?a1-z~-GaHmQS( z>#cl{MO+p}kMKZv=f zV4WUsl2BzmF4xmfSS+}9K4&QMjQ-Mn7yy)pCuMEen{mjr7|2dle0a|CCAtYOT^sFn zi;$e=&T1W4}920MtG*FsG}xfG)CT6aBV)6pg-$1~;_NbWY%IRwCg(hK z)~=iB4Fx1aGUnSPL>aY-lb$VJ*H^2V#>n5xRuH;I+G&nF5Da%Fb13_J$Zx_9PAbsz$h*gB-| z%l0u;m??TeFGzUx%h zModoHYbKh0+paY%^ImduWzQl;e#*-JbmbTT{~sPdTlLbmENZ9_;&G(M%%B=9x!F4W ztd)?F&i4Hz2BAxO#*w^^W5yI8m=A7);v?G}olqaN0EFP~(pwwr`^nqD)%+$P*BJXuaux-Nyi>D==>J+5BIf6L{46!Tzz%qDb4 z;p|W-uv#PQ$wzWC`3z0>7gTtMGp?E}n#RNx48AwntS?7ciKn}z z>;pSY{6ejbQK0ESi2)D~F*RU!rBa2kICkvVn+?8v&i4ctPhAz73b-~7g-hPeeJSxY z2P_<{*_mX1rM<6w9|oV@um8k2T7+8U+=0H@DzE9YrJ|f(S|JBxG>Q`3edz*i%xEk$ zoie8xs{Fdh%VJ|T!KM=F4HRk5*kw``C2slK`^0H)lzegA`H^TNqy?g*&q?lGpB8;i zwD$0X^Trc$LZLbf7T+V}Q40L)1uGu@2oW(W6yJ{hXASBxDJ{qE*4?vf=W4S)RT7ZP zRJi8}It#C}$sdWv&kb7bjd1U^)fPUfh`#3ZDO|vuqaff zt=aDifGT(CSlLN+6Pl=drRNfxGS8j3Y@#{Yxn=3*Xjgf;EC@Dp^%HBIV&@z9s+kIE zxf&kt0#_fY4-MBSrH-ost8cK_C&+H6+iqN}7T_JYl4?NCrJgn74JqYAXl5`>kk$6u zqcYaU`@vTJ5$nBoTci8sv)gJ2h;Y6L%u0Vo&=>K=q={tM`PR+N? z$}el^wCXK6KEjb7FYnr`%oKXhD0k^9Jm(j-?BimS)8845W9wSx@swVDTFnI%qqd%h+)LO9RyqwE4;$ynX&^ zj>G6-u;|9Y;;a#g;`Wb1e0T+UAg3^v(;)Gy7eGj(MO&A>pY4k(0%n!6?tXoxW0!ongQ;;?SLv;zch*T>0Nj5G z1T|I?moQbyH_s zdtuQ?TKgkst(BO@Bqe znG8PT=$4w>N+Hi|;zewXd)mt!+?n3R0EZP2{ZCT%mzw2&1MC0(>Ir+s=e@QW#{+(t zy_VA6Qi^Kmr@aDxz!jMo>>kH{b`oX`;(M9O z1+G?l=|8$1j`;9*sVIEby;~i=A3;!dI z9j~z4Ltu%ctR=|9o-ICdEGCujp(wR`0MN$idb5s`i?51+bs{S|uYOUpaA@B#6onE4 zFWj*3>xo5bplH&|CObnnxsy|2RNV8EPP-qbnAoFi=t2w&jQ%WnUn7@TtXFA*y5*;g zXEIS%Hx0V}asb1Rl=6F2%NW%?ez0!C6xAOkiBK2)vDNDGD|a8Z?q2-Dgmm{Q?!&E> z7lBiQHV(=J9+jEmV3X>FXKFn*Ro%~yN%&hM9}920SF ztk#==1*gk5)}}Xc-qw0XqGhu`Rct&!BH}N{TeIUcHG6E5K|x#5em1!^6c?pln3&i= zD}Xc${;j!wiqUELi@0p@dDfAhDb!PXoBege&d~#%>Q!9jar=>$@rs+*t$a&oF88(_ zU5#RuIWhr@j;ESwmzP_;WM?z){vhkRU;+p^mmRXNZSDlrzPhSAe8rAdz<18xPk+AD z6hClQ|0Caumc>8&pfmp(%zM$nzMitunBQu5s&;;NZ_eRwhw_a%(?%{s2roaiht;Vn zrW_RyUzHOPptL^o-W|4z-l0R%a>sx9SildBHB8nlzoF*k37FY=jbh91s4s()r%8cq z9UBZ>*pzl{0p;62hFA($_zogmax?ha15OYSyUh)vfer;QwgE9%W%T!q>UiUC5ucn2dV?5*=j)88xbxxviReDZqWbG1NKV#{=%qrznpg>b@MEGXDGB)_DL)w>eKD(OQ=^32XwO1I~OpA z$rPCW2`hL7iH|`)1_99sTa5Y(%glX*oge;giUbT86R*r5yTyWfnAv-Oj8oxsGvnF9 zUIFbqCUL$v#-CL#Kcm2ev>pO4W2+0p_uLT4BP;9tnWH@XrWM*5Fda8P-ev6Fb*6m{ z5Do-xdRg%7$E9U1!;<=@*KLa>e#?SWl6~x{d(~QyLQZ`Wbja_dMxPfA`nwy-r(Gpwl z+4sD>k80^8wrjFGuWOv;>+!ebl7b8&wpEz*yroAS@&tZy-i#MybDlBHGT!A}d}9r( z1q9o9e4U|v{j5d1a8=nY7w8jC#J<)T-8vkoHpQt_i>10W?e#UVP)G4h_vz!go()Qi z={mT{RV0#_$0Iipm08W*F+u;D%8K-NLBK(vZVB9*T|PaXif@8Ic0)7$b+YdxEbmDNmaPNki8+%sFp#M}xoOuor+kZ{{+ z584>|jkj^Uj=Jl5d8Mwk%4*n@a1F%Za%G!p)jx(R$kjP-$89mMHM=$jLYG^NA*x^t z`?+aP9k;=N1Q6HUCe@b7NCsubH6iMxyQbf!u%P$miptLllvVWXfCUw;YH|y&*6q4h zj+7Tgjp+xo&sz~^R70&WZ9;8>Yh$=p@&4-4hEd7*%m_+g-6cAmTrK0s{Pt?I!;rYc zU>OvFM7%ulF$bp!O3a=aLE8r8*_>LjM-yfMB>BqRiUr)Zv!Su%HCgvA(EYz6y3*KC zwrU-7E{uM#OQtAm5Kx_9C#R%`#WB5XPAC`af~h2!=^E2xO*N8~9xQCm;}^$BFhD9IpZfk0MgQR%n5I`k zOowJeHJl^5N7t;Nza~R)l_QdW8Sr9AborYMkVemV=!QhH3UdvVgpRhSCus-M1HYQK z!*+fOK}~J~8ddO=)$JG}3%gre<8j{IsEqw19aA_71Uuv@2{-NDzl8$mhqI_1L(BM z0uF%-F><16nQ}><0HP@&%M7}q;d*Jcq)|-`4j(H+SAj60b4DMqBl@3 zpiLow(SGV&yYGn3?wlX3Vro{BMXC%|F?;DZ*23(#MoY`MwKKy?90`>w}2#Q-qz z`j%VVqM*?6@U!~XfQP~O1j)JUMVITk2G%N)fe%+SLw*Xpf>;Wv7if%H=6g_NX-Eu0 z*&Kg+hjE=uyRbqD(&S#4*f56*m|k`I%!!>WABIm2oVch;hs?dRoSd z)x2FDpkd?&z|C~>HB%ecr`|pNI(uS3q#X%A7s2@9Imbtl=EJwpB*^lChU>JHfrG@} zalgD`B zM|x+?%KMEElt#mr)0h#cX6slK578snSde_S`j%T=8oAshPfqO42`G=Ai#v%~(hQKM za%M5c)y;o`>(tAChN(Q-F;?h2Q3Jrmo48|o^Xj9y-u>*K3#h_1Pmtp^mFV1qM-}GO zOecz`jmnjK#pd~4?6a63T%VNKZxEP~%w=6Yp!8__%N61toKN4Qe|SwO-`5&aQ-}VU znyADy4C%Wm?c$WIRE5Uugq};_kRv#R<^{LXeshUUqNr0@Qi49^>fJ-6V4;T&;0o5< z=0bzf*|ASl8u$4|OZD{Sq6_M8;#L?*X+VCe)O2Cy__a<3!+Iyto(TXq3NJaM=_Nk} zI(e-j&mY}*S)8H8Lv_-)MoNwtpF3e)B$y(WggV{w}<;wA}A`NS}j2SgWI<2119DnWO;qe02)9a~_ zE!I^8I-Tay=3=K2&(QkTjU_ln&|CJky7rrFq0yv5Qfk|zN!x)+16(IW%9hZet|jLa z%n?3-2zHHK+%sSqo5uMr(RAtdX#i1y+2&L==d|n+dvsVSCr?w8tnfg|-69%i^m&R$ zW8oJzwDF2WBmjxW^~1~Nm|fHIf)U98;_on}ZA$>c8&fWTn z>YRCY!N?(j_eV=Fd;>cJ`+4Z~wZnWJS6%C!d-vdp(7K+_&&{yMV#kt6)G}(S&PuyQ z4Lt4?Y74(lrRYv}Xa=S1&uHJga=zMWuMJhE@lP>{*k0)=bzCplUfbD}Pwchd(Kzf8 z<2W%L5!aeOgA|wq9SwL{NpXm5Dj57V!z}z*q0W^WTB_@z(FhV0I6Ro}iAmJi?n; zgH#MAEhLXesyk!qOpJhrZ^b6VldIq-!QC+Wd7YZz8Ib!m&Rs2#|!VU zHXetLk4wxhg5tTLYtw%5OmnW>m#Y=`j?O1rFB>}Mo4z-jn(wy-7#(!wDCJR!8?;{$ zy-DcB95ApG6lG-YnduhxIU0P{gppWYQPE&>bsDgrUOEf`$GKk|D6QC|IP#>`3lC}b zii;}+9!0tG7@yCl7BybBzfYm8=dG~m%HyijVq9A(#pe4N`j13)L zz!mx2UJRv-5dlqVvJK_7cwx@A1PG%}lys<#Wf|o+z5j;`c!(aybkoj~Ji-ACV$L)S z(o%h6{VXjSuHv3P%&1USzKaW-M}jiB+R{Vh4u z89X%0d46Pldu|7xvshF+8;8+@yN`PV$oin;QmS`_ofzg-7bko%K0e%3Q)8!prgg$c zCaCtzgo7LAMW53*<5pAk#rT9B63@(g&SFU}Ny;#xRR5-NL^E zO8o2cgYo{dTmN}khaT2A0$+2C?ak(UeNClL*63xnHaP^tjH3b(6lM2;1^_zNuGZ?X#t-Y97KcBU3 z?xccCtM;NorKJ3SkeeAjro1}Ssx;J#sIXK})h{AcIT4f80A8cnvhOUeXH=rc76Ty~ z>EZU=3j&)KhN=zGT`Fj><3dZxi5X~*`$M~YaC`pVFt3#a1U#3-2{Gu;0X1>YvPzF- z9U%_O#x~km&F4$*1-YfudU4*K!!ap68=%+7NA@-zrsojGNre#^uDms#q#Dby$s*=4 z+lSHQe&h_His@o~3v-K8w;nxeNa-mU1{~0w3eyCg{2~~l@N7|ihu9Z!K#dAU^nyq9 zqdHiP55B38OTV_h-YL&cih2@`Ytn6a=>h^Q;I`bY2ez}^ zRTkPM94Yrpp4^_TEit{rqKcf#3P;1sPBVMyfZ8gqS~iRBz)Z1KXd+EvX24J?c?v5?oE-ZUeWY_Oem)jUrPo|@l`!`3wUxrLO!>wtb7UY`q zkB<(+t({}LeV|VfX_5P-g<^R# zBC7;2do3z}& z#erLo9;%OGN*Y%VGWY4_#l^%O0?A@F@-=$!K*6;`DbDl}x!!q&lcpC4-&7JUO=m9k zwCPYa*zHay5spl49He)Py+PxHwDEb6#ui))~af08P80AIcKJ|d)NFDu``WNt%{4(cPzdK zx9dqL=*3Z`9X_A#3b;~=$J$WQfjm6>%qiYWTW23%_OC}Lp=AuLFWJR`ojZJQ{N59q z*-j+q?DL17A4X+jFV*aNP-@vwxxn1V#3Y1V11%+7P094zT+R2mkNqA=JE*jj3{xSk z?NX5~-&Yx2zxOz}faY0@J?*zT@0HdTgx_>ChIctDO70I(?kDT^ci3q?oy*?*Sm!sE zWmR$y8AS{z@d@R$hHw64V_L4IY(byMkxp@pf&IUE5HH#8*=htekSDre}``ezJec}at9sy2`$pf(q> zpx(J&Y`J;^r&KO@+A7j-FRUYY1E_Yb z2<%5?V~1mVY4Tjt2wO2wmd)EiW-TSMXZrK6fqe#9^}1ii_qk{QRh*r45E8=DQeyGU zG^T%c@w002^$Xxk06MPB6(jy$20a{X<2eNLXh-NABXaSOE`iI8*WpxnW1vHDJ6vPs zb0QOFu#kJcg}nrF4x8eoPX1YaWsX!3LQu0pRTrBZ+_d!$DTwVogoUQ_BHvaGb_3}* z%YO;yjd^E@1^a+z?8BYFnkj}}eU8U(zs_Xndq!El%AZWF&FEh{3{5kBkz+v+%-mY; zZ+8k&Q-_;2>W}u`saxTIlTqQ4qHN_=}P&MC1NlfWM3)Hu&K#avYBM>G<~;%4p2 zzP)++s@wPHv3v){PkNz=uMSjup{lJ^Sz51mb=X-I9)PEoyz&BWFCoX$)PnE(e9x=g zL_ilLXsw?&cO5y>w9=--wMu=hE&)g2vkTJ_)X=N&H!YeP>{bbv{u0W6Y}J34XsH4# zx8&a%>)aMALLJT%B&$Yfv_Y?yO=ip@3iN6!60ePWJrwV!i9;YJWw)gAZK@{|!E2W} z!=Pjbs_zXdNRUJDqr`KbMeIaJJ+1SLHvk#33(%;(Xek-Vy8rC=K7alAdr_0SVZH%5 zK61TeOG)YpLKH7%t1f)!i~BMwF<25sHkUe|&g$)QP=2sx2uNJ*r_J48J+H+XPEOqx zLt)rgF+WE;W5oD9=&hw}h!H-Q*ihpva`Y=(O)5KI#-Mo+#WU(yeA&lU`dTW@GAJj^CQl2RHwo93NgiT z(vb&pnqu>>6%zwE$)dJ5-$-PcM8|TiAUj#%k4Yo`Z58i6yFA`Vx8qnzl(I0w=dza= zRuLwr=rN%*nK2)TDi$}X&O0+rbWGwUZ{6W3d%;)TM0QfHXl2FB!omH5tQn>w8alif)WXAF-&meIq`x+t&K^9s z!*QRB`{~Opu=~N@Lz~5!O})J@=fs#Cmg}ZIAZK8;!2$SMBAC${0b zG@F;}Z7a3qHr9!@;}4);$V^p`p8polKNWUg+~?=p;-p-fo#yz%GwB<#S`jP?EZ(20 zNp_+ltMhuwW3ywu^V}FQV%uI3oo*1}g^Sh}azUMLte78aThpGIacR!Sj|7ja#$%;ii9jhG2Z5lkr$aIv?PgM$VDadv;yK3<1;sI$QM9lJG`cK)tcsD0 zBKuj+Y?J-r_rGQe%YSfeVTes#jf~VBk9QU40vI=INY+=@U&s}Qc%?VoiXN=VUh&pk zOCxBkxXxauv9{^anc*h8`{Cz$$E5u$!!zU<+@EvtI3oh?<^%zXFllmTN{aUCVv^-( zZ+F|k(UAh%ejxS4YCA3(ddC|y4D~7>uW|dbsp`0@D+H1WQ-53^+)#=ej_Wm-u&8s~ zQyh*XosqLOKaDrz>9qe2<`)@n>%u!8>92HjU_vRV4eO&Gjy_C1csxW@L2j1w7M{(! zML(w`S1g{=UM>^Zq^zi9EJj(pp};29F6JN2;Y|z6k9Fm`*`=4!WPPp5n)WOE7IEpo zVrLu6jR%r60xL^v$}AdPtFeK_Ry&=4*5GU1$20h2vBbqyO%^NQ@FpGy<4SwGet(P) zi5#v&8s%g`nl-kSN148WP1^$ZksY)cbD8WTv3MBgbT5|Ly1X!@GL4mf(eW4&cRgXL z-svIOZhLAA5qgelmez=r*Pq;kF>dbjTM6Gj+Sru<8)I_A^ZKI_PpXly$*|lg`cr>= zIrL)OTw?*2y;l~yh`A#&v9&rdc3)~7**(r`D>kU`!V8;+!XN9;PXa0iGD47ha&+Xg za&EZEO}#iFQk2LTfb?zH<-&OU;+)!*vOT|g2C!;r+bl*CMy+EoZ|}531U!nx7_xzH z4_b(<%LT-gh!YDHL0?E5Po*$|M1z{IY#cF~Q=kejb%!k}C3_LFrW+C-+`B!(t<}hr zpox=_^2|Olz$(*kI`rM~{g^)Sygeh=Sy1ssgk_Ev*gz)3wDW zy^WcN8cQsZbx^pqy!jnj(|dKi)uk3u%T>lGrjgWew`t1YQS&rd$O(6F@!?Y9xI>uY zY$A)MjeV)4N~nYwXKT+@T#>n1x}%H8HR&bQ1vVKgPM-j2B@xbT|L|W|v5(1vKZPl; zAh0sOc#PllQhlY`GbASELGMizoQP4tkeVl+ z%T=YpL%O}5dnEK#Eez5}@_ZYCvnGqVwOpD)w$hdGWyayg_w@ZBfiEg--b^~Jw1j3M zW=REQO>wh4=l!dWxC`I++=F$r4@(`V;N-2M=BUhU?YQ1(HA@-_1?TM42Y>Uz6zN$R z7V&tn56|W1TF-Qu_Vux>4~S8I7+^^pz>;ttmy-kU$ytl34|@1}Cu{8(HdiBZ%$woB zN!%+Bb?av+sw&El8>ZS^uJipK*OTFM?`Toc&5>aZlyyr>>j=ZHNwKe8ex1gJZ|?ev zU{XqHEgal2S1?(DP~lM7;^>1axj(0V`Pu_N%rQ7~>LjKDo zAa)l{YMCa>%eXnYRy+^OLUE~f(mT*)N51*-jru6C##wnYggRz0Dy3&CF{wswV>dD- z;EG5-rl2%@7XrO%ck+ z*B*b@*@v(Oqyl;JtG2{*1@(esujJ4r(F-k2@a6o&2$`_NZRuq-!}Av@mS4w&Z{&m8Wb7@yh&6CxM<`W{VS>k@szmmU30K6rSZT$R9%UG;Q`L zzZW$lPf6*0UmSHUW6l?04t4zs`>#YTIG|zGTlNhTjiNg7&=dtJ2nVYfGE0|^=#M@y zxu>dcGm=?O`a1sn)A?&w*UOMlq;2(Dco=$-v{l}A!!L|Xx_^@`dTrRP6S$*_5Q-wZ zT+gyc$uDhGZJ1j}!-mi+X^a_-XBZ6y$<^gfh(fWeJ#`hQy5&ZV%H*SMU(&V3$QEPD zcO17=ASe3?@SS^2+`0sfaiptmgP)|>$BM+OO!Kgr>+htQ+f0k;FmR&#nZSqBk~RACnk&+6r2Cz1v=~lDnQm^G*QHeN+O+A&td-;m)JPEK|0Y!9_NtM2TPE^)zGf{_8${_xS+6Pez1MR#r8{ zbtG#{q!f-#YohWs^XuvvzfaFs6XV`qSiCWDH_Q=VdgPD9)=)a$>wKB{F65 z1`PTdrIH>mPGpXnxIi7)_XTdui@iCIvoZgU6>y?p!(3gxg%s^WFgPCxCj9xqY{+SU z`h2ose^hi-pEjSXGh@)^uh89RLU?33_O(s-o|i_)Fwyz`386%B=?p~J5}dt_{j%|_ z0sLiR2BD=3f`q~s+Xx0<$~c5w@S6*+ ze7eLiNYpego#`|&4zY%Lqwh!Y56-0i=(LLSdQT&BJs9H=)!z(n;Yv@dvXf@;Na6Q3 z`UC5Wp*{+L>lA0N1T4fo?kQ#q1R#V4YkjzvYLP=*lts*)xGiufg8DmY`qc{VM zM8p79GhfHQyUdwVI&WU&<`gl<=rH!YDB7H$RvU{z$!b__!D)Gzn#SD)@4JdO_7*;; zoRA8uwhgBWX?#XeQI}F$QZim0{5sz3A!jEU30^qDsN9jo^!h7yQj=#x+mu<3OB3gi z#gG-Qudh8SP=+4^uwM$I#L?kUv>N)*bYMa%J0U3HDz)Iwb*6j zUCu_Tf}9DED0M831agULy(Ap_8t<9cdSILTu5yB-+4PZQieH*B*>IW+xy|SnV3pPN{@N%DAQp8PyBJmG|c?2CtgCWFdJW z6A?+x9k#J0EU6kw1`-k~qc&RZ7~kH$+4fg|#xv+W`HY8u2mW8}`|Dis014{g_(u{U zTIhXM!Vf_x*>5O}avWYPXPcgS`&=F8$pgWlg6E%xJo9zPKOjWs7BT(9Filx6ZN;p9 z->JP+QN&I?rK*vgyipDyr!&>$Xxn1CTZ8}J&qN7U2@|#NSt0T=(s{uyepyM487u1! zAH?m=qBn=D@o4^}yHuhELqI_IBRuo{oj4%f#k7((SZ{e%u3FpyffPDk9Qy!H8-uem zbTWbQ)W^m|sdLj^%ijL9uMBg0l9S|mWvi5eOmbQKrange8~b6s~Z0&zVvZiURTh>Hh|HN6=~RPA;0ORkA7 zV(rg6kt{Qx6ff9W51bv$3C}ZV<_+K-N8-vl4tKP-hwQjT_2pi!&rDVXny43zxP1~n z=XGw>1$?bO4-Au}^5lTn)ZrPIg>x_WudJ)%3wroPl{1m; zAvEu~lt?4Sy1L=*WNLBR9M&?olM|A5oF(sx^r&ep1;;Tw^^c<u}FrlkhC z7B8hOQf>cg;-O)|dbl;sC!B>jBUMc)aj#uD7i8%c+LG_mR4F_zw8GSX$&6Jy$6}5t zb&770M!$%7?k%V&8`JZc)E+But9&w5#74{lID<^kFstPRMG9km*ttM4hIFGt#xV>#ELZWStM)(jne|YuZHg6zO;6nMdNiv!Zw||3)kZ? zSE%4BmDd% zkmyJ}y2-@$kJGUsu3ufPhQ#uV8kb(+M)xbvUo3t2q`_A+Uu)G~Z?`MZQEG+{pA@E!It@nk3GyxYz>Uk4({So-WVADKS@u zO7ug_CN&yd2D*%lLz3&e4hIr=jd&fe`}Km@SIeMB4V`OMe$pm3#DpeKATI`%f4Y%< z_dH^eI>l(DjNn-OVG4$s3@+?+F`oxgN+wd8knpCI=`x{lbY z%tEBzUhX~)z57>F2#?0%$DNWVK0$q37#@AQ*dE|XM4x<- zbUrLn)#ueY*gxwW^8fMm-QjR<-Pq(Xoe)DXNR$!%dz_Q=zL77#_m6X3^UsmJ_u6}{d#(Fk>&f=`dMjW?krfSX zki^=9ZEuZ*54H;l8mtGo+fRVvid&> zl5x6Gsu^`3yNQoHf}{m{5nBTl?iG^Rz2d{kN~N2N`DpJ$+Qgi#Qf%5Zmhr3tU5Vke zT5%f;YdH=VrS#89BR9JLRH-J%yOIaKgGe#2e~W!}jqR(|w96o`Yf5FF1!a^7GS>PD zubo~(D4qUrOP7ICI^r1#y*^at1r*h;k-=5hp$#~3e34;hTHNkjgCGyKRNH}9rWGp% z=)cl4Gij;%G8W$W{ats-b$$H0f<~}uqtgFOBO@Nk0MS|w`zCdk`d}&Hn`BuTqgS2Z zq6kUU+K;?l3k37Akc20%u}3{5O*mgUHdgCOM%B3)tl6jBgm1I>Y>%E%6nXr~Fs>ztotDdv`s%RBm1zDs( zg5JS!uEd0PERQ8QB_1MOV~%3u+9ewk>gf)O?ft`^sL^gDOlZQb8TRP|bH)69X4n`F zH+5?67sY5r$SHf47I5K6z4kx*!LIz7VNh=+aU-mX_v#^Ao%|WkaR}-0zHemiXrDDz zhXo5Ik~F1V;ETN&?a?l+t1Dyl=Hx^XPS7`v2Kn0qX0XQi^8-3qTfA0rewol>64tlo zlOwxBgh8n=V^Pe=$?{kVbBtln*qGDnf50tXSSu>nG>;|!km}I%HA$QJseGHt%bWl1gv3y0T8X(=Y56jq9>oL5BaN9 zO6qs<+#&_{n<`c%4MrFn-zj0hMyI_>az-d`o(^Yys8K?K;%wc?Bm=W%ydr0UBfQ^| z;?XlN;&{F4$Zl^5mc7?)g$9!F=*$oY#A>;HOVnAcdbbbLYvH5G48H1jqF-JMH(_7X zcRCt_81f`;hCSaR8hV@7j8w{V@~bQO=#fRP;BkJOIp6zHs$TP>Vx~?^9M;!a`qO!j z)7XPI%aGjj3RvnW2DjjMltIJ5H@Qt2H2e8iEr{IUW3jmdNw*#7Kn=>8RXwqBV5o@* zl<@_C`HvyvGY4M=37RHE=WG3j8ZC`(KsgC9MUPIUs)3KL#Vo%@PraUS7dtVhB88>L zYp?S#`Vp4&vdUJGE1kHumwUII+HIX3X{%MpXROI=FCaeJ4lueevJ|9SW~E}$gG*Cd z%G!QLQ@nsyfHr983^Vn8rJSHkHxfn}$hWqa#K;3cx*o6GCdH8>(z6~t&BVOh)-O=8 z{F`ry5O%$hDkOX{-(OAV>RKDMSRR2lJm3ErhEqFuVAdBC)muc>9bqeu%6=u~sOp$a zKjzyDe_GC{rz=*&j*SzTwWm;9QFL-YtOOuWPj{9J3%}X-BHRj6L~N^Tu(-R3qGVwy z>fOt!OT?OQKe-@(s(H*7M>mH>6}}{kV1C`I9Qr8sx^5sxU?O$(px;w))H) zP--Gz$7>#;+SXD0f}$+NJO(5FSd*UaZwnWRD)FsR&R&j712 z3c0e8==NGO?OW=W8Ge*M-#sLlXEx9>ORp)Tzb4T#X|Y#HM3JYI9y{Ug2P5w-(x%as z$A05hLM^M*IQ*ob<>b39?Vz~PqF>5KV;b$_%)u7UJ|szP^tnSNrM0Opz_6B3+ckL1 zt*4M;ggdZT`Rhc4uFf)h?FdU@7IB*F)%ed2aj3g{rPJBk*rjr^srw4)0K$j%wiaKv z?!My3-xZGFtnBCCmCr{j^If0ay!|u%8vncQc23&A6hRsIXpK#0LOMr$xp14ZfNb~h zioXU2Ge1C(=c%iGs`V5|P$}tfO0hV|+1#AwIf?4_!7MX9yJCF&|9OD`T1oLRm8ef; z`Lz&p5$o&rN|?VEROu!6<#8*g*l)_S~n|czN$(SqCk3!5d!}SFwFZp+>2_G+9I5 zADt~*37{Rgq-WDSlNJ+Y@#9W;FMGSqNv-Q=DoV5k*}gW)FQ5&g=j#PKyf0~}i2_oa zC124$XLEO*l1WTac`@cflS-!CE3{0)EO^M`8r)tL|LIxgJBBBPEtBev%ZBbEHL$9a z0g7s+M?f?RVTPeOSeATeiPeZi>@l3ybrn7q`dR-;Y3T{>BJ3XgmQ~8 zi~9K&W%OQSXSf!VX5(oWXm`2_7wiYe5*uM&)b+Yz zj!tq=sIF{b!_l+Id>RVwL#EUPD;zz2jUnW>Te_gEX_2A$6C42bo4uhcB+ zbng|j(XWb?);c`+vE5ueb})#trbkvmobq0odTqxN53n|m=5=&DR+wVQ;=vOvXVs zkf~4lICckLOmoQ7ULu|T;}VVWu@MUM4Mioc1?_)Y~7P$_DKR-TIRX3;_ zReAz5`vQHfoqn_&=4bL+RoEA`_K86$StYgBaVy#Gc+CwqL+tl&iTBsK_Fn;6geveP zY))IR^oU?38;q71v30CG(;|@=iyw99gCp7+x>>cYZ7~3?iZw9^r=U-y56;W_)Wt_A~*&?-$Vn*hMl-=8Aj-5X-xlkpjWUI zLSCv(zL|75!SDP?Y^lLpRDyqZBWaf9EVfA3s|x*Ww7YCFE`>h^$;p-e){0ad4=2dv z1|HN%6}6zz7+pjb%Xc^RUV?)HSyn<~sU;PV&V9<F-pSG}e3 zL?85S9w4TBQSo`8%SoevrrjSO?JyT5~@B&evURH^r&`-GiiInzSWL^<;_DNgs+30989uo3|S|goux?VcdV;LTUdrc0cufzUch^{)k<)kQ%m=9g36SR$% znWCH1=L6BRsB?bkDpd=7^H0fi!aQbe!Q}~oUjKCE0^lDimX>axO-(e^aU*74>lP*7 zUYu;6Lx|mHdvq$-K0_O1hq+w&ZHSk3bm)G#U7mX1*ZVzd|IPxKo}A^&Jl*ZCXbH8J z#B=jv_odTK5`zJO!T)>E)a-mOn%(;>!dKCJ=HE_*zDI=SP0kx$f@C?-pR9lo;$Z8m zq`J#@3-1UeBWJ-(iMvW>vH+l~vF5W!2!deKmJ@Wt;o(F#eGEtD{(dC;ZZyn~#agZX zp(msOu~{bOf07_rSC0y*I#3m@tm^;w7UwG%i@q|=5bwS#>0y1IE>5kX1cr1CtFiuJkt~b4TR%(g>>MDMPhKRO$_Ihi>lsj zc&;p9K|^b(EyQd?O0;u~DH3Rst=SN6bDmG^HR%|~VJ&F0m}JvaYHfH??kF`dZT3X4 zvIckNmWk=l^B2p>FLdjJ-ZD%%I_|T)z*{67gx)|Hq?B<)6^1@ARm_du44`D-YIZecnDH z(d_vpyw36T`P9=lqECu}8aldkdiVVJxCW^^Fh$%gdeqVHBn%z05aX6%>N<)RYq3`T z5q|!dreIuzMQK;pP?y{PbZ=8NQG2|1wPFpkoV%Q>Jr4b35qO2{-r;)m7;%F`jN1#3 z@ZUpX<9-VGN&V~m~?=O=DxGVzxF1mKj6*}7c% za@D`aO&TKi!|Hq!#o&c5PS<4HJ`I&RHoR{t#skYe;nLvED&odf_iSHID2Jkktd{`2 zZ=MK1wI~TVE+x&pVsp#@OuBVjuj}N;BQoDw5yx$%&*)%ZXFlIhtpf)2o|FAHb=K#e z+HQ7_PnmrB4Q~(0PYH9G1G0i2KkDjs)%W53)x`CZN&90pEgsqLl*Q_8$5E`e_Q(DS zCnXO^p7h_D-KgtG+T-;}4tQI0NdHyURKp*KLS% zf?@X{ysz3HeqUQldiN;t-ZXzbh88|ADb3E-(X2b5k=GJ zy&V%X7|}5Ax0_PuhHSk1p9)e`>$_K`F&^E{9zj@UwvTXr;QMQQh)iqlxIZ?wd^S$p z9@{T8E~op{cV4Q%<=NI`rJip0;p~%+V{)Wvd`PkJ&qU`Jf#}~q1KMt>45yx1Qxt3G zTibo21odquPck<>RWl+?(k-9!?8n4*N8t#!aVhdW!wIpo1&aIC?vO0RUK$j^6Y&HD zQ{b%h{nRp1^2&6|u!1w?)IK$_x`nx>&SBlnlA!a4?_82M=dI|-U17VlIsU})t~IVE zUBdd%&pie^>r$TAOxKV4!x4TOG(5e@T8ondTN#HlVp|?FKHH@e2mr^5WZpe_q0Dt$ zD$u6jQ&3`zQq~k8Gt_I+0uz zH)ZLrWXAa9{V_qNXZDlCOrRiway}O7(?VAzY}MOI8QbeT)LzHAmJmDQB4h-;@l)*6 zYC=r@1{hpboY?tUuuaD7Mu~A+^s8MtT?j}=$McMK%_Xbroz+t6m(YIw0;?6c zQ~7ceeJQ<-UbThfE}CgAhC-3Yv-`a!&*AA1;r~zC0Ups<7$c|8sw$Y;$?UBZjn*_)Wk6a zw>9KdHP_%GT}(j+iA0#CPtUIQwls)fJ%HpV2YW*U{d< z91#?sjL*+k({FKpGNc!TrOlD1*M}+N6dSu7+Vc#zK)+({Ep{lPxs4biNq>k*uoadnK-Zu{|7)^9bd2!FLm#sggHjzxq$GYyE_U_XOx_Ae;pr zVW<%|g&?gAn==sX^dXfMqeQVvMNsT#mZpUdCe=1x>mB{*W(w8FXo+dTR>}jtZ(y7sQPiR;7)5!bSr9KyjacO*RfsL zP^$!l$D{apXF9<16!op;>-ow6Y~{d$GeC3ps>V2}PerJzZ#!7dx+ObrdxU-$b! zpH`~fW2Ax7My$2P1kfpISjiYRS0*T10)UBO!1d0oj4QdNKtiM1tsPAs5Gx1!-Dx=( z-#~w;;!!Oe^vkUUN=Qlm-(d|yJ_FzH`+H5WaiAZssi02|IQ6df?KT`9aNqqy)h39+!7T5VsjW@PQrGI-WZgsZ>c}|LXs9J# zeWP#@Z`Fe=O)LiWH)@H6-wn=~(r81;?%r%{dk-%9E**Getc^&nCrv(MhfFT1^HlGp zq&Sp-gLMRsE5^>dT&a{Oo%NmyuRQy(uqyS4;c=0-t5I#=NP%Ym;~H41|KtR!&N>6Y zi#G`G&K-Vlj+waPR=50tQLwFeOR@xbHI`W2W&|{-bj;8u)O9Y&GYa90A=?A zeva;7K>0vE0P<#ke_KS6nz@d3oXro z^&CyT0srtD3Ms8X57gO03(AmIrtaMAqqA2~2?shizp#R(IEl|GzOS6M6nnfjucDfP zK(n7%bF8|8$WjrDnAL7=tfCBmte3uPfKVt>C42Q=rG8EOpXuk9;uaWkq9b)(@{~nw z&!px*aKAtele?6j(D^Srg?pQ-IPJWOvXt2M5eR=-q8!=6=N}(<$Be{U(-2&LlU|?0 zY+FL(CZuRbJs-}dfRrVD^keCIk)b+il+J^fApB9-!{epNbF{|=j(BLOr*rOMVD=SO z;Ic95&iLH(WLb)?J|+%&K{gPU_it@AA1-hO77_%JKK-8 zPX&9!b=G6|PZ!QltMPg_9>HezM-6r;BoC|<3DG_Pj;J3+?MGIS5ndCi%ziiOiX5)9 z5hcXnHK2hyXXoX|_2#}7?UW-w@6KE(wPlAPPG(j~5BS>Vx8|EYPa1ri3P~CAFwM9Z zT)mxA8Yvv7n!C!k)&c+cfYCP00d8=9xO#wSe{$3k<^)VDc|C}D+Mv{p7>i_~jPsg0 zHtGI=**Gm^U+ zhTx+H_ndE3B!yYr9ofeEW=A#D1$`?0Nqm(I>OggY%@rul;aZ&Qt$G5@t7yNP=@f6y zqb6yk^{5WlFR13aM=4QOTps9>Z_-K{L?#G0JT^v4Gar*XNaq{o?TUsPi|Wl@H5$>1 zzqlWya^1=r6E@tzb9dX!DEVgNzfDc-SX#!xAKqzRt}NIjFY3M{NSrm5>k;vpgLq)- z90hMiRtj%!*q{Gs_Ayw=!?i%%pZ9ATiEkGlZ)j>tJQcGRbW|K~7^OySj3&|j3_f^R zcpAWLP$>mxS!v+{{vJ6Xzm*w)tLk(jVrUO0a9WR6?)T7M)oLX2?>sO-|zAEWy2^DL$# ze7$VPe1NPZl15IjTsiZ(+m|Ey-Id6`*G(=fLH{@%L|QA?E7SRfhQ@#!O#fWDNa2{L z!%l$IQ(K06r0ToV+&fs0!a7ukrEi~gn>Pz6w6A+TGE1N@9|C$%oP33HYe#{JxW-b% zFC3qxf+_yZX)hH60yr=~q~yu_aa+(R#-__Sy6GyKs+n@t~*$+RP%pv$r?)sf@LK#VSyxBJ$8b2JuJ zjCQ+gB|`uK=ykVYX|A9o*2#o*k2`lEp8%S$-EJTMUj=J%GD9C9xuZA(@v(|is&*4_I(`) zk@}i{Z^WfnWs~*;B#Xw};1AFRFa9N25}r%gT;iA~PdahKV0w>D8hGy=zj}q@Ff-V% z^**U>oDx5nszkBqW)Fh5P1hZGy9^ClIuH=UMXJ}|QQ>M=xcuSH^6QT5o(o30Yppl^ zKm`bby6nL1@z`(iO}7Bf#eTtVb$*w4Wi6kUZT^e1fq3ezvATrXqtvjq%w~AIs{+bH`Q1uyj$emY(ecD8F&AM#K-I%0NEdU% zn3A~ol-9jY)39D*>o5a&j)H%UUG6rEPI4INYj!IK&Z*wp5pW^dtt5b?`nHj|JKJ2p zQ(%f-hwGuo;#WO*!RG|Hq_=>U>7AqAZGSIgH2UB%?C3(EL}1@yN2U_*W-k4Y1eB5; zqmndg6U9;*#ZCGpcLIpi@uDmbs-aduq<-Y|%(I<&t!iuf<+Ki1a|!~I!eu4g0RT=h zj(!_g3XS`y*}n6{o}DuzgKX`3{ob=u>wx=zOjQ2DaDFPjW<5QTrl2G=<4wzkAHR7bumuz1*2~Jh5?n#8SObR4fsfw%g!fht~R155Z z_cDTgZ?iVQ1K&V^q1d$`3Tz~FydXSy9AkUgmEe*S;(C1mG7eC%O?h@lJc%K zdD{S!914jh=jVAB7JQ8}ME%EVJCS+x&bwXov;~pr4(D?K#rw0HQ6L5LIt}IS`4Uov zu_l~#{ znh6n8-otB4Rch~rv-0_Lc%{pX)}z%n2)IuayV^7&FkZ?5@h8Y6=Kg#*8>9rmRcBHH zjjyX|m{H;JVmjvAf4A}Nx}*C-nm>wvJe@tsM!k6JU`q3FwT>0OktpHlA{*Nhr2 zo5aPW{sd`FAbo3VXFKEXhUm&aB}hNDKMVAAMegim3wj^L3pQ1U8<(&u?ELKsKR+WT zFL7WyJRlxiyNU4-^c`_RvQa__0VV3uQbgeF9yMo|H!3RfSSDi~a`?xWKB7;UwI!UbkW;I_#aL9=v~)GddlF=O5$`k!Xg-RN9Aw&Ck=H4lzD!?#9dNaMTd1tFK$B_+CFzimK3Eg~$ zin-MGb1M`ZPaKH1d422;cf9cJ-;xO&GFRIo3rn6?_dJ-AEzrww-%i|+BR-{%cQ^*N z?W)cJt`8d(0aS6a3bh)(aYZbUJDQJPwT}{ZjcjJHzravec-M(#!}Jp~|5hFQDkmRrBdEpMr=}F3urN=*{W%9VmRu`s=6WXT8k@ zrH>sIoT8E)5HWG;-5K^2ySuxGByZ=0Ev}g|M#hYEU20L%JbE=w?5JoOeUohSM54!9~JC z<(-beW# zph}t;pi1IFL*mo8_^9NeztF`|_XFCnyH8pINeOaY5~Rt#$(WRRCxJAyH*8@U!ucAEbTQ^78hgZcNKDoc$gnvtP z#?9DtNJ?1?tITv__0D8ib=rPs~|KWN7ncUpg^GEpsDch!v4EBG+UevfGJRWTU9{r|A|OL4W87#Aze zQfwi?3hUxNaZAantd72t`|;pSW{@CJ9 z_E$cuZI)~WS*#E!!=ng=b25giH^ozK2Ri_%_->~<-W|(gLC|?g`-U1Q{PT1LO@&1& zBZ8Kd<}qq}6M1M<{=9sbkpKZDjc}~j-naQTr}=xSTr2?+*xlJJW*+$Vx6Xq<66jGu zaw>2XVrU(QwG%02M3PzCB&iqCl_#ov!A{IPxF9iL^O{An#Y}2d9PEouSqa|q;9K}1 z>`kx9seEsgE-2$UHk4rhDO^%s!T5qrz`$%O=#w-3R6 z=>1w3BjaUc!-WTsVsp~q?Nu3OrYVr5c5v-;-0c&wdKY9eI%v-U^3}-Zrhh;VrLcvT zv};hMPd;A-O@*17?#n92`KHe7be6p8IG1L#^H+D$7I1w$car4ceh@h|8Kb3}@%}mY zvF_06P=?FBvb<}AVRw#k;8&fkrjqi4>lIEe8L+hw^ExeM1RZ}y$K8)kY+^P#8c}eT zTT)REB~8N&x#hQ%F!c;10x4K3Cqo;Go&mE4!n{@At?R1+Q26FS3bgee-rXZb+EIUW z!Zv<>`7^IS@IFB9NBICF>s#*3I0I|zS3Zjj(tb)o{hH~Q@}XP3;lnx~yq_ zq&jEpF%!%1h$;t#iiZA$QGS4fCaLi`jBqGP&l#AkQ8_3{vgyu{V}RAnPCt&B1GAl@ z?oF!0!(m^MEfEon_=pM-L4~uJ3B@vw6+j&LJ)1NP$b3vTq@Mqzihm{&Q~`pwq7I+j z_cuEj{`>+9aw~g6Nm>fqBw2%TSAV9;B}9&zT{^W4-oCMQlQJ)NXwfA#ssFolbASQOuDoKm4-lB8eX(=vI`}&iz5vn=Hkxvlp8ie6f>V{$l)@@ruQd zoHd-T@VfN^wz|=~66JINYTD4-3;%de?~H1p_;K&03-#YNFaang{!{H0?9j%5oD`S( zcka>L@-mhlhjyQ(Hg0gtSw`=aCvuhnrk1i??%B1Tl~Q$0ZSqhk)kr?%fVv(f$Z426 zM{cQ*9P+1sYKsasom;iH%k({--3fN45`7OVF8Qmcm}QRQRunG}!>@C+u3+J1wjzQ} zV;=Q5dt5D5h4*?bTB+!CUJa!TQ~y}M{H(#u(Da?Qq&CGPmXLs&l6@#BmK#*YXDj`d z1kcsUn2{SIpDbapU@}&O++Op&8%OY83iEPBgAR-7-kV6x>?BDmi^Pe}yR~Gp1-JC)+1Yukyivm5T z3D}Nazqjc*%nA=@_!_HTT3nZTe_zInSweDpM&5J8JcI1?LobWiR}!#R)KNCI8pNgg z1fSiXaeLO4iijX;#C&xz;Jx&plAlj8FGVd2O?zka51(^SN%LE(%!M>r*?%f^uczDb z8u1=FlF%HXEX#&~`x*mMg_sZIR-}`|{8Xb9h?hYfaJc4(a0x}#3V05B@{#MsB6py7 z400hbZN&tTT9VGKz_!zU_2zb(Y=I)C5NAfcf!Gzo-PNT8>jnC6$47EZFtf^cNQ6;xsLVILvH9!?7q;*Kc9}3wIgn!* zr7{yL~3yZ?lp6}Kkdl}YU% zOn^*BxTWxRUJHgd+quG0LvhtRga?-~Dht0f<7?|JT)y@U{4WE4e>Jj+(t zZhQ6<9f{9)A;WC&-t@}9$JT}xx^Q>>BWgYo-w&-48d`nb0hY?bEomN+!kv{nFq0uba8RS;ou$Ni63*#e@fFG~%ocXnU27 zXXy(8at-BY%|xE6nu(OjPms)&%~6YF z``fo&znLw}Ml)0Dy@x?jm5KO$G}kUi`qnHW@(_oTQB8>S^|t#uiK~UzA)xoTlyjIS z5-}fe^bfflu6z3JwX(6XB|(r#1uo5!s6R0i|856>X@qZWw^2!_zJxI#qAd8%td&d* zn?hour)t84fU`BV0#LXpbgjrKRE{tTe6~m8@eAa=h-7#f7hMb)!%zwh&9?Vls$bBpGVSGsOpY`< zZ{rBA79g_qA)dwwrP?;0mduZJ5PEn&iL=XR{?ipEv0^w8O$}_7O_kGdGaBw-%Fnmj zvd8+=sU;eNRl?d^$Jo28-h>-aHyo?-%B33GiaujxvCr!7&T{%YIrt9J)INO#scilo5>v!-%bo*V5{4I2T!9^;7CWX zWoK?j$;!>X^WCa-MIQ%aV|R~2m%_gN<~GQ=0;X`ftKH+##oVmL)T@F}3GkG#{o4tt z?1zpwJXMuQl*y39Bw~4zhO(YcuEE4z!rXX2vBbaD|K(2tJ)^*SSH|7YIDOAP#5>UG zQ^h|MCL;~iXIW!A{-MgNmQQ#5lvm9>O-t#Ey9zHHxV#2tQ+hQ%rdGkG!*y1-5hJ1q zKhjSCRb-Ip*36#Tpalxg+3Lm^9uVj!YE6+$x8>)`jC!G zU{RZT#7U@pX=r(9g_1dpJ5V$%?H!$4FT zKpd@@v+0L7^C|T-2c|L6hT=9?r$KWo+B=J$jhFkd`BAg6jtD0wKvnbMHx*MsbZ))T z%9L?_jzPfsdl?{XTT?wBpsR6 z1?!3^J@q(OCDB%J(6N==?d8jH`xnClKf7aIevRgcvI589ag7(R4}|x7@00q zx4v(78R`7C+SJxA^HdKuz}%xsVQ_wrjMKRp;{N(jJEJQ#J z1+uM>s!CUd8~{*;+eGz!nU{|*`;LGIx5)Dy6tJt(UMLuk)$&BeP_wa+8$Dv!g{2F1 zZZPvKo&1~9Ut;_Jxo`n*Us67=YA#>I4W;2#T|&I4W`tucaoej$WtK@>R!&M2Y6u<* zO9|8$ef)3-v>atc1xi5Jl19lwtg;biVyg(h1+Mil)6TTTViw$*)WF{t*G5eK%ArK| z*2?npenA6C6T=%5)jr~$A4FwntQnP4h;a?hr**2k{?`gkB|jUVx0cx3S&76k+QC&N zD_~5(BAYX!mWH*F8s=cIb8!~;MtDc8P1?E27+|}Qe0C-)4a+36^3P|IAK4Q`!{rPNmzvnQ-p=gqVQ2q|1E;S+QfmI`3!(&BWP5v{ zpsUkZvC03s?YCagyf3c<)k&0K5ltPOJ)03#?Y9fQ!G5$97v?d7pN z*Dt*Y2Vrc4hJbnWT3N0!1e_@ec(}oIky1C+B(2gJvVAA{Re|lDomd?m!-1W{{}m)| zeSK=|ZPATFq0H&?-W5I4FL*|wxt?Xk6G)|cgH$Wuwg7k`NflU7N^H!hV*JmZt&-7C z^_!E(y4Ix!n_6wv8+xsv-2eK5)2%dDu@P+%A>w5Y@B)`!VaEd?vq&Pg2iGODJk5kHSYzjSJfkg{ zXWJ7!XHc@9xN44EUoIdLYzv1QPWSlT;G$pDPCVS#{k@kD5q`mHX885VR%6f^4tTVe zFXKU5cm!?PJg(#Y2FQNh$vggldn= zfdjA7h=C8ELTUK zZE#zw@dd4!FR8aR7K5#YZL^g9a7|x9yWiWGjEoFX6vx=-`SAaSOu)Kxh$bgz9~~bb zR|_YSK-#m19nxtnlUNS?`9dVyA)Kd4a&tX(31kHhX5k_&$7PXj9`T$DZ1M$Pg}@NhMj?LZTs5fpk2kPgdQI3xF&rKzDi%%8Nkbi~>k*+~9BR`yqb zBX*;%5vT6*4wEt+@}{H`sbJ$;cbHZ>tGseSb%i+ue>tFzu|t# zO?^%xy7-WSn`*M~oE&)qUqo$Fucaw2E^hZ8ZCmyK@CwEhm_Yc6OcPq!Qyg%hDY6+b z{(O`EfrH0VdA_!aUY@4r>|;IE?>Rl{YZCI1lGtG|up+(rEe z*YxDZk(P~SeVgrEz_*~3T{yphK;W=K8{5rz!59Heubm%j|D6*1|3AU*;MM?lbs! z15^zLZKgni^5-Tfw{uZH8F4374aVe57E){M=0Ye`b7w7%;=q zRqq`VDPoe>p1!HUVBpyawn47KXvRTr;?IZI-?Z^JmlEd>=p^gh@ymX5gx#I1KAW>{q%#G>#9#dQuqxZiiS5#L z`3vLf1Fnhoat2kMva774#`x6~(vBMrCcwoazkIPSE#p=a-4(*9UPx~$PNe$0*jsN zKvN%_gFAd?eyc3p_2C$vA1h4YxazO=@;AMJ)ZBCL*m)OqSYPLH_My&atwcvxf6wEg zKr<#FpXeX4fXV&UCm*o_jQnwW^9xMjTEJY<6j%xCTD~LM&V^L@4yfYPilwo-SB`o5 z*MGYizXV9UgqMKU41>oYZdgzdTXT)&W=*>I8R^HS7wRQx!rQ=OOwbHswl9DCw||JJ zaz{qWYh>`9emnz)?;#IViUH8=$LR2^9k965S#wCJJ3e~fp8LqHXIGgmjVl5d*YLa6 z!rAkTrXJ`m&6E>>FLSg%6utT%m;Lz#aS|}?+u6DpxQ?3Av&11`GM%ZW5)~Ah z>^OZbviVK;s4&w4=eW%O{4bZU`QJAz0Gr6;P|omBQ?@{kl`AkySAzPSg?N{QbDAX1 zg%pN>%XNdYh0Y|n}(X>+i7(J!! z;})Q6vlsJ~>Ft4ZzWa^dIcfgh7855x_h+K1#YuPOJa0tAS+5xf--iaQRJT!9Mdcad z@`S|1kZMGo0YQ6tov#bqe`j>M&~V``YCrhw#A-(rA{%u(+G-bXqVINEo~a-1D^vQ% zzgK2{-D?t4fE!?y)!r72G1XgrBYnKmL*gA8w_(F9tk%#FIAVN~(p_E+1aRXV%(Yr! zrhrSa9)qXS9yhfYUc}1-rG!n7>57Hxz@ifr?+<*rI^S$_n&v%T5>TmZyb0T+J=p{ z`~^b~RRn2A+zVBQ+PzTc>4F`_EceuZk3YXY87@H#PNQipka-G?kv2&K@KD|f;XJPp z9^(jyYG*(xWqH;{)isErqsDi**~)-Si)DoV+JUgCyFLGI&FT%LU6quHcIK&{F+gS6 zPZ773&BV3UzL5~%n^V5hUcR=I_urI1i8o*hw;N+Wff0{bh-ID|WOFH>92j!4MVF8IJLQR=NT0 zYkeJZFGBz*Za)tK{(E>6cX9Gj;V_`-{Apgi*RAh^O(9FHwBzyu`Bu)r@x^Q!ya~VC zUcTrfu7mx5;woUQHZ|ZhL*%ZhS}vDaCDC7d8r&WiQsn0;cWZyC{~>>HilD9eMqdR; zzpIT)p1Fyo5JAJ(n9dakYInp@mu8ndy0O0Ah9g7F_FT}EjBKgtbp)B}1TbwgajVio34#E#N3*5g zhVfMjnw7STuf(jnZNfdBhX*Fys<6B9Q7tlJ=SP#MZLOA=xOr~niH$9hB3OpW!cp1o z+h4|{-XbP1b0|651y@@sKVqOF9qjK>9qsI8skG7%K!!N5J?$p=4JG|*%p|S=H30@+ zd4p&FUbL!gajF%1x#J$yalUT-6sU6Q)KLX$+QXLZB6^R)Jf^Y(MO!L`R2IH(#Fb!pc*IL?Lb9X|XQ-_1B ziEeq7ARcSR{sy-wm03EPQqGn`9dLDOX5+cJ8s3Cqvc<{f{RN99zQl9;%ti?Ig5QtB zEN9OHpdDB9gB_uE*k6igmJO0VZorVc6?k4{WD!kD!|uo__v$qA{}J|X&Wu5p8h?S9PHI*j)e7g0mC>s>@aK{&<)` zeWBunv9rD1pPC*;?sMJZ@+=C zWID-}!AbRdLtyr?bfU@PJ@GmMB=4(Gte(o{9T4CSI>gX|ns0755AtZ9lGSqGb5l|| zJ?ukU58}#bix<6s{-KPIRtUi0IEls9t8Z>6Kzl!|^YX*5)Yyr|TOIorx7iFkx3NAN z^CCLnz64-UzRz7(dC_^EqC(=`N;-j=r6miVJ&s)FoYJ(f}^;a-}F2%Z(C!S z$M&tS3G>X(un6~7PRC1F;b;HfFOqy%wOb(rfByY{+IosS9$GTIys|O6GF>=5yUbkG4nJa&yMXnZXf2Hu{?N1qXdqd?Ch-Z4G`{^jschzjm9@tQX_n`ULs^ zH6s5iE_}QwWxkm*p}tGLoB{;@yEEPzGuF>!1wSZKxf{o%LEF^f4P4_WepAP%wpG8S zB~gb-p%vsHV}5=A_!+jV3BZo9zwM|@3R*ufPHUv~-g`SRFcbLO!#aFE;7Jbo?O z_2oS7vu9)u(&8ejjcKIjlLLLfGV!qA*Sa2jN$zhkk1d~YuC{#gtakajXOCt|$0vRx zQ$CDA!HQIZp1h<}HAB6M8(F0>8P6bYt5PWU<%*S=*&@!brbpKY?s8K(u8~ItlN>v` z_Q*v>ZVrZ3H>_Y;OvA=rP|<{lE;XKMWNTJ~f4Zt#C84tB>RSq(OypK-zJ#YPStrZo zd_|ESKWcLWoi^DfZP$P*qrR2|23b|6XQkuIf7=-__&dUY8ZNZBFTNW-S9Ec5Y5PJ4{oQX3W$Go?ulS+>Bru9*UoM zV27w`Z-x{h?TB6@Tl2^Wjh{U*<=>{K#~7+zcF#hI_+vbTnxo?#qI&e{&DN`;lo;qI z@FRP$9W48XR$3j>bep|*7o%MzFDt3_lmJ_lr)cMiTVCF{g_qbJBWA1X`?seU)eRc8Q1)6pXmtdC!f6pE->E(NU+hw$62| zU{7*UJaTK8(l337L1`6NNZr2eEW0gkExx#BP?Zt$Qxl%&yCVbP?mr++GD#SaLg=v) zV;$vEodFE&#^NaSL=s|gdR^zMr2s`Rmh$+&EcGnFH&)mj$2|I!Lhd^ipVfx)|K5PR8 z&!;}ap>hUxGfh!RVe+I2+zA56pkUS~O2w3{W{FGdI=jMxLt86BIb@*COv8Jd(d#(S z3ybMPqfE2h=6gLws~0YRez6dF5+J#d5HW}bwscnDGWg8wQ#{Yc#K>$IWthpya4B>d zDo^os-qVZeBz0#D`_}s~gG>x?uz9o02krz5Gde#(8K3e$?xtCw*_RI)Ls06GZh|IeR~UUaWOaC+mWo9b2UR9P zTv1gM3>Ze6Q)pE{BdHgLqugqK$&KBgs-mJa%2CXFGyseu)DZbf*$dsP^;TqRtS2=Vp=9nAEVb^cefHD6;@rFpDE%cZ$`6UL2Np7G=3i#)7cUjqX0boKfcP3 z9SmF*;LZdAZym(M2FG?P8r(HzTj(wv@)3SplJi_&CWhq1QJM2$Behz;@aTV^mOp=^ zESDt~_dO1u@=4^-AVnwtYZAxdft_@#&rFi@G_6>G>5%2gecAFvymrbIUlCT~h&7jO z{QMMs2ph0NQ25q=dSHQ17Li|d=y^jJ=f>tlN^NsotkV)w+0@MD28NJvV)Ba}N{YQv zOP4ipwvW&=72dA@JYTSx^Is|n3Y<%B_gIA_e85ZI4WR|CV!|%_Ul4r;Q$+DOp_4_7z4xlPs3pzrM^~uI{7bQwf$Y#&kS8@lz6h zQP}aDfX;*ufU7KzGp+}cAsR{DWW`{p?j+-55C@}nqs8Mv1x@l)WVN@aZAM>1Pd=l{ z?1%Ewg0@FLEY>&KDvI{RrJDM=(+&{mmZ=;iO9dNPzHcCBQvB}5htsnLDCso>CK4%(b2i<+ay0ZEbwosO}K@Ji{dMz&lKyC2o8Du;x8v0 za3Y;mSeTgMcO>C;)hf^KxCYDXawFo>St&(e|0#NeudC?4JyI{hbHEFItwMh4s89Yn zPGraW)*ykG&I_7!QcJqVKPPOvV{<&xAh2vu`U)`BpyGOxpV>m42|K6pN zDIWn&GF&qx==6;!3d}UBJU}kHmwy1|weFLgjZ#bbYG|%#4Amqsn_S4j-py_iZY#$Y z24;BrC2vZnzR|VKyEk%Qz?zfrBYL)))LobF2hYKItcozWjj1fX>cVl!OFYflfBI#~ z!%qTna|9Q!Ls0{pa|ir(In@o}NUyCVn_sqA=|o?{=v0 zDH)sbn~V$IJz(DPs2`>7kDrcOkJYmao9+s^#w#HpEM9o>KR({SooN(ofLp9%)P=0f z{aZe(xU6)=tr8_VHOOy}h#N)=!&3k${T0&O(pHAed}0c}0b+ZS>X(98q6=yu zvZL{5R11Wbt3R{)TBc@%zCpjnC&zw%Z_!oYwYPJ+JQ9tr3&8*B?7gSt`|ARf&*D_c z%JD7ox?Lz%7N-)PKp>d&0vnn=6cyD_xU+l6MVl{&u6drEzSJ3Hd^1rvc0Yi=$WYT> zSQxY9SKpgdOi!1S^NGJJp#&JA=*?xju#ja`X~3wDa64`HO^uV0W*}eUZ?M=47WP7b zuv5%PWi$;M8x2*m7>v>%r8QXSJ>vV%MIH?`K00afZ)_e3bh2O%+^<0DEw55j7|o5f zPJ+Mg>c&6bQR2`w9}fu3=DalOrFDh-jn!u~Tv&^X-GqENwx)UdqoJ~DPIZ*F zy@yuV#+knY8pEWZ+s{u~d=T$Ei196mG+R?Asf}eC_d?xDY@80*YMk$sAk_{fo>F{j zGaSXKt5w19#P3D$@W$91hSs&Mi=&<5l_*{>KUDFqBNkL+yI)n3pFbmRlJ+mj&>j#O4yCGH>c5Qhc{lP3pGD{}9dfdPRJoEq=Xrp}shxJaCrz1S9zJhc-@AzNi3p~Qv{9~3n=`wq zVzxcaL#(qNUkBENe$>cN+q*E6CmK~LE>mjLG&s)i;ouAuIjms;+2n2Q#T!7;)WY-7 z=LLAcK0sn4lyf@75g%Rzs8Mq{hx#E?@#b(`!ew=Lh81F4 zlglW>n8+#T0gIpb8B&nWLOY9cKI!y#ob4~wQhk0IwVg9y4~)J)X|f@$p+f^TbW@mf z8?$IlT)L5eCAh0(KFoSCVETcXXy2B*lf}D~$o<2K9BpdwD`H-Z^Zz9-2J{FAfHa^^ zzIEy%wbhe};g|Rp+}_buMdb|T`}`c*rq$1zTEB@4 zbuoUk_Z`n*l@(X+BikkXZ}w9Iew4T0vtwal!yXuh5HggyobGO`$nGl`d)-v!pZ75x z{}`zhdHFx2>_2f}fD6U1-sL6C*(ra8RBNl;PdCJgDwfh#vX!1!OAV#Te%D{; z!>>xdQx_I9wucEiUPD?ebwZ_u5g{74ZyyI&Jd|hN5}UY8A-U13LrA;j;ndt}Ly?(` zEZDSW947#+AWNyb&o^C{tl3JdzrE&}milczz(BJX`flNl68mdk;OQbjkU{5$wit&N zgiQ`nxfLG)PgeT8<4dF1b(k!OsKNn^9x$s%&+WavIG0q3s-q#vGu!WP#{yc#&8)92 zl}!k#83A~4jRo9rI^m;W5(CJ%Qpf)(3oSGJOM{pN60NM|*13TjD~e%cJNG_;xxZ`; z5Gj6m1!Mb^A2}ca*BD-hXZ(j|6re=Od;l%5qcr^RpKz(H58ne#LdA=h%7 z#+>Ucu|0;Gi7U~4nNCZ!XdpM{7M9Sn8$y2U_$yb$%5qjZdOqb_TV=Raz0GT%6{1=X zKed;O?pF-##d+KV6r}(Q%%7TwJvY48w$^Vxr@cKR@Q=aEwSm$%ZG3Xx{iaAnS&d~H zX0NS|8VdYRZhcGm9AV^_lDb0mIyf?76~n2QQS^4SQc2n~D^du@J~h+3M%puJzD z*pl4fGmFl9Try!f{a^5Zjq&tF6Fi4pZ|5ANJ&r%skrfdKCvIE_1M zX!JtzwcMnbTsn#rIk_dYD{nBz+-E!0CtXB>+sKe8CE^n~+=)||Ca zzBpTyYhLe-sj{Tw59BizKZ~I;dl>Z_VY9;K0$Yz!)|Ac3N=#AKmYoyKbh5MsR&1-0 zf3|SvPyBv<6ubPjsBB*FtrA9LD|dBrBF|8yslM&=cmbhlAmBw!%-YzlEN@>H)Z6e- zuoN7o%^b!6iSq7mTFAcP2YR0+>m2#f~X; zXl^<6#-3OH2LSM(in{@oFXKencz`Lb~i^bLj0t{W5$ ziFeOMHX>HG;l;&h)o4(Q7SnK3bNfnPU=XX?=O)xCn3kt$i_@daNEBOJWQP=d!1`V# z*NvS|cv$Bti&6Q$-@39&)l={?{$&NAZx@-G7h)>EMjl9Eu1m#aJ;7@br-)R?u+-VA z^3$esbvZ%_s}7+9d0XppIGVAQ6ISK1)|BLO5xX7|qv_A#ToHW$PiS|Ul1Cz)nc$5e zlFe(CU{iwDXW+P?ymk3)6z?x5A|d%?o(!)Uc#IV}(=TbLZlh8$L7M?(ry1SQ>{q(A#E2C|Wk z6eUK!0_axJOd*Dq(|&%#GFb1uu2IL!K4=nJ@AOuf7z{`cOic>TDP6y9OZT1|1yq}H z{p#CDxm+TdGNld8ySp2exVQbOzu;L-EyBm(BKU^9y~E++%8m?bg+0yKzESM58@wGX-vI|4 zK{*&S@M{c`1b_wohg1R&2UxI-?R&glC!6Zz$EKGh=w9cKd_^_g{j32pM!8^(AzhWV@}Z5_MSj@pDzeDaPij52n#Lz%dv4iFDA zHjXa%%{}W{iaRJ$SuOlaW7ai+7iajagn=D5h0RnaHt5aQ0tZvC`- zd5CpT)|R`!2ZxK2geRWB)&5-%R}f_|v@q~ZXQhh=_7|Zpp(QV=g!c%MKQ?JHz3=@7 zpc(j_0&fZ0rxkf^DNgF`4|`9ReGY?zWDVx_S>T?dg;73R)nF$W`qN^+jm8Jt)YQCr zM_k$VLsO4aJFc`P@)eR93L>&O?z)_@;jyPj0C(!$I_i?VN}bKm=qVC%`W_Jw0lYmUg~%)k7{ZWp<&^1dkd z)|bwgu$>5b%?|V>a+^6f)uuG#6?Xxz{}gS{5u-{SY_5pZr%mIdR6oFn#p3)<6_s`T zCEs=vF@l^y66mZc;3#7;FN&kx-RzOl>sM2g)4^rU4+;CbfO>+ME<4$`OuKF`$Z2Dp z0~fnnQkwhq)tUK#y;1_;m9cTK-!jbM(X9S_mod9ucYEmS((9S%A?7OJ-BaYUSi7vc zzUl@C4{s?YOUJ?f>Tyl6+Cz-RT?+*ubV@+2fn#HDB|5y{lT`h9Zo41lIreemA?5A) zm{bUq!dR!(tkj2`!{+ci{Bh3aU_yv|Pc3kNo*$u|wN-)SiFxRbA|_3LvVHiq3jH+- zm9f^s3k?+c;dvk*JK|$&IZHF1pqMuh(Wt5<82YMvWN~SHeA9K2PPtos#>Vl{55pgF z5jlCz!=qvea1z3n^N&Fe?k;ZqxD2Iyo6gg<)`>pD4xZEZ$!r#@_p~W*mG29iYHM9b zw^FpMY^@8^OKrRFPM2S|Fg>lZ(zHA|Xz>CnnKw=1fUVV1wx8e4GGULz%hO{CMx3sz z%vhF|@mJxe);Lf0CG%QL&1DSUl9^&cE}t`gN}fH`ifvmWBG)$eQj1lk*eSKTZ(b1sbpSD27(0v)1mUYC}7 znhTVo*|P@Mu0L+7xXhGt1p#Z^+Ip$$wW1y)WyU`7BCU1}lXp9c>0M>8UCfLkaC=1_ zbjThh!(o7@_psvK+wT(L97HWwAJ*){DaRZ5JIIUu#I6L+HFU0iQ_*yP=qui}ip|_h zSz@Fzl!r<4qGoUP6(1=gM`{6*BaW%VLH*{m$IC74fQm%jnlF#Qm{-J~#(2~AKi?H+ z_<)K0_Zl_qoWMQA+Zmqt=}zM(VvL1@7=aV|hl}H4 zTXl}D11nkVW5vXXJAt+JP-<_D?Ff5)DveS^xkcysm@wHe%K1(|Z0_l(UC;AQ71SQz zhv@136n#2kn=%%=vtMF~W42uSOt$owUTeF{1DWL&nVX6a6K`BHsjKm)xRI8Sm>y#F zyf*!JYiFMDHwzB#-A}?Hgz{8G{&M4@+9ttTikX|1M@ttVM$5A zSEX0pN8U+9e&;mgCb$G6qzA{1iiDor4;!H~UW|KQ_uC@{3LQH3Lu=mZ`q`=Id)1$B z`pxySq==qg_wW+KuV*G#D+mRD@HsJAvwuRZ?eQjb#>Ye_A_={Edj&7gF#R2CDiL8KR$7EYmdPV zfx~R7KnU~~;=5Jc(AYg{eX`B-ZsQP|dDcaGe-0Pk=~00aypaiK9;x?q z=;*08OMW9!+jcZeWr_{OTe$N~ABtqQiE7?EHb3g!YyR*<1NTtCg`QJ>w(G3KS4yY? zR6X8iw~3F}%DIc5ZHFj7vHb6cjS>i`!~{PGJ$v@-=}G8*fbHM+P#mPg`(R1T^r9lR z(zfDYVZQN(j6~>SUc8i`&mxHkqYi_im3brb9!-1~!KmX?t2$=0M#ZO>XwOB&KjV|! zYz-Y90M}nGC8TbI@SjCCn?uuR?v`6SypO-K<=5FQCP>-!laJ(8;MqCz`?V`!LN9HSX} zy%wnc%_@FinlsgTbtcjx4mW0`KVdzFFU4+uIW>jTF6sSDt^bpl?OYvdk6UXE`Rkn- zx{Vko%=46)$5w@sv-@wm7?&f-oEc#5gRG>J;t%E7W9vi(IQqVHW@)94nXM_~rM~64 z>+>K}YlY&NWc`Ir-u)ydfd_=zpM}Y_3_{RE*srN@$cV2i?IT-vdm7n9{ZiKl%iHo} zuY|<){qI^!dCJOFLeIY09}^+A7d+}TrYP_h8(S=7EHV`e&ba2b&pe2=-Y#XF?;m~v z9~LdY7Wn3rFOyw4%d!<9&2D*{_Fj8tkTK`^8lH45|I;af%UPCT_R*93K`guN+RkTv zo>zB`f{*7&mKXZgQ|G5XzXD1vj!HszVzB6n&eUc?=Y|a)bva!-sV6pP?c3`=9^pIc z4?XHR{8*XUA*{d5&W+(`A4PAbeH<>pi-G1>qAEla;*Mz*DNEcmCqDsmxxUA7L_D>w z`PZMSfO+rHQUqLeEW)tiiHT2Z1x~nAxG#@B3k`H!Id|_Mp6{g|O9pqJpRw`&+S<1~ zHj_8%O^&Y2$W7;SAOEGaZV6rRG)rvYWW(od5aO_$B(bB1`A3|}8uO!IIJM|3zI7Lp znJCT(7Ao|xxrP0%Jo}jO&@P`^q%yN_aq?xE3}UfpCFEst`Vf13N6wc+${66!W%Kq1 zszKZ$2$lu)c$-^BV!Lwk_IprG@6(b$RDPF_$>-y>ZNn~S8?jX7p8UpZ*7pXar?1;75+W5Uq2exGhTF+TQ3BMb2@2SE}x(?(Z4r%-k%Lmh*q!98)O_@xz&jd zeyF*|+4GXu*SZ?HZ8$J`xxn*_(#TLrBtc2khvOm^BBoMfHT!8xAS0!Lf?eZBrRzLr z%4HwMb0(#m)6H-5Sm~mVS?fjS`Z*$E2S!;2HYHvYl+hLuXjl|v_hCR$rGA(P3^W|HK&6Q~}u@mY;*#zjd9;yPZ~MC?!oD z4X^YbcJGLB=0ju#-1qt+6ECioBxYx4v;C6kLB`qJwZ3q@t@hcGRoohAeOFwu=og^j z6xM{YwnyySjq2cVWaH>n^OH2Td9C>s*uRHmeKs)kM9ph^1eRl0LK2MUA0Mvrr3wXw zvFJYh>am%vQhQ`kDY^2X$4?b7)%jL#PokY>L%v|#^Nrc2hZV#ZT?)W-3mdlW|{XFn4l z{}n1j3n})x%taNvrJtOl{D|-pDDJn68BaR-YAa83(;Gu1Q&=xRYPNj;3i8T&IG7Z4 z_iKG*cfk6tcOzcT_=+*HFG}_0iP`6u>{MwdLd7dZSG7R@B9ZPFO{)ON(Ohk$WR&M; zGl5H&xh|YSEv}upa+yd#A4prJ$d! z6YpUy8pr18*RXk!TWN|2*WRCJ4tVbQ_zdX>^A22fg|PEuPcVVlwp`_NBl+}7z7jAf+!Kmqn}ELVpO=s8N7m}q z1ORtE&pQL-3x>5@vrab$l=CAtTL8=$e7aAq+dlXVQ~7FhFv8z|K)L7D<~N^4*5Fpm zA^1O3qt7G(KvUukCwRl%+Rkz4a~DRSXBG1sBk}MhyWwAav)w;eYZ~8pQIcbKvbe&3 z5fXY>7-atijhzNZwrAL1&~2-n=@p2$&)$8<#U5Z^ZpJ$i(7Kqxzx6yR|4wsyKi48< zS#B0hK7U3Iq8s9{zqiMzL4ILKh>~l&QtOOgCAxF|)jTfK-lf6Nmz( zS1VVrT|;eX7}*-u{zTg5C1MjffMJ7nM(p@Wpo=gv3B{_l-JVcF*RT>b(r*oGYyO*` zz#6KP|ATL`8m>9GqdZ(aGo69WKiO{rj1Ep_DHt9>u{ZCV*QD2N`{Z|HTQqA^n|pMY zMztNzfOU*|A??~cK>b`1f;2Z)!DojutP(d;EB^~a%K%yGJ@@4jJnD%8pt)g})2(D`23tnS8YgiUGsZsbRcjB$BVL@Sj zYS=s^Q9N3G(dQZx)Js19A>cB80_jDT-QrPxlAOjYUu~a$Bs?1==b*7C94Obv{6l&M zfGA*1`lArlnh=c6^{{&^jzhO0{MdQ8v59x0wOtNV`zIPQI~ockr8UP5Wok5SSFka;X~qvVJ@nspbT?BxM$RJ9xp_U5UTwMsE0I-op$fb& z*sM1dTkFZA1bw?Wz0-A@Xt7oLu=?-Ejqsac?S0y{ zUa!@Pl*6s2N=TV#)LSH(4t#1kyb0jX8}^i&L`>$81cesr9+zLA-rzm`LM{s#&|GsB zaGTU672@0SzeaS$&{my$RsL{Gq+7J8Y1`_W;&^{&dEOAZ8yS4b^!D2Q%y?owlBPL= zi38i`G?=HR=Id}=e1t>PQ#4QgdVDMyGjOGS%RQOVs!{ECH6LrtdB=$s9R1wT!eKDx zN2jNm3~%K5t8~^;|M_9mfnj z!5_j4P+CgD`TTLc`e^2&aHQ>?m-Vv{-_J^8c;EZo#8?(7Vo&N5;)ZVrCb0n)eOv(= zoh(E;RwWxE=7eW1>P<>zUHYy$_mx(SFR4Li*oPD8jTp_vC)ilzy|@r|Qb4p^gZ%^k z{u0e!3TNR0EraMoYQdgVII$lB9OI(ml6yhzCEm>GDXC#{UZkM2l{}L)Cuq+H$Np3% zK?QknPHgS)__3`r5#J(}(28H(pirS}eExgEwJ7sC)_d^dv*bA6gl#?5lnS$Ia$$$ zS?lCh;QbMi@}OtWduO?sKtpGokPZ_Guiu^x51G$%e8^&1>q9`Z~+ z)vd;A&O`0p;i5sj%s+>VA>QEYWrzsZ)g@wY3$&~QrmAqORlNRnBiGNj`!7%U=6K)y zjp_n!_od{=CxqSa84o)XOl>ljU`{DwMsZ_u1C;|a5e3<=BWA>|PNAQY=`=iuk?p5h@vR5RsQmdCsW!-FA8c#%zaovH}eUv{n ztB0w1c)R%PIAAnPcKuauBqKl9=%C&vvK&?VY^=>Zyriwr%@*I;Zd0lq(ra8S;#V%e zL1~WLtkaoL_E(qYJyA0M2a`P+dW>a&W65(Zd8s43ZkL2#^6~8>-rV6c2y@*Z&{XLi z8WLyp=? z3FKs3u}$N7kzCrnhPTfn^Whg3g~wJ&C=)c@P#fRpA4|~__AC7yKQp+=KT47-` z5TrCsKV5m7&EN_n2=Fa(S2=J}f3ZxU@0!py71~xepA<*P#QYhLn&7~f&%#49$%ULC zQnn3;ZAU70>&y4#qpvHvv4DcxZu5cOxLz;N#EneHQ?%%A8ik(DhhWMK!imvWB24tt zEqZ9ke|NXf(Wnhzk|{uJOa44&ec2|4Fp=|=3X-aQO!FHZvjtx~L)L=3&PBL;mpr)Gh2s!x`UH$OIjuTS4o7&>C0`R@xPlcaP%J@evko5?(1i(HEzL?2Y% zfUz!8rX=#jxG(2YkCl#7yJmlIe;t)o9Fg<#{#0Dv9=vq7Vq7bJ%%64a+AW&x5)auD zlyYD4)wgJnWor9))KII~r>}|vWj|k#Ee|c&F5S$)9?6s6!Ft6Bifnt5w$rp|;6FRT z!`P`1Lpk3Y0D`f*cH@}5A~NT=MvnYF99KW9r9t+cve<01C1tm&pR8;e-0S0GRG9?m zBt7UZaF7+RNzQmqB_m3HfQ1wL*$U7d`PN#g*(O?E$fvPJ_6l-yOu9V@1nwTNDInhD zg6{8;3GtwP?t{@YAsK|&h^HT@=AE5Jdxwldj z_|Xbxt#V@;wC*(eUk>Mn9=|i+Xi#aBBvv34(zK#gZ9Tr63B6ksgu#m z=Tt$)LlhURM(408Cp!zH&jR6>-lg+p9G^i3EY5blnZ`4`RnK~;l*4bUGTY;}nYIHd zG*>k!OEh)GfN)(&v>k{(ve&^pqVn;-Ja`RgVr=_AZx8I@h7MwB#%rQHnWAF zSc28eSBC?n(yh`NXKnF^MKo%9)=CX_y)31YNf~!yC_u8Cf@jkerC@}}cn!3ROIbzO z!bDeWx?#WjF@VP*~1)kZM-J#u3yvF?3)H)~7L{#q%K=ODx&{I(T4 zif+#<&VXi#GrHv{2dI|8W+L`E*F;zx_ASdk((P|L^-YyBw^r>UUedGoB9z}!(`&DS7ch~fUO)X zVT>Bxnp#y|EzflzN@DN|;=wDWxRLm#KgAvG6O*C$n~Y`6lJ-6E8{;X7*&fh!2;VZ z)D{6TeEvK6S^)_L+Wx zm0I!jG^iXselt2)kiM;0zh0q*G@>S5Xl3!~*HLBCaaS>Rs zpYcd`^RZ|@oPys^%>;G6SrY?mFFiLS7iUYM@ImWfy@$dInMg1M$PwJUzfQAU-wo?R zd3Ce;pYF>4d7$}ZpN_j$l~wvXKS z0z;Mdw?pxmAe?Ck0u~rc;xKg3ihPwTT+aexm`ytO-7IDw?mwr3f z!3Rot@3`J5RC9ljkQa6O(j_d4$UjeJFRX?^U@0xz6I@7;af?Y2$v7+7i1Iu^1l!%c zp+X#3ZRY4}z|EvIpr(?CUej8Uv}d;3C4o_RRKvJJ@>N`-SVCF5I$5U3psTx$EDDai zSQj7STiy+`K);M3{}-hf&(c7I)a(q_iUQH@@>oRW2%?Mj>o`Lp`}9Wh+KqZCcDP~c zvoWfSeA26^*QL7|q%U?pIgcRUOswws&pUV><A>UxQMiFs^Q;sBIyz;-AYMji{)6Eq67Xl0W1sgN9oKjv8aI3!FPCuht zNPSwRnk-fKx92yFYP)mey`sOHj;5s?`>jEY>5?Cz2D|Sr1i<~~QTmwR0C#X+VJ4D2 z4UhY@m%xBWr`Bv5HrAZR z03!3>MXBsOdc&n=k3-|O=P0i&r>b5Kd;3^f44;7LvH4GiP^KA>)by8*D!N{7zdKPZ zFd^2N6UPbF=GxeRh_ zB)@wFZfgxPBv0wEX*=|_T7v)w`ggFde`80$A$D?ddmpn@Kl(|r?VZ($Em$zEKn^!v zS@JZGQnW(K;34F-D03c#*!Va+lS1=Pbb)T^J8rpYla}G*TCWh0MDMsGvsrhHcukds9KG14X_MQ_U zarKi>8aCLjnTUsD9~$@rZOB}2l0$JjSx_YgBvmQNpyQphT0>437xkmw#6C7ndBgMN z@l5)H8;X-}hOF{#1=!44PdEe2q=D``MC%XxBjpY@y$4j5-AV9M4sFhWp6zpCLaTHS zf8Gji(sNT{6_e;~yWMJb=^73cJ3NHi$Qny7yg9`Q4(xHJ&q2aoBC67={r=moyVV(a z-bYBw&Edw!1$9(J+XQqn+|%m=(8+ptRN%N{`Pp6HASP&ZR>l`UF z{MwhOG1|1cy;^>KzU-g6vm8wj+#2gKxZ?U$62oUw@Cw3hO=&)YoDd3$&iblof#E`> z_H@}yyz8GBqVKNDbolPYZE*F#Y)0cNEXv==13gSYVv+LZZ^J8__ZEQcs>zVM#=Q!33fln`KA?k^M@jhCiN78$GJ zaNq6xGr35XSm$(9ylb#9efk3y$A&THC7EV7K%#+z4WF>V66KJ4un1GN3lzQli&}QL zIhDybWGBgr^x!woF#awtJcE7pSvVG$p>4A`aLZU|F^Cly4DxHAw-FC_6d%5EG!jrt zx-8x`A-Q6P`&{5~&s$!at7pZH1jEGshfkr^4;-buh0uqjXA{L;^5EO`6&Ua7P4U-`YW9!f1~ z3GQCw`JjAY^=oWZ`hB_C4Bgz^015k4XC7AQ<_-8H*a=P=`Zn3dP|rNwk2Ren$PE%U z^DddS-~Ua8+2Qi}79a7bRHh%za@uz0}?d$`!`oMw2KkP*@bdEC$p zK3;!Su*HFDVaJOwEsneanmZc3caZ)DxXIE6^OuJ%wb$#lih?oN(S+_pZ=6nu{q8+C zBuvK5X=5W7Qp3aTFCA&and9K)dL{$G+`D+87s&u;P7%U6XWWWg@w5wL5zlpwa`HSMaj%y znqwV?e9tHqY;KlD8~2!>=J}{b&-?uvJym@bff>-gP>pvE?^4-H7KJjOSk;QPdS-en zchQKi;i8oq-LGw3mSziY$bfQh)6SHsmmBKbZa{{#TQllau?zQ;4Za|EZRwjpYZDP{ zr0P$>FIkCOAJVQ5h96H&){375*IXwx}c1_5#<~ zvw(R)A-l~Cd4BcTC1#R?oWik>n86Tz>)y&;Mu)2?cfroeKRk8?A6no0)g;nwC;7uM zl*4uH)vJ9jm(JsR*dz6ynN++d{!>>A1i141;C1gx~N<3F(#6aTleXHF_sh)xF)eTVv+F7o@ zF+d@nUDQqUV-H3Cxo51*&J)|597={?s*F0>Rt#pENp}5yq2;c-bBCd>Fq4(H=-**F zT@C9_y5uk{w*B6vwV#uy=g#kFR@a}LoyGGI5xRUwl>KkDIY1^9>3}~KJc*w=iJ&9o zFFd~Hu;^9ae-u<_JtwJ#m_0MK=tau=$V4-P_slC8N`bW2<|90{EbPW{^WznA;?MR} z@uulzq4H)KF54s%o&+_ga1oVAA}08woB@4T)tMpwk1D%pyl{dYy8=LGSdvR1u)$(O z0q1pE#GNS)0ZHvRI=09j>J9t}HSeJ;C>|v>zd#Q~-%r^#g4)1l7-BiC24&c*sY~_C8 z75??Bw)xnJ2dw-&%+gFkZIVa7jajR*_5x)wx3sj>gK5730MXa=izI|Ae`2#o;L7## zbfFNrY)HGEHzaymtTL*jETrHq8_X5FLx3<6htUJGi3dhP=>FaY|xDFRhFMt>2zI=)5tyr;WN&v zYJ6X(YP=PbmP&@x>~jtn>MjW`WV9WlKmIM3m;irz_04GBCQD-R2D{-}l}T$DWI{y- zoye{Dd+uiS3qL_tcX4SP&tkDe5W@jP(z z%1xY_V1-j5*i4;3iO%J}cfi_fQ?rE*vY~2sTb9SqaGwZ#XC-{Y0MenN){#9Yewvkc zo?goTNQ%gi4AX4;;~lpwoQe1JZa!%7YxhOqaBe_DekkkDk`j-jyvki)>t%Whq%&e= zx|ZA21vX7@xT1@1e(;|w1)&VSQrQPNhUX?0xf^1FBcg>bL~;ViTfl5-EwH60KgMSq z7yaqXdG?8Gt+Mc<$?uztt(3a8+i$j)ZG|L1x<4PF+g5BMeEuzWNc3p7&I%2o)2=`1 ziZTKpt5tH4tkZzF+AziTd+bnKPG4uxTsx-6UJe`kyjLHZqsDs_zxfuo0)eS5+)Ecc z{LiP5PMNdBb(A(;ao~@5?F4m;wBF+$;D)y|W9Gn1nhRXR<$ONd2reT^eL2>J21>nz zRW)DaQHg^fnT~I{*!j8aV3DV`)1_{S z36GWT1pCLJ3JR$51Fh6ZXQo{isl!PMXlVG7s{0dv$UEYPx4q;`GI%yI9_kvMVjciy z^>$u*rJVL0-?!J&aY|xRJzLcvJ_H&Lpj83cz<#69iq$pl#e!#hZ|#lM=dFfB z-AD32|AL`V&QLmHz?4s{$x7X|N>P&e-vkTpXx}4&> zT^4PK3BtmX13iRPsxf~^TF*9*Y~9Ci&hdXGTI0>wX3Q=-yu~WjZrv5c;7-5S`jK1C zoP5LH917ZV6yK^VO4VD9-R z(eN+6ZMPYT?RScNN4QC8>Fny~^TU4Sd$YWo1&+c}=#c^FpFu0e-#S7&L+{+gOu)+j zQNqk2+P`!M2*+aCX?jtIW1i*ce-4arv`gICoLWqj2(0~D&pVKOedh}##$VCm^%8!f zq9{+7Cf&i4Fo7MvlgfN$qdkrFs`}32_OA;wyqZTJgKz+sdV1TX-htbqc_|P8DPNXFYRfYSpFxx=-%x%wIO8B2n6rLan4%P9 zD|aZp_G#H)iAl@mK>aTQnCZ@kw2=VzCiuQ_q}Og zPT!_* z7EK{tFAAQIJw87BX#W>rD|#(X;wp;n{+({OY!0*aYohrUD3+BZ`;rRI;4sRJqR2>93&Lcu*4$3PK9(k6VW< zmLGkH657(PuqJF)>9Ko+dXGJX_TH@v|u{z|9B9yy@*gU+dGZ++N_#B(*9!{Tr{ zT9`m8?sS@ZVa0Cjiuf5%LjSxd<8S`i5EledI-|9COlQZxx&sbO;9d;6b)P>-t5dkV z-d|>L12ky{%YjkoawVvOD1!1RERrJj@j!xV+o|B9lnB_xL*R?q$iA=Co*TYi;JI6| z@#xt0!Eu)=%E-gLoaWIJbIEZ1MpjAY+>ximC{RM3@PnLw#Y-F?+CkRhilaAM3gLuB zj*+<5#ww;cUqdqE5m|wC+;ETitv%=+U@WFejH-^GN6e&Ou#x5$=Lyjt&%nziCL@VQ0)r&dzleOjrRB zP={A|U*9%fuTTy!4}fBMd|M!Q>?)!OJWu{l=vBe0;=Z2tesj+q8q|1X;dQ+;6rkCGQ>E5C}Rejz2#a`FP|_uv1Vw&%dOG;vfUm&8iiyD0Jxa%8u$II1sp%V&CRjWgQLfpGG&@|AL=?C z9yXXT9!!2{x8Lf-8wR9Mq((Zhv(3_Ts=@P3+M?XQ8Uiinln?j)q843+vL6+(FEuFC zf1`1PDA}&Ae$ToWDbP9Va4>Zwc%!xNB_e1;ygCt&aqRx8Rw`X8JVS*2aXJyGw%UGA zPt42s@7Xb+ypdYPj4M`q^WGA|_wIXn#*vLWy!qXC(1utLjibcVg`p_6MnWv1LX8M*uBEF?bpBxE<}`rrPf!s4=3)7islRRi zr+fc^Ax7oMsskW_%YCdmK|BQVa3Rj8^~H{t+3I^sd~44igZ`wG8H2kMO!ZM@gT>e? zF0#xEvkaE3=&Hoy)<#bysyH4zpwS3f2QnaILeW4{p;I4`9a`?;kcSRkQ zG?}hG)}-5uU8+`UJvsTHF!8M^ZjfZ?efvF|pJzGr$v?E;%l-8ktgSqDqpi<@igdBwQ}aLj{6cmWH&!CRE2TIm zH4Op*D;rSaEo^tdhgF{h@ogMJ=HdT48qoM5sk2U=>Va{wttBk*`GU0J zUv9JwE6>~aAO;u+Vg($-j>G4#c7HVp`mU7igYC@i!v`MZe_P= z>zb*0@iIrZo?Bg{Bs4;VKyKkm)4gY ze_f`vE9Gb1nxRe>Yr0hG#!l)%H=90_&=vmiiG4R<<0}UBm1pmJYg) zzUO$Ak5Qe59PlfXHjI>891?K_pTqQr^#wzFY z%|0WD@!Hj^2WqCSsx$7Rw$iW>kwK{`h*Lr2c+AO0~ zitdeCBK)~jwTxbn*MVYpqSQ{4c^yRgJ*7LB5A=$ETpauXokt3*HrNh6xC`nu26hsGQ4to%p2U&WNJ@DF=u2$0#)G#dWyoQlaOmkJf{pQUSJ!XlWgdL|CYOXGZ2_{*9i+ zjWu3-I3LT;m<4BYbgUeA3~5nrtg1_o;#P(4hE#PYJ+$kIf#QI+}qbd20~9V+ioxq9;6_sxR8)Aw{evh9{dn{ z6sOfe;`Aju&I%*#$G$IB+fy8a#Hh{eqG~ZXYKJRETep=nXrb!Bb^*U3v+f~L`dGFs zNc5W1EdWf{({K7r9~;Fb1J^f}j-52DS-4qn?MdwZqZY35Q$XeigVL84hC;dM3^ranN+-O%&;OxU3{w%|7A#Ol4#dU(#yVcK2Ty^&n6 ziFQ3`oW1;j)YCXUmfiChn*iyoV!$t;q3vMu!tqxUQp{12PzWOQwDIiRDqza4PhJpf zmWvH%X?n73Zq?!!Xr8ee!$KjfXxL^mf1|3kv)?s^5EN7}Kt1@)nBkJ2a-lA9%OlbS z4Lx#Z5B_(q6No=O4rfFOIZyP@t+v?sBs~&rFUmX%z2^B4s!n0GATX#mKdLj$ozqJ6 z>Ox!W@(e-74bk5pQW|aVMO+q#E!R*?$C_`_V8GgdtY5uo=ZYce9cd4P4s63JD1sc_ zD8EgK5#@fo`aa)Mi%+teCi$_ngflfF1bD6&E&^|+hkM#ojFj~@cJAMBqvks#xa1nC zm@dyC5v_Z2@KLoo=VHnIW=p~G?56PnGz4Cows3C!@~xu_507JOi*hiMzC5^pcllgm z;0(}#8)P8V5E(E=PfVtw6E5N6%Zbi`KS!O0h6@MiCb5#wi0XVf(CMsuygg2hOLO^S z%pepqtVrRq^AaFsW;a(U42k<`#kS!O=!!X0@jm4c;Vz2fv|hKQa1|7*(2uP%X@%6k zsSXi5Wma?l*~)2-zqL_$V%5scS*RAIUf4OeaCJC0n&kP>?u$uV&}i# z7bF_(4l4A1)_Un}9H!K|Qk)jbiEXioVOC0(ZBeH)buHyU#@h2@KI&(ito!LYnyUJz zi7YRj-X4shv84xCC}@6EH~`qis8uQCZ9Sh?uXmQ8t#rV%!oCsm{IxPpZ>ugcf^{G2!Lpk ztp^oc@$nJ>FkiB0qVY|Gzjb3PzmbW_dyYFM4|lk2@mtOYFXPUooZQS$K0ChLxynt+ zS1**GJIMxvKtE3c?xd*K*ehiVuBi_{QujAOf}T>I#1*y)n)Apk`t!CNO#AP}mRc3@ zL9DWqwv#H)?E_g~!70 z6fWB!27$&^w&8d}2K{~%x>ST{USJ5!oMwxP#!_-zz*|i;y$ks_;-380jQoD{lGK;z&tiOc0WI=&~ixmq0&=#g|>Jh!w9-U3Nv>=s+O&5z2U5kzba+o9vDG0EBqvJo+s z*M<}t^PqL9gMD?lT|j;DxPCWJfd-{Pt#vKw@pmtTbbEtT@eWAW_uc_mzh6Fpcp?ZA zO;@m@e}cL=G2B+`~rc z1}4u#`K6KXrlDD#wybOchK79ho9|DXC%#F?q!%T3FDJ+(gN8DW!|RYD$Kzudnk!Er zOkdNI#oS$H2$X;7`K-JTRO<3&7YnoR6?rzXQ_NwR(T2jdg0yvTL)R_+e345aMmCb@ zb6eAUVUECJl`>3%zU67zifxiNDAV0{#XsNs^)Q=VK`_R$qf9&iAdRI~O$wC-2eYum z-On5F(8rGop4n9gyP|~Xhm*L{q&uDWuu?cGHD*2ml66|@f5!!3KfhFl?*LjbvPk4f zCCQ2=FHEVlJRi_xL~Wr*hS=2<^r2f5ctJU4$2A+CCD;-*p;eR-b0?Ocv zjSNr1T68U`f~Mx5+gcpv-^J|ev%^yot23QiN^`#oG0{t&9Wf9qtzfUGOr&l1&p9tJ z`70jjddN3W3?2AGzQ)wMHAAL1<2ostk2Qz(5@{&SL$yr_33=S-YcyVrc2wZ4xpOR- z?@zW)y=r2gQ&dg(6{0P(V!xiJzw8AFNm4Rb$@?Vt&e1FAV%}|mATY4{=|=(kxv>Bg z-TdBodMf)ORtRW21sH&o4zUSAvy`FP#rfQRJVO!t&2?+`hKl3!pcCaf%jA!q+*S*6 zkS_TGUWbj&2+n&h4AXPxzY0J+4>k?cyIWE>-wrpMUJuYk0XO{1=Kc^qq>>k(D21kW01WRSL~5S&GCA zm9ywQ1mcE>hV2Nf%8LYN*@9S_?H%7>x-R>*34XI90<8kJ?f;i!{<(2JHCWx+fPS)O zzot9b85TN1=@I!ve<^9CjS>-h*i=h^qLjj6Eq%N_S>Wbmu9QAoTc{Bm=m=Q&uaemg z5FVVl8t__-Ux>bD-{^7u*)EmYNfJ8c*4|*Eh*#NZSe7!e(p7Q?SBJ#za;A7Y-Tin| zv^id#E&szLacx1TtXJ*>8e!2R;d2f}?U-O&xriH3R_c*6elg�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 pvpD}z3MiY_d~9yyv~$#)PLhi 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%0A9NHM{3 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 literal 0 HcmV?d00001 diff --git a/modules/ROOT/images/comment-edited-comment.png b/modules/ROOT/images/comment-edited-comment.png new file mode 100644 index 0000000000000000000000000000000000000000..a64709d2ade806686569d53e936bc9c47054bc6e GIT binary patch literal 52451 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≀nx*-QqAo%CjODjOc4_~5mhz! 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 Cs}4Z` literal 0 HcmV?d00001 diff --git a/modules/ROOT/images/comment-reply-add-comment-pre-submit.png b/modules/ROOT/images/comment-reply-add-comment-pre-submit.png new file mode 100644 index 0000000000000000000000000000000000000000..97c238c71947707fdd163bf9af1bfae43046b473 GIT binary patch literal 92821 zcmZ^L1AJY}_HfvsvE4LDW7|m^+jir|wr!`eZQE#U+qRv2r|-RcZ@=6APtN(BIkWeg zS!>Pm%ubNBq!27L7BmnL5UhwWzbp_C7@!UE3i%GuL*#Ia2?PXPY|O_eEyBl#FKumM zU~H-n1SA|3_Z>o7?f}j6&1H)3i&&s%?6`{saE|Xd2x)7us4$2x(ieQsz|>w;_4nii z$})w}Wuj5N{-kvRm0vX?1wN~wzt76Lq^9*zrWY<*-#t%hpE6{M zFQ*o%hjN$FrpLza6WNBW2U0rKNcwjaG`67y??8d-ltiRM9`x?$$KGfJ<2TpLh(2`< zi-XlE`nM`AV6`S@3bJ9PCWle=H`k9g)P@GJH7s~*Qzq2J>R2>`myxqbx$i`_9tyc- zJq+v%Y|YRvKaZBeMyKh}_t6-|1HaGlk>~IAgae5rkpil^Z&Z=P*2xWt4*?GnQL!bq z?!LFJi!?D8t*@)81J^!m8+C;{GoHFb$kIr@Ds=$r$kn#Cu5ugQ^8oXVnE*mK8-0M` z2F1?@?TB+z4`Oxs!Q%Fv))R6Y2(>Hz&#Cl$bc1+mvLakP{Xi@ zjvKz4#V}qxo;<#@k7diygzN^f5`ib+(HBYg4Ffq8**`3(i|DI0tzUwyIBFi04U`Q$ zL*PST?^k1G&=SyDbnGyRA7vfpU8lXwU&nM^DnRGyaNzR289E!+L9B4p(aI3&u^mtx z;2f}70-t=pcbaULUaa0@v>>#@X$6;er}wV?Xz!6i*oJZjBl&{wC8R7l|AkfDh;W$* z28lQjnjbXlJzZ#mxVji6Au|FEVmiXwP=CMC5bGe=5TxF0f9wFx_eO##nybVdVS3_9 z;YuPXV}`;c+qCP*>ojrVqnMQex^2o!18b@Wf(Oip7)pUz^?0hG7!4}5k4uy;YPVrH zpCzTj$?D~)rOM<_bCx9<5uLnS+Bn712-`*5zP#2vgFeuK2YbhT$@r4gMeN7!R}9S; z%qrj}KqHX$)ob%(Z%8mG3W`8LSC%E&5m^A)cTyjD${EkWJYu`?3+w(Pcoc1(8Yhr36!N8FQy`*hdQ*Y*c? z2VqCp`$C5n;}#Pi=%typv9~d&u{r68u$wRqFch&?nYys(LS;j5u~z8)!%jkDLMcKm zk~)ZQi9upoiMjGHohjdKq`8KN<#D3?lBOV&~h@U+`TTY8_v{K^DEdznM1L(byu z;|t>hs6MEXsXnNbR)4E@HZ(IGsV%E$GvTYds8cbU`gS!t+Y@imJXSXs{hP6ezLtx2o%X&O_EbbI*&$**^OkyZ(OYz`#S)(s?Pjlxr+PFvD08hW|qT(9C zh0!UrIz^d6WsgfHjXO;sZACL!b3=1SbF8Jd6}k1ORmknwRq;OMuJ``&$^6Q#L($M? zq4rpY2ckXBJ@u97P5RCHZ4dYd@TO;--}#qzza?~Tm7IFvhJsHBU{#>?5Ztizkb{tq zpD?g-P}C8h33|whcycIWk(wxLsIPSsgy!Qb`ZoMGqR+!28w2M97XvSZ$NHoD+ekwS z;$-Hs6|%u6O6eLB0uzc7Dtk3U9H{X^YeT3)TibiIMNXrO#T35hQFB#`n`0U-46ur; z>#1ujD@o$#M>C*}g|8v=4C-4sSZQ4?J8?L6yP~^8z3F?4eG%!B&Jx?a?b#rz&za0Y z1QwH~c1%7_ZsBp_{6w3}u20WIUrPs@j`rPNwSZI{(LT>4XD{zAP@LZ{s|_YUG!--Z ztA~{Wacm<|HB(41j35h5@-n5-Lwe>_c{+j<`!A)YlX>Dpg6$OziHA;57R9km5b5 z$x3On%h751j>yg(IVU;RUBSshgP|*p#o3A5=@Zs%@fpqP+m7ct@7d>cpOLu7xZHq> zfGYS_RvfE_Bgidbv$$^xRx|bAbnLVwge441`OM5xRafGj8#HBkTp4foOLf!wRI!J# z;Fu?|LLz*&qPNQ3!=D~rq27>jNia#UB@a>;r}&M@zxgM9XNjmIs=clitiMgU%ZgyCAX5MySS$z|~Ra%z@&ShxP zywYabcQv}xeB3;DM%6TD!}IKZ<}(lB*4na~8Bhqn#y#lHc;PsLJRFmie<>xFUdUDa zJhET^gZrtC;U(>bB`tv4gR=wI@x^8LObg<@W~5eZ+qA0+haT57_c532(affjPq{!j zi6Hcw^u6vFb~j7@tL@v>52NY*b+wD70f*$(;+FDP?Was#N~7b2zM2T+ErE1-?ip7D z*V9L&hn*e%QKjX%Dht82#kMC85BfxAHnPn?wyA6&Xc^Xzz@82>K#@@kUe@muKcI~b zPfdZ0JcEiO-%D{a*hqzN0l@|)VudL00keh|ykY_AMeP+vkq+Z_Ff+@hrn=?tU6XYZ zcu+!c=I?LZelqFc(KGOW6I*+$(IzjZy3c<>C&heM$XqZk1c+Ya^_4{oBqV^y0c}Vi za9|`LP(TY9@CO8p1qA+|HV}{~F!tYVSzyxt-2(yy6krSl_P={n0pCAgk$?{X`hVY` z(f&XXfL};}k8cLZUw4B+XMq0I26+Ws1Ntn-Cn5s)meaM?*EhE@vasFu3^f3BKv@c_ z*Z={cefs$U7Lg@72ZY}9#`4Ox$`a!2x)x^CI(img^{E}rEPsvz#OcTmXqxHU>fk$? znVQ?MJ8}{H=MHv2`)4-|0sen(u{Gf$P?nI!=d-ZZ$7iOdrKTm|hQ`Oo=d{){V3*|= z{2w^r7Z-t%t*s?H4UL0?1GNJKwS~1I4ILXB8x1Wz4Lv;-;0`JqCv#gJM=En0!v7BP z*Esz8HoDfvmbS(g=J-Fy)%j{+XUj!E@N=TSU;o8Z-_iJ=napkeM;3rUnx9u_=%{IF z{sd-gZ18`8{k-yDu>a8Y-|0Ai4#qBR?5J<5%x`Q4U^M_WZaP{9M$Z4t^V_9=F#Rv6 zf{ng4pM@C!(w6(5#rhxcuNVIf_@6md{+W}7nfcc#f4TAt0fDbx9QRAlj-weO@{qKHG znxAX`i!A(C(Eig4kTh;+PMW`^mK$0t=*kNSh!;qN|FgU!@Np`HD{Aj;pAsTX}iY3_z}kazhr3Um%Yt6O50G8g#w-@gst$u<&Ji z^?IAz`zL+_Zj>;?ll>hS&~pmO zD&0wiB|pO)E=%MWgw%_XL5H}_oT4<5&0nZH(JsF&GgSsM_!$U{_qVqxQ~{$Kg-U7y zbzw24U{o}3T5OFLuP#u(lq2JIRAv>6Q4<})bSxq8AMnOshX*-jvQ&UY+=;cm_Jklp zE!K>Hsw~t5F25vdMEEZUWl&tryQ9DFlh)P5VNF zH#h-GCMI*;efixW`cQWNkbnjEpCp*7(CHShMuR3< z8^k~`JyK)s8Grv9Up(1>ui!^N8}iep=g1?8lrT|TDG)HvfRxV<(jqu!_XhsHd|&)L zH9x?bcYnqZ5KRV-#RV?P1`i(L4FVg+Iz<1d{m$R(56pJ~5o9;f#)7{L1zr?tW8ic8 zq`>UcQnHN0XXB-lw;cU?AgZjD7|QDc`4RLFA_EfXshWSYVw7QYddt9sz|=okvo$Z| zrNif+m~^WErPL+Lg_(DTA4iM`42%HuueTQg2||H$nJ(XF9pqS8FuxU=N6>%W0{H3G zg^z#K>SaI+$;#&iQzVVnTZFtODXLr>O8@(ayad{nz^hsP77UR$>%4RrV7{5W{+ld= zSs%mFEYi*mzZ<>(jS74WC?i|J6R;Wq@@g+Dd9?+7(Nb*m+=+~SSnzKM)R^CT;(B8U zL`4aGzOZyz zno5X+#9Ar%qzP6Ta|?ABqm8}t*pYsh-A+N?39njEmVsI5g*;z+vX}I^BuB@kvNwD5 zeZfc`#t~ET2t3l6xIpzWLOyECYm{b^o?9rPtl-G3VjB(O(rG1v;1U`BqH;z8F(U?X zHF~PZrB3AEc~=9qkHQxkR*9lHB7*AaJ5yvyDX5c8t-FmS)Gq?Wow zmQ^91uwXKVXtF(iBeNYc(0{N;0>bzdb!__a2WGmomd(u>+F{_}=A@STME&(h7}SL5 zLg`7LWsJo*2fMS7NK5o^p+gEKbtX{BDCxt6O@S|Nw*!SB`v0vUKkwxiC;&$f3bEoo3C7>t}~wL+TxjGw#$Y7PTruE*uCn<$gv50WqF?fT@2a)m*= z=WmFUlMp-h=>ym|uk(go6g&rTzc^ueLqfPe(eMSI@zBd6ZpbZ96EnH?5_AUdA{h1b5&4ahONLw1QVWu0Fti8Mn5>+MXC{Xs#L5!N-{ zE#xao-!_^Bqdd_xBv_VPI?hjTqWNSop`iq3cBDpixT1Sm9*~BDiO6sEG=qF=Q|I^7 zMA6L41;Il6P04`~Amu?844GwS2R#B_M zym?jEiO|e7y%2KDV>QRON9q^!t_Yk&Q8{78fZ`1NgGIxahB^;0pVe2%AAx0yE*oN} zIqD@Ys!m=Ehji;@PcK1vTo5fV1L-LE z-&l)K0XAQrmNT`B`M#@a%I`zl+fEpZ(ge$FUMd!F%HRUwWpZZ6G)NYfj# zlQ%J;SK6B7n9XbeV3!#A)t7S{L89D{))hhDSCE4IrV5bIAd{mYnOlP&$<3fD;Yz@m z(Hx6LvgU^aGp1wprpYX}-04uZCA%z%2ODx^eHIRns?@g=T}j|4Pu^Lo7g+Lx{ieeB z4Nw(hAhUKm9qbi~+01lkkl?BmB=s5YNz)1;^F40NC>Z;%cpAG{P@Gj)B}5NX+ZbxH z1XEXMN!t_%h`&2HUi?_d0y~XaFBSCBxp1dEV(4~+$w5pxtE^(|Iikx2>Byyu5!&3Z zrQ+t~JW^;uob{rZCXVVh_n)MV@IiiG6>_k7E#RXT>quLjOpHB~0rjsnJ{^3*=3j26 z>$1o#QEp-~J6dR7CP3n2{Y&UAw)1Sn2xv^DvED~Ce+eS|eLx_POn%o2~`m7s-+GoOILan3{2qZt-;jLz1ZpMSkbH3Kw+uDb~rk6U^ti=T11H77laJt zc%D{#zYXWUiGMaISL*1C(5%s9k}nbU0H(oEZx;B>oztf|kscC0FEfaD*|)UR!t{;a zh?oy)c-^A2m1cOqQ49z;5r)C0n=INSDQ)$_xXrSzP4u3HI!*Yz0=mkv$c{9mfQbXRqzz-!?8H1z#0{?vd7J z6uoiH5h*Z;#vaM6D47}*?;_ZW{lD?CD3dIad-m%pkxdVKfhz!i1{$E?`&>3@!5O`* zZk8yN7MnRZf($>@n81^Jp76~2_0NRKHzqTWyB+M`kYr_*5>+f_7M`%BR@J1P)H?H0KXe zyaG0P&zSw4ByTV_tEeU+Q%Dh597V$Ww;r4gAWB{`263H5l+w z|Lpj|CA5!*15)LAUZQ^hMF0WQTT$k;$+mtsCV|V6R@~}q#bs9pfPK7h78mAHwNsa$ zCYs6S!}-nr0D%Q#0;gXa^N`L{!-6YvC4Daxv)*!II|NC1AG}Z;aqv6G9g(ET21Vtc zyfg-GODL^NL`w%Rv29FArJu0-%hRwKjt2=DX!xG`Q@#7I5at}b8UMsDR$vhp#e@Ff zvSZAFPnp|$K6L%E(51F6D*ct2yk+Y%Q?{|zUeDJ>cJjZQVIVIA0{o-?OF0&%7}M0) zxdGvFlOl@4cZtdJZ;2Eo15ro)Qg$wZPvZC#908NmdNS6k#JD0O8Qo;)2hyVNaM|KM zlZ@&~4=#w=GINE{Q|pVl2?+Vi9Uvj1Xt76=#|PyV?PM1^yD}<-L}V82WRZQO4&MAq zNJ_vtyjPj|n-Ky6#s(>&sDAv!BS0ji*N>GLT{`q#b%dtopr>KpFVoY7{(Td@hO9>g zFZC?vj;{)OKg*{MH6htigUN70bfcFtM%DOOa!fFB3JetW;bG!eoomOS>5B z={!vwrUEPqnD;U$#O;L!ago2f&h=2w@iS}R@Z37Yil!2UW?QzVoWUmT@q9o%HI$Ig zYXwoBLfd7-HKD^y zz5?e>17}*&G^t4LSAuO*&finT7UGVkszr7DXlu0k!f+c^^paqezWT@Yqkid(qp{D? z0XeWqI1*pt8HQuuU!Z`^vvzR2%cJ6v6oD86he2kR@Ba}@9F%LM{9SZ1925f<#2|aI<> zTs1Ku!Y3xF3W0gpn6)`yX7G$tG?L?y1$_pm8&pNaOcXk#ph3a@wSZn<2s)aq60QRR z`=ve=4N70~_l$Kq@Bv52q1uYbY$kSZT9-Y`GkF!@cf5kk&vi6d+(peyMDY6e`oq3% zP*IJos*7EkAs{QTqML!yqld!&TgQ$eE6PeZ95adu#I_AgsPq)(`f2e9$m|AGy6Fsai%|BS& zdxLZ$^m3k<$M3S)ZT!;!h_q92JFa~h>Pph8)bqIDO-|&khXkweT65BopWunLat!m& zGI52d!4~>oSeEIuPV?R==o&9avd1PMY_uMwQ-bF2y~uo2A>MU{Kuu zXcPpsqc)c3aJ;Ijve_?2?KA3E6X{(P#xKXm7EJ(W&|!xB-CRC=2V<C=_$rWi=Vd z%$9hK4a1cht=rpmRjb)!18kb0mZQ%QR87fkYcQ(@|-Fgt6 zeb#Iq3)=hU8@E;@s{Bg&t9Vpf3Q4{`nmqdFHR|e(74Ttb;C~ARZ-zFc^1-9~jZ8+J zNWs>k@xZ6Yd`0qDS=a2&WSiS5?=Wfi)G`XK{04U=EUwvhVsk-DXjtoiQS*`C)6U># zCeT`yL%^<#y)4f9`(<%vN3{uF-qgC_tZ}jcO`lf(SxQS-MM%esYK4yeNH}8>dlllR z9)U&+{0@_pcFQPg19fYz!Tx^BU<%ZurZf$3i$2{s>hIslG5IEBet4{~9@M)o$VxU< z#toox(@N&2*2ji~1!W<9%A(Rgh8{~3%hytTm3V?n$>8gg-9Mi|S@bw3!sUt*h1%IF zkQ@<}Zx!WKK;~g8CXucm9Vrx77il(lQFT9k78vYjbbretAS|#gMAE$Z?)-?8_+q9> z&z$r%YvqmlignIxQDkWDnePccHAmNbs}eb%>_I-Mr}~R4jzXETLOzn+-6_$ zg$>VeF8&vBTcWs7Cj0qAv35kn=ey5P(C@3Q9pn)hz9j$6IdGwlu%36>vTSst9v3wq zyL(`!(=j2YJZFXHavby>B8cTzEVHGZ*7D#*CUTKrnH}hz0{tuY>0*=j>9G=8eY(Au zr#%^|5pm%S~4ZBPn+r z63Mk);ysLSyKN`N(r@9m5Bjy@`p+ukCi_D*cO6#U#0v?P)}vzn`ihAqJ$E?tqw;$9 z9n{yue4r9TH{e3y`I9bk=#wQ6#Ww{P@ZO!mZMM@)zifE3ympG5xN1v=G%g2ae zk&SOjBCzWYBHW81`9yX^cM24$*{55Fc5DTz7f}$+U7E%%Is5-MoTRQGiOqc!sd@5g zM7M~6Z}%LY_k52y86JZ>>SEMWePNR+`MxdOv9|6#_sClAY+p5z<{S1X!(R0QzSqh~ zNO{6i$DDrSEj^5#MF%%yr=VEMudI$Hp>STKQs*0M*QXX}57#-$Uo?yn8>F6wXK8U_0>Agu~;Ml!kHlsdTkL!~Dn1)sj}CaHN`&!p zET0|<_RYM6@#>8KGcK9*9jdSucl0rWm{WZIkvsAJZdB{FTEhXvv`8>b#B?x9v;$~EbnUf;Q__g zI{m=lH#yb1M7A+jiDIv2YKisQK_n`|r8cjT&GWZ^_du{LW;oipF%HnZ9FbnHKo%Gt z`b>TU%GssWoc{Vv$}@ugKADYxDBWU6M?EN&Y#nGLiwg-f+ z*27@BgmVqkX{p7*9%?ezB_GpPGF!3HYjhYmJ(pqvPjY1q?;_l_;Dd12zF{8H+3Y_l z7Nj+ZUydAlStfq}T+g@r;}{?gs1nGB`cM@H8!#7;h}L_aO@`}Ey!mx2f`?G0srkmc z0$cl~;=y-u_ZZz4IXb$)1-0{3j$T-}X zC`CP6Ejy^eV_9mb^})Sgdp&dARKpC`Resx}emoU&`GDIS1-lFLS8B8_l3|pBi5898 zW77m4(_N3~7bOt=t-!c^@JSESZB0!c69cSt-))uHFr>r7|427B;%yN}OMERO6DJnW8wJ zm#x~m)hi}Zpij{lOiFE%_H2)#k-?E&2^EK3JYJ|=iO{SRQbATuKc}-S(woh+P`BO= zTNcSsb?V-l@;kqdU`B)TMSM~CQ376kP^Q*gXq_U|s9B1InyMr%qF5v?7-xs(fzb~$_sqT@(o6-RtWM7i?u6dJX9NqQ>FVAx)&SndjUqOUOpCG(_uUg^0$JUv zOED2EX2c2pGyeGqe6cz<^!;)(PXum>I>l%pT!&hk~XLWTbOiav;k7@+O!H;*Q zgqR4c$XXLT_pVU^q3k|k(5_&aPYNS53m;M6`0f!apj&L#<0|>c2)Y~z)q8#EuV3$* z4{WSjw4a;T5}9i+%DK9vwN*`3Xfu?szbVf>*oDN0HIkMn=5i{Os;_3h+ha15=W~wm zUmg#7r3y#KVKqH%h%DEAaXE7THrtRVr1ooRlL>gs!>aHT0?VgJE3$yol$Mbi9B@BA z&pFSztOmcNAk_URm#4|&!U&GVQSO@~EpI$TEr^FXo>LsgDjMM1x%Kk%6IT~4h&#A5 zN!<@E6XU`ecn}n=ZvYR#ML9b`J#0N*u7T~P-sZAKH?#rUT3KBf#j9Zj@E-mgaC(?p zWfieYkUfSm?}Dy(Jp||B!ot9RiKMiJGS*?hdwDHfY)0KTals)4#QuxfJ4FNox90>~ zizZZ1#VWqfB9@m-S|goGB!P!@_ZS^rTFiyjoSRB@B~lT~b7O>S>h zm)D6`@${YQ4Tf)4LmMo{`^WdtKh231?gceQcKW?_?!jd4xb5LwmIzf-=3QJoP6SS0 zDP6p$H01x3r&Bls$o9;e0c9SD+Ou)~dVg&b5R7GlW6M1+k*Z!L0hNQ7i&()zU05-` z7G~B>X{iG#fi2n}8hV|fm)W_F;Bu5z%N?)4SR9_?#+sYklz6(O;Qt*@gQ0t6ji-hT zOCzX@W#gW7ZiifNiaRW&*HYmtAb>eaIGP2U>`%5q-L%!^?p&|9ht->w1VTR)ztT{g zpxWcDMzp_f%*jwAz}=O6S;H%ZO&wL4i5mL$NwMbUBb~#=I~C6DG*`Ga@^gi#fCw}# z-3(N0JIu8*9n^b!D6qecEkXsM^t!)yR)zb##NzkMl4Bg_^)1{sMz1DtVb3}Lxq=3N z;MPS|$yD6biy8M$q$WFabJppFuAuA~THUfr631qWK+#M|wdacIG zBD>5ZmE7Re zaawY7yAtqeXR^Qx+icVdduGGtq$RnN+}6l!Y^{jS}O>l zwW;C+VK_b6Sx?SXe?BRiey&QYdH67PbztM6D&^Yjsgm#%bHVJkE7$myt@>NugS}QI z_Dr#${!lDq=~+&Oo+(VNk*b=k`^dIbUXIMjVdkCr(n;RLh1lC*t zSx?hhA*G}o&USize4BBg;Jjqh%^08t=hIQx6-lN*Yo+5ZNK(qOZ*hG2rdXcQA0SFp z$ItlFOE_QV(zGTat?hU6XnDLP%csMN^S!gpI%=-XLdr7p0OM}z=J7(icYCwGg?7GK zIin2t@%p~3C95qL2Kt|RgC|sn^!hp1z1flRqSdxHpK%~66R;+QX7y;;5ZaA2bn6>5 zvliz=h%K$3riR+MO}W$^20evo^6M(0o4_pkYn^%V1|4u4b-7poagAO6Q|f1un6drl ziJX&^eq&!MBv&6l1<1Oa>ZFi1(+)ecT&C357g4vUBgV5Y8|g~KBY8rnCqnhB^NC&E zTw$VR*wo(8)qCY1UnD(KQgB4MY{KtV2W~u$v$9EK&4ldl#?5=?gb4n&0G^(>z!=cS zkU^KBVr-1NLo0AZACZK?97o)pUZI1-VI+4t)Z!~EXSJjl=&7BSY@?nEnZ2Ce z;k`W+@voYf!Ivmw`XxWs6bZFuHval2w0Su;gZ~8+vJz)4OzrNYn^%Mv8Zxq3Bfn8NC zEA+0I!B!RJAiDhn@uhL*PHmHF2~^5TEcW(8HhY^Y=i>ZVMiZVm4pN^kW}nmJUyMmT zd`3zU{Npa^hoAsF6y`7)St%-O8a`DFuCjXNaVbA-FW7R8-M;;-Vf-`W*_)wyX2!Ai zWIHUBB4uD0vM_rm$M>PdnWl0A_LuxP1;I13!++8*)HI3p&NB=p7&H#39JgG@3Yv`B z@ZhCZpp7=M4!s^KA?yhd@-gu}T+Hz>8nel?+oOJ4EbvdUeW~F&;RoHPao zQ#s%PFrtyD;$V)j5H+Q|bTXOkUb`i%LKY5ONi1{C7Y_z)iWQ`M?RaJ|u;8u&tFL?{ zxyeA$_BgSeYuI5|kEf-fRk(W#sb*^~>#V8bY<#Gjt?fG-0Ph`J^OCWXfaHB1+PdSb zj#5>b7r+|c!Glv(Rc+jNN_hR`e^O(r5Pi~2<50_g{N*5@o_gTHer)svORl?V=C}tW zE5*Zb4bK5Wz&GG^%>@`3$LD_=B3=lDKzv@k-qd1McLZiKxB|fZo^w@(A@@L7GMz9x zcQ;F>*x@wjDTd1rL)IaAwFCP}KN>^krauDw&1}WbFgvgKA+)1@zu79~+uW=GjDOh3? z%GWUQt+o|I+2CVs!VZ%G6Rbm>-Ikenx#Rh|s5#9yDs1YUuFu4M5C)?UsQ@2k^h141 z7lK7&ZIp)4bgjrspCd&4nNV3#7L{7{+p*SXG-H5|#JPFERAQg4f?Zu%XFd;yE|zYJ zy$OR;v`dYx)B?3%H0&EVbqt7UgOpg-BHe}`K14_r zV3(@2db1xOz7ZOi3#DoN_%Y%_DNv+HZK3S`8Ngc^Fr3GEVKLAp;N1X}w2p!2c_go=7!{y0(PywNby}O+1`6wN9O=m+ix2p|86g)fw zlA_ov<~Jo`xBQ$Dg4b*0DCL<)lk4LL6ZMDOb(*c+?(TAsF|5fE9I`7g99sVQA5 zb{&7{D0>@uJI>!*dls~=F`S84k55e{#B{np$;K63n*u=4PpA^PHseim{uEORCovQ)93F)n{uEDG*h*8```uAxj z(l&sRqE&vnX`Y0!4lz`WyPssdUfgB8%l&9;@!`m9u9KHEc2-eVm}EFZ?aX7za;Vjv z3l9Zu;>$SAS>lf%ZjevtXr?`iMv{ljb0@srdU^ljH)fqG()$JREKkgUrDEGWMI2p*{-r_ z(5A>C!r4{ab1n7ywI)iv6Fa+#Bs1b~5MJLO&N1(jM?9Rojpobcj}3_YvQ^R%@9A;7 zwP=s54l)&=Y_SDXmUwSbbFA@vdsGIQ%2eJZSbQaLA<`;R%J;Bg(-zSLyeh? z)b}He=(S!oi+%nxx5sQVP@l&KrN&)2H7(8W{_w|N?6n#n9DBwnUbCLek3?RaYw|?D zHgiOzIw0V1I3=M`F9@G`+-8^3c|GY7eh!#@wbAQ0yF87?cB#)kLsR{L?x;U$y4d=L z0ed`^mc&$+x$N7~45{p7$mhL61-iU;;?sQDP0MIzWHH=$wJ|WQWa-MEGE}bkX*C=7 zmZRg$H>P}Vwd&dSQC1DY8xM47Xq|3ty>Eren&(-vvfNun%8k+xlba{4&KK{)!deAP z;@?#@{0tI+^$&-%kdR^zq@iJ_6s6A;r<8DN_`vn5b>U|*1pJ9dnV_Yvn`t&r$)0Cvw)R; zm@L<|RWqCdvpAxIesfomNMbydq;HNM6_5iaa~5mAjjl3cZt$9`XQ8+hb00FWGrGKY zG1{Jgd(7p^7F=~ZkQ{)@l}T*BeEo!S&Gi&9m6AUDR4gLFF~-9lxL9As!z|NgN|tn< zj(A;8l5ceQ#Bed-`xNBB@B6i(i4S>m&FNO-E84unj}xEr%%)oMDE zG8xW@J&2a76?FHo;FFm9a)t*9KIy3eaz?$oFO0eiXwEjfXSP=%424I!=~LT{N4Y1x zrA_~a67aGS`d$ytrH(jh}LV5sO@1Az*j{k3e9w@zqapa zEj40}Jgq60kCi6F`o=AM;C6|2R$l>Z09ZWeY~J1XlK2bHNj{cNwD{lm_aJOYbs6t3 zR+33LZE@#smTk`$OdSk*dyuHZ4n}mfglC^st>JDCArkPwp-cQ72ZFJBtxujqV;BrB z41=70WKG(;>eG6CM%Q4m$D(>NN#DuP?Y#+=f^Qv^B}RD9XH}}g)@G>ekaX9pEOHSN z6b{XQ?T#&{UZ^~PnJ(i4Napei3c4=%I@6vF-JUTnZv0*$x%{lwpQO?wM^m1%xk$`n z5!(C8xfs+JKW;>9VM+Mfbg`xLh&Ze|m&Tkj(Q7QSMD3pGp?l|LiFjKKtXEdZkW6?X$6lI*yhS~yU}f&$rezh=xK6xzGgX^TYD%GuWx%M+hiL?6+(=z`(Qf*PVq43U?DK) zV6rpSJm27M_Xs#iZ}f0TG|;(GWVfUq=Hur?$#Q2VbzJP-UdI7tf0i7>Jgg@gN3NsD zZ~qb>X#eT}{*|) zga0IzW7Ff&__oLMa}P_Au;^6zlcsXi9U5NN0YwD5q67C`^=NtuG!d?}=dOz3 zrQtn)hfGbgqh!T3=XIi$hh3bhOI`|$$wH*CL)?^64A8JoKej|X%i+|ktsqV~Y@@?* zI0OPB^2R@3bbsXFNJc6q7UnVC*2$I%m<@wAgYexm8nLFoEdG+6 zML@=Ig`^NjL&#QEg6~?YK2cJ)jqDXh^GjJ0ff9_~AwtPNN!AI;F9`4m;h4v+`xC;a zNfrdQ^x^@h#|D|CtL=<3lD!@7%52_VT@~3Pa=(J4ju0*Cd`Srt>68JUHtZmi!3Ii+ zXCH11ka8v%@XiX^PBy{Sh0eW=)bvsKVW-O*pKhd(S0hA<7Yz=^ICqd36hZL6Rs(Rn zO#p}+`f`>5aP%ZRWe~D-=H|-uhm@A_B7s`%>FG{7!(v|QeWmAI(j3k&N$>w6a9%MW ze{W7aWAv&Ty~s=aitDjfTgIIdp|%t&jU{JmM$$Cps|;mg7^Hs;)KAEaNI={k3Bkz* z%Yw)1bhlf+qC>7IXbMlQ(6ua*V%$qW-jRfk=xF=?A2fgJ6T&zk;_6pRBP?XKU*DE^ zF*raQv=cR^Tq!h`*zyJ%?oEPN&(aqDTlN0i5Re2Kg}I7fw-mKx-Jm#R***4yVJGGc zR|=vrV~vHAKsv~WZH5^Fp+YvnGotXm_`A*kXgG?k4==pGKDgF8DEGLXn8gjqF~DLe zkfchU&ExP_7h7G1M4>cu9)h{~nTbU9?Mg%2qa?HwFGjBjNhV@JQx~gzroibSD{%s% zf%E@c2LQCJCv;rSh%nkeE5)Wn=M`34pD1poW7>G+E2ZNJ;w~{x#;Set&Xp);%NTY6 zxYWo#H~_0Wf?ii$mgQNgnH^85`;wBW38DW^g#Zn2-wul|1k1Cn4^9|R)7?Domy9b9 z=Xzgv)b}Q2)@>fO)IK1M8kAJ?>RT~@q&E2ih9eN;tazEh1+(9+dfwr+6gAviQ{PrZW;b|V6W zY7sy(8e;eq*zeG(5OaRz=+9FRIYAVNEB@li@Hw56c}q@wt3L~5myQBLAbwLyB=iI+ z!}f6M!!T)tILbEp6mV?+U<>5MOC;U;t>s9E$t>3BA9R6ESmAXJkUF<~$MzKND!s5! zhZ5={?LRu2M|AwYsGc3QsmaZF`Z4}Ylt*B{avwvBebO+YH`hxwZYWXm=33?GNKu>u z?KALf3uH#N*e{3xw<9)~X`=@RTfcTziytUs(PzZyzX9mkA(Gx__(>0fA|>((!|>)L z?+vt7o}2{t)@w?vu`al}Clif!hY{W{3Y@_UB`;3ON5jcHZ}kB=?Zf9diul@C_;_Y2 z60a}mKlLD>;+qo&bV{2<>7f!6DwqA>16NsI7>X|YS`0wJ`NOSiuUcq-&G zG}`wi&mPy0Znl8je3+l{0f3;vxbS@((CyORMhPA~pVt&iu~VvOUY1KlDl^sl8jupF zj8e!SpugCOby%;}xw;$*wb}eatv6A%I^2vLTnI99dhfp!_YHe`W-?NH+OVR=n9+Xw z;XmT%KeMUpny&(*8W<6hJ6ZWdFfIir>%pWB0v5c)X`B-E-LDS_X!GG`y5ewgSG9-5 zHg5t1X{7}J#24V_w`Gb{N0lG!Kq^@WuFvNCZJPq3$Hp74#ece`KWG?0+q`%I(%+&W z4A}Jdy@9-^gK26CI>10LUD8)Y3j|lb;#Efth5Cj2Kh0;sPbSxcSXGXeqmms8P!zpB z)maGdh{n;Lxc|5$0;n@3V6x33?SDT2B_Q#0GSomwctXd{dUxCp`)jlE>z3A7xvA|& zs(41=Ewe4Vzj&y>Y8I*>v?v9R>MJ=Z|M5RZceeRexx={J)auQ0RCwoBC3YP&i0}T| z*ZQ9gk>&^32x%`1IU32hFY?6a_Zi{SjVcms2N#?!AAPtrt^j?*Do84LXij zFY^{{J+=4yj}eGVBs)`8pC51s;!ye}VIvYv?q$^(3XzK=(*WdFWDTU-0)07Kvsm|pBa)U)lP6mqPAFfqBiqzv^j$uxve>m38 z30R>F-N~)XbrzIZazp{KHJr@kL@Ro6$5+F%w+(70L+)?q>0{rKo=70;I!r?UV)Q@e zS6dv&9|ZS1F_Y+_wKoGME~<<+=vYgv0DMbxB)|)_bUc#w`}66Cy^ls*d9L0#Icor!eOK)slgv14wIPB1c93EP*5@Gudg=ghZ6cy9n5ac*5oxkBY7S z4COl)KZgNu@&Kdf`nJWMbUgr)djUvf^1t^j7Xki5z%K_8AzeWlZaTEX{Ot<$BGp=| z?`3@?I3gw`XoewG34zP;XX_l>`x3bRDFXfUs-9ecAY=&0zU&7Tz3=l4;3mpw|h?dNZ zDLy#~!3a}Ake0kZNdD~4BG1MY;5g=i373bl5TrXu%a!*WqjdMH4~cR2u11a99pYl$ z5$#K(K20ieIH8HWSVl0Eej(qHzpdGx!8D*G(=PSV_~~;}wNdJ%`4QSpfzbCMG764l z#gf+mgV7g_&?8!0))dOHfIdrsYIa6FUJ`OdP3fhuutit+2p80GACGZ1@mRoz%lYW_evm8_uj$4rIxSqsy9`z~e{}sX{p1@i?Q!8Nl93 zvqk{ftcXdZG z%cn}~6~)EMJxH@PJKs7}4*Zpt4il2K|Hs~22GyBtZJElWD&FR) z=E5zG)p$qz2(aJJb$N#J`(OCq3$WDxL^1{K zbpaLS-*)!mP<6|k?=mm3jhpRRi(vDZC*5o zqnM8qmBNig>gTeGMJrOtkMPph7A2X`YM$;#;p#r8X+flpZv-m0N^^3xA3mZIOtg?T zoy-v9g3g$3`StnaAkRpO8XJMErO{|sOjJkTUH|a_1q;T9Z_k`C*^v4+2_eOwdJYc{ zL}Z)liaKF=+6@7n+kG(?h!UX6%L87SCcmbl&t+}8y9d}}!vd&1fn{qq2OTvdh)r`6 z?1tO4BX^4KS;JpwCIgMeiUwqXu>CC#US=<=WD~89tEXhaF=Qn#7B1j8kC(w8I2HCo0Wk8(Vs zFUw1%A`v+4E*u^lhJdKk6u_n3IUZDo@6oC@_aeP7^RlO;<{PbXb2 zXGXJVl5M$BcJchd8dQe5S$)-<`$qeAEIiy}{!8}hlSqr?@_kuEWC^&tvMQcb&|A>- zA_JYfIB)5U6j!r5?_GW|@Rw=;=L(m7OHV>}nBGVwvirCz&G`)*BbtTq5*7W)5vw6U z{9rm{6Q_T}NeWie(I6hTPuKErm^CX9xoV$(Y`RW>1M48y=oZ?1!YgY0bN}w%2j_h5 zZh0OTw)PO2N1LpAkdtP?N9nY|si{_X5W+O*o_%aZ; zoeYOvrEyUAO#&Nrvs7VC7}GxpCUcCO)0fxi8{bEA2e+yFzcWMdh>N#!sWOB{v9qE1LdYT9rmlKyVqgdX&*=Q9@GN$&h zV8C?-4)=%ot^0`ApavFLfTsaoi0 zAW$uHU2+|%)>AA{Y6E?RwAZN`f_IzEIv+$`QX9>ZC&|_x$byF!LDZ^w&1#b))+P)q zK=)`nxva!eLe>>a{ccd6sz2~V2AMX}-608aKcTd#xmiA8miKPXCX;0M!wVu)dcBK8 zHl((06o=+7tI46;7r1 z1id;vzWTbpwV2={BPNR1>8vGNww}q6Z&3A<|50;8lcbR|1K>v!UWETu^N*qdSt0w7 zgK#adyYwlS?@`8UA@BZz_bL7j$zHGHf)9sT)D{=}j{c?#$u(tD@s`O=;N; zb&YLgwN3X!4V}IZydos4E~@A5{N?nv;(^~h!JX#VG324+5y*s|7s?}i!A(%ys9tAA zsA?63nMeon(C3$d_9*Uks(7#;a+E>!=cD^qQ~@;_p)G4zpW|+)#MUZDD$scz3wpI@ zTN3WWHYP^$j`Pt)(T0Ut(8{D{8Oe8fLze`aN=@_gE1cHtdUZ1>-qW47cg81}n3-=y zi5kvGs~QGD(kQ)dM&PzG*G{;;KTO~#8UU&4vU(zt3YzU?$wSsX*#BI7&F;Wt6c~(M z#MUnY9<$2)`K6sk4ss(z2j$81Ex?JJ#3=U`K2kR&)A97VW^?*5;Mfi#WjZU88oDuT zq8O$!EA z@G_`AGxp2CfPc#l-nW`uhi29*gne3uZB5j@)?-#Yl%H^$OVT=e!~2o$BTB2wrMpBt zG!IC-nC`UB1`EkH^Mk6!du6XJABXXn9mReDOCF_=;IiIlwjxk+E#~_^;9oJNv7kNq zG#ge0R$b-U(jwhc9KRBu#;R4eN>Dm4sQL+tDolvC{8VGt@9LyH`2Y=Les_CvAjm4| zi{#3atG0{7Qx+(SN(46Ya)~OPH{x_7509Mg-bu~2KD1U-XNK<`>E(ty1F7P>FSy(F z2Te^GVG4g@M9 zN;Zz8;kxI0C-wCjWDv4&Dn8#o#Q=od(Ppu6=%& za&yHO%5#3$zx$2j3FV-h?}?MPzaW(>#C<;q>tG=a5&yT)V}%a<@(J!jRhEBAX8Wgp zKELwSmHEq?DsQ{%MwP}d=@@GghReJ>xtb`RnCeRep$dy@##t>9a60yqFq=$fp(BB+GYE#u2Ewb1uZzjk~=ZI&hW#ST&yHgxq^aw)# z@+ll70bo`$439Mn3DJ?dR~Yd-7ABZhp$_~3O&IrXZW4#2;hL|fbvvv&?o(0|F*h%B z9a!r!Xu=)LevF4&K}Gb<2Fo=TSVLg*R;! zhFCd7UdOJ&{(_>+U}v7-r%VH1)1=0s2$Gf-ibP`1KIy&pVSv1!a0qrN_Ih0=dI>Po z#EpHt*_IdyVV-7?RUJRl!TE}Yq>kAb+kECHO_MA$hpNu_DWR9<7YVJ(#dE%ptA)%- zJ~@NzRnK1y61H_K>$-{YWM11sbgS@|3g+(!?A=+8{kevP#+q&k;q1r)y$7M~x5rer z3}lw&9oH7vq zYfwR4+J$LE)q0x7#!h_IpcapcMruCtF7_f$s_gE)P!!xL^E5~R_fG^aO$Sy-)Dzpq zQT@)kW+DUI;0Tn#Qh;=H>-t}m8aIQx_2R~G|>+6U$ekfNOYRrCGnm6j?Oi}|8C zwfV+`^|9yr##UTMjOk0JhuX#PwEUpoI^FER0PqyV8q;j0Fjw(%vj9Yg0 zT2SUE=>n{pBDy6=iP~05S7APayKrr~zmGLyoDDk%c!mnF-gFm6Z6Ivgf=FM>OUra5 zlPV4pd=uQo$F!Jr2PY@!;>9Y#)WdLEx+M3#juO{yd^|V@(Qk8cKTVZUe9?a6hM!=A z;d7sOZsLF2H%aoN8u3wgUGODRp83ep0BzX$~k}-{Z^m zj23H3Pt$t0Ewh$%xo%!J$I$|}(ClX5({e{sbb0R@{AO7q?Mm+y2wzQuA>-rK*6b-~ z?dDXg8wLb@?O$jPl=0xUsuG4c>L+y1aN(lkn2d~Q8`fEeULHebI$13pxpr^noo#4R z{#}pLV_fqwaxezvgqUmy!sqQF|97z=$s@5%9)ZP_iQbH5Nedd9RhP@YdKxYg(cuj?LRX=m0Pab?|~+@VpfO3gX8Ad$0g z28lXP7S0}1C@lM|j(WV!1Tg-+(Jl~y%j01DTdLumdBrXCJ3>p`TN~qS)MN$&OidI{ zv?QN+YgNO}nVpfelBw1lR6g)OrThh?1{%O>C8uvjcFE!CrDzCp@f>VS1+_ZM$&A(0n0jT;(N33mI$!hU(p7@t8KzYN+zHpX>`bL{Bos~CE5GOts@J%0F;TKtqB65Nr zJ^)@Ff27}UxBglJFu1PdajGrK$z#vH)ib}_%?Ney1FFu{0N1OIi%#hpti?}L3FpL2L{(l z@J#|hdKXSvjx02Dh&jSr@}@q7D|hRk$UTMB^s<;FTTMmv(!weKIg zy3=6|Fx8{qLUxznJj{ec|A~RaXaFgZYfDoOR$56qYlO7ijU_)9)oy$a=en8l05~Vkl+_2M ze3$60-ROS8 zA~@fwLr+xPD?hb0+>Vstm7@K`JFNa@#O|78u5b+$!0l?w%8X(>!^!r%YI(iyCCWyF zw!i(Br+B3B$b9KW;RG~&0GbT(vIcIQ!JNo|f5AUkU7B|qF&;*+=R$10Emq51she#( z?WBP;rcg;c=5h6!tI9KYy{TrScWigQJ5TDLJO-ubaPauZbkzI0#5aYwJ(;4B!;}(MA(454PmAOuC=$ljW;E z9r7|gG(>kAR1JcI@ZbJ$1x=eYq!G2aX?(d@m*_H@qIx@~bvgl>0I}@t$21e4U%s@ME?(UE$)g(4Oyt^d>vp&?d2s>SI($+|*IhI^ziU+88Q*OY z>lT>Meyk%jZ@6MUX=sB^f3EO6e+3P41lWRmv?1IUskc|}I27)V5`+B_5gO+Ok3B}j z9(12tnE2?u!FgA84_>W&%qiz z$jo&CRup7H@tg-g8Hw#eW2Hhqpwh`SnwRy^&&y=44&LVcLqQc{lDW5zer)pmDVAAo zpIe#b%KN=;nT?@%L};$#&bP2*cc?VhTMR(lKz;K@CwqQp3tW4eTvOxSb!aU=+2H|H z0D6PCQNVJ#kAuDTt}6k=wEI&f5py@RgJ1u3u5Y~&2RnIiNHUkSi?eVRy$FEu2`nth zhrET?hO`sGRVCnm^`~_t)`9taL|7U`o_$6JhyDlBKkzU`B9V2BV#T8x2|BmTWZLfK z*OVRVcjdTC$|&}Z5(F=rc|7_2zTWzbMM9?E<^%jEBXF0C)rs(6uOm323;d*?=!F$$ z+q*DBh7W7R-P%9a_kLm(a;~eDZzaFEM=$aWB|RyL^FlCTGMp_6(XMxJYe(R4Igc8f zvei^a;q0!0cLB98q_TYNL@TV*W@WKBL0%5>`0ct1^8=}0@SLH5qXE&xvH!Gepn_UZ z|H`}!G*5Z%*dQz_K~Xu9fd2(Zrvu&1uJ?L33nQaWO|OlytG_BF0u1Afja|}MTK&<= zQt8~Lmm$UhUb|a}gRQ@eE9DgA0rCu%G1p@}7j?btqEcW=Lw1ZiE)8@sJ@pr8QhtUH zCQ_)7;6X36bqkPOHZqT&f^z{NTIdcr1*3bXvyL5gCe1GG67hW zay^}DU?~p{inxxN)dENCCk=WO1JEK~t=iNix*XEfq+occ*FQoy zn5pBZM8STAxR8thw<18tmZZJo>yC1?;cbU>9{=P@XNElKXTe0sM)p&2e{ z(`*?Jp&d($Kr0q7Nq9b_-C+QxB9Q!Id5V6e{>KF1dU4p0eX}EC6M6PofZ$^+f5JM7 z3jfvFktYy)h&{ppUImeAg72-Q=goilGJFiLUkLKQpkbo!YvFQ-8k`T4Lf4^Mp+Iy5#fYzI))4LjT6N z`)`h42jHE6TeEb+&psms*p(*1R-3Hw)3x6 zST4^b^J9d-EGQP-s$!xy4?#`kSlLN~SwNE-F;1kJnznF794N*Tpf?n`Ak^`zuX4;W zYm%a?ANW1PL^6L74gRAe zb<0g!jVjDrmZM^zA{juqX>u|BPJ{d7%fUnd)$~Fg#U0TP^VTYxBshfg0cpT!JI<HF#-(OUWKVoM~cc@&{Bcb1}4tV18WF^B9%PiwSYpJH9V59#v zSsbLrz9;hj*?FP1;ym@9;@}=;Qcc9V#)L#fsgg$dCDB|nh@JqTI^7|YqjORhKKDr} zMWYMOzf+D?1d^P^3G#hzTIKN-6=wvAlM%(oywwmuRhtP24Xu1&!5KXj~r=Enj!BVB&|qYk@*}5=mj` zGl>xIaZZ}^k}#W~A#|iS>b(-x>saajE!#XG6RcE_Rhh^ecaieY9Zd`LLCXhXY7D{@ zPHi*iBU!w!xjXwn6OGOR+{sdr;60V+ni$1Qr^%@LTQMMr0~+bb%++mwXBv9QaGR}- zP|8+dHveQlu+zIxg@8X|oA3fa+U+ZN?qY6zD6n4UMo&mI)P8s+~-TxMP6;x(9 z0Ie@}1MP{j00||zKu&V^(Xp&O@?lQzd&#U^gOLNEXsr)B&>vHyf!<_A znQ1MiB<3fAitpUHlfpR0@P1+M)6@nI`54gZ2y>ALL^*fgFC^MGE^Xh$FFucKw8vRo znEyGl2bGS9+9h@P!&@9!lg{ilfF3XgVSk>%n5~!motn{wX%ndDACIk!kqpRI&_T=B z%tTwXv&P1q$t8$Jkw}Of$$xr}%Znq8OEGpJOPCAvGG^M^G^}#5jnIGpT$BcVahyka zKr^tOa<=*DR;*FoZq+{=V&@W2N_%*dICp)j=Zo#k2^rP!+L*raube>M?B~0zEk=Fk zux{=|bv3C!>BFOwrLD1wGh>%h$b;3iMU$HW4xZCix@W@eo>k@bX=HBpMIwvyH&ddb zvSprHYDB`3-qD7Nrxo!%$9*>GX&~(`6Z%+~dfv=+GZtHA2{Mze<7x9vC`Vorf+#gN zF#3%9bYwqvS5mr9)@0koDbq>(H&XbUKRUp@%T`Je(p_s=cmk!?En^A$pASk8Z5vso z@ccn=$=mOBtdljEEB+xvKfgnkyyK`_ir*}sp0kP?yDq-1UE?KU|xuLcAmi)5XWwcm3QqWNG;<45s)T`f|qm8 zn;=o<+JY9b-aexWqP4`e(&{m}ZZ%{Ym`o#e`*FZndt5WrjTpyoU`~kVHv0MbY>pVS<UoW_eRecYc^Y1Fd~u-kV0j;VnlSrb!cZ15OAH4wnz8S@ z#CM_3-%Rx1U_=XuLl`PlRZ`&`MqST4_iwp3*QC_kB{?5~77QAXt(UKE9`{a{oR8vD zIfsw$hmH@HoaG3=@`~^%k&cYQaCquqON^rR*x$$+7ljZG>|~-+N*~E5&!xJ-4=+Z! zKcOBwsK^j=$J``wxt3&?c~(nhQ9BOY8r3xxt1ZRtW&1VpxQ6IEmHIUtc39;MpX5(f z`78S2(c>n` zY_-EO`NH~kn7hG8=ZHxpdiCq*#Hiz1elIxs1xQIlvxLq)JxB=-xq(Kr?&I5nn}c*n zP@eSJMSJQ-IaallpF&4Wf#XTNQvJ_Fa|rI_c{jRE(e`3J*hu#(WYEQ`o^El1Ur60L zg=fVIDBpEr;k-SkW9qwY!<#p+>PW#{STwS>mauzLMQwYKdrAx5!#3Bi)C=&ue{+TM z!N~!W62~q4i6f6*x>T_+gW2F|nwO=(_!3!f(U-E{Z@5`)SB{?VweQVI!xcf)CU1$Q zvQMzXE@}Tgw`hR9J5v25IEFoJY)2|ADuCJ&SpXtYFgI~W?duS>CX$*Cx>8FLR|1;|d zl^gy%UnZ|}u|_5Aee_dgW*^Cyi@D+o0V=WcZKO5n)VdG2`G&}`nl@N=irFr8*80nj zPcD8mnm4)YTpiPGjs~$((%y)rk8ixtEd3zGJpTL;E25@l5Vw!}hb)z8NxzHKc2)?Y z2zkY-=wz2?fE?0)IiqTT$0-}o+z}hHR2jtUS-pjw6tEo3|#dc`2Tf~hZoypOGUFfO{nXK|2*71JT? z+{oR>xZZ}OCsgyb?ZQjm)Fy)z)8?}%;@2%o_-Uvp@cNl($Xb;*!Dib#_?hU-l4=Ay zZm40?2c@wMZ{fm_hQy`EicJanQ@xiwe^#F@_{bK8)N>Q$Bn2rJappO{$8Edma7|Xf zu`Gkn0S|WC)N_=U_8-;ni9;^Bn39^g&6zt+uzQ? z1Cs56IKVi~sw)sOa=!}bJS)9Z6r3~&!Vdoy#(D2D<@f;UG7+-gi8_34|i%wkuW}^r@Bsj zl`pr+9%t-KDK*4Xc}JJ`Lk|i@Q)lt)GB9+%E&pz(tcCrDH?S3$+K|+vDKRreYQh~f zBMyWl*-ubNnpy;tDuhN#gKT{v#+$ol!O@jnoEM+Z*0N;Z?Gtu;(t}yh&lYPE_(io&HM^0UC*q3r0>Jg}f^SdHMB@&EA>M*#|T2A2PgzyF4)=<4^>* zD$>S#Z6OcFr99e%suvUbQ>y*v#KtXs)!3ZvECJ_jL zq0{lt+U09zcX`ZD1eW2(A>hq;3sll-S7{;Njcn?oT5oLFX!u?Vj_U# zc|n32G?KY)q~HO0W~fmUP(B{Gjvhrqocd8~L|TUc{P@1!WU*Wn8LlogWgo;G0M zF<)##=dgTJe+%+-HfKr^q`4A*4TeVi*T>TV1!ghOUlcZ;2|4J9d;W=Ebf4bu72)Rk zYkKTdT?@XMhH>tcO7o@Kdc7vwYfO6E3~DN%9ndn~Jq$6DRJHB#?Lz|#g2dxZQgjSN zeOjx#z0{3L?HQNiL|(g8vWZkCTcHi=@C~yfX>a{b0J_EX&imX?N!^<5z!1~Y zkc&h9DV8BuvO+kW{6-6Eku(|BR~Q1yQ4u+56}T{Owqp@fhC{A7?T(ORX?Cs$Sz{{i z1t6ht?H2C!_`tAah8QSMEe6+JcD?e!Z};%z7MMyDg+q-NM7s&c(QR(7C3C^WL-m%A zN6wIB`-@Ui-o!3AZ`)pGP1#Wje$>2g~{(Ms*!wM>yC$alLxvHun87~jAqi*%`nnmw5ps9_~DSHI2g>EYJa5GAUM zv3kri83HLI(y^=SNCxD^cy0f32(AwP?th4loaH*(Fb@~O0*o5Y8!+Em-A^$V`*P_oIF zd>k52^_h}Vpi?7FALFg0$|Nia&-;rOi^sgc=}oo^n}s)j3CQz9@(WBTj&PW(MAib@ zosGRQZ8c1jIkZHo6CxvVAn6 zs*kML+9%251`r%)_1#Ynw1KsbiQ^cA1nf8s22d5S0cVD|Z}b^V;_CmXaN7p=;LG&-trZ*sJ6LoYCKEODW0t zz<+&Ekim!OP8~K9gdBA?ti*;X6e`<1(p2=K>h985p@v4<2NjVezRu4!TbG(1rw(Gj zaiuVxGPU;cgS*xWHreySgq5;#y@96@HM!JlDf&ovOL@);@6CPDF$ShkJx0#2wX#if z+r?1&(7il0TUqmiTJ?LXJNP)7mDW}Q=iANKI^9FAAs@6j+nofm##PlVIAxvY7_$SN zQufkvyWH%MGtYBuMtv}+Rd&CVA=7~2nlmgKl(v9^N7HrkDx?ch<4S}T3Cp(pg#sv{ zu)h6i%KxzGV*$VkS`w?*f7Zn*h><$T!N-|{Duix)9Kv_ZOSdj*;7*zUkstXTRYK9P z^Br={$zekhfkx*fCOC{YFPQUn3HM7cu1-B4cKWfxJ9dxF)@BGluN=&sDM&G*K6ZjV z6#qC5gY+1~ATo3ABRlW*Y#q-N>xT=MGVMG*EzuJe?}{E&e=r8rnNMYW@hp1sQjXAQ z$0}C=*r$xi?UFn}g1;RDANVOT%F}9{!^B&NEl>SjDai^%<^9Bc<6&phC8W()48@;Y z_8Jo*39ww9ATS8+Mz754kH#i$7ETgMWxGDqf2!uLqfx_3T7Ji>g){!uL2k>);3~!2 zDQsgHTXTCcJRGa6Bh3P~+R7t_>+5vXkg@1{O41`CAsrA4h$-niqosf2Q>$()DFVgc z?!Xfo;1Pvv=a_FphhRd7xo*2fZuE@mp~hkyMt%DZKZdr$gV?NgZXH&0eX|Tr=j^b4 z5evQfBG=chy!)kJSHBklj!GSi+c=UOtxDF&=FI52lbpt-G-+FRD5ooj1J%F=27QBW zN^@-Et8PxuB=)4~z^jQM@xQ&8_|O-*gq^2JpB(FSjo<_Vhv=X;Z@1^(0b#q^SoWYM z|LUq;0M^j<_p#=#L#s`F1I~6*L`t=yG~);f-|BVu2R&~MyHT|%D?e>Im`mBT;ipmr zcPKiSxCGv*$m7f@Kfj%Rc#@(B(a^i^`@(S8HVG%k3y~~SI5~Bj&X*kTa2qG)H(sY& zk2Zw`zLPo4xDie*Vbm4EW0z*%4pOF7p*E2FyEe^yb|Z%j5Ry0Uj_c$pWK+?jK-V?R zQDWS8iCdG}cBApnH^%!cA|cPcm~oXSHrRi2`)|5;2aH4`nR`dCE~ zj7{^3>T2neX>^5tK;a~k7XdX%Q+{%JRd1Ab77}q&jQQLC!d&MjgmDQBVT3*sZh|X4 zQn?}vw;N#=NPX~Bd`Hj*0^B;%Z-L1RSTcAp8E!G}_ltEG$v?CA>XG7ToUfh^>x9O? zp2@ZpUnTLxd}prGM}u&K#d?RB!s4NiYRi6DHNFvp*AE3ncl(%XvrPL$N~w{WgJMJ9 zM}S_Vru~kU7W7IVHNV$}92SY@{^)9AJ=}ywPEvmFlTjd{-(5K>rAnt^9Rxfs+~3zi z4cMNsl>xnw`^pDGn~k9GFRuEKqGakXL{4mPHv09QJTD35fM|&S(e-n~C!0P2V*brA{8R>;RwRbWl2gz43;Fmrl=(Zjx zQ-{^4QuCJ&N>#s`y|cLaHe`L?)ks99zzgMvOcYJG{ggM!w=o7kY~#Z~+zeSF*RQbW z1xi7%+MCG#{FP!}>^GT2c@3*{ZFrCA6o4=n2kB=(|3mbRU9JZF}@K)Fd7fYReOY!v%y;?b;e6 z|LIz_^_3|mfm*POW6q{tn`JBcisa;~`PGJlW6`vbVX0f_m7}tj(?ez2j6pOl33iIJ zh}^3W(hpyC)lpCpY){`+q749IE$mj`6bZykoZ*nXfRGgW+1( zBsaY7=}B8gZn+;0FXbk-FTq!Ul7Tg4bh>}@gF8HdRU^Ef=FwS*+t#SzW^BK$0`9LnSA{*F8NdH~@=P=r2zMPdZWgf|e zpSYRUexmUs@|qhi3Z=%0O}@<34y;^!zl-99 zq{KWAAFLdvp-|OE)$&ZIi>$TLFBA6QY2u^PzT!>God!*hcUOeUyJ?Pk-roktQ5?H9 zvVETN3&oGT4p_jal+7sDPlppzS?G0DNLWiCRq+j;NsT!y!kGA%_ z5ouQ~9NJDi9*i`)I*$xRG#FXv7(7SvHuWAWp3-!#125BxP@#cXF|ZFAde2x?@=vsTeZKnjb9+I0j> z_iUio*69Wwj_bP&vvoqzXLyd2&`KP&+)mY|%K0?LwQ2ldg#DJpMKnGzC&_1oQK>Do zhdn7S;))-qE8;u4HLbj{m2st1`8^NpkYcMHFVEn>9btA5dufuaf3KU#1XMMQaUdm}cP9Cc4R z6acW~b)=snn$FVWd!TCMf;!D0L?21IpNJ%drD83yQ7e<<<)nh$7BSD z4EY|D^qvt;*-JpAz~|dPwEn)5-W2|KU@H0FKuxOxLahzrF}zKL#Y*OZ@j`->Mo* zMLL-UUap?{9m`3wumsLHt{^4|cJQq#zlEj)evx(hDd8THSY|Vzt)Fghcdc$Y?b7ya zZs!LQFSu48U$^U7+@%)?TgFPQ{}W53-JtQeKqIb@d_+Mf76ut}dI}w#1z4SIR7&`T zl6g6(PYI|;<$ky~#(kbmLsyhtv+sZy>ZN7k-&{m|0BUIU6e7!Q<8&B`!Vnzj@hSkC zD@yOHMzby@<3*tmNYR0Bf7hH_AeY`-Op7sBrzw@bXp!~m76_NsA?E{Q>o=iy6sBg=)cpSNfeKxR0q ztBlZ#7v)ZAM&1v#LtdnilWARU!#f^=XD5K%-f4qo6>plSmIxQPIX}?2vfh@Ezj?HO zRjA|;t-+q`hGq52g|2op_PwaYh%I)3iK5!Pr7&2C0h^e2@o%7w{O-)ljMjz-qXPH@dNWBQT)?sPUPrS`(H2-H_!aJt?5;B&ZiCg6I7+}-F)e#Bqrf3XeIPqub%vQ#fRBJUkVqrw+J zwG7i0umRfmz({DTOE`+!isn}IFS#J%$4a6Gu6%hr{W{dMCq}bqw0+(QJ}vPXU|*_r&2%9!WeR9%v4&Ay~xTS z?i;r{i|WDV&F#5Yp51IQzGK zSpD2MV+^wH>zS>K8upwZHv3y{;g5UxnI621{@Ow0bo#5Z*fNfaH@P#kzVs;cg5C zSqwRV%nwN2F80+wAgSjGdh#GgrUg@xU3n$w!O&p0bPshgy}P6AdJ8Mttpf~V`>;17 ztPHlpKoVbK(V!~Dmy*RX(U_3F&DFyzGA|iR4oR4gG!eCI0fghla|nLr-n5RagM{ zeEiS*s1ikxPc>Pd8f{Hgv2trYjA?J(-!ZZ0eXO8^zZ&T}ZZo?1d{D%F*45XdX$-9o zcI#zcwM6#~WF-uFOIfD*)^&NfcxnzIILo}Fov~h+;VrDmLhZk1b0dF24RO9Y5(`hh z1D_!)h6=k#Ekh#k0h}Rfz5UZoW$#9}q=a{0?i*B0mgs+qAmdB0^UaZ5!Q~<8kvBri z^t0arz-^&S7LtWUhK4qs-mM7WPUpOGMXg0!`FYHFXB$ZZK>*&eRs>b zwOSBy-R;VV8mA}!uof?1KeK`FtbaRG^WY)54d{I8vS$sF<`(e?82R7njN~hr; z*PZb_*!jiCwsoYOt8fidJULfBCKNr@&DXjHX0RB(tp9NpWWdvJU3RE_6EafR{qM&M zvQ#i!POSrUnxrBp>R9L=(BfL@gZ}jjVZpAc`Id*tcBnIk^~uO@A%vzYk%vus(YbzI&WsRA`TyHV5X`+~=zeYn;c2sSQ~; zdpE>pxc<2|F$v(Md8FTl#AC)do3mH`xL&q9e4KCEC5KCJ#r|wXW6&%NjTZ)ZcewR(*7`#aO zV#&La;QR8QirE8_k>bDe2hGl%RLgu6=67HU;{TW8U-BL1@r=W0d^Vk<)pFaTs z+~>8({+w{WFJxt=cSwfQbu~rTtJ@P>ix#fJIP6ua8=TzcMz2`Kh%r2OiCk!oU74sU z`>HofBalLWz&u0w*U_!Z?nDvhTkj%dTjEH0A8s3pmdmK}3JhX+1hw29qoNf0l;B{q zpun0#$GzTy$iSXZ04e0%7C33`l6<<`@k|GPMee%kQBwuL~oPAX5%_X~e`mNVebItN4aGiKpx>k`oxUlB`LuZ1hG} zY&2|E>kp)q|=;yWGvsRx1b|{|qz1@?>B0r7-NnJ6iAEg$#u@8FAVlV%-y`x|5%cUH8VE zt)y_&NcMlZ5`T2bozJvRgk&TK3rZVIZkd_+5ntH?ycn^cEuQp|DW|>LjBaBXYIiLc zC74|dcc);2BE6HUTC}#t%LQ)LWaQ)x#vciZJqJW|ddD`c-20K@i`7g*MZu?)Tjp{3 z&R%hwjh=1vzU#*xkQod;URT0cAoi4c2A?5Q=9X29W178FqV=iWf(o$Y@PiVsa~gp{ zoQISHGW$ih_uFJ5!V&(AaGnq^k?U13V_4&;iP4`n})1>;J>vTLr}#ynDiE z&_IGifC(Dh-3c0CaCavJcXvzB;O_43Hn_XHyA1B~P5x)Us&i`hZg010?x?AGdAs}R zr+?OmRamsD>QVh(7{5^<({#t5*^=_hoMRgaSwGLV6L?isDn9T1GXma+-gw9$+w~pM zvp$f3R=ZtC5LgB4J#kP^7l1X>F2Ze>ES+4Rk~$ByG^$+9Z793-pzAU-U=Y}eQFA8({4Rmk!lAL0{TJrK2WKhh2&Ta*PFwlaY?Y=?K ziq+`g@r$TAi@Z6bweRBHgNOOJI$v?q)KtfnB2lhs%#=1#sRts7Vpp5(hhHO3M%dM+ZdND0;f!m35u6?0 zO4g}#n4^i0iyxwxcPOi~*H03o4skwTHsa<;dwpEEx~?p}AuoQ`8`Jn2<#NK98*&?K zx%A*J4c`+XBO;_$mt$aiw*(%FtScI3Gvjs?(dXVaRl(pfv6N7#VDJQ-h&IW=B!@wD z=1o6(c3cdfR8Y*f6^A-{o*Hn!uR0LgRWP_{{93#t;?0-n%&w4K6OSNbw6#|+`x!mU z2AS-mqEP8SUa0UxKp=yO5M_+nmgbZ?>#14IInZng0jEmB{8;K>O8trP;UF%&6m+cT z+nhE&yR*OJkq`yvRVE1XfB@r$EMC_;e%T z$*%I*6W~G7=Su$f64BPG-I33%bm2vAGZjQ0#eem;jp^54g&$c118r4m8Gv8hOtVq& zcY2;C_WH3t|9ZQx*>Fs2zY=Ob*v9_Y5g$I>dew=CyK_89^GaxAbFaE>s|#6a)bqXt zN@we%?{FX)JHoWypR#j6Cval@ueRkkCuASp2C|8I7jTRJ);$>4f)DkVgmdUQw~!yW zHFCSd-4Kl-+WCh<38j1jVQ6|~c=xk|sVgJmPb%8`Z<|)2)%6WTQOD_lEQ^~jLs(Ie zKq>{qG%oLMbrnr?f@-F}|LG6EibHmbUPPvtU8ZFAA0Z9&GF=(n7uA+5UHvchV_FSv z!vWF%8keu-h;3X3HI@qFNiv4X9lCDKM}G^MlE%<{S_+vN%J8PU&2y@mKEw#YAWgd2 z!EDw3{Ldk(_n$zONbWq-r`##d+4P9j@J>^+RTY@q>A&%=PER3?a0DJI)>@>zEw<2jLtZJVYvON zYeO8hk|v~PZw;b5a7GdH<6vc|MX-sp+RUIk35isRUoO8}$PNO3=tm9q% zt@5hii9#b5AZI20i`6D^wcE2|crP^lXGG z#Dwd9N_*zce#YU;{qz^5byl3EI)(P8(Wr8bvk%QX4Fvt>I_f4nSJI3u31Ie%i)gYM z%f6`jdOwF67qGxkreNk3w9?`gtix@5VxQw#@-cKi3*kcdEFrDfCcZ~Y3vMVDgYjC3 zt*e$ecX@>Pg*La{wz0h8%=HuFEurr1f!?w1BFRNqEWMU$S6!6DtdqJpeW#feW}JB- zZ^-OxwfmUnQj>Y|91J7VbtR4rnlYPc{QN7>vO_c za(|(EqA8;w9fdQRsdr2Zkkp+J9M-JGnV7foH#@;$_syxXTPg-YP ziYJ>{ZFYcX|B?WdPArcDmb?J98Z^P|o=V!T-WpE8%sp2e1d4_;%Z+O3`4^k?vbPhT z(6JADGMtI}JXB>o!+KspW(*B8^KLzPM7Wn{`J~K6Cvix^u&Nym5S1@M8r;-6x!|( zOXdYGTR-;14CJ(xhC`4Ba6xZ17o(=MOy zw`c}FzpSp8k*0i1YN=X$^@M;`kb#)*!n&)(dd6G!95rfa(HUsO@m|&{U&zmM`Sbf( zh4KM%I+4yroB2XZGBM%p+m4kM0XDqDK4UZoeXbVt2crHTHnNGFh3z($0qr$h-PtnKdYntxw6zY<;N5Ej&lQZXPw*D+p^sNYD~pf5&clY z3Kc4e??^muULKAZT*={Lwr8E}XRs%aMlGtRZaaLOK3N7OHF#2SQgi1u64ebGJ|1mN z?eB!q?;q7$P7#tHp0FObQy;Ar6niew+&4R(jy(qo0;R?#tL%0M6?R(ZKB*A9HU&Vc z!>7x=QR+yeTd;*mIjN!GWa0D9JbQTL{S7+g^7_~U^-}t!9k>RYmaUem1;RKTrMZ}V zrH%B@cW=TS5#V;Ms@@$)y9%J{pV8xD_o~aCDfu}U+N|oXO@^tLNpL67?-T^4iZz7C zAJeH4%^fJHwkbw!4a%==bJ=L7%U-1~QL;c54Fz^xh9&J*^*ne+x!-eH>0c&`mqk z3_gM)oY@MAUiFr9X7OetR>?iA9UuKZ?mtf_zBShH;{)CkimQBOiW-P1eyZ)_`T2k#o%MZ*GtURTxqd$)81G!z;eas# z`&ZmWlHqUkE3LR1QsQB$MvTs<{x%ljR@JexDZ@s`=wKs9A}Q8Y6lY;GTr!5}NJ0a) z&c0k7Ql4*IjP0#XRXkc%!Iv~m84{(>HmiZ0ZIsp9UEeA7v`46J|$P<*oq?>?}P7+JSC*>;e$ke zs{PH!j5`d-z~5;Z4%Ov|8-MtCya1$*A49g~2a2yp?R%xIgL^{vD%og|Z99Oa;cnc3 zOdtLUypP~)^}d@m%pVy8+Mdaa*OK7pSzV4sRvbS%{L&Wu)&}d0KZ%}=d`6sf!OJ^6 zo6%_ee6&cXVjl_L(ohNC+W4tTtORGFa}$A@d^piDp!LPuFC0JC`spK--$q2%^$FvPabO47$URU@9Gq-kk0 z>cZQ7;eRMHnG0dV>oqUBTT3wf7!Qv9g><6M6*$aWODtV_PlDx6S=cE5AVv%Dx@sn) zE|}D|Tk4Cn?Sy|g61e^HWq#lX1XlSL%ZAcLXcnuF^^MG_PR8mtB`Seuc-8=E(mUZ0 zVw-LP;Mg|`(-G$~CS2tL`fQ$i=DNQQ$}zRMGZyAN;53)6jjD?xjhm_E{We(cpcLMC3JnttzV-({>(vA@N#icbZzcV3V2TR29a z&WxA`6yRso&7_aDH-pTcejfY00}Kk0qjNWsOxp^r$wXVwMsV2ikt?_`BO2VHcSK!5 zj6^o5Td;8m*<|IlBM7gh^f`C+>Yl3^yx{H)>83j@0FOquDMhuQT6CrPocaP3tndR) zp1g~rztMXuU^Vpw_o)VGA`e^Nc;hmR!`)ojso_E9om_#&HFtCjs%c*56F_`7le`(9 zbj;-n!{nRfTfyElQ|ndN9ON)5;bdDbevPVeJD}HpLO6r*%HZ89_c|VSi@7x$;Mj(I z-c%oKvR;7uCy})7Vgl{lB6;F?fOSWJcw8id=u3@x(zVBB&_U_rrWjm-dTKmuPS7tn ziA<5@`hyvgYdhY<5T4E4X01$Nl7n1>^L-OsJu0#I>pIw9aP|@I&F$B3G7D^YLsUL< z*a-m?jSV|wkJpv^1n5RIBV_dFjcI&cf7C0qxs6vE(rYaDqULWc?1%p-sE3Q^#Nzz5 z7}3k$XL3P3)%0P8i9A_jpqjAicv>2^Q*VPKIzIPW<=w}#`>Ed9U=oT5fP1j@!(?>a z-4xy+XX-rX{ApZL39Urf$fRV3K?Z1?ZJM&r`E3E~6g*RA{;Q%g6;)*fssnP$Suvn} zN&SSJU3tI|CwoSWmMoAGaKe!!p#e!?!T>rS#fWFN_iEW+P^kNw~@cYV({5`ENg#=FPJen7ZDC%y%|8h-|8U61yRt@zycXpl(!yyOG1 zqRYY>ct;kK+0r3qersW=*Eo?aC<*-7BWV|6{i?l_jpm92aw97!-%Jidx8&?(mgnFr z9zEMgd+;1|IM>YD5{it&!Y?X_TP(Egs;0+MXxY?33h8VS-FBQ}`xSWtwII0OW$WDL zaj$C;$M5r|Z`Q{|5h5lH+w?@$c4tRF%t|aHXY@2zg?? zKIgTLrdd#{BZPUcb}!#!!x`39O3xPRdvVY?@}u@{;utA8fw6jfY*eW++?(+Cl<{vX zq=lr@p-UWm>x(lp{V08MzopZ-L02i8aSXy8y9t=k?nvKcr6h(a<>IROILLU+({rto z=y9^1UGRy=D|)MSjNH3T4tQ&v)cH?r5P1N*-pHI{di*oH#}0y?D8BX&C&ZGsrOnu% z+wyR%C}53dL6Uy<5z*o5+>8G3l@acB)iyCaeD%MM&nDADeXK4noVkCMN0>#D&6P>V zB(!+cH!@$#DYo-w7vR%(Ur`t)Dpwt4`mtv*lIrh;`+;@(AbtbAj7dL6LX#t2_n5mtZ{l~@!6S0Ldmp=$ff)uB zp?E~PJ`cJ2m9y>pd87x^C;SEfJ#=A>Plx_4BP=Qm2@&C{Jc9F5#4VlKQx+WOxzsa) zio?}r5lco4_ga_(cu^#ua!Ug;+}3X&{zCJ^l|Jah$tQ-Su9@i^RHaSw+PbgWJ_o4q z1BpcQ97;uATl*A?fbwYQKqc?V=ClIB`)o3N^r0AvuvIPacvhKyyS^e8n{sZx^@6$l z2V$43uOPzbUn-SyPK5Y0M@@fh@H#F2ez?9_X*9Pkx6L}3s_Kv&aHike`(wkC)=tWR z#nvOyPX6lQJRj@69x{zE9)E_D{xI$j@;iJ*7qo86xUo2`mLRV26y9os+igg-so}^L z?Vc5$VTZqVra^}3ZF>cV-IJuHrgU`XatjuiBV3e!W|VGTu_-5pL!Q8i&4Jo5Qj@4^ ztI7n=WPNZLP=kB(*nTY0Om1Wm$#iEi-pQI9p!(sq2T$w}y5VM1z-~4_X09|i>gjIV zV1Kj2L38VvSur2_fs#TviyLpxuhEt2V-7Z?Nf@E~sG2Spo0WSZI=~@L0lh8qCou9T z+`JN5Akfhd|I!e516O^mi|rdOAmy+u*f8pGJ*uuvFKcuP9^m9d<=`NQEbw6!i-l28 zaP}Ava$mMz188eXIv1gp2G*UQef1$4PZDsCaO?p91?wPu#D&a~mI&Di2|>Yz3Lo9at3H1*T+%M+RAI z1n^}QeaX$R%03r%%-JF$9;T1g-{sfzGeM4vwU)NXj&;-v;JI4ns?CAASErKjx7Gc5 zER$^%>H$?Mkpy|bJ0W}ytLd=MUW5qKAKtn>+J`g%#~0_Rj3H&P+gUTbirh?WNOU|h zBk{@GPwc2*%rq43u!8*Gx9%c#?=RAo$6fORbbVR2AY^=N|0{P#bF)Vr<~~1kl14DR zk|#gveUZ)&eL=L5Y6u|o@dOSJ%u9uQDh1;qV2c`NF9Q<;qVNrk0Xt+iII61!3rD#0b_XF*H6>J2XEB*+RRAe z&A=M#^d)k_f@IzNzJLh2Gd_Wx@bgNBs;1;%eYX#TMVV zPE)V4=pvKr5?X#9qOot(Y^2qg5}XWx!O!vG8RT_75-5;!-dYENS_2A`;D)JwR$(C% zUXSRdnK7QU?4&gTSJZFTSQhp{WwYKJ`d`wisSwt9$lOiQ*_ze#Z?jO^>Lkb@SgXDU ztLqPs_8R0a#FQT#G}o@NLVo%Le?(TNeo-@4%7UussNy{IaUx_Ch#-^oI_ka_*DnUA zO@>8|nv|tv)7>3ht`{70 z{Ivw+^b-?3xGP^pD-7-l9Vmap!^(0c`aORNbY{%Y&Keb77s+2Xd}_Y!{_smJuO;bH*1qQtA$n{o5Q z)@32f%jxMs$xMPcJ;*tVZKjma9>7@SOP$ZZJ-Vcahb?tcXB{KCUrWlc|DEyaxF;)f z0o_XJ(H#4OgIO#)G|$WJc?GsYwYwn8hZ0UpwCK~bTUbDI31#!hX zkgy5c{-NvLk$|;46VF>TP5KlP2Q{s!*BemO>Qc#Arj-gmyDv)XTZhB*{AbROluuR5 zlknc$q(p>%a)A(FRD5E%Nl$jI$J!qnwUV|FR2cHZ+1%Sr#tx4%p)#k=6M#dj*{i9l zVn#G{j6iv?1mR^&+pKTxF`B^(&uq~$>J6L_ywr6E>t6kVNmyd!#_uS<3Ni%yMQZK0 z#3Ms#S_qTU-bdI2R(1JvBKI2OF{I@Px-`xR?z+>@*=VVamaHjCIrPo;`#00!SzPy2 zg&ZxL1R5grovipe2&{ej-Z;VFcqBgoaQfepF^BYQHiHDccn4^(<(}cK^XW&bL zP32k@10PQ}RIdv_1qYpKc;ft9KN-@5{#?JU?3na*%bDzLPwb8)D}@7qTUVFvp3mdy zkwu4au0+f(12W3H}uY6|O&F%KE0>5P0-61@C*CL-^%_ z&8jh~3*?R#pb?8{7W}$mZpl>6_b{BglZN4u01`TDf0nAVP0io{Hl4|F$xK*x;y;Ta zPMUcg^!hbcHKzXcVns(Etj_{=B)O*N;P0pJe`Pq6WBf7VjB(>97A-$6v#)&JyGibKG{WgQ29<_y>B3kvCE=&Iw(f;Q z_QM~f3ev4je{IXV>Zn8!$U`S&(+WMbV;&e)qOH=#86~ zR$p(stRBDMx%yR!DboO~5u+9cUbSi}%HW0%O7!sljVjJ1<}!Wa9jJOjINo$x4#@bH z_L^)wmpR^$vi(S1wrY|ns!i0mhho!~t=Q`ZkFlDiO35^Yft$%&(1hr4QrFtYs8f=+ zBcE4#-t_q0)_4>O!SBW$(Bfs`p6sn38gL-dccsR&yi*7zxKZf6-P@7`QCaEl$5doL zNcuT+UcDbR|K~iQ(bsj!L+Zrz69N8rq3RZ|s>gA4Vr9)&&6ya~DOXJuzcZXc;5y3=})mVZ8Z3g~Hgj*sW(E$4TJ7)=cY33|X z4_^L@^^#O>amydr`OpCb?L5=Kg0^j<;K%KjB(_KQH2G&&$=r5IOi3jkpV_WQKX|c; zSNgH*4dB^iPgP(f1FtquMfog-ML~0m-%S!`C?M}wyp-bBvHdTBn?3tKDGQlX;<=4@ zGS!S77cW9exlbOEU4IB!Li2X^=bKU0NRoz3;iwJev9i{m?}!{CP|yxnm0X()k_kQ5&C2H6eM1 zO-me|K|}B4PV~?D{l_0z-ACN?QL3T9u0hDItTM|D-CdbmQOd zwXsy~4cWaO9%w)>9xt1xNHB6s>dQy9j0d4Bo)bb2%g(3N4yJN0I{P%A7~9`dh}8?C z2P98|&^>2FR^y`dPJCM!G+I`b_lkNNn!_JJ&|lK7_}LvD7u%RC7X%t{3q07ZODwtN z>5ixIQB%!%#B5KpL|2%RmA?RLt42YH%{nqTgm*i4XQOWNfe_h%# zTZgvyyi2!Ux1Bdy(?yh;j@nYzR|@J-N0Q*Cue}h%aMf*(hoxocZI!T+I+~fShUq&p z$6>%qg6R?AYPhoegF*+W8T-|{p9-jjkTy*PA}I}e&BtHF@N=B33reDu-+G5IqeWeM zfnc7zg_dEDyEBJ6_D@g)e;6YP2&)^{|H(4e<@m|sE#~9B12XFA^kCec&MLJK^7RSD z>wpC@FG;UpWGd}N%O{HzgG3i+B<&UpIP@!+)_p3yUz*mbD%}-ohJF$!~sl`6k zj;7+D)(i2s=pGv*A!B>L8d!!uTBnQ0E}4NpyTT4BDX&I6=L96s2r^`ol;Fc?Rr;96 zFz=!sJND2+1V0l{+r)Z2vCgvCUj9?LIbbmTo~^b_`(={29qnjM__9^PCtXhSJXPRM zVclO$dZuO(HI`Gnh=ARKwzE<*-QbweN^DJ48N#^B)oExRk^acckouEE5buYPN~a*( zFZ|f!5bwv}kE*Fs##ew+rpVkUgd3RLZPWTl$zQ^F@0R&=RcD+eWp^wb%&oE?YFIJH z*jZkaATew7a&rQ9m+!t0`@(l#snIG>;NDfNMownuT^vvxpl@HZgN-JT!aRW$`4M)z z&w@4W$sjq+6nGx5GR*pz1|J4b3s0whS}uZc{p_6Xp)rpn&-d_Sm4~X;1su_wQV@Mf z%8+}=jGF+>YJ0tN@wjlEcd`>@48rNF9Ihh&xl*jQh|1iaUuJ)!DgOvFSn0XAJCP~3 zIYPN{R5)^U41Q)c9hx=~3>^D5^*O7GHTlVUv5C8&#A>;1&cVIW44UQlUUL}7p|^8| z(zs%*u#D8b>%#=op5IBxcbH33UlYa=T8YJ{YfL4NYSLsKnHeAm z&;^8nF&t6%e9GHi#)MLQ;mbnR zAx1+qxw=W4%Qq`F#gssT`B;aMgwLF%s2+x|A`9N5aw}$3KD;fD4~2T;(SENjVy}_N z_cAq&fO!E*6R~HGv3#8q)4QV8JISo1uE&E&qUy?CgBmPm>IZ(+*eOYnB$N`u&B3<< z0N>LEtnejp2JLv=NlTtk5PTtUd%bk&vj%Z;y&q6nepFJd8HrC!O*H4(+!h^RdN#B8X(QipZwn9^;wH|i!R^gR9J6x|dtgpv~# zcDGT+9h9+$8{!4uwh`|!pssK5Ye`!prSKBS*V_78Rs0j(DU=9fr->++DJe?S805Pv zn6xqb!o(U$|18+!Gd?2DmN^IHPCeZO%vro0BsoJ#SC+)na!)_8``#DpO~~{Y;bOxd zIc8|`EsIr@cxp|8hrC60R9jLTh|t+|R`;zWc79u}Jw>?Rk=(D%w|kp+8(Sb%{r&S1 zVWCXtKz+ae6Ft=+x)YPREAw*j-Ghq$6{=ZEruRcZlM~bdgmH42KPt@C)b^ z_Au7zE_4Tk~3K6>SyrFC9t85LgcAFCK?&hSsWyZ!;2 z2C0aQxkV^@KX7x5BuS2hQF!-RRIpW4vB;(KwxN)HrW0J$(+Cr#QK_grl=LsQDfnzD zA^L#}QMtr5f(#Y9S{-p*VdOGp_sL?+Bzc=99Ig$c>3Lj>Na3s$;CVB25V>>laUX%( zt~=E~_P!V}uG(J?`)^vD59{fSD`4;pIN;LR1xgS=DG7RIU|(_Fr?K>xA!F0%qYil9 zNbXK<^{|*cg+!BAZ_ju1y!`F^xrrB*D^1m^)cDr#>`^SAb7C85FJHhrD%`G@&PV@C z$vj;7?PkPAxU=(JU>D?vZbTJyDwyOUPAZS1%))iL4Cqo$6mrv2(V12(QDcw#CCIyv z&Fy}p-YYht0;s8yoTSK&U^%>%3-cO9v6-%_U_NnKe_ymuG3Ub*{z@m(a*J;%W9Q&> zP1V3`&ja7`I522Y^@glM!A0zp+Wm<}Cnr+aJi?=woT%jvdsR&rE;NCXo|rX~Cq!DW z{Mf0VYDdp&1do{EpG-q|V#Oz;^UZ;ju!3lcI7Ec2jG}U61?-6z??hNe0Nj9*mr_D1 zRoeIFL)4!X2izda2tHVh@eI_#KFm`eu*`81-~J(wB5G}Wgx&HYKvLnzCY8=15gW5sG|^!$8HAajEp#_Ch;JIC#i1wuvd`PJ*~YYqruGQ zEn?Pu_WSYL0?lDz)F}vEY-~9qe|YTH-<$tg!aCW&UeiR;d+`fYCqm0+KI+Nex)>Pv zs~>YTs=y@9!7x*XZXi3<|>Ftp&}9m zV7aDXSbe%!?U2Z~UY@zxF$F(UVO?T)j(2P~Tv1O0Hg8q+bF``PBTXp{m#(u*E@ zkw;+@aKp(MqY!Gw1+!+oZRyz|_})BCRvg1rL`;|`{RVkB2eiBQ1<-Vx+JNzs0TO?v zx$JU8#uisQUo>%(s<-g;ru+J~R7d8|Zcw zwxgH0uEi$d@A(3bH}5vREtV1H5o#Br=+rUlz{>+umZiCl zBDNAp*T*uESR2nj6X+mKb99In6rF+0MrgO4-q9Z#m%sP8=1AWQ zqbgVhX}|8bo;&FDU;i0cL5vgi#`L0Y7kbrAxe(W9-PNN)dO{=IT0Z~#2h;P@{f`Y| zA{`6A1Fyc+^SE#BAL}xn86z_3cD}XKzkcASD&T`tDC2ww3Gc0bSl{_95!p-48N75Q?6$R3On z2f{TB$d4LYfbhAP5YaVfe>H;P4K`q?u_($oJTNIQGQ~v&!n+gMWq)+?`01!d*@ib~ zS4-zR^#0duKq?mjz>a;wjaqQ;mFf7dFDlL?CZ?117cWoT4pOJ)xR808d|bM;4<#w4 zoP4(jt@zzMnFQZN1w)on+ao;g&l=;tRgp9OxPJaZAOS8h9}W;&e%5mSq)r)#;izaU ztJ!e&D_nK0&rRp6eR8c70!P4GH;ri@x*$SOpTog?3MYY=Q5LH9b=5Yg&5ZN$?it(u zy@yDf*G&B*43S|cat3DA{1p8DyN!&S9(v@nfVkb-=(xgSE|JHuNR%UnE!wvP>@G|% z`2FLg4igMMbb?t<7ewIY4D0CFGzyWNc1Q>sk#jj(nb3Lr`{ypVks^OtK!PtS#e?L4 z17IfLLO1Ygw&E*dUOJPrtNzTjUfZ(_j`&~}M5wy^n5fI1fK3I3W(H6|7U4AORoCQ5 z-i1)b`DP1u{giSZHo- zifcgCDXH*K;<6Va2v-oPTJ?UF5xxEDW)(3gWcq%@r!Ef88ZcPIF0QfMV2x7)?Xs#V zLfIiOhlh}^ob=7;4?|K+W(H?enbL6h#$1~E=op7r6+SC6=3<_(PP~im2^oou@^f=eS@nfh)$NUK9B`buq}-yp;J)`i1Wa%gquc-&Q`+c>V`wDD9IGlVS45+ZSMEflw6j}s=n8P zTwtlxGft<%;7LpK)=QSYNNcUxi1nPo%szbrAX*-W?tZ?V%(8XuI8Jw~_Ir|w&&yHbm42+pbQ{eY zZ(}{3-=f=vLa_!slV8 zoxHS0`zjaYg341;!2Q_tVXJhn>-oGoqn#;!;3`s{azc4xSAHQIu=1+}6Kjs_!@a^p zLig2^)(lXAFDSyp`nR^Rx;?YDVVq!=npyKvgGYoyHWdgRM-MkcO*ORGDT^7;d|gz2hKw|fHQc#^YDfW?$>Zh8WuXRKaKho~mvkIr!_B4LrVM0f$frYR zYRB3LyFIs`kH0r>$*7T0!h>`&o-~_-5O{lwVy&#cYBpzl(=DF^6N?4mbU$WJW*d~Fe>yc~Qi#?ZD-rsdXyb~c# zjAqrTGwmkI-&aCiFpnm~dAM;DLIAZ9RO62$F+aa%YaT(H%ngpPjWZLHPE%_PjnDisc4}bJJ{xLE=dBz_Mjq%ckyndM*e0N=+pRmxt zl<|%PI<9)(j3%Mg%+=gZ+gaae>M(izS@QLqyLH>`-7i2~3>vJ2$sZgTTI(DkM&aR7;RS8 zs;xK0wgzXJ*6Y=^h={Dn?*=|~K?wh-y=Wo04AI%3g=#wb8%8hax~ocIG2%$$AjySA z>G6$txSV7yE3z4T>6>%PIEf1;v5+w2-uXS_PK>IUNZlD49neNjHFV+$kupFjx!@XEGSf`+xvw!Bw2oSlj1}rEAD8$xP0%V+akra zzh_!pe)Q&$muq*>xrl|g!GgLxm2-?Kqsgw*u%qgSE!vFIW~IrXFY&y+nQhe}2h35u ztZRm|LIUt(yc`T&SE2%(!=6%{!_+!#utYBu*)fC@Zzw=~{gkVuCRo+&frt!Cmy7g{ znaW{P@7?MQj_w|oX&+6_ryqe;3VGWtj^$`S*!};r0GQdcAs(2)5UIbVKCt(u58*=&kiWTj` z?$vnxkd!1A_98t_i+DimoC%w!Yo@pez1xg&T4jlhbL1p*@X`zY@G8M^F3|lH;ZvK`!>A9O$ZiS&_R0B>JafE|3o!@YHsCU7{7Ul(c_?t( zw_Z>sPZy;!)m0&@@hQ_KgGgJq%q!T$n~CKe2Eb)1WZO~d589IyjXWDulH+Nng@2Z2 zS^I!lgnq^BgjGw}u~jr(gTLHS1l%W?MGxK_>bJWd7S_>H?6>m;xB!QiWB?h9-^#X~ zM=`X+2dZ@od7js*bO$*tm73BpM@aHHq>{!2MQKSfBo8~qkENj97 zQ@82%FS(tDi1?pO{D^{;s&-#Et(i@6hZNn-ilZ+ej5u}~alpZp^4<@=G$Ff>ox~SW zu^GrPWtv7YgbWjKO4@;4H4=$GCsH%ej~5}j-UJ)yGAh_0;i40Qqii_;PGTx;CVFxV z=CxYNe8na{hXZ?o+*||ynzIS@IExaarl;QPrj=KsD2oMpusnE2v=e=8QMFuq$Q5y7 z{Ui>(Koq5;y?{DwFuA1jVvZBV_`I7U(&D4jXbi;*l&iSe@^`oKG2MADV!NUzcmBKX#OB?;$}~Wz zN&t3eA51Ns{8294<13N$`I+I{}`o z=Y`>Rq|+VzCX*4t2^c<1*%FoDNJ9Q!8XWrO(p;zxN=V-` zK_Ax>@m|9Ab-JF}9!_ei)lawGoF z8=dc-p(USAVrP+G7CIor7TxJe!RxFcs@*%Uc$ojYI=Lqbpu;5Yx6-~ry;qkr&DdiK&UTes|Hq#1H!7*W zd2tXyt2vs?zgCkJmN%AE6Icw>0@@~LViysFnEfEx4NRXwzn?6AAty25adpKEVPQzB z!c56+%c>e$x{SinsFmoC8dcesghYE+!pvOU={yr0TpEdekeRXlpFag9pdd4C0b=Tk zfoKR(Ij6A5@PlX_e& z(hDGPmPC!qhWEm<0U9-1=fXnS&T(-|kbMHK)QfzG{Ou0&e{52gaH|P`)W!>~;*Gp` zPkxtdLSE<5`lYI`U-HT@tSi%v7kP+hSpx9|NpQhR zeoaQSJr-t3x5});mJNHlJ1i=Le!{buJvcIh6D)J{Nk|cpSLeR;Hxi^vt+(zGAK`5| zS6R&XT!z#=R(mf(bn3Lv@y}gu>fm{6$D``6;sazo)|!A2)3_^46#*zqdEQdPr1q)c#dMvtOIbPA(d#9; zi5HbKzK03pf)(O9c=2>*v0Jl-Ffqjr2jy2?qjEZ0k8^486$7hi`Z}j(ACiHJw`>r| zT=(1gKl{0mDdpr*b%@DZ4p=)8HW&kM1YUv$owId9@w;eBdYo_;iqBG@7 zLsz1nd-QDt0S77BUm?nGpkjpN7r5tUw*Z8jzac3czqPQdjhCf!LqzNHG62V)IH5*= z|8v55%6_%U;Jb>{M0r`hQtK-(@Yd;|v;Jr-4)LZRi9;!&iKCxXCKQ_BQm z)Y)87ihZR0Ffj|+k7IGg(dy>KqZ;~Liv&46eZv8)GFRytoH>?|Vg5}sI{42G|F;WC zzZ{Ij$Y;d=zNPk6v-v7idJp1UDPte6ZX^HC&>E8X&ec%1^GQi1(%?&TK#nTO!H{TL z;}oT2yDu$(@5KA~+>t4^3^?4JnE{1;h4ML8YWMq)dAd=s4-P zkLf>CD;!Qyu|^BWB;t63f^|+ARz@PJ)%MTSkL>nWvqWwsCM#5L)QYB4!^o$lEn7%( z-B%hIb=7*=Gp#+p=kw?^ZhO&q1k8U)EP$S?gt0pv| zq0y~hkg@5$!lUdr5)$@%lv@hUlE7y0s3!k=wKyh@MJ4qTpYy4*t=Y8`l)2Nk7W|h|HyrD}p zfdq1qBS6d0gQC7eQcWVDydWB$UiJS&M8RLIf58W#Go#}Fr+}~j694?aFaE!m^S@=K zkpJJzoEi!-+9k<<>-7TKPpMEA$y*|dIKC$YT}#jsAn2_PiGwg88i7cKA&Lc{qM{;% zZX%3fHIp5Rr%n8t2AR_T?QxETA#ngVS)(kFl^2r$6$b^K5B2u;dcR?RI7z~7zxz9% ziOcOOZxaC?2F|Azf^8S3JEs^=WUMLT2r2yKb+NYi;*-ti%i=d2kk?+eX#4M}{_7*D z1kt|bQR|vQLK^>u!%bcax?W@va@h(wpDmlbW-<8&L3u+A7(G5uM}=C*(2ft;c)mgk zpX3Qa!%%{|^)6stT0yGM$T)OAU$6E?5=(?6#m6mK|68Jo&@yCAf3<32QG=8Ka&lj^ zH%JRi*9U5_TG?H!Hi{AS@upTT`fEZ2g#!JOMI{sh==6<&3WcFUf=PfML=mJy&N2p} zKf-&TEL1jb<50;9K^&;04=5wB|1%J}7m`Ebua3mR|L?b{VB}FDaYa)Ew~z}{ko|q( zq2E5l!O5e-72rTFDuMp(EG7(Uff_iKf_-2Ydh!uQ@f)G)Lv&tl~1;2{P zR}mUU4EjpQ+t%^-OE#5nCoC0dRfIWO(z)%thM9&cYH_k%!2iheA^i%e$8c3FO0#Po zcf;UPRV}hq+%!Gas{>wsR`w_>50sDZ%F*SplcEGD@OzJwzm(2_nV^efZY*Q~EX zec!1OVX!4$e4U`*z8idc2(#M#@*w=7A znF|6Jx*+5gl@~%J;;%=D!#y7Yg!p$uA~VQ0W%cjR*RD<~J2eI1vdDdnx*>x^_J;Q; z5kgGl-5LYpmpJ&WldZoo;Jg{~0y_*FDC}2ly~Z=Lyt(Qyv3HCpTZj7JGiee3P3TXy z+fIjpEcgQU50Y&)VN{uE+zxO~7!Z|GE#zJkR9?q3+QiW&q2V+Qnw%F_i(MbWej*n( z^xOt&>LsEr^Ut;r`(`O-$w9=GLX_(uBwoN|z1zlQX1~0~yNB{$qR3UJ(--4|iZ#V1 zh_0>n24Atpm6=+jCP}&6v-}_8Tq;5!y<}}^G^8Y#%ImVsbGy=LllgMdgRUyUZ?oP8 z1DPc`P*N~y0LRrS^C;CH`ZkzXNb0y>`LezuzI>!YzTo`27`y?O7f=Ir`=d_(sW%3k zFj6A8P-I~p=G0!Uw6F^C$k&%RJ14X5jVe;)yH@Ae4~ZQ}kNx75{Ie~FsbiHO2U&LG za7_6pn_Znm`TJw31Gp0`5`B38S^UX=g*@HAB!80OOJ##_sM9`^gRZ7W+?8+qywW=! zVA+WGu{N>dm8bq3iVY=&3&uDO2>QSJ80I9ZD&cnZFco=GhuC!RHa~y!i66{sT}lEu z-OUA%LEQ6mnGlo~JPcuBoPh`?(B8DWX0+qI3xy@)w${a3&m89Jl?~diUCkBdB1E=E zUub}N0|o7GIsfc2(UjL%?-yG=S2J>g8UnETVo(D?4@-pvkg9OlyJN%GOApZbY@kM^ z@9}(hrnIQjo zWWDj-*J297y14KsSR!nytdmP8Ff@t_PSAQZ9NDgRtG+#iDg5w-xp5%)kuCoT)!j6l z?#)?)d`NM}Fz_IP8m!TofXs$E_Tn4$Whj{Q3E+6VMrst91|0LZuurwJ-4fkx&7c9xGg^Z0>(Wu()A1a}A) zg1fr~cMtCF@HWYv`Om#GpWfH^);eo1vT{!E?&`9x`c?I4uJ+d{_uU58wX~;uk!1-W zakn0SbS+^s0ARm+S^eE5f%JcSyH^6xX7eSYLq$Kj>wDU1BxrR1-U^cd@3+{Sa^a>5hg}ll@GIMnEd_6pL!=xAQv| z-Rgs-G5!O4^MC--DHefg6JihYY$@5gAP3H2Sx|58j&(Blhg)R_`oq(HDvU4o#mgQN zrwMs6m!Pa1QX+-di?6c^;H!gy#uxf8gJE80B~phN_#%cJi(z9Uzuzg%<~e-23x5os zon0R6K3G~@@=iysI7`+YGIhSXY;tS4ddE1|;L@@c?HkFXgks{!%abJv$rofb@6w;E zx=8+{xHnu;-}*&wJWpDs^&R#4WiIUX$v2$`A5^s< z9E2>T?C6Pq+!_H|I1)%dD>>h>i(0M|$M(FRRgK!FtcvLSsC{iXA|=Jg-XypWp(VTV zRJg!4gMAJG0vU^gyobb(WgHcWtb?Oh2xh9BIDLepZ+W5f%UImr>VBB+#Bn zy`Li##=Rp#<1WT)Yla#3{k#1@h;!2;)rg2Dc5Jf|NL*xeOS}1MtEp3e-dzt;jUR?v zjCihHC@Qv6Wp6a9%wAs%^J&r+fWB=gfjag-E;YnlX-IlB%cYksKWS~u-6!7&^ak^E z_d7%^la#lnmHMAR0|&r*EZYle+mpBAR|xjMo6ZG8LB7S#>5x90F8ZQ}B*I9*-flzW zc1F3?7n_iVno9t*$bmuXwIVBhlV+%I3;kV206!3t+S#V@LC7`+KI?@6rYjyoUr)L>O$0An+oT?-<`~8SxLB?0OH%y_y~S*Cxm4P9j%jKr zuiO628;d@OsT<*)KrqOI`qwQ@v&uwfBM;84_|T#?uI--Ui0}xKL#OAe{CAHlYj9h( zR1%Bz(74v)@%lPn7_@i?_x(4?l497rwz(>E#*Q*Va*JszxueCGFrpAKgYw-)rn-sr z+1A9?+(RsYFN90!d&Ce^8<)KM<4;>ZQY+}%b5g7O8EzSb74xmr<;T$LNirwGF>KLy zk?{_LGd2N- zkA|tl-!6|DGz0b7`gUl%&(T{ivQOk z>+Tllb@+fjCCdxFW;Ic; z8d6mJODb8c#vo}(5fTW+jyPDSktnJOk74p-16$VMq}>W&=Sk17Y+2!J@z7bGaO?t~ zEdaU)^dRN@OatmLCp09`)+r(TgZg*LM^86CoF4xV<(y8tl}(>Xr@)F+#fzjxkLqOe zF8k4`wCKc;m~8>LLZ`GU)TWl}`%pb_sKh@M8fQmd5or|2wjLbV4b?g~{OXO;9>cUe zjhS^YI&S5^WbE(`%Rh;V=34eVnw#WvS+eBAaVbIXM7R(3aNO4(D|y24uF9-^#g?Wy z2-O0c)CiJYE(#^u?nXb<4j1dM}Z<(-iQJ0nC z;4Gc)2JL`8=pqo$#c;R5G5g)T!g97=`)8g)z^OvEJC4O83=%mkYwV=;L4DW{_XBqe zNv>3bp{DnrvlQ|#)fK9xj1+HIZ6>;hG>v2C*llKMdpQ-0)uQ9Lzat+u+$JmM*k)#I z9u`AGt*??br}13hZAk5XzUuj*>vMPYkdJJ2cSRDZu-l}n{IFPD@Ms;cIKA&##@RF0 zGYs_JapI#Cy5VOFS3FJ)Gd5}KuSZG#HPZ5^GLUqs;d2y0$VVA~gcF(bIw05R^V-;V zZz7sVTpec9X}!Q*8}>h!T9JCe|CEd5Php*;<_NDB%NU$Bp26|g^7lKCSt65W+SV_# zZc4iu{xwn6E#CHaW9Z6ghl%cfcNXbG96jUJBAWvG_d)67*k<{?Qt$j##;5&t!-sx< zhT8Q*u~6Clr~8}v44+`G9`}cms}it0%{xy^{UizP~TQ~4&gmD0iWsNA(D$c~;*nhd+-5EYFvjmCzLxXGkO zKaJW%zpbywoN{+?#UhQz0qJF$sn|Hp)RI%CHE{yjMPC_;@5P8`LUVB0x9G724~Bs8 zJ6cPiY}w&L%c=A_2RCS;FkTN6mhrkRB|d_^a9gIgx1t~UjKAaa;BK(~bP?cxsm6FQ zSLwoMSVY><_k5?leb2_mX60d z5dx)`=}2knuOE`P)MS!ofdy3Q9<#T}X6d3qNE&@evI0gpuXuX*Y?_&DiYN^7M#7tj znoW-g-I}l&wSMaCU)3u{2$kyaUG`6h*A93m-f}0llruv%-CPDilHCYcOyyQPdDuO= zU2H@{@Z~BtOij5&Y4VxYC2#p^)>ZID{OM6UCPQj9Cq36=iiRiH8tb#5l$XEx;u^W1 zq56)*O+(KUeiM#EE9Qi3Bc7*6L-z0-_mVGdGihPY)aRl^!P+zZ=ghoY(-aL#s?%Jh zCH@4ON#(e}{(%?i@k)fig8>ub-UaUk6rMnTDoci}i>Z98AvKCXL2RH5c+7dy_$AMm zamR&<`GD?Aq^GNja^5M#Oi$rL8FBGr`P!;e6cH_(TK2m=xzfqfU-P>2ckh>PXX<*m z^4r?qzT~sP6+k6C_Q^6sLGKn=9%MD8tks`E-`g?3)y7X=>En+T$zN&cIsY`Fj@HAB z{>VZiGirD}xyl|F$(*7zOdhLdpLd%6y*V-k(5R+`vAbX3_+QD0~Bd_4DugyC0eLqp}2NIvUx9AKN8ZMGRuC~}H zCO*Dy2>24_+||eCyNSgdAc>jHYoDLrQ4KCtwwldw4b1va@uptxJzBJBf zKhtw|J_Ff_8FpA74T`Y;BC+0Qq5^5t6mzk~8gM`{SJ>9D33*-RKE%_TeI!fIcJTUmsLMnGtPH|nKK;kF7dv?y=1|Aph}1U zPnt;9^8&@~v1?i?Uuz(*faMeA3OS-_h;kJzeR=qRa}9<+Zd+e}kefa^IxZ zRnXPqaq`i*O8 znRF#2L$|Mu$iT!dgHRDj$f3ud;43EtYu+5_)0>rq7M6U4d(`RR6t<~doRAhbJ|^9B zJ5gp?A5v{+S!*ZwHGJ0{@HVf4B~)^eaW|6EFrZ>YutzWT1sV8|#OG`k&%d$}9N${! zhHYdT3KkX!%wadgYzQ+k6k|#+TiNr0#BKn{S*<>4oRm$FXEX2|l*+b*fN*RqC`! zY7LDr4XPBK;~&K%@v#=D)FF!(9xw^(V8Ir&W0f%6KoLSn^;IdzG;08EJ&Se7dF}ad zF>O3mtRDYksoBe;?y!E3-Vl6A--@R#Qq$r5FAk@K(Z}HfdvD%CxI{F^-QCktuzxuSaXnx zrSjD9-B~sU;-dKZ7^4wCrpGGHAbt!Ybs?dvaj0>cIS%%tiZqvqKAg5X(rWe{xihAP zeTTF0*u^#%f@Z-cg&G`kS+F7L-(qVXfji%!JobC%t21~L5$Ds; z9olv;MpqVHqeDRQBMROJDRr!|&#nJ@aV})pcZ57%j1+gngJjrVMVilBs>>nqdY`PY z=N5*Set&@MQLV1uEOHk(rG_vm33Es;sw#K$__u4)uRb5Iap!OP36A{IlaI;_fWP~AT1M2Tr8c2XXgY`xEESZQ3>#GR$xu=pBTmD}S~y}a6^(CHbLM>^wil6-M!&*T?>v{B z_R;9s1S19VIdN=p@t0E083s!Dv*%7 z)w0q21N+3ks3ACm5j_w%a{IiuH&g6*Q_D zJ}9xIygc)A4-Rcy{g_k?N&I!J>2-CN2djy?sI^CfoKDC3W*t@chl_7FUK`?27 zug5O;n37Ro;N^1td1ptfJ}!0E<`EB|y^CU+7z5?61UWr0D^{WWc{;<&)tv+%Zsh1)V&J@!Sxvvd)ozA4oFL@)z zS2DA%^>}}y7>1zc|HYlNY%fCqw@^+tfr^rnwu`omEw(A`fvwwamQY0sW{QDJjaaRMSN_wME@ zzbNFL8?G)%^Ypwiv215PUMO@uiRTl)=kh^mw{MrEr(x-~bK5>i-4m(+5aI}W>me)P zUKWQZl8|&M=S)=~1+vybaqSln>4Nc{4w5*&>X6nW@5bcHZ}rgc)+|$V=-BEfFYtE- zjqtjs?^G^a9V-gK{d9Ep^-Xb=t;0i*Bbny8h%*gsR{xa+JlV{$vaJfN`DAn zk_Bs_C-$O+c^U8>jkh=tMeIJDnzJ5a^-PNk$AItZK2M@y&b2+ikZ{8e?1-=6L(@fR z3kSrQ-D-~yXLO@!dO6-gA!|jeWR7T)3dZaTJD~*lH5ycC@>p28EdY_Tn2z^;xRr>b zRn7s@H)Azr_Drf}nT^8VgHD(8Wl07GGL#Ax#tP)gc9xnNj5%9tnS5nFW8E zPJUC)^?7=X7XzDX#b%~1{aoVrsbOD@JyIy`rUc)4h$8VnS<8+IBYX&=no`tp?|0?0 zEkmXB_pNx7mL-tWh-Vwon4^1C+D*?~kAht-NQ~l&7D2TBWc1RD6ib@Z{>(`g!Ee|d zp}Waq0;N>>Sm~AmXY18ZOlEo!0=`{QLjfM=1NQjrW1=2R1Z|A|r@AVO9pMqL1f+R{ z$Kj-39xrX!6tz8OvCx)@l)g&ix>?sfe)Jfhn3gFEoxsBI1{*`mw0UsMw8+EvBSqj$ z)Yw=rC%MyetZRp-a5>@}{yEfSN%=~mWg&AGx%hOjseW?&tcGTxkzXfNGEl6PnWC$! z=5UwS?{pZemq3z{CV`Gj%iwnnJFKLPi?k;R^Px>!8wT!5fNJ)xn>}^%0bf^x(n^YM{0#1@9pX?@>WkL&Y14l zlJ5>62Q2!JK8dw0)-3(g%SRsD<4C(5eC#JV|C#oR6(BTpZ!qr3Z<^+) zEcx++U`Q0y3^2acx??ko3KdYR zr#}lyJEdTR-}lk-S815o;)5iZ!MouXq4g)-Lz{Y1)5r&!H=kJv2p=+^=3J#u>WkG2CD zQigaSZ)P&%%q81m9Gm?rgK)c_qBhh)77jP38w?R3Tp~xJy)K`p44ra=E_zuAT+qIg z<8nQdD^VLf!mJun1L4g1`X3)$IPGUC zyh4Zg(cXyAr_UE(1xpLd_LfZA$xz^-C@)F@* zZpCUT8pW5QA}??jA$PP({X_$4T?LX2<_2#zdE#&=-gf*7IGF#$-8k{aRe)5^wi0F; zgHm{yFiyRP`0X3~Gutyl_zka@VQ%HJza391NW3RW#xyh2atkYW?~cf_-h;l&YAc>l zFQL`l`Low84sG-T&o?00&4OvVeV0KHh#Al*coQRKFCejA!>Ew9ML6VeIrJO9Ovb@5 zZHkPDGZ05e1$k4GrM`lMCl>Htm|IcLXhPEC{3*Mg>6!eVZdXHn+Ntu55J@&kQ_}6b zq(UZBf%>!x#_s8d^?FB7C_ZnMg%OV0!094I9lrsPf{&d920l5ESohj*RXjJ z(5R{?Z%5m3QoTxVO~WdBFK|D&gzYM8jWncETdf390e7ep*;`8!r>PzQu z!Vm6!w)faG_oZbMkD(AD5TOvps**YnG^CxRjjhw5`aFixVDtD5n&=}GHeb^O#BspJ zv$m?~ap0PffmNDQL%715IvtmE0;k%+~B=ee<%i99l)%`?mzCBps`DimxlIX}+-fAJ&=ie1{38lWn+AtSu~+E2mqcdD8XQ@k z9z-m^lzK5G6qOQCkoa82=@p8RcMYx6h@n1OhLM|IiaeuAbf9swTfd-=xMA9!p&nc2 z$Yg0#gA@DX8I56t9J|?DPobD{mt*7ivcj!Ov}VDZxPv$EXw?Y(UUMg)ljiyL1!vrS zddG2afOpI6goYO2dGi=%kgkEd_9f@F$p#ZP1!dO-}q;O9*Adrn&9>85V_Y$%mfQ2|32PciR6&x(l9oMi@;((GI$3Le41|QH)~eejDOAq>YKIG* zduuwx-Qw_Y=XgekRMk2ZH_gziU+^GS#E)%R;wWYjYI_$D1rma5zBS4$PBItk~FgZ}O6End9n=9c&3kCg29LBthv&HI}Gf zd^BE+wz;;4viBYkXVMH}c!(0yt9fzDf(X6F6UkKK0LpYjZobs5qQ zBTA8Z;fn^??{_^0-ck+#Y9IJ`BK!;*NPvrAp#fi7Y2cdXr5ka|e(f*k$9794quEN) z9!NCVTSPOdLp>XYOTSJPW<1f$PPk*M##sp}pt+s^!rYcs*DTnO%!o?GYVvjEBtK#; zsppRATVa`?s8{8B4`ffO+DmcVnq0#7OyC9i#<@I_4zWB!O-Xb|#5^#!jj=dI7dtz9 zjmfFMDNH9B?OhV(tvS*;oMlPujjL13P}&iUC?yz=QlOi2xR%WZVj+(ewG6tVLO2UN znQ8R;Wb3_k1p-22xg#4a=YjKK>fQ^b(+n?!7)|(Wg}d#4Yhz9z4DdQUmPphe6swy9 z=@4S>2Czd&MdI!z+_Cam2if2}1WM}_r?28A_mv(+e)#^%J zO;@h{`I_aj6c{jqAQzK-)~C21=(4}`nSY8xSSgBti5Sb{Kq4anf13h}**2rts4p6W4ZD^>=vIGJ_VHz8IE8a|h?m;XPn{S2dzIB_ z#`IGt5uhV^*M&w6V>J-V4}@i%SlmJj(m2Jg=$(+vqp3siYFzT(joW=_dH0Vx_?moMI0v@e~_)>VN< zmeAkRT1qj)1pQ+g48zi$^qdWVQPoXbcTod?N74<7s z3U*PceK-5;Sz}wiyev>-;h(tz^fIvD>fKxXrnXV%K!vM_KAzo*MIih8!jAU{KjqNn zQ}*e@U+kR zXoMFjmFfX4G`53TB7AeH>2yn_H0seBtQ4ZT)C@JwT8AFO3B#f7k-Na`DL(V?V-*h)esHGDMb)C?>gSvjf${9=ve8MjaeUOzSiAQ%-UneW zxyol}$}1gbj#10a?@tU)FY=GB<0}5#?@RjdoQ?7>=2E~%XvM*h^`~sSua}ht=){5T z`NlMD#EtNLZ?db5J{rbL`3VSkK)!fwn>qaO;O~CAcE5@rR>x*z5Z(cjaS3f?G*BmD zc5$`gJ=vFxwx8p0_gNRc$Z-g&j(VT6>h%hw*W`Zj>+Yzf2HS@E8X#5QERHuW=J7h7 zN9;P=<)yT4WK$|5>%k}-v`4-eM5x?cwx9=wnXF&O?ha8X%*=G5qFC4WUYlKhX=Cxd zo3R{oZ!gc=F0DG}ZDa2Za~i?hQIRh`mpiXDFD+S4yNf7Bovo}TUq7nd)Bs7%v3xIT zIG@Lhi1PYmIRA1Mq->cCpy#Ofat%<39&uZH!U<~b&|~flZ0%rHVpP8^YP{ZkYllR9 z(|wMY7U<{ttJmT=C;(g<<@*MaWu9o&lNZ6U>3h?%TkSR300eYM(T+Jcc9PkLT*QqW zpu>W<@C?*T8J{P^mNU6LvZ$Dar8o9rH6KSib&Q(2vC>p^&Mw@Ki?9tKV%c;2-%G*X zz4&lDfF3mXb9XDnA$+1tcR55J#PQff`$M4GYnO&K9F3UQjON$n3=Fr4uU7=g*zHWS z6sYVXZ^RI7LziTJK1*s^jOc(5lnq*=)|0urI;yE=G459r!pnyEu5EEPmSjpP6-~tB zB4R0yD^BcTk~QLia>UaJrypC6#Ooym=4*Md&TP`?Eo*u3jw(k%ff1$0Q&H2vLrggx zx(|qt8d4u#@5K}p#dSq$JlU;axveG$OZ8!Wf?Gl&!+Y^t;x=Ci3JY!4y-blnhd%Cv zq)ABe+kivot#Uz(HK~0gs`>p>D^0M3Z!RX#p%Lqz+5UsZ)ByM04-yvznnJ15-Mw++ zhwh;~#a9Wb3LlcqX<)cN&VN(yedu}z#mi;!GXtztq%x$?f6!mcj@_!3q5Y8AXgJ>A zq_TT}$geZc2e}Ump{?tIw4&BB<+Xi_3#S9kjH!p}-qDDNO-+hIz<#cnN7hA{F2Nyk zQ};QBj4iZ^a;~luBGpCi$ORWRWvo!!!Zhmsaf@~qb2G;HeXW=rd;SU!<*Qc-6^T7~ z;u!&LwqK6cbXD%7z!m+3!s*;j+}f0WM+2|?Z|mF>-YAOKFTkSy4k7Ae0se@kqh+Ez z^lgz-l+36)D*w~2<`&J)WL1o=`ddT|I^(t+`k|DI+`((t>gC8dCG^@eg2^koi1!fK zRO91H=Uz`8vNRhP@4p5m-EQ7JZ46!>AX@lasFdw$CI*DtZw)h)Xx797N=P$=D-_1{ zqs=M3Z(Hl3b_R~mew81|pbi0Cibv&SIXrXxqAdgy+#tdk5FxBHrVpO7YQ;p3$wXdn zdKxwLmV{|fg7ZUPvIByCGQ zek^vU`&2MMEDqzaMnHwTx&@MLAa=`zf(nj}$>T+Xqw{ zJPQso6~G*U%aAgpN|32@RVNkzZ@6k0X*k=0zi3wKQkm2H?wv(S-rZfWnD5TB0EzGW z{^u0&NWF6lqB%9SR&BqEVx1bwTbl_XV4<4`A!KheCoGu!^)BbWXEb3t5}f;^bVHmYl|fkH&QzF2 z=t-*dgVty(Ev6aQAdsbdgHZ9d@oSGyS8LQpN2L$^XoNLJF@VsuS9j`#KDxztdoeb< z-DmNqw!x8i{X5}rfEGh5FN5BXP!zfU+}``rxUnFq`UR$P0dw=qK9Dan=0Xv>hdRI9aNItqa5~_5?{!6ZRkWx4-QtRPeMfNM zusQ9@Kh*0NUft$q!>_iUvmd>(^WzY*PnN`U%C$0^=_`xQC^IvH|=Tt`djRCg&pz{;Et=A4&JKaTaAl#B-zk+ z7+M2EHH%c&5ayV!SkJlg9i@1>fdr=Xx8`H-PpK1Jic^EOK%tP%0YqixLQz5QB8GO1 zGr~Y~)OyPn9iYoO&Wv?*vm=P}G88CgRK1S64{@{-KzL=mOWZd(SIIqb{o&HLn1JMl zfo6FP;m=v9f4Sd)y+rxO%xA&G6#!Ovi~$}BWPtU2WfjMle&WLwv?YgRi)Fb+;Jz3# zCK-3(%L9QG4Kylr^QVEjvs|wlu)$g}fj~|-QV+93`-|9-QtF^PjS;Fj58iS*oyJ-PkoymZ zEg6dz0PeQOwmDX7XSg#{o=r|kDM|pAeRB0ff{IJlav8v_Tl*Syx<1lUt1Q7#(+F?f zGQuL2gltt1JOlr5ml!9sI2ybcgr5MNIidp<)DPrUe)whV-d^%8`J@k~ku|}goPEiN za6dM&MVc}>3Myj_Y!yjmWQKL_vJ6~w4GQ%!4;hsd8F>Nwns&dXb*HmCXM2Np9 z>7ca|8`a_c_t~EGwC&sG>FLq^`@q}W5n?;BH2kNKD$o9{PwOBbR_=?&2{Y;|jZ%Lp z1RDasrz{U6)fgwIKCL90b!3FFOjFN&)x~uk96e-Bl)4n4vGp>v2PWKh;75u0pxeVr;tjoY+ z??BW@jEyxqqSe-2cH6s9*+YMrfKx( zCvrMIwvo44Xe{TK=DKYyG^fNw6Pc(>>|tAZ@peq<=nyU~(oVKXFV{)<5)*!mVXbcm zKv8boG`IMi_c|iPe*DTY0Es2Y+yr;ntURYRGopqU2x-|HqFAAUv*D#Eh5j8A*01GJ z$1t~sja@0=nqXo=B+A($24mwHPIsQtX3vS+_Ay;sv7dGXik`~MQ-^P7vB_cgZFx?2 z$-_X*ax9wCebfNs4p|ufgd*&CmP!L~*-Rf0cr*sw&2CV0!Kao*Rb=8w?(j2_jFHDN zU7wh*Y(K0C38~PCf1lDtpHJ!8y$%a+F?>%ab?f3}k}gXv1k~uzz&g5j|LO%mLEn_C z|KO0T5%*y&k6K8GyFul`F?p)Xt3k7L6hKV%I1EOZc&)lE?UAPyFS?I2m(lLHA0{fK zjSFW4>-o2VjwGx|eGSlZi2)%xi-*wwHtekvUA-w%5gzS{gjM+K>D#z@P zXRye%ELJPe!lqGp?~Yp0#+K$KSlr^~|OSQ$)+qJBGNVF~?lwA-&o zyoxrr29Apuai}>c!EJ*K{y~NO{ojiV0dT8zzIvJjd@PN!LYjv`@kY`bJ4L6~ja0KU z&w=Vv#!}sB`#9QNoM|^CeN){y1w3_V%OyRrT8Ie;_KL^etEv?EG!9B358Nc-II*6k zjUD+K3)LT{3CHYNe{lBi(*e9J}iZFER{wn(y#Ckjyb;>klx4 zW_9o7!Ff|-1jnbEB~B^g<|9sDkW0lv! z-sT>iIwhpPoqFEB9?hh?ROuYYc(6+2{OGo7It>%UV^Z6-D&IOX=X@QJVN%<+rcESmoWIAny(wAxgbsLLV;FcdcqoXpYeRpq zpa*0tfglrs;MaB_Bap`^FQ|!&yz(j|43(L8rU~g7p9U3!7lS~@u){S;eMSFd8_Go@ z)nPaqfvM$ir=4WbX{Ca7H*b|iu!|i2YHk%qP8~+RVSP!gI2WcZ)S?VZHW0vwXphmw zgm_st%Md_7J3m~f_SxU@MYuB3*b=~8JqE4{=g5wHDQ-=*zF^VhY8D^{a&B}My&=o0 zfox5pD0_(U4q+blex5DIKv!$Q`{>bZ>qrf@Z!nh2dB%#<#oT6uNRs@JI^=ZE3?qn) z-n-E9))1sunU`3A4Vf<}5&Y?w@`o_RM#!J5a4ixUgaKrqKMs9YZ0vTKsv;p%n>=G` zHevdqbG2hHsfiTUnjNKScMejs@EHS`m^}$aw(nn!m zuobhyw-$-Ak#Kh@6}ct;e{+R#pu z>Ak!$95X)~;6&K(f`Fgc%{C;9_M-5}d%P9~S?j#k+GG4mpIY{kuD})dsPWP7zWmgN zPHm}y_ST0~$nkLi?xM;-jr5D?cLSi8`D5F8LeIwI7V>FRFxB}HjmXpZ$W}iG?Z%1= z(o2H%J0sO{t_A4yjy|mP*r&o7C|0Ex@Ht86AsC;$EApj*m?N3HcmUyLCKIBal z{`zLGy1QrAn0W1^<90$&k#%=>7MJyg{4Nv{45aO+Wbt~KB{zL&0}ydS+k@4MB#R}q z8;uGr=YB}nwc5m>(E82;7j;sI4HK%^(m{WsS8q(b=qN6C|29!8|B&eZ^~F#F3{>k_ zt|XAKq3-0aC2fRuWQW3qUvc_b?_^O3xYskX?b&WbJBwE~KKB&Qfam1NJFDk9FP)}k zRP{o#2yy+3q^>&@@MuP2D{g>Z&?vSiEO24xE1+m0!HUP3)+T&Eo&$btDUMOS9WkW; zDB5fZ9J+TGd|PbY(X`yGSZ%$m?{-1jEYWqkk&|L?BNi#ZVJOi(#C<^4;el`hgZk}? zANle6{uPoe;A#soy%Kg8F(PR-HI3-swm;u4e+tdxDxoK%nAoa~N94r)ra$EERLcaP z_obLqJU4iyvzPw;bM+h8470#%oZIkfTE|wY)WW6Hl~EypYARInfVS?}S=MX)LimB} zr@_bNEs5Z$fN%Bp%hONsT)N5O@_8axxe+7#JMy-HFuGm15bw>|VOBcal^(yN9h$VC zWqQrWw<()2kU)wn2crytR-{2~m{7Q|w#9tN8r7EOZkX3^!`J;ClwzGMlSGd3sO3t2 zOvn*XG{d)^!AnlC*e7X-q6ckZVINjfFZQzgZTO5L4+~3Q9--hijwUUP`zu{aRuqS=(P!%b%;c~Eag5-51k1Tf ziRhS^5-C_U`^d;hQXp3!{fvx@dM)Dl1OL6Fp0nuROM2e}6m^6g(r+gNb+oQza==Yq zH}i<8MMe348~i|yP6@uhIg?CcF{Y1zq-Ukps4R%3QymT=CN@d1{QF2rAs`f(q+MrQ zmQ~DJlWje^IE~ta*>Gq-3LrYe{`V?bBW1|hirs*d`n90e?{u(z4AW>~=}4P#e=B!= z*5%j;fZYqRopo|V0QzsKlr|e=^!Mq|)kBrL{6+Ntqdpl>x6?T~6y7CSqE+tqi~%83 z0wV(omO5W1J-!_V=|jM&F}bNsvzOsXn*H#fBDa4(lafJfC4*i*Yu?U4P*vQ&eyfuY z4)Wil|Mds>{BN}s?&ks7(GYkZr+)49K+C7uc{n`0!5_cf{C$WGR z1VcR2t5tdp`%jwkZ_^@edXA9ljUWFkw-W@eWy3ZaiC=T~kZDM_x9Y(9=d=VN z%OzSR;m*g149`A7jc{9|z_?*9tP=9N&pnWj{EceAdEJNxQinSu;V?0mbcT@<__oMt z9RXDJ0hhUOXTpCEuAbzZfV!Q_W1>uHXF*M^*tsZoJTir)e&Kyq|F?DgCNCj$qoW|x zA`sJv=L*#n7K&Rt4D{2TCK_PjNPPJR{q~=PU6KAX^Cpk5#fsT zHn_yHQvFNd|GiD{pM8^2;Zrf{4I3pE@DXjZ36$A;UaK`ce4^JDF7tD}V?K8O2bI?% zK#l_2zLa+3c+yT43hG(}h#C{jEqJ#6ru5vAafhsBe<~;bFvy>0t6;0-)!7&xinei5 z77!1tEc4Pj-I95;G??@St^XTCPuP~)f3qI?9dyQ-&=o6!qsVsX3ALRSb#IzT}#jN$U)P-~$2#^Uhazlrv*KSV$f z$eDX}2#)W!Lr!SzY^YnqNR}>x^CkOA6rEXggc`lyxi0>L2h>AAYnXyP4p{UYzTvnd z?}Wkicg9~*;x!o^eaQA_ToeLZYW>q-PVOaEtDcWx|MBVMg>c0btnm-uqWp=HN!DHQ zQ|@?qkz{PGpt5u$jS<5pr)|XAc+k)FvGRECADdG_M%s*qn6r}oOje7*V_kf7G zdRm_*;g=OxJ9m6C)zOLqGyzBRKjj!GRRu|+WOTT7k+&{nBE6%^3I0X?i4{78GA*78 zmM}WAjG{l&@X!soDh^9?M_pWrvJPY!9c857Js}isJ(+-a8Sb( zK8M(nFF(nMXJ)n@@!87M#jtoE3)R_uttkhgoCJ2L)EP0F>(G@=l*DR&iyNlM4fz$@ z$vevjMShDi2>D;C0UU{tB7?!@dR}Qc@1XEF>;BGL+eOM-&F%e^wTrHXH3_sRd%5xi6qAjp}K>``yVu1$Ggal5amr=%RlkH{I@K!P(T1%rpgrt-CRTU z{l&hffOYt>sGGwz#0V(J4$A-Khre@`Af$RI2=e8-t?a1Qr|vPil@anP=siVB>X)&a zJS3|ueoC~SLjU|pxg===q8J6>y&kf z|0b*@`u5~;EwYWr`~DaDKi`${hzf&W63ufpMiFm&i8ESwD=poK?Y9$y$#Ipq~fpqCTa@o-p$b++0t`lK+6IqWJUdEqLZLxovWt=h02*^kkP^! z02X-s7)a}w-PpE^8mIB(xE1{G#l24yytJf=7Arw#iax50l}}qy4oNrJ2ft;>dk+3N zIY764htyY^qWFz2_z!{k&2jq}dQ<*04W=n?{)=cpel`p+{qn*C;r|eq=j|uGd^T+! zSD~zb;HCeP`rqsQS6#vE{~EQE7;t_Jj?(P9{~`R(|3qg4tk-)K2A=;l>I@lRF!vW( zhZBE8CI3@}0xg3?0U{P;8u$FKQ9YimX_H4c-anMaZyHQIuY|2~|9_2Y5CM>&++~FG z&#C4=l__9q@t+;Tz<8qnHR}GejlMj@GyR7?{cVx}M^{*A;^&Y5IV#_?0bk-<5B*ow>G5yeTR}m=lK)C4R&*NVeqcE)|Q-5lo#9_SWNubwGS5&d?d$s3c znxGB$V<2;V7H9^*$e8|80uqBFk|A0A@e?+U%1WgYy}QQ8I4%kl+O$}cN!j;~DXzPr zK#sb8zER~_nE?JQGjfVJ4Jno4={Pky)YTV7a&RTO?-9SjEW2kOD)GRpJ?D+c8=qAk5%M=K zA&%Tvwda0sD1ENqidL{5gEL-12@e4=cixo{XeUR?4&Q1U%j2oJ^>Afq9tK8hBOE2qk|uwhN$YYAaUp{%CD#Ou>xy zj{JcFW)sh`7b1iEU!i{>LwKsL@IWmSC26A<9G|Kp_L3wQ1{+;^blr4OL3pyC;B}eC z8BhuegOiXX|0t|1age}yL{6;9_jYO)lWFou90XEth-My^igHj$51S$uUNJLWGlZM; zv$ywhrQ(Aj_@;VHPH(ea;jejM`0gE##zxEUran`%6AHpJ$f(;G-qyJJ!YZyjfChDa z)vDKG5EA-Wy~{Ly0R7&E5(VZ_O6`x+k1hf!Ci^mvXTKSo2I+;<-~R03V36Xp;@O17&j(-&a|WJLbG(Z4CJ`s*%Swt zH4GO~fVa_COmC1?@ezl=uh9LAHmz7KF*J@lUodr?B_ZvkLBN}Klzpip&z=lIs%nA! z>{RE|suRzjk5F6PB{sCX9g2k^=2up3H{3WM+~sEkiVV z{}yrpjp-$Og7>PN1N#{pBo-QKwr-Sz7N!rGhy_zqp(xg-B%1qVE!#O=Q7q`WjcTNqiQJyeSX$9KQy}j-u=J3AIB7c)G?tE z1H1W$o&N7BsPzomD76t_O8XzK(%+f>Kc_~HKK<-p?9GpS`R~&(DTFSdF0M~kF#hX( z06(z-zR=q3<=NUFCGbZu{(81PGkr6!>-&Ft^uW9AqyeYp|IoFH24IUtt$?I%rfPZhBqshtx*abu9G;>ukHZAT*Mw7S*x}cBRCV zlP#4dc825+K%r)i$hc^?GyU_y8m#szQk%iAIbT%^Lq!3nBoXmI1RDjy0m{fqxdv!MCEUIg%-{zB5f z;ySt$@k4=ys!e>!6p!t!Yxz5zf+vz8+~j$BoMG_c293!`BYb~0XNc>@Xf=CdV<+OO zm*DKubRySQ3$r&Gy8X_`L;|~!`Y$;QCVp@l*_2rJ zJcIwIy|<2wvU~oFy9Ikyv`^1wlF#q&t_| z1(sM~iQmN?-_OVU`Th4ie}4IEUtD{gJ!j6$oS8W@?_nIhQ(yX2-s`xJ+=2#whbn9h z-{VjtUUEzk&|zV;fUrF1j+g#hbOYnsuA{%}GrM|f#MbwQLyfM#J}arwYIb5-Z&E>b zEpYi<;A}X%VYpvDE?sFP>4XO_?WW@t1AZsZwd5U-AAI|3gov-;=6iE2nmQljw4?T=~V_2ObWDLv0;lUak z3%)HeD_IRrA65Bv^G;NfTSNo2#Vx<@kmvfzLa)Ry5CUFCe1$1ZV#eG-9 zDAd&xf%2^{c0AlkT*(QU;>_rSjh>%*<;@xG2&=(8nTVxnY(2JM2xdvG%hT zMZ-Q~NzI;g1pBM8^*bo^_)6LZxfqOyk*ops{vN*_&FO}$N|;=Te*8YdBjVM%jaeUr>+-NP+Gix!fpBxOJW0q=f4I7Qrk7$(wB;O{ zB(Rb&ymkO-bt|z>V!zADa`Wt6isROFIM>RJ5bUal;Kn3ZAJgeNo7GcU+l;p~g(_T}_$VR4%*?e(3dTYp~$F&#gVWg}q?TFXJ$GK_*94^5bH(UpkvA zxOu*0Fos?;Zc2@`x4Qbc$I&f{f*cEw`V*PI%>^(A*~vb`9u8D;W8 zW9k*nzu@VLIL<%J+YM0HEjOfleuv-t?TC;a%`aHdEdMzw%v%Us7+?1R_#I;)`>`o% zIQfogk>8N?Bf%-{K-WfWsh*`;5&5I%#$H6t-hL{@rqezeGQnSi^FiXJZ<~bs_+tE1 zxp#TR7E2$@9A_r>vAUclZ3k%_p>VA@Hs)AM#H^mH-On9sgvrxP-M?_Kx<+Fu$}y=!Pb++lXn9ei^miXEg8mOfm^IV^+A4{L)vTv2=+jV){G_I-i2u6-iVQ5fTwV zQbKp1>5JtA;Y`CVhjZs~c-2OCfdzWk9&asRV3Hlcw$qfX4txg5QBXyD5p9(nk6u-WF@XBec=ap84+{;O-AR_!iZhS{NdfB%R z%)78_q?>fz#G&pyTq|urO;l-Hn4{lkTJV`8t;`=dOKPaEl>4q)v#@jTR-%o$L5Nc) zp6AXc)kR+x4xZuUC#3kepPYHOReyko?!Ne?<=O%Y#@e5+l6NMvCgyp#`SFG{zVk5O z>oH@XStp~U2Qt~f%(qP7sr~V`8WrP@S3ugCTJ-_V)&rypV2 z^V)JUhF+1R3fbfoCI;gS{p9oAfvFBxO7 z@?C{`2Mp%Z*nX^|)Xw_Wg3kZzl1{n?#M3hos{+Efp2Up2;Ed)+ez%Bm9G&&)U9o?KGa58+eG!u7sy{k#{;57_We4sjyr{n=N-6sl&fB;D4- zDS20LAu;X=3LeY1%V+o9@W;`PPv?8uF+r8`bTR`cAq=%|mKT2NLQ9%QYbF4j`KO2a z${Pe=cX|$0DlZ)pKM!S}bkxrEHSju%^Er>i{$ken{9~XRVcqWJ+PGUA3Q6S_Tbbt+ zmppjiNb~p(d7?IuR3e3$yciz=K}bX#QKA%#BJD+H14nPz^hoc$wxZ;S-N1B`6yq~A zV{|pY(}IbYvMf>{aGnZ=vzFH7kxKx6;rZh?Jv5MeFHM@v@~#NTAXty?0o@;8;LYxL z@q$0oM9bOoe5J6@m+?KXT1NGc-nAM}tpc%1Qx~t^{$uaG;qnj6Paa^HLqg3Dn0far zk|%UJ$v2AxV!Yiqi<22ru`BUsiHN?yR-LX+SO@LAXw0&&-o@m^Vfit!uC*1_^>OOI zHC}E0ic};_VdEZpa1GS@#F2&XFPv`11G34i9mF#%^uZxT{)RiK=Y^w_N~Cmn9t<*3c!}?GFTCrI+wZWDsbPOgjZSS= zFx84XC1$vY<;6jiBo43+o4j~@OfTVZ)U?VFz-kCYOFvA0iyQWrVTm!`%4Qp@k-E`O z+9)bObCW+*;~_~q&4F(U*{5bF9khs;tZlhda!A+MfwF1R{Ew%U7jA!;UiLwwT98`~ z?5jwqdw+fV`gVtQ9Pb;>P8-=%Z{|tN;&!P@AU%%3K`ZL(U$Fy$*tT|sdD$e0X zk())kfDz)wRCF zc35t>6Nf#kVodSW`Z&Q7H>Tj?gI>VWqAg4|)M+WQ9o>@=3 z$M}noD^s>93FWN5u+ga|uk{2{gk*yRa4h!XYBZPv}f61A*$ zT+tm$IAmb}a9atgOq$FI#WujBEySz83W+Z6Uwrk?F?2x2LB^=Hl&gUJSuTir7)>u- zID(>!QwSyLm#?LhC_Tm{Rr-F>Vtw@R24AiHrZx&dA(P%}SAM&$V)%)b;poNQH}lnx zp^CUVPXTG!G;ji3J-p^ypx$$w2$K@~8Km?FJB4gUu)4bWW_sSp@q832mcVdQmot~` ziDc%c+2^2LRt6~^KK~`e*xHzAB#HjA)@LmZm4}~9+1Ir&v^OlVQqRs&DIEe81qN|S z1f77N@MUml4mF-k`SdqrNdm^>< zhGTujkU7&tjwNKT`J3tvX3CpedS%8xe{t_rtzyY@QE?kSm>hWkggBJdTS|cv zbI0@=1=QLQFZ3N3x96Lvqf=XxcxONOw;&?IV{U9mvc7g)z8d;3 zT645zo(ZcZhRTXn(|(pulFD}V9IM>H@?+st_>fXlj-Z3Jm6XY(Br3DN8+?#`4BW?! z&aKz}bt?=6ZS%i{NO$Asn|q6B0NIi38hzb4eg)dB8t8XvnjK{FqJxl;JGbJE#T77V zRX$K3vR(j06U2KHPly42YC^vvzWu=`@_9y)W{$2aob<@~UX{r@o3p+ZO<+|d50i~Z zgI3v`ldFblahWzci954Ha3*lG&-^v@R7;q#^xLM*8mm-KbMt3higNi<_abi=e*-+W zK9QvO9~2!}4u)a^a)*w~^f`-daib{Att*N+oCC$Hrrg-RXt|HFpxg_bXjz%&mwyK` z@Y3XdvN**A6~H_p1*BeWjQ6iy(TN3bXsHSGQP^~)fz_`6Rh#*lDj!x>LQo_UH>{6yJFv6~ zQ}OEm@Y*cyR(ie@qO1n~16>plM;~z!C)Z3qS%b-!lC+CCq=h~)jGkw7{ndCS7q8Gj zAZCIp`C5Cm8?9=_d}ICeO!RW0*ZXqMe?v+wTM z(SYbC(LO#iUddNH4bBn6fi>}V&>Vh}7*_m`Ub8tDLmvBoIJ+maGc_^Z9=zdJreRP! zCRJBWA5%>Uc%)V17pr4`ANL@T_}KKB2Ewpksk+rUYp`GS6zMFlR)GECxX5!fxhz`| z#DV!($3BN4r3DP`j7XlJc zrePbt1e!v6xge*6nMLR&AAt4Qv`XxQ`aqxQb7@{hpza3>(3Yy}%3pkN<6bRhq~h}I zGNbRO8sgn;@rA?3l-4Rq6V}jCtp<39naQ$7k2n;9%bga6_22y%t9WLH!~g!B^sd=3 z$Vc+xti%dwO5yW7Idp`+WX>_IN+&uCk1wi>J_mEcLN*OaIC<4s@^_{JkX~c_qcN>0 z*Zd&a0oA+HkQ_v>3g7iRNwYapB;Go~Mi^B)2HRXbg3d8YH@Ul%RR>&wQ~AjkK_E^f z0PZNwq0lbL;QIi8GfGYzLa@d$+4j=>ZmQ(EZIKtNt|vTK2fq2%_PTb6`}L&K$6<3e;?j^F?94 z19+|6!;v9CjnIlXkEd>%>jR}|LCyPF#O@Dow(G2zxltC;Ljj1$U*hlu%nOqO&qKqP z*S-}KO%Oj>DRhSLYz1hWZ10_J4>%#0hI{4FkyiF4wpFi*Ul);r40vu#k z?rG_G33~S4VQ8>Xmv2%tYU-BV-_pyG{F=;v-f~p`i^DRzTbQcRM+rzFQ?2_tfbWQ! z8V=1bQ{~xYlfDlp?bnKZL-p+VHl6)X2cl$~rywMuVb%K4KQ@RmqY2)sc7(K#M-%^| z{&f@}ncDp*Q;OU#4NY(`6xlC!J^T_N!Q+Ed8s%}PQ{NNaVc=LKXyS!1 z6vnnCo5MDx1t(jm`>&Wl*LA(h?!V9(UZFQzy>0Vy9v!h71+~c^_wd=D6y#IQ8=upL zb~!Xg%+ve73^Eb~Y?A@9z|X$Q1@edSy%QCV2F{s#Kv3qm$rPo}l+nV&$gB z;uh1*0-y%}Mt2J``H@S17HJQFDo;^12^15nUK#)u4*;ZZWb?MX*JT0c4NOD5rYNUg zVU1=BIqzHCcLm)!UMd=ydjWV(p{TxYW(w=POYN4V5apnDz;u+K^vOkJpTAc zca3qE@X3{NL08y#VR~$wMZRtU;tkav@u?J;_nA|xRU$Z6Lz6B+jiy!hQ4p|DY|*!q zT-Hd-Z=*~7m_C(DtPi&!4I8duI-hg}@39_jwk++~xz0s3G@cEY_(Akiwl7j!pL};X zeRA_Iv&FIWS|``wgJn^z<(NQp5%;C%Uid%8-b?JoWdAD@=GDeH58NHs_Rp+A#6d;N zg+ifViF+=#vapA&YLsZMYAW-A?3<8euwRqfrZ(#}rbzPJ#qOMd{efxoU1q@+#pV#v zg^M0n)jOuy4@buY-UE&i5Q+}L?k8U7IWcS7Zqa|_q6*aeQF7Dm3w(*B$JF}*eH=zA zO}N~g2>Y{JFt3i%k5H$XPB-V_5fULO_d3Kifz)yUu<+z!uJ2Bpw8o8f+z_t{fm`Ms zIxeq>RWFRV~IaS6O%C7aKoF`Bffk z6kd!{F1rMWc7z{w=a(ySgW%1v_XScJV>Epexfy0nyWGm_Kcql-Y^}^rfLPAg;Zg0U z1reR`k*ZsUEvujU&afajs^`}sj7y|Aw0CXPl~l#OYJA?r^MB__M@|!RvW0y)TE==sP1wlCK;78ypb+OHYsQzVIE& zGAU`a(%<8Jjtk(treKs79<wfzf0F_%_RXh;* zi&+Gsu_*K)wL7+1Q!O6z+=!VPe)nK=Pdy?OT8LkF=s^e-8o_o%Cr>x(V!KDw0FTc2 zH7ZdZ4_>3M$Bj!Y&zk9t6>D;eTkUQYUJ? zyLwKmxsIs3bI$gLOAhE!P8pQMZp}t0MfQMGpLc)#d=XC8TRElIb$x@pvU|hkFWV;e zJO1iWmbtWB>wY@ZZP*BKjB(6KK+!wU{tzl*V3tC-~jqPLnx9w$1l|X4xShE|Fvh|!C9%ou` z5~|a3QU}WXr$W6KyF2lNy-S=U3>UkfGF=Gy&F>H7?G$0{W4{}%eS?o(&PlQP$g#Su ziIKc&1H$aGJA>q8W`1-F(=&U0BRPu>t!Do7(!A#Z_MXsL71(bz?Je3{ah>$oC0E`5 ze28Ups@AfNjhZIh2EtgyKPlPdKe;w?@tNfKbE=mK<0F{V={@8&pZ+7f zpv{}6%uX8Ky!IUgFLliCb&U4)#0j$Nh2HAObOX`_v(L=L+^Yw!5EZI8_tQ=TnwBeS zTDoVjZb-v+SBzdE+!w6y!PbGo7ap21nct+=wgGVNnjskMhqPLd5pECfPk1E{>KL61 z9rL5to#G^0vDhG-FLrbDLss+NxV+ofh)&k~t3o3dAHU}HxU%(d>O(@REAHKZ!!+)* zx3M7cy4;wiy%oZRi%!wL!g)N9BMa%# za6M}F8r+V0lnqUtJ3%;%OygED65acy*Z8hct~FEAOy=xRZCIb!dx!EVO>YR@v~p-2 z&kLfUwu4`Y3Wz~VxWHobo4E;~kae@y0Lo=lmLAD$b##7IY$7Ay0#U$}F5$~A-=0MuBR}PQwwzL!2o>#5LJ$~i zpGJH&4{-zqf7=lC=ykapNams{Jv+RF`YHLD;?Ud*EFdM9i|!M^%IlJ})jH1I(9CYq zblfu3mlz-16;I9Mk@N}GOjx*%I@wI%lC z0=;`>bF4Dsq*{<&(q~c(`Rk@pnb94eR?LLeojr#{aG~Bdg8Ry^z<#E6bQ&lE<5h~G ztA4OY#g)$TB!V(-830`*c&)ScBzE}8BT~1o*9{ns-t3q>Tn;GDY+$h|&jf|k)(DWi z8Y`OO+zP!em&R_V@jz%K(``-Paaq%r4cB2Qc4mq=0#Kg`n{Pj0?FE{(6%HD`u*MP2 zzE2fzVoPJCmJ*M$>Q~+zVJ#K^<4v>YZjs!v@Miep?4u_mZq21q`X$u|st~r1+O^Mv zD0(tX3b+Q?@MKP|j*;;0Gq6WqLTGVhX^8RPmT@) zd+W!qP9^#HE_U7*q#CbFv|hwq?g`lX^m`o{U3pS(UtR16OqY!WtPR)m#`LL3H_t9)A91`b_4<)$$K5Ax!!6-pZc=ioo>lCI{ z^6N2gfUxn%{`#PHTZ==#PjXY@pMU)I1h~ebAUF z|5V7{Z;a>*?VJ6g33UH7>CnO}R8J}{Zt4{cw4Txmkx)Ir$M>Wd=& z-^|M3ed=w%U-?Nn?$+O#%@^U~AB17xa16`x>=4-2RjdY2%2Rc+1+ zV7SWB>^zzvWRvonpXoj*zq64NyiLN3O3V_^nZ;o%X|@Op(@prR7Z#u?9^ z$ui^8VDjsK>WMrDt`Vh))}g_>vq_0GxXN>tzSF zZEj5w(|%{dBNNjF&z#>o5H$1gD%~m1XnTO;tC<3Qk!v1jHqRRlEY?G9v3+ZEPJ+os zA+YT;w&Q`#!0=__Y=KV3#LxHSrZ@;#20NLo zk>koK_T97X0F)a#3R3^H!CU`M{V-_1g?3?-a+qUJ_)obIW!ZB+S|XB}!S0+slMZh*Sk$YgaK4;+KG z=&nGg(98IkpfdV#Y-FCCFKJVTxi6f8K#`E=n)}2m+VaLoN3MQhayD-Y(qy+i!|NQ5 zKS^`ZONL!d$Rb~-vAAK_M;6`u)#yILHn-je`SDWK}e z#7z7~TB^^aJt$`bYZb`!m$Ydp#ZF)>h{Li{g-L7_=0#=8Dn$B*C^MP8fpDvW_ zOWRFRXmLym-Ddi0l(4Ix0q9kqYy;<;<0SIt_@I6Dpp&$>DG}IX;%xL+s9l+(fgpmH zPZy){I|cEVeV)geV`%cUD&`bPuSr0w&*(_!k6vw(Azo@5`oQkIfU`VGylnH`F7@t3+^E7Oz79t8*WUoksWD~ z@j>t5zQYD#BSQebTzRg1zNg`fz5JqmS!F8#G2FUyc?yw1`XfXcjNPa)w;7$Ef}MQV zUZB+$e38s#e4AgioK-k%|0J_M_=Nk=L-z{mQ|&$5BHFom1kI+OH5EVROaIl zitNsLpl1~N1-qz(v6APMzHx*%(M$KR^`3+W$)8`~%A((*%`VZwNZ8e}Et+Nl^Bg@R zE4F#LxT%8PS^Fv}*|fEB%;yjK5MR) zGqF_DHC=&8z5M1peWWRhj&Tb8E+TOQB>Iqy^w|MpEe)#&|20QDYr;wNwE+$Cr_5cG z40vq>hk_valB7xIT0s8uq#`)*ar^&%`+sTjH(UI_;u9dv38#ckL-FB%Sz3PzZ)F=3 zd>WUJ!r0eK;J+F1T5mNyaJCBxQqYw}5|khOhe!Wp&#O1)B;G!@_F~SRK;eK`ALWQkJs9eOMjt^af zzfbk=k~$FoOAY)1c1O~J?gwO1&2*9K1upqHl<9e5&Ubn13-`9Q4LPqkEo)>_n-2> z2aou;DH0QAm1@m}pNkIBAl6o7MeCdW&dPGjN2Mlp z!wf6&Awj1%he)LvvS=)L55BL!#PVDH&Jg8(6&*iv|1|`%Qf|P_a>yvfo!8jX)pdOu z+Au#bA8C&irfSg5HFs=ln0&%MaSZd{TSKnp)kR&4m=cBkh|Bl6u+BZ;%cvf?*-0vsC4Xs}w2-c$AML-=5@?3i=_I-^6(>2h(w zr()^Tzm|o5!ANgT?K<1oIV-x}wwCKZI9tz_2`%4*uNmh$U4;ZWuuFWLh-#ddI=SX0bjuQW6D-EzE2kTSLf>h=WH>nvUhj^8wD8O=Ip+F`Z-*7d;8tpl1qk} zZ3)&wYnZ*=1hO{Z3#4hyt!Xzu@6fbRi!9B?stYFmO?@F>Ov`-;V^YUoVZgu9I6AR_ zkhwTCD>}ML%k1b)fVi=1w$7K)2Uw6p|HZ|Q3XJ}Pi-=LD0@y+}txUGc-p_;_&EXZy z&o9LGoMfd`L|g8wq6t@Z(wvNm3gunlkMV^d@S`Ww1xSvtPInZ;45DgYj}R26GhHD3 z5l!c|Fs*kW8i7;He&Mw{1$npYi?Ty3x%wO}3eIiK@p+Ue;Y-a~RY>@axUt7*o2@VO zQ2k3MPux*X_yy%_te((3=s*vf`a&f!Cz5khB@FgNm|n?+jqH{bdgE01g&PXis?kJ@ z6LbdyGKtsI8lJ1!1&I4;h$@G~`2nbrhy>>dhUF8!#*;&)#oZ_{$_G2*msj5d@D zUj>Nk64?{5w*_tVkUfo=>qxn>6U+X$WZ8lE82oE7Ct0wO7FA%UuI@EyZ1EZKe>t_? z{k4K^5~`f9B&J$sb7)L;W^Ab z#?0Ribsn@)`lzj%m1Hzhzdb@msZWV*@V^8IG%$eF`HC5MkfV;Z6CnvE0eIsL=*VUoC}GAEzT zBmC1>hwtKl*sy=g=w9rBEtGJ^rW;Q1NY(Iz=M;CY@8Y8$HN4(3^7B_!q=J#F-lB4@ zk+}`?K!<}16YOow_-wk)_@e^NGJi{HU5rcf@OD3mSB`CSwr+TGbmLb#TWQ1wG~NH{ zZ|9JhBG@9mWvYjE)Oo58a?wAD?8mm-H@>A@`IfF@y-i4j;zoLq{HxXdGY{*YP3Q#1 zP7E?}oOKvQQ)GFNUMBX_y3Rx-!+bPyo53}>Q2o@^(>Eh5Ajm&K>Jeqf#`W72ZTa3+$Oij0hsn{r5*Xt_(UY&^a`E(rf=y;dC1_%v_f z5d@=8aFkI@PX={a-IDt_L`nGBt}HC}@!Q91nIo?snNtv*d6vGsch)}(S+Rn*0(4M?Ukfs?eO#J|UwwY3Cm&UdUu+VAV|NrJfH31DTkYu1 zx@G&ZRUcjS%jxJz@W{_&rF@evuHv7WCZeUkxe<%mg!Wl$#B>VGW}6jbLh06hQ@Si0 zMV~nvDDeqQNJ@o6Zy#t3>ZYwE?`%RCSM@Wd*i9^Ib#gzcpRcrK=xi)yiZrI5&)U}s zYU(g<;P%3_Vnw^>_cC}R1rs? z$F|5=EG*0JcCHirg?Oko{}*_Y&ZwH1P+0T&^L}eut9}=aiDc>b{~{7FsZ%!aTg%tN zQH5#NUoLb_qrL}6Wm0fdj!;jJ*=_KFM;1IZL>`FH)@s(Dy@5Y&FZa0H*`OJYE3Wl< zt)~04oDt*e61)}OwQv1d0I~rm*{ZI8vV6@}*3D;cl+|{mIzQ8?E$F3-YjfQaZ;2r) zseSp4Y~nX<3N)eOmpm;=5kO?x6VnvLnPuoVNvqH4I8T>%e{@4~>r5OS$LhL#7<^kJ zB2*`8xVdrKDI#HgQ<93nTB(79n*En%U551sj$u~3sxvM;OUWw<`FV@T?_yqD9>)lB zV~ks{A%9px1|_lTE2*N%Atw#n)d>{`bKD=+c)!bZJuV2YamtouWr=r94v5%#nIH48 zMYns6w%Ms*`OIW~7CN%0UR|VXuhmfRAw{N#o_yx+DoIdH%k6$Jn_)UD#G$CCCNQ=O z8IWRrlJuThR*z=7b@3xOU4K3-MMg$M$4;9vEL(<46yAs-;rdOX)Te-~-gpib$KYFX z6^PO(JYrPbTu~^UbDZ&W#3!Eex{`62js}NDR~@_(e9UPfm@KKfa6FVQWMEdT#edJj zky+!V1JWd%kX776RJ>pc8^v1aqCk)(Jj@l=(tm)Da=;P938H33=rE}NfWytBl}a-8 zdrLDqbXkb{o$(Lm6#jLv%xZ#Ni+pIZ?Czin12#4-t7jC<^a~;_u5zC(^H^=AAJ)+b zJMrpb$}41)a~X&BOUsCU-LZQqUc`sDimcKJkAwx0C7d;@VXYhZY;t*!9eUZq2PFx@ zwdbw0g~FJVT73r&M;0Q<%I@DEA01#azMrvahcEIwdurfiN;YIjc2srjI3_G=kx&<= zE94K;D5^#cy3;njtMOa8N1T`RL*L-F_P9$|HW#$qn1jRhvOe+jp6h1XF{FF?k&D?? z)ids}yn(|f9MNWHLC~0AW|}>7th(tL@N^$n&w+^9h~&yP=Vyi2k;wlXdG$}hbJji= zX^vCHLz1q#3Dxv`CVr0%iDwif6**{T&I;YYy|+IkaAS@$Xi92^Pw{Dd{#fh_37Yyj z9{l#Po$EoJSnQ~)h6-)Q4Xs^j<)1=b6GeLA@ZdkR;qCRNw9wX|*`EeKA$M9i>S zA?>^TM0_k~OJ<*vF`JZV@q0Ynu55Vu*jODy6kL@RydO_&_txCcr`nTDX;zo^^-3I6 zS1e4+q>keD8>sOA92M6exXnJPw?ft1C%z@j7CK4GxEJW2jw+beWQ~mEd(Xno%v$iY zl*F7`iXO{n9?!zY(4j+fqnTC0U0sQl>_RS6<}PSClEQM@oftzxtTo!MjGJ$o$!jpb z^i9wwR$=#R*nXp>3=u3-RuWh zF~g4OinEL|@Sm2m{Z3Uy^GuQ<(-CVA23v`)^%^Jg9QUK{bc}FNgTAWfosGB6Q#w)k zT(TLTqU%#0%hQ#rS3-v?R)W^)9aAH4-Zt2*v|4g2^7*Xk>VBLRGt4m)(ea2%@msDX zO;WUvY3kIij_e+4_suM9vMsj~kxu__!C`c!!Wl|i9?V20@374Zja~xl9*fBcf_Gxd z_i5`WZ}RG~P~$dw+c|{`Zp2VqD{Z6-~gLU|S1Qa+!+Wg3<+2Y_iJHCc@5E)PN8Tg-AW4adK<;2TIjkz|R zn}8mbwIZva0PpnFJ!m^qaqRD(NH84_K$xeV4^t4Sn(aJ~5zrIrvC$*{(7YtAw$G*? zYCGW*=omWsJL5F*@(bQJCMmNTvRTqS$3>{9k%@+v#E_7yG|W< zMr|g01g)-zC@+?FABs+3YpdR;UTbdceRizJ5@vxm@`2UVFL=G=2bKM*KMq93dH3g}wcek$T861P(p|Z12U8L(Q}7ybQ@ez!T#7Y7 zQsRGNQYuaP2m9x|DysB05qYD(BFyzDYOYm9a{c zH9E69sq(V)AE+g*rES(CV{g@|WZc!-rJn?f9N8|^hVE;JDvD%GJ{58C@aOcg-;9jh zj9rN~{Lg^Ef#NI+hy$n#$K*%LS~{j>WNQRdgnv-rdhm?YgI&Jm%M~eqVbnlAx#Mdr P;7{d=#vkR6&4d0wMsNP6 literal 0 HcmV?d00001 diff --git a/modules/ROOT/images/comment-reply-add-comment-textarea.png b/modules/ROOT/images/comment-reply-add-comment-textarea.png new file mode 100644 index 0000000000000000000000000000000000000000..c31b30af2a539343900da3505cbc9dab8d7b4f9c GIT binary patch literal 70625 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 F{2#`xVJiRt literal 0 HcmV?d00001 diff --git a/modules/ROOT/images/comment-reply-add-comment.png b/modules/ROOT/images/comment-reply-add-comment.png new file mode 100644 index 0000000000000000000000000000000000000000..12946813631a41514495e9528bfcdd942a2819ec GIT binary patch literal 17704 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 literal 0 HcmV?d00001 diff --git a/modules/ROOT/images/comment-reply-to-comment-submitted.png b/modules/ROOT/images/comment-reply-to-comment-submitted.png new file mode 100644 index 0000000000000000000000000000000000000000..c38f55bed3ae621861a2fde189590084fa7d2d82 GIT binary patch literal 103879 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 w`z6^GVbq$t!EZS9qQx9fX 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¬~75>shL}r>XUJ30S0s=>p0;%8iry7h|bQ{$a_JjQ5QP7yT7Qj z`Ow&6cyp__2TuN=U32pEv_JK@@WWsNF_YqmabN0af#a(g{&v(io$^a;z^pM{QngX* zB!3^X_YxB|A7zaH+9>&SQ*!X37_J-M0vjh-L+=lB)bqOA2%Emg%3rV{g6uJz?AAtc z@e6=8b=Y2Gpx`DiTM=>F>1gZT7K_9w`r-RzP0SR8Hf4l`*5Z^t>`19a!If9h|4B{g zW(Pe>N1j5#ug1(kOgLp(a;XShB^d5y|3K&iH%_`z<_Kt`pOrbx+wDn_8}!DJ1{U%S zJEcKRQu6%~c1}wgSGuF!@8&5HPSIc2p0BSWoYFiE8`6}r1gvaH8X=e4ZwE*9s%0_6 zP4T3z!Ck6!5Sqb;WT)xgAa~GbkQnSEI7>Q9?&hNcll9+=kK7DiEI1zRZ6d9oK$52#TroFAY zz?^q<;H{|FV|V)WtweUmMjB7}aJ$T)mgK@nWF_

    Hi {{Customer.FirstName}},

    \n

    ...

    ' + }, + { + title: 'Support escalation', + content: '

    Hi {{Customer.FirstName}},

    \n

    ...

    ' + } + ] +} +---- + +For information on the **Templates** plugin, see: xref:advanced-templates.adoc#read-only-categories[Read-only Categories]. + +[[improvements]] +== Improvements + +{productname} {release-version} also includes the following improvements: + +=== In read-only mode the editor now allows normal cursor movement and block element selection, including video playback. +// #TINY-11264 + +In read-only mode, the editor now allows normal cursor movement and block element selection, including video playback. This behavior is now the **default** when the `readonly` option is set to `+true+` or when switching to read-only mode. + +Prior to this improvement, the editor's body element was set to `+contentEditable="false"+`, which blocked cursor placement and all user inputs. In the new behavior, the body element is set to `+contentEditable="true"+`, and input blocking is handled by the editor. + +For more information, see xref:editor-important-options.adoc#readonly[Read-only option]. + +[NOTE] +In this mode, menu buttons, read-only menu items, and read-only buttons remain enabled. To revert to the old behavior, use `+tinymce.activeEditor.ui.setEnabled(false)+`. + +=== Pasting a table now places the cursor after the table instead of into the last table cell. +// #TINY-11082 + +Previously, when users copied and pasted a table, the cursor would remain in the last cell of the table, which differed from the behavior in popular word processing applications like Google Docs and Microsoft Word. + +{productname} {release-version} addresses this behavior. Now, after pasting a table, the cursor is automatically placed on a new line immediately following the table inside a '+

     

    +' tag. + +=== Dialog list dropdown menus now close when the browser window resizes. +// #TINY-11123 + +In previous versions of {productname} any listbox with a fixed-width dropdown would remain open when resizing the browser window, creating a visual discrepancy as other UI elements adjusted to the new window size. + +{productname} {release-version} addresses this issue. Now, dropdowns will now automatically close when a window resize event is triggered, preventing the need for resizing the dropdown list itself. + +[[additions]] +== Additions + +{productname} {release-version} also includes the following additions: + +=== New `context` property for all ui components. +// #TINY-11211 + +A new `context` property has been introduced for all UI components, allowing buttons and menu items to be dynamically enabled or disabled based on whether their context matches a given predicate. This feature ensures that components reflect the current editing context, improving the user interface's adaptability. + +The status of the UI components is updated on `init`, `NodeChange`, and `SwitchMode` events. For the `mode` context, updates occur **only** on `SwitchMode` and `init`. + +To register a new context, integrators can now use: + +==== Default Contexts: + +- `editable`: Checks if the current selection is editable. +- `mode`: Enables components based on the current mode (e.g., `mode:design`, `mode:!readonly`). +- `any`: Always enables the UI component. +- `formatting`: Verifies if a specific format can be applied at the current selection. +- `insert`: Determines if a specific element can be inserted at the current selection. + +[TIP] +Syntax for context usage is `key:value`, and negation is possible by prefixing the value with `!`. For instance, `mode:!readonly` enables a button unless the editor is in readonly mode. + +This enhancement allows for more context-sensitive UI components, improving user interaction by ensuring appropriate options are available based on the editor's state. + +For more information about the `context` property, see xref:context.adoc[Context]. + +=== New option `allow_mathml_annotation_encodings` to opt-in to keep math annotations with specific encodings. +// TINY-11166 + +In previous versions of {productname}, MathML annotation elements were inadvertently stripped during content processing. This caused compatibility issues with tools like Wiris that rely on these annotations. + +{productname} {release-version} introduces a new option, `allow_mathml_annotation_encodings`, to address this problem. This option accepts an array of strings, allowing users to specify which annotation encodings should be preserved. By configuring this option, users can ensure proper functionality of MathML-dependent tools while maintaining control over which annotations are retained. + +.Example +[source, js] +---- +tinymce.init({ + selector: "textarea", + allow_mathml_annotation_encodings: [ 'wiris', 'application/x-tex' ] +}); +---- + +For more information on the `allow_mathml_annotation_encodings` option, see xref:content-filtering.adoc#allow-mathml-annotation-encodings[allow_mathml_annotation_encodings]. + + +[[bug-fixes]] +== Bug fixes + +{productname} {release-version} also includes the following bug fixes: + +=== Mouse hover on partially visible dialog collection elements no longer scrolls +// #TINY-9915 + +Previously, an issue caused partially visible collection elements, such as those in the Character Map or Emojis dialog, to unexpectedly scroll into view with abrupt and unintended movement when hovered over, resulting in a disruptive user experience. + +{productname} {release-version} addresses this issue by preventing scrolling on hover. This ensures that the dialog remains in place and does not scroll when partially visible elements are hovered over. + +=== Caret would unexpectedly shift to the non-editable table row above when pressing Enter. +// #TINY-11077 + +Previously, an issue where pressing Enter in a table cell caused the selection to shift incorrectly when the row above was set to `contenteditable="false"`. This problem affected table editing functionality, leading to unexpected cursor placement and content modifications. + +{productname} {release-version} addresses this issue. Now, this fix ensures that the selection remains stable when adding new lines within editable cells, regardless of the content editable state of adjacent rows. + +As a result, users can now reliably edit table contents without experiencing unintended cursor movements. + +=== Deleting a selection in a list element would sometimes prevent the `input` event from being dispatched. +// #TINY-11100 + +In {productname}, certain delete actions, especially the native delete action event, were suppressing the input event. This suppression caused unexpected behavior when deleting items in lists, as the input event was not being fired as intended. + +{productname} {release-version} resolves this issue by implementing the following solution: + +. When deleting an item in a list, the system now checks if the input event was triggered. +. If the input event was not triggered automatically, the system manually fires the event. + +This enhancement ensures that an input event is consistently dispatched when deleting list elements, regardless of the deletion method used. As a result, list behavior during deletion operations is now more reliable. + +=== Placing the cursor after a table, but before a BR element would misplace added newlines before the table instead of after it. +// #TINY-11110 + +Previously, a `+
    +` element was incorrectly counted as content when the cursor was placed before it, resulting in newlines or elements being inserted at the start of the block rather than after the table. + +{productname} {release-version} addresses this issue by treating the `+
    +` element as the end of the block. As a result, newlines are now correctly added after the table, ensuring proper cursor placement and content insertion. + +=== Sidebar could not be toggled until the skin was loaded. +// #TINY-11155 + +In {productname} 6.8, the initialization of sidebars in the UI was moved to occur after the skin was loaded. As a consequence, an issue was identified where the sidebar could not be toggled during the init event because the skin is loaded asynchronously. + +This issue has been resolved in {productname} {release-version} by moving the sidebar initialization back to within the PostRender event. As a result, the sidebar can now be toggled as expected during the init event. + +=== The image dialog lost focus after closing an image upload error alert. +// #TINY-11159 + +Previously, when an image upload error alert was closed, the image dialog lost focus, impacting keyboard accessibility. + +{productname} {release-version} addresses this issue by making the dropzone component focusable and adding a callback to focus the dropzone button after the error alert is closed. + +As a result, keyboard users now experience improved accessibility, with the ability to focus on the dropzone using the dialog API. + +=== Copying tables to the clipboard did not correctly separate cells and rows for the "text/plain" MIME type. +// #TINY-10847 + +Previously, when copying rows from tables, the newline character `+\n+` was not returned correctly, causing cell and row data to be improperly formatted. However, using the "Select All" function before copying preserved the newline characters. + +{productname} {release-version} resolves this issue by enhancing the clipboard handling for text extraction from table elements, particularly for complex structures. + +These improvements ensure more consistent and correctly formatted text output when copying table content within the editor. + +=== The editor resize handle was incorrectly rendered when all components were removed from the status bar. +// #TINY-11257 + +Previously in {productname}, the resize handle in the editor's status bar was positioned relative to other elements. Consequently, if these elements were removed, the resize handle would incorrectly appear in the left corner of the editor's status bar. + +In {productname} {release-version}, this issue has been resolved by adjusting the CSS. The resize handle is now consistently placed in the right corner of the status bar, regardless of the presence of other elements. This ensures that the resize handle is always positioned correctly where users expect it to be. + +[[known-issues]] + +== Known issues + +=== Editor Focus after Deleting a Comment +// #TINY-11293 + +When deleting a comment from the Comments sidebar, the focus shifts from the comments sidebar to the editor content area, rather than switching to the "Add comment..." button in the conversation sidebar as expected. + +This behavior differs from the current stable version, where the focus is correctly returned to the "Add comment..." textbox. + +**Status**: Currently under investigation. + +=== Comments Not Functional with Empty tinycomments_author and tinycomments_author_name +// #TINY-11323 + +Comment functionality becomes non-operational when `tinycomments_author` and `tinycomments_author_name` are configured as empty strings `+''+`. + +.Example of affected configuration: +[source, js] +---- +tinycomments_author: '', +tinycomments_author_name: '', +---- + +Previously, instead of assigning default user/author values as in `7-stable` (7.3), the latest release {release-version} disables all comment features when these fields are empty. + +**Status**: Currently under investigation. + +=== Comment card not removed after deleting content +// #TINY-11366 + +Currently, after deleting content that has related comments, the corresponding comment card still exists and becomes stale within the Comments sidebar. + +This behavior is inconsistent with the expected behavior, where the comment card should be removed automatically after deleting the content. + +**Status**: Currently under investigation. \ No newline at end of file diff --git a/modules/ROOT/pages/advanced-templates.adoc b/modules/ROOT/pages/advanced-templates.adoc index 682f44ba46..453722fab0 100644 --- a/modules/ROOT/pages/advanced-templates.adoc +++ b/modules/ROOT/pages/advanced-templates.adoc @@ -79,6 +79,43 @@ To manage the template list ** Move all category items to another category. ** Delete template/category. +[[read-only-categories]] +=== Readonly categories + +include::partial$misc/admon-requires-7.4v.adoc[] + +{pluginname} categories can be set to read-only in {productname}, preventing users from modifying the category or its templates. When a category is set to read-only, users cannot: + +* add new templates to the category +* delete the category or its templates +* rename the category or its templates +* move templates into or out of the category + +A lock image:icons/lock.svg[lock.svg] icon visually indicates that a category is read-only, preventing users from modifying the category or its templates through the user interface. + +To create a locked (read-only) category, add the `+locked: true+` property to the category object in your templates data: + +.Example of a locked category +[source,js] +---- +{ + title: 'Locked Templates', + locked: true, // Locks the category as readonly + items: [ + { + title: 'How to find model number', + content: '

    Hi {{Customer.FirstName}},

    \n

    ...

    ' + }, + { + title: 'Support escalation', + content: '

    Hi {{Customer.FirstName}},

    \n

    ...

    ' + } + ] +} +---- + +liveDemo::{plugincode}-readonly-template[] + == Basic setup To setup the {pluginname} plugin user-interface in the editor: diff --git a/modules/ROOT/pages/changelog.adoc b/modules/ROOT/pages/changelog.adoc index 819cb9b9ac..ddb6425390 100644 --- a/modules/ROOT/pages/changelog.adoc +++ b/modules/ROOT/pages/changelog.adoc @@ -4,6 +4,45 @@ NOTE: This is the {productname} Community version changelog. For information about the latest {cloudname} or {enterpriseversion} Release, see: xref:release-notes.adoc[{productname} Release Notes]. +== 7.4.0 - 2024-10-09 + +=== Added + +* New `context` property for all ui components. +// #TINY-11211 +* Tree component now allows the addition of a custom icon. +// #TINY-11131 +* New option `allow_mathml_annotation_encodings` to opt-in to keep math annotations with specific encodings. +// #TINY-11166 + +=== Improved + +* In read-only mode the editor now allows normal cursor movement and block element selection, including video playback. +// #TINY-11264 +* Pasting a table now places the cursor after the table instead of into the last cell. +// #TINY-11082 +* Dialog list dropdown menus now close when the browser window resizes. +// #TINY-11123 + +=== Fixed + +* Mouse hover on partially visible dialog collection elements no longer scrolls. +// #TINY-9915 +* Caret would unexpectedly shift to the non-editable table row above when pressing Enter. +// #TINY-11077 +* Deleting a selection in a list element would sometimes prevent the `input` event from being dispatched. +// #TINY-11100 +* Placing the cursor after a table with a br after it would misplace added newlines before the table instead of after. +// #TINY-11110 +* Sidebar could not be toggled until the skin was loaded. +// #TINY-11155 +* The image dialog lost focus after closing an image upload error alert. +// #TINY-11159 +* Copying tables to the clipboard did not correctly separate cells and rows for the "text/plain" MIME type. +// #TINY-10847 +* The editor resize handle was incorrectly rendered when all components were removed from the status bar. +// #TINY-11257 + == 7.3.0 - 2024-08-07 === Added diff --git a/modules/ROOT/pages/comments-access-options.adoc b/modules/ROOT/pages/comments-access-options.adoc new file mode 100644 index 0000000000..b9af24548e --- /dev/null +++ b/modules/ROOT/pages/comments-access-options.adoc @@ -0,0 +1,13 @@ +:navtitle: Comments Access Options +:description: TinyMCE Comments plugin access options. +:keywords: comments, commenting, tinycomments, access options +:pluginname: Comments +:plugincode: comments +:pluginminimumplan: enterprise + +[[access-options]] +== Access Options + +The following configuration option affects the behavior of the {pluginname} plugin. + +include::partial$configuration/comments-tinycomments_access.adoc[leveloffset=+1] diff --git a/modules/ROOT/pages/comments-callback-mode.adoc b/modules/ROOT/pages/comments-callback-mode.adoc index 0b6e342277..7478c5398f 100644 --- a/modules/ROOT/pages/comments-callback-mode.adoc +++ b/modules/ROOT/pages/comments-callback-mode.adoc @@ -1,4 +1,4 @@ -= Configuring the Comments plugin in callback mode += Configuring the {pluginname} plugin in callback mode :navtitle: Callback mode :description: Information on configuring the Comments plugin in callback mode :keywords: comments, commenting, tinycomments, callback @@ -6,32 +6,35 @@ :plugincode: comments :commentsMode: callback -*Callback mode* is the default mode for the Comments plugin. In the callback mode, callback functions are required to save user comments on a server. The Comments functions (create, reply, edit, delete comment, delete all conversations, resolve, and lookup) are configured differently depending upon the server-side storage configuration. +*Callback mode* is the default mode for the {pluginname} plugin. In the callback mode, callback functions are required to save user comments on a server. The {pluginname} functions (create, reply, edit, delete comment, delete all conversations, resolve, lookup, and fetch conversations) are configured differently depending upon the server-side storage configuration. -== Interactive example - -The following example uses a simulated server (provided by https://netflix.github.io/pollyjs/[Polly.js]) which has been hidden from the example javascript to keep the example code concise. The interactions between TinyMCE and Polly.js are visible in the browser console. - -liveDemo::comments-callback[] - -=== How the comments plugin works in callback mode +== How the {pluginname} plugin works in callback mode All options accept functions incorporating `+done+` and `+fail+` callbacks as parameters. The function return type is not important, but all functions must call exactly one of these two callbacks: `+fail+` or `+done+`. * The `+fail+` callback takes either a string or a JavaScript Error type. * The `+done+` callback takes an argument specific to each function. -Most (create, reply, and edit) functions require an `+id+` identifying the *current author*. +Most functions (create, reply, and edit) require an `+id+` identifying the *current author*. -Current author:: The Comments plugin does not know the name of the current user. Determining the current user and storing the comment related to that user, has to be configured by the developer. +[NOTE] +**Current author**: The {pluginname} plugin does not know the name of the current user. Determining the current user and storing the comment related to that user is required to be configured by the integrator. -After a user comments (triggering `+tinycomments_create+` for the first comment, or `+tinycomments_reply+` for subsequent comments), the Comments plugin requests the updated conversation using `+tinycomments_lookup+`, which should now contain the additional comment with the proper author. +During the initial editor load, the {pluginname} uses `+tinycomments_fetch+` callback to retrieve the existing conversations in the document. If not configured, the {pluginname} will fallback to `+tinycomments_lookup+`. + +When a user adds a comment or a reply, the {pluginname} plugin uses the `+tinycomments_lookup+` callback to retrieve the selected conversation. + +== Interactive example + +The following example uses a simulated server (provided by link:https://netflix.github.io/pollyjs/[Polly.js]), which has been hidden from the example JavaScript to keep the example code concise. The interactions between {productname} and Polly.js are visible in the browser console. + +liveDemo::comments-callback[] == Options === Required options -When using callback mode, the Comments plugin requires callback functions for the following options: +When using callback mode, the {pluginname} plugin requires callback functions for the following options: * xref:tinycomments_create[`+tinycomments_create+`] * xref:tinycomments_reply[`+tinycomments_reply+`] @@ -41,16 +44,12 @@ When using callback mode, the Comments plugin requires callback functions for th * xref:tinycomments_delete_all[`+tinycomments_delete_all+`] * xref:tinycomments_lookup[`+tinycomments_lookup+`] -The xref:tinycomments_resolve[`+tinycomments_resolve+`] option is _optional_. - include::partial$configuration/tinycomments_create.adoc[leveloffset=+1] include::partial$configuration/tinycomments_reply.adoc[leveloffset=+1] include::partial$configuration/tinycomments_edit_comment.adoc[leveloffset=+1] -include::partial$configuration/tinycomments_resolve.adoc[leveloffset=+1] - include::partial$configuration/tinycomments_delete_comment.adoc[leveloffset=+1] include::partial$configuration/tinycomments_delete.adoc[leveloffset=+1] @@ -59,6 +58,15 @@ include::partial$configuration/tinycomments_delete_all.adoc[leveloffset=+1] include::partial$configuration/tinycomments_lookup.adoc[leveloffset=+1] +== Optional options + +* xref:tinycomments_resolve[`+tinycomments_resolve+`] +* xref:tinycomments_fetch[`+tinycomments_fetch+`] + +include::partial$configuration/tinycomments_resolve.adoc[leveloffset=+1] + +include::partial$configuration/tinycomments_fetch.adoc[leveloffset=+1] + include::partial$plugins/comments-open-sidebar.adoc[] include::partial$plugins/comments-highlighting-css.adoc[] diff --git a/modules/ROOT/pages/comments-commands-events-apis.adoc b/modules/ROOT/pages/comments-commands-events-apis.adoc index 89b8e3b3f7..6ff3f9f24f 100644 --- a/modules/ROOT/pages/comments-commands-events-apis.adoc +++ b/modules/ROOT/pages/comments-commands-events-apis.adoc @@ -1,4 +1,4 @@ -= Commands, Events and APIs for the comments plugin += Commands, Events and APIs for the {pluginname} plugin :navtitle: Commands, Events and APIs :description: Information on the commands, events and APIs provided with the comments plugin. :keywords: comments, commenting, tinycomments @@ -7,7 +7,7 @@ == Commands -The Comments plugin provides the following {productname} commands. +The {pluginname} plugin provides the following {productname} commands. include::partial$commands/comments-cmds.adoc[] @@ -46,13 +46,104 @@ The {pluginname} plugin provides the xref:comments-commands-events-apis#getEvent include::partial$misc/admon-requires-6.1v.adoc[] -Returns a log with information and timestamps of all changes to comments, including when: +The `getEventLog` returns a log that contains information and timestamps of all changes to comments, including when: -* A new comment is added (and who added it). -* A comment is edited (and who edited it). -* A reply to a comment is added (and who added the reply). -* A comment is resolved (and who resolved the comment). -* A comment is deleted (and who deleted the comment). +* A new comment is added. + +[source,js] +---- +{ + "type": "create", + "timestamp": "2024-10-01T03:07:53.771Z", + "conversationUid": "annotation-r1nn5xdo5ye", + "conversationContext": "Welcome", + "conversationContent": "new comment" +}, +---- + +* A comment is edited. + +[source,js] +---- +{ + "type": "edit-comment", + "timestamp": "2024-10-01T03:08:06.551Z", + "conversationUid": "annotation-r1nn5xdo5ye", + "commentUid": "annotation-r1nn5xdo5ye", + "conversationContext": "Welcome", + "conversationContent": "new comment", + "conversationCreatedAt": "2024-10-01T03:07:53.771Z", + "commentContent": "new comment (Edit comment)", + "commentAuthor": { + "author": "DEMO USER", + "authorName": "DEMO USER" + }, + "conversationAuthor": { + "author": "DEMO USER", + "authorName": "DEMO USER" + } +}, +---- + +* A reply to a comment is added. + +[source,js] +---- +{ + "type": "reply", + "timestamp": "2024-10-01T03:07:53.771Z", + "conversationUid": "annotation-r1nn5xdo5ye", + "commentUid": "annotation-uh00rb41kma", + "conversationContext": "Welcome", + "conversationContent": "new comment (Edit comment)", + "conversationCreatedAt": "2024-10-01T03:07:53.771Z", + "commentContent": "reply to existing comment", + "conversationAuthor": { + "author": "DEMO USER", + "authorName": "DEMO USER" + } +}, +---- + +* A comment is resolved. + +[source,js] +---- +{ + "type": "resolve", + "timestamp": "2024-10-01T03:08:25.783Z", + "conversationUid": "annotation-r1nn5xdo5ye", + "conversationContext": "Welcome", + "conversationContent": "new comment (Edit comment)", + "conversationAuthor": { + "author": "DEMO USER", + "authorName": "DEMO USER" + } +}, +---- + +* A comment is deleted. + +[source,js] +---- +{ + "type": "delete-comment", + "timestamp": "2024-10-01T03:08:23.292Z", + "conversationUid": "annotation-r1nn5xdo5ye", + "commentUid": "annotation-uh00rb41kma", + "conversationContext": "Welcome", + "conversationContent": "new comment (Edit comment)", + "commentContent": "reply to existing comment", + "commentAuthor": { + "author": "DEMO USER", + "authorName": "DEMO USER" + }, + "conversationAuthor": { + "author": "DEMO USER", + "authorName": "DEMO USER" + } +}, +---- The event log can be retrieved either in full or with the `after` option, which restricts the returned list to Comment events after a time-stamp date in the link:https://en.wikipedia.org/wiki/ISO_8601[ISO-8601] format, both shown in the following: @@ -81,7 +172,7 @@ The `+'tinycomments'+` annotator, like all editor APIs, can only be accessed aft This example makes use of the `+annotationChanged+` method in the `+editor.annotator+` API to create a xref:creating-custom-notifications.adoc[custom notification]. -This notification displays for five seconds every time any content with a `+'tinycomments'+` annotation is selected. +The below notification example displays for five seconds every time any content with a `+'tinycomments'+` annotation is selected. [source,js] ---- diff --git a/modules/ROOT/pages/comments-embedded-mode.adoc b/modules/ROOT/pages/comments-embedded-mode.adoc index af3fb39179..f5fb056bca 100644 --- a/modules/ROOT/pages/comments-embedded-mode.adoc +++ b/modules/ROOT/pages/comments-embedded-mode.adoc @@ -1,26 +1,27 @@ -= Configuring the Comments plugin in embedded mode += Configuring the {pluginname} plugin in embedded mode :navtitle: Embedded mode :description: Information on configuring the Comments plugin in embedded mode :keywords: comments, commenting, tinycomments, embedded, embedded mode :pluginname: Comments :plugincode: comments -== Add the Comments plugin in embedded mode +== Add the {pluginname} plugin in embedded mode -To add the Comments plugin in embedded mode to the {productname}, configure the following options: +To add the {pluginname} plugin in embedded mode to the {productname}, configure the following options: [source,js] ---- tinymce.init({ selector: 'textarea', // change this value according to your html plugins: 'tinycomments', + toolbar: 'addcomment showcomments', tinycomments_author: 'author', tinycomments_author_name: 'Name of the commenter', tinycomments_mode: 'embedded' }); ---- -This is the minimum recommended setup for the Comments plugin in embedded mode. If the `+tinycomments_author+` and `+tinycomments_author_name+` options are not configured, all users will be assigned the name "_ANON_". +This is the minimum recommended setup for the {pluginname} plugin in embedded mode. If the `+tinycomments_author+` and `+tinycomments_author_name+` options are not configured, all users will be assigned the name "_ANON_". == Interactive example @@ -44,4 +45,4 @@ include::partial$configuration/tinycomments_can_edit_comment.adoc[leveloffset=+1 include::partial$plugins/comments-open-sidebar.adoc[] -include::partial$plugins/comments-highlighting-css.adoc[] +include::partial$plugins/comments-highlighting-css.adoc[] \ No newline at end of file diff --git a/modules/ROOT/pages/comments-toolbars-menus.adoc b/modules/ROOT/pages/comments-toolbars-menus.adoc index ce82e328a8..4d3e9d803b 100644 --- a/modules/ROOT/pages/comments-toolbars-menus.adoc +++ b/modules/ROOT/pages/comments-toolbars-menus.adoc @@ -1,4 +1,4 @@ -= Toolbar buttons and menu items for the Comments plugin += Toolbar buttons and menu items for the {pluginname} plugin :navtitle: Toolbar buttons and menu items :description: Details of the toolbar buttons and menu items provided for the Comments plugin. :keywords: comments, commenting, tinycomments diff --git a/modules/ROOT/pages/comments-using-comments.adoc b/modules/ROOT/pages/comments-using-comments.adoc index 41e322084e..4fe65b2582 100644 --- a/modules/ROOT/pages/comments-using-comments.adoc +++ b/modules/ROOT/pages/comments-using-comments.adoc @@ -1,34 +1,68 @@ -= Using TinyMCE Comments += Using {productname} {pluginname} :navtitle: Using Comments -:description: How to add, edit, resolve, and remove comments in TinyMCE +:description: How to add, edit, resolve, and remove comments in {productname} :keywords: comments, commenting, tinycomments :pluginname: Comments :plugincode: comments -I'm trying to: +== Overview -* xref:add-a-comment[Add a comment]. -* xref:edit-a-comment[Edit a comment]. -* xref:delete-a-comment[Delete a comment]. -* xref:delete-a-comment-thread-conversation[Delete a comment thread (conversation)]. -* xref:resolve-a-comment-thread-conversation[Resolve a comment thread (conversation)]. -* xref:show-or-view-a-comment[Show or view a comment]. -* xref:delete-all-comment-threads[Delete all comment threads]. +This guide provides visual instructions for using the comments plugin, including how to: + +* xref:add-a-comment[add new comments] to selected content +* xref:replying-to-comments[replying to comments] +* xref:edit-a-comment[edit existing comments] +* xref:delete-a-comment[delete individual comments] +* xref:delete-a-comment-thread-conversation[delete entire conversations] +* xref:resolve-a-comment-thread-conversation[resolving conversations] +* xref:show-or-view-a-comment[viewing comments] using the sidebar +* xref:delete-all-comment-threads[deleting all conversations] in a document + +[TIP] +The editor must contain content before a comment can be added. [[add-a-comment]] == Add a comment . Select the content from the desired location in the editor body. -. From the navigation menu, choose *Insert*-> *Add Comment* or click on the *Add comment* image:icons/comment-add.svg[Add comment] toolbar button to add the comment. -. The Comment box appears in the sidebar of the editor instance. -. Type a comment in the comment box, the "_Add comment…_" placeholder text will disappear. -. Press *Clear* to discard or *Comment* to store the input comment. +.. From the menubar, toggle *Insert* -> *Add comment*, or +.. click on the *Add comment* image:icons/comment-add.svg[Add comment] toolbar button, or +.. press `Ctrl+Alt+M` (Windows/Linux) or `Cmd+Option+M` `+⌥ + ⌘ + M+` (Mac) to add a comment. +. The {pluginname} sidebar will appear on the right side of the editor instance. +. The `+ \ No newline at end of file diff --git a/modules/ROOT/examples/live-demos/exportpdf/index.js b/modules/ROOT/examples/live-demos/exportpdf/index.js new file mode 100644 index 0000000000..04bec75035 --- /dev/null +++ b/modules/ROOT/examples/live-demos/exportpdf/index.js @@ -0,0 +1,18 @@ +tinymce.init({ + selector: 'textarea#exportpdf', + height: '800px', + plugins: [ + "exportpdf", "advlist", "anchor", "autolink", "charmap", "code", "codesample", "fullscreen", + "help", "image", "insertdatetime", "link", "lists", "media", + "preview", "searchreplace", "table", "visualblocks", + ], + toolbar: "undo redo | exportpdf | styles | bold italic underline strikethrough | alignleft aligncenter alignright alignjustify | bullist numlist outdent indent | link image", + image_caption: true, + exportpdf_converter_options: { + format: 'A4', + margin_top: '1in', + margin_right: '1in', + margin_bottom: '1in', + margin_left: '1in' + } +}); diff --git a/modules/ROOT/examples/live-demos/exportword/index.html b/modules/ROOT/examples/live-demos/exportword/index.html new file mode 100644 index 0000000000..91179d470c --- /dev/null +++ b/modules/ROOT/examples/live-demos/exportword/index.html @@ -0,0 +1,78 @@ + diff --git a/modules/ROOT/examples/live-demos/exportword/index.js b/modules/ROOT/examples/live-demos/exportword/index.js new file mode 100644 index 0000000000..c2dac8038c --- /dev/null +++ b/modules/ROOT/examples/live-demos/exportword/index.js @@ -0,0 +1,21 @@ +tinymce.init({ + selector: 'textarea#exportword', + height: '800px', + plugins: [ + "exportword", "advlist", "anchor", "autolink", "charmap", "code", "fullscreen", + "help", "image", "insertdatetime", "link", "lists", "media", + "preview", "searchreplace", "table", "visualblocks", + ], + toolbar: "undo redo | exportword | styles | bold italic underline strikethrough | alignleft aligncenter alignright alignjustify | bullist numlist outdent indent | link image", + exportword_converter_options: { + document: { + size: 'A4', + margins: { + top: "1in", + bottom: "1in", + left: "1in", + right: "1in" + } + } + } +}); diff --git a/modules/ROOT/examples/live-demos/full-featured/example.js b/modules/ROOT/examples/live-demos/full-featured/example.js index f397dc44f2..109bcccdbe 100644 --- a/modules/ROOT/examples/live-demos/full-featured/example.js +++ b/modules/ROOT/examples/live-demos/full-featured/example.js @@ -11,7 +11,7 @@ const isSmallScreen = window.matchMedia('(max-width: 1023.5px)').matches; tinymce.init({ selector: 'textarea#full-featured', - plugins: 'ai preview powerpaste casechange importcss tinydrive searchreplace autolink autosave save directionality advcode visualblocks visualchars fullscreen image link math media mediaembed codesample table charmap pagebreak nonbreaking anchor tableofcontents insertdatetime advlist lists checklist wordcount tinymcespellchecker a11ychecker editimage help formatpainter permanentpen pageembed charmap tinycomments mentions quickbars linkchecker emoticons advtable footnotes mergetags autocorrect typography advtemplate markdown revisionhistory', + plugins: 'importword exportword exportpdf ai preview powerpaste casechange importcss tinydrive searchreplace autolink autosave save directionality advcode visualblocks visualchars fullscreen image link math media mediaembed codesample table charmap pagebreak nonbreaking anchor tableofcontents insertdatetime advlist lists checklist wordcount tinymcespellchecker a11ychecker editimage help formatpainter permanentpen pageembed charmap tinycomments mentions quickbars linkchecker emoticons advtable footnotes mergetags autocorrect typography advtemplate markdown revisionhistory', tinydrive_token_provider: 'URL_TO_YOUR_TOKEN_PROVIDER', tinydrive_dropbox_app_key: 'YOUR_DROPBOX_APP_KEY', tinydrive_google_drive_key: 'YOUR_GOOGLE_DRIVE_KEY', @@ -26,7 +26,7 @@ tinymce.init({ } }, menubar: 'file edit view insert format tools table tc help', - toolbar: "undo redo | revisionhistory | aidialog aishortcuts | blocks fontsizeinput | bold italic | align numlist bullist | link image | table math media pageembed | lineheight outdent indent | strikethrough forecolor backcolor formatpainter removeformat | charmap emoticons checklist | code fullscreen preview | save print | pagebreak anchor codesample footnotes mergetags | addtemplate inserttemplate | addcomment showcomments | ltr rtl casechange | spellcheckdialog a11ycheck", // Note: if a toolbar item requires a plugin, the item will not present in the toolbar if the plugin is not also loaded. + toolbar: "undo redo | importword exportword exportpdf | revisionhistory | aidialog aishortcuts | blocks fontsizeinput | bold italic | align numlist bullist | link image | table math media pageembed | lineheight outdent indent | strikethrough forecolor backcolor formatpainter removeformat | charmap emoticons checklist | code fullscreen preview | save print | pagebreak anchor codesample footnotes mergetags | addtemplate inserttemplate | addcomment showcomments | ltr rtl casechange | spellcheckdialog a11ycheck", // Note: if a toolbar item requires a plugin, the item will not present in the toolbar if the plugin is not also loaded. autosave_ask_before_unload: true, autosave_interval: '30s', autosave_prefix: '{path}{query}-{id}-', @@ -412,6 +412,25 @@ tinymce.init({ .catch(onerror); }); }, + exportpdf_converter_options: { + 'format': 'Letter', + 'margin_top': '1in', + 'margin_right': '1in', + 'margin_bottom': '1in', + 'margin_left': '1in' + }, + exportword_converter_options: { + 'document': { + 'size': 'Letter' + } + }, + importword_converter_options: { + 'formatting': { + 'styles': 'inline', + 'resets': 'inline', + 'defaults': 'inline', + } + }, /* The following settings require more configuration than shown here. For information on configuring the mentions plugin, see: diff --git a/modules/ROOT/examples/live-demos/full-featured/index.js b/modules/ROOT/examples/live-demos/full-featured/index.js index c51119b6a9..3ceb31f729 100644 --- a/modules/ROOT/examples/live-demos/full-featured/index.js +++ b/modules/ROOT/examples/live-demos/full-featured/index.js @@ -414,7 +414,7 @@ tinymce.ScriptLoader.loadScripts(['https://cdn.jsdelivr.net/npm/faker@5/dist/fak tinymce.init({ selector: 'textarea#full-featured', - plugins: 'ai preview powerpaste casechange importcss tinydrive searchreplace autolink autosave save directionality advcode visualblocks visualchars fullscreen image link math media mediaembed codesample table charmap pagebreak nonbreaking anchor tableofcontents insertdatetime advlist lists checklist wordcount tinymcespellchecker a11ychecker editimage help formatpainter permanentpen pageembed charmap tinycomments mentions quickbars linkchecker emoticons advtable footnotes mergetags autocorrect typography advtemplate markdown revisionhistory', + plugins: 'ai preview powerpaste casechange importcss tinydrive searchreplace autolink autosave save directionality advcode visualblocks visualchars fullscreen image link math media mediaembed codesample table charmap pagebreak nonbreaking anchor tableofcontents insertdatetime advlist lists checklist wordcount tinymcespellchecker a11ychecker editimage help formatpainter permanentpen pageembed charmap tinycomments mentions quickbars linkchecker emoticons advtable footnotes mergetags autocorrect typography advtemplate markdown revisionhistory importword exportword exportpdf', editimage_cors_hosts: ['picsum.photos'], tinydrive_token_provider: (success, failure) => { success({ token: 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJqb2huZG9lIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.Ks_BdfH4CWilyzLNk8S2gDARFhuxIauLa8PwhdEQhEo' }); @@ -433,7 +433,7 @@ tinymce.ScriptLoader.loadScripts(['https://cdn.jsdelivr.net/npm/faker@5/dist/fak } }, menubar: 'file edit view insert format tools table tc help', - toolbar: "undo redo | revisionhistory | aidialog aishortcuts | blocks fontsizeinput | bold italic | align numlist bullist | link image | table math media pageembed | lineheight outdent indent | strikethrough forecolor backcolor formatpainter removeformat | charmap emoticons checklist | code fullscreen preview | save print | pagebreak anchor codesample footnotes mergetags | addtemplate inserttemplate | addcomment showcomments | ltr rtl casechange | spellcheckdialog a11ycheck", // Note: if a toolbar item requires a plugin, the item will not present in the toolbar if the plugin is not also loaded. + toolbar: "undo redo | importword exportword exportpdf | revisionhistory | aidialog aishortcuts | blocks fontsizeinput | bold italic | align numlist bullist | link image | table math media pageembed | lineheight outdent indent | strikethrough forecolor backcolor formatpainter removeformat | charmap emoticons checklist | code fullscreen preview | save print | pagebreak anchor codesample footnotes mergetags | addtemplate inserttemplate | addcomment showcomments | ltr rtl casechange | spellcheckdialog a11ycheck", // Note: if a toolbar item requires a plugin, the item will not present in the toolbar if the plugin is not also loaded. autosave_ask_before_unload: true, autosave_interval: '30s', autosave_prefix: '{path}{query}-{id}-', @@ -565,6 +565,25 @@ tinymce.ScriptLoader.loadScripts(['https://cdn.jsdelivr.net/npm/faker@5/dist/fak } ], ai_request, + exportpdf_converter_options: { + 'format': 'Letter', + 'margin_top': '1in', + 'margin_right': '1in', + 'margin_bottom': '1in', + 'margin_left': '1in' + }, + exportword_converter_options: { + 'document': { + 'size': 'Letter' + } + }, + importword_converter_options: { + 'formatting': { + 'styles': 'inline', + 'resets': 'inline', + 'defaults': 'inline', + } + }, revisionhistory_fetch: fetchRevisions, revisionhistory_author: { id: 'john.doe', diff --git a/modules/ROOT/examples/live-demos/importword/index.html b/modules/ROOT/examples/live-demos/importword/index.html new file mode 100644 index 0000000000..1c6fd82ae6 --- /dev/null +++ b/modules/ROOT/examples/live-demos/importword/index.html @@ -0,0 +1,9 @@ + diff --git a/modules/ROOT/examples/live-demos/importword/index.js b/modules/ROOT/examples/live-demos/importword/index.js new file mode 100644 index 0000000000..cf520309b4 --- /dev/null +++ b/modules/ROOT/examples/live-demos/importword/index.js @@ -0,0 +1,10 @@ +tinymce.init({ + selector: 'textarea#importword', + height: '800px', + plugins: [ + "importword", "advlist", "anchor", "autolink", "charmap", "code", "fullscreen", + "help", "image", "insertdatetime", "link", "lists", "media", + "preview", "searchreplace", "table", "visualblocks", +], +toolbar: "undo redo | importword | styles | bold italic underline strikethrough | alignleft aligncenter alignright alignjustify | bullist numlist outdent indent | link image", +}); diff --git a/modules/ROOT/pages/exportpdf.adoc b/modules/ROOT/pages/exportpdf.adoc index e5e42130b1..58dd13465b 100644 --- a/modules/ROOT/pages/exportpdf.adoc +++ b/modules/ROOT/pages/exportpdf.adoc @@ -16,11 +16,7 @@ The {pluginname} feature collects the HTML generated with the `tinymce.editor.ge == Interactive example -[NOTE] -.{pluginname} demo -==== -Demos containing the {pluginname} plugin are currently only available on our main website. Check out https://www.tiny.cloud/tinymce/features/export-pdf[the {pluginname} demo], or the https://www.tiny.cloud/[demo on our home page], to try it out today. -==== +liveDemo::exportpdf[] == Basic setup diff --git a/modules/ROOT/pages/exportword.adoc b/modules/ROOT/pages/exportword.adoc index 87f47b0b3e..75ca949df7 100644 --- a/modules/ROOT/pages/exportword.adoc +++ b/modules/ROOT/pages/exportword.adoc @@ -15,11 +15,7 @@ The export to Microsoft Word feature collects the HTML generated with the `tinym == Interactive example -[NOTE] -.{pluginname} demo -==== -Demos containing the {pluginname} plugin are currently only available on our main website. Check out https://www.tiny.cloud/tinymce/features/export-word[the {pluginname} demo], or the https://www.tiny.cloud/[demo on our home page], to try it out today. -==== +liveDemo::exportword[] [NOTE] .{pluginname} known issues diff --git a/modules/ROOT/pages/full-featured-premium-demo.adoc b/modules/ROOT/pages/full-featured-premium-demo.adoc index 1e6e1c0faa..2bf15a25c4 100644 --- a/modules/ROOT/pages/full-featured-premium-demo.adoc +++ b/modules/ROOT/pages/full-featured-premium-demo.adoc @@ -17,22 +17,12 @@ The following plugins are excluded from this example: |=== |Excluded plugins |Notes - |xref:autoresize.adoc[Autoresize] |Resizes the editor to fit the content. |xref:code.adoc[Code] |xref:advcode.adoc[*Enhanced Code Editor*] included instead. -|xref:exportpdf.adoc[Export to PDF] -|Logistical concerns regarding exposing internal service URLs preclude adding this. - -|xref:exportword.adoc[Export to Word] -|Logistical concerns regarding exposing internal service URLs preclude adding this. - -|xref:importword.adoc[Import from Word] -|Logistical concerns regarding exposing internal service URLs preclude adding this. - |xref:moxiemanager.adoc[MoxieManager] |xref:tinydrive-introduction.adoc[*{cloudfilemanager}*] included instead. diff --git a/modules/ROOT/pages/importword.adoc b/modules/ROOT/pages/importword.adoc index 4b02179419..ff121c5631 100644 --- a/modules/ROOT/pages/importword.adoc +++ b/modules/ROOT/pages/importword.adoc @@ -17,11 +17,7 @@ The {pluginname} plugin lets you import `.docx` (Word document) or `.dotx` (Word == Interactive example -[NOTE] -.{pluginname} demo -==== -Demos containing the {pluginname} plugin are currently only available on our main website. Check out https://www.tiny.cloud/tinymce/features/import-from-word[the {pluginname} demo], or the https://www.tiny.cloud/[demo on our home page], to try it out today. -==== +liveDemo::importword[] == Basic setup From 09e60e7397c819d50ac4e10876564dedce178652 Mon Sep 17 00:00:00 2001 From: Karl Kemister-Sheppard Date: Wed, 6 Nov 2024 13:07:20 +1000 Subject: [PATCH 76/97] DOC-2553: TinyMCE 7.5 Release Documentation. (#3479) * DOC-2553: TinyMCE 7.5 Release Documentation. * DOC-2558: New comments with mentions page and demos (#3499) * DOC-2558: New comments with mentions page and demos * DOC-2558: Fix codeQL * Apply suggestions from code review Co-authored-by: Karl Kemister-Sheppard * Apply suggestions from code review Co-authored-by: Karl Kemister-Sheppard * Apply suggestions from code review Co-authored-by: Karl Kemister-Sheppard * Apply suggestions from code review Co-authored-by: Karl Kemister-Sheppard * DOC-2558: Fix some broken mentions * Apply suggestions from code review Co-authored-by: Farzad Hayat * Apply suggestions from code review Co-authored-by: Farzad Hayat * Apply suggestions from code review Co-authored-by: Farzad Hayat * DOC-2558: Revert URL --------- Co-authored-by: Karl Kemister-Sheppard Co-authored-by: Farzad Hayat * DOC-2565 (#3502) * DOC-2498: TinyMCE 7.5 Release notes and community changelog. (#3480) * DOC-2498: TinyMCE 7.5 Release notes and community changelog. * DOC-2498: Corrected focus highlight visibility in statusbar path. (#3487) * DOC-2498: The `conversationAuthor` property was missing from create conversation events in the EventLog API. (#3488) * DOC-2498: The conversationAuthor property was missing from create conversation events in the EventLog API. * Update modules/ROOT/pages/7.5-release-notes.adoc Co-authored-by: Mitchell Crompton --------- Co-authored-by: Mitchell Crompton * DOC-2498: The toolbar-sticky-offset would still be applied after entering fullscreen mode. (#3481) * DOC-2498: The toolbar-sticky-offset would still be applied after entering fullscreen mode. * Update modules/ROOT/pages/7.5-release-notes.adoc Co-authored-by: Farzad Hayat * Update modules/ROOT/pages/7.5-release-notes.adoc Co-authored-by: Farzad Hayat --------- Co-authored-by: Farzad Hayat * DOC-2498: Improved color picker aria support. (#3490) * DOC-2498: Improved color picker aria support. * DOC-2498: Add known issue for safari poor announcing aria-labels. * Update modules/ROOT/pages/7.5-release-notes.adoc Co-authored-by: Arvin(Jintao) Han <20640097+ArvinJ-H@users.noreply.github.com> * Update modules/ROOT/pages/7.5-release-notes.adoc Co-authored-by: Arvin(Jintao) Han <20640097+ArvinJ-H@users.noreply.github.com> --------- Co-authored-by: Arvin(Jintao) Han <20640097+ArvinJ-H@users.noreply.github.com> * DOC-2498: Forecolor and backcolor toolbar buttons were not completely greyed out while in readonly mode. (#3486) * DOC-2498: Inability to type { character on German keyboard layouts. (#3491) * DOC-2498: Inability to type { character on German keyboard layouts. * Update modules/ROOT/pages/7.5-release-notes.adoc Co-authored-by: Farzad Hayat --------- Co-authored-by: Farzad Hayat * DOC-2498: Update TinyMCE for Java Swing contact sales link. (#3497) * DOC-2498: Added new default `li` element styles to the content CSS to prevent child list elements from inheriting certain parent list item styles. (#3495) * DOC-2498: Added new default li element styles to the content CSS to prevent child list elements from inheriting certain parent list item styles. * Update modules/ROOT/pages/7.5-release-notes.adoc * DOC-2498: Default values for tinycomments_author and tinycomments_author_name when empty string provided (#3493) * DOC-2498: Default values for tinycomments_author and tinycomments_author_name when empty string provided * Fix typo * DOC-2498: Removing annotated content, now, removes associated conversation card from the sidebar. (#3498) * DOC-2498: Autocompleter would not activate after applying an inline format like font size in some cases. (#3483) * DOC-2498: The command MarkdownInsert is now registered immediately and operates in an async manner, instead of waiting for resources before registering the command. (#3484) * DOC-2498: Closing a nested modal dialog would lose focus from the editor. (#3482) * DOC-2498: Closing a nested modal dialog would lose focus from the editor. * Update modules/ROOT/pages/7.5-release-notes.adoc Co-authored-by: Farzad Hayat --------- Co-authored-by: Farzad Hayat * DOC-2498: Improve Document Converter default value for `converter-options` (#3489) * DOC-2498: Added default values for document converter plugins. * DOC-2498: Update default values in plugin.adoc pages. * Update modules/ROOT/partials/configuration/exportpdf.adoc Co-authored-by: Farzad Hayat --------- Co-authored-by: Farzad Hayat * DOC-2498: Pasting plain text with the `mceInsertClipboardContent` command is now a synchronous action, to match TinyMCE core behaviour. (#3492) * DOC-2498: Pasting plain text with the mceInsertClipboardContent command is now a synchronous action, to match TinyMCE core behaviour. * Update modules/ROOT/pages/7.5-release-notes.adoc Co-authored-by: Farzad Hayat * Update modules/ROOT/pages/7.5-release-notes.adoc * Update modules/ROOT/pages/7.5-release-notes.adoc Co-authored-by: tiny-ben-tran --------- Co-authored-by: Farzad Hayat Co-authored-by: tiny-ben-tran * DOC-2564: Release Note Entry for Mentions in Comments (#3500) * DOC-2564: Release Note Entry for Mentions in Comments * Update modules/ROOT/pages/7.5-release-notes.adoc Co-authored-by: Karl Kemister-Sheppard * Add backlink for tinycomments_mentions_enabled * Update modules/ROOT/pages/7.5-release-notes.adoc Co-authored-by: Mitchell Crompton * Update modules/ROOT/pages/7.5-release-notes.adoc Co-authored-by: Mitchell Crompton * Update modules/ROOT/pages/7.5-release-notes.adoc Co-authored-by: Mitchell Crompton * Update modules/ROOT/pages/7.5-release-notes.adoc Co-authored-by: Mitchell Crompton * Update modules/ROOT/pages/7.5-release-notes.adoc Co-authored-by: Mitchell Crompton * Update modules/ROOT/pages/7.5-release-notes.adoc * Update modules/ROOT/pages/7.5-release-notes.adoc --------- Co-authored-by: Karl Kemister-Sheppard Co-authored-by: Mitchell Crompton * DOC-2498: Pre release cleanup, removal of template material. * DOC-2498: Added support for using raw CSS in the list of possible colours, using the `color_map_raw` property. (#3501) * DOC-2498: Added support for using raw CSS in the list of possible colours, using the color_map_raw property. * DOC-2598: Add note to thank @andrewnicols for contributing to this feature. * Update modules/ROOT/pages/7.5-release-notes.adoc * Update modules/ROOT/pages/changelog.adoc * Update modules/ROOT/pages/7.5-release-notes.adoc * Update modules/ROOT/pages/7.5-release-notes.adoc * DOC-2498: Copy edits. --------- Co-authored-by: Mitchell Crompton Co-authored-by: Farzad Hayat Co-authored-by: Arvin(Jintao) Han <20640097+ArvinJ-H@users.noreply.github.com> Co-authored-by: tiny-ben-tran --------- Co-authored-by: Mitchell Crompton Co-authored-by: Farzad Hayat Co-authored-by: Arvin(Jintao) Han <20640097+ArvinJ-H@users.noreply.github.com> Co-authored-by: tiny-ben-tran --- antora.yml | 3 +- .../index.html | 32 ++ .../comments-callback-with-mentions/index.js | 332 ++++++++++++++++++ .../index.html | 35 ++ .../comments-embedded-with-mentions/index.js | 160 +++++++++ modules/ROOT/nav.adoc | 10 +- modules/ROOT/pages/7.4-release-notes.adoc | 4 +- modules/ROOT/pages/7.5-release-notes.adoc | 272 ++++++++++++++ modules/ROOT/pages/changelog.adoc | 26 ++ .../pages/comments-commands-events-apis.adoc | 122 +------ .../ROOT/pages/comments-with-mentions.adoc | 80 +++++ modules/ROOT/pages/release-notes.adoc | 8 +- .../partials/configuration/exportpdf.adoc | 17 +- .../partials/configuration/exportword.adoc | 15 +- .../importword-converter-options.adoc | 15 + .../partials/configuration/text_color.adoc | 26 ++ .../tinycomments_mentions_enabled.adoc | 29 ++ .../integrations/swing-quick-start.adoc | 2 +- .../partials/misc/supported-versions.adoc | 1 + .../partials/plugin-apis/comments-apis.adoc | 149 ++++++++ 20 files changed, 1207 insertions(+), 131 deletions(-) create mode 100644 modules/ROOT/examples/live-demos/comments-callback-with-mentions/index.html create mode 100644 modules/ROOT/examples/live-demos/comments-callback-with-mentions/index.js create mode 100644 modules/ROOT/examples/live-demos/comments-embedded-with-mentions/index.html create mode 100644 modules/ROOT/examples/live-demos/comments-embedded-with-mentions/index.js create mode 100644 modules/ROOT/pages/7.5-release-notes.adoc create mode 100644 modules/ROOT/pages/comments-with-mentions.adoc create mode 100644 modules/ROOT/partials/configuration/tinycomments_mentions_enabled.adoc create mode 100644 modules/ROOT/partials/plugin-apis/comments-apis.adoc diff --git a/antora.yml b/antora.yml index 4405bd2983..60b0544775 100644 --- a/antora.yml +++ b/antora.yml @@ -26,7 +26,7 @@ asciidoc: # product variables productname: TinyMCE productmajorversion: 7 - productminorversion: '7.4' + productminorversion: '7.5' ##### product name in codeblock prodnamecode: tinymce #### more names @@ -38,6 +38,7 @@ asciidoc: communityname: TinyMCE Community accountpage: Tiny Account supportname: Tiny Support + contactsales: Contact Sales betaprogram: Tiny Insights Program #### some plugin names prem_skins_icons: Enhanced Skins & Icon Packs diff --git a/modules/ROOT/examples/live-demos/comments-callback-with-mentions/index.html b/modules/ROOT/examples/live-demos/comments-callback-with-mentions/index.html new file mode 100644 index 0000000000..fb90bbd07a --- /dev/null +++ b/modules/ROOT/examples/live-demos/comments-callback-with-mentions/index.html @@ -0,0 +1,32 @@ + diff --git a/modules/ROOT/examples/live-demos/comments-callback-with-mentions/index.js b/modules/ROOT/examples/live-demos/comments-callback-with-mentions/index.js new file mode 100644 index 0000000000..5b23fc187c --- /dev/null +++ b/modules/ROOT/examples/live-demos/comments-callback-with-mentions/index.js @@ -0,0 +1,332 @@ +import ('https://cdn.jsdelivr.net/npm/@faker-js/faker@9/dist/index.min.js').then(({ faker }) => { + const adminUser = { + id: 'johnsmith', + name: 'John Smith', + fullName: 'John Smith', + description: 'Company Founder', + image: "https://i.pravatar.cc/150?img=11" + }; + + const currentUser = { + id: 'jennynichols', + name: 'Jenny Nichols', + fullName: 'Jenny Nichols', + description: 'Marketing Director', + image: "https://i.pravatar.cc/150?img=10" + }; + + const conversationDb = { + 'mce-conversation_19679600221621399703915': { + uid: 'mce-conversation_19679600221621399703915', + comments: [{ + uid: 'mce-conversation_19679600221621399703915', + author: currentUser.id, + authorName: currentUser.fullName, + authorAvatar: currentUser.image, + content: `What do you think about this @${adminUser.id}?`, + createdAt: '2021-05-19T04:48:23.914Z', + modifiedAt: '2021-05-19T04:48:23.914Z' + }, + { + uid: 'mce-conversation_19679600221621399703917', + author: adminUser.id, + authorName: adminUser.fullName, + authorAvatar: adminUser.image, + content: `I think this is a great idea @${currentUser.id}!`, + createdAt: "2024-05-28T12:54:24.126Z", + modifiedAt: "2024-05-28T12:54:24.126Z", + }] + }, + 'mce-conversation_420304606321716900864126': { + uid: 'mce-conversation_420304606321716900864126', + comments: [{ + uid: 'mce-conversation_420304606321716900864126', + author: adminUser.id, + authorName: adminUser.fullName, + authorAvatar: adminUser.image, + content: `@${currentUser.id} Please revise this sentence, exclamation points are unprofessional!`, + createdAt: '2024-05-28T12:54:24.126Z', + modifiedAt: '2024-05-28T12:54:24.126Z' + }] + } + }; + + const fakeDelay = 500; + const numberOfUsers = 200; + const randomString = () => { + return crypto.getRandomValues(new Uint32Array(1))[0].toString(36).substring(2, 14); + }; + + /* These are "local" caches of the data returned from the fake server */ + let fetchedUsers = false; + let usersRequest; // Promise + const userRequest = {}; + const resolvedConversationDb = {}; + + const setupFakeServer = () => { + const images = [ adminUser.image, currentUser.image ]; + const userNames = [ adminUser.fullName, currentUser.fullName ]; + + for (let i = 0; i < numberOfUsers; i++) { + images.push(faker.image.avatar()); + userNames.push(`${faker.person.firstName()} ${faker.person.lastName()}`); + } + + /* This represents a database of users on the server */ + const userDb = { + [adminUser.id]: adminUser, + [currentUser.id]: currentUser + }; + userNames.map((fullName) => { + if ((fullName !== currentUser.fullName) && (fullName !== adminUser.fullName)) { + const id = fullName.toLowerCase().replace(/ /g, ''); + userDb[id] = { + id, + name: fullName, + fullName, + description: faker.person.jobTitle(), + image: images[Math.floor(images.length * Math.random())] + }; + } + }); + + /* This represents getting the complete list of users from the server with the details required for the mentions "profile" item */ + const fetchUsers = () => new Promise((resolve) => { + /* simulate a server delay */ + setTimeout(() => { + const users = Object.keys(userDb).map((id) => ({ + id, + name: userDb[id].name, + image: userDb[id].image, + description: userDb[id].description + })); + resolve(users); + }, fakeDelay); + }); + + const fetchUser = (id) => new Promise((resolve, reject) => { + /* simulate a server delay */ + setTimeout(() => { + if (Object.prototype.hasOwnProperty.call(userDb, id)) { + resolve(userDb[id]); + } + reject('unknown user id "' + id + '"'); + }, fakeDelay); + }); + + return { + fetchUsers, + fetchUser + }; + }; + + const fakeServer = setupFakeServer(); + + const mentions_fetch = (query, success) => { + if (!fetchedUsers) { + fetchedUsers = true; + usersRequest = fakeServer.fetchUsers(); + } + usersRequest.then((users) => { + const userMatch = (name) => name.toLowerCase().indexOf(query.term.toLowerCase()) !== -1; + success(users.filter((user) => userMatch(user.name) || userMatch(user.id))); + fetchedUsers = false; + }); + }; + + const mentions_menu_hover = (userInfo, success) => { + if (!userRequest[userInfo.id]) { + userRequest[userInfo.id] = fakeServer.fetchUser(userInfo.id); + } + userRequest[userInfo.id].then((userDetail) => { + success({ type: 'profile', user: userDetail }); + }); + }; + + const mentions_menu_complete = (editor, userInfo) => { + const span = editor.getDoc().createElement('span'); + span.className = 'mymention'; + span.setAttribute('style', 'color: #37F;'); + span.setAttribute('data-mention-id', userInfo.id); + span.appendChild(editor.getDoc().createTextNode('@' + userInfo.name)); + return span; + }; + + const mentions_select = (mention, success) => { + const id = mention.getAttribute('data-mention-id'); + if (id) { + userRequest[id] = fakeServer.fetchUser(id); + userRequest[id].then((userDetail) => { + success({ type: 'profile', user: userDetail }); + }); + } + }; + + const tinycomments_create = (req, done, fail) => { + if (req.content === 'fail') { + fail(new Error('Something has gone wrong...')); + } else { + const uid = 'annotation-' + randomString(); + conversationDb[uid] = { + uid, + comments: [{ + uid, + authorName: currentUser.fullName, + authorAvatar: currentUser.image, + author: currentUser.name, + content: req.content, + createdAt: req.createdAt, + modifiedAt: req.createdAt + }] + }; + + setTimeout(() => { + done({ + conversationUid: uid + }); + }, fakeDelay); + } + }; + + const tinycomments_reply = (req, done) => { + const replyUid = 'annotation-' + randomString(); + const current = conversationDb[req.conversationUid]; + current.comments.push( + { + uid: replyUid, + authorName: currentUser.fullName, + authorAvatar: currentUser.image, + author: currentUser.name, + content: req.content, + createdAt: req.createdAt, + modifiedAt: req.createdAt + } + ); + + setTimeout(() => { + done({ + commentUid: replyUid + }); + }, fakeDelay); + }; + + const tinycomments_delete = (req, done) => { + delete conversationDb[req.conversationUid]; + + setTimeout(() => { + done({ + canDelete: true + }); + }, fakeDelay); + }; + + const tinycomments_resolve = (req, done) => { + resolvedConversationDb[req.conversationUid] = conversationDb[req.conversationUid]; + delete conversationDb[req.conversationUid]; + + setTimeout(() => { + done({ + canResolve: true + }); + }, fakeDelay); + }; + + const tinycomments_delete_comment = (req, done) => { + const current = conversationDb[req.conversationUid]; + // Should be supported on browsers ... + current.comments = current.comments.filter((f) => { + return f.uid !== req.commentUid; + }); + + setTimeout(() => { + done({ + canDelete: true + }); + }, fakeDelay); + }; + + const tinycomments_edit_comment = (req, done) => { + const current = conversationDb[req.conversationUid]; + // Should be supported on browsers ... + current.comments = current.comments.map((f) => { + return f.uid === req.commentUid ? { + ...f, + content: req.content, + modifiedAt: new Date().toISOString() + } : f; + }); + + setTimeout(() => { + done({ + canEdit: true + }); + }, fakeDelay); + }; + + const tinycomments_delete_all = (req, done) => { + Object.keys(conversationDb).forEach((k) => { + delete conversationDb[k]; + }); + + setTimeout(() => { + done({ + canDelete: true + }); + }, fakeDelay); + }; + + const tinycomments_lookup = (req, done) => { + setTimeout(() => { + done({ + conversation: { + uid: conversationDb[req.conversationUid].uid, + comments: conversationDb[req.conversationUid].comments.slice(0) + } + }); + }, fakeDelay); + }; + + const tinycomments_fetch = (_, done) => { + setTimeout(() => done({ + conversations: conversationDb + }), fakeDelay); + }; + + + tinymce.init({ + selector: 'textarea#comments-callback', + license_key: 'gpl', + toolbar: 'addcomment showcomments code | bold italic underline', + menubar: 'file edit view insert format tools tc help', + menu: { + tc: { + title: 'TinyComments', + items: 'addcomment showcomments deleteallconversations' + } + }, + plugins: [ 'tinycomments', 'mentions', 'help', 'code' ], + tinycomments_mentions_enabled: true, + + mentions_item_type: 'profile', + mentions_min_chars: 0, + mentions_selector: '.mymention', + mentions_fetch, + mentions_menu_hover, + mentions_menu_complete, + mentions_select, + + tinycomments_mode: 'callback', + tinycomments_author: currentUser.id, + tinycomments_author_name: currentUser.fullName, + tinycomments_avatar: currentUser.image, + tinycomments_create, + tinycomments_reply, + tinycomments_delete, + tinycomments_resolve, + tinycomments_delete_all, + tinycomments_lookup, + tinycomments_delete_comment, + tinycomments_edit_comment, + tinycomments_fetch, + }); +}); diff --git a/modules/ROOT/examples/live-demos/comments-embedded-with-mentions/index.html b/modules/ROOT/examples/live-demos/comments-embedded-with-mentions/index.html new file mode 100644 index 0000000000..4f012193f1 --- /dev/null +++ b/modules/ROOT/examples/live-demos/comments-embedded-with-mentions/index.html @@ -0,0 +1,35 @@ +
    + +
    \ No newline at end of file diff --git a/modules/ROOT/examples/live-demos/comments-embedded-with-mentions/index.js b/modules/ROOT/examples/live-demos/comments-embedded-with-mentions/index.js new file mode 100644 index 0000000000..cb8b01c034 --- /dev/null +++ b/modules/ROOT/examples/live-demos/comments-embedded-with-mentions/index.js @@ -0,0 +1,160 @@ +import ('https://cdn.jsdelivr.net/npm/@faker-js/faker@9/dist/index.min.js').then(({ faker }) => { + const adminUser = { + id: 'johnsmith', + name: 'John Smith', + fullName: 'John Smith', + description: 'Company Founder', + image: "https://i.pravatar.cc/150?img=11" + }; + + const currentUser = { + id: 'jennynichols', + name: 'Jenny Nichols', + fullName: 'Jenny Nichols', + description: 'Marketing Director', + image: "https://i.pravatar.cc/150?img=10" + }; + + const fakeDelay = 500; + const numberOfUsers = 200; + + /* These are "local" caches of the data returned from the fake server */ + let fetchedUsers = false; + let usersRequest; // Promise + const userRequest = {}; + + const setupFakeServer = () => { + const images = [ adminUser.image, currentUser.image ]; + const userNames = [ adminUser.fullName, currentUser.fullName ]; + + for (let i = 0; i < numberOfUsers; i++) { + images.push(faker.image.avatar()); + userNames.push(`${faker.person.firstName()} ${faker.person.lastName()}`); + } + + /* This represents a database of users on the server */ + const userDb = { + [adminUser.id]: adminUser, + [currentUser.id]: currentUser + }; + userNames.map((fullName) => { + if ((fullName !== currentUser.fullName) && (fullName !== adminUser.fullName)) { + const id = fullName.toLowerCase().replace(/ /g, ''); + userDb[id] = { + id, + name: fullName, + fullName, + description: faker.person.jobTitle(), + image: images[Math.floor(images.length * Math.random())] + }; + } + }); + + /* This represents getting the complete list of users from the server with the details required for the mentions "profile" item */ + const fetchUsers = () => new Promise((resolve) => { + /* simulate a server delay */ + setTimeout(() => { + const users = Object.keys(userDb).map((id) => ({ + id, + name: userDb[id].name, + image: userDb[id].image, + description: userDb[id].description + })); + resolve(users); + }, fakeDelay); + }); + + const fetchUser = (id) => new Promise((resolve, reject) => { + /* simulate a server delay */ + setTimeout(() => { + if (Object.prototype.hasOwnProperty.call(userDb, id)) { + resolve(userDb[id]); + } + reject('unknown user id "' + id + '"'); + }, fakeDelay); + }); + + return { + fetchUsers, + fetchUser + }; + }; + + const fakeServer = setupFakeServer(); + + const mentions_fetch = (query, success) => { + if (!fetchedUsers) { + fetchedUsers = true; + usersRequest = fakeServer.fetchUsers(); + } + usersRequest.then((users) => { + const userMatch = (name) => name.toLowerCase().indexOf(query.term.toLowerCase()) !== -1; + success(users.filter((user) => userMatch(user.name) || userMatch(user.id))); + fetchedUsers = false; + }); + }; + + const mentions_menu_hover = (userInfo, success) => { + if (!userRequest[userInfo.id]) { + userRequest[userInfo.id] = fakeServer.fetchUser(userInfo.id); + } + userRequest[userInfo.id].then((userDetail) => { + success({ type: 'profile', user: userDetail }); + }); + }; + + const mentions_menu_complete = (editor, userInfo) => { + const span = editor.getDoc().createElement('span'); + span.className = 'mymention'; + span.setAttribute('style', 'color: #37F;'); + span.setAttribute('data-mention-id', userInfo.id); + span.appendChild(editor.getDoc().createTextNode('@' + userInfo.name)); + return span; + }; + + const mentions_select = (mention, success) => { + const id = mention.getAttribute('data-mention-id'); + if (id) { + userRequest[id] = fakeServer.fetchUser(id); + userRequest[id].then((userDetail) => { + success({ type: 'profile', user: userDetail }); + }); + } + }; + + const tinycomments_can_resolve = (req, done, _fail) => { + const allowed = req.comments.length > 0 && req.comments[0].author === author; + done({ + canResolve: allowed + }); + }; + + tinymce.init({ + selector: 'textarea#comments-embedded', + license_key: 'gpl', + toolbar: 'addcomment showcomments code | bold italic underline', + menubar: 'file edit view insert format tools tc help', + menu: { + tc: { + title: 'TinyComments', + items: 'addcomment showcomments deleteallconversations' + } + }, + plugins: [ 'tinycomments', 'mentions', 'help', 'code' ], + tinycomments_mentions_enabled: true, + + mentions_item_type: 'profile', + mentions_min_chars: 0, + mentions_selector: '.mymention', + mentions_fetch, + mentions_menu_hover, + mentions_menu_complete, + mentions_select, + + tinycomments_mode: 'embedded', + tinycomments_author: currentUser.id, + tinycomments_author_name: currentUser.fullName, + tinycomments_avatar: currentUser.image, + tinycomments_can_resolve, + }); +}); diff --git a/modules/ROOT/nav.adoc b/modules/ROOT/nav.adoc index 92772e0965..0b4d045dd5 100644 --- a/modules/ROOT/nav.adoc +++ b/modules/ROOT/nav.adoc @@ -304,6 +304,7 @@ **** xref:comments-toolbars-menus.adoc[Toolbar buttons and menu items] **** xref:comments-access-options.adoc[Access Options] **** xref:comments-commands-events-apis.adoc[Commands, Events and APIs] +**** xref:comments-with-mentions.adoc[Comments with Mentions] *** xref:advcode.adoc[Enhanced Code Editor] *** Enhanced Media Embed **** xref:introduction-to-mediaembed.adoc[Enhanced Media Embed] @@ -407,7 +408,14 @@ ** xref:tinymce-and-csp.adoc[Content Security Policies (CSP)] ** xref:tinymce-and-cors.adoc[Cross-Origin Resource Sharing (CORS)] * Release information -** xref:release-notes.adoc[Release notes for {productname} {productmajorversion}] +** xref:release-notes.adoc[Release notes for {productname}] +*** {productname} 7.5 +**** xref:7.5-release-notes.adoc#overview[Overview] +**** xref:7.5-release-notes.adoc#accompanying-premium-plugin-changes[Accompanying Premium Plugin changes] +**** xref:7.5-release-notes.adoc#improvements[Improvements] +**** xref:7.5-release-notes.adoc#additions[Additions] +**** xref:7.5-release-notes.adoc#bug-fixes[Bug fixes] +**** xref:7.5-release-notes.adoc#known-issues[Known issues] *** {productname} 7.4.1 **** xref:7.4.1-release-notes.adoc#overview[Overview] **** xref:7.4.1-release-notes.adoc#security-fix[Security fix] diff --git a/modules/ROOT/pages/7.4-release-notes.adoc b/modules/ROOT/pages/7.4-release-notes.adoc index f5881714c9..eab4f3916e 100644 --- a/modules/ROOT/pages/7.4-release-notes.adoc +++ b/modules/ROOT/pages/7.4-release-notes.adoc @@ -368,7 +368,7 @@ tinycomments_author_name: '', Previously, instead of assigning default user/author values as in `7-stable` (7.3), the latest release {release-version} disables all comment features when these fields are empty. -**Status**: Currently under investigation. +**Status**: This issue has been resolved in xref:7.5-release-notes.adoc#use-default-anon-value-for-tinycomments_author-and-tinycomments_author_name-options-when-the-provided-value-is-an-empty-string[{productname} 7.5.0]. === Comment card not removed after deleting content // #TINY-11366 @@ -377,4 +377,4 @@ Currently, after deleting content that has related comments, the corresponding c This behavior is inconsistent with the expected behavior, where the comment card should be removed automatically after deleting the content. -**Status**: Currently under investigation. \ No newline at end of file +**Status**: This issue has been resolved in xref:7.5-release-notes.adoc#removing-annotated-content-now-removes-associated-conversation-card-from-the-sidebar[{productname} 7.5.0]. \ No newline at end of file diff --git a/modules/ROOT/pages/7.5-release-notes.adoc b/modules/ROOT/pages/7.5-release-notes.adoc new file mode 100644 index 0000000000..5bc2316336 --- /dev/null +++ b/modules/ROOT/pages/7.5-release-notes.adoc @@ -0,0 +1,272 @@ += {productname} {release-version} +:release-version: 7.5 +:navtitle: {productname} {release-version} +:description: Release notes for {productname} {release-version} +:keywords: releasenotes, new, changes, bugfixes +:page-toclevels: 1 + +include::partial$misc/admon-releasenotes-for-stable.adoc[] + + +[[overview]] +== Overview + +{productname} {release-version} was released for {enterpriseversion} and {cloudname} on Wednesday, November 06^th^, 2024. These release notes provide an overview of the changes for {productname} {release-version}, including: + +* xref:accompanying-premium-plugin-changes[Accompanying Premium plugin changes] +* xref:improvements[Improvements] +* xref:additions[Additions] +* xref:bug-fixes[Bug fixes] +* xref:known-issues[Known issues] + + +[[accompanying-premium-plugin-changes]] +== Accompanying Premium plugin changes + +The following premium plugin updates were released alongside {productname} {release-version}. + +=== Export to PDF + +The {productname} {release-version} release includes an accompanying release of the **Export to PDF** premium plugin. + +**Export to PDF** Premium plugin includes the following improvement. + +=== Added a default value for the `exportpdf_converter_options` option. +// #TINY-11396 + +As of {productname} {release-version}, the **Export to PDF** Plugin now defaults to U.S. letter page size and applies standard 1-inch margins, ensuring consistency in document formatting out of the box for integrators. The following settings have been applied: + +[source,js] +---- +exportpdf_converter_options: { + format: 'Letter', + margin_top: '1in', + margin_right: '1in', + margin_bottom: '1in', + margin_left: '1in' +} +---- + +For information on the **Export to PDF** plugin, see: xref:exportpdf.adoc[Export to PDF]. + +=== Export to Word + +The {productname} {release-version} release includes an accompanying release of the **Export to Word** premium plugin. + +**Export to Word** Premium plugin includes the following improvement. + +=== Added a default value for the `exportword_converter_options` option. +// #TINY-11396 + +As of {productname} {release-version}, the **Export to Word** Plugin has been updated to default to the U.S. letter page size, improving compatibility with standard document formats, providing a better out-of-the-box experience for integrators. The following setting has been applied: + +[source,js] +---- +exportword_converter_options: { + document: { + size: 'letter' + } +} +---- + +For information on the **Export to Word** plugin, see: xref:exportword.adoc[Export to Word]. + +=== Import from Word + +The {productname} {release-version} release includes an accompanying release of the **Import from Word** premium plugin. + +**Import from Word** Premium plugin includes the following improvement. + +=== Added a default value for the `importword_converter_options` option. +// #TINY-11396 + +As of {productname} {release-version}, the **Import from Word** Plugin now defaults to retaining as much original Word document styling as possible, using the following settings: + +[source,js] +---- +importword_converter_options: { + formatting: { + styles: 'inline', + resets: 'inline', + defaults: 'inline', + } +} +---- + +For information on the **Import from Word** plugin, see: xref:importword.adoc[Import from Word]. + +=== Markdown + +The {productname} {release-version} release includes an accompanying release of the **Markdown** premium plugin. + +This **Markdown** premium plugin release includes the following improvements: + +==== The command `MarkdownInsert` is now registered immediately and operates in an async manner, instead of waiting for resources before registering the command. +// #TINY-11280 + +In {productname} {release-version}, the `MarkdownInsert` command is now registered immediately and operates asynchronously upon execution, rather than waiting for resources to register during initialization. Previously, the command required loading external content, which delayed its availability. By making the command async on execution instead of on loading, it is now accessible at initialization, improving responsiveness without the need for additional loading time. + +==== Markdown command `MarkdownInsert` fires new event `MarkdownInserted` when completed. +// #TINY-11280 + +In {productname} {release-version}, the `MarkdownInsert` command now triggers a new event, `MarkdownInserted`, upon completion. This event provides a notification when the markdown insertion process has finished, enabling better tracking and handling of post-insertion actions within the editor. + +For information on the **Markdown** plugin, see xref:markdown.adoc[Markdown]. + +=== Comments + +The {productname} {release-version} release includes an accompanying release of the **Comments** premium plugin. + +**Comments** Premium plugin includes the following additions and fixes and improvement. + +==== Comments with Mentions +// EPIC-111 + +The **Comments** plugin now supports the use of mentions in comments, with the **Mentions** plugin enabled. + +In {productname} {release-version}, the **Comments** plugin has been enhanced to support xref:mentions.adoc[Mentions] in comments. Users can now mention other users in comments by typing the `+@+` symbol followed by the user's name. + +Additionally, the **Comments** plugin now includes a new `mentionedUids` property for events within the EventLog API when the Mentions plugin is enabled. This property provides an array of UIDs mentioned in the comment, allowing integrators to retrieve which users have been mentioned in comments. + +The **Comments** plugin now offers the `xref:comments-with-mentions.adoc#tinycomments_mentions_enabled[tinycomments_mentions_enabled]` option to enable or disable mentioning other users in comments when both plugins are included in the configuration. + +For information on the **Comments with Mentions** feature, see xref:comments-with-mentions.adoc[Configuring the Comments plugin with the Mentions plugin]. + +==== The `conversationAuthor` property was missing from 'create` conversation events in the EventLog API. +// #TINY-11352 + +In previous versions of the tinycomments plugin, the `conversationAuthor` property was missing from 'create' events within the event log, which led to incomplete tracking of user interactions when retrieving data through the `+getEventLog()+` API. + +{productname} {release-version} addresses this issue. Now, the `conversationAuthor` property is included in 'create' events in the event log. + +==== Removing annotated content, now, removes associated conversation card from the sidebar. +// #TINY-11366 + +Previously, in xref:7.4-release-notes.adoc#comment-card-not-removed-after-deleting-content[{productname} 7.4.0], an issue was identified where deleting annotated content did not remove the corresponding conversation card from the sidebar, resulting in outdated or irrelevant cards persisting in the user interface. + +This behavior led to confusion and increased the risk of interacting with obsolete comments. + +In {productname} {release-version}, this issue has been resolved. Now, when annotated content is deleted, the associated conversation card is automatically removed from the sidebar. + +==== Use default 'Anon' value for `tinycomments_author` and `tinycomments_author_name` options when the provided value is an empty string. +// #TINY-11323 + +Previously in xref:7.4-release-notes.adoc#comments-not-functional-with-empty-tinycomments_author-and-tinycomments_author_name[{productname} 7.4.0], an issue was identified in **Embedded mode** where the commenting functionality became non-operational when either the `tinycomments_author` or the `tinycomments_author_name` options were configured as empty strings `""`. As a consequence, users were unable to create comments when these options were empty. + +In {productname} {release-version}, the `tinycomments_author` and `tinycomments_author_name` options now default to "Anon" when the provided value is an empty string. As a result, the commenting functionality is now operational even when these options are empty. + +For information on the **Comments** plugin, see: xref:introduction-to-tiny-comments.adoc[Introduction to {companyname} Comments]. + +=== PowerPaste + +The {productname} {release-version} release includes an accompanying release of the **PowerPaste** premium plugin. + +**PowerPaste** Premium plugin includes the following improvement. + +==== Pasting plain text with the `mceInsertClipboardContent` command is now a synchronous action, to match {productname}'s core behaviour. + +Previously in {productname}, when the Powerpaste plugin was enabled, the `mceInsertClipboardContent` command was executed asynchronously. This caused compatibility issues with the xref:markdown.adoc[Markdown] plugin, as the Markdown plugin relied on synchronous command execution. As a consequence, the Markdown plugin was effectively disabled when Powerpaste was active. + +{productname} {release-version} addresses this issue. The `mceInsertClipboardContent` command has been updated to be conditionally synchronous when the Powerpaste plugin is enabled. If the content is plaintext (e.g., `+editor.execCommand('mceInsertClipboardContent', false, { text: content })+`), the command is executed synchronously, aligning it with {productname}'s core functionality. If the content is HTML (e.g., `+editor.execCommand('mceInsertClipboardContent', false, { html: content })+`), the command remains asynchronous, as it requires async operations for HTML content. + +As a result, the `mceInsertClipboardContent` command now always executes synchronously when pasting plaintext, allowing both Powerpaste and Markdown plugins to operate together seamlessly, restoring full functionality for Markdown users. + +For information on the **PowerPaste** plugin, see: xref:introduction-to-powerpaste.adoc[Introduction to PowerPaste]. + +[[improvements]] +== Improvements + +{productname} {release-version} also includes the following improvement: + +=== Improved color picker aria support. +// #TINY-11291 + +In previous versions of {productname}, an issue was identified where screen readers would inconsistently announce the original R/G/B component string in the color picker, leading to a lack of context for visually impaired users. The root cause was an incorrect placement of the `aria-label` attribute, which was initially applied to the label element instead of the input field. + +{productname} {release-version} addresses this issue. Now, the `aria-label` attribute has been moved to the input field to ensure it is correctly associated. Additionally, the descriptive text was updated from "Red/Green/Blue component" to "Red/Green/Blue channel" to provide clearer information for assistive technologies. These changes ensure that screen readers consistently and accurately announce the relevant RGB channels, significantly improving accessibility. + +[[additions]] +== Additions + +{productname} {release-version} also includes the following addition: + +=== Added support for using raw CSS in the list of possible colours, using the `color_map_raw` property. +// #TINY-11385 + +In previous versions of {productname}, the `color_map` property allowed users to define a list of colors for the color picker dropdown. However, this property only supported predefined color names or hex values, limiting the customization options for users who wanted to include custom colors using raw CSS. + +{productname} {release-version} addresses this limitation by introducing the `color_map_raw` property. This new property allows users to define a list of colors using raw CSS values, providing greater flexibility and customization options for the color picker dropdown. + +As a result, users can now include custom colors, or other CSS properties in the color map. + +For more information on customizing the color picker, see xref:user-formatting-options.adoc#color_map_raw[`+color_map_raw+` option]. + +NOTE: {companyname} Technologies would like to thank link:https://github.com/andrewnicols[Andrew Nicols] for contributing to this feature. + +[[bug-fixes]] +== Bug fixes + +{productname} {release-version} also includes the following bug fixes: + +=== Closing a nested modal dialog would lose focus from the editor. +// #TINY-11153 + +Previously in {productname}, closing a nested dialog (such as the color picker dialog within the Table Properties dialog) would cause the editor to lose focus on the parent dialog and shift focus to the editor content in the background. + +This issue impacted keyboard users, preventing them from navigating or closing the parent dialog since the focus was no longer on the dialog. Additionally, in inline mode editors, the dialog UI would disappear entirely when focus shifted to the editor area, giving the impression that the dialog had closed unexpectedly. + +This issue has been resolved by ensuring focus returns to the parent dialog when a nested dialog is closed. As a result, keyboard users can now navigate and close dialogs as expected, and the dialog UI remains visible in inline mode editors. + +=== Autocompleter would not activate after applying an inline format like font size in some cases. +// #TINY-11273 + +Previously, when formatting was applied, a span with a zero-width no-break space `+U+FEFF+` was added to the editor. This character was not considered whitespace; as a result, the autocompleter did not trigger as expected. + +{productname} {release-version} addresses this issue by updating the function to include `+U+FEFF+` as a valid character. + +As a result, the autocompleter now triggers as expected after applying formatting. + +=== Forecolor and backcolor toolbar buttons were not completely greyed out while in readonly mode. +// #TINY-11313 + +In previous versions of {productname}, an issue was identified where the `backcolor` and `forecolor` toolbar buttons were not completely greyed out while in readonly mode due to an incorrect CSS selector. + +This led to a visual inconsistency in the readonly editor state. + +{productname} {release-version} addresses this issue. Now, the CSS selector has been corrected, ensuring that both `backcolor` and `forecolor` buttons are now completely greyed out, providing a consistent user experience when the editor is in readonly mode. + +=== The `toolbar-sticky-offset` would still be applied after entering fullscreen mode. +// #TINY-11137 + +In previous versions of {productname}, an issue was identified where the toolbar offset was incorrectly applied in fullscreen mode, causing the toolbar to overlap with the editor area. + +{productname} {release-version} addresses this issue, by implementing a check to verify that the editor is **not** in fullscreen mode before applying the toolbar offset. As a result, the toolbar now appears in the correct position when in fullscreen mode, even with the `toolbar_sticky_offset` option defined. + +=== Corrected focus highlight visibility in `Statusbar` path +// #TINY-11381 + +A visual bug introduced in {productname} version xref:7.2.1-release-notes.adoc#long-translations-of-the-bottom-help-text-would-cause-minor-graphical-issues[7.1.2] caused the focus highlight to appear behind the tag name in the statusbar path, making it difficult for users to visually track their focus. + +In {productname} {release-version}, this has been corrected. The focus highlight is now correctly displayed above the tag name when navigating through the statusbar path, ensuring a clear and visible focus indication. + +=== Inability to type `{` character on German keyboard layouts + +In previous versions of {productname}, an issue was identified on German Mac keyboard layouts where the `+Option+8+` keyboard combination, used to type the opening curved bracket `{`, conflicted with the `+Alt+F12+` shortcut, which is used to focus notifications in the {productname} editor. This conflict occurred because, on German Mac keyboards, `+Option+8+` generated a key code that overlapped with the `+Alt+F12+` function, preventing users from typing `{` in the editor. + +To address this, {productname} {release-version} updates the keyboard event handling, implementing the `event.key` property rather than relying on numeric key codes. This solution ensures that the `{` character can be typed using `+Option+8+` on German Mac keyboards without interfering with the `+Alt+F12+` notification focus shortcut. + +[[known-issues]] +== Known issues + +This section describes issues that users of {productname} {release-version} may encounter and possible workarounds for these issues. + +There is one known issue in {productname} {release-version}. + +=== Screenreader on safari has poor consistency of announcing aria-label +// #TINY-11291 & #TINY-11430 + +In Safari, when using a screen reader on the color picker, the focus is mistakenly placed on the content within the input field rather than the field itself. This causes the screen reader to bypass announcing the aria-label associated with the field. + +As a consequence, users who rely on screen readers may not hear the intended description provided by the aria-label, potentially causing confusion or reducing accessibility. + +**Status**: Currently under investigation. \ No newline at end of file diff --git a/modules/ROOT/pages/changelog.adoc b/modules/ROOT/pages/changelog.adoc index 5c73967a52..9b98ad6e4f 100644 --- a/modules/ROOT/pages/changelog.adoc +++ b/modules/ROOT/pages/changelog.adoc @@ -4,6 +4,32 @@ NOTE: This is the {productname} Community version changelog. For information about the latest {cloudname} or {enterpriseversion} Release, see: xref:release-notes.adoc[{productname} Release Notes]. +== 7.5.0 - 2024-11-06 + +=== Added + +* Added support for using raw CSS in the list of possible colors, using the `color_map_raw` property. +// #GH-9788 +// #TINY-11217 + +=== Improved + +* Improved color picker aria support. +// #TINY-11291 + +=== Fixed + +* Autocompleter would not activate after applying an inline format like font size in some cases. +// #TINY-11273 +* The `toolbar-sticky-offset` would still be applied after entering fullscreen mode. +// #TINY-11137 +* Text and background color toolbar buttons would not be fully greyed out in readonly mode. +// #TINY-11313 +* Closing a nested modal dialog would lose focus from the editor. +// #TINY-11153 +* Inability to type `{` character on German keyboard layouts. +// #TINY-11395 + == 7.4.1 - 2024-10-10 === Fixed diff --git a/modules/ROOT/pages/comments-commands-events-apis.adoc b/modules/ROOT/pages/comments-commands-events-apis.adoc index 6ff3f9f24f..1a03744b2f 100644 --- a/modules/ROOT/pages/comments-commands-events-apis.adoc +++ b/modules/ROOT/pages/comments-commands-events-apis.adoc @@ -37,127 +37,7 @@ tinymce.init({ }); ---- -== APIs - -The {pluginname} plugin provides the xref:comments-commands-events-apis#getEventLog[`+getEventLog()+`] API, as well as an annotator named xref:comments-commands-events-apis#tinycomments-annotator[`+'tinycomments'+`] created using the xref:annotations.adoc[`+editor.annotator+` API]. - -[[getEventLog]] -=== getEventLog() - -include::partial$misc/admon-requires-6.1v.adoc[] - -The `getEventLog` returns a log that contains information and timestamps of all changes to comments, including when: - -* A new comment is added. - -[source,js] ----- -{ - "type": "create", - "timestamp": "2024-10-01T03:07:53.771Z", - "conversationUid": "annotation-r1nn5xdo5ye", - "conversationContext": "Welcome", - "conversationContent": "new comment" -}, ----- - -* A comment is edited. - -[source,js] ----- -{ - "type": "edit-comment", - "timestamp": "2024-10-01T03:08:06.551Z", - "conversationUid": "annotation-r1nn5xdo5ye", - "commentUid": "annotation-r1nn5xdo5ye", - "conversationContext": "Welcome", - "conversationContent": "new comment", - "conversationCreatedAt": "2024-10-01T03:07:53.771Z", - "commentContent": "new comment (Edit comment)", - "commentAuthor": { - "author": "DEMO USER", - "authorName": "DEMO USER" - }, - "conversationAuthor": { - "author": "DEMO USER", - "authorName": "DEMO USER" - } -}, ----- - -* A reply to a comment is added. - -[source,js] ----- -{ - "type": "reply", - "timestamp": "2024-10-01T03:07:53.771Z", - "conversationUid": "annotation-r1nn5xdo5ye", - "commentUid": "annotation-uh00rb41kma", - "conversationContext": "Welcome", - "conversationContent": "new comment (Edit comment)", - "conversationCreatedAt": "2024-10-01T03:07:53.771Z", - "commentContent": "reply to existing comment", - "conversationAuthor": { - "author": "DEMO USER", - "authorName": "DEMO USER" - } -}, ----- - -* A comment is resolved. - -[source,js] ----- -{ - "type": "resolve", - "timestamp": "2024-10-01T03:08:25.783Z", - "conversationUid": "annotation-r1nn5xdo5ye", - "conversationContext": "Welcome", - "conversationContent": "new comment (Edit comment)", - "conversationAuthor": { - "author": "DEMO USER", - "authorName": "DEMO USER" - } -}, ----- - -* A comment is deleted. - -[source,js] ----- -{ - "type": "delete-comment", - "timestamp": "2024-10-01T03:08:23.292Z", - "conversationUid": "annotation-r1nn5xdo5ye", - "commentUid": "annotation-uh00rb41kma", - "conversationContext": "Welcome", - "conversationContent": "new comment (Edit comment)", - "commentContent": "reply to existing comment", - "commentAuthor": { - "author": "DEMO USER", - "authorName": "DEMO USER" - }, - "conversationAuthor": { - "author": "DEMO USER", - "authorName": "DEMO USER" - } -}, ----- - -The event log can be retrieved either in full or with the `after` option, which restricts the returned list to Comment events after a time-stamp date in the link:https://en.wikipedia.org/wiki/ISO_8601[ISO-8601] format, both shown in the following: - -==== Example: using `+getEventLog()+` - -[source,js] ----- -const comments = tinymce.activeEditor.plugins.tinycomments; - -console.log(comments.getEventLog()); -console.log(comments.getEventLog( - { after: '2022-02-22T12:34:56Z' } // ISO-8601 standard: YYYY-MM-DDThh:mm:ssZ -)); ----- +include::partial$plugin-apis/comments-apis.adoc[] [[tinycomments-annotator]] === The `+'tinycomments'+` annotator diff --git a/modules/ROOT/pages/comments-with-mentions.adoc b/modules/ROOT/pages/comments-with-mentions.adoc new file mode 100644 index 0000000000..950c59350b --- /dev/null +++ b/modules/ROOT/pages/comments-with-mentions.adoc @@ -0,0 +1,80 @@ += Configuring the Comments plugin with the Mentions plugin +:navtitle: Comments with Mentions +:description: Information on configuring the Comments plugin with the Mentions plugin. +:keywords: comments, commenting, tinycomments, mentions +:pluginname: Comments +:plugincode: comments + +The Comments plugin can be used with the xref:mentions.adoc[Mentions] plugin to allow users to mention other users in comments. + +When a user starts typing a mention with the `+@+` symbol, the mention dropdown will appear. Users can keep typing to narrow the search results, and either click on the desired user or navigate using arrow keys and press enter to add a mention to the comment. + +When the comment is saved, mentioned users will appear in the comment text in the same way as they do in the editor. + +All mentions are stored in the comment text as plain text, so for the mentions to be displayed correctly, the xref:mentions.adoc[Mentions] plugin must be included in the {productname} configuration when the comments are displayed. + +[IMPORTANT] +To add mentions to comments, both the Comments and Mentions plugins must be included in the {productname} configuration, and all required options must be set. + +[[comments-callback-with-mentions-live-demo]] +== Callback mode interactive example + +liveDemo::comments-callback-with-mentions[] + +[[comments-embedded-with-mentions-live-demo]] +== Embedded mode interactive example + +liveDemo::comments-embedded-with-mentions[] + +== Required Mentions Options + +These configuration options are required for use of the `+mentions+` plugin. + +* xref:mentions_fetch[`+mentions_fetch+`] + +include::partial$configuration/mentions_fetch.adoc[leveloffset=+1] + +== Required Comments options in callback mode + +When using callback mode, the {pluginname} plugin requires callback functions for the following options: + +* xref:tinycomments_create[`+tinycomments_create+`] +* xref:tinycomments_reply[`+tinycomments_reply+`] +* xref:tinycomments_edit_comment[`+tinycomments_edit_comment+`] +* xref:tinycomments_delete_comment[`+tinycomments_delete_comment+`] +* xref:tinycomments_delete[`+tinycomments_delete+`] +* xref:tinycomments_delete_all[`+tinycomments_delete_all+`] +* xref:tinycomments_lookup[`+tinycomments_lookup+`] + +include::partial$configuration/tinycomments_create.adoc[leveloffset=+1] + +include::partial$configuration/tinycomments_reply.adoc[leveloffset=+1] + +include::partial$configuration/tinycomments_edit_comment.adoc[leveloffset=+1] + +include::partial$configuration/tinycomments_delete_comment.adoc[leveloffset=+1] + +include::partial$configuration/tinycomments_delete.adoc[leveloffset=+1] + +include::partial$configuration/tinycomments_delete_all.adoc[leveloffset=+1] + +include::partial$configuration/tinycomments_lookup.adoc[leveloffset=+1] + +== Required Comments options for embedded mode + +When using embedded mode, the {pluginname} plugin requires the following options: + +* xref:tinycomments_author[`+tinycomments_author+`] +* xref:tinycomments_author_name[`+tinycomments_author_name+`] + +include::partial$configuration/tinycomments_author.adoc[leveloffset=+1] + +include::partial$configuration/tinycomments_author_name.adoc[leveloffset=+1] + +== Additional options + +* xref:tinycomments_mentions_enabled[`+tinycomments_mentions_enabled+`] + +include::partial$configuration/tinycomments_mentions_enabled.adoc[leveloffset=+1] + +include::partial$plugin-apis/comments-apis.adoc[] diff --git a/modules/ROOT/pages/release-notes.adoc b/modules/ROOT/pages/release-notes.adoc index 099d57d46e..19605ce3d0 100644 --- a/modules/ROOT/pages/release-notes.adoc +++ b/modules/ROOT/pages/release-notes.adoc @@ -9,6 +9,12 @@ This section lists the releases for {productname} 7 and the changes made in each [cols="1,1"] |=== +a| +[.lead] +xref:7.5-release-notes.adoc#overview[{productname} 7.5] + +Release notes for {productname} 7.5 + a| [.lead] xref:7.4.1-release-notes.adoc#overview[{productname} 7.4.1] @@ -70,6 +76,6 @@ xref:7.0-release-notes.adoc#overview[{productname} 7.0] Release notes for {productname} 7.0 // Uncomment this dummy cell when the number of cells above is odd to ensure the table renders correctly. -// a| +a| |=== diff --git a/modules/ROOT/partials/configuration/exportpdf.adoc b/modules/ROOT/partials/configuration/exportpdf.adoc index bb17d9dc3d..e865bf245b 100644 --- a/modules/ROOT/partials/configuration/exportpdf.adoc +++ b/modules/ROOT/partials/configuration/exportpdf.adoc @@ -28,9 +28,22 @@ tinymce.init({ This option allows the editor to download a PDF document containing its content, along with the specified options defined in the `exportpdf_converter_options`. -*Type:* `+Object+` +**Type:** `+Object+` -*Default value:* `{}` +[NOTE] +As of {productname} 7.5.0, the `exportpdf_converter_options` setting now comes with a default value set to the following: + +.**Default value:** +[source,js] +---- +exportpdf_converter_options: { + format: 'Letter', + margin_top: '1in', + margin_right: '1in', + margin_bottom: '1in', + margin_left: '1in' +} +---- === Example: using `exportpdf_converter_options` diff --git a/modules/ROOT/partials/configuration/exportword.adoc b/modules/ROOT/partials/configuration/exportword.adoc index 93be35fa2a..28c1c679b8 100644 --- a/modules/ROOT/partials/configuration/exportword.adoc +++ b/modules/ROOT/partials/configuration/exportword.adoc @@ -31,9 +31,20 @@ tinymce.init({ The `exportword_converter_options` option, is used to specify and configure various options related to the process of converting and exporting content from the editor to `.docx` Word file. -*Type:* `+Object+` +**Type:** `+Object+` -*Default value:* `{}` +[NOTE] +As of {productname} 7.5.0, the default value of the `exportword_converter_options` setting has been updated to the following: + +.**Default value:** +[source,js] +---- +exportword_converter_options: { + document: { + size: 'letter' + } +} +---- === Example: using `exportword_converter_options` diff --git a/modules/ROOT/partials/configuration/importword-converter-options.adoc b/modules/ROOT/partials/configuration/importword-converter-options.adoc index 6a00ee44d0..b86454db56 100644 --- a/modules/ROOT/partials/configuration/importword-converter-options.adoc +++ b/modules/ROOT/partials/configuration/importword-converter-options.adoc @@ -3,6 +3,21 @@ **Type:** `String` +[NOTE] +As of {productname} 7.5.0, the default value of the `importword_converter_options` setting has been updated to the following: + +.**Default value:** +[source,js] +---- +importword_converter_options: { + formatting: { + styles: 'inline', + resets: 'inline', + defaults: 'inline', + } +} +---- + The `importword_converter_options` setting allows you to customize the behavior of the {pluginname} plugin when converting Word documents to HTML. .Example: using `importword_converter_options` diff --git a/modules/ROOT/partials/configuration/text_color.adoc b/modules/ROOT/partials/configuration/text_color.adoc index b320feba93..1f793eedbf 100644 --- a/modules/ROOT/partials/configuration/text_color.adoc +++ b/modules/ROOT/partials/configuration/text_color.adoc @@ -145,6 +145,32 @@ tinymce.init({ }); ---- +[[color_map_raw]] +=== `+color_map_raw+` + +The `color_map_raw` option specifies a map of text colors that appear in the color picker grid. This configuration provides detailed control over the colors available for the `forecolor` and `backcolor` toolbar options. The following example shows how to set the color map using CSS variables, color functions, and hex codes. + +*Type:* `+Array+` + +==== Example: using `+color_map_raw+` + +[source,js] +---- +tinymce.init({ + selector: 'textarea', // Adjust this value according to your HTML + toolbar: 'forecolor backcolor', + color_map_raw: [ + 'var(--black)', 'Black', // CSS variable-based colors + 'var(--red)', 'Red', + 'hsb(0, 100%, 100%)', 'White hsb', // Color functions like hsb() and hsl() + 'hsl(0, 100%, 50%)', 'Red hsl', + '#ff00ff', 'Pink', // Hex code-based colors + '#00ffff', 'Cyan', + 'var(--purple)', 'Purple', // User-friendly labels for easy identification such as 'Purple'. + '#00FF7F', 'Spring Green' + ], +}); +---- [[color_map_background]] === `color_map_background` diff --git a/modules/ROOT/partials/configuration/tinycomments_mentions_enabled.adoc b/modules/ROOT/partials/configuration/tinycomments_mentions_enabled.adoc new file mode 100644 index 0000000000..45e0df05ce --- /dev/null +++ b/modules/ROOT/partials/configuration/tinycomments_mentions_enabled.adoc @@ -0,0 +1,29 @@ +[[tinycomments_mentions_enabled]] +== `+tinycomments_mentions_enabled+` + +The {pluginname} plugin offers the `+tinycomments_mentions_enabled+` option to control whether the xref:mentions.adoc[Mentions] plugin will be incorporated into the {pluginname} plugin, when both plugins are included in the configuration. + +*Type:* `+Boolean+` + +*Possible values:* `true`, `false` + +*Default value:* `true` + +=== Example: using `tinycomments_mentions_enabled` option + +[source,js] +---- +tinymce.init({ + selector: 'textarea', // change this value according to your html + plugins: 'tinycomments mentions', + toolbar: 'addcomment showcomments', + tinycomments_mentions_enabled: true, + tinycomments_mode: 'embedded', + tinycomments_author: 'johnsmith', + tinycomments_author_name: 'John Smith', + mentions_fetch, + mentions_menu_complete, + mentions_menu_hover, + mentions_select +}); +---- \ No newline at end of file diff --git a/modules/ROOT/partials/integrations/swing-quick-start.adoc b/modules/ROOT/partials/integrations/swing-quick-start.adoc index 5ed83008e2..c8d8eb895a 100644 --- a/modules/ROOT/partials/integrations/swing-quick-start.adoc +++ b/modules/ROOT/partials/integrations/swing-quick-start.adoc @@ -4,7 +4,7 @@ Users can easily configure the {productname} editor in Swing through the *{produ To start using {productname} for Swing as your new rich text editor, the first step is to obtain a copy of the *Integration*. -Contact link:{supporturl}[{supportname}] to discuss how to get started with our latest release. +link:{contactpage}[{contactsales}] to discuss how to get started with our latest release. == Get started with our TinyMCE in Swing integration diff --git a/modules/ROOT/partials/misc/supported-versions.adoc b/modules/ROOT/partials/misc/supported-versions.adoc index d7408304e6..6664138b98 100644 --- a/modules/ROOT/partials/misc/supported-versions.adoc +++ b/modules/ROOT/partials/misc/supported-versions.adoc @@ -6,6 +6,7 @@ Supported versions of {productname}: [cols="^,^,^",options="header"] |=== |Version |Release Date |End of Premium Support +|7.5 |2025-11/06 |2027-05-06 |7.4 |2024-10-09 |2026-04-09 |7.3 |2024-08-07 |2026-02-07 |7.2 |2024-06-19 |2025-12-19 diff --git a/modules/ROOT/partials/plugin-apis/comments-apis.adoc b/modules/ROOT/partials/plugin-apis/comments-apis.adoc new file mode 100644 index 0000000000..127d967288 --- /dev/null +++ b/modules/ROOT/partials/plugin-apis/comments-apis.adoc @@ -0,0 +1,149 @@ +== APIs + +The {pluginname} plugin provides the xref:comments-commands-events-apis#getEventLog[`+getEventLog()+`] API, as well as an annotator named xref:comments-commands-events-apis#tinycomments-annotator[`+'tinycomments'+`] created using the xref:annotations.adoc[`+editor.annotator+` API]. + +[[getEventLog]] +=== getEventLog() + +include::partial$misc/admon-requires-6.1v.adoc[] + +The `getEventLog` returns a log that contains information and timestamps of all changes to comments, including when: + +* A new comment is added. + +[source,js] +---- +{ + "type": "create", + "timestamp": "2024-10-01T03:07:53.771Z", + "conversationUid": "annotation-r1nn5xdo5ye", + "conversationContext": "Welcome", + "conversationContent": "new comment", + "conversationAuthor": { + "author": "DEMO USER", + "authorName": "DEMO USER" + } +}, +---- + +* A comment is edited. + +[source,js] +---- +{ + "type": "edit-comment", + "timestamp": "2024-10-01T03:08:06.551Z", + "conversationUid": "annotation-r1nn5xdo5ye", + "commentUid": "annotation-r1nn5xdo5ye", + "conversationContext": "Welcome", + "conversationContent": "new comment", + "conversationCreatedAt": "2024-10-01T03:07:53.771Z", + "commentContent": "new comment (Edit comment)", + "commentAuthor": { + "author": "DEMO USER", + "authorName": "DEMO USER" + }, + "conversationAuthor": { + "author": "DEMO USER", + "authorName": "DEMO USER" + } +}, +---- + +* A reply to a comment is added. + +[source,js] +---- +{ + "type": "reply", + "timestamp": "2024-10-01T03:07:53.771Z", + "conversationUid": "annotation-r1nn5xdo5ye", + "commentUid": "annotation-uh00rb41kma", + "conversationContext": "Welcome", + "conversationContent": "new comment (Edit comment)", + "conversationCreatedAt": "2024-10-01T03:07:53.771Z", + "commentContent": "reply to existing comment", + "conversationAuthor": { + "author": "DEMO USER", + "authorName": "DEMO USER" + } +}, +---- + +* A comment is resolved. + +[source,js] +---- +{ + "type": "resolve", + "timestamp": "2024-10-01T03:08:25.783Z", + "conversationUid": "annotation-r1nn5xdo5ye", + "conversationContext": "Welcome", + "conversationContent": "new comment (Edit comment)", + "conversationAuthor": { + "author": "DEMO USER", + "authorName": "DEMO USER" + } +}, +---- + +* A comment is deleted. + +[source,js] +---- +{ + "type": "delete-comment", + "timestamp": "2024-10-01T03:08:23.292Z", + "conversationUid": "annotation-r1nn5xdo5ye", + "commentUid": "annotation-uh00rb41kma", + "conversationContext": "Welcome", + "conversationContent": "new comment (Edit comment)", + "commentContent": "reply to existing comment", + "commentAuthor": { + "author": "DEMO USER", + "authorName": "DEMO USER" + }, + "conversationAuthor": { + "author": "DEMO USER", + "authorName": "DEMO USER" + } +}, +---- + +The event log can be retrieved either in full or with the `after` option, which restricts the returned list to Comment events after a time-stamp date in the link:https://en.wikipedia.org/wiki/ISO_8601[ISO-8601] format, both shown in the following: + +==== With the Mentions plugin + +When the xref:mentions.adoc[Mentions] plugin is enabled, each of the above events will include the `mentionedUids` property, which contains an array of UIDs mentioned in the comment. The `mentionedUids` property is only included when the xref:mentions.adoc[Mentions] plugin is enabled. + +It is recommended to use this API to retrieve which users have been mentioned in comments. + +==== Example: using `+getEventLog()+` + +[source,js] +---- +const comments = tinymce.activeEditor.plugins.tinycomments; + +console.log(comments.getEventLog()); +console.log(comments.getEventLog( + { after: '2022-02-22T12:34:56Z' } // ISO-8601 standard: YYYY-MM-DDThh:mm:ssZ +)); + +const eventLog = comments.getEventLog(); +const events = eventLog.events; +const mentionedUsers = events.flatMap(({ mentionedUids }) => mentionedUids || []); +console.log(mentionedUsers); + +let whoMentionedWho = {}; +events.forEach((event) => { + if ((event.type === "create" || event.type === "reply") && event.mentionedUids !== undefined) { + console.log(event); + if (whoMentionedWho[event.conversationAuthor.author] === undefined) { + whoMentionedWho[event.conversationAuthor.author] = [...event.mentionedUids]; + } else { + whoMentionedWho[event.conversationAuthor.author].push(...event.mentionedUids); + } + } +}); +console.log(whoMentionedWho); +---- From e77667d42c43832172efcbc8a2a00b1a043436cc Mon Sep 17 00:00:00 2001 From: Karl Kemister-Sheppard Date: Wed, 6 Nov 2024 13:18:57 +1000 Subject: [PATCH 77/97] DOC-2554: api-version bump to tinymce 7.5.0. (#3503) --- .api-version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.api-version b/.api-version index b616717999..a2931d315b 100644 --- a/.api-version +++ b/.api-version @@ -1 +1 @@ -7.4.0 \ No newline at end of file +7.5.0 \ No newline at end of file From 961063628d6a1d96beb42cbe517882ca3c4cac3a Mon Sep 17 00:00:00 2001 From: Karl Kemister-Sheppard Date: Mon, 11 Nov 2024 10:58:03 +1000 Subject: [PATCH 78/97] DOC-2566: Add `sidebar_show: 'showcomments'` to the Comments Demos, and quickbars. (#3504) * DOC-2566: Add sidebar_show option to various demos, and include quickbars. * Add quickbars and image plugins to comments-callback example * DOC-2566: Update fakeDelay to 200ms * DOC-2566: update Comments with readonly set to true demo to include sidebar_show option. --- .../live-demos/comments-callback-with-mentions/index.js | 7 +++++-- .../ROOT/examples/live-demos/comments-callback/example.js | 6 ++++-- .../ROOT/examples/live-demos/comments-callback/index.js | 4 +++- .../live-demos/comments-embedded-with-mentions/index.js | 5 ++++- .../ROOT/examples/live-demos/comments-embedded/index.js | 5 ++++- .../examples/live-demos/comments-readonly-mode/index.js | 5 ++++- modules/ROOT/examples/live-demos/comments-ui-mode/index.js | 7 +++++-- modules/ROOT/pages/7.5-release-notes.adoc | 2 +- modules/ROOT/partials/misc/supported-versions.adoc | 2 +- 9 files changed, 31 insertions(+), 12 deletions(-) diff --git a/modules/ROOT/examples/live-demos/comments-callback-with-mentions/index.js b/modules/ROOT/examples/live-demos/comments-callback-with-mentions/index.js index 5b23fc187c..d59ba9e27c 100644 --- a/modules/ROOT/examples/live-demos/comments-callback-with-mentions/index.js +++ b/modules/ROOT/examples/live-demos/comments-callback-with-mentions/index.js @@ -51,7 +51,7 @@ import ('https://cdn.jsdelivr.net/npm/@faker-js/faker@9/dist/index.min.js').then } }; - const fakeDelay = 500; + const fakeDelay = 200; const numberOfUsers = 200; const randomString = () => { return crypto.getRandomValues(new Uint32Array(1))[0].toString(36).substring(2, 14); @@ -304,8 +304,11 @@ import ('https://cdn.jsdelivr.net/npm/@faker-js/faker@9/dist/index.min.js').then items: 'addcomment showcomments deleteallconversations' } }, - plugins: [ 'tinycomments', 'mentions', 'help', 'code' ], + plugins: [ 'tinycomments', 'mentions', 'help', 'code', 'quickbars', 'link', 'lists', 'image' ], + quickbars_selection_toolbar: 'alignleft aligncenter alignright | addcomment showcomments', + quickbars_image_toolbar: 'alignleft aligncenter alignright | rotateleft rotateright | imageoptions', tinycomments_mentions_enabled: true, + sidebar_show: 'showcomments', mentions_item_type: 'profile', mentions_min_chars: 0, diff --git a/modules/ROOT/examples/live-demos/comments-callback/example.js b/modules/ROOT/examples/live-demos/comments-callback/example.js index 824c745418..9557de760b 100644 --- a/modules/ROOT/examples/live-demos/comments-callback/example.js +++ b/modules/ROOT/examples/live-demos/comments-callback/example.js @@ -204,19 +204,22 @@ const tinycomments_fetch = (conversationUids, done, fail) => { tinymce.init({ selector: 'textarea#comments-callback', height: 800, - plugins: 'code tinycomments help lists', + plugins: 'code tinycomments help lists quickbars link image', toolbar: 'addcomment showcomments | undo redo | blocks | ' + 'bold italic backcolor | alignleft aligncenter ' + 'alignright alignjustify | bullist numlist outdent indent | ' + 'removeformat | help', menubar: 'file edit view insert format tc', + sidebar_show: 'showcomments', menu: { tc: { title: 'Comments', items: 'addcomment showcomments deleteallconversations', }, }, + quickbars_selection_toolbar: 'alignleft aligncenter alignright | addcomment showcomments', + quickbars_image_toolbar: 'alignleft aligncenter alignright | rotateleft rotateright | imageoptions', tinycomments_create, tinycomments_reply, tinycomments_edit_comment, @@ -225,5 +228,4 @@ tinymce.init({ tinycomments_delete_comment, tinycomments_lookup, tinycomments_fetch, - sidebar_show: 'showcomments', }); diff --git a/modules/ROOT/examples/live-demos/comments-callback/index.js b/modules/ROOT/examples/live-demos/comments-callback/index.js index 8f8e3daf05..c0b27fc248 100644 --- a/modules/ROOT/examples/live-demos/comments-callback/index.js +++ b/modules/ROOT/examples/live-demos/comments-callback/index.js @@ -696,13 +696,15 @@ tinymce.ScriptLoader.loadScripts( tinymce.init({ selector: 'textarea#comments-callback', height: 800, - plugins: 'code tinycomments help lists', + plugins: 'code tinycomments help lists quickbars link image', toolbar: 'addcomment showcomments | undo redo | blocks | ' + 'bold italic backcolor | alignleft aligncenter ' + 'alignright alignjustify | bullist numlist outdent indent | ' + 'removeformat | help', menubar: 'file edit view insert format tc', + quickbars_selection_toolbar: 'alignleft aligncenter alignright | addcomment showcomments', + quickbars_image_toolbar: 'alignleft aligncenter alignright | rotateleft rotateright | imageoptions', menu: { tc: { title: 'Comments', diff --git a/modules/ROOT/examples/live-demos/comments-embedded-with-mentions/index.js b/modules/ROOT/examples/live-demos/comments-embedded-with-mentions/index.js index cb8b01c034..c2639167f7 100644 --- a/modules/ROOT/examples/live-demos/comments-embedded-with-mentions/index.js +++ b/modules/ROOT/examples/live-demos/comments-embedded-with-mentions/index.js @@ -140,7 +140,9 @@ import ('https://cdn.jsdelivr.net/npm/@faker-js/faker@9/dist/index.min.js').then items: 'addcomment showcomments deleteallconversations' } }, - plugins: [ 'tinycomments', 'mentions', 'help', 'code' ], + plugins: [ 'tinycomments', 'mentions', 'help', 'code', 'quickbars', 'link', 'lists', 'image' ], + quickbars_selection_toolbar: 'alignleft aligncenter alignright | addcomment showcomments', + quickbars_image_toolbar: 'alignleft aligncenter alignright | rotateleft rotateright | imageoptions', tinycomments_mentions_enabled: true, mentions_item_type: 'profile', @@ -152,6 +154,7 @@ import ('https://cdn.jsdelivr.net/npm/@faker-js/faker@9/dist/index.min.js').then mentions_select, tinycomments_mode: 'embedded', + sidebar_show: 'showcomments', tinycomments_author: currentUser.id, tinycomments_author_name: currentUser.fullName, tinycomments_avatar: currentUser.image, diff --git a/modules/ROOT/examples/live-demos/comments-embedded/index.js b/modules/ROOT/examples/live-demos/comments-embedded/index.js index e09fbb2121..d0aa9d9c21 100644 --- a/modules/ROOT/examples/live-demos/comments-embedded/index.js +++ b/modules/ROOT/examples/live-demos/comments-embedded/index.js @@ -3,7 +3,7 @@ const userAllowedToResolve = 'Admin1'; tinymce.init({ selector: 'textarea#comments-embedded', - plugins: 'code tinycomments', + plugins: 'code tinycomments quickbars link lists image', toolbar: 'addcomment showcomments | bold italic underline', menubar: 'file edit view insert format tools tc', menu: { @@ -12,7 +12,10 @@ tinymce.init({ items: 'addcomment showcomments deleteallconversations' } }, + quickbars_selection_toolbar: 'alignleft aligncenter alignright | addcomment showcomments', + quickbars_image_toolbar: 'alignleft aligncenter alignright | rotateleft rotateright | imageoptions', tinycomments_mode: 'embedded', + sidebar_show: 'showcomments', tinycomments_author: currentAuthor, tinycomments_can_resolve: (req, done, fail) => { const allowed = req.comments.length > 0 && diff --git a/modules/ROOT/examples/live-demos/comments-readonly-mode/index.js b/modules/ROOT/examples/live-demos/comments-readonly-mode/index.js index 22cbbbaa73..9e366a42b1 100644 --- a/modules/ROOT/examples/live-demos/comments-readonly-mode/index.js +++ b/modules/ROOT/examples/live-demos/comments-readonly-mode/index.js @@ -3,10 +3,13 @@ tinymce.init({ plugins: [ "tinycomments", "advlist", "anchor", "autolink", "charmap", "code", "fullscreen", "help", "image", "insertdatetime", "link", "lists", "media", - "preview", "searchreplace", "table", "visualblocks", + "preview", "searchreplace", "table", "visualblocks", "quickbars", ], toolbar: "addcomment showcomments togglereadonly | undo redo | styles | bold italic underline strikethrough | alignleft aligncenter alignright alignjustify | bullist numlist outdent indent | link image", + quickbars_selection_toolbar: 'alignleft aligncenter alignright | addcomment showcomments', + quickbars_image_toolbar: 'alignleft aligncenter alignright | rotateleft rotateright | imageoptions', tinycomments_mode: 'embedded', + sidebar_show: 'showcomments', readonly: true, setup: (editor) => { const isReadonlyMode = () => editor.mode.get() === 'readonly'; diff --git a/modules/ROOT/examples/live-demos/comments-ui-mode/index.js b/modules/ROOT/examples/live-demos/comments-ui-mode/index.js index 5224935f09..2b4ebb3852 100644 --- a/modules/ROOT/examples/live-demos/comments-ui-mode/index.js +++ b/modules/ROOT/examples/live-demos/comments-ui-mode/index.js @@ -3,9 +3,12 @@ tinymce.init({ plugins: [ "tinycomments", "advlist", "anchor", "autolink", "charmap", "code", "fullscreen", "help", "image", "insertdatetime", "link", "lists", "media", - "preview", "searchreplace", "table", "visualblocks", + "preview", "searchreplace", "table", "visualblocks", "quickbars", 'quickbars', 'image', ], toolbar: "addcomment showcomments | undo redo | styles | bold italic underline strikethrough | alignleft aligncenter alignright alignjustify | bullist numlist outdent indent | link image", + quickbars_selection_toolbar: 'alignleft aligncenter alignright | addcomment showcomments', + quickbars_image_toolbar: 'alignleft aligncenter alignright | rotateleft rotateright | imageoptions', tinycomments_mode: 'embedded', - tinycomments_access: 'comment' + tinycomments_access: 'comment', + sidebar_show: 'showcomments' }); \ No newline at end of file diff --git a/modules/ROOT/pages/7.5-release-notes.adoc b/modules/ROOT/pages/7.5-release-notes.adoc index 5bc2316336..76c40f7f96 100644 --- a/modules/ROOT/pages/7.5-release-notes.adoc +++ b/modules/ROOT/pages/7.5-release-notes.adoc @@ -132,7 +132,7 @@ The **Comments** plugin now offers the `xref:comments-with-mentions.adoc#tinycom For information on the **Comments with Mentions** feature, see xref:comments-with-mentions.adoc[Configuring the Comments plugin with the Mentions plugin]. -==== The `conversationAuthor` property was missing from 'create` conversation events in the EventLog API. +==== The `conversationAuthor` property was missing from `create` conversation events in the EventLog API. // #TINY-11352 In previous versions of the tinycomments plugin, the `conversationAuthor` property was missing from 'create' events within the event log, which led to incomplete tracking of user interactions when retrieving data through the `+getEventLog()+` API. diff --git a/modules/ROOT/partials/misc/supported-versions.adoc b/modules/ROOT/partials/misc/supported-versions.adoc index 6664138b98..fa43693ffa 100644 --- a/modules/ROOT/partials/misc/supported-versions.adoc +++ b/modules/ROOT/partials/misc/supported-versions.adoc @@ -6,7 +6,7 @@ Supported versions of {productname}: [cols="^,^,^",options="header"] |=== |Version |Release Date |End of Premium Support -|7.5 |2025-11/06 |2027-05-06 +|7.5 |2025-11-06 |2027-05-06 |7.4 |2024-10-09 |2026-04-09 |7.3 |2024-08-07 |2026-02-07 |7.2 |2024-06-19 |2025-12-19 From 180715fc95e35deca4d8cae670967f17d9396136 Mon Sep 17 00:00:00 2001 From: Karl Kemister-Sheppard Date: Wed, 13 Nov 2024 13:27:49 +1000 Subject: [PATCH 79/97] DOC-2569: TinyMCE 7.5.1 Release Documentation & Community Changelog. (#3506) * DOC-2569: TinyMCE 7.5.1 Release Documentation & Community Changelog. * Release-751: Update wording * DOC-2569: Update release date, and api-version bump. --------- Co-authored-by: MitchCTiny --- .api-version | 2 +- modules/ROOT/nav.adoc | 3 ++ modules/ROOT/pages/7.5.1-release-notes.adoc | 37 +++++++++++++++++++++ modules/ROOT/pages/release-notes.adoc | 6 ++++ 4 files changed, 47 insertions(+), 1 deletion(-) create mode 100644 modules/ROOT/pages/7.5.1-release-notes.adoc diff --git a/.api-version b/.api-version index a2931d315b..7501d508f7 100644 --- a/.api-version +++ b/.api-version @@ -1 +1 @@ -7.5.0 \ No newline at end of file +7.5.1 \ No newline at end of file diff --git a/modules/ROOT/nav.adoc b/modules/ROOT/nav.adoc index 0b4d045dd5..47b1c49a5a 100644 --- a/modules/ROOT/nav.adoc +++ b/modules/ROOT/nav.adoc @@ -409,6 +409,9 @@ ** xref:tinymce-and-cors.adoc[Cross-Origin Resource Sharing (CORS)] * Release information ** xref:release-notes.adoc[Release notes for {productname}] +*** {productname} 7.5.1 +**** xref:7.5.1-release-notes.adoc#overview[Overview] +**** xref:7.5.1-release-notes.adoc#accompanying-premium-plugin-changes[Accompanying Premium Plugin changes] *** {productname} 7.5 **** xref:7.5-release-notes.adoc#overview[Overview] **** xref:7.5-release-notes.adoc#accompanying-premium-plugin-changes[Accompanying Premium Plugin changes] diff --git a/modules/ROOT/pages/7.5.1-release-notes.adoc b/modules/ROOT/pages/7.5.1-release-notes.adoc new file mode 100644 index 0000000000..6c8eacba5f --- /dev/null +++ b/modules/ROOT/pages/7.5.1-release-notes.adoc @@ -0,0 +1,37 @@ += {productname} {release-version} +:release-version: 7.5.1 +:navtitle: {productname} {release-version} +:description: Release notes for {productname} {release-version} +:keywords: releasenotes, new, changes, bugfixes +:page-toclevels: 1 + +include::partial$misc/admon-releasenotes-for-stable.adoc[] + + +[[overview]] +== Overview + +{productname} {release-version} was released for {enterpriseversion} and {cloudname} on Wednesday, November 13^th^, 2024. These release notes provide an overview of the changes for {productname} {release-version}, including: + +* xref:accompanying-premium-plugin-changes[Accompanying Premium plugin changes] + + +[[accompanying-premium-plugin-changes]] +== Accompanying Premium plugin changes + +The following premium plugin updates were released alongside {productname} {release-version}. + +=== Comments + +The {productname} {release-version} release includes an accompanying release of the **Comments** premium plugin. + +**Comments** Premium plugin includes the following additions and fix. + +==== Conversations did not load when the comments sidebar was opened on editor load with `sidebar_show`. +// #TINY-11506 + +In the {productname} 7.5 release of the **Comments** Plugin, the sidebar would not display comments when conversations took longer than ~200ms to be fetched. This issue occurred when the comments sidebar was set to open on editor load, such as using the `sidebar_show` option. + +{productname} {release-version} addresses this issue, by ensuring that `conversationUids` are set on initialization, allowing the sidebar to properly display conversations as soon as they are retrieved. + +For information on the **Comments** plugin, see: xref:introduction-to-tiny-comments.adoc[Introduction to {companyname} Comments]. \ No newline at end of file diff --git a/modules/ROOT/pages/release-notes.adoc b/modules/ROOT/pages/release-notes.adoc index 19605ce3d0..584545b6f5 100644 --- a/modules/ROOT/pages/release-notes.adoc +++ b/modules/ROOT/pages/release-notes.adoc @@ -9,6 +9,12 @@ This section lists the releases for {productname} 7 and the changes made in each [cols="1,1"] |=== +a| +[.lead] +xref:7.5.1-release-notes.adoc#overview[{productname} 7.5.1] + +Release notes for {productname} 7.5.1 + a| [.lead] xref:7.5-release-notes.adoc#overview[{productname} 7.5] From b91080a50e72c2231468e5bb270f2b8879363163 Mon Sep 17 00:00:00 2001 From: "CODE:AG" <57781325+abhinavgandham@users.noreply.github.com> Date: Mon, 18 Nov 2024 11:04:19 +1000 Subject: [PATCH 80/97] Updated the support information. (#3507) --- modules/ROOT/partials/misc/supported-versions.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ROOT/partials/misc/supported-versions.adoc b/modules/ROOT/partials/misc/supported-versions.adoc index fa43693ffa..ed0795b63e 100644 --- a/modules/ROOT/partials/misc/supported-versions.adoc +++ b/modules/ROOT/partials/misc/supported-versions.adoc @@ -30,7 +30,7 @@ Bug fixes and new features are always released in the latest version of {product === Security updates: * Security updates are released in the latest minor version of each major version of {productname} that is still under active premium or LTS support ({productname} 7, {productname} 6, {productname} 5 LTS). -* Security updates for the free open source edition of {productname} are issued only for around six months after the new major version is available. Security support for the free open source version of {productname} 6 ends on October 31, 2024. +* Security updates for the free open source edition of {productname} are issued only for around six months after the new major version is available. Security support for the free open source version of {productname} 6 ended on October 31, 2024. * For customers with a commercial license, security support for {productname} 6 ends on June 6, 2025. * {productname} 5 (both open source and commercial versions) is no longer receiving security updates. However, it is possible to extend security support for {productname} 5 by purchasing a dedicated LTS (Long Term Support) agreement. If you are interested in purchasing a {productname} 5 LTS license, please link:https://www.tiny.cloud/contact/[contact us]. From cdb5130478daba85c184ed89ff6c2e1e5c483e39 Mon Sep 17 00:00:00 2001 From: "CODE:AG" <57781325+abhinavgandham@users.noreply.github.com> Date: Mon, 18 Nov 2024 11:09:39 +1000 Subject: [PATCH 81/97] DOC-2573: Convert headings in changelog to xref links that point to their respective release notes. (#3509) * Converted headings in changelog to xref links that point to their respective release notes. * Fixed xrefs to contain full version name and fixed the 7.5.0 xref to point to the correct release notes. --- modules/ROOT/pages/changelog.adoc | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/modules/ROOT/pages/changelog.adoc b/modules/ROOT/pages/changelog.adoc index 9b98ad6e4f..bf166c6170 100644 --- a/modules/ROOT/pages/changelog.adoc +++ b/modules/ROOT/pages/changelog.adoc @@ -4,7 +4,7 @@ NOTE: This is the {productname} Community version changelog. For information about the latest {cloudname} or {enterpriseversion} Release, see: xref:release-notes.adoc[{productname} Release Notes]. -== 7.5.0 - 2024-11-06 +== xref:7.5-release-notes.adoc[7.5.0 - 2024-11-06] === Added @@ -30,14 +30,14 @@ NOTE: This is the {productname} Community version changelog. For information abo * Inability to type `{` character on German keyboard layouts. // #TINY-11395 -== 7.4.1 - 2024-10-10 +== xref:7.4.1-release-notes.adoc[7.4.1 - 2024-10-10] === Fixed * Invalid HTML elements within SVG elements were not removed. // #TINY-11332 -== 7.4.0 - 2024-10-09 +== xref:7.4-release-notes.adoc[7.4.0 - 2024-10-09] === Added @@ -76,7 +76,7 @@ NOTE: This is the {productname} Community version changelog. For information abo * The editor resize handle was incorrectly rendered when all components were removed from the status bar. // #TINY-11257 -== 7.3.0 - 2024-08-07 +== xref:7.3-release-notes.adoc[7.3.0 - 2024-08-07] === Added * Colorpicker number input fields now show an error tooltip and error icon when invalid text has been entered. @@ -108,7 +108,7 @@ NOTE: This is the {productname} Community version changelog. For information abo * Colorpicker's hex-based input field showed the wrong validation error message. // #TINY-11115 -== 7.2.1 - 2024-07-03 +== xref:7.2.1-release-notes.adoc[7.2.1 - 2024-07-03] === Fixed * Text content could move unexpectedly when deleting a paragraph. @@ -120,7 +120,7 @@ NOTE: This is the {productname} Community version changelog. For information abo * Open Link button was disabled when selection partially covered a link or when multiple links were selected. // #TINY-11009 -== 7.2.0 - 2024-06-19 +== xref:7.2-release-notes.adoc[7.2.0 - 2024-06-19] === Added * Added `options.debug` API that logs the initial raw editor options to console. @@ -165,13 +165,13 @@ NOTE: This is the {productname} Community version changelog. For information abo // #TINY-11022 -== 7.1.2 - 2024-06-05 +== xref:7.1.2-release-notes.adoc[7.1.2 - 2024-06-05] ### Fixed - CSS color values set to `transparent` were incorrectly converted to `+#000000+`. // #TINY-10916 -== 7.1.1 - 2024-05-22 +== xref:7.1.1-release-notes.adoc[7.1.1 - 2024-05-22] === Fixed @@ -186,7 +186,7 @@ NOTE: This is the {productname} Community version changelog. For information abo * Autocompleter possible values are no longer capped at a length of 10. // #TINY-10942 -== 7.1.0 - 2024-05-08 +== xref:7.1-release-notes.adoc[7.1.0 - 2024-05-08] === Added @@ -243,7 +243,7 @@ NOTE: This is the {productname} Community version changelog. For information abo * The "Open Link" context menu action was not enabled for links on images. // #TINY-10391 -== 7.0.1 - 2024-04-10 +== xref:7.0.1-release-notes.adoc[7.0.1 - 2024-04-10] === Fixed @@ -258,7 +258,7 @@ NOTE: This is the {productname} Community version changelog. For information abo * The status bar was invisible when the editor's height was set to the minimum. // #TINY-10705 -== 7.0.0 - 2024-03-20 +== xref:7.0-release-notes.adoc[7.0.0 - 2024-03-20] [NOTE] {productname} 7.0 is licensed under GPL Version 2 or later. This version introduces a new `license_key` configuration setting that gives self-hosted users the ability to select a usage under the GPL or to authenticate their paid license with Tiny. From 4ee1ed89b28d356c2b7e76bf815c5982d5bea0cf Mon Sep 17 00:00:00 2001 From: Farzad Hayat Date: Mon, 18 Nov 2024 14:48:46 +1100 Subject: [PATCH 82/97] DOC-2570: Add LicenseKey property to Blazor Tech Ref (#3510) * DOC-2570: Add LicenseKey property to Blazor Tech Ref * Change CloudChannel to {productmajorversion} --- .../integrations/blazor-tech-ref.adoc | 22 ++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/modules/ROOT/partials/integrations/blazor-tech-ref.adoc b/modules/ROOT/partials/integrations/blazor-tech-ref.adoc index 9f2cc84635..3af7d14c5b 100644 --- a/modules/ROOT/partials/integrations/blazor-tech-ref.adoc +++ b/modules/ROOT/partials/integrations/blazor-tech-ref.adoc @@ -8,18 +8,19 @@ Covered in this section: The `+TinyMCE.Blazor+` `+Editor+` component accepts the following properties: -[source,cs] +[source,cs,subs="attributes+"] ---- ---- @@ -167,6 +168,21 @@ In your component: /> ---- +=== `LicenseKey` + +Specifies the {productname} license key. Required for self-hosted deployments of {productname}. This property is not required for deployments using the {cloudname}. For more information on licensing, see: xref:license-key.adoc[License key]. + +*Type:* `+String+` + +==== Example using LicenseKey + +[source,cs] +---- + +---- + === `ScriptSrc` Use the `+ScriptSrc+` property to specify the location of {productname} to lazy load when the application is not using {cloudname}. This setting is required if the application uses a self-hosted version of {productname}, such as the https://www.nuget.org/packages/TinyMCE/[{productname} NuGet package] or a .zip package of {productname}. From adbf25cbc9c7b3da5654cb5c8d060eaa776d5aa9 Mon Sep 17 00:00:00 2001 From: Andrew Herron Date: Mon, 18 Nov 2024 16:28:48 +1100 Subject: [PATCH 83/97] Fixed user comparison in the fetch function, and sorted the names (#3511) --- modules/ROOT/examples/live-demos/mentions/index.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/ROOT/examples/live-demos/mentions/index.js b/modules/ROOT/examples/live-demos/mentions/index.js index 330d8ba102..57d75acbe3 100644 --- a/modules/ROOT/examples/live-demos/mentions/index.js +++ b/modules/ROOT/examples/live-demos/mentions/index.js @@ -21,6 +21,7 @@ tinymce.ScriptLoader.loadScripts(['https://cdn.jsdelivr.net/npm/faker@5/dist/fak for (let i = 0; i < 200; i++) { userNames.push(faker.name.findName()); } + userNames.sort((a, b) => a.localeCompare(b)); /* This represents a database of users on the server */ const userDb = {}; @@ -79,7 +80,7 @@ tinymce.ScriptLoader.loadScripts(['https://cdn.jsdelivr.net/npm/faker@5/dist/fak } usersRequest.then((users) => { /* `query.term` is the text the user typed after the '@' */ - users = users.filter((user) => user.name.indexOf(query.term.toLowerCase()) !== -1); + users = users.filter((user) => user.name.toLowerCase().includes(query.term.toLowerCase())) users = users.slice(0, 10); From fe5942fbfd2de8a02c8c88a2569635efb4e08672 Mon Sep 17 00:00:00 2001 From: Karl Kemister-Sheppard Date: Tue, 19 Nov 2024 12:56:09 +1000 Subject: [PATCH 84/97] DOC-2579: Update the example using `mentions_fetch` to reflect demo changes. (#3514) * DOC-2579: Update the example using mentions_fetch to reflect demo changes. * DOC-2579: correct syntax errors. * Update modules/ROOT/partials/configuration/mentions_fetch.adoc * Update modules/ROOT/partials/configuration/mentions_fetch.adoc * DOC-2579: copy edits. --- modules/ROOT/partials/configuration/mentions_fetch.adoc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/ROOT/partials/configuration/mentions_fetch.adoc b/modules/ROOT/partials/configuration/mentions_fetch.adoc index 40c59bf62c..4836dc0aef 100644 --- a/modules/ROOT/partials/configuration/mentions_fetch.adoc +++ b/modules/ROOT/partials/configuration/mentions_fetch.adoc @@ -26,9 +26,9 @@ tinymce.init({ usersRequest = fetch('/users'); } usersRequest.then((users) => { - // query.term is the text the user typed after the '@' + // `query.term` is the text the user typed after the '@' users = users.filter((user) => { - return user.name.indexOf(query.term.toLowerCase()) !== -1; + return user.name.toLowerCase().includes(query.term.toLowerCase()); }); users = users.slice(0, 10); From ffa9f06147863ab325c4d112b236577b7e60b30c Mon Sep 17 00:00:00 2001 From: Karl Kemister-Sheppard Date: Tue, 3 Dec 2024 10:19:46 +1000 Subject: [PATCH 85/97] DOC-2589: Update codeql to use v3 for tinymce/7 branch. (#3531) --- .github/workflows/codeql.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index ea8315bbdf..253d9432ca 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -25,15 +25,15 @@ jobs: uses: actions/checkout@v4 - name: Initialize CodeQL - uses: github/codeql-action/init@v2 + uses: github/codeql-action/init@v3 with: languages: ${{ matrix.language }} queries: +security-and-quality - name: Autobuild - uses: github/codeql-action/autobuild@v2 + uses: github/codeql-action/autobuild@v3 - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v2 + uses: github/codeql-action/analyze@v3 with: category: "/language:${{ matrix.language }}" From be71cde1da0cb3c743dabd044075e66c057ceed2 Mon Sep 17 00:00:00 2001 From: Karl Kemister-Sheppard Date: Tue, 10 Dec 2024 11:17:16 +1000 Subject: [PATCH 86/97] DOC-2593: Update openai_proxy_token for tinymce/7 (#3552) --- antora.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/antora.yml b/antora.yml index 60b0544775..a8cc6c4e19 100644 --- a/antora.yml +++ b/antora.yml @@ -15,7 +15,7 @@ asciidoc: webcomponent_url: https://cdn.jsdelivr.net/npm/@tinymce/tinymce-webcomponent@2/dist/tinymce-webcomponent.min.js jquery_url: https://cdn.jsdelivr.net/npm/@tinymce/tinymce-jquery@2/dist/tinymce-jquery.min.js openai_proxy_url: https://openai.ai-demo-proxy.tiny.cloud/v1/chat/completions - openai_proxy_token: eyJhbGciOiJFUzM4NCJ9.eyJhdWQiOlsiaHR0cHM6Ly9vcGVuYWkuYWktZGVtby1wcm94eS50aW55LmNsb3VkLyJdLCJleHAiOjE3MzMwMTEyMDAsImh0dHBzOi8vb3BlbmFpLmFpLWRlbW8tcHJveHkudGlueS5jbG91ZC9yb2xlIjoicHVibGljLWRlbW8iLCJpc3MiOiJodHRwczovL2FpLWRlbW8tcHJveHkudGlueS5jbG91ZC8iLCJqdGkiOiIyMmM0MjBkNy1hNjVmLTQ3NDQtODEwZS1jZWY3ZDY2ODQ1ZGYiLCJzdWIiOiJhaS1hc3Npc3RhbnQtZGVtbyJ9.H0MgAgu6EUFLO2zx6fnsnmCMw_0MWtc3Ne4ue6N_CFAowPkIjBqr022ypJqj5i3FMJNad5cWYj84jKKfPHTUaFN5RNurl09K2SDnY2OqNnhcXOT9rl3owhrGxgODOR9G + openai_proxy_token: eyJhbGciOiJFUzM4NCJ9.eyJhdWQiOlsiaHR0cHM6Ly9vcGVuYWkuYWktZGVtby1wcm94eS50aW55LmNsb3VkLyJdLCJleHAiOjE3NTEzMjgwMDAsImh0dHBzOi8vb3BlbmFpLmFpLWRlbW8tcHJveHkudGlueS5jbG91ZC9yb2xlIjoicHVibGljLWRlbW8iLCJpc3MiOiJodHRwczovL2FpLWRlbW8tcHJveHkudGlueS5jbG91ZC8iLCJqdGkiOiJmOGFmY2EyNC1mN2FhLTQxMjktYTc2Yy02YThlZDU3YjAyZjYiLCJzdWIiOiJhaS1hc3Npc3RhbnQtZGVtbyJ9.Xu0apHCbxgmRQTeTqrTIDFFhh2CgKeARRXa3mCxSGoCwZqkoQaFRZBCzDo8Xz7DuUa5mW2XHl-HYcYiXJM9ly16d0oY7lJefHBeLlmJEBE1CSttHBkCRWZS8eFLCasL6 default_meta_keywords: tinymce, documentation, docs, plugins, customizable skins, configuration, examples, html, php, java, javascript, image editor, inline editor, distraction-free editor, classic editor, wysiwyg # product docker variables dockerimageimportfromwordexporttoword: registry.containers.tiny.cloud/docx-converter-tiny From d9accbe09ce7a55d3820bb5a345b46bf96767e23 Mon Sep 17 00:00:00 2001 From: Farzad Hayat Date: Wed, 11 Dec 2024 13:24:52 +1100 Subject: [PATCH 87/97] DOC-2587: Improve Comments documentation for mentionedUids validation (#3524) * Admonition about known limitation of mentionedUids user validation * Validate mentionedUids in each of the events * Deep copy events to avoid modifying original event log data. * Update modules/ROOT/partials/plugin-apis/comments-apis.adoc Co-authored-by: Mitchell Crompton * Update modules/ROOT/partials/plugin-apis/comments-apis.adoc Co-authored-by: Karl Kemister-Sheppard * Improve the sample user database --------- Co-authored-by: Mitchell Crompton Co-authored-by: Karl Kemister-Sheppard --- .../partials/plugin-apis/comments-apis.adoc | 39 ++++++++++++++++++- 1 file changed, 37 insertions(+), 2 deletions(-) diff --git a/modules/ROOT/partials/plugin-apis/comments-apis.adoc b/modules/ROOT/partials/plugin-apis/comments-apis.adoc index 127d967288..4fd0149b01 100644 --- a/modules/ROOT/partials/plugin-apis/comments-apis.adoc +++ b/modules/ROOT/partials/plugin-apis/comments-apis.adoc @@ -118,10 +118,37 @@ When the xref:mentions.adoc[Mentions] plugin is enabled, each of the above event It is recommended to use this API to retrieve which users have been mentioned in comments. +[NOTE] +==== +The `mentionedUids` array captures strings following the `@` symbol without verifying if they correspond to valid user IDs. It is the integrator's responsibility to validate these strings against the database to ensure they represent valid users. + +For guidance on retrieving and verifying the `mentionedUids` array, refer to the xref:#example-using-geteventlog[getEventLog example]. + +==== + +[[example-using-geteventlog]] ==== Example: using `+getEventLog()+` [source,js] ---- +// Sample user database +const userDb = { + "johnsmith": { + "id": "johnsmith", + "name": "John Smith", + "fullName": "John Smith", + "description": "Company Founder", + "image": "https://i.pravatar.cc/150?img=11" + }, + "jennynichols": { + "id": "jennynichols", + "name": "Jenny Nichols", + "fullName": "Jenny Nichols", + "description": "Marketing Director", + "image": "https://i.pravatar.cc/150?img=10" + } +}; + const comments = tinymce.activeEditor.plugins.tinycomments; console.log(comments.getEventLog()); @@ -131,11 +158,19 @@ console.log(comments.getEventLog( const eventLog = comments.getEventLog(); const events = eventLog.events; -const mentionedUsers = events.flatMap(({ mentionedUids }) => mentionedUids || []); + +// Ensure that the mentioned users are valid users in the database +const validatedEvents = JSON.parse(JSON.stringify(events)); +validatedEvents.forEach((event) => { + // Filter out invalid users - change this to your own validation logic + event.mentionedUids = event.mentionedUids ? event.mentionedUids.filter((uid) => userDb[uid]) : undefined; +}); + +const mentionedUsers = validatedEvents.flatMap(({ mentionedUids }) => mentionedUids || []); console.log(mentionedUsers); let whoMentionedWho = {}; -events.forEach((event) => { +validatedEvents.forEach((event) => { if ((event.type === "create" || event.type === "reply") && event.mentionedUids !== undefined) { console.log(event); if (whoMentionedWho[event.conversationAuthor.author] === undefined) { From debe7d9f19e76b8154da95c5792d802bee3eaa15 Mon Sep 17 00:00:00 2001 From: Karl Kemister-Sheppard Date: Wed, 11 Dec 2024 15:09:59 +1000 Subject: [PATCH 88/97] DOC-2576: TinyMCE 7.6.0 Release Documentation. (#3512) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * DOC-2576: TinyMCE 7.6.0 Release Documentation. * DOC-2592: Update Accessibility Checker plugin page (#3534) * Fix T4A rule description * DOC-2592: Add contentID property to API section * DOC-2592: Fix inline code inside admonitions * DOC-2592: Remove the `information` severity level * DOC-2592: Replace [object] with actual values in getReport() example * DOC-2592: Improve a11y_advanced_options admonition * DOC-2592: Improve a11ychecker_allow_decorative_images admonition * DOC-2592: Remove trailing comma * DOC-2592: Add "link" to contentID possible types * DOC-2581: Uploadcare new plugin documentation. (#3515) * DOC-2581: Uploadcare Plugin documentation. * Update modules/ROOT/partials/configuration/uploadcare.adoc * DOC-2581: add table of features and operations. * Update modules/ROOT/partials/configuration/uploadcare.adoc Co-authored-by: Farzad Hayat * Update modules/ROOT/partials/configuration/uploadcare.adoc Co-authored-by: Farzad Hayat * Update modules/ROOT/partials/configuration/uploadcare.adoc Co-authored-by: Farzad Hayat * Update modules/ROOT/partials/configuration/uploadcare.adoc Co-authored-by: Farzad Hayat * Update modules/ROOT/pages/uploadcare.adoc Co-authored-by: Farzad Hayat * Update modules/ROOT/partials/configuration/uploadcare.adoc Co-authored-by: Farzad Hayat * Update modules/ROOT/partials/configuration/uploadcare.adoc Co-authored-by: Farzad Hayat * Update modules/ROOT/pages/uploadcare.adoc Co-authored-by: Farzad Hayat * Update modules/ROOT/pages/uploadcare.adoc Co-authored-by: Farzad Hayat * Update modules/ROOT/examples/live-demos/uploadcare/index.js Co-authored-by: Farzad Hayat * Update modules/ROOT/pages/uploadcare.adoc Co-authored-by: Farzad Hayat * Update modules/ROOT/partials/configuration/uploadcare.adoc Co-authored-by: Farzad Hayat * Update modules/ROOT/partials/configuration/uploadcare.adoc Co-authored-by: Farzad Hayat * Update modules/ROOT/partials/configuration/uploadcare.adoc Co-authored-by: Farzad Hayat * Update modules/ROOT/partials/configuration/uploadcare.adoc Co-authored-by: Farzad Hayat * Update modules/ROOT/partials/configuration/uploadcare.adoc Co-authored-by: Farzad Hayat * DOC-2581: Update table of operations DOC-2581: Add important message for secure uploads DOC-2581: Remove demo content COD-2581: Copy edits. * DOC-2581: add note for quickbars plugin known issue. * DOC-2581: Copy edits, update uploadcare config to use partials. * Update modules/ROOT/partials/configuration/a11y_advanced_options.adoc Co-authored-by: Farzad Hayat * Update modules/ROOT/partials/configuration/a11y_advanced_options.adoc Co-authored-by: Farzad Hayat * DOC-2581: Customize a11y_advanced_options.adoc for Uploadcare * Update modules/ROOT/pages/uploadcare.adoc Co-authored-by: spocke * Update modules/ROOT/partials/configuration/uploadcare_store_type.adoc Co-authored-by: spocke * DOC-2581: Added improvements to srcset, svg file name changes, general copy edits. * Update modules/ROOT/partials/menu-item-ids/uploadcare-menu-items.adoc Co-authored-by: Farzad Hayat * Update modules/ROOT/partials/toolbar-button-ids/uploadcare-toolbar-buttons.adoc Co-authored-by: Farzad Hayat * Update modules/ROOT/partials/configuration/uploadcare_srcset_steps.adoc Co-authored-by: Farzad Hayat * DOC-2581: Add decorative image to table for a11y_advanced_option. * DOC-2581: fix table admon. * Update modules/ROOT/pages/uploadcare.adoc Co-authored-by: Farzad Hayat * DOC-2581: Add live-demo content and configuration. --------- Co-authored-by: Farzad Hayat Co-authored-by: spocke * Update uploadcare overview to match release notes. * DOC-2578: TinyMCE 7.6.0 Release Documentation and Community Changelog. (#3513) * DOC-2578: TinyMCE 7.6.0 Release Documentation and Community Changelog. * DOC-2578: Pressing `Shift + Enter` in the comment textarea now selects the highlighted user. (#3522) * DOC-2578: Pressing Shift + Enter in the comment textarea now selects the highlighted user. * Update modules/ROOT/pages/7.6.0-release-notes.adoc Co-authored-by: Karl Kemister-Sheppard * DOC-2578: Moved content to the premium plugin area. * Update modules/ROOT/pages/7.6.0-release-notes.adoc Co-authored-by: Karl Kemister-Sheppard --------- Co-authored-by: Karl Kemister-Sheppard * DOC-2578: Changing the table row type when a `contentEditable="false"` cell was selected would not work as expected. (#3521) * DOC-2578: Tooltip would not show for group toolbar button. (#3520) * DOC-2578: Tooltip would not show for group toolbar button. * Update modules/ROOT/pages/7.6.0-release-notes.adoc Co-authored-by: Farzad Hayat * Update modules/ROOT/pages/7.6.0-release-notes.adoc Co-authored-by: Karl Kemister-Sheppard --------- Co-authored-by: Farzad Hayat Co-authored-by: Karl Kemister-Sheppard * DOC-2578: Enhanced the accessibility checker color palette for better visual contrast and usability (#3532) * DOC-2578: Scroll to show action buttons when replying/editing a comment. (#3523) * DOC-2578: Scroll to show action buttons when replying/editing a comment. * DOC-2578: Moved content to premium plugin section and reworded content to specify we only scroll in the scenario mentioned. * Update modules/ROOT/pages/7.6.0-release-notes.adoc Co-authored-by: Karl Kemister-Sheppard * Update modules/ROOT/pages/7.6.0-release-notes.adoc Co-authored-by: Karl Kemister-Sheppard * Update modules/ROOT/pages/7.6.0-release-notes.adoc Co-authored-by: Karl Kemister-Sheppard --------- Co-authored-by: Karl Kemister-Sheppard * DOC-2586: New disabled option for disabling all user interactions (#3527) * DOC-2578: The mentions menu now expands freely to the available space outside of the editor. (#3533) * DOC-2578: After creating a conversation, the focus goes to the newly … (#3540) * DOC-2578: After creating a conversation, the focus goes to the newly created conversation * DOC-2578: Mentioned some more scenarios where the issue occurred. * DOC-2578: Rephrased content * DOC-2578: Removed title attribute from dialog tree elements as they already have a tooltip. (#3526) * DOC-2578: Removed title attribute from dialog tree elements as they already have a tooltip. * Update 7.6.0-release-notes.adoc Co-authored-by: Karl Kemister-Sheppard * Update modules/ROOT/pages/7.6.0-release-notes.adoc Co-authored-by: Karl Kemister-Sheppard * Update modules/ROOT/pages/7.6.0-release-notes.adoc --------- Co-authored-by: Karl Kemister-Sheppard * DOC-2578: Fixed CSS Bundling for Skin UI Content CSS. (#3537) * DOC-2578: Fixed CSS Bundling for Skin UI Content CSS. * Update modules/ROOT/pages/7.6.0-release-notes.adoc * Update modules/ROOT/pages/7.6.0-release-notes.adoc Co-authored-by: ltrouton <46954949+ltrouton@users.noreply.github.com> * Update modules/ROOT/pages/7.6.0-release-notes.adoc Co-authored-by: CODE:AG <57781325+abhinavgandham@users.noreply.github.com> * Update modules/ROOT/pages/7.6.0-release-notes.adoc Co-authored-by: CODE:AG <57781325+abhinavgandham@users.noreply.github.com> --------- Co-authored-by: ltrouton <46954949+ltrouton@users.noreply.github.com> Co-authored-by: CODE:AG <57781325+abhinavgandham@users.noreply.github.com> * DOC-2578: Checklist items were unresponsive in center or right alignments. (#3542) * DOC-2578: Adjust `tinycomments` UI font size to match the editor UI font size. (#3536) * DOC-2578: Adjust tinycomments UI font size to match the editor UI font size. * Update modules/ROOT/pages/7.6.0-release-notes.adoc Co-authored-by: Farzad Hayat --------- Co-authored-by: Farzad Hayat * DOC-2578: Enhanced accessibility checker UI to display affected content (#3541) * DOC-2578: Enhanced accessibility checker UI to display affected content * Update 7.6.0-release-notes.adoc Co-authored-by: Karl Kemister-Sheppard --------- Co-authored-by: Karl Kemister-Sheppard * DOC-2578: The `commentAuthor` property is now included in reply events for the event log. (#3543) * DOC-2578: The commentAuthor property is now included in reply events of the event log. * Update modules/ROOT/partials/plugin-apis/comments-apis.adoc * Update modules/ROOT/partials/plugin-apis/comments-apis.adoc * Update modules/ROOT/partials/plugin-apis/comments-apis.adoc * Update modules/ROOT/partials/plugin-apis/comments-apis.adoc * Update modules/ROOT/partials/plugin-apis/comments-apis.adoc * DOC-2578: Update callback demo to include commentAuthor. * Update modules/ROOT/partials/configuration/tinycomments_reply.adoc Co-authored-by: tiny-ben-tran --------- Co-authored-by: tiny-ben-tran * DOC-2578: Introduced a new live region for screen readers to improve accessibility notifications. (#3545) * DOC-2578: Introduced a new live region for screen readers to improve accessibility notifications. * DOC-2578: add write-up for ticket. * Update modules/ROOT/pages/7.6.0-release-notes.adoc Co-authored-by: Arvin(Jintao) Han <20640097+ArvinJ-H@users.noreply.github.com> --------- Co-authored-by: Arvin(Jintao) Han <20640097+ArvinJ-H@users.noreply.github.com> * DOC-2578: Reduced the amount of scrolling when changing between conve… (#3544) * DOC-2578: Reduced the amount of scrolling when changing between conversations in the sidebar. * Update modules/ROOT/pages/7.6.0-release-notes.adoc Co-authored-by: Karl Kemister-Sheppard * Update modules/ROOT/pages/7.6.0-release-notes.adoc Co-authored-by: Karl Kemister-Sheppard * Update modules/ROOT/pages/7.6.0-release-notes.adoc --------- Co-authored-by: Karl Kemister-Sheppard * DOC-2578: Update changelog.adoc for TinyMCE 7.6.0. * DOC-2578: Add Labels and Groups for Context Toolbar Buttons. (#3548) * DOC-2578: Add Labels and Groups for Context Toolbar Buttons. * Update antora.yml * DOC-2578: Added placeholder support for context form input fields. (#3549) * DOC-2578: Fixed Caret Position when closing Comment Mentions dropdown (#3525) * DOC-2578: Fixed Caret Position when closing Comment Mentions dropdown TINY-11453 * Update modules/ROOT/pages/7.6.0-release-notes.adoc Co-authored-by: Karl Kemister-Sheppard --------- Co-authored-by: Karl Kemister-Sheppard * DOC-2578: Added tooltips to conversation and comment kebab menus. (#3546) * DOC-2578: Spelling error in tooltip for toggle button (#3547) * DOC-2578: Spelling error in tooltip for toggle button * Update modules/ROOT/pages/7.6.0-release-notes.adoc Co-authored-by: Karl Kemister-Sheppard * Update modules/ROOT/pages/7.6.0-release-notes.adoc Co-authored-by: Karl Kemister-Sheppard --------- Co-authored-by: Karl Kemister-Sheppard * DOC-2578: New `onSetup` function for context forms. (#3550) * DOC-2578: New onSetup function for context forms. * Update modules/ROOT/pages/7.6.0-release-notes.adoc * DOC-2578: General cleanup and structure formatting pre-release. * DOC-2578: New `back` function in `ContextFormApi` to go back to the previous toolbar. (#3558) * DOC-2578: New back function in ContextFormApi to go back to the previous toolbar. * Update modules/ROOT/pages/7.6.0-release-notes.adoc * New QuickbarInsertImage command that is executed by the quickimage button. (#3557) * Image selection was removed when calling nodeChanged while having focus inside the editor UI. (#3556) * DOC-2578: Add known issue for missing translations. * DOC-2578: Incorrect translation of `Cut Column` and `Copy Column` in Hebrew (#3559) * DOC-2578: Incorrect translation of and in Hebrew * Update modules/ROOT/pages/7.6.0-release-notes.adoc Co-authored-by: Karl Kemister-Sheppard --------- Co-authored-by: Karl Kemister-Sheppard * DOC-2578: Add new entry for Image Optimizer new plugin announcment. * DOC-2578: Add entry for new premium plugin Image Optimizer in release notes. * Update modules/ROOT/pages/7.6.0-release-notes.adoc * Update modules/ROOT/pages/changelog.adoc * DOC-2578: Comment out improvements for various last min discovered tickets. * DOC-2578: Comment out changelog title placeholders for post release fixes. * Update modules/ROOT/pages/contexttoolbar.adoc Co-authored-by: Farzad Hayat * Update modules/ROOT/pages/contextform.adoc Co-authored-by: Farzad Hayat * Update modules/ROOT/pages/changelog.adoc Co-authored-by: Farzad Hayat * Update modules/ROOT/pages/changelog.adoc Co-authored-by: Farzad Hayat * Update modules/ROOT/pages/7.6.0-release-notes.adoc Co-authored-by: Farzad Hayat * Update modules/ROOT/pages/7.6.0-release-notes.adoc Co-authored-by: Farzad Hayat * Update modules/ROOT/pages/7.6.0-release-notes.adoc Co-authored-by: Farzad Hayat * Update modules/ROOT/partials/configuration/tinycomments_reply.adoc Co-authored-by: tiny-ben-tran * Update modules/ROOT/pages/7.6.0-release-notes.adoc Co-authored-by: Farzad Hayat * Update modules/ROOT/pages/7.6.0-release-notes.adoc Co-authored-by: Farzad Hayat --------- Co-authored-by: CODE:AG <57781325+abhinavgandham@users.noreply.github.com> Co-authored-by: Farzad Hayat Co-authored-by: ltrouton <46954949+ltrouton@users.noreply.github.com> Co-authored-by: tiny-ben-tran Co-authored-by: Arvin(Jintao) Han <20640097+ArvinJ-H@users.noreply.github.com> * Update api-version to TinyMCE 7.6.0. --------- Co-authored-by: Farzad Hayat Co-authored-by: spocke Co-authored-by: CODE:AG <57781325+abhinavgandham@users.noreply.github.com> Co-authored-by: ltrouton <46954949+ltrouton@users.noreply.github.com> Co-authored-by: tiny-ben-tran Co-authored-by: Arvin(Jintao) Han <20640097+ArvinJ-H@users.noreply.github.com> --- .api-version | 2 +- antora.yml | 2 +- .../live-demos/comments-callback/example.js | 6 +- .../context-toolbar-labels/index.html | 9 + .../context-toolbar-labels/index.js | 34 ++ .../examples/live-demos/uploadcare/index.html | 86 ++++ .../examples/live-demos/uploadcare/index.js | 19 + modules/ROOT/images/icons/add-file.svg | 1 + modules/ROOT/images/icons/adjustments.svg | 3 + modules/ROOT/images/icons/alt-text.svg | 1 + modules/ROOT/images/icons/blur.svg | 3 + modules/ROOT/images/icons/box.svg | 1 + modules/ROOT/images/icons/camera.svg | 1 + modules/ROOT/images/icons/caption.svg | 3 + modules/ROOT/images/icons/dropbox.svg | 1 + modules/ROOT/images/icons/evernote.svg | 1 + modules/ROOT/images/icons/exposure.svg | 1 + modules/ROOT/images/icons/fb.svg | 1 + modules/ROOT/images/icons/flickr.svg | 3 + modules/ROOT/images/icons/folder.svg | 1 + modules/ROOT/images/icons/google-drive.svg | 1 + modules/ROOT/images/icons/google-photos.svg | 1 + modules/ROOT/images/icons/grayscale.svg | 1 + modules/ROOT/images/icons/huddle.svg | 1 + .../ROOT/images/icons/image-decorative.svg | 3 + .../ROOT/images/icons/image-enhancements.svg | 4 + modules/ROOT/images/icons/instagram.svg | 1 + modules/ROOT/images/icons/onedrive.svg | 1 + modules/ROOT/images/icons/revert.svg | 4 + modules/ROOT/images/icons/saturation.svg | 3 + modules/ROOT/images/icons/transform-image.svg | 1 + modules/ROOT/images/icons/vibrance.svg | 1 + modules/ROOT/images/icons/vk.svg | 1 + modules/ROOT/images/icons/warmth.svg | 3 + modules/ROOT/nav.adoc | 10 + modules/ROOT/pages/7.6.0-release-notes.adoc | 423 ++++++++++++++++++ modules/ROOT/pages/a11ychecker.adoc | 37 +- modules/ROOT/pages/changelog.adoc | 40 ++ modules/ROOT/pages/contextform.adoc | 8 +- modules/ROOT/pages/contexttoolbar.adoc | 35 ++ .../ROOT/pages/editor-important-options.adoc | 4 + modules/ROOT/pages/events.adoc | 1 + modules/ROOT/pages/release-notes.adoc | 6 + modules/ROOT/pages/uploadcare.adoc | 216 +++++++++ .../configuration/a11y_advanced_options.adoc | 31 +- .../a11ychecker_allow_decorative_images.adoc | 5 +- .../a11ychecker_issue_url_callback.adoc | 2 +- .../ROOT/partials/configuration/disabled.adoc | 23 + .../partials/configuration/icon_list.adoc | 31 +- .../configuration/tinycomments_reply.adoc | 10 +- .../uploadcare_cdn_base_url.adoc | 21 + .../configuration/uploadcare_public_key.adoc | 21 + ...ploadcare_signed_upload_auth_provider.adoc | 37 ++ .../uploadcare_srcset_steps.adoc | 48 ++ .../configuration/uploadcare_store_type.adoc | 29 ++ .../partials/index-pages/premium-plugins.adoc | 6 + .../menu-item-ids/uploadcare-menu-items.adoc | 5 + ...ssibility-rule-i3-can-also-be-applied.adoc | 5 +- .../partials/misc/admon-requires-7.6v.adoc | 1 + .../partials/misc/premium-plugin-list.adoc | 1 + .../partials/misc/supported-versions.adoc | 1 + .../partials/plugin-apis/comments-apis.adoc | 4 + .../uploadcare-toolbar-buttons.adoc | 5 + 63 files changed, 1240 insertions(+), 31 deletions(-) create mode 100644 modules/ROOT/examples/live-demos/context-toolbar-labels/index.html create mode 100644 modules/ROOT/examples/live-demos/context-toolbar-labels/index.js create mode 100644 modules/ROOT/examples/live-demos/uploadcare/index.html create mode 100644 modules/ROOT/examples/live-demos/uploadcare/index.js create mode 100644 modules/ROOT/images/icons/add-file.svg create mode 100644 modules/ROOT/images/icons/adjustments.svg create mode 100644 modules/ROOT/images/icons/alt-text.svg create mode 100644 modules/ROOT/images/icons/blur.svg create mode 100644 modules/ROOT/images/icons/box.svg create mode 100644 modules/ROOT/images/icons/camera.svg create mode 100644 modules/ROOT/images/icons/caption.svg create mode 100644 modules/ROOT/images/icons/dropbox.svg create mode 100644 modules/ROOT/images/icons/evernote.svg create mode 100644 modules/ROOT/images/icons/exposure.svg create mode 100644 modules/ROOT/images/icons/fb.svg create mode 100644 modules/ROOT/images/icons/flickr.svg create mode 100644 modules/ROOT/images/icons/folder.svg create mode 100644 modules/ROOT/images/icons/google-drive.svg create mode 100644 modules/ROOT/images/icons/google-photos.svg create mode 100644 modules/ROOT/images/icons/grayscale.svg create mode 100644 modules/ROOT/images/icons/huddle.svg create mode 100644 modules/ROOT/images/icons/image-decorative.svg create mode 100644 modules/ROOT/images/icons/image-enhancements.svg create mode 100644 modules/ROOT/images/icons/instagram.svg create mode 100644 modules/ROOT/images/icons/onedrive.svg create mode 100644 modules/ROOT/images/icons/revert.svg create mode 100644 modules/ROOT/images/icons/saturation.svg create mode 100644 modules/ROOT/images/icons/transform-image.svg create mode 100644 modules/ROOT/images/icons/vibrance.svg create mode 100644 modules/ROOT/images/icons/vk.svg create mode 100644 modules/ROOT/images/icons/warmth.svg create mode 100644 modules/ROOT/pages/7.6.0-release-notes.adoc create mode 100644 modules/ROOT/pages/uploadcare.adoc create mode 100644 modules/ROOT/partials/configuration/disabled.adoc create mode 100644 modules/ROOT/partials/configuration/uploadcare_cdn_base_url.adoc create mode 100644 modules/ROOT/partials/configuration/uploadcare_public_key.adoc create mode 100644 modules/ROOT/partials/configuration/uploadcare_signed_upload_auth_provider.adoc create mode 100644 modules/ROOT/partials/configuration/uploadcare_srcset_steps.adoc create mode 100644 modules/ROOT/partials/configuration/uploadcare_store_type.adoc create mode 100644 modules/ROOT/partials/menu-item-ids/uploadcare-menu-items.adoc create mode 100644 modules/ROOT/partials/misc/admon-requires-7.6v.adoc create mode 100644 modules/ROOT/partials/toolbar-button-ids/uploadcare-toolbar-buttons.adoc diff --git a/.api-version b/.api-version index 7501d508f7..8df288f274 100644 --- a/.api-version +++ b/.api-version @@ -1 +1 @@ -7.5.1 \ No newline at end of file +7.6.0 \ No newline at end of file diff --git a/antora.yml b/antora.yml index a8cc6c4e19..23beb449cb 100644 --- a/antora.yml +++ b/antora.yml @@ -26,7 +26,7 @@ asciidoc: # product variables productname: TinyMCE productmajorversion: 7 - productminorversion: '7.5' + productminorversion: '7.6' ##### product name in codeblock prodnamecode: tinymce #### more names diff --git a/modules/ROOT/examples/live-demos/comments-callback/example.js b/modules/ROOT/examples/live-demos/comments-callback/example.js index 9557de760b..1d944e99ee 100644 --- a/modules/ROOT/examples/live-demos/comments-callback/example.js +++ b/modules/ROOT/examples/live-demos/comments-callback/example.js @@ -48,7 +48,11 @@ const tinycomments_reply = (req, done, fail) => { }) .then((req2) => { const commentUid = req2.commentUid; - done({ commentUid }); + done({ + commentUid: replyUid, + author: currentUser.id, + authorName: currentUser.fullName + }); }) .catch((e) => { fail(e); diff --git a/modules/ROOT/examples/live-demos/context-toolbar-labels/index.html b/modules/ROOT/examples/live-demos/context-toolbar-labels/index.html new file mode 100644 index 0000000000..172316e060 --- /dev/null +++ b/modules/ROOT/examples/live-demos/context-toolbar-labels/index.html @@ -0,0 +1,9 @@ + diff --git a/modules/ROOT/examples/live-demos/context-toolbar-labels/index.js b/modules/ROOT/examples/live-demos/context-toolbar-labels/index.js new file mode 100644 index 0000000000..7c0d94b2dc --- /dev/null +++ b/modules/ROOT/examples/live-demos/context-toolbar-labels/index.js @@ -0,0 +1,34 @@ +tinymce.init({ + selector: 'textarea#context-toolbar-labels', + height: 350, + setup: (editor) => { + editor.ui.registry.addContextToolbar('imagealignment', { + predicate: (node) => node.nodeName.toLowerCase() === 'img', + position: 'node', + scope: 'node', + items: [ + { + name: 'Formatting', + items: ['alignleft', 'aligncenter', 'alignright'] + }, + { + label: 'Copy', + items: ['copy', 'paste'] + } + ], + }); + + editor.ui.registry.addContextToolbar('textselection', { + predicate: (node) => !editor.selection.isCollapsed(), + position: 'selection', + scope: 'node', + items: [ + { + name: 'Format', + items: ['bold', 'italic', 'underline'] + }, + ], + }); + }, + content_style: 'body { font-family:Helvetica,Arial,sans-serif; font-size:16px }' +}); diff --git a/modules/ROOT/examples/live-demos/uploadcare/index.html b/modules/ROOT/examples/live-demos/uploadcare/index.html new file mode 100644 index 0000000000..df54bcd522 --- /dev/null +++ b/modules/ROOT/examples/live-demos/uploadcare/index.html @@ -0,0 +1,86 @@ + + diff --git a/modules/ROOT/examples/live-demos/uploadcare/index.js b/modules/ROOT/examples/live-demos/uploadcare/index.js new file mode 100644 index 0000000000..23f7fc84e3 --- /dev/null +++ b/modules/ROOT/examples/live-demos/uploadcare/index.js @@ -0,0 +1,19 @@ +tinymce.init({ + selector: "textarea", + plugins: [ "uploadcare", "code", "link", "preview", "lists" ], + uploadcare_public_key: 'cfef242412638bfc4193', + toolbar: "undo redo | styles | bold italic underline | forecolor | bullist numlist| link uploadcare | code preview", + height: 700, + content_style: ` + body { max-width: 920px; margin: 1.5rem auto; padding: 0 2vw; } + h1 { font-size: 1.5em; } + h2 { font-size: 1.17em; } + h1, h2, h3, h4, h5, h6 { font-weight: 500; margin: 0 0 0.75rem; } + p + h1, p + h2, p + h3, p + h4, p + h5, p + h6 { margin-top: 2rem; } + p { line-height: 1.6; margin: 0; } + p + p { margin-top: 1rem; } + a { color: #2b70e3; } + blockquote { color: #4e5c73; font-weight: 200; font-size: 1.3rem; margin: 1rem 2rem; padding: 0 0 0 1rem; border-left: 2px solid #2b70e3 !important; } + figcaption {font-size: 0.875em;} + ` +}); diff --git a/modules/ROOT/images/icons/add-file.svg b/modules/ROOT/images/icons/add-file.svg new file mode 100644 index 0000000000..18af2d8265 --- /dev/null +++ b/modules/ROOT/images/icons/add-file.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/modules/ROOT/images/icons/adjustments.svg b/modules/ROOT/images/icons/adjustments.svg new file mode 100644 index 0000000000..2079d17011 --- /dev/null +++ b/modules/ROOT/images/icons/adjustments.svg @@ -0,0 +1,3 @@ + + + diff --git a/modules/ROOT/images/icons/alt-text.svg b/modules/ROOT/images/icons/alt-text.svg new file mode 100644 index 0000000000..6e85a1f800 --- /dev/null +++ b/modules/ROOT/images/icons/alt-text.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/modules/ROOT/images/icons/blur.svg b/modules/ROOT/images/icons/blur.svg new file mode 100644 index 0000000000..0cf6893a70 --- /dev/null +++ b/modules/ROOT/images/icons/blur.svg @@ -0,0 +1,3 @@ + + + diff --git a/modules/ROOT/images/icons/box.svg b/modules/ROOT/images/icons/box.svg new file mode 100644 index 0000000000..dce6de1685 --- /dev/null +++ b/modules/ROOT/images/icons/box.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/modules/ROOT/images/icons/camera.svg b/modules/ROOT/images/icons/camera.svg new file mode 100644 index 0000000000..21c6164636 --- /dev/null +++ b/modules/ROOT/images/icons/camera.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/modules/ROOT/images/icons/caption.svg b/modules/ROOT/images/icons/caption.svg new file mode 100644 index 0000000000..bbfa23cf7f --- /dev/null +++ b/modules/ROOT/images/icons/caption.svg @@ -0,0 +1,3 @@ + + + diff --git a/modules/ROOT/images/icons/dropbox.svg b/modules/ROOT/images/icons/dropbox.svg new file mode 100644 index 0000000000..61576ab6f5 --- /dev/null +++ b/modules/ROOT/images/icons/dropbox.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/modules/ROOT/images/icons/evernote.svg b/modules/ROOT/images/icons/evernote.svg new file mode 100644 index 0000000000..a750417723 --- /dev/null +++ b/modules/ROOT/images/icons/evernote.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/modules/ROOT/images/icons/exposure.svg b/modules/ROOT/images/icons/exposure.svg new file mode 100644 index 0000000000..fda78d4caf --- /dev/null +++ b/modules/ROOT/images/icons/exposure.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/modules/ROOT/images/icons/fb.svg b/modules/ROOT/images/icons/fb.svg new file mode 100644 index 0000000000..5503a9b4c0 --- /dev/null +++ b/modules/ROOT/images/icons/fb.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/modules/ROOT/images/icons/flickr.svg b/modules/ROOT/images/icons/flickr.svg new file mode 100644 index 0000000000..336b721bc4 --- /dev/null +++ b/modules/ROOT/images/icons/flickr.svg @@ -0,0 +1,3 @@ + + + diff --git a/modules/ROOT/images/icons/folder.svg b/modules/ROOT/images/icons/folder.svg new file mode 100644 index 0000000000..9bd6f4a888 --- /dev/null +++ b/modules/ROOT/images/icons/folder.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/modules/ROOT/images/icons/google-drive.svg b/modules/ROOT/images/icons/google-drive.svg new file mode 100644 index 0000000000..3ca54f4325 --- /dev/null +++ b/modules/ROOT/images/icons/google-drive.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/modules/ROOT/images/icons/google-photos.svg b/modules/ROOT/images/icons/google-photos.svg new file mode 100644 index 0000000000..33a6af34c5 --- /dev/null +++ b/modules/ROOT/images/icons/google-photos.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/modules/ROOT/images/icons/grayscale.svg b/modules/ROOT/images/icons/grayscale.svg new file mode 100644 index 0000000000..21af08f8a8 --- /dev/null +++ b/modules/ROOT/images/icons/grayscale.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/modules/ROOT/images/icons/huddle.svg b/modules/ROOT/images/icons/huddle.svg new file mode 100644 index 0000000000..b4755a1247 --- /dev/null +++ b/modules/ROOT/images/icons/huddle.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/modules/ROOT/images/icons/image-decorative.svg b/modules/ROOT/images/icons/image-decorative.svg new file mode 100644 index 0000000000..656cb0260c --- /dev/null +++ b/modules/ROOT/images/icons/image-decorative.svg @@ -0,0 +1,3 @@ + + + diff --git a/modules/ROOT/images/icons/image-enhancements.svg b/modules/ROOT/images/icons/image-enhancements.svg new file mode 100644 index 0000000000..f95c841695 --- /dev/null +++ b/modules/ROOT/images/icons/image-enhancements.svg @@ -0,0 +1,4 @@ + + + + diff --git a/modules/ROOT/images/icons/instagram.svg b/modules/ROOT/images/icons/instagram.svg new file mode 100644 index 0000000000..c46d3c45ec --- /dev/null +++ b/modules/ROOT/images/icons/instagram.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/modules/ROOT/images/icons/onedrive.svg b/modules/ROOT/images/icons/onedrive.svg new file mode 100644 index 0000000000..9463e3cecf --- /dev/null +++ b/modules/ROOT/images/icons/onedrive.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/modules/ROOT/images/icons/revert.svg b/modules/ROOT/images/icons/revert.svg new file mode 100644 index 0000000000..68854286fc --- /dev/null +++ b/modules/ROOT/images/icons/revert.svg @@ -0,0 +1,4 @@ + + + + diff --git a/modules/ROOT/images/icons/saturation.svg b/modules/ROOT/images/icons/saturation.svg new file mode 100644 index 0000000000..4ed121e860 --- /dev/null +++ b/modules/ROOT/images/icons/saturation.svg @@ -0,0 +1,3 @@ + + + diff --git a/modules/ROOT/images/icons/transform-image.svg b/modules/ROOT/images/icons/transform-image.svg new file mode 100644 index 0000000000..15e252c9cf --- /dev/null +++ b/modules/ROOT/images/icons/transform-image.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/modules/ROOT/images/icons/vibrance.svg b/modules/ROOT/images/icons/vibrance.svg new file mode 100644 index 0000000000..63f83303ab --- /dev/null +++ b/modules/ROOT/images/icons/vibrance.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/modules/ROOT/images/icons/vk.svg b/modules/ROOT/images/icons/vk.svg new file mode 100644 index 0000000000..3c24b20293 --- /dev/null +++ b/modules/ROOT/images/icons/vk.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/modules/ROOT/images/icons/warmth.svg b/modules/ROOT/images/icons/warmth.svg new file mode 100644 index 0000000000..1694549adc --- /dev/null +++ b/modules/ROOT/images/icons/warmth.svg @@ -0,0 +1,3 @@ + + + diff --git a/modules/ROOT/nav.adoc b/modules/ROOT/nav.adoc index 47b1c49a5a..fb00b91c4c 100644 --- a/modules/ROOT/nav.adoc +++ b/modules/ROOT/nav.adoc @@ -320,6 +320,7 @@ *** xref:importword.adoc[Import from Word] **** xref:docx-to-html-converter-api.adoc[DOCX to HTML Converter API] *** xref:editimage.adoc[Image Editing] +*** xref:uploadcare.adoc[Image Optimizer Powered by Uploadcare] *** xref:inline-css.adoc[Inline CSS] *** xref:linkchecker.adoc[Link Checker] *** xref:math.adoc[Math] @@ -409,6 +410,15 @@ ** xref:tinymce-and-cors.adoc[Cross-Origin Resource Sharing (CORS)] * Release information ** xref:release-notes.adoc[Release notes for {productname}] +*** {productname} 7.6.0 +**** xref:7.6.0-release-notes.adoc#overview[Overview] +**** xref:7.6.0-release-notes.adoc#new-premium-plugin[New Premium plugin] +**** xref:7.6.0-release-notes.adoc#accompanying-premium-plugin-changes[Accompanying Premium plugin changes] +**** xref:7.6.0-release-notes.adoc#accompanying-enhanced-skins-and-icon-packs-changes[Accompanying Enhanced Skins & Icon Packs changes] +// **** xref:7.6.0-release-notes.adoc#improvements[Improvements] +**** xref:7.6.0-release-notes.adoc#additions[Additions] +**** xref:7.6.0-release-notes.adoc#bug-fixes[Bug fixes] +**** xref:7.6.0-release-notes.adoc#known-issues[Known issues] *** {productname} 7.5.1 **** xref:7.5.1-release-notes.adoc#overview[Overview] **** xref:7.5.1-release-notes.adoc#accompanying-premium-plugin-changes[Accompanying Premium Plugin changes] diff --git a/modules/ROOT/pages/7.6.0-release-notes.adoc b/modules/ROOT/pages/7.6.0-release-notes.adoc new file mode 100644 index 0000000000..a07371b400 --- /dev/null +++ b/modules/ROOT/pages/7.6.0-release-notes.adoc @@ -0,0 +1,423 @@ += {productname} {release-version} +:release-version: 7.6.0 +:navtitle: {productname} {release-version} +:description: Release notes for {productname} {release-version} +:keywords: releasenotes, new, changes, bugfixes +:page-toclevels: 1 + +include::partial$misc/admon-releasenotes-for-stable.adoc[] + + +[[overview]] +== Overview + +{productname} {release-version} was released for {enterpriseversion} and {cloudname} on Wednesday, December 11^th^, 2024. These release notes provide an overview of the changes for {productname} {release-version}, including: + +* xref:new-premium-plugin[New Premium plugin] +* xref:accompanying-premium-plugin-changes[Accompanying Premium plugin changes] +* xref:accompanying-enhanced-skins-and-icon-packs-changes[Accompanying Enhanced Skins & Icon Packs changes] +// * xref:improvements[Improvements] +* xref:additions[Additions] +* xref:changes[Changes] +* xref:bug-fixes[Bug fixes] +* xref:known-issues[Known issues] + + +[[new-premium-plugin]] +== New Premium plugin + +The following new Premium plugin was released alongside {productname} {release-version}. + +=== Image Optimizer (Powered by Uploadcare) + +{productname} {release-version} introduces the **Image Optimizer (Powered by Uploadcare)** plugin. + +The **Image Optimizer** plugin offers a range of powerful features for image hosting, serving, and editing. These include responsive image delivery, automatic image format selection, automatic compression, and non-destructive image transformations and adjustments, all powered by link:https://uploadcare.com[Uploadcare]. + +For information on the **Image Optimizer (Powered by Uploadcare)** plugin, see xref:uploadcare.adoc[Image Optimizer (Powered by Uploadcare)]. + +[[accompanying-premium-plugin-changes]] +== Accompanying Premium plugin changes + +The following premium plugin updates were released alongside {productname} {release-version}. + +=== Accessibility Checker + +The {productname} {release-version} release includes an accompanying release of the **Accessibility Checker** premium plugin. + +**Accessibility Checker** Premium plugin includes the following fixes and improvements. + +==== Introduced a new live region for screen readers to improve accessibility checker dialog announcements +// #TINY-11523 + +Previously, an issue was identified where screen reader announcements for the accessibility dialog were inconsistent across different browsers. This inconsistency resulted in a poor user experience with screen readers and accessibility dialogs. + +In {productname} {release-version}, this issue has been resolved by adding a dedicated hidden screen reader section within the dialog structure, ensuring more consistent and accurate announcements across browsers. + +==== Add detailed issue description to accessibility checker +// #TINY-11462 + +An issue was identified where users relying on screen readers did not receive sufficient context about the current content when navigating the accessibility checker. This limitation could cause confusion and make it challenging for users to understand or resolve accessibility issues effectively. + +To address this, {productname} {release-version} introduces a new section that clearly displays the content type and includes a snippet of the content. This enhancement provides users with better context and improves the overall navigation experience. By offering more comprehensive indicators, this update ensures screen reader users can efficiently identify and address accessibility issues within the content. + +==== Improve editor content highlighting when using accessibility checker +// #TINY-11463 + +Previously, an issue involving the accessibility checker was identified where the content area highlights did not properly meet accessibility standards. This issue caused users with vision impairments to encounter difficulty in identifying the currently focused element. + +In {productname} {release-version}, this issue has been resolved by unifying the color palette to meet accessibility color contrast standards, ensuring that all users can easily locate the currently focused element. + +For information on the **Accessibility Checker** plugin, see: xref:a11ychecker.adoc[Accessibility Checker]. + +=== Checklist + +The {productname} {release-version} release includes an accompanying release of the **Checklist** premium plugin. + +**Checklist** Premium plugin includes the following fix. + +==== Checklist items were unresponsive in `center` or `right` alignments +// #TINY-11357 + +In previous versions of {productname}, an issue was identified where users could not check checklist items when they were `center` or `right` aligned. This occurred because the logic for detecting clicks relied on the left-most position of the `+
  • +` element, which remains unchanged regardless of text alignment. + +As a result, clicks in center or right alignments would fail the logic check, leaving the items unresponsive. + +{productname} {release-version} addresses this issue. Now, the logic compares the click position against the left-most position of the aligned text, rather than the parent `+
  • +` element. This adjustment ensures that clicks are properly registered regardless of alignment, restoring expected functionality across all alignment settings. + +For information on the **Checklist** plugin, see: xref:checklist.adoc[Checklist]. + +=== Comments + +The {productname} {release-version} release includes an accompanying release of the **Comments** premium plugin. + +**Comments** includes the following fixes and improvements. + +==== The `commentAuthor` property is now included in reply events of the event log. +// #TINY-11489 + +In previous versions of the tinycomments plugin, the `commentAuthor` property was missing from 'reply' events within the event log, which led to incomplete tracking of user interactions when retrieving data through the `+getEventLog()+` API. + +{productname} {release-version} addresses this issue. Now, the `commentAuthor` property is included in 'reply' events in the event log. + +For more information on the `getEventLog`, see xref:comments-commands-events-apis.adoc#getEventLog[getEventLog]. + +==== Allow mentions in comments dropdown to flow freely outside of the editor container +// #TINY-11504 + +An issue was identified where the mentions in comments dropdown didn't freely expand to the available space alongside mentions in the editor. This was due to the dropdown being restricted within the sidebar area. + +In {productname} {release-version}, this issue has been resolved by allowing the mentions in comments dropdown to expand outside the sidebar area, making full use of the available space outside the editor and improving the overall user experience. + +==== Reduced the amount of scrolling when changing between conversations in the sidebar. +// #TINY-11401 + +Previously, the scrolling behavior for comment cards was inconsistent. When scrolling from top to bottom, the scrolling would stop at the top of a comment card, whereas scrolling from bottom to top would stop at the bottom of a comment card. This inconsistency could cause confusion when navigating through comments in the sidebar. + +In {productname} {release-version}, the sidebar scrolling behavior has been updated to ensure consistency. When a conversation is selected and is either partially or completely out of view, the sidebar now scrolls to position the top of the selected conversation just below the top of the sidebar. + +[NOTE] +An exception does apply if the selected conversation is already partially visible, with the top in view but the bottom out of view, and the comment card's height is smaller than the scrollable container. In this scenario, the sidebar will scroll to position the bottom of the selected card near the bottom of the container. + +==== Scroll to show action buttons when replying/editing a comment. +// #TINY-11402 + +Previously, if a selected conversation card was positioned near the bottom of the sidebar, the reply/edit input field would be below the bottom of the sidebar resulting in the comment input field not being visible to the user. + +{productname} {release-version} addresses this issue. Now, the sidebar scrolls to display the comment input field if the selected conversation card is positioned near the bottom of the sidebar. This ensures that the comment input field is always visible to the user. + +==== Pressing Shift+Enter in Mentions in Comments dropdown should accept the active menu item +// #TINY-11455 + +In previous versions of {productname}, the `Shift+Enter` key was not properly handled when used with mentions in comments. This led to a new line being inserted while the mentions dropdown remained open, resulting in inconsistent behavior compared to mentions within the editor. + +In {productname} {release-version}, mentions in comments now handle the `Shift+Enter` key by inserting the highlighted user into the comment text area and closing the dropdown, ensuring consistent functionality across the editor and comment areas. + +=== Adjust `tinycomments` UI font size to match the editor UI font size +// #TINY-11592 + +Previously, the **Comments** plugin used a `14px` font size for the comment body, which was inconsistent with the `16px` font size used in the rest of the Comments Sidebar and the editor UI. + +This issue has been resolved in {productname} {release-version} by setting the comment body font size to `16px`, ensuring font size consistency between the **Comments** plugin and the editor UI. + +==== Editor Focus after Deleting a Comment +// #TINY-11293 + +Previously, the focus behaviour in the comments sidebar was observed to be inconsistent. When a user deleted a comment, the focus exited the comments sidebar and returned to the editor instead of returning to the conversation card. This also occurred when a new comment was created inside an existing conversation, and when an entire new conversation was created. + +In {productname} {release-version}, the focus behaviour has now been improved in the following situations: + +* Deleting a comment now returns the focus to the conversation card that contained the deleted comment. +* Creating a new comment within an existing conversation now brings the focus to the corresponding conversation card. +* Starting a new conversation now brings the focus to the newly created conversation card. + +==== Added tooltips to conversation and comment kebab menus + +In previous versions of **Comments**, the kebab menu button in the comments sidebar was missing a tooltip for users relying on assistive technologies. + +{productname} {release-version} addresses this issue, by adding an `aria-label` with the description "Comment Actions" to the sidebar comment menu button, ensuring a tooltip is displayed on hover. This update improves accessibility and aligns the user experience across different menu buttons. + +==== The caret in comment textarea returned to its previous location before closing the mentions menu by selecting with the mouse. +// #TINY-11453 + +Previously, when closing the Mentions dropdown in a Comment textarea by clicking away, the caret would revert to its previous position, disregarding the user’s mouse-click location. This issue occurred because the logic for handling caret positioning did not account for mouse interactions, resulting in a disjointed and confusing user experience. + +In {productname} {release-version} this issue was addressed. Now, the caret now accurately reflects the user’s intended position when the Mentions dropdown is closed via a mouse-click. + +For information on the **Comments** plugin, see: xref:introduction-to-tiny-comments.adoc[Introduction to {companyname} Comments]. + +=== Enhanced Code Editor +// #TINY-11298 + +The {productname} {release-version} release includes an accompanying release of the **Enhanced Code Editor** premium plugin. + +**Enhanced Code Editor** Premium plugin includes the following fix. + +==== Spelling error in tooltip for `fullscreen` toggle button + +The tooltip for the `fullscreen` toggle button was incorrectly labeled as `Fullsceen`. {productname} {release-version} addresses this issue which has now been corrected to `Fullscreen`. + +For information on the **Enhanced Code Editor** plugin, see: xref:advcode.adoc[Enhanced Code Editor]. + +[[accompanying-enhanced-skins-and-icon-packs-changes]] +== Accompanying Enhanced Skins & Icon Packs changes + +The {productname} {release-version} release includes an accompanying release of the **Enhanced Skins & Icon Packs**. + +=== Enhanced Skins & Icon Packs + +The **Enhanced Skins & Icon Packs** release includes the following updates: + +The **Enhanced Skins & Icon Packs** were rebuilt to pull in the changes also incorporated into the default {productname} {release-version} skin, Oxide. + +For information on using Enhanced Skins & Icon Packs, see: xref:enhanced-skins-and-icon-packs.adoc[Enhanced Skins & Icon Packs]. + + +// [[improvements]] +// == Improvements + +// {productname} {release-version} also includes the following improvements: + +// === Base64 data was not properly decoded due to unhandled URL-encoded characters. +// #TINY-9548 + +// === The `latin` list style type is now recognized as an alias for the `alpha` list style type. +// #TINY-11515 + +[[additions]] +== Additions + +{productname} {release-version} also includes the following additions: + +=== Add Labels and Groups for Context Toolbar Buttons +// #TINY-11095 + +The release of {productname} {release-version} introduces the ability to organize context toolbar buttons into groups with optional labels or titles. This enhancement improves toolbar usability by enabling clearer categorization of buttons. + +The `items` object structure now supports defining groups with an optional `name` property for titles or a `label` property for identifying the group. This feature allows developers to create more intuitive and accessible toolbars by visually segmenting functionality. + +Example of a context toolbar configuration with groups and labels: + +.Example +[source,js] +---- +items: [ + { + name: 'Formatting', // Optional, used as the group's title + items: [ 'bold', 'italic' ] // Array of registered button names + }, + { + label: 'History', // Optional, used as a label for the group + items: [ 'undo', 'redo' ] // Array of registered button names + }, +] +---- + +For more details on configuring context toolbar groups and labels, see: xref:contexttoolbar.adoc#add-labels-and-groups-for-context-toolbar-buttons[Context Toolbar]. + +// === New `contextsliderform` and `contextsizeinput` context form types. +// #TINY-11342 + +=== New `back` function in `ContextFormApi` to go back to the previous toolbar. +// #TINY-11344 + +{productname} {release-version} introduces the `+back+` function in the `ContextFormApi`, enabling users to navigate back to the previous toolbar. This enhancement fulfills the need for a back button in context forms, providing a seamless way to return to the previous toolbar configuration when required. + +.Example: Using the `back` function in a context form +[source,js] +---- +tinymce.init({ + selector: "textarea", + setup: (ed) => { + ed.ui.registry.addContextToolbar('toolbar-with-back-example', { + items: 'form-with-back-example undo redo', + position: 'node', + scope: 'node', + predicate: (node) => node.nodeName.toLowerCase() === 'p' + }); + ed.ui.registry.addContextForm('form-with-back-example', { + type: 'contextsizeinputform', + launch: { + type: 'contextformtogglebutton', + icon: 'resize', + tooltip: 'ABC' + }, + initValue: () => ({ width: '100', height: '200' }), + onInput: (formApi) => console.log(`input.${JSON.stringify(formApi.getValue())}`), + commands: [ + { + type: 'contextformbutton', + icon: 'chevron-left', + tooltip: 'Back', + align: 'start', + onAction: (formApi) => formApi.back() + } + ] + }); + } +}); +---- + +=== New `QuickbarInsertImage` command that is executed by the `quickimage` button. +// #TINY-11399 + +The **Quickbars** Plugin now allows integrators to overwrite the `+QuickbarInsertImage+` command, enabling customization of the quickimage button's behavior. + +.Example of how to override the `+QuickbarInsertImage+` command: +[source,js] +---- +tinymce.init({ + selector: 'textarea', + plugins: 'quickbars', + toolbar: false, + setup: (editor) => { + editor.addCommand('QuickbarInsertImage', () => { // Add a custom command to the editor named "QuickbarInsertImage" + const input = document.createElement('input'); // Create a new element for file selection + input.type = 'file'; // Set the input type to "file" for uploading files + input.accept = 'image/*'; // Restrict the input to accept only image files + input.onchange = (e) => { // Add an event listener to handle the file selection event + const file = (e.target).files?.[0]; // Get the selected file from the input element + if (file) { + console.log(file); + } + }; + input.click(); + }); + } +}); +---- + +=== New `onSetup` function for context forms +// #TINY-11494 + +A new `+onSetup+` API has been introduced for context forms, enabling integrators to execute a function when the form is rendered and handle cleanup when it is closed. This enhancement addresses the previous limitation of not being able to detect or trigger actions during the lifecycle of context forms. The `+onSetup+` API streamlines lifecycle management by supporting initialization at form rendering and providing a return function for cleanup, enhancing integration with plugins and applications. + +For more details, refer to xref:contextform.adoc#form[Context Form]. + +=== Added placeholder support for context form input fields +// #TINY-11459 + +A new `placeholder` option has been introduced to the context form API, addressing the need for inline guidance within input fields. This feature enables developers to specify placeholder text that appears inside input fields until the field is focused or a value is entered. By providing contextual hints, this enhancement improves usability and enhances the user experience. + +.Example: Using a placeholder in a context form input field +[source,js] +---- +editor.ui.registry.addContextForm('upload-url', { + launch: { + type: 'contextformtogglebutton', + icon: 'link', + tooltip: 'Upload from URL' + }, + placeholder: 'Enter URL here...', .... +}); +---- + +=== New `+disabled+` option for disabling all user interactions + +A new `+disabled+` option has been introduced to {productname} in version {release-version}. This option allows integrators to disable all user interactions with the editor, including cursor placement, content modifications, and UI components. When set to `+true+`, the editor behaves similarly to the readonly mode changes introduced in {productname} 7.4.0 but ensures complete non-interactivity. + +.Example disabling all user interactions with the editor +[source,js] +---- +tinymce.init({ + selector: 'textarea', // Specify the target HTML element + disabled: true // Disables all interactions with the editor +}); +---- + +For more information on the `+disabled+` option, see xref:editor-important-options.adoc#disabled[Disabled] option. + +[[bug-fixes]] +== Bug fixes + +{productname} {release-version} also includes the following bug fixes: + +=== Image selection was removed when calling nodeChanged while having focus inside the editor UI. +// #TINY-11437 + +Previously, executing a `nodeChange` event while an image was selected caused the image to lose its resize handles. This issue disrupted the user experience, requiring users to re-select the image to resize it. + +{productname} {release-version} addresses this issue. Now, resize handles are only removed when focus moves out of the editor or its UI components. + +As a result, the resize handles remain visible during `nodeChange` events, improving usability. + +=== Tooltip would not show for group toolbar button. +// #TINY-11391 + +Previously, an issue was identified where tooltips were not displayed when hovering over toolbar group buttons. This was due to replacing the `title` attribute with an `aria-label` attribute in xref:7.0-release-notes.adoc#improved-accessibility-for-interactive-elements-with-custom-tooltips[{productname} 7.0.0] without implementing the custom tooltip behavior for the toolbar group buttons. + +In {productname} {release-version}, this issue has been resolved by applying the custom tooltip behavior to the toolbar group buttons, ensuring that tooltips are now displayed on hover. + +=== Numbered table context menu not properly applying changes +// #TINY-11383 + +Previously, there was an issue where changes to the row type in numbered tables were not properly applied. This occurred because the action of modifying the row type from a `+contentEditable="false"+` cell was being deliberately blocked. + +In {productname} {release-version}, this issue has been resolved by removing the restriction on changing the row type from a `+contentEditable="false"+` cell. As a result, changes to the row type are now correctly applied. + +// === The `samp` format was being applied as a `block` level format, instead of an `inline` format. +// #TINY-11390 + +=== Removed title attribute from dialog tree elements as they already have a tooltip. +// #TINY-11470 + +Previously, an issue was identified with tooltips for tree structures where multiple tooltip systems displayed the same text simultaneously: + +. The browser's native tooltip, triggered by the `title` attribute, displayed the text. +. {productname}'s custom tooltip functionality also displayed the text. + +As a consequence, this caused two tooltips with identical content to appear at the same time, leading to a confusing user experience, where the desired behavior was to show only the custom tooltip provided by {productname}. + +In {productname} {release-version}, this issue has been resolved. The `title` attribute is now automatically removed when the custom tooltip is applied, ensuring that only the custom tooltip is displayed. + +=== Fixed CSS Bundling for Skin UI Content CSS +// #TINY-11558 + +In self-hosted React setups, image resize handles were not displayed when using bundled {productname} editors. This issue impacted the usability of features such as image resizing. + +The root cause was a misconfiguration of resource keys for the CSS bundling JS files and CSS loading logic in {productname} core. As a result, bundled editors failed to load the necessary styles, causing the resize handles to remain hidden. + +This issue affected {productname} versions earlier than 7.1.0. + +{productname} {release-version} resolves this issue by updating the `stylesheetLoader` to correctly load the `ui/default/content.css` stylesheet, ensuring that image resize handles are displayed as expected. + +=== Incorrect translation of `Cut Column` and `Copy Column` in Hebrew +// #TINY-11583 + +An issue was identified where the Hebrew translations for `Cut Column` and `Copy Column` in the table plugin were incorrect. + +{productname} {release-version} addresses this issue by providing the correct Hebrew translations for these operations. + + +[[known-issues]] +== Known issues + +This section describes issues that users of {productname} {release-version} may encounter and possible workarounds for these issues. + +There is one known issue in {productname} {release-version}. + +=== Missing translations for "Solution" for all languages in the Accessibility Checker + +In {productname} {release-version}, the "Solution" translation is missing for all languages in the Accessibility Checker. This issue affects the "Solution" section of the Accessibility Checker, where the "Solution" text is not displayed in the user's selected language. + +**Status**: Currently under investigation. \ No newline at end of file diff --git a/modules/ROOT/pages/a11ychecker.adoc b/modules/ROOT/pages/a11ychecker.adoc index 219fa00904..cd9cc35d57 100644 --- a/modules/ROOT/pages/a11ychecker.adoc +++ b/modules/ROOT/pages/a11ychecker.adoc @@ -43,7 +43,6 @@ The following checks are available for the {pluginname} plugin. The rules checke Each rule has a severity level, which will be one of the following, listed in order of increasing severity: -* Information * Warning * Error @@ -264,7 +263,10 @@ WCAG 2.1 specification:: https://www.w3.org/WAI/WCAG21/Techniques/html/H39.html[ *Rule description:* this rule checks that all complex tables must have a `+summary+` attribute explaining to users of assistive technologies how to navigate through the data inside of the table. -NOTE: This rule only applies to HTML 4 content and is not checked when `+a11ychecker_html_version+` is set to `+html5+`. +[NOTE] +==== +This rule only applies to HTML 4 content and is not checked when `+a11ychecker_html_version+` is set to `+html5+`. +==== ==== {pluginname} rule details - T2 @@ -281,7 +283,10 @@ WCAG 2.1 specification:: https://www.w3.org/WAI/WCAG21/Techniques/html/H73.html[ *Rule description:* this rule checks that the table caption and summary does not have the same text content. The caption should explain *what* the table is about while the summary should explain *how* to navigate the data inside of the table. -NOTE: The table `+summary+` attribute was deprecated in HTML 5, both the *what* and *how* information should be moved to the table caption. +[NOTE] +==== +The table `+summary+` attribute was deprecated in HTML 5, both the *what* and *how* information should be moved to the table caption. +==== ==== {pluginname} rule details - T3 @@ -296,7 +301,7 @@ WCAG 2.1 specification:: https://www.w3.org/WAI/WCAG21/Techniques/html/H73.html[ [[T4A]] === T4A - Table markup -*Rule description:* this rule checks that all `+tables+` contain both `+td+` and `+th+` elements. +*Rule description:* this rule checks that all `+tables+` contain both `+tr+` and `+td+` elements. ==== {pluginname} rule details - T4A @@ -380,7 +385,7 @@ Opens and closes the accessibility checker dialog with the results of the audit [source,js] ---- -editor.plugins.a11ychecker.toggleaudit(); +tinymce.activeEditor.plugins.a11ychecker.toggleaudit(); ---- [[getreport]] @@ -396,21 +401,23 @@ const issues = tinymce.activeEditor.plugins.a11ychecker.getReport(); console.log(issues); -// example result +// Example result [ { + "contentID": "
    Text: \"H5\"
    ", + "description": "Headings must be applied in sequential order. For example: Heading 1 should be followed by Heading 2, not Heading 3.", + "element": h5, // reference to the DOM element where the issue was found "id": "D2", "severity": "error", - "url": "http://www.w3.org/TR/UNDERSTANDING-WCAG20/content-structure-separation-programmatic.html", - "description": "Headings must be applied in sequential order. For example: Heading 1 should be followed by Heading 2, not Heading 3.", - "element": {} // The element value contains the DOM element (such as

    ). + "url": "https://www.w3.org/WAI/WCAG21/Techniques/general/G141.html", }, { + "contentID": "
    Table: \"2x2\"
    ", + "description": "Tables must have captions", + "element": table, // reference to the DOM element where the issue was found "id": "T1", "severity": "error", - "url": "http://www.w3.org/TR/UNDERSTANDING-WCAG20/content-structure-separation-programmatic.html", - "description": "Tables must have captions", - "element": {} // The element value contains the DOM element (such as ). + "url": "https://www.w3.org/WAI/WCAG21/Techniques/html/H39.html", } ] ---- @@ -418,7 +425,7 @@ console.log(issues); [[issue]] === The `+issue+` object -In a11ychecker, when the content within the editor is `audited`, each element is checked to ensure that no xref:a11ychecker.adoc#accessibility-rules[Accessibility rules] are violated. Any element which doesn’t adhere to a rule will generate an `issue` within the audit; the details of which are to be displayed in the a11ychecker dialog. +In a11ychecker, when the content within the editor is `audited`, each element is checked to ensure that no xref:a11ychecker.adoc#accessibility-rules[Accessibility rules] are violated. Any element which doesn't adhere to a rule will generate an `issue` within the audit; the details of which are to be displayed in the a11ychecker dialog. The `+'issue'+` object provides relevant data pertaining to any issue generated by an element which violates an xref:a11ychecker.adoc#accessibility-rules[Accessibility rule]: @@ -426,8 +433,10 @@ The `+'issue'+` object provides relevant data pertaining to any issue generated * `+description+` : `+String+` description of the issue; as will be displayed in the dialog. -* `+severity+` : `+String+` severity level of the issue; either `+info+`, `+warning+` or `+error+`. +* `+severity+` : `+String+` severity level of the issue; either `+warning+` or `+error+`. * `+url+` : `+String+` URL reference for the issue. By default, this will be a link to the W3 website, containing the W3 WCAG technique that needs to be addressed to clear the issue. * `+element+` : `+Object+` DOM element where the issue was found. + +* `+contentID+` : `+String+` A short snippet of the content (such as text, link, image, or table) where the issue was found. diff --git a/modules/ROOT/pages/changelog.adoc b/modules/ROOT/pages/changelog.adoc index bf166c6170..14662a04b3 100644 --- a/modules/ROOT/pages/changelog.adoc +++ b/modules/ROOT/pages/changelog.adoc @@ -4,6 +4,46 @@ NOTE: This is the {productname} Community version changelog. For information about the latest {cloudname} or {enterpriseversion} Release, see: xref:release-notes.adoc[{productname} Release Notes]. +== xref:7.6.0-release-notes.adoc[7.6.0 - 2024-12-11] + +=== Added +* It is now possible to create labeled groups in context toolbars. +// #TINY-11095 +// * New `contextsliderform` and `contextsizeinput` context form types. +// #TINY-11342 +* New `back` function in `ContextFormApi` to go back to the previous toolbar. +// #TINY-11344 +* New `QuickbarInsertImage` command that is executed by the `quickimage` button. +// #TINY-11399 +* New `onSetup` function to the context form API. +// #TINY-11494 +* New `placeholder` to the context form input field API. +// #TINY-11459 +* New `disabled` option to restore the previous `readonly` mode behavior, allowing the editor to be displayed in a disabled state. +// #TINY-11488 + +// === Improved +// * Base64 data was not properly decoded due to unhandled URL-encoded characters. +// #TINY-9548 +// * The `latin` list style type is now recognized as an alias for the `alpha` list style type. +// #TINY-11515 + +=== Fixed +* Image selection was removed when calling `+editor.nodeChanged()+` while having focus inside the editor UI. +// #TINY-11437 +* Tooltip would not show for group toolbar button. +// #TINY-11391 +* Changing the table row type when a `+contenteditable=false+` cell was selected would not work as expected. +// #TINY-11383 +// * The `samp` format was being applied as a `block` level format, instead of an `inline` format. +// #TINY-11390 +* Removed title attribute from dialog tree elements as they already have a tooltip. +// #TINY-11470 +* Fixed CSS bundling for skin UI content CSS. +// #TINY-11558 +* Fixed incorrect resource keys for CSS bundling JS files. +// #TINY-11558 + == xref:7.5-release-notes.adoc[7.5.0 - 2024-11-06] === Added diff --git a/modules/ROOT/pages/contextform.adoc b/modules/ROOT/pages/contextform.adoc index e3ec4fb325..8d978cdfc5 100644 --- a/modules/ROOT/pages/contextform.adoc +++ b/modules/ROOT/pages/contextform.adoc @@ -46,6 +46,11 @@ This relates to the form itself. The form specifications are: |`+position+` |This controls where the context toolbar will appear with regards to the current cursor. |`+scope+` |This controls whether the predicate (condition) is a `+node+`-based predicate, or an `+editor+`-based predicate. See context toolbar priority for more details. |`+commands+` |This is a list of the items to show in the context form. They can be either `+contextformbutton+` or `+contextformtogglebutton+`. +|`+onSetup+` +a| +`+(ContextFormApi) => (ContextFormApi) => void+` + +Optional default: `+() => () => {}+` - Function that's executed when the form is rendered. Once rendered, it returns a function that is executed when the context form is closed. |=== include::partial$context/positioning.adoc[leveloffset=+1] @@ -100,12 +105,13 @@ Where the `+toggleButtonApi+` is the same as a regular toolbar toggle button. === formApi -Both `+contextformbutton+` and `+contextformtogglebutton+` are passed `+formApi+` in their `+onAction+` callback. The `+formApi+` has two functions: +Both `+contextformbutton+` and `+contextformtogglebutton+` are passed `+formApi+` in their `+onAction+` callback. The `+formApi+` has three functions: [cols="1,3",options="header"] |=== |Functions |Description |`+hide+` |This will hide the form. By default, no button hides the form. It is the responsibility of the developer to hide the form in the `+onAction+` handler of buttons that require that the context form close after the action. +|`+back+` |This will restore the previous toolbar. This is useful when you want to go back to the previous toolbar when you press back in the toolbar. |`+getValue+` |This will retrieve the value current typed in the input field. |=== diff --git a/modules/ROOT/pages/contexttoolbar.adoc b/modules/ROOT/pages/contexttoolbar.adoc index dc57291ff4..8fb96d06e2 100644 --- a/modules/ROOT/pages/contexttoolbar.adoc +++ b/modules/ROOT/pages/contexttoolbar.adoc @@ -27,6 +27,41 @@ This example shows how the quickbars plugin adds the standard selection context liveDemo::context-toolbar[height="600", tab="js"] +[[add-labels-and-groups-for-context-toolbar-buttons]] +== Add labels and groups for context toolbar buttons + +From {productname} 7.6.0 onward, registering a context toolbar allows specifying `items` as an object that supports grouping with optional names and labels. This improvement enhances toolbar usability by organizing buttons into titled or labeled groups. + +The object structure takes two optional properties: `name` and `label`. + +* `name`: property is used as the group's title for the group that contains the buttons. +* `label`: property is used as a label for each group of buttons. + +[NOTE] +If neither `name` nor `label` are specified, the behavior defaults to ungrouped buttons. + +The object structure for `items` is as follows: + +.Example of a context toolbar configuration with groups and labels +[source,js] +---- +items: [ + { + name: 'Formatting', // Optional, used as the group's title + items: [ 'bold', 'italic' ] // Array of registered button names + }, + { + label: 'History', // Optional, used as a label for the group + items: [ 'undo', 'redo' ] // Array of registered button names + }, + { + items: [ 'undo', 'italic' ] // No name or label specified, default behavior applies + } +] +---- + +liveDemo::context-toolbar-labels[height="600", tab="js"] + == Launching a context toolbar programmatically There is an `+editor+` event called `+contexttoolbar-show+` that can be fired to show a context toolbar at the current selection. The event takes a parameter `+toolbarKey+` which specifies the name of the registered context form or context toolbar to show. diff --git a/modules/ROOT/pages/editor-important-options.adoc b/modules/ROOT/pages/editor-important-options.adoc index 4bb655ea99..6266d36056 100644 --- a/modules/ROOT/pages/editor-important-options.adoc +++ b/modules/ROOT/pages/editor-important-options.adoc @@ -35,6 +35,10 @@ include::partial$configuration/external_plugins.adoc[leveloffset=+1] include::partial$configuration/readonly.adoc[leveloffset=+1] +== Setting the editor in a disabled state + +include::partial$configuration/disabled.adoc[leveloffset=+1] + == Executing custom functions while the editor starts (initializes) include::partial$configuration/setup.adoc[leveloffset=+1] diff --git a/modules/ROOT/pages/events.adoc b/modules/ROOT/pages/events.adoc index abe61a14af..912f25a988 100644 --- a/modules/ROOT/pages/events.adoc +++ b/modules/ROOT/pages/events.adoc @@ -160,6 +160,7 @@ The following events are provided by the {productname} editor. |ObjectResized |`+{ target: HTMLElement, width: number, height: number, origin: string }+` |Fired when an object (such as an image) has finished being resized. |ObjectResizeStart |`+{ target: HTMLElement, width: number, height: number, origin: string }+` |Fired when an object (such as an image) is about to be resized. |SwitchMode |`+{ mode: string }+` |Fired when the editor mode is changed. The available modes are "design" and "readonly". Additional modes can be registered using {productname} API xref:apis/tinymce.editormode.adoc#register['tinymce.activeEditor.mode.register()']. +|DisabledStateChange |+{ state: boolean }+ |Fired when the editor disabled mode state changes. |ScrollWindow |(Same data as the native https://developer.mozilla.org/en-US/docs/Web/API/Element/scroll_event[scroll event]) |Fired when the window has scrolled. |ResizeWindow |(Same data as the native https://developer.mozilla.org/en-US/docs/Web/API/Window/resize_event[resize event]) |Fired when the window is resized. |BeforeExecCommand |`+{ command: string, ui?: boolean, value?: any }+` |Fired before a command is executed. diff --git a/modules/ROOT/pages/release-notes.adoc b/modules/ROOT/pages/release-notes.adoc index 584545b6f5..9b6f8be992 100644 --- a/modules/ROOT/pages/release-notes.adoc +++ b/modules/ROOT/pages/release-notes.adoc @@ -9,6 +9,12 @@ This section lists the releases for {productname} 7 and the changes made in each [cols="1,1"] |=== +a| +[.lead] +xref:7.6.0-release-notes.adoc#overview[{productname} 7.6.0] + +Release notes for {productname} 7.6.0 + a| [.lead] xref:7.5.1-release-notes.adoc#overview[{productname} 7.5.1] diff --git a/modules/ROOT/pages/uploadcare.adoc b/modules/ROOT/pages/uploadcare.adoc new file mode 100644 index 0000000000..323fd687fe --- /dev/null +++ b/modules/ROOT/pages/uploadcare.adoc @@ -0,0 +1,216 @@ += {pluginname} plugin +:navtitle: Image Optimizer Powered by Uploadcare +:description: The Image Optimizer Powered by Uploadcare plugin allows you to optimize images in your content. +:description_short: +:plugincode: uploadcare +:pluginname: Image Optimizer Powered by Uploadcare +:keywords: plugin, {plugincode}, image, align, transform, alt text, caption, adjust, filter +:plugincategory: premium + +include::partial$misc/admon-premium-plugin.adoc[] + +include::partial$misc/admon-requires-7.6v.adoc[] + +== Overview + +The **Image Optimizer** plugin offers a range of powerful features for image hosting, serving, and editing. These include responsive image delivery, automatic image format selection, automatic compression, and non-destructive image transformations and adjustments, all powered by link:https://uploadcare.com[Uploadcare]. + +== Key benefits + +* Improve page loading speed and save on bandwidth by serving images in the optimal size, format, and compression based on the visitor's browser and device. +* Ditch the image editor and adjust images right inside {productname} with non-destructive transformations and adjustments. Change your mind any time! +* Stay safe and compliant with secure uploads, built in malware protection, and unsafe content detection +* Enterprise-ready scalable cloud storage provided by Uploadcare, delivered through its lightning-fast global CDN, and compliant with SOC2 and GDPR standards. + +== Interactive example + +liveDemo::{plugincode}[] + +== Basic setup + +To add the {pluginname} plugin to the editor, add `{plugincode}` to the `plugins` option in the editor configuration. + +For example: + +[source,js] +---- +tinymce.init({ + selector: 'textarea', + plugins: 'uploadcare', + toolbar: 'uploadcare', + uploadcare_public_key: '', + // uploadcare_signed_upload_auth_provider: (_publicKey) => Promise.resolve({ + // signature: 'sig', + // expire: 123 + // }), // Recommended option for secure uploads +}); +---- + +[NOTE] +==== +The {pluginname} plugin overrides the xref:quickbars.adoc[Quickbar] quickimage toolbar item. To ensure a better user experience and to avoid having two image buttons configure `quickbars_insert_toolbar` to omit the `quickimage` toolbar item. +==== + +== Image Operations + +Below is an overview of the features of the {pluginname} plugin includes for image optimization: + +[cols="1,1,^1,3",options="header"] +|=== +| Feature | Operation | Icon | Description + +| Align +| +| image:icons/align-left.svg[align-left.svg] +| Provides alignment options for the image or element. + +| +| Align Left +| image:icons/align-left.svg[align-left.svg] +| Aligns the image to the left. + +| +| Align Centre +| image:icons/align-center.svg[align-center.svg] +| Centers the image. + +| +| Align Right +| image:icons/align-right.svg[align-right.svg] +| Aligns the image to the right. + +| Transform +| +| image:icons/transform-image.svg[transform-image.svg] +| Allows users to apply transformations to the image: + +| +| Rotate Left +| image:icons/rotate-left.svg[rotate-left.svg] +| Rotates the image counterclockwise (left). + +| +| Rotate Right +| image:icons/rotate-right.svg[rotate-right.svg] +| Rotates the image clockwise (right). + +| +| Flip Vertically +| image:icons/flip-vertically.svg[flip-vertically.svg] +| Flips the image vertically. + +| +| Flip Horizontally +| image:icons/flip-horizontally.svg[flip-horizontally.svg] +| Flips the image horizontally. + +| +| Resize +| image:icons/resize.svg[resize.svg] +| Changes the size of the image. + +| Alt Text +| +| image:icons/alt-text.svg[alt-text.svg] +| Adds alternative text to describe the image for accessibility purposes. + +| +| Decorative Image +| image:icons/image-decorative.svg[image-decorative.svg] +a| +Marks the image as decorative, indicating it doesn't require alternative text for accessibility. + +This icon will only appear when the `a11y_advanced_options` configuration option is enabled. + +| Caption +| +| image:icons/caption.svg[caption.svg] +| Adds a caption below the image for additional context. + +| Adjust +| +| image:icons/adjustments.svg[adjustments.svg] +| Provides tools for adjusting image properties: + +| +| Brightness +| image:icons/brightness.svg[brightness.svg] +| Adjusts the image brightness. + +| +| Contrast +| image:icons/contrast.svg[contrast.svg] +| Adjusts the image contrast. + +| +| Exposure +| image:icons/exposure.svg[exposure.svg] +| Adjusts the image exposure. + +| +| Gamma +| image:icons/gamma.svg[gamma.svg] +| Adjusts the image gamma. + +| +| Vibrance +| image:icons/vibrance.svg[vibrance.svg] +| Adjusts the image vibrance. + +| +| Saturation +| image:icons/saturation.svg[saturation.svg] +| Adjusts the image saturation. + +| +| Warmth +| image:icons/warmth.svg[warmth.svg] +| Adjusts the image warmth. + +| +| Grayscale +| image:icons/grayscale.svg[grayscale.svg] +| Converts the image to grayscale. + +| +| Invert Colors +| image:icons/invert.svg[invert.svg] +| Inverts the image colors. + +| +| Sharpen +| image:icons/sharpen.svg[sharpen.svg] +| Sharpens the image. + +| +| Blur +| image:icons/blur.svg[blur.svg] +| Blurs the image. + +| Revert +| +| image:icons/revert.svg[revert.svg] +| Restores the image to its original state by undoing all edits. +|=== + +== Options + +The following configuration options affect the behavior of the {pluginname} plugin. + +include::partial$configuration/uploadcare_public_key.adoc[leveloffset=+1] + +include::partial$configuration/uploadcare_signed_upload_auth_provider.adoc[leveloffset=+1] + +include::partial$configuration/uploadcare_cdn_base_url.adoc[leveloffset=+1] + +include::partial$configuration/uploadcare_srcset_steps.adoc[leveloffset=+1] + +include::partial$configuration/uploadcare_store_type.adoc[leveloffset=+1] + +:includedSection: uploadcarePlugin +include::partial$configuration/a11y_advanced_options.adoc[leveloffset=+1] +:!includedSection: + +include::partial$misc/plugin-toolbar-button-id-boilerplate.adoc[] + +include::partial$misc/plugin-menu-item-id-boilerplate.adoc[] diff --git a/modules/ROOT/partials/configuration/a11y_advanced_options.adoc b/modules/ROOT/partials/configuration/a11y_advanced_options.adoc index faa0684e1a..de6765c7f7 100644 --- a/modules/ROOT/partials/configuration/a11y_advanced_options.adoc +++ b/modules/ROOT/partials/configuration/a11y_advanced_options.adoc @@ -3,15 +3,20 @@ This option affects the functionality of: -* The Accessibility Checker plugin (`+a11ychecker+`). -* The Image plugin (`+image+`). +* The xref:a11ychecker.adoc[Accessibility Checker] plugin (`+a11ychecker+`). +* The xref:image.adoc[Image] plugin (`+image+`). +* The xref:uploadcare.adoc[Image Optimizer Powered by Uploadcare] plugin (`+uploadcare+`). Setting `+a11y_advanced_options+` to `+true+`: * Adds the *Image is decorative* option to the _Insert/Edit Image_ dialog, allowing users to specify that an image is decorative and does not require alternative text for accessibility purposes. +* Adds the *Decorative image* button to Image Optimizer's _Alt text_ context toolbar, allowing users to specify that an image is decorative and does not require alternative text for accessibility purposes. * Adds the *Image is decorative* option to the _Accessibility Checker error_ dialog for images without alternative text or the `+role="presentation"+` attribute. -IMPORTANT: When `+a11y_advanced_options+` is set to `+true+`, xref:a11ychecker.adoc#a11ychecker_allow_decorative_images[`+a11ychecker_allow_decorative_images+`] will default to `+true+`. +[IMPORTANT] +==== +If `xref:a11ychecker.adoc#a11ychecker_allow_decorative_images[a11ychecker_allow_decorative_images]` is not explicitly set, the value defined in `+a11y_advanced_options+` will be used. +==== *Type:* `+Boolean+` @@ -21,6 +26,20 @@ IMPORTANT: When `+a11y_advanced_options+` is set to `+true+`, xref:a11ychecker.a === Example: using `+a11y_advanced_options+` +ifeval::["{includedSection}" == "uploadcarePlugin"] + +[source,js] +---- +tinymce.init({ + selector: 'textarea', // change this value according to your HTML + plugins: 'uploadcare', + toolbar: 'uploadcare', + uploadcare_public_key: '', + a11y_advanced_options: true, +}); +---- + +endif::[] ifeval::["{includedSection}" == "imagePlugin"] [source,js] @@ -29,7 +48,7 @@ tinymce.init({ selector: 'textarea', // change this value according to your HTML plugins: 'image', toolbar: 'image', - a11y_advanced_options: true + a11y_advanced_options: true, }); ---- @@ -42,7 +61,7 @@ tinymce.init({ selector: 'textarea', // change this value according to your HTML plugins: 'a11ychecker', toolbar: 'a11ycheck', - a11y_advanced_options: true + a11y_advanced_options: true, }); ---- @@ -55,7 +74,7 @@ tinymce.init({ selector: 'textarea', // change this value according to your HTML plugins: 'a11ychecker image', toolbar: 'a11ycheck image', - a11y_advanced_options: true + a11y_advanced_options: true, }); ---- diff --git a/modules/ROOT/partials/configuration/a11ychecker_allow_decorative_images.adoc b/modules/ROOT/partials/configuration/a11ychecker_allow_decorative_images.adoc index 4562a11330..1273b98df0 100644 --- a/modules/ROOT/partials/configuration/a11ychecker_allow_decorative_images.adoc +++ b/modules/ROOT/partials/configuration/a11ychecker_allow_decorative_images.adoc @@ -25,7 +25,10 @@ If `+a11ychecker_allow_decorative_images+` is set to `+false+`, the Accessibilit * An image has an empty alternative text attribute. * An image has the `+role="presentation"+` attribute. -NOTE: If xref:a11ychecker.adoc#a11y_advanced_options[`+a11y_advanced_options+`] is set to `+true+`, `+a11ychecker_allow_decorative_images+` will default to `+true+`. +[NOTE] +==== +If `+a11ychecker_allow_decorative_images+` is not explicitly set, the value defined in `xref:a11ychecker.adoc#a11y_advanced_options[a11y_advanced_options]` will be used. +==== *Type:* `+Boolean+` diff --git a/modules/ROOT/partials/configuration/a11ychecker_issue_url_callback.adoc b/modules/ROOT/partials/configuration/a11ychecker_issue_url_callback.adoc index 600cd36b0d..2d8c53af01 100644 --- a/modules/ROOT/partials/configuration/a11ychecker_issue_url_callback.adoc +++ b/modules/ROOT/partials/configuration/a11ychecker_issue_url_callback.adoc @@ -1,7 +1,7 @@ [[a11ychecker_issue_url_callback]] == `+a11ychecker_issue_url_callback+` -The `+a11ychecker_issue_url_callback+` option is used to change the target URL for the "Click for more info" button (image:icons/help.svg[help icon - a question mark inside a circle]) in the Accessibility Checker dialog. By default, the "more info" links will point to `+https://www.tiny.cloud/docs/tinymce/6/a11ychecker/#+`, such as `+https://www.tiny.cloud/docs/tinymce/6/a11ychecker/#D1+`. This option can be used to set the target URL to a page or pages outside {site-url}/. +The `+a11ychecker_issue_url_callback+` option is used to change the target URL for the "Click for more info" button (image:icons/help.svg[help icon - a question mark inside a circle]) in the Accessibility Checker dialog. By default, the "more info" links will point to `+https://www.tiny.cloud/docs/tinymce/7/a11ychecker/#+`, such as `+https://www.tiny.cloud/docs/tinymce/7/a11ychecker/#D1+`. This option can be used to set the target URL to a page or pages outside {site-url}/. *Type:* `+Function+` diff --git a/modules/ROOT/partials/configuration/disabled.adoc b/modules/ROOT/partials/configuration/disabled.adoc new file mode 100644 index 0000000000..c54b4cf306 --- /dev/null +++ b/modules/ROOT/partials/configuration/disabled.adoc @@ -0,0 +1,23 @@ +[[disabled]] + +== `+disabled+` + +Disables all user interactions with the editor (including cursor placement, content modifications, UI components). This option provides behavior similar to the changes made to {productname} in 7.4.0 readonly mode. When enabled, the editor becomes completely non-interactive. + +To programmatically enable/disable the editor, use `+tinymce.activeEditor.options.set('disabled', false/true)+`. + +*Type:* `+Boolean+` + +*Default value:* `+false+` + +*Possible values:* `+true+`, `+false+` + +=== Example: using `+disabled+` + +[source,js] +---- +tinymce.init({ + selector: 'textarea', // change this value according to your HTML + disabled: true +}); +---- \ No newline at end of file diff --git a/modules/ROOT/partials/configuration/icon_list.adoc b/modules/ROOT/partials/configuration/icon_list.adoc index 772dab3b63..d656230b70 100644 --- a/modules/ROOT/partials/configuration/icon_list.adoc +++ b/modules/ROOT/partials/configuration/icon_list.adoc @@ -6,7 +6,9 @@ | `+accordion+` | image:icons/accordion.svg[accordion.svg] | `+accordion.svg+` | `+action-next+` | image:icons/action-next.svg[action-next.svg] | `+action-next.svg+` | `+action-prev+` | image:icons/action-prev.svg[action-prev.svg] | `+action-prev.svg+` +| `+add-file+` | image:icons/add-file.svg[add-file.svg] | `+add-file.svg+` | `+addtag+` | image:icons/addtag.svg[addtag.svg] | `+addtag.svg+` +| `+adjustments+` | image:icons/adjustments.svg[adjustments.svg] | `+adjustments.svg+` | `+ai-prompt+` | image:icons/ai-prompt.svg[ai-prompt.svg] | `+ai-prompt.svg+` | `+ai+` | image:icons/ai.svg[ai.svg] | `+ai.svg+` | `+align-center+` | image:icons/align-center.svg[align-center.svg] | `+align-center.svg+` @@ -14,15 +16,20 @@ | `+align-left+` | image:icons/align-left.svg[align-left.svg] | `+align-left.svg+` | `+align-none+` | image:icons/align-none.svg[align-none.svg] | `+align-none.svg+` | `+align-right+` | image:icons/align-right.svg[align-right.svg] | `+align-right.svg+` +| `+alt-text+` | image:icons/alt-text.svg[alt-text.svg] | `+alt-text.svg+` | `+arrow-left+` | image:icons/arrow-left.svg[arrow-left.svg] | `+arrow-left.svg+` | `+arrow-right+` | image:icons/arrow-right.svg[arrow-right.svg] | `+arrow-right.svg+` +| `+blur+` | image:icons/blur.svg[blur.svg] | `+blur.svg+` | `+bold+` | image:icons/bold.svg[bold.svg] | `+bold.svg+` | `+bookmark+` | image:icons/bookmark.svg[bookmark.svg] | `+bookmark.svg+` | `+border-style+` | image:icons/border-style.svg[border-style.svg] | `+border-style.svg+` | `+border-width+` | image:icons/border-width.svg[border-width.svg] | `+border-width.svg+` +| `+box+` | image:icons/box.svg[box.svg] | `+box.svg+` | `+brightness+` | image:icons/brightness.svg[brightness.svg] | `+brightness.svg+` | `+browse+` | image:icons/browse.svg[browse.svg] | `+browse.svg+` +| `+camera+` | image:icons/camera.svg[camera.svg] | `+camera.svg+` | `+cancel+` | image:icons/cancel.svg[cancel.svg] | `+cancel.svg+` +| `+caption+` | image:icons/caption.svg[caption.svg] | `+caption.svg+` | `+cell-background-color+` | image:icons/cell-background-color.svg[cell-background-color.svg] | `+cell-background-color.svg+` | `+cell-border-color+` | image:icons/cell-border-color.svg[cell-border-color.svg] | `+cell-border-color.svg+` | `+change-case+` | image:icons/change-case.svg[change-case.svg] | `+change-case.svg+` @@ -50,6 +57,7 @@ | `+cut+` | image:icons/cut.svg[cut.svg] | `+cut.svg+` | `+document-properties+` | image:icons/document-properties.svg[document-properties.svg] | `+document-properties.svg+` | `+drag+` | image:icons/drag.svg[drag.svg] | `+drag.svg+` +| `+dropbox+` | image:icons/dropbox.svg[dropbox.svg] | `+dropbox.svg+` | `+duplicate-column+` | image:icons/duplicate-column.svg[duplicate-column.svg] | `+duplicate-column.svg+` | `+duplicate-row+` | image:icons/duplicate-row.svg[duplicate-row.svg] | `+duplicate-row.svg+` | `+duplicate+` | image:icons/duplicate.svg[duplicate.svg] | `+duplicate.svg+` @@ -58,11 +66,16 @@ | `+embed-page+` | image:icons/embed-page.svg[embed-page.svg] | `+embed-page.svg+` | `+embed+` | image:icons/embed.svg[embed.svg] | `+embed.svg+` | `+emoji+` | image:icons/emoji.svg[emoji.svg] | `+emoji.svg+` +| `+evernote+` | image:icons/evernote.svg[evernote.svg] | `+evernote.svg+` | `+export-pdf+` | image:icons/export-pdf.svg[export-pdf.svg] | `+export-pdf.svg+` | `+export-word+` | image:icons/export-word.svg[export-word.svg] | `+export-word.svg+` +| `+exposure+` | image:icons/exposure.svg[exposure.svg] | `+exposure.svg+` +| `+fb+` | image:icons/fb.svg[fb.svg] | `+fb.svg+` | `+fill+` | image:icons/fill.svg[fill.svg] | `+fill.svg+` +| `+flickr+` | image:icons/flickr.svg[flickr.svg] | `+flickr.svg+` | `+flip-horizontally+` | image:icons/flip-horizontally.svg[flip-horizontally.svg] | `+flip-horizontally.svg+` | `+flip-vertically+` | image:icons/flip-vertically.svg[flip-vertically.svg] | `+flip-vertically.svg+` +| `+folder+` | image:icons/folder.svg[folder.svg] | `+folder.svg+` | `+footnote+` | image:icons/footnote.svg[footnote.svg] | `+footnote.svg+` | `+format-code+` | image:icons/format-code.svg[format-code.svg] | `+format-code.svg+` | `+format-painter+` | image:icons/format-painter.svg[format-painter.svg] | `+format-painter.svg+` @@ -70,10 +83,16 @@ | `+fullscreen+` | image:icons/fullscreen.svg[fullscreen.svg] | `+fullscreen.svg+` | `+gallery+` | image:icons/gallery.svg[gallery.svg] | `+gallery.svg+` | `+gamma+` | image:icons/gamma.svg[gamma.svg] | `+gamma.svg+` +| `+google-drive+` | image:icons/google-drive.svg[google-drive.svg] | `+google-drive.svg+` +| `+google-photos+` | image:icons/google-photos.svg[google-photos.svg] | `+google-photos.svg+` +| `+grayscale+` | image:icons/grayscale.svg[grayscale.svg] | `+grayscale.svg+` | `+help+` | image:icons/help.svg[help.svg] | `+help.svg+` | `+highlight-bg-color+` | image:icons/highlight-bg-color.svg[highlight-bg-color.svg] | `+highlight-bg-color.svg+` | `+home+` | image:icons/home.svg[home.svg] | `+home.svg+` | `+horizontal-rule+` | image:icons/horizontal-rule.svg[horizontal-rule.svg] | `+horizontal-rule.svg+` +| `+huddle+` | image:icons/huddle.svg[huddle.svg] | `+huddle.svg+` +| `+image-decorative+` | image:icons/image-decorative.svg[image-decorative.svg] | `+image-decorative.svg+` +| `+image-enhancements+` | image:icons/image-enhancements.svg[image-enhancements.svg] | `+image-enhancements.svg+` | `+image-options+` | image:icons/image-options.svg[image-options.svg] | `+image-options.svg+` | `+image+` | image:icons/image.svg[image.svg] | `+image.svg+` | `+import-word+` | image:icons/import-word.svg[import-word.svg] | `+import-word.svg+` @@ -81,6 +100,7 @@ | `+info+` | image:icons/info.svg[info.svg] | `+info.svg+` | `+insert-character+` | image:icons/insert-character.svg[insert-character.svg] | `+insert-character.svg+` | `+insert-time+` | image:icons/insert-time.svg[insert-time.svg] | `+insert-time.svg+` +| `+instagram+` | image:icons/instagram.svg[instagram.svg] | `+instagram.svg+` | `+invert+` | image:icons/invert.svg[invert.svg] | `+invert.svg+` | `+italic+` | image:icons/italic.svg[italic.svg] | `+italic.svg+` | `+language+` | image:icons/language.svg[language.svg] | `+language.svg+` @@ -111,6 +131,7 @@ | `+new-tab+` | image:icons/new-tab.svg[new-tab.svg] | `+new-tab.svg+` | `+non-breaking+` | image:icons/non-breaking.svg[non-breaking.svg] | `+non-breaking.svg+` | `+notice+` | image:icons/notice.svg[notice.svg] | `+notice.svg+` +| `+onedrive+` | image:icons/onedrive.svg[onedrive.svg] | `+onedrive.svg+` | `+ordered-list-rtl+` | image:icons/ordered-list-rtl.svg[ordered-list-rtl.svg] | `+ordered-list-rtl.svg+` | `+ordered-list+` | image:icons/ordered-list.svg[ordered-list.svg] | `+ordered-list.svg+` | `+orientation+` | image:icons/orientation.svg[orientation.svg] | `+orientation.svg+` @@ -133,13 +154,15 @@ | `+reload+` | image:icons/reload.svg[reload.svg] | `+reload.svg+` | `+remove-formatting+` | image:icons/remove-formatting.svg[remove-formatting.svg] | `+remove-formatting.svg+` | `+remove+` | image:icons/remove.svg[remove.svg] | `+remove.svg+` -| `+revision-history+` | image:icons/revision-history.svg[revision-history.svg] | `+revision-history.svg+` | `+resize-handle+` | image:icons/resize-handle.svg[resize-handle.svg] | `+resize-handle.svg+` | `+resize+` | image:icons/resize.svg[resize.svg] | `+resize.svg+` | `+restore-draft+` | image:icons/restore-draft.svg[restore-draft.svg] | `+restore-draft.svg+` +| `+revert+` | image:icons/revert.svg[revert.svg] | `+revert.svg+` +| `+revision-history+` | image:icons/revision-history.svg[revision-history.svg] | `+revision-history.svg+` | `+rotate-left+` | image:icons/rotate-left.svg[rotate-left.svg] | `+rotate-left.svg+` | `+rotate-right+` | image:icons/rotate-right.svg[rotate-right.svg] | `+rotate-right.svg+` | `+rtl+` | image:icons/rtl.svg[rtl.svg] | `+rtl.svg+` +| `+saturation+` | image:icons/saturation.svg[saturation.svg] | `+saturation.svg+` | `+save+` | image:icons/save.svg[save.svg] | `+save.svg+` | `+search+` | image:icons/search.svg[search.svg] | `+search.svg+` | `+select-all+` | image:icons/select-all.svg[select-all.svg] | `+select-all.svg+` @@ -180,6 +203,7 @@ | `+text-size-decrease+` | image:icons/text-size-decrease.svg[text-size-decrease.svg] | `+text-size-decrease.svg+` | `+text-size-increase+` | image:icons/text-size-increase.svg[text-size-increase.svg] | `+text-size-increase.svg+` | `+toc+` | image:icons/toc.svg[toc.svg] | `+toc.svg+` +| `+transform-image+` | image:icons/transform-image.svg[transform-image.svg] | `+transform-image.svg+` | `+translate+` | image:icons/translate.svg[translate.svg] | `+translate.svg+` | `+typography+` | image:icons/typography.svg[typography.svg] | `+typography.svg+` | `+underline+` | image:icons/underline.svg[underline.svg] | `+underline.svg+` @@ -191,9 +215,12 @@ | `+upload+` | image:icons/upload.svg[upload.svg] | `+upload.svg+` | `+user+` | image:icons/user.svg[user.svg] | `+user.svg+` | `+vertical-align+` | image:icons/vertical-align.svg[vertical-align.svg] | `+vertical-align.svg+` +| `+vibrance+` | image:icons/vibrance.svg[vibrance.svg] | `+vibrance.svg+` | `+visualblocks+` | image:icons/visualblocks.svg[visualblocks.svg] | `+visualblocks.svg+` | `+visualchars+` | image:icons/visualchars.svg[visualchars.svg] | `+visualchars.svg+` +| `+vk+` | image:icons/vk.svg[vk.svg] | `+vk.svg+` +| `+warmth+` | image:icons/warmth.svg[warmth.svg] | `+warmth.svg+` | `+warning+` | image:icons/warning.svg[warning.svg] | `+warning.svg+` | `+zoom-in+` | image:icons/zoom-in.svg[zoom-in.svg] | `+zoom-in.svg+` | `+zoom-out+` | image:icons/zoom-out.svg[zoom-out.svg] | `+zoom-out.svg+` -|=== +|=== \ No newline at end of file diff --git a/modules/ROOT/partials/configuration/tinycomments_reply.adoc b/modules/ROOT/partials/configuration/tinycomments_reply.adoc index 452d98c993..99d0283433 100644 --- a/modules/ROOT/partials/configuration/tinycomments_reply.adoc +++ b/modules/ROOT/partials/configuration/tinycomments_reply.adoc @@ -16,7 +16,9 @@ The `+done+` callback should accept the following object: [source,js] ---- { - commentUid: string // the value of the new comment uid + commentUid: string, // the new comment uid + author: string, // the id of the current author + authorName: string // the name of the current author } ---- @@ -42,7 +44,11 @@ const reply_comment = (ref, done, fail) => { }) .then((ref2) => { let commentUid = ref2.commentUid; - done({ commentUid: commentUid }); + done({ + commentUid: replyUid, + author: currentUser.id, + authorName: currentUser.fullName + }); }) .catch((e) => { fail(e); diff --git a/modules/ROOT/partials/configuration/uploadcare_cdn_base_url.adoc b/modules/ROOT/partials/configuration/uploadcare_cdn_base_url.adoc new file mode 100644 index 0000000000..e21808e46d --- /dev/null +++ b/modules/ROOT/partials/configuration/uploadcare_cdn_base_url.adoc @@ -0,0 +1,21 @@ +[[uploadcare-cdn-base-url]] +== `uploadcare_cdn_base_url` + +Specifies the domain used for the Uploadcare service. This domain determines where your files are uploaded and accessed. By default, the plugin uses the Uploadcare CDN `ucarecdn.com` to host and deliver your files. If you use a custom domain, update this option to match your configuration. + +*Type:* `+String+` + +*Default:* `+https://ucarecdn.com/+` + +=== Example: Customizing `uploadcare_cdn_base_url` + +[source,js] +---- +tinymce.init({ + selector: "textarea", + plugins: 'uploadcare', + toolbar: 'uploadcare', + uploadcare_public_key: '', + uploadcare_cdn_base_url: 'https://cdn.mydomain.com', +}); +---- \ No newline at end of file diff --git a/modules/ROOT/partials/configuration/uploadcare_public_key.adoc b/modules/ROOT/partials/configuration/uploadcare_public_key.adoc new file mode 100644 index 0000000000..97d032f693 --- /dev/null +++ b/modules/ROOT/partials/configuration/uploadcare_public_key.adoc @@ -0,0 +1,21 @@ +[[uploadcare-public-key]] +== `uploadcare_public_key` + +Defines the public API key required to authenticate and interact with the Uploadcare API. This key identifies your account and ensures that uploads and operations are associated with your project. Without setting this key, the Uploadcare integration will not function. + +[IMPORTANT] +This option is mandatory for using Uploadcare. + +*Type:* `+String+` + +=== Example: Setting `uploadcare_public_key` + +[source,js] +---- +tinymce.init({ + selector: 'textarea', + plugins: 'uploadcare', + toolbar: 'uploadcare', + uploadcare_public_key: '', +}); +---- \ No newline at end of file diff --git a/modules/ROOT/partials/configuration/uploadcare_signed_upload_auth_provider.adoc b/modules/ROOT/partials/configuration/uploadcare_signed_upload_auth_provider.adoc new file mode 100644 index 0000000000..7d760afd5f --- /dev/null +++ b/modules/ROOT/partials/configuration/uploadcare_signed_upload_auth_provider.adoc @@ -0,0 +1,37 @@ +[[uploadcare-signed-upload-auth-provider]] +== `uploadcare_signed_upload_auth_provider` + +Specifies a function used to generate secure signatures for authenticated requests to Uploadcare. This function is required when enabling Uploadcare's signed uploads feature, which ensures that only authorized users can upload files using your `uploadcare_public_key`. The function should return a `Promise` that resolves with an object containing the signature and expiration timestamp. + +Use this option to enforce secure uploads, preventing unauthorized users from uploading files via your application. + +*Type:* `+Function+` + +=== Example: Setting `uploadcare_signed_upload_auth_provider` + +[source,js] +---- +tinymce.init({ + selector: 'textarea', + plugins: 'uploadcare', + toolbar: 'uploadcare', + uploadcare_public_key: '', + uploadcare_signed_upload_auth_provider: (_publicKey) => Promise.resolve({ + signature: 'sig', + expire: 123 + }), +}); +---- + +[IMPORTANT] +==== +{companyname} recommends configuring the `uploadcare_signed_upload_auth_provider` option to secure uploads and prevent misuse of your Uploadcare `uploadcare_public_key`. This option is essential for applications requiring: + +* Prevention of unauthorized file uploads via your `uploadcare_public_key`. +* Enforcement of secure upload practices for application integrity. + +[NOTE] +This option **only** secures unauthorized access to upload files to the uploadcare storage by verifying signatures during uploads. + +For most integrations, enabling signed uploads by configuring this option ensures that only authorized uploads occur, reducing the risk of abuse and maintaining secure usage of your `uploadcare_public_key`. +==== diff --git a/modules/ROOT/partials/configuration/uploadcare_srcset_steps.adoc b/modules/ROOT/partials/configuration/uploadcare_srcset_steps.adoc new file mode 100644 index 0000000000..9def602a33 --- /dev/null +++ b/modules/ROOT/partials/configuration/uploadcare_srcset_steps.adoc @@ -0,0 +1,48 @@ +[[uploadcare-srcset-steps]] +== `uploadcare_srcset_steps` + +Specifies an array of numeric values representing the widths used to generate the `srcset` attribute for responsive images. This enables browsers to select the most suitable resolution based on the device’s display and network conditions. + +Customize this array to include **only** the widths required for your application. Reducing the number of resolutions can improve processing speed, while adding specific sizes can accommodate unique layout needs. + +*Type:* `+Array+` + +*Default:* `+[100, 200, 300, 500, 750, 1000, 1250, 1500, 2000, 2500, 3000]+` + +=== Example: Generated `srcset` Attribute with Custom Widths + +When an image is uploaded, its original width is used to create a `srcset` attribute with downscaled images for the defined widths. For instance, if the image width is 780 pixels and `uploadcare_srcset_steps` is set to `[100, 200, 300, 500, 750]`, the resulting `srcset` will look like this: + +.Example: Responsive 780px Image with Custom Widths in `srcset` +[source,html] +---- + +---- + +This ensures the browser selects the optimal image size based on the viewport and device characteristics, enhancing performance and user experience. On devices with narrower viewports, smaller images (e.g., 100w or 200w) will be prioritized, reducing bandwidth usage. + +=== Example: Customizing `uploadcare_srcset_steps` + +To customize the array, update the configuration as shown below: + +[source,js] +---- +tinymce.init({ + selector: 'textarea', + plugins: 'uploadcare', + toolbar: 'uploadcare', + uploadcare_public_key: '', + uploadcare_srcset_steps: [100, 200, 300, 500, 750], +}); +---- diff --git a/modules/ROOT/partials/configuration/uploadcare_store_type.adoc b/modules/ROOT/partials/configuration/uploadcare_store_type.adoc new file mode 100644 index 0000000000..eb42668f69 --- /dev/null +++ b/modules/ROOT/partials/configuration/uploadcare_store_type.adoc @@ -0,0 +1,29 @@ +[[uploadcare-store-type]] +== `uploadcare_store_type` + +Specifies the storage type for uploaded files. Use this option to control whether files are stored temporarily or permanently, or allow Uploadcare to decide automatically based on your account settings. + +* `auto`: Uploadcare decides the storage type. +* `temporary`: Files are stored temporarily and will expire after a certain period. +* `permanent`: Files are stored permanently in your Uploadcare account. + +Select the appropriate value based on your application's requirements, such as whether files should persist for long-term use or be available for a limited time. + +*Type:* `+String+` + +*Default:* `permanent` + +*Possible values:* `auto`, `temporary`, `permanent` + +=== Example: Using `uploadcare_store_type` + +[source,js] +---- +tinymce.init({ + selector: 'textarea', + plugins: 'uploadcare', + toolbar: 'uploadcare', + uploadcare_public_key: '', + uploadcare_store_type: 'permanent', +}); +---- \ No newline at end of file diff --git a/modules/ROOT/partials/index-pages/premium-plugins.adoc b/modules/ROOT/partials/index-pages/premium-plugins.adoc index e38f404eab..3d76fe8cc5 100644 --- a/modules/ROOT/partials/index-pages/premium-plugins.adoc +++ b/modules/ROOT/partials/index-pages/premium-plugins.adoc @@ -99,6 +99,12 @@ xref:editimage.adoc[Image Editing] Image Editing features for {productname}. +a| +[.lead] +xref:uploadcare.adoc[Image Optimizer Powered by Uploadcare] + +Image optimization features for {productname}. + a| [.lead] xref:linkchecker.adoc[Link Checker] diff --git a/modules/ROOT/partials/menu-item-ids/uploadcare-menu-items.adoc b/modules/ROOT/partials/menu-item-ids/uploadcare-menu-items.adoc new file mode 100644 index 0000000000..27b724ae32 --- /dev/null +++ b/modules/ROOT/partials/menu-item-ids/uploadcare-menu-items.adoc @@ -0,0 +1,5 @@ +[cols="1,3",options="header"] +|=== +|Identifier |Description +| `+uploadcare+` | Inserts an image placeholder element. This placeholder supports image uploads via drag-and-drop, file selection, or by providing a URL. +|=== \ No newline at end of file diff --git a/modules/ROOT/partials/misc/admon-accessibility-rule-i3-can-also-be-applied.adoc b/modules/ROOT/partials/misc/admon-accessibility-rule-i3-can-also-be-applied.adoc index 39650322f0..24afe58283 100644 --- a/modules/ROOT/partials/misc/admon-accessibility-rule-i3-can-also-be-applied.adoc +++ b/modules/ROOT/partials/misc/admon-accessibility-rule-i3-can-also-be-applied.adoc @@ -1 +1,4 @@ -NOTE: In {productname} 6.3 and later, rule xref:I3[I3] can also be applied. If applied, an _Image alternative text should be less than 100 characters_ warning dialog presents if the alternative (`+alt+`) text is longer than 100 characters. This dialog also presents the alternative text in an editable field, for immediate repair. +[NOTE] +==== +In {productname} 6.3 and later, rule xref:I3[I3] can also be applied. If applied, an _Image alternative text should be less than 100 characters_ warning dialog presents if the alternative (`+alt+`) text is longer than 100 characters. This dialog also presents the alternative text in an editable field, for immediate repair. +==== \ No newline at end of file diff --git a/modules/ROOT/partials/misc/admon-requires-7.6v.adoc b/modules/ROOT/partials/misc/admon-requires-7.6v.adoc new file mode 100644 index 0000000000..4983434a45 --- /dev/null +++ b/modules/ROOT/partials/misc/admon-requires-7.6v.adoc @@ -0,0 +1 @@ +NOTE: This feature is only available for {productname} 7.6.0 and later. diff --git a/modules/ROOT/partials/misc/premium-plugin-list.adoc b/modules/ROOT/partials/misc/premium-plugin-list.adoc index f3219df51d..f93f16cf84 100644 --- a/modules/ROOT/partials/misc/premium-plugin-list.adoc +++ b/modules/ROOT/partials/misc/premium-plugin-list.adoc @@ -13,6 +13,7 @@ * xref:importword.adoc[Import from Word] * xref:inline-css.adoc[Inline CSS] * xref:editimage.adoc[Image Editing] +* xref:uploadcare.adoc[Image Optimizer Powered by Uploadcare] * xref:linkchecker.adoc[Link Checker] * xref:math.adoc[Math] * xref:markdown.adoc[Markdown] diff --git a/modules/ROOT/partials/misc/supported-versions.adoc b/modules/ROOT/partials/misc/supported-versions.adoc index ed0795b63e..f8bb653f21 100644 --- a/modules/ROOT/partials/misc/supported-versions.adoc +++ b/modules/ROOT/partials/misc/supported-versions.adoc @@ -6,6 +6,7 @@ Supported versions of {productname}: [cols="^,^,^",options="header"] |=== |Version |Release Date |End of Premium Support +|7.6 |2025-12-04 |2027-06-04 |7.5 |2025-11-06 |2027-05-06 |7.4 |2024-10-09 |2026-04-09 |7.3 |2024-08-07 |2026-02-07 diff --git a/modules/ROOT/partials/plugin-apis/comments-apis.adoc b/modules/ROOT/partials/plugin-apis/comments-apis.adoc index 4fd0149b01..211e696f9f 100644 --- a/modules/ROOT/partials/plugin-apis/comments-apis.adoc +++ b/modules/ROOT/partials/plugin-apis/comments-apis.adoc @@ -63,6 +63,10 @@ The `getEventLog` returns a log that contains information and timestamps of all "conversationContent": "new comment (Edit comment)", "conversationCreatedAt": "2024-10-01T03:07:53.771Z", "commentContent": "reply to existing comment", + "commentAuthor": { + "author": "DEMO USER", + "authorName": "DEMO USER" + }, "conversationAuthor": { "author": "DEMO USER", "authorName": "DEMO USER" diff --git a/modules/ROOT/partials/toolbar-button-ids/uploadcare-toolbar-buttons.adoc b/modules/ROOT/partials/toolbar-button-ids/uploadcare-toolbar-buttons.adoc new file mode 100644 index 0000000000..27b724ae32 --- /dev/null +++ b/modules/ROOT/partials/toolbar-button-ids/uploadcare-toolbar-buttons.adoc @@ -0,0 +1,5 @@ +[cols="1,3",options="header"] +|=== +|Identifier |Description +| `+uploadcare+` | Inserts an image placeholder element. This placeholder supports image uploads via drag-and-drop, file selection, or by providing a URL. +|=== \ No newline at end of file From eb7f5930b2ad267b72849d20b2828c817100b867 Mon Sep 17 00:00:00 2001 From: Karl Kemister-Sheppard Date: Wed, 11 Dec 2024 15:13:49 +1000 Subject: [PATCH 89/97] DOC-2591: Improve documentation for `importword`, `exportpdf` and `exportword` for Cloud. (#3535) * DOC-2591: Improve documentation for importword, exportpdf and exportword to support Cloud. * Update modules/ROOT/pages/exportpdf.adoc Co-authored-by: Farzad Hayat * Update modules/ROOT/pages/exportword.adoc Co-authored-by: Farzad Hayat * Update modules/ROOT/pages/importword.adoc Co-authored-by: Farzad Hayat * DOC-2591: Update exportpdf_converter_options value. * DOC-2591: File name changes for importword. * DOC-2591: remove second forward slash from pricing admin urls. --------- Co-authored-by: Farzad Hayat --- modules/ROOT/pages/exportpdf.adoc | 40 +++++- modules/ROOT/pages/exportword.adoc | 40 +++++- modules/ROOT/pages/importword.adoc | 40 +++++- .../partials/configuration/exportpdf.adoc | 97 ------------- .../exportpdf_converter_options.adoc | 42 ++++++ .../exportpdf_converter_style.adoc | 29 ++++ .../configuration/exportpdf_service_url.adoc | 23 ++++ .../exportpdf_token_provider.adoc | 31 +++++ .../partials/configuration/exportword.adoc | 130 ------------------ .../exportword_converter_options.adoc | 68 +++++++++ .../exportword_converter_style.adoc | 33 +++++ .../configuration/exportword_service_url.adoc | 23 ++++ .../exportword_token_provider.adoc | 32 +++++ .../configuration/importword-service-url.adoc | 28 ---- ...adoc => importword_converter_options.adoc} | 1 + .../configuration/importword_service_url.adoc | 29 ++++ .../importword_token_provider.adoc | 31 +++++ .../admon-export-pdf-paid-addon-pricing.adoc | 2 +- .../admon-export-word-paid-addon-pricing.adoc | 2 +- .../admon-import-word-paid-addon-pricing.adoc | 2 +- 20 files changed, 449 insertions(+), 274 deletions(-) delete mode 100644 modules/ROOT/partials/configuration/exportpdf.adoc create mode 100644 modules/ROOT/partials/configuration/exportpdf_converter_options.adoc create mode 100644 modules/ROOT/partials/configuration/exportpdf_converter_style.adoc create mode 100644 modules/ROOT/partials/configuration/exportpdf_service_url.adoc create mode 100644 modules/ROOT/partials/configuration/exportpdf_token_provider.adoc delete mode 100644 modules/ROOT/partials/configuration/exportword.adoc create mode 100644 modules/ROOT/partials/configuration/exportword_converter_options.adoc create mode 100644 modules/ROOT/partials/configuration/exportword_converter_style.adoc create mode 100644 modules/ROOT/partials/configuration/exportword_service_url.adoc create mode 100644 modules/ROOT/partials/configuration/exportword_token_provider.adoc delete mode 100644 modules/ROOT/partials/configuration/importword-service-url.adoc rename modules/ROOT/partials/configuration/{importword-converter-options.adoc => importword_converter_options.adoc} (92%) create mode 100644 modules/ROOT/partials/configuration/importword_service_url.adoc create mode 100644 modules/ROOT/partials/configuration/importword_token_provider.adoc diff --git a/modules/ROOT/pages/exportpdf.adoc b/modules/ROOT/pages/exportpdf.adoc index 58dd13465b..877faa52bf 100644 --- a/modules/ROOT/pages/exportpdf.adoc +++ b/modules/ROOT/pages/exportpdf.adoc @@ -1,4 +1,4 @@ -= Export to PDF plugin += {pluginname} plugin :navtitle: Export to PDF :description: The Export to PDF feature provides the ability to generate a PDF file directly from the editor. :description_short: Generate a PDF file directly from the editor. @@ -18,7 +18,7 @@ The {pluginname} feature collects the HTML generated with the `tinymce.editor.ge liveDemo::exportpdf[] -== Basic setup +== Basic setup using the {companyname} Cloud service To add the {pluginname} plugin to the editor, add `{plugincode}` to the `plugins` option in the editor configuration. @@ -30,15 +30,47 @@ tinymce.init({ selector: 'textarea', plugins: 'exportpdf', toolbar: 'exportpdf', - exportpdf_service_url: '' }); ---- +[IMPORTANT] +When using the {pluginname} plugin with the {companyname} Cloud service, JWT authentication is required to use the service. For more information on how to set up JWT authentication with {pluginname}, see examples: + +* xref:export-to-pdf-with-jwt-authentication-nodejs.adoc[Export to PDF with JWT authentication (Nodejs)]. +* xref:export-to-pdf-with-jwt-authentication-php.adoc[Export to PDF with JWT authentication (PHP)]. + +== Basic setup using the self-hosted service + +To use the self-hosted version of the {pluginname} plugin, you need to set the `exportpdf_service_url` option to the URL of the service. + +For example: + +[source,js] +---- +tinymce.init({ + selector: 'textarea', + plugins: 'exportpdf', + toolbar: 'exportpdf', + exportpdf_service_url: 'http://localhost:8080/' // Update with the URL of the service you are using such as 'http://myserver.com/' +}); +---- + +[IMPORTANT] +==== +The `exportpdf_service_url` option automatically appends `/v1/convert` to the URL provided, so only the base URL is required. For example, if the service is hosted at `http://localhost:8080/v1/convert`, the `exportpdf_service_url` option should be set to `http://localhost:8080/`. When using in production, ensure that `exportpdf_service_url` is updated to the production URL such as `https://myserver.com/`. +==== + == Options The following configuration options affect the behavior of the {pluginname} plugin. -include::partial$configuration/{plugincode}.adoc[leveloffset=+1] +include::partial$configuration/exportpdf_service_url.adoc[leveloffset=+1] + +include::partial$configuration/exportpdf_token_provider.adoc[leveloffset=+1] + +include::partial$configuration/exportpdf_converter_options.adoc[leveloffset=+1] + +include::partial$configuration/exportpdf_converter_style.adoc[leveloffset=+1] include::partial$misc/plugin-toolbar-button-id-boilerplate.adoc[] diff --git a/modules/ROOT/pages/exportword.adoc b/modules/ROOT/pages/exportword.adoc index 75ca949df7..5e838c78ae 100644 --- a/modules/ROOT/pages/exportword.adoc +++ b/modules/ROOT/pages/exportword.adoc @@ -1,4 +1,4 @@ -= Export to Word += {pluginname} plugin :navtitle: exportword :description: The export to Word feature lets you generate a .docx file directly from the editor. :description_short: Generate a .docx file directly from the editor. @@ -24,7 +24,7 @@ liveDemo::exportword[] * xref:introduction-to-mediaembed.adoc[Enhanced Media Embed] will not be included in the exported document, resulting in a console.error _"The Export to Word plugin requires the `exportword_service_url` to be configured"_. ==== -== Basic setup +== Basic setup using the {companyname} Cloud service To add the {pluginname} plugin to the editor, add `{plugincode}` to the `plugins` option in the editor configuration. @@ -36,24 +36,52 @@ tinymce.init({ selector: 'textarea', plugins: 'exportword', toolbar: 'exportword', - exportword_service_url: 'http://localhost:8080/' // update to your own self-hosted service URL }); ---- [IMPORTANT] -The `exportword_service_url` option automatically appends `/v2/convert/html-docx` to the URL provided, so only the base URL is required. For example, if the service is hosted at `http://localhost:8080/v2/convert/html-docx`, the `exportword_service_url` option should be set to `http://localhost:8080/`. +When using the {pluginname} plugin with the {companyname} Cloud service, JWT authentication is required to use the service. For more information on how to set up JWT authentication with {pluginname}, see examples: + +* xref:export-to-word-with-jwt-authentication-nodejs.adoc[Export to Word with JWT authentication]. +* xref:export-to-word-with-jwt-authentication-php.adoc[Export to Word with JWT authentication]. + +== Basic setup using the self-hosted service + +To use the self-hosted version of the {pluginname} plugin, you need to set the `exportword_service_url` option to the URL of the service. + +For example: +[source,js] +---- +tinymce.init({ + selector: 'textarea', + plugins: 'exportword', + toolbar: 'exportword', + exportword_service_url: 'http://localhost:8080/' // Update with the URL of the service you are using such as 'http://myserver.com/' +}); +---- + +[IMPORTANT] +==== +The `exportword_service_url` option automatically appends `/v2/convert/html-docx` to the URL provided, so only the base URL is required. For example, if the service is hosted at `http://localhost:8080/v2/convert/html-docx`, the `exportword_service_url` option should be set to `http://localhost:8080/`. When using in production, ensure that `exportword_service_url` is updated to the production URL such as `https://myserver.com/`. +==== == Options The following configuration options affect the behavior of the {pluginname} plugin. -include::partial$configuration/{plugincode}.adoc[leveloffset=+1] +include::partial$configuration/exportword_service_url.adoc[leveloffset=+1] + +include::partial$configuration/exportword_token_provider.adoc[leveloffset=+1] + +include::partial$configuration/exportword_converter_options.adoc[leveloffset=+1] + +include::partial$configuration/exportword_converter_style.adoc[leveloffset=+1] == Commands The {pluginname} plugin provides the following {productname} commands. -include::partial$commands/{plugincode}-cmds.adoc[][leveloffset=+1] +include::partial$commands/exportword-cmds.adoc[][leveloffset=+1] == API Reference diff --git a/modules/ROOT/pages/importword.adoc b/modules/ROOT/pages/importword.adoc index ff121c5631..2161f65a97 100644 --- a/modules/ROOT/pages/importword.adoc +++ b/modules/ROOT/pages/importword.adoc @@ -1,5 +1,5 @@ -= Import from Word plugin += {pluginname} plugin :navtitle: Import from Word :description: Provides a way to import .docx (Word documents) or .dotx (Word templates) files into the editor. :description_short: Import .docx or .dotx files into the editor. @@ -19,7 +19,7 @@ The {pluginname} plugin lets you import `.docx` (Word document) or `.dotx` (Word liveDemo::importword[] -== Basic setup +== Basic setup using the {companyname} Cloud service To add the {pluginname} plugin to the editor, add `{plugincode}` to the `plugins` option in the editor configuration. @@ -31,17 +31,45 @@ tinymce.init({ selector: 'textarea', plugins: 'importword', toolbar: 'importword', - importword_service_url: '' }); ---- +[IMPORTANT] +When using the {pluginname} plugin with the {companyname} Cloud service, JWT authentication is required to use the service. For more information on how to set up JWT authentication with {pluginname}, see examples: + +* xref:import-to-word-with-jwt-authentication-nodejs.adoc[Import to Word with JWT authentication]. +* xref:import-to-word-with-jwt-authentication-php.adoc[Import to Word with JWT authentication]. + +== Basic setup using the self-hosted service + +To use the self-hosted version of the {pluginname} plugin, you need to set the `importword_service_url` option to the URL of the service. + +For example: + +[source,js] +---- +tinymce.init({ + selector: 'textarea', + plugins: 'importword', + toolbar: 'importword', + importword_service_url: 'http://localhost:8080/' // Update with the URL of the service you are using such as 'http://myserver.com/' +}); +---- + +[IMPORTANT] +==== +The `importword_service_url` option automatically appends `/v2/convert/docx-html` to the URL provided, so only the base URL is required. For example, if the service is hosted at `http://localhost:8080/v2/convert/docx-html`, the `importword_service_url` option should be set to `http://localhost:8080/`. When using in production, ensure that the `importword_service_url` is updated to the production URL such as `https://myserver.com/`. +==== + == Options The following configuration options affect the behavior of the {pluginname} plugin. -include::partial$configuration/{plugincode}-service-url.adoc[leveloffset=+1] +include::partial$configuration/importword_service_url.adoc[leveloffset=+1] + +include::partial$configuration/importword_token_provider.adoc[leveloffset=+1] -include::partial$configuration/{plugincode}-converter-options.adoc[leveloffset=+1] +include::partial$configuration/importword_converter_options.adoc[leveloffset=+1] include::partial$misc/plugin-toolbar-button-id-boilerplate.adoc[] @@ -51,7 +79,7 @@ include::partial$misc/plugin-menu-item-id-boilerplate.adoc[] The {pluginname} plugin provides the following {productname} commands. -include::partial$commands/{plugincode}-cmds.adoc[] +include::partial$commands/importword-cmds.adoc[] == API Reference diff --git a/modules/ROOT/partials/configuration/exportpdf.adoc b/modules/ROOT/partials/configuration/exportpdf.adoc deleted file mode 100644 index e865bf245b..0000000000 --- a/modules/ROOT/partials/configuration/exportpdf.adoc +++ /dev/null @@ -1,97 +0,0 @@ -[[exportpdf-service-url]] -== `exportpdf_service_url` - -The {pluginname} uses the HTML to PDF converter service to generate the `document-name.pdf` files. - -The {pluginname} feature is currently only available exclusively for `on-premise` setups, requiring a self-hosted HTML to PDF converter service and the `exportpdf_service_url` option to be properly configured. If you require access to this feature, please link:https://www.tiny.cloud/contact/[contact us]. Refer to our xref:individual-export-to-pdf-on-premises.adoc[on-premises documentation] for detailed instructions on deploying the {pluginname} service server-side component using Docker. - - -[TIP] -Configure the `exportpdf_service_url` setting in your {productname} instance to match your custom host. For example, if your host is `mycustomhost.com`, set the URL to `https://mycustomhost.com/`. - -*Type:* `+String+` - -=== Example: using `exportpdf_service_url` - -[source,js] ----- -tinymce.init({ - selector: 'textarea', - plugins: 'exportpdf', - toolbar: 'exportpdf', - exportpdf_service_url: '' -}); ----- - -[[exportpdf-converter-options]] -== `exportpdf_converter_options` - -This option allows the editor to download a PDF document containing its content, along with the specified options defined in the `exportpdf_converter_options`. - -**Type:** `+Object+` - -[NOTE] -As of {productname} 7.5.0, the `exportpdf_converter_options` setting now comes with a default value set to the following: - -.**Default value:** -[source,js] ----- -exportpdf_converter_options: { - format: 'Letter', - margin_top: '1in', - margin_right: '1in', - margin_bottom: '1in', - margin_left: '1in' -} ----- - -=== Example: using `exportpdf_converter_options` - -[source,js] ----- -tinymce.init({ - selector: 'textarea', - plugins: 'exportpdf', - toolbar: 'exportpdf', - exportpdf_service_url: '', - exportpdf_converter_options: { - header_html: '

    HEADER

    ', // example - header_and_footer_css: 'p { color: blue }', // example - }, -}) ----- - -[NOTE] -The `exportpdf_service_url` option must be configured for the {pluginname} plugin to work. - -> For comprehensive details regarding the `exportpdf_converter_options`, please refer to the https://exportpdf.converter.tiny.cloud/docs[API documentation^] available for the {pluginname} Premium plugin. - -[[exportpdf-converter-style]] -== `exportpdf_converter_style` - -The `exportpdf_converter_style` option allow for customization of the styles applied to the exported PDF document, providing flexibility in controlling its appearance. - -*Type:* `+String+` - -*Default value:* `''` - -=== Example: using `exportpdf_converter_style` - -[source,js] ----- -tinymce.init({ - selector: 'textarea.tinymce', - plugins: 'exportpdf', - toolbar: 'exportpdf', - exportpdf_service_url: '', // required - exportpdf_converter_options: { // required to support "exportpdf_converter_style" - header: [ - { - html: '

    First page header.

    ', //example - css: 'h1 { font-size: 30px; }', //example - } - ], - }, - exportpdf_converter_style: 'p { color: cyan !important }' // requires both "exportpdf_converter_style" and "exportpdf_service_url" to be set. -}); ----- \ No newline at end of file diff --git a/modules/ROOT/partials/configuration/exportpdf_converter_options.adoc b/modules/ROOT/partials/configuration/exportpdf_converter_options.adoc new file mode 100644 index 0000000000..2bc109177d --- /dev/null +++ b/modules/ROOT/partials/configuration/exportpdf_converter_options.adoc @@ -0,0 +1,42 @@ +[[exportpdf-converter-options]] +== `exportpdf_converter_options` + +This option allows the editor to download a PDF document containing its content, along with the specified options defined in the `exportpdf_converter_options`. + +**Type:** `+Object+` + +[NOTE] +As of {productname} 7.5.0, the `exportpdf_converter_options` setting now comes with a default value set to the following: + +.**Default value:** +[source,js] +---- +{ + format: 'Letter', + margin_top: '1in', + margin_right: '1in', + margin_bottom: '1in', + margin_left: '1in' +} +---- + +=== Example: using `exportpdf_converter_options` + +[source,js] +---- +tinymce.init({ + selector: 'textarea', + plugins: 'exportpdf', + toolbar: 'exportpdf', + exportpdf_service_url: '', // required if using On-premises service + exportpdf_converter_options: { + header_html: '

    HEADER

    ', // example + header_and_footer_css: 'p { color: blue }', // example + }, +}) +---- + +[NOTE] +The `exportpdf_service_url` option must be configured for the {pluginname} plugin to work. + +> For comprehensive details regarding the `exportpdf_converter_options`, please refer to the https://exportpdf.converter.tiny.cloud/docs[API documentation^] available for the {pluginname} Premium plugin. \ No newline at end of file diff --git a/modules/ROOT/partials/configuration/exportpdf_converter_style.adoc b/modules/ROOT/partials/configuration/exportpdf_converter_style.adoc new file mode 100644 index 0000000000..c71f611982 --- /dev/null +++ b/modules/ROOT/partials/configuration/exportpdf_converter_style.adoc @@ -0,0 +1,29 @@ +[[exportpdf-converter-style]] +== `exportpdf_converter_style` + +The `exportpdf_converter_style` option allow for customization of the styles applied to the exported PDF document, providing flexibility in controlling its appearance. + +*Type:* `+String+` + +*Default value:* `''` + +=== Example: using `exportpdf_converter_style` + +[source,js] +---- +tinymce.init({ + selector: 'textarea.tinymce', + plugins: 'exportpdf', + toolbar: 'exportpdf', + exportpdf_service_url: '', // required if using On-premises service + exportpdf_converter_options: { // required to support "exportpdf_converter_style" + header: [ + { + html: '

    First page header.

    ', //example + css: 'h1 { font-size: 30px; }', //example + } + ], + }, + exportpdf_converter_style: 'p { color: cyan !important }' // requires both "exportpdf_converter_style" and "exportpdf_service_url" to be set. +}); +---- \ No newline at end of file diff --git a/modules/ROOT/partials/configuration/exportpdf_service_url.adoc b/modules/ROOT/partials/configuration/exportpdf_service_url.adoc new file mode 100644 index 0000000000..1348e22c2b --- /dev/null +++ b/modules/ROOT/partials/configuration/exportpdf_service_url.adoc @@ -0,0 +1,23 @@ +[[exportpdf-service-url]] +== `exportpdf_service_url` + +The {pluginname} plugin uses an HTML-to-PDF converter service to generate `document-name.pdf` files. + +This option is **required** when configuring the {pluginname} plugin for `on-premise` setups. If you require access to this feature, please link:https://www.tiny.cloud/contact/[contact us]. For detailed instructions on deploying the {pluginname} service server-side component using Docker, refer to the xref:individual-export-to-pdf-on-premises.adoc[on-premises documentation]. + +[TIP] +When using a custom host, set the `exportpdf_service_url` option in your {productname} configuration to match your host. For example, if your custom host is `mycustomhost.com`, set the URL to `https://mycustomhost.com/`. + +*Type:* `+String+` + +=== Example: Setting up `exportpdf_service_url` + +[source,js] +---- +tinymce.init({ + selector: 'textarea', + plugins: 'exportpdf', + toolbar: 'exportpdf', + exportpdf_service_url: '' // required for On-premise setups only +}); +---- diff --git a/modules/ROOT/partials/configuration/exportpdf_token_provider.adoc b/modules/ROOT/partials/configuration/exportpdf_token_provider.adoc new file mode 100644 index 0000000000..3726ffa895 --- /dev/null +++ b/modules/ROOT/partials/configuration/exportpdf_token_provider.adoc @@ -0,0 +1,31 @@ +[[exportpdf-token-provider]] +== `exportpdf_token_provider` + +The `exportpdf_token_provider` option enables integration with a token-based authentication service for exporting PDF documents. It provides a mechanism to fetch an authentication token from a specified endpoint. This ensures that the export process can securely communicate with the server. + +*Type:* `+Function+` + +*Default value:* `undefined` + +=== Example: using `exportpdf_token_provider` + +[source,js] +---- +tinymce.init({ + selector: 'textarea', + plugins: 'exportpdf', + toolbar: 'exportpdf', + exportpdf_token_provider: () => { + return fetch('http://localhost:3000/jwt', { // specify your token endpoint + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + }).then(response => response.json()); + }, +}); +---- + +[NOTE] +The `exportpdf_token_provider` option is required when using the {companyname} Cloud service. For more information on how to set up JWT authentication with {pluginname}, see examples: + +* xref:export-to-pdf-with-jwt-authentication-nodejs.adoc[Export to PDF with JWT authentication (Nodejs)]. +* xref:export-to-pdf-with-jwt-authentication-php.adoc[Export to PDF with JWT authentication (PHP)]. \ No newline at end of file diff --git a/modules/ROOT/partials/configuration/exportword.adoc b/modules/ROOT/partials/configuration/exportword.adoc deleted file mode 100644 index 28c1c679b8..0000000000 --- a/modules/ROOT/partials/configuration/exportword.adoc +++ /dev/null @@ -1,130 +0,0 @@ -[[exportword-service-url]] -== `exportword_service_url` - -The {pluginname} uses the HTML to DOCX converter service to generate the Word files. - - -The {pluginname} feature is currently only available exclusively for `on-premise` setups, requiring a self-hosted HTML to DOCX converter service and the `exportword_service_url` option to be properly configured. If you require access to this feature, please link:https://www.tiny.cloud/contact/[contact us]. Refer to our xref:individual-import-from-word-and-export-to-word-on-premises.adoc[on-premises documentation] for detailed instructions on deploying the {pluginname} service server-side component using Docker. - -NOTE: The {pluginname} feature is currently only available `on-premise` and requires the `exportword_service_url` option to be configured. link:https://www.tiny.cloud/contact/[Contact us] if you require this feature. - -[TIP] -Configure the `exportword_service_url` setting in your {productname} instance to match your custom host. For example, if your host is `mycustomhost.com`, set the URL to `https://mycustomhost.com/`. - - -*Type:* `+String+` - -=== Example: using `exportword_service_url` - -[source,js] ----- -tinymce.init({ - selector: 'textarea', - plugins: 'exportword', - toolbar: 'exportword', - exportword_service_url: '' -}); ----- - -[[exportword-converter-options]] -== `exportword_converter_options` - -The `exportword_converter_options` option, is used to specify and configure various options related to the process of converting and exporting content from the editor to `.docx` Word file. - -**Type:** `+Object+` - -[NOTE] -As of {productname} 7.5.0, the default value of the `exportword_converter_options` setting has been updated to the following: - -.**Default value:** -[source,js] ----- -exportword_converter_options: { - document: { - size: 'letter' - } -} ----- - -=== Example: using `exportword_converter_options` - -[source,js] ----- -tinymce.init({ - selector: 'textarea', - plugins: 'exportword', - toolbar: 'exportword', - exportword_service_url: '', - exportword_converter_options: { - headers: { - first: { - html: "

    My document header

    ", - css: "p { color: gray; }" - }, - default: { - html: "

    My default header

    ", - css: "p { color: blue; }" - } - }, - footers: { - odd: { - html: "

    My odd footer

    ", - css: "p { font-size: 10px; }" - }, - even: { - html: "

    My even footer

    ", - css: "p { font-size: 12px; }" - } - }, - document: { - orientation: "landscape", - size: "a3", - margins: { - top: "10mm", - bottom: "10mm", - left: "20mm", - right: "15mm" - } - }, - }, -}); ----- - -[NOTE] -To use this option, the Export to Word plugin requires the `exportword_service_url` option to be configured. - -> For comprehensive details regarding the `exportword_converter_options`, please refer to the link:https://exportdocx.converter.tiny.cloud/v2/convert/docs#section/Export-to-Word[API documentation^] available for the {pluginname} Premium plugin. - -[[exportword-converter-style]] -== `exportword_converter_style` - -The `exportword_converter_style` option allows for customization of the styles applied to the exported Word document, providing flexibility in controlling its appearance; however, this option does **not affect** the distinct styling of the `header` and `footer`. - -*Type:* `+String+` - -*Default value:* `''` - -=== Example: using `exportword_converter_style` - -[source,js] ----- -tinymce.init({ - selector: 'textarea.tinymce', - plugins: 'exportword', - toolbar: 'exportword', - exportword_service_url: '', // required - exportword_converter_options: { - headers: { - first: { - html: "

    My document header

    ", - css: "p { color: gray; }" - }, - default: { - html: "

    My default header

    ", - css: "p { color: blue; }" - } - }, - }, - exportword_converter_style: 'p { color: cyan !important }' // will override the set

    tag styles in the HTML content -}); ----- \ No newline at end of file diff --git a/modules/ROOT/partials/configuration/exportword_converter_options.adoc b/modules/ROOT/partials/configuration/exportword_converter_options.adoc new file mode 100644 index 0000000000..54233db596 --- /dev/null +++ b/modules/ROOT/partials/configuration/exportword_converter_options.adoc @@ -0,0 +1,68 @@ +[[exportword-converter-options]] +== `exportword_converter_options` + +The `exportword_converter_options` option, is used to specify and configure various options related to the process of converting and exporting content from the editor to `.docx` Word file. + +**Type:** `+Object+` + +[NOTE] +As of {productname} 7.5.0, the default value of the `exportword_converter_options` setting has been updated to the following: + +.**Default value:** +[source,js] +---- +exportword_converter_options: { + document: { + size: 'letter' + } +} +---- + +=== Example: using `exportword_converter_options` + +[source,js] +---- +tinymce.init({ + selector: 'textarea', + plugins: 'exportword', + toolbar: 'exportword', + exportword_service_url: '', // required if using On-premises service + exportword_converter_options: { + headers: { + first: { + html: "

    My document header

    ", + css: "p { color: gray; }" + }, + default: { + html: "

    My default header

    ", + css: "p { color: blue; }" + } + }, + footers: { + odd: { + html: "

    My odd footer

    ", + css: "p { font-size: 10px; }" + }, + even: { + html: "

    My even footer

    ", + css: "p { font-size: 12px; }" + } + }, + document: { + orientation: "landscape", + size: "a3", + margins: { + top: "10mm", + bottom: "10mm", + left: "20mm", + right: "15mm" + } + }, + }, +}); +---- + +[NOTE] +To use this option, the Export to Word plugin requires the `exportword_service_url` option to be configured. + +> For comprehensive details regarding the `exportword_converter_options`, please refer to the link:https://exportdocx.converter.tiny.cloud/v2/convert/docs#section/Export-to-Word[API documentation^] available for the {pluginname} Premium plugin. diff --git a/modules/ROOT/partials/configuration/exportword_converter_style.adoc b/modules/ROOT/partials/configuration/exportword_converter_style.adoc new file mode 100644 index 0000000000..adde763c35 --- /dev/null +++ b/modules/ROOT/partials/configuration/exportword_converter_style.adoc @@ -0,0 +1,33 @@ +[[exportword-converter-style]] +== `exportword_converter_style` + +The `exportword_converter_style` option allows for customization of the styles applied to the exported Word document, providing flexibility in controlling its appearance; however, this option does **not affect** the distinct styling of the `header` and `footer`. + +*Type:* `+String+` + +*Default value:* `''` + +=== Example: using `exportword_converter_style` + +[source,js] +---- +tinymce.init({ + selector: 'textarea.tinymce', + plugins: 'exportword', + toolbar: 'exportword', + exportword_service_url: '', // required if using On-premises service + exportword_converter_options: { + headers: { + first: { + html: "

    My document header

    ", + css: "p { color: gray; }" + }, + default: { + html: "

    My default header

    ", + css: "p { color: blue; }" + } + }, + }, + exportword_converter_style: 'p { color: cyan !important }' // will override the set

    tag styles in the HTML content +}); +---- \ No newline at end of file diff --git a/modules/ROOT/partials/configuration/exportword_service_url.adoc b/modules/ROOT/partials/configuration/exportword_service_url.adoc new file mode 100644 index 0000000000..3e78553598 --- /dev/null +++ b/modules/ROOT/partials/configuration/exportword_service_url.adoc @@ -0,0 +1,23 @@ +[[exportword-service-url]] +== `exportword_service_url` + +The {pluginname} plugin uses an HTML-to-DOCX converter service to generate Word files. + +This option is **required** when configuring the {pluginname} plugin for `on-premise` setups. If you require access to this feature, please link:https://www.tiny.cloud/contact/[contact us]. For detailed instructions on deploying the {pluginname} service server-side component using Docker, refer to the xref:individual-import-from-word-and-export-to-word-on-premises.adoc[on-premises documentation]. + +[TIP] +When using a custom host, set the `exportword_service_url` option in your {productname} configuration to match your host. For example, if your custom host is `mycustomhost.com`, set the URL to `https://mycustomhost.com/`. + +*Type:* `+String+` + +=== Example: Setting up `exportword_service_url` + +[source,js] +---- +tinymce.init({ + selector: 'textarea', + plugins: 'exportword', + toolbar: 'exportword', + exportword_service_url: '' // required for On-premise setups only +}); +---- \ No newline at end of file diff --git a/modules/ROOT/partials/configuration/exportword_token_provider.adoc b/modules/ROOT/partials/configuration/exportword_token_provider.adoc new file mode 100644 index 0000000000..1cc8bd2698 --- /dev/null +++ b/modules/ROOT/partials/configuration/exportword_token_provider.adoc @@ -0,0 +1,32 @@ +[[exportword-token-provider]] +== `exportword_token_provider` + +The `exportword_token_provider` option enables integration with a token-based authentication service for exporting Word documents. It provides a mechanism to fetch an authentication token from a specified endpoint. This ensures that the export process can securely communicate with the server. + +*Type:* `+Function+` + +*Default value:* `undefined` + +=== Example: using `exportword_token_provider` + +[source,js] +---- +tinymce.init({ + selector: 'textarea', + plugins: 'exportword', + toolbar: 'exportword', + exportword_token_provider: () => { + return fetch('http://localhost:3000/jwt', { // specify your token endpoint + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + }).then(response => response.json()); + }, +}); +---- + + +[NOTE] +The `exportword_token_provider` option is required when using the {companyname} Cloud service. For more information on how to set up JWT authentication with {pluginname}, see examples: + +* xref:export-to-word-with-jwt-authentication-nodejs.adoc[Export to Word with JWT authentication]. +* xref:export-to-word-with-jwt-authentication-php.adoc[Export to Word with JWT authentication]. \ No newline at end of file diff --git a/modules/ROOT/partials/configuration/importword-service-url.adoc b/modules/ROOT/partials/configuration/importword-service-url.adoc deleted file mode 100644 index 95fab694bb..0000000000 --- a/modules/ROOT/partials/configuration/importword-service-url.adoc +++ /dev/null @@ -1,28 +0,0 @@ -[[importword-service-url]] -== `importword_service_url` - -This option is used for setting the URL endpoint for the DOCX to HTML conversion service. - -The {pluginname} feature is currently only available exclusively for `on-premise` setups, requiring a self-hosted version of the DOCX to HTML conversion service and the `importword_service_url` option to be properly configured. If you require access to this feature, please link:https://www.tiny.cloud/contact/[contact us]. Refer to our xref:individual-import-from-word-and-export-to-word-on-premises.adoc[on-premises documentation] for detailed instructions on deploying the {pluginname} service server-side component using Docker. - - -[TIP] -Configure the `importword_service_url` setting in your {productname} instance to match your custom host. For example, if your host is `mycustomhost.com`, set the URL to `https://mycustomhost.com/`. - -*Type:* `+String+` - -=== Example: using `importword_service_url` - -[source,js] ----- -tinymce.init({ - selector: 'textarea', - plugins: 'importword', - toolbar: 'importword', - importword_service_url: '' -}); ----- - -[IMPORTANT] -If this string value is **not configured** it will return a console.error: -_The {pluginname} plugin requires the `importword_service_url` to be configured_. If the editor detects an `invalid_URL`, it will return a console.error: _The value provided in `importword_service_url` is not a valid URL_. \ No newline at end of file diff --git a/modules/ROOT/partials/configuration/importword-converter-options.adoc b/modules/ROOT/partials/configuration/importword_converter_options.adoc similarity index 92% rename from modules/ROOT/partials/configuration/importword-converter-options.adoc rename to modules/ROOT/partials/configuration/importword_converter_options.adoc index b86454db56..c91576b76d 100644 --- a/modules/ROOT/partials/configuration/importword-converter-options.adoc +++ b/modules/ROOT/partials/configuration/importword_converter_options.adoc @@ -27,6 +27,7 @@ tinymce.init({ selector: 'textarea', plugins: 'importword', toolbar: 'importword', + importword_service_url: '', // required if using On-premises service importword_converter_options: { formatting: { resets: 'inline', diff --git a/modules/ROOT/partials/configuration/importword_service_url.adoc b/modules/ROOT/partials/configuration/importword_service_url.adoc new file mode 100644 index 0000000000..954ebb4cbb --- /dev/null +++ b/modules/ROOT/partials/configuration/importword_service_url.adoc @@ -0,0 +1,29 @@ +[[importword-service-url]] +== `importword_service_url` + +The `importword_service_url` option sets the URL endpoint for the DOCX-to-HTML conversion service. + +This option is **required** when configuring the {pluginname} plugin for `on-premise` setups. If you require access to this feature, please link:https://www.tiny.cloud/contact/[contact us]. For detailed instructions on deploying the {pluginname} service server-side component using Docker, refer to the xref:individual-import-from-word-and-export-to-word-on-premises.adoc[on-premises documentation]. + +[TIP] +When using a custom host, set the `importword_service_url` option in your {productname} configuration to match your host. For example, if your custom host is `mycustomhost.com`, set the URL to `https://mycustomhost.com/`. + +*Type:* `+String+` + +=== Example: Setting up `importword_service_url` + +[source,js] +---- +tinymce.init({ + selector: 'textarea', + plugins: 'importword', + toolbar: 'importword', + importword_service_url: '' // required for On-premise setups only +}); +---- + +[IMPORTANT] +==== +* If the `importword_service_url` option is **not configured**, a `console.error` will display: _The {pluginname} plugin requires the `importword_service_url` to be configured_. +* If the URL provided is invalid, a `console.error` will display: _The value provided in `importword_service_url` is not a valid URL_. +==== \ No newline at end of file diff --git a/modules/ROOT/partials/configuration/importword_token_provider.adoc b/modules/ROOT/partials/configuration/importword_token_provider.adoc new file mode 100644 index 0000000000..e31176c87e --- /dev/null +++ b/modules/ROOT/partials/configuration/importword_token_provider.adoc @@ -0,0 +1,31 @@ +[[importword-token-provider]] +== `importword_token_provider` + +The `importword_token_provider` option enables integration with a token-based authentication service for importing Word documents. It provides a mechanism to fetch an authentication token from a specified endpoint. This ensures that the import process can securely communicate with the server. + +*Type:* `+Function+` + +*Default value:* `undefined` + +=== Example: using `importword_token_provider` + +[source,js] +---- +tinymce.init({ + selector: 'textarea', + plugins: 'importword', + toolbar: 'importword', + importword_token_provider: () => { + return fetch('http://localhost:3000/jwt', { // specify your token endpoint + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + }).then(response => response.json()); + }, +}); +---- + +[NOTE] +The `importword_token_provider` option is required when using the {companyname} Cloud service. For more information on how to set up JWT authentication with {pluginname}, see examples: + +* xref:import-to-word-with-jwt-authentication-nodejs.adoc[Import to Word with JWT authentication (Nodejs)]. +* xref:import-to-word-with-jwt-authentication-php.adoc[Import to Word with JWT authentication (PHP)]. \ No newline at end of file diff --git a/modules/ROOT/partials/misc/admon-export-pdf-paid-addon-pricing.adoc b/modules/ROOT/partials/misc/admon-export-pdf-paid-addon-pricing.adoc index 3096351f6e..2511223aee 100644 --- a/modules/ROOT/partials/misc/admon-export-pdf-paid-addon-pricing.adoc +++ b/modules/ROOT/partials/misc/admon-export-pdf-paid-addon-pricing.adoc @@ -1 +1 @@ -NOTE: This plugin is only available as a link:{exportpdfpricingurl}/[paid add-on] to link:{pricingpage}/[a TinyMCE subscription]. \ No newline at end of file +NOTE: This plugin is only available as a link:{exportpdfpricingurl}/[paid add-on] to link:{pricingpage}[a TinyMCE subscription]. \ No newline at end of file diff --git a/modules/ROOT/partials/misc/admon-export-word-paid-addon-pricing.adoc b/modules/ROOT/partials/misc/admon-export-word-paid-addon-pricing.adoc index da83aab5ff..87c65c7fe2 100644 --- a/modules/ROOT/partials/misc/admon-export-word-paid-addon-pricing.adoc +++ b/modules/ROOT/partials/misc/admon-export-word-paid-addon-pricing.adoc @@ -1 +1 @@ -NOTE: This plugin is only available as a link:{exportwordpricingurl}/[paid add-on] to link:{pricingpage}/[a TinyMCE subscription]. \ No newline at end of file +NOTE: This plugin is only available as a link:{exportwordpricingurl}/[paid add-on] to link:{pricingpage}[a TinyMCE subscription]. \ No newline at end of file diff --git a/modules/ROOT/partials/misc/admon-import-word-paid-addon-pricing.adoc b/modules/ROOT/partials/misc/admon-import-word-paid-addon-pricing.adoc index 0965eef071..cc5e31f4fa 100644 --- a/modules/ROOT/partials/misc/admon-import-word-paid-addon-pricing.adoc +++ b/modules/ROOT/partials/misc/admon-import-word-paid-addon-pricing.adoc @@ -1 +1 @@ -NOTE: This plugin is only available as a link:{importwordpricingurl}/[paid add-on] to link:{pricingpage}/[a TinyMCE subscription]. \ No newline at end of file +NOTE: This plugin is only available as a link:{importwordpricingurl}/[paid add-on] to link:{pricingpage}[a TinyMCE subscription]. \ No newline at end of file From 01db1510e6d4109e9c65259f96116f323e10eb8f Mon Sep 17 00:00:00 2001 From: LewisAtTiny Date: Wed, 11 Dec 2024 15:14:11 +1000 Subject: [PATCH 90/97] DOC-2583 Add exportword, importword and exportpdf JWT authentication guides for (PHP). (#3519) * Documentation for the JWT Authentication in relation to Document Exporters and Importers * DOC-2582 Removed Service URL for ExportPDF * DOC-2583 Removed Service URL for Export to Word * DOC-2583 Removed Service URL for Import Word * DOC-2583 Created New Folder for PHP JWT Authentication * Update modules/ROOT/pages/export-to-pdf-with-jwt-authentication-with-PHP.adoc Co-authored-by: Karl Kemister-Sheppard * Update modules/ROOT/pages/import-word-with-jwt-authentication-with-PHP.adoc Co-authored-by: Karl Kemister-Sheppard * Update modules/ROOT/pages/export-to-word-with-jwt-authentication-with-PHP.adoc Co-authored-by: Karl Kemister-Sheppard * Update modules/ROOT/partials/auth/document-converters/php/intro-and-prerequisites.adoc Co-authored-by: Farzad Hayat * Update modules/ROOT/pages/import-word-with-jwt-authentication-with-PHP.adoc Co-authored-by: Karl Kemister-Sheppard * Rename export-to-word-with-jwt-authentication-with-PHP.adoc to export-to-word-with-jwt-authentication-with-php.adoc * DOC-2583 Rename export-to-pdf-with-jwt-authentication-with-PHP.adoc to export-to-pdf-with-jwt-authentication-with-php.adoc * DOC-2583 Rename import-word-with-jwt-authentication-with-PHP.adoc to import-word-with-jwt-authentication-with-php.adoc * DOC-2583 Update nav.adoc to match new page titles * Update modules/ROOT/pages/export-to-pdf-with-jwt-authentication-with-php.adoc Co-authored-by: Karl Kemister-Sheppard * Update modules/ROOT/pages/export-to-word-with-jwt-authentication-with-php.adoc Co-authored-by: Karl Kemister-Sheppard * Update modules/ROOT/pages/import-word-with-jwt-authentication-with-php.adoc Co-authored-by: Karl Kemister-Sheppard * Update modules/ROOT/partials/auth/document-converters/php/initial-project-setup.adoc Co-authored-by: Karl Kemister-Sheppard * Update modules/ROOT/partials/private-public-key-pairs-for-tiny-cloud-services.adoc Co-authored-by: Karl Kemister-Sheppard * Update modules/ROOT/partials/private-public-key-pairs-for-tiny-cloud-services.adoc Co-authored-by: Karl Kemister-Sheppard * Update modules/ROOT/partials/private-public-key-pairs-for-tiny-cloud-services.adoc Co-authored-by: Karl Kemister-Sheppard * Update modules/ROOT/pages/export-to-pdf-with-jwt-authentication-with-php.adoc Co-authored-by: Karl Kemister-Sheppard * Update modules/ROOT/pages/export-to-word-with-jwt-authentication-with-php.adoc Co-authored-by: Karl Kemister-Sheppard * Update modules/ROOT/pages/import-word-with-jwt-authentication-with-php.adoc Co-authored-by: Karl Kemister-Sheppard * Update modules/ROOT/partials/auth/document-converters/php/initial-project-setup.adoc Co-authored-by: Farzad Hayat * DOC-2583: Farzad/Lewis structural improvements * DOC-2583: Farzad/Lewis fix import/export docx nav structure * Update modules/ROOT/partials/auth/document-converters/php/initial-project-setup.adoc Co-authored-by: Karl Kemister-Sheppard --------- Co-authored-by: Lewis Hickson Co-authored-by: Karl Kemister-Sheppard Co-authored-by: Farzad Hayat --- modules/ROOT/nav.adoc | 6 ++ ...-pdf-with-jwt-authentication-with-php.adoc | 65 +++++++++++++++++++ ...word-with-jwt-authentication-with-php.adoc | 65 +++++++++++++++++++ ...word-with-jwt-authentication-with-php.adoc | 65 +++++++++++++++++++ .../jwt-setup-document-converters.adoc | 55 ++++++++++++++++ .../php/configuration-steps.adoc | 26 ++++++++ .../php/initial-project-setup.adoc | 53 +++++++++++++++ .../php/intro-and-prerequisites.adoc | 33 ++++++++++ .../php/server-setup-php.adoc | 49 ++++++++++++++ ...lic-key-pairs-for-tiny-cloud-services.adoc | 10 +++ 10 files changed, 427 insertions(+) create mode 100644 modules/ROOT/pages/export-to-pdf-with-jwt-authentication-with-php.adoc create mode 100644 modules/ROOT/pages/export-to-word-with-jwt-authentication-with-php.adoc create mode 100644 modules/ROOT/pages/import-word-with-jwt-authentication-with-php.adoc create mode 100644 modules/ROOT/partials/auth/document-converters/jwt-setup-document-converters.adoc create mode 100644 modules/ROOT/partials/auth/document-converters/php/configuration-steps.adoc create mode 100644 modules/ROOT/partials/auth/document-converters/php/initial-project-setup.adoc create mode 100644 modules/ROOT/partials/auth/document-converters/php/intro-and-prerequisites.adoc create mode 100644 modules/ROOT/partials/auth/document-converters/php/server-setup-php.adoc create mode 100644 modules/ROOT/partials/private-public-key-pairs-for-tiny-cloud-services.adoc diff --git a/modules/ROOT/nav.adoc b/modules/ROOT/nav.adoc index fb00b91c4c..4963c93210 100644 --- a/modules/ROOT/nav.adoc +++ b/modules/ROOT/nav.adoc @@ -313,12 +313,18 @@ *** xref:advtable.adoc[Enhanced Tables] *** xref:exportpdf.adoc[Export to PDF] **** xref:html-to-pdf-converter-api.adoc[HTML to PDF Converter API] +**** JWT Authentication +***** xref:export-to-pdf-with-jwt-authentication-with-php.adoc[Export to PDF with JWT authentication (PHP)] *** xref:exportword.adoc[Export to Word] **** xref:html-to-docx-converter-api.adoc[HTML to DOCX Converter API] +**** JWT Authentication +***** xref:export-to-word-with-jwt-authentication-with-php.adoc[Export to Word with JWT Authentication (PHP)] *** xref:footnotes.adoc[Footnotes] *** xref:formatpainter.adoc[Format Painter] *** xref:importword.adoc[Import from Word] **** xref:docx-to-html-converter-api.adoc[DOCX to HTML Converter API] +**** JWT Authentication +***** xref:import-word-with-jwt-authentication-with-php.adoc[Import From Word with JWT Authentication (PHP)] *** xref:editimage.adoc[Image Editing] *** xref:uploadcare.adoc[Image Optimizer Powered by Uploadcare] *** xref:inline-css.adoc[Inline CSS] diff --git a/modules/ROOT/pages/export-to-pdf-with-jwt-authentication-with-php.adoc b/modules/ROOT/pages/export-to-pdf-with-jwt-authentication-with-php.adoc new file mode 100644 index 0000000000..782042a134 --- /dev/null +++ b/modules/ROOT/pages/export-to-pdf-with-jwt-authentication-with-php.adoc @@ -0,0 +1,65 @@ += {pluginname} with JWT authentication (PHP) Guide +:navtitle: JWT Authentication setup for Export to PDF +:description: Guide on how to setup JWT Authentication for exporting PDF files with {productname} +:keywords: jwt, authentication, exportpdf, pdf, php +:pluginname: Export to PDF +:plugincode: exportpdf + +include::partial$auth/document-converters/php/intro-and-prerequisites.adoc[] + +include::partial$auth/document-converters/php/initial-project-setup.adoc[] + +== Setup + +=== Generate a Public/Private Key Pair + +include::partial$auth/document-converters/jwt-setup-document-converters.adoc[leveloffset=+2] + +include::partial$auth/document-converters/php/server-setup-php.adoc[] + +=== Web Page Setup (index.html) + +Inside the `public` folder where you created the `index.html` file add the HTML setup code: + +[source,html] +---- + + + + TinyMCE with PDF Export + + + + +

    TinyMCE Export to PDF Demo

    + + + +---- + +include::partial$auth/document-converters/php/configuration-steps.adoc[] diff --git a/modules/ROOT/pages/export-to-word-with-jwt-authentication-with-php.adoc b/modules/ROOT/pages/export-to-word-with-jwt-authentication-with-php.adoc new file mode 100644 index 0000000000..ccaa016435 --- /dev/null +++ b/modules/ROOT/pages/export-to-word-with-jwt-authentication-with-php.adoc @@ -0,0 +1,65 @@ += {pluginname} with JWT authentication (PHP) Guide +:navtitle: JWT Authentication setup for Export to Word +:description: Guide on how to setup JWT Authentication for exporting Word files with {productname} +:keywords: jwt, authentication, exportword, word, php +:pluginname: Export to Word +:plugincode: exportword + +include::partial$auth/document-converters/php/intro-and-prerequisites.adoc[] + +include::partial$auth/document-converters/php/initial-project-setup.adoc[] + +== Setup + +=== Generate a Public/Private Key Pair + +include::partial$auth/document-converters/jwt-setup-document-converters.adoc[leveloffset=+2] + +include::partial$auth/document-converters/php/server-setup-php.adoc[] + +=== Web Page Setup (index.html) + +Inside the `public` folder where you created the `index.html` file add the HTML setup code: + +[source,html] +---- + + + + TinyMCE with Word Export + + + + +

    TinyMCE Export to Word Demo

    + + + +---- + +include::partial$auth/document-converters/php/configuration-steps.adoc[] diff --git a/modules/ROOT/pages/import-word-with-jwt-authentication-with-php.adoc b/modules/ROOT/pages/import-word-with-jwt-authentication-with-php.adoc new file mode 100644 index 0000000000..d70c6e9567 --- /dev/null +++ b/modules/ROOT/pages/import-word-with-jwt-authentication-with-php.adoc @@ -0,0 +1,65 @@ += {pluginname} with JWT authentication (PHP) Guide +:navtitle: JWT Authentication setup for Import from Word +:description: Guide on how to setup JWT Authentication for importing Word files with {productname} +:keywords: jwt, authentication, importword, word, php +:pluginname: Import from Word +:plugincode: importword + +include::partial$auth/document-converters/php/intro-and-prerequisites.adoc[] + +include::partial$auth/document-converters/php/initial-project-setup.adoc[] + +== Setup + +=== Generate a Public/Private Key Pair + +include::partial$auth/document-converters/jwt-setup-document-converters.adoc[leveloffset=+2] + +include::partial$auth/document-converters/php/server-setup-php.adoc[] + +=== Web Page Setup (index.html) + +Inside the `public` folder where you created the `index.html` file add the HTML setup code: + +[source,html] +---- + + + + TinyMCE with Word Import + + + + +

    TinyMCE Import Word Demo

    + + + +---- + +include::partial$auth/document-converters/php/configuration-steps.adoc[] diff --git a/modules/ROOT/partials/auth/document-converters/jwt-setup-document-converters.adoc b/modules/ROOT/partials/auth/document-converters/jwt-setup-document-converters.adoc new file mode 100644 index 0000000000..24810aa8c9 --- /dev/null +++ b/modules/ROOT/partials/auth/document-converters/jwt-setup-document-converters.adoc @@ -0,0 +1,55 @@ +[[setting-up-jwt-authentication]] +== Setting up JWT authentication + +To set up JSON Web Token (JWT) authentication for {productname} {pluginname}: + +. Add a public key to you {accountpage}, link:https://www.tiny.cloud/auth/login/[login]. +. Set up a JSON Web Token (JWT) Provider endpoint via link:{accountjwturl}[{accountpage} - JWT Keys] +. Configure your {productname} to use the JWT endpoint. + +include::partial$auth/private-public-key-pairs-for-tiny-cloud-services.adoc[] + +[[set-up-a-json-web-token-jwt-endpoint]] +== Set up a JSON Web Token (JWT) endpoint + +include::partial$auth/how-jwts-are-used.adoc[] + +=== JWT endpoint requirements + +A JSON Web Token (JWT) endpoint for {pluginname} requires: + +* The endpoint or server accepts a JSON HTTP POST request. +* User authentication - A method of verifying the user, and that they should have access to the {pluginname}. +* The JWTs are generated (signed) using the _private_ key that pairs with the _public_ key provided to link:{accountjwturl}[{accountpage} - JWT Keys]. +* The endpoint or server produces a JSON response with the token. {pluginname} will submit the token with requests to the {pluginname} Server. + +=== Required JWT claims for {pluginname} + +JSON Web Tokens produced by the JWT endpoint must include the following claims: + +`+aud+` _(required)_:: +*Type:* `+String+` ++ +The `aud` is case-sensitive string that must match a valid API key that has the {pluginname} plugin enabled. + +`+iat+` _(required)_:: +*Type:* `+Number+` ++ +The `iat` represents the issue timestamp, specified as the number of seconds. For example, to set the issue time to the current timestamp, calculate the issue time as the current timestamp divided by 1000. + +.Example +[source,json] +---- +iat: Math.floor(Date.now() / 1000), // Issue timestamp +---- + +`+exp+` _(required)_:: +*Type:* `+Number+` ++ +The `exp` represents the expiration timestamp, specified as the number of seconds. For example, to set a validity period of 10 minutes, calculate the expiration time as the current timestamp plus 600 seconds. + +.Example +[source,json] +---- +exp: Math.floor(Date.now() / 1000) + (60 * 10) // Expiration time (10 minutes) +---- \ No newline at end of file diff --git a/modules/ROOT/partials/auth/document-converters/php/configuration-steps.adoc b/modules/ROOT/partials/auth/document-converters/php/configuration-steps.adoc new file mode 100644 index 0000000000..cb588ca3a5 --- /dev/null +++ b/modules/ROOT/partials/auth/document-converters/php/configuration-steps.adoc @@ -0,0 +1,26 @@ +=== Configuration Steps + +==== 1. Add Your API Key + +* Replace `YOUR-API-KEY` in both files with your actual {productname} API key +* The API key should be the same in both the HTML script source and the JWT payload + +==== 2. Add Your Private Key + +* Replace the private key placeholder in `jwt.php` with your actual private key +* Make sure it's in `PKCS8` format +* Keep this key secure and never share it publicly + +=== Running Your Project + +. Start the server: ++ +[source,bash] +---- +php -S localhost:3000 +---- + +. Open your browser to: `http://localhost:3000` +. You should see: +* The {productname} editor +* An "{pluginname}" button in the toolbar \ No newline at end of file diff --git a/modules/ROOT/partials/auth/document-converters/php/initial-project-setup.adoc b/modules/ROOT/partials/auth/document-converters/php/initial-project-setup.adoc new file mode 100644 index 0000000000..5240d90c8b --- /dev/null +++ b/modules/ROOT/partials/auth/document-converters/php/initial-project-setup.adoc @@ -0,0 +1,53 @@ +== Update PHP Configuration File + +Use the following command to locate the PHP configuration file: + +[source,bash] +---- +php --ini +---- + +Open the configuration file in a text editor and ensure the following settings are enabled: + +[source,ini] +---- +extension=openssl +extension_dir='ext' +---- + +[TIP] +The path to the extension directory may vary depending on your system. + +== Quick Start Guide + +=== Project Setup + +[source,bash] +---- +# Create and enter project directory +mkdir tinymce-app +cd tinymce-app +# Initialize Composer +composer require firebase/php-jwt +---- + +=== Create Project Structure + +[source,bash] +---- +# Create the public folder for your web files +touch index.html +touch jwt.php +---- + +Your project should look like this: + +[source] +---- +/tinymce-app + index.html (TinyMCE webpage) + jwt.php (Server code) + composer.json + composer.lock + vendor +---- diff --git a/modules/ROOT/partials/auth/document-converters/php/intro-and-prerequisites.adoc b/modules/ROOT/partials/auth/document-converters/php/intro-and-prerequisites.adoc new file mode 100644 index 0000000000..e7767130e8 --- /dev/null +++ b/modules/ROOT/partials/auth/document-converters/php/intro-and-prerequisites.adoc @@ -0,0 +1,33 @@ +== Introduction + +{pluginname} requires setting up JSON Web Token (JWT) authentication to maintain control over file security. A JWT endpoint generates and provides authorization tokens that verify submitted content is sent by authorized users, preventing unauthorized access. As a standard web services authorization solution, JWT is documented extensively at link:https://jwt.io/[https://jwt.io/]. + +This guide provides a comprehensive walkthrough for integrating {pluginname} with {productname}, including {pluginname} functionality, by using a PHP server for JWT token generation. It covers project setup, server configuration, and {productname} customization. + +== What You'll Build + +Before diving into the technical details, here's what you'll achieve with this guide: + +* A working {productname} editor running {pluginname} plugin. +* A secure authentication system using JWT tokens +* A simple PHP server to handle the authentication + +[TIP] +==== +This guide is designed for developers new to JWT authentication and {productname} integration. +==== + +=== Prerequisites + +Before starting, ensure you have: + +* PHP installed on your computer (to check, run `php -v` in your terminal) +* OpenSSL installed on your computer (to check, run `openssl version` in your terminal) +* Composer installed on your computer (to check, run `composer -v` in your terminal) +* A {productname} API key (get one from link:https://www.tiny.cloud/signup[TinyMCE's website]) +* Basic familiarity with the command line + +[IMPORTANT] +==== +Make sure you have your API key ready before starting. You'll need it for both the server and client configuration. +==== \ No newline at end of file diff --git a/modules/ROOT/partials/auth/document-converters/php/server-setup-php.adoc b/modules/ROOT/partials/auth/document-converters/php/server-setup-php.adoc new file mode 100644 index 0000000000..3bce388289 --- /dev/null +++ b/modules/ROOT/partials/auth/document-converters/php/server-setup-php.adoc @@ -0,0 +1,49 @@ +=== Server Setup (jwt.php) + +In the root directory, copy and paste the server setup code into the `jwt.php` file: + +[source,php] +---- + "JWT auth failed: " . $message))); +} + +// Check for OpenSSL extension +if (!extension_loaded('openssl')) { + fatalError('You need to enable the openssl extension in your php.ini.'); +} + +// Enable CORS +header("Access-Control-Allow-Origin: *"); +header("Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept"); + +// JWT payload +$payload = array( + "aud" => "YOUR-API-KEY-HERE", + "iat" => time(), // Issue timestamp + "exp" => time() + 60 * 10 // Expiration time (10 minutes) +); + +try { + // Tokens are signed with the RS256 algorithm your private key + $privateKey = << $token)); +} catch (Exception $e) { + fatalError($e->getMessage()); +} +?> +---- \ No newline at end of file diff --git a/modules/ROOT/partials/private-public-key-pairs-for-tiny-cloud-services.adoc b/modules/ROOT/partials/private-public-key-pairs-for-tiny-cloud-services.adoc new file mode 100644 index 0000000000..62b3b6f9e3 --- /dev/null +++ b/modules/ROOT/partials/private-public-key-pairs-for-tiny-cloud-services.adoc @@ -0,0 +1,10 @@ +The {pluginname} Server requires a _public_ key generated from the same _private_ key that will be used on your JSON Web Token (JWT) provider endpoint. The public key(s) stored on the {pluginname} Server are used to ensure that content is sent by authorized users. + +There are two methods for generating and adding a public key to your API key: + +== Generate a key pair using the {accountpage} JWT Keys page + +The link:{accountjwturl}[{accountpage} - JWT Keys] page provides a private/public key generator, providing a quick and secure way of generating the required keys. This generator will store a copy of the _public_ key, and provide a downloadable file for both the public and private keys. {companyname} does **not store** the _private_ key and the key pair **cannot** be retrieved later. + +[[generate-a-key-pair-locally]] +== Generate a key pair locally \ No newline at end of file From ee6641638e33dbc37d48eb15ff36d23de66621bb Mon Sep 17 00:00:00 2001 From: Karl Kemister-Sheppard Date: Wed, 11 Dec 2024 15:22:45 +1000 Subject: [PATCH 91/97] DOC-2582: Add `exportword`, `importword` and `exportpdf` JWT authentication guides for (Node.js). (#3517) * DOC-2582: Export to PDF with JWT authentication (Node.js) Guide. * Update modules/ROOT/pages/export-to-pdf-with-jwt-authentication-nodejs.adoc * Update modules/ROOT/pages/export-to-pdf-with-jwt-authentication-nodejs.adoc * Update modules/ROOT/pages/export-to-pdf-with-jwt-authentication-nodejs.adoc * DOC-2582: Add importword and exportword guide. * DOC-2582: Update comments in the html sorce examples. * DOC-2582: Replace duplicated content with partials, cleaned up lvl headings in sidebar. * Update modules/ROOT/pages/export-to-pdf-with-jwt-authentication-nodejs.adoc * Update modules/ROOT/pages/export-to-word-with-jwt-authentication-nodejs.adoc * Update modules/ROOT/pages/importword-with-jwt-authentication-nodejs.adoc * DOC-2582: Update folder structure and naming, added JWT setup, fixed nav.adoc. * DOC-2582: Copy edits, fix typos. * Update modules/ROOT/pages/export-to-pdf-with-jwt-authentication-nodejs.adoc Co-authored-by: Farzad Hayat * Update modules/ROOT/partials/auth/document-converters/server-setup-jwt.adoc Co-authored-by: Farzad Hayat * Update modules/ROOT/pages/exportword.adoc Co-authored-by: Farzad Hayat * Update modules/ROOT/partials/auth/document-converters/initial-project-setup.adoc Co-authored-by: Farzad Hayat * Update modules/ROOT/partials/auth/document-converters/initial-project-setup.adoc Co-authored-by: Farzad Hayat * Update modules/ROOT/partials/auth/document-converters/initial-project-setup.adoc * Update modules/ROOT/pages/importword-with-jwt-authentication-nodejs.adoc * Update modules/ROOT/pages/export-to-word-with-jwt-authentication-nodejs.adoc * Update modules/ROOT/partials/auth/document-converters/jwt-setup-document-converters.adoc Co-authored-by: CODE:AG <57781325+abhinavgandham@users.noreply.github.com> * DOC-2582: Minor copy edits. --------- Co-authored-by: LewisAtTiny Co-authored-by: Farzad Hayat Co-authored-by: CODE:AG <57781325+abhinavgandham@users.noreply.github.com> --- modules/ROOT/nav.adoc | 9 ++- ...to-pdf-with-jwt-authentication-nodejs.adoc | 65 +++++++++++++++++++ ...o-word-with-jwt-authentication-nodejs.adoc | 63 ++++++++++++++++++ ...rtword-with-jwt-authentication-nodejs.adoc | 65 +++++++++++++++++++ .../configuration-steps.adoc | 26 ++++++++ .../initial-project-setup.adoc | 41 ++++++++++++ .../intro-and-prerequisites.adoc | 31 +++++++++ .../jwt-setup-document-converters.adoc | 2 +- .../document-converters/server-setup-jwt.adoc | 44 +++++++++++++ ...lic-key-pairs-for-tiny-cloud-services.adoc | 4 +- 10 files changed, 344 insertions(+), 6 deletions(-) create mode 100644 modules/ROOT/pages/export-to-pdf-with-jwt-authentication-nodejs.adoc create mode 100644 modules/ROOT/pages/export-to-word-with-jwt-authentication-nodejs.adoc create mode 100644 modules/ROOT/pages/importword-with-jwt-authentication-nodejs.adoc create mode 100644 modules/ROOT/partials/auth/document-converters/configuration-steps.adoc create mode 100644 modules/ROOT/partials/auth/document-converters/initial-project-setup.adoc create mode 100644 modules/ROOT/partials/auth/document-converters/intro-and-prerequisites.adoc create mode 100644 modules/ROOT/partials/auth/document-converters/server-setup-jwt.adoc diff --git a/modules/ROOT/nav.adoc b/modules/ROOT/nav.adoc index 4963c93210..845eb68540 100644 --- a/modules/ROOT/nav.adoc +++ b/modules/ROOT/nav.adoc @@ -314,17 +314,20 @@ *** xref:exportpdf.adoc[Export to PDF] **** xref:html-to-pdf-converter-api.adoc[HTML to PDF Converter API] **** JWT Authentication -***** xref:export-to-pdf-with-jwt-authentication-with-php.adoc[Export to PDF with JWT authentication (PHP)] +***** xref:export-to-pdf-with-jwt-authentication-nodejs.adoc[NodeJS] +***** xref:export-to-pdf-with-jwt-authentication-with-php.adoc[PHP] *** xref:exportword.adoc[Export to Word] **** xref:html-to-docx-converter-api.adoc[HTML to DOCX Converter API] **** JWT Authentication -***** xref:export-to-word-with-jwt-authentication-with-php.adoc[Export to Word with JWT Authentication (PHP)] +***** xref:export-to-word-with-jwt-authentication-nodejs.adoc[NodeJS] +***** xref:export-to-word-with-jwt-authentication-with-php.adoc[PHP] *** xref:footnotes.adoc[Footnotes] *** xref:formatpainter.adoc[Format Painter] *** xref:importword.adoc[Import from Word] **** xref:docx-to-html-converter-api.adoc[DOCX to HTML Converter API] **** JWT Authentication -***** xref:import-word-with-jwt-authentication-with-php.adoc[Import From Word with JWT Authentication (PHP)] +***** xref:importword-with-jwt-authentication-nodejs.adoc[NodeJS] +***** xref:import-word-with-jwt-authentication-with-php.adoc[PHP] *** xref:editimage.adoc[Image Editing] *** xref:uploadcare.adoc[Image Optimizer Powered by Uploadcare] *** xref:inline-css.adoc[Inline CSS] diff --git a/modules/ROOT/pages/export-to-pdf-with-jwt-authentication-nodejs.adoc b/modules/ROOT/pages/export-to-pdf-with-jwt-authentication-nodejs.adoc new file mode 100644 index 0000000000..526e8f9935 --- /dev/null +++ b/modules/ROOT/pages/export-to-pdf-with-jwt-authentication-nodejs.adoc @@ -0,0 +1,65 @@ += {pluginname} with JWT authentication (Node.js) Guide +:navtitle: JWT Authentication setup for Export to PDF +:description: Guide on how to setup JWT Authentication for exporting pdf files with Export to PDF +:keywords: jwt, authentication, exportpdf, pdf, node.js +:pluginname: Export to PDF +:plugincode: exportpdf + + +include::partial$auth/document-converters/intro-and-prerequisites.adoc[] + +include::partial$auth/document-converters/initial-project-setup.adoc[] + +== Setup + +include::partial$auth/document-converters/jwt-setup-document-converters.adoc[leveloffset=+1] + +. In the root directory, copy and paste the server setup code into the `jwt.js` file (refer to the *Configuring the Node.js Server for JWT Token Generation* section). + +include::partial$auth/document-converters/server-setup-jwt.adoc[] + +=== Web Page (public/index.html) + +[source,html] +---- + + + + TinyMCE with PDF Export + + + + +

    TinyMCE Export to PDF Demo

    + + + +---- + +include::partial$auth/document-converters/configuration-steps.adoc[] \ No newline at end of file diff --git a/modules/ROOT/pages/export-to-word-with-jwt-authentication-nodejs.adoc b/modules/ROOT/pages/export-to-word-with-jwt-authentication-nodejs.adoc new file mode 100644 index 0000000000..89ec94448c --- /dev/null +++ b/modules/ROOT/pages/export-to-word-with-jwt-authentication-nodejs.adoc @@ -0,0 +1,63 @@ += {pluginname} with JWT authentication (Node.js) Guide +:navtitle: JWT Authentication setup for Export to Word +:description: Guide on how to setup JWT Authentication for exporting docx files with Export to Word +:keywords: jwt, authentication, exportword, node.js +:pluginname: Export to Word +:plugincode: exportword + + +include::partial$auth/document-converters/intro-and-prerequisites.adoc[] + +include::partial$auth/document-converters/initial-project-setup.adoc[] + +== Setup + +include::partial$auth/document-converters/jwt-setup-document-converters.adoc[leveloffset=+1] + +. In the root directory, copy and paste the server setup code into the `jwt.js` file (refer to the *Configuring the Node.js Server for JWT Token Generation* section). + +include::partial$auth/document-converters/server-setup-jwt.adoc[] + +=== Web Page (public/index.html) + +[source,html] +---- + + + + TinyMCE with Export to Word + + + + +

    TinyMCE Export to Word Demo

    + + + +---- + +include::partial$auth/document-converters/configuration-steps.adoc[] \ No newline at end of file diff --git a/modules/ROOT/pages/importword-with-jwt-authentication-nodejs.adoc b/modules/ROOT/pages/importword-with-jwt-authentication-nodejs.adoc new file mode 100644 index 0000000000..aafdf23082 --- /dev/null +++ b/modules/ROOT/pages/importword-with-jwt-authentication-nodejs.adoc @@ -0,0 +1,65 @@ += {pluginname} with JWT authentication (Node.js) Guide +:navtitle: JWT Authentication setup for Import from Word +:description: Guide on how to setup JWT Authentication for importing docx (MS Word) files with Import from Word +:keywords: jwt, authentication, importword, node.js +:pluginname: Import from Word +:plugincode: importword + + +include::partial$auth/document-converters/intro-and-prerequisites.adoc[] + +include::partial$auth/document-converters/initial-project-setup.adoc[] + +== Setup + +include::partial$auth/document-converters/jwt-setup-document-converters.adoc[leveloffset=+1] + +. In the root directory, copy and paste the server setup code into the `jwt.js` file (refer to the *Server Setup (jwt.js)* section). + +include::partial$auth/document-converters/server-setup-jwt.adoc[] + +=== Web Page (public/index.html) + +[source,html] +---- + + + + TinyMCE with Import from Word + + + + +

    TinyMCE Import from Word Demo

    + + + +---- + +include::partial$auth/document-converters/configuration-steps.adoc[] \ No newline at end of file diff --git a/modules/ROOT/partials/auth/document-converters/configuration-steps.adoc b/modules/ROOT/partials/auth/document-converters/configuration-steps.adoc new file mode 100644 index 0000000000..27873853c9 --- /dev/null +++ b/modules/ROOT/partials/auth/document-converters/configuration-steps.adoc @@ -0,0 +1,26 @@ +== Configuration Steps + +=== Add Your API Key + +* Replace `YOUR-API-KEY` in both files with your actual {productname} API key +* The API key should be the same in both the HTML script source and the JWT payload + +=== Add Your Private Key + +* Replace the private key placeholder in `jwt.js` with your actual private key +* Make sure it's in `PKCS8` format +* Keep this key secure and never share it publicly + +=== Running Your Project + +. Start the server: ++ +[source,bash] +---- +node jwt.js +---- + +. Open your browser to: `http://localhost:3000` +. You should see: +* The {productname} editor +* An "{pluginname}" button in the toolbar \ No newline at end of file diff --git a/modules/ROOT/partials/auth/document-converters/initial-project-setup.adoc b/modules/ROOT/partials/auth/document-converters/initial-project-setup.adoc new file mode 100644 index 0000000000..4b567ab8b8 --- /dev/null +++ b/modules/ROOT/partials/auth/document-converters/initial-project-setup.adoc @@ -0,0 +1,41 @@ +== Quick Start Guide + +=== Project Setup + +[source,bash] +---- +# Create and enter project directory +mkdir tinymce-my-app +cd tinymce-my-app + +# Initialize project +npm init -y + +# Install required packages +npm install express cors jsonwebtoken +---- + +Verify that the `package.json` file now includes the required dependencies. + +=== Create Project Structure + +[source,bash] +---- +# Create the public folder for your web files +mkdir public +touch public/index.html +touch jwt.js +---- + +Your project should look like this: + +[source] +---- +/tinymce-my-app + /public + index.html (TinyMCE webpage) + jwt.js (Server code) + package.json (Project configuration) +---- + +. Inside the `public` folder where you created the `index.html` file add the HTML setup code (refer to the *Web Page (public/index.html)* section). \ No newline at end of file diff --git a/modules/ROOT/partials/auth/document-converters/intro-and-prerequisites.adoc b/modules/ROOT/partials/auth/document-converters/intro-and-prerequisites.adoc new file mode 100644 index 0000000000..be4aaba0ee --- /dev/null +++ b/modules/ROOT/partials/auth/document-converters/intro-and-prerequisites.adoc @@ -0,0 +1,31 @@ +== Introduction + +{pluginname} requires setting up JSON Web Token (JWT) authentication to maintain control over file security. A JWT endpoint generates and provides authorization tokens that verify submitted content is sent by authorized users, preventing unauthorized access. As a standard web services authorization solution, JWT is documented extensively at link:https://jwt.io/[https://jwt.io/]. + +This guide provides a comprehensive walkthrough for integrating {pluginname} with {productname}, including {pluginname} functionality, by using a Node.js server for JWT token generation. It covers project setup, server configuration, and {productname} customization. + +=== What You'll Build + +Before diving into the technical details, here's what you'll achieve with this guide: + +* A working {productname} editor running {pluginname} plugin. +* A secure authentication system using JWT token. +* A simple Node.js server to handle the authentication. + +[TIP] +==== +This guide is designed for developers new to JWT authentication and {productname} integration. +==== + +=== Prerequisites + +Before starting, ensure you have: + +* Node.js installed on your computer +* A {productname} API key (get one from link:https://www.tiny.cloud/signup[TinyMCE's website]) +* Basic familiarity with the command line + +[IMPORTANT] +==== +Make sure you have your API key ready before starting. You'll need it for both the server and client configuration. +==== \ No newline at end of file diff --git a/modules/ROOT/partials/auth/document-converters/jwt-setup-document-converters.adoc b/modules/ROOT/partials/auth/document-converters/jwt-setup-document-converters.adoc index 24810aa8c9..907b4cd997 100644 --- a/modules/ROOT/partials/auth/document-converters/jwt-setup-document-converters.adoc +++ b/modules/ROOT/partials/auth/document-converters/jwt-setup-document-converters.adoc @@ -3,7 +3,7 @@ To set up JSON Web Token (JWT) authentication for {productname} {pluginname}: -. Add a public key to you {accountpage}, link:https://www.tiny.cloud/auth/login/[login]. +. Add a public key to your {accountpage}, link:https://www.tiny.cloud/auth/login/[login]. . Set up a JSON Web Token (JWT) Provider endpoint via link:{accountjwturl}[{accountpage} - JWT Keys] . Configure your {productname} to use the JWT endpoint. diff --git a/modules/ROOT/partials/auth/document-converters/server-setup-jwt.adoc b/modules/ROOT/partials/auth/document-converters/server-setup-jwt.adoc new file mode 100644 index 0000000000..bee43e5ac4 --- /dev/null +++ b/modules/ROOT/partials/auth/document-converters/server-setup-jwt.adoc @@ -0,0 +1,44 @@ +=== Server Setup (jwt.js) + +[source,javascript] +---- +const express = require('express'); // Sets up the web server. +const jwt = require('jsonwebtoken'); // Generates and signs JWTs. +const cors = require('cors'); // Allows cross-origin requests. +const path = require('path'); // Handles file paths. + +const app = express(); +app.use(cors()); + +// Your private key (Replace this with your actual key) +const privateKey = ` +-----BEGIN PRIVATE KEY----- +{Your private PKCS8 key goes here} +-----END PRIVATE KEY----- +`; + +app.use(express.static(path.join(__dirname, 'public'))); + +// JWT token generation endpoint +app.post('/jwt', (req, res) => { + const payload = { + aud: 'YOUR-API-KEY', // Replace with your actual API key + iat: Math.floor(Date.now() / 1000), // Issue timestamp + exp: Math.floor(Date.now() / 1000) + (60 * 10) // Expiration time (10 minutes) + }; + + try { + // Tokens are signed with the RS256 algorithm using your private key + const token = jwt.sign(payload, privateKey, { algorithm: 'RS256' }); + res.json({ token }); + } catch (error) { + res.status(500).send('Failed to generate JWT token.'); + console.error(error.message); + } +}); + +const PORT = 3000; +app.listen(PORT, () => { + console.log(`Server running at http://localhost:${PORT}`); +}); +---- \ No newline at end of file diff --git a/modules/ROOT/partials/auth/private-public-key-pairs-for-tiny-cloud-services.adoc b/modules/ROOT/partials/auth/private-public-key-pairs-for-tiny-cloud-services.adoc index fb6cfa59f6..373aa438bc 100644 --- a/modules/ROOT/partials/auth/private-public-key-pairs-for-tiny-cloud-services.adoc +++ b/modules/ROOT/partials/auth/private-public-key-pairs-for-tiny-cloud-services.adoc @@ -1,4 +1,4 @@ -The {pluginname} Server requires a _public_ key generated from the same _private_ key that will be used on your JSON Web Token (JWT) provider endpoint. The public key(s) stored on the {pluginname} Server are used to ensure that content is sent by authorized users. +The **{pluginname}** Server requires a _public_ key generated from the same _private_ key that will be used on your JSON Web Token (JWT) provider endpoint. The public key(s) stored on the {pluginname} Server are used to ensure that content is sent by authorized users. There are two methods for generating and adding a public key to your API key: @@ -7,7 +7,7 @@ There are two methods for generating and adding a public key to your API key: == Generate a key pair using the {accountpage} JWT Keys page -The link:{accountjwturl}[{accountpage} - JWT Keys] page provides a private/public key generator, providing a quick and secure way of generating the required keys. This generator will store a copy of the _public_ key, and provide a downloadable file for both the public and private keys. {companyname} does not store the _private_ key and the key pair cannot be retrieved later. +The link:{accountjwturl}[{accountpage} - JWT Keys] page provides a private/public key generator, providing a quick and secure way of generating the required keys. This generator will store a copy of the _public_ key, and provide a downloadable file for both the public and private keys. {companyname} does **not store** the _private_ key and the key pair **cannot** be retrieved later. [[generate-a-key-pair-locally]] == Generate a key pair locally From 26d4a6e1cfe42f8185b6011f126d7d199d57cc9a Mon Sep 17 00:00:00 2001 From: Farzad Hayat Date: Thu, 12 Dec 2024 14:27:48 +1100 Subject: [PATCH 92/97] DOC-2600: update all document converters to new API doc links (#3561) --- modules/ROOT/pages/docx-to-html-converter-api.adoc | 2 +- modules/ROOT/pages/exportpdf.adoc | 2 +- modules/ROOT/pages/exportword.adoc | 2 +- modules/ROOT/pages/html-to-docx-converter-api.adoc | 2 +- modules/ROOT/pages/html-to-pdf-converter-api.adoc | 8 ++++---- modules/ROOT/pages/importword.adoc | 2 +- .../configuration/exportpdf_converter_options.adoc | 2 +- .../configuration/exportword_converter_options.adoc | 2 +- .../configuration/importword_converter_options.adoc | 2 +- .../export-to-pdf/export-to-pdf-api-usage.adoc | 2 +- .../export-to-pdf/export-to-pdf-autorization.adoc | 2 +- .../export-to-pdf/export-to-pdf-fonts.adoc | 4 ++-- ...rom-word-and-export-to-word-api-usage-on-premises.adoc | 2 +- ...-word-and-export-to-word-autorization-on-premises.adoc | 2 +- 14 files changed, 18 insertions(+), 18 deletions(-) diff --git a/modules/ROOT/pages/docx-to-html-converter-api.adoc b/modules/ROOT/pages/docx-to-html-converter-api.adoc index cb2a034337..01fb3b7ddb 100644 --- a/modules/ROOT/pages/docx-to-html-converter-api.adoc +++ b/modules/ROOT/pages/docx-to-html-converter-api.adoc @@ -50,4 +50,4 @@ These configuration options enhance the flexibility and control users have over == Docx to HTML Converter API Reference -> Explore the comprehensive API documentation at link:https://exportdocx.converter.tiny.cloud/docs#section/Import-from-Word[Docx to HTML Converter API Reference documentation.^] \ No newline at end of file +> Explore the comprehensive API documentation at link:https://exportdocx.api.tiny.cloud/docs#section/Import-from-Word[Docx to HTML Converter API Reference documentation.^] \ No newline at end of file diff --git a/modules/ROOT/pages/exportpdf.adoc b/modules/ROOT/pages/exportpdf.adoc index 877faa52bf..ba5d317d26 100644 --- a/modules/ROOT/pages/exportpdf.adoc +++ b/modules/ROOT/pages/exportpdf.adoc @@ -84,4 +84,4 @@ include::partial$commands/{plugincode}-cmds.adoc[] == API Reference -> Explore the comprehensive API documentation for the {pluginname} Premium plugin at https://exportpdf.converter.tiny.cloud/docs[Export to PDF.^] \ No newline at end of file +> Explore the comprehensive API documentation for the {pluginname} Premium plugin at https://exportpdf.api.tiny.cloud/docs[Export to PDF.^] \ No newline at end of file diff --git a/modules/ROOT/pages/exportword.adoc b/modules/ROOT/pages/exportword.adoc index 5e838c78ae..337ead2c32 100644 --- a/modules/ROOT/pages/exportword.adoc +++ b/modules/ROOT/pages/exportword.adoc @@ -85,4 +85,4 @@ include::partial$commands/exportword-cmds.adoc[][leveloffset=+1] == API Reference -> Explore the comprehensive API documentation for the {pluginname} Premium plugin at link:https://exportdocx.converter.tiny.cloud/v2/convert/docs#section/Export-to-Word[Export to Word.^] \ No newline at end of file +> Explore the comprehensive API documentation for the {pluginname} Premium plugin at link:https://exportdocx.api.tiny.cloud/v2/convert/docs#section/Export-to-Word[Export to Word.^] \ No newline at end of file diff --git a/modules/ROOT/pages/html-to-docx-converter-api.adoc b/modules/ROOT/pages/html-to-docx-converter-api.adoc index 114db73d98..89c20a3c70 100644 --- a/modules/ROOT/pages/html-to-docx-converter-api.adoc +++ b/modules/ROOT/pages/html-to-docx-converter-api.adoc @@ -41,4 +41,4 @@ Examples on how you can use the API to convert an HTML document with custom styl == HTML to Docx Converter API Reference -> Explore the comprehensive API documentation at link:https://exportdocx.converter.tiny.cloud/docs#section/Export-to-Word[HTML to Docx Converter API Reference documentation.^] \ No newline at end of file +> Explore the comprehensive API documentation at link:https://exportdocx.api.tiny.cloud/docs#section/Export-to-Word[HTML to Docx Converter API Reference documentation.^] \ No newline at end of file diff --git a/modules/ROOT/pages/html-to-pdf-converter-api.adoc b/modules/ROOT/pages/html-to-pdf-converter-api.adoc index a566d242c9..3beeff4ac2 100644 --- a/modules/ROOT/pages/html-to-pdf-converter-api.adoc +++ b/modules/ROOT/pages/html-to-pdf-converter-api.adoc @@ -27,9 +27,9 @@ The {servicename} is a powerful tool that seamlessly integrates advanced documen Tailor your PDF documents to suit your needs: -* **Custom CSS Styling:** Apply link:https://exportpdf.converter.tiny.cloud/docs#section/General/CSS[custom CSS^] styles to your PDFs for brand consistency and enhanced presentation. -* **Header and Footer Options:** Add link:https://exportpdf.converter.tiny.cloud/docs#section/PDF-options/Header-and-footer[headers, footers^], and other branding elements to your PDF documents for a professional touch. -* **Page Formatting:** Control page settings such as orientation, link:https://exportpdf.converter.tiny.cloud/docs#section/PDF-options/Margins[margins^], and link:https://exportpdf.converter.tiny.cloud/docs#section/PDF-options/Page-format[page size] to optimize readability. +* **Custom CSS Styling:** Apply link:https://exportpdf.api.tiny.cloud/docs#section/General/CSS[custom CSS^] styles to your PDFs for brand consistency and enhanced presentation. +* **Header and Footer Options:** Add link:https://exportpdf.api.tiny.cloud/docs#section/PDF-options/Header-and-footer[headers, footers^], and other branding elements to your PDF documents for a professional touch. +* **Page Formatting:** Control page settings such as orientation, link:https://exportpdf.api.tiny.cloud/docs#section/PDF-options/Margins[margins^], and link:https://exportpdf.api.tiny.cloud/docs#section/PDF-options/Page-format[page size] to optimize readability. == Ideal for Various Use Cases @@ -40,4 +40,4 @@ Tailor your PDF documents to suit your needs: == PDF Converter API Reference -> Explore the comprehensive API documentation at link:https://exportpdf.converter.tiny.cloud/docs[PDF Converter API Reference documentation.^] \ No newline at end of file +> Explore the comprehensive API documentation at link:https://exportpdf.api.tiny.cloud/docs[PDF Converter API Reference documentation.^] \ No newline at end of file diff --git a/modules/ROOT/pages/importword.adoc b/modules/ROOT/pages/importword.adoc index 2161f65a97..1cc96ed00c 100644 --- a/modules/ROOT/pages/importword.adoc +++ b/modules/ROOT/pages/importword.adoc @@ -83,4 +83,4 @@ include::partial$commands/importword-cmds.adoc[] == API Reference -> Explore the comprehensive API documentation for the {pluginname} Premium plugin at link:https://importdocx.converter.tiny.cloud/v2/convert/docs#section/Import-from-Word[Import from Word.^] \ No newline at end of file +> Explore the comprehensive API documentation for the {pluginname} Premium plugin at link:https://importdocx.api.tiny.cloud/v2/convert/docs#section/Import-from-Word[Import from Word.^] \ No newline at end of file diff --git a/modules/ROOT/partials/configuration/exportpdf_converter_options.adoc b/modules/ROOT/partials/configuration/exportpdf_converter_options.adoc index 2bc109177d..806eea7d6b 100644 --- a/modules/ROOT/partials/configuration/exportpdf_converter_options.adoc +++ b/modules/ROOT/partials/configuration/exportpdf_converter_options.adoc @@ -39,4 +39,4 @@ tinymce.init({ [NOTE] The `exportpdf_service_url` option must be configured for the {pluginname} plugin to work. -> For comprehensive details regarding the `exportpdf_converter_options`, please refer to the https://exportpdf.converter.tiny.cloud/docs[API documentation^] available for the {pluginname} Premium plugin. \ No newline at end of file +> For comprehensive details regarding the `exportpdf_converter_options`, please refer to the https://exportpdf.api.tiny.cloud/docs[API documentation^] available for the {pluginname} Premium plugin. \ No newline at end of file diff --git a/modules/ROOT/partials/configuration/exportword_converter_options.adoc b/modules/ROOT/partials/configuration/exportword_converter_options.adoc index 54233db596..9ca4223cad 100644 --- a/modules/ROOT/partials/configuration/exportword_converter_options.adoc +++ b/modules/ROOT/partials/configuration/exportword_converter_options.adoc @@ -65,4 +65,4 @@ tinymce.init({ [NOTE] To use this option, the Export to Word plugin requires the `exportword_service_url` option to be configured. -> For comprehensive details regarding the `exportword_converter_options`, please refer to the link:https://exportdocx.converter.tiny.cloud/v2/convert/docs#section/Export-to-Word[API documentation^] available for the {pluginname} Premium plugin. +> For comprehensive details regarding the `exportword_converter_options`, please refer to the link:https://exportdocx.api.tiny.cloud/v2/convert/docs#section/Export-to-Word[API documentation^] available for the {pluginname} Premium plugin. diff --git a/modules/ROOT/partials/configuration/importword_converter_options.adoc b/modules/ROOT/partials/configuration/importword_converter_options.adoc index c91576b76d..5e8ff26dd5 100644 --- a/modules/ROOT/partials/configuration/importword_converter_options.adoc +++ b/modules/ROOT/partials/configuration/importword_converter_options.adoc @@ -39,4 +39,4 @@ tinymce.init({ ---- [NOTE] -For more information on the available converter options, refer to the link:https://importdocx.converter.tiny.cloud/v2/convert/docs#section/Import-from-Word/Configuration[Import from Word API documentation]. \ No newline at end of file +For more information on the available converter options, refer to the link:https://importdocx.api.tiny.cloud/v2/convert/docs#section/Import-from-Word/Configuration[Import from Word API documentation]. \ No newline at end of file diff --git a/modules/ROOT/partials/individually-licensed-components/export-to-pdf/export-to-pdf-api-usage.adoc b/modules/ROOT/partials/individually-licensed-components/export-to-pdf/export-to-pdf-api-usage.adoc index 6f7b93f9e4..f79a093ec6 100644 --- a/modules/ROOT/partials/individually-licensed-components/export-to-pdf/export-to-pdf-api-usage.adoc +++ b/modules/ROOT/partials/individually-licensed-components/export-to-pdf/export-to-pdf-api-usage.adoc @@ -7,7 +7,7 @@ The API is available on `+http://localhost:[port]+` (by default the `port` is `8 [NOTE] The REST API documentation is available at `+http://localhost:[port]/docs+`. -Alternatively, refer to the specifications in link:https://exportpdf.converter.tiny.cloud/docs[https://exportpdf.converter.tiny.cloud/docs^]. +Alternatively, refer to the specifications in link:https://exportpdf.api.tiny.cloud/docs[https://exportpdf.api.tiny.cloud/docs^]. If the authorization for the API is enabled, provided an authorization token. More instructions can be found in the xref:individual-export-to-pdf-on-premises.adoc#authorization[authorization] section. diff --git a/modules/ROOT/partials/individually-licensed-components/export-to-pdf/export-to-pdf-autorization.adoc b/modules/ROOT/partials/individually-licensed-components/export-to-pdf/export-to-pdf-autorization.adoc index 6bcf161084..eba8d6e67b 100644 --- a/modules/ROOT/partials/individually-licensed-components/export-to-pdf/export-to-pdf-autorization.adoc +++ b/modules/ROOT/partials/individually-licensed-components/export-to-pdf/export-to-pdf-autorization.adoc @@ -91,7 +91,7 @@ axios.post( 'http://localhost:8080/v1/convert', data, config ) `SECRET_KEY` it’s the key which has been passed to the {pluginname} On-Premises instance -Please refer to the link:https://exportpdf.converter.tiny.cloud/docs[{pluginname} REST API documentation] to start using the service. +Please refer to the link:https://exportpdf.api.tiny.cloud/docs[{pluginname} REST API documentation] to start using the service. [NOTE] If API clients like Postman or Insomnia are used, then set the JWT token as an `Authorization` header in the `Headers` tab. Do not use the built-in token authorization as this will generate invalid header with a `Bearer` prefix added to the token. \ No newline at end of file diff --git a/modules/ROOT/partials/individually-licensed-components/export-to-pdf/export-to-pdf-fonts.adoc b/modules/ROOT/partials/individually-licensed-components/export-to-pdf/export-to-pdf-fonts.adoc index f950c20157..648b948eee 100644 --- a/modules/ROOT/partials/individually-licensed-components/export-to-pdf/export-to-pdf-fonts.adoc +++ b/modules/ROOT/partials/individually-licensed-components/export-to-pdf/export-to-pdf-fonts.adoc @@ -5,7 +5,7 @@ During document writing, the possibility of using many different fonts can be ve Using the appropriate font can change the appearance of the document and emphasize its style. -{pluginname} Converter allows link:https://exportpdf.converter.tiny.cloud/docs#section/Web-Fonts[Web Fonts^] to be used, which provided the integrator with the ability to use standard operating system fonts or use custom fonts without the need to import them using CSS. +{pluginname} Converter allows link:https://exportpdf.api.tiny.cloud/docs#section/Web-Fonts[Web Fonts^] to be used, which provided the integrator with the ability to use standard operating system fonts or use custom fonts without the need to import them using CSS. Below is a list of the basic fonts included in the image: @@ -31,7 +31,7 @@ However, additional fonts can be added to {pluginname} Converter in two ways: ** See Use Windows fonts in PDF Converter section. [NOTE] -The fonts inside the mounted volume will be installed on the docker image operating system. Only the `.ttf` and `.otf` font formats are supported. If other font formats are used, these will need to be converted to the supported format prior or use fonts such as link:https://exportpdf.converter.tiny.cloud/docs#section/Web-Fonts[Web Fonts^]. +The fonts inside the mounted volume will be installed on the docker image operating system. Only the `.ttf` and `.otf` font formats are supported. If other font formats are used, these will need to be converted to the supported format prior or use fonts such as link:https://exportpdf.api.tiny.cloud/docs#section/Web-Fonts[Web Fonts^]. [TIP] Ensure that the converted fonts can be installed and used on your local machine first, before installing them on the docker container. diff --git a/modules/ROOT/partials/individually-licensed-components/import-from-word-and-export-to-word/import-from-word-and-export-to-word-api-usage-on-premises.adoc b/modules/ROOT/partials/individually-licensed-components/import-from-word-and-export-to-word/import-from-word-and-export-to-word-api-usage-on-premises.adoc index 0fb62308f1..425460082d 100644 --- a/modules/ROOT/partials/individually-licensed-components/import-from-word-and-export-to-word/import-from-word-and-export-to-word-api-usage-on-premises.adoc +++ b/modules/ROOT/partials/individually-licensed-components/import-from-word-and-export-to-word/import-from-word-and-export-to-word-api-usage-on-premises.adoc @@ -10,6 +10,6 @@ The API is available on `+http://localhost:[port]+` (by default the port is 8080 [NOTE] The REST API documentation is available at `+http://localhost:[port]/v2/convert/docs+`. -Alternatively you can check specification in our public resources for link:https://importdocx.converter.tiny.cloud/v2/convert/docs#section/Import-from-Word[Import from Word^] and the link:https://exportdocx.converter.tiny.cloud/v2/convert/docs#section/Export-to-Word[Export to Word^] plugins. +Alternatively you can check specification in our public resources for link:https://importdocx.api.tiny.cloud/v2/convert/docs#section/Import-from-Word[Import from Word^] and the link:https://exportdocx.api.tiny.cloud/v2/convert/docs#section/Export-to-Word[Export to Word^] plugins. If you have the authorization for the API enabled, you should provide an authorization token. More instructions you can find in the authorization section. \ No newline at end of file diff --git a/modules/ROOT/partials/individually-licensed-components/import-from-word-and-export-to-word/import-from-word-and-export-to-word-autorization-on-premises.adoc b/modules/ROOT/partials/individually-licensed-components/import-from-word-and-export-to-word/import-from-word-and-export-to-word-autorization-on-premises.adoc index 18861d092d..093bc075ec 100644 --- a/modules/ROOT/partials/individually-licensed-components/import-from-word-and-export-to-word/import-from-word-and-export-to-word-autorization-on-premises.adoc +++ b/modules/ROOT/partials/individually-licensed-components/import-from-word-and-export-to-word/import-from-word-and-export-to-word-autorization-on-premises.adoc @@ -63,7 +63,7 @@ axios.post( 'http://localhost:8080/v2/convert/html-docx', data, config ) `SECRET_KEY`: This is the key what has been passed to the {pluginname} On-Premises instance. -Please refer to the link:https://importdocx.converter.tiny.cloud/v2/convert/docs#section/Import-from-Word[Import from Word^] and the link:https://exportdocx.converter.tiny.cloud/v2/convert/docs#section/Export-to-Word[Export to Word^] REST API documentation to start using the service. +Please refer to the link:https://importdocx.api.tiny.cloud/v2/convert/docs#section/Import-from-Word[Import from Word^] and the link:https://exportdocx.api.tiny.cloud/v2/convert/docs#section/Export-to-Word[Export to Word^] REST API documentation to start using the service. [NOTE] If API clients like Postman or Insomnia are used, then set the JWT token as an `Authorization` header in the `Headers` tab. Do not use the built-in token authorization as this will generate invalid header with a `Bearer` prefix added to the token. \ No newline at end of file From e738181f48efa36f01b3453ad4df396649cd9674 Mon Sep 17 00:00:00 2001 From: Farzad Hayat Date: Thu, 12 Dec 2024 14:47:08 +1100 Subject: [PATCH 93/97] DOC-2598: Document Converters Cleanup (#3560) * DOC2598: Clean up document converters and fix broken links * DOC-2598: TINY-11459 Improve the context form placeholder sample code * Revert "DOC-2598: TINY-11459 Improve the context form placeholder sample code" This reverts commit d136fa2d93cab5153a34164ba1b4532278ea5af8. --- modules/ROOT/nav.adoc | 12 +++++----- ...to-pdf-with-jwt-authentication-nodejs.adoc | 24 ++++++++++--------- ...t-to-pdf-with-jwt-authentication-php.adoc} | 2 +- ...o-word-with-jwt-authentication-nodejs.adoc | 22 +++++++++-------- ...-to-word-with-jwt-authentication-php.adoc} | 2 +- modules/ROOT/pages/exportpdf.adoc | 18 +++++++------- modules/ROOT/pages/exportword.adoc | 18 +++++++------- ...-word-with-jwt-authentication-nodejs.adoc} | 22 +++++++++-------- ...rom-word-with-jwt-authentication-php.adoc} | 2 +- modules/ROOT/pages/importword.adoc | 16 ++++++------- .../{ => nodejs}/configuration-steps.adoc | 0 .../{ => nodejs}/initial-project-setup.adoc | 4 +--- .../{ => nodejs}/intro-and-prerequisites.adoc | 8 +++---- .../{ => nodejs}/server-setup-jwt.adoc | 2 ++ .../php/configuration-steps.adoc | 6 ++--- .../php/intro-and-prerequisites.adoc | 4 ++-- .../php/server-setup-php.adoc | 4 ++-- .../exportpdf_token_provider.adoc | 4 ++-- .../exportword_token_provider.adoc | 4 ++-- .../importword_token_provider.adoc | 4 ++-- 20 files changed, 92 insertions(+), 86 deletions(-) rename modules/ROOT/pages/{export-to-pdf-with-jwt-authentication-with-php.adoc => export-to-pdf-with-jwt-authentication-php.adoc} (98%) rename modules/ROOT/pages/{export-to-word-with-jwt-authentication-with-php.adoc => export-to-word-with-jwt-authentication-php.adoc} (98%) rename modules/ROOT/pages/{importword-with-jwt-authentication-nodejs.adoc => import-from-word-with-jwt-authentication-nodejs.adoc} (70%) rename modules/ROOT/pages/{import-word-with-jwt-authentication-with-php.adoc => import-from-word-with-jwt-authentication-php.adoc} (98%) rename modules/ROOT/partials/auth/document-converters/{ => nodejs}/configuration-steps.adoc (100%) rename modules/ROOT/partials/auth/document-converters/{ => nodejs}/initial-project-setup.adoc (80%) rename modules/ROOT/partials/auth/document-converters/{ => nodejs}/intro-and-prerequisites.adoc (82%) rename modules/ROOT/partials/auth/document-converters/{ => nodejs}/server-setup-jwt.adoc (93%) diff --git a/modules/ROOT/nav.adoc b/modules/ROOT/nav.adoc index 845eb68540..d37a246e5c 100644 --- a/modules/ROOT/nav.adoc +++ b/modules/ROOT/nav.adoc @@ -314,20 +314,20 @@ *** xref:exportpdf.adoc[Export to PDF] **** xref:html-to-pdf-converter-api.adoc[HTML to PDF Converter API] **** JWT Authentication -***** xref:export-to-pdf-with-jwt-authentication-nodejs.adoc[NodeJS] -***** xref:export-to-pdf-with-jwt-authentication-with-php.adoc[PHP] +***** xref:export-to-pdf-with-jwt-authentication-nodejs.adoc[Node.js] +***** xref:export-to-pdf-with-jwt-authentication-php.adoc[PHP] *** xref:exportword.adoc[Export to Word] **** xref:html-to-docx-converter-api.adoc[HTML to DOCX Converter API] **** JWT Authentication -***** xref:export-to-word-with-jwt-authentication-nodejs.adoc[NodeJS] -***** xref:export-to-word-with-jwt-authentication-with-php.adoc[PHP] +***** xref:export-to-word-with-jwt-authentication-nodejs.adoc[Node.js] +***** xref:export-to-word-with-jwt-authentication-php.adoc[PHP] *** xref:footnotes.adoc[Footnotes] *** xref:formatpainter.adoc[Format Painter] *** xref:importword.adoc[Import from Word] **** xref:docx-to-html-converter-api.adoc[DOCX to HTML Converter API] **** JWT Authentication -***** xref:importword-with-jwt-authentication-nodejs.adoc[NodeJS] -***** xref:import-word-with-jwt-authentication-with-php.adoc[PHP] +***** xref:import-from-word-with-jwt-authentication-nodejs.adoc[Node.js] +***** xref:import-from-word-with-jwt-authentication-php.adoc[PHP] *** xref:editimage.adoc[Image Editing] *** xref:uploadcare.adoc[Image Optimizer Powered by Uploadcare] *** xref:inline-css.adoc[Inline CSS] diff --git a/modules/ROOT/pages/export-to-pdf-with-jwt-authentication-nodejs.adoc b/modules/ROOT/pages/export-to-pdf-with-jwt-authentication-nodejs.adoc index 526e8f9935..cc93a3a11d 100644 --- a/modules/ROOT/pages/export-to-pdf-with-jwt-authentication-nodejs.adoc +++ b/modules/ROOT/pages/export-to-pdf-with-jwt-authentication-nodejs.adoc @@ -1,31 +1,33 @@ = {pluginname} with JWT authentication (Node.js) Guide -:navtitle: JWT Authentication setup for Export to PDF -:description: Guide on how to setup JWT Authentication for exporting pdf files with Export to PDF -:keywords: jwt, authentication, exportpdf, pdf, node.js -:pluginname: Export to PDF :plugincode: exportpdf +:pluginname: Export to PDF +:navtitle: JWT Authentication setup for {pluginname} +:description: Guide on how to setup JWT Authentication for exporting pdf files with {pluginname} +:keywords: jwt, authentication, exportpdf, pdf, node.js -include::partial$auth/document-converters/intro-and-prerequisites.adoc[] +include::partial$auth/document-converters/nodejs/intro-and-prerequisites.adoc[] -include::partial$auth/document-converters/initial-project-setup.adoc[] +include::partial$auth/document-converters/nodejs/initial-project-setup.adoc[] == Setup -include::partial$auth/document-converters/jwt-setup-document-converters.adoc[leveloffset=+1] +=== Generate a Public/Private Key Pair -. In the root directory, copy and paste the server setup code into the `jwt.js` file (refer to the *Configuring the Node.js Server for JWT Token Generation* section). +include::partial$auth/document-converters/jwt-setup-document-converters.adoc[leveloffset=+2] -include::partial$auth/document-converters/server-setup-jwt.adoc[] +include::partial$auth/document-converters/nodejs/server-setup-jwt.adoc[] === Web Page (public/index.html) +Inside the `public` folder where you created the `index.html` file add the HTML setup code. + [source,html] ---- - TinyMCE with PDF Export + TinyMCE with Export to PDF

  • 0V^%QY7|c`{~V8_Vh1N1S>`7 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 VC literal 0 HcmV?d00001 diff --git a/modules/ROOT/images/comments-delete-comment.png b/modules/ROOT/images/comments-delete-comment.png deleted file mode 100644 index 243325fed1b19ac0fa58077f27230d962a131e1f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 43382 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½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 NB_=OgFKih6e*hq=M(+Rs diff --git a/modules/ROOT/images/comments-delete-conversations.png b/modules/ROOT/images/comments-delete-conversations.png deleted file mode 100644 index e94d805b008dd73bcb0bf93da5edd1ea1e5ed44f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21163 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 KRV!2;zx*F|0?jc1 diff --git a/modules/ROOT/images/comments-edit.png b/modules/ROOT/images/comments-edit.png deleted file mode 100644 index 88bd128299b13d4326f4103f51b6069372cfad18..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 37432 zcmZs?1yo!y*ETvpf#Pj(r+9I9EAH;@&R~Okfl}P1xVyVM#oc|7!QG+APv7_ZzkBam z_himGNhaCJj_&#o&1Gn@$haSL?FVaQfVO#oP~p z)DKfn5;-&22*)j~b#3v@HXWmDk9+CozWW=_XB$W{&2&0R8x+uVc$M^!+3mW)z5ae4 zP>;_Piq8~1ZB!ynA|(|5PH)%B={d=tjm5jB`!|c@N<|5%U+ck3`wawyz|9s z6d!wW#W&JXv0;v~RC%)5j=;ZujbiII{i}fr(REBd7@IK7cgZwPNn0VGveb6hK)zb!s(2D-cS@QwUA6Mb%A zHb_Tw@l{So-a{h-fVXMrt3B_@h^pnRXnu`GYFKg%Uj2G#-orA7_Bo@su;N*q;w~@` z`%ZTjzH{|iy-1*6qa-s~_{D&}3F8k1|4;pNWY7?k%k%A%t47A}kK1wF*hqL06pZQ( zm%>AS8VywWp9~s7e$m@&LvpL}BT!jgS$Gh|c;fg|U4eegl*nPBo*<7COeRBg(HIgm zD{mdcydp%r1IwI)0?V9-dGN_*@3+TSK$EKV>(KGRG?Q@Q8`;HFY45qE8d*ECuZLxs z%M^mS1KAw26r)sJ-~$0^{4Nvj*F2Iqs$mt=2-9gEX;k*XBvNP7>z3&`4=6I_EY9%u z@B_E+e_kz2Q^56;1JYTXpOz+M z@~zikf3ezNpHmz872X%d?|40xNDs{5WZ-1rNbH;?VLj(@ z&SrB~l~;qfXO*n9mL;scM9)WU8qD9@*J~=HaDe$U2*HTa)0MLfJrY~54Q{a7-n7i8 z+#kEd`2<*Ax3DFsDxL&KWbpxzw-3J(DLA3p#f4Tb-|eq|`?|49Q40EAcp zKKxG_?f37$NAmrB&;37N=xpf!n*xd}8|Hug|0n~-@DgI*KL`$zTFw9f68gUv3XqzP z^G-p_N>vl2DJRQgVsFP_WNL40#^7$}@GlpD&zM%^OOE31<$+x zUo;~r$$yf7Z1_nvNk~ZeoJ`Gmltsn=C;NMdpVSfra^PWP zbaQiKaARe#cd}q)=H}*RWMW}tVWEFdLGSDV1R1&01D(nKOXUC35jAr*ak6p%S=j?g z{?Rouws!&Xlal@`=zpL8))Qo9{{NH&bp9W<-Wg>4_YWg80~6!_(tgj%_b--5!O6<( zz2txN1(^B%lk)!)_dn(EG5#z3|5cg)a{8axcUA=u`56DV*#r=A^|#;w03m>s=yz3j zs1rR{Lp4rpfm`MFW-Qu-?K8!&<0TxE?x4tF!96%uLnd=uTN5~Z6O-Qbtuuzcism+( z#JD%_{m%A{&Q2OwM41&giucCi=6nP?#ihAZyPBp?`@g$x!eXdNUM2-f8F83@E*A>M zp^yXz1qWrV29F8gHYlJS&zuL9_b(dx|0nwVrnp-Ge6+O{n_2vG!Ls|^feUR&=CKHb zX0*^8$FKV2E@P;xpjk0oOP6OiUacNesHpqDs@# z35-mPW|KrDoj$V&YV>5YwzT}Yy}2sgS4M|lKX1YAAb+5#U6aMkUk z5cQr^V=v=DUrt1zGvj&;M|cWy3|P*OoN( z(lEPf6@M+^O;~v7qP?h#S0L|~Br!|cxo)MOxy({M3tmV8H+vTUEUF}e_HaIvq zszrQq*dik{`@8PFv4#Gy$K=C?jQj*128SmXpCi3kzJzhl-M45QBw}Y3WXDn9kW?y} zs$#r6T%X^Z$cP+nv=JBF;$t%{sbMkAuB)|G$cMv&FY8g{-935WXqGk;iRwSP+=h4$ z7v!|f^6<;0rFYS0>>VFfoj0_nR%H z9Qpb*D{2V3S#n%yI|t}RhUf8lTq_PBLWUkP$Ra#gItTtZ*WxKMR z_Qs?VX@eDo8g1iRhl)V@&LYx zM`2&6-I%UsGT9=k*zul!qg&%Yjpub{jA-ey~6$SuOOcLA9-|wal^W zCGl6|@k<9LOkgUP2i{*V-aaR0g|jDakFgYXjo!`|U^yO>WpR8Ib<>m6uBFS~iO20s znf=PMRKWdvkwGC7gEMBdYMRGwU#8iSZHllM^!H?CMpql1-PnD56GZEm!&Fr_qaKwk z-Og5aJ|Zb%md@=Q3p>4aSr{Z<3=L7=p27DmR}}}MJ`I=sZ0D8LYxUN$#F5Q7Ohx)P z4kBy-^teT{n8$O6tfk%%&r;)Cal}Oj9$9oMH$mHnePu@*PTPV%FHa$<fT9#3T0%~p`-cX|fNeZw2wu3P*)ZyN%v_sY4gyI0Sz zeB{-#Rn=U;;ICWEE>Cnh^xBQ7rHkbm+dZFd`=SNQvSYNvu3*c=$9bs{sYiXgibLZI zOBvRQK0PHrp()}CFW4`U`vSJ2HSZ2tEy@A{H%+>rx1$}JulE^?TO+lLe|%3|7VPpg z>E^XwIB7Ymo9t5W45s;bIx=sA5zSI&HEU72xIsYf3j^O(Rw$cMnN+1q?+q}OL}HBj zUAJH2agAN_#($mr(6M$-pTi9QuVu!jg-HFw-RcP%&(|u3I3*kQ7ZN)ld#U+w-0NRf zYF&6W=7iKLfX)N!O`^L7e%BqU+t@8)ux^*z6!XeKvjxNYtpck z>fyh7VC~)6H+W0%@=59T|48z*$;udt?dGG_XP(r)`En6X8Gqem;`?P~3wdTmE<-@% zd2g&iyZd6Fp`&!QIgv)UHFdkPiBfGJhcCed$D3dztZbT`uTGn_V$R&o_Zo0iy{T*oe~W1~ zcFQAg?l;zB?Fq=X~$HV$D#+Y^+!)eCAM>|m z9xr87qG~|3AqfDr{pI=j8_Qkk1)t~1hk-0U5evlqg1?>uM>yn;{@nX+<4GA99>zt0 zuickUrfi9{dg)I4Bj28x22m#BXn6w*Vcjog$(pn&4@N=`vph=CgsbKw?^3-h?y~ z4+>Bn2^DiC5Oh44CLzA{C4hAE0YOMiyMhPaQ2P=+HRPEY$AsprVj+dei9qOh!stj^ zIV1_fzF$ny8_anP7LR{0A!V3`y)ri(&!B1o!~`D@K}WbXAz6^v(mT~n%WKDC6;mel zjYy|oD3FGTm=jj%r6tt^`zTX+?Z3)paVHBr8U7L-Rx1DUBJhNMG*#K4(j?`Mi}tVb zAS;s3-G^9848WWqb~{NMjdl^FWV*Z!WCsAYKY?YrdTf*IDbDj56OC%|Cm${lAQ60s z>p<0V3=i+gRc}6Zx;{879+rd9xC z+J7VgH8-pCZ*%;i6N3Tq#Yd_~9{<&jcDxky(JB|~fI12VlrxT(Z){fD*@as{ z0GfAEdc4wU(SDcH{W2pYX3*jvM_C}W@m)0bSG#+jS-8}H;&*y00nfzfD zimFT^@+36>Gt;VoSzmhIc zRaioq)Fl5)Gr4-3Im*%F6#C5|qlx9g-@acGCI!mZx;%SkE(4x|b1Ew~mayjg2u;47 z0#YA>E5h2Lab?lrt(K=|e#{zR9n?|6fBcI%ad_ZFxwkcX2pLb*6B=C{49PsW{)A4D z`^JAyL$BQ)0pSvAwC*!VPVM0^~+q}4}ej)N! zNkqPWw{+-c`+V_Dv9Qp1HDflbt@0@IFL7-3IN#}qC><52*W+`){Y+nzf}5UKk(uoTXYA zbP58rw^C?}ZW%w1{S$de`tUAPv|FU1#pRIG(KC^n=;J zuS}}m^pJ(e+{=ti9y-MX** zWbZwe*RRN9wV0g#0gF^(*z;p9-;vDR>Ja!A5LoX7vF34kVpA*EjMe_h8NWOAWn;+d zbiFN_i9{tyP_0bA0}s;zzi_Vv!tx)PIKqZR%O6H&aRiP!h!D}0=9I0N>zt6J=={_| z!}qRwx6*~cX8}}s*!t6^b#9_$VARsx=~5TcIGU`Sk};u+|E@jd%fWnuPB#w-3t319 zPWNnPWEDz47BC4Mg^-HuEK^a*N(j>XiEnkJ9P%C16)x5;U+2&Mx01(;LaBhWr+8+9f2vIc9IzAa%Tp?+ zpj~|Ke>FRld4H&8{8IhCwSPjbx^*{TtzxcIYV}{}=f4n&T9pxy&5+H3mfa9=rf$8N zZ}%@G@-OtWbdibkebP54{?h_!8|-H|{)KY>g+%6UQvUI{CXGU_jV6!O8-Kp6#d^U! zN;K+aa*MX}KlLeqyMX=D_|~r>^gt?^RMX&Nw@Z_@%7}X*^<{xAZ13embrB%x^>U9N z;UtT`g@xt*zZxi~GE8?}*`>y}OpWb7zRa&nyuV-Cb+L*XM!}7+@D6?2W;Hd;3A~() zkn!U}T#NS_8?wbr51wx)| zhDHe+ume70ue5jo@gA$O z+Osdj@qlzx`EPNBQpZ}{>Nkmc8@Sydbk>%K(1Um~me+qR^=5^V51SVU+dMW!;E$M1 z+5HFEWAs~Ci+eyN0iRH^hYGGO97@Q`cjt?r^vg1Eu?CfEyIV_6Xhx~gV}3al#1zYKYbXfPE$ZiI=`2CpD7?X5Fbp6RFf1KICsa1E27KD}OF%$y?jK~e-?n@yvJtu zaD=qNYWcApemz@!@w1Fswg zs1w<*V|P&eaAGf(yOoG4{4rl@@p1RUV=%#r)&0)7TsGkH<_0WRF1A9bA0Y zZg(%~x0|bmN~BSnK|sdmw9BE8Nt%vY|2wp}7($~~E<~@xRuo4O#%=XU31&ElOu}lb zcOZe*LSDX&e$>`3#wU0-li7qr&#cXSG-)eA&>%a%DUEYbztNk*ZmB);YIj8HUBn;R zTU^Sq;X-`}}PloV?j&Bcx1U99!dXrMO^i68ZE+LRN{+sWW}lfRs} znYh@9=0A-Xq^%sfrONUa2=X$*a7aH*?Du%TqVHDbE zFcgI=NcaDjr5G$YrWjXkLhWzk$HB@%v7esKLJTYqYZGtQ?*)}2pSIZCp4>gJerp`8 zJtFlopfNH5?vHF>thTnz*eo`LAIEj7Q*@ZrH60S4RBN<-Qu(}?Pq)=S6SSsaGwS7r z##<;#CVHNztXace&ab%O7i&ZVy&*F8UDpD3kxNqVl4wx~(IaujQeD*Ry{+K;-WqWM zuI&XSU5n8sAu1)tu!OdzOO~NFp&}(z?mZuw4*l&5mA5O37I=w6CESq4=ddftL=*hJ z<3}umY}@;ZY{7x>{OmjH{utG+)!DNcoAaIbyG)U~bYiWJY97{pbK4|1MG54eG;U?M zzst2k_s#ok5Eb{ZxH^wXx%a-P2eLcp<-H?>3}@>iGQ3UXRmuZq7hpWU4{5(K0qxzh z@pjIVFjftEEul_{-_k12XavS0`CP;B=Bh+;zCucr`aEY&TbmYl>P}q_tfzc zXN~?PxZey0o#fLrACe2U2f~KV!xaRwGuO`xa>Wp(Qi}2nQls1I?X)=-hq)#XN^1e$ zeo>`CKNSOMXAxbFH*^Re>yCo|g(oK))Z;GlWx+{-fdjfkF*V)A_vU4mP~a zh63HHl0RZ0=GrL5a^_DV4LNG-b2}-Yy!OSJKco?~$<8eQT!CasIq21s~U!@%*aiY6Mf#s#=uBkG-SukWtqf^KS8C^{BeY+-x z`n+^f$P(j$iCUm-ySQ58k$4^7go59McrH)4^09efKo7#CfJmdIJF|InF1%7_-!(;2 zb*G+Ap~@oBNFmHoe_*{(EI*1hmfgwNE{}vo|E{=ND?_An=5q9CElk%r_<9>V{3zwW z5;qAqg)PZoTH ze<7SB>J=<{J6J(&!qG>huU9^0$C4Bw(2C7*!`!fD0q}si@VN0>W*Jh=;7s_E!UZq8zzT|ty%8h7N zh}C}Ox@xT{0-k^^bqDhW;Yci5NdGK-;gBTIs%CWHrym!xljUz23`QE?{RyqZzD>ez zEhhx4-hfBTH(y3UnOMFDroF1en?s3n9!uzhPJMpMC9gmnS(%~1;g3s=CTK1lZO+id zox<4MG4SY2BqFK_0y}314+tv1PTkndhPzIZ!->E^4u4!m_(i2n(Xp|}X(6mBp+A6$ zY0vPzLz2&ZA+h#~j>^OJYl@Hgy;qh7&s#qEQ-5c122=K8$K&~6u3{`Qz172+63;3w zpobh&C3%b0Y_9eX$)KaGtOuASp=IrWZ%}2BBtfRC2kmXWJPm!Xh*r=UH71cG8KZvh>yraYtC!B1l3jmCil#=fg`0`Xomns+1$SmKEZm}cs~~DQC$93c``^^(B#kP;|0$DN7%ZtA&EkJvkLZS4h+^6w~|ntqwZ7OYOOaEG?QK{=r_D*5+c74b+az+(OeFFqRFb^zN>48 z;D^~}tno*WX09bLlTR=y+LTw|pmJG~(T!qO=gsv!nbq6t3&Y&rf+dN~zlNe}wMQ*)fp=%TZ=MRI&jV1!$hTIOY<%EWwm8WN8+pNA8(aZVbk>c0}xPQBinuzE%Kk zSv>KTn6J$?oL3(NJfGp-bQ?L*Yfbb`KS(Ki&cDsw_L%X!}(re>rXjiZ-iXjz9T4-hLdJ0E9hSIke`? zx0vwa@qyX#IPctOR9ea1(Ap&3uEMLjaw?9K6f^!*lo-K8v}<=WVtZ3-G_uXx>Bg!v zW{C9(zWg9MaSsi z>xTSS-g_swsmwN+&iaJ5KN@V*k{>~yC3FfCjJjDHXiVLad7J_`1KG<_r=FM@6#`$G z;PV2?OQC@DhchOjt`0$~cT&cuF`MDarkj?B+8N9$=?M#L9`L>lr@mA%EUa`N~rLReh%X#-*B`NXeY9#)(i?%{8At*)A zYGq217MXeIf->aSE)?|5C$$M}*e@@Wq9em(t;M%ETIn1> z3^#PfD-9F~#VyhOx`>O7dS1*GWS8i&ZF4o4#ttFJY*c+J^9A0tD?A1fLd{o>+tiCl zRb%(nt{(}_rZ*5L+!CsZ((RnTo5fSn!js+;0s*XQjJb) zCFV$S!PD)LQfx1*Sd{gA=|%DRX2SU9W)4g}j?_Y9)!3{sSlpZI*ZzmhJn1MeZ+_;B zNR48VRfnWyjZUYbc&etM!dtS><6D9SPzk(1LCMV1K=Z@fu2^ZA`=;VnmWnr9E<2w~ z%vS>1APm3Og!F4e!ye9pfvgh|ISC($*um&&+00|i$u?Jyiy~#3OwQ)z#&{=oD`^dq^bxTP@pst>?@|#sVkU=8069DY1aNgrPq-*TWKuPg?MB`A$!QHOTQaO!436_ zr0&MPFK40}n&a4y(}Jh_Q4@$e^NOZ(U+T2Wr^S&~NjfnHYi9%0ucx*yW5cjJi~V^+Je^7N87EWt&rnrZ8Bt~vZ|o?RhQ0N< z5I$}~v1-S>pL_#DPaE9)uc?cXGe%bpBYI&`O&)wOqYyHQA=Vhye&U>>Rjo*9TD)sh zktBfj?&0iq^1CLX#ULfFV~5El#gooq>Q5IVl`is!y#6F0EcC48rHHm6V}mdQb5I#u zw3q*&zHYmD|i z$c7E|t7XcAdlH56Wq&e^Z&dp*JMyhogKHru}8~oRqPI;RjzKs|`zoQ;x zcvH8?-JrLQ46EZO2p_RC?qss9c&DzxWu((2P*3^Re%P7m#UtjE{B`?h8d(FRiD}Nu zZKVc+fw1WTkLw}YYQSis0B^eK$94k2`dVqQ0v=A_aoP;P4e`QGernh6vbuwZyH(q+yz$Gi|s5r;^T}y zfWaD35{|w7O65dURzwe`>f*A6WQ0^JYl~p4G%8y@WE(!n*Dww6&}I!irj4b~9mseZ z`nRw!1FdEAmDtLnCfv{us8IY0y2Ts&+ZR9jt|skGN*@^*%k1nESO?ll{;JNMqnRT= z))D(wsHl(`L!%=9xB|Ls9U8La%HPTIPltV?As$}{1zwQpq+mU`vv@={zA~yWebfK^ zaG;SlL`BZ!0{&3Uj5I_#@iooGd7s$cboO;(F>`q9)>0^tKnQWqelhmx=D{GEpkzQ! zu$y}&2bT6{3?rPs?1~)#6 z5KN_+v<*eaE6+wGSCLl?)MidEgh3GtqQ2!iufyUIYZ3VY~YF2T99Vl#(K3TIK(4k!_X$Bx<5WwYRnD zmKpzrd4)meK@~v6?2Oexo$tY&7gDz-(7gD?@u%}3z7ZHEle@F21G81`)aO8Nb~}rEM^;2LLSgBVG)s%Z}_&%ey1O+aK7}65@9l^#%Q4E zOFv%k7d6^xU&66*|LWp3>-6&IXq2iI(U|>%5`?W!jrHM6g>J)7!BuUA77s|`Ub|wE zJQ@;|;kUcf=TM!~753q@+mK+!GPMd)zPQo&5C4!IyL_m!mKgZ}_6I}yMuLVirDxcU zQ2@IDF1%;?Gk%?O+OzTfDe1obBx=|WLZ@##Uo*CwMvY+UUKTR16p|IG-4GyImjFc< zn?XOH((WAc0*f^yO+21j59vTJl+vyD1<70^pCce$;NDCyg++ztByZqIXS50k`6;B( zmASv4A&!+n7{tS#*Y`PS&{x75ZP(@DQHl1>71PjNcYmbux%@nFtag17*KaUQ&R@TO ze61~?-faJ6nnh)h{ormBchg3UTGaH@n;h_RF#GA>vj{& z39#>?HJWZ8ODMvglrY9+rjp`apC6#<(@Z7AeK){iaPhl9kirM`2@rj+IP+CbGAF*? zsj4koB8B7Q8di~%(aG#Jllm6)JBgs)aP2fd0OS{5%37o&%j^4=sD6KtxE&|-j4ewJ-&zs@>V%^^) zo_TMhy(V)9=T^PDT5L8W#5XyAu{b z1#a%hnK0F*VK=L`ryTT<&CHjpf0Iu{2Y>L< zgF%r*@a5*Zs@{D-`|2Jt?s!Lt=~s_fHeW^u{#j`aI47I#ba4hEXmd=?A2&_+q1{cL zxM!-^X|bYJi2CWT30=E=`G+I@15lR1Ilt>DmH5tw!2_6R>q;ne zzZ2b{IG5JBQ0(=M5#DFxdYmi+;W~>>wIxDuhzs~^#eF&5Y-YEF&H0Sfs-Y#^Ykb;g zcYZhDrnH(4d6ELI_@Es!_B*3ex8_b8fM)w){GwOouOaO9C+%=fgSyI3*r@GniiUS? znc1H_^ESgL&IJw5@1dKJWoCJZg#0^DFQ>%B2xy6f){j`AK|xgE@bJskLE|vdHw7`^ znVVPeV(?&`8vX~x8m_%RYM-HJmXM&&GlFF_rULIb$u6B+cE818iy0ml4pBY_kNg8; z(NM^5tXN1GBc1>_wwsIYSGr;QW(`In*Ee+=H@Jp}9AW{2ZhTT?~ zwU@8e3WuF-6#*DiOA;J47|r|@nnarZgeYY@SGpFBvv&K5zJcz9jn_BBzha@qC9lFx zY$1~AbMh&#*;QVh+h|h`E!cn%-GSR%u^E9?hGCNM*E=SdmoBX#;ss?2-{} z7J@R{n^4p$(Zw6e)N+ON558>94j=pghrp6*ish+>l1?C^eWKH*?)t;o=wr4MOzw>E zSAy7AC<(Ev?Qb6oqE?eDis#{D=a-~-2_7RV^uh8Tm~de4_d@W@fLWU$9RW9_$^IZ% z1Af}VAR?EHYI3Igb+XP@eYBiyG?y7x=9dTua1bGDQQtG{?C=g*Onh+0f03S-MCc>_ zaKzs`6VIGYl8s^yw)rZZ_}*0)mwGynn5~zubJl0x+V!Tt>6)U+pY{t0a6n5{H5JP+@7wL-Q5sc}JE9X2DxJ0H7aw;$rQm6(kGGZWTPvm=MH9%umZ>SQHe3BEzG>A7 z?Lczc8~VOn2k#J0`KP8Nys%!|($R6rec;KTI8A7G2g}eN`NCQ8<7ozb z%SwkPoRq-l=GIYU?c^4uNGr;vRSeo|(u`=qzhOLA`Xy>*s<}wE$+mO3tSE#RVRVjx zncO?n8IVJk1L^&~IL(vl%JhXC8=k!lOOhSD>MkZIyJk0lK8<0BXTl1JNFfvfOYwJx zpHyeS{~oIS`gN?stf>yyBb>ZuZz4SL!Phm!9MN~JwTFOnfFv-{KNeCO2(Nrwltm%9 zL8Mq@6rGx6!#h+EEI`k8=H7ZO6Pav7u=sawyA4Spba1lk^*b6rZ;Uo)xp*3>>nzMV z&x}8(feCo98&;6m7j@%+vkqn`cfitXuvKQ_0T)F#1dhPPz!`wbMNml~rsTyvNxj2~ z367~H^p~&H5n1(nijBGiYUAWxPYnDyYUhhPAnu0wu*Nf+myGOLU8MvfAIRbr*I=a4 zx~Ltxo>UwXK~w2TT>xshZcOMFUPDUSTeT5F?O4PnYZ0khY?Df&)4q9j;3m%hyIh_pU^WZ8zJvZ;rI*b2o zi=&<6mUCrFIQGFv4-DvWR|;3`Lq%5?F$5g>t1cOtv`e?e1EDae22Fz~wTat876w4e zAagb24}1)RI>QsYq7(wWAIpvgR!ni_1?c2J-H^J6D?srqB^q(U4SgGwfOd_MLF!(g ziYxCzX`uO%$EZQz_ey}&<^9caQVPv0{p?Snko}LDN+^GPAr!%O91k6h-(4ZV@4yYD zzJC-;pxSk7Q1*k7l1)u+PL}JOlM@~NEli+y6@3X&TG>K9^sd1(3DD?J`RPIfU!c2p z;bAy@qr74_5(O$kaavW`{VPkjdN?;I!Y6UY2fX=VfF-4qpVmZCviWj#r5|^l!WQtN ze~pykLO3eUel~*F5PL4te#7}TS>a5Q<4rC7O#an7N60|F^z;cmCc{9)fvzo*3;}(| zh|K|=4e%_?E!xs=>Q0;)egu_PebO;l!G-D)p_ETEE@#zKKok76c?)lfk-r_rF_Lqe z9mwBT9nS6N0QX-0oG*u5S^OvcQTSEKuw0nTUUZ$R z`Lh*%=DS_gygx_`eWV0{H&T^g!6erK#`7O7zOv7AZ{^E29BODsU=AD6n+uw8!iNm~ zdNP;>j8Kh~zyh5>=6cxc35Ah3{?4Ve&J1iRrl?J0JI0uBk|CU=Zv^AM-ce>=6z2Lr ze#TFC-&zZel&JCD;)N~H;@Kb7&(|MAbB+4Ovwc-133|cK=$J0QC0Xy*DMwzS-<2AE zXmz3bsWWg&T|_r}TTPXwk@7Zfc!> z&)5i;n9I8~VAw}%xjGlEHuqwSGKF$Zk=pg&&i}xv!WW-3Ei{7X zkf2c3u5GqR^tE9-&B$K_>GWQ3aMpEWL0-cU1-R4qh*&_+FAc#)Y7E7Pg5XKJH zb~zBg#-d9~X}douI3Ii!rc%goJQ`wHt!R;_CPxVF+c;}yS6)^L4*IiBfYQ7Wk``~R ztx_{$Cd}=UpqDu6wd4*9la$+uPSDvZk5&;Ll2f!Bu+}O5_CJcaC&lZaVgI9=FS1x<#G|$1XA` zb;%hSTB4I>73g$?Z7?sB%a=wxs;{8=Z#;ItzuSBz^fz5&N2h_Rcjcx~&ggHo83}yc zI<~v&EfFa+U&!UsM5A)!IE+OSC1F|x$gjp&I1wP|lbVZd^*``yV}bt8!c;KA zB~z`tgR}wN!- zgm{@fV!BsqwPgw)1+n7jed1lFtwPBs4K7m|H+NH7E{*iKe}JIIkl}Id!gyXLE^>Di zy9=8ZFaLhTqZANQ_@U~FCDrxg50b6qu zrKTzHwCnuz+9Xx)bPHOk1ES8C5=rwDdr04*1DO7B!{O8`R|E1m-H@WM_oz@-U5nsc zN~fbBvpCt5(@}bV4Pf*#%MocJiT|KyHl!|3> z3NP?*=+3q3VZ-A^ux>f!_^EK`pw1?RPGl0qYCfLh)hf7ct7ej=cao~!3i^gR&*0%9 zlw;;3Co(wUWT7riI!OH=Bb`W$v-B3nm9(Y-6{8BCk`pnS(%MA)Vr9(Zkt*4Or&7sf zJa0XT3@#7tOIM#_80+4AD|z5M_F~+1V*NPcH^69Lf)@slz5DdHMzCZha%JdN@Le)r z3r}X?-l^2>P=9uxRJ`2b}MU|dXVv{k`SRL|gZ(RMtRX180`y7hcOxIIm&`La=C z!wCBdhW|~uVrs0Y1}WuGCH7+xwj}mCf*ojUA8inLez@jRYqH{P(SyX8?4Nb;Xxc5e z>OIJ(G3z|zTwp@zickp!NbiRa=Z3*>y5Mj6X15MsHISdeba=z;g2J#dRf{ImRsP-) z@484<>AQ`9H(O_Ytmm3Gkr;O|efhwoJRbKiTiaDxn7}9^-pad^^{S-=5+kl^sqYXv zeXa3~F3IQmiKVC#*P6=Z1d`X($tu6+@n@OR9V&V1vu|9Z^jALbAb-OfV1H6cfQ``z z%w;Kf5G03rM3<~_3c_m^bUBJxsj+D?Mh`(vV(mJ>@O6-gB8tyiy9hA&6*f-!q&_i) za8II&u}FM6k;z}wERn~c*IM4O8`12};SQWaf9T0U&6WMie|l1z`@GZg=g)vtH7fr2 zZMH*;_Vd~#mrEsN%2OyPVt1a%U=-A0u}kn-mjOeWB!3wag* z;nHRNm%>M3aXy)PQT6g?jR$q$OenO>T;U=-a_suh6to51){S5hG%SsBpt|1U@5O9{ z_`)N)nR~(KG5SY~!vSBIV%PXP)pAReqe*)8X1~SCJW@>jnfFU%88^qAw)uP%HnTl} zAp`cv(Y5e!>bXZo8Q&~^udE?ylDsZ;oK90^<~4=1E3A9+37d^3#C2Fl*Acd@>#ct) zALmysvVuRl1e?@`a+;dG-%-!pj~rhFg*`X9GyLAKp-0oB%Y&LC?6TXv72Jd^c>pBmscQ_*pvP1DHv*TsEYb*PZ zKO`7R)M4St_~DmM4Y7TIn;BZi!->kxV)OYyh`spKL2TB{S;t=luSAwlDw%-r5K(h6 zt53s!j=vKMdT1w9Mb2w9r%8gkTM~)39WbPj0`a5okH+*MkXjobn2m>K{q+^lVXsFj zpB+{rowC0$O@iA>zp-&Hh17VOPI`N4aYHFRP144?en=g*a=b~SEfnbT!VH&re%y7r z_q-oU%N$o!tt_av!jVxU>iLVr?C?0DCs;mt7kN@&aPTL}QRpVa0_+-7rEMi;I8jHI zv7Y$#YwZRGemuYd;Qz|lC4arAkPY)Tkt6YcI6KGp$eL(xcWm34*tTuk&SYZSnoMkK zVkZ;Zwr$(?+s`@I`3K&sK6UTft7}(Rudcn;`rVtTCG4#6iu&(t)%hly)x)sM$pE(w z$2-y4>b}74_fgM}28(N94*H3F+mHPx+D!H>^w9^_02`0$c8`EEv^HDY( zwtdPsqZ4A>x3A$o>xVQV?$2Y(wJ5`1mwjbycLkg$ISkn=5-l=)wXZ7E1FbV7c1A zLppX)zSpnka+jaCaHQa{7{wpxU>uNX;`gC)iy3G#x{E~59XahI1|*$T++BfU$RRwd z-&9*dT5a$reO>okl2a}-2roY$o?-RXTkaNdD{jB#lFn-dKl3vhI%KOgs||wJ@-dkO zFFl;ip2mkaw^jEbJa=7Kv*4m>RJy9mXa9z>*`quiurgNYk(ZY*Z{r5(+8qs*&Sc0h zjDK$JF$&Q&0}DtC*)8i9ll=~EEf(8}v{=r4YIpV6tvAI<{+`0G`h9*fLO~Tt_s9uKf7edK*%b;;`6(XX>*G%oui^$kIpdeEbh%mj=Z6f`i+!&_8;U_6%10JQvc=$PlMDQ}P^vjpd41 zuLtRIpWD+vHEPjs^e%B({Vh>G?034YgnSR8u7=Z+hq#-)CWq%-lg#qEn?+mLM#<91 z0|P^45$u^|MEiq&=a@CGK^){Qg0*md6h8+D_j&B8#u^;D7qrmBf9+Gk5+TTL_RW;I_xD^n{BXX z*BdQK+Z2j$nd5v_rlU)pcTY8%C71}u@)5=#7Ma-D+|Dr+AFl;bOU8c#T&X@#luPuB zoXB~aoY_O`c3VAa^ZV)@gLxh%Q~S$=Kamaz=ehlG?lIgoE9ScSgjAwAOTYH!kvtb3 z5UjSV8)xwMm-LMOHU@Wk+<=IlMRHsxgTw&E%q@>hDPCLK(Z$nVG7?tP_diD+usqvf zHx8)hPi_S|U#kRC*BUKgzUud{q@m`p(XRYy&oQ0v2pl|&+W|BW=%e5cDwZt zg(YG%)lcjHSO7U-RX!0%v$yke<$FH}(@jFc_k_vsXO2mSXHIIn$BfjT068Kqwz>0S zz-)g6>5=l$&g1)RDCwB|2h0BKJJ+gI7#!@o_#DU;W(u{w%viJ^V*ArY3BzTE>^Mpl zPf}UL4~zr%w+HPuuM1F!WSYU-s>4lXx4w*pl5780;7(}J6TP#6Y|vXebd!tvEKlbB#vxROF1S6cf|WOOk#>(N}$AgzZBYfRlOdf^|}$QJcgotMEO zgQB^jATk1Yue`9ktDWW3yy4vAz&fMy^#(%z#S$#n&SM4~1pcw3zl@T8vWY+G3IT$I z(59cs2lET6~{MPsPYWHJc7_*4*Gp-YwLaMg&X&`RNxr2xsv4QeXvu zPF0)S|0{lYC-PU-hm_+&KfqnAa8UIvSs`KKjM24QC^v6$&XDZJ%B^c#maCb!?3;YE z+)j0va`yh14I8*>3cRF&0BU79s&wZv*cFu^t|0q==({+^VdC4UaBhx5B zg8jJjqwF?NcW;{MIH3EfIwp?Ee0Z=)cmK`z?T#mPcvhwoEx>t=JM|Xy$pzgNmB^`A zsic=L+mkf?6NPs`y8q?-V~P@R{!t`#ws^^KHmH9tTM0!(M0EFvC(Vsh%Ipj4bT(^( zFrt#W#ITnRhu2zJRUk>|7tr2dKmWc_bv6FfjGaUE{YZIzlT>cPB3@#h+7*)ud7POG z^ON!<{5%22o&%=#gQYQ&Ns{f;^RWfvP$xvOKafa)B+O1+rl2(Z4*}<&g6vNoa>0<+ zxidRaU?A4Z-C~*Tp;MrJNV>w`$t8oRP1r3Jw=Y(c558MQv8E z*i=82K>+95!slAxP6mB70P+)FIBm9+Z_TW`rbbo0ct(?8IAt{lmSa|PU+Xs8rh14$ENF%CGvwGN zdZbMAZ7co)#4tV+5ij#>19=0C&(j?%hMSYq#Qy1PPTkJWgu77QOfOhey0TR!?;K{m z{L|Y>4sxD*jBzYkn%>!Hzn48n-~;Xh;IpJl`Y%`OEmptKPcAaJ!6pZ7OF;PaJ$rn9 z7)IYD;jap3N!BpSgjFlU5N69R*p3P@;IRGb?IYK7o6^$fINI&s9K7p2EK~Ufv0EC6 z+g5|J?#?5R`Oh;nOqT*~#lB=ZO`Lrd9z|^~qd0gF?`YDnXFg&|2`7hPwobeyO)!o^ zj&vhGPrX93ev>XFgUyc0vTC0JKNuaT_E7~EoDAp%*b$n|Z2t0%W;>q9WJK$`cjm+- zjlw=$_%LqIjC}CKl{lR%8c52UWISK8{ab%Ltty*h*v{>YrS$a?Xp>P|+-a6zJC()V zs%v2Qfn8Y$7cqL_d^A;1AQ`L7+=SB%Z9iqWjGoj094WowtkHoXu-tT_AVu~U>oE>* z&vJ#P=Eb^E#MS49C)^4?`j4LpGI@Cow(A@@RWnJ=p%dhM8a3L}`s?fq`JSvah5~66 za#qHz#%8o?hYl7}MEAg4u%Z8a6p^>1`C&fGKrS z_m$5{(3XXTpNt<**4})Y{u}+Rv>nwA)VH(7S9>k@V4Y9PJ^7v|^@z*QS5sxPWLQ^c z*Iv1`4Syxwndt=!K~fF$b!*WcimqArvv2^ZSHiz1kT-5xSlIzgGZ=$oKkznNRd#Ky zYq(k<>G7*wA(q&vR-U+^m)YJbEqnW?;J#i~Kaq#0kQ^Jps%ZT~0u6HY`(1INmrs8I z>$_TI*QfBn;IXj-ayL)e8gr*IE3zu}NAYw7GQwgi=A~n+T{jl)$`8k2Ex;VKcd0ji zu&luOS!vhJpN*C5x45Ocnv1p2(tliZI3QU(J7W#!*Tt0GDpGIc#2lq-2+ouY=*F&D zb-i80_}_J)1{YXwJe;htGt9XhmmE&OTAZ^dV~{bk{HKe=Mlh>`gzqu06G7npPpn`0 zA3aF>SQ}gVKV>M3HW=g%i+0}cY@kL`XlWKGQmwqFiz54+a% z0D4QFm=dV}!z)+<_LS2oHU3ZX8RyDo1YkJlgCh<9&kBV#uqOrW!oUCFH}C*Os;RCy zq45L%SxE%SSs4;BtXBT3YBVE2zz!JaneLM^`OnJee?3QG*)RSZSY6D2gU+@vCS(4O z0%7)FPqR>5HwiHJ49I_RN0(<4L8;B>iQ_>|=NN|i;^SwLByD5XS7_G6jS!+}suoqe z^FiY})B8;+kU~dS?)5r=6~5o@?Cn*qX^SDl2}hdMVn5ky=jdXA`5tZc-%R8Pe;+x# zr+j!^&yp^{dZ1uO;)6vzhAYSNen{tA%{VXf%ozVkQfc9b$EY=3HhAcpk5vwHvxR=H z9(N3`;a9LaZGo*iz2v)K8x38bcP)zdzGyeH7+3}_8K>xyQTA->mM*AlUQbt`1;3TJ zwed{%YLoPvx;=jV)6rqW66fP4Rl+T@^#~}-O?#DKhnt0uL|LLQ&i-`Fjmeoif~?<7 zQ$~0l?gIG#WnKRq(dz*B+w{fmf?pBkYUNV?AN;~>0U|YU0yKfudTU5xElbAL7~=D% z4m0O=%zYa6TjH}Fu7p{%Exn2*VdqJ6!Y!MvvYPLK3Wn>4bAHgxB^8z~EgQijgQr~K zCt4N`z<-|%h5Ncp8+4a46fw9{iP^rxq4@LTLY2j^kSs9GPg7NmwSNFV`LFwD7h(p-L@-)=(7xcfo zzjwWh*zeRMB`x4mKm@^ce-l~jFy;}L5LaP1iv9?~dP)e***HaZ6bqw+a)IVYr;9V3 z1B_(zd&i_q8Y)tLxyzVA*k zCh=-AY&mmg0Hct?p>P<504Oe!&&(^W6R{Z9jHB#JG;uagZ56N;ginbpn;O<=g1!DV z7iC}pDZPOn%z@1%pCV8Ld48C~>3F1neZBu>jZ=*%zPRsexTC+vXvuNbPUNTIDWjpD zY|X9?A*-ng+-NkjMsbpB*z&q-CRJqRZyb7Hy;WOXe}SP+^%THDEo-QjOsm10P4G(5 zYc&kuJOgEm<$8yZR(l7Qdtt1H@EY6^>Oa>|t+Gf7lKd|p*zM!0-nwr&<}uVfgUid6 zQfy(aQERewTc5O@#KpzSG%l}|!63U!c-$|G_+Z0mXpr-Zr_#u04SgOF9yerbMjI8b zKaF!s--$frKCq?KfYKAx({sLKh^y^JJhlF#%f+4_E3;ky&KBSOVW)TBYrCboP+eY9 zXZHWuywa#Q+BvHi>d7Z3-hZvAPE$jQHhN$CsfXXI^Auv9m*rTk*H#Rqv$*~SMiGik z-itT(J@<0%G?59O&ptzV9M2j;m^~_f((~5x5taYbaHlq$vM!5oT^v*YmT8&F-6-6R z!{J>AOGe{{c6@uVOg1n^WoG8omH^{K+sSAI<_mmTDU`P)V_)NGLCZ{s6-u=rJ2eQ} z$_bGKirp?Ys+Me53Pr3r)N3Ayh#dhzf3rFL^Gy1ifRQ1`2p<_*wX9#&M$x)1D(;)> zvbJk=^0vDXZr7hk6_Ar_Fn{wpKzF{yJ2!wAx!myNqVH#Cnno>0wTuJKE99eWwQG)>z5#T%N zWn8YbssoH*6rJ6~o5H6Arx_B4^V;{4NN4IMBv3TdV3;Fm_KJ9 z?X`p{bozNQtVmm}1|LUjt|x{PF4$P^>Wfw@GM(Hv1g<9|%H)hh(=1jGX|)MUOMfoM zDjdW;M|V7Xqb+>BFe^xwcXA8F)EA#yQx9LOj037ROEJLC6H)!rT%})w)Kwu{7r(3j z3)rh6@xKWw)E9wj^^$i89B>QIJkvd5E!F&MNEhei{%BRMlg( z)?p|aM!zW#4t<117TtktG-UGla=ahL!3M~{?xgd(2aX`%B5>SeF~tAd^nUKu#n%bO zBxXo>*ArgM?qM=r!iOBLi)hzJed-&psj$fLSFg_XF6(ZqSP#xBhA=C2;V1GFLGbV{ z4FRKjgdRiE9$!@X|_tO(js4$eoU6UH40d3@vI1`(d`}`_3kC1?a~i} z7K6j`oO@e9*}{LQ_G+1)cN*Wc5f40EoLIegVd`e0sOTuN8u<*7R;62IAa7^^#?NT| zben9k^hGtFUOcFgF@QhdEEGbWnkjIV7T~Uxm4nNVWXL=QvgJml`eJp(P23S9{52X169LaG(Vy;&Anbrij zIwmnTC`d*|uiC|g_hPQKbA!>KF6l0%GC{0bFK#^Eu&X}P<*Iueg?y$gQMaH_A9l?O`6AWC?v_H2B<`1=AKOl}=4q`Y zk<-~fuSS{%=VijBM9OY4+?jv7x%0X;og;toq;g|kBA_U%rM&WaQzp3`NV~)w`KZ8C z=`#fhcpY_IDj$79p+r4iLLYaAZ8@QBPN5zYhHu$B=dUUBPf9!!6Ie$#MsaT};(9Xm z+bQ23irL4HQQd6^Xt`SOa~bEU?b4HgG4y0l*im)D_)LBa2J`!A2|Ny)d?LS(P{}7) zrFIVb)6YD6*^bWlC)J`ErLLGfAfhgk2$A*Y)b2iWxsrg^2kh}^FLs7f;q}=<4h4&m z5ATuW+4DpH+#SHU0#p9<-LT}o)Xwe*PXt4BZ2m}I_m{3%NIeOUgPa8Us-1ZE_iJ<1 zj+d9`?2_#|b%TOz#7dW{1a`PWTl_iK@oYkcRG!}48p@AXz}9NSp#!M&B299ccIVl{ zTTdQex!#|%g=+Fb3{S*7Uf;=dUc&?M6)&vGt0bJA4!2E6-1qqwG9JEO9zm~%mK%td z#XSv2gPi3d4ql+#x&38)ci}K3h0?ta#+&GI};2v0HU2aU|PqEhK zwTLTD@U@!iQAKMf{O5Zm*FW){5Q)Ec=uGpljVM;BuS&mL`3f)8U4_VxPh`<@LqbAE zF_)WmSMd9-B;?uWMf$Oa^gHpK$nQt?to$Ssw@Q2F`M zOYFn&2qZ>>;40agpCzKBCy$}WcB4VO4`^C#`tA?q3;)-`J)aaZ>29|}#*Hl9at-Ql z6s?fx+&H8D^(hXimnsv{4mZKiyY?5~x7X!83?h4+Lw~~Ou$T7v7+FaD%@(0XI}Tq=hyId z0wm<0o!|aX$s2-C3vg#w?}RDmKq{haT2nZKPMye=;|xbHDPId{i7O3f89qxtN1+=*5AJp`DpYwWpO;*Z#7OW6?0tose>>6 zD(`x+;U)nPYM9%2+D&uFrS0F1g|7q)u(>Vx@Ls#=lGXb}%TU z**E{8Mu z+)fWvuD`ZZY&AC2&A4apS{-&tCNo%LpRP6)Ltzh(UHS^w!+ci8JG-`9tvM$%yZ@Nv z7rdNDA;ZF1lWg`b9GLtq0#Za&8)?)_<cuT~`PRMe zZ#()9Ja7YK724hZ2re&Yf;zalS}M(05FB~cd_How-W+@+MwXmDYR{kEM?WbtWH%IN z;%6U4Iykx_(J;WC5lNf-W&j&2h)R|3+&vvcDXD!MBn zyj+E%zv76L7*&8smbZ){o$JbXvtW7hA|)Hv0i0YY|lN4Wc`Ro9|)Ph)q5qDyRSP&@Ox???6r@EsVHBQD;e*LF3RK_?NH~HJr2T3Xds}Yc+|PpV(eAS@+JG09!)@+{ynxU@ zhBO~RWVl&&;qaL`P(g8Rowu;~OV9A3w@(=rKrt|5N&cdxxl{FeUQZkSxivLR;JfGG zJyEzlNYYiIu<>fikkM@Imlz4=|FQF+eP0)5Dfqt1j{j^BV@Z<1Ae;jpuxxxfni`XM z%W5D;J**I5KuHjc_ifx23#@(ruW2iQ1z8hfN=R35cqYk$Isp8L*^XYZ-Ak-{W{+Fv z>n-oxGp&1yvUqOjB93>AaU%rb9swL7$z5 z*sDVT0zh4*89Ra&uqJas`)6xMpN7}rn0Y!CVx>qdEBEmbq{ZX5ugC8vAOy#Zq&Ua+ zYAsh07=h`2#C2GiG}j4Hp(3=gIsV}{;Wn%WgB@|ZA1;lb;set9$jyxU;m+POb4XR9 zqJeW%Jv5B0VK%*cvWi z2F3?u;RV!rN9h;S-UynyIX`nzg!!c$_UTt5uFz_y$7%k`+6Q)IWxSqZdMuE@6(C_1 zT}=iEBa{{5@bRZy6u~|*-v2I4v7eVKaM;n#Z%k={I8Hkm2ZV)py&$5yjB?*FPyO1F zup(}~gZkFvc2-s}cr&1QyHmrEdvFECLzCJ-AG1dd5S6F|M>8qQ;MDmV6YGOWDVdRqaLFf zt208ulFP!lLX(toI>y{dP{N5_*92>W7_!g8`e+i`J{7h~K|GMZ8oqnqyvlY==tA_6>l2>%6QlERyWiU(4ubwR? z)r2^R^9*)$|Ao>Lx;j^M4G7jR?bfb1H#7-Gw;)zSAK6BTtc@Rs3Ik>*R89%C|jgn20K(y=03|7L~MS zZIz)h6{wFi(*kSb%gf5^$lJK(3c@R)-UKh&J5151ag@8cECl(KIbdZlzK>(Ac7#B> zmCh)O!m23jh>D#Ra>AAB%F+g|J2qu%c>$3Gvbl{QR#owY69!ptBO}0yxjb56sZBXM zns5CBD{Eh?6~KHcBQ7Sqi?2}TSNy3jX9DvIxk&;^56HqzE2hA@h&XeHqtv*C--+h* z>F_nXl6H!U@?V+*z)Fh1A&Lw6mnV0HcWKjVN@RQ|Kq~oNqWMD1ywDR&8t!EAy2m&j zkM^T2*4As?P0{!4+9EmhAEOA#?Ar+<{IQH4oH`NPjyhbK)pNn)Zhfwd33l*BfE=A| zH@D-vmO}V;r{Xw!$8pHPU^IQEjMkF|sv$=lS=q^yySdpT<{f;|d+O4Vdxc2DTT0K73 zG>~BkGX**n;_dvHI}g|=&~e?`&|fr%F`vu^`b3d|P{vm1t2FHH?>5NFN&TVd*Py41 zRr%f@@8XF$=cF8D1Fu7J#Uc(Gt4Ms2#)M5_&&Qk&jV`8N8Ttq zpTR{KRSF~jfU4M*p0uspghjN!t=2~RRzdsZS5~(H8Qm2ma15on5k}&e$Z8o{01)at z2`-D_UR0F0TwhDK4=>o@7AJ^Qh7Dr9zD-fz*KiV9PVV($VHk*R=1Wqv* z37zU9$XWT--7a1*40RM!<7SvPEi-z4319tzG9oD74H*6-&7N0Te;9y;PZa<=CJz%# z>5197I2J1U3dJj?|KNC@VPWSU1 zRcY~g=mpjOoOIgtz!`R|cXB#x?VgMuIlM0135$qRSYq%_F9Pl2ntIGQqJwWREHD~u<->>A(i&(;eVT@#(QbGU2QVj z^1AefMKQGkMCGUQpU%ANE?yq7_VA#O$Tn0!)qKC#QJ^Zm!Ha_tS1URI$k6H^l=7DKlAYAdM+UCTB)VwvY zFcvyM(z0rg++qSS(W>&x+mu_094ZE82Y%<{W_9u>Z1(9hu+M%QF z-Wc?{$xzuC4GtT#Ao_$#Fu;T#6*YTblE0hUXeMW&(Ro!6ij3_cv07%KFYg?Ee>yn` zAyS&nZ1d7o!7DFv*hy1UD@al4<9S?AJ?sets{`^>PS=}bIexv>Gq=U2rg6P-Xu1~c z$=iI$d0b%&B@eV{J~M56PBxA%XUS*C^|MB`=Z+T8G@tFYhOsYGRC@bS*eY_Om6X@v z3OZ9LG1=Z7Np@(p5XOr6qZtz59_+02D(B~NKf-9=Pr?SEcCA44tatm@YgwwXb(`&2JZ_9Em#g);M}8Xh2h=Dx$&ch(Tc=*{QmOB z5%6iL{JP@BF8eAs9*QBL4MQSI8H^N+SBoNWz24H7h{2~;R#wh<+8c~~Y*Vk$xI0WB ze{;N0E|8E0a-Pg5GuZ2VUSZkexy)yX=@UVyk6M3T>S))$@s18O|J43jj2Ek*Fn3pJ zh}5iH=l99;ic{`?zEow7-sf_)q3w3PN}B8YR%RCzmy|?S)Ad%qRARr~g#hmqL$JZl zY4Sn;`EMzdhSJ@iDqvu%T%I>e_ArFd*KEq7!hDnSTfOYUJ=L%v5yi4B>;Zq9MmfjJ zGjM>SVJM*r^_2HU>?mz3%Y%y7q}_ZdJc!uk+-2dUw2UcAGTsi~%s8|cxx{g}p z*}G?Pv9@)FzOGQ=<>D4Hg`NYO!r%Ax~^VsLSs`&so z=PB>k-G;!&W;FD7z3fH8qFWnVg!!(Q_JXPkC$Y?lpXOBcwE;wO6r%x8NRiV$i?ADL{F~MSDnlP?%s0nzwkg zt2>>D#_}MZr!Vw-h`4@%#v@KL9K|EKS4(ml9o&LZ~3j z@WT=vDU3w)+_=BxWa?@`c;RPspJii-exI(qG3H99@520(Nx@J^A_)kZOr*$((BN62 z_%LNFO0k6eMW!VRO3A8=;T`1Z^;>KaU^}uF65PBxug46ow`)?zQ|y95wjA^>+YI4A zlnJ!rO?BK6eG7ZU@TM57GA+y$TU{fz1#A!j9yy7OD!9NGhs}#Y!fYNIvz-exL5uJE z(;>oqM<}oB1(hz-llb0Bx}Y0<-hl+m=`fhl-VJL&d5+!J>B=N4b8R#kS%V7Wkm*|# z8Wh&r%PHWX-iyF8(A$}@gF>%b~s25s7%V=n8Jr1?lvA{uFN z&cptitm$xS;A2vrmg4K(IAbbaB?}$YQGZ__JM|G73eFGXY8Y@HC&&czJRL7Kr|C>% z&)Bk@h+jPtZESq4$)gp03mhGq;cG(l0bmATS*LuhN}^mpW~zOml4-ao1~}=+f5>nN z+N=HoSvR% zEFu!bo+CXUf*`h*lq3};Y2u{~P*0hRyJdZb@2~Uf6Do43X1a3p(5H?%&oPo>A@&-l zZY|rAIRdm&=iy71MHstcKEa-2TrO+0S|UP=V^BVF@M>ap ztAtn1imZldQ$l@S(uI^79CfGTT<}1hW^x#(U5>GbVR9zOSQ8cNxX5Fx^YK)MAd=c_ z*B(&@ip2+>PV@txCsqApiz z*Sk<8t87;u{}gtWoA&_EUt+3nG1`E*8^ZfeSgqgIxJidoIH!~OQ+KCsj3V$x9O_0KyHB&!Z?sC5$)(16SuqyhMho482EF6?3k z>ns7*yFtq~q(f~mp;pf_@D-Ti&;IuhWsHv@7#s*5`Q{Bd8;bnDn1 z1D7!gx;Rfr2bDn$)se8XBCSpmFgBb%S8F;=pV|k15+{f+biH~nmTlB>k{?Mt%TI3K z^;oR4RUd5NIEdjiCk@u%jN6mN<(OX{9Es@*Z{)2Bb!y-C3an{iD$m^IzcC z2rT0Q46U9?lsT+5oI34>V*PSh>$v^8Y_>R;quF=+eK4S{x7HZ{@>&Znhune}gIa32 zt-*Xl54+{UdKexMVF_=`{sTWvkX+i`k4X-_Z!TXDTNi56cX?BXFbEN9S~Tw4G?t&@ z03#fg?%t6RX_H%Gv{nRlTqvhAx=rx?LeBGLH%$G_v^71KnsnND#Z3TOwoodLksMnW zo0;IS6NP@U`3%eu9q4|~GQl2Kr+fg|$r(KM+@_M$y`A-S2}w#+F#lL_0`4k1;{C9H z-%|S)ny3W4mpCuQ2}yDWq2IH3I@nYL63{5I(>Ta+K!2b9yL$B)GR;YPNuwOy%srHs zm0k7$3QE}d_wCO_jhGKh$0n0j7cyU&J4RzYH4cZoSQv}#@65E8lJ}#OwerPwSk=_G z9!%E`!j%V4hrAAdL>t}29~$A{#Qe3rGa&@2#M^t@p`OnbyqeWe(~6p|!I05#OL6(N z`~)pfv#m~M$uxy9pwL0ak?>~oCnKD{0UNQUxkTjR2p?^a7L1qsbD1gd)A)JI7ZqeT z@G^tQ=V>3FAD(iRsC2=>QAlqiUdw#06r(3yYAZ)xl69B=`t+(QQ@TH^GyGT{J8|ol zOH-5Z$QH1a>7QA{kBC zY~&&2GqV@qeI+ucxLC`BzoaBoeioRbb2JHi6cn2|YZIt8n{g{W;~VKlAw6RRWpSuC z)2%S9Dy=H4GT>;GVP4i6fJ~`p$z;#8c;;;KmX{dHKW`1(Q^?7CE;JhICl9j{OnWyW zHih3k{f!<>N2lS$3-kv`k)Exd1r&z&ODqcvVec-nW7&A6fMMV}Kyl6^t}?7*Qde=? zrn%b;a3yn|MX;5(@h|{1)rXcYUmODL`6WSF>4U2JfA~G-?7QP=y%537qktA#>QN*m zZ^1WTw03dzaOli#(KMho$r3#O3~+MlmgpF3KFpg4h2ZKB|LI@M2Gtr}k3ejT%>@nt zVd7LGgorN}xT@gO+93b8-i+IUkIN_n*YKYNoUu1uuY-&haubBAyQcJvA3^6pdxCbr zeT<^KAo{k8`PBIo8`+j4kaYC3h1Hm7Wbi6$5E0(xXHTYIku5?7E)=YBz!U_C=gWi{ zStY}Yz^a0L<{-v3`a=f}eiLAML8r%_im`|T*1_C|v@YF&1GYxdPOB%KraELLy#cD2 zGSF(Rk7?t#9^Qie$g)HuerXPvmI!pF(it3^asH`FKm~uDzSD>NWL8>0#b!psN{)0A zV6t&v#jydP*&F%Od(cg&*C3okfQ;LM63Jp1(@?In{zphZQwuVYSKceM?L`Ym%9E>_ z<|-iDCClt$)@etJ+h`4CI%xvhq`?s`VAEQQile({PQ*^F*X>lw4qj3kk@;o%kBm(+ zdm=B1=3-$;&(RwSiS$$ub7uo^ zL7VOg4ZbOL{mLdme9TJUY)u2#E&o z8I&m4`8|m`HgjNv(8r;sGDabGQ_#-a!)+6oNIo98Jpj_gDhj!S-hsa0!+dqrARm+k z!atmAyYOhj0fT>N19C+LZ^f_$Yb{2}hD>Lu93aXnVk&|FqZ46$1NJYu4h7^v24fOG zj+97m*3)v-X(x?)XDbF;%f^SMcQ->NvtA|8&L$VYoz=KWQi$024@dJ)AbUzbs9yAi zr9h62WXz2?a_|e1Ia;RpX)cixVhf}@*3B!=-=Ab$hoHi<0ONb($SP@3hXBB#S00Nu z>ENwibvexn$_BF1re_}$Y&C%t+hyw!tX4opy5QtkYP2Nh;(|ob5co(iNd#p7B-3m_ zfKgFaNY4T2_d{;aQe}$~?R*;7&JMnC)b~q)*Vt2;prli9;ufC6erK~8$ds-Ed!mC4 z7pykTKH8SYFlNXQIMY4p-`N!KgVItvjAo8fygM3~j^Er`zQg@T@M6UD9Bc zhusfR4HX&B-_aI^9*PdwI*tP%xUN0TMRgFh5ZRa!wF0b7kR~vfoqC*lyn(Oob2K>$ z4+9Q`(Dnl$S}2}+Y#jeP@&EfYp+x|cvs*iR%(Gm>kN+&i2tuJ3WEF8P{`3Ryam=N# z6VO!CQ?n&IH|911wwW1xVu|!k{|ef16u@u*NMK+>YNn<>{<+=%9^L^SMyasMrvYK0 zV?)o4rA@xb%F5W&5gZ2rwm`^TKy5g-cx8F`Ki5-Xfx6mEyd5|xV z6{3kNMn~|1%3$DC_BieW@*=FL$vJ~`UDT3ZUU!4L*p(Uq!(4Jql$@FouyEN(aca?_ z>}2+x|IHq7cku_T`W2+SC~2burNs)I>)Aw|^rRK4b~y#?zxFr=VlOn=2{5qt&|VMO zWc|PQ5qbk@C~6;j)xw`Xl&q|wkwQjEX$n888CX?RR^o#TIn#Q@!^New z)@*Nhb@bZ6wIz|9l(2pnOBg4UJ~ztbh)BQbDWDw_w8BN zDC2bW>XDLvq?uyz%X^!SODRHmZDB#}a^m8E9%bW&SiZB>h?kMkkcEYXoQJ1;%)*8T zc~M2iPM_y}vUa%u7D@x`r*jQTMxCppD?^qPAC( z_o%Z=X11;ngft9{R<|%qA90&F)Of}uvt-5w;TvLB!Ld~p1uE#Dca=J4y@mTe6(7US zJNFJhYb$bwn*i=vL~^Dh3V|^!okcSEOpF0CG0ApDGX1M6yd_HEv)8D{(T--1LK0^yBZGpe*Vz-g~=ANt7e_^lKcjp`U;==nFr zU09wIKq7(cm&DdWoDaZt2shRkH#Rq|f|g_$AcL^mi@LXX9{BvI)F@h;~C0gb_|i^L`mJ0~5)3 z^+#!j7{C#Fr>v9_q2%0~YaUc@-ik81yaBvfC_q!$G5lhsQ5TU&A+e_iaJrJ0Jd&XtK^{aM@`t;EUxYDG|g)a!QS(JYvz*c&3CKhPL%&bM@5RNv0WqvqURp z65!T-L7(7hZL9~?{h~xP3ZO|tJPYGWx*Oqkhlw2;9?HI#09QCN?qeeS3I&MzCp0@o z=Km?Ep2v!jr@6Zy!}mMs4acX~F!aDzljxKd1MqzOueCSMRF?#mA0EG zls&l@BiYNtJ5TRfFT$s}K*`9UK3!*oL5-lXmOhWF?u*=IVU$Jx#4CEbt zkSS9d`Y!5s#7_Kg58K)-I;iE=mr!OzzoI|GT<^$~m?MKoYA8K-0aEEZ{<_4DDYQhz zM3GW#(^A4OQpA)+%qhV}xP5G!WAPGdqPVkCq(qK$06R?t*o5)n5E-6<`Qc;pKBcwz zFa20tl(QV@FW`-v)gTBc%(5+^Ko-sOw`KW+=RQVwEMlteb%!EDn@welxzf zU4{8utF(+K8G{WaN+s3m>yPOCJ(GrrN>!xdrE~E&H-w~bzBQe< zMxg5lzy$tcOd&T1C2JFcm!SnGCQmJ2z>L_+MBI_>O;}mzU~y&a)1fGDhMJdsOif`- zz}};MM@*51Tyj)NkdeftMn;#R zZTj%%&R!EW1Ud%1{*u>i)SHMQVY1ss)%9tDx&KfuPn%sBiFB14agk^MTSdC ze0xr*wTO)mdEpw6PgwmnAgTYu@V(SEN~!<8+9D#rvjQW$o-k0+1xbNtih8 z1Un>=vMY4Wyf>dA4I_q49y@RrFInXV8hK zZ|2XWP~7}~0Y(nF@f0DGE{K#efNv?%`~I0W^8ObY^6*<(lGw^uGAQxY16hEp2c|an zB&jy$=H*`AOd{fzrNpfK0ghfSlAdKzg?G zmu_t%7`&XGxjh~)79R;ho}>;5VSIPU@BVO526hjW9*A?oW%zKiD-L(%cmIxxpqpbJaBuYOusc=)5?X;8Q&p5?gn^9KqS3ka*7P-;wncQlmkF+X!51e zvVKc}bc*wn#Ashg<7H?AzS66MuWW1!_yOP(`0I=6G3oj$vQ4+4IY1S$6tkqMhYxE} zI<#+BUZg^NBs?lILN2>xyj(o~A_)%y3L4CRfiFEdr9H_ITROp#!-*nk`{tl4QzDDSCg+`H>=n10);LBMI*?dEmtqIq$w?NzZoN z#t#dXNq42m%k$F#em;_&TOwm_-77b}mLVbS{V=AdQS0Sk0j^%y+R_p|5?CnZ@#iK~ zsH&P@kS{;}yctt@9c06XpJe*X7i7-d1sJOVSY~dMO`EsKfPQ^s%$PBfo0}_d&i=Q2 zuyC;iV*D+ys6=w$#xb{y-RaW3Lo2!B@{6VW37w^N>sC#J>0k&YsjA4~6+G#WF|-kV z0wn+v7$v4ZFUU|yZ`OY@70iMl{9MsLNYzlLwP{z8{NvMHc?*lr4cL74Eu`D|`SODc ztU`froVqlE?zcbX%NL*I$?PS$7+P>_73VF@5t*AW8@FKa4#bIv0iFCM9_le^XrEwN zKf8@g8V6tl1)?021_f(;-fv1Ol>hxWM?S%JQs2AsE#u4ulFOw@42bnlf+U*)prs9< zDUW*A@xiL7bghF~|mVEx@Qn;1LS!aw^U@PYf z8h0@!7BGs98M#sbRvtQOkz9TGMd-K}Nav32<-0ZO9blMrxt!pQZ&W=$r z(^?GmC=8Pr&Q?dvtHQ55w?=hAlL?wg>`vtcY{J6)uSW=);ogsT&<#kWi6B>&un zTump^N8%u)aUy}os99XWmiv8Ehq8Xd zj}m|x%|eWDzyHA^x#@=M-IF5}KUOP-tYgiL$#VL5Zm zC>aj3lGxZ7S+aBm(oK~aGyg1~el$;Rx$#;lfb8hegQ9lY(XG&lraTMPOWP0=DUvjU_Va zjBp92*aKR%tq3#APQA7IKs%a+RID38AS9u{rZHRxA`D2O5a9_jmBK(}H1`meWg7s@ zNM8$ZBe)vgNOB$15c^%jdA|PnPwgTC-B42_pbH?Z>Ws!(4 z+}lpCU0~zmx;O6SVd)QE@dSva0pnokd!kIf=~@{%VyJ>pAS63dSa`UuZWuo7 zGua&VWyp{O*#8a?1^WfXP4tW>81U#7Q^ElI7pXCm($)4?glg5)&CJ zyY?PbX^lJZcIL7N!s6rQuElmBv9 zR$)v{p!MDG+#z}Kwm9hrFgXn?9;hO&hH1&GL!^V=6|DL94jy@%%d{%e+ zz9O0NCdvWR6V8s3v>XoBm6s`xswzxD=6;y z_L~g#!q&!_s2Qh9OG}eOkeq1CMz>=n#--T@jd7C?9KZ}`x~AE_ZK7`dZ6r5-^MHUz zU}ByGNS-q=R>!gg2L}NxV=+4#005-AL=5RD0%LFq{6Q+r1i)>A5iW+{ zq#F+Y0Iq$QrQHjF>IiGxMA*U=Akz(*Wzr4z@%SA^+FN0!0m~DO!%FVVDwD$i#uE^p z%f*=P9)!sv@Ij>e67jw#|^=`N=>zPl4Uu^1rrIwVj-Tb0x9>SBV|X`=+h|j@&Y7 z5|sR)=dhs?%m`2wYKyZZi(&aQ@d$YQ(T(BFY6RYM{Kk(f7Z99&1Rp0Jr4J`P-ZM^J z(eVH{mX#bJ$YGA5VzE87H%MDi06LD%afuYeMIsEVm_|v8AcKgp01f(4Aj_lV#JGqP ziZM!F7BCzGAS_odP---bKEnXaIYd{wA?+~4AsFc-1)O{kCk$oFHenDy7-2YMMo>9K zz@=meH!d+_9avWPa)iK-TB&Tk+1S6e8ls56NX&^qcf>*7`TYz&74c01c8`yH7 zoC5~LI1`G0CAt}RI=BOy69NqyVF*qHFOqv4UbFpk=Mj@mWgx2nN{!sa4(!bA)LEEm zj6zQhfb_%8Pu!q3$q%cb-z&jnO#Pw(YJT7g;}IW-Yxu{~FG|Bsdc-y02PUX>`al=C z(~Tg+$q2qI2xcY@{rDpYgdz@!kC1LA4D;hX%Z25$5)DxECBVXse8?c}W4*ZIK$T%EJDWhQ8VsJ6AQDPB!}wauq7hDU#Q0PQG+BM|WCNd$(f z{0KaT7=~bI)M?K+23(9k<9UWLX)zswt0z?z-qX$Gqh(P%K^&)a=-#y3v36f`e8iBQe_StT_wiY77fO#P}3@>Wbcj(2k;#9 zdDJjPVFB*AJc-7UiRr)r0f9P8**Hqo@TDMMI1!?JF;=i{#WJq~e+-UyYJ*{G403U% z(^A86K>3g7z~{l|LNd?Ey;SxwxpSk1TyvQf?bnQ1MhmHSjn(A3OtT?pRRL+L!A^B4 zmrP+<6?fHzlcfgW0QpY-^EvQ&@VQiHEo5g=8{h#obe6RDij9qxRu1M@FN+U}U(QKO#pKVYiGfZG9yZrXKp0_39#8_d4YO!HnRx1G^lb zKO#iRb^rUt}3pyAh-Pd z0?EwGz|O4&FuH{}(n5$}&M`NtrIg&f1$Wb#a$pd)a9Or2!2WBy_7_VTcP_S6uN>fn z0>|8_mQr#HgMqYp9@S-R0j@gEv@rLoRvR>T7MSHZRVp*@c-~cBSIObN}xSM+(7U0~u zVXrL*j)4PKb~^^99b=TLOhIZ&%Fd$J#2xErIp75cYTN0&NYVzWBMw+QxH@8_O~!J- ea-i{X;Qs;oRTbJ}Mq9%G0000eklT2(onb@{%+qONi?d(_+PHbypdt%$R|2^lN`~CO!e){QE)vH$3 z>aJZ2^>(D9yaYT94h#qg2)vY}s4@r$C@1jz_8k&fT*^tEOj(r-sI#)z(1sV=DM>Nl6mICtFIRt@3Qh>hY&p zgWWo9vTdVK!sz)%jukn}-g}W16+fB~Qt$8WEvf=0yxh+xX+nOBKl zbC}R)Z7dBP$*neBy(Ax;~ zlJPV20FP}p(Jo4V6Nm;@F5-3lbVed`gn<|>WqHi!z*+><5$U5g1eDA5S{yIi?1uyIkrLF(Sy4xf$7)!z58p;Sw;p1cgZW<4Sy*u|&2SZ)M+wnhM(^Ds ztC#W*Xq4rq34a*SwV(}=@rCJU!?}(yy1hTVx@+WQeBVvt!i2?%A!AT)x)C1n*Jz?B zLNaJ}^^f0OACX&29s|wm$-_BNOeRde(B&UMPmdiH><#fcM`tud6-^*QwDQq0EG&h= zIkxmC6Qo7e`g7#$c$QJP!Jz zlN5tgQt&e#N%B4;HgO?Q62+*BX^iPCw=@FVa4Lz5>0R6GUoTKn>W_x39fMbceWlUdN)#iR%vw9BVq)k=4IB&eLCg21iS^ z21gv)aGy|q;QnW8>Md+%tP|=mzU>Y=0}^+9@}~U7bZWLn4TS|-Z0fIIgySH-ZJr(9 zEg*H?_n$@ul59qwk_gHD_cr(WccxtOob#Nv0!H+<>75On4V(yF@+7SPdR?*FT-FrU z!5mtpDXr%TYcJFBQksVH_4W6e$|xM8hlM~JG5mDrs6dUy)a!s8u5~c2@U0BMEOR-x zuWVS{5l|IRg{1H)*}Gx^m$%;wA(axqCJD9c_!)BXP~z?KuarOXeO8yehM`cfn z0pl$&&V}IqUJV7D=?cQL2OUp)vQ3a>pDz8cw~wE`ci?}wKw9&^z`w{mVFyhX$AJrk zryyi2w0u z1F!!MN#F@={l6<%KG^@m0m_*V{(tm8$siLrDT%-fw4c0~dBr_WeC_&3g zRnt{dPL|um!H(X@)WO({-qX(UUn>w^Pi`P-XXa`|XT$L`1yKrsmwrqT>H+4lMDJSh~78ax*Y^czDoz zu+Td=TQD$jad9y)GBYqU(*Zf?T)gaEjXde>T}b~c{OkPxHJJZu`kz{$s{Am#4FC7o_+ha1cc4H(1VN-kg;YI3&-I`@ z(Zw*kkc1_Rmq30k&3IqUAwwXa{6;IL1Oua%Y`HF^{4TA81R?bEs!Qss%R`t*5JxKD z5{znW2VlwJ; zH!4TRCH{?pHDf6Cx3pyt7fxtvDz=_vBfWxRSGrVhU+M^DIs6lKZ0i% z;`FP>X@yngoyxD3U;;YqI9*<^SxUckjMX@EgooqCIK#rj8)Y$shK5FU1P2G}PCBV+ z-fR;dl%Btq17Gz3JZJ|*cvy?=f%R&wHF4LQpTw*EK9aMG3%tT;;QGeK@8MxWB}Yd_ z-`P^kkJmNTOx~SRNmJL4AvtdU9cI2=$lR#mbC|fh9i1KOG~VS$>ijEvxmm9R*x^x;SN!*&U%&d6e_E$ z&*1&5D}`LGdc{wlHZpz-H;Bub3t! zd;BDWtN{R`RDE~E5QP!_Zt>9gTz3DX{&N;Me|N(`IDVJPYA%x&$_-aBDV?=Pu}@qI(oHhX@9 z!dkgaV?OQL7)$4R+mbZOYB{xJ6vBc{qqXpWs>sW-AU1heg;&R>(WpV~ky0ta4i1Z{ z4I`B{i}|vPayqKcyYcE_kh?S$d~7=75DlXqZoc4&J#}Du*0{_$wf_ZBH&(=#-3HB_sUdhPg!B9_T^ zA2G~dFd)Q;xv8YWf%V_~lmNkrTKFAyaOOQca-=s!sacTZlyzm4k_Uqa_y}hbkm;w> zD~n@tS=2R|TzweQ*a}IGH$m7N7@a5C-TZhHZyRfZkDvI)*_n2;w|p}+cR&-Pe!-vg z+;rO0zXUgg2@Zu@u~^9liHJYy?m_AsS1>dvqaiv}k6!V^Hg$b4=5_%G>+X<&^)sEl ze?%$2QON2R2i=;Lb%Zbe=IB0SsBcgvwne8AaP9kw$c`3zF5s!TF4$K%{BB&S+Y~nc zn!3Rp@fH{?QTalrQ@NllU09|vi>R@R&W-PGeM)#>F4x)^eNg#^~Q*I575t6j!<9Fij>ulTvk|2piX?y+C>R{AlZX9bW+)A?R)3uqrI9@nTcI%3f6 z+gXQ`&Kh3!zfM@d_i~<6{qtM5Fc4G@ro`lkfCSalmL2#PLw&O6dyQc6@U42uxjlk& zQJmcr)HX>k0)US8+Fi7Nk4^5l7hf53i;3Zi#$Ia69(#V-VEO6GKXW|m4T4%EhN=!x z*>_w4Gy+K85G2zDVTdUL`&!CBebTbM@M6TAc@9#o+eW%xdo}Uj)zVQZ$4b3&y7N(r+i#( zDjx@Q^f3Q1=&}~8gM#`tss=yTvsQ^5ALw-(;FsQtNu``#L-4oLos7VR#(2`C8gHe{ z+RA}@(j=Ie7dpVH)+%~Qx%l+qB&Q^n>{3J?wnY9SQ?*H*bhXy2L$;OkdRd1^q1tp@ zBWcqfI4=zCh-Ax>1`mF|jIr5xF(HEoJ4s`uz%$Pk%gMCR>lVY~vX8b4AKFO+sL4Kf z&Cz1<`I3~cImu!+DM%QBZ(J}NDS~x0|2rv}0tu(ZeUbOm6;p%Oeg(9Gi!~AZfD%hc zx@JIcQQ+VYBa(&*f)eQyp}|hrnfg#2Po&MX&h&&J!Z2ngvz<{W3TOnb%Cb-fdilvq zs>;h&DP#iq0~I}DSaPZ70@LwID`n?BXxI@M4F2Fq?-4i{-ydG7@2}5E4nu$M?avVV zD5OY6e6D8a(Ol0Ok&NWYhyUbKn^%I6;JUH*2{0Pmx64mJ<>X0?<7kGFhIluV?<=!2=ZhLq7D!G<=Ur4`d}rMM&x29Oi8&<>E@Vxoj$gktNd(Oc?Ho-UbI zozXc(d&cV=vX{WO=T~FE&87_#FJi`Pg8DzP!{*H&=Lx z#96E`nH2fKwOa6R+&F=f5T!W3fHqF8MmzBF0#7Kb#kMs2qFyH=Pzu3l=J{8bVdT(E zq6sCb2TczlQ$)Sl=nw4cHea1;A~7sWRZadtGa@Z#Z>3e%GOZ!h#e(#SkmJ4;dEvWw zK8^#6Cu@f8jR2Ch#L;Ky(!5Nm*pUq9gZqLL6@NfIbR;vy$|e6cw!GGKMP|VE4a_Z z8CNY?<`n#s#P(hR_4v3Bb*>m(=~r*ix}Y$X4e!U0mB&XdA5@z#;nTT9=Vk1jcQEwF4|v=cJ~pfMgu@8~Y7rXZ^w_3{KarNp#5s5e@5Ssu>mvM|M#VVYI2n#E!08GrcjSdM|47%cP zGVIFsSG>$xLA*3UjgvjiHbBR=PA~xXQYDNH-3b;3W|z&VaOMi;OQE0iKwq5)qyJLC zP%ErAGisn0rzvc5vn7mp%(m;x?v~X?yAxe@eg1&j=z5}fA*Z9d6RRcp8K28td0i_j z>8$4tBjRn{3wCg7favkW|AWrG3G3xP!(~^$MT#bPcx3=lAVH+`y> zRcj2p4y2`DVgo)GDbexiN+5yp@SWKxa%;zgVxUIs46*X$CZ;^GN7JlgJ+})=dfDxa z1KX-AN_&0&Xs>tt+&OQ&Bgm~PyU&2+Kh|x#4LRbr^+&4Z0!i(+)1I%#8L3Te^Z}O0 zWp&kZQKfR_GO%L#oH1_wfkw&=URv;#ZWGL$!^zi9@PK;rNntV>w9mX&AB@3 z2b{&9N%K0LvZ9j%_1{<9?RZ|EpA}`OieZH#=4t^aL_$DR*h3+i($uLx-i=LpWzPnPJEL#5~{ZFlaAZo&zw6aF1ni zAgWOsOtstg>-(XLcbWvT+pmjaGn?j9t5J^@L9^CIr_s+(>2;hm*D#<{YbIDPRg#b9 z^f*S&a|<6$86Z_LaHJJ`-WaC0F$n!v|_P7tfZ<~SgviNzLH(q}}DzGvHf`91#Gk)srvo>PehaD) z`!}I${zZ5-82&l!|Hci5JOl9r*1J&fFJ94z4j^yUi0+ZsBh5$l4E$~xL>ilm4fsb*W2{+yB36Ya!LjIBExaV;s9;{pT_KkHsP*#}gQyp8Qi0CosKrjK0@u z8AyW03JMDfqUs8JMzzEJ6QKve+Pe}e#$yd+ga-W=?e0*WGXINV-GR@-0u$rnH&Cx1 z5I{Dvkka4d`M}b$m>_Dlo@Qg=zt9;8X$B$s^c^!t$7j1%)hw| zt=ZW7GQ&z?YHu{Y^~d(|L7fLF`9seiTONNy#X>wD^~l>AqI+#Yg^RG*!1mklaow(e za3PoVB-;Cl*Y7901M zEV&HEQla1w*$Q3`2)F;;VDk&l1U0Kh>GiE26`w-`slsRPWZJ zAY93+qR}ySic*U@m#Z=>d80j1@_50%OYId=TXCTf|J)@4YBI(L|IG+Edk??>EWVQ5 zFwug`k&j-ns9c@RwJlanPp?{HC@+nnkKt-ygamb%Y)_~({AfpMCXM(LMXh^951>SH z6ECfDp!P!J;ih&e)qkUM(x>-Al~KDkq~h0F-Y6*8s&TWRHmJ5U;k0AnuHl44PTeCB zPayTd>2{dC9p%V~Jy%NF33ULr9WIqdI#L26JFz6`f{jrqchj7?nan zrM=OL%I#FOfG?jIpU*GoGnXwq)g`^d&o70~+uhk&njWb}t3`?0`J=tbihWq(i^*gN zZgHr~=}w*7@BPQYc$P$;!+ImYymqn0Wy#*zyljnFfc)SUPc61gFO*@5M?--tGRV976WhStZwm zL2LR~TEcXd&i=`X)YR0}VkdEuH0qvj#Zq-)MnhZ25JQ;hC_b6P7-9Y4gpS~y=3<)* zCZ$SA%>K>}Jr;q5PxICK7V`T0ann=M~NsG>rvt!|hb z9ajnuXN$iKDCCg^R9kBx;Y-;!pvKmG=sfP655|O`5D1Ws-{XgufnlTQ8AsuGR>-E^ zW(uUwOKekg@G}wAv2w)QL4pzqCOrJA+2pBRddPIdS|fHtnR#rv>)xUrx8pM>fL<$m z<{~5z&y0W%rjSO%K~ZojQ*-TAun;F9Ly(i~JM# z#tY3II8wu0pQ;JjtT$6Xb9zFU%|-+XAMu66X#N76i1+1+OIZPg{+|GxzuwWqabT8f z)m=az$tjb^Ke4HI$@k3{=k>!g$o!>$I{Ej{504DjYN__{IJ^T_T%}U`Jk)l}@c5kk zTQiyYPw;TfELke;19@^mv+d1pJDWwH;Zx_`QVE{xrOeEA{YV4+Ut@K8(|)N8Yz zVN7<+mgXTM^#lYMwmV;7gx03|f6l4hJ|QNgY2KMT$mk;KvE#T31wh{QcQAD_;}n*dyQ*{o%yofxCd% z8&p5cxA$++G3TLU<9xfse2d}(eqVt-Ox{zx&0ALr80pl$VZSWkI$jj0-wk!GoqgVIjltGV{>M{r_= zqgU|ofg#(^r?)XmrE2ra@z=>~2eR%yG`9-bgLd)A+a|d6{`9;m&L0JN>8;Z7y<(2O zMLgKi&~1WrYwpDUi=NfF{BkMWq*c0IaZxTBm#pz^y1agILBT;@w)Rv^R7f0xiB2gN z__&My(KzhBd8f^n@~C0{Q+lf?e=Ds}Z^94VUj7nT&v^zdGwG)=IN1N}5y4y?V=0}? zWIsHBM7WIy8I1a=(hTNx49vC_oi*5hkXtX-cUgwXq}8BcV|pgMEly_5h2FIth=hAM zn93cOyVkXKyI_sCuJ(r`GJOiBAE=PW47*Bel+$eHv%6j+y zbjD$?r6`s@=w)d%;w{?~&vQKywCnJZ+8h2PGRe+;8CRSo2_@qn`c9)xDVL^&8)UVf zPoP%)H>Df@1wP)bZLZdd#d0tvZ_r`#l}>ethoefrAyv3_f~pnwZ0At6V#y9=l7W#i zB9qleroH$N;dF=k1NGl#H<_^{D!%w8^@6B_ai`Tyk{T?5yUO(o-62mXD5$zckLZmq z&+Lob=WyeRR5M;5EZPk>&euBg(jgZAtgaC9xKqNjdi|aq(%Xe)!>^h!WoZwKOaTi> zuhx#pp~@zXz>&-N%YxO=P>YorzK0Q!am-ISDEG==vjTD3saGR<>2oN-Y~UnmDV-s^ zKjN3p^C#Ebojmrx`?7gLnC;dvrvvjE#bp9MQn0DjCASCCDv>ZvUhgm)!U?g3G1EkN zI9RgW1Qj=kwXXh3R%(NCi6q}1K3l=3=c>$6d}aMVy8>35{4{n$LQxlxFT3qlJ_)O| zIx;%)h3+p91?qZ2|Nh8#{Y$HdEny#F4sPsxSk2LHHl`UNz0&$y*F8aT3UB3P{pDd@ ztXj0t?>!b~e_AH*{*-2eTLv$oY%s)eletK4@|EDr2`8TOijhb$=0^X{`_G;o!ETrn z4OUFz%_?5oaD0UeOdMt%@3%dtQ9RnKgCw%(M2W|k5KNdM+0iF{V4$cj9mT1++YlO# z*nF`r19VW0=Bh;>PXDGvq8KJ;4}(vZOuk*sy~gUKHxeiYhvhM17Z z{F+yQrXAr8aozk&s2Urfd6<|{nKH+Q%nm+t=Qk|PY3Ea2|-f#2>1b6G$ufcGX|SZ zzb%meVpZNW@O}c&B435WdYAW&ccd#|I2unYnTldZxkQ?5X#;J&_9 zNHewys^OIEd$7P;!XbmUxRvMaVRT?lXbKV+jY7TP;WATdolNVu`eyh^^c!LwY)c8v zqPOi{U-C=pTLGhWEF8W=3+s(40XBQp`0lS84IJ)W9-MbI|48?srfVkwUxrpnE+gXj z1Fb%Um(gUhrV^E6cc$EL2le&t1X=Z&gwW=9m{S?@aXSNW9qhBDNH1yxzRRM!Hf7I{ z8lHJ;pY^Ti0CafQ!}Gl3vp`=naWs|~5wFZ{p^fS1>sF`I z19}8=qWD`{TDXyW;&x5);6}AH+|RV?w^6uLbN!`*fq}s4*PITI6AX`VBj($XVCHfi z^)h2GYQ+MWhf9_KggZED$O%|AYsvYq+;Q-u(c=aJJxZ4#p=s8A|1(KSIAlwzTI)&9%op+#7|8qFS^p1eZt2A|(heID6B@xtsHJr3ycmy>X%b!C2f#CdU~@^8wm0 zi|#pIMuWla>KL~7Y=2A~E-#V-%M5GrFkP}3ahSYIi`X8I5|NZ!F&%LIe-whEcU{*A)2E1)Oxo@JK>Kt5S=TOfYWY zGZWV+y1=R5We{1Cd1$%Y;MJBFY)r}3?VlbiXJ{*bmI>xRU9KxIh02rSyM%b}GgvPl zSpAdpYm`%{5Gyb#Y@a*Mt2h7)f(q911uJ94S1|E<+R&JI??)yd-z)9l>FkdhAp);h zSFR}R{miv=_C3N1!Wte{>qY-z!}_LnUyfIby*ma-t&8;wHvZGaamz=09a7--xs!&~ zowmTJ#o;;`{Fvsbz90 z+I@!3znM)0v0+9arqc5$uokR2*xj$1cwzPLhNf*Ic=LendMf8{0UGtHMDO>3rb-Xb zU6_~C)eo1mhDI2LA`T`eHI!{*nIPTi7dt!kI6ILaK0K^gG1$f1O_Ju|Pl}hjy?XHP z#wVhT3e2V>32}IK?eJLP?R(xDjqKP4#zw~oRCG||7`5jRup)K3;PK$A5Ew4?gWU4r zyn@L=>cNiR!3+EL#v00#C`OpyA_otlY=#J2wDQdgWMyFrGRh3CQNXOI{9W2-$UPy| zhKm2L@}XsksF;xdW#^*Q<1hh#b9;H z7@NbLRGtfQBdgn(r*+h)n2*v-p<(v3n3U>K_t?m*=O8e{wT_X zKep|s;V+r6y>HIjsJLcd${3aOkTJ!PX)g&Aa2JFy2i}&PT<4Ts9|fZTtHb z+RAK1J-3m5LGWG>A}epKgw-`wIKIA~|I5m`SLVW$ZDuNXEpz4<^ex+PV$>YJ)A=b4 zV)mBg9pi|(zA#26tSyI#g^WzD%v}Ryy${s=PI2^pjv*S^nXQym?DL(majz(iDmvNT z1znp9ct3!DQtPXJQtP41ujCb1rrtC4R~wUEp4rGb9*!ln5+)bl{{jCxe$Bj^WfL>; zEEh`e>xp|716&=AR$#{;?~-QoW!r8PBqt($?7q?pcJp3a;HNT~K&&uYj|`nZ6c!J+MgaXX##SkAE-!X@XFASvVFiJ)Y|` zpmxK^6?DM&M5sBHsImj-ksf}G;w5%qTsDX>GehH%(ngvtwuDYjqdDt3Z0!;3xV!1WBaSS&+ zh!p3rc<@i>@@K44+5nx5?+|qKN(T}PR1H2AG1nGgJmwi| zZYOdaFZXCzE`9(#UXl;2`rp}4r%^QS+pfop66Vc20jz3V9Jf>qHj56aj^-@72SC?_BLtyGRYJMQa_ zUMI))^4pG~TW;UirgPA5Ml>EFV)|xQU|S|jLEMQDenRzq{4pB$97Rq$G*@-f26Q%( zqp-ns=YNbzGgQ92 zMe*PmXGU~l{GddkHK>LIFleO=eKHIA_ch*sBq#HbQTkcQ2!&FnTgy8PQNqEW6| zQJ2jX{`^P7=zQ4bde!}$#9KX;ME6m6K@m&=LCpkx}A!2_hIan_}lVjXcb^tB-9BDYSCnb+3$V9t&_)= z$1GgMT zqvnfcwmEvF(6l!B#eMF`YV3(5Gn(I?FRQnBli|c)K9}m7pP7(>!{w@OZ|)=CGJ_hoo)f(OZa} zg}>OA1{L1miVD!r<`g&aNxgq!3*ZUGA8qaw60mNc8Tr7a7JElU++olkyt5|1ci-tt ztnfoksQLE8dQL1yrZ9Bz_%8ZK;E{$tL@wE{r;`489>AbBr~*y<%HKC(&&%WR4HN6w z9Dg8y67tz}Kmr)bI(8G7(!i1Rjlb`N&?s?_UI`k|1=wRXH*oVMPx_A0XX_Vq#g#7o{!+Rzqzhe?n92^y%Y*MJ@E`M@(l z(e;XjUcSWftOGMNYeHcP;Js|I-wI7NWc-Eo(g@8|$I% zmh@)epGD%eO()=7soaaAR(uZJDre(%zoasHHk39QXem4(pxJ*x5^sZ&e-7Unqj&c7 zPF)r_BK4{jCJdu#VlsVxa*p52y}i4U7$J-qLru;e{>xQh#-QYno#xO)<4Bp6rC zH)Y$~{zba`FV}3sOlUEHQ?N70!6;sXkI`Z)hog8CMwnez;wHJIN9XFVX` zVW3v6pm=~ppr-S7OM*6V_jv!9?t%1Q65hRg@o+vzq3vN2f5Gy&WX9!OrPixf)-C0b zY6YUTbmG%jn=JB_y0v|Sy}@_G3CXeB3_49idl?LD_)Bh_6#B(Ab8V(K!DE~8`I&1A z58;+93Ur5@HobaH;vkDhEo_%t#Z0%o3Z@!{$Pa#u^-k~BJ~PeY(zVJ_6^_ATkIYYf zJw{=!Vy&jFW(2Z7`-NBUav1Gi4Jio3r@fu7W2kN{x4ER%alW@wk_mLzFgY#AENr7W zRd9&S6(J;Ym*{#z2XXiz^Ar4bpFA~o*eXH)xLE^&WgZE7c4}^Zg;fo7K@b|vcdPjN z>D)=xaY~nJ8FD7UQ&7Dzv@q>s8u2tTaNZ zm8lBt?vH1sH5Kd^SlMnhNt6tJWwR%z((6cBAYSFqmja!vyCT(QXQOhR;riZgpSF7E z8Db7Dt+M#bfK!BDyq?~@hAO^}3B}`%ksR5G*f-!gyk63cSy2bl(ybH<1b5=67F&X` z^e~MRU@v!)ICj{j!4h#Ym^NF1{hd79{2w<*aI3&9UJiHbWc!oqPRx;Fp(pC#^*zwF-Pkn?)QDX_!kFPscPMyc=(p3aDI z-|9N{lBaSk585YpDKx_rNSbU`LYf~DLhC{1+m`505y0~9>2rc4|V!`=l0l`Bf7T=sd z=};|>2LWO*VmgtqckO?o5>wV6{6sO^)r7p7n zD9YSxvE3 z=w&^97oj;7Vc#7Q-~>Snr}>@3Yvj|Z2GADMGFO9E&RCm}%j0p5-@t=;W2f6Hxf+t+ z`Ka%4)RXU(P+m|WF&KRSAZ3Gr14ifGNz?EVb<}7Z;vK)8W|hbKz#8w&q7h5ul}-ZT zWxC7+<$p;AIpQG}_eP_yNA(C+p8&yDN9VbCWOR7$6l>~!p2EOT?bAAvx;NoxR- zYI^}CY)s#XGa}S_ucpI533az-ktl}$K3TK{`R&+_7!ayGns~bD6T}#!#tt4Z6jaL? zfDTX1LkOOmv$q}LoK2n`WdIQhi(XX7qj8tGLT0%hLUlhooF|PZ0rXYKarY%gH8db9 zpVaMEJH8m})a8q#(Njo^uZx*$Xv?T1&x(o>Ncixm^Wo0R5eoduoO*_R;+aKqs}gx#^i{nk%|Jkf5Ms*vJ^hj_ z{$SeEI&ItEsJy6rHoLci6DDxz9~)~DII^`+Nz7xgCQgD1oc@hdpUNX==xiqRl{Oic zYZN`I?}53K{w|M>hB&;=srqfuX{B^pujs(%kq=Hj>v*-W=3H$ek%dP=aRSXlR&F}G zE3>l;78L<+Uqz?Nfm>BvEszM)TP%>tgWGidoBi)?PHsuwXMz-uFQI(Zu~RkbkuoB- zan3hMQKR7Zri>7yxxju@E@FMLp#o z98-i9(wF&tE!7fNDQFn%(;~P5r2$mz(ugRqi~C_h@rcKO+L<8fG)j`UAHRBy*UK;n z&Emi*m=f%MxdLcpybjQiL3$zIMDH3fqA~k)nryChx*7cqkFW?uPlSMeg$cYZMU!DH zC`I{%Aw1&qVzpLmHvwC!{mnMt)X1Az-w*3+b@;^ap_*JO{<*zAiz(l~HXu#5pUuyh zBWY>V8U3PC+SZyiad=)K@h#hAN~PvzI8SFkuqB7LeQSEZ8vMLLEqbcfYNbq<-#~>y zeX0q@K*3QQ6kE7a?|$?`c)Rxyys+53p@(w5zXwN#)BiZnbi+NK7(7!aQ4TTHq4;{Y z!SMYYG@MP+pj#2v(^{*XI-2~(1c_xD?lpnaMnbfFV`~-@b0s9Yjf;iH(`~jT)jn|0 z$hM5g<2xvhoi)H5zg6-%$$2|UX1h-|^#B1`?|Ce&|Hm`Ye$ypH5hES@eIp(S28c#g?98F;7XT6gM+(*ND;O*z zdnk^8ezqH*UlLO9jKeGKlJ9!~+1*e>Sd!Y5z<4fQ!-E`@n?aY|weGi+0>79+xhpmx_qnaE1ZEhOIzCHXD6B?GQ29GzBJwP8WkYgu{Pv0(+l$ z538s*&#lBcc5QZw%>U*ITw09e8q8;3DVGGjbv#>V42;C{4}hJ*hLMq|l2z9oYkPML zx7{cJwH=P}FbXX8!8cd;IW%&c5j8O_4ReoGxbNX&Lxfz{y7Pg3uC+(iGz`_#tU91s&&RKTFgDiKjg?xDs1 zlFz0vgbxXiWU#Q>t?OCcX@_!mLT|(ym@QbS7C!6U-D$Ws7R;V z@4iPVn2cV25ty81RjcaXpz_;kvR9p7)mt6aTRmwwV)4>wNeU5#`2uw?mCPH$A(*<* z?vViEZw{eT7KK^)cv=pg7k&(R^h3^-en5`zq-r&o|H=fA2yl42F$dtjF_?%;K6#zD zI{ZdZ&;`(H2V{Hh5@8a;zy#L-0y|TrCNmjpLxczx8YTcNP!FH^T>fVT_>*tmFzBWi zs8)U3Z#duro@v&9ZRCNUg)dbM6!SsZBZ_V2fg*35aL)KMK~p%fZx-kO8wvt*~bqfB09-Tlo%_w zS}MzI`(Nt8u8c!SD?~D>WcXMfGNj>T+C#)3jLtqsQ}~~^$+%p1t%z_@f!IuLyP*f9 zgJDRSD~OrMo8{#NM%fTQLN7r#MX&q&)euom3UOnmpL>b;H?yhnb$I#$8U@wMo%-dl z0TRn<`UwPZn|~Zdc-Kj{i1vRw3iAixk3|(WFin~CQWRtzk8={sQh!Rq!qxV#Z8{TT zvlNwH4@Tn9zb84G!~ldg?eFTbIX-tWy2;JhDOnoL@2rS9k-xPHlLptNJk6@K=HvOG zCGcAK_=q2XJJtRL7mdeE?L%#L+|xj=VT?% zPO>G?s1K<#piuLnl@QhnWSPqBhlM#1<`d^2fP9fyRao+n`4|i`ov04tHKe5)tLpp{ z2rAE{#JM~s(w)SiCq-=E19V$y$Xbu1%wePID=MOFY&0&N zx>l2Irs=9r20VNK5^id@b{AtCkJh;ID+_9&9BY$L*DXyIoR8JbMgTp%i$N~}4jnJ^ zju(FJmFAsF_d6X@ZqVr+3pvtMr^0B9GYgw|Gv&mfwXymp2^c)YRF2eb)s;f9@0X0y z^U6DWZ?C*3q5zBi$#?a*=}vLL;oZK$E%vu=rP1iI4c(#Nx0Z78YLSiyb2xO=ZPU>v zDYpfbHEg6MxZVd5($!SjF)fe#<&x8+0_~i@>@TZREWN^^g6D!zsc)-Q+=bhAS z9SScP)-ng~T{~@bN!VqK*$Bu$SfKg2*`S{`+)w|fp1eVRS4DqfZk83|P7;wd*9pJF z`-d*^Z7m>(@rjo5gfTHS2?Rk*(HyML7VkTZJrn|dah`vU@Ynl8R{m0mKo@3R9{Vl? z`Zv1WKvr}oY7bpH2x}g03xr?5FWesg0VWACFL2@lNHA@Mw7cB-7=qkW6mZL%e4ZDN z$JA{0`^TSQc)R1HLK|7Uz}fj5IIK=tKec^mKE*BTC6DrUDqE{`TE=(nd|nZ^G6pkD zbXu;qi*c;XlD$e|uwUk*aRQf#@`tyLgVjl3D;n!aB@`6zn)RUHDC&xT zOO4Cd^TRvBz5o0^nbQ&xb#0#{)GslgfV_3L`WtP(_v}cyNOH<%dEJx`zqx(VpjH$~ zx7!(h!S)l`Z2WK(%2>ZpoQ``0+g?*=Az{>hx5x?za3IL!^x|ev#ZMbiTpEnkfOwvK zPKmS%|5QP46bTX!;CR603=D2*!{*c?lj*J>(&vZ%Mj=}?rPOCQDKj=LL5F?!B8rxN z!Q+7opVgA={r=8x6?JnqAZ1*me}!+da=V}|z<)TZ+3HD^7lmxSPoq7{>GIh5yz?WP zSq%rPGhgjowsn#7Rh$$A;y);>*rg@0K9r#ciJ|#g8RP5PE6<8~G2r)ZxOxJ;l14(LCRF2upW)JIAAr+E5za+cu>;N0O2gS(g)r~!bh5@SrMlKZl@ zXzLZ}aP)io>M7b`6ciKhRp56D!2y>ALy%RX7#I-W?vC!U>&fi<%f;?-36b~pxYKMA zfrggGZpB+Pj;ZgFIs3ld^8_XmoVia3l86JV$qN68;JprLQl@s)CtfFcGVtiULl+jQ z4=75VLhf+dYyaB=dFygMK(c=~yK@281IdHbYT);*tLv5c%JBD~vv++F>*3Nxdd=35 z)9w#`!bnrD19rZvXuS?w1VRYI46(r^koE?WT?B*O-^3UVSjIWA1A0 zhPXI9u0D%hz+UWSyeSIE(S(u6)2f>f#7tzHwI3wS42z)kr8kGqo|NpPNb8M5OYqs#TrtN9lwr$(fwr$(C zZFAbTZJX1!yHCyY{*3c6ugZ+7+Iv^zu86hn94C)!zL~U${=0NYj9?b@{)8774!&u) z+@v4a-avqJ=bZXT!u_$r9iHaG2x#X_;q9Jhb(M+#TCEB3hDkQwys6> zM-#Ivameq>d?xIlkcMmcL69}Ni@P_XOE30Y7=rC4vQtmsRalEex|O@N;(=&P-_GDAQgj?k1sj7{_kM+yvy~2GfZgRY;G@+r&9{M_%@voplIosA8)` zosZf7WcUe)v(VnUjJup1|Ag>g2!Nvlcqtl*e>(gD1h)#d=a3^^Q?>u5NH`pz(kIWK z!v(0>doyGBvq&+vANogWfr#>VE77PorFc)Cp zkDqnafpf~GRD5CkQrswzmX1-viKG!)%1*X43M$( zn7iu*s2o;LhPWG&f~*%n(Z0OqaKNhb=dpRP_`j>#Wi#P;^5S~yg0w+${y53j#3*;A zfj3p826x`KhW`rQ`x6G^`4A@f5~=xe1?(Ghqh4@IPYRlF)2=A?C0dQ_yEqchS5Y19 z4f?>z9xUZ{{$aVs@|QlL=VfpmtN4%ueM?RSLZn;pPuC23Ju2I0<>q2{e5orLCnky0*rl5P-12$u483MPoD>-BCQzvRxvo9iup`6?3>7 z7X*yw|JWD~1+-!$@dCp9bBhyCbb{1fX@K&q`nM>`iM}`l*vq?Sd!w8CDS=;EUc?#? zHXlMZmTv?@aH7(rJ<{*6Gzi+c^JX($bjJ?7m$VSsF7c!_e_Y3o4m6WLBh3CPQLU)p z5$i(3qg(#A=uCQQZAO@qXMgdtjOA`cgkVgjrZ`=S#%OF}39$KgA+@q!HX2o}4oErr z24x@4cNg)WyA7Ys#v&iOe*EBM|HlHDsmH%_l98Nrj(_SQO)JHT1@pIw90#fL!>9uZ zp@&kcPxBER=>L7NfM?4pfMna!i}GTDi~+DF?73||Lz8;k1Y!4^$~&JhJBZYqDxpJ~ zL}lxZ0s;KvS!5ZTRs`W{9mCJ&?8rQQ>IDAnvG-Z4!b|+s`j62lKvb%|vaTG}t*4nQ zAb@zwCpRz)zRPuQ!@R(lLhr3+D{8^~1-V9HKX5U{gJ>8w)6dAKMbLokQxeeiR*b#E z0qyEY(>ei6v*XTyfP{nGk%zh{mY`InpoWoiexOkzIX^|p93bc8BYOSKrq1UuoVBtK zO{+IHPEhJZ3b%rIc&TXGm?zJ+e{sY*QS6IMlmp!xZmvMSAWb|BkqDlPlKMC(!0M18 zu2qmAM`0(pyxa}^u5Nmu6(XF*jAZW5`Fk07kf?*{@%UnI@H5Hes5Q@ZmK7lZ3Vg}o z4hZ@{j1p6NLl3LkL0x1m?moEwfRL0B#4hhx^~oWB4OI!5*FSCYy#phSx4qt+Zk%a~ zrOtT>aNr4nefZ=r@Pqx5IVuBz+%J7N`uT|cu$HlVCak|BLdJBX?j6VFFpgr~!r+0s zy-ye(Z8BmoS0;r^X@Aa-_-d8>l174)#(gs4CV4>N@ax3AWv$KI4Gjn-{A1K<4GFC+ zz?q+)Pv^vgKDr3-FFCzHSg$rFOD0nb0RFWi7AU>Ci`<+VSp&9lrXZvD8UliXHa@ZC zD#^;s4~d;gY#ouzf}=1VFF~YJ9nxLCUBcx`T(d%?nD8bvUITliOodo~)G@c84rgF~ zjrRZEBNB^49T8z;yO~3-GRU9Yybd-f8>MHNa2uRFp0H5I>~=l=ey0Wz{#hVd`N07T z@3UT>c#A7ae{wmZ+-)XVp+HJ=G<_w@d1qPF9>#87-L<=|JC`cpNo{A6`#n=(~X1M1Qvc+S`gLu+Cdain0~R|1_8ct7?L8mC5`<+_ReP|?nGDn(teF6p6K%#ui^Yx;)GTUNd|6D>BhtfL6h9ld-f{f z-oiHy3MLHx3kJ9tu+|1J=qwRLbPuAq_?XBwe=3~vS1{~V-4 zRYP-dwkNHZ9BtDsYTEC`7$Al$?;&Bk{%3&IwLTFHeHZA;x$p!mK0u- zW9A}$gIJnMSqzTD=@7(Pt1WpXiB>8Ib~oogFwzSB4i-CdTmXm7JxOk6LYXk&eP!RL+ z1dlhfmosz9H?6Sun+v}fOAe=d0aWToXvztBGB>!JJ=Kel6eI{XQy1SO;Nd81LbP_xELVp zc3j<1ZW08coLNU1UfVXPwj53CblQJ#Z$Ed9?I=MF82F9VUI_?s#IBy^^gN&4;nSE) zCZtEHMlIK3yOWMl5!6Es{=8t7{d@h#Kjy!>uVxWrBU94vlJPOtVWK_Kwf?=)5K= ze+TEu@70@-)GX;0CrvVybF5Q!W0z6%=m*)O=hm`z-w169#4ii){1{BmJ^l;wB@852 zCTY%g)=%(3l#^s9(Z}SE?K4yV4yx1P&X!~f&cOavk`bE3Ss26Xh85r^{sXkv? ztie*jkj`;8Spg;|jU7}Ug7OP}(oiQy+C+%LyS86xBdY)#xB@!K48Xz%6 zEh|BBY5;+=9}b*GSv=2}?>--#DJ?n4&G$GdL-W_P(DkK4PYX72Qp5F2liJTZfSKUfVYhLS>ff3ymM77r9zMT zrh0veV_W6z{JO2t=i1(4p%bxqzwT_lq{J(IVV0(c|1Hl@GlTOC4U^ODhf1YJFw5Y4 z5@&Mg{n+5abV1*vyroTfyd$QX#YR zua3n!i=XNGQ*BGZ4o3DRQRWE?ZIykE{tK&(C$ub;$??3_mm=HT`ti|Z^quZVgnncf z-DyrkoMV0qktpuNAlP(TK}RIJWPx`+n<~;Hm}}sdnq%y1yY{~Fg+FZ-+89a7^%tJa zUklcl&BQ%On-m-MZYBSbs-khev5s!WWntGJi*~8N&39LXj7%QxP;#_Q5?QS^a_niO zA2T||DpMx&=~|(o-vx0y0?pStA!EziCRVX7euo5z1zL_FZOTmj_FJ}H8`Bh-mQNl> zVGknEFwA_;xGNI!#k_f>Pnk=D!{zKB!H1CZR^yXn&;~BK zafGu&af%VQ?iKs8Y8WfSiGkgx*6^TfJ;B5shn+vOcYKbigom1+qcBE5SOc5wk~$2YQB}W&`B>d zd-s7p11`*j22po=#mCd>4Rg^V9!0B)H#q@*~y5XFger z2`z8t4X!A*!wcW?0YSHGP`K_ZoC!GmD--6g^mA}!%`6wswER=Q>|r2}T0QgW#n?|5 zALExhMg%J~GsXTu2hS4xsQ63HW4X|@k4?8nnrD+UxX`gtO}vPk`RL5eEp88rAW0*~ zUjbbG9R!Sbg1eKQIadUhAt&xI@R$ZRyc}#iwm|oW4V}XWES>7^=7Yk^#~gDymTy;snIML+jqtp?Dpm|R|`?%1q`oH>m;psr5 zQuVn|y4L}QMm2F#nGEHm`M{0|uGb0>wL(&Pc3wCPA;8Fo)2yjJ*y+M{=4JfFvhFs|&u}$T{L$jO=6#he9-L6;jpWt7N_Yp@F zt4j!K4uM{3YAeFex9MenGb$W2cKfjmwIF3NF}}$Y2Kc|cFRI{=mqW%_w zX4$>%ix@dX190HYIs~*8GC6*3#6%E$unW$(>faZ&VKQSOJrVFof@r@6i$Cm#`1<#B zF^=FmIDApvKhUugB--ObnN>I`zwWgNgpfBEM$1#57I@c5mLc*Y0`2$>b{iMHj6w}1 znSUIk*;uU#S->4k8|uQ@p!z!5^Q5in^@`L~0g)UyJ3+wXg4VVXaPu*28V*6eAox(E zH_}H96B>p5;#vD;h2{&Fl^`+WPX@LZ>oy7=B`LID|DI_un|5n!X|;udD8LoKfE?RE zBK%>uFL%Jls8Up{`3v!D6ojjL6YcnA z-PFQ_$zTkI_M5Ppq2iPO0pjop{Dd5txNs6iJYM@h@{fC{}(TLvux8)lCHvS zo#zR{?nD?18o282_b+nT(R+OSRr4RY;G8%oLj-w{(-GD4?p1JaqyYX0j3I1#%#9$R zJyW`S)MwBnDs)Z&m6TSiT19UO1=BPK(J2Z+>=B?O!)R=Q8+>9eCe1ZK{=9Ok-sPgM z@W1L1I;@Mt09$E~3z!5x#{3KKC;lapmcd`MGN2vBU?qk0ep;t!`07DMD46NWpC8Ot z>tL%ti1ffF{cz}m6w)Gw9ul+Qvj!7jtoQMNcA>nGGsD9xFQyAfOG2V`P?n{N4^!Tz zLOIG5QVS2`s3?k$9&!Dfl~Tg1p9bZ1)O5I>(UrQ`a2MEw93et_kuqm4F%WW@a^tW7 zTr~m#KU>qb(5}|?DLCN07kzaoyXe0|24p4y_6@oVgb}HyXm1+%y_J4*Z~qk%@32v8 zZh;w9?G(Zr-7$d>7QBbU)R5%9DcPEA2Td1(4PTsgM`=@VV7+v3#l)kc85uEWY(eVt z=l5sjvOE&dryMVhdPi959Jm-T95=WXQ~LbWHB12e5S4(inb)n)%eNvIN1q4=(MZe6A0|`4e}7fNTt8y%O9Ho;<&QGVH<3f(42jNI% z!KJko|CRBb1@XhN5B=zp+qe(*fE8#ThE{y8wt8kNUlSwfAB_uE%3C?<{=r@L1%5!G zbzA%_hSnvPN@g^U8nFc+WFXqlPsnznoepeiEdF8703U!16!_)6{iVb@W3jy2bL8@9 z=86~u9VsJ|l+82Fob7)snIAU5V*Zr{OfHbL%*;tzS=t4WrJw(GJbI}_eqe*uL`-vw z*q!F=LnIi*%uVwNlPSIbgY#heqs9DShtdL@ju;1=fD}hG=)%cb0ovFBsO|%5_=pe? zVj@B|;tRZe^Efhg3RU0T6JwBpS4Mp&;MvaGdL{4!Nxk*HY~c7YT%F z0#Q*YH*#*Gce6}D96iz9HV9e7>3AZs(*-%cVu1X1b!mJSLPbbHXXshuO5I_)p}D5p9s^K@<^(|k=|2+D+_V*4&C{xslEy`x{ZX0jQ)fu++Uq(k1)Lz`CU|u$z4;IX}lVu@T#OHuK4^H zs-cnD=Ut9gi|AyZQ5NPW#-#XdQ+A7yoS$l-n%77@}HMYlM=_8%n(%>TEo zn*5-Bq=fbPGR-j?r;U$fPkV5w{lu^Jm&g<36czJEb| zg=n~)SPX7qHka!x&-Sivr!XYt@4O!zck$#E3Sy6SPnR2Vp3he#zTe;nkCHc z9v+h12!r0du*UCCI8J{TCC1eJ1Hj4^hawKIu4oD6ayUi6;c<(`lc^SRwmQx(*8V8h z=@C?D*3xcuIfklMX^FUAy(oTpy_QQZQ95`4-8DJ@#Ia*!7y#3qK>O)zMTKg$=uia8 z(Z@x;^+vOj0~r~mcEzt`3MJ8bRbzgi=Zm!g_oq?-ve&M&B8gVJJ?sOUonNI=r4Z!( zc_AE`j5wMSo76N0+v)MIibj`56Lx^zD`2O?Y>uRIc<1Kn37ylc_>b6x4-6DaU`1G! z(y_a%=iuTJvq-OkE@HRQhIqYNANc0=)fQDsqurkLce$D>8XlG=&h`EK+V{JV!|_p+&~DdvAP7g;c%2R^SK#V>@^CVP5>kk&Fj`!emp(`jv6HBCOsj>vOJ8gt}e(**<|5JZ1mUXI~I{x zOcH+SOcsO1N{#i!X4?X$@l*zj=+Ss`6f732#+J+Vwl%Z$`r_$UM@wJy!mb2Vq2tN4 z=r<5ZREO&)G4^Kn_m^iNR%2fgfz4(ek@k$8hjhvCU^ub}9Cy6wC?>B#Qqbo~E{7-} zYV_y(b0iL*v^ZgExacN+E(^Kg)n?l=J(I~K{dg*s>BswZk7|qW*Q?l__j_|~D=Z%G zrWv3o@9)+7^74YtO<~Yzw!Nw6fW!vC4Mo*xcVGg5&8Y7jE~c={X&jCvtGAA~`yvO~ zuGWbx))&pM{9xRe(gPHe>+< zx5bneiAFmQbS2499?nDO+BA!@(O_J;ieYzUfU`@hX@3=O{fE6&;kaKi@Uu&+o&?Mh7$md6JDoWI6PirSWIov+znnv z+>-q~fqmXkH8{=zZBFzkA^$wZVo3@Y6jtl@hfN+SF*&Q{J_=vH9?$tpnOxpL7Tm*9 zLxTW;6f=)bJ+%WjJNdy_ zw~8z~v9%=ZteA`AW67ScH>%(pOg`!6UcGYI_BQ&k^Q%3ZrU9AaDGjEoIZVfO2s6vr zaT<;MbtR&kpF}s40G1~-Ch_n#H_x92ReQA*$Glr1HOG zxG)e`eIVcBL8Lx=Uz9ML%GgICm5gzP;;=RmZd3NVa2-%5Nt@x9!kb;creKdm)frIB zZshejNDCtUtp@*O^U{}=Uo9+R3J|x(sv6HJHAUTLU`uJ*;Zz6WD+;YK3WdWV=bIV4TKkh}DsVlj$Ma$P`eLW? zZj^%LlI$uAp;}p=T2r0L)4{_=!Yq|CnSf?yaC%1x!hK8FD-023=JIrBI8{L47KpE} zoY9LH6uYMVSas9y?@~63x2hK!)~`E+BJd{mkNzH3MJS@gABR54s)H0T{5uE|M%3KQ zOjzY>XM4#{OkL}oE%W;u4{0_GI6_eqfm~w|I6@v}u|Tz0u}Q=8wi&+(KV=>DooG>Y zu7JC`*&DOMEpkZAT1CFH8P)Q!q6tD#1BLERP7q1FVa+OG%6n(+vmdj8Ar6%Ff&;!| z&9*z8iRqgDItP&XH|h^=Op&r&D9?6X0i+-vSEei@mM_uDYa1U`@-Sg!nT`@PEjyqT zTJ7=d@lfo!Pn%Z|`3xr$C4z|{yN=WwtR!+#;h2TI)|y{MTJg3Bq( z)|w&qHOeeBjgJ#zaXO{lpVMg7A#hIR<0#n}?Lw#OM66(N5-NN(Un;bZPX4*_>NfJB z_|?YC^ZBr_+H9TK(2BEhwouw3kG5A7ho+sHoZR+K>HAzDlE!2T2U1OiExOm-w((>F zfgKOwG#;=ZJXun=!4(=)Ku%=5nV0CCfBo`$GL!E$ZEMv zP3`%j&pqhnQBm4YjT*;I+kQ%z`e`)WX}+M35w5gHNy%lm%TKM<+RO2sEHNSUdRvg% zudyECCPJJO)_J7%uucsvE_G+7@Ht-U!L5L6P0Y*|`df|DgsDjMQ=`3c@=Q{0ruSpR zW*~_|NefZE&U&K|tHGg(I@OGW%X&T8EzP^OIC;@b2VJDZvj{aVgLBgHqo%jAkGAK$PR3h#d(lp%((97iBVFzxS;Avc zSG%)ZdvMFmO;LF{Mg$O&eFaX#Y?9ntXFISzzok~excgghS2)4!2IB1Z{co+K$4ftm zX{yDwo^9d#yOu6h57Py1ob8?Iq;qLpxt;tMtV*7W4WiZQ#zG#RYzk9%7=I#2psB!E zqE>HG0r-c_%tni_!H$@kajD4ZgJO{r%lEa31%kC^-=37fS%^tj0?WJ#q z9^VJ_%(>9Fk($|b`lb1 z=4UW`!_ME;_91=*cA!MN>=9Z^@fTut64bi~mF4y2g$^z=2=ssv9*FQ`m((Jejv#qQ z%wjAlF7DI4j#U|+2gK_|V84I}D;!k8k>~&gB#+=@d59)wXPo3FPe4>X2y9f)L79DW zdlj*SL1(Lu>E`2O6Xol*K%?9l3JD2`v)Nx4Wk?;S5dUUX4G}?wg@vW>`kBjtYIH`- z!NDQa!VoD-QX)SIEKndwaKF!`t!@D7q682a9e6A7$1}K>gpE4oL^aV)rkZXj=!xmaFLM67HWb+3g$)BvWJopizhj~kA{V$KGeDp16a7g}oV54bCV|Di zfrVu}WMQJn6j5AIl2R9OB!dkOXUQCN1(6fdt~Ne?57z$&rn_BRaqu4&ed2J18{VJM zB}7C-1Mw=R?N>4t?IEb#P3@?$HBW{M&7zI1{4djHb==^Q{75}2Ka)!K8|u|t?X2J$ z77}-(#i+Bh;U1!kd*?mrfFBs3iU`^0R&b;)%J{a8))nWX zu&$^_#+M%Xd1cy|HH%z=G+VZz=M}dX0>%uPZhJS89_VDR;tr#B+fhEZ3#n&k{nj%w z=?7TJKfYK~z79j?zF|J>_kFu{^O36Dc$wx)yz52z>!a_KU zz)zZ5c^S^;-$F;*vvAEwxVMqbcbT__>)hQX2(MX0I%lNGbijkoN(8g^vMs2mI?fEJy}AG)AC38Ap*tZmr9X|`Aszv9~-KvV=fa@wCAyrkAvGsJo3bq58bKk71H??k+a;m)cEE5lErl>C28gl%>+Q{pI%nC533pFO8u4>kJ@vt`8&c?$P`dwK{rQSc}t zBE*Nay3845-cH#TUZg%3*ec*2ds*_*X1ZYL_`1V(+l{gOe%yqfOpSPWxQV?#J~Xok z9+Q;Pz=?&ri|g^JpTcpA{XzOkD0gITFqyNz;G{dT=^b=TwDy{obM@6sG8$IV`bLB~ zaeQc71Ev2OC8*_YQ$y53(~)sA+=I2MrgwU4{_^?ZgKlp{N$Gy2DBS353E?S$6xixj zO*&`2f#@JyL{d{jj>D4R*4VkFg5yvtnIOIcgV%g%(TDrDFv1Q4GlG&x z+uaFN^{zcD`J&25+e%D7V?0RQ?yfRq%zESs!G&pB{ZbxxDU~AOu(An9%fWU77dSKM z$9sDhcaWfSKzm4bQcUFViT+=(*VXxipda@p_0%elX=N73Lc4wl2xDPcUl0AdH+Rr- z`-ky{H@)6`LpMqxgsTXHqkBTP*|t-|sWuxMrf9x>G^AIcK59F-^7^pT;Z z<)Xu@{8o?U_l7`=o)RTm34W%n6~#yIXDdY^2&Ha3=7UYsRSj-oW!0a91#68Gigyr{}8OV@oB~aB*}`x>D%p*lA>{Zb1JB z_w&@w;^yLCL&Ux@M$gzom!(HGgHOJ%2&QRHyxQ(tR$LtqK2*9kyl>~NrPZ6<=Nt3C ziBag@tgO~s!N#3EPuc3fy;gvgRj&I!pSK`&$HF0!9SaP>OJ>rLp9Nae8_g=7gY3r6 z(uu8eLh{b;x*9BM*o4q$M?y(vUhJJDP-IKxY%bpgTn!A)s(9JIC+m)=_9@5YhRMKD z3w(E!rMpbfM6q)N2u6zZZst5NBLXM8w(Je-i703^Nk*Pz@{3`l+icK8bJAiGC6(;@ zjfoq?(+#B(>JN{R4(-*cd$Nsw&`kbVsnl&NM%u|q4h?3C&~DGQoHo!%`%{WS$QByJ z{s(vfTx4Bg+(met>Rx*JcIF#Y>-!Dmc;VaSZuHH%ehP#~gx9|rK2~SyjX@->t zJR9(x>lwAByL+4Ec<(`swY4IMFL9?IVEh`X?2Z;E;$}t=%+o1u+Z+hETQ3mBY+82e zAu7LaAacA7FhXK5Lv1%dkWUsCYEyUG%ouXKEKqbju43JeZ$oFl2jkuTuBC2@igHRY zzo+F-yFL$q{kc8Xw6t58Jgf4T&1FY@E#u#&q=8}LukOLXyV}J}R88_y^_FnhQP&BC zydP)y&d1cECj~(k4IR7eQ(+PBaAW%7uasasy1?F@R9=k3CnoGU$W zb`j!9s9D{oW;mKdLJagOD=a1}Kh${I%yiwIHdcXa6Qt!)>(+`aqH5W_bR9Txki#CV z)=oH`EC;KZEcC4rdE&@qaFqz|=za>|-eoE;J91E)?6BIt zp?8S_l*N&yTBwyz%o}VfuA{9M%U6A8sHVbXqOIVkyzO~NlA?~=+g|zC9*TyCMkN$p zT!4W_Z0t;k>1H`ljA=`|{Ym@t3gA}Z%O3CE^A`XJe2%?1*` zfCLh6k^=EL(zTsS&+8$cZ+0yT{a;!KIb$zhCzboUL9oPQd1BkL)z&pWmSrxw%og zo1SP_`MQ^#_oVw5_J*^iWe_u8XClY7uDoq4IvT;5wiyDU?#T0<82b;wuF5RtD3bf} z0^9@F{X*jWv7bCY5dB|HLRV1mbH8fgUz66)kpIwMQw^oLna~bLj}As!4onPcy$zK_ z>*Eh|O}*R&QNM8vEIg^aof+v%Y;uLyN(htvjEBG;N^o1*Ta497tkXg~x@`~@9 zt<14)wq$%Kx9X2Ly}osA(&x-p0GTIeRDcYLOqLbxINkG$j`tqD=KBp>n%9*Z@F0hn z5nT5Waw7xtHNjtYp~^lS;a?WukNc6N`s!<+X+68N7wb*Pp3lpAd$Gq%Blw*yw;~TT zR|j`|-~CdJPZ@Rl;idJDUDf;&`G3fbROqk#jMi5z+*^U|ze-d#6`~^DoP`jmbjtct z$xieKB`{WR?iG{N*bWYXV6yX#i6YHz@hor0hefS+=kJk06dA7Dd0Tg@w4$)F;o8&( zj&?#)vEuAGyzP@zCsMNZy1`9p?IAIIccPJQ;avay-YP%220}q&E z4+jYHNGuT~n08f0Ms{Z6fh-&OkCzo=_`MVOB>nA8_fDk%sZyQ5wVfAE$=JVn@5XKl)Ud7R zl>oZZskgC%!TgJFE2tS>uMwptWl%*x2e2OK2A)heB?y- z{@~95lf0nRQ{tz&uKidx>XTDz=hml5&)Do%*b}h#TRldwQ>*O;ZKGOBQj7`9t#1o; zOT44J$dWopfayOTaN&MOEy_)4rh=BSY+x-DDU%8=J($(3sx zbmeDY-(BYIPH2=lmFdV&CSN>_%=wOBcZ);ngRg;8WX0K9IVg)(kayE~`Y|fHmC*e% zm(Cd%h)iVlZus+Zz1Qb8xaSL2S}8GlZei2|*{0YnW0jiPn!;?a!goYZ@vBnQ_qw-} zkyhi5IDsHR6dNic<8r{f)jW3z1 zpq1-R?Nx&$Oe1Bz?!rN+PHdtA#Rmv~)uGOk4bRMh7J1GMmRN@0F(+nqqPLwgzEypH zZzqa5;m8hM=M+TE27!!pa7-Rt!8s+G6lXhH zrL?W&iI?jjqR!}uOEa>(C zTd8Tr#8v@(ZrpeVbDUD|DW-spP?3JGJNuLQ!$JtN1Ho7=+nMW=Hb|vYY`oq=6$i7k zUjbu#LcM!4_OotgTEyGzA}!+~6qwPVuT`r}-X}uHMGH7i3q&k9ERiG;qH{&uLN~7={{5=K13yk?NN32fN$_@K?Rl*aDr`d70^iKyh|Rd= zRwildwXSOG-))U3k!K0^@%HJ1R(h=-HuT+DK}C;*Z>w>-Kd zYPNSUh%AO)Cz+e+^EmN|D@?{Qo+<4d)x1R1fp=sW&3Y?c!WELlzKfHRV<9BK%SIz* zEMdyTzm66A8|KoH{RI^&j)#M^-EPYqC8lz*G+@ht%6FXfJo5+UMyg6f4?;waG-So z)UzUhow?((pjl8K55_-GXqTUCt8dAm815%fWFQy%VpSAiaXdhQe&Izy5=0-vdYb)v PG`EC^tZUcmnWL4~}i diff --git a/modules/ROOT/nav.adoc b/modules/ROOT/nav.adoc index 2a62df0521..7649e6d9d2 100644 --- a/modules/ROOT/nav.adoc +++ b/modules/ROOT/nav.adoc @@ -180,6 +180,7 @@ *** xref:creating-custom-notifications.adoc[Notifications] *** xref:customsidebar.adoc[Sidebars] *** xref:custom-view.adoc[Views] +*** xref:context.adoc[Context] *** xref:contextform.adoc[Context forms] *** xref:contextmenu.adoc[Context menus] *** xref:contexttoolbar.adoc[Context toolbar] @@ -303,6 +304,7 @@ **** xref:comments-callback-mode.adoc[Callback mode] **** xref:comments-embedded-mode.adoc[Embedded mode] **** xref:comments-toolbars-menus.adoc[Toolbar buttons and menu items] +**** xref:comments-access-options.adoc[Access Options] **** xref:comments-commands-events-apis.adoc[Commands, Events and APIs] *** xref:advcode.adoc[Enhanced Code Editor] *** Enhanced Media Embed @@ -408,6 +410,13 @@ ** xref:tinymce-and-cors.adoc[Cross-Origin Resource Sharing (CORS)] * Release information ** xref:release-notes.adoc[Release notes for {productname} {productmajorversion}] +*** {productname} 7.4 +**** xref:7.4-release-notes.adoc#overview[Overview] +**** xref:7.4-release-notes.adoc#accompanying-premium-plugin-changes[Accompanying Premium Plugin changes] +**** xref:7.4-release-notes.adoc#improvements[Improvements] +**** xref:7.4-release-notes.adoc#additions[Additions] +**** xref:7.4-release-notes.adoc#bug-fixes[Bug fixes] +**** xref:7.4-release-notes.adoc#known-issues[Known issues] *** {productname} 7.3 **** xref:7.3-release-notes.adoc#overview[Overview] **** xref:7.3-release-notes.adoc#accompanying-premium-plugin-changes[Accompanying Premium plugin changes] diff --git a/modules/ROOT/pages/7.4-release-notes.adoc b/modules/ROOT/pages/7.4-release-notes.adoc new file mode 100644 index 0000000000..f5881714c9 --- /dev/null +++ b/modules/ROOT/pages/7.4-release-notes.adoc @@ -0,0 +1,380 @@ += {productname} {release-version} +:release-version: 7.4 +:navtitle: {productname} {release-version} +:description: Release notes for {productname} {release-version} +:keywords: releasenotes, new, changes, bugfixes +:page-toclevels: 1 + +include::partial$misc/admon-releasenotes-for-stable.adoc[] + + +[[overview]] +== Overview + +{productname} {release-version} was released for {enterpriseversion} and {cloudname} on Wednesday, October 9^th^, 2024. + +These release notes provide an overview of the changes for {productname} {release-version}, including: + +* xref:accompanying-premium-plugin-changes[Accompanying Premium plugin changes] +* xref:improvements[Improvements] +* xref:additions[Additions] +* xref:bug-fixes[Bug fixes] +* xref:known-issues[Known issues] + + +[[accompanying-premium-plugin-changes]] +== Accompanying Premium plugin changes + +The following premium plugin updates were released alongside {productname} {release-version}. + +=== AI Assistant + +The {productname} {release-version} release includes an accompanying release of the **AI Assistant** premium plugin. + +**AI Assistant** includes the following fix. + +=== Insert lists will no longer unexpectedly generate indented lists. +// #TINY-10920 + +The `+insertContent+` action previously did not handle pasting a list onto another list correctly, causing the **AI Assistant** Premium plugin to generate an unexpected indented list when inserting lists into existing ones. + +In {productname} {release-version}, this issue is resolved by adding a paste argument to the `+insertContent+` action, ensuring correct handling of list insertion. + +As a result, the **AI Assistant** Premium plugin will no longer create indented lists when inserting a list on top of an existing one. + +For information on the **AI Assistant** premium plugin, see: xref:ai.adoc[AI Assistant]. + +=== Document Converters (Import from Word, Export to Word, Export to PDF) +// #TINY-11265 + +==== Made `importword_service_url`, `exportword_service_url` and `exportpdf_service_url` option more fault tolerant + +Previously, If the integrator added a domain without a trailing slash `+/+`, a full URL to `exportword`, or just the domain to `exportpdf` or `importword`, it caused the plugins to not function. + +{productname} {release-version} addresses this issue, by normalizing the options to accept a wider variety of input formats. As a result, the plugins now function correctly, regardless of whether a full URL, just the domain, or a domain with a trailing slash is provided. + +[NOTE] +The handler will always return the **"latest"** versioned URL, regardless if configuration is correct or not. + +=== Enhanced Code Editor + +The {productname} {release-version} release includes an accompanying release of the **Enhanced Code Editor** premium plugin. + +**Enhanced Code Editor** includes the following fixes, and improvements. + +==== Format button would lose focus after action while navigating through keyboard. +// #TINY-11122 + +Previously, after using the **Format code** button to format code, the focus would shift to the code editor wrapper instead of remaining on the **Format code** button. This behavior was inconsistent for users who prefer to navigate through the keyboard. + +{productname} {release-version} implemented a fix that explicitly refocuses the **Format code** button after the formatting action. As a result, when pressing the **Format code** button, the focus now remains on the button as intended. + +=== Formatting indent size would be different than CodeMirror indent size. +// #TINY-11150 + +Previously, the indent sizes between CodeMirror and the formatter were inconsistent due to the use of default options for both. + +As a result, the formatted code did not match the indent settings in CodeMirror, causing discrepancies in code appearance. + +{productname} {release-version} addresses this issue. Now, the formatter's indent settings have been adjusted to "2" indent spaces to align with CodeMirror, ensuring consistent indent sizes and uniform code presentation. + +=== Formatter would not remove empty lines. +// #TINY-11146 + +In previous versions of Enhanced Code Editor, the HTML formatting function retained all line breaks, including unnecessary empty lines, resulting in more spaced-out code than desired. + +With {productname} {release-version}, the HTML formatting has been optimized to automatically remove empty lines during the formatting process. This results in cleaner, more compact HTML output. + +For information on the Enhanced Code Editor plugin, see: xref:advcode.adoc[Enhanced Code Editor]. + +=== Import from Word + +The {productname} {release-version} release includes an accompanying release of the **Import from Word** premium plugin. + +**Import from Word** includes the following improvement. + +=== New `importword_converter_options` option that allows customizing the conversion. + +{productname} {release-version} introduces the addition of `importword_converter_options` to the **Import from Word** plugin. This new option allows for greater customization when converting Word documents to HTML. + +==== Key Features + +* Three Customizable Options: +** `resets`: Minimize differences between Word and HTML default styles. +** `defaults`: Control inclusion of default formatting. +** `styles`: Manage Word style inclusion in the generated document. + +.Example: using `importword_converter_options` +[source, js] +---- +tinymce.init({ + selector: 'textarea', + plugins: 'importword', + toolbar: 'importword', + importword_converter_options: { + formatting: { + resets: 'inline', + defaults: 'inline', + styles: 'none' + } + } +}); +---- + +For information on the **Import from Word** plugin, see xref:importword.adoc[Import from Word]. + +=== Spell Checker + +The {productname} {release-version} includes an accompanying release of the **Spell Checker** premium plugin. + +**Spell Checker** includes the following fix. + +=== As you type spellchecking did not update when scrolling with the `autoresize` plugin active. +// #TINY-10567 + +An issue was identified that was caused by the plugin not listening to the all the expected scroll events. As a result, when users scrolled down, this action was not detected by the plugin, leading to no updates in spellchecking. + +{productname} {release-version} addresses this issue by changing the event listener to correctly monitor scroll events. + +As a result, the plugin now successfully detects when scrolling occurs, ensuring that spellcheck updates are made as intended. + +=== Cursor would jump to the previous line after pressing shift + enter if the annotation was applied. +// #TINY-10567 + +In the Chrome browser, a rendering glitch caused the cursor to unexpectedly jump to the previous line when applying an annotation. The optimization intended to prevent re-selection after annotations was found to be unreliable and contributed to this issue. + +{productname} {release-version} resolves this problem by removing the problematic optimization, which led to this regression. + +As a result, users will no longer encounter unexpected selection or cursor behavior after applying annotations in the editor. + +For information on the **Spell Checker** premium plugin, see: xref:introduction-to-tiny-spellchecker.adoc[Spell Checker plugin]. + +=== Templates + +The {productname} {release-version} release includes an accompanying release of the **Templates** premium plugin. + +**Templates** includes the following improvement. + +==== Categories can now be declared as locked, making them readonly. +// #TINY-11116 + +include::partial$misc/admon-requires-7.4v.adoc[] + +The {productname} release introduces readonly categories for improved template management. This feature allows administrators to lock down specific template categories, preventing users from modifying the category or its templates. + +=== Key Features + +- **Readonly Templates**: Templates within readonly categories are locked, preventing the user from renaming, editing, moving, or deleting them. These templates are marked with a lock image:icons/lock.svg[lock.svg] icon to indicate their status. +- **Readonly Categories**: Categories can be marked as readonly by setting `locked: true` in the configuration. Once locked, categories cannot be renamed or deleted, and users are prevented from moving templates into or out of the category. A lock icon visually distinguishes readonly categories. Readonly categories are marked with a lock image:icons/lock.svg[lock.svg] icon to indicate their status. +- **Client-Side Restrictions**: Attempts to modify readonly categories are blocked on the client side, and the UI reflects the readonly status to provide a seamless user experience. + +.Example: Locking a category +[source,js] +---- +// Template data with locked category +{ + title: 'Locked Templates', + locked: true, // Locks the category as readonly + items: [ + { + title: 'How to find model number', + content: '

    The included Templates demonstration uses the advtemplate_list configuration option to return a local promise containing a basic Template structure with self-contained examples.