From 50c036c04fc81bb915728b598bc223d7d5a92d7b Mon Sep 17 00:00:00 2001 From: ognevushka Date: Sat, 12 Jul 2025 11:48:30 -0700 Subject: [PATCH 1/2] issue #484 fix --- app.py | 7 + shiny/www/shared/shiny.js | 5142 +++++++++++++++-------------- shiny/www/shared/shiny.js.map | 8 +- shiny/www/shared/shiny.min.css | 4 +- shiny/www/shared/shiny.min.js | 32 +- shiny/www/shared/shiny.min.js.map | 8 +- 6 files changed, 2610 insertions(+), 2591 deletions(-) create mode 100644 app.py diff --git a/app.py b/app.py new file mode 100644 index 000000000..6835f6789 --- /dev/null +++ b/app.py @@ -0,0 +1,7 @@ +from shiny.express import input, render, ui + +ui.input_date("date", "Date") + +@render.text +def value(): + return input.date() diff --git a/shiny/www/shared/shiny.js b/shiny/www/shared/shiny.js index 8d0417ebb..be97d922d 100644 --- a/shiny/www/shared/shiny.js +++ b/shiny/www/shared/shiny.js @@ -1,4 +1,4 @@ -/*! shiny 1.10.0.9001 | (c) 2012-2025 Posit Software, PBC. | License: GPL-3 | file LICENSE */ +/*! shiny 1.11.1.9000 | (c) 2012-2025 Posit Software, PBC. | License: GPL-3 | file LICENSE */ "use strict"; (() => { var __create = Object.create; @@ -143,2877 +143,2881 @@ var import_jquery39 = __toESM(require_jquery()); // srcts/src/utils/index.ts - var import_jquery4 = __toESM(require_jquery()); + var import_jquery6 = __toESM(require_jquery()); - // srcts/src/window/pixelRatio.ts - function windowDevicePixelRatio() { - return window.devicePixelRatio; - } + // srcts/src/shiny/render.ts + var import_jquery5 = __toESM(require_jquery()); - // srcts/src/utils/object.ts - function hasOwnProperty(obj, prop) { - return Object.prototype.hasOwnProperty.call(obj, prop); - } - function hasDefinedProperty(obj, prop) { - return Object.prototype.hasOwnProperty.call(obj, prop) && obj[prop] !== void 0; + // srcts/src/shiny/initedMethods.ts + var fullShinyObj; + function setShinyObj(shiny) { + fullShinyObj = shiny; } - function ifUndefined(value, alternate) { - if (value === void 0) - return alternate; - return value; + function validateShinyHasBeenSet() { + if (typeof fullShinyObj === "undefined") { + throw "Shiny has not finish initialization yet. Please wait for the 'shiny-initialized' event."; + } + return fullShinyObj; } - - // srcts/src/utils/index.ts - function escapeHTML(str) { - const escaped = { - "&": "&", - "<": "<", - ">": ">", - '"': """, - "'": "'", - "/": "/" - }; - return str.replace(/[&<>'"/]/g, function(m2) { - return escaped[m2]; - }); + function shinySetInputValue(name, value, opts) { + validateShinyHasBeenSet().setInputValue(name, value, opts); } - function randomId() { - return Math.floor(4294967296 + Math.random() * 64424509440).toString(16); + function shinyShinyApp() { + return validateShinyHasBeenSet().shinyapp; } - function strToBool(str) { - if (!str || !str.toLowerCase) - return void 0; - switch (str.toLowerCase()) { - case "true": - return true; - case "false": - return false; - default: - return void 0; - } + function setShinyUser(user) { + validateShinyHasBeenSet().user = user; } - function getStyle(el, styleProp) { - let x2 = void 0; - if ("currentStyle" in el) { - x2 = el.currentStyle[styleProp]; - } else { - const style = document?.defaultView?.getComputedStyle(el, null); - if (style) - x2 = style.getPropertyValue(styleProp); - } - return x2; + function shinyForgetLastInputValue(name) { + validateShinyHasBeenSet().forgetLastInputValue(name); } - function padZeros(n4, digits) { - let str = n4.toString(); - while (str.length < digits) - str = "0" + str; - return str; + async function shinyBindAll(scope) { + await validateShinyHasBeenSet().bindAll(scope); } - function roundSignif(x2, digits = 1) { - if (digits < 1) - throw "Significant digits must be at least 1."; - return parseFloat(x2.toPrecision(digits)); + function shinyUnbindAll(scope, includeSelf = false) { + validateShinyHasBeenSet().unbindAll(scope, includeSelf); } - function parseDate(dateString) { - let date = new Date(dateString); - if (date.toString() === "Invalid Date") { - date = new Date(dateString.replace(/-/g, "/")); - } - return date; + function shinyInitializeInputs(scope) { + validateShinyHasBeenSet().initializeInputs(scope); } - function formatDateUTC(date) { - if (date instanceof Date) { - return date.getUTCFullYear() + "-" + padZeros(date.getUTCMonth() + 1, 2) + "-" + padZeros(date.getUTCDate(), 2); - } else { - return null; - } + async function shinyAppBindOutput(id, binding) { + await shinyShinyApp().bindOutput(id, binding); } - function makeResizeFilter(el, func) { - let lastSize = {}; - return function() { - const rect = el.getBoundingClientRect(); - const size = { w: rect.width, h: rect.height }; - if (size.w === 0 && size.h === 0) - return; - if (size.w === lastSize.w && size.h === lastSize.h) - return; - lastSize = size; - func(size.w, size.h); - }; + function shinyAppUnbindOutput(id, binding) { + return shinyShinyApp().unbindOutput(id, binding); } - function pixelRatio() { - if (windowDevicePixelRatio()) { - return Math.round(windowDevicePixelRatio() * 100) / 100; - } else { - return 1; - } + function getShinyOnCustomMessage() { + return validateShinyHasBeenSet().oncustommessage; } - function getBoundingClientSizeBeforeZoom(el) { - const rect = el.getBoundingClientRect(); - const zoom = el.currentCSSZoom || 1; - return { - width: rect.width / zoom, - height: rect.height / zoom - }; + var fileInputBinding; + function getFileInputBinding() { + return fileInputBinding; } - function scopeExprToFunc(expr) { - const exprEscaped = expr.replace(/[\\"']/g, "\\$&").replace(/\u0000/g, "\\0").replace(/\n/g, "\\n").replace(/\r/g, "\\r").replace(/[\b]/g, "\\b"); - let func; - try { - func = new Function( - `with (this) { - try { - return (${expr}); - } catch (e) { - console.error('Error evaluating expression: ${exprEscaped}'); - throw e; - } - }` - ); - } catch (e4) { - console.error("Error parsing expression: " + expr); - throw e4; - } - return function(scope) { - return func.call(scope); - }; + function setFileInputBinding(fileInputBinding_) { + fileInputBinding = fileInputBinding_; } - function asArray(value) { - if (value === null || value === void 0) - return []; - if (Array.isArray(value)) - return value; - return [value]; + function getShinyCreateWebsocket() { + return validateShinyHasBeenSet().createSocket; } - function mergeSort(list, sortfunc) { - function merge(a3, b3) { - let ia = 0; - let ib = 0; - const sorted = []; - while (ia < a3.length && ib < b3.length) { - if (sortfunc(a3[ia], b3[ib]) <= 0) { - sorted.push(a3[ia++]); - } else { - sorted.push(b3[ib++]); - } + + // srcts/src/time/debounce.ts + var Debouncer = class { + constructor(target, func, delayMs) { + this.target = target; + this.func = func; + this.delayMs = delayMs; + this.timerId = null; + this.args = null; + } + normalCall(...args) { + this.$clearTimer(); + this.args = args; + this.timerId = setTimeout(() => { + if (this.timerId === null) + return; + this.$clearTimer(); + this.$invoke(); + }, this.delayMs); + } + immediateCall(...args) { + this.$clearTimer(); + this.args = args; + this.$invoke(); + } + isPending() { + return this.timerId !== null; + } + $clearTimer() { + if (this.timerId !== null) { + clearTimeout(this.timerId); + this.timerId = null; } - while (ia < a3.length) - sorted.push(a3[ia++]); - while (ib < b3.length) - sorted.push(b3[ib++]); - return sorted; } - list = list.slice(0); - for (let chunkSize = 1; chunkSize < list.length; chunkSize *= 2) { - for (let i4 = 0; i4 < list.length; i4 += chunkSize * 2) { - const listA = list.slice(i4, i4 + chunkSize); - const listB = list.slice(i4 + chunkSize, i4 + chunkSize * 2); - const merged = merge(listA, listB); - const args = [i4, merged.length]; - Array.prototype.push.apply(args, merged); - Array.prototype.splice.apply(list, args); + $invoke() { + if (this.args && this.args.length > 0) { + this.func.apply(this.target, this.args); + } else { + this.func.apply(this.target); } + this.args = null; } - return list; - } - function $escape(val) { - if (typeof val === "undefined") - return val; - return val.replace(/([!"#$%&'()*+,./:;<=>?@[\\\]^`{|}~])/g, "\\$1"); - } - function mapValues(obj, f3) { - const newObj = {}; - Object.keys(obj).forEach((key) => { - newObj[key] = f3(obj[key], key, obj); - }); - return newObj; + }; + function debounce(threshold, func) { + let timerId = null; + return function thisFunc(...args) { + if (timerId !== null) { + clearTimeout(timerId); + timerId = null; + } + timerId = setTimeout(() => { + if (timerId === null) + return; + timerId = null; + func.apply(thisFunc, args); + }, threshold); + }; } - function isnan(x2) { - return typeof x2 === "number" && isNaN(x2); - } - function _equal(x2, y3) { - if (import_jquery4.default.type(x2) === "object" && import_jquery4.default.type(y3) === "object") { - const xo = x2; - const yo = y3; - if (Object.keys(xo).length !== Object.keys(yo).length) - return false; - for (const prop in xo) { - if (!hasOwnProperty(yo, prop) || !_equal(xo[prop], yo[prop])) - return false; - } - return true; - } else if (import_jquery4.default.type(x2) === "array" && import_jquery4.default.type(y3) === "array") { - const xa = x2; - const ya = y3; - if (xa.length !== ya.length) - return false; - for (let i4 = 0; i4 < xa.length; i4++) - if (!_equal(xa[i4], ya[i4])) - return false; - return true; - } else { - return x2 === y3; - } - } - function equal(...args) { - if (args.length < 2) - throw new Error("equal requires at least two arguments."); - for (let i4 = 0; i4 < args.length - 1; i4++) { - if (!_equal(args[i4], args[i4 + 1])) - return false; + + // srcts/src/time/invoke.ts + var Invoker = class { + constructor(target, func) { + this.target = target; + this.func = func; } - return true; - } - var compareVersion = function(a3, op, b3) { - function versionParts(ver) { - return (ver + "").replace(/-/, ".").replace(/(\.0)+[^.]*$/, "").split("."); + normalCall(...args) { + this.func.apply(this.target, args); } - function cmpVersion(a4, b4) { - const aParts = versionParts(a4); - const bParts = versionParts(b4); - const len = Math.min(aParts.length, bParts.length); - let cmp; - for (let i4 = 0; i4 < len; i4++) { - cmp = parseInt(aParts[i4], 10) - parseInt(bParts[i4], 10); - if (cmp !== 0) { - return cmp; - } - } - return aParts.length - bParts.length; + immediateCall(...args) { + this.func.apply(this.target, args); } - const diff = cmpVersion(a3, b3); - if (op === "==") - return diff === 0; - else if (op === ">=") - return diff >= 0; - else if (op === ">") - return diff > 0; - else if (op === "<=") - return diff <= 0; - else if (op === "<") - return diff < 0; - else - throw `Unknown operator: ${op}`; }; - function updateLabel(labelTxt, labelNode) { - if (typeof labelTxt === "undefined") - return; - if (labelNode.length !== 1) { - throw new Error("labelNode must be of length 1"); - } - const emptyLabel = Array.isArray(labelTxt) && labelTxt.length === 0; - if (emptyLabel) { - labelNode.addClass("shiny-label-null"); - } else { - labelNode.text(labelTxt); - labelNode.removeClass("shiny-label-null"); - } - } - function getComputedLinkColor(el) { - const a3 = document.createElement("a"); - a3.href = "/"; - const div = document.createElement("div"); - div.style.setProperty("position", "absolute", "important"); - div.style.setProperty("top", "-1000px", "important"); - div.style.setProperty("left", "0", "important"); - div.style.setProperty("width", "30px", "important"); - div.style.setProperty("height", "10px", "important"); - div.appendChild(a3); - el.appendChild(div); - const linkColor = window.getComputedStyle(a3).getPropertyValue("color"); - el.removeChild(div); - return linkColor; - } - function isBS3() { - return !window.bootstrap; - } - // srcts/src/bindings/registry.ts - var BindingRegistry = class { - constructor() { - this.bindings = []; - this.bindingNames = {}; + // srcts/src/time/throttle.ts + var Throttler = class { + constructor(target, func, delayMs) { + this.target = target; + this.func = func; + this.delayMs = delayMs; + this.timerId = null; + this.args = null; } - register(binding, bindingName, priority = 0) { - const bindingObj = { binding, priority }; - this.bindings.unshift(bindingObj); - if (bindingName) { - this.bindingNames[bindingName] = bindingObj; - binding.name = bindingName; + normalCall(...args) { + this.args = args; + if (this.timerId === null) { + this.$invoke(); } } - setPriority(bindingName, priority) { - const bindingObj = this.bindingNames[bindingName]; - if (!bindingObj) - throw "Tried to set priority on unknown binding " + bindingName; - bindingObj.priority = priority || 0; + immediateCall(...args) { + this.$clearTimer(); + this.args = args; + this.$invoke(); } - getPriority(bindingName) { - const bindingObj = this.bindingNames[bindingName]; - if (!bindingObj) - return false; - return bindingObj.priority; + isPending() { + return this.args !== null; } - getBindings() { - return mergeSort(this.bindings, function(a3, b3) { - return b3.priority - a3.priority; + $clearTimer() { + if (this.timerId !== null) { + clearTimeout(this.timerId); + this.timerId = null; + } + } + $invoke() { + if (this.args === null) { + return; + } + this.func.apply(this.target, this.args); + this.args = null; + this.timerId = setTimeout(() => { + if (this.timerId === null) + return; + this.$clearTimer(); + if (this.isPending()) { + this.$invoke(); + } + }, this.delayMs); + } + }; + + // srcts/src/shiny/sendImageSize.ts + var SendImageSize = class { + setImageSend(inputBatchSender, doSendImageSize) { + const sendImageSizeDebouncer = new Debouncer(null, doSendImageSize, 0); + this.regular = function() { + sendImageSizeDebouncer.normalCall(); + }; + inputBatchSender.lastChanceCallback.push(function() { + if (sendImageSizeDebouncer.isPending()) + sendImageSizeDebouncer.immediateCall(); }); + this.transitioned = debounce(200, this.regular); + return sendImageSizeDebouncer; } }; + var sendImageSizeFns = new SendImageSize(); - // srcts/src/bindings/input/inputBinding.ts - var InputBinding = class { - find(scope) { - throw "Not implemented"; - scope; + // srcts/src/shiny/singletons.ts + var import_jquery4 = __toESM(require_jquery()); + var reSingleton = /([\s\S]*?)/; + var reHead = /]*)?>([\s\S]*?)<\/head>/; + var knownSingletons = {}; + function renderHtml(html, el, where) { + const processed = processHtml(html); + addToHead(processed.head); + register(processed.singletons); + switch (where.toLowerCase()) { + case "replace": + (0, import_jquery4.default)(el).html(processed.html); + break; + case "beforebegin": + (0, import_jquery4.default)(el).before(processed.html); + break; + case "afterbegin": + (0, import_jquery4.default)(el).prepend(processed.html); + break; + case "beforeend": + (0, import_jquery4.default)(el).append(processed.html); + break; + case "afterend": + (0, import_jquery4.default)(el).after(processed.html); + break; + default: + throw new Error("Unknown where position: " + where); } - getId(el) { - return el.getAttribute("data-input-id") || el.id; + return processed; + } + function register(s4) { + import_jquery4.default.extend(knownSingletons, s4); + } + function registerNames(s4) { + if (typeof s4 === "string") { + knownSingletons[s4] = true; + } else if (s4 instanceof Array) { + for (let i4 = 0; i4 < s4.length; i4++) { + knownSingletons[s4[i4]] = true; + } } - getType(el) { - return null; - el; + } + function addToHead(head) { + if (head.length > 0) { + const tempDiv = (0, import_jquery4.default)("
" + head + "
").get(0); + const $head = (0, import_jquery4.default)("head"); + while (tempDiv.hasChildNodes()) { + $head.append(tempDiv.firstChild); + } } - getValue(el) { - throw "Not implemented"; - el; + } + function processHtml(val) { + const newSingletons = {}; + let newVal; + const findNewPayload = function(match, p1, sig, payload) { + if (knownSingletons[sig] || newSingletons[sig]) + return ""; + newSingletons[sig] = true; + return payload; + }; + while (true) { + newVal = val.replace(reSingleton, findNewPayload); + if (val.length === newVal.length) + break; + val = newVal; } - subscribe(el, callback) { - el; - callback; + const heads = []; + const headAddPayload = function(match, payload) { + heads.push(payload); + return ""; + }; + while (true) { + newVal = val.replace(reHead, headAddPayload); + if (val.length === newVal.length) + break; + val = newVal; } - unsubscribe(el) { - el; - } - receiveMessage(el, data) { - throw "Not implemented"; - el; - data; - } - getState(el) { - throw "Not implemented"; - el; - } - getRatePolicy(el) { - return null; - el; - } - initialize(el) { - el; - } - dispose(el) { - el; - } - }; + return { + html: val, + head: heads.join("\n"), + singletons: newSingletons + }; + } - // srcts/src/bindings/input/actionbutton.ts - var import_jquery5 = __toESM(require_jquery()); - var ActionButtonInputBinding = class extends InputBinding { - find(scope) { - return (0, import_jquery5.default)(scope).find(".action-button"); - } - getValue(el) { - return (0, import_jquery5.default)(el).data("val") || 0; - } - setValue(el, value) { - (0, import_jquery5.default)(el).data("val", value); - } - getType(el) { - return "shiny.action"; - el; - } - subscribe(el, callback) { - (0, import_jquery5.default)(el).on( - "click.actionButtonInputBinding", - function() { - const $el = (0, import_jquery5.default)(this); - const val = $el.data("val") || 0; - $el.data("val", val + 1); - callback(false); - } - ); + // srcts/src/shiny/render.ts + async function renderContentAsync(el, content, where = "replace") { + if (where === "replace") { + shinyUnbindAll(el); } - getState(el) { - return { value: this.getValue(el) }; + let html = ""; + let dependencies = []; + if (content === null) { + html = ""; + } else if (typeof content === "string") { + html = content; + } else if (typeof content === "object") { + html = content.html; + dependencies = content.deps || []; } - receiveMessage(el, data) { - const $el = (0, import_jquery5.default)(el); - if (hasDefinedProperty(data, "label") || hasDefinedProperty(data, "icon")) { - let label = $el.text(); - let icon = ""; - if ($el.find("i[class]").length > 0) { - const iconHtml = $el.find("i[class]")[0]; - if (iconHtml === $el.children()[0]) { - icon = (0, import_jquery5.default)(iconHtml).prop("outerHTML"); - } - } - if (hasDefinedProperty(data, "label")) { - label = data.label; - } - if (hasDefinedProperty(data, "icon")) { - icon = Array.isArray(data.icon) ? "" : data.icon ?? ""; - } - $el.html(icon + " " + label); - } - if (hasDefinedProperty(data, "disabled")) { - if (data.disabled) { - $el.attr("disabled", ""); - } else { - $el.attr("disabled", null); + await renderHtmlAsync(html, el, dependencies, where); + let scope = el; + if (where === "replace") { + shinyInitializeInputs(el); + await shinyBindAll(el); + } else { + const $parent = (0, import_jquery5.default)(el).parent(); + if ($parent.length > 0) { + scope = $parent; + if (where === "beforeBegin" || where === "afterEnd") { + const $grandparent = $parent.parent(); + if ($grandparent.length > 0) + scope = $grandparent; } } + shinyInitializeInputs(scope); + await shinyBindAll(scope); } - unsubscribe(el) { - (0, import_jquery5.default)(el).off(".actionButtonInputBinding"); - } - }; - (0, import_jquery5.default)(document).on("click", "a.action-button", function(e4) { - e4.preventDefault(); - }); - - // srcts/src/bindings/input/checkbox.ts - var import_jquery6 = __toESM(require_jquery()); - var CheckboxInputBinding = class extends InputBinding { - find(scope) { - return (0, import_jquery6.default)(scope).find('input[type="checkbox"]'); - } - getValue(el) { - return el.checked; - } - setValue(el, value) { - el.checked = value; - } - subscribe(el, callback) { - (0, import_jquery6.default)(el).on("change.checkboxInputBinding", function() { - callback(true); - }); - } - unsubscribe(el) { - (0, import_jquery6.default)(el).off(".checkboxInputBinding"); + } + function renderContent(el, content, where = "replace") { + if (where === "replace") { + shinyUnbindAll(el); } - getState(el) { - return { - label: (0, import_jquery6.default)(el).parent().find("span").text(), - value: el.checked - }; + let html = ""; + let dependencies = []; + if (content === null) { + html = ""; + } else if (typeof content === "string") { + html = content; + } else if (typeof content === "object") { + html = content.html; + dependencies = content.deps || []; } - receiveMessage(el, data) { - if (hasDefinedProperty(data, "value")) { - el.checked = data.value; + renderHtml2(html, el, dependencies, where); + let scope = el; + if (where === "replace") { + shinyInitializeInputs(el); + return shinyBindAll(el); + } else { + const $parent = (0, import_jquery5.default)(el).parent(); + if ($parent.length > 0) { + scope = $parent; + if (where === "beforeBegin" || where === "afterEnd") { + const $grandparent = $parent.parent(); + if ($grandparent.length > 0) + scope = $grandparent; + } } - if (hasDefinedProperty(data, "label")) { - (0, import_jquery6.default)(el).parent().find("span").text(data.label); + shinyInitializeInputs(scope); + return shinyBindAll(scope); + } + } + async function renderHtmlAsync(html, el, dependencies, where = "replace") { + await renderDependenciesAsync(dependencies); + return renderHtml(html, el, where); + } + function renderHtml2(html, el, dependencies, where = "replace") { + renderDependencies(dependencies); + return renderHtml(html, el, where); + } + async function renderDependenciesAsync(dependencies) { + if (dependencies) { + for (const dep of dependencies) { + await renderDependencyAsync(dep); } - (0, import_jquery6.default)(el).trigger("change"); } - }; - - // srcts/src/bindings/input/checkboxgroup.ts - var import_jquery7 = __toESM(require_jquery()); - function getLabelNode(el) { - return (0, import_jquery7.default)(el).find('label[for="' + $escape(el.id) + '"]'); } - function getLabel(obj) { - const parentNode = obj.parentNode; - if (parentNode.tagName === "LABEL") { - return (0, import_jquery7.default)(parentNode).find("span").text().trim(); + function renderDependencies(dependencies) { + if (dependencies) { + for (const dep of dependencies) { + renderDependency(dep); + } } - return null; } - var CheckboxGroupInputBinding = class extends InputBinding { - find(scope) { - return (0, import_jquery7.default)(scope).find(".shiny-input-checkboxgroup"); + var htmlDependencies = {}; + function registerDependency(name, version) { + htmlDependencies[name] = version; + } + function needsRestyle(dep) { + if (!dep.restyle) { + return false; } - getValue(el) { - const $objs = (0, import_jquery7.default)('input:checkbox[name="' + $escape(el.id) + '"]:checked'); - const values = new Array($objs.length); - for (let i4 = 0; i4 < $objs.length; i4++) { - values[i4] = $objs[i4].value; - } - return values; + const names = Object.keys(htmlDependencies); + const idx = names.indexOf(dep.name); + if (idx === -1) { + return false; } - setValue(el, value) { - value = value ?? []; - (0, import_jquery7.default)('input:checkbox[name="' + $escape(el.id) + '"]').prop("checked", false); - if (value instanceof Array) { - for (let i4 = 0; i4 < value.length; i4++) { - (0, import_jquery7.default)( - 'input:checkbox[name="' + $escape(el.id) + '"][value="' + $escape(value[i4]) + '"]' - ).prop("checked", true); + return htmlDependencies[names[idx]] === dep.version; + } + function addStylesheetsAndRestyle(links) { + const $head = (0, import_jquery5.default)("head").first(); + const refreshStyle = function(href, oldSheet) { + const xhr = new XMLHttpRequest(); + xhr.open("GET", href); + xhr.onload = function() { + const id = "shiny_restyle_" + href.split("?restyle")[0].replace(/\W/g, "_"); + const oldStyle = $head.find("style#" + id); + const newStyle = (0, import_jquery5.default)("